You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CATIA V5 Automation:如何筛选UserParameters等参数?

CATIA参数筛选的C#实现方案

问题描述

在CATIA中,用户可以筛选UserParameters(用户参数)、Renamed Parameters(重命名参数)、**Visible Parameters(可见参数)**等类型的参数,但现有C#遍历产品参数的代码中,通过parameter.type()无法区分参数类型——所有参数都返回__ComObject,无法实现筛选,求可行的代码实现方法。

现有代码

Products oInstances = oInstance.Products;
int numberOfInstance = oInstances.Count;
Product currentProduct;

KnowledgewareTypeLib.Parameter parameter;
int numberOfParameters;

HashSet<string> processedParts = new HashSet<string>();

Worksheet sheet1 = (Worksheet)workbook.Sheets[1];
int Kolon = 1;
int Satir = 1;

((Range)sheet1.Cells[Satir, Kolon + 1]).Value2 = "Parametre_Name";
((Range)sheet1.Cells[Satir, Kolon + 2]).Value2 = "Parametre_Value";

if (treeNode == null) { return; }

if (numberOfInstance == 0)
{
    return;
}
else if (numberOfInstance > 0)
{
    for (int i = 1; i <= numberOfInstance; i++)
    {
        currentProduct = oInstances.Item(i);

        string partNumber = currentProduct.get_PartNumber();

        if (processedParts.Contains(partNumber))
        {
            continue;
        }

        processedParts.Add(partNumber);

        TreeNode iNode = new TreeNode() { Text = currentProduct.get_Name() };
        treeNode.Nodes.Add(iNode);

        numberOfParameters = currentProduct.Parameters.Count;

        for (int j = 1; j <= numberOfParameters; j++)
        { 
            parameter = currentProduct.Parameters.Item(j);

            if(type == 1)
            {
                TreeNode jNode = new TreeNode() { Text = parameter.get_Name() + " = " + parameter.ValueAsString() };

                Range partNameColumn = (Range)sheet1.Cells[Satir , Kolon];
                partNameColumn.Value2 = parameter.get_Name();

                Range partValueColumn = (Range)sheet1.Cells[Satir, Kolon + 1];
                partValueColumn.Value2 = parameter.ValueAsString();

                Satir++;
                iNode.Nodes.Add(jNode);
            }

            else if(type == 2)
            {
                if (parameterList.Contains(parameter.get_Name().Split('\\').Last()))
                {
                    TreeNode jNode = new TreeNode() { Text = parameter.get_Name() + " = " + parameter.ValueAsString() };

                    Range partNameColumn = (Range)sheet1.Cells[Satir, Kolon ];
                    partNameColumn.Value2 = parameter.get_Name();

                    Range partValueColumn = (Range)sheet1.Cells[Satir, Kolon + 1];
                    partValueColumn.Value2 = parameter.ValueAsString();

                    Satir++;
                    iNode.Nodes.Add(jNode);
                }
            }

            else if(type == 3)
            {
                return;
            }

        }
        GetParameters(oInstances.Item(i), iNode, workbook, type);
    }
    return;
}
}

解决方案

CATIA的COM接口中,不能直接通过type()判断参数类型,需要利用Parameter对象的属性和所属集合来区分:

1. 筛选UserParameters(用户参数)

用户参数属于Product.UserParameters集合,直接遍历这个集合即可,不用遍历全部Parameters:

// 遍历当前产品的用户参数
foreach (KnowledgewareTypeLib.Parameter userParam in currentProduct.UserParameters)
{
    // 处理用户参数逻辑
    TreeNode jNode = new TreeNode() { Text = userParam.get_Name() + " = " + userParam.ValueAsString() };
    // ... 写入Excel等操作
}

2. 筛选Renamed Parameters(重命名参数)

重命名的参数可以通过Parameter.Renamed属性判断,该属性返回布尔值:

if (parameter.Renamed)
{
    // 这是重命名后的参数,执行对应逻辑
}

3. 筛选Visible Parameters(可见参数)

可见参数可通过Parameter.Visible属性判断:

if (parameter.Visible)
{
    // 这是可见参数,执行对应逻辑
}

整合到现有代码的示例

修改内层参数遍历逻辑,根据type值筛选对应类型:

for (int j = 1; j <= numberOfParameters; j++)
{ 
    parameter = currentProduct.Parameters.Item(j);

    if(type == 1) // 假设type=1表示筛选用户参数
    {
        // 直接遍历UserParameters集合更高效
        foreach (KnowledgewareTypeLib.Parameter userParam in currentProduct.UserParameters)
        {
            TreeNode jNode = new TreeNode() { Text = userParam.get_Name() + " = " + userParam.ValueAsString() };
            Range partNameColumn = (Range)sheet1.Cells[Satir , Kolon];
            partNameColumn.Value2 = userParam.get_Name();
            Range partValueColumn = (Range)sheet1.Cells[Satir, Kolon + 1];
            partValueColumn.Value2 = userParam.ValueAsString();
            Satir++;
            iNode.Nodes.Add(jNode);
        }
        // 跳出循环避免重复处理
        break;
    }

    else if(type == 2) // 假设type=2表示筛选重命名参数
    {
        if (parameter.Renamed)
        {
            TreeNode jNode = new TreeNode() { Text = parameter.get_Name() + " = " + parameter.ValueAsString() };
            Range partNameColumn = (Range)sheet1.Cells[Satir, Kolon ];
            partNameColumn.Value2 = parameter.get_Name();
            Range partValueColumn = (Range)sheet1.Cells[Satir, Kolon + 1];
            partValueColumn.Value2 = parameter.ValueAsString();
            Satir++;
            iNode.Nodes.Add(jNode);
        }
    }

    else if(type == 3) // 假设type=3表示筛选可见参数
    {
        if (parameter.Visible)
        {
            TreeNode jNode = new TreeNode() { Text = parameter.get_Name() + " = " + parameter.ValueAsString() };
            Range partNameColumn = (Range)sheet1.Cells[Satir, Kolon ];
            partNameColumn.Value2 = parameter.get_Name();
            Range partValueColumn = (Range)sheet1.Cells[Satir, Kolon + 1];
            partValueColumn.Value2 = parameter.ValueAsString();
            Satir++;
            iNode.Nodes.Add(jNode);
        }
    }
}

关键说明

  • CATIA的参数分类是通过所属集合或内置属性区分,而非type()方法,因为所有参数都是COM对象实例,类型标识统一为__ComObject。
  • 直接遍历目标集合(如UserParameters)比遍历全部参数再筛选更高效。

内容的提问来源于stack exchange,提问作者illans

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 11:17:08