Подключение к АПИ справочника на python.

Автор pr0100, 11.07.18, 09:53:59

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

pr0100

11.07.18, 09:53:59 Последнее редактирование: 11.07.18, 10:53:08 от pr0100
В примере справочника CИ на C# имеется пример кода, по добавлению изделия предприятия.
Как аналогичный код переписать на Python?

     // Добавление изделия предприятия

/*
* Необходимо у подключаемых библиотек BOSimple и PARTLibClient выставить значение параметра
* Embed Interop Types = False
*
* */
using System;

using PARTLibClient;

namespace PartLibAPI
{
    class Program
    {
        static void Main(string[] args)
        {
            // Подключаемся к API справочника
            IPARTLibProvider PLClient = null;
            try
            {
                PLClient = new BOSimpleProvider();
                var errorMsg = String.Empty;
                // Подключаемся к серверу приложений
                if (PLClient.Connect(ref errorMsg) == 0)
                {
                    try
                    {
                        // Работа с изделиями предприятия
                        var userData = PLClient.CreateCommonDataObj().InitUserData();
                        // Добавляем в справочник новое изделие и получаем его уникальный идентификатор
                        var newPartCode = userData.CreatePart("UserClassificationPack", "Новое изделие");
                        // Задаем массу нового изделия
                        userData.SetPartMass(newPartCode, 34.653);

                        // Добавляем дополнительные атрибуты
                       
                       userData.SetPartRealization(newPartCode, "Высота", "15", 1);
                        userData.SetPartRealization(newPartCode, "Длина", "5", 1);

                        // Выводим список дополнительных атрибутов в консоль
                        Console.WriteLine(userData.GetPartRealizations(newPartCode));
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
                    finally
                    {
                        // Отключаемся от сервера приложений
                        PLClient.Disconnect();
                    }
                }
                else
                    Console.WriteLine("Ошибка подключения к серверу приложений: {0}", errorMsg);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Ошибка! Не удалось создать COM-объект. {0}", ex.Message);
            }
            Console.ReadKey();
      }
   }
}




pr0100

12.07.18, 07:43:05 #1 Последнее редактирование: 12.07.18, 08:07:27 от pr0100
Собрал модуль с dll (во вложении)
Теперь я так понимаю к нему нужно подключиться, аналогично примеру C#

#Импортируем модуль
import PARTLibClient

#Подключаемся к серверу приложений
PARTLibClient.IPARTLibProvider.Connect

Yukichi


Doom

Yukichi, эту задачу можно решить несколькими путями..

pr0100

import pythoncom
from win32com.client import Dispatch,gencache

a=input("Выберете интерфейс справочника: Справочник СИ или Полином?\n")
# Подключение к старому интерфейсу СИ
if a=='СИ':
    iBOSimpleProvider = Dispatch('PARTLibClientInv.BOSimpleProviderInv')
    iBOSimpleProvider.Select(False,'',0)
# Подключение к интерфейсу полином
if a=='Полином':
    iBOSimpleProvider = Dispatch('Polynom.BOSimpleProvider')
    iBOSimpleProvider.Select(False,'',0)
+ Благодарностей: 2

Вират Лакх

Цитата: pr0100 от 09.11.23, 08:32:41iBOSimpleProvider = Dispatch('Polynom.BOSimpleProvider')
Dispatch не такой всемогущий, как хотелось бы. Он "не шмогла" и на худой конец делает <COMObject Polynom.BOSimpleProvider>
Как добраться до библиотеки типов Полинома. И так с любым приложением, кроме 'Kompas.Application.5'.
from pythoncom import CoCreateInstance, CLSCTX_SERVER, IID_IDispatch
PyIDispatch = CoCreateInstance('Polynom.BOSimpleProvider', None, CLSCTX_SERVER, IID_IDispatch)
PyITypeLib = PyIDispatch.GetTypeInfo().GetContainingTypeLib()[0]
tla = PyITypeLib.GetLibAttr()
print(tla) # (IID('{1AB8BD2A-B382-44FD-A831-CE54FC4D2D0C}'), 0, 1, 4, 0, 8)
# print(gencache.EnsureModule(tla[0], tla[1], tla[3], tla[4])) # Библиотека не зарегистрирована.
print(gencache.EnsureModuleForTypelibInterface(PyITypeLib)) # <module 'win32com.gen_py.1AB8BD2A- и т.д.
CLSID = PyIDispatch.GetTypeInfo().GetTypeAttr()[0]
print(CLSID) # {E38778FA-0A97-46CE-A5C5-BB2EAC38D6EC}
klass = gencache.GetClassForCLSID(CLSID) # None без библиотеки типов
print(klass) # <class 'win32com.gen_py.1AB8BD2A-B382-44FD-A831-CE54FC4D2D0Cx0x4x0.IPolynomProvider'>
iPolynomProvider = klass(PyIDispatch)
print(iPolynomProvider) # <win32com.gen_py."".IPolynomProvider instance at 0x1978378261504>
После EnsureModuleForTypelibInterface на готовенькое Dispatch тоже выдаёт IPolynomProvider instance.
EnsureModule при создании зарегистрированной библиотеки работает быстрее, чем EnsureModuleForTypelibInterface.
Код выше в свёрнутом виде и другой интерфейс:
from pythoncom import CoCreateInstance, CLSCTX_SERVER, IID_IDispatch
PyIDispatch = CoCreateInstance('Polynom.BOSimpleProvider', None, CLSCTX_SERVER, IID_IDispatch)
gencache.EnsureModuleForTypelibInterface(PyIDispatch.GetTypeInfo().GetContainingTypeLib()[0])
iPolynomProvider = gencache.GetClassForCLSID(PyIDispatch.GetTypeInfo().GetTypeAttr()[0])(PyIDispatch)
print(iPolynomProvider)
PolynomProvider = gencache.GetClassForProgID('Polynom.BOSimpleProvider')(PyIDispatch)
print(PolynomProvider)
Или, когда мы узнали default_interface, можно записать проще:
tlb = gencache.EnsureModuleForTypelibInterface(PyIDispatch.GetTypeInfo().GetContainingTypeLib()[0])
iPolynomProvider = tlb.IPolynomProvider(PyIDispatch)
print(iPolynomProvider)
+ Благодарностей: 2


Вират Лакх

Или я не нашел, или почему-то в SDK не принято говорить, какой файл библиотеки типов соответствует приложению.
Валяются эти tlb где попало и называются как попало. У зарегистрированных библиотек ещё можно узнать путь.
Например, для 'Materials.BOSimpleProvider' мы можем в реестре узнать CLSID и где лежит библиотека.
Тогда мы тоже можем "Обычное, TLB":
PyITypeLib = pythoncom.LoadTypeLib(r"C:\Program Files (x86)\Common Files\ASCON Shared\BOSimple.dll")
print(PyITypeLib)
tla = PyITypeLib.GetLibAttr()
print(tla)
print(gencache.EnsureModule(tla[0], tla[1], tla[3], tla[4]))
Когда она зарегана, можно имя не знать и загрузить по CLSID и версии:
PyITypeLib = pythoncom.LoadRegTypeLib('{45276A6A-6A03-4BC0-B984-FB84C70BBCCF}', 1, 0, 0)
print(gencache.EnsureModuleForTypelibInterface(PyITypeLib))
У Экселя типы в самом EXCEL.EXE находятся. У автокада по языку отличаются (типа acax24rus.tlb) и ещё для разных версий уже минимум три разных CLSID.
+ Благодарностей: 2

Вират Лакх

Оказывается, чтобы просто выбрать материал в Полиноме и получить нужные данные типа плотности и стиля штриховки, нужен не IPolynomProvider, а "обычный" IBOSimpleProvider. Таким образом, код получается следующий:
from win32com.client import gencache
from pythoncom import CoCreateInstance, CLSCTX_SERVER, IID_IDispatch

BOSL = gencache.EnsureModule('{45276A6A-6A03-4BC0-B984-FB84C70BBCCF}', 0, 1, 0) # BOSimple.dll, BOSimple Library
iBOSimpleProvider = BOSL.IBOSimpleProvider(CoCreateInstance('Polynom.BOSimpleProvider', None, CLSCTX_SERVER, IID_IDispatch))