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

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

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

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

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

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

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

Взятие в работу, непонятки с добавлением объектов (Python)

Автор rain, 01.12.23, 10:41:02

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

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

rain

Здравствуйте!
Хочу посоветоваться с умными людьми  :w:
В одной из тем уважаемого Slaviation подсмотрел, как из python подключиться к Лоцману и попробовал кое-какие манипуляции.
На данный момент пытаюсь подключиться к базе данных, взять определенный объект в работу, создать внутри него новый объект.
Код выглядит сейчас вот так:

import pythoncom
from win32com.client import Dispatch, gencache

#~ Имя базы данных, идентификатор объекта, его тип, ключевой атрибут, версия, список режимов для метода "GetInfoAboutVersion" (см. справку)
db_name, id_object, obj_type, obj_product, obj_version, mode_list = "PLM", 3245, "Сборочная единица", "СЕНС.492115.001-72.207", "1", (2, 3, 7, 8, 9, 10, 11, 12, 13, 15, 16, 19, 20, 22, 23)

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()
simple_api.RunMethod("ConnectToDB", (db_name,))


#~ Взятие объекта на редактирование
id_checkout = simple_api.RunMethod("CheckOut", ("", "", "", 0))
simple_api.RunMethod("ConnectToCheckOut", (id_checkout, db_name))
simple_api.RunMethod("AddToCheckOut", (str(id_object), True))

#~ Создание объекта в БД
simple_api.RunMethod("NewObject", ("Деталь", "Проектирование", "1011", 0, 0, True))

#~ Добавление созданного объекта к сборочной единице
simple_api.RunMethod("InsertObject", ("Сборочная единица", "СЕНС.492115.001-72.207", "1", "Деталь", "111", "1", "Состоит из ...", "1", False, 0, True))

И вот какие моменты непонятны:
1. Указанный объект в работу берется, но, как бы это сказать, в невидимом режиме. Т.е. приходится в Лоцмане обновлять Навигатор, после этого тыкать в появившийся объект, взятый в работу.
Можно ли как-то упростить себе жизнь, чтобы взятый в работу объект сразу открывался? (если что, в ручном режиме, галочка "Открывать после взятия в работу" стоит)

2. Более непонятный момент. В одной из тем (https://forum.ascon.ru/index.php?topic=37357.0) увидел подобный случай. Методом "NewObject" мы создаем объект в БД, но автоматически в указанной сборочной единице он не появляется, поэтому после этого пытаемся добавить его при помощи метода "InsertObject".
Указываю все необходимые параметры, но объект не добавляется и вылазит ошибка "pywintypes.com_error: (-2147352567, 'Ошибка.', (0, 'DataProvider.SimpleAPI', '400187:Объект [СЕНС.492115.001-72.207 1] не существует или создан в другом рабочем проекте и не может быть использован до сохранения в базе данных', None, 0, -2147418113), None)", хотя этот объект в БД точно существует.
где-то на подсознании понимаю, что суть кроется где-то в "создан в другом рабочем проекте", но умом не могу понять, как решить эту проблему

teplinskiy

Цитата: rain от 01.12.23, 10:41:021. Указанный объект в работу берется, но, как бы это сказать, в невидимом режиме. Т.е. приходится в Лоцмане обновлять Навигатор, после этого тыкать в появившийся объект, взятый в работу.
Можно ли как-то упростить себе жизнь, чтобы взятый в работу объект сразу открывался? (если что, в ручном режиме, галочка "Открывать после взятия в работу" стоит)
Лоцман-Клиент ничего не знает о том, что Вами создано отдельное подключение с помощью "data_provider". И в рамках этого подключения, Вы обращаетесь к БД и вносите изменения в данные этой БД.
Лоцман-Клиенту узнать это неоткуда. До тех пор, пока он не перечитает данные из БД в рамках своего отдельного подключения.

Полагаю подключение в Лоцман-Клиент к БД выполнено от Win учет. записи?
Именно поэтому Вы видите чекауты в рамках работы через "data_provider". Потому, как Вы передаете в метод "ConnectToDB" только значение БД, в этом случае по умолчанию коннект происходит от той же Win учет. записи.
 
Итого у Вас два разных подключения, от одной учетки.
Панель навигации отображает чекауты конкретной учет. записи, не зависимо от того, в рамках каких разных подключений они созданы. Она так работает.
В Лоцман-Клиент при взятии "В работу" объекта выполняется отдельное событие на обновление зависимых видимых областей, в том числе и Панели навигации.

Обновлять скриптом видимые области Лоцман-Клиента наверно можно постараться, но какой в этом смысл?
Есть две разных "цепочки":
 1) скрипт -> "data_provider" -> БД;
 2) Лоцман-Клиент -> Сервер приложений ->БД.
вот и выбирайте что-то одно.

Чтобы упростить жизнь, не работайте над одними и теми же данными от разных подключений. Выберите либо Лоцман-Клиент, либо скрипт на "data_provider".
+ Благодарностей: 1

teplinskiy

Цитата: rain от 01.12.23, 10:41:022. Более непонятный момент. В одной из тем (https://forum.ascon.ru/index.php?topic=37357.0) увидел подобный случай. Методом "NewObject" мы создаем объект в БД, но автоматически в указанной сборочной единице он не появляется, поэтому после этого пытаемся добавить его при помощи метода "InsertObject".
Метод "NewObject" только создает объект. То есть этот объект "повисает" в БД, в статусе "Не применённый". У него нет ни родителя, ни чаелда - нет связей ни с кем.
Если хотите его с кем либо связать, тогда выполняйте (обязательно) соответствующие методы.

Методом "InsertObject" можно пользоваться без предварительного создания "нового" объекта. Для этого нужно выбрать "родителя" (первая группа параметров), а уже во второй группе параметров для "номера версии потомка" передать " " (пробел, #32). Тогда метод для родителя создаст, а затем и свяжет с родителем "новый" объект. Прочитайте о методе в справке по API СП в SDK (каталог в корне).
+ Благодарностей: 1

rain

Добрый день!
действительно, метод InsertObject сработал сразу за себя и за того парня, создав мне новый объект. А в необходимости обновлять рабочие области при помощи скриптов наверно и правда нет смысла. это был больше вопрос удобства, чтобы в реальном времени отслеживать все действия. Но если это будет работать, то и пусть себе работает, пока никто не видит)
Спасибо!