这是一个以前用VBA写的真正的工程。
我想把它移到Python上,并使用“使用Python的AutoCAD的ActiveX自动化脚本”方法。这是我的代码:
# -*- coding: utf-8 -*-
from pyautocad import Autocad, APoint, aDouble
acad = Autocad(False, True)
acad.prompt("Hello, Autocad from Python\n")
print acad.doc.Name
xx = acad.model.AddCircle(APoint(0, 0), 10)
print(xx)
yy = acad.model.Add3Dpoly(aDouble([0, 0, 0, 10, 10, 10, 30, 20, 30, 0, 0, 0]))
print(yy.ObjectName)
print(yy.PlotStyleName)
# How to contruct an objectlist for AddRegion?
#regions = acad.model.AddRegion([yy])
#acad.model.AddExtrudedSolid(regions[0], 20, 0)我的问题是,如何为AddRegion构造一个对象列表?也许comtypes有一些关于VARINT的话题。我真的没有关于COM之类的经验。
发布于 2014-08-25 15:32:24
让一切正常工作可能比它看起来应该做的工作更多。使用python读取数据;还不错。写入数据,比这更棘手。临时用户/初学者;要注意你所处的环境。
您可能需要的内容
如果你熟悉autolisp,它会有很大的帮助,因为它工作得更好(在这种情况下),被更好地记录下来,并且集成得更好……你可能需要它来榨取python没有告诉你的“未知/隐藏/无文档”的信息。(请参阅lisp函数的vlax和vla系列)。
接下来,您需要从命令行使用win32com make_py和gen_py脚本,或者您可以在主要使用python的情况下使用python。
准备好直观地解析非常难看的文本(我甚至不是在谈论lisp =] )。做好失败的准备,并兴奋地找出失败的原因。
其中大部分都与协变量有关。然后你会得到更奇怪的东西,比如变量-变量-数组。如果您查看win32com.client.pythoncom,,您会注意到所有的数据类型都映射到整数。(例如,VT_BOOL是11 )。
细枝末节
下次尝试ModelSpace.AddCircle时,请注意获得的调试输出;传递给InvokeTypes的所有参数都是您需要注意的……(这取自我对Autocad注册接口的make-py输出
def AddLine(self, StartPoint=defaultNamedNotOptArg, EndPoint=defaultNamedNotOptArg):
ret = self._oleobj_.InvokeTypes(
1581, LCID, 1, (9, 0), ((12, 1), (12, 1)),StartPoint, EndPoint)
if ret is not None:
ret = Dispatch(ret, u'AddLine', '{DF524ECB-D59E-464B-89B6-D32822282778}'这将确切地告诉您win32com 认为需要哪些COM类型,因此请确保您至少与之匹配。
我发现许多输入函数实际上都有文档记录,并且调用错误(我在与AutoLisp的多次来回交流中了解到了这一点)。我们在上面看到的外部值是1581 (它类似于类名,而不是真正的数据类型),然后是基本上表示(DISPATCH,EMPTY):(9,0)的元组,然后是一个VT_VARIANTS数组:((12,1),(12,1))。
通常会缺少COM所期望的外部包装器,而由于某种原因,make-py没有意识到这一点。如果你经历了大量的AutoLisp vlax-胡言乱语,你会注意到他们的是一个额外的包装器。我认为它要么是一个VARIANT_ARRAY,或者更确切地说,是一个变量-变量-数组(四重指针之类的)。其代码为(vt_array=8192,vt_variant=12)。
对不起,我不记得细节了,但我相信读(( 12,1),(12,1))的那部分应该变成(8192,12,(12,1)),或者类似的东西。即使你弄清楚了它应该是什么,我也不确定它们是不是一个快速的解决方案。从AutoCAD 2010开始,对我来说,这意味着要浏览超大的gen_py输出,找到我真正想要的函数,并手动更改InvokeTypes()调用以符合COM的期望。
在那之后,一切都像预期的那样工作。
可能的变通方法
COM是丑陋的。如果您是python新手,但对AutoCAD缺乏经验(这意味着您想做一些相当强大的自动化工作),请远离python->win32com->AutoCAD管道。使用LISP。尽管这让我很痛苦地说,你最终会写这么多LISP测试用例和调试器来伴随你的python痛苦,你最好还是提交。
中的COM更受支持
的地方。
https://stackoverflow.com/questions/15204971
复制相似问题