天气与日历 切换到窄版

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

3DSOLID в AcDbPolyFaceMesh

[复制链接]
  • TA的每日心情
    开心
    前天 06:18
  • 签到天数: 49 天

    [LV.5]常住居民I

    185

    主题

    150

    回帖

    1695

    积分

    管理员

    积分
    1695
    发表于 2024-4-8 21:54:16 | 显示全部楼层 |阅读模式
    1. //-----------------------------------------------------------------------------
    2. //----- acrxEntryPoint.cpp
    3. //-----------------------------------------------------------------------------
    4. #include "StdAfx.h"
    5. #include "resource.h"

    6. //-----------------------------------------------------------------------------
    7. #define szRDS _RXST("")

    8. //-----------------------------------------------------------------------------
    9. //----- ObjectARX EntryPoint
    10. class CMy3DSolidToPolyMeshApp : public AcRxArxApp {

    11. public:
    12.   CMy3DSolidToPolyMeshApp () : AcRxArxApp () {}

    13.   virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
    14.     AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
    15.     return (retCode) ;
    16.   }

    17.   virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
    18.     AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;
    19.     return (retCode) ;
    20.   }

    21.   virtual void RegisterServerComponents () {    }

    22.   static void Rivilis3DSolidToPolyMesh () {

    23.     ads_name en; ads_point p;

    24.     if (acedEntSel(_T("\nВыберите твердое тело: "), en, p) != RTNORM)
    25.       return;

    26.     AcDbObjectId eid;
    27.     if (acdbGetObjectId(eid, en) != Acad::eOk)
    28.       return;

    29.     AcDbObjectPointer<AcDb3dSolid> p3DSolid(eid, AcDb::kForRead);
    30.     if (p3DSolid.openStatus() == Acad::eWrongObjectType) {
    31.       acutPrintf(_T("\nЭто не твердое тело!"));
    32.       return;
    33.     }

    34.     AcDbExtents ext; p3DSolid->getGeomExtents(ext);
    35.     double length = ext.minPoint().distanceTo(ext.maxPoint());

    36.     AcBrBrep brp;

    37.     AcBr::ErrorStatus ebr;
    38.     ebr = brp.set(*p3DSolid);
    39.     if (ebr != AcBr::eOk) {
    40.       acutPrintf(_T("\nОшибка br.set(*p3DSolid) = %d"), ebr);
    41.       return;
    42.     }

    43.     AcBrMesh2dControl mc;
    44.     // Задаём максимальное расстояние между узлами
    45.     // mc.setMaxNodeSpacing( length / 100.0);
    46.     // Задаём максимальное количество элементов в сети.
    47.     // mc.setMaxSubdivisions(100000);
    48.     // Задаём максимальное отклонение точки
    49.     mc.setDistTol(length / 100.0);
    50.     // Задаём тип элементов - только треугольники
    51.     mc.setElementShape(AcBr::kAllTriangles);

    52.     AcBrMesh2dFilter mf;
    53.     const AcBrEntity* meshEnt = (AcBrEntity*)&brp;
    54.     mf.insert(make_pair(meshEnt, mc));
    55.     AcBrMesh2d brepMesh;
    56.     if ((ebr = brepMesh.generate(mf)) != AcBr::eOk) {
    57.       acutPrintf(_T("\n Ошибка в AcBrMesh2d::generate %d"), ebr);
    58.       return;
    59.     }

    60.     AcDbObjectPointer<AcDbPolyFaceMesh> pMesh; pMesh.create();
    61.     pMesh->setDatabaseDefaults();
    62.     pMesh->setColorIndex(2); // Пусть сеть будет желтая
    63.     AcDbBlockTableRecordPointer pBtr(acdbCurDwg()->currentSpaceId(), AcDb::kForWrite);
    64.     if (pBtr.openStatus() != Acad::eOk)
    65.       return;
    66.     pBtr->appendAcDbEntity(pMesh);

    67.     int v0 = 0, v1 = 0, v2 = 0, v3 = 0;

    68.     int iter = 0;
    69.     AcGePoint3dArray vertexLookup;
    70.     vertexLookup.setPhysicalLength(10000);
    71.     // Чтобы пропустить нулевой элемент
    72.     vertexLookup.append(AcGePoint3d::kOrigin);

    73.     AcBrMesh2dElement2dTraverser meshElemTrav;

    74.     for (ebr = meshElemTrav.setMesh(brepMesh); !meshElemTrav.done(); ebr = meshElemTrav.next()) {
    75.       if (ebr != AcBr::eOk) return;
    76.       AcBrElement2d e;   ebr = meshElemTrav.getElement(e);
    77.       AcBrElement2dNodeTraverser elemNodeTrav;
    78.       for (ebr = elemNodeTrav.setElement(e) ; !elemNodeTrav.done(); elemNodeTrav.next())  {
    79.         AcBrNode n;
    80.         ebr = elemNodeTrav.getNode(n);
    81.         AcGePoint3d p; n.getPoint(p);
    82.         if (!vertexLookup.contains(p)) {
    83.           AcDbObjectPointer<AcDbPolyFaceMeshVertex> pMeshVert;  pMeshVert.create();
    84.           pMeshVert->setPosition(p);
    85.           pMesh->appendVertex(pMeshVert);
    86.           vertexLookup.append(p);
    87.         }
    88.       }
    89.     }

    90.     for (ebr = meshElemTrav.setMesh(brepMesh); !meshElemTrav.done(); ebr = meshElemTrav.next()) {
    91.       if (ebr != AcBr::eOk) return;
    92.       AcBrElement2d e;   ebr = meshElemTrav.getElement(e);
    93.       AcBrElement2dNodeTraverser elemNodeTrav;

    94.       AcGePoint3dArray pts;

    95.       for (ebr = elemNodeTrav.setElement(e) ; !elemNodeTrav.done(); ebr = elemNodeTrav.next())  {
    96.         if (ebr != AcBr::eOk) return;
    97.         AcBrNode n;
    98.         ebr = elemNodeTrav.getNode(n);
    99.         AcGePoint3d p; n.getPoint(p);
    100.         pts.append(p);
    101.       }

    102.       v0 = v1 = v2 = v3 = 0;
    103.       vertexLookup.find(pts[0],v0);
    104.       vertexLookup.find(pts[1],v1);
    105.       vertexLookup.find(pts[2],v2);
    106.       if (pts.length() == 4)   {
    107.         vertexLookup.find(pts[3],v3);
    108.       }

    109.       AcDbFaceRecord *pFaceRecord = new AcDbFaceRecord(v0, v1, v2, v3);
    110.       pMesh->appendFaceRecord(pFaceRecord);
    111.       pFaceRecord->close();
    112.     }
    113.   }
    114. } ;

    115. //-----------------------------------------------------------------------------
    116. IMPLEMENT_ARX_ENTRYPOINT(CMy3DSolidToPolyMeshApp)

    117. ACED_ARXCOMMAND_ENTRY_AUTO(CMy3DSolidToPolyMeshApp, Rivilis, 3DSolidToPolyMesh, 3DSolidToPolyMesh, ACRX_CMD_MODAL, NULL)
    复制代码

     

     

     

     

    3DSOLID в AcDbPolyFaceMesh
    哎...膜结构车棚,签到来了1...
  • TA的每日心情
    开心
    前天 06:18
  • 签到天数: 49 天

    [LV.5]常住居民I

    185

    主题

    150

    回帖

    1695

    积分

    管理员

    积分
    1695
     楼主| 发表于 2024-4-8 21:54:31 | 显示全部楼层
    1. //-https://adn-cis.org/forum/index.php?topic=6998.15
    2. //----- acrxEntryPoint.cpp
    3. //-----------------------------------------------------------------------------
    4. #include "StdAfx.h"
    5. #include "resource.h"

    6. //-----------------------------------------------------------------------------
    7. #define szRDS _RXST("")

    8. //-----------------------------------------------------------------------------
    9. //----- ObjectARX EntryPoint
    10. class CMy3DSolidToPolyMeshApp : public AcRxArxApp {

    11. public:
    12.   CMy3DSolidToPolyMeshApp () : AcRxArxApp () {}

    13.   virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
    14.     AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
    15.     return (retCode) ;
    16.   }

    17.   virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
    18.     AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;
    19.     return (retCode) ;
    20.   }

    21.   virtual void RegisterServerComponents () {    }

    22.   static void Rivilis3DSolidToPolyMesh () {

    23.     ads_name en; ads_point p;

    24.     if (acedEntSel(_T("\nВыберите твердое тело: "), en, p) != RTNORM)
    25.       return;

    26.     AcDbObjectId eid;
    27.     if (acdbGetObjectId(eid, en) != Acad::eOk)
    28.       return;

    29.     AcDbObjectPointer<AcDb3dSolid> p3DSolid(eid, AcDb::kForRead);
    30.     if (p3DSolid.openStatus() == Acad::eWrongObjectType) {
    31.       acutPrintf(_T("\nЭто не твердое тело!"));
    32.       return;
    33.     }

    34.     AcDbExtents ext; p3DSolid->getGeomExtents(ext);
    35.     double length = ext.minPoint().distanceTo(ext.maxPoint());

    36.     AcBrBrep brp;

    37.     AcBr::ErrorStatus ebr;
    38.     ebr = brp.set(*p3DSolid);
    39.     if (ebr != AcBr::eOk) {
    40.       acutPrintf(_T("\nОшибка br.set(*p3DSolid) = %d"), ebr);
    41.       return;
    42.     }

    43.     AcBrMesh2dControl mc;
    44.     // Задаём максимальное расстояние между узлами
    45.     // mc.setMaxNodeSpacing( length / 100.0);
    46.     // Задаём максимальное количество элементов в сети.
    47.     // mc.setMaxSubdivisions(100000);
    48.     // Задаём максимальное отклонение точки
    49.     // mc.setDistTol(length / 100.0);
    50.     // Задаём тип элементов - пытаемся заменить на 4-угольники
    51.     mc.setElementShape(AcBr::kAllQuadrilaterals);

    52.     AcBrMesh2dFilter mf;
    53.     const AcBrEntity* meshEnt = (AcBrEntity*)&brp;
    54.     mf.insert(make_pair(meshEnt, mc));
    55.     AcBrMesh2d brepMesh;
    56.     if ((ebr = brepMesh.generate(mf)) != AcBr::eOk) {
    57.       acutPrintf(_T("\n Ошибка в AcBrMesh2d::generate %d"), ebr);
    58.       return;
    59.     }

    60.     AcDbObjectPointer<AcDbPolyFaceMesh> pMesh; pMesh.create();
    61.     pMesh->setDatabaseDefaults();
    62.     pMesh->setColorIndex(2); // Пусть сеть будет желтая
    63.     AcDbBlockTableRecordPointer pBtr(acdbCurDwg()->currentSpaceId(), AcDb::kForWrite);
    64.     if (pBtr.openStatus() != Acad::eOk)
    65.       return;
    66.     pBtr->appendAcDbEntity(pMesh);

    67.     int v0 = 0, v1 = 0, v2 = 0, v3 = 0;

    68.     int iter = 0;
    69.     AcGePoint3dArray vertexLookup(65536);
    70.     // Чтобы пропустить нулевой элемент
    71.     vertexLookup.append(AcGePoint3d::kOrigin);

    72.     AcBrMesh2dElement2dTraverser meshElemTrav;

    73.     for (ebr = meshElemTrav.setMesh(brepMesh); !meshElemTrav.done(); ebr = meshElemTrav.next()) {
    74.       if (ebr != AcBr::eOk) return;
    75.       AcBrElement2d e;   ebr = meshElemTrav.getElement(e);
    76.       AcBrElement2dNodeTraverser elemNodeTrav;
    77.       for (ebr = elemNodeTrav.setElement(e) ; !elemNodeTrav.done(); elemNodeTrav.next())  {
    78.         AcBrNode n;
    79.         ebr = elemNodeTrav.getNode(n);
    80.         AcGePoint3d p; n.getPoint(p);
    81.         if (!vertexLookup.contains(p)) {
    82.           AcDbObjectPointer<AcDbPolyFaceMeshVertex> pMeshVert;  pMeshVert.create();
    83.           pMeshVert->setPosition(p);
    84.           pMesh->appendVertex(pMeshVert);
    85.           vertexLookup.append(p);
    86.         }
    87.       }
    88.     }

    89.     for (ebr = meshElemTrav.setMesh(brepMesh); !meshElemTrav.done(); ebr = meshElemTrav.next()) {
    90.       if (ebr != AcBr::eOk) return;
    91.       AcBrElement2d e;   ebr = meshElemTrav.getElement(e);
    92.       AcBrElement2dNodeTraverser elemNodeTrav;

    93.       AcGePoint3dArray pts(4);

    94.       for (ebr = elemNodeTrav.setElement(e) ; !elemNodeTrav.done(); ebr = elemNodeTrav.next())  {
    95.         if (ebr != AcBr::eOk) return;
    96.         AcBrNode n;
    97.         ebr = elemNodeTrav.getNode(n);
    98.         AcGePoint3d p; n.getPoint(p);
    99.         pts.append(p);
    100.       }

    101.       v0 = v1 = v2 = v3 = 0;
    102.       vertexLookup.find(pts[0],v0);
    103.       vertexLookup.find(pts[1],v1);
    104.       vertexLookup.find(pts[2],v2);
    105.       if (pts.length() == 4)   {
    106.         vertexLookup.find(pts[3],v3);
    107.       }

    108.       AcDbFaceRecord *pFaceRecord = new AcDbFaceRecord(v0, v1, v2, v3);
    109.       pFaceRecord->setColorIndex(2); // Задаём цвет грани - желтый
    110.       pMesh->appendFaceRecord(pFaceRecord);
    111.       pFaceRecord->close();
    112.     }
    113.   }
    114. } ;

    115. //-----------------------------------------------------------------------------
    116. IMPLEMENT_ARX_ENTRYPOINT(CMy3DSolidToPolyMeshApp)

    117. ACED_ARXCOMMAND_ENTRY_AUTO(CMy3DSolidToPolyMeshApp, Rivilis, 3DSolidToPolyMesh, 3DSolidToPolyMesh, ACRX_CMD_MODAL, NULL)
    复制代码

     

     

     

     

    3DSOLID в AcDbPolyFaceMesh
    哎...膜结构车棚,签到来了1...
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|中国膜结构网_中国空间膜结构协会

    GMT+8, 2024-5-13 13:47 , Processed in 0.059493 second(s), 21 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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