bw/src/components/bimjs/app.js

439 lines
16 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

function createDOM(tagName, classList) {
var rs = document.createElement(tagName);
// rs.classList.add(classList);
rs.setAttribute("class", classList);
return rs;
};
//funx1(jQuery);
//通过一个根节点创建。
var Tree = function(title) {
var t = this;
t._root = t._tree;
};
Tree.prototype = {
getRoot: function() {
return this.treeDOM;
},
getChecked: function() {
function e(o, a) // 0 = node
{
var i = o.getCheckedState(),
l = o.element.getAttribute("data-filter");
switch (i) {
case "unchecked":
break;
case "checked":
if (o == t) {
n = "all";
} else {
var r = Object.assign({}, a);
r[l] = o.id, n.push(r)
}
break;
case "half":
var s = o.getControls(),
c = Object.assign({}, a);
o != t && (c[l] = o.id);
for (var d = 0, u = s.length; d < u; d++) {
e(s[d], c);
}
}
}
var t = this.treeDOM,
n = [];
return e(t, {}), n;
},
getSelection: function() {
function e(t, n) {
var o = t.element.getAttribute("data-filter"),
a = t.getParent();
if (!a) {
return n;
}
n[o] = t.id, e(a, n)
}
var t = this._selectionNode,
n = {};
return !!t && (e(t, n), n);
},
clear: function(e) {
var t = this.getRoot();
! function t(n) {
n.setCheckedState(e), n.setIconState("default");
var o = n.getControls();
if (o && o.length > 0) {
for (var a = 0; a < o.length; a++) {
t(o[a]);
}
}
}
(t)
}
};
//type =0顶级type=1,楼层。type=2,专业。type=3构件,type=4文档。,coolapse = 折叠
var TreeNode = function(title, viewer, id, type, coolapse) {
this.id = id;
this.parent = null;
this.parentId = 0;
this.type = type;
this.viewer = viewer;
this.element = createDOM('div', 'qm-tree'); //qm-tree
this.element.setAttribute('title', title);
var classValue = "qm-tree-node";
if (coolapse)
classValue = classValue + " qm-collapse";
this.treeNodeDOM = createDOM("div", classValue); //默认展开 qm-collapse
this.element.appendChild(this.treeNodeDOM);
this._opt = { isChecked: true };
this._selectionState = "unSelected";
this.setData(title);
this.subTreeList = [];
};
TreeNode.prototype.setData = function(t) {
var _this = this;
//<span class="qm-icon"></span> addChildNode
// var icon = createDOM("span", "qm-icon ");
// this.treeNodeDOM.appendChild(icon);
/**<span class="qm-label qm-unchecked">
<input type="checkbox" checked="true">
<span class="qm-checkbox"></span>
</span> */
var l = this._opt.isChecked ? "qm-checked" : "";
_this.checkDOM = createDOM("span", "qm-label " + l);
_this.checkDOM.innerHTML = '<input type="checkbox" checked="' +
_this._opt.isChecked + '"><span class="qm-checkbox iconfont icon-duoxuan-xuanzhong"></span>',
_this.treeNodeDOM.appendChild(this.checkDOM);
_this.checkDOM.addEventListener("click", function(e) {
var t = this.getElementsByTagName("input")[0].checked;
if (_this.type == 0) { //顶级
_this.viewer.setMeshVisiblityByTree(-1, 0, 0, t);
} else if (_this.type == 3) //构件分类
_this.viewer.setMeshVisiblityByTree(_this.parent.parentId, _this.parentId, _this.id, t);
else if (_this.type == 1) //楼层
_this.viewer.setMeshVisiblityByTree(_this.parentId, _this.id, 0, t);
else if (_this.type == 4) { //文档
_this.viewer.setMeshVisiblityByTree(_this.id, 0, 0, t);
} else if (_this.type == 5) { // 专业其实是多个doc
_this.id.data.forEach(docid => {
_this.viewer.setMeshVisiblityByTree(docid, 0, 0, t);
});
} else if (_this.type == 6) { // 楼层其实是多个doc-level
_this.id.data.forEach(e => {
_this.viewer.setMeshVisiblityByTree(e.doc, e.level, 0, t);
});
} else if (_this.type == 6) { // 构件其实是多个doc-level
_this.id.data.forEach(e => {
_this.viewer.setMeshVisiblityByTree(e.doc, e.level, e.category, t);
});
}
_this._opt.isChecked = t;
_this.OnbfLableClick(e, t);
if (_this.parent) {
if (!t) //选中
{
_this.parent.checkDOM.classList.remove("qm-unchecked");
_this.parent.checkDOM.classList.add("qm-checked");
} else {
var add = true;
for (var i = 0; i < _this.parent.subTreeList.length; i++) {
if (_this.parent.subTreeList[i].checkDOM.classList.contains("qm_checked")) {
add = false;
break;
}
}
_this.parent.checkDOM.classList.remove("qm-checked");
_this.parent.checkDOM.classList.add("qm-unchecked");
}
}
var o = t ? "unchecked" : "checked";
console.log(o);
});
//<div class="qm-tree-icon gld-qm-untransparent" title="半透明"></div>
this.transDOM = createDOM("div", "qm-tree-icon qmd-untransparent iconfont icon-cube_box_fill");
this.transDOM.setAttribute("title", "半透明");
this.transDOM.addEventListener("click", function(e) {
console.log(e.target);
var nodeList = e.target.parentNode.parentNode.getElementsByClassName("qm-tree-icon");
if (nodeList.length == 0) return;
var check = nodeList[0].classList.contains("qmd-untransparent")
var t = 1;
if (check) t = 0.5;
// var t = this.getElementsByTagName("input")[0].checked;
if (_this.type == 0) { //顶级
_this.viewer.setMeshTransparencyByTree(-1, 0, 0, t);
} else if (_this.type == 3) //构件分类
_this.viewer.setMeshTransparencyByTree(_this.parent.parentId, _this.parentId, _this.id, t);
else if (_this.type == 1) //楼层
_this.viewer.setMeshTransparencyByTree(_this.parentId, _this.id, 0, t);
else if (_this.type == 4) { //文档
_this.viewer.setMeshTransparencyByTree(_this.id, 0, 0, t);
}
for (var i = 0; i < nodeList.length; i++) {
var elb = nodeList[i];
if (check) {
elb.classList.remove("qmd-untransparent");
elb.classList.remove("icon-cube_box_fill");
elb.classList.add("qmd-transparent");
elb.classList.add("icon-pouqiehe");
} else {
elb.classList.add("qmd-untransparent");
elb.classList.add("icon-cube_box_fill");
elb.classList.remove("qmd-transparent");
elb.classList.remove("icon-pouqiehe");
}
}
});
this.treeNodeDOM.appendChild(this.transDOM);
this.treeNameDOM = createDOM("span", "qm-tree-name");
this.treeNameDOM.addEventListener("click", function(e) {
if ((_this.type != 3) && ((_this.type != 1))) return;
if (_this.type == 3) //构件分类
{
_this.viewer.setMeshSelectByTree(_this.parent.parentId, _this.parentId, _this.id, 0);
} else if (_this.type == 1) //楼层
{
_this.viewer.setMeshSelectByTree(_this.parentId, _this.id, 0, 0);
}
var elb = e.target;
var nodeList = $(".qm-selected");
if (nodeList.length > 0)
nodeList[0].classList.remove("qm-selected");
elb.classList.remove("qm-selected");
elb.classList.add("qm-selected");
});
this.treeNameDOM.innerHTML = t;
this.treeNodeDOM.appendChild(this.treeNameDOM);
};
TreeNode.prototype.addChildNode = function(subnode) {
var t = this;
if (t.subTreeDOM == null) {
t.subTreeDOM = createDOM("div", "qm-sub-tree");
var n = createDOM("span", "qm-icon");
this.treeNodeDOM.insertBefore(n, this.treeNodeDOM.children[0]);
n.addEventListener("click", function(e) {
var p = e.target.parentNode;
if (p.tagName == "DIV") {
if (p.classList.contains("qm-collapse")) {
p.classList.remove("qm-collapse");
} else {
p.classList.add("qm-collapse");
}
}
});
t.element.appendChild(this.subTreeDOM);
}
subnode.parentId = t.id;
subnode.parent = t;
t.subTreeList.push(subnode);
t.subTreeDOM.appendChild(subnode.element);
};
TreeNode.prototype.OnbfLableClick = function(e, t) {
var elb = e.target;
if (elb.classList.contains("qm-checkbox"))
elb = elb.parentNode;
var p = elb;
var nodeList = p.parentNode.parentNode.getElementsByClassName("qm-label");
for (var i = 0; i < nodeList.length; i++) {
var elb = nodeList[i];
if (!t) {
elb.classList.remove("qm-unchecked");
elb.classList.add("qm-checked");
// elb.classList.add("iconfont");
// elb.classList.add("icon-duoxuan-xuanzhong");
elb.getElementsByTagName("input")[0].checked = true;
} else {
elb.classList.add("qm-unchecked");
elb.classList.remove("qm-checked");
// elb.classList.remove("iconfont");
// elb.classList.remove("icon-duoxuan-xuanzhong");
elb.getElementsByTagName("input")[0].checked = false;
}
}
};
TreeNode.prototype.doUncheck = function() {
this.checkDOM.classList.add("qm-unchecked");
this.checkDOM.classList.remove("qm-checked");
this.checkDOM.classList.remove("iconfont");
this.checkDOM.classList.remove("icon-duoxuan-xuanzhong");
this.checkDOM.getElementsByTagName("input")[0].checked = false;
};
TreeNode.prototype.removeChildNode = function(e) {
var t = this._controls.getObjectByAttribute("id", e);
this.subTreeDOM.removeChild(t.element), this._controls.removeObjectByAttribute("id", e);
};
TreeNode.prototype.getCheckedState = function() {
return this._checkedState;
};
TreeNode.prototype.getIconState = function() {
return this._iconState;
};
TreeNode.prototype.getSelectionState = function() {
return this._selectionState;
};
TreeNode.prototype.getParent = function() {
return !!this._parent && this._parent;
};
TreeNode.prototype.setCheckedState = function(e) {
var t = this._opt;
this._checkedState = e ? "checked" : "unchecked", t.hasCheckbox && this.checkbox && (this.checkbox.getElementsByTagName("input")[0].checked = e,
this.checkbox.toggleClass("qm-checked", e), this.checkbox.toggleClass("qm-unchecked", !e), this.checkbox.removeClass("qm-half")),
this.setChildrenCheckedState(e);
};
TreeNode.prototype.setIconState = function(e) {
this.icon && (this.icon.setState(e), this.setChildrenIconState(e), this._iconState = "default" == e);
};
TreeNode.prototype.setParentCheckedState = function(e) {
var t = this.getControls();
if (t && t.length > 0) {
for (var n, o = 0, a = t.length; o < a; o++) {
var i = t[o].getCheckedState();
n ? i != n && (n = "half") : n = i
}
this._checkedState = n
}
switch (this._checkedState) {
case "checked":
this.checkbox.getElementsByTagName("input")[0].checked = !0, this.checkbox.addClass("qm-checked"),
this.checkbox.removeClass("qm-unchecked"), this.checkbox.removeClass("qm-half");
break;
case "unchecked":
this.checkbox.getElementsByTagName("input")[0].checked = !1, this.checkbox.addClass("qm-unchecked"),
this.checkbox.removeClass("qm-checked"), this.checkbox.removeClass("qm-half");
break;
case "half":
this.checkbox.getElementsByTagName("input")[0].checked = !0, this.checkbox.addClass("qm-half"),
this.checkbox.removeClass("qm-unchecked"), this.checkbox.removeClass("qm-checked")
}
};
TreeNode.prototype.setChildrenCheckedState = function(e) {
var t = this.getControls(),
n = t.length;
if (t && n > 0) {
for (var o = 0; o < n; o++) {
t[o].setCheckedState(e);
}
}
};
TreeNode.prototype.setParentIconState = function(e) {
var t = this.getControls();
if (t && t.length > 0) {
for (var n = !1, o = 0, a = t.length; o < a; o++) {
var i = t[o].getIconState();
if (i) {
n = i;
break
}
}
this._iconState = n
}
n ? this.icon.setState("default") : this.icon.setState("change");
};
TreeNode.prototype.setChildrenIconState = function(e) {
var t = this.getControls(),
n = t.length;
if (t && n > 0) {
for (var o = 0; o < n; o++) {
t[o].setIconState(e);
}
}
};
TreeNode.prototype.expand = function() {
var e = this;
this.treeNode.removeClass("qm-collapse"), this.eventManager.fireEvent("Expand", e);
};
TreeNode.prototype.collapse = function() {
var e = this;
this.treeNode.addClass("qm-collapse"), this.eventManager.fireEvent("Collapse", e);
};
TreeNode.prototype.toggleExpansion = function(e) {
var t = this;
this.treeNode.hasClass("qm-collapse") ? t.expand() : t.collapse();
};
TreeNode.prototype.select = function() {
if (this._selection) {
return this.treeName.addClass("qm-selected");
}
};
TreeNode.prototype.deselect = function() {
this.treeName && this.treeName.removeClass("qm-selected");
};
TreeNode.prototype.disabled = function() {
this._enabled = !1, this.treeName.addClass("qm-disabled");
};
TreeNode.prototype.enabled = function() {
this._enabled = !0, this.treeName.removeClass("qm-disabled");
};
TreeNode.prototype.addNode = function(e) {
this.treeNode.appendChild(e);
};
TreeNode.prototype.removeNode = function(e) {
this.treeNode.appendChild(e);
};
var TreeTableNode = function(bftableDom) {
this.element = bftableDom;
this.bodyDom = null;
};
//{title:xxx,children:[{key:x,value:x}]}
TreeTableNode.prototype.addtbTale = function(data, fun) {
this.bodyDom = createDOM('tbody', 'qm-group undefined');
this.element.appendChild(this.bodyDom);
var title = createDOM('tr', 'qm-group-title');
var td = createDOM('td', '');
td.setAttribute('colspan', 2);
td.innerHTML = data.text;
var icon = createDOM('i', 'qm-icon');
td.appendChild(icon);
title.appendChild(td);
icon.addEventListener("click", function(e) {
var p = e.target.parentNode;
if (p.tagName == "TD") {
p = p.parentNode.parentNode;
if (p.classList.contains("qm-collapse")) {
p.classList.remove("qm-collapse");
} else {
p.classList.add("qm-collapse");
}
}
});
this.bodyDom.appendChild(title);
data.children.forEach(e => {
var kv = e.split(',');
var c = createDOM('tr', 'qm-group-content');
if (fun)
c.innerHTML = ' <td class="qm-key">' + kv[0] + '</td>' +
'<td class="qm-value"><a onclick=' + fun + '(event)>' + kv[1] + '</td>';
else
c.innerHTML = ' <td class="qm-key">' + kv[0] + '</td>' +
'<td class="qm-value">' + kv[1] + '</td>';
this.bodyDom.appendChild(c);
});
};
export { TreeNode, TreeTableNode }