在python中从autocadapi方法检索输出参数

2024-10-04 11:35:15 发布

您现在位置:Python中文网/ 问答频道 /正文

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

this question所追求的相反

感兴趣的方法是GetXRecordData,它(根据AutoCAD的文档)如果成功则返回,并且只接受2个输出参数。在

当我试图用像

DxfGrCd = []
vals = []
an_XRecord.GetXRecordData(DxfGrCd, vals)

再看DxfGrCd和{}的值,我发现它们没有发生变化,它们都等于[],同样的

^{pr2}$

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

在python中有什么方法可以处理这种方法吗?在


Tags: 方法文档dxf整数数组this感兴趣question
1条回答
网友
1楼 · 发布于 2024-10-04 11:35:15

但是,我还没有从python中找到任何方法来实现这一点,因为存储在XRecords中的数据只是数字和字符串(在我的应用程序中),作为变量存储在XRecord中,所以我使用msexcel作为中间人传递数据。在

注意:我得到的所有数字都是检索出来的,但都是floats。在

并且检索了所有字符串,但它们的类型是unicode。(您可以使用内置函数str()轻松地将它们转换为string

我是这样做的。在


第一:创建建导师工作手册(我们的中间人)

1-通常作为一个普通的windows用户,打开Excel,然后打开visualbasic编辑器,其中一种方法是转到开发人员选项卡,然后单击Visual Basic编辑器。在

2-在编辑器中,插入一个模块(一种方法是从菜单栏:insert>;module),然后左键双击它的default name,然后键入“modˉu-facility”,然后按Enter键。在

3-左键双击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-从Tools>;References中选择这些引用名称,其他名称保留其以前的状态

^{pr2}$

然后单击“确定”,然后按Ctrl+s保存。在

6-保存文件并将其命名为“facilitator”,将其保存在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必须使用autocad = CreateObject("AutoCAD.Application.20",dynamic=True)或{}之类的行从python实例化,具体取决于导入和导入表单[import comtypes.client或{}],这里,导入范围是python文件的模块范围。在

2-使用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作为其size参数的值。在

例如,存储3.0 "abc" 5并具有相应的DXF组码1 2 3的XRecord的大小是3,而不是6。在

第三:向建导师工作手册提供数据

我们只需要它的第一个工作表,你必须提供以下内容数据:-在

1-图纸到单元格“A1”的完整路径/目录。在

如果有Document对象,要获得图形的完整路径,可以从属性FullName获取它。这个值是您将提供给XRecord_return作为其namefile参数的值。在

分配,例如:xl.Range["A1"].Values[xlRangeValueDefault] = filepath

2-单元格“A2”的XRecord句柄值,可以从XRecord的属性Handle中获取。此值将作为其“handle”参数提供给XRecord_return。在

{cd22>分配给}

3-之后,无论您在哪里需要获取XRecords数据,都可以调用XRecord_return函数,比如

DxfGrCd,vals = XRecord_return(filepath,handlevalue,size_of_XRecord)

输出是包含相应数据的列表。在

但不是最后

当您完成使用Excel从所需数量的XRecords中检索数据后,请使用xlwb.Close(SaveChanges=0)关闭协导员工作簿

相关问题 更多 >