我一直在使用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
答案 0 :(得分: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 :(得分:1)
我想知道这个问题是否已经解决,但仍然在这里发布。 与使用COM的其他应用程序一样,只需输入:
即可swApp = Dispatch("sldworks.Application")
通过这样做,您可以访问Solidworks,并且可以使用API来执行您想要的操作。 希望这会有所帮助,无论谁需要它。