天气与日历 切换到窄版

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

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

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 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-11-1 11:42 , Processed in 0.143403 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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