Тема: 3D solid
есть 3d полилиния, из которой нужно сделать 3d тело. полилиния - это низ. такая же полилиния, но с другой высотой - верх. грубо говоря делаю три сетки: выдавливание (полилиния нижняя выдавливается на заданню высоту), две сети замыкания (крышка сверху по верхней полилинии и крышка снизу - по нижней). дальше делаю тело на основе этих сетей.
делается, но не всегда :(.
вот функция создания тела
AcDbObjectId add3dSolid(AcDbObjectId poly3dID, // низ нашего солида double height, // на сколько поднять верх Adesk::UInt16 Color = 0, // цвет, по-умолчанию - текущий const ACHAR* Layer = NULL, // слой, по-умолчанию - текущий ACHAR * ModelPaperSpace = ACDB_MODEL_SPACE); // куда будем писать. по-умолчанию в пространство модели AcDbObjectId add3dSolid(AcDbObjectId poly3dID, double height, Adesk::UInt16 Color, const ACHAR* Layer, ACHAR * ModelPaperSpace) { Acad::ErrorStatus es; AcDbObjectId eIdTop; AcDbObjectId eId = AcDbObjectId::kNull; AcDbEntity * pEnt; if (Acad::eOk != acdbOpenObject(pEnt,poly3dID,AcDb::kForRead)) return eId; AcDbEntity *pEntTop = (AcDbEntity*)pEnt->clone(); AcGeMatrix3d mat; mat.setToTranslation(AcGeVector3d(0.0,0.0,height)); pEntTop->transformBy(mat); es = postToDbase(pEntTop, eIdTop, ModelPaperSpace); // запись объекта в БД чертежа pEnt->close(); AcDb3dProfile *pSweepPerimeter = new AcDb3dProfile(pEnt); AcDbSweepOptions swepOptions; AcDbObjectId newId; AcDbSurface * pPerimeter; AcDbSurface * pTop; AcDbSurface * pBottom; es = AcDbSurface::createExtrudedSurface(pSweepPerimeter,AcGeVector3d(0.0,0.0,height),swepOptions,(AcDbExtrudedSurface*&)pPerimeter); AcDb3dProfile *pSweepBottom = new AcDb3dProfile(pEnt); AcDbPathRef pathRef; pSweepBottom->getPathRef(pathRef); AcDbObjectIdArray idArr; es = AcDbSurface::createPatchSurface(pathRef, idArr,0,0.0,pBottom); AcDb3dProfile *pSweepTop = new AcDb3dProfile(pEntTop); AcDbPathRef pathRefTop; pSweepTop->getPathRef(pathRefTop); idArr.removeAll(); es = AcDbSurface::createPatchSurface(pathRefTop, idArr,0,0.0,pTop); AcArray<AcDbEntity*> surfacesArray; surfacesArray.append(pPerimeter); surfacesArray.append(pTop); surfacesArray.append(pBottom); AcDb3dSolid *pSolid = new AcDb3dSolid(); pSolid->setDatabaseDefaults(); AcGeIntArray limits; AcDbEntity *pSurfaceEnt; es = pSolid->createSculptedSolid(surfacesArray, limits); // иногда не срабатывает if(es == Acad::eOk) { if (Color != 0) pSolid->setColorIndex(Color); if (isLayerExists(Layer)) pSolid->setLayer(Layer); pSolid->setLinetype(_T("Continuous")); es = postToDbase(pSolid, eId, ModelPaperSpace); if (es == Acad::eOk) { es = pSolid->draw(); es = pSolid->close(); } } else { delete pSolid; } delete pPerimeter; delete pTop; delete pBottom; delete pSweepBottom; delete pSweepTop; delete pSweepPerimeter; deleteEntities(eIdTop); // удаление с чертежа объекта по ID return eId; }
а вот пример вызова.
static void myProjectmy_test() { ads_name ent; AcGePoint3d pt; if (acedEntSel(_T("\n3d полилиния: "),ent,asDblArray(pt)) != RTNORM) return; AcDbObjectId eId; acdbGetObjectId( eId, ent ); AcDbObjectId solid3DContourId = add3dSolid(eId,50,1,_T("0")); }
ну и файл с контурами для Autocad2013 (http://yadi.sk/d/M1RBe5-n354iV)
красный контур не превращается в тело. в чем может быть проблема?\n3d полилиния: