1

我一直致力于使用 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 文档时, 我看到以下信息:“此接口是 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 独立应用程序和其中的 Iron python 文档,以及您非常有帮助的回复,看来下面的代码应该可以工作。虽然在运行时,我收到一条错误消息“EnvironmentError: System.Runtime.InteropServices.COMException (0x8002802B): Element not found. (Exception from HRESULT: 0x8002802B (TYPE_E_ELEMENTNOTFOUND))”这让我相信该对象仍然是没有正确实例化。

import System
t = System.Type.GetTypeFromProgID('SldWorks.Application')
swApp = System.Activator.CreateInstance(t)
swApp.Visible = True
4

2 回答 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 的文档并理解它们的全部含义。

于 2013-09-20T19:43:58.057 回答
1

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

swApp = Dispatch("sldworks.Application")

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

于 2017-04-17T08:00:39.430 回答