许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  获取CATIA几何图形集下所有层级的方法

获取CATIA几何图形集下所有层级的方法

阅读数 28
点赞 0
article_banner

编辑于江苏南京2023年3月21号。

最近想到一个需求,获取几何图形集下所有子集的树结构,通过树结构可以做很多应用,例如刷编码、排序、和数据库绑定做数据结构等。用下面的图形集做了测试。

1.定义数据 类  存放数据

    public class TreeNode    {        /// <summary>        /// 存储几何图形集的名称        /// </summary>        public string Name { get; set; }         /// <summary>        /// 存储几何图形集的子图形集        /// </summary>        public IList<TreeNode> Children { get; set; }    }

2.获取层级数据

2.1 获取目标文件夹

            var refCurve = CatiaHelper.SelectionObject<HybridBody>(catApp);             ///存放层级数据            List<TreeNode> list1 = new List<TreeNode>();            //遍历,通过递归的方法寻找到所有的层级。通过数据类中Children存放子集            if (refCurve.HybridBodies.Count > 0)            {                foreach (HybridBody index in refCurve.HybridBodies)                {                    TreeNode tree1 = new TreeNode();                    list1.Add(FindAllChildren(index, tree1));                }            }             treeView.ItemsSource = list1;

2.2 递归

通过递归的方法获取所有的层级,递归代码如下

        /// <summary>        /// 获取所有的子集        /// </summary>        /// <param name="hybridBody">目标文件集</param>        /// <param name="tree">树形数据</param>        /// <returns>存放所有子集的树形数据</returns>        private static TreeNode FindAllChildren(HybridBody hybridBody, TreeNode tree)        {            if (hybridBody != null)            {                tree.Name = hybridBody.get_Name();                if (hybridBody.HybridBodies.Count > 0)                {                    tree.Children = new List<TreeNode>();                    for (int i = 1; i <= hybridBody.HybridBodies.Count; i++)                    {                        TreeNode t1 = new TreeNode                        {                            Name = hybridBody.HybridBodies.Item(i).get_Name()                        };                        t1 = FindAllChildren(hybridBody.HybridBodies.Item(i), t1);                        tree.Children.Add(t1);                    }                }                 return tree;             }            else            {                return tree;            }         }

3. 前端 显示数据

用WPF写一个窗体,用TreeView 控件 可以将数据绑定到控件上。

WPF代码如下

<Window x:Class="TreeView.MainWindow"        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"        xmlns:local="clr-namespace:TreeView"        mc:Ignorable="d"        Title="MainWindow" Height="450" Width="800">    <Grid>        <StackPanel>            <Button Content="获取层级"  Margin="10" Height="40" Width="80" Click="Button_Click"/>            <TreeView Name="treeView">                <!--默认展开所有节点-->                <TreeView.ItemContainerStyle>                    <Style TargetType="TreeViewItem">                        <Setter Property="IsExpanded" Value="True"/>                    </Style>                </TreeView.ItemContainerStyle>                <!--绑定数据源-->                <TreeView.ItemTemplate>                    <HierarchicalDataTemplate ItemsSource="{Binding Children}">                        <StackPanel Orientation="Horizontal">                            <Image Source="pic/齐柏林飞船.png" Height="20" Width="20"></Image>                            <TextBlock Text="{Binding Name}"/>                        </StackPanel>                    </HierarchicalDataTemplate>                </TreeView.ItemTemplate>            </TreeView>        </StackPanel>    </Grid></Window>

4. 后台 代码

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows;using System.Windows.Controls;using System.Windows.Data;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Imaging;using System.Windows.Navigation;using System.Windows.Shapes;using System.Runtime.InteropServices;using INFITF;using MECMOD;using InstanceBallBySelect;   namespace TreeView{    /// <summary>    /// MainWindow.xaml 的交互逻辑    /// </summary>    public partial class MainWindow :System.Windows.Window    {        INFITF.Application catApp;        PartDocument oCATIADoc;        Part rootPart;          public MainWindow()        {            InitializeComponent();            catApp = (INFITF.Application)Marshal.GetActiveObject("Catia.Application");            oCATIADoc = (PartDocument)catApp.ActiveDocument;            rootPart = oCATIADoc.Part;            //TreeDemo();        }         private void Button_Click(object sender, RoutedEventArgs e)        {            var refCurve = CatiaHelper.SelectionObject<HybridBody>(catApp);             ///存放层级数据            List<TreeNode> list1 = new List<TreeNode>();            //遍历,通过递归的方法寻找到所有的层级。通过数据类中Children存放子集            if (refCurve.HybridBodies.Count > 0)            {                foreach (HybridBody index in refCurve.HybridBodies)                {                    TreeNode tree1 = new TreeNode();                    list1.Add(FindAllChildren(index, tree1));                }            }             treeView.ItemsSource = list1;        }         /// <summary>        /// 获取所有的子集        /// </summary>        /// <param name="hybridBody">目标文件集</param>        /// <param name="tree">树形数据</param>        /// <returns>存放所有子集的树形数据</returns>        private static TreeNode FindAllChildren(HybridBody hybridBody, TreeNode tree)        {            if (hybridBody != null)            {                tree.Name = hybridBody.get_Name();                if (hybridBody.HybridBodies.Count > 0)                {                    tree.Children = new List<TreeNode>();                    for (int i = 1; i <= hybridBody.HybridBodies.Count; i++)                    {                        TreeNode t1 = new TreeNode                        {                            Name = hybridBody.HybridBodies.Item(i).get_Name()                        };                        t1 = FindAllChildren(hybridBody.HybridBodies.Item(i), t1);                        tree.Children.Add(t1);                    }                }                 return tree;             }            else            {                return tree;            }        }     }}

整体的效果如图

5.结语

装配体的层级关系可以按照类似的方法获取。

另,WPF的控件自由度比较高,可以自定义样式实现不同的功能。如将样例中的飞船换成构件的缩略图,在每个子项中填加按键反向操控Catia等。


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删


相关文章
技术文档
QR Code
微信扫一扫,欢迎咨询~
customer

online

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 board-phone 155-2731-8020
close1
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空