天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 8|回复: 0

objectarx之使用ARX的曲面和线段交叉

[复制链接]
  • TA的每日心情
    开心
    昨天 15:23
  • 签到天数: 69 天

    [LV.6]常住居民II

    410

    主题

    167

    回帖

    2704

    积分

    管理员

    积分
    2704
    发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
    static AcGePoint3dArray Intersect(AcDbSurface* pSurface,AcGeLine3d line)
    {  
        AcGePoint3dArray returnPtArray;
      AcDbBody* pBody = new AcDbBody();

      // 2013
      // Acad::ErrorStatus es = pBody->setASMBody(pSurface->ASMBodyCopy());
      // До 2013
       Acad::ErrorStatus es = pBody->setBody(pSurface->body());

       // build AcBrBrep
       AcBrBrep* pBrep = new AcBrBrep();
       //
      if(AcBr::eOk == pBrep->set(*pBody))
      {
        AcBrBrepFaceTraverser* pFaceTrav = new AcBrBrepFaceTraverser;
        if(AcBr::eOk == pFaceTrav->setBrep(*pBrep))
        {
           for(pFaceTrav->restart(); !pFaceTrav->done(); pFaceTrav->next())
           {
            AcBrFace face;

            if(AcBr::eOk == pFaceTrav->getFace(face))
            {
              double area = 0.0f;
             face.getSurfaceArea(area);

             acutPrintf(L"\nПлощадь поверхности: %f", area);

            //***** полная поверхность Brep-грани******         
            //AcGeNurbSurface nurbSurface;
            //face.getSurfaceAsNurb(nurbSurface);
            //AcGeCurveSurfInt curveSI;
            ////исходные отрезок и поверхность
            //curveSI.set(line,nurbSurface);
            ////подсчитываем число точек пересечения
            //int count = curveSI.numIntPoints(err_1);
            //    if(err_1 == AcGe::kXXOk && count >0 )
            //    {        
            //        AcGeIntersectError err_2;
            //        for(int index = 0 ;index < count; index ++)
            //        {
            //           AcGePoint3d pt =
            //             curveSI.intPoint(index,err_2);      
            //            returnPtArray.append(pt);
            //        }      
            //      
            //    }
            //**********

            //****настоящая поверхность AcDbSurface        
              AcGeExternalBoundedSurface** nurbs = NULL;
              Adesk::UInt32 numNurbs = 0;
              face.getSurfaceAsTrimmedNurbs(numNurbs,nurbs);
              //*****
            for (Adesk::UInt32 i = 0; i < numNurbs; i++)
            {
                AcGeCurveSurfInt curveSI;
                AcGeIntersectError  err_1 = AcGe::kXXOk;           
                 // исходные поверхность и отрезок
                curveSI.set(line,*nurbs[i]);
                // подсчитываем количество точек пересечения
                int count = curveSI.numIntPoints(err_1);
                if(err_1 == AcGe::kXXOk && count >0 )
                {
                    AcGeIntersectError err_2;
                    for(int index = 0 ;index < count; index ++)
                    {
                        AcGePoint3d pt =
                            curveSI.intPoint(index,err_2);      
                        returnPtArray.append(pt);
                    }      
                }
                delete nurbs[i];
            }
            // вы обязаны удалить массив поверхностей
            delete[] nurbs;
          }
        }
      }
      delete pFaceTrav;
      }
      delete pBrep;


      return returnPtArray;

    }
    static void getIntersectPts(void)
    {
         ads_name ename;
         ads_point pickpt;

         AcDbObjectId objId;
         AcDbObject *pObj;

         int rc;

         // Выберем поверхность
         rc= acedEntSel(L"\nВыберите Поверхность: ", ename, pickpt);

         if(rc != RTNORM)
         {
           if (rc != RTCAN)
             acutPrintf(L"\nОшибка выбора примитива ");
          return;
         }

         acdbGetObjectId(objId, ename);
         acdbOpenObject(pObj, objId, AcDb::kForRead);

         AcDbSurface* pEntity1 = AcDbSurface::cast(pObj);

         if(!pEntity1)
         {
              acutPrintf(L"\nВыбор неправильный...");
              pObj->close();
              return;
         }
         // Вызываем функцию Intersect
         AcGePoint3dArray points =
             Intersect(pEntity1,AcGeLine3d(AcGePoint3d(0,0,0),
             AcGePoint3d(0,0,1)));
         if(points.length() >0)
         {
             // Проходим по всем точкам
         }

         pObj->close();

    }

     

     

     

     

    objectarx之使用ARX的曲面和线段交叉
    中国膜结构网打造全中国最好的膜结构综合平台 ,统一协调膜结构设计,膜结构施工,膜材采购,膜材定制,膜结构预算全方位服务。 中国空间膜结构协会合作单位。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|

    GMT+8, 2024-7-1 05:19 , Processed in 0.057403 second(s), 23 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表