【问题标题】:CATIA C# Selection SearchCATIA C# 选择搜索
【发布时间】:2018-02-07 21:51:48
【问题描述】:

我想在 CATIA 中搜索树,并使用 C# 返回树中部件的名称。我目前的代码如下:

    private void Search(object sender, EventArgs e)
    {
        string searchName = OriginalBox.Text;
        string name;
        INFITF.SelectedElement part;

        //CATIA.StartCommand("Search");
        try
        {
            Sel.Search("Name=" + searchName + "*, all");

            for (int i = 1; i <= Sel.Count; i++)
            {
                part = Sel.Item(i);
                name = part.get_Name();

                MessageBox.Show(i.ToString() + " : " + name);
            }
        }
        catch (IOException ex)
        {
            if (ex.Source != null)
                MessageBox.Show(ex.Source);
            throw;

        }
    }

消息框显示“CATIASelectedElement45”。我收到消息“错误 HRESULT E_FAIL 已从对 COM 组件的调用中返回。”将 Sel.Item(i) 分配给零件时。

如何使用 Selection.Search 访问部件名称?

【问题讨论】:

  • 您不是在寻找零件,而是在寻找任何东西。如果您只想查找部分,请将您的搜索字符串限制为该类型。您应该尝试使用交互式编辑 + 搜索命令。它使用和显示(几乎)与自动化 API 中的 Slection.Search 方法相同的搜索字符串。

标签: c# .net catia


【解决方案1】:

Sel.Search("Name=" + searchName + "*, all"); 上,您正在搜索包含该名称 的任何对象,如果您只想专门搜索Part,您应该使用类型搜索:

Sel.Search("(((((('Product Structure'.Part + FreeStyle.Part) + 'Assembly Design'.Part) + 'Part Design'.Part) + 'Generative Shape Design'.Part) + 'Functional Molded Part'.Part) + 'Process Applications'.Part);all");
//To get any search string, use search on Catia and copy it from there.

此外,要从 For 中的选择中获取 real 值,请使用以下命令:

Sel.Item(i).Value; // Object retrieved from selection
name = ((INFITF.AnyObject) Sel.Item(i).Value).get_Name(); // Object Name

请注意,SelectedElement 类只是一个将各种对象抽象为选择的中间类。它包含一些有时可能有用的属性和方法,例如ReferenceLeafProduct

【讨论】:

  • 您提供的搜索功能有效,但是,我仍然收到 HRESULT 错误并且无法获取所选部件名称。最后,我想选择一组部件,并将其替换为我使用 FileDialog 打开的部件。
  • @Roots_radicals 根据自动化 API 文档,Selection.Item 自 Catia V5R16 起已被弃用,请尝试使用 Selection.Item2 并查看它是否有效。
【解决方案2】:

然后,我认为最好不要使用选择搜索,而是遍历特定类型的特征,如身体、混合体、形状..等

在遍历它时,您可以将项目名称值与您的字符串值进行比较并存储它。 像这样的:

  int bodiesCount = Part.Bodies.count
  for (int i = 1; i <= bodiesCount; i++)
  {
     string name = Part.Bodies.Item(i).Name;
     if(name == TextBox.Text("your string value"))
     {
        Sel.Add(Part.Bodies.Item(i));
        MessageBox.Show(i.ToString() + " : " + name);
     }

  }

【讨论】:

    【解决方案3】:

    你可以试试这个:

     Sel.Search ("Name=" + searchName + "* & CATPrtSearch,all");
     for (int i = 1; i <= Sel.Count; i++)
     {
         MECMOD.Part selectedPart;
         selectedPart = Sel.Item(i).Value;
         name = selectedPart.get_Name();
       
         MessageBox.Show(i.ToString() + " : " + name);
     }
    

    【讨论】:

    • 使用 C# 使用 Catia 需要与使用 VB.Net 相同的步骤。您可能会找到比 C# 更多的 VB.Net 答案。另外,请保持中间答案不是提问的地方。发布一个新问题,社区很乐意为您解答。
    • 我发现 VB 的文档比 C# 多,但 C# 是一种更通用、更强大的语言,所以我正在尝试切换到它。我试过你的代码,不幸的是,我仍然收到 HRESULT 错误,source-mscorlib
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-16
    • 2011-02-23
    • 2018-05-06
    • 1970-01-01
    相关资源
    最近更新 更多