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
相关产品推荐
相关产品推荐

