недавно заметил, что не всегда корректно отрабатывает код. ну и, не смотря на природную лень
, начал разбираться в происходящем. проблема собственно говоря заключается в корректной работе фунции
getRegionArea. в описании сказано, что должна создаться область, являющаяся контуром штриховки, либо ничего не создастся, если контур штриховки был не замкнут. вот так выглядит код, для тестирования работы той развеселой функции:
AcDbObjectId contId;
AcGePoint3d minPt;
ads_name entcont;
acedEntSel(_T("\nВыбери штриховку: "),entcont,asDblArray(minPt));
acdbGetObjectId(contId,entcont);
AcDbHatch* pHatch;
if (acdbOpenObject(pHatch,contId,AcDb::kForRead) != Acad::eOk)
{
acutPrintf(_T("\n* Не штриховка"));
return;
}
pHatch->close();
AcDbRegion * pHatchBound = pHatch->getRegionArea();
if (pHatchBound == NULL)
{
acutPrintf(_T("\n* Контур штриховки не замкнут"));
return;
}
//-> выясняем где мы в модели или в листе
ACHAR mpspace[50];
if (acdbCurDwg()->tilemode() == 1)_tcscpy(mpspace,ACDB_MODEL_SPACE);
else _tcscpy(mpspace,ACDB_PAPER_SPACE);
//<-
//-> добавляем объект в БД чертежа
Acad::ErrorStatus es;
AcDbBlockTable * pBlockTable;
AcDbBlockTableRecord * pSpaceRecord;
if ((es = acdbCurDwg()->getBlockTable(pBlockTable, AcDb::kForRead))==Acad::eOk)
{
if ((es = pBlockTable->getAt(mpspace, pSpaceRecord, AcDb::kForWrite))==Acad::eOk)
{
if ((es = pSpaceRecord->appendAcDbEntity(contId, pHatchBound))==Acad::eOk)pHatchBound->close();
pSpaceRecord->close();
}
pBlockTable->close();
}
//<-
сделал тестовый файлик с двумя штриховками. одна из них создана в МСК (желая), вторая в ПСК (зеленая). причем нормаль у зеленой - (0,0,-1). и в результате работы функции отрисовывались черные области, показывающие границы штриховки. для штриховки, созданной в МСК контур соответствует действительности, а вот штриховке, созданной в ПСК повезло меньше. контур есть, но он идет
х... в произвольном месте.
для того чтоб привести всё это в человеческий вид нужно перед добавлением контура в бд провести принудительную трансформацию
AcGeMatrix3d mat;
pHatch->getEcs(mat);
pHatchBound->transformBy(mat);
тогда всё становится на свои места. ну и собственно вопрос
. вот почему б автодеску не сделать эту махинацию внутри функции getRegionArea или хотя б не написать о таком замечательном навороте как "не забываем вручную после использования функции докрутить объект до нужного положения" в справке по данной функции?