从python

时间:2017-08-18 20:10:11

标签: python python-2.7 com autocad comtypes

我正在尝试使用python 2.7从AutoCAD 2016中的XRecord检索2个输出数组,导入comtypes,第一个数组是整数数组(DXF组代码),第二个数组是数组变体(XRecord的值)。

this question寻求

相反的方式

感兴趣的方法是GetXRecordData,(根据AutoCAD的文档)如果成功返回,并且只接受2 输出参数< /强>

当我尝试使用像

这样的代码检索它时
DxfGrCd = []
vals = []
an_XRecord.GetXRecordData(DxfGrCd, vals)

并查看DxfGrCdvals的值我发现他们没有发生任何变化,两者仍然等于[],同样也是

DxfGrCd = {}
vals = {}
anXRecord.GetXRecordData(DxfGrCd, vals)

也没有对它们进行任何更改,即使字典和列表都是可变的,它们仍然等于{}

有没有办法在python中处理那种方法?

1 个答案:

答案 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.clientfrom 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)

关闭辅助工具簿