AcDbBlockTableRecord+AcDbBlockReference AcDbAttribute+AcDbAttributeDefination 项目总结

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中。

你可能感兴趣的:(ObjectArx开发)