【NXOpen C#】树列表的简单操作

UG内看到的效果如下图,名称无法修改,可以对第二列数字进行修改,隐藏了第一列,隐藏了表头。

选中节点,右键可出现删除菜单,不选中节点,右键可出现新建菜单(为示范内容,实际不需要)
在这里插入图片描述

  1. 首先需要在初始化内设置,这里主要设置了树列表内的鼠标右键菜单,与节点内容修改时的动作回调,以及设置了树列表高度
        /// <summary>
        /// 初始化
        /// </summary>
        public void initialize_cb()
        {
            try
            {
                group0 = (NXOpen.BlockStyler.Group)theDialog.TopBlock.FindBlock("group0");
                tree_control0 = (NXOpen.BlockStyler.Tree)theDialog.TopBlock.FindBlock("tree_control0");
                
                //------------------------------------------------------------------------------
                //MenuHandler
                //------------------------------------------------------------------------------
                tree_control0.SetOnMenuHandler(new NXOpen.BlockStyler.Tree.OnMenuCallback(OnMenuCallback));
                tree_control0.SetOnMenuSelectionHandler(new NXOpen.BlockStyler.Tree.OnMenuSelectionCallback(OnMenuSelectionCallback));
                tree_control0.SetOnEditOptionSelectedHandler(new NXOpen.BlockStyler.Tree.OnEditOptionSelectedCallback(OnEditOptionSelectedCallback));
                tree_control0.SetAskEditControlHandler(new NXOpen.BlockStyler.Tree.AskEditControlCallback(AskEditControlCallback));

                tree_control0.Height = 200;
            }
            catch (Exception ex)
            {
                theUI.NXMessageBox.Show("Block Styler", NXMessageBox.DialogType.Error, ex.ToString());
            }
        }
  1. dialogShown_cb内设置树列表的布局,插入列,设置列宽,设置列标题是否显示
        public void dialogShown_cb()
        {
            try
            {
                tree_control0.ShowHeader = false;
                tree_control0.ShowExpandCollapseMarker = true;
                // Insert Columns插入列
                tree_control0.InsertColumn( 0, "Name",0);
                tree_control0.InsertColumn( 1, "LocalName",120);
                tree_control0.InsertColumn( 2, "Layer", 120);

                // Set resize policy for columns 设置列随大小调整
                tree_control0.SetColumnResizePolicy( 0, Tree.ColumnResizePolicy.ConstantWidth);
                tree_control0.SetColumnResizePolicy( 1, Tree.ColumnResizePolicy.ConstantWidth);
                tree_control0.SetColumnResizePolicy( 2, Tree.ColumnResizePolicy.ResizeWithTree);
            }
            catch (Exception ex)
            {
                //---- Enter your exception handling code here -----
                theUI.NXMessageBox.Show("Block Styler", NXMessageBox.DialogType.Error, ex.ToString());
            }
        }
  1. 用于设置右键树列表菜单显示内容与ID,当选中节点时,显示删除节点,没有选中任何节点时,显示添加节点。
    /// <summary>
    /// 设置右键树列表菜单显示内容与ID
    /// </summary>
    public void OnMenuCallback(NXOpen.BlockStyler.Tree tree, NXOpen.BlockStyler.Node node, int columnID)
    {
        try
        {
            //创建菜单
            TreeListMenu menu = tree.CreateMenu();
            //如果没有选中节点,则显示新建
            if (node == null)
            {
                menu.AddMenuItem(1, "新建");
                menu.SetItemIcon(1,"ico");
            }
            else
            {
                menu.AddMenuItem(0, "删除");
                menu.SetItemIcon(0, "delete");
                menu.SetItemDisable(0, false);
            }

            //设置菜单
            tree.SetMenu(menu);
        }
        catch (Exception ex)
        {
            theUI.NXMessageBox.Show("Block Styler", NXOpen.NXMessageBox.DialogType.Error, ex.ToString());
        }
    }
  1. 设置右键树列表菜单实现的功能,与上方定义的菜单ID对应。
    /// <summary>
    /// 设置右键树列表菜单实现的功能
    /// </summary>
    public void OnMenuSelectionCallback(NXOpen.BlockStyler.Tree tree, NXOpen.BlockStyler.Node node, int menuItemID)
    {
        try
        {
        	//对应上面设置的菜单ID
            if (menuItemID == 0)
            {
                 DeleteSelectedNodes();//删除选中节点
            }
            else if (menuItemID == 1)
            {
                AddNode();//添加节点
            }

        }
        catch (Exception ex)
        {
            theUI.NXMessageBox.Show("Block Styler", NXOpen.NXMessageBox.DialogType.Error, ex.ToString());
        }
    }
  1. 开启编辑控件选项,如果返回的为 Tree.EditControlOption.Reject; 则无法编辑树列表节点
        /// <summary>
        /// 编辑选项时选择回调,可用于树列表的动态更新
        /// </summary>
        public Tree.EditControlOption OnEditOptionSelectedCallback(NXOpen.BlockStyler.Tree tree, 
        NXOpen.BlockStyler.Node node, int columnID, int selectedOptionID, 
        string selectedOptionText, Tree.ControlType type)
        {
            return Tree.EditControlOption.Accept;
        }
  1. 设置第二列可以进行输入与下拉修改数值,其他列不可修改
    public Tree.ControlType AskEditControlCallback(NXOpen.BlockStyler.Tree tree, NXOpen.BlockStyler.Node node, int columnID)
    {
            if (columnID == 2)//设置图层节点可进行下拉修改
            {
                string[] options = { node.GetColumnDisplayText(columnID) };//获取当前显示的字符串到数组中
                tree.SetEditOptions(options, 0);//设置默认显示内容为获取的字符串
                return Tree.ControlType.ComboBox;
            }
            return Tree.ControlType.None;
    }
  1. 插入节点应该注意设置流程,先创建->再插入到树->再设置的过程
Node tr1Node01 = tree_control01.CreateNode("类别1");
tree_control01.InsertNode(tr1Node01, null, null, Tree.NodeInsertOption.Last);
tr1Node01.SetColumnDisplayText(1, "1");
  1. 插入的节点可以设置第一列的选择与显示情况下的图标
	tr1Node01.DisplayIcon = "block"; //显示图标
	tr1Node01.SelectedIcon = "block";//选中图标
  1. 如果需要在节点内显示图标,需要在插入列 InsertColumn 时,修改列的显示类型
     var numColumn =  tree.InsertColumn(1, "icon", 20);
     tree.SetColumnDisplayType(numColumn, Tree.ColumnDisplay.Icon);
  1. 【扩展】节点插入到其他节点,作为二级节点
    子节点插入,与常规节点执行的方法类似,不同的是在插入时,需要指定父节点
Node subNode = tree_control01.CreateNode("类别1");
tree_control01.InsertNode(subNode , tr1Node01 , null, Tree.NodeInsertOption.Last);
subNode .SetColumnDisplayText(1, "1");
  1. 【扩展】右键菜单的二级选项节点
	TreeListMenu menu = tree.CreateMenu();
	menu.AddMenuItem(0, "主菜单");

	TreeListMenu subMenu = tree.CreateMenu();//创建菜单
	subMenu.AddMenuItem(1, "子菜单");
	
	menu.SetSubMenu(0,subMenu);
	//挂菜单
    tree.SetMenu(menu);
    menu.Dispose();
  1. 【扩展】树列表节点绑定对象
		//通此方法,可以将树表节点与对象关联起来,快速选中对应的特征对象
        private static void SetNodeDataBody(NXOpen.BlockStyler.Node node,Body body,Body[]sameBodys)
        {
            NXOpen.DataContainer data = node.GetNodeData();
            data.AddTaggedObject("Data", body);
            data.AddTaggedObjectVector("bodys", sameBodys);
            data.Dispose();
        }
        
		//获取与节点关联的体对象,单个体
        private static NXOpen.Body GetNodeDataBody(NXOpen.BlockStyler.Node node)
        {
            NXOpen.DataContainer data = node.GetNodeData();
            var obj = data.GetTaggedObject("Data");
            data.Dispose();
            return obj as NXOpen.Body;
        }
        
		//获取与节点关联的体对象,多个体
        private static NXOpen.Body[] GetNodeDataBodies(NXOpen.BlockStyler.Node node)
        {
            NXOpen.DataContainer data = node.GetNodeData();
            var bodyObjects = data.GetTaggedObjectVector("bodys");
            data.Dispose();
            List<Body> newBodies =new List<Body>();
            foreach (var obj in bodyObjects)
            {
                var dd = obj as NXOpen.Body;
                newBodies.Add(dd);
            }

            return newBodies.ToArray();
        }
  • 2
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值