Конвертация 3DSOLID в AcDbPolyFaceMesh

Автор Тема: Конвертация 3DSOLID в AcDbPolyFaceMesh  (Прочитано 9361 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн ВиталийАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 125
  • Карма: -1
Нужна универсальная конвертация 3DSOLID в AcDbPolyFaceMesh. Есть пример на C#, но я в нем ничего не понимаю, Понятно лишь, что такое возможно.
вот ссылка: http://adn-cis.org/sozdanie-polyfacemesh-iz-3d-solid.html
Хотелось бы увидеть пример того же самого, но в коде С++ ObjectARX, поскольку функцию нужно внедрить в существующий ARX проект. Есть решение конвертации в 3DSOLID через brep, теперь фактически стоит обратная задача.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Конвертация 3DSOLID в AcDbPolyFaceMesh
« Ответ #1 : 30-03-2016, 23:43:58 »
Попробуй. Я тестировал в AutoCAD 2016. Результаты для обычных твердых тел (желтые - AcDbPolyFaceMesh, белые - AcDb3Dsolid):



Код - C++ [Выбрать]
  1. //-----------------------------------------------------------------------------
  2. //----- acrxEntryPoint.cpp
  3. //-----------------------------------------------------------------------------
  4. #include "StdAfx.h"
  5. #include "resource.h"
  6.  
  7. //-----------------------------------------------------------------------------
  8. #define szRDS _RXST("")
  9.  
  10. //-----------------------------------------------------------------------------
  11. //----- ObjectARX EntryPoint
  12. class CMy3DSolidToPolyMeshApp : public AcRxArxApp {
  13.  
  14. public:
  15.   CMy3DSolidToPolyMeshApp () : AcRxArxApp () {}
  16.  
  17.   virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
  18.     AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
  19.     return (retCode) ;
  20.   }
  21.  
  22.   virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
  23.     AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;
  24.     return (retCode) ;
  25.   }
  26.  
  27.   virtual void RegisterServerComponents () {    }
  28.  
  29.   static void Rivilis3DSolidToPolyMesh () {
  30.  
  31.     ads_name en; ads_point p;
  32.  
  33.     if (acedEntSel(_T("\nВыберите твердое тело: "), en, p) != RTNORM)
  34.       return;
  35.  
  36.     AcDbObjectId eid;
  37.     if (acdbGetObjectId(eid, en) != Acad::eOk)
  38.       return;
  39.  
  40.     AcDbObjectPointer<AcDb3dSolid> p3DSolid(eid, AcDb::kForRead);
  41.     if (p3DSolid.openStatus() == Acad::eWrongObjectType) {
  42.       acutPrintf(_T("\nЭто не твердое тело!"));
  43.       return;
  44.     }
  45.  
  46.     AcDbExtents ext; p3DSolid->getGeomExtents(ext);
  47.     double length = ext.minPoint().distanceTo(ext.maxPoint());
  48.  
  49.     AcBrBrep brp;
  50.  
  51.     AcBr::ErrorStatus ebr;
  52.     ebr = brp.set(*p3DSolid);
  53.     if (ebr != AcBr::eOk) {
  54.       acutPrintf(_T("\nОшибка br.set(*p3DSolid) = %d"), ebr);
  55.       return;
  56.     }
  57.  
  58.     AcBrMesh2dControl mc;
  59.     // Задаём максимальное расстояние между узлами
  60.     // mc.setMaxNodeSpacing( length / 100.0);
  61.     // Задаём максимальное количество элементов в сети.
  62.     // mc.setMaxSubdivisions(100000);
  63.     // Задаём максимальное отклонение точки
  64.     mc.setDistTol(length / 100.0);
  65.     // Задаём тип элементов - только треугольники
  66.     mc.setElementShape(AcBr::kAllTriangles);
  67.  
  68.     AcBrMesh2dFilter mf;
  69.     const AcBrEntity* meshEnt = (AcBrEntity*)&brp;
  70.     mf.insert(make_pair(meshEnt, mc));
  71.     AcBrMesh2d brepMesh;
  72.     if ((ebr = brepMesh.generate(mf)) != AcBr::eOk) {
  73.       acutPrintf(_T("\n Ошибка в AcBrMesh2d::generate %d"), ebr);
  74.       return;
  75.     }
  76.  
  77.     AcDbObjectPointer<AcDbPolyFaceMesh> pMesh; pMesh.create();
  78.     pMesh->setDatabaseDefaults();
  79.     pMesh->setColorIndex(2); // Пусть сеть будет желтая
  80.     AcDbBlockTableRecordPointer pBtr(acdbCurDwg()->currentSpaceId(), AcDb::kForWrite);
  81.     if (pBtr.openStatus() != Acad::eOk)
  82.       return;
  83.     pBtr->appendAcDbEntity(pMesh);
  84.  
  85.     int v0 = 0, v1 = 0, v2 = 0, v3 = 0;
  86.  
  87.     int iter = 0;
  88.     AcGePoint3dArray vertexLookup;
  89.     vertexLookup.setPhysicalLength(10000);
  90.     // Чтобы пропустить нулевой элемент
  91.     vertexLookup.append(AcGePoint3d::kOrigin);
  92.  
  93.     AcBrMesh2dElement2dTraverser meshElemTrav;
  94.  
  95.     for (ebr = meshElemTrav.setMesh(brepMesh); !meshElemTrav.done(); ebr = meshElemTrav.next()) {
  96.       if (ebr != AcBr::eOk) return;
  97.       AcBrElement2d e;   ebr = meshElemTrav.getElement(e);
  98.       AcBrElement2dNodeTraverser elemNodeTrav;
  99.       for (ebr = elemNodeTrav.setElement(e) ; !elemNodeTrav.done(); elemNodeTrav.next())  {
  100.         AcBrNode n;
  101.         ebr = elemNodeTrav.getNode(n);
  102.         AcGePoint3d p; n.getPoint(p);
  103.         if (!vertexLookup.contains(p)) {
  104.           AcDbObjectPointer<AcDbPolyFaceMeshVertex> pMeshVert;  pMeshVert.create();
  105.           pMeshVert->setPosition(p);
  106.           pMesh->appendVertex(pMeshVert);
  107.           vertexLookup.append(p);
  108.         }
  109.       }
  110.     }
  111.  
  112.     for (ebr = meshElemTrav.setMesh(brepMesh); !meshElemTrav.done(); ebr = meshElemTrav.next()) {
  113.       if (ebr != AcBr::eOk) return;
  114.       AcBrElement2d e;   ebr = meshElemTrav.getElement(e);
  115.       AcBrElement2dNodeTraverser elemNodeTrav;
  116.  
  117.       AcGePoint3dArray pts;
  118.  
  119.       for (ebr = elemNodeTrav.setElement(e) ; !elemNodeTrav.done(); ebr = elemNodeTrav.next())  {
  120.         if (ebr != AcBr::eOk) return;
  121.         AcBrNode n;
  122.         ebr = elemNodeTrav.getNode(n);
  123.         AcGePoint3d p; n.getPoint(p);
  124.         pts.append(p);
  125.       }
  126.  
  127.       v0 = v1 = v2 = v3 = 0;
  128.       vertexLookup.find(pts[0],v0);
  129.       vertexLookup.find(pts[1],v1);
  130.       vertexLookup.find(pts[2],v2);
  131.       if (pts.length() == 4)   {
  132.         vertexLookup.find(pts[3],v3);
  133.       }
  134.  
  135.       AcDbFaceRecord *pFaceRecord = new AcDbFaceRecord(v0, v1, v2, v3);
  136.       pMesh->appendFaceRecord(pFaceRecord);
  137.       pFaceRecord->close();
  138.     }
  139.   }
  140. } ;
  141.  
  142. //-----------------------------------------------------------------------------
  143. IMPLEMENT_ARX_ENTRYPOINT(CMy3DSolidToPolyMeshApp)
  144.  
  145. ACED_ARXCOMMAND_ENTRY_AUTO(CMy3DSolidToPolyMeshApp, Rivilis, 3DSolidToPolyMesh, 3DSolidToPolyMesh, ACRX_CMD_MODAL, NULL)

P.S.: Можно играться параметрами AcBrMesh2dControl для лучшего преобразования 3DSolid в Mesh
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ВиталийАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 125
  • Карма: -1
Re: Конвертация 3DSOLID в AcDbPolyFaceMesh
« Ответ #2 : 31-03-2016, 14:38:13 »
Спасибо! Оперативно. Но с первого раза не получается чисто. Скомпилировал у себя, проверил на тех же телах и на своих. Везде одни и те же нюансы. 1. Polyface не красится в желтый цвет, становится всегда черной. 2. Моя команда конвертации таких сетей в другой объект на данных сетях виснет, приходится ее расчленять и пересобирать, тогда становится желтой и конвертируемой. 3. Появляются лишние грани триангуляции на плоских, ровных поверхностях, от которых не отделаться. В Polyface есть такая возможность делать грани невидимыми но это возможно когда знаешь какие грани. Может быть есть функция как в 3Dsolid cleanBody() убирающая такие грани автоматически?  Первые 2 пункта вообще странные, может я что то не так сделал. 3 пункт требует анализа и доработки.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Конвертация 3DSOLID в AcDbPolyFaceMesh
« Ответ #3 : 31-03-2016, 14:46:05 »
Может быть есть функция как в 3Dsolid cleanBody() убирающая такие грани автоматически?
Нет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Конвертация 3DSOLID в AcDbPolyFaceMesh
« Ответ #4 : 31-03-2016, 14:49:51 »
Скомпилировал у себя, проверил на тех же телах и на своих.
Скомпилировал мой исходник или свой, в который впихивал мой код?
Цвет не устанавливается, если какие-то ошибки в сети. Например, когда у меня небыло строк:
Код - C++ [Выбрать]
  1.     // Чтобы пропустить нулевой элемент
  2.     vertexLookup.append(AcGePoint3d::kOrigin);
то возникала такая проблема и были дырки в сети.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ВиталийАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 125
  • Карма: -1
Re: Конвертация 3DSOLID в AcDbPolyFaceMesh
« Ответ #5 : 31-03-2016, 16:40:50 »
Аккуратно перенес твои строки к себе. Прилагаю тестовое тело. Если у тебя пройдет, будет сразу желтым, то я что-то напортачил. Работаю в 2015.

Отмечено как Решение Александр Ривилис 04-07-2017, 23:31:06

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Конвертация 3DSOLID в AcDbPolyFaceMesh
« Ответ #6 : 31-03-2016, 23:11:41 »
Немного изменил код:
1) Изменил тип предпочитаемых элементов сети с треугольников на 4-хугольники (если не устраивает - можешь поменять)
2) Устанавливаю цвет не только всей сети, но и каждой из её граней.

Код - C++ [Выбрать]
  1. //-----------------------------------------------------------------------------
  2. //----- acrxEntryPoint.cpp
  3. //-----------------------------------------------------------------------------
  4. #include "StdAfx.h"
  5. #include "resource.h"
  6.  
  7. //-----------------------------------------------------------------------------
  8. #define szRDS _RXST("")
  9.  
  10. //-----------------------------------------------------------------------------
  11. //----- ObjectARX EntryPoint
  12. class CMy3DSolidToPolyMeshApp : public AcRxArxApp {
  13.  
  14. public:
  15.   CMy3DSolidToPolyMeshApp () : AcRxArxApp () {}
  16.  
  17.   virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
  18.     AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
  19.     return (retCode) ;
  20.   }
  21.  
  22.   virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
  23.     AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;
  24.     return (retCode) ;
  25.   }
  26.  
  27.   virtual void RegisterServerComponents () {    }
  28.  
  29.   static void Rivilis3DSolidToPolyMesh () {
  30.  
  31.     ads_name en; ads_point p;
  32.  
  33.     if (acedEntSel(_T("\nВыберите твердое тело: "), en, p) != RTNORM)
  34.       return;
  35.  
  36.     AcDbObjectId eid;
  37.     if (acdbGetObjectId(eid, en) != Acad::eOk)
  38.       return;
  39.  
  40.     AcDbObjectPointer<AcDb3dSolid> p3DSolid(eid, AcDb::kForRead);
  41.     if (p3DSolid.openStatus() == Acad::eWrongObjectType) {
  42.       acutPrintf(_T("\nЭто не твердое тело!"));
  43.       return;
  44.     }
  45.  
  46.     AcDbExtents ext; p3DSolid->getGeomExtents(ext);
  47.     double length = ext.minPoint().distanceTo(ext.maxPoint());
  48.  
  49.     AcBrBrep brp;
  50.  
  51.     AcBr::ErrorStatus ebr;
  52.     ebr = brp.set(*p3DSolid);
  53.     if (ebr != AcBr::eOk) {
  54.       acutPrintf(_T("\nОшибка br.set(*p3DSolid) = %d"), ebr);
  55.       return;
  56.     }
  57.  
  58.     AcBrMesh2dControl mc;
  59.     // Задаём максимальное расстояние между узлами
  60.     // mc.setMaxNodeSpacing( length / 100.0);
  61.     // Задаём максимальное количество элементов в сети.
  62.     // mc.setMaxSubdivisions(100000);
  63.     // Задаём максимальное отклонение точки
  64.     // mc.setDistTol(length / 100.0);
  65.     // Задаём тип элементов - пытаемся заменить на 4-угольники
  66.     mc.setElementShape(AcBr::kAllQuadrilaterals);
  67.  
  68.     AcBrMesh2dFilter mf;
  69.     const AcBrEntity* meshEnt = (AcBrEntity*)&brp;
  70.     mf.insert(make_pair(meshEnt, mc));
  71.     AcBrMesh2d brepMesh;
  72.     if ((ebr = brepMesh.generate(mf)) != AcBr::eOk) {
  73.       acutPrintf(_T("\n Ошибка в AcBrMesh2d::generate %d"), ebr);
  74.       return;
  75.     }
  76.  
  77.     AcDbObjectPointer<AcDbPolyFaceMesh> pMesh; pMesh.create();
  78.     pMesh->setDatabaseDefaults();
  79.     pMesh->setColorIndex(2); // Пусть сеть будет желтая
  80.     AcDbBlockTableRecordPointer pBtr(acdbCurDwg()->currentSpaceId(), AcDb::kForWrite);
  81.     if (pBtr.openStatus() != Acad::eOk)
  82.       return;
  83.     pBtr->appendAcDbEntity(pMesh);
  84.  
  85.     int v0 = 0, v1 = 0, v2 = 0, v3 = 0;
  86.  
  87.     int iter = 0;
  88.     AcGePoint3dArray vertexLookup(65536);
  89.     // Чтобы пропустить нулевой элемент
  90.     vertexLookup.append(AcGePoint3d::kOrigin);
  91.  
  92.     AcBrMesh2dElement2dTraverser meshElemTrav;
  93.  
  94.     for (ebr = meshElemTrav.setMesh(brepMesh); !meshElemTrav.done(); ebr = meshElemTrav.next()) {
  95.       if (ebr != AcBr::eOk) return;
  96.       AcBrElement2d e;   ebr = meshElemTrav.getElement(e);
  97.       AcBrElement2dNodeTraverser elemNodeTrav;
  98.       for (ebr = elemNodeTrav.setElement(e) ; !elemNodeTrav.done(); elemNodeTrav.next())  {
  99.         AcBrNode n;
  100.         ebr = elemNodeTrav.getNode(n);
  101.         AcGePoint3d p; n.getPoint(p);
  102.         if (!vertexLookup.contains(p)) {
  103.           AcDbObjectPointer<AcDbPolyFaceMeshVertex> pMeshVert;  pMeshVert.create();
  104.           pMeshVert->setPosition(p);
  105.           pMesh->appendVertex(pMeshVert);
  106.           vertexLookup.append(p);
  107.         }
  108.       }
  109.     }
  110.  
  111.     for (ebr = meshElemTrav.setMesh(brepMesh); !meshElemTrav.done(); ebr = meshElemTrav.next()) {
  112.       if (ebr != AcBr::eOk) return;
  113.       AcBrElement2d e;   ebr = meshElemTrav.getElement(e);
  114.       AcBrElement2dNodeTraverser elemNodeTrav;
  115.  
  116.       AcGePoint3dArray pts(4);
  117.  
  118.       for (ebr = elemNodeTrav.setElement(e) ; !elemNodeTrav.done(); ebr = elemNodeTrav.next())  {
  119.         if (ebr != AcBr::eOk) return;
  120.         AcBrNode n;
  121.         ebr = elemNodeTrav.getNode(n);
  122.         AcGePoint3d p; n.getPoint(p);
  123.         pts.append(p);
  124.       }
  125.  
  126.       v0 = v1 = v2 = v3 = 0;
  127.       vertexLookup.find(pts[0],v0);
  128.       vertexLookup.find(pts[1],v1);
  129.       vertexLookup.find(pts[2],v2);
  130.       if (pts.length() == 4)   {
  131.         vertexLookup.find(pts[3],v3);
  132.       }
  133.  
  134.       AcDbFaceRecord *pFaceRecord = new AcDbFaceRecord(v0, v1, v2, v3);
  135.       pFaceRecord->setColorIndex(2); // Задаём цвет грани - желтый
  136.       pMesh->appendFaceRecord(pFaceRecord);
  137.       pFaceRecord->close();
  138.     }
  139.   }
  140. } ;
  141.  
  142. //-----------------------------------------------------------------------------
  143. IMPLEMENT_ARX_ENTRYPOINT(CMy3DSolidToPolyMeshApp)
  144.  
  145. ACED_ARXCOMMAND_ENTRY_AUTO(CMy3DSolidToPolyMeshApp, Rivilis, 3DSolidToPolyMesh, 3DSolidToPolyMesh, ACRX_CMD_MODAL, NULL)

Результат в приложенном файле и на видео:



Как видишь никаких дырок нет. Специально проверял именно в AutoCAD 2015 SP2 x64

P.S.: Приложил полный проект.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ВиталийАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 125
  • Карма: -1
Re: Конвертация 3DSOLID в AcDbPolyFaceMesh
« Ответ #7 : 01-04-2016, 08:37:12 »
Не проходит для разных тел, например в которых есть грани из 3х и 4х вершин. Там в Polymesh есть грани как треугольники так  4-х угольники, но все имеют по 4 точки. В треугольниках 2 точки совпадают. У тебя вроде все правильно если расчленить и проверить, но что то не так.

См. на рисунке слева тела, посередине твои сети, справа синии мои после ремонта твоих. Мои все правильные.

проверял чисто твой проект.


Оффлайн ВиталийАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 125
  • Карма: -1
Re: Конвертация 3DSOLID в AcDbPolyFaceMesh
« Ответ #8 : 01-04-2016, 09:40:31 »
Александр, большое спасибо тебе. Я думаю отложить эту тему вообще. Твой пример в принципе делает, то что положено. Чисто для моей идеи дальше их чисто конвертировать не подходит. Но тема очень полезная своими частями, которые нужно еще осознать.

Интересно, что вообще такое brep, как его вообще добавить, увидеть в рисунке, на какие примитивы он расчленяется?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Конвертация 3DSOLID в AcDbPolyFaceMesh
« Ответ #9 : 01-04-2016, 13:12:09 »
См. на рисунке слева тела, посередине твои сети, справа синии мои после ремонта твоих. Мои все правильные.
Я не знаю, почему ты считаешь свои правильными. В теории они как раз и неправильные.
Вот это мои:

А вот это твои:

Во всех твоих PolyFaceMesh 4-ая точка в грани не пустая, а совпадающая с третьей и она видимая. В чем глубокий смысл этого я не знаю. Во всяком случае и в моём коде если код
Код - C++ [Выбрать]
  1.       if (pts.length() == 4)   {
  2.         vertexLookup.find(pts[3],v3);
  3.       }
заменить на
Код - C++ [Выбрать]
  1.       if (pts.length() == 4)   {
  2.         vertexLookup.find(pts[3],v3);
  3.       } else {
  4.         v3 = v2;
  5.       }
то результат должен быть аналогично твоему.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Конвертация 3DSOLID в AcDbPolyFaceMesh
« Ответ #10 : 01-04-2016, 13:14:31 »
Интересно, что вообще такое brep, как его вообще добавить, увидеть в рисунке, на какие примитивы он расчленяется?
Читай справку. Раздел: Using the Boundary Representation Library. BREP ни на что не расчленяется, так как это геометрическое представление, а не примитивы, которые могут хранится в dwg-файле.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ВиталийАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 125
  • Карма: -1
Re: Конвертация 3DSOLID в AcDbPolyFaceMesh
« Ответ #11 : 02-04-2016, 07:37:55 »
Теперь понятно по граням. Старым кодам это было критично. Но пока не решен 3 вопрос с лишними ребрами треангуляции, решение по данной конвертации не полное. Я к сожалению не рыцарь arx, только временами сталкиваюсь, мне это не осилить. Соображение следующие. Там есть метод mc.setElementShape(AcBr::kAllPolygons), т.е. или через brep как то выявлять такие ребра, которые должны быть невидимыми в PolyFaceMesh внутри плоских областей, либо через amodeler это делать, но я сходу не нашел в нем похожего метода как в 3dSolid - cleanBody().   

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Конвертация 3DSOLID в AcDbPolyFaceMesh
« Ответ #12 : 02-04-2016, 12:36:55 »
т.е. или через brep как то выявлять такие ребра, которые должны быть невидимыми в PolyFaceMesh внутри плоских областей
А вот это уже самостоятельно. Это к данной теме не имеет никакого отношения.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн kokospb

  • ADN OPEN
  • Сообщений: 3
  • Карма: 0
  • Skype: live:ko_naumenko
Re: Конвертация 3DSOLID в AcDbPolyFaceMesh
« Ответ #13 : 19-12-2023, 10:09:28 »
Приветствую, господа!
Понимаю, что тема старая, но вдруг...
Подскажите пожалуйста, какие заголовочные файлы и библиотеки необходимо включить в проект для применения функций, связанных с AcBrEntity? В частности с AcDbBody.
я включил файл brent.h, прописал пути к папкам inc и lib проекта brepsample и добавил строки для загрузки aecmodeler70.dbx. Но при попытке использовать функцию ->getBoundBlock(), появляется следующая ошибка, которую пока не удается устранить:
Error   LNK2019   unresolved external symbol "public: enum AcBr::ErrorStatus __cdecl AcBrEntity::getBoundBlock(class AcGeBoundBlock3d &)const " (?getBoundBlock@AcBrEntity@@QEBA?AW4ErrorStatus@AcBr@@AEAVAcGeBoundBlock3d@@@Z) referenced in function "bool __cdecl compareSubSurfaces(class AcDbSurface *,class AcDbSurface *,class AcArray<class AcGePoint3d,class AcArrayMemCopyReallocator<class AcGePoint3d> > &,class AcArray<class AcGePoint3d,class AcArrayMemCopyReallocator<class AcGePoint3d> > &)" (?compareSubSurfaces@@YA_NPEAVAcDbSurface@@0AEAV?$AcArray@VAcGePoint3d@@V?$AcArrayMemCopyReallocator@VAcGePoint3d@@@@@@1@Z)   testcode1   C:\Users\ko_na\source\repos\testcode1\testcode1.obj   1   


Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Конвертация 3DSOLID в AcDbPolyFaceMesh
« Ответ #14 : 19-12-2023, 23:22:01 »
utils\brep\lib-x64\acbr24.lib
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн kokospb

  • ADN OPEN
  • Сообщений: 3
  • Карма: 0
  • Skype: live:ko_naumenko
Re: Конвертация 3DSOLID в AcDbPolyFaceMesh
« Ответ #15 : 20-12-2023, 01:41:46 »
благодарю, Александр! действительно дело было в нем!) любопытно, что пути к данной папке были указаны в VC++ library directories. однако необходимо было добавить файл библиотеки непосредственно в проект.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Конвертация 3DSOLID в AcDbPolyFaceMesh
« Ответ #16 : 20-12-2023, 18:06:22 »
любопытно, что пути к данной папке были указаны в VC++ library directories
Если нет явного указания в .h-файле чего-то типа:
Код - C++ [Выбрать]
  1.         #pragma comment (lib ,"acgex24.lib")
  2.         #pragma comment (lib ,"acbr24.lib")
то acgex24.lib и acdb24.lib нужно явно линковать.
В файле dbxHeaders.h (который вызывается из arxHeaders.h) есть строки:
Код - C++ [Выбрать]
  1. #ifdef _BREP_SUPPORT_
  2.         #pragma comment (lib ,"acgex24.lib")
  3.         #pragma comment (lib ,"acbr24.lib")
  4. #endif // _BREP_SUPPORT_
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн kokospb

  • ADN OPEN
  • Сообщений: 3
  • Карма: 0
  • Skype: live:ko_naumenko
Re: Конвертация 3DSOLID в AcDbPolyFaceMesh
« Ответ #17 : 20-12-2023, 19:04:25 »
огромное спасибо за разъяснения! я сам по образованию архитектор. изучаю objectARX, чтобы уйти от проектирования, которое по тем или иным причинам не получается, в более абстрактную область.