admin 发表于 2024-3-6 11:49:25

图案填充

//图案填充(ID,图案名称,图案缩放因子)
AcDbObjectId FymHatch::Add(const AcDbObjectIdArray& objIds, const ACHAR* patName, double patternScale)
{
        Acad::ErrorStatus es;
        //1创建空的填充对象
        AcDbHatch* pHatch = new AcDbHatch();
        //2设置填充平面
        AcGeVector3d normal(0, 0, 1);//法线
        pHatch->setNormal(normal);
        //设置图案的标高。首先设置为0,然后设置为true使图案在实体表面上方
        pHatch->setElevation(0);
        pHatch->setElevation(true);        //3设置关联性
        //设置填充图案类型为预定义,并指定图案名称为输入的 patName。
        pHatch->setPattern(AcDbHatch::kPreDefined, patName);
        //5添加填充边界
        es = pHatch->appendLoop(AcDbHatch::kExternal, objIds);
        //6显示填充对象
        es = pHatch->evaluateHatch();
        //7添加到模型空间
        AcDbObjectId hatchId = FymDatabase::PostToModelSpace(pHatch);
        //关联性填充,填充对象与边界进行绑定,使其能获得边界对象修改的通知
        if (acdbOpenObject(pHatch, hatchId, AcDb::kForRead) == Acad::eOk)
        {
                AcDbObjectIdArray assocEntids;
                pHatch->getAssocObjIds(assocEntids);
                //将与填充图案关联的所有对象的ID存储在assocEntids数组
                for (int i = 0; i < assocEntids.length(); i++)
                {
                        AcDbEntity* pEnt = NULL;
                        //以只写模式打开与当前关联对象ID对应的实体对象
                        if (acdbOpenObject(pEnt, assocEntids.at(i), AcDb::kForWrite) == Acad::eOk)
                        {
                                pEnt->addPersistentReactor(hatchId);
                                pEnt->close();
                                /*如果成功打开了实体对象,这行代码将为该实体添加一个持久反应器(Reactor),
                                该反应器的ID是当前的填充图案的ID(hatchId)。
                                这意味着,每当该实体发生更改时,与其关联的填充图案也将被更新。*/
                        }
                }
                pHatch->close();
        }
        return hatchId;
}
页: [1]
查看完整版本: 图案填充