构件树

创建构件树

根据构件树对象控制显示隐藏,该构件树方法依赖于zTree. 构件树对象,规范格式如下:

var treeObj = [
  {
    name:"一层",
    //该节点是否被选中
    isChecked:true,
    //该节点下的子节点
    children:[
      {
        name:"墙",
        isChecked: true,
        children:[...]
      },
      ...
    ]
  },
  {
    name:"二层",
    isChecked:true,
    children:[
      {
        name:"墙",
        isChecked: false,
        children:[...]
      },
      {
        name:"门",
        isChecked: true,
        children:[...]
      },
      ...
    ]
  },
];

注意: 如果子节点中有一个或以上的节点被选中(isChecked=true), 那么父节点一定是被选中的(isChecked一定为true);推荐使用zTree的构件树代码库,该代码库已经实现了上述的逻辑。

引入相关库

<!-- 引入jQuery和zTree -->
<link rel="stylesheet" href="./node_modules/@ztree/ztree_v3/css/zTreeStyle/zTreeStyle.css" type="text/css">
<script src="./node_modules/jquery/dist/jquery.min.js"></script>
<script src="./node_modules/@ztree/ztree_v3/js/jquery.ztree.all.min.js"></script>

构件树控制显示隐藏、点选高亮

//获取构件树
Motor.Component.PropertiesTree(projectId).then((pTree)=>{
  var zTreeObj;
  var setting = {
      data: {
          key: {
              checked: "isChecked"
          }
      },
      check: {
          enable: true,       //设置是否显示checkbox复选框
      },
      callback: {
        onCheck: function (e, id, treeNode) {
            project.setVisiblityFromTree(treeNode);
            let treeObj = $.fn.zTree.getZTreeObj("treeDemo");
            let nodes = treeObj.getCheckedNodes();
            let designIds = [];
            $.each(nodes, function (i, item) {
                designIds.push(item.id);
                item.checkedOld = item.checked;
            })
        },
        onClick: function (e, id, treeNode) {
            let tmp = treeNode;
            let strArr = [];
            let options = {};
            for (let i = treeNode.level; i > 0; i--) {
                strArr.push(tmp.name)
                tmp = tmp.getParentNode();
            }
            if(strArr.length>0){
                strArr = strArr.reverse();
                strArr.forEach(function(str,index){
                    options[optionTemplate[index]] = str;
                })
            }
            else{
                options=undefined;
            }
            
            const guid = treeNode.level === 4 ? treeNode.id : '';
            $('#infobox').hide();
            project.resetComponentsDefaultColor();
            if(treeNode.level===0){
                project.setComponentsColor(Motor.Color.CYAN);
            }
            else if(guid!==""){
                project.setComponentsColor(Motor.Color.CYAN,[guid]);
            }
            else if(options){
                project.setComponentsColorByOption(options,Motor.Color.CYAN);
            }
        },
        onDblClick: function (e, id, treeNode) {
            if (!treeNode.children && treeNode.level === 4) {
                let component = project.getComponentFromTree(treeNode);
                let innerHTML = '';
                for (var key in component.infos) {
                    innerHTML += '<div title=' + component.infos[key] + '>' + key + ': ' + component.infos[key] + '</div>';
                }
                $('#infobox').html('<div title=' + component.guid + '>' + component.guid + '</div>' + innerHTML);
                $('#infobox').show();
                viewer.flyTo(component);
            }
            else {
                $('#infobox').hide();
            }
        },
        onExpand: function (event, treeId, treeNode) {
            if (treeNode.level === 3 && (!treeNode.children||tree.children.length)) {
                dynamicloadNodes(treeNode).then(function (data) {
                    treeNode.children = [];
                    zTreeObj.addNodes(treeNode, data)
                    reSetNodes(zTreeObj)
                })
            }
        }
    }
  };        // zTree 的参数配置
    zTreeObj = $.fn.zTree.init($("#treeDemo"), setting, pTree);
    zTreeObj.checkAllNodes(true);
    reSetNodes(zTreeObj);
    $('.tree_container').show();
});

function dynamicloadNodes(treeNode) {
    return Motor.Project.getChildNodesFromTree(treeNode);
}

// 重新设置数据
function reSetNodes(zTreeObj) {
    let node = zTreeObj.getNodes();
    node.forEach((rootnode)=>{
        rootTreeNodes.push(rootnode);
    })
    let nodes = zTreeObj.transformToArray(node);
    if (nodes.length > 0) {
        for (let i = 0; i < nodes.length; i++) {
            if (!nodes[i].children) {
                if (nodes[i].level === 3) {
                    nodes[i].isParent = true;
                }
                nodes[i].nocheck = true;
                zTreeObj.updateNode(nodes[i]);
            }
        }
    }
}