项目树是切换模型场景的索引,根据创建的项目树,用户可选择性显示某一部分内容,也可叠加显示一个大的场景,通过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 getChildNode(string) 获取子节点
List getChildNode(handleTreeItem )

代码片段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创建的节点中,绑定就通过调用setAttachModel来实现。最后可以进行一些展示上面的操作,包括展开或者折叠起项目树等等。

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 项目树效果