BIM引入
|
@ -210,6 +210,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<script type="module" src="/src/main.js"></script>
|
<script type="module" src="/src/main.js"></script>
|
||||||
|
<script src="/qmodel/qmodel.js"></script>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 671 B |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 774 B |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 943 B |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 861 B |
After Width: | Height: | Size: 937 B |
After Width: | Height: | Size: 931 B |
After Width: | Height: | Size: 4.5 KiB |
After Width: | Height: | Size: 426 B |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 933 B |
|
@ -0,0 +1,13 @@
|
||||||
|
var QmodelOption = function() {
|
||||||
|
this.API_URL = 'http://www.qmodel.cn:4566/api';
|
||||||
|
this.FILE_SERVE_URL = 'http://www.qmodel.cn:9107/resourceHandle/file/downloadByPath';
|
||||||
|
this.FILE_SERVE_URL_UP = 'http://www.qmodel.cn:9107/resourceHandle/ng/upload?path=';
|
||||||
|
this.FILE_SERVE_URL2 = 'http://www.qmodel.cn/file';
|
||||||
|
this.DemoUser = '15502911230';
|
||||||
|
this.DemoPwd = 'qm123321';
|
||||||
|
// this.DemoUser = '20191205';
|
||||||
|
// this.DemoPwd = '20191205';
|
||||||
|
this.DefaultToken = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
export { QmodelOption }
|
|
@ -0,0 +1,439 @@
|
||||||
|
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 }
|
|
@ -0,0 +1,196 @@
|
||||||
|
var ContextMenuCreater = function(context) {
|
||||||
|
this.context = context;
|
||||||
|
if (context) {
|
||||||
|
this.ul = context.children[0];
|
||||||
|
this.ul.innerHTML = '';
|
||||||
|
}
|
||||||
|
this.enableMenu = true;
|
||||||
|
}
|
||||||
|
ContextMenuCreater.prototype.hide = function() {
|
||||||
|
if (!this.ul) return;
|
||||||
|
this.context.style.display = "none";
|
||||||
|
}
|
||||||
|
ContextMenuCreater.prototype.prepareMenu = function() {
|
||||||
|
if (!this.ul) return;
|
||||||
|
var selected = qmodel.get_selection_ids().length > 0;
|
||||||
|
for (var i = 0; i < this.ul.children.length; i++) {
|
||||||
|
var li = this.ul.children[i];
|
||||||
|
if (li.getAttribute("needselected") == 'true') {
|
||||||
|
li.style.display = selected ? "block" : "none";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ContextMenuCreater.prototype.createMenuItem = function(tagName, needselected, bindEvent) {
|
||||||
|
if (!this.ul) return;
|
||||||
|
var li = document.createElement('li');
|
||||||
|
li.setAttribute("needselected", needselected);
|
||||||
|
|
||||||
|
this.ul.append(li);
|
||||||
|
var a = document.createElement('a');
|
||||||
|
a.innerHTML = tagName;
|
||||||
|
li.append(a);
|
||||||
|
a.onclick = bindEvent;
|
||||||
|
};
|
||||||
|
ContextMenuCreater.prototype.bindIframeEvent = function(eventName) {
|
||||||
|
window.parent.postMessage({
|
||||||
|
cmd: eventName,
|
||||||
|
}, '*');
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
ContextMenuCreater.prototype.createMenu = function() {
|
||||||
|
let _this = this;
|
||||||
|
if (!this.ul) return;
|
||||||
|
this.createMenuItem('隐藏选中构件', true, function() {
|
||||||
|
var ids = qmodel.get_selection_ids();
|
||||||
|
console.log('当前选择的构件Id:' + ids);
|
||||||
|
qmodel.set_comps_visiblity(ids, false);
|
||||||
|
_this.hide();
|
||||||
|
});
|
||||||
|
|
||||||
|
this.createMenuItem('半透明选中构件', true, function() {
|
||||||
|
var ids = qmodel.get_selection_ids();
|
||||||
|
console.log('当前选择的构件Id:' + ids);
|
||||||
|
qmodel.set_comps_transparency(ids, 0.5);
|
||||||
|
_this.hide();
|
||||||
|
});
|
||||||
|
|
||||||
|
this.createMenuItem('冻结选中构件', true, function() {
|
||||||
|
var ids = qmodel.get_selection_ids();
|
||||||
|
console.log('当前选择的构件Id:' + ids);
|
||||||
|
qmodel.set_comps_transparency(ids, 0.5, null, true);
|
||||||
|
_this.hide();
|
||||||
|
});
|
||||||
|
|
||||||
|
this.createMenuItem('隔离选中构件(隐藏其他)', true, function() {
|
||||||
|
var ids = qmodel.get_selection_ids();
|
||||||
|
qmodel.set_all_comps_visiblity(false, false);
|
||||||
|
qmodel.set_comps_visiblity(ids, true);
|
||||||
|
qmodel.set_comps_selected(ids);
|
||||||
|
_this.hide();
|
||||||
|
});
|
||||||
|
|
||||||
|
this.createMenuItem('隔离选中构件(冻结其他)', true, function() {
|
||||||
|
var ids = qmodel.get_selection_ids();
|
||||||
|
|
||||||
|
qmodel.set_all_comps_transparency(0.5, true, false);
|
||||||
|
|
||||||
|
qmodel.set_comps_transparency(ids, 1);
|
||||||
|
|
||||||
|
// qmodel.set_comps_transparency(ids, 1);
|
||||||
|
|
||||||
|
_this.hide();
|
||||||
|
});
|
||||||
|
|
||||||
|
this.createMenuItem('显示所有构件', false, function() {
|
||||||
|
qmodel.set_all_comps_transparency(1, false, false);
|
||||||
|
qmodel.set_all_comps_visiblity(true, false);
|
||||||
|
_this.hide();
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
this.createMenuItem('聚焦选中构件', true, function() {
|
||||||
|
var ids = qmodel.get_selection_ids();
|
||||||
|
qmodel.lookat_comp(ids[0]);
|
||||||
|
_this.hide();
|
||||||
|
});
|
||||||
|
|
||||||
|
this.createMenuItem('父级窗口事件', true, function() {
|
||||||
|
_this.bindIframeEvent("showVueDiaglog");
|
||||||
|
_this.hide();
|
||||||
|
});
|
||||||
|
|
||||||
|
this.createMenuItem('设备编辑', true, function() {
|
||||||
|
var a = document.getElementById("property-extmodel-dialog");
|
||||||
|
a.style.display = "block";
|
||||||
|
qmodel.debugSetQmTransformOpen(true);
|
||||||
|
var updateExtModelInfo = function() {
|
||||||
|
var tf = qmodel.get_model_transform();
|
||||||
|
if (tf) {
|
||||||
|
document.getElementById("ext-v1").value = tf.x;
|
||||||
|
document.getElementById("ext-v2").value = tf.y;
|
||||||
|
document.getElementById("ext-v3").value = tf.z;
|
||||||
|
document.getElementById("ext-v4").value = tf.anglez;
|
||||||
|
document.getElementById("ext-v5").value = tf.angley;
|
||||||
|
document.getElementById("ext-v6").value = tf.anglex;
|
||||||
|
} else {
|
||||||
|
console.log('未选择设备');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
qmodel.set_ext_model_update_callback(updateExtModelInfo);
|
||||||
|
a.style.left = (document.body.clientWidth / 2 - 150).toString() + 'px';
|
||||||
|
var tf = qmodel.get_model_transform();
|
||||||
|
if (tf) {
|
||||||
|
document.getElementById("ext-v1").value = tf.x;
|
||||||
|
document.getElementById("ext-v2").value = tf.y;
|
||||||
|
document.getElementById("ext-v3").value = tf.z;
|
||||||
|
document.getElementById("ext-v4").value = tf.anglez;
|
||||||
|
document.getElementById("ext-v5").value = tf.angley;
|
||||||
|
document.getElementById("ext-v6").value = tf.anglex;
|
||||||
|
} else {
|
||||||
|
alert("请选择一个设备");
|
||||||
|
}
|
||||||
|
_this.hide();
|
||||||
|
});
|
||||||
|
|
||||||
|
return; //后面的 debug 用户自行选用
|
||||||
|
|
||||||
|
this.createMenuItem('设置选中构件颜色', true, function() {
|
||||||
|
var ids = qmodel.get_selection_ids();
|
||||||
|
console.log('当前选择的构件Id:' + ids);
|
||||||
|
qmodel.set_comps_color(ids, 0xff0000);
|
||||||
|
_this.hide();
|
||||||
|
//如果要还原颜色,颜色传入null,qmodel.setCompsColor(ids, null);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
this.createMenuItem('获取相机', false, function() {
|
||||||
|
_this.testJson = qmodel.get_camera_json();
|
||||||
|
console.log(_this.testJson);
|
||||||
|
alert(_this.testJson);
|
||||||
|
_this.hide();
|
||||||
|
});
|
||||||
|
this.createMenuItem('恢复相机', false, function() {
|
||||||
|
var json = _this.testJson;
|
||||||
|
if (!json) {
|
||||||
|
alert('您可以先点击获取相机,我会把相机序列化为JSON缓存下来用于测试。');
|
||||||
|
}
|
||||||
|
qmodel.set_camera_json(json);
|
||||||
|
_this.hide();
|
||||||
|
});
|
||||||
|
this.createMenuItem('获取标记', false, function() {
|
||||||
|
_this.testJson2 = qmodel.get_all_marks();
|
||||||
|
console.log(_this.testJson2);
|
||||||
|
alert(_this.testJson2);
|
||||||
|
_this.hide();
|
||||||
|
});
|
||||||
|
this.createMenuItem('移除标记', false, function() {
|
||||||
|
qmodel.remove_all_marks();
|
||||||
|
_this.hide();
|
||||||
|
});
|
||||||
|
this.createMenuItem('恢复标记', false, function() {
|
||||||
|
var json = _this.testJson2;
|
||||||
|
if (!json) {
|
||||||
|
alert('您可以先点击得到标记,我会把标记序列化为JSON缓存下来用于测试。');
|
||||||
|
}
|
||||||
|
qmodel.reset_marks(json);
|
||||||
|
_this.hide();
|
||||||
|
});
|
||||||
|
|
||||||
|
this.createMenuItem('设备删除', true, function() {
|
||||||
|
qmodel.delete_ext_model(null).then(e => {
|
||||||
|
console.log("删除完成,id:", e);
|
||||||
|
}).catch(e => {
|
||||||
|
alert(e);
|
||||||
|
});
|
||||||
|
_this.hide();
|
||||||
|
});
|
||||||
|
this.createMenuItem('打开材质库', false, function() {
|
||||||
|
document.getElementById("property-material").style.display = "block";
|
||||||
|
qmodel.show_materials();
|
||||||
|
_this.hide();
|
||||||
|
});
|
||||||
|
|
||||||
|
};
|
||||||
|
export { ContextMenuCreater }
|
|
@ -0,0 +1,83 @@
|
||||||
|
var LanguageEnum = {
|
||||||
|
Chinese: 1,
|
||||||
|
English: 2,
|
||||||
|
}
|
||||||
|
var Language = function(languageEnum) {
|
||||||
|
var lan = languageEnum ? languageEnum : 1;
|
||||||
|
if (lan == LanguageEnum.English) {
|
||||||
|
this.TREENODE_ROOT = "root";
|
||||||
|
this.ORDERCODE = "roder";
|
||||||
|
this.LENGTH = "length";
|
||||||
|
this.TIP_MOUSE_ZOOM_OPEN = "auto zoom open";
|
||||||
|
this.TIP_MOUSE_ZOOM_CLOSE = "auto zoom close";
|
||||||
|
this.TIP_MOUSE_LOCK_OPEN = "target on mouse";
|
||||||
|
this.TIP_MOUSE_LOCK_CLOSE = "target on center";
|
||||||
|
this.TIP_ENABLEDAMPING = "damping enable";
|
||||||
|
this.TIP_DISABLEDAMPING = "damping disable";
|
||||||
|
this.TIP_ALLOW_ROTATE = "allow rotate";
|
||||||
|
this.TIP_NOT_ALLOW_ROTATE = "not rotate";
|
||||||
|
this.CSS3D_MARK_DEMO = 'hello' + '<br>' + 'world';
|
||||||
|
this.MACHINE_NAME = "machine name";
|
||||||
|
this.OPERATE = "operate";
|
||||||
|
this.QRCODE = "QRCODE";
|
||||||
|
this.VIEW_NAME = "view name";
|
||||||
|
this.TASK_NAME = 'task name';
|
||||||
|
this.FINISH_DATE = 'finish date';
|
||||||
|
this.ALERT_SELECT = "select one,please";
|
||||||
|
this.DOFINISH = "finish";
|
||||||
|
this.HIT_OPEN = "collision open";
|
||||||
|
this.HIT_CLOSE = "collision close";
|
||||||
|
this.INIT_MATERIAL = "materials loading...";
|
||||||
|
this.LOADING = "geometry loading...";
|
||||||
|
this.DOWNLOADING = "downloading...";
|
||||||
|
this.FIRSTTIME_PARSE = "parse for the first time...";
|
||||||
|
this.FIRSTTIME_DOWNLOAD = "downloading for the first time...";
|
||||||
|
this.PARSING = "parsing...";
|
||||||
|
this.STRUCTURE_TREE = "structure tree";
|
||||||
|
this.MODEL_NOT_PREPARED = "model is not preared,please wait a moment";
|
||||||
|
this.FACES_TOP = "TOP";
|
||||||
|
this.FACES_FRONT = "FRONT";
|
||||||
|
this.FACES_RIGHT = "RIGHT";
|
||||||
|
this.FACES_LEFT = "LEFT";
|
||||||
|
this.FACES_BACK = "BACK";
|
||||||
|
this.FACES_BOTTOM = "BOTTOM";
|
||||||
|
} else {
|
||||||
|
this.TREENODE_ROOT = "全部";
|
||||||
|
this.ORDERCODE = "序号";
|
||||||
|
this.LENGTH = "长度";
|
||||||
|
this.TIP_MOUSE_ZOOM_OPEN = "打开鼠标点击自动对焦";
|
||||||
|
this.TIP_MOUSE_ZOOM_CLOSE = "关闭鼠标点击自动对焦";
|
||||||
|
this.TIP_MOUSE_LOCK_OPEN = "已开启鼠标锚定";
|
||||||
|
this.TIP_MOUSE_LOCK_CLOSE = "已关闭鼠标锚定";
|
||||||
|
this.TIP_ENABLEDAMPING = "已开启阻尼动效";
|
||||||
|
this.TIP_DISABLEDAMPING = "已关闭阻尼动效";
|
||||||
|
this.TIP_ALLOW_ROTATE = "允许旋转";
|
||||||
|
this.TIP_NOT_ALLOW_ROTATE = "禁止旋转";
|
||||||
|
this.CSS3D_MARK_DEMO = '您好' + '<br>' + '世界';
|
||||||
|
this.MACHINE_NAME = "设备名称";
|
||||||
|
this.OPERATE = "操作";
|
||||||
|
this.QRCODE = "二维码";
|
||||||
|
this.VIEW_NAME = "视图名称";
|
||||||
|
this.TASK_NAME = '计划名称';
|
||||||
|
this.FINISH_DATE = '完成日期';
|
||||||
|
this.ALERT_SELECT = "请选择构件";
|
||||||
|
this.DOFINISH = "操作完成";
|
||||||
|
this.HIT_OPEN = "已开启碰撞";
|
||||||
|
this.HIT_CLOSE = "已关闭碰撞";
|
||||||
|
this.LOADING = "加载中...";
|
||||||
|
this.INIT_MATERIAL = "材质加载中...";
|
||||||
|
this.DOWNLOADING = "下载中...";
|
||||||
|
this.FIRSTTIME_PARSE = "首次下载解析...";
|
||||||
|
this.FIRSTTIME_DOWNLOAD = "首次打开下载中...";
|
||||||
|
this.PARSING = "解析中...";
|
||||||
|
this.STRUCTURE_TREE = "构件树";
|
||||||
|
this.MODEL_NOT_PREPARED = "服务器正在发布模型。请稍后再试。";
|
||||||
|
this.FACES_TOP = "上";
|
||||||
|
this.FACES_FRONT = "南";
|
||||||
|
this.FACES_RIGHT = "东";
|
||||||
|
this.FACES_LEFT = "西";
|
||||||
|
this.FACES_BACK = "北";
|
||||||
|
this.FACES_BOTTOM = "下";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export { LanguageEnum, Language }
|
|
@ -0,0 +1,63 @@
|
||||||
|
var qmodelSceneOption = {
|
||||||
|
//以下参数管理初始化界面
|
||||||
|
opToolbar: false, //显示工具栏
|
||||||
|
opModelSelect: false, //显示模型选择按钮
|
||||||
|
opTree: false, //显示模型目录树按钮
|
||||||
|
opProperty: true, //显示工具栏的查看构件属性按钮
|
||||||
|
opHome: true, //显示工具栏的恢复默认视角
|
||||||
|
opRectSelect: true, //显示工具栏的框选
|
||||||
|
opMeasure: true, //显示工具栏的测量
|
||||||
|
opClip: true, //显示工具栏的剖切
|
||||||
|
opWalk: true, //显示工具栏的漫游
|
||||||
|
opMap: true, //显示工具栏的小地图,有点问题,暂时屏蔽
|
||||||
|
opMark: true, //显示工具栏的标记
|
||||||
|
opMark2D: true, //显示工具栏的2D标记
|
||||||
|
opMark3D: true, //显示工具栏的3D标记
|
||||||
|
opViewpoint: true, //显示工具栏的视口管理
|
||||||
|
opMaterialSet: true, //显示工具栏的材质替换
|
||||||
|
opInfo: true, //显示工具栏的模型信息
|
||||||
|
opSetting: true, //显示工具栏的设置
|
||||||
|
showTree: false, //默认显示目录树子窗口
|
||||||
|
showCube: false, //默认显示视角盒子
|
||||||
|
showPty: false, //是否默认显示属性子窗口
|
||||||
|
showqrcode: false, //显示默认二维码
|
||||||
|
//以下是默认的环境设置参数
|
||||||
|
version: 2,
|
||||||
|
color: '-1', //背景色。RGB,格式举例:'#404048',也可以输入-1,默认渐变色
|
||||||
|
openLog: true, //是否允许qmodel插件在控制台输出调试日志.不想要日志可以关掉。但是在写脚本时,有日志会更加好用。
|
||||||
|
autotransp: false, //全部透明,白模效果
|
||||||
|
transpvalue: 0.6, //全部透明度
|
||||||
|
shininess: 80, //反光材质的反光度
|
||||||
|
openPone: false, //显示反光材质
|
||||||
|
showShadow: false, //显示阴影
|
||||||
|
skybox: 0, //显示天空盒。0=没有效果。1=大海,2=沙漠,3=天空,4=平原。可以替换page文件夹里面的素材,文件夹格式为:skybox_x,x为数字。GIS模式请设置为0
|
||||||
|
lightlevel: 0.5, //亮度
|
||||||
|
opendrlight: true, //打开直射光
|
||||||
|
lightdrlevel: 0.7, //直射光亮度
|
||||||
|
contrast: 6, //对比度
|
||||||
|
lookSpeed: 0.3, //漫游相机旋转速度
|
||||||
|
movementSpeed: 70, //漫游前进速度
|
||||||
|
transparentBg: false, //背景透明
|
||||||
|
bgImg: "5.jpg", //如果背景透明,呈现哪张图片
|
||||||
|
//以下参数管理初始化设置
|
||||||
|
setWalk: false, //初始化完成后,直接进度漫游
|
||||||
|
clickCenter: true, //点击模型时,自动lookat焦点击位置,并移到屏幕中心。
|
||||||
|
loadDefaultviews: true, //在加载模型完成后,自动定位到封面视角
|
||||||
|
materialOffer: false, //材质的偏移因子。开启后可以一定程度消除偏移,反复刷新模型可能会造成叠面闪烁。
|
||||||
|
randerType: 0, //真实模式或着色模式(暂不支持)
|
||||||
|
offtype: 2, //=1使用高深度。=2使用材质偏移。可用于调优模型闪烁的情况。
|
||||||
|
keepRender: false, //持续渲染。目前在测试,使用旋转动画时必须开启。
|
||||||
|
openBloom: false, //开Bloom泛光,keepRender必须要开。与skybox冲突,打开后将会关闭掉天空盒,效率降低。
|
||||||
|
autoZoom: false, //点击时,自动缩放到合适的位置
|
||||||
|
zoomLock: false, //在室外,鼠标缩放时,以鼠标中心为锚点。会消耗算力,模型过大时会增加延迟
|
||||||
|
markCulling: true, //标记如果被遮挡,会从视野中剔除。
|
||||||
|
selectedEdge: true, //选中的时候显示透视效果
|
||||||
|
modelLod: false, //会创建一个模型盒子。用盒子替换模型提升效率。 debugger
|
||||||
|
modelAutoClear: false, //当显示 盒子的时候,会强行释放掉模型的几何信息,直接下次加载,重新载入回来。//debugger error
|
||||||
|
showExt: true, //显示设备编辑
|
||||||
|
selectOnTop: true, //选中的构件是否在顶层显示。别选太多,选多了效率低。
|
||||||
|
mergeInstance: 2, //请根据每个模型的特性去调优。值越大,内存消耗越大,但是合批越多,带来性能上的提升。不建议超过100。
|
||||||
|
rayByOctree: false, //通过八叉树进行模型检测碰撞。小模型没关系,大模型的点击选中有一点提升。(bug1:合并后的构件,拆解后没有重置树。0607.rvt)
|
||||||
|
enableMenu: true, //启用右键菜单。如果您不想用自带的右键菜单,而要自己实现,可以关闭此项。
|
||||||
|
};
|
||||||
|
export { qmodelSceneOption }
|
|
@ -47,6 +47,11 @@ export const constantRoutes = [
|
||||||
component: () => import('@/views/register'),
|
component: () => import('@/views/register'),
|
||||||
hidden: true
|
hidden: true
|
||||||
},
|
},
|
||||||
|
{// 测试新增
|
||||||
|
path: '/bimHome',
|
||||||
|
component: () => import('@/views/bim/home/index'),
|
||||||
|
hidden: true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
path: "/:pathMatch(.*)*",
|
path: "/:pathMatch(.*)*",
|
||||||
component: () => import('@/views/error/404'),
|
component: () => import('@/views/error/404'),
|
||||||
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
<template>
|
||||||
|
<div class="app-container">
|
||||||
|
<div id="qmviewer_container">
|
||||||
|
<qmviewer
|
||||||
|
v-bind:modelName="modelName"
|
||||||
|
v-bind:isCompont="isCompont"
|
||||||
|
@callFather_loaded="callFather_loaded"
|
||||||
|
></qmviewer>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script setup name="bimHome">
|
||||||
|
import Qmviewer from "@/components/Qmviewer";
|
||||||
|
const data = reactive({
|
||||||
|
viewerDemo: null,
|
||||||
|
isLocal: true, // 本地为true
|
||||||
|
//你需要打开的模型名称放这里。
|
||||||
|
modelName: "static/gltf/01/revit2018-1.gltf", // 测试模型
|
||||||
|
// modelName: "static/gltf/bw/jz.gltf",
|
||||||
|
isCompont: true,
|
||||||
|
qmodel_container: null,
|
||||||
|
});
|
||||||
|
|
||||||
|
const { isLocal, modelName, isCompont, viewerDemo } = toRefs(data);
|
||||||
|
|
||||||
|
const callFather_loaded = (parm) => {
|
||||||
|
viewerDemo.value = parm;
|
||||||
|
console.log("组件Demo", viewerDemo.value);
|
||||||
|
// 模型点击事件
|
||||||
|
qmodel.set_select_callback(function (id) {
|
||||||
|
var cmps = JSON.parse(id);
|
||||||
|
console.log(cmps);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
<style lang='scss' scoped>
|
||||||
|
#qmviewer_container {
|
||||||
|
height: 900px;
|
||||||
|
background: #f8f8f9;
|
||||||
|
}
|
||||||
|
</style>
|
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 671 B |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 774 B |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 943 B |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 861 B |
After Width: | Height: | Size: 937 B |
After Width: | Height: | Size: 931 B |
After Width: | Height: | Size: 4.5 KiB |
After Width: | Height: | Size: 426 B |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 933 B |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 19 KiB |
After Width: | Height: | Size: 31 MiB |
After Width: | Height: | Size: 37 KiB |
After Width: | Height: | Size: 86 KiB |
|
@ -0,0 +1 @@
|
||||||
|
167594419801656|0
|
After Width: | Height: | Size: 43 KiB |
After Width: | Height: | Size: 30 KiB |
After Width: | Height: | Size: 433 KiB |
After Width: | Height: | Size: 284 KiB |
After Width: | Height: | Size: 322 KiB |
After Width: | Height: | Size: 209 KiB |
After Width: | Height: | Size: 177 KiB |
After Width: | Height: | Size: 288 KiB |
After Width: | Height: | Size: 389 KiB |
After Width: | Height: | Size: 500 KiB |
After Width: | Height: | Size: 4.2 KiB |
After Width: | Height: | Size: 77 KiB |
After Width: | Height: | Size: 656 KiB |
After Width: | Height: | Size: 223 KiB |
After Width: | Height: | Size: 744 KiB |
After Width: | Height: | Size: 629 KiB |
After Width: | Height: | Size: 641 KiB |
After Width: | Height: | Size: 662 KiB |
After Width: | Height: | Size: 89 KiB |
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 89 KiB |
After Width: | Height: | Size: 93 KiB |
After Width: | Height: | Size: 119 KiB |
After Width: | Height: | Size: 78 KiB |
After Width: | Height: | Size: 1.1 MiB |
After Width: | Height: | Size: 182 KiB |
After Width: | Height: | Size: 1.5 MiB |
After Width: | Height: | Size: 1.0 MiB |
After Width: | Height: | Size: 1.7 MiB |
After Width: | Height: | Size: 383 KiB |
After Width: | Height: | Size: 92 KiB |
After Width: | Height: | Size: 118 KiB |
After Width: | Height: | Size: 164 KiB |
After Width: | Height: | Size: 146 KiB |
After Width: | Height: | Size: 74 KiB |
After Width: | Height: | Size: 168 KiB |