Тема: Объединение многоугольников
Как попроще (в плане краткости кода и длительности выполнения кода) объеденить два многоугольника с общей гранню?
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → ObjectARX → Объединение многоугольников
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Как попроще (в плане краткости кода и длительности выполнения кода) объеденить два многоугольника с общей гранню?
способ 1.
превратить их в области и провести операцию булевого объединения. потом найти контур
способ 2.
чистая математика.
способ 3.
через штриховку, тем более, что получение контура штриховки в предыдущей теме
через штриховку, тем более, что получение контура штриховки в предыдущей теме
Вот именно! Дело в том, что очень нужно контур внешний и одновременно общий. Если объединение делать так:
1) выбросить все островки
2) найти общие точки
3) вставить в нушном месте в одну штриховку в нужном порядку другую штриховку
то в результате получается очень много кода =( и далеко не эффективного
чистая математика
Приспособиться к wykobi не очень получилось =( штриховка то может быть заковыристой формы. Или возможно не все комбинации методов wykobi рассмотрела. Может есть какие-нибудь идеи.
превратить их в области и провести операцию булевого объединения. потом найти контур
С регионов контур достать не могу
это куда-то отдельно
Acad::ErrorStatus postToDB(AcDbEntity* pEnt,AcDbObjectId& idObj,std::wstring ModelPaperSpace=ACDB_MODEL_SPACE); // пишет в БД entity AcDbRegion * createUnionRegion(AcDbObjectIdArray idArr);// создает из кучи полилиний один общий регион. передавать массив ObjectId-ов полилиний AcDbRegion * createRegion(AcDbObjectId id);// создает из полилинии регион. передавать ObjectId полилинии ///////////////////////////////////// AcDbRegion * createRegion(AcDbObjectId id) { AcDbVoidPtrArray lines1; AcDbVoidPtrArray regions1; AcDbCurve * pCurve; if(acdbOpenObject(pCurve, id, AcDb::kForRead)!= Acad::eOk) return NULL; pCurve->close(); lines1.append(pCurve); AcDbRegion::createFromCurves(lines1, regions1); if (regions1.isEmpty())return NULL; AcDbRegion * pCurRegion = AcDbRegion::cast((AcRxObject*)regions1[0]); return pCurRegion; } AcDbRegion * createUnionRegion(AcDbObjectIdArray idArr) { if (idArr.isEmpty()) return NULL; AcDbRegion * pCurRegion = createRegion(idArr.first()); if (pCurRegion == NULL) return NULL; for (int i = 1; i < idArr.length(); i++) { AcDbRegion * pTmpRegion = createRegion(idArr.at(i)); if (pTmpRegion != NULL) Acad::ErrorStatus es = pCurRegion->booleanOper(AcDb::kBoolUnite,pTmpRegion); } return pCurRegion; } Acad::ErrorStatus postToDB(AcDbEntity* pEnt,AcDbObjectId& idObj, std::wstring ModelPaperSpace) { Acad::ErrorStatus es; AcDbBlockTable * pBlockTable; AcDbBlockTableRecord * pSpaceRecord; if (acdbCurDwg()==NULL) return Acad::eNoDatabase; if ((es = acdbCurDwg()->getBlockTable(pBlockTable, AcDb::kForRead))==Acad::eOk) { if ((es = pBlockTable->getAt(ModelPaperSpace.c_str(), pSpaceRecord, AcDb::kForWrite))==Acad::eOk) { if ((es = pSpaceRecord->appendAcDbEntity(idObj, pEnt))==Acad::eOk)pEnt->close(); pSpaceRecord->close(); } pBlockTable->close(); } return es; }
дальше в своей функции пишешь
// ObjIdArray - тут уже должны быть иды всех интересующих полилиний AcDbObjectId iId; AcDbRegion *pFullReg = createUnionRegion(ObjIdArray); postToDB(pFullReg,iId/*, а тут если объект не в пространстве модели, а в пространстве листа, то нада вставить еще параметр*/); // теперь у тебя в iId хранится общий регион /* дальше напрямую получить точки вроде как нельзя, по крайней мере у меня не получилось, НО эту ерунду можно передать на создание штриховки, т.к. Id уже есть, а из штриховки получить контурную полилинию. PS: этот способ надежней чем просто через штриховку, т.к. если у тебя контура будут пересекаться, то штриховка будет интересной :) */
кстати, код на работоспособность не проверял, вставлял кусками от себя, может че и пропустил.
Спасибо, с меня мороженое =) Увидела свои ошибки :oops: А идеи были похожыми
дальше напрямую получить точки вроде как нельзя, по крайней мере у меня не получилось
BREP тебе в руки.
К сожалению не увидила способа получить с BREP точки контура =(
К сожалению не увидила способа получить с BREP точки контура =(
Посмотри пример utils\brep\samples\brepsamp
Команда brdump позволит тебе получить координаты контура области (REGION). Пример:
Command: BRDUMP Select No Validation vs. Full Validation: None/<Full>: Enter Subent Type: Edge/Face/<Brep>: Select Local Entity vs. Database Entity: Local/<Database>: Pick a solid Select Traversal Direction for Brep Dump: Upwards/<Downwards>: *Complex No: 1 **Shell No: 1 This is the exterior shell ***Face No: 1 ****Loop No: 1 This is the exterior loop *****Edge No: 1 ******Edge No. 1: Curve Orientation in Loop is Negative *****Edge No: 2 ******Edge No. 2: Curve Orientation in Loop is Negative *****Edge No: 3 ******Edge No. 3: Curve Orientation in Loop is Negative *****Edge No: 4 ******Edge No. 4: Curve Orientation in Loop is Negative *****Edge No: 5 *****Edge No: 6 *****Edge No: 7 *****Edge No: 8 *****Loop No. 1 has 8 edges *****Vertex No: 1 Coordinate of loop vertex: Vertex Point is (1087.078481, 720.421638, 0.000000) *****Vertex No: 2 Coordinate of loop vertex: Vertex Point is (1217.505216, 720.421638, 0.000000) *****Vertex No: 3 Coordinate of loop vertex: Vertex Point is (1217.505216, 824.715567, 0.000000) *****Vertex No: 4 Coordinate of loop vertex: Vertex Point is (1054.188263, 824.715567, 0.000000) *****Vertex No: 5 Coordinate of loop vertex: Vertex Point is (1054.188263, 781.637640, 0.000000) *****Vertex No: 6 Coordinate of loop vertex: Vertex Point is (940.773707, 781.637640, 0.000000) *****Vertex No: 7 Coordinate of loop vertex: Vertex Point is (940.773707, 627.464007, 0.000000) *****Vertex No: 8 Coordinate of loop vertex: Vertex Point is (1087.078481, 627.464007, 0.000000) *****Loop No. 1 has 8 vertices ****Face No. 1 has 1 loops ***Shell No. 1 has 1 faces **Complex No. 1 has 1 shells *Brep has 1 complexes
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → ObjectARX → Объединение многоугольников
Форум работает на PunBB, при поддержке Informer Technologies, Inc