let thisWidget; //当前页面业务 function initWidgetView(_thisWidget) { thisWidget = _thisWidget; //清除所有标号 $("#btnDelete").click(function () { thisWidget.deleteEntity(); }); $("#btnCenter").click(function (e) { thisWidget.centerCurrentEntity(); }); $("#btn_plot_savefile").click(function () { let data = thisWidget.getGeoJson(); haoutil.file.downloadFile("标绘item.json", JSON.stringify(data)); }); plotEdit.initEvent(); thisWidget.startEditing(); } //属性编辑相关 var plotEdit = { hasEditSylte: true, initEvent: function () { let that = this; if (!this.hasEditSylte) { $("#attr_style_view").hide(); } //改变高度 - 高程全部设置为 $("#plot_latlngs_allheight").bind("input propertychange", function () { $("#plot_latlngs_addheight").val(""); let thisval = Number($(this).val()); //高度(米) if (isNaN(thisval)) { thisval = 1; } let latlngs = []; $(".plot_latlngs").each(function () { if ($(this).attr("data-type") == "height") { $(this).val(thisval); latlngs.push(thisval); } else { latlngs.push(Number($(this).val())); //经纬度值 } }); let arrPoint = []; for (let i = 0; i < latlngs.length; i += 3) { arrPoint.push([latlngs[i], latlngs[i + 1], latlngs[i + 2]]); } thisWidget.updatePoints2map(arrPoint); }); //改变高度 - 在地表高程偏移 $("#plot_latlngs_addheight").bind("input propertychange", function () { $("#plot_latlngs_allheight").val(""); let thisval = Number($(this).val()); //高度(米) if (isNaN(thisval)) { thisval = 1; } let latlngs = []; $(".plot_latlngs").each(function () { if ($(this).attr("data-type") == "height") { let oldval = Number($(this).attr("oldvalue")); $(this).val(oldval + thisval); latlngs.push(oldval + thisval); } else { latlngs.push(Number($(this).val())); //经纬度值 } }); let arrPoint = []; for (let i = 0; i < latlngs.length; i += 3) { arrPoint.push([latlngs[i], latlngs[i + 1], latlngs[i + 2]]); } thisWidget.updatePoints2map(arrPoint); }); }, _last_attr: null, //选中标号,激活属性面板 startEditing: function (attr, latlngs) { if (!thisWidget.attrConfig) { return; } if (attr && attr.attr) { attr = { ...attr, ...attr.attr, }; } this._last_attr = attr; let config = thisWidget.attrConfig[attr.edittype || attr.type] || {}; config.style = config.style || {}; if (latlngs) { this._hasHeight = true; if (attr.style.clampToGround) { this._hasHeight = false; } else if (attr.type == "rectangle" || attr.type == "corridor") { this._hasHeight = false; } this.updateLatlngsHtml(latlngs); } let arrFun = []; let parname, inHtml; //==============style================== if (this.hasEditSylte) { parname = "plot_attr_style_"; inHtml = `所在图层:${thisWidget.getLayerName()} 标号类型:${attr.name || config.name}`; for (let idx = 0; idx < config.style.length; idx++) { let edit = config.style[idx]; if (edit.type == "hidden") { continue; } let attrName = edit.name; let attrVal = attr.style[attrName] ?? edit.defval; attr.style[attrName] = attrVal; //贴地对象 if (attr.style["clampToGround"]) { if ( attrName == "fill" || //不能取消填充。 attrName == "height" || //没有高度 attrName == "distanceDisplayCondition" || attrName == "distanceDisplayCondition_far" || attrName == "distanceDisplayCondition_near" || attrName == "outline" || attrName == "outlineWidth" || attrName == "outlineColor" || attrName == "outlineOpacity" || attrName == "hasShadows" || attrName == "diffHeight" ) { continue; } } else { if (attrName == "zIndex") { continue; } } //三维立体对象 if (attr.style["diffHeight"] > 0) { if (attrName == "clampToGround" || attrName == "outlineWidth") { continue; } } let input = this.getAttrInput(parname, attrName, attrVal, edit); if (input.fun) { arrFun.push({ parname: parname, name: attrName, value: attrVal, edit: edit, fun: input.fun }); } inHtml += ' ' + edit.label + " " + input.html + " "; } $("#talbe_style").html(inHtml); //注记属性 if (attr.style.label) { let configLbl = thisWidget.attrConfig["label"] || {}; let defStyleLbl = thisWidget.getDefStyle("label"); //赋值默认样式 parname = "plot_attr_stylelabel_"; inHtml = ""; for (let idx = 0; idx < configLbl.style.length; idx++) { let edit = configLbl.style[idx]; if (edit.type == "hidden") { continue; } let attrName = edit.name; let attrVal = attr.style.label[attrName] ?? defStyleLbl[attrName]; attr.style.label[attrName] = attrVal; let input = this.getAttrInput(parname, attrName, attrVal, edit); if (input.fun) { arrFun.push({ parname: parname, name: attrName, value: attrVal, edit: edit, fun: input.fun }); } inHtml += ' ' + edit.label + " " + input.html + " "; } $("#talbe_stylelabel").html(inHtml); $("#attr_stylelabel_view").show(); } else { $("#attr_stylelabel_view").hide(); } } //==============attr================== parname = "plot_attr_attr_"; inHtml = ""; attr.attr = attr.attr || {}; let attrcfg = thisWidget.getAttrList(); let tempKyes = {}; for (let idx = 0; idx < attrcfg.length; idx++) { let edit = attrcfg[idx]; tempKyes[edit.name] = true; } for (var key in attr.attr) { let attrVal = attr.attr[key]; if (tempKyes[key]) { continue; } if (haoutil.isutil.isString(attrVal)) { attrcfg.push({ name: key, label: key, type: "text", defval: "" }); } else if (haoutil.isutil.isNumber(attrVal)) { attrcfg.push({ name: key, label: key, type: "number", defval: 0.0 }); } else if (typeof attrVal == "boolean") { attrcfg.push({ name: key, label: key, type: "radio", defval: false }); } } for (let idx = 0; idx < attrcfg.length; idx++) { let edit = attrcfg[idx]; if (edit.type == "hidden") { continue; } let attrName = edit.name; let attrVal = attr.attr[attrName] ?? edit.defval ?? ""; let input = this.getAttrInput(parname, attrName, attrVal, edit); if (input.fun) { arrFun.push({ parname: parname, name: attrName, value: attrVal, edit: edit, fun: input.fun }); } inHtml += ' ' + edit.label + " " + input.html + " "; } $("#talbe_attr").html(inHtml); //执行各方法 for (let idx = 0; idx < arrFun.length; idx++) { let item = arrFun[idx]; item.fun(item.parname, item.name, item.value, item.edit); } window.tab2attr(); //切换面板 }, updateLatlngsHtml: function (latlngs) { $("#plot_latlngs_addheight").val(""); $("#plot_latlngs_allheight").val(""); $("#view_updateheight").hide(); //显示坐标信息 let inHtml = ""; if (!latlngs || latlngs.length == 0) { // } else if (latlngs.length == 1) { let latlng = latlngs[0]; let jd = latlng[0]; let wd = latlng[1]; let height = latlng.length == 3 ? latlng[2] : 0; inHtml += '
' + ' ' + ''; if (this._hasHeight) { inHtml += ''; } inHtml += "
经度:
纬度:
高程:
"; } else { if (this._hasHeight) { $("#view_updateheight").show(); } let delhtml = ""; if (latlngs.length > thisWidget.getMinPointNum()) { delhtml = ''; } for (let idx = 0; idx < latlngs.length; idx++) { let latlng = latlngs[idx]; let jd = latlng[0]; let wd = latlng[1]; let height = latlng.length == 3 ? latlng[2] : 0; let addthml = ""; if (latlngs.length < thisWidget.getMaxPointNum()) { addthml = '  '; } // inHtml += '
-第' + (idx + 1) + '点 ' + addthml + delhtml + '
' + ' ' + ' '; if (this._hasHeight) { inHtml += ' '; } inHtml += "
经度:
纬度:
高程:
"; } } $("#view_latlngs").html(inHtml); $("#view_latlngs .open").click(window.changeOpenShowHide); let that = this; $("#view_latlngs .latlng-del").click(function () { $(this).parent().parent().remove(); let latlngs = []; let withHeight = false; $(".plot_latlngs").each(function () { latlngs.push(Number($(this).val())); if ($(this).attr("data-type") === "height") { withHeight = true; } }); //重新修改界面 let arr = []; if (withHeight) { for (let i = 0; i < latlngs.length; i += 3) { arr.push([latlngs[i], latlngs[i + 1], latlngs[i + 2]]); } } else { for (let i = 0; i < latlngs.length; i += 2) { arr.push([latlngs[i], latlngs[i + 1]]); } } that.updateLatlngsHtml(arr); thisWidget.updatePoints2map(arr); }); $("#view_latlngs .latlng-install").click(function () { let idx = Number($(this).attr("data-index")); let latlngs = []; let withHeight = false; $(".plot_latlngs").each(function () { latlngs.push(Number($(this).val() || 0)); if ($(this).attr("data-type") === "height") { withHeight = true; } }); //重新修改界面 let arr = []; if (withHeight) { for (let i = 0; i < latlngs.length; i += 3) { arr.push([latlngs[i], latlngs[i + 1], latlngs[i + 2]]); } } else { for (let i = 0; i < latlngs.length; i += 2) { arr.push([latlngs[i], latlngs[i + 1]]); } } let pt1 = arr[idx]; let pt2 = idx == arr.length - 1 ? arr[0] : arr[idx + 1]; let jd = Number(((pt1[0] + pt2[0]) / 2).toFixed(6)); let wd = Number(((pt1[1] + pt2[1]) / 2).toFixed(6)); if (withHeight) { let gd = Number(((pt1[2] + pt2[2]) / 2).toFixed(1)); arr.splice(idx + 1, 0, [jd, wd, gd]); } else { arr.splice(idx + 1, 0, [jd, wd]); } that.updateLatlngsHtml(arr); thisWidget.updatePoints2map(arr); }); $(".plot_latlngs").bind("input propertychange", function () { let latlngs = []; let withHeight = false; $(".plot_latlngs").each(function () { latlngs.push(Number($(this).val())); if ($(this).attr("data-type") === "height") { withHeight = true; } }); let arrPoint = []; if (withHeight) { for (let i = 0; i < latlngs.length; i += 3) { arrPoint.push([latlngs[i], latlngs[i + 1], latlngs[i + 2]]); } } else { for (let i = 0; i < latlngs.length; i += 2) { arrPoint.push([latlngs[i], latlngs[i + 1]]); } } thisWidget.updatePoints2map(arrPoint); }); }, // //单击地图空白,释放属性面板 // stopEditing: function () { // $("#talbe_style").html(''); // $("#talbe_attr").html(''); // this._last_attr = null; // }, //获取各属性的编辑html和change方法 getAttrInput: function (parname, attrName, attrVal, edit) { if (attrVal == null || attrVal == undefined) { attrVal = ""; } let that = this; let inHtml = ""; let fun = null; switch (edit.type) { default: case "label": inHtml = attrVal; break; case "text": inHtml = ''; fun = function (parname, attrName, attrVal, edit) { $("#" + parname + attrName).on("input propertychange", function (e) { let attrVal = $(this).val(); that.updateAttr(parname, attrName, attrVal); }); }; break; case "textarea": attrVal = attrVal.replace(new RegExp("
", "gm"), "\n"); inHtml = '"; fun = function (parname, attrName, attrVal, edit) { $("#" + parname + attrName).on("input propertychange", function (e) { let attrVal = $(this).val(); if (attrVal.length == 0) { attrVal = ""; } attrVal = attrVal.replace(/\n/g, "
"); that.updateAttr(parname, attrName, attrVal); }); }; break; case "number": inHtml = ''; fun = function (parname, attrName, attrVal, edit) { $("#" + parname + attrName).on("input propertychange", function (e) { let attrVal = Number($(this).val()); that.updateAttr(parname, attrName, attrVal); }); }; break; case "combobox": inHtml = '"; fun = function (parname, attrName, attrVal, edit) { $("#" + parname + attrName).select(); //绑定样式 $("#" + parname + attrName).change(function () { let attrVal = $(this).attr("data-value"); that.updateAttr(parname, attrName, attrVal); let thisSel; for (let jj = 0; jj < edit.data.length; jj++) { let temp = edit.data[jj]; if (temp.impact == null) { continue; } if (temp.value === attrVal) { thisSel = temp; continue; } that.changeViewByAttr(parname, temp.impact, false); } if (thisSel) { that.changeViewByAttr(parname, thisSel.impact, true); } }); let thisSel; for (let jj = 0; jj < edit.data.length; jj++) { let temp = edit.data[jj]; if (temp.impact == null) { continue; } if (temp.value === attrVal) { thisSel = temp; continue; } that.changeViewByAttr(parname, temp.impact, false); } if (thisSel) { that.changeViewByAttr(parname, thisSel.impact, true); } }; break; case "radio": { let _name_key = parname + attrName; inHtml = `
`; fun = function (parname, attrName, attrVal, edit) { $('input:radio[name="' + parname + attrName + '"]').change(function () { let attrVal = $(this).val() == "1"; let isOK = that.updateAttr(parname, attrName, attrVal); if (isOK) { that.changeViewByAttr(parname, edit.impact, attrVal); } }); that.changeViewByAttr(parname, edit.impact, attrVal); }; } break; case "color": inHtml = ''; fun = function (parname, attrName, attrVal, edit) { $("#" + parname + attrName).minicolors({ position: "bottom right", control: "saturation", change: function (hex, opacity) { that.updateAttr(parname, attrName, hex); }, }); }; break; case "slider": inHtml = ''; fun = function (parname, attrName, attrVal, edit) { let _width = $(".mp_tab_card").width() * 0.7 - 30; $("#" + parname + attrName).progress(_width); //绑定样式 $("#" + parname + attrName).change(function () { let attrVal = Number($(this).val()) / 100; that.updateAttr(parname, attrName, attrVal); }); }; break; case "window": inHtml = ''; fun = function (parname, attrName, attrVal, edit) { $("#" + parname + attrName).on("click", function (e) { thisWidget.showEditAttrWindow({ data: that._last_attr, parname: parname, attrName: attrName, attrVal: attrVal, }); }); $("#" + parname + attrName).on("input propertychange", function (e) { let attrVal = $(this).val(); that.updateAttr(parname, attrName, attrVal); }); }; break; } return { html: inHtml, fun: fun }; }, //联动属性控制 changeViewByAttr: function (parname, arrimpact, show) { if (arrimpact && arrimpact.length > 0) { for (let jj = 0; jj < arrimpact.length; jj++) { let attrName = arrimpact[jj]; if (show) { $("#" + parname + "tr_" + attrName).show(); } else { $("#" + parname + "tr_" + attrName).hide(); } } } }, //属性面板值修改后触发此方法 updateAttr: function (parname, attrName, attrVal) { let newAttr = {}; switch (parname) { default: break; case "plot_attr_style_": { newAttr.style = {}; newAttr.style[attrName] = attrVal; this._last_attr.style[attrName] = attrVal; let type = this._last_attr.type; if ( (attrName == "fill" || attrName == "outline") && attrVal === false && (type == "plane" || type == "circle" || type == "ellipse" || type == "cylinder" || type == "ellipsoid" || type == "box" || type == "polylineVolume" || type == "wall" || type == "corridor" || type == "rectangle" || type == "polygon" ) ) { if (!this._last_attr.style["fill"] && !this._last_attr.style["outline"]) { this._last_attr.style[attrName] = true; $("input[name='" + parname + attrName + "']:eq(0)").attr("checked", "checked"); $("input[name='" + parname + attrName + "']:eq(0)").click(); haoutil.msg("填充和边框不能同时为否,需要至少开启一个!"); return false; } } break; } case "plot_attr_stylelabel_": this._last_attr.style.label = this._last_attr.style.label || {}; this._last_attr.style.label[attrName] = attrVal; newAttr.style = { label: {} }; newAttr.style.label[attrName] = attrVal; break; case "plot_attr_attr_": this._last_attr.attr[attrName] = attrVal; //this.startEditing(this._last_attr); newAttr.attr = {}; newAttr.attr[attrName] = attrVal; break; } thisWidget.updateAttr2map(newAttr); return true; }, };