Можно ли использовать IronPython в Visual Studio 2017 и создать приложение Ironpython WPF, которое передает переменные пользовательских свойств в Solidworks? - PullRequest
1 голос
/ 25 марта 2019

Я создаю свое собственное приложение 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#).

1 Ответ

1 голос
/ 26 марта 2019

Я думаю, что это должно быть примерно так:

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

swApp = System.Runtime.InteropServices.Marshal.GetActiveObject("SldWorks.Application")
swModel = swApp.ActiveDoc
print(swModel.GetTitle())

Вот аналогичный рабочий код на C #

    SldWorks swApp;
    swApp = (SldWorks)System.Runtime.InteropServices.Marshal.GetActiveObject("SldWorks.Application");
    //swApp = (SldWorks)Activator.CreateInstance(System.Type.GetTypeFromProgID("SldWorks.Application"));
    ModelDoc2 doc = swApp.ActiveDoc;
    var str = doc.GetTitle();
    Console.WriteLine(str);

Пожалуйста, также посмотрите на этот пост с полезной информацией о доступев SolidWorks из автономного приложения: https://forum.solidworks.com/thread/215594

...