Я создаю свое собственное приложение WPF в Visual Studio 2017 с использованием IronPython 2.7.9. Я хочу подключиться к активному приложению Solidworks и передать значения пользовательских свойств в виде строк активной детали или сборке.
Приложение WPF проверит, какой файл открыт. После этого он обновляет значения приложения, которые уже записаны как пользовательские свойства приложения. Изменяя эти значения и сохраняя их, я записываю их в деталь или сборку Solidworks.
Мой первый шаг - создать соединение с работающей Solidworks, получить имя файла активного документа и показать его в моем приложении в текстовом поле.
Первая проблема, с которой я столкнулся, заключалась в том, что нет информации о правильном способе подключения к приложению Solidworks на IronPython. В сущности, IronPython не поддерживает раннее связывание, которое упоминается в Solidworks API. Solidworks поставляется с собственными API-файлами DLL.
Я использовал проект приложения Visual Studio 2017 Ironpython WPF.
Я добавил путь поиска для \SOLIDWORKS\api\redist
в обозревателе решений.
После этого я запустил код:
python
import clr
clr.AddReference("SldWorks.Interop.sldworks")
import SldWorks.Interop.sldworks as SldWorks
swApp = SldWorks.SldWorks # Get from here the active document
swModel = SldWorks.ModelDoc2 # Get string through GetTitle() from here
print(swModel.GetTitle(swApp.ActiveDoc))
Я ожидаю, что из активного сеанса Solidworks получится заголовок активного документа. Затем распечатайте это.
При запуске через интерактивное окно IronPython 2.7 с определенным sys.path.append
последняя строка выдала TypeError: expected IModelDoc2, got getset_descriptor
.
Обновление: до сих пор я работал над этим типом кода. Создайте класс, который наследует свойства класса ModelDoc2:
import clr
import sys
import System
sys.path.append(r"C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS\api\redist")
clr.AddReference("SolidWorks.Interop.sldworks")
import SolidWorks.Interop.sldworks as SldWorks
class ModelDoc(SldWorks.ModelDoc2):
def getActiveDocumentTitle(self):
self.str = SldWorks.ModelDoc2.GetTitle(SldWorks.IModelDoc2)
return self.str
swApp = ModelDoc()
print(swApp.getActiveDocumentTitle())
Проблема все та же. Я получаю
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "<string>", line 3, in getActiveDocumentTitle
TypeError: expected IModelDoc2, got type
SOLIDWORKS - это API на основе COM, который использует:
Interfaces
Interface inheritance
Factory methods to return interfaces on existing and new objects
Casting between interfaces through:
QueryInterface (C++), which returns a pointer to a specified interface on an object to which a client currently holds an interface pointer.
direct assignment (VB/VB.NET).
the is/as reserved words (C#).