python - 将 Iron Python 与 Solidworks API 结合使用

标签 python .net ironpython

我一直致力于使用 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

在运行这段代码时,我得到 “类型错误:无法创建 ISldWorks 的实例,因为它是抽象的”

查看 solidworks 文档后 here 我看到这个信息: “此接口(interface)是 SolidWorks API 中的最高级别对象。此接口(interface)提供了一组通用功能,允许应用程序级操作,例如创建、打开、关闭和退出文档、排列图标和窗口、更改事件文档、并创建属性定义。

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

事件是在 Microsoft .NET Framework 中通过委托(delegate)实现的。有关此接口(interface)的委托(delegate)列表,请参阅概述主题。”

现在,虽然我非常熟悉 python 编程,但整个 .net 东西对我来说是一个新动物,所以我确定我做的是一些简单的错误,但我肯定在努力弄清楚到底是什么是。感谢您的帮助。

--更新 所以我仔细研究了 .net 系统是如何工作的,我觉得我可以更好地处理它。因此,如果我理解正确的话,我的目标是尝试创建 Solidworks 应用程序对象或 ISldWorks 的实例,然后我应该能够访问所有成员。在我的研究中,我遇到了这两篇文章:Solidworks standalone app和来自这些的 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

最佳答案

稍微简化一下:

在 .NET 和 COM 中,您通常不会通过直接调用类的构造函数来创建实例。事实上,大多数服务甚至不公开实际的类。相反,它们公开了一个接口(interface)——也就是说,一个抽象类型,它是实际类的父类(super class)型,并且只定义了它们希望你拥有的公共(public)方法——然后要么 (a) 一个工厂函数,它生成一些具体的实例该接口(interface)的子类,或 (b) COM 可以在“自动工厂”功能(如 CreateObject)中使用的具体类。

这就是文档所说的意思:

Use CreateObject, GetObject, New, or similar functions to obtain the ISldWorks object from a Dispatch application (Visual Basic or C++ Dispatch). Standalone .exe C++ COM applications can use CoCreateInstance.

CreateObject 采用“ProgID”,一个表示具体类型名称的字符串,并执行从该名称获取具体类型所需的所有魔法,通过 .NET/COM 互操作传递它,询问服务创建该具体类型的对象,验证它是否与适当的接口(interface)匹配,并将其包装起来。如果有从 VB.NET 使用 SolidWorks 的示例,它可能会使用 CreateObject,您可以从 IronPython 执行相同的操作。

但是,实际上,在某些时候您需要阅读一些有关 .NET 的文档并理解它们的全部含义。

关于python - 将 Iron Python 与 Solidworks API 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18924470/

相关文章:

c# - 引用项目时缺少项目依赖项

c# - .NET 局部变量优化

.net - Microsoft.Scripting.Core.dll 在哪里?

python - 从 subprocess.communicate() 读取流输入

Python:重写子类中的静态成员

python - 神经网络在 Keras 上的前几个 epoch 中不进行学习

python - tmpnam 的不安全性/替代品有多不安全?

c# - 为什么我在 Vista 上可能会遇到 DLL 未找到异常,但在 XP 上却不会?

c# - 从字符串创建 IronPython(动态)对象

c# - 在 C# 中嵌入 IronPython 2 - DefaultModule.Globals 的替代品是什么?