1. 程式人生 > 其它 >Autocad二次開發中的XData

Autocad二次開發中的XData

Autocad允許應用程式在實體物件上附加XDATA(擴充套件資料)。XDATA可以附在任何圖形實體以及層,線型等非圖形實體上,Autocad負責維護這些資訊,但不使用這些資訊,也不在圖紙中直接表現出來。XDATA的每一組均以一個互相不相同的應用程式名開頭,組碼在1000~1071之間,不同組碼對應不同型別的資訊。

1000 擴充套件資料中的 ASCII 字串(最長 255 個位元組)。
1001 擴充套件資料的已註冊應用程式名(ASCII 字串,最長 31 個位元組)。
1002 擴充套件資料控制字串("{" 或 "}")。
1003 擴充套件資料圖層名。
1004 擴充套件資料中的位元組資料組(最長 127 位元組)。
1005 擴充套件資料中的圖元控制代碼。文字字串,最多 16 位十六進位制數字。
1010 擴充套件資料中的點 DXF:X 值(其後跟組碼 1020 和 1030) APP:三維點
1020, 1030 DXF:點的 Y 和 Z 值
1011 擴充套件資料中的三維世界空間位置 DXF:X 值(其後跟組碼 1021 和 1031):三維點
1021, 1031 DXF:世界空間位置的 Y 和 Z 值。
1012 擴充套件資料中的三維世界空間位移 DXF:X 值(其後跟組碼 1022 和 1032):三維向量
1022, 1032 DXF:世界空間位移的 Y 和 Z 值
1013 擴充套件資料中的三維世界空間方向 DXF:X 值(其後跟組碼 1022 和 1032) APP:三維向量
1023, 1033 DXF:世界空間方向的 Y 和 Z 值
1040 擴充套件資料浮點值。
1041 擴充套件資料距離值。
1042 擴充套件資料比例因子。
1070 擴充套件資料 16 位符號整數。
1071 擴充套件資料 32 位符號整數。

Autocad提供的這個特性,為應用程式提供了極大的方便,在開發零件序號標註,圖框繪製,自動拼圖等應用程式時,均利用了XDATA來識別實體的身份,位置,儲存圖幅,比例等資訊供程式使用。

import sys
sys.path.append(r'E:\programming\PycomCAD')
from pycomcad import *
acad=Autocad()
rapps=acad.acad.ActiveDocument.RegisteredApplications

rapps是圖形物件的註冊應用(registered applications)的集合,它有Add(),Item()方法,當用Add()方法時候,就像該集合添加了一個應用,選擇某個特定的app用Item()方法。

rapps.Count
71
rapps.__class__
win32com.gen_py.D5C3CB6F-AA0A-4D45-B02D-CF2974EFD4BEx0x1x0.IAcadRegisteredApplications

以下程式碼可用以增強RegisteredApplication類的用法:

class rappSpecial(rapps.__class__):
    @property 
    def appNames(self):
        names=[]
        for item in range(self.Count):
            names.append(super().Item(item).Name)
        return names
    def Item(self,item):
        print('intercepting')
        if isinstance(item,int):
            return super().Item(item)
        if isinstance(item,str):
            return super().Item(self.appNames.index(item))           
rappSpecial(rapps).Item(0).Name
intercepting

'ACAD'
rappSpecial(rapps).Item('ACAD').Name
'ACAD'
rappSpecial(rapps).Count
43
for index in range(rapps.Count):
    app=rapps.Item(index)
    print(app.Name)
    print(app.GetXData(''))
ACAD
(None, None)
ACAD_PSEXT
(None, None)
AcadAnnotative
(None, None)
ACAD_DSTYLE_DIMJAG
(None, None)
ACAD_DSTYLE_DIMTALN
(None, None)
ACAD_NAV_VCDISPLAY
(None, None)
ACAD_TEMP_GRAPHIC
(None, None)
DESIGNERASSEMBLIES
(None, None)
ACAD_DSTYLE_DIMBREAK
(None, None)
AcAecLayerStandard
(None, None)
GENIUS_GENBH_13
(None, None)
GENIUS_GENOENT_13
(None, None)
GENIUS_GENODEF_13
(None, None)
GENIUS_GENOREF_13
(None, None)
GEVID1390703250
(None, None)
GENIUS_GENDTOL_13
(None, None)
ACAD_DSTYLE_DIMRADIAL_EXTENSION
(None, None)
GENIUS_GENREC_14
(None, None)
GENIUS_GENOBJ-N-CEN_13
(None, None)
GENIUS_GENOBJ-N-CRC_13
(None, None)
GENIUS_GENSCREG_15
(None, None)
GENIUS_GENOBJ-N-SDF_13
(None, None)
ACCMTRANSPARENCY
(None, None)
GEVID1474596514
(None, None)
ACM_PP_ASSOCVAR
(None, None)
ACM_PP_DIM_CONSTRAINT_DRAG_GRIP
(None, None)
GEVID1474596516
(None, None)
GEVID1474682654
(None, None)
GEVID1474682656
(None, None)
GEVID1474682658
(None, None)
GEVID1474682660
(None, None)
GradientColor1ACI
(None, None)
GradientColor2ACI
(None, None)
AcDbDynamicBlockGUID
(None, None)
AcDbBlockRepETag
(None, None)
AcDbDynamicBlockTrueName2
(None, None)
ACAD_OBJECT_NAME
(None, None)
ACAD_NETWORK_GROUPS
(None, None)
ACAD_DSTYLE_DIM_LINETYPE
(None, None)
ACAD_DSTYLE_DIM_EXT2_LINETYPE
(None, None)
AcDbAttr
(None, None)
CAXA_DRAFT_TXTSCALE
(None, None)
test
(None, None)
p=rapps.Add('today20210619')
p.SetXData(FilterType([1001,1000,]),FilterData(['test','this is a test in 2021']))
rapps.Item(74).GetXData('')
((1001, 1000), ('test', 'this is a test in 2021'))

對XData進行構造和讀取,只用:
SetXData(XdataType,Xdata),
GetXData(AppName,XDataType,XdataValue),
用pycomcad內建的方法就是acad.SetXData(entity,xdataPairs)

p=acad.GetEntity() #拾取實體
acad.SetXData(p[0],[(1001,'test'),(1000,'this is an example')])
p[0].GetXData('')
((1001, 1000), ('test', 'this is an example'))
p[0].GetXData('test')
((1001, 1000), ('test', 'this is an example'))