首页 文章

使用Python在CATIA中创建新产品

提问于
浏览
1

我正在使用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 = TrueCATIA.RefreshDisplay = True .

Disclaimer: 我知道VBA可以使用,但不会造成这个问题 . 我正在寻找使用Python(2或3,无所谓)的这个问题的解决方案 .

2 回答

  • 0

    到目前为止,我找到解决此问题的唯一方法是创建模板产品(在这种情况下,只是一个空产品)并执行 catDocs.NewFrom(<templateProductPath>) 并根据需要添加产品结构 .

  • 0

    这篇文章很老但是因为我在遇到同样的问题时发现了这个页面,我想我会添加我的解决方案 . 我在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)
    

相关问题