我正在尝试使用python 2.7从AutoCAD 2016中的XRecord检索2个输出数组,导入comtypes,第一个数组是整数数组(DXF组代码),第二个数组是数组变体(XRecord的值)。
相反的方式感兴趣的方法是GetXRecordData
,(根据AutoCAD的文档)如果成功返回无,并且只接受2 输出参数< /强>
当我尝试使用像
这样的代码检索它时DxfGrCd = []
vals = []
an_XRecord.GetXRecordData(DxfGrCd, vals)
并查看DxfGrCd
和vals
的值我发现他们没有发生任何变化,两者仍然等于[]
,同样也是
DxfGrCd = {}
vals = {}
anXRecord.GetXRecordData(DxfGrCd, vals)
也没有对它们进行任何更改,即使字典和列表都是可变的,它们仍然等于{}
。
有没有办法在python中处理那种方法?
答案 0 :(得分:0)
好吧,我还没想办法从python中做到这一点,但是,因为存储在XRecords中的数据只是数字和字符串(在我的应用程序中),存储在XRecord中作为变体,我用过< strong> MS Excel 作为中间人向我传递数据。
注意:我收到的所有号码都被检索到了floats
。
并检索了所有字符串,但其类型为unicode
。 (您可以使用内置函数string
)
str()
这就是我如何做到的。
1 - 通常作为常规Windows用户,打开Excel,然后打开 Visual Basic编辑器,一种方法是转到 Developer 选项卡并单击< em> Visual Basic编辑器。
2 - 从编辑器中插入一个模块(单向来自菜单栏:插入&gt;模块),然后左键双击其default name并输入“mod_facilitate” ,然后点击Enter。
左键双击project viewer上的图标。
4-将出现一个窗口,将以下代码复制到其中。
Sub getxrecord()
'get running AutoCAD object
Dim mycad As AcadApplication, mydoc As AcadDocument, filepath As String
Set mycad = GetObject(, "AutoCAD.Application.20")
'get the selected drawing, provided from python code
With Sheet1
filepath = .Range(.Cells(1, 1), .Cells(1, 1)).Value
End With
Dim iCount As Integer, i As Integer, j As Integer, CompName As String
iCount = mycad.Documents.Count
For i = 0 To iCount - 1
CompName = mycad.Documents.Item(i).FullName
If CompName Like filepath Then
j = i
Exit For
End If
Next i
Set mydoc = mycad.Documents.Item(j)
Dim name2 As String
'get the object from its provided handle
With Sheet1
handler = .Range(.Cells(2, 1), .Cells(2, 1)).Value
End With
Dim myXRecord As AcadXRecord
Set myXRecord = mydoc.HandleToObject(handler)
Dim DxfGrcd As Variant, Val As Variant
DxfGrcd = Array()
Val = Array()
myXRecord.GetXRecordData DxfGrcd, Val
Dim UB As Integer
UB = UBound(DxfGrcd)
For i = 0 To UB
With Sheet1
.Range(.Cells((i + 1), 2), .Cells((i + 1), 2)).Value = DxfGrcd(i)
.Range(.Cells((i + 1), 3), .Cells((i + 1), 3)).Value = Val(i)
End With
Next i
End Sub
5-来自工具&gt;参考选择这些参考名称,将其他名称保留为先前的状态
AcSmComponents20 1.0 Type Library
AutoCAD 2016 Type Library
CAO 1.0 Type Library
然后单击“确定”,然后按Ctrl + s进行保存。
6-保存文件并将其命名为“服务商”,将其保存在python文件的同一目录中。保存类型 Excel启用宏的工作簿(扩展名为.xlsm)
7-在你的python文件中,定义检索XRecord数据的函数如下,我将告诉它的参数是什么:
def XRecord_return(namefile,handle,size):
xl.Range["A1"].Value[xlRangeValueDefault] = namefile
xl.Range["A2"].Value[xlRangeValueDefault] = handle
xl.Application.Run("facilitator.xlsm!mod_facilitate.getxrecord")
dxfgrcd = []
vals = []
for i in range(0,size):
CellB = 'B' + str(i+1)
CellC = 'C' + str(i+1)
dxfgrcd.append(xl.Range[CellB].Value[xlRangeValueDefault])
vals.append(xl.Range[CellC].Value[xlRangeValueDefault])
return dxfgrcd,vals
注意:以下所有步骤必须先写入 XRecord_return
的定义
1-必须使用autocad = CreateObject("AutoCAD.Application.20",dynamic=True)
或autocad = comtypes.client.CreateObject("AutoCAD.Application.20",dynamic=True)
之类的行从python实例化AutoCAD,具体取决于导入和导入表单[import comtypes.client
或from comtypes.client import CreateObject
]的范围,此处为,import scope是python文件的模块范围。
使用xl = CreateObject("Excel.Application")
实例化Excel并使用
xlpath = os.getcwd()
xlpath += '\\facilitator.xlsm'
xl = CreateObject("Excel.Application")
from comtypes.gen.Excel import xlRangeValueDefault
xlwb = xl.Workbooks.Open(Filename=xlpath,ReadOnly=0)
3-你必须知道XRecord中存储了多少元素(不包括关联的DXF组代码的数量),这个元素的数量是你XRecord_return
所提供的元素{{1} }参数。
e.g。存储size
并具有对应的DXF组代码3.0 "abc" 5
的XRecord大小为3,而不是6。
我们只需要它的第一个工作表,您必须提供以下数据: -
1-图纸的完整路径/目录到单元格“A1”。
要获得绘图的完整路径,如果您有1 2 3
对象,则可以从属性Document
获取它。您将FullName
作为XRecord_return
参数提供此值。
要分配,例如:namefile
2-XRecord对单元格“A2”的句柄值,您可以从XRecord的属性xl.Range["A1"].Values[xlRangeValueDefault] = filepath
获取它。这个值是Handle
作为'handle'参数提供的值。
要分配,例如:XRecord_return
3-之后,无论您需要获取XRecords数据,请致电xl.Range["A1"].Values[xlRangeValueDefault] = handlevalue
函数,例如
XRecord_return
输出是包含对应数据的列表。
当您使用Excel完成从所需数量的XRecords中检索数据时,请使用DxfGrCd,vals = XRecord_return(filepath,handlevalue,size_of_XRecord)