AcDb3dSolid::createLoftedSolid()

Автор Тема: AcDb3dSolid::createLoftedSolid()  (Прочитано 12910 раз)

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

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

Оффлайн mykola.kuryletsАвтор темы

  • ADN OPEN
  • Сообщений: 5
  • Карма: 0
AcDb3dSolid::createLoftedSolid()
« : 11-07-2014, 11:29:10 »
Добрый день!
Помогите, пожалуйста, решить проблему. Метод  AcDb3dSolid::createLoftedSolid() приводит к критической ошибке и аварийном прекращении работы программы в AutoCAD2015. Система Windows7 64bit. Хотя в AutoCAD2012 весь код работает безошибочно.


Ниже код функции где используется AcDb3dSolid::createLoftedSolid().

Код - C++ [Выбрать]
  1. static void Asdk_TESTLOFT(void)
  2.         {
  3.                 AcDbLine *pLine1 = new AcDbLine(AcGePoint3d( 0.0, 0.0, 0.0), AcGePoint3d( 0.0, 100.0, 0.0 ));
  4.                 AcDbLine *pLine2 = new AcDbLine(AcGePoint3d( 0.0, 100.0, 0.0), AcGePoint3d( 0.0, 100.0, 70.0 ));
  5.                 AcDbLine *pLine3 = new AcDbLine(AcGePoint3d( 0.0, 100.0, 70.0), AcGePoint3d( 0.0, 0.0, 70.0 ));
  6.                 AcDbLine *pLine4 = new AcDbLine(AcGePoint3d( 0.0, 0.0, 70.0), AcGePoint3d( 0.0, 0.0, 0.0 ));
  7.  
  8.                 AcDbVoidPtrArray curveArray1;
  9.                 curveArray1.append(pLine1);
  10.                 curveArray1.append(pLine2);
  11.                 curveArray1.append(pLine3);
  12.                 curveArray1.append(pLine4);
  13.  
  14.                 AcDbVoidPtrArray regArr1;
  15.                 Acad::ErrorStatus aEs = AcDbRegion::createFromCurves(curveArray1, regArr1);
  16.                 delete pLine1;
  17.                  delete pLine2;
  18.                  delete pLine3;
  19.                  delete pLine4;
  20.                 if(aEs != Acad::eOk)
  21.                         return;
  22.  
  23.                  AcDbRegion *pRegion1 = (AcDbRegion *)regArr1.at(0);
  24.  
  25.                 AcDbLine *pLine5 = new AcDbLine(AcGePoint3d( 300, 0.0 , 0.0), AcGePoint3d( 300, 100.0 , 0.0));
  26.                 AcDbLine *pLine6 = new AcDbLine(AcGePoint3d( 300.0, 100.0, 0.0), AcGePoint3d( 300.0, 100.0, 35.0));
  27.                 AcDbLine *pLine7 = new AcDbLine(AcGePoint3d( 300, 100.0 , 35.0), AcGePoint3d( 300.0, 0.0, 35.0 ));
  28.                  AcDbLine *pLine8 = new AcDbLine(AcGePoint3d( 300.0, 0.0, 35.0), AcGePoint3d( 300.0, 0.0, 0.0));
  29.  
  30.                  AcDbVoidPtrArray curveArray2;
  31.                  curveArray2.append(pLine5);
  32.                 curveArray2.append(pLine6);
  33.                  curveArray2.append(pLine7);
  34.                  curveArray2.append(pLine8);
  35.  
  36.                  AcDbVoidPtrArray regArr2;
  37.                  aEs = AcDbRegion::createFromCurves(curveArray2, regArr2);
  38.                  delete pLine5;
  39.                  delete pLine6;
  40.                  delete pLine7;
  41.                 delete pLine8;
  42.                 if(aEs != Acad::eOk)
  43.                          return;
  44.                  AcDbRegion *pRegion2 = (AcDbRegion *)regArr2.at(0);
  45.  
  46.                  AcGePoint3d startPnt(0.0, 50.0, 0.0);
  47.                 AcGePoint3d endPnt(300.0, 50.0, 0.0);
  48.                 AcGePoint3dArray fitPnts;
  49.                  fitPnts.append(startPnt);
  50.                 fitPnts.append(endPnt);
  51.  
  52.                  AcGeVector3d startTan(0.1223, 2.1674, 0);
  53.                 AcGeVector3d endTan(0.8968, 1.2518, 0.0);
  54.  
  55.                 AcDbSpline *pGuideSpline = new AcDbSpline(fitPnts,  startTan, endTan, AcGe::kChord, 4, 0.0);
  56.  
  57.                  AcArray< AcDbEntity *> crossCurvesArr;
  58.                  AcArray< AcDbEntity *> guideCuvesArr;
  59.                  AcDbEntity *pPathEntity = NULL;
  60.                 AcDbLoftOptions loftOption;
  61.  
  62.                 crossCurvesArr.append(pRegion1);
  63.                 crossCurvesArr.append(pRegion2);
  64.  
  65.                 guideCuvesArr.append(pGuideSpline);
  66.  
  67.                  AcDb3dSolid *pLoftedSolid = new AcDb3dSolid;
  68.                  // crash in 2015; ok in 2012;
  69.                  aEs = pLoftedSolid->createLoftedSolid(crossCurvesArr, guideCuvesArr, pPathEntity, loftOption);
  70.                
  71.                 delete pGuideSpline;
  72.                  if(aEs != Acad::eOk){
  73.                          delete pLoftedSolid;
  74.                         return;
  75.                 }
  76.  
  77.                 AcDbObjectId id3;
  78.  
  79.                 addToModelSpace(pLoftedSolid, id3);
  80.         }
« Последнее редактирование: 11-07-2014, 16:33:20 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: AcDb3dSolid::createLoftedSolid()
« Ответ #1 : 11-07-2014, 16:32:31 »
Добрый день и приветствую на форуме! Я проверю и если ошибка воспроизводится отправлю запрос в ADN DevHelp.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн mykola.kuryletsАвтор темы

  • ADN OPEN
  • Сообщений: 5
  • Карма: 0
Re: AcDb3dSolid::createLoftedSolid()
« Ответ #2 : 11-07-2014, 17:12:24 »
Спасибо!
Буду ждать ответа.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: AcDb3dSolid::createLoftedSolid()
« Ответ #3 : 11-07-2014, 17:13:24 »
Баг подтверждаю. В 2012 проверил - действительно работает нормально. Отправляю запрос в ADN DevHelp.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн mykola.kuryletsАвтор темы

  • ADN OPEN
  • Сообщений: 5
  • Карма: 0
Re: AcDb3dSolid::createLoftedSolid()
« Ответ #4 : 11-07-2014, 17:28:06 »
Еще интересно, если вместо сплайна поставить дугу то работает нормально везде.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: AcDb3dSolid::createLoftedSolid()
« Ответ #5 : 11-07-2014, 18:10:32 »
Проверил этот код в AutoCAD 2013 и 2014 - работает. Значит ошибку внесли в AutoCAD 2015.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн mykola.kuryletsАвтор темы

  • ADN OPEN
  • Сообщений: 5
  • Карма: 0
Re: AcDb3dSolid::createLoftedSolid()
« Ответ #6 : 15-07-2014, 10:11:10 »
Да!
Ето только в 2015.
Еще пробывал вместо AcDbRegion поставить AcDbCircle работает во всех AutoCAD.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: AcDb3dSolid::createLoftedSolid()
« Ответ #7 : 15-07-2014, 11:25:05 »
Получил ответ от ADN DevHelp. Баг подтвержден и передан команде разработчиков. Планируют исправить в AutoCAD 2015 ServicePack 2.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн mykola.kuryletsАвтор темы

  • ADN OPEN
  • Сообщений: 5
  • Карма: 0
Re: AcDb3dSolid::createLoftedSolid()
« Ответ #8 : 15-07-2014, 11:31:34 »
Спасибо за помощь!
Надеюсь в новом паке новых багов не будет :)

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: AcDb3dSolid::createLoftedSolid()
« Ответ #9 : 15-07-2014, 13:17:13 »
Пожалуйста! Я тоже очень надеюсь, что исправят этот и еще несколько других багов и не внесут новых ошибок.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: AcDb3dSolid::createLoftedSolid()
« Ответ #10 : 09-10-2014, 18:34:41 »
SP2 для AutoCAD 2015 уже вышел. Обещали, что этого бага в нем не будет. Не проверял?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Александр Ривилис 10-10-2014, 09:09:42

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: AcDb3dSolid::createLoftedSolid()
« Ответ #11 : 10-10-2014, 09:09:36 »
Не дождался ответа. Проверил сам. Всё работает в AutoCAD 2015 SP2 нормально.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Sergey Makarov

  • ADN OPEN
  • Сообщений: 36
  • Карма: 0
Re: AcDb3dSolid::createLoftedSolid()
« Ответ #12 : 06-07-2021, 19:40:33 »
Немного модифицировал  код функции автора для проведения собственного теста производительности метода AcDb3dSolid::createLoftedSolid(). Использую его как аналог вытягивания 3D-тел из коридоров Civil 3D ввиду многочисленных "особенностей" построения самого коридора. Однако, если операция формирования 3D-тел из коридора занимает ничтожно малое количество времени, то аналогичные построения через createLoftedSolid() занимают 3 секунды. Прогон двух Region в аналогичном количестве в C# занимаеn 13 секунд - непозволительное количество для использования инженерами в своей работе, так как постоянные ожидания в режиме повышенной срочности сильно раздражают. Привожу код теста ниже. Буду очень благодарен за подсказки и советы по снижению временных затрат при построении данного 3D-тела. Возможно у кого-то есть опыт использования других методов AcDb3dSolid или дополнительным опциям createLoftedSolid(). Ранее я использовал SubDMesh.ConvertToSolid() - работает быстрее, но создаёт дополнительные рёбра, что также не является идеальным решением.

Спасибо!

Тело функции MyCommand():

Код - C++ [Выбрать]
  1.         static void MyGroupMyCommand () {
  2.                 // Put your command code here
  3.                 AcArray< AcDbEntity *> crossCurvesArr;
  4.                 AcArray< AcDbEntity *> guideCuvesArr;
  5.                 AcDbEntity *pPathEntity = NULL;
  6.                 AcDbLoftOptions loftOption;
  7.  
  8.                 double y = 0.0;
  9.                 for (int i = 0; i < 300; i++)
  10.                 {
  11.                         y = i * 1.0;
  12.                         AcDbLine *pLine1 = new AcDbLine(AcGePoint3d(0.0, y, 0.0), AcGePoint3d(0.0, y, 0.15));
  13.                         AcDbLine *pLine2 = new AcDbLine(AcGePoint3d(0.0, y, 0.15), AcGePoint3d(0.03, y, 0.30));
  14.                         AcDbLine *pLine3 = new AcDbLine(AcGePoint3d(0.03, y, 0.30), AcGePoint3d(0.18, y, 0.30));
  15.                         AcDbLine *pLine4 = new AcDbLine(AcGePoint3d(0.18, y, 0.30), AcGePoint3d(0.18, y, 0.0));
  16.                         AcDbLine *pLine5 = new AcDbLine(AcGePoint3d(0.18, y, 0.0), AcGePoint3d(0.0, y, 0.0));
  17.  
  18.                         AcDbVoidPtrArray curveArray1;
  19.                         curveArray1.append(pLine1);
  20.                         curveArray1.append(pLine2);
  21.                         curveArray1.append(pLine3);
  22.                         curveArray1.append(pLine4);
  23.                         curveArray1.append(pLine5);
  24.  
  25.                         AcDbVoidPtrArray regArr1;
  26.                         Acad::ErrorStatus aEs = AcDbRegion::createFromCurves(curveArray1, regArr1);
  27.                         delete pLine1;
  28.                         delete pLine2;
  29.                         delete pLine3;
  30.                         delete pLine4;
  31.                         delete pLine5;
  32.                         if (aEs != Acad::eOk)
  33.                                 return;
  34.  
  35.                         AcDbRegion *pRegion1 = (AcDbRegion *)regArr1.at(0);
  36.                         crossCurvesArr.append(pRegion1);
  37.                 }
  38.  
  39.  
  40.  
  41.                 AcDb3dSolid *pLoftedSolid = new AcDb3dSolid;
  42.  
  43.                 Acad::ErrorStatus aEs = pLoftedSolid->createLoftedSolid(crossCurvesArr, guideCuvesArr, pPathEntity, loftOption);
  44.  
  45.  
  46.                 if (aEs != Acad::eOk) {
  47.                         delete pLoftedSolid;
  48.                         return;
  49.                 }
  50.  
  51.                 AcDbBlockTable *pBlockTable;
  52.                 acdbHostApplicationServices()->workingDatabase()
  53.                         ->getSymbolTable(pBlockTable, AcDb::kForRead);
  54.                 AcDbBlockTableRecord *pBlockTableRecord;
  55.                 pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,
  56.                         AcDb::kForWrite);
  57.                 pBlockTable->close();
  58.  
  59.                 AcDbObjectId objectId;
  60.                 pBlockTableRecord->appendAcDbEntity(objectId, pLoftedSolid);
  61.                 pBlockTableRecord->close();
  62.                 pLoftedSolid->close();
  63.         }

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: AcDb3dSolid::createLoftedSolid()
« Ответ #13 : 06-07-2021, 22:07:07 »
Sergey Makarov,
Эта функция вообще не должна работать, так как ты не инициализируешь ни guideCuvesArr, ни pPathEntity.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Sergey Makarov

  • ADN OPEN
  • Сообщений: 36
  • Карма: 0
Re: AcDb3dSolid::createLoftedSolid()
« Ответ #14 : 06-07-2021, 23:56:55 »
Эта функция вообще не должна работать, так как ты не инициализируешь ни guideCuvesArr, ни pPathEntity.

Касательно guideCuvesArr вы совершенно правы, запамятовал. Что касается pPathEntity, то здесь немного не так:
Код - C++ [Выбрать]
  1. AcDbEntity *pPathEntity = NULL;

Учитывая "мощную" документацию методов AcDb3dSolid в Autodesk ObjectARX for AutoCAD, я воспользовался немного более документированной справкой альтернативного продукта, где написано следующее:

crossSectionCurves — Input array of cross section profiles that are used for lofted solid creation.
guideCurves — Input array of guide curves that influence a solid’s shape (optional).
pPathCurve — Input curve that influences a solid’s shape (optional).
loftOptions — Input loft options.

и присутствует такая строка:

Код - C++ [Выбрать]
  1. res = pSolid->createLoftedSolid(crossSectionCurves, guideCurvesArray, pPathCurve, loftOptions);
  2. // creates solid from only cross section curves, or from cross section curves with path curve(if it is presented ).

и если в C# для guideCurves требуется инициализация при вызове .createLoftedSolid(...), то в C++ при выполнении ->createLoftedSolid(...), видимо, есть обработка исключения и указанный в первом моём сообщении код работает. Полагаю, отличия в производительности при инициализации AcArray<AcDbEntity*> guideCuvesArr указателями на некоторые примитивы вряд ли удастся добиться, хотя стоит попробовать. Единственное, что пока не позволяет мне этого сделать, это отсутствие документации на сей счёт. Я пробовал в C# создать массив объектов Polyline3d, инициализировав его одной траекторией, наподобие сплайна в примере создателя темы, и каркасом 3D-полилиний по каждой вершине. В первом случае следует исключение, во втором случае кажется без изменений в производительности. Мне проще было создать программно SubDMesh и конвертировать его в Solid3d, чем найти хоть какой-то пример или справочную информацию по инициализации guideCurvesArray 3D-полилинией/полилиниями.