天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 10|回复: 0

面域布尔运算,差集运算

[复制链接]
  • TA的每日心情
    开心
    昨天 15:23
  • 签到天数: 69 天

    [LV.6]常住居民II

    410

    主题

    167

    回帖

    2704

    积分

    管理员

    积分
    2704
    发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
    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
    }

     

     

     

     

    面域布尔运算,差集运算
    中国膜结构网打造全中国最好的膜结构综合平台 ,统一协调膜结构设计,膜结构施工,膜材采购,膜材定制,膜结构预算全方位服务。 中国空间膜结构协会合作单位。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|

    GMT+8, 2024-7-1 05:32 , Processed in 0.055501 second(s), 21 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表