AcDbBlockTableRecord+AcDbBlockReference AcDbAttribute+AcDbAttributeDefination 项目总结

    xiaoxiao2025-09-13  849

    AcDbBlockTableRecord:块表记录或块定义   AcDbBlockReference:块引用 意味着这个变量指向的是一个真正的块。

    概念辨析:在CAD中,块和块表记录是不同的概念。类比于类与对象。而块中的实体又类似于对象中的成员变量。

    所以,AcDbBlockTableRecord为块表记录,类似于一个模板,所有的块都是仿照这个模板构造的。需要显示的实体都需要添加到AcDb_Model_Space空间中。但是注意:直接向AcDb_Model_Space中添加图形对象而不是块引用,则显示出来的为一个个单独的图形对象。

    若为了以块的方式显示,则需要先创建一个AcDbBlockTableRecord对象,并添加Name和其中的实体,然后添加到当前数据库块表(AcDbBlockTable)中。

    通过新块表的ID构造一个AcDbBlockReference的对象,并将其添加到AcDb_Model_Space的空间中。这样显示出来的则以块的方式显示。

    AcDbAttributeDefination:属性定义。                AcDbAttribute:具体的属性

    类似于块表和块的关系,属性定义存在于AcDbBlockTableRecord中,而AcDbAttribute存在于AcDbBlockReference中。

    如同AcDbBlockTableRecord为一个类,而AcDbBlockReference为一个类的实例化对象。然后才会有具体的属性值。

    ID为在应用程序中唯一标示实体。但是ID是为了方便数据库管理实体的工具。所以必须要将new出来的对象放入数据库中,这样才会被分配ID。

    并且新new 出来的AcDbBlockReference中并不具有AcDbAttribute属性。

    为了修改已存在的属性,需要先运用AcDbBlockTableRecord对象遍历块表记录中的实体,并运用

    AcDbAttributeDefinition *m_pAttDef = AcDbAttributeDefinition::cast(m_Ent); 将AcDbEntity对象转换成AcDbAttributeDefinition对象。

    若该实体存在属性,则m_pAttDef不为NULL。反之。然后通过以下代码构造AcDbAttribute对象并添加到AcDbBlockReference中,

    // 创建一个新的属性对象 AcDbAttribute *pAtt = new AcDbAttribute(); // 从属性定义获得属性对象的对象特性 pAtt->setPropertiesFrom(pBlkRef); pAtt->setLayer(pBlkRef->layerId()); // 设置属性对象的其他特性 pAtt->setInvisible(pAttDef->isInvisible()); pAtt->setPosition(pAttDef->position()); pAtt->setHeight(pAttDef->height()); pAtt->setWidthFactor(pAttDef->widthFactor()); pAtt->setRotation(pAttDef->rotation()); pAtt->setHorizontalMode(pAttDef->horizontalMode()); pAtt->setVerticalMode(pAttDef->verticalMode()); pAtt->setAlignmentPoint(pAttDef->alignmentPoint()); pAtt->setTextStyle(pAttDef->textStyle()); pAtt->setAttributeFromBlock(pBlkRef->blockTransform()); // 获得属性对象的Tag、Prompt和TextString TCHAR *pStr = pAttDef->tag(); pAtt->setTag(pStr); acutDelString(pStr); pAtt->setFieldLength(pAttDef->fieldLength()); pAtt->setTextString(pAttDef->textString()); // 向块参照追加属性对象 pBlkRef->appendAttribute(pAtt); pAtt->close();

    在通过AcDbBlockReference::AttributeIterator获取该块引用的属性迭代器。遍历迭代器修改相应的属性。

    iter->setTag()获取属性标签,用来确定是否为需要修改的属性,setTextString来修改其中的值。

    最后请注意:1.接收所有打开操作的返回值,确认操作结果

                            2.在开发过程中,打开的任何AcDbEntity或AcDbBlockTableRecord或AcDbBlockReference都需要即使关闭。十分容易造成下一次打开失败。

                            3.对于界面不显示的问题,查看打开方式是否为AcDb::KforWrite

                            4.对于属性,在CAD中,它不是一个不可见实体或是附属于可见对象的一种描述。相反,它在CAD中是一种可见的实体对象(派生于AcDbText)。需要如同其它图形对象一样插入到AcDbBlockTableRecord中。

    转载请注明原文地址: https://ju.6miu.com/read-1302622.html
    最新回复(0)