TA的每日心情![](source/plugin/dsu_paulsign/img/emot/kx.gif) | 开心 昨天 15:23 |
---|
签到天数: 69 天 [LV.6]常住居民II
管理员
- 积分
- 2704
|
static Acad::ErrorStatus postToDb(AcDbEntity* ent, AcDbObjectId& objId) {
Acad::ErrorStatus es;
AcDbBlockTable* pBlockTable;
AcDbBlockTableRecord* pSpaceRecord;
if ((es = acdbHostApplicationServices()->workingDatabase()->
getSymbolTable(pBlockTable, AcDb::kForRead))
!= Acad::eOk) {
return es;
}
if ((es = pBlockTable->getAt(ACDB_MODEL_SPACE,
pSpaceRecord,
AcDb::kForWrite)) != Acad::eOk) {
return es;
}
if ((es = pBlockTable->close()) != Acad::eOk) {
return es;
}
if ((es = pSpaceRecord->appendAcDbEntity(objId, ent)) != Acad::eOk) {
return es;
}
if ((es = pSpaceRecord->close()) != Acad::eOk) {
return es;
}
return ent->close();
}
AcDbRegion *CreateRegion(AcDbObjectId objIdOuter)
{
Acad::ErrorStatus es;
AcDbRegion *region=nullptr;
AcDbCurve *curve;
if ((es = acdbOpenObject(curve, objIdOuter, AcDb::kForRead)) == Acad::eOk)
{
AcDbVoidPtrArray curves;
AcDbVoidPtrArray regions;
curves.append(curve);
region = new AcDbRegion;
es = region->createFromCurves(curves, regions);
if (!es)
{
int count = curves.length();
if (count > 0)
{
region = static_cast<AcDbRegion*>(regions[0]);
for (int i = 1; i < count; ++i)
{
if (regions[i])
delete regions[i];
}
}
}
curve->close();
}
return region;
}
#include <dbplanesurf.h>
AcDbPlaneSurface *CreatePlaneSurf(AcDbObjectId objIdOuter)
{
Acad::ErrorStatus es;
AcDbPlaneSurface *surf = nullptr;
AcDbRegion *region = CreateRegion(objIdOuter);
if (region)
{
surf = new AcDbPlaneSurface;
es = surf->createFromRegion(region);
delete region;
}
return surf;
}
void moveAndPostToDb(AcDbEntity *entity, uint16_t color, double moveZ)
{
if (entity)
{
AcDbObjectId objId;
AcGeMatrix3d trans;
trans.setToTranslation(moveZ * AcGeVector3d::kZAxis);
entity->setDatabaseDefaults();
entity->setColorIndex(color);
entity->transformBy(trans);
postToDb(entity, objId);
}
}
// boolsurf / bs
void cmdBoolSurf()
{
ads_point pt;
ads_name ename;
AcDbObjectId objIdOuter, objIdInner;
Acad::ErrorStatus es;
if (acedEntSel(L"\nSelect outer closed curve", ename, pt) != RTNORM)
return;
if (acdbGetObjectId(objIdOuter, ename) != Acad::eOk) //ads_name-->AcDbObjectId
return;
if (acedEntSel(L"\nSelect inner closed curve", ename, pt) != RTNORM)
return;
if (acdbGetObjectId(objIdInner, ename) != Acad::eOk) //ads_name-->AcDbObjectId
return;
// Create Surfaces from curves
AcDbPlaneSurface *surfOuter = CreatePlaneSurf(objIdOuter);
AcDbPlaneSurface *surfInner = CreatePlaneSurf(objIdInner);
AcDbSurface *surfDiff = nullptr;
if (surfInner && surfOuter)
es = surfOuter->booleanSubtract(surfInner, surfDiff);
// Post To DB, set color and Z-movement
moveAndPostToDb(surfDiff, 3, 10.0); //green
moveAndPostToDb(surfOuter, 2, 20.0); //yellow
moveAndPostToDb(surfInner, 1, 30.0); //red
// Unlike stated in the docs surfDiff remains nullptr and surfOuter is modified.
// booleanSubtract() fails if surfOuter is created from splines
} |
|