使用Iron Python和Solidworks API

问题描述 投票:1回答:2

我一直在使用python在Solidworks中编写一些重复行为的脚本。我花了一些时间试图通过win32com库并设法得到很多工作,但遇到了障碍。所以我现在正试图通过Iron Python来控制API。只是试图滚动并遇到问题。我试过运行下面的代码:

import clr
clr.AddReferenceToFileAndPath('..\\Redist\\SolidWorks.Interop.sldworks.dll')
clr.AddReference('SolidWorks.Interop.swconst')
from SolidWorks.Interop import sldworks
from SolidWorks.Interop import swconst

print sldworks
swApp = sldworks.ISldWorks()
swApp.Visible = True

在运行此代码时,我得到“TypeError:无法创建ISldWorks的实例,因为它是抽象的”

查看solidworks文档here后,我看到了以下信息:“此界面是SolidWorks API中的最高级别对象。此界面提供了一组通用功能,允许应用程序级别的操作,如创建,打开,关闭和退出文档,排列图标和窗口,更改活动文档以及创建属性定义。

使用CreateObject,GetObject,New或类似函数从Dispatch应用程序(Visual Basic或C ++ Dispatch)获取ISldWorks对象。独立的.exe C ++ COM应用程序可以使用CoCreateInstance。所有SolidWorks API加载项向导都会自动为您创建ISldWorks对象。

事件是使用Microsoft .NET Framework中的代理实现的。有关此接口的委托列表,请参阅概述主题。“

现在,虽然我对python编程非常熟悉,但整个.net对我来说都是一种新动物,所以我确信我做的是一些简单的错误,但我当然很难弄明白究竟是什么。谢谢你的帮助。

--UPDATE所以我经历过并研究.net系统是如何工作的,我觉得我有更好的处理方式。因此,如果我理解正确,我的目标是尝试创建Solidworks应用程序对象或ISldWorks的实例,然后我应该能够访问所有成员。在我的研究中,我遇到了这两篇文章:Solidworks standalone app和来自这些的铁python文档,以及你非常有帮助的回复,看起来下面的代码应该可行。虽然在运行时,我收到一条错误,上面写着“EnvironmentError:System.Runtime.InteropServices.COMException(0x8002802B):找不到元素。(HRESULT异常:0x8002802B(TYPE_E_ELEMENTNOTFOUND))”这会让我相信对象仍然是没有正确安置。

import System
t = System.Type.GetTypeFromProgID('SldWorks.Application')
swApp = System.Activator.CreateInstance(t)
swApp.Visible = True
python .net ironpython
2个回答
3
投票

简化一下:

在.NET和COM中,通常不直接调用类的构造函数来创建实例。事实上,大多数服务甚至不暴露实际的类。相反,它们暴露了一个接口 - 即一个抽象类型,它是实际类的超类型,只是定义了他们希望你拥有的公共方法 - 然后是(a)一个工厂函数,它生成一个具体的实例该接口的子类,或(b)COM可以在“自动工厂”函数中使用的具体类,如CreateObject

这就是文档在他们说:

使用CreateObject,GetObject,New或类似函数从Dispatch应用程序(Visual Basic或C ++ Dispatch)获取ISldWorks对象。独立的.exe C ++ COM应用程序可以使用CoCreateInstance。

CreateObject采用“ProgID”,一个表示具体类型名称的字符串,并完成从该名称获取具体类型所需的所有魔法,通过.NET / COM互操作传递它,请求服务创建该具体类型的对象,验证它是否与相应的接口匹配,并将其包装起来。如果有一个使用VB.NET的SolidWorks的例子,它可能会使用CreateObject,你可以从IronPython做同样的事情。

但是,实际上,在某些时候,您需要阅读有关.NET的一些文档,并了解所有这些文档的含义。


1
投票

我想知道这个问题是否已经解决,但仍然在这里发布。像使用COM的其他应用程序一样,只需输入

swApp = Dispatch("sldworks.Application")

通过这样做,您可以访问Solidworks,并且可以使用API​​来执行您想要的操作。希望这会有所帮助,无论谁需要它。

© www.soinside.com 2019 - 2024. All rights reserved.