2013-09-20 3 views
1

Я работал над написанием некоторых повторяющихся действий в Solidworks с использованием python. Я потратил некоторое время, пытаясь пройти через библиотеку win32com, и мне удалось много работать, но наткнулся на блокпост. Поэтому я теперь пытаюсь управлять API через Iron Python. Просто пытаюсь прокатиться и столкнулся с проблемой. Я попытался запустить код ниже:Использование Iron Python с API SolidWorks

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 или подобные функции для получения объекта ISldWorks из приложения Dispatch (Visual Basic или C++ Dispatch). Автономные приложения .exe C++ COM могут использовать CoCreateInstance. Все мастера надстройки SolidWorks API автоматически создают для вас объект ISldWorks.

События реализованы с делегатами в Microsoft .NET Framework. См. Раздел «Обзор» для списка делегатов для этого интерфейса. »

Теперь, когда я хорошо знаком с программированием на питоне, вся эта вещь .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 

ответ

3

Упрощая немного:

В .NET, и COM, вы обычно не создают экземпляр непосредственно вызвать конструктор класса. Фактически, большинство служб даже не подвергает действию фактический класс. Вместо этого они выставляют интерфейс, т. Е. Абстрактный тип, который является супертипом фактического класса, и просто определяет общедоступные методы, которые они хотят иметь, - а затем либо (а) фабричную функцию, которая генерирует экземпляр некоторого конкретного подкласс этого интерфейса или (б) конкретный класс, который 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, попросите службу создать объект этого конкретного типа, убедитесь, что он соответствует соответствующему интерфейсу и завершает его.Если есть пример использования SolidWorks из VB.NET, он, вероятно, будет использовать CreateObject, и вы можете сделать то же самое с IronPython.

Однако, в какой-то момент вам нужно будет прочитать некоторую документацию по .NET и понять, что все это значит.

1

Мне интересно, был ли этот вопрос улажен, но все еще стоит здесь. Как и другие приложения с помощью COM, просто введите:

swApp = Dispatch("sldworks.Application") 

Делая это, вы получите доступ к Solidworks, и вы можете использовать API, чтобы делать то, что вы хотите. Надеюсь, это поможет, кому это нужно.

Смежные вопросы