cad python二次开发,AutoCAD二次开发实用教程

  cad python二次开发,AutoCAD二次开发实用教程

  添加TypedValue的方法可以添加多个typed value,但总的数据大小不能超过128K。

  resultbuffersubf=new result buffer(;RES buf . add(new typed value((int)DXF code . text,我的扩展数据))RES buf . add(new typed value((int)DXF code . real)RES buf . add(new typed value((int)code.int DXF 32,5));

  扩展数据——XData

  可以灵活地向AutoCAD数据库对象添加一定量的自定义数据,供开发人员使用。这些数据的意义是由开发者自己解释的。无论其含义如何,AutoCAD都将保留这些数据。这些数据称为XData,扩展后的数据作为结果缓存附加在实体上,对于充分利用存储空间和添加轻量级数据非常有用。

  可以从实体DBObject类及其派生类的XData属性中获取或设置扩展数据。的扩展数据由APP应用程序创建,附加到实体的扩展数据可以包含一个或多个组。每个组都以一个不同的已注册APP应用程序名称和TypedValue属性值开始。XData支持的TypeCode (DXF分组码)只能取1000到1071之间的分组码值。不同的组码对应不同类型的信息。下表显示了每组代码的说明。

  XF组码值将数据内容扩展到1000~1009个字符串(最多255个字符

  符号)

  APP应用名称101xdata 1002Xdata控制字符串1003图层名称1004二进制数据1005数据库对象句柄1012~1059浮点数1010、1020、1030三维点(x、y、z) 1012、1022 1033三维空间方向1040Xdata浮点数上的距离值1041Xdata 100

  因为每个数据库对象可以附加多个app应用的数据,所以在ResultBuffer中,APP应用名是每个扩展数据的第一个数据,然后生成的缓冲区数据归APP应用名所有。(可以使用其他特殊标识符作为第一个数据,但是无论如何都很容易区分,以便以后查询这个扩展数据。)

  AutoCAD注册的APP应用程序名称存储在数据库的RegAppTable表中。在使用之前,必须先检查RegAppTable是否存在,如果不存在,就注册它。这意味着创建一个RegAppTableRecord表记录。注册程序的名称最多可包含31个字符,并使用以下代码来完成regapptableecord

  regapptableapptbl=trans . getobject(db . regapptableid,OpenMode。ForWrite)视情况而定;如果(!app TBL . has(myapp name))regapptablerecordapptblrcd=newregapptablerecord);appTblRcd。Name= MyAppNameapp TBL . add(apptblrcd;trans . addnewlycreateddbobject(apptblrcd,true);}

  要向数据库对象添加扩展数据,必须首先获取数据注册应用程序的应用程序名称,然后根据DBObject类及其派生类的XData属性设置扩展数据。如下面的代码所示

  publicfoidaddxdata({ editored=application . document manager . mdiactivedocument . editor;由…编辑WriteMessage(添加“扩展数据XDATA \ n”);promotentityoptionsentrops=newpromotentityoptions("选择实体对象");提示结果输入;enter=ed . get entity(en tops);如果(主菜。地位!=prompt status . ok(ed . write message)"对象选择失败。end”);返回;} ObjectId objId=entRes。ObjectIddatabase db=hostapplicationservices . working数据库;用户(tr)

  事务事务=db。transaction manager . start transaction()){ Entity ent=trans。GetObject(objId,OpenMode。ForWrite)作为实体;ent。ColorIndex=1;RegAppTable appTbl=trans。GetObject(db。RegAppTableId,OpenMode。ForWrite)视情况而定;如果(!appTbl。has( MyAppName ){ RegAppTableRecord appTblRcd=new RegAppTableRecord();appTblRcd。Name= MyAppNameappTbl。add(appTblRcd);反式。AddNewlyCreatedDBObject(appTblRcd,true);} result buffer RES buf=new result buffer();雷斯布。Add(new TypedValue(1001,我的扩展数据应用));雷斯布。Add(new TypedValue(1000,作者:王));ent。XData=resBuf反式。commit();} }

  从指定的对象返回所附着的扩展数据也需要通过对象类及其派生类的扩展数据属性,返回的结果为结果缓冲区,可以用。阿萨瑞()方法将其转换为一个类型值[]数组,或者借助遍历器IEnumerator(在系统。收集命名空间中),同时根据图形交换格式的组码值判断所添加的数据,这些数据的含义由开发者自行解释。

  使用自带方法转为数组:

  TypedValue[] tvs=rb .as array();使用接口遍历:

  public void GETXDATA(){ Editor ed=Application .文档管理器。mdiactivedocument。编辑;由…编辑WriteMessage(获取扩充数据XDATA \ n’);prompt entity options en tops=new prompt entity options(选择实体对象);PromptEntityResult entRes=ed .获取实体(pr);如果(主菜。地位!=提示状态。好){ ed .WriteMessage(选择对象失败,退出);返回;}数据库db=Autodesk .AutoCAD。应用服务。申请。文档管理器。mdiactivedocument。数据库;使用(事务tr=db .交易经理。start transaction()){ Entity ent=(Entity)tr .GetObject(res.ObjectId,OpenMode .供阅读);ResultBuffer resBuf=ent .XDataif (resBuf!=null) { IEnumerator iter=resBuf .获取枚举器();while (iter .MoveNext()){类型化值tmp val=(类型化值)ITER .当前;由…编辑WriteMessage(tmpVal .类型代码。ToString():);由…编辑WriteMessage(tmpVal .价值。ToString() \ n );} } } }

  也可以将扩展数据读取到更常用的ListT中,参考代码如下:

  公共列表系统object GetXDataList(Entity ent){ Editor ed=Autodesk .AutoCAD。应用服务。申请。文档管理器。mdiactivedocument。编辑;列表系统Object objs=new ListSystem .object();数据库db=Autodesk .AutoCAD。应用服务。申请。文档管理器。mdiactivedocument。数据库;使用(事务trans=db .交易经理。start transaction()){ ent=(Entity)trans .GetObject(ent .ObjectId,OpenMode .供阅读);ResultBuffer resBuf=ent .XDataif (resBuf!=null){System .集合IEnumerator itor=resBuf .获取枚举器();而(itor .MoveNext()){类型化值tmp val=(类型化值)itor .当前;对象。添加(tmpVal .值);} }运输.commit();}返回对象;}

  要注意的是,扩展数据是比较特殊的,给实体添加扩展数据,是这样的:

  结果缓冲区Rb=新结果缓冲区(新类型值[]{新类型值((int)DXF码).ExtendedDataRegAppName, abc ),新类型值((int)DxfCode).ExtendedDataAsciiString, 123 )});线XData=rb但是这里虽然是用等号赋值的,但是它并不一定会覆盖旧的扩展数据,一个实体,只有一个扩展数据属性,但是里面可以记录多个不同应用程序名的扩展数据。

  每次用"="给实体的扩展数据赋值时,如果扩展数据里还没有这个应用程序的扩展数据,那么新赋的这些值,会被添加到原有的扩展数据结尾去,比如上面已经给线条对象添加了应用程序“abc”的扩展数据,这个时候读取线条的XData,其内容应该是这样的:

  新类型值[]{新类型值((int)DxfCode).ExtendedDataRegAppName, abc ),新类型值((int)DxfCode).ExtendedDataAsciiString, 123)}这时候,再给线条添加一个新的应用程序lc 的扩展数据:

  结果缓冲区Rb1=新结果缓冲区(新类型值[]{新类型值((int)DXF码).ExtendedDataRegAppName, lc ),新类型值((int)DxfCode).ExtendedDataAsciiString, 0 )});线XData=rb1此时,如果再读取线条的XData,那么结果就会是:

  新类型值[]{新类型值((int)DxfCode).ExtendedDataRegAppName, abc ),新类型值((int)DxfCode).ExtendedDataAsciiString, 123 ),新类型值((int)DxfCode).ExtendedDataRegAppName, lc ),新类型值((int)DxfCode).ExtendedDataAsciiString, 0)}这样的话,那如果同一个实体如果有多个应用程序的扩展数据,那我怎么取其中某一个应用程序的扩展数据呢?

  答案是使用:GetXDataForApplication方法,该方法的参数就是应用程序名,比如:

  结果缓冲区res=line。GetXDataForApplication( ABC );结果为:new typed value[]{ new typed value((int)DXF code . extendeddataaregappname, ABC ),new typed value((int)DXF code . extendeddataasciisistring, 123)}

  如果要修改扩展数据,只需将值重新指定给扩展数据。例如,现在我们修改应用程序abc的扩展数据:

  线。XData=new result buffer(new typed value[]{ new typed value((int)DXF code。ExtendedDataRegAppName, abc ),新类型值((int)DxfCode)。ExtendedDataAsciiString, 1231 ),新类型值((int)DxfCode)。ExtendedDataAsciiString, 1 )});//重新分配扩展数据时,如果扩展数据中已经存在abc的扩展数据,则abc原有的扩展数据将被替换;如果现在没有abc的扩展数据,新的扩展数据将添加到扩展数据的末尾。

  如果要删除扩展数据,操作如下:

  //要删除应用程序abc的扩展数据,只需要一个这样的赋值。新值中只添加一个应用程序名称,不添加其他值,这样在XData中将删除abc的原始扩展数据。线。XData=新结果缓冲区(新类型值[]{新类型值((int) DXF代码。扩展数据应用名称, ABC)}。注意:尽量不要直接删除RegAppTable中注册的应用名称。如果将此应用程序的扩展数据添加到绘图上的实体中,扩展数据中相应的应用程序名称将被删除,但它下面的其他数据值不会被删除,这可能会导致问题,例如:

  //删除regaptable regaptable rat=(regaptable)trans中应用abc的记录。getobject (db。regapttableid,开放模式。用于写入);如果(!老鼠。has( ABC ){ RegAppTableRecord ratr=(RegAppTableRecord)rat[ ABC ]。GetObject(OpenMode。for write);拉特。erase();}//此时读取第行的XData,其内容会是这样的(假设我们上一步没有删除第行abc的扩展数据),new typed value[]{ newtyped value ((int) dxfcode . extendeddataasciitring, 123 ),new typed value((int)DXF code)。ExtendedDataRegAppName, lc ),新类型值((int)DxfCode)。ExtendedDataAsciiString, 0)}

  所以我个人认为,在RegapTable中删除注册的应用名称时,应该先用过滤选择器选择添加了该应用的扩展数据的实体,然后删除它们的扩展数据,再在RegapTable中删除应用注册信息。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: