天气与日历 切换到窄版

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

【c++】ObjectARX根据块名称获取块定义id

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
// 根据块名称获取块定义id
static AcDbObjectId GetBlockDefinitionByName(const CString& blockName)
{
        AcDbBlockTable *pBlockTable;
        acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlockTable, AcDb::kForRead);

        AcDbBlockTableRecord *pBlockTableRecord;
        Acad::ErrorStatus es = pBlockTable->getAt(blockName, pBlockTableRecord, AcDb::kForRead);
        pBlockTable->close();

        AcDbObjectId objId;
        if(es == Acad::eOk)
        {
                objId = pBlockTableRecord->objectId();
                pBlockTableRecord->close();
        }
        return objId;
}

static void FillAttribute(const AcStringArray& names, const AcStringArray& attValues, AcDbBlockReference& bRef)
{
        // 模仿cad的块插入过程
        // 查找所有的属性定义,并以之为模板,创建属性对象
        // 并添加到AcDbBlockReference中
        AcTransaction* pTrans = actrTransactionManager->startTransaction();
        AcDbObject* pObj;
        if(Acad::eOk != pTrans->getObject(pObj, bRef.blockTableRecord(), AcDb::kForRead))
        {
                actrTransactionManager->abortTransaction();
                return;
        }

        AcDbBlockTableRecord* pBTR = AcDbBlockTableRecord::cast(pObj);
        // BUG:不能调用hasAttributeDefinitions()方法
        // 调用之后,如果没有在块编辑器中对块进行修改,
        // 那么进行移动、夹点编辑等操作,没有动态显示效果
        //if(!pBTR->hasAttributeDefinitions())
        //{
        //        // 没有属性定义
        //        acutPrintf(_T("\n没有属性定义"));
        //        actrTransactionManager->abortTransaction();
        //        return;
        //}
       
        AcDbBlockTableRecordIterator* pIterator;
        if(Acad::eOk != pBTR->newIterator(pIterator))
        {
                actrTransactionManager->abortTransaction();
                return;
        }

        AcGeMatrix3d blkXform = bRef.blockTransform();

        // 遍历块中的图元,查找AcDbAttributeDefinition
        for(pIterator->start(true); !pIterator->done(); pIterator->step(true))
        {
                AcDbObjectId objId;
                if(Acad::eOk != pIterator->getEntityId(objId)) continue;
                if(Acad::eOk != pTrans->getObject(pObj, objId, AcDb::kForRead)) continue;
                AcDbAttributeDefinition* pAttDef = AcDbAttributeDefinition::cast(pObj);
                if(pAttDef == 0) continue;

                // 获取标签名称
                ACHAR* pTag = pAttDef->tag();
                int pos = names.find(pTag);
                if(pos != -1)
                {
                        // 创建属性
                        AcDbAttribute* pAtt = new AcDbAttribute();
                        pAtt->setAttributeFromBlock(pAttDef, blkXform);
                        pAtt->convertIntoMTextAttribute(Adesk::kTrue);
                       
                        /*
                         * 属性的图层特性与属性定义保持一致,使用setPropertiesFrom函数实现
                         * 属性的可见性与属性定义一致
                         * 属性的高度和角度与属性定义一致
                         * 属性的插入点:属性定义的插入点与块参照插入点的矢量和
                         * 属性的标记文字、提示文字与属性定义保持一致
                         */
                        /*
                        pAtt->setPropertiesFrom(pAttDef);
                        pAtt->setInvisible(pAttDef->isInvisible());
                        AcGePoint3d ptBase = pAttDef->position();
                        ptBase += bRef.position().asVector();
                        pAtt->setPosition(ptBase);
                        pAtt->setHeight(pAttDef->height());
                        pAtt->setRotation(pAttDef->rotation());
                        ACHAR* pPrompt = pAttDef->prompt();
                        acutDelString(pPrompt);
                        */

                        // 设置属性数据
                        pAtt->setTextString(attValues[pos].kACharPtr());
                        //acutPrintf(_T("\n添加属性%s,值:%s"), pTag, attValues[pos].kACharPtr());

                        // 添加属性到AcDbBlockReference中
                        bRef.appendAttribute(pAtt);
                }
                acutDelString(pTag);
        }
        delete pIterator;
        actrTransactionManager->endTransaction();
}

static AcGeMatrix3d GetBlockTransformMatrix(const AcDbObjectId& blockId, const AcGePoint3d& insertPt, double angle)
{
        AcDbBlockReference bRef(insertPt, blockId);
        bRef.setRotation(angle);
        return bRef.blockTransform();
}

 

 

 

 

【c++】ObjectARX根据块名称获取块定义id
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-1 11:44 , Processed in 0.143354 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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