objectArx --- 实体类AcDbEntity方法

目录

  • 一、实体类
    • 1.1 继承关系
    • 1.2 实体智能指针
  • 二、AcDbEntity类方法
    • 2.1 概述
    • 2.2 颜色方法
    • 2.3 线型
      • 2.3.1 线型种类
      • 2.3.2 线型比例
    • 2.4 实体可见性
    • 2.5 实体图层
    • 2.6 实体线宽
  • 三、其他简单操作
    • 3.1 求交点
    • 3.2 炸开实体
    • 3.3 设置高亮
    • 3.4 获取文字范围盒
  • 四、实体的扩展字典
    • 4.1 增扩展字典及记录
    • 4.2 读取扩展字典
    • 4.3 删除扩展字典记录
  • 五、获取实体属性
    • 5.1 简查对象属性信息
    • 5.2 详查对象属性信息

一、实体类

1.1 继承关系

  • 关系表
    objectArx --- 实体类AcDbEntity方法_第1张图片

1.2 实体智能指针

  • 功能:不必开发者手动关闭指针
  • 获取实体对象id
    // ads选择实体
    ads_name en;
    ads_point pt;
    if (acedEntSel(NULL, en, pt) != RTNORM)	return;
    // 打开实体ads名获得对象id,并包含容错函数
    AcDbObjectId id;
    if (acdbGetObjectId(id, en) != Acad::eOk)	return;
    
  • 创建实体智能指针对象
    • 类构造函数法
      AcDbEntityPointer pEnt(id, AcDb::kForWrite);
      if (pEnt.openStatus() != Acad::eOk)	return;
      
    • 类公共方法
      AcDbEntityPointer pEnt;
      if (pEnt.open(id, AcDb::kForWrite) != Acad::eOk)	return;
      

二、AcDbEntity类方法

2.1 概述

  • 以下方法均以1.2节智能指针为基础
  • AcDbEntity类方法官方合集: 点此处传送门

    锁定:以下方法,锁定状态不可修改,故均要判断实体或图层是否锁定,并要跳过锁定,否则CAD直接崩溃


  • 实体对象创建
    • 默认调用:pEnt->setDatabaseDefaults();,可传参AcDbDatabase*对象,未传则用当前数据库
    • 设置内容:
      • 颜色:Color
      • 图层:Layer
      • 线型:Linetype
      • 线型比例:Linetype scale
      • 可见性:Visibility
      • 打印样式:Plot style name
      • 线宽:Line weight

2.2 颜色方法

  • 常用汇总
    用法 释义
    pEnt->colorIndex(); 返回实体颜色索引值:int类型 ,0随块,256随层,值在0~256间
    pEnt->color(); 返回实体颜色对象:AcCmColor对象
    pEnt->setColorIndex(intColor); 设置实体颜色索引:retColor为颜色索引值int类型
    pEnt->setColor(color); 设置实体颜色:color为AcCmColor对象
  • 以对话框形式
    int retColor;
    // 函数返回值为:Acad::ErrorStatus
    // 参数:接收颜色索引值、是否允许随层或随块颜色索引值、当前颜色索引值
    if (acedSetColorDialog(retColor, true, pEnt->colorIndex()))	
    	// 以颜色索引值设置实体颜色
    	pEnt->setColorIndex(retColor);
    
    objectArx --- 实体类AcDbEntity方法_第2张图片
  • 颜色对象方式
    AcCmColor color;
    // 索引值:	color.setColorIndex(7);
    // RGB法:如下
    color.setRGB(123, 124, 250);
    // 以颜色对象设置实体颜色
    pEnt->setColor(color);
    

    颜色对象AcCmColor 方法:

    • 判断:随块color.isByBlock();或随层color.isByLayer();或未设置col.isByACI();
    • 设置:color.setRGB(123, 124, 250);color.setColorIndex(7);
    • 返回值为int:col.red();col.green();col.blue();

2.3 线型

2.3.1 线型种类

  • 常用汇总
    用法 释义
    pEnt->linetype(lineTypeName); 传入AcString 类型字符串(可直接打印),返回Acad::ErrorStatus
    pEnt->linetype(); 上一个的重载函数,无传入值,返回ACHAR *
    pEnt->linetypeId(); 返回线型表记录对象id,AcDbObjectId 类型
    pEnt->setLinetype(value);
    1、以线型名称(AcString )设置实体线型,需要加载线型(格式->线型...),否则线型不变
    2、以线性表记录对象id(AcDbObjectId )设置实体线型

  • 获取实体线型表记录名
    • 记录名称查询
      AcString lineTypeName;
      if (pEnt->linetype(lineTypeName) != Acad::eOk)	return;
      acutPrintf(_T("\n当前实体对象线型为:%s"), lineTypeName);
      
    • 记录对象id查询
      AcDbObjectId lineTypeId = pEnt->linetypeId();
      

  • 修改实体线型
    • 记录名称修改
      // 若未加载DASHED线型,则保持原线型,退出
      if((pEnt->setLinetype(_T("DASHED"))) != Acad::eOk)	return;
      acutPrintf(_T("\n当前实体对象线型为:%s"), pEnt->linetype());
      
    • 记录对象id修改
      pEnt->setLinetype(lineTypeId);	
      

2.3.2 线型比例

  • 基本概念
    • 全局比例:修改后,全部实体对象比例均变动
    • 对象缩放比例:修改后,当前选中的对象及之后创建的对象比例均变动
    • 对象实际线型缩放比例:全局比例 乘以 对象缩放比例

  • 比例图示
    objectArx --- 实体类AcDbEntity方法_第3张图片objectArx --- 实体类AcDbEntity方法_第4张图片

    对象缩放比例修改后:当前选中的对象 、 之后创建的对象均受影响


  • 线型效果图
    objectArx --- 实体类AcDbEntity方法_第5张图片
    objectArx --- 实体类AcDbEntity方法_第6张图片

    线实际放大比例:为全局比例 乘以 缩放比例


  • 获取全局比例
    double globalScale = acdbHostApplicationServices()->workingDatabase()->ltscale();
    
  • 获取对象缩放比例
    double entScale = pEnt->linetypeScale();
    
  • 设置对象缩放比例
    // 参数:
    // 返回:Acad::ErrorStatus,正常Acad::eOk
    pEnt->setLinetypeScale(2, true);
    

2.4 实体可见性

  • 常用汇总
    用法 释义
    pEnt->visibility(); 返回:AcDb::kInvisibleAcDb::kvisible
    pEnt->setVisibility(AcDb::kInvisible); 返回:Acad::ErrorStatus,传入AcDb::kInvisibleAcDb::kvisible
  • Commands.h
    #include "stdafx.h"
    
    void AddCommands();
    void Test();
    
  • Commands.cpp
    #include "stdafx.h"
    #include "Commands.h"
    #include "Editor.h"
    #include "Database.h"
    
    
    void AddCommands()
    {	
    	Editor::AddCommand(L"c-test", ACRX_CMD_MODAL, Test);
    }
    
    void Test()
    {
    	ads_name en;
    	ads_point pt;
    	// 未选中任何实体,则显示所有隐藏实体
    	if (acedEntSel(NULL, en, pt) != RTNORM)
    	{	// 获取当前数据库所有实体id列表
    		AcDbObjectIdArray arrId = Database::GetAllEntIds();
    		// 遍历实体id列表,判断可见性,设置可见性
    		for (int i = 0; i < arrId.length(); i++)
    		{
    			AcDbObjectId id = arrId.at(i);
    			AcDbEntityPointer pEnt(id, AcDb::kForWrite);
    			if (pEnt->visibility() == AcDb::kInvisible)
    				pEnt->setVisibility(AcDb::kVisible);
    		}
    		
    	}
    	// 若选择了实体,则隐藏该实体(此处 非 使层不可见)
    	AcDbObjectId id;
    	if (acdbGetObjectId(id, en) != Acad::eOk)	return;
    
    	AcDbEntityPointer pEnt(id, AcDb::kForWrite);
    	
    	if (pEnt->visibility() == AcDb::kVisible)
    		pEnt->setVisibility(AcDb::kInvisible);
    }
    

2.5 实体图层

  • 常用方法表
    用法 释义
    pEnt->layer(layerName); 获得实体所在层 层表记录对象 字符串名称:传入AcString 对象
    返回Acad::ErrorStatus,官方推荐
    pEnt->layer(); 重载函数:返回:ACHAR *,官方不推荐
    pEnt->layerId(); 返回:AcDbLayerTableRecord 层表记录对象id(AcDbObjectId )
    pEnt->setLayer(_T(“0”)); 设置实体图层:传入图层名称,返回Acad::ErrorStatus
    pEnt->setLayer(newVal); 重载函数:同上,传入层表记录对象id(AcDbObjectId ),返回Acad::ErrorStatus
  • 获取实体图层
    AcString layerName;
    pEnt->layer(layerName);
    acutPrintf(_T("\n实体图层名为:%s"), layerName);
    
  • 设置实体图层
    // 如果没有图层1则return,若实体所在图层为锁定,则崩溃
    // 需自行对实体所在层的层表记录做判断过滤
    if (pEnt->setLayer(_T("1")) != Acad::eOk)
    	return;
    acutPrintf(_T("\n实体图层名为:%s"), pEnt->layer());
    

2.6 实体线宽

  • 常用方法表

    用法 释义
    pEnt->lineWeight(); 返回:AcDb::LineWeight,枚举类见下
    pEnt->setLineWeight(AcDb::kLnWt100); 返回:Acad::ErrorStatus,传入AcDb::LineWeight
  • 代码示例

    // 获取实体线宽
    AcDb::LineWeight lineWeight = pEnt->lineWeight();
    acutPrintf(_T("\n实体LineWeight值为:%d"), lineWeight);
    
    // 设置实体线宽
    if (pEnt->setLineWeight(AcDb::kLnWt100)  != Acad::eOk)
    	return;
    acutPrintf(_T("\n修改后实体LineWeight值为:%d"), pEnt->lineWeight());
    
  • AcDb::LineWeight

     enum LineWeight        { kLnWt000          =   0,
                              kLnWt005          =   5,
                              kLnWt009          =   9,
                              kLnWt013          =  13,
                              kLnWt015          =  15,
                              kLnWt018          =  18,
                              kLnWt020          =  20,
                              kLnWt025          =  25,
                              kLnWt030          =  30,
                              kLnWt035          =  35,
                              kLnWt040          =  40,
                              kLnWt050          =  50,
                              kLnWt053          =  53,
                              kLnWt060          =  60,
                              kLnWt070          =  70,
                              kLnWt080          =  80,
                              kLnWt090          =  90,
                              kLnWt100          = 100,	// 此处为1毫米
                              kLnWt106          = 106,
                              kLnWt120          = 120,
                              kLnWt140          = 140,
                              kLnWt158          = 158,
                              kLnWt200          = 200,
                              kLnWt211          = 211,
                              kLnWtByLayer      = -1,	// 随层
                              kLnWtByBlock      = -2,	// 随块
                              kLnWtByLwDefault  = -3 };	// 默认
    

三、其他简单操作

3.1 求交点

  • Commands.h
    #include "stdafx.h"
    
    void AddCommands();
    void GetEntInters();
    
  • Commands.cpp
    #include "stdafx.h"
    #include "Commands.h"
    #include "Editor.h"
    #include "Database.h"
    #include "Circle.h"
    
    void AddCommands()
    {	// 点选交点
    	Editor::AddCommand(L"c-inter", ACRX_CMD_MODAL, GetEntInters);
    }
    
    void  GetEntInters()
    {	// 点选同时获取实体指针pEnt、实体id
    	AcDbEntity *pEnt1, *pEnt2;
    	AcDbObjectId id1, id2;
    	pEnt1 = Editor::selectEntity(id1, AcDb::kForRead);
    	pEnt2 = Editor::selectEntity(id2, AcDb::kForRead);
    	
    	// pEnt1调用方法返回与pEnt2相交的 点列表 points
    	// AcDb::kOnBothOperands: 必须相交才有值
    	// AcDb::kExtendBoth:	   可以不相交,取延长线
    	AcGePoint3dArray points;
    	pEnt1->intersectWith(pEnt2, AcDb::kOnBothOperands, points);
    	// 遍历点列表:在每个交点上画圆
    	if (points.length() > 0)
    	{
    		for (int i = 0; i < points.length(); i++)
    		{
    			AcGePoint3d pt = points.at(i);
    			Circle::Add(pt, 2.0);
    		}
    	}
    
    	pEnt1->close();
    	pEnt2->close();
    }
    
  • 效果
    objectArx --- 实体类AcDbEntity方法_第7张图片

3.2 炸开实体

  • Commands.h
    #include "stdafx.h"
    
    void AddCommands();
    void MyExplode();
    
  • Commands.cpp
    #include "stdafx.h"
    #include "Commands.h"
    #include "Editor.h"
    #include "Database.h"
    #include "Circle.h"
    
    void AddCommands()
    {	// 炸开实体
    	Editor::AddCommand(L"c-explode", ACRX_CMD_MODAL, MyExplode);
    }
    
    // 炸开实体
    void  MyExplode()
    {	// 获得实体的指针和id
    	AcDbObjectId id;
    	AcDbEntity *pEnt = Editor::selectEntity(id, AcDb::kForWrite);
    	// explode方法只接受这个对象
    	AcDbVoidPtrArray pVoids;
    	// 将pEnt炸开后方pVoids里
    	pEnt->explode(pVoids);
    	for (int i = 0; i < pVoids.length(); i++)
    	{
    		// 将列表中每个对象强制类型转换为AcDbEntity
    		AcDbEntity *pEnt = (AcDbEntity *)pVoids.at(i);
    		Database::PostToModelSpace(pEnt);
    	}
    	// 删除原实体
    	pEnt->erase();
    	pEnt->close();
    }
    

3.3 设置高亮

  • Commands.h
    #include "stdafx.h"
    
    void AddCommands();
    void SetEntHighlight();
    
  • Commands.cpp
    #include "stdafx.h"
    #include "Commands.h"
    #include "Editor.h"
    #include "Database.h"
    
    void AddCommands()
    {	// 设置高亮
    	Editor::AddCommand(L"c-highlight", ACRX_CMD_MODAL, SetEntHighlight);
    }
    
    // 设置高亮
    void  SetEntHighlight()
    {	// 获得实体的指针和id
    	AcDbObjectId id;
    	AcDbEntity *pEnt = Editor::selectEntity(id, AcDb::kForWrite);
    	// 高亮方法highlight
    	pEnt->highlight();
    	pEnt->close();
    }
    
  • 效果
    objectArx --- 实体类AcDbEntity方法_第8张图片

3.4 获取文字范围盒

  • 功能:获取单行文字的矩形包围框,即文字范围
  • 代码示例
    ads_name en;
    ads_point pt, pt1, pt2;
    // 屏幕上选择单行文字实体
    acedEntSel(NULL, en, pt);
    // 通过实体名en获得结果缓冲区链表
    resbuf * rb = acdbEntGet(en);
    // 传入链表 返回:pt1即为左下角点,pt2即为右上角点
    acedTextBox(rb, pt1, pt2);
    

四、实体的扩展字典

  • 功能:每个实体都可以设置一个扩展字典,用于存储用户自定义数据,CAD维护但不使用此数据
  • 扩展字典:扩展字典以键值对(key-value)形式来保存 扩展字典记录,可有多个键值对
  • 扩展字典键key:为字符串,详见setAt函数
  • 扩展字典值(value):为扩展字典记录,其中保存结果缓冲区链表(即为数据)

4.1 增扩展字典及记录

  • Commands.h
    #include "stdafx.h"
    
    void AddCommands();
    void test();
    
  • Commands.cpp
    #include "stdafx.h"
    #include "Commands.h"
    #include "Editor.h"
    #include "Line.h"
    
    
    void AddCommands()
    {	
    	Editor::AddCommand(L"c-test", ACRX_CMD_MODAL, test);
    }
    // 设置实体的扩展字典
    void  test()
    {	// 图中拾取实体,用于添加扩展字典
    	ads_name en;
    	ads_point pt;
    	if (acedEntSel(NULL, en, pt) != RTNORM)
    	{
    		return;
    	}
    	// 获取拾取实体的对象id
    	AcDbObjectId id;
    	acdbGetObjectId(id, en);
    	AcDbEntity *pEnt = NULL;
    	// 对象id=》对象指针
    	if (acdbOpenObject(pEnt, id, AcDb::kForWrite) == Acad::eOk)
    	{	// 给对象新建扩展字典
    		pEnt->createExtensionDictionary();
    		// 对象指针调用方法返回扩展字典 对象id,并关闭对象指针
    		AcDbObjectId dictId = pEnt->extensionDictionary();
    		pEnt->close();
    
    		// 备用:扩展字典 对象指针、扩展字典记录 对象指针、扩展字典 对象id、结果缓冲区
    		AcDbDictionary *pDict = NULL;
    		AcDbXrecord *pXrec = new AcDbXrecord;
    		AcDbObjectId xrecordId;
    		resbuf *rb = NULL;
    		// 获得扩展字典对象指针pDict:返回值、字典 对象id、打开方式
    		if (acdbOpenObject(pDict, dictId, AcDb::kForWrite) == Acad::eOk)
    		{	// setAt设置 扩展字典中 扩展字典记录:
    			//				设置 扩展字典记录名称、
    			//				返回 扩展字典记录 对象指针 pXrec、
    			//				返回 扩展字典记录 对象id xrecordId(此处没用)
    			pDict->setAt(_T("存量"), pXrec, xrecordId);
    			rb = acutBuildList(AcDb::kDxfText, _T("此处可以做文字备注"), 
    									   AcDb::kDxfInt32, 20, 
    									   RTNONE);
    			// 用获取的扩展字典记录 对象指针 设置 扩展数据
    			pXrec->setFromRbChain(*rb);
    			// 清理工作:表记录对象、结果缓冲区内存,给第二个记录复用
    			pXrec->close();
    			acutRelRb(rb);
    
    			// 同样方法设置第二个记录,以下给pXrec、xrecordId、rb重新赋值
    			pXrec = new AcDbXrecord;
    			pDict->setAt(_T("参数"), pXrec, xrecordId);
    			rb = acutBuildList(AcDb::kDxfText, _T("半径及中心"),
    						       AcDb::kDxfReal,23.45, 
    							   AcDb::kDxfXCoord, pt, 
    							   RTNONE);
    			pXrec->setFromRbChain(*rb);
    			pXrec->close();
    			acutRelRb(rb);
    
    			pDict->close();
    		}		
    	}
    } 
    

    扩展字典记录修改:没有修改,直接 覆盖结果缓冲区链表即为修改

  • 效果
    objectArx --- 实体类AcDbEntity方法_第9张图片
    objectArx --- 实体类AcDbEntity方法_第10张图片
    objectArx --- 实体类AcDbEntity方法_第11张图片

    图中组码传送门

4.2 读取扩展字典

  • Commands.h
    #include "stdafx.h"
    
    void AddCommands();
    void view();
    
  • Commands.cpp
    #include "stdafx.h"
    #include "Commands.h"
    #include "Editor.h"
    
    void AddCommands()
    {	
    	Editor::AddCommand(L"c-view", ACRX_CMD_MODAL, view);
    }
    // 读取实体设置扩展字典、扩展字典记录
    void view()
    {	// 选取实体并获得字典:以下同上节
    	ads_name en;
    	ads_point pt;
    	if (acedEntSel(NULL, en, pt) != RTNORM)
    	{
    		return;
    	}
    	AcDbObjectId id;
    	acdbGetObjectId(id, en);
    	AcDbEntity *pEnt = NULL;
    	if (acdbOpenObject(pEnt, id, AcDb::kForRead) == Acad::eOk)
    	{	
    		AcDbObjectId dictId = pEnt->extensionDictionary();
    		pEnt->close();
    		if (dictId.isNull())
    		{
    			acutPrintf(_T("\n此实体不包含扩展记录!"));
    			return;
    		}
    
    		AcDbDictionary *pDict = NULL;
    		AcDbXrecord *pXrecord = NULL;
    		resbuf *pRb = NULL;
    		// 后面不要acutRelRb(pTemp);,因为acutRelRb(pRb);已经释放了内存空间
    		resbuf *pTemp = NULL;
    		if (acdbOpenObject(pDict, dictId, AcDb::kForRead) == Acad::eOk)
    		{	
    			/***********获取第一个扩展字典记录数据***************/
    			// 通过字典中 扩展记录名称 获得其对应的 扩展记录对象指针
    			pDict->getAt(_T("存量"), pXrecord, AcDb::kForRead);
    			// 通过 扩展记录对象指针 获得结果缓冲区链表 
    			pXrecord->rbChain(&pRb);
    			
    			if (pRb != NULL)
    			{	// 用pTemp作迭代器,需要保留pRb来最终关闭结果缓冲区链表
    				pTemp = pRb;
    				// 以下都是针对刚才设置的结果缓冲区链表依次提取,否则用switch提取
    				acutPrintf(_T("\n存量记录存储的备注字符串:%s"), pTemp->resval.rstring);
    				// 移动迭代器至下一个链表节点
    				pTemp = pTemp->rbnext;
    				acutPrintf(_T("\n存量记录存储的短整型:%d"), pTemp->resval.rint);	
    
    				pXrecord->close();
    				acutRelRb(pRb);
    			}
    
    			/***********获取第二个扩展字典记录数据***************/
    			pDict->getAt(_T("参数"), pXrecord, AcDb::kForRead);
    			pXrecord->rbChain(&pRb);
    
    			if (pRb != NULL)
    			{
    				pTemp = pRb;
    				pTemp = pTemp->rbnext;
    				acutPrintf(_T("\n参数存储的浮点型:%.9f"), pTemp->resval.rreal);
    
    				pTemp = pTemp->rbnext;
    				acutPrintf(_T("\n参数存储的点(%.3f %.3f %.3f)"), 
    						   pTemp->resval.rpoint[X],
    						   pTemp->resval.rpoint[Y], 
    						   pTemp->resval.rpoint[Z]);	
    
    				pXrecord->close();
    				acutRelRb(pRb);
    			}			
    			pDict->close();
    		}
    	}
    }
    
  • 效果
    objectArx --- 实体类AcDbEntity方法_第12张图片

4.3 删除扩展字典记录

  • Commands.h

    #include "stdafx.h"
    
    void AddCommands();
    void del();
    
  • Commands.cpp

    #include "stdafx.h"
    #include "Commands.h"
    #include "Editor.h"
    
    void AddCommands()
    {	
    	Editor::AddCommand(L"c-delete", ACRX_CMD_MODAL, del);
    }
    
    // 删除扩展字典记录
    void del()
    {	// 选取实体并获得字典:以下同上两节
    	ads_name en;
    	ads_point pt;
    	if (acedEntSel(NULL, en, pt) != RTNORM)
    	{
    		return;
    	}
    	// 获取实体对象指针
    	AcDbObjectId id;
    	acdbGetObjectId(id, en);
    	AcDbEntity *pEnt = NULL;
    	if (acdbOpenObject(pEnt, id, AcDb::kForRead) == Acad::eOk)
    	{	// 获取 实体 扩展字典id,用完关闭实体指针
    		AcDbObjectId dictId = pEnt->extensionDictionary();
    		pEnt->close();
    		if (dictId.isNull())
    		{
    			acutPrintf(_T("\n此实体不包含扩展记录!"));
    			return;
    		}
    		// 通过 字典对象id 获得 字典对象指针 pDict
    		AcDbDictionary *pDict = NULL;
    		AcDbXrecord *pXrecord = NULL;
    
    		if (acdbOpenObject(pDict, dictId, AcDb::kForRead) == Acad::eOk)
    		{	
    			Acad::ErrorStatus es = pDict->getAt(_T("参数"), pXrecord, AcDb::kForWrite);
    			if (es)
    			{
    				AfxMessageBox(_T("记录打开失败"));
    				return;
    			}
    			pXrecord->erase();
    			pXrecord->close();			
    			pDict->close();
    			AfxMessageBox(_T("已删除"));
    		}
    	}
    }
    

五、获取实体属性

5.1 简查对象属性信息

  • 功能:实现CAD的LIST命令
  • Commands.h
    #include "stdafx.h"
    
    void AddCommands();
    void GetEntList();
    
  • Commands.cpp
    #include "stdafx.h"
    #include "Commands.h"
    #include "Editor.h"
    #include "Database.h"
    
    void AddCommands()
    {	// 查询对象属性信息
    	Editor::AddCommand(L"c-list", ACRX_CMD_MODAL, GetEntList);
    }
    
    // 查询对象属性信息
    void GetEntList()
    {
    	AcDbObjectId id;
    	AcDbEntity *pEnt = Editor::selectEntity(id, AcDb::kForRead);
    	// 跟list命令一样
    	pEnt->list();
    	pEnt->close();
    }
    
  • 效果
    objectArx --- 实体类AcDbEntity方法_第13张图片

5.2 详查对象属性信息

  • 功能:获取一个实体的所有属性

  • Commands.h

    #include "stdafx.h"
    
    void AddCommands();
    void Test();
    
  • Commands.cpp

    #include "stdafx.h"
    #include "Commands.h"
    #include "Editor.h"
    // AcRxMember 类的头文件
    #include "rxmember.h"
    // AcRxProperty 类的头文件
    #include "rxprop.h"
    // AcRxValue 类的头文件
    #include "rxvalue.h"
    
    
    void AddCommands()
    {	
    	Editor::AddCommand(L"c-test", ACRX_CMD_MODAL, Test);
    }
    
    void Test()
    {	// 选择实体
    	ads_name en;
    	ads_point pt;
    	if (acedEntSel(_T("\n选择要打印实体属性的对象:"),en, pt) != RTNORM)
    	{
    		return;
    	}
    	// 获得对象id:通过实体名ads_name
    	AcDbObjectId id;
    	if (acdbGetObjectId(id, en) != Acad::eOk)	return;
    	// 智能指针基类AcDbObjectPointerBase,下面为派生类
    	// 使用智能指针对象的构造函数:自动释放指针,传入对象id,功能类似于acdbOpenObject
    	AcDbEntityPointer ent(id, AcDb::kForRead);
    	// 智能指针基类的函数openStatus,用于判断对象打开是否成功
    	if (ent.openStatus() != Acad::eOk)	return;
    
    	// 函数theEngine:返回AcRxMemberQueryEngine对象指针,
    	//				  设计模式中的单例模式(框架创建对象,且生命周期只有一个此对象)
    	// 函数newMemberIterator:返回可以 遍历 实体成员(属性项)的 迭代器pItr, 传入实体指针ent
    	AcRxMemberIterator *pItr = AcRxMemberQueryEngine::theEngine()->newMemberIterator(ent);
    	// 打印格式:30个字节左对齐(-30s),属性名称、值类型、属性值
    	acutPrintf(_T("\n%-30s\t%-35s\t%s"), _T("Name"), _T("Type"), _T("Value"));
    
    	// 用于存储 下面循环获得的 指向 属性对象(实体对象的) 的 指针
    	AcRxProperty *prop;
    	// 迭代器pItr有初始值,这里省略
    	for (; !pItr->done();pItr->next())
    	{	// 迭代器对象的current方法:返回AcRxMember对象指针
    		// AcRxProperty类是 AcRxMember类的派生类,所以可以强制类型转换
    		prop = AcRxProperty::cast(pItr->current());
    		if (prop != NULL)
    		{	// 给err赋初值
    			Acad::ErrorStatus err = Acad::eOk;
    			// 属性值对象:还有empty、isEmpty、varies、isVaries、type、toString方法
    			AcRxValue value;
    			// AcRxProperty类的获取 属性对象AcRxValue 的值的方法
    			// 还有setValue方法,查文档学习
    			if ((err = prop->getValue(ent, value)) == Acad::eOk)
    			{
    				ACHAR *szValue = NULL;
    				// AcRxValue方法toString:返回value值字符串长度,
    				// 传入用于接收字符串的指针(可为null)、传入字符串长度(可为0)
    				// 此处调用toString方法仅为了知道字符串长度
    				int valuesize = value.toString(NULL, 0);
    				if (valuesize > 0)
    				{	// 字符串加一:包含尾部的\0
    					valuesize++;
    					// 开辟 接收 字符串对象 的内存空间
    					szValue = new ACHAR[valuesize];
    					// 重新调用toString方法,给szValue赋值
    					value.toString(szValue, valuesize);
    				}
    				// 输出结果:AcRxProperty方法name(属性名)、
    				// 			AcRxValue方法type(属性类型)、
    				//			AcRxValue方法toString(属性值)
    				acutPrintf(_T("\n%-30s\t%-35s\t%s"),prop->name(), 
    													value.type().name(),
    													(szValue == NULL) ? _T("none") : szValue);
    				// 如果字符串指针szValue有值:delete释放掉内存空间
    				if (szValue)	delete szValue;
    			}
    		}
    	}
    }
    
  • 效果(此处点选了一个矩形

    选择要打印实体属性的对象:
    Name                             Type                                     Value
    Area                             double                                   71.106116
    BlockId                          AcDbObjectId                             1f62bd281f0
    CastShadows                      bool                                     0
    ClassName                        AcString                                 none
    Closed                           bool                                     1
    CollisionType                    AcDb::CollisionType                      1
    Color                            AcCmColor                                BYLAYER
    ConstantWidth                    double                                   0.000000
    Elevation                        double                                   0.000000
    EndParam                         double                                   4.000000
    ExtensionDictionary              AcDbObjectId                             0
    Handle                           AcDbHandle                               21a
    HasBulges                        bool                                     0
    HasFields                        bool                                     0
    HasSaveVersionOverride           bool                                     0
    HasWidth                         bool                                     0
    IsA                              AcRxClass*                               AcDbPolyline
    IsAProxy                         bool                                     0
    IsCancelling                     bool                                     0
    IsEraseStatusToggled             bool                                     0
    IsErased                         bool                                     0
    IsModified                       bool                                     0
    IsModifiedGraphics               bool                                     0
    IsModifiedXData                  bool                                     0
    IsNewObject                      bool                                     0
    IsNotifyEnabled                  bool                                     0
    IsNotifying                      bool                                     0
    IsObjectIdsInFlux                bool                                     0
    IsOnlyLines                      bool                                     1
    IsPeriodic                       bool                                     1
    IsPersistent                     bool                                     1
    IsPlanar                         bool                                     1
    IsReadEnabled                    bool                                     1
    IsReallyClosing                  bool                                     1
    IsTransactionResident            bool                                     0
    IsUndoing                        bool                                     0
    IsWriteEnabled                   bool                                     0
    LayerId                          AcDbObjectId                             1f62bd28100
    Length                           double                                   35.923246
    LineWeight                       AcDb::LineWeight                         -1
    LinetypeId                       AcDbObjectId                             1f62bd28150
    LinetypeScale                    double                                   1.000000
    LocalizedName                    AcString                                 多段线
    MaterialId                       AcDbObjectId                             1f62bd285e0
    MergeStyle                       AcDb::DuplicateRecordCloning             1
    Normal                           AcGeVector3d                             0.000000 0.000000 1.000000
    ObjectId                         AcDbObjectId                             1f62bd2c520
    OwnerId                          AcDbObjectId                             1f62bd281f0
    Plinegen                         bool                                     0
    PlotStyleName                    AcString                                 ByColor
    ReceiveShadows                   bool                                     0
    StartParam                       double                                   0.000000
    Thickness                        double                                   0.000000
    Transparency                     AcCmTransparency                         0
    Visible                          AcDb::Visibility                         0
    

传送门 返回 列表

你可能感兴趣的:(#,OBJECTARX)