UG内看到的效果如下图,名称无法修改,可以对第二列数字进行修改,隐藏了第一列,隐藏了表头。
选中节点,右键可出现删除菜单,不选中节点,右键可出现新建菜单(为示范内容,实际不需要)
- 首先需要在初始化内设置,这里主要设置了树列表内的鼠标右键菜单,与节点内容修改时的动作回调,以及设置了树列表高度
/// <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());
}
}
- 在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());
}
}
- 用于设置右键树列表菜单显示内容与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());
}
}
- 设置右键树列表菜单实现的功能,与上方定义的菜单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());
}
}
- 开启编辑控件选项,如果返回的为 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;
}
- 设置第二列可以进行输入与下拉修改数值,其他列不可修改
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;
}
- 插入节点应该注意设置流程,先创建->再插入到树->再设置的过程
Node tr1Node01 = tree_control01.CreateNode("类别1");
tree_control01.InsertNode(tr1Node01, null, null, Tree.NodeInsertOption.Last);
tr1Node01.SetColumnDisplayText(1, "1");
- 插入的节点可以设置第一列的选择与显示情况下的图标
tr1Node01.DisplayIcon = "block"; //显示图标
tr1Node01.SelectedIcon = "block";//选中图标
- 如果需要在节点内显示图标,需要在插入列 InsertColumn 时,修改列的显示类型
var numColumn = tree.InsertColumn(1, "icon", 20);
tree.SetColumnDisplayType(numColumn, Tree.ColumnDisplay.Icon);
- 【扩展】节点插入到其他节点,作为二级节点
子节点插入,与常规节点执行的方法类似,不同的是在插入时,需要指定父节点
Node subNode = tree_control01.CreateNode("类别1");
tree_control01.InsertNode(subNode , tr1Node01 , null, Tree.NodeInsertOption.Last);
subNode .SetColumnDisplayText(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();
- 【扩展】树列表节点绑定对象
//通此方法,可以将树表节点与对象关联起来,快速选中对应的特征对象
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();
}