ObjectARX_AcDbAttributeDefinition属性定义对象

作者: admin 分类: C++,CAD,ObjectARX 发布时间: 2021-09-07 20:39

ObjectARX_AcDbAttributeDefinition属性定义对象

时间  2019-11-19

标签 objectarx acdbattributedefinition 属性 定义 对象 繁體版

原文   https://my.oschina.net/u/2930533/blog/1592792

1)先介绍俩个cad的命令:数据库

命令BATTMAN : 块属性管理器(批量修改图块属性)app

 

命令BEDIT:编辑块定义3d

(2)建立带属性的块code

// 根据用户的输入设置块表记录的名称
	TCHAR blkName[40];	if (acedGetString(Adesk::kFalse, _T("\n输入图块的名称:"), blkName) !=RTNORM)		return;	// 得到当前图形数据库的块表
	AcDbBlockTable *pBlkTbl = NULL;
	acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlkTbl, AcDb::kForWrite);	if (NULL == pBlkTbl)		return;	// 建立新的块表记录
	AcDbBlockTableRecord *pBlkTblRcd = new AcDbBlockTableRecord();
	pBlkTblRcd->setName(blkName);		
	// 将块表记录添加到块表中
	AcDbObjectId blkDefId;
	pBlkTbl->add(blkDefId, pBlkTblRcd);
	pBlkTbl->close();	// 向块表记录中添加实体
	AcGePoint3d ptStart(-10, 0, 0), ptEnd(10, 0, 0);
	AcDbLine *pLine1 = new AcDbLine(ptStart, ptEnd); // 建立一条直线
	ptStart.set(0, -10, 0);
	ptEnd.set(0, 10, 0);
	AcDbLine *pLine2 = new AcDbLine(ptStart, ptEnd); // 建立一条直线
	AcGeVector3d vecNormal(0, 0, 1);
	AcDbCircle *pCircle = new AcDbCircle(AcGePoint3d::kOrigin,vecNormal, 6);//建立一个圆

	// 建立一个属性块 
	AcDbAttributeDefinition *pAttDef = new AcDbAttributeDefinition(ptEnd, _T("默认值"),_T( "标记"), _T("提示")); 
	
	AcDbObjectId entId;
	pBlkTblRcd->appendAcDbEntity(entId, pLine1);
	pBlkTblRcd->appendAcDbEntity(entId, pLine2);
	pBlkTblRcd->appendAcDbEntity(entId, pCircle);
	pBlkTblRcd->appendAcDbEntity(entId, pAttDef);	
	// 关闭实体和块表记录
	pLine1->close();
	pLine2->close();
	pCircle->close();
	pAttDef->close();
	pBlkTblRcd->close();

(3)插入带属性图块:能够直接使用cad提供的INSERT命令orm

// 得到用户输入的块定义名称 
	TCHAR blkName[40];	if (acedGetString(Adesk::kFalse, _T("\n输入图块的名称:"), blkName) !=RTNORM)		return;	
	// 得到当前数据库的块表
	AcDbBlockTable *pBlkTbl = NULL;
	acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlkTbl, AcDb::kForWrite);	if (NULL == pBlkTbl)		return;	// 查找用户指定的块定义是否存在
	CString strBlkDef;
	strBlkDef.Format(_T("%s"), blkName);	if (!pBlkTbl->has(strBlkDef))
	{
		acutPrintf(_T("\n当前图形中未包含指定名称的块定义!"));
		pBlkTbl->close();		return;
	}	// 得到用户输入的块参照的插入点
	ads_point pt;	if (acedGetPoint(NULL, _T("\n输入块参照的插入点:"), pt) != RTNORM)
	{ 
		pBlkTbl->close();		return;
	}

	AcGePoint3d ptInsert = asPnt3d(pt);	// 得到用户指定的块表记录
	AcDbObjectId blkDefId;
	pBlkTbl->getAt(strBlkDef, blkDefId);	// 将块参照添加到模型空间
	AcDbBlockTableRecord *pBlkTblRcd = NULL;
	pBlkTbl->getAt(ACDB_MODEL_SPACE, pBlkTblRcd,AcDb::kForWrite);
	pBlkTbl->close();	if (NULL == pBlkTblRcd)		return;	
	// 建立块参照对象
	AcDbBlockReference *pBlkRef = new AcDbBlockReference(ptInsert,	blkDefId);
	AcDbObjectId entId;
	pBlkTblRcd->appendAcDbEntity(entId, pBlkRef); 

	// 判断指定的块表记录是否包含属性定义
	AcDbBlockTableRecord *pBlkDefRcd = NULL;
	acdbOpenObject(pBlkDefRcd, blkDefId, AcDb::kForRead);	if (NULL == pBlkDefRcd)
	{
		pBlkRef->close();
		pBlkTblRcd->close();		return;
	}	if (pBlkDefRcd->hasAttributeDefinitions())
	{
		AcDbBlockTableRecordIterator *pItr = NULL;
		pBlkDefRcd->newIterator(pItr);
		AcDbEntity *pEnt = NULL;
		AcDbAttributeDefinition *pAttDef = NULL;		for (pItr->start(); !pItr->done(); pItr->step())
		{
			pItr->getEntity(pEnt, AcDb::kForRead);			// 检查实体是不是属性定义
			pAttDef = AcDbAttributeDefinition::cast(pEnt);			if (pAttDef != NULL)
			{				// 建立一个新的属性对象
				AcDbAttribute *pAtt = new AcDbAttribute();				// 从属性定义得到属性对象的对象特性
				pAtt->setPropertiesFrom(pAttDef);				// 设置属性对象的其余特性
				pAtt->setInvisible(pAttDef->isInvisible());

				AcGePoint3d ptBase = pAttDef->position();
				ptBase += pBlkRef->position().asVector();

				pAtt->setPosition(ptBase);
				pAtt->setHeight(pAttDef->height());
				pAtt->setRotation(pAttDef->rotation());					
				// 得到属性对象的Tag、Prompt和TextString
				ACHAR *pStr;
				pStr = pAttDef->tag();
				pAtt->setTag(pStr);
				free(pStr);
				pStr = pAttDef->prompt();
				acutPrintf(_T("\n%s%s"), pStr);
				free(pStr);
				pAtt->setFieldLength(30);
				pAtt->setTextString(_T("当前值"));				// 向块参照追加属性对象
				pBlkRef->appendAttribute(pAtt);
				pAtt->close();
				
			}
			pEnt->close();
		}
		pAttDef->close();
		delete pItr;
	}	// 关闭数据库的对象
	pBlkRef->close();
	pBlkTblRcd->close();
	pBlkDefRcd->close();

(4)获取参照块的属性对象

ads_name ssResult;
	ads_point ssptres;
	acedEntSel(_T("选择一个块:\n"), ssResult, ssptres);

	AcDbObjectId blkRefId;
	acdbGetObjectId(blkRefId, ssResult);

	AcDbBlockReference *pRef = NULL;
	Acad::ErrorStatus es = acdbOpenObject(pRef, blkRefId, AcDb::kForWrite);  
	if (NULL == pRef || es != eOk)		return ;
	
	AcDbObjectId  blkrecId = pRef->blockTableRecord();
	pRef->close();

	AcDbBlockTableRecord *pBlkDefRcd = NULL;
	es=acdbOpenObject(pBlkDefRcd, blkrecId , AcDb::kForRead); 
	if (NULL == pBlkDefRcd || es != eOk)		return ;	if (pBlkDefRcd->hasAttributeDefinitions())  //是否有属性
	{		//当前值
		AcDbObjectIterator* pItr = pRef->attributeIterator();		for(pItr->start(); !pItr->done(); pItr->step())
		{
			AcDbObjectId attid = pItr->objectId();
			AcDbAttribute* pAttr = NULL;
			pRef->openAttribute(pAttr, attid, AcDb::kForRead);

			ACHAR* text = pAttr->textString();
			acutPrintf(_T("当前值:%s\n"), text);
			pAttr->close();
			free(text);
		}
		delete pItr;		//属性
		AcDbBlockTableRecordIterator *pTItr = NULL;
		pBlkDefRcd->newIterator(pTItr);
		AcDbEntity* pEnt = NULL;		for(pTItr->start(); !pTItr->done(); pTItr->step())
		{
			pTItr->getEntity(pEnt, AcDb::kForRead);
			AcDbAttributeDefinition* pAttDef = AcDbAttributeDefinition::cast(pEnt);			if(pAttDef != NULL)
			{
				ACHAR * strTemp;
				strTemp = pAttDef->tag();
				acutPrintf(_T("标记:%s\n"), strTemp);
				free(strTemp);
				strTemp = pAttDef->prompt();
				acutPrintf(_T("提示:%s\n"), strTemp);
				free(strTemp);
				strTemp=pAttDef->textString();			
				acutPrintf(_T("值:%s\n"), strTemp);
				free(strTemp);

				pAttDef->close();
			}
			pEnt->close();
		}
		delete pTItr;
	}
	pBlkDefRcd->close();

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

标签云