使用Python在CATIA中创建新产品
我正在用Python脚本自动创建一个新产品,并且遇到了一个问题,即交互事件被卡在“零件号”对话框中。创建新零件时不会发生这种情况,而只是创建新产品。以下是脚本的适用部分(CATIA已打开): 问题是我正在开发一个供其他人使用的小工具,如果它挂断了,它就没有多大用处 单击“取消”可以摆脱对话框,但之后不会发生交互操作。单击“确定”可以解决问题,但脚本最好能够在没有交互的情况下准备最终结果,以限制用户错误并提高易用性 我知道我可以创建产品并对其进行操作(即添加零件、添加新产品等),然后成功保存它。因此,进程正在执行,它们不再显示。我似乎找不到一种方法来通过“零件号”对话框。我甚至尝试用编程的方式命名它,这很有效,但并没有破坏对话框 打开现有产品效果非常好,任何脚本编写过程都可以毫无问题地继续进行。但是,以编程方式创建产品、保存和关闭会导致CATIA锁定。。。因此,保存和重新打开现有产品的选项是不可能的 我还引用了v5Automation.chm,但找不到与对话框交互的方法 我还在新产品及其零件上尝试了使用Python在CATIA中创建新产品,python,python-3.x,automation,catia,Python,Python 3.x,Automation,Catia,我正在用Python脚本自动创建一个新产品,并且遇到了一个问题,即交互事件被卡在“零件号”对话框中。创建新零件时不会发生这种情况,而只是创建新产品。以下是脚本的适用部分(CATIA已打开): 问题是我正在开发一个供其他人使用的小工具,如果它挂断了,它就没有多大用处 单击“取消”可以摆脱对话框,但之后不会发生交互操作。单击“确定”可以解决问题,但脚本最好能够在没有交互的情况下准备最终结果,以限制用户错误并提高易用性 我知道我可以创建产品并对其进行操作(即添加零件、添加新产品等),然后成功保存它。因
.Update()
。其他一些保证是CATIA.Visible=True
和CATIA.RefreshDisplay=True
免责声明:我知道可以使用VBA,并且不会造成此问题。我正在寻找使用Python(2或3,没关系)解决此问题的方法。到目前为止,我找到的唯一解决此问题的方法是创建一个模板产品(在本例中,只是一个空产品),然后执行
catDocs.NewFrom()
并根据需要添加产品结构。到目前为止,我找到的唯一方法是,要避免这个问题,需要创建一个模板产品(在本例中,只是一个空产品),然后执行catDocs.NewFrom()
,并根据需要添加产品结构。这篇文章很旧,但由于我在遇到相同问题时发现了这个页面,所以我决定添加我的解决方案。我在CATIA中发现了一些这样的方法—在CATIA VBA中工作良好,但不通过COM接口。我找到的最佳解决方案是在字符串中编写一个迷你VBA函数,然后通过Python在CATIA中调用它。以下是一个例子:
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)
这篇文章是旧的,但由于我发现这个页面时,有相同的问题,我想我会添加我的解决方案。我在CATIA中发现了一些这样的方法—在CATIA VBA中工作良好,但不通过COM接口。我找到的最佳解决方案是在字符串中编写一个迷你VBA函数,然后通过Python在CATIA中调用它。以下是一个例子:
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)
我试图复制你的问题,但我没有遇到它。使用增量默认名称创建的产品很好。 然后我认为这与设置有关,因为对话框与添加新零件时弹出的对话框相似。 我发现我的选项是Infrastructure>ProductInfrastructure>Product structure>Part Number:Manual input未选中
我不知道这与是否使用VBA有什么关系,但选中它会产生问题,取消选中它会消除问题,同时仍然从Python发送相同的命令。我试图复制您的问题,但没有遇到它。使用增量默认名称创建的产品很好。 然后我认为这与设置有关,因为对话框与添加新零件时弹出的对话框相似。 我发现我的选项是Infrastructure>ProductInfrastructure>Product structure>Part Number:Manual input未选中
我不知道这与是否使用VBA有什么关系,但检查它会创建问题,取消选中它会删除问题,同时仍然从Python发送相同的命令。@Scott B我发现了相同的问题,在使用dispatch之前使用了您的解决方案,并在那里出错,现在我在GetActiveObject com_错误上得到了一个错误:(-2147221005,“无效的类字符串”,无,无),你知道吗?@Scott B我发现了同一个问题,我在使用dispatch之前使用了你的解决方案,在那里得到了一个错误,现在我在GetActiveObject com_错误上得到了一个错误:(-2147221005,“无效的类字符串”,无,无),您知道吗?