Files
Migu2.0/MiGu.Server/wwwroot/assets/MapEditorView-BeHcrkSz.js
T

2 lines
77 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import{aN as Ae,aG as U,aK as a,r as He,c8 as l,I as wa,aD as r,ag as ut,bs as V,aJ as v,K as ka,J as ha,bL as T,ak as Ne,a3 as xa,ai as de,bE as we,aE as ee,bk as Se,aF as H,c7 as fe,ac as Sa,bC as N,a9 as _a,Q as dt,bS as D,b5 as _t,bc as rt,Z as Va,R as ct,E as pt,N as Tt,O as Et,S as It,z as zt,a8 as Pt,aa as mt,ab as ft,ay as ne,ad as Mt,a4 as Ca,bA as Je,F as Ut,ah as $a,bT as Aa,a1 as Lt,a0 as Bt,x as Na,T as Dt,y as Fa,bX as yt,X as A,bo as Rt,bl as jt,aI as Ta,bj as Ea,bp as Ot,bV as Ia,br as za,bW as Pa,Y as K}from"./index-D5GfLbIx.js";/* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{W as Ma}from"./Workspace3D-B9mv4VWE.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{h as Re,a as je,r as J,n as Ua}from"./reflection-BwOBPyb9.js";/* empty css *//* empty css *//* empty css *//* empty css */import{m as j,a as st,b as it}from"./mapEdit-BXIATxCI.js";import{u as La,r as Vt,a as Ba,p as Da}from"./projectSaveFlow-BOHSv3Vc.js";import"./useProjectionStream-ayb6RvWW.js";const Ra={class:"edit-top-bar"},ja=Ae({__name:"EditTopBar",props:{canUndo:{type:Boolean},canRedo:{type:Boolean},saving:{type:Boolean},viewFilter:{}},emits:["cmd"],setup(o,{emit:F}){const w=F;function y(_){w("cmd",_)}function h(_){return _?"☑":"☐"}return(_,i)=>{const k=He,u=ha,z=ka,$=wa,p=ut;return V(),U("div",Ra,[a(k,{type:"primary",class:"topbar-save-btn",loading:o.saving,onClick:i[0]||(i[0]=m=>y("project.save"))},{default:l(()=>[...i[3]||(i[3]=[v(" 保存 ",-1)])]),_:1},8,["loading"]),a($,{trigger:"click",onCommand:y},{dropdown:l(()=>[a(z,null,{default:l(()=>[a(u,{command:"file.import.dwg"},{default:l(()=>[...i[5]||(i[5]=[v("导入 .dwg/.dxf",-1)])]),_:1}),a(u,{command:"file.import.geojson"},{default:l(()=>[...i[6]||(i[6]=[v("导入 .geojson",-1)])]),_:1}),a(u,{command:"file.upload.image",divided:""},{default:l(()=>[...i[7]||(i[7]=[v("导入图片",-1)])]),_:1}),a(u,{command:"file.upload.model"},{default:l(()=>[...i[8]||(i[8]=[v("导入 CycleGUI 模型",-1)])]),_:1}),a(u,{command:"file.export.png",divided:""},{default:l(()=>[...i[9]||(i[9]=[v("导出 PNG",-1)])]),_:1}),a(u,{command:"file.export.svg"},{default:l(()=>[...i[10]||(i[10]=[v("导出 SVG",-1)])]),_:1}),a(u,{command:"file.export.json"},{default:l(()=>[...i[11]||(i[11]=[v("导出 JSON",-1)])]),_:1})]),_:1})]),default:l(()=>[a(k,{text:"",class:"topbar-btn"},{default:l(()=>[...i[4]||(i[4]=[v("导入",-1)])]),_:1})]),_:1}),a($,{trigger:"click",onCommand:y},{dropdown:l(()=>[a(z,null,{default:l(()=>[a(u,{command:"edit.cut"},{default:l(()=>[...i[13]||(i[13]=[v("剪切 (Ctrl+X)",-1)])]),_:1}),a(u,{command:"edit.copy"},{default:l(()=>[...i[14]||(i[14]=[v("复制 (Ctrl+C)",-1)])]),_:1}),a(u,{command:"edit.paste"},{default:l(()=>[...i[15]||(i[15]=[v("粘贴 (Ctrl+V)",-1)])]),_:1}),a(u,{command:"edit.delete"},{default:l(()=>[...i[16]||(i[16]=[v("删除 (Del)",-1)])]),_:1}),a(u,{command:"edit.selectAll",divided:""},{default:l(()=>[...i[17]||(i[17]=[v("全选",-1)])]),_:1}),a(u,{command:"edit.invert"},{default:l(()=>[...i[18]||(i[18]=[v("反选",-1)])]),_:1})]),_:1})]),default:l(()=>[a(k,{text:"",class:"topbar-btn"},{default:l(()=>[...i[12]||(i[12]=[v("编辑",-1)])]),_:1})]),_:1}),a($,{trigger:"click",onCommand:y},{dropdown:l(()=>[a(z,null,{default:l(()=>[a(u,{command:"edit.undo",disabled:!o.canUndo},{default:l(()=>[...i[20]||(i[20]=[v("撤销 (Ctrl+Z)",-1)])]),_:1},8,["disabled"]),a(u,{command:"edit.redo",disabled:!o.canRedo},{default:l(()=>[...i[21]||(i[21]=[v("重做 (Ctrl+Y)",-1)])]),_:1},8,["disabled"])]),_:1})]),default:l(()=>[a(k,{text:"",class:"topbar-btn"},{default:l(()=>[...i[19]||(i[19]=[v("撤销",-1)])]),_:1})]),_:1}),a($,{trigger:"click",onCommand:y},{dropdown:l(()=>[a(z,null,{default:l(()=>[a(u,{command:"view.fitAll"},{default:l(()=>[...i[23]||(i[23]=[v("缩放至全屏",-1)])]),_:1}),a(u,{command:"view.fitSelection"},{default:l(()=>[...i[24]||(i[24]=[v("缩放至选中",-1)])]),_:1}),a(u,{command:"view.toggleGrid",divided:""},{default:l(()=>[...i[25]||(i[25]=[v("显示网格",-1)])]),_:1}),a(u,{command:"view.toggleScale"},{default:l(()=>[...i[26]||(i[26]=[v("显示比例尺",-1)])]),_:1}),a(u,{command:"view.toggle2D"},{default:l(()=>[...i[27]||(i[27]=[v("切换 2D / 3D",-1)])]),_:1})]),_:1})]),default:l(()=>[a(k,{text:"",class:"topbar-btn"},{default:l(()=>[...i[22]||(i[22]=[v("视图",-1)])]),_:1})]),_:1}),a($,{trigger:"click",onCommand:y},{dropdown:l(()=>[a(z,null,{default:l(()=>[a(u,{command:"layer.new"},{default:l(()=>[...i[29]||(i[29]=[v("新建图层…",-1)])]),_:1}),a(u,{command:"layer.toggleVisibility"},{default:l(()=>[...i[30]||(i[30]=[v("切换显示图层…",-1)])]),_:1})]),_:1})]),default:l(()=>[a(k,{text:"",class:"topbar-btn"},{default:l(()=>[...i[28]||(i[28]=[v("图层",-1)])]),_:1})]),_:1}),a($,{trigger:"click",onCommand:y},{dropdown:l(()=>[a(z,{class:"topbar-filter-menu"},{default:l(()=>[a(u,{disabled:"",class:"topbar-filter-header"},{default:l(()=>[...i[32]||(i[32]=[v("选择(可拾取)",-1)])]),_:1}),a(u,{command:"view.select.sites"},{default:l(()=>[v(T(h(o.viewFilter.selectFilter.sites))+" 站点",1)]),_:1}),a(u,{command:"view.select.tracks"},{default:l(()=>[v(T(h(o.viewFilter.selectFilter.tracks))+" 路径",1)]),_:1}),a(u,{command:"view.select.cars"},{default:l(()=>[v(T(h(o.viewFilter.selectFilter.cars))+" AGV",1)]),_:1}),a(u,{command:"view.select.decor"},{default:l(()=>[v(T(h(o.viewFilter.selectFilter.decor))+" 区域 / 装饰",1)]),_:1}),a(u,{divided:"",disabled:"",class:"topbar-filter-header"},{default:l(()=>[...i[33]||(i[33]=[v("对齐(鼠标吸附)",-1)])]),_:1}),a(u,{command:"view.snap.sites"},{default:l(()=>[v(T(h(o.viewFilter.alignSnap.sites))+" 吸附站点",1)]),_:1}),a(u,{command:"view.snap.cars"},{default:l(()=>[v(T(h(o.viewFilter.alignSnap.cars))+" 吸附 AGV",1)]),_:1}),a(u,{command:"view.snap.tracks"},{default:l(()=>[v(T(h(o.viewFilter.alignSnap.tracks))+" 吸附路径",1)]),_:1}),a(u,{divided:"",disabled:"",class:"topbar-filter-header"},{default:l(()=>[...i[34]||(i[34]=[v("显示内容",-1)])]),_:1}),a(u,{command:"view.show.sceneLabels"},{default:l(()=>[v(T(h(o.viewFilter.showViewport.sceneLabels))+" 场景图元标记",1)]),_:1}),a(u,{command:"view.show.scenePrimitives"},{default:l(()=>[v(T(h(o.viewFilter.showViewport.scenePrimitives))+" 场景图元",1)]),_:1}),a(u,{command:"view.show.cars"},{default:l(()=>[v(T(h(o.viewFilter.showViewport.cars))+" 车辆",1)]),_:1})]),_:1})]),default:l(()=>[a(k,{text:"",class:"topbar-btn"},{default:l(()=>[...i[31]||(i[31]=[v("过滤",-1)])]),_:1})]),_:1}),i[37]||(i[37]=r("div",{class:"spacer"},null,-1)),a(p,{content:"撤销 (Ctrl+Z)",placement:"bottom"},{default:l(()=>[a(k,{size:"small",disabled:!o.canUndo,class:"topbar-icon-btn",onClick:i[1]||(i[1]=m=>y("edit.undo"))},{default:l(()=>[...i[35]||(i[35]=[v("↶",-1)])]),_:1},8,["disabled"])]),_:1}),a(p,{content:"重做 (Ctrl+Y)",placement:"bottom"},{default:l(()=>[a(k,{size:"small",disabled:!o.canRedo,class:"topbar-icon-btn",onClick:i[2]||(i[2]=m=>y("edit.redo"))},{default:l(()=>[...i[36]||(i[36]=[v("↷",-1)])]),_:1},8,["disabled"])]),_:1})])}}}),Oa=Ne(ja,[["__scopeId","data-v-1082d582"]]),Ka={class:"edit-tool-rail"},Ya={class:"rail-group-title"},Xa={class:"rail-group-text"},Ha={class:"rail-group-list"},Wa=["onClick"],Ga={class:"rail-btn-glyph"},qa={class:"rail-btn-label"},Za={key:0,class:"rail-divider"},Ja={class:"rail-group rail-group-ai"},Qa=Ae({__name:"EditToolRail",props:{activeTool:{}},emits:["select-tool","open-ai"],setup(o,{emit:F}){const w=o,y=F,h=[{id:"select",title:"选择",tools:[{id:"select.single",label:"单选",glyph:"⌖",tip:"点击拾取单个对象"},{id:"select.rect",label:"矩形框选",glyph:"▱"},{id:"select.lasso",label:"套索圈选",glyph:"◯"},{id:"select.byType.site",label:"仅站点",glyph:"·"},{id:"select.byType.polyline",label:"仅折线",glyph:"",tip:"仅 UITrack(直线/折线)"},{id:"select.byType.bezier",label:"仅贝塞尔",glyph:"∽",tip:"仅 UIBezierTrack"},{id:"select.byType.arc",label:"仅弧形",glyph:"◜",tip:"仅 UICircularArcTrack"},{id:"select.byType.decor",label:"仅装饰",glyph:"★"},{id:"select.byType.currentLayer",label:"当前图层",glyph:"▤",tip:"保留当前图层对象"},{id:"select.invert",label:"反选",glyph:"⇄"},{id:"select.clear",label:"清空选中",glyph:"⊘"}]},{id:"draw",title:"绘制",tools:[{id:"draw.site",label:"添加站点",glyph:"",tip:"点击工具后在画布单击放置"},{id:"draw.sites.continuous",label:"连续站点",glyph:"⁂",tip:"切换工具或 Esc 退出"},{id:"draw.track.polyline",label:"折线路径",glyph:"─",tip:"依序点击两端站点"},{id:"draw.track.bezier",label:"贝塞尔路径",glyph:"",tip:"点两端站点 → 弹框输入中间控制点个数 → 连续点选每个控制点"},{id:"draw.track.arc",label:"弧形路径",glyph:"◜",tip:"点两端站点 → 输入半径(≥ |AB|/2,等于即半圆)"},{id:"draw.decor.line",label:"装饰线段",glyph:""},{id:"draw.decor.rect",label:"装饰矩形",glyph:"▭"},{id:"draw.decor.circle",label:"装饰圆",glyph:"◯"},{id:"draw.decor.text",label:"装饰文本",glyph:"T"},{id:"draw.image",label:"插入图片",glyph:"🖼"},{id:"draw.model",label:"插入模型",glyph:"◎",tip:"CycleGUI 3D 模型 (obj/glb/gltf)"}]},{id:"transform",title:"变换",tools:[{id:"transform.move",label:"移动",glyph:"✥"},{id:"transform.rotate",label:"旋转",glyph:"⟳"},{id:"transform.scale",label:"缩放",glyph:"⤡"},{id:"transform.duplicate",label:"复制副本",glyph:"⎘",tip:"Ctrl+D"},{id:"transform.copy",label:"复制",glyph:"📋",tip:"Ctrl+C"},{id:"transform.paste",label:"粘贴",glyph:"📥",tip:"Ctrl+V"},{id:"transform.delete",label:"删除",glyph:"🗑",tip:"Delete"},{id:"transform.copyFields",label:"复制字段",glyph:"⇉",tip:"多选时第 1 个为源,其余为目标"}]},{id:"align",title:"对齐",tools:[{id:"align.left",label:"左对齐",glyph:"⫷"},{id:"align.right",label:"右对齐",glyph:"⫸"},{id:"align.top",label:"上对齐",glyph:"⫵"},{id:"align.bottom",label:"下对齐",glyph:"⫶"},{id:"align.centerH",label:"水平居中",glyph:"⇔"},{id:"align.centerV",label:"垂直居中",glyph:"⇕"},{id:"align.center",label:"整体居中",glyph:"⊕"},{id:"align.distributeH",label:"水平等距",glyph:"⇿"},{id:"align.distributeV",label:"垂直等距",glyph:"⇳"},{id:"align.toFirst",label:"对齐到首",glyph:"⏮"},{id:"align.toLast",label:"对齐到尾",glyph:"⏭"}]},{id:"batch",title:"批量生成",tools:[{id:"batch.linearH",label:"横向间距",glyph:"⇢"},{id:"batch.linearV",label:"纵向间距",glyph:"⇣"},{id:"batch.matrix",label:"矩阵生成",glyph:"#"},{id:"batch.alongPath",label:"沿路径采样",glyph:"⤳",tip:"先选 1+ 条路径,再点本工具"},{id:"batch.circular",label:"环形阵列",glyph:"◌"}]},{id:"show",title:"显示",tools:[{id:"show.controlPoints",label:"控制点",glyph:"⊙"},{id:"show.controlHandles",label:"控制柄",glyph:"⊝"}]}];function _(k){return k===w.activeTool}function i(k){y("select-tool",k)}return(k,u)=>{const z=ut,$=xa;return V(),U("div",Ka,[a($,{class:"rail-scroll"},{default:l(()=>[(V(),U(de,null,we(h,(p,m)=>r("div",{key:p.id,class:"rail-group"},[r("div",Ya,[u[1]||(u[1]=r("span",{class:"rail-group-bar"},null,-1)),r("span",Xa,T(p.title),1),u[2]||(u[2]=r("span",{class:"rail-group-bar"},null,-1))]),r("div",Ha,[(V(!0),U(de,null,we(p.tools,M=>(V(),ee(z,{key:M.id,content:M.tip??M.label,placement:"right","show-after":280},{default:l(()=>[r("button",{class:Se(["rail-btn",{"rail-btn--active":_(M.id)}]),onClick:E=>i(M.id)},[r("span",Ga,T(M.glyph),1),r("span",qa,T(M.label),1)],10,Wa)]),_:2},1032,["content"]))),128))]),m<h.length-1?(V(),U("div",Za)):H("",!0)])),64)),r("div",Ja,[u[4]||(u[4]=r("div",{class:"rail-group-title"},[r("span",{class:"rail-group-bar"}),r("span",{class:"rail-group-text"},"AI"),r("span",{class:"rail-group-bar"})],-1)),r("button",{class:"rail-btn rail-btn--ai",onClick:u[0]||(u[0]=p=>y("open-ai"))},[...u[3]||(u[3]=[r("span",{class:"rail-btn-glyph"},"✦",-1),r("span",{class:"rail-btn-label"},"AI 生图",-1)])])])]),_:1})])}}}),el=Ne(Qa,[["__scopeId","data-v-6b284dea"]]),tl={class:"edit-property-panel"},al={key:0,class:"empty-hint"},ll={key:1,class:"loading-hint"},nl={key:2,class:"object-pane"},ol={class:"prop-card prop-card--header"},sl={class:"prop-card-row"},il={class:"prop-id-block"},rl={class:"prop-id-tag"},ul={class:"prop-type-tag"},dl={class:"prop-header-actions"},cl=["disabled"],pl={class:"prop-delete-icon"},ml={class:"prop-card-row prop-name-row"},fl={class:"prop-card-row prop-layer-row"},yl={key:0,class:"prop-card prop-card--geom"},vl={class:"prop-card-header"},bl=["title"],gl={class:"prop-card-flag-text"},wl={class:"prop-card-meta"},kl={class:"prop-grid"},hl={class:"prop-field-label"},xl={key:0,class:"prop-field-unit"},Sl={key:1,class:"prop-card prop-card--style"},_l={class:"prop-card-header"},Vl={class:"prop-card-meta"},Cl={class:"prop-grid"},$l={class:"prop-field-label"},Al={class:"prop-card prop-card--custom"},Nl={class:"prop-card-header"},Fl={class:"prop-card-meta"},Tl={key:0,class:"prop-grid"},El=["title"],Il={class:"prop-field-row"},zl=["onClick"],Pl={key:1,class:"prop-empty-row"},Ml={key:2,class:"prop-card prop-card--status"},Ul={class:"prop-card-header"},Ll={class:"prop-card-meta"},Bl={class:"prop-status-list"},Dl={class:"prop-status-key"},Rl=["title"],jl={key:3,class:"prop-card prop-card--actions"},Ol={class:"prop-card-header"},Kl={class:"prop-card-meta"},Yl={class:"prop-actions"},Xl=["disabled","onClick"],Hl={key:0,class:"prop-action-spinner"},Wl={class:"prop-action-label"},Gl={class:"defaults-pane"},ql={key:0,class:"empty-hint defaults-empty"},Zl={class:"prop-card prop-card--style"},Jl={class:"prop-card-header"},Ql={class:"prop-card-flag-text"},en={class:"prop-card"},tn={class:"prop-card prop-card--style"},an={class:"prop-card-header"},ln={class:"prop-card-flag-text"},nn={class:"prop-card"},on={key:3,class:"loading-hint"},sn=Ae({__name:"EditPropertyPanel",props:{selectionCount:{},primary:{},fields:{},status:{},methods:{},loading:{type:Boolean},layers:{},defaults:{},layerRows:{},selectionKind:{},viewportStyle:{},viewportStyleLoading:{type:Boolean},viewportSyncing:{type:Boolean}},emits:["rename","change-layer","set-field","add-field","exec-action","save-defaults","layer-toggle","add-layer","delete","patch-viewport"],setup(o,{emit:F}){const w=o,y=F,h=N("object"),_=N(!1);let i=null;const k=N(null),u=N(null);fe(()=>w.viewportStyle,g=>{if(!g){k.value=null,u.value=null;return}k.value={...g.site},u.value={...g.track}},{immediate:!0,deep:!0}),fe(()=>w.selectionKind,g=>{(g==="site"||g==="track")&&(h.value="defaults")});function z(){_.value=!0,i&&clearTimeout(i),i=setTimeout(()=>{_.value=!1},1400)}fe(()=>w.viewportSyncing,(g,d)=>{d&&!g&&z()});function $(g){k.value&&(k.value={...k.value,...g},y("patch-viewport",{site:{...k.value}}))}function p(g){u.value&&(u.value={...u.value,...g},y("patch-viewport",{track:{...u.value}}))}const m=N(null),M=N(""),E=N(!1),b=N(!1);let q=null;function Q(){b.value=!0,q&&clearTimeout(q),q=setTimeout(()=>{b.value=!1},1200)}const ye=new Set(["id","name","layerName"]),W=new Set(["x","y","z","cx","cy","cz","dx","dy","dz","sx","sy","ex","ey","startX","startY","endX","endY","size","width","height","depth","angle","rotation","theta","scale","radius","r","siteA","siteB"]),ve=new Set(["color","displaySetting","direction","typeInfo","mustFree","imagePath","modelPath","fontFamily","fontSize","textColor","lineWidth","opacity"]),O={x:"X",y:"Y",z:"Z",size:"大小",width:"宽",height:"高",depth:"厚",angle:"角度",rotation:"旋转",theta:"θ",scale:"缩放",radius:"半径",siteA:"起点站",siteB:"终点站",startX:"起点 X",startY:"起点 Y",endX:"终点 X",endY:"终点 Y",cx:"中心 X",cy:"中心 Y",color:"颜色",displaySetting:"显示设置",direction:"方向",typeInfo:"类型信息",mustFree:"必须互斥",imagePath:"图片路径",modelPath:"模型路径",fontSize:"字号",textColor:"文字色",lineWidth:"线宽",opacity:"透明度"},se={x:"mm",y:"mm",z:"mm",cx:"mm",cy:"mm",cz:"mm",dx:"mm",dy:"mm",dz:"mm",startX:"mm",startY:"mm",endX:"mm",endY:"mm",width:"mm",height:"mm",depth:"mm",size:"mm",radius:"mm",angle:"°",rotation:"°",theta:"°",fontSize:"px",lineWidth:"px"},ie=ne(()=>w.fields.filter(g=>!ye.has(g.key))),te=ne(()=>ie.value.filter(g=>W.has(g.key))),x=ne(()=>ie.value.filter(g=>ve.has(g.key))),C=ne(()=>ie.value.filter(g=>!W.has(g.key)&&!ve.has(g.key)));function G(g){return O[g]??g}function oe(g){return se[g]??""}function ke(g){if(g==null||g==="")return;const d=Number(g);return Number.isFinite(d)?d:void 0}function re(g){return g.toLowerCase().includes("angle")||g.toLowerCase().includes("rotation")||g==="theta"?1:g==="scale"||g==="opacity"?.1:10}function ce(g){return W.has(g)}function _e(g,d){return g==="color"||g==="textColor"?!0:/^#[0-9a-fA-F]{3,8}$/.test(d)}function B(g,d){return d==="true"||d==="false"||d==="True"||d==="False"}function Y(g){return g==="true"||g==="True"||g==="1"}const Z=ne(()=>{const g=(w.primary?.status??"").toLowerCase();return g?g.includes("error")||g.includes("alarm")||g.includes("failed")?"danger":g.includes("warn")||g.includes("idle")?"warning":g.includes("online")||g.includes("running")||g.includes("ready")||g.includes("ok")?"success":"info":"info"}),he=N("");fe(()=>w.primary?.name??"",g=>{he.value=g},{immediate:!0});function Qe(){Oe()}function Oe(){if(!w.primary)return;const g=he.value;g!==(w.primary.name??"")&&y("rename",g)}function Fe(g){y("change-layer",g)}function ae(g,d){y("set-field",g,d),W.has(g)&&Q()}function Ke(){y("add-field")}async function We(g){try{m.value=g,y("exec-action",g)}finally{m.value=null}}function Te(){y("save-defaults")}function Ee(g){y("layer-toggle",g)}function xe(){const g=M.value.trim();g&&(y("add-layer",g),M.value="")}function Ie(){w.selectionCount===0||E.value||(E.value=!0,y("delete"),setTimeout(()=>{E.value=!1},600))}return(g,d)=>{const ze=dt,ue=Mt,Pe=ut,be=ct,Ge=Va,Me=Ca,pe=It,ge=zt,Ue=Pt,Le=_a,et=pt,X=Et,Ve=Tt,Be=He,Ce=ft,qe=mt,tt=Sa;return V(),U("div",tl,[a(tt,{modelValue:h.value,"onUpdate:modelValue":d[20]||(d[20]=c=>h.value=c),class:"prop-tabs"},{default:l(()=>[a(Le,{label:"对象",name:"object"},{default:l(()=>[o.selectionCount===0?(V(),U("div",al,[a(ze,{class:"empty-icon"},{default:l(()=>[a(D(_t))]),_:1}),d[21]||(d[21]=r("span",{class:"empty-title"},"未选中对象",-1)),d[22]||(d[22]=r("span",{class:"empty-desc"},"在画布上点击或框选以编辑属性。",-1))])):o.loading?(V(),U("div",ll,[a(ze,{class:"is-loading"},{default:l(()=>[a(D(rt))]),_:1}),d[23]||(d[23]=r("span",null,"加载属性…",-1))])):(V(),U("div",nl,[r("section",ol,[r("div",sl,[r("div",il,[r("span",rl,T(o.selectionCount>1?`多选 ${o.selectionCount}`:`#${o.primary?.id??"-"}`),1),r("span",ul,T(o.primary?.typeName??"-"),1)]),r("div",dl,[o.primary?.status?(V(),ee(ue,{key:0,type:Z.value,size:"small",effect:"dark",class:"prop-status-tag"},{default:l(()=>[v(T(o.primary.status),1)]),_:1},8,["type"])):H("",!0),a(Pe,{content:o.selectionCount>1?`删除选中的 ${o.selectionCount} 个对象(可 Ctrl+Z 撤销)`:"删除该对象(可 Ctrl+Z 撤销)",placement:"top","show-after":220},{default:l(()=>[r("button",{type:"button",class:"prop-delete-btn",disabled:E.value,onClick:Ie},[r("span",pl,T(E.value?"⟳":"🗑"),1),d[24]||(d[24]=r("span",null,"删除",-1))],8,cl)]),_:1},8,["content"])])]),r("div",ml,[d[25]||(d[25]=r("label",{class:"prop-name-label"},"名称",-1)),o.primary?(V(),ee(be,{key:0,"model-value":he.value,size:"small",placeholder:"对象名","onUpdate:modelValue":d[0]||(d[0]=c=>he.value=c),onBlur:Qe,onChange:Oe},null,8,["model-value"])):H("",!0)]),r("div",fl,[d[26]||(d[26]=r("label",{class:"prop-name-label"},"图层",-1)),o.primary?(V(),ee(Me,{key:0,"model-value":o.primary.layer??"",size:"small",placeholder:"—",class:"prop-layer-select","onUpdate:modelValue":d[1]||(d[1]=c=>Fe(c))},{default:l(()=>[a(Ge,{label:"(无)",value:""}),(V(!0),U(de,null,we(o.layers,c=>(V(),ee(Ge,{key:c,label:c,value:c},null,8,["label","value"]))),128))]),_:1},8,["model-value"])):H("",!0)])]),te.value.length>0?(V(),U("section",yl,[r("header",vl,[d[28]||(d[28]=r("span",{class:"prop-card-title"},"位置 / 几何",-1)),r("span",{class:Se(["prop-card-flag",{"is-synced":b.value}]),title:b.value?"已同步到画布":"改动会立即同步到 SimpleLite 画布"},[d[27]||(d[27]=r("span",{class:"prop-card-flag-dot"},null,-1)),r("span",gl,T(b.value?"已同步":"同步到画布"),1)],10,bl),r("span",wl,T(te.value.length)+" 项",1)]),r("div",kl,[(V(!0),U(de,null,we(te.value,c=>(V(),U("div",{key:c.key,class:"prop-grid-item"},[r("label",hl,[v(T(G(c.key))+" ",1),oe(c.key)?(V(),U("span",xl,T(oe(c.key)),1)):H("",!0)]),ce(c.key)?(V(),ee(pe,{key:0,"model-value":ke(c.value),controls:!1,step:re(c.key),size:"small",class:"prop-field-num",onChange:R=>ae(c.key,R==null?"":String(R))},null,8,["model-value","step","onChange"])):(V(),ee(be,{key:1,"model-value":c.value,size:"small",spellcheck:"false",onChange:R=>ae(c.key,R)},null,8,["model-value","onChange"]))]))),128))])])):H("",!0),x.value.length>0?(V(),U("section",Sl,[r("header",_l,[d[29]||(d[29]=r("span",{class:"prop-card-title"},"样式 / 外观",-1)),r("span",Vl,T(x.value.length)+" 项",1)]),r("div",Cl,[(V(!0),U(de,null,we(x.value,c=>(V(),U("div",{key:c.key,class:"prop-grid-item"},[r("label",$l,T(G(c.key)),1),_e(c.key,c.value)?(V(),ee(ge,{key:0,"model-value":c.value||"#ffffff","show-alpha":"",size:"small",onChange:R=>ae(c.key,R??"")},null,8,["model-value","onChange"])):B(c.key,c.value)?(V(),ee(Ue,{key:1,"model-value":Y(c.value),size:"small",onChange:R=>ae(c.key,R?"true":"false")},null,8,["model-value","onChange"])):(V(),ee(be,{key:2,"model-value":c.value,size:"small",spellcheck:"false",onChange:R=>ae(c.key,R)},null,8,["model-value","onChange"]))]))),128))])])):H("",!0),r("section",Al,[r("header",Nl,[d[30]||(d[30]=r("span",{class:"prop-card-title"},"其它字段 / 自定义",-1)),r("span",Fl,T(C.value.length)+" 项",1)]),C.value.length>0?(V(),U("div",Tl,[(V(!0),U(de,null,we(C.value,c=>(V(),U("div",{key:c.key,class:"prop-grid-item prop-grid-item--wide"},[r("label",{class:"prop-field-label",title:c.key},T(c.key),9,El),r("div",Il,[a(be,{"model-value":c.value,size:"small",spellcheck:"false",onChange:R=>ae(c.key,R)},null,8,["model-value","onChange"]),a(Pe,{content:"删除该字段",placement:"top"},{default:l(()=>[r("button",{class:"prop-field-icon-btn",onClick:R=>ae(c.key,"")},"×",8,zl)]),_:2},1024)])]))),128))])):(V(),U("div",Pl,"无其它字段")),r("button",{class:"prop-add-field-btn",onClick:Ke}," 添加字段")]),o.status.length>0?(V(),U("section",Ml,[r("header",Ul,[d[31]||(d[31]=r("span",{class:"prop-card-title"},"运行状态",-1)),r("span",Ll,T(o.status.length)+" 项",1)]),r("div",Bl,[(V(!0),U(de,null,we(o.status,c=>(V(),U("div",{key:c.key,class:"prop-status-item"},[r("span",Dl,T(c.key),1),r("span",{class:"prop-status-value",title:c.value},T(c.value),9,Rl)]))),128))])])):H("",!0),o.methods.length>0?(V(),U("section",jl,[r("header",Ol,[d[32]||(d[32]=r("span",{class:"prop-card-title"},"操作",-1)),r("span",Kl,T(o.methods.length)+" 项",1)]),r("div",Yl,[(V(!0),U(de,null,we(o.methods,c=>(V(),ee(Pe,{key:c.methodName,content:c.description||c.label||c.methodName,placement:"top","show-after":220},{default:l(()=>[r("button",{class:"prop-action-btn",disabled:m.value===c.methodName,onClick:R=>We(c.methodName)},[m.value===c.methodName?(V(),U("span",Hl,"⟳")):H("",!0),d[33]||(d[33]=r("span",{class:"prop-action-icon"},"▶",-1)),r("span",Wl,T(c.label||c.methodName),1)],8,Xl)]),_:2},1032,["content"]))),128))])])):H("",!0)]))]),_:1}),a(Le,{label:"类型默认",name:"defaults"},{default:l(()=>[r("div",Gl,[a(et,{type:"info",closable:!1,class:"defaults-alert"},{default:l(()=>[...d[34]||(d[34]=[v(" 视口样式与 SimpleLite「视口样式」对话框同步,修改后即时重绘画布;下方「新建默认」仅影响下次创建对象。 ",-1)])]),_:1}),o.selectionKind?o.selectionKind==="site"&&k.value?(V(),U(de,{key:1},[r("section",Zl,[r("header",Jl,[d[38]||(d[38]=r("span",{class:"prop-card-title"},"站点视口样式",-1)),r("span",{class:Se(["prop-card-flag",{"is-synced":_.value}])},[d[37]||(d[37]=r("span",{class:"prop-card-flag-dot"},null,-1)),r("span",Ql,T(o.viewportSyncing?"同步中…":_.value?"已同步":"实时同步"),1)],2)]),a(Ve,{"label-width":"132px",size:"small",class:"defaults-form"},{default:l(()=>[a(X,{label:"整体大小倍率"},{default:l(()=>[a(pe,{"model-value":k.value.drawScale,min:.25,max:12,step:.1,controls:!0,"onUpdate:modelValue":d[2]||(d[2]=c=>$({drawScale:c??k.value.drawScale}))},null,8,["model-value"])]),_:1}),a(X,{label:"未选中圆点半径"},{default:l(()=>[a(pe,{"model-value":k.value.dotRadiusNormal,min:1,max:24,step:.5,"onUpdate:modelValue":d[3]||(d[3]=c=>$({dotRadiusNormal:c??k.value.dotRadiusNormal}))},null,8,["model-value"])]),_:1}),a(X,{label:"选中圆点半径"},{default:l(()=>[a(pe,{"model-value":k.value.dotRadiusSelected,min:1,max:32,step:.5,"onUpdate:modelValue":d[4]||(d[4]=c=>$({dotRadiusSelected:c??k.value.dotRadiusSelected}))},null,8,["model-value"])]),_:1}),a(X,{label:"选中环半径 (m)"},{default:l(()=>[a(pe,{"model-value":k.value.selectionRingM,min:.02,max:.8,step:.01,"onUpdate:modelValue":d[5]||(d[5]=c=>$({selectionRingM:c??k.value.selectionRingM}))},null,8,["model-value"])]),_:1}),a(X,{label:"站点颜色(未选中)"},{default:l(()=>[a(ge,{"model-value":D(je)(k.value.colorNormalArgb),"onUpdate:modelValue":d[6]||(d[6]=c=>$({colorNormalArgb:D(Re)(c??"#ffffff")}))},null,8,["model-value"])]),_:1}),a(X,{label:"站点颜色(选中)"},{default:l(()=>[a(ge,{"model-value":D(je)(k.value.colorSelectedArgb),"onUpdate:modelValue":d[7]||(d[7]=c=>$({colorSelectedArgb:D(Re)(c??"#ff0000")}))},null,8,["model-value"])]),_:1}),a(X,{label:"标签颜色(未选中)"},{default:l(()=>[a(ge,{"model-value":D(je)(k.value.labelColorNormalArgb),"onUpdate:modelValue":d[8]||(d[8]=c=>$({labelColorNormalArgb:D(Re)(c??"#ffffff")}))},null,8,["model-value"])]),_:1}),a(X,{label:"标签颜色(选中)"},{default:l(()=>[a(ge,{"model-value":D(je)(k.value.labelColorSelectedArgb),"onUpdate:modelValue":d[9]||(d[9]=c=>$({labelColorSelectedArgb:D(Re)(c??"#ff0000")}))},null,8,["model-value"])]),_:1})]),_:1})]),r("section",en,[d[40]||(d[40]=r("header",{class:"prop-card-header"},[r("span",{class:"prop-card-title"},"新建站点默认")],-1)),a(Ve,{"label-width":"132px",size:"small",class:"defaults-form"},{default:l(()=>[a(X,{label:"默认图层"},{default:l(()=>[a(be,{modelValue:o.defaults.site.layer,"onUpdate:modelValue":d[10]||(d[10]=c=>o.defaults.site.layer=c)},null,8,["modelValue"])]),_:1}),a(X,{label:"名字前缀"},{default:l(()=>[a(be,{modelValue:o.defaults.site.namePrefix,"onUpdate:modelValue":d[11]||(d[11]=c=>o.defaults.site.namePrefix=c)},null,8,["modelValue"])]),_:1}),a(Be,{size:"small",type:"primary",plain:"",onClick:Te},{default:l(()=>[...d[39]||(d[39]=[v("保存新建默认",-1)])]),_:1})]),_:1})])],64)):o.selectionKind==="track"&&u.value?(V(),U(de,{key:2},[r("section",tn,[r("header",an,[d[42]||(d[42]=r("span",{class:"prop-card-title"},"路径视口样式",-1)),r("span",{class:Se(["prop-card-flag",{"is-synced":_.value}])},[d[41]||(d[41]=r("span",{class:"prop-card-flag-dot"},null,-1)),r("span",ln,T(o.viewportSyncing?"同步中…":_.value?"已同步":"实时同步"),1)],2)]),a(Ve,{"label-width":"132px",size:"small",class:"defaults-form"},{default:l(()=>[a(X,{label:"线宽倍率"},{default:l(()=>[a(pe,{"model-value":u.value.drawScale,min:.25,max:12,step:.1,"onUpdate:modelValue":d[12]||(d[12]=c=>p({drawScale:c??u.value.drawScale}))},null,8,["model-value"])]),_:1}),a(X,{label:"未选中线宽"},{default:l(()=>[a(pe,{"model-value":u.value.widthNormal,min:.4,max:8,step:.1,"onUpdate:modelValue":d[13]||(d[13]=c=>p({widthNormal:c??u.value.widthNormal}))},null,8,["model-value"])]),_:1}),a(X,{label:"选中线宽"},{default:l(()=>[a(pe,{"model-value":u.value.widthSelected,min:.4,max:12,step:.1,"onUpdate:modelValue":d[14]||(d[14]=c=>p({widthSelected:c??u.value.widthSelected}))},null,8,["model-value"])]),_:1}),a(X,{label:"显示方向箭头"},{default:l(()=>[a(Ue,{"model-value":u.value.showDirectionArrows,"onUpdate:modelValue":d[15]||(d[15]=c=>p({showDirectionArrows:!!c}))},null,8,["model-value"])]),_:1}),a(X,{label:"路径颜色(未选中)"},{default:l(()=>[a(ge,{"model-value":D(je)(u.value.colorNormalArgb),"onUpdate:modelValue":d[16]||(d[16]=c=>p({colorNormalArgb:D(Re)(c??"#00ffff")}))},null,8,["model-value"])]),_:1}),a(X,{label:"路径颜色(选中)"},{default:l(()=>[a(ge,{"model-value":D(je)(u.value.colorSelectedArgb),"onUpdate:modelValue":d[17]||(d[17]=c=>p({colorSelectedArgb:D(Re)(c??"#ff0000")}))},null,8,["model-value"])]),_:1})]),_:1})]),r("section",nn,[d[44]||(d[44]=r("header",{class:"prop-card-header"},[r("span",{class:"prop-card-title"},"新建路径默认")],-1)),a(Ve,{"label-width":"132px",size:"small",class:"defaults-form"},{default:l(()=>[a(X,{label:"默认图层"},{default:l(()=>[a(be,{modelValue:o.defaults.track.layer,"onUpdate:modelValue":d[18]||(d[18]=c=>o.defaults.track.layer=c)},null,8,["modelValue"])]),_:1}),a(Be,{size:"small",type:"primary",plain:"",onClick:Te},{default:l(()=>[...d[43]||(d[43]=[v("保存新建默认",-1)])]),_:1})]),_:1})])],64)):o.viewportStyleLoading?(V(),U("div",on,[a(ze,{class:"is-loading"},{default:l(()=>[a(D(rt))]),_:1}),d[45]||(d[45]=r("span",null,"加载视口样式…",-1))])):H("",!0):(V(),U("div",ql,[a(ze,{class:"empty-icon"},{default:l(()=>[a(D(_t))]),_:1}),d[35]||(d[35]=r("span",{class:"empty-title"},"请选中站点或路径",-1)),d[36]||(d[36]=r("span",{class:"empty-desc"},"在画布上选中一个站点或路径后,可在此调整对应视口样式。",-1))]))])]),_:1}),a(Le,{label:"图层",name:"layers"},{default:l(()=>[a(qe,{data:o.layerRows,size:"small",class:"layer-table"},{default:l(()=>[a(Ce,{prop:"name",label:"图层",width:"120"}),a(Ce,{label:"可见",width:"60"},{default:l(({row:c})=>[a(Ue,{modelValue:c.visible,"onUpdate:modelValue":R=>c.visible=R,onChange:R=>Ee(c)},null,8,["modelValue","onUpdate:modelValue","onChange"])]),_:1}),a(Ce,{label:"可选",width:"60"},{default:l(({row:c})=>[a(Ue,{modelValue:c.selectable,"onUpdate:modelValue":R=>c.selectable=R,onChange:R=>Ee(c)},null,8,["modelValue","onUpdate:modelValue","onChange"])]),_:1}),a(Ce,{label:"颜色"},{default:l(({row:c})=>[a(ge,{modelValue:c.color,"onUpdate:modelValue":R=>c.color=R,onChange:R=>Ee(c)},null,8,["modelValue","onUpdate:modelValue","onChange"])]),_:1})]),_:1},8,["data"]),a(be,{modelValue:M.value,"onUpdate:modelValue":d[19]||(d[19]=c=>M.value=c),size:"small",placeholder:"新图层名",class:"new-layer"},{append:l(()=>[a(Be,{onClick:xe},{default:l(()=>[...d[46]||(d[46]=[v("添加",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1})]),_:1},8,["modelValue"])])}}}),rn=Ne(sn,[["__scopeId","data-v-781515fe"]]),un={class:"edit-status-bar"},dn={class:"seg"},cn={class:"seg"},pn={class:"seg"},mn={class:"seg"},fn={class:"seg"},yn={key:0,class:"seg ok"},vn={key:1,class:"seg warn"},bn=Ae({__name:"EditStatusBar",props:{selectedCount:{},mouseX:{},mouseY:{},toolLabel:{},snapOn:{type:Boolean},undoSize:{},redoSize:{},connected:{type:Boolean}},setup(o){function F(w){return Number.isFinite(w)?w.toFixed(0):"--"}return(w,y)=>(V(),U("div",un,[r("span",dn,[y[0]||(y[0]=v(" 选中 ",-1)),r("b",null,T(o.selectedCount),1),y[1]||(y[1]=v(" 个 ",-1))]),r("span",cn," 鼠标 ("+T(F(o.mouseX))+", "+T(F(o.mouseY))+") mm ",1),r("span",pn,[y[2]||(y[2]=v(" 当前工具:",-1)),r("b",null,T(o.toolLabel),1)]),r("span",mn,[y[3]||(y[3]=v(" 吸附:",-1)),r("b",{class:Se({on:o.snapOn,off:!o.snapOn})},T(o.snapOn?"开":"关"),3)]),y[4]||(y[4]=r("span",{class:"spacer"},null,-1)),r("span",fn,"历史 "+T(o.undoSize)+" / "+T(o.redoSize),1),o.connected?(V(),U("span",yn,"● 实时通道在线")):(V(),U("span",vn,"● 实时通道断开"))]))}}),gn=Ne(bn,[["__scopeId","data-v-6254b10f"]]),wn={class:"upload-hint"},kn={key:0,class:"ai-text"},hn={class:"ai-stat"},xn=Ae({__name:"AiGenerateDialog",props:{modelValue:{type:Boolean},configured:{type:Boolean},defaultBounds:{},defaultLayer:{}},emits:["update:modelValue","generated"],setup(o,{emit:F}){const w=o,y=F,h=yt(),_=N(!1),i=N(null),k=N(["r"]),u=Je({prompt:"",mode:"sites+tracks",referenceImageBase64:void 0,layer:w.defaultLayer??"ai-generated",constraints:""}),z=N(w.defaultBounds??[-1e4,-1e4,1e4,1e4]);fe(()=>w.defaultBounds,E=>{E&&(z.value=E)}),fe(()=>w.defaultLayer,E=>{E&&(u.layer=E)});function $(){y("update:modelValue",!1)}function p(){y("update:modelValue",!1),h.push("/admin/config/system")}async function m(E){if(!E.raw)return;const b=new FileReader;b.onload=()=>{const q=String(b.result||""),Q=q.includes(",")?q.split(",",2)[1]:q;u.referenceImageBase64=Q},b.readAsDataURL(E.raw)}async function M(){try{_.value=!0,u.bounds=z.value;const E=await j.aiMapGenerate(u);i.value=E,A.success(`AI 已生成 ${E.created?.length??0} 个对象`),y("generated",E)}catch(E){A.error(`AI 生图失败:${E.message}`)}finally{_.value=!1}}return(E,b)=>{const q=Dt,Q=pt,ye=ct,W=Et,ve=dt,O=$a,se=Bt,ie=Lt,te=It,x=Tt,C=ft,G=Mt,oe=mt,ke=Fa,re=Na,ce=He,_e=Ut;return V(),ee(_e,{"model-value":o.modelValue,title:"AI 生图",width:"640px",class:"ai-generate-dialog","onUpdate:modelValue":b[9]||(b[9]=B=>y("update:modelValue",B)),onClose:$},{footer:l(()=>[a(ce,{onClick:$},{default:l(()=>[...b[20]||(b[20]=[v("关闭",-1)])]),_:1}),a(ce,{type:"primary",loading:_.value,disabled:!u.prompt.trim()||!o.configured,onClick:M},{default:l(()=>[...b[21]||(b[21]=[v(" 生成并落地 ",-1)])]),_:1},8,["loading","disabled"])]),default:l(()=>[o.configured?H("",!0):(V(),ee(Q,{key:0,type:"warning",closable:!1,class:"cfg-alert"},{default:l(()=>[b[11]||(b[11]=v(" 尚未配置 AI 服务(apiKey / endpoint)。请先到 ",-1)),a(q,{type:"primary",onClick:p},{default:l(()=>[...b[10]||(b[10]=[v("系统级配置 → AI 服务",-1)])]),_:1}),b[12]||(b[12]=v(" 完成配置。 ",-1))]),_:1})),a(x,{"label-width":"100px",size:"default"},{default:l(()=>[a(W,{label:"提示词",required:""},{default:l(()=>[a(ye,{modelValue:u.prompt,"onUpdate:modelValue":b[0]||(b[0]=B=>u.prompt=B),type:"textarea",rows:4,placeholder:"一条 U 型生产线,含 5 个工站,间距 2m,方向单向通行..."},null,8,["modelValue"])]),_:1}),a(W,{label:"参考图片"},{default:l(()=>[a(O,{drag:"","auto-upload":!1,"show-file-list":!1,accept:"image/*",onChange:m},{default:l(()=>[r("div",wn,[a(ve,null,{default:l(()=>[a(D(Aa))]),_:1}),r("span",null,T(u.referenceImageBase64?"已选择图片 (点击替换)":"拖入或点击上传参考图(可选,多模态)"),1)])]),_:1})]),_:1}),a(W,{label:"生成模式"},{default:l(()=>[a(ie,{modelValue:u.mode,"onUpdate:modelValue":b[1]||(b[1]=B=>u.mode=B)},{default:l(()=>[a(se,{value:"sites"},{default:l(()=>[...b[13]||(b[13]=[v("仅站点",-1)])]),_:1}),a(se,{value:"tracks"},{default:l(()=>[...b[14]||(b[14]=[v("仅路径",-1)])]),_:1}),a(se,{value:"sites+tracks"},{default:l(()=>[...b[15]||(b[15]=[v("站点+路径",-1)])]),_:1}),a(se,{value:"full"},{default:l(()=>[...b[16]||(b[16]=[v("完整地图",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1}),a(W,{label:"范围 (mm)"},{default:l(()=>[a(te,{modelValue:z.value[0],"onUpdate:modelValue":b[2]||(b[2]=B=>z.value[0]=B),placeholder:"x1",step:500},null,8,["modelValue"]),a(te,{modelValue:z.value[1],"onUpdate:modelValue":b[3]||(b[3]=B=>z.value[1]=B),placeholder:"y1",step:500,class:"ml"},null,8,["modelValue"]),a(te,{modelValue:z.value[2],"onUpdate:modelValue":b[4]||(b[4]=B=>z.value[2]=B),placeholder:"x2",step:500,class:"ml"},null,8,["modelValue"]),a(te,{modelValue:z.value[3],"onUpdate:modelValue":b[5]||(b[5]=B=>z.value[3]=B),placeholder:"y2",step:500,class:"ml"},null,8,["modelValue"])]),_:1}),a(W,{label:"图层"},{default:l(()=>[a(ye,{modelValue:u.layer,"onUpdate:modelValue":b[6]||(b[6]=B=>u.layer=B),placeholder:"ai-generated(默认)"},null,8,["modelValue"])]),_:1}),a(W,{label:"附加约束"},{default:l(()=>[a(ye,{modelValue:u.constraints,"onUpdate:modelValue":b[7]||(b[7]=B=>u.constraints=B),placeholder:"例如:单向通行、最小转弯半径 1500mm"},null,8,["modelValue"])]),_:1})]),_:1}),i.value?(V(),ee(re,{key:1,modelValue:k.value,"onUpdate:modelValue":b[8]||(b[8]=B=>k.value=B),class:"result-panel"},{default:l(()=>[a(ke,{title:"AI 返回 / 落地结果",name:"r"},{default:l(()=>[i.value.assistantText?(V(),U("div",kn,T(i.value.assistantText),1)):H("",!0),r("div",hn,[b[17]||(b[17]=v(" 落地对象 ",-1)),r("b",null,T(i.value.created?.length??0),1),b[18]||(b[18]=v(",工具调用次数 ",-1)),r("b",null,T(i.value.usedTools),1),b[19]||(b[19]=v("。 ",-1))]),a(oe,{data:i.value.created??[],size:"small","max-height":"220"},{default:l(()=>[a(C,{label:"工具",prop:"tool",width:"160"}),a(C,{label:"kind",prop:"kind",width:"80"}),a(C,{label:"id",prop:"id",width:"80"}),a(C,{label:"typeName",prop:"typeName"}),a(C,{label:"错误"},{default:l(({row:B})=>[B.error?(V(),ee(G,{key:0,type:"danger",size:"small"},{default:l(()=>[v(T(B.error),1)]),_:2},1024)):H("",!0)]),_:1})]),_:1},8,["data"])]),_:1})]),_:1},8,["modelValue"])):H("",!0)]),_:1},8,["model-value"])}}}),Sn=Ne(xn,[["__scopeId","data-v-47584778"]]),_n={key:0,class:"aap-empty"},Vn=["onClick"],Cn={class:"aap-bubble"},$n={class:"aap-bubble-text"},An={key:0,class:"aap-meta"},Nn={key:1,class:"aap-msg aap-msg--assistant"},Fn={class:"aap-bubble aap-bubble--loading"},Tn={class:"aap-toolbar"},En={class:"aap-input"},Ct=300,$t=720,At="mapEditor.aiAssistant.mode",In=Ae({__name:"AiAssistantPanel",props:{open:{type:Boolean},configured:{type:Boolean},width:{},defaultBounds:{},defaultLayer:{}},emits:["update:open","update:width","generated"],setup(o,{emit:F}){const w=o,y=F,h=ne(()=>Math.min($t,Math.max(Ct,w.width??360))),_=yt(),i=N([]),k=N(""),u=N(!1),z=N(null);function $(){const x=localStorage.getItem(At);return x==="sites"||x==="tracks"||x==="sites+tracks"||x==="full"?x:"sites+tracks"}const p=N($());fe(p,x=>{try{localStorage.setItem(At,x)}catch{}});let m=!1,M=0,E=0;function b(x){m=!0,M=x.clientX,E=h.value,x.currentTarget.setPointerCapture?.(x.pointerId),x.preventDefault()}function q(x){if(!m)return;const C=Math.min($t,Math.max(Ct,E+(M-x.clientX)));y("update:width",C)}function Q(x){m&&(m=!1,x.currentTarget.releasePointerCapture?.(x.pointerId))}Rt(()=>{m=!1});const ye=["生成一条横向直线,5 个站点,间距 2000mm","画一个 3×3 的站点矩阵,间距 2500mm","一条 U 型产线,含 5 个工站,单向通行"];function W(){y("update:open",!1)}function ve(){W(),_.push("/admin/config/system")}function O(x){k.value=x}function se(x){x instanceof KeyboardEvent&&x.key==="Enter"&&!x.shiftKey&&!x.isComposing&&(x.preventDefault(),te())}async function ie(){await Ea();const x=z.value;x&&(x.scrollTop=x.scrollHeight)}async function te(){const x=k.value.trim();if(!(!x||u.value||!w.configured)){i.value.push({role:"user",text:x}),k.value="",ie(),u.value=!0;try{const C={prompt:x,mode:p.value,bounds:w.defaultBounds,layer:w.defaultLayer},G=await j.aiMapGenerate(C),oe=G.created?.length??0;i.value.push({role:"assistant",text:G.assistantText?.trim()||`已根据你的描述生成并落地 ${oe} 个对象。`,meta:{created:oe,usedTools:G.usedTools??0}}),y("generated",G)}catch(C){const G=C.message;i.value.push({role:"assistant",text:`生成失败:${G}`}),A.error(`AI 助手生成失败:${G}`)}finally{u.value=!1,ie()}}}return(x,C)=>{const G=Dt,oe=pt,ke=dt,re=Bt,ce=Lt,_e=ct,B=He;return V(),U("div",{class:Se(["ai-assistant-panel",{"is-open":o.open}]),style:jt({width:h.value+"px"}),role:"complementary","aria-label":"AI 助手"},[r("div",{class:"aap-resizer",title:"拖拽调整宽度",onPointerdown:b,onPointermove:q,onPointerup:Q,onPointercancel:Q},null,32),r("div",{class:"aap-header"},[C[2]||(C[2]=Ta('<div class="aap-title" data-v-9fed2b0d><span class="aap-glyph" data-v-9fed2b0d>✦</span><div class="aap-title-text" data-v-9fed2b0d><div class="aap-title-main" data-v-9fed2b0d>AI 助手</div><div class="aap-title-sub" data-v-9fed2b0d>用自然语言描述地图需求,自动生成站点 / 路径</div></div></div>',1)),r("button",{class:"aap-close",type:"button",title:"收起",onClick:W},"✕")]),o.configured?H("",!0):(V(),ee(oe,{key:0,type:"warning",closable:!1,class:"aap-alert"},{default:l(()=>[C[4]||(C[4]=v(" 尚未配置 AI 服务(apiKey / endpoint)。请先到 ",-1)),a(G,{type:"primary",onClick:ve},{default:l(()=>[...C[3]||(C[3]=[v("系统级配置 → AI 服务",-1)])]),_:1}),C[5]||(C[5]=v(" 完成配置。 ",-1))]),_:1})),r("div",{ref_key:"listRef",ref:z,class:"aap-messages"},[i.value.length===0?(V(),U("div",_n,[C[6]||(C[6]=r("div",{class:"aap-empty-title"},"试着这样说:",-1)),(V(),U(de,null,we(ye,(Y,Z)=>r("button",{key:Z,type:"button",class:"aap-example",onClick:he=>O(Y)},T(Y),9,Vn)),64))])):H("",!0),(V(!0),U(de,null,we(i.value,(Y,Z)=>(V(),U("div",{key:Z,class:Se(["aap-msg",`aap-msg--${Y.role}`])},[r("div",Cn,[r("div",$n,T(Y.text),1),Y.role==="assistant"&&Y.meta?(V(),U("div",An,[C[7]||(C[7]=v(" 落地对象 ",-1)),r("b",null,T(Y.meta.created),1),C[8]||(C[8]=v(" · 工具调用 ",-1)),r("b",null,T(Y.meta.usedTools),1)])):H("",!0)])],2))),128)),u.value?(V(),U("div",Nn,[r("div",Fn,[a(ke,{class:"is-loading"},{default:l(()=>[a(D(rt))]),_:1}),C[9]||(C[9]=r("span",null,"AI 正在生成…",-1))])])):H("",!0)],512),r("div",Tn,[C[14]||(C[14]=r("span",{class:"aap-toolbar-label"},"生成模式",-1)),a(ce,{modelValue:p.value,"onUpdate:modelValue":C[0]||(C[0]=Y=>p.value=Y),size:"small"},{default:l(()=>[a(re,{value:"sites"},{default:l(()=>[...C[10]||(C[10]=[v("站点",-1)])]),_:1}),a(re,{value:"tracks"},{default:l(()=>[...C[11]||(C[11]=[v("路径",-1)])]),_:1}),a(re,{value:"sites+tracks"},{default:l(()=>[...C[12]||(C[12]=[v("站点+路径",-1)])]),_:1}),a(re,{value:"full"},{default:l(()=>[...C[13]||(C[13]=[v("完整",-1)])]),_:1})]),_:1},8,["modelValue"])]),r("div",En,[a(_e,{modelValue:k.value,"onUpdate:modelValue":C[1]||(C[1]=Y=>k.value=Y),type:"textarea",rows:3,resize:"none",disabled:!o.configured||u.value,placeholder:"例如:一条 U 型生产线,含 5 个工站,间距 2m,单向通行…(Enter 发送,Shift+Enter 换行)",onKeydown:se},null,8,["modelValue","disabled"]),a(B,{type:"primary",class:"aap-send",loading:u.value,disabled:!o.configured||!k.value.trim(),onClick:te},{default:l(()=>[...C[15]||(C[15]=[v("发送",-1)])]),_:1},8,["loading","disabled"])])],6)}}}),zn=Ne(In,[["__scopeId","data-v-9fed2b0d"]]);function Pn(){const o=N("transform.move"),F=N({grid:!1,gridSizeMm:100,object:!0,endpoint:!0,midpoint:!1,toAngleDeg:void 0}),w=N(!0),y=N(!0),h=ne(()=>{const u=o.value;return u.startsWith("select.")?"select":u.startsWith("draw.")?"draw":u.startsWith("transform.")?"transform":u.startsWith("align.")?"align":u.startsWith("batch.")?"batch":u.startsWith("snap.")?"snap":"show"}),_=ne(()=>({"select.single":"单选","select.rect":"矩形框选","select.lasso":"圈选","select.byType.site":"按类型选 - 站点","select.byType.bezier":"按类型选 - 贝塞尔","select.byType.polyline":"按类型选 - 折线","select.byType.arc":"按类型选 - 弧","select.byType.decor":"按类型选 - 装饰物","select.byType.currentLayer":"按类型选 - 当前图层","select.invert":"反选","select.clear":"清空选中","draw.site":"添加站点","draw.sites.continuous":"连续添加站点","draw.track.polyline":"添加折线路径","draw.track.bezier":"添加贝塞尔路径","draw.track.arc":"添加弧形路径","draw.track.nurbs":"添加 NURBS 路径","draw.decor.line":"添加线段","draw.decor.rect":"添加矩形","draw.decor.circle":"添加圆","draw.decor.text":"添加文本","draw.image":"插入图片","draw.model":"插入 3D 模型","transform.move":"移动","transform.rotate":"旋转","transform.scale":"缩放","transform.duplicate":"复制副本","transform.copy":"复制","transform.paste":"粘贴","transform.delete":"删除","transform.copyFields":"复制字段","align.left":"左对齐","align.right":"右对齐","align.top":"上对齐","align.bottom":"下对齐","align.centerH":"水平居中","align.centerV":"垂直居中","align.center":"整体居中","align.distributeH":"水平等距","align.distributeV":"垂直等距","align.toFirst":"对齐到第一个","align.toLast":"对齐到最后一个","batch.linearH":"横向间隔生成","batch.linearV":"纵向间隔生成","batch.matrix":"矩阵生成","batch.alongPath":"沿路径采样生成","batch.circular":"环形阵列","snap.grid":"网格吸附","snap.object":"对象吸附","snap.endpoint":"端点吸附","snap.midpoint":"中点吸附","show.controlPoints":"显示控制点","show.controlHandles":"显示控制柄"})[o.value]??o.value);function i(u){o.value=u}function k(u){F.value={...F.value,[u]:!F.value[u]}}return{activeTool:o,snap:F,showControlPoints:w,showControlHandles:y,toolCategory:h,toolLabel:_,setTool:i,toggleSnap:k}}function $e(o,F){return`${o}:${F}`}function Mn(){const o=N([]),F=N(null),w=ne(()=>o.value.map(m=>m.id)),y=ne(()=>o.value.length);function h(m,M){const E=$e(m,M);return o.value.some(b=>$e(b.kind,b.id)===E)}function _(m){h(m.kind,m.id)||(o.value=[...o.value,m],F.value=$e(m.kind,m.id))}function i(m,M){const E=$e(m,M);o.value=o.value.filter(b=>$e(b.kind,b.id)!==E),F.value===E&&(F.value=null)}function k(m){h(m.kind,m.id)?i(m.kind,m.id):_(m)}function u(m){o.value=m,F.value=m.length>0?$e(m[m.length-1].kind,m[m.length-1].id):null}function z(){o.value=[],F.value=null}function $(m){o.value=o.value.filter(M=>M.kind===m)}function p(m){o.value=[m],F.value=$e(m.kind,m.id)}return{items:o,ids:w,count:y,lastClickedKey:F,has:h,add:_,remove:i,toggle:k,set:u,clear:z,filterByKind:$,selectSingle:p}}function Un(o={}){const F=o.maxDepth??20,w=N([]),y=N([]),h=N(!1),_=ne(()=>w.value.length>0&&!h.value),i=ne(()=>y.value.length>0&&!h.value);async function k(m){if(!h.value){h.value=!0;try{await m.apply(),w.value=[...w.value,m].slice(-F),y.value=[],o.onChange?.()}finally{h.value=!1}}}async function u(){if(!_.value)return;const m=w.value[w.value.length-1];h.value=!0;try{await m.revert(),w.value=w.value.slice(0,-1),y.value=[...y.value,m].slice(-F),o.onChange?.()}finally{h.value=!1}}async function z(){if(!i.value)return;const m=y.value[y.value.length-1];h.value=!0;try{await m.apply(),y.value=y.value.slice(0,-1),w.value=[...w.value,m].slice(-F),o.onChange?.()}finally{h.value=!1}}function $(){w.value=[],y.value=[],o.onChange?.()}function p(m,M){return{label:m,apply:async()=>{for(const E of M)await E.apply()},revert:async()=>{for(let E=M.length-1;E>=0;E--)await M[E].revert()}}}return{undoStack:w,redoStack:y,busy:h,canUndo:_,canRedo:i,run:k,undo:u,redo:z,clear:$,composite:p}}function Ln(o={}){function F(w){const y=w?.data;if(!y||typeof y!="object"||typeof y.type!="string")return;const h=y.type,_=y.payload;if(h==="workspace.pick"&&o.onPick&&_&&typeof _=="object"&&"x"in _&&"y"in _){const i=_;o.onPick({x:Number(i.x),y:Number(i.y),siteId:typeof i.siteId=="number"?i.siteId:void 0})}else if(h==="workspace.select"&&o.onSelect&&Array.isArray(_))o.onSelect({names:_});else if(h==="workspace.mouse"&&o.onMouse&&_&&typeof _=="object"&&"x"in _&&"y"in _){const i=_;o.onMouse({x:Number(i.x),y:Number(i.y)})}}Ot(()=>window.addEventListener("message",F)),Rt(()=>window.removeEventListener("message",F))}function Bn(o,F){if(o.length<2)return[];const w=[],y=o.map(p=>p.x),h=o.map(p=>p.y),_=Math.min(...y),i=Math.max(...y),k=Math.min(...h),u=Math.max(...h),z=y.reduce((p,m)=>p+m,0)/y.length,$=h.reduce((p,m)=>p+m,0)/h.length;switch(F){case"left":for(const p of o)w.push(me(p,{x:_}));break;case"right":for(const p of o)w.push(me(p,{x:i}));break;case"top":for(const p of o)w.push(me(p,{y:u}));break;case"bottom":for(const p of o)w.push(me(p,{y:k}));break;case"centerH":for(const p of o)w.push(me(p,{x:z}));break;case"centerV":for(const p of o)w.push(me(p,{y:$}));break;case"center":for(const p of o)w.push(me(p,{x:z,y:$}));break;case"distributeH":{const p=[...o].sort((M,E)=>M.x-E.x),m=(p[p.length-1].x-p[0].x)/(p.length-1);p.forEach((M,E)=>{const b=p[0].x+m*E;Math.abs(b-M.x)>.5&&w.push(me(M,{x:b}))});break}case"distributeV":{const p=[...o].sort((M,E)=>M.y-E.y),m=(p[p.length-1].y-p[0].y)/(p.length-1);p.forEach((M,E)=>{const b=p[0].y+m*E;Math.abs(b-M.y)>.5&&w.push(me(M,{y:b}))});break}case"toFirst":{const p=o[0];for(const m of o.slice(1))w.push(me(m,{x:p.x,y:p.y}));break}case"toLast":{const p=o[o.length-1];for(const m of o.slice(0,-1))w.push(me(m,{x:p.x,y:p.y}));break}}return w}function me(o,F){return{action:"patch",kind:o.kind,id:o.id,data:F}}function Dn(o,F,w,y){return Kt(o,w,F,w,y)}function Rn(o,F,w,y){return Kt(o,F,o,w,y)}function Kt(o,F,w,y,h){const _=[],i=Math.max(2,Math.floor(h.count));for(let k=0;k<i;k++){const u=k/(i-1),z={x:o+(w-o)*u,y:F+(y-F)*u,name:`${h.namePrefix??"S"}_${k+1}`,layer:h.layer};_.push({action:"create",kind:"site",data:z})}return _}function jn(o,F,w,y,h){const _=[],i=Math.max(1,Math.floor(h.rows)),k=Math.max(1,Math.floor(h.cols));for(let u=0;u<i;u++)for(let z=0;z<k;z++){const $=k===1?0:z/(k-1),p=i===1?0:u/(i-1);_.push({action:"create",kind:"site",data:{x:o+(w-o)*$,y:F+(y-F)*p,name:`${h.namePrefix??"M"}_${u+1}_${z+1}`,layer:h.layer}})}return _}function On(o,F,w,y){const h=[],_=Math.max(1,Math.floor(y.count)),i=(y.startAngleDeg??0)*Math.PI/180,u=(y.endAngleDeg??360)*Math.PI/180-i;for(let z=0;z<_;z++){const $=Math.abs(u-Math.PI*2)<1e-6?_:_-1,p=$===0?0:z/$,m=i+u*p;h.push({action:"create",kind:"site",data:{x:o+Math.cos(m)*w,y:F+Math.sin(m)*w,name:`${y.namePrefix??"C"}_${z+1}`,layer:y.layer}})}return h}const Kn={class:"map-editor-page"},Yn={class:"me-body"},Xn={class:"me-center"},Hn=["title"],Wn=["accept"],Nt="mapEditor.aiAssistant.open",Ft="mapEditor.aiAssistant.width",Gn=Ae({__name:"MapEditorView",setup(o){const F=Ia(),w=Pa(),y=yt(),h="localhost:8223",_=N(""),i=N(null),k=N(null),u=N("image/*"),z=N("image"),$=Pn(),p=Mn(),m=Un({}),M=Je({x:0,y:0}),E=N(!1),b=N(!1),q=N(360),Q=N(!1),ye=N([-1e4,-1e4,1e4,1e4]),W=N(!1),ve=N(!1),O=N(null),se=N([]),ie=N([]),te=N([]),x=Je({site:{layer:"g",namePrefix:"S",color:"#ffffff"},track:{layer:"g",lineWidth:2,color:"#88ccff"}}),C=N(null),G=N(!1),oe=N(!1);let ke=null,re=0,ce={};const _e=ne(()=>{const e=p.items.value;if(e.length!==1)return null;const t=e[0].kind;return t==="site"||t==="track"?t:null}),B=N(["g"]),Y=N([{name:"g",visible:!0,selectable:!0,color:"#cccccc"}]),Z=Je({selectFilter:{sites:!0,tracks:!0,cars:!0,decor:!0},alignSnap:{sites:!0,cars:!0,tracks:!0},showViewport:{sceneLabels:!0,scenePrimitives:!0,cars:!0}});function he(){try{localStorage.setItem("mapEditor.viewFilter",JSON.stringify(Z))}catch{}}function Qe(){try{const e=localStorage.getItem("mapEditor.viewFilter");if(!e)return;const t=JSON.parse(e);t.selectFilter&&Object.assign(Z.selectFilter,t.selectFilter),t.alignSnap&&Object.assign(Z.alignSnap,t.alignSnap),t.showViewport&&Object.assign(Z.showViewport,t.showViewport)}catch{}}function Oe(){const e=Z.selectFilter,t=p.items.value.filter(n=>n.kind==="site"?e.sites:n.kind==="track"?e.tracks:n.kind==="car"?e.cars:n.kind==="special"?e.decor:!0);t.length!==p.items.value.length&&p.set(t)}const Fe=N(!1),ae=N({siteA:null}),Ke=N(!1),We=N(!1),Te=N("");function Ee(e){return e.map(t=>`${t.kind}:${t.id}`).sort().join(",")}const xe=N(!1),Ie=["draw.site","draw.sites.continuous","draw.track.polyline","draw.track.bezier","draw.track.arc","draw.track.nurbs"];async function g(){if(!xe.value){for(xe.value=!0;xe.value;){let e=null;try{e=await j.pick()}catch{break}if(!xe.value)break;const t=$.activeTool.value;if(!Ie.includes(t))break;if(t==="draw.site"){await c(e.x,e.y),A.success(`已添加站点 (${e.x.toFixed(0)}, ${e.y.toFixed(0)})`);break}else if(t==="draw.sites.continuous")await c(e.x,e.y);else if(t==="draw.track.polyline"||t==="draw.track.bezier"||t==="draw.track.arc"||t==="draw.track.nurbs"){const n=ae.value.siteA;if(await qe(e.siteId),n!=null&&ae.value.siteA==null){const s=t==="draw.track.bezier"?"贝塞尔路径":t==="draw.track.arc"?"弧形路径":t==="draw.track.nurbs"?"NURBS 路径":"直线路径";A.success(`已添加${s}`);break}}else break}xe.value=!1,Ie.includes($.activeTool.value)&&$.setTool("transform.move")}}const d=ne(()=>$.snap.value.grid||$.snap.value.object||$.snap.value.endpoint||$.snap.value.midpoint);async function ze(e){switch(e){case"edit.undo":await m.undo();break;case"edit.redo":await m.redo();break;case"edit.delete":await R();break;case"edit.selectAll":A.info("全选:请使用工具栏「按类型选」批量选中");break;case"edit.invert":A.info("反选功能后续实现");break;case"project.save":await ra();break;case"ai.open":await wt();break;case"file.upload.image":Ze("image");break;case"file.upload.model":Ze("model");break;case"view.fitAll":A.info("请在 3D 视口右键菜单使用「适配全部」");break;case"view.fitSelection":A.info("请在 3D 视口右键菜单使用「适配选中」");break;case"snap.toGrid":$.toggleSnap("grid");break;case"snap.toObject":$.toggleSnap("object");break;case"layer.new":await Le();break;case"layer.toggleVisibility":Fe.value=!0;break;case"view.select.sites":ue("selectFilter","sites");break;case"view.select.tracks":ue("selectFilter","tracks");break;case"view.select.cars":ue("selectFilter","cars");break;case"view.select.decor":ue("selectFilter","decor");break;case"view.snap.sites":ue("alignSnap","sites");break;case"view.snap.cars":ue("alignSnap","cars");break;case"view.snap.tracks":ue("alignSnap","tracks");break;case"view.show.sceneLabels":ue("showViewport","sceneLabels");break;case"view.show.scenePrimitives":ue("showViewport","scenePrimitives");break;case"view.show.cars":ue("showViewport","cars");break;default:A.info(`暂未实现的命令:${e}`)}}async function ue(e,t){const n=Z[e],s=t,f=n[s];n[s]=!n[s],he(),e==="selectFilter"&&Oe();const S={};S[e]={[s]:n[s]};try{await j.setViewFilter(S)}catch(I){console.warn("[MapEditor] 写后端 viewFilter 失败:",I),n[s]=f,he(),e==="selectFilter"&&Oe(),A({message:"过滤设置写入后端失败,已回滚本地状态;请检查 SimpleLite 是否连通后重试。",type:"warning",duration:5e3,showClose:!0})}}function Pe(e){return e==="bezier"?"贝塞尔路径":e==="nurbs"?"NURBS 路径":e==="arc"?"弧形路径":"直线路径"}async function be(e,t){const n=await Me(e),s=await Me(t);if(!n||!s)return A.warning(`无法拉到 site #${e} / #${t} 的 x,y,将不带 typeInfo 创建 track(圆心需手动设置)`),null;const S=Math.hypot(n.x-s.x,n.y-s.y)/2;let I;try{const L=await K.prompt(`请输入半径 (mm),必须 ≥ ${S.toFixed(1)}(等于即半圆)`,"添加弧形路径",{inputValue:String(Math.ceil(S))});I=Number(L.value)}catch{return"cancelled"}return!Number.isFinite(I)||I<S?(A.warning(`半径必须 ≥ ${S.toFixed(1)} mm`),"cancelled"):{typeInfo:ge(n,s,I),radius:I}}function Ge(e){e==="bezier"||e==="nurbs"?A.success(`${e==="bezier"?"贝塞尔":"NURBS"}路径已创建。选中后可在画布看到控制点(白色端点 + 黄色中间点)和控制折线,可在属性面板拖动 / 输入坐标 / 增删控制点继续调整。`):e==="arc"&&A.success("弧形路径已创建。选中后可在画布看到圆心;属性面板「设置圆心、半径」「设定相邻切线」可继续微调。")}async function Me(e){try{const t=await J.getBundle("site",e),n=Number(t.fields?.x??NaN),s=Number(t.fields?.y??NaN);return!Number.isFinite(n)||!Number.isFinite(s)?null:{x:n,y:s}}catch{return null}}function pe(e,t){const n=[String(t),String(e.length)];for(const s of e)n.push(s.x.toFixed(3)),n.push(s.y.toFixed(3));return n.join(",")}function ge(e,t,n,s="left"){const f=t.x-e.x,S=t.y-e.y,I=Math.hypot(f,S),L=I/2,P=n*n-L*L,le=Math.sqrt(Math.max(0,P)),ya=I>0?-S/I:0,va=I>0?f/I:0,St=s==="left"?1:-1,nt=(e.x+t.x)/2+St*le*ya,ot=(e.y+t.y)/2+St*le*va,ba=Math.atan2(e.y-ot,e.x-nt)*180/Math.PI,ga=Math.atan2(t.y-ot,t.x-nt)*180/Math.PI;return["1",nt.toFixed(3),ot.toFixed(3),n.toFixed(3),ba.toFixed(3),ga.toFixed(3)].join(",")}function Ue(e){e&&(x.site.layer=e,x.track.layer=e,A.success(`默认图层已切到 "${e}"`))}async function Le(){try{const t=((await K.prompt("请输入新图层名(同名会被忽略)","新建图层",{inputValue:""})).value??"").trim();if(!t)return;if(B.value.includes(t)){x.site.layer=t,x.track.layer=t,A.info(`图层 "${t}" 已存在,已切到该层`);return}gt(t),x.site.layer=t,x.track.layer=t,A.success(`已创建图层 "${t}",下次创建对象会落到该层`)}catch{}}async function et(e){if($.setTool(e),ae.value.siteA=null,xe.value=!1,e==="select.clear"){p.clear(),await J.clearSelection().catch(()=>{});return}if(Ie.includes(e)&&g(),e.startsWith("align.")){await Xt(e.replace("align.",""));return}if(e.startsWith("batch.")){await Ht(e);return}if(e==="transform.delete"){await R();return}if(e.startsWith("select.byType.")){const t=e.replace("select.byType.","");X(t);return}if(e==="show.controlPoints"&&($.showControlPoints.value=!$.showControlPoints.value),e==="show.controlHandles"&&($.showControlHandles.value=!$.showControlHandles.value),e==="draw.image"&&Ze("image"),e==="draw.model"&&Ze("model"),e==="transform.copyFields"){await Gt();return}}function X(e){e==="site"?p.filterByKind("site"):e==="polyline"||e==="bezier"||e==="arc"?p.items.value=p.items.value.filter(t=>{if(t.kind!=="track")return!1;const n=t.typeName.toLowerCase();return e==="polyline"?n==="uitrack":e==="bezier"?n.includes("bezier"):e==="arc"?n.includes("arc"):!1}):e==="decor"?p.filterByKind("special"):e==="currentLayer"&&O.value?.layer&&(p.items.value=p.items.value.filter(t=>t.layer===O.value.layer))}async function Ve(e){M.x=e.x,M.y=e.y;const t=$.activeTool.value;if(!(xe.value&&Ie.includes(t))&&!Ke.value){if(t==="draw.site"||t==="draw.sites.continuous"){await c(e.x,e.y);return}if(t==="draw.track.polyline"||t==="draw.track.bezier"||t==="draw.track.arc"||t==="draw.track.nurbs"){try{const n=await j.pick();await qe(n.siteId)}catch{}return}}}function Be(e){p.set(Ce(e))}function Ce(e){const t=[],n=Z.selectFilter;for(const s of e){const f=/^UI([A-Za-z]+)-(\d+)$/.exec(s)??/^([A-Za-z]+)-(\d+)$/.exec(s);if(!f)continue;const S=f[1],I=Number(f[2]),L=S.toLowerCase();let P;L==="site"?P="site":L==="car"||L==="vehicle"?P="car":L.includes("track")?P="track":P="special",!(P==="site"&&!n.sites)&&(P==="track"&&!n.tracks||P==="car"&&!n.cars||P==="special"&&!n.decor||t.push({kind:P,id:I,name:s,typeName:s.startsWith("UI")?`UI${S}`:S}))}return t}async function qe(e){if(e<=0){A.warning("请先拾取一个站点");return}if(ae.value.siteA==null){ae.value.siteA=e,A.success(`已选起点站 #${e},请再拾取终点站`);return}const t=ae.value.siteA,n=e;if(ae.value.siteA=null,t===n){A.warning("起止站点不能相同");return}const s=$.activeTool.value==="draw.track.bezier"?"bezier":$.activeTool.value==="draw.track.arc"?"arc":$.activeTool.value==="draw.track.nurbs"?"nurbs":"track";let f,S="";if(s==="bezier"||s==="nurbs"){const L=await tt(t,n,s);if(L==="cancelled")return;L!=null&&(f=L.typeInfo,S=`(控制点 ${L.midCount}`)}else if(s==="arc"){const L=await be(t,n);if(L==="cancelled")return;L!=null&&(f=L.typeInfo,S=`(半径 ${L.radius.toFixed(0)}`)}let I=-1;await m.run({label:`新建${Pe(s)} (${t}${n})${S}`,apply:async()=>{const L={siteA:t,siteB:n,layer:x.track.layer};f&&(L.typeInfo=f),I=(await j.createTrack(s,L)).id},revert:async()=>{I>0&&await j.deleteObject("track",I)}}),Ge(s)}async function tt(e,t,n){const s=await Me(e),f=await Me(t);if(!s||!f)return A.warning(`无法拉到 site #${e} / #${t} 的 x,y,将不带 typeInfo 创建 track(控制点会用兜底直线)`),null;const S=Pe(n);let I;try{const P=await K.prompt("请输入中间控制点个数(不含起止站点;默认 2,输入 0 则不带控制点直接连接两站点)",`创建${S}`,{inputValue:"2",inputPattern:/^\d+$/,inputErrorMessage:"请输入非负整数"});I=Math.max(0,Math.floor(Number(P.value)))}catch{return"cancelled"}if(I===0)return{typeInfo:pe([s,f],n==="bezier"?2:3),midCount:0};A.info(`请在画布上依次点选 ${I} 个中间控制点(任意位置;右键取消创建)`),Ke.value=!0;const L=[];try{for(let P=0;P<I;P++){let le;try{le=await j.pick()}catch{return A.info("已取消创建"),"cancelled"}L.push({x:le.x,y:le.y}),A.success(`已记录第 ${P+1}/${I} 个控制点 (${le.x.toFixed(0)}, ${le.y.toFixed(0)})`)}}finally{Ke.value=!1}return{typeInfo:pe([s,...L,f],n==="bezier"?2:3),midCount:I}}async function c(e,t){let n=-1;await m.run({label:`新建站点 (${e.toFixed(0)}, ${t.toFixed(0)})`,apply:async()=>{n=(await j.createSite({x:e,y:t,layer:x.site.layer,name:`${x.site.namePrefix}-${Date.now()%1e5}`})).id},revert:async()=>{n>0&&await j.deleteObject("site",n)}})}async function R(){const e=[...p.items.value];if(e.length===0)return;const t=[];for(const n of e)try{const s=await J.getBundle(n.kind,n.id);t.push({kind:n.kind,typeName:s.typeName,data:{...s.fields??{}}})}catch{}await m.run({label:`删除 ${e.length} 个对象`,apply:async()=>{const n=e.map(s=>({action:"delete",kind:s.kind,id:s.id}));await j.batch(n),p.clear()},revert:async()=>{const n=t.map(s=>({action:"create",kind:Yt(s.kind,s.typeName),data:s.data}));n.length&&(await j.batch(n),A.success(`已恢复 ${n.length} 个对象(注意:id 已重排)`))}})}function Yt(e,t){const n=(t??"").toLowerCase();if(e==="track")return n.includes("bezier")?"bezier":n.includes("arc")?"arc":n.includes("nurbs")?"nurbs":"track";if(e==="special"){if(n.includes("image"))return"image";if(n.includes("text"))return"text";if(n.includes("model"))return"model"}return e}async function Xt(e){const t=[];for(const s of p.items.value)if(s.kind!=="track")try{const f=await J.getBundle(s.kind,s.id),S=Number(f.fields?.x??0),I=Number(f.fields?.y??0);t.push({kind:s.kind,id:s.id,x:S,y:I})}catch{}if(t.length<2){A.warning("对齐需要选中至少 2 个对象");return}const n=Bn(t,e);if(n.length===0){A.info("对齐无变化");return}await m.run({label:`对齐 (${e})`,apply:async()=>{await j.batch(n)},revert:async()=>{const s=t.map(f=>({action:"patch",kind:f.kind,id:f.id,data:{x:f.x,y:f.y}}));await j.batch(s)}})}async function Ht(e){if(e==="batch.linearH"||e==="batch.linearV"){const t=e==="batch.linearH"?"横向":"纵向";try{const{value:n}=await K.prompt(`输入 ${t}站点数量`,"批量生成",{inputValue:"5",inputType:"number"}),s=Math.max(2,Math.floor(Number(n))),f=await K.prompt("起点 X","批量生成",{inputValue:"0"}),S=await K.prompt("起点 Y","批量生成",{inputValue:"0"}),I=await K.prompt("终点 X","批量生成",{inputValue:"5000"}),L=await K.prompt("终点 Y","批量生成",{inputValue:"0"}),P=e==="batch.linearH"?Dn(Number(f.value),Number(I.value),Number(S.value),{count:s,layer:x.site.layer}):Rn(Number(f.value),Number(S.value),Number(L.value),{count:s,layer:x.site.layer});await at(`${t}间隔生成 ${s}`,P)}catch{}return}if(e==="batch.matrix"){try{const t=Number((await K.prompt("行数","矩阵生成",{inputValue:"3"})).value),n=Number((await K.prompt("列数","矩阵生成",{inputValue:"3"})).value),s=Number((await K.prompt("x1","矩阵生成",{inputValue:"0"})).value),f=Number((await K.prompt("y1","矩阵生成",{inputValue:"0"})).value),S=Number((await K.prompt("x2","矩阵生成",{inputValue:"5000"})).value),I=Number((await K.prompt("y2","矩阵生成",{inputValue:"5000"})).value),L=jn(s,f,S,I,{rows:t,cols:n,layer:x.site.layer});await at(`矩阵生成 ${t}×${n}`,L)}catch{}return}if(e==="batch.circular"){try{const t=Number((await K.prompt("圆心 X","环形阵列",{inputValue:"0"})).value),n=Number((await K.prompt("圆心 Y","环形阵列",{inputValue:"0"})).value),s=Number((await K.prompt("半径 (mm)","环形阵列",{inputValue:"2000"})).value),f=Number((await K.prompt("站点数量","环形阵列",{inputValue:"8"})).value),S=On(t,n,s,{count:f,layer:x.site.layer});await at(`环形阵列 r=${s} n=${f}`,S)}catch{}return}if(e==="batch.alongPath"){await Wt();return}}async function Wt(){const e=p.items.value.filter(f=>f.kind==="track");if(e.length===0){A.warning("请先选中至少 1 条路径");return}let t=500,n=!1;try{const{value:f}=await K.prompt("输入采样间距 (mm)","沿路径采样",{inputValue:"500",inputType:"number"});t=Math.max(10,Math.floor(Number(f)));const{value:S}=await K.prompt("是否包含端点?输入 1 包含,0 不包含","沿路径采样",{inputValue:"0"});n=Number(S)===1}catch{return}const s=[];await m.run({label:`沿 ${e.length} 条路径间距 ${t}mm 采样`,apply:async()=>{for(const f of e){const S=await j.sampleSitesAlongTrack(f.id,{spacingMm:t,includeEndpoints:n,layer:x.site.layer});s.push(...S.ids)}A.success(`已采样生成 ${s.length} 个站点`)},revert:async()=>{if(!s.length)return;const f=s.map(S=>({action:"delete",kind:"site",id:S}));await j.batch(f)}})}async function Gt(){if(p.items.value.length<2){A.warning("字段复制需要 ≥ 2 个选中对象(第 1 个为源,其余为目标)");return}const[e,...t]=p.items.value;try{const{value:n}=await K.prompt("输入要复制的字段名(逗号分隔),例如:x,y,layerName","字段复制",{inputValue:"x,y"}),s=n.split(",").map(S=>S.trim()).filter(Boolean);if(!s.length)return;const f=new Map;for(const S of t)try{const I=await J.getBundle(S.kind,S.id),L={};for(const P of s)L[P]=String(I.fields?.[P]??"");f.set(`${S.kind}:${S.id}`,L)}catch{}await m.run({label:`字段复制 ${s.join(",")}${t.length} 个`,apply:async()=>{const S=await j.copyFieldsTo(e.kind,e.id,s,t.map(I=>({kind:I.kind,id:I.id})));A.success(`已复制 ${S.copied} 项字段`)},revert:async()=>{const S=t.flatMap(I=>{const L=f.get(`${I.kind}:${I.id}`);return L?[{action:"patch",kind:I.kind,id:I.id,data:L}]:[]});S.length&&await j.batch(S)}})}catch{}}async function at(e,t){if(t.length===0)return;let n=[];await m.run({label:e,apply:async()=>{n=(await j.batch(t)).results.filter(f=>f.ok&&f.action==="create"&&f.result?.id).map(f=>({kind:f.result.kind,id:f.result.id}))},revert:async()=>{const s=n.map(f=>({action:"delete",kind:f.kind,id:f.id}));s.length&&await j.batch(s)}}),A.success(`${e} 完成`)}async function Ye(){if(p.items.value.length===0){O.value=null,se.value=[],ie.value=[],te.value=[];return}const e=p.items.value[0];qt();try{const t=await J.getBundle(e.kind,e.id);O.value=t.summary,se.value=Object.entries(t.fields).map(([n,s])=>({key:n,value:String(s)})),ie.value=t.methods,te.value=(t.status??[]).map(n=>({key:n.key,value:n.value}))}catch(t){A.error(`加载属性失败:${t.message}`)}finally{Zt()}}function qt(){ve.value=!0}function Zt(){ve.value=!1}async function Jt(e){if(!O.value||p.items.value.length===0)return;const t=p.items.value[0],n=O.value.id,s=O.value.name??"";s!==e&&(await m.run({label:`重命名 ${s||"(无)"}${e}`,apply:async()=>{await J.setField(t.kind,n,"name",e)},revert:async()=>{try{await J.setField(t.kind,n,"name",s)}catch(f){A.warning(`回滚名称失败:${f.message}`)}}}),A.success("名称已更新"))}async function Qt(e){if(!O.value||p.items.value.length===0)return;const t=p.items.value[0],n=O.value.id,s=O.value.layer??"";s!==e&&(await m.run({label:`修改图层 ${s||"(无)"}${e}`,apply:async()=>{await J.setField(t.kind,n,"layerName",e)},revert:async()=>{try{await J.setField(t.kind,n,"layerName",s)}catch(f){A.warning(`回滚图层失败:${f.message}`)}}}),await Ye())}async function vt(e,t){if(!O.value)return;const n=p.items.value[0];let s;try{const f=await J.getBundle(n.kind,O.value.id);s=f.fields?.[e]!=null?String(f.fields[e]):void 0}catch{}await m.run({label:`修改 ${e}`,apply:async()=>{await J.setField(n.kind,O.value.id,e,t)},revert:async()=>{if(s!==void 0)try{await J.setField(n.kind,O.value.id,e,s)}catch(f){A.warning(`回滚 ${e} 失败:${f.message}`)}else A.warning(`回滚 ${e}:没拿到原值快照,仅本地撤销`)}}),await Ye()}async function ea(){try{const e=(await K.prompt("字段名","新增字段",{inputPattern:/^[A-Za-z0-9_]+$/})).value,t=(await K.prompt("字段值","新增字段",{inputValue:""})).value;await vt(e,t)}catch{}}async function ta(e){if(O.value)try{await J.execute(p.items.value[0].kind,O.value.id,e),A.success(`已执行 ${e}`),await Ye()}catch(t){A.error(`执行失败:${t.message}`)}}function aa(){localStorage.setItem("mapEditor.defaults",JSON.stringify(x)),A.success("新建默认已保存(下次创建对象时生效)")}function bt(e){const t=e.site??e.Site,n=e.track??e.Track,s=(S,I,L)=>Number(S?.[I]??S?.[L]??0),f=(S,I,L)=>!!(S?.[I]??S?.[L]);return Ua({site:{drawScale:s(t,"drawScale","DrawScale"),dotRadiusNormal:s(t,"dotRadiusNormal","DotRadiusNormal"),dotRadiusSelected:s(t,"dotRadiusSelected","DotRadiusSelected"),selectionRingM:s(t,"selectionRingM","SelectionRingM"),colorNormalArgb:s(t,"colorNormalArgb","ColorNormalArgb"),colorSelectedArgb:s(t,"colorSelectedArgb","ColorSelectedArgb"),labelColorNormalArgb:s(t,"labelColorNormalArgb","LabelColorNormalArgb"),labelColorSelectedArgb:s(t,"labelColorSelectedArgb","LabelColorSelectedArgb")},track:{drawScale:s(n,"drawScale","DrawScale"),widthNormal:s(n,"widthNormal","WidthNormal"),widthSelected:s(n,"widthSelected","WidthSelected"),showDirectionArrows:f(n,"showDirectionArrows","ShowDirectionArrows"),colorNormalArgb:s(n,"colorNormalArgb","ColorNormalArgb"),colorSelectedArgb:s(n,"colorSelectedArgb","ColorSelectedArgb")}})}async function lt(){G.value=!0;try{const e=await J.getViewportStyle();C.value=bt(e)}catch(e){console.warn("[MapEditor] 加载视口样式失败:",e)}finally{G.value=!1}}function la(e){e.site&&(ce.site=e.site,C.value&&(C.value={...C.value,site:{...e.site}})),e.track&&(ce.track=e.track,C.value&&(C.value={...C.value,track:{...e.track}})),ke&&clearTimeout(ke),ke=setTimeout(()=>{const t={...ce};ce={},na(t)},350)}async function na(e){const t=++re;oe.value=!0;try{const n={};e.site&&(n.site=e.site),e.track&&(n.track=e.track);const s=await J.patchViewportStyle(n);if(t!==re)return;C.value=bt(s)}catch(n){A.error(`视口样式更新失败:${n.message}`),await lt()}finally{t===re&&(oe.value=!1)}}function oa(e){A.info("图层可见 / 可选切换暂时仅本地生效,后续接入反射 API")}function gt(e){Y.value.find(t=>t.name===e)||(Y.value=[...Y.value,{name:e,visible:!0,selectable:!0,color:"#cccccc"}],B.value=[...B.value,e])}async function wt(){try{const e=await st.get();Q.value=!!e.configured}catch{Q.value=!1}E.value=!0}function sa(){try{b.value=localStorage.getItem(Nt)==="1";const e=Number(localStorage.getItem(Ft));Number.isFinite(e)&&e>=300&&e<=720&&(q.value=e)}catch{}}fe(b,e=>{try{localStorage.setItem(Nt,e?"1":"0")}catch{}}),fe(q,e=>{try{localStorage.setItem(Ft,String(Math.round(e)))}catch{}});async function ia(){if(!b.value)try{const e=await st.get();Q.value=!!e.configured}catch{Q.value=!1}b.value=!b.value}async function kt(e){De();const t=(e.created??[]).filter(s=>typeof s=="object"&&s!=null&&typeof s.id=="number"&&!s.error);if(t.length===0)return;const n={label:`AI 生图:落地 ${t.length} 个对象`,apply:async()=>{},revert:async()=>{const s=t.map(f=>({action:"delete",kind:f.kind,id:f.id}));await j.batch(s),A.success(`已撤销 AI 生图(删除 ${s.length} 个对象)`)}};await m.run(n)}async function ra(){const e=await Ba();if(e==="cancel")return;let t=_.value.trim();t||(t=await Vt(),t&&(_.value=t));let n,s=!1;if(e==="replace"){if(!t){A.warning("未找到可覆盖的原地图,请选择「保存成新项目」");return}n=t,s=!0}else{const f=await Da("保存成新地图",t);if(!f)return;n=f}W.value=!0;try{let f=await it.save(n,s);if(!f.ok&&f.conflict&&e==="new"){try{await K.confirm(`服务器已存在地图「${n}」,是否覆盖该文件?`,"覆盖确认",{type:"warning",confirmButtonText:"覆盖",cancelButtonText:"取消"})}catch{return}f=await it.save(n,!0)}if(!f.ok){A.error(`保存失败:${f.message}`);return}e==="replace"?A.success(`已覆盖保存地图「${n}」`):(_.value=f.data.name,A.success(`新地图「${f.data.name}」已保存到服务器`)),await y.push({path:"/admin/maps"})}catch(f){A.error(`保存失败:${f.message}`)}finally{W.value=!1}}function Ze(e){z.value=e,u.value=e==="image"?"image/*":".obj,.glb,.gltf,.fbx,.cyclemodel",k.value?.click()}async function ua(e){const t=e.target,n=t.files?.[0];if(n)try{const s=await n.arrayBuffer(),f=da(s),S=await j.uploadAsset(n.name,f);A.success(`已上传:${S.fileName}`),z.value==="image"?await j.createImage({x:0,y:0,imagePath:S.savedPath,size:1e3}):await j.createModel({x:0,y:0,modelPath:S.savedPath,scale:1}),De()}catch(s){A.error(`上传失败:${s.message}`)}finally{t.value=""}}function da(e){let t="";const n=new Uint8Array(e);for(let s=0;s<n.byteLength;s++)t+=String.fromCharCode(n[s]);return btoa(t)}Ln({onMouse:e=>{M.x=e.x,M.y=e.y},onPick:e=>{Ve(e)},onSelect:e=>Be(e.names)});const ca=La({onWorkspaceShortcut:e=>{Xe(e.action)},onAlarm:()=>{},onObjectCreated:()=>De(),onObjectDeleted:()=>De(),onObjectPatched:()=>De(),onObjectBatchChanged:()=>De(),onViewportStyleUpdated:()=>{lt()},onSelectionDetail:e=>{if(!Array.isArray(e.names))return;const t=Ce(e.names),n=Ee(t);n!==Te.value&&(Te.value=n,p.set(t))}});function De(){Ye()}fe(()=>ca.connected.value,e=>We.value=e,{immediate:!0}),fe(()=>Ee(p.items.value),e=>{Ye(),Te.value=e,p.items.value.length===1&&J.setSelection(p.items.value[0].kind,p.items.value[0].id).catch(()=>{})});function pa(e){if(!(e instanceof HTMLElement))return!1;const t=e.tagName;return t==="INPUT"||t==="TEXTAREA"||t==="SELECT"||e.isContentEditable?!0:!!e.closest('.el-input, .el-textarea, .el-select, [contenteditable="true"]')}async function Xe(e){if(e==="undo"){if(!m.canUndo.value)return;await m.undo()}else if(e==="redo"){if(!m.canRedo.value)return;await m.redo()}else await R()}function ht(e){if(pa(e.target))return;const t=e.ctrlKey||e.metaKey;t&&e.key.toLowerCase()==="z"&&!e.shiftKey?(e.preventDefault(),Xe("undo")):t&&(e.key.toLowerCase()==="y"||e.key.toLowerCase()==="z"&&e.shiftKey)?(e.preventDefault(),Xe("redo")):e.key==="Delete"&&(e.preventDefault(),Xe("delete"))}function xt(e){const t=e.detail?.action;(t==="undo"||t==="redo"||t==="delete")&&Xe(t)}async function ma(){try{const e=await j.getViewFilter();Object.assign(Z.selectFilter,e.selectFilter),Object.assign(Z.alignSnap,e.alignSnap),Object.assign(Z.showViewport,e.showViewport),he()}catch(e){console.warn("[MapEditor] 拉后端 viewFilter 失败,沿用本地缓存:",e)}}Ot(async()=>{document.addEventListener("keydown",ht,!0),window.addEventListener("workspace-shortcut",xt);try{const t=await st.get();Q.value=!!t.configured}catch{}const e=localStorage.getItem("mapEditor.defaults");if(e)try{Object.assign(x,JSON.parse(e))}catch{}sa(),Qe(),await ma(),await lt(),await fa()});async function fa(){const e=typeof w.query.map=="string"?w.query.map:"",t=w.query.new==="1";if(e)try{const n=await it.open(e);_.value=n.name,p.clear(),O.value=null,A.success(`已载入地图「${n.name}」:${n.sites} 站点 / ${n.tracks} 路径`)}catch(n){A.error(`载入地图失败:${n.message}`)}else if(t)_.value="";else{const n=await Vt();n&&(_.value=n)}}return za(()=>{document.removeEventListener("keydown",ht,!0),window.removeEventListener("workspace-shortcut",xt)}),(e,t)=>{const n=ft,s=Pt,f=zt,S=He,I=mt,L=Ut;return V(),U("div",Kn,[a(Oa,{"can-undo":D(m).canUndo.value,"can-redo":D(m).canRedo.value,saving:W.value,"view-filter":Z,onCmd:ze},null,8,["can-undo","can-redo","saving","view-filter"]),r("div",Yn,[a(el,{"active-tool":D($).activeTool.value,onSelectTool:et,onOpenAi:wt},null,8,["active-tool"]),r("div",Xn,[a(Ma,{ref_key:"workspaceRef",ref:i,host:D(h),scope:D(F).scope??"Platform",token:D(F).token??"","read-only":!1,"embed-ui":!1,"canvas-only":!0,"hide-toolbar":!0,onPick:Ve,onSelect:Be},null,8,["host","scope","token"])]),a(rn,{"selection-count":D(p).count.value,primary:O.value,fields:se.value,status:te.value,methods:ie.value,loading:ve.value,layers:B.value,defaults:x,"layer-rows":Y.value,"selection-kind":_e.value,"viewport-style":C.value,"viewport-style-loading":G.value,"viewport-syncing":oe.value,onRename:Jt,onChangeLayer:Qt,onSetField:vt,onAddField:ea,onExecAction:ta,onSaveDefaults:aa,onLayerToggle:oa,onAddLayer:gt,onDelete:R,onPatchViewport:la},null,8,["selection-count","primary","fields","status","methods","loading","layers","defaults","layer-rows","selection-kind","viewport-style","viewport-style-loading","viewport-syncing"]),r("button",{class:Se(["ai-assistant-fab",{"is-open":b.value}]),style:jt(b.value?{right:q.value+"px"}:void 0),type:"button",title:b.value?"收起 AI 助手":"打开 AI 助手",onClick:ia},[...t[5]||(t[5]=[r("span",{class:"fab-glyph"},"✦",-1),r("span",{class:"fab-text"},[v("AI"),r("br"),v("助手")],-1)])],14,Hn),a(zn,{open:b.value,"onUpdate:open":t[0]||(t[0]=P=>b.value=P),width:q.value,"onUpdate:width":t[1]||(t[1]=P=>q.value=P),configured:Q.value,"default-bounds":ye.value,"default-layer":x.site.layer,onGenerated:kt},null,8,["open","width","configured","default-bounds","default-layer"])]),a(gn,{"selected-count":D(p).count.value,"mouse-x":M.x,"mouse-y":M.y,"tool-label":D($).toolLabel.value,"snap-on":d.value,"undo-size":D(m).undoStack.value.length,"redo-size":D(m).redoStack.value.length,connected:We.value},null,8,["selected-count","mouse-x","mouse-y","tool-label","snap-on","undo-size","redo-size","connected"]),a(Sn,{modelValue:E.value,"onUpdate:modelValue":t[2]||(t[2]=P=>E.value=P),configured:Q.value,"default-bounds":ye.value,"default-layer":x.site.layer,onGenerated:kt},null,8,["modelValue","configured","default-bounds","default-layer"]),a(L,{modelValue:Fe.value,"onUpdate:modelValue":t[4]||(t[4]=P=>Fe.value=P),title:"切换显示图层",width:"520px"},{footer:l(()=>[a(S,{onClick:t[3]||(t[3]=P=>Fe.value=!1)},{default:l(()=>[...t[6]||(t[6]=[v("关闭",-1)])]),_:1}),a(S,{type:"primary",onClick:Le},{default:l(()=>[...t[7]||(t[7]=[v("新建图层…",-1)])]),_:1})]),default:l(()=>[a(I,{data:Y.value,size:"small",style:{width:"100%"}},{default:l(()=>[a(n,{prop:"name",label:"图层","min-width":"120"}),a(n,{label:"可见",width:"80"},{default:l(({row:P})=>[a(s,{modelValue:P.visible,"onUpdate:modelValue":le=>P.visible=le},null,8,["modelValue","onUpdate:modelValue"])]),_:1}),a(n,{label:"可选",width:"80"},{default:l(({row:P})=>[a(s,{modelValue:P.selectable,"onUpdate:modelValue":le=>P.selectable=le},null,8,["modelValue","onUpdate:modelValue"])]),_:1}),a(n,{label:"颜色",width:"100"},{default:l(({row:P})=>[a(f,{modelValue:P.color,"onUpdate:modelValue":le=>P.color=le,size:"small"},null,8,["modelValue","onUpdate:modelValue"])]),_:1}),a(n,{label:"默认层",width:"110"},{default:l(({row:P})=>[a(S,{size:"small",type:x.site.layer===P.name?"primary":"default",onClick:le=>Ue(P.name)},{default:l(()=>[v(T(x.site.layer===P.name?"当前默认":"设为默认"),1)]),_:2},1032,["type","onClick"])]),_:1})]),_:1},8,["data"])]),_:1},8,["modelValue"]),r("input",{ref_key:"fileInputRef",ref:k,type:"file",style:{display:"none"},accept:u.value,onChange:ua},null,40,Wn)])}}}),Co=Ne(Gn,[["__scopeId","data-v-108ea5ac"]]);export{Co as default};