Создайте новый продукт в CATIA с помощью Python

Я автоматизирую создание нового продукта с помощью скрипта Python и столкнулся с проблемой зависания интерактивных событий в диалоговом окне «Номер детали». Этого не происходит при создании новой детали, просто нового изделия. Вот применимая часть скрипта (CATIA открыта):

import win32com.client.dynamic
CATIA = win32com.client.Dispatch("CATIA.Application")
catDocs = CATIA.Documents

# Create a new product
newProductDoc = catDocs.Add("Product")

# "Part Number" window appears, requesting a name for the product
# Interactive processes will not proceed
newProduct = newProductDoc.Product
newProductSet = newProduct.Products
newPart = newProductSet.AddNewComponent("Part", "dummyPart")
...

Проблема в том, что я разрабатываю небольшой инструмент для использования другими, и он не очень полезен, если он зависает.

Нажатие «Отмена» избавляет от диалогового окна, но после этого никаких интерактивных действий не происходит. Нажатие «ОК» решает проблему, но было бы предпочтительнее, чтобы сценарий мог подготовить продукт как окончательный результат без взаимодействия, чтобы ограничить ошибки пользователя и упростить использование.

Я знаю, что могу создать продукт и манипулировать им (например, добавлять детали, добавлять новые продукты и т. д.), а затем успешно сохранять его. Итак, процессы выполняются, просто они больше не отображаются. Я просто не могу найти способ обойти диалоговое окно «Номер детали». Я даже пытался назвать его программно, что сработало, но не убило диалоговое окно.

Открытие существующего продукта работает очень хорошо, и любые процессы сценариев могут продолжаться без проблем. Однако программное создание, сохранение и закрытие продукта приводит к блокировке CATIA... поэтому возможность сохранения и повторного открытия как существующего продукта отсутствует.

Я также ссылался на v5Automation.chm, но не смог найти способ взаимодействия с диалоговыми окнами.

Я также пробовал .Update() на новом продукте и его частях. Некоторые другие заверения были CATIA.Visible = True и CATIA.RefreshDisplay = True.

Отказ от ответственности: я знаю, что можно использовать VBA, и эта проблема не возникает. Я ищу решение этой проблемы с помощью Python (2 или 3, не имеет значения).


person user3489620    schedule 13.08.2015    source источник


Ответы (3)


Пока я нашел единственный способ обойти эту проблему — создать шаблон продукта (в данном случае просто пустой продукт), выполнить catDocs.NewFrom(<templateProductPath>) и добавить структуру продукта по мере необходимости.

person user3489620    schedule 03.09.2015

Этот пост устарел, но, поскольку я нашел эту страницу, когда возникла та же проблема, я решил добавить свое решение. Я нашел несколько методов в CATIA, которые ведут себя таким образом — отлично работает в CATIA VBA, но не через COM-интерфейс. Лучшее решение, которое я нашел, - это написать мини-функцию VBA в строке, а затем вызвать ее в CATIA через Python. Вот пример:

import random
import win32com.client

CATIA = win32com.client.GetActiveObject('CATIA.Application')
CATVBALanguage = 1

# This should work, but CATIA leaves up the dialog window and it can affect
# the rest of the code execution
# NewProductDocument = CATIA.Documents.Add('Product')

# Instead, write the code in VBA and then have CATIA execute it.  You can
# pass in arguments and capture the results as demonstrated below.
CREATE_PRODUCT_VBA_CODE = '''
    Public Function create_product(part_number as  CATBSTR) as Document
        Set create_product = CATIA.Documents.Add("Product")
        create_product.Product.PartNumber = part_number
    End Function
'''
PART_NUMBER = 'test_product_{}'.format(random.randint(1, 100))
NewProductDocument = CATIA.SystemService.Evaluate(
    CREATE_PRODUCT_VBA_CODE,   # String with the VBA code to execute
    CATVBALanguage,            # 1 to indicate this string is VBA code
    'create_product',          # VBA function to call and return result from
    [PART_NUMBER]              # Array of arguments, in order for VBA function
)

# Can still interact with this returned object as if we had created it
print(NewProductDocument.Product.PartNumber)
person Scott B    schedule 27.06.2018
comment
@ Скотт Б. Я искал ту же проблему и использовал ваше решение до того, как использовал диспетчеризацию и получал там ошибку, и теперь я получаю сообщение об ошибке в GetActiveObject com_error: (-2147221005, 'Неверная строка класса', Нет, Нет ), Есть ли у вас какие-либо идеи ? - person Juliet.K; 29.10.2018

Я пытался воспроизвести вашу проблему, но я не сталкивался с ней. Только что созданные продукты с использованием добавочных имен по умолчанию. Затем я подумал, что это связано с настройками, поскольку диалоговое окно похоже на то, которое необязательно появляется при добавлении новой части. Я обнаружил, что у меня есть опция Инфраструктура > Инфраструктура продукта > Структура продукта > Номер детали: ручной ввод не отмечен.

Я не знаю, как это было связано с использованием VBA или нет, но его проверка создала проблему, а снятие флажка устранило проблему, при этом по-прежнему отправляя ту же команду из Python.

person Dewydd    schedule 24.04.2019