项目树是切换模型场景的索引,根据创建的项目树,用户可选择性显示某一部分内容,也可叠加显示一个大的场景,通过UI界面上的组织来控制数据层面的显示。所以项目树的创建与展示,直接影响着视模型空间面的显示组织,创建项目树也显的尤为重要。
BIMBase平台项目树相关的内容主要在BIMBaseNet.UI.dll模块中,接口主要在BPTreeManager文件中,文件中主要的接口如表8-2所示。
表8-2 项目树接口列表
方法 | 描述 |
---|---|
handleTreeItem append(string,string, handleTreeItem ) | 增加一个节点 |
bool remove(handleTreeItem ) | 删除一个节点 |
bool remove(string) | |
void setAttachModel(handleTreeItem, int) | 节点绑定model |
void extend(handleTreeItem) | 展开树节点 |
void extend(string) | |
void collapse(string) | 折叠起树节点 |
handleTreeItem findByName(string) | 找到某一名字的节点 |
void clear() | 清除项目树 |
handleTreeItem getTreeRootItem() | 获取树节点Item |
void registerMsgReactionFunction (BPTreeManager.ProjectUIMsgFunType) | 回调函数,通过注册获取鼠标点击事件 |
bool resetName(string, string) | 重命名某一节点 |
void select(string) | 选中某一节点 |
void setImage(int, int, string) | 给树节点设置图片 |
int size() | 获取节点数 |
handleTreeItem getParentNode(string) | 查找父节点 |
handleTreeItem getParentNode(handleTreeItem ) | |
List |
获取子节点 |
List |
代码片段8-2展示了调用所列接口创建项目树的过程。
public static void projectTreeRefresh()
{
BPDocument doc = BPApplication.singleton().activeDocument;
//判断是否已经创建过项目树
if (!BPUIApplication.singleton().treeManager.initialize())
{
//如果没有创建则增加一个根节点
handleTreeItem item = BPUIApplication.singleton().treeManager.append("工程项目","工程项目",BPUIApplication.singleton().treeManager.getTreeRootItem());
BPUIApplication.singleton().treeManager.select("工程项目");
}
//注册回调函数,用来响应左键、右键、双击等事件
BPTreeManager.ProjectUIMsgFunType msgFun = new BPTreeManager.ProjectUIMsgFunType(new ApiTestProjectTree().projectUIMsgFun);
BPUIApplication.singleton().treeManager.onTreeClickEvent += msgFun;
}
代码8-2 创建项目树
该代码片段写的是刷新项目树功能,在刷新的时候会判断是否存在项目树。如果已经存在,则需要获取已有的项目树,并且展示出来,如果没有项目树,则创建一个项目树。增加项目树主要调用的append
接口,接口里面需要传3个参数,分别是节点在UI上显示的内容、节点名称、父节点句柄,这里创建的是一个根节点,所以第三个参数传入的是root的句柄,通过这样一个接口的调用,就在UI层面和数据层面增加了相应的项目树节点。
在项目树初始化另一个比较重要的点,就是需要注册回调函数,用来响应左键、右键、双击等事件,这样一来就可以在界面上响应鼠标事件完成相应的逻辑了。
上面的代码片段,我们增加了一个项目树,并且注册了鼠标响应事件。代码片段8-3展示了鼠标事件具体响应后的逻辑,平台提供的鼠标响应事件关键字为“RightClick”、“DbClick”、“LeftClick”,分别代表右键点击、双击、左键点击等事件。根据不同的事件我们可以完成不同的逻辑,范例中示例了右键及双击响应的用法。在右键响应的时候,弹出右键菜单,里面填充上创建三维、创建二维、删除项目树节点、重命名项目树节点等。在双击节点的时候,完成切换不同的model的功能。
//响应左键、右键、双击等事件
public void projectUIMsgFun(String msgType,String text,String name,uint ht)
{
_curItemName = name;
switch (msgType)
{
case "RightClick":
CreatMenu();
break;
case "Db1Click":
openAttachModel(_curItemName);
break;
}
}
//右键菜单
public void CreatMenu()
{
ContextMenuStrip menuStrip = new ContextMenuStrip();
menuStrip.Items.Add("添加三维");
menuStrip.Items.Add("添加二维");
menuStrip.Items.Add("删除");
menuStrip.Items.Add("重命名");
menuStrip.ItemClicked += menuStrip_ItemClicked;
menuStrip.Show(Cursor.Position.X, Cursor.Position.Y);
}
代码8-3 项目树鼠标响应
代码片段8-4展示了打开项目树节点绑定model的部分。在项目树的接口中,提供了通过节点名称获取节点Item
的接口,通过节点Item
又可以获取到对应的modelID,因此通过一系列的接口调用,最终得到节点对应的model,并且通过调用didplayModelOnViewPort
,把需要展示的model在对应的view中可以展示出来。
public void openAttachModel(string itemName)
{
//根据点击的节点名称找到对应的节点
handleTreeItem item = BPUIApplication.singleton().treeManager.findByName(itemName);
//根据项目树的节点找到绑定的modelID
int nModel = BPUIApplication.singleton().treeManager.getAttachModel(item);
BPModelId modelId = new BPModelId();
modelId.setValue(nModel);
//获取当前激活的视图
int viewportIndex =
BPApplication.singleton().activeDocument.viewManager.getActiveIndex();
//在当前激活的视图中显示对应节点的model
BPApplication.singleton().activeDocument.viewManager.displayModelOnViewPort(modelId, viewportIndex);
}
代码8-4 项目节点绑定model
代码片段8-5展示在项目树上增加一个三维视图节点。首先根据鼠标点击事件传入的信息,获得将要增加节点的父节点,然后在父节点下append一个新的节点,针对于UI中新增加的节点,创建一个新的model,用来存数据,并且把新创建的model绑定到UI创建的节点中,绑定就通过调用setAttachMode
l来实现。最后可以进行一些展示上面的操作,包括展开或者折叠起项目树等等。
public handleTreeItem add3DTreeItem(string parentName,string itemName = "")
{
if (itemName == "")
{
itemName = "三维场景" + BPUIApplication.singleton().treeManager.size();
}
//获取父节点
handleTreeItem itemFather = BPUIApplication.singleton().treeManager.findByName(parentName);
//在相应的父节点下方增加节点
handleTreeItem item =
BPUIApplication.singleton().treeManager.append(itemName, itemName, itemFather);
//创建一个新的model
BPModelId modelId = new BPModelId(); string strModel = "newModel" +
BPUIApplication.singleton().treeManager.size();
BPApplication.singleton().activeDocument.modelManager.createNewModel(modelId, strModel,BPModelType.enPhysical);
//把创建的新model绑定到项目树节点上
BPUIApplication.singleton().treeManager.setAttachModel(item, modelId.getValue());
// 展开项目树
BPUIApplication.singleton().treeManager.extend(itemFather);
BPUIApplication.singleton().uiManager.uiRibbonPanel.showDrawingRibbon(false);
return item;
}
代码8-5 增加三维视图节点
最后在程序中得到项目树的效果如下图所示

图8-7 项目树效果