首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为COM构造一个对象列表?

如何为COM构造一个对象列表?
EN

Stack Overflow用户
提问于 2013-03-04 23:24:54
回答 1查看 1.5K关注 0票数 2

这是一个以前用VBA写的真正的工程。

我想把它移到Python上,并使用“使用Python的AutoCAD的ActiveX自动化脚本”方法。这是我的代码:

代码语言:javascript
复制
# -*- 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之类的经验。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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输出

代码语言:javascript
复制
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痛苦,你最好还是提交。

  • Ironpython和.NET
    • 我相信这个接口比general

中的COM更受支持

  • Visual Studio Professional (2008+)
    • 我从来没有用过官方的VS-Pro工具(我用的是PythonWIN和MINGW),我不确定是否有什么额外的魔法可以改变win32com处理AutoCAD的方式。我知道官方的Studio扩展在AutoCAD项目中提供了它们的源代码。最坏的情况是,您手边有实际的文档,这就是python-AutoCAD的整个主题变成tainted.

的地方。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15204971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档