• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

Если у вас возникнут вопросы или потребуется дополнительная информация, не стесняйтесь обращаться к нашей службе поддержки. Вы можете связаться с нами по указанным контактным данным на нашем сайте.

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Python и API ЛОЦМАН

Автор Slaviation, 05.02.19, 11:52:07

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

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

Slaviation

Добрый день коллеги.
Хочу предложить Вашему вниманию маленький пример использования Python в API ЛОЦМАН.
Программное окружение: ЛОЦМАН, Python, PyWin32.
+ Благодарностей: 2

pr0100

А что нужно в лоцмане сделать, чтобы заработал?


Slaviation

Задать в строке 9 obj_type, obj_product, obj_version существующего в базе объекта.

pr0100

Не вышло, может не так что то делаю.

Slaviation

В строке 9 obj_type = "Деталь" а не "Опора".




Slaviation

Вот по всем режимам:

# -*- coding: utf-8 -*-

import pythoncom
from win32com.client import Dispatch, gencache, VARIANT
from traceback import format_exc
from win32api import MessageBox
from win32con import MB_OK, MB_ICONERROR

db_name, obj_type, obj_product, obj_version =  "DemoMash", "Гальваника", "АГ52.043.063", "1"
mode_list = (2, 3, 7, 8, 9, 10, 11, 12, 13, 15, 16, 19, 20, 22, 23)

try:
    data_provider_module = gencache.EnsureModule("{76AA08AD-DEDA-40CB-962B-24440A3E96AD}", 0, 1, 0)
    loodsman_connection = data_provider_module.ILoodsmanConnection(Dispatch("{044259A0-FEAE-4B55-B6FE-E9B024FCCD4B}")._oleobj_.QueryInterface(data_provider_module.ILoodsmanConnection.CLSID, pythoncom.IID_IDispatch))
    data_set = data_provider_module.IDataSet(Dispatch("{45358808-2037-48A1-B646-692EA4251E6D}")._oleobj_.QueryInterface(data_provider_module.IDataSet.CLSID, pythoncom.IID_IDispatch))
   
    simple_api = loodsman_connection.API8.GetSimpleAPI()
    simple_api.RunMethod("ConnectToDB", (db_name,))
   
    for mode in mode_list:
        print("\n", 'Режим', mode)
        data_set.DATA = simple_api.RunMethod("GetInfoAboutVersion", (obj_type, obj_product, obj_version, 0, mode))
   
        for field_index in range(data_set.FieldCount):
            field_name = data_set.FieldName(field_index)
            print(field_name,  data_set.FieldValue(field_name))
   
except Exception:
    MessageBox(None, format_exc(), "test_01", MB_OK | MB_ICONERROR)
+ Благодарностей: 2

pr0100

Цитата: Slaviation от 05.02.19, 12:44:45
В строке 9 obj_type = "Деталь" а не "Опора".


Получилось спасибо.

то есть получается по "obj_type" определяем тип объекта. Деталь, сборочная единица и т.п.

pr0100

А как можно запринтить значения сборки "состоит из..."

Slaviation

Добрый день.
GetLinkedFast2 не подойдет?

pr0100

Попробовал GetLinkedFast2
import pythoncom
from win32com.client import Dispatch, gencache
data_provider_module = gencache.EnsureModule("{76AA08AD-DEDA-40CB-962B-24440A3E96AD}", 0, 1, 0)
loodsman_connection = data_provider_module.ILoodsmanConnection(Dispatch("{044259A0-FEAE-4B55-B6FE-E9B024FCCD4B}")._oleobj_.QueryInterface(data_provider_module.ILoodsmanConnection.CLSID, pythoncom.IID_IDispatch))
simple_api = loodsman_connection.API8.GetSimpleAPI()
db_name="BASE_NAME"
simple_api.RunMethod("ConnectToDB", (db_name,))
id_object=311 # 078.505.9.0100.00 Редуктор
LinkedFast=simple_api.GetDataSet("GetLinkedFast2", [id_object, 'Состоит из ...', False])
print(LinkedFast)
print('id', LinkedFast.FieldValue('_ID_VERSION')) #ID ЛОЦМАН>315.
print('Обозначение', LinkedFast.FieldValue('_PRODUCT')) #Обозначение>078.505.0.0104.00
print('Количество', LinkedFast.FieldValue('_MAX_QUANTITY')) #1.0

Но я получаю на выходе только один объект, который вставлен в сборку первым, а не весь список. Причем интересно, что в справке описано, что
GetLinkedFast2 возвращает значения:

Возвращает набор данных с полями:
[_ID_VERSION] int – уникальный идентификатор версии;
[_ID_LINK] int – уникальный идентификатор экземпляра связи;
[_ID_TYPE] int – идентификатор типа объекта;
[_PRODUCT] string – ключевой атрибут объекта;
[_VERSION] string – номер версии объекта;
[_ID_STATE] int – идентификатор текущего состояния объекта;
[_ID_LOCK] int – идентификатор чекаута, в котором блокирован объект (если объект не блокирован, то вернется null);
[_DOCUMENT] int – является ли документом (1 – является, 0 – не является);
[_ACCESSLEVEL] int – уровень доступа к объекту (1 – Только чтение, 2 – Чтение/запись, 3 – Полный доступ).


А GetLinkedFast 

[_ID_VERSION] int – уникальный идентификатор версии;
[_ID_LINK] int – уникальный идентификатор экземпляра связи;
[_TYPE] string – тип объекта;
[_PRODUCT] string – ключевой атрибут объекта;
[_VERSION] string – номер версии объекта;
[_STATE] string – текущее состояние объекта;
[_MIN_QUANTITY] double – значение нижней границы количества связи в базовой единице измерения;
[_MAX_QUANTITY] double – значение верхней границы количества связи в базовой единице измерения;
[_DOCUMENT] int – является ли документом (1 – является, 0 – не является);
[_ACCESSLEVEL] int – уровень доступа к объекту (1 – Только чтение, 2 – Чтение/запись, 3 – Полный доступ);
[_LOCKED] int – уровень блокировки объекта (0 – не блокирован, 1 – блокирован текущим пользователем, 2 – блокирован другим пользователем);
[_ID_UNIT] string – идентификатор единицы измерения (например, "V8C28C3A6FF0C46D9B9B62A1F294976BD");
[_ID_MEASURE] string – идентификатор измеряемой сущности (например, "V16F0ACEB123048408CFC1292992D9C44");
[_UNIT] string – обозначение единицы измерения (например, "т");
[_MEASURE] string – обозначение измеряемой сущности (например, "Масса");
[_MIN_CALC] double – значение нижней границы количества связи в указанной единице измерения;
[_MAX_CALC] double – значение верхней границы количества связи в указанной единице измерения.


то как бы GetLinkedFast2 не должен передавать _MAX_QUANTITY и выдать ошибку. Или я чего не до понимаю.

Slaviation

import pythoncom
from win32com.client import Dispatch, gencache

data_provider_module = gencache.EnsureModule("{76AA08AD-DEDA-40CB-962B-24440A3E96AD}", 0, 1, 0)
loodsman_connection = data_provider_module.ILoodsmanConnection(Dispatch("{044259A0-FEAE-4B55-B6FE-E9B024FCCD4B}")._oleobj_.QueryInterface(data_provider_module.ILoodsmanConnection.CLSID, pythoncom.IID_IDispatch))
data_set = data_provider_module.IDataSet(Dispatch("{45358808-2037-48A1-B646-692EA4251E6D}")._oleobj_.QueryInterface(data_provider_module.IDataSet.CLSID, pythoncom.IID_IDispatch))
simple_api = loodsman_connection.API8.GetSimpleAPI()
db_name, id_object ="BASE_NAME", 311
simple_api.RunMethod("ConnectToDB", (db_name,))
data_set.DATA=simple_api.RunMethod("GetLinkedFast2", [id_object, 'Состоит из ...', False])

def field_names(data_set):
    for i in range(data_set.FieldCount):
        yield data_set.FieldName(i)

def records(data_set):
    data_set.First()
    while not data_set.Eof:
        result = []
        for field_mame in field_names(data_set):
            result.append([field_mame, data_set.FieldValue(field_mame)])
        data_set.Next()
        yield result

for record in records(data_set):
    print(record)
+ Благодарностей: 1

pr0100

Цитата: Slaviation от 05.02.19, 11:52:07Добрый день коллеги.
Хочу предложить Вашему вниманию маленький пример использования Python в API ЛОЦМАН.
Программное окружение: ЛОЦМАН, Python, PyWin32.
А как можно отключиться от базы данных. То есть убрать соединение. Я заметил. Что после запуска скрипта забирается лицензия на лоцман. И каждый запуск ее забирает как новую.