diff --git a/yanzhu-ui-vue3/src/api/bim/bimModel.js b/yanzhu-ui-vue3/src/api/bim/bimModel.js index 5e709029..7a6b14b5 100755 --- a/yanzhu-ui-vue3/src/api/bim/bimModel.js +++ b/yanzhu-ui-vue3/src/api/bim/bimModel.js @@ -78,4 +78,12 @@ export function getModelFeatureInfo(name,externalId){ url: "/manage/bim/modelInfo/getModelFeatureInfo/" + name+"?externalId="+externalId, method: "get" }); +} + +export function modelTreeAllLeafChildByGlids(name,glids){ + return request({ + url: "/manage/bim/modelInfo/modelTreeAllLeafChildByGlids/" + name, + method: "post", + data: glids + }); } \ No newline at end of file diff --git a/yanzhu-ui-vue3/src/views/bim/bimSetting/ModelFloorTree.vue b/yanzhu-ui-vue3/src/views/bim/bimSetting/ModelFloorTree.vue index 0e956c59..c8fc7d12 100644 --- a/yanzhu-ui-vue3/src/views/bim/bimSetting/ModelFloorTree.vue +++ b/yanzhu-ui-vue3/src/views/bim/bimSetting/ModelFloorTree.vue @@ -9,27 +9,20 @@ - -
- +
+
@@ -51,6 +44,7 @@ export default { key: "glid", value: "glid", }, + treeKey: 0, expandedKeys: [], visibleList: [], //结构树显示构件列表 checkedKeys: [], //用于清除选中状态 @@ -98,6 +92,66 @@ export default { this.$nextTick(() => {}); }, methods: { + loadNode(node, resolve) { + let that = this; + if (node.level == 0) { + let nd = [ + { + title: "项目模型", + level: 0, + type: "root", + key: "root", + children: [], + hadLoad: true, + }, + ]; + + resolve(nd); + setTimeout(() => { + document.querySelectorAll(".model-floor-tree .model-tree .el-tree-node")[0].click(); + }, 1000); + } else if (node.level == 1) { + let nd = []; + + that.$parent.models.forEach((d) => { + let mnd = { + title: d.modelName, + level: 1, + type: "model", + hasLoad: false, + modelId: d.lightweightName, + key: d.lightweightName, + externalId: "0", + glid: "", + children: [], + data: d, + }; + nd.push(mnd); + }); + resolve(nd); + } else { + this.getTreeChildren(node, resolve); + } + }, + getTreeChildren(node, resolve) { + let that = this; + let data = node.data; + getModelTree(data.modelId, data.glid).then((d) => { + let tmps = (d.data || []).map((it) => { + let title = it.externalId == 0 ? it.name : it.externalId; + title = title.replaceAll('"', "").replaceAll("'", "").replaceAll("\\", ""); + it.title = title; + it.key = it.glid; + it.modelId = data.modelId; + it.type = "data"; + it.leaf = +it.externalId != 0; + let o = this.convertFeatureInfo(it, data.modelId); + return o; + }); + //addToAllFeatures(that, tmps); + resolve(tmps); + }); + }, loadTree(a, b, c) { return new Promise((resolve, reject) => { if (a.hasLoad) { @@ -126,8 +180,17 @@ export default { }); }); }, + convertFeatureInfo(o, modelId) { + o.modelId = modelId; + o.featureId = o.modelId + "^" + o.externalId; + o.name = o.name || ""; + o.name = o.name.replaceAll('"', "").replaceAll("'", "").replaceAll("\\", ""); + o.info = `[${o.externalId}]${o.groupname}-${o.name}`; + return o; + }, addModel(modelId, cb) { let url = `${window.config.modelUrl}/Tools/output/model/${modelId}/root.glt`; + console.log("加载模型:" + url); api.Model.add( url, modelId, @@ -144,79 +207,49 @@ export default { } ); }, - onCheckTree(heckedKeys, e) { - const checkNode = e.node.dataRef; - const checked = e.checked; - const halfChecked = e.node.halfChecked; + onCheckTree(checkNode, event) { + let checked = event.checkedNodes.includes(checkNode); + let models = this.$parent.models; if (checkNode.type == "root") { if (checked) { - checkNode.children.forEach((m) => { - if (halfChecked) { - if (api.m_model.has(m.modelId)) { - api.Model.remove(m.modelId); - } - this.addModel(m.modelId); - this.$emit("change"); + models.forEach((m) => { + m.visible = true; + if (api.m_model.has(m.modelId)) { + api.Model.setVisible(m.modelId, true); + api.Model.original(m.modelId); } else { - if (api.m_model.has(m.modelId)) { - api.Model.setVisible(m.modelId, true); - this.$emit("change"); - } else { - this.addModel(m.modelId); - } + this.addModel(m.modelId); } }); + this.$emit("change"); } else { - if (api.m_model.size == 0) { - return; - } - checkNode.children.forEach((m) => { - if (api.m_model.has(m.modelId)) { - api.Model.remove(m.modelId); - this.$emit("change"); - } + models.forEach((m) => { + api.Model.setVisible(m.modelId, false); + m.visible = false; }); } return; } if (checkNode.type == "model") { if (checked) { - if (halfChecked) { - if (api.m_model.has(checkNode.modelId)) { - api.Model.remove(checkNode.modelId); - } - this.addModel(checkNode.modelId); - this.$emit("change"); - } else { - if (api.m_model.has(checkNode.modelId)) { - api.Model.setVisible(checkNode.modelId, true); - this.$emit("change"); - } else { - this.addModel(checkNode.modelId); - } - } + api.Model.setVisible(checkNode.modelId, true); + api.Model.original(checkNode.modelId); + this.projectMessage.find((mm) => mm.modelId == checkNode.modelId).visible = true; + this.$emit("change"); } else { - if (api.m_model.has(checkNode.modelId)) { - api.Model.remove(checkNode.modelId); - this.$emit("change"); - } + api.Model.setVisible(checkNode.modelId, false); + this.projectMessage.find((mm) => mm.modelId == checkNode.modelId).visible = false; + this.$emit("change"); } return; } - if (api.m_model.size == 0) { - let modelId = checkNode.modelId; - this.addModel(modelId, () => { - this.showItem(e, heckedKeys); - }); - } else { - this.showItem(e, heckedKeys); - } + this.showItem(checkNode, event); }, - async showItem(e, checkedKeys) { - const node = e.node.dataRef; - const checked = e.checked; + async showItem(checkNode, event) { + const node = checkNode; + let checked = event.checkedNodes.includes(checkNode); let isPartLoad = false; - if (checkedKeys.length == 1 && checked) { + if (!this.projectMessage.find((mm) => mm.modelId == node.modelId).visible && checked) { isPartLoad = true; } let selFeatureIds = []; @@ -234,11 +267,20 @@ export default { this.setFeatueVisible(tmps, false); } else { if (isPartLoad) { - api.Model.setVisible(node.modelId, true); - api.Model.original(node.modelId); - let tmpsIds2 = tmps.splice(0, 1000); - api.Feature.showFeatures(tmpsIds2.join("#")); - this.setFeatueVisible(tmps, true); + let func = () => { + api.Model.original(node.modelId); + let tmpsIds2 = tmps.splice(0, 1000); + api.Feature.showFeatures(tmpsIds2.join("#")); + this.setFeatueVisible(tmps, true); + }; + if (!api.m_model.has(node.modelId)) { + this.addModel(node.modelId, func); + } else { + api.Model.setVisible(node.modelId, true); + this.$parent.models.find((d) => d.modelId == node.modelId).visible = true; + api.Model.original(node.modelId); + func(); + } } else { this.setFeatueVisible(tmps, true); } @@ -247,6 +289,9 @@ export default { setFeatueVisible(featureIds, show) { let len = 1000; let cnt = featureIds.length; + if(cnt==0){ + return; + } for (let i = 0; i < cnt; i += len) { api.Feature.setVisible(featureIds.slice(i, i + len).join("#"), show); } @@ -262,71 +307,6 @@ export default { return o; }); }, - async showItem2(e) { - const checkNode = e.node.dataRef; - const checked = e.checked; - api.Model.setVisible(checkNode.modelId, true); - this.$emit("change"); - let externalId = checkNode.externalId; - if (externalId != 0) { - if (checked) { - this.visibleList.push(externalId); - api.Feature.setVisible(this.visibleList.join("#"), true, checkNode.modelId, false); - } else { - this.visibleList = this.visibleList.filter((item) => item !== externalId); - api.Feature.setVisible(externalId, false, checkNode.modelId); - } - } else { - e.node.disableCheckbox = true; - const res = await getTreeAllLeafChild(checkNode.modelId, checkNode.glid); - let nodes = (res.data || []).map((d) => d.glid); - if (nodes.length > 0) { - if (checked) { - this.visibleList = this.MergeArray(nodes, this.visibleList); - api.Model.setVisible(checkNode.modelId, true); - this.$emit("change"); - api.Feature.setVisible(this.visibleList.join("#"), true, checkNode.modelId, false); - } else { - this.visibleList = this.DelArray(this.visibleList, nodes); - api.Feature.setVisible(nodes.join("#"), false, checkNode.modelId); - } - } - } - }, - MergeArray(arr1, arr2) { - var _arr = new Array(); - for (var i = 0; i < arr1.length; i++) { - _arr.push(arr1[i]); - } - for (var i = 0; i < arr2.length; i++) { - var flag = true; - for (var j = 0; j < arr1.length; j++) { - if (arr2[i] == arr1[j]) { - flag = false; - break; - } - } - if (flag) { - _arr.push(arr2[i]); - } - } - return _arr; - }, - DelArray(array1, array2) { - var result = []; - for (var i = 0; i < array1.length; i++) { - var k = 0; - for (var j = 0; j < array2.length; j++) { - if (array1[i] != array2[j]) { - k++; - if (k == array2.length) { - result.push(array1[i]); - } - } - } - } - return result; - }, }, }; @@ -336,6 +316,7 @@ export default { position: absolute; width: 300px; top: 20px; + height: 80vh; left: 20px; color: #fff; background: #274754; @@ -404,5 +385,29 @@ export default { text-align: left; } } + .model-tree { + height: calc(100% - 60px); + overflow-y: auto; + .el-tree { + background: transparent; + color: #eee; + .el-checkbox { + color: #45fdfe; + } + .el-tree-node { + &:focus { + & > .el-tree-node__content { + background: #3489d966; + &:hover { + background: #3489d966; + } + } + } + .el-tree-node__content:hover { + background: #3489d966; + } + } + } + } } diff --git a/yanzhu-ui-vue3/src/views/bim/bimSetting/index.vue b/yanzhu-ui-vue3/src/views/bim/bimSetting/index.vue index 393c0463..618dad88 100644 --- a/yanzhu-ui-vue3/src/views/bim/bimSetting/index.vue +++ b/yanzhu-ui-vue3/src/views/bim/bimSetting/index.vue @@ -213,7 +213,13 @@ export default { comId: this.currentComId, projectId: this.currentPrjId, }).then((d) => { - this.models = d.rows || []; + this.models = (d.rows || []).map((it) => { + it.modelId = it.lightweightName; + it.visible=false; + it.checked = true; + it.gis = this.$tryToJson(it.gisJson || "{}", {}); + return it; + }); if (this.models.length == 0) { this.$modal.msgError("暂无模型,请先关联模型"); } else { diff --git a/yanzhu-ui-vue3/src/views/bim/sandTableSetting/index.vue b/yanzhu-ui-vue3/src/views/bim/sandTableSetting/index.vue index 7cbef0d7..bb48530f 100644 --- a/yanzhu-ui-vue3/src/views/bim/sandTableSetting/index.vue +++ b/yanzhu-ui-vue3/src/views/bim/sandTableSetting/index.vue @@ -363,7 +363,7 @@ export default { }, addModel(modelId, cb) { let url = `${window.config.modelUrl}/Tools/output/model/${modelId}/root.glt`; - console.log(modelId, url); + console.log("开始加载模型:",modelId, url); sandSettingApi.Model.add( url, modelId, diff --git a/yanzhu-ui-vue3/src/views/manage/plan/bimSelectTools2.js b/yanzhu-ui-vue3/src/views/manage/plan/bimSelectTools2.js index a369f6c0..b04bb76a 100644 --- a/yanzhu-ui-vue3/src/views/manage/plan/bimSelectTools2.js +++ b/yanzhu-ui-vue3/src/views/manage/plan/bimSelectTools2.js @@ -1,5 +1,5 @@ import { modelTreeAllChild } from "@/api/bim/bim"; -import { getModelTree, getTreeAllLeafChild, getModelFeatureInfo, getModelFeatureInfos } from "@/api/bim/bimModel"; +import { getModelTree, getTreeAllLeafChild, getModelFeatureInfo, getModelFeatureInfos, modelTreeAllLeafChildByGlids } from "@/api/bim/bimModel"; import { MergeArray, DelArray } from "@/utils/index"; import { ElMessage } from "element-plus"; function selectFeature(that, featureId) { @@ -229,7 +229,6 @@ function getModelFeatures(that, modelId) { } that.allFeatures.push(o); }); - }); } @@ -261,7 +260,7 @@ function onCheckTree(that, node, event) { } } -let maxLen=1000; +let maxLen = 500; //根据选择控制构件的隐藏和显示 async function setTreeNodeChecked(that, node, event) { let api = bimSelectionDlgApi; @@ -270,23 +269,27 @@ async function setTreeNodeChecked(that, node, event) { if (checked) { that.models.forEach((it) => { api.Model.setVisible(it.modelId, true); + it.visible = true; api.Model.original(it.modelId); }); } else { that.models.forEach((it) => { api.Model.setVisible(it.modelId, false); + it.visible = false; }); } } else if (node.type == "model") { if (checked) { api.Model.setVisible(node.modelId, true); + that.models.find((d) => d.modelId == node.modelId).visible = true; api.Model.original(node.modelId); } else { api.Model.setVisible(node.modelId, false); + that.models.find((d) => d.modelId == node.modelId).visible = false; } } else { let isPartLoad = false; - if (event.checkedKeys.length == 1 && checked) { + if (!that.models.find((d) => d.modelId == node.modelId).visible && checked) { isPartLoad = true; } let selFeatureIds = []; @@ -305,33 +308,46 @@ async function setTreeNodeChecked(that, node, event) { .filter((it) => !that.readlyParts.includes(it)) .filter((it) => !selitemsFeatureIds.includes(it)); if (!checked) { - setFeatueVisible(tmps,false); + setFeatueVisible(tmps, false); } else { if (isPartLoad) { - api.Model.setVisible(node.modelId, true); - api.Model.original(node.modelId); selitemsFeatureIds.forEach((it) => { tmps.push(it); }); - let tmpsIds2=tmps.splice(0,maxLen); - api.Feature.showFeatures(tmpsIds2.join("#")); - setFeatueVisible(tmps,true) + if (tmps.length == 0) { + return; + } + let func = () => { + let tmpsIds2 = tmps.splice(0, maxLen); + api.Feature.showFeatures(tmpsIds2.join("#")); + setFeatueVisible(tmps, true); + }; + if (!api.m_model.has(node.modelId)) { + that.addModel(node.modelId, func); + } else { + api.Model.setVisible(node.modelId, true); + that.models.find((d) => d.modelId == node.modelId).visible = true; + api.Model.original(node.modelId); + func(); + } } else { - setFeatueVisible(tmps,true); + setFeatueVisible(tmps, true); } } } setFeatueShowOrHide(that); } -function setFeatueVisible(featureIds,show){ - let len=maxLen; - let api = bimSelectionDlgApi; - let cnt=featureIds.length; - for(let i=0;i { + let modelId = d.modelId; + if (!obj[modelId]) { + obj[modelId] = []; + } + obj[modelId].push(d.glid); + }); + for (let modelId in obj) { + let glids = obj[modelId]; + if (glids.length > 0) { + let res = await modelTreeAllLeafChildByGlids(modelId, glids); + (res.data || []).forEach((o) => { + o = convertFeatureInfo(o, modelId); + if (o.externalId != "0") { + if (!that.allParts.includes(o.featureId)) { + that.allParts.push(o.featureId); + } + } + that.allFeatures.push({ + featureId: o.featureId, + info: o.info, + }); + if (!that.selectItems.find((it) => it.featureId == o.featureId) && !that.readlyParts.includes(o.featureId) && !that.hideParts.includes(o.featureId)) { + that.selectItems.push(o); + api.Feature.setColor(o.featureId, "rgba(255,0,255,1)"); + } + }); + } + } +} + export default { selectSingle, initBim, @@ -509,4 +563,5 @@ export default { boxSelection, hideSelection, loadNode, + selectTreeData, }; diff --git a/yanzhu-ui-vue3/src/views/manage/plan/bimSelectionDialog2.vue b/yanzhu-ui-vue3/src/views/manage/plan/bimSelectionDialog2.vue index a3a5cb69..37824e3e 100644 --- a/yanzhu-ui-vue3/src/views/manage/plan/bimSelectionDialog2.vue +++ b/yanzhu-ui-vue3/src/views/manage/plan/bimSelectionDialog2.vue @@ -76,6 +76,11 @@ + + +