ObjectARX开发(自定义块以及属性的获取)

自定义块以及属性的获取

自定义一个块,包括一条直线和一个圆,代码如下:

void createSelfBlock()
{
	AcDbBlockTableRecord *pBlkTblRcd = new AcDbBlockTableRecord();
	pBlkTblRcd->setName(_T("JSW"));  //设置块名
	AcGePoint3d basePoint(0,0,0);

	pBlkTblRcd->setOrigin(basePoint);

	//添加记录块到块表中
	AcDbBlockTable *pBlkTbl = NULL;
	acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlkTbl, AcDb::kForWrite);
	
	AcDbObjectId blockId;
	pBlkTbl->add(blockId, pBlkTblRcd);

	//创建实体图形
	//circle
	AcGePoint3d center(100,100,0);
	AcDbCircle *pCircle = new AcDbCircle();
	pCircle->setCenter(center);
	pCircle->setRadius(50);
	//line
	AcGePoint3d startPoint(10, 10, 0);
	AcGePoint3d endPoint(10, -10, 0);
	AcDbLine *pLine = new AcDbLine(center, endPoint);
	pLine->setColorIndex(1);

	//设置属性
	AcDbAttributeDefinition *pAttrDef = new AcDbAttributeDefinition();
	pAttrDef->setPosition(center);
	pAttrDef->setHeight(30);
	pAttrDef->setPrompt(_T("输入圆形点的值"));
	pAttrDef->setTextString(_T("abc"));
	pAttrDef->setTag(_T("自定义的块标签"));
	pAttrDef->setHorizontalMode(AcDb::kTextLeft);
	pAttrDef->setVerticalMode(AcDb::kTextBase);
	pAttrDef->setPreset(Adesk::kFalse);
	pAttrDef->setInvisible(Adesk::kFalse);
	pAttrDef->setConstant(Adesk::kFalse);

	AcDbObjectId entityId;
	pBlkTblRcd->appendAcDbEntity(entityId, pCircle);
	pBlkTblRcd->appendAcDbEntity(entityId, pLine);
	pBlkTblRcd->appendAcDbEntity(entityId, pAttrDef);

	pCircle->close();
	pLine->close();
	pAttrDef->close();
	pBlkTbl->close();
	pBlkTblRcd->close();
}

获取块属性

void getAttributeOfBlock()
{
	AcDbBlockTable *pBlkTbl = NULL;
	acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlkTbl, AcDb::kForRead);

	//检测是否存在输入块
	TCHAR blkName[40];
	if (acedGetString(Adesk::kFalse, TEXT("\n输入的图形块名:"), blkName) != RTNORM)
	{
		pBlkTbl->close();
		return;
	}
	CString strBlkDef;
	strBlkDef.Format(TEXT("%s"), blkName);
	if(!pBlkTbl->has(strBlkDef))
	{
		acutPrintf(TEXT("\n没有找到所在块"));
		pBlkTbl->close();
		return;
	}	
	AcDbObjectId RcdId;
	//获取记录块表的id
	pBlkTbl->getAt(strBlkDef,RcdId,AcDb::kForRead);
	pBlkTbl->close();
	AcDbObjectPointer<AcDbBlockTableRecord> pBlkRefRcd(RcdId, AcDb::kForRead);
	if (pBlkRefRcd.openStatus() != Acad::eOk)
	{
		return;
	}
	AcDbObjectIdArray blockIds;
	pBlkRefRcd->getBlockReferenceIds(blockIds);
	AcDbObjectPointer<AcDbBlockReference> pBlkRef(blockIds[0], AcDb::kForRead);
	if (pBlkRef.openStatus() != Acad::eOk)
	{
		return;
	}
	AcDbObjectIterator* pIter = pBlkRef->attributeIterator();
	if (!pIter)
	{
		return;
	}
	for (pIter->start(); !pIter->done(); pIter->step())
	{
		AcDbObjectId attId = pIter->objectId();
		AcDbAttribute* pAtt = NULL;
		if (pBlkRef->openAttribute(pAtt, attId, AcDb::kForRead) != Acad::eOk)
			continue;
		//acutPrintf(pAtt->tagConst(), pAtt->textStringConst(),pAtt->textString());
		acutPrintf(pAtt->tagConst());
		acutPrintf(pAtt->textStringConst());
		pAtt->close();
	}
	delete pIter;
}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!对于使用 C# ObjectARX 进行参照属性值过滤筛选实体,您可以按照以下步骤进行操作: 1. 获取参照实体:使用 `ObjectId` 或 `Transaction` 对象获取参照的 `BlockReference` 实体。 ```csharp ObjectId blockRefId = ...; // 参照的 ObjectId Transaction tr = ...; // 当前事务 BlockReference blockRef = tr.GetObject(blockRefId, OpenMode.ForRead) as BlockReference; ``` 2. 获取定义:从参照实体中获取定义。 ```csharp ObjectId blockDefId = blockRef.BlockTableRecord; BlockTableRecord blockDef = tr.GetObject(blockDefId, OpenMode.ForRead) as BlockTableRecord; ``` 3. 遍历定义中的实体:遍历定义中的实体,根据属性值进行筛选。 ```csharp foreach (ObjectId entityId in blockDef) { Entity entity = tr.GetObject(entityId, OpenMode.ForRead) as Entity; // 检查实体的属性值 if (entity is AttributeDefinition attDef) { // 如果是属性定义 string attTag = attDef.Tag; string attValue = blockRef.GetAttributeValue(attTag); // 根据属性值进行筛选 if (attValue == "筛选条件") { // 符合筛选条件的处理逻辑 } } else if (entity is AttributeReference attRef) { // 如果是属性引用 string attTag = attRef.Tag; string attValue = attRef.TextString; // 根据属性值进行筛选 if (attValue == "筛选条件") { // 符合筛选条件的处理逻辑 } } else { // 非属性实体的处理逻辑 } } ``` 请注意,这只是一个简单的示例,具体的实现可能需要根据您的需求进行调整。希望能对您有所帮助!如果您有任何其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值