Сообщество программистов Autodesk в СНГ

ADN Club => ObjectARX => Тема начата: Николай Горлов от 21-02-2017, 15:44:06

Название: 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 или хотя б не написать о таком замечательном навороте как "не забываем вручную после использования функции докрутить объект до нужного положения" в справке по данной функции?
(https://s11.postimg.org/yc3pv8bcf/funnyfunction.png) (https://postimg.org/image/yc3pv8bcf/)
Название: Re: AcDbHatch::getRegionArea
Отправлено: Александр Ривилис от 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 открывать.
Название: Re: AcDbHatch::getRegionArea
Отправлено: Николай Горлов от 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. }

в тестовом примере просто подцепил старый вариант )))
Название: Re: AcDbHatch::getRegionArea
Отправлено: Александр Ривилис от 21-02-2017, 16:27:44
Николай Горлов
Совсем же другое дело. :)