AcDbHatch::getRegionArea

Автор Тема: AcDbHatch::getRegionArea  (Прочитано 6816 раз)

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

Оффлайн Николай ГорловАвтор темы

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
AcDbHatch::getRegionArea
« : 21-02-2017, 15:44:06 »
недавно заметил, что не всегда корректно отрабатывает код. ну и, не смотря на природную лень :), начал разбираться в происходящем. проблема собственно говоря заключается в корректной работе фунции getRegionArea. в описании сказано, что должна создаться  область, являющаяся контуром штриховки, либо ничего не создастся, если контур штриховки был не замкнут. вот так выглядит код, для тестирования работы той развеселой функции:
Код - C++ [Выбрать]
  1. AcDbObjectId contId;
  2. AcGePoint3d minPt;
  3. ads_name entcont;
  4. acedEntSel(_T("\nВыбери штриховку: "),entcont,asDblArray(minPt));
  5. acdbGetObjectId(contId,entcont);
  6. AcDbHatch* pHatch;
  7. if (acdbOpenObject(pHatch,contId,AcDb::kForRead) != Acad::eOk)
  8. {
  9.         acutPrintf(_T("\n* Не штриховка"));
  10.         return;
  11. }
  12. pHatch->close();
  13.  
  14. AcDbRegion * pHatchBound = pHatch->getRegionArea();
  15. if (pHatchBound == NULL)
  16. {
  17.         acutPrintf(_T("\n* Контур штриховки не замкнут"));
  18.         return;
  19. }
  20. //-> выясняем где мы в модели или в листе
  21. ACHAR mpspace[50];
  22. if (acdbCurDwg()->tilemode() == 1)_tcscpy(mpspace,ACDB_MODEL_SPACE);
  23. else _tcscpy(mpspace,ACDB_PAPER_SPACE);
  24. //<-
  25.  
  26. //-> добавляем объект в БД чертежа
  27. Acad::ErrorStatus es;
  28. AcDbBlockTable * pBlockTable;
  29. AcDbBlockTableRecord * pSpaceRecord;
  30. if ((es = acdbCurDwg()->getBlockTable(pBlockTable, AcDb::kForRead))==Acad::eOk)
  31. {
  32.         if ((es = pBlockTable->getAt(mpspace, pSpaceRecord, AcDb::kForWrite))==Acad::eOk)
  33.         {
  34.                 if ((es = pSpaceRecord->appendAcDbEntity(contId, pHatchBound))==Acad::eOk)pHatchBound->close();
  35.                 pSpaceRecord->close();
  36.         }
  37.         pBlockTable->close();
  38. }
  39. //<-

сделал тестовый файлик с двумя штриховками. одна из них создана в МСК (желая), вторая в ПСК (зеленая). причем нормаль у зеленой  - (0,0,-1). и в результате работы функции отрисовывались черные области, показывающие границы штриховки. для штриховки, созданной в МСК контур соответствует действительности, а вот штриховке, созданной в ПСК повезло меньше. контур есть, но он идет х... в произвольном месте.
для того чтоб привести всё это в человеческий вид нужно перед добавлением контура в бд провести принудительную трансформацию
Код - C++ [Выбрать]
  1. AcGeMatrix3d mat;
  2. pHatch->getEcs(mat);
  3. pHatchBound->transformBy(mat);
тогда всё становится на свои места. ну и собственно вопрос :). вот почему б автодеску не сделать эту махинацию внутри функции getRegionArea или хотя б не написать о таком замечательном навороте как "не забываем вручную после использования функции докрутить объект до нужного положения" в справке по данной функции?


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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: AcDbHatch::getRegionArea
« Ответ #1 : 21-02-2017, 16:02:50 »
Интересный вопрос. Нужно посмотреть. Похоже, что они трактуют 'area' как площадь, а площадь то у них совпадает. :)
P.S.: Походу дела увидел у тебя очень странную конструкцию
Код - C++ [Выбрать]
  1. ACHAR mpspace[50];
  2. if (acdbCurDwg()->tilemode() == 1)_tcscpy(mpspace,ACDB_MODEL_SPACE);
  3. else _tcscpy(mpspace,ACDB_PAPER_SPACE);
Это всё зачем? Это тебя бы не удовлетворило:
Код - C++ [Выбрать]
  1. acdbCurDwg()->currentSpaceId();
Заодно не нужно было бы BlockTable открывать.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Николай ГорловАвтор темы

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
Re: AcDbHatch::getRegionArea
« Ответ #2 : 21-02-2017, 16:25:03 »
почему не устроит, устроит. давно уже пользуюсь
Код - C++ [Выбрать]
  1. AcDbBlockTableRecordPointer curSpace(curDoc()->database()->currentSpaceId(), AcDb::kForWrite);
  2. if (curSpace.openStatus() == Acad::eOk)
  3. {
  4.         curSpace->appendAcDbEntity(eId, pEnt);
  5.         pEnt->close();
  6. }

в тестовом примере просто подцепил старый вариант )))

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: AcDbHatch::getRegionArea
« Ответ #3 : 21-02-2017, 16:27:44 »
Николай Горлов
Совсем же другое дело. :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение