将维护策略与车队生命周期并入车辆运维 Tab,补充旧路由重定向与 RBAC 页面 key 迁移;改进 Workspace3D 就绪探测与 wwwroot 静态资源。 Co-authored-by: Cursor <cursoragent@cursor.com>
2 lines
78 KiB
JavaScript
2 lines
78 KiB
JavaScript
import{aG as Ae,aC as U,aF as a,I as na,bH as l,az as s,af as rt,aA as J,aB as Z,ac as ut,b7 as V,r as Xe,aE as y,K as oa,J as sa,bo as j,aj as Ne,a2 as xt,ah as ce,bh as we,b1 as Be,bG as he,ab as ia,bf as $,a8 as ra,Q as Vt,br as O,aT as kt,aX as _t,Z as ua,R as dt,E as ct,N as $t,O as Ct,S as At,z as Nt,a7 as jt,a9 as qe,aa as Qe,av as Q,a3 as da,be as Ze,G as pt,ag as ca,bs as pa,a0 as ma,$ as fa,x as va,T as ya,y as ba,bv as ga,X as C,bJ as wa,bI as ha,by as ka,b5 as Ft,b4 as _a,bt as Sa,b6 as xa,Y as H}from"./index-CC_hCGHZ.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 Va}from"./Workspace3D-CE3B9LLc.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{h as ze,a as Ie,r as q,n as $a}from"./reflection-CTDOoTn5.js";/* empty css *//* empty css *//* empty css *//* empty css */import{m as R,a as St}from"./mapEdit-Z_uHqZwy.js";/* empty css */import{u as Ca}from"./useMapEditStream-BAGhVPpt.js";import"./useProjectionStream-C_klWvmm.js";const Aa={class:"edit-top-bar"},Na=Ae({__name:"EditTopBar",props:{canUndo:{type:Boolean},canRedo:{type:Boolean},saving:{type:Boolean},viewFilter:{}},emits:["cmd"],setup(o,{emit:A}){const g=A;function p(x){g("cmd",x)}function h(x){return x?"☑":"☐"}return(x,r)=>{const m=Xe,n=sa,_=oa,F=na,f=rt,b=ut;return V(),U("div",Aa,[a(F,{trigger:"click",onCommand:p},{dropdown:l(()=>[a(_,null,{default:l(()=>[a(n,{command:"project.open"},{default:l(()=>[...r[3]||(r[3]=[y("加载文件…",-1)])]),_:1}),a(n,{command:"project.save"},{default:l(()=>[...r[4]||(r[4]=[y("保存文件",-1)])]),_:1}),a(n,{command:"project.saveAs"},{default:l(()=>[...r[5]||(r[5]=[y("另存为…",-1)])]),_:1}),a(n,{command:"project.props",divided:""},{default:l(()=>[...r[6]||(r[6]=[y("项目属性",-1)])]),_:1}),a(n,{command:"project.close"},{default:l(()=>[...r[7]||(r[7]=[y("关闭",-1)])]),_:1})]),_:1})]),default:l(()=>[a(m,{text:"",class:"topbar-btn"},{default:l(()=>[...r[2]||(r[2]=[y("项目加载和保存",-1)])]),_:1})]),_:1}),a(F,{trigger:"click",onCommand:p},{dropdown:l(()=>[a(_,null,{default:l(()=>[a(n,{command:"file.import.dwg"},{default:l(()=>[...r[9]||(r[9]=[y("导入 .dwg/.dxf",-1)])]),_:1}),a(n,{command:"file.import.geojson"},{default:l(()=>[...r[10]||(r[10]=[y("导入 .geojson",-1)])]),_:1}),a(n,{command:"file.upload.image",divided:""},{default:l(()=>[...r[11]||(r[11]=[y("导入图片",-1)])]),_:1}),a(n,{command:"file.upload.model"},{default:l(()=>[...r[12]||(r[12]=[y("导入 CycleGUI 模型",-1)])]),_:1}),a(n,{command:"file.export.png",divided:""},{default:l(()=>[...r[13]||(r[13]=[y("导出 PNG",-1)])]),_:1}),a(n,{command:"file.export.svg"},{default:l(()=>[...r[14]||(r[14]=[y("导出 SVG",-1)])]),_:1}),a(n,{command:"file.export.json"},{default:l(()=>[...r[15]||(r[15]=[y("导出 JSON",-1)])]),_:1})]),_:1})]),default:l(()=>[a(m,{text:"",class:"topbar-btn"},{default:l(()=>[...r[8]||(r[8]=[y("导入",-1)])]),_:1})]),_:1}),a(F,{trigger:"click",onCommand:p},{dropdown:l(()=>[a(_,null,{default:l(()=>[a(n,{command:"edit.cut"},{default:l(()=>[...r[17]||(r[17]=[y("剪切 (Ctrl+X)",-1)])]),_:1}),a(n,{command:"edit.copy"},{default:l(()=>[...r[18]||(r[18]=[y("复制 (Ctrl+C)",-1)])]),_:1}),a(n,{command:"edit.paste"},{default:l(()=>[...r[19]||(r[19]=[y("粘贴 (Ctrl+V)",-1)])]),_:1}),a(n,{command:"edit.delete"},{default:l(()=>[...r[20]||(r[20]=[y("删除 (Del)",-1)])]),_:1}),a(n,{command:"edit.selectAll",divided:""},{default:l(()=>[...r[21]||(r[21]=[y("全选",-1)])]),_:1}),a(n,{command:"edit.invert"},{default:l(()=>[...r[22]||(r[22]=[y("反选",-1)])]),_:1})]),_:1})]),default:l(()=>[a(m,{text:"",class:"topbar-btn"},{default:l(()=>[...r[16]||(r[16]=[y("编辑",-1)])]),_:1})]),_:1}),a(F,{trigger:"click",onCommand:p},{dropdown:l(()=>[a(_,null,{default:l(()=>[a(n,{command:"edit.undo",disabled:!o.canUndo},{default:l(()=>[...r[24]||(r[24]=[y("撤销 (Ctrl+Z)",-1)])]),_:1},8,["disabled"]),a(n,{command:"edit.redo",disabled:!o.canRedo},{default:l(()=>[...r[25]||(r[25]=[y("重做 (Ctrl+Y)",-1)])]),_:1},8,["disabled"])]),_:1})]),default:l(()=>[a(m,{text:"",class:"topbar-btn"},{default:l(()=>[...r[23]||(r[23]=[y("撤销",-1)])]),_:1})]),_:1}),a(F,{trigger:"click",onCommand:p},{dropdown:l(()=>[a(_,null,{default:l(()=>[a(n,{command:"view.fitAll"},{default:l(()=>[...r[27]||(r[27]=[y("缩放至全屏",-1)])]),_:1}),a(n,{command:"view.fitSelection"},{default:l(()=>[...r[28]||(r[28]=[y("缩放至选中",-1)])]),_:1}),a(n,{command:"view.toggleGrid",divided:""},{default:l(()=>[...r[29]||(r[29]=[y("显示网格",-1)])]),_:1}),a(n,{command:"view.toggleScale"},{default:l(()=>[...r[30]||(r[30]=[y("显示比例尺",-1)])]),_:1}),a(n,{command:"view.toggle2D"},{default:l(()=>[...r[31]||(r[31]=[y("切换 2D / 3D",-1)])]),_:1})]),_:1})]),default:l(()=>[a(m,{text:"",class:"topbar-btn"},{default:l(()=>[...r[26]||(r[26]=[y("视图",-1)])]),_:1})]),_:1}),a(F,{trigger:"click",onCommand:p},{dropdown:l(()=>[a(_,null,{default:l(()=>[a(n,{command:"layer.new"},{default:l(()=>[...r[33]||(r[33]=[y("新建图层…",-1)])]),_:1}),a(n,{command:"layer.toggleVisibility"},{default:l(()=>[...r[34]||(r[34]=[y("切换显示图层…",-1)])]),_:1})]),_:1})]),default:l(()=>[a(m,{text:"",class:"topbar-btn"},{default:l(()=>[...r[32]||(r[32]=[y("图层",-1)])]),_:1})]),_:1}),a(F,{trigger:"click",onCommand:p},{dropdown:l(()=>[a(_,{class:"topbar-filter-menu"},{default:l(()=>[a(n,{disabled:"",class:"topbar-filter-header"},{default:l(()=>[...r[36]||(r[36]=[y("选择(可拾取)",-1)])]),_:1}),a(n,{command:"view.select.sites"},{default:l(()=>[y(j(h(o.viewFilter.selectFilter.sites))+" 站点",1)]),_:1}),a(n,{command:"view.select.tracks"},{default:l(()=>[y(j(h(o.viewFilter.selectFilter.tracks))+" 路径",1)]),_:1}),a(n,{command:"view.select.cars"},{default:l(()=>[y(j(h(o.viewFilter.selectFilter.cars))+" AGV",1)]),_:1}),a(n,{command:"view.select.decor"},{default:l(()=>[y(j(h(o.viewFilter.selectFilter.decor))+" 区域 / 装饰",1)]),_:1}),a(n,{divided:"",disabled:"",class:"topbar-filter-header"},{default:l(()=>[...r[37]||(r[37]=[y("对齐(鼠标吸附)",-1)])]),_:1}),a(n,{command:"view.snap.sites"},{default:l(()=>[y(j(h(o.viewFilter.alignSnap.sites))+" 吸附站点",1)]),_:1}),a(n,{command:"view.snap.cars"},{default:l(()=>[y(j(h(o.viewFilter.alignSnap.cars))+" 吸附 AGV",1)]),_:1}),a(n,{command:"view.snap.tracks"},{default:l(()=>[y(j(h(o.viewFilter.alignSnap.tracks))+" 吸附路径",1)]),_:1}),a(n,{divided:"",disabled:"",class:"topbar-filter-header"},{default:l(()=>[...r[38]||(r[38]=[y("显示内容",-1)])]),_:1}),a(n,{command:"view.show.sceneLabels"},{default:l(()=>[y(j(h(o.viewFilter.showViewport.sceneLabels))+" 场景图元标记",1)]),_:1}),a(n,{command:"view.show.scenePrimitives"},{default:l(()=>[y(j(h(o.viewFilter.showViewport.scenePrimitives))+" 场景图元",1)]),_:1}),a(n,{command:"view.show.cars"},{default:l(()=>[y(j(h(o.viewFilter.showViewport.cars))+" 车辆",1)]),_:1})]),_:1})]),default:l(()=>[a(m,{text:"",class:"topbar-btn"},{default:l(()=>[...r[35]||(r[35]=[y("过滤",-1)])]),_:1})]),_:1}),r[42]||(r[42]=s("div",{class:"spacer"},null,-1)),a(f,{content:"撤销 (Ctrl+Z)",placement:"bottom"},{default:l(()=>[a(m,{size:"small",disabled:!o.canUndo,class:"topbar-icon-btn",onClick:r[0]||(r[0]=B=>p("edit.undo"))},{default:l(()=>[...r[39]||(r[39]=[y("↶",-1)])]),_:1},8,["disabled"])]),_:1}),a(f,{content:"重做 (Ctrl+Y)",placement:"bottom"},{default:l(()=>[a(m,{size:"small",disabled:!o.canRedo,class:"topbar-icon-btn",onClick:r[1]||(r[1]=B=>p("edit.redo"))},{default:l(()=>[...r[40]||(r[40]=[y("↷",-1)])]),_:1},8,["disabled"])]),_:1}),o.saving?(V(),J(b,{key:0,type:"warning",effect:"dark",class:"topbar-saving-tag",size:"small"},{default:l(()=>[...r[41]||(r[41]=[y(" 保存中… ",-1)])]),_:1})):Z("",!0)])}}}),ja=Ne(Na,[["__scopeId","data-v-11791a50"]]),Fa={class:"edit-tool-rail"},Pa={class:"rail-group-title"},Ta={class:"rail-group-text"},Ea={class:"rail-group-list"},za=["onClick"],Ia={class:"rail-btn-glyph"},Ba={class:"rail-btn-label"},Ua={key:0,class:"rail-divider"},La={class:"rail-group rail-group-ai"},Ma=Ae({__name:"EditToolRail",props:{activeTool:{}},emits:["select-tool","open-ai"],setup(o,{emit:A}){const g=o,p=A,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 x(m){return m===g.activeTool}function r(m){p("select-tool",m)}return(m,n)=>{const _=rt,F=xt;return V(),U("div",Fa,[a(F,{class:"rail-scroll"},{default:l(()=>[(V(),U(ce,null,we(h,(f,b)=>s("div",{key:f.id,class:"rail-group"},[s("div",Pa,[n[1]||(n[1]=s("span",{class:"rail-group-bar"},null,-1)),s("span",Ta,j(f.title),1),n[2]||(n[2]=s("span",{class:"rail-group-bar"},null,-1))]),s("div",Ea,[(V(!0),U(ce,null,we(f.tools,B=>(V(),J(_,{key:B.id,content:B.tip??B.label,placement:"right","show-after":280},{default:l(()=>[s("button",{class:Be(["rail-btn",{"rail-btn--active":x(B.id)}]),onClick:T=>r(B.id)},[s("span",Ia,j(B.glyph),1),s("span",Ba,j(B.label),1)],10,za)]),_:2},1032,["content"]))),128))]),b<h.length-1?(V(),U("div",Ua)):Z("",!0)])),64)),s("div",La,[n[4]||(n[4]=s("div",{class:"rail-group-title"},[s("span",{class:"rail-group-bar"}),s("span",{class:"rail-group-text"},"AI"),s("span",{class:"rail-group-bar"})],-1)),s("button",{class:"rail-btn rail-btn--ai",onClick:n[0]||(n[0]=f=>p("open-ai"))},[...n[3]||(n[3]=[s("span",{class:"rail-btn-glyph"},"✦",-1),s("span",{class:"rail-btn-label"},"AI 生图",-1)])])])]),_:1})])}}}),Da=Ne(Ma,[["__scopeId","data-v-6b284dea"]]),Ra={class:"edit-property-panel"},Oa={key:0,class:"empty-hint"},Ya={key:1,class:"loading-hint"},Ka={key:2,class:"object-pane"},Ha={class:"prop-card prop-card--header"},Xa={class:"prop-card-row"},Wa={class:"prop-id-block"},Ga={class:"prop-id-tag"},Ja={class:"prop-type-tag"},Za={class:"prop-header-actions"},qa=["disabled"],Qa={class:"prop-delete-icon"},el={class:"prop-card-row prop-name-row"},tl={class:"prop-card-row prop-layer-row"},al={key:0,class:"prop-card prop-card--geom"},ll={class:"prop-card-header"},nl=["title"],ol={class:"prop-card-flag-text"},sl={class:"prop-card-meta"},il={class:"prop-grid"},rl={class:"prop-field-label"},ul={key:0,class:"prop-field-unit"},dl={key:1,class:"prop-card prop-card--style"},cl={class:"prop-card-header"},pl={class:"prop-card-meta"},ml={class:"prop-grid"},fl={class:"prop-field-label"},vl={class:"prop-card prop-card--custom"},yl={class:"prop-card-header"},bl={class:"prop-card-meta"},gl={key:0,class:"prop-grid"},wl=["title"],hl={class:"prop-field-row"},kl=["onClick"],_l={key:1,class:"prop-empty-row"},Sl={key:2,class:"prop-card prop-card--status"},xl={class:"prop-card-header"},Vl={class:"prop-card-meta"},$l={class:"prop-status-list"},Cl={class:"prop-status-key"},Al=["title"],Nl={key:3,class:"prop-card prop-card--actions"},jl={class:"prop-card-header"},Fl={class:"prop-card-meta"},Pl={class:"prop-actions"},Tl=["disabled","onClick"],El={key:0,class:"prop-action-spinner"},zl={class:"prop-action-label"},Il={class:"defaults-pane"},Bl={key:0,class:"empty-hint defaults-empty"},Ul={class:"prop-card prop-card--style"},Ll={class:"prop-card-header"},Ml={class:"prop-card-flag-text"},Dl={class:"prop-card"},Rl={class:"prop-card prop-card--style"},Ol={class:"prop-card-header"},Yl={class:"prop-card-flag-text"},Kl={class:"prop-card"},Hl={key:3,class:"loading-hint"},Xl=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:A}){const g=o,p=A,h=$("object"),x=$(!1);let r=null;const m=$(null),n=$(null);he(()=>g.viewportStyle,v=>{if(!v){m.value=null,n.value=null;return}m.value={...v.site},n.value={...v.track}},{immediate:!0,deep:!0}),he(()=>g.selectionKind,v=>{(v==="site"||v==="track")&&(h.value="defaults")});function _(){x.value=!0,r&&clearTimeout(r),r=setTimeout(()=>{x.value=!1},1400)}he(()=>g.viewportSyncing,(v,d)=>{d&&!v&&_()});function F(v){m.value&&(m.value={...m.value,...v},p("patch-viewport",{site:{...m.value}}))}function f(v){n.value&&(n.value={...n.value,...v},p("patch-viewport",{track:{...n.value}}))}const b=$(null),B=$(""),T=$(!1),k=$(!1);let W=null;function te(){k.value=!0,W&&clearTimeout(W),W=setTimeout(()=>{k.value=!1},1200)}const oe=new Set(["id","name","layerName"]),M=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"]),pe=new Set(["color","displaySetting","direction","typeInfo","mustFree","imagePath","modelPath","fontFamily","fontSize","textColor","lineWidth","opacity"]),ge={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:"透明度"},le={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"},D=Q(()=>g.fields.filter(v=>!oe.has(v.key))),X=Q(()=>D.value.filter(v=>M.has(v.key))),se=Q(()=>D.value.filter(v=>pe.has(v.key))),P=Q(()=>D.value.filter(v=>!M.has(v.key)&&!pe.has(v.key)));function N(v){return ge[v]??v}function ie(v){return le[v]??""}function me(v){if(v==null||v==="")return;const d=Number(v);return Number.isFinite(d)?d:void 0}function Se(v){return v.toLowerCase().includes("angle")||v.toLowerCase().includes("rotation")||v==="theta"?1:v==="scale"||v==="opacity"?.1:10}function ae(v){return M.has(v)}function re(v,d){return v==="color"||v==="textColor"?!0:/^#[0-9a-fA-F]{3,8}$/.test(d)}function L(v,d){return d==="true"||d==="false"||d==="True"||d==="False"}function xe(v){return v==="true"||v==="True"||v==="1"}const Ue=Q(()=>{const v=(g.primary?.status??"").toLowerCase();return v?v.includes("error")||v.includes("alarm")||v.includes("failed")?"danger":v.includes("warn")||v.includes("idle")?"warning":v.includes("online")||v.includes("running")||v.includes("ready")||v.includes("ok")?"success":"info":"info"}),Y=$("");he(()=>g.primary?.name??"",v=>{Y.value=v},{immediate:!0});function ke(){fe()}function fe(){if(!g.primary)return;const v=Y.value;v!==(g.primary.name??"")&&p("rename",v)}function Le(v){p("change-layer",v)}function ve(v,d){p("set-field",v,d),M.has(v)&&te()}function Me(){p("add-field")}async function We(v){try{b.value=v,p("exec-action",v)}finally{b.value=null}}function ye(){p("save-defaults")}function _e(v){p("layer-toggle",v)}function et(){const v=B.value.trim();v&&(p("add-layer",v),B.value="")}function tt(){g.selectionCount===0||T.value||(T.value=!0,p("delete"),setTimeout(()=>{T.value=!1},600))}return(v,d)=>{const Ve=Vt,at=ut,De=rt,ne=dt,Re=ua,lt=da,be=At,ue=Nt,je=jt,Oe=ra,Ge=ct,G=Ct,$e=$t,Fe=Xe,Pe=Qe,Ye=qe,Te=ia;return V(),U("div",Ra,[a(Te,{modelValue:h.value,"onUpdate:modelValue":d[20]||(d[20]=c=>h.value=c),class:"prop-tabs"},{default:l(()=>[a(Oe,{label:"对象",name:"object"},{default:l(()=>[o.selectionCount===0?(V(),U("div",Oa,[a(Ve,{class:"empty-icon"},{default:l(()=>[a(O(kt))]),_:1}),d[21]||(d[21]=s("span",{class:"empty-title"},"未选中对象",-1)),d[22]||(d[22]=s("span",{class:"empty-desc"},"在画布上点击或框选以编辑属性。",-1))])):o.loading?(V(),U("div",Ya,[a(Ve,{class:"is-loading"},{default:l(()=>[a(O(_t))]),_:1}),d[23]||(d[23]=s("span",null,"加载属性…",-1))])):(V(),U("div",Ka,[s("section",Ha,[s("div",Xa,[s("div",Wa,[s("span",Ga,j(o.selectionCount>1?`多选 ${o.selectionCount}`:`#${o.primary?.id??"-"}`),1),s("span",Ja,j(o.primary?.typeName??"-"),1)]),s("div",Za,[o.primary?.status?(V(),J(at,{key:0,type:Ue.value,size:"small",effect:"dark",class:"prop-status-tag"},{default:l(()=>[y(j(o.primary.status),1)]),_:1},8,["type"])):Z("",!0),a(De,{content:o.selectionCount>1?`删除选中的 ${o.selectionCount} 个对象(可 Ctrl+Z 撤销)`:"删除该对象(可 Ctrl+Z 撤销)",placement:"top","show-after":220},{default:l(()=>[s("button",{type:"button",class:"prop-delete-btn",disabled:T.value,onClick:tt},[s("span",Qa,j(T.value?"⟳":"🗑"),1),d[24]||(d[24]=s("span",null,"删除",-1))],8,qa)]),_:1},8,["content"])])]),s("div",el,[d[25]||(d[25]=s("label",{class:"prop-name-label"},"名称",-1)),o.primary?(V(),J(ne,{key:0,"model-value":Y.value,size:"small",placeholder:"对象名","onUpdate:modelValue":d[0]||(d[0]=c=>Y.value=c),onBlur:ke,onChange:fe},null,8,["model-value"])):Z("",!0)]),s("div",tl,[d[26]||(d[26]=s("label",{class:"prop-name-label"},"图层",-1)),o.primary?(V(),J(lt,{key:0,"model-value":o.primary.layer??"",size:"small",placeholder:"—",class:"prop-layer-select","onUpdate:modelValue":d[1]||(d[1]=c=>Le(c))},{default:l(()=>[a(Re,{label:"(无)",value:""}),(V(!0),U(ce,null,we(o.layers,c=>(V(),J(Re,{key:c,label:c,value:c},null,8,["label","value"]))),128))]),_:1},8,["model-value"])):Z("",!0)])]),X.value.length>0?(V(),U("section",al,[s("header",ll,[d[28]||(d[28]=s("span",{class:"prop-card-title"},"位置 / 几何",-1)),s("span",{class:Be(["prop-card-flag",{"is-synced":k.value}]),title:k.value?"已同步到画布":"改动会立即同步到 SimpleLite 画布"},[d[27]||(d[27]=s("span",{class:"prop-card-flag-dot"},null,-1)),s("span",ol,j(k.value?"已同步":"同步到画布"),1)],10,nl),s("span",sl,j(X.value.length)+" 项",1)]),s("div",il,[(V(!0),U(ce,null,we(X.value,c=>(V(),U("div",{key:c.key,class:"prop-grid-item"},[s("label",rl,[y(j(N(c.key))+" ",1),ie(c.key)?(V(),U("span",ul,j(ie(c.key)),1)):Z("",!0)]),ae(c.key)?(V(),J(be,{key:0,"model-value":me(c.value),controls:!1,step:Se(c.key),size:"small",class:"prop-field-num",onChange:K=>ve(c.key,K==null?"":String(K))},null,8,["model-value","step","onChange"])):(V(),J(ne,{key:1,"model-value":c.value,size:"small",spellcheck:"false",onChange:K=>ve(c.key,K)},null,8,["model-value","onChange"]))]))),128))])])):Z("",!0),se.value.length>0?(V(),U("section",dl,[s("header",cl,[d[29]||(d[29]=s("span",{class:"prop-card-title"},"样式 / 外观",-1)),s("span",pl,j(se.value.length)+" 项",1)]),s("div",ml,[(V(!0),U(ce,null,we(se.value,c=>(V(),U("div",{key:c.key,class:"prop-grid-item"},[s("label",fl,j(N(c.key)),1),re(c.key,c.value)?(V(),J(ue,{key:0,"model-value":c.value||"#ffffff","show-alpha":"",size:"small",onChange:K=>ve(c.key,K??"")},null,8,["model-value","onChange"])):L(c.key,c.value)?(V(),J(je,{key:1,"model-value":xe(c.value),size:"small",onChange:K=>ve(c.key,K?"true":"false")},null,8,["model-value","onChange"])):(V(),J(ne,{key:2,"model-value":c.value,size:"small",spellcheck:"false",onChange:K=>ve(c.key,K)},null,8,["model-value","onChange"]))]))),128))])])):Z("",!0),s("section",vl,[s("header",yl,[d[30]||(d[30]=s("span",{class:"prop-card-title"},"其它字段 / 自定义",-1)),s("span",bl,j(P.value.length)+" 项",1)]),P.value.length>0?(V(),U("div",gl,[(V(!0),U(ce,null,we(P.value,c=>(V(),U("div",{key:c.key,class:"prop-grid-item prop-grid-item--wide"},[s("label",{class:"prop-field-label",title:c.key},j(c.key),9,wl),s("div",hl,[a(ne,{"model-value":c.value,size:"small",spellcheck:"false",onChange:K=>ve(c.key,K)},null,8,["model-value","onChange"]),a(De,{content:"删除该字段",placement:"top"},{default:l(()=>[s("button",{class:"prop-field-icon-btn",onClick:K=>ve(c.key,"")},"×",8,kl)]),_:2},1024)])]))),128))])):(V(),U("div",_l,"无其它字段")),s("button",{class:"prop-add-field-btn",onClick:Me},"+ 添加字段")]),o.status.length>0?(V(),U("section",Sl,[s("header",xl,[d[31]||(d[31]=s("span",{class:"prop-card-title"},"运行状态",-1)),s("span",Vl,j(o.status.length)+" 项",1)]),s("div",$l,[(V(!0),U(ce,null,we(o.status,c=>(V(),U("div",{key:c.key,class:"prop-status-item"},[s("span",Cl,j(c.key),1),s("span",{class:"prop-status-value",title:c.value},j(c.value),9,Al)]))),128))])])):Z("",!0),o.methods.length>0?(V(),U("section",Nl,[s("header",jl,[d[32]||(d[32]=s("span",{class:"prop-card-title"},"操作",-1)),s("span",Fl,j(o.methods.length)+" 项",1)]),s("div",Pl,[(V(!0),U(ce,null,we(o.methods,c=>(V(),J(De,{key:c.methodName,content:c.description||c.label||c.methodName,placement:"top","show-after":220},{default:l(()=>[s("button",{class:"prop-action-btn",disabled:b.value===c.methodName,onClick:K=>We(c.methodName)},[b.value===c.methodName?(V(),U("span",El,"⟳")):Z("",!0),d[33]||(d[33]=s("span",{class:"prop-action-icon"},"▶",-1)),s("span",zl,j(c.label||c.methodName),1)],8,Tl)]),_:2},1032,["content"]))),128))])])):Z("",!0)]))]),_:1}),a(Oe,{label:"类型默认",name:"defaults"},{default:l(()=>[s("div",Il,[a(Ge,{type:"info",closable:!1,class:"defaults-alert"},{default:l(()=>[...d[34]||(d[34]=[y(" 视口样式与 SimpleLite「视口样式」对话框同步,修改后即时重绘画布;下方「新建默认」仅影响下次创建对象。 ",-1)])]),_:1}),o.selectionKind?o.selectionKind==="site"&&m.value?(V(),U(ce,{key:1},[s("section",Ul,[s("header",Ll,[d[38]||(d[38]=s("span",{class:"prop-card-title"},"站点视口样式",-1)),s("span",{class:Be(["prop-card-flag",{"is-synced":x.value}])},[d[37]||(d[37]=s("span",{class:"prop-card-flag-dot"},null,-1)),s("span",Ml,j(o.viewportSyncing?"同步中…":x.value?"已同步":"实时同步"),1)],2)]),a($e,{"label-width":"132px",size:"small",class:"defaults-form"},{default:l(()=>[a(G,{label:"整体大小倍率"},{default:l(()=>[a(be,{"model-value":m.value.drawScale,min:.25,max:12,step:.1,controls:!0,"onUpdate:modelValue":d[2]||(d[2]=c=>F({drawScale:c??m.value.drawScale}))},null,8,["model-value"])]),_:1}),a(G,{label:"未选中圆点半径"},{default:l(()=>[a(be,{"model-value":m.value.dotRadiusNormal,min:1,max:24,step:.5,"onUpdate:modelValue":d[3]||(d[3]=c=>F({dotRadiusNormal:c??m.value.dotRadiusNormal}))},null,8,["model-value"])]),_:1}),a(G,{label:"选中圆点半径"},{default:l(()=>[a(be,{"model-value":m.value.dotRadiusSelected,min:1,max:32,step:.5,"onUpdate:modelValue":d[4]||(d[4]=c=>F({dotRadiusSelected:c??m.value.dotRadiusSelected}))},null,8,["model-value"])]),_:1}),a(G,{label:"选中环半径 (m)"},{default:l(()=>[a(be,{"model-value":m.value.selectionRingM,min:.02,max:.8,step:.01,"onUpdate:modelValue":d[5]||(d[5]=c=>F({selectionRingM:c??m.value.selectionRingM}))},null,8,["model-value"])]),_:1}),a(G,{label:"站点颜色(未选中)"},{default:l(()=>[a(ue,{"model-value":O(Ie)(m.value.colorNormalArgb),"onUpdate:modelValue":d[6]||(d[6]=c=>F({colorNormalArgb:O(ze)(c??"#ffffff")}))},null,8,["model-value"])]),_:1}),a(G,{label:"站点颜色(选中)"},{default:l(()=>[a(ue,{"model-value":O(Ie)(m.value.colorSelectedArgb),"onUpdate:modelValue":d[7]||(d[7]=c=>F({colorSelectedArgb:O(ze)(c??"#ff0000")}))},null,8,["model-value"])]),_:1}),a(G,{label:"标签颜色(未选中)"},{default:l(()=>[a(ue,{"model-value":O(Ie)(m.value.labelColorNormalArgb),"onUpdate:modelValue":d[8]||(d[8]=c=>F({labelColorNormalArgb:O(ze)(c??"#ffffff")}))},null,8,["model-value"])]),_:1}),a(G,{label:"标签颜色(选中)"},{default:l(()=>[a(ue,{"model-value":O(Ie)(m.value.labelColorSelectedArgb),"onUpdate:modelValue":d[9]||(d[9]=c=>F({labelColorSelectedArgb:O(ze)(c??"#ff0000")}))},null,8,["model-value"])]),_:1})]),_:1})]),s("section",Dl,[d[40]||(d[40]=s("header",{class:"prop-card-header"},[s("span",{class:"prop-card-title"},"新建站点默认")],-1)),a($e,{"label-width":"132px",size:"small",class:"defaults-form"},{default:l(()=>[a(G,{label:"默认图层"},{default:l(()=>[a(ne,{modelValue:o.defaults.site.layer,"onUpdate:modelValue":d[10]||(d[10]=c=>o.defaults.site.layer=c)},null,8,["modelValue"])]),_:1}),a(G,{label:"名字前缀"},{default:l(()=>[a(ne,{modelValue:o.defaults.site.namePrefix,"onUpdate:modelValue":d[11]||(d[11]=c=>o.defaults.site.namePrefix=c)},null,8,["modelValue"])]),_:1}),a(Fe,{size:"small",type:"primary",plain:"",onClick:ye},{default:l(()=>[...d[39]||(d[39]=[y("保存新建默认",-1)])]),_:1})]),_:1})])],64)):o.selectionKind==="track"&&n.value?(V(),U(ce,{key:2},[s("section",Rl,[s("header",Ol,[d[42]||(d[42]=s("span",{class:"prop-card-title"},"路径视口样式",-1)),s("span",{class:Be(["prop-card-flag",{"is-synced":x.value}])},[d[41]||(d[41]=s("span",{class:"prop-card-flag-dot"},null,-1)),s("span",Yl,j(o.viewportSyncing?"同步中…":x.value?"已同步":"实时同步"),1)],2)]),a($e,{"label-width":"132px",size:"small",class:"defaults-form"},{default:l(()=>[a(G,{label:"线宽倍率"},{default:l(()=>[a(be,{"model-value":n.value.drawScale,min:.25,max:12,step:.1,"onUpdate:modelValue":d[12]||(d[12]=c=>f({drawScale:c??n.value.drawScale}))},null,8,["model-value"])]),_:1}),a(G,{label:"未选中线宽"},{default:l(()=>[a(be,{"model-value":n.value.widthNormal,min:.4,max:8,step:.1,"onUpdate:modelValue":d[13]||(d[13]=c=>f({widthNormal:c??n.value.widthNormal}))},null,8,["model-value"])]),_:1}),a(G,{label:"选中线宽"},{default:l(()=>[a(be,{"model-value":n.value.widthSelected,min:.4,max:12,step:.1,"onUpdate:modelValue":d[14]||(d[14]=c=>f({widthSelected:c??n.value.widthSelected}))},null,8,["model-value"])]),_:1}),a(G,{label:"显示方向箭头"},{default:l(()=>[a(je,{"model-value":n.value.showDirectionArrows,"onUpdate:modelValue":d[15]||(d[15]=c=>f({showDirectionArrows:!!c}))},null,8,["model-value"])]),_:1}),a(G,{label:"路径颜色(未选中)"},{default:l(()=>[a(ue,{"model-value":O(Ie)(n.value.colorNormalArgb),"onUpdate:modelValue":d[16]||(d[16]=c=>f({colorNormalArgb:O(ze)(c??"#00ffff")}))},null,8,["model-value"])]),_:1}),a(G,{label:"路径颜色(选中)"},{default:l(()=>[a(ue,{"model-value":O(Ie)(n.value.colorSelectedArgb),"onUpdate:modelValue":d[17]||(d[17]=c=>f({colorSelectedArgb:O(ze)(c??"#ff0000")}))},null,8,["model-value"])]),_:1})]),_:1})]),s("section",Kl,[d[44]||(d[44]=s("header",{class:"prop-card-header"},[s("span",{class:"prop-card-title"},"新建路径默认")],-1)),a($e,{"label-width":"132px",size:"small",class:"defaults-form"},{default:l(()=>[a(G,{label:"默认图层"},{default:l(()=>[a(ne,{modelValue:o.defaults.track.layer,"onUpdate:modelValue":d[18]||(d[18]=c=>o.defaults.track.layer=c)},null,8,["modelValue"])]),_:1}),a(Fe,{size:"small",type:"primary",plain:"",onClick:ye},{default:l(()=>[...d[43]||(d[43]=[y("保存新建默认",-1)])]),_:1})]),_:1})])],64)):o.viewportStyleLoading?(V(),U("div",Hl,[a(Ve,{class:"is-loading"},{default:l(()=>[a(O(_t))]),_:1}),d[45]||(d[45]=s("span",null,"加载视口样式…",-1))])):Z("",!0):(V(),U("div",Bl,[a(Ve,{class:"empty-icon"},{default:l(()=>[a(O(kt))]),_:1}),d[35]||(d[35]=s("span",{class:"empty-title"},"请选中站点或路径",-1)),d[36]||(d[36]=s("span",{class:"empty-desc"},"在画布上选中一个站点或路径后,可在此调整对应视口样式。",-1))]))])]),_:1}),a(Oe,{label:"图层",name:"layers"},{default:l(()=>[a(Ye,{data:o.layerRows,size:"small",class:"layer-table"},{default:l(()=>[a(Pe,{prop:"name",label:"图层",width:"120"}),a(Pe,{label:"可见",width:"60"},{default:l(({row:c})=>[a(je,{modelValue:c.visible,"onUpdate:modelValue":K=>c.visible=K,onChange:K=>_e(c)},null,8,["modelValue","onUpdate:modelValue","onChange"])]),_:1}),a(Pe,{label:"可选",width:"60"},{default:l(({row:c})=>[a(je,{modelValue:c.selectable,"onUpdate:modelValue":K=>c.selectable=K,onChange:K=>_e(c)},null,8,["modelValue","onUpdate:modelValue","onChange"])]),_:1}),a(Pe,{label:"颜色"},{default:l(({row:c})=>[a(ue,{modelValue:c.color,"onUpdate:modelValue":K=>c.color=K,onChange:K=>_e(c)},null,8,["modelValue","onUpdate:modelValue","onChange"])]),_:1})]),_:1},8,["data"]),a(ne,{modelValue:B.value,"onUpdate:modelValue":d[19]||(d[19]=c=>B.value=c),size:"small",placeholder:"新图层名",class:"new-layer"},{append:l(()=>[a(Fe,{onClick:et},{default:l(()=>[...d[46]||(d[46]=[y("添加",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1})]),_:1},8,["modelValue"])])}}}),Wl=Ne(Xl,[["__scopeId","data-v-781515fe"]]),Gl={class:"edit-status-bar"},Jl={class:"seg"},Zl={class:"seg"},ql={class:"seg"},Ql={class:"seg"},en={class:"seg"},tn={key:0,class:"seg ok"},an={key:1,class:"seg warn"},ln=Ae({__name:"EditStatusBar",props:{selectedCount:{},mouseX:{},mouseY:{},toolLabel:{},snapOn:{type:Boolean},undoSize:{},redoSize:{},connected:{type:Boolean}},setup(o){function A(g){return Number.isFinite(g)?g.toFixed(0):"--"}return(g,p)=>(V(),U("div",Gl,[s("span",Jl,[p[0]||(p[0]=y(" 选中 ",-1)),s("b",null,j(o.selectedCount),1),p[1]||(p[1]=y(" 个 ",-1))]),s("span",Zl," 鼠标 ("+j(A(o.mouseX))+", "+j(A(o.mouseY))+") mm ",1),s("span",ql,[p[2]||(p[2]=y(" 当前工具:",-1)),s("b",null,j(o.toolLabel),1)]),s("span",Ql,[p[3]||(p[3]=y(" 吸附:",-1)),s("b",{class:Be({on:o.snapOn,off:!o.snapOn})},j(o.snapOn?"开":"关"),3)]),p[4]||(p[4]=s("span",{class:"spacer"},null,-1)),s("span",en,"历史 "+j(o.undoSize)+" / "+j(o.redoSize),1),o.connected?(V(),U("span",tn,"● 实时通道在线")):(V(),U("span",an,"● 实时通道断开"))]))}}),nn=Ne(ln,[["__scopeId","data-v-6254b10f"]]),on={class:"upload-hint"},sn={key:0,class:"ai-text"},rn={class:"ai-stat"},un=Ae({__name:"AiGenerateDialog",props:{modelValue:{type:Boolean},configured:{type:Boolean},defaultBounds:{},defaultLayer:{}},emits:["update:modelValue","generated"],setup(o,{emit:A}){const g=o,p=A,h=ga(),x=$(!1),r=$(null),m=$(["r"]),n=Ze({prompt:"",mode:"sites+tracks",referenceImageBase64:void 0,layer:g.defaultLayer??"ai-generated",constraints:""}),_=$(g.defaultBounds??[-1e4,-1e4,1e4,1e4]);he(()=>g.defaultBounds,T=>{T&&(_.value=T)}),he(()=>g.defaultLayer,T=>{T&&(n.layer=T)});function F(){p("update:modelValue",!1)}function f(){p("update:modelValue",!1),h.push("/admin/config/system")}async function b(T){if(!T.raw)return;const k=new FileReader;k.onload=()=>{const W=String(k.result||""),te=W.includes(",")?W.split(",",2)[1]:W;n.referenceImageBase64=te},k.readAsDataURL(T.raw)}async function B(){try{x.value=!0,n.bounds=_.value;const T=await R.aiMapGenerate(n);r.value=T,C.success(`AI 已生成 ${T.created?.length??0} 个对象`),p("generated",T)}catch(T){C.error(`AI 生图失败:${T.message}`)}finally{x.value=!1}}return(T,k)=>{const W=ya,te=ct,oe=dt,M=Ct,pe=Vt,ge=ca,le=fa,D=ma,X=At,se=$t,P=Qe,N=ut,ie=qe,me=ba,Se=va,ae=Xe,re=pt;return V(),J(re,{"model-value":o.modelValue,title:"AI 生图",width:"640px","onUpdate:modelValue":k[9]||(k[9]=L=>p("update:modelValue",L)),onClose:F},{footer:l(()=>[a(ae,{onClick:F},{default:l(()=>[...k[20]||(k[20]=[y("关闭",-1)])]),_:1}),a(ae,{type:"primary",loading:x.value,disabled:!n.prompt.trim()||!o.configured,onClick:B},{default:l(()=>[...k[21]||(k[21]=[y(" 生成并落地 ",-1)])]),_:1},8,["loading","disabled"])]),default:l(()=>[o.configured?Z("",!0):(V(),J(te,{key:0,type:"warning",closable:!1,class:"cfg-alert"},{default:l(()=>[k[11]||(k[11]=y(" 尚未配置 AI 服务(apiKey / endpoint)。请先到 ",-1)),a(W,{type:"primary",onClick:f},{default:l(()=>[...k[10]||(k[10]=[y("系统级配置 → AI 服务",-1)])]),_:1}),k[12]||(k[12]=y(" 完成配置。 ",-1))]),_:1})),a(se,{"label-width":"100px",size:"default"},{default:l(()=>[a(M,{label:"提示词",required:""},{default:l(()=>[a(oe,{modelValue:n.prompt,"onUpdate:modelValue":k[0]||(k[0]=L=>n.prompt=L),type:"textarea",rows:4,placeholder:"一条 U 型生产线,含 5 个工站,间距 2m,方向单向通行..."},null,8,["modelValue"])]),_:1}),a(M,{label:"参考图片"},{default:l(()=>[a(ge,{drag:"","auto-upload":!1,"show-file-list":!1,accept:"image/*",onChange:b},{default:l(()=>[s("div",on,[a(pe,null,{default:l(()=>[a(O(pa))]),_:1}),s("span",null,j(n.referenceImageBase64?"已选择图片 (点击替换)":"拖入或点击上传参考图(可选,多模态)"),1)])]),_:1})]),_:1}),a(M,{label:"生成模式"},{default:l(()=>[a(D,{modelValue:n.mode,"onUpdate:modelValue":k[1]||(k[1]=L=>n.mode=L)},{default:l(()=>[a(le,{value:"sites"},{default:l(()=>[...k[13]||(k[13]=[y("仅站点",-1)])]),_:1}),a(le,{value:"tracks"},{default:l(()=>[...k[14]||(k[14]=[y("仅路径",-1)])]),_:1}),a(le,{value:"sites+tracks"},{default:l(()=>[...k[15]||(k[15]=[y("站点+路径",-1)])]),_:1}),a(le,{value:"full"},{default:l(()=>[...k[16]||(k[16]=[y("完整地图",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1}),a(M,{label:"范围 (mm)"},{default:l(()=>[a(X,{modelValue:_.value[0],"onUpdate:modelValue":k[2]||(k[2]=L=>_.value[0]=L),placeholder:"x1",step:500},null,8,["modelValue"]),a(X,{modelValue:_.value[1],"onUpdate:modelValue":k[3]||(k[3]=L=>_.value[1]=L),placeholder:"y1",step:500,class:"ml"},null,8,["modelValue"]),a(X,{modelValue:_.value[2],"onUpdate:modelValue":k[4]||(k[4]=L=>_.value[2]=L),placeholder:"x2",step:500,class:"ml"},null,8,["modelValue"]),a(X,{modelValue:_.value[3],"onUpdate:modelValue":k[5]||(k[5]=L=>_.value[3]=L),placeholder:"y2",step:500,class:"ml"},null,8,["modelValue"])]),_:1}),a(M,{label:"图层"},{default:l(()=>[a(oe,{modelValue:n.layer,"onUpdate:modelValue":k[6]||(k[6]=L=>n.layer=L),placeholder:"ai-generated(默认)"},null,8,["modelValue"])]),_:1}),a(M,{label:"附加约束"},{default:l(()=>[a(oe,{modelValue:n.constraints,"onUpdate:modelValue":k[7]||(k[7]=L=>n.constraints=L),placeholder:"例如:单向通行、最小转弯半径 1500mm"},null,8,["modelValue"])]),_:1})]),_:1}),r.value?(V(),J(Se,{key:1,modelValue:m.value,"onUpdate:modelValue":k[8]||(k[8]=L=>m.value=L),class:"result-panel"},{default:l(()=>[a(me,{title:"AI 返回 / 落地结果",name:"r"},{default:l(()=>[r.value.assistantText?(V(),U("div",sn,j(r.value.assistantText),1)):Z("",!0),s("div",rn,[k[17]||(k[17]=y(" 落地对象 ",-1)),s("b",null,j(r.value.created?.length??0),1),k[18]||(k[18]=y(",工具调用次数 ",-1)),s("b",null,j(r.value.usedTools),1),k[19]||(k[19]=y("。 ",-1))]),a(ie,{data:r.value.created??[],size:"small","max-height":"220"},{default:l(()=>[a(P,{label:"工具",prop:"tool",width:"160"}),a(P,{label:"kind",prop:"kind",width:"80"}),a(P,{label:"id",prop:"id",width:"80"}),a(P,{label:"typeName",prop:"typeName"}),a(P,{label:"错误"},{default:l(({row:L})=>[L.error?(V(),J(N,{key:0,type:"danger",size:"small"},{default:l(()=>[y(j(L.error),1)]),_:2},1024)):Z("",!0)]),_:1})]),_:1},8,["data"])]),_:1})]),_:1},8,["modelValue"])):Z("",!0)]),_:1},8,["model-value"])}}}),dn=Ne(un,[["__scopeId","data-v-7b1912b1"]]),cn={class:"proj-browse"},pn={class:"proj-browse-toolbar"},mn=["disabled"],fn={class:"proj-browse-body"},vn={class:"proj-browse-side"},yn={key:0,class:"proj-side-section"},bn={class:"proj-side-section"},gn=["onDblclick","onClick"],wn=["title"],hn={key:0,class:"proj-side-empty"},kn={class:"proj-browse-main"},_n={class:"proj-file-name"},Sn={class:"proj-mute"},xn={class:"proj-mute"},Vn={class:"proj-browse-footer"},$n={class:"proj-footer-label"},Cn={class:"proj-footer-bar"},An={class:"proj-footer-tip"},Nn={class:"proj-footer-actions"},jn=Ae({__name:"ProjectBrowseDialog",props:{modelValue:{type:Boolean},mode:{},initialPath:{}},emits:["update:modelValue","confirm"],setup(o,{emit:A}){const g=o,p=A,h=$(""),x=$(null),r=$([]),m=$([]),n=$(!1),_=$(null),F=$(null),f=$(""),b=$(""),B=Q(()=>g.mode==="load"?"加载项目(服务端目录)":"保存项目(服务端目录)"),T=Q(()=>!!(f.value.trim()||F.value?.kind==="file"||g.mode==="save"&&h.value)),k=Q(()=>g.mode==="save"?f.value?`将保存到:${le()}`:`当前目录:${h.value}`:F.value?`已选:${F.value.fullPath}`:"请在右侧选中一个 JSON 文件,或输入绝对路径");async function W(){n.value=!0,_.value=null;try{const P=await R.projectBrowse(h.value||void 0);h.value=P.dir,x.value=P.parent,r.value=P.subdirs.map(N=>({kind:"dir",name:N.name,fullPath:N.fullPath})),m.value=P.jsons.map(N=>({kind:"file",name:N.name,fullPath:N.fullPath,sizeBytes:N.sizeBytes,modified:N.modified})),b.value||(b.value=P.dir),F.value=null}catch(P){_.value=P.message}finally{n.value=!1}}function te(){x.value&&(h.value=x.value,W())}function oe(){h.value="",W()}function M(P){h.value=P,W()}function pe(P){F.value=P,P?.kind==="file"&&(f.value=P.fullPath)}function ge(P){P.kind==="file"&&D()}function le(){const P=f.value.trim();return P?/^([A-Za-z]:[\\/]|\\\\|\/)/.test(P)?P:`${h.value.replace(/[\\/]+$/,"")}/${P.endsWith(".json")?P:P+".json"}`:`${h.value}/project.current.json`}function D(){if(g.mode==="save"){const N=le();if(!N){C.warning("请输入文件名或选中目标");return}p("confirm",N),p("update:modelValue",!1);return}const P=f.value.trim()||(F.value?.kind==="file"?F.value.fullPath:"");if(!P){C.warning("请先选中一个 .json 文件,或直接输入路径");return}p("confirm",P),p("update:modelValue",!1)}function X(){F.value=null,f.value="",h.value=g.initialPath??"",W()}function se(P){return P==null?"—":P<1024?`${P} B`:P<1024*1024?`${(P/1024).toFixed(1)} KB`:`${(P/1024/1024).toFixed(1)} MB`}return he(()=>g.modelValue,P=>{P&&X()}),(P,N)=>{const ie=dt,me=ct,Se=xt,ae=Qe,re=qe,L=Xe,xe=pt,Ue=ka;return V(),J(xe,{"model-value":o.modelValue,title:B.value,width:"780px","align-center":"","destroy-on-close":"",class:"proj-browse-dialog","onUpdate:modelValue":N[3]||(N[3]=Y=>p("update:modelValue",Y)),onOpen:X},{footer:l(()=>[s("div",Cn,[s("span",An,j(k.value),1),s("span",Nn,[a(L,{onClick:N[2]||(N[2]=Y=>p("update:modelValue",!1))},{default:l(()=>[...N[15]||(N[15]=[y("取消",-1)])]),_:1}),a(L,{type:"primary",loading:n.value,disabled:!T.value,onClick:D},{default:l(()=>[y(j(o.mode==="load"?"加载此文件":"保存到此文件"),1)]),_:1},8,["loading","disabled"])])])]),default:l(()=>[s("div",cn,[s("div",pn,[s("button",{class:"proj-icon-btn",disabled:!x.value,title:"返回上级",onClick:te},[...N[4]||(N[4]=[s("span",{class:"proj-icon"},"←",-1)])],8,mn),s("button",{class:"proj-icon-btn",title:"刷新",onClick:W},[...N[5]||(N[5]=[s("span",{class:"proj-icon"},"⟳",-1)])]),s("button",{class:"proj-icon-btn",title:"SimpleLite 主目录",onClick:oe},[...N[6]||(N[6]=[s("span",{class:"proj-icon"},"⌂",-1)])]),a(ie,{modelValue:h.value,"onUpdate:modelValue":N[0]||(N[0]=Y=>h.value=Y),size:"small",spellcheck:"false",class:"proj-path-input",placeholder:"输入或粘贴目录路径,回车跳转",onKeyup:wa(W,["enter"])},{prefix:l(()=>[...N[7]||(N[7]=[s("span",{class:"proj-path-prefix"},"📁",-1)])]),_:1},8,["modelValue"])]),_.value?(V(),J(me,{key:0,type:"error",title:_.value,closable:!1,"show-icon":"",class:"proj-error"},null,8,["title"])):Z("",!0),s("div",fn,[s("div",vn,[N[12]||(N[12]=s("div",{class:"proj-side-title"},"服务端目录",-1)),a(Se,{class:"proj-side-scroll"},{default:l(()=>[s("button",{class:"proj-side-btn proj-side-cwd",onClick:oe},[...N[8]||(N[8]=[s("span",{class:"proj-side-icon"},"🏠",-1),s("span",{class:"proj-side-text"},"SimpleLite 主目录",-1)])]),x.value?(V(),U("div",yn,[s("button",{class:"proj-side-btn",onClick:te},[...N[9]||(N[9]=[s("span",{class:"proj-side-icon"},"↑",-1),s("span",{class:"proj-side-text"},"返回上级",-1)])])])):Z("",!0),s("div",bn,[N[11]||(N[11]=s("div",{class:"proj-side-section-title"},"子文件夹",-1)),(V(!0),U(ce,null,we(r.value,Y=>(V(),U("button",{key:Y.fullPath,class:Be(["proj-side-btn",{"proj-side-btn--active":!1}]),onDblclick:ke=>M(Y.fullPath),onClick:ke=>M(Y.fullPath)},[N[10]||(N[10]=s("span",{class:"proj-side-icon"},"📁",-1)),s("span",{class:"proj-side-text",title:Y.name},j(Y.name),9,wn)],40,gn))),128)),r.value.length===0?(V(),U("div",hn,"无子文件夹")):Z("",!0)])]),_:1})]),s("div",kn,[ha((V(),J(re,{data:m.value,size:"small",height:"380","highlight-current-row":"",class:"proj-browse-table","empty-text":"该目录下没有 JSON 项目文件",onCurrentChange:pe,onRowDblclick:ge},{default:l(()=>[a(ae,{width:"36"},{default:l(()=>[...N[13]||(N[13]=[s("span",{class:"proj-file-icon"},"📄",-1)])]),_:1}),a(ae,{prop:"name",label:"名称","min-width":"220"},{default:l(({row:Y})=>[s("span",_n,j(Y.name),1)]),_:1}),a(ae,{label:"大小",width:"100"},{default:l(({row:Y})=>[s("span",Sn,j(se(Y.sizeBytes)),1)]),_:1}),a(ae,{prop:"modified",label:"修改时间",width:"160"},{default:l(({row:Y})=>[s("span",xn,j(Y.modified),1)]),_:1})]),_:1},8,["data"])),[[Ue,n.value]])])]),s("div",Vn,[s("span",$n,j(o.mode==="load"?"选中文件":"保存为"),1),a(ie,{modelValue:f.value,"onUpdate:modelValue":N[1]||(N[1]=Y=>f.value=Y),size:"small",placeholder:o.mode==="load"?"在右侧选择 JSON 文件,或直接输入绝对路径":"输入文件名(不写绝对路径则保存到当前目录)",spellcheck:"false",class:"proj-manual-input"},null,8,["modelValue","placeholder"]),N[14]||(N[14]=s("span",{class:"proj-footer-type"},"JSON (*.json)",-1))])])]),_:1},8,["model-value","title"])}}}),Fn=Ne(jn,[["__scopeId","data-v-411e65f0"]]);function Pn(){const o=$("transform.move"),A=$({grid:!1,gridSizeMm:100,object:!0,endpoint:!0,midpoint:!1,toAngleDeg:void 0}),g=$(!0),p=$(!0),h=Q(()=>{const n=o.value;return n.startsWith("select.")?"select":n.startsWith("draw.")?"draw":n.startsWith("transform.")?"transform":n.startsWith("align.")?"align":n.startsWith("batch.")?"batch":n.startsWith("snap.")?"snap":"show"}),x=Q(()=>({"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 r(n){o.value=n}function m(n){A.value={...A.value,[n]:!A.value[n]}}return{activeTool:o,snap:A,showControlPoints:g,showControlHandles:p,toolCategory:h,toolLabel:x,setTool:r,toggleSnap:m}}function Ce(o,A){return`${o}:${A}`}function Tn(){const o=$([]),A=$(null),g=Q(()=>o.value.map(b=>b.id)),p=Q(()=>o.value.length);function h(b,B){const T=Ce(b,B);return o.value.some(k=>Ce(k.kind,k.id)===T)}function x(b){h(b.kind,b.id)||(o.value=[...o.value,b],A.value=Ce(b.kind,b.id))}function r(b,B){const T=Ce(b,B);o.value=o.value.filter(k=>Ce(k.kind,k.id)!==T),A.value===T&&(A.value=null)}function m(b){h(b.kind,b.id)?r(b.kind,b.id):x(b)}function n(b){o.value=b,A.value=b.length>0?Ce(b[b.length-1].kind,b[b.length-1].id):null}function _(){o.value=[],A.value=null}function F(b){o.value=o.value.filter(B=>B.kind===b)}function f(b){o.value=[b],A.value=Ce(b.kind,b.id)}return{items:o,ids:g,count:p,lastClickedKey:A,has:h,add:x,remove:r,toggle:m,set:n,clear:_,filterByKind:F,selectSingle:f}}function En(o={}){const A=o.maxDepth??20,g=$([]),p=$([]),h=$(!1),x=Q(()=>g.value.length>0&&!h.value),r=Q(()=>p.value.length>0&&!h.value);async function m(b){if(!h.value){h.value=!0;try{await b.apply(),g.value=[...g.value,b].slice(-A),p.value=[],o.onChange?.()}finally{h.value=!1}}}async function n(){if(!x.value)return;const b=g.value[g.value.length-1];h.value=!0;try{await b.revert(),g.value=g.value.slice(0,-1),p.value=[...p.value,b].slice(-A),o.onChange?.()}finally{h.value=!1}}async function _(){if(!r.value)return;const b=p.value[p.value.length-1];h.value=!0;try{await b.apply(),p.value=p.value.slice(0,-1),g.value=[...g.value,b].slice(-A),o.onChange?.()}finally{h.value=!1}}function F(){g.value=[],p.value=[],o.onChange?.()}function f(b,B){return{label:b,apply:async()=>{for(const T of B)await T.apply()},revert:async()=>{for(let T=B.length-1;T>=0;T--)await B[T].revert()}}}return{undoStack:g,redoStack:p,busy:h,canUndo:x,canRedo:r,run:m,undo:n,redo:_,clear:F,composite:f}}function zn(o={}){function A(g){const p=g?.data;if(!p||typeof p!="object"||typeof p.type!="string")return;const h=p.type,x=p.payload;if(h==="workspace.pick"&&o.onPick&&x&&typeof x=="object"&&"x"in x&&"y"in x){const r=x;o.onPick({x:Number(r.x),y:Number(r.y),siteId:typeof r.siteId=="number"?r.siteId:void 0})}else if(h==="workspace.select"&&o.onSelect&&Array.isArray(x))o.onSelect({names:x});else if(h==="workspace.mouse"&&o.onMouse&&x&&typeof x=="object"&&"x"in x&&"y"in x){const r=x;o.onMouse({x:Number(r.x),y:Number(r.y)})}}Ft(()=>window.addEventListener("message",A)),_a(()=>window.removeEventListener("message",A))}function In(o,A){if(o.length<2)return[];const g=[],p=o.map(f=>f.x),h=o.map(f=>f.y),x=Math.min(...p),r=Math.max(...p),m=Math.min(...h),n=Math.max(...h),_=p.reduce((f,b)=>f+b,0)/p.length,F=h.reduce((f,b)=>f+b,0)/h.length;switch(A){case"left":for(const f of o)g.push(de(f,{x}));break;case"right":for(const f of o)g.push(de(f,{x:r}));break;case"top":for(const f of o)g.push(de(f,{y:n}));break;case"bottom":for(const f of o)g.push(de(f,{y:m}));break;case"centerH":for(const f of o)g.push(de(f,{x:_}));break;case"centerV":for(const f of o)g.push(de(f,{y:F}));break;case"center":for(const f of o)g.push(de(f,{x:_,y:F}));break;case"distributeH":{const f=[...o].sort((B,T)=>B.x-T.x),b=(f[f.length-1].x-f[0].x)/(f.length-1);f.forEach((B,T)=>{const k=f[0].x+b*T;Math.abs(k-B.x)>.5&&g.push(de(B,{x:k}))});break}case"distributeV":{const f=[...o].sort((B,T)=>B.y-T.y),b=(f[f.length-1].y-f[0].y)/(f.length-1);f.forEach((B,T)=>{const k=f[0].y+b*T;Math.abs(k-B.y)>.5&&g.push(de(B,{y:k}))});break}case"toFirst":{const f=o[0];for(const b of o.slice(1))g.push(de(b,{x:f.x,y:f.y}));break}case"toLast":{const f=o[o.length-1];for(const b of o.slice(0,-1))g.push(de(b,{x:f.x,y:f.y}));break}}return g}function de(o,A){return{action:"patch",kind:o.kind,id:o.id,data:A}}function Bn(o,A,g,p){return Pt(o,g,A,g,p)}function Un(o,A,g,p){return Pt(o,A,o,g,p)}function Pt(o,A,g,p,h){const x=[],r=Math.max(2,Math.floor(h.count));for(let m=0;m<r;m++){const n=m/(r-1),_={x:o+(g-o)*n,y:A+(p-A)*n,name:`${h.namePrefix??"S"}_${m+1}`,layer:h.layer};x.push({action:"create",kind:"site",data:_})}return x}function Ln(o,A,g,p,h){const x=[],r=Math.max(1,Math.floor(h.rows)),m=Math.max(1,Math.floor(h.cols));for(let n=0;n<r;n++)for(let _=0;_<m;_++){const F=m===1?0:_/(m-1),f=r===1?0:n/(r-1);x.push({action:"create",kind:"site",data:{x:o+(g-o)*F,y:A+(p-A)*f,name:`${h.namePrefix??"M"}_${n+1}_${_+1}`,layer:h.layer}})}return x}function Mn(o,A,g,p){const h=[],x=Math.max(1,Math.floor(p.count)),r=(p.startAngleDeg??0)*Math.PI/180,n=(p.endAngleDeg??360)*Math.PI/180-r;for(let _=0;_<x;_++){const F=Math.abs(n-Math.PI*2)<1e-6?x:x-1,f=F===0?0:_/F,b=r+n*f;h.push({action:"create",kind:"site",data:{x:o+Math.cos(b)*g,y:A+Math.sin(b)*g,name:`${p.namePrefix??"C"}_${_+1}`,layer:p.layer}})}return h}const Dn={class:"map-editor-page"},Rn={class:"me-body"},On={class:"me-center"},Yn=["accept"],Kn=Ae({__name:"MapEditorView",setup(o){const A=Sa(),g="localhost:8223",p=$(null),h=$(null),x=$("image/*"),r=$("image"),m=Pn(),n=Tn(),_=En({}),F=Ze({x:0,y:0}),f=$(!1),b=$(!1),B=$([-1e4,-1e4,1e4,1e4]),T=$(!1),k=$("load"),W=$(""),te=$(!1),oe=$(!1),M=$(null),pe=$([]),ge=$([]),le=$([]),D=Ze({site:{layer:"g",namePrefix:"S",color:"#ffffff"},track:{layer:"g",lineWidth:2,color:"#88ccff"}}),X=$(null),se=$(!1),P=$(!1);let N=null,ie=0,me={};const Se=Q(()=>{const e=n.items.value;if(e.length!==1)return null;const t=e[0].kind;return t==="site"||t==="track"?t:null}),ae=$(["g"]),re=$([{name:"g",visible:!0,selectable:!0,color:"#cccccc"}]),L=Ze({selectFilter:{sites:!0,tracks:!0,cars:!0,decor:!0},alignSnap:{sites:!0,cars:!0,tracks:!0},showViewport:{sceneLabels:!0,scenePrimitives:!0,cars:!0}});function xe(){try{localStorage.setItem("mapEditor.viewFilter",JSON.stringify(L))}catch{}}function Ue(){try{const e=localStorage.getItem("mapEditor.viewFilter");if(!e)return;const t=JSON.parse(e);t.selectFilter&&Object.assign(L.selectFilter,t.selectFilter),t.alignSnap&&Object.assign(L.alignSnap,t.alignSnap),t.showViewport&&Object.assign(L.showViewport,t.showViewport)}catch{}}function Y(){const e=L.selectFilter,t=n.items.value.filter(i=>i.kind==="site"?e.sites:i.kind==="track"?e.tracks:i.kind==="car"?e.cars:i.kind==="special"?e.decor:!0);t.length!==n.items.value.length&&n.set(t)}const ke=$(!1),fe=$({siteA:null}),Le=$(!1),ve=$(!1),Me=$("");function We(e){return e.map(t=>`${t.kind}:${t.id}`).sort().join(",")}const ye=$(!1),_e=["draw.site","draw.sites.continuous","draw.track.polyline","draw.track.bezier","draw.track.arc","draw.track.nurbs"];async function et(){if(!ye.value){for(ye.value=!0;ye.value;){let e=null;try{e=await R.pick()}catch{break}if(!ye.value)break;const t=m.activeTool.value;if(!_e.includes(t))break;if(t==="draw.site"){await Ye(e.x,e.y),C.success(`已添加站点 (${e.x.toFixed(0)}, ${e.y.toFixed(0)})`);break}else if(t==="draw.sites.continuous")await Ye(e.x,e.y);else if(t==="draw.track.polyline"||t==="draw.track.bezier"||t==="draw.track.arc"||t==="draw.track.nurbs"){const i=fe.value.siteA;if(await Fe(e.siteId),i!=null&&fe.value.siteA==null){const u=t==="draw.track.bezier"?"贝塞尔路径":t==="draw.track.arc"?"弧形路径":t==="draw.track.nurbs"?"NURBS 路径":"直线路径";C.success(`已添加${u}`);break}}else break}ye.value=!1,_e.includes(m.activeTool.value)&&m.setTool("transform.move")}}const tt=Q(()=>m.snap.value.grid||m.snap.value.object||m.snap.value.endpoint||m.snap.value.midpoint);async function v(e){switch(e){case"edit.undo":await _.undo();break;case"edit.redo":await _.redo();break;case"edit.delete":await Te();break;case"edit.selectAll":C.info("全选:请使用工具栏「按类型选」批量选中");break;case"edit.invert":C.info("反选功能后续实现");break;case"project.save":await bt(!1);break;case"project.open":await Xt();break;case"project.saveAs":await bt(!0);break;case"project.close":C.info("关闭项目:使用 SimpleLite 主菜单");break;case"ai.open":await yt();break;case"file.upload.image":Je("image");break;case"file.upload.model":Je("model");break;case"view.fitAll":C.info("请在 3D 视口右键菜单使用「适配全部」");break;case"view.fitSelection":C.info("请在 3D 视口右键菜单使用「适配选中」");break;case"snap.toGrid":m.toggleSnap("grid");break;case"snap.toObject":m.toggleSnap("object");break;case"layer.new":await ue();break;case"layer.toggleVisibility":ke.value=!0;break;case"view.select.sites":d("selectFilter","sites");break;case"view.select.tracks":d("selectFilter","tracks");break;case"view.select.cars":d("selectFilter","cars");break;case"view.select.decor":d("selectFilter","decor");break;case"view.snap.sites":d("alignSnap","sites");break;case"view.snap.cars":d("alignSnap","cars");break;case"view.snap.tracks":d("alignSnap","tracks");break;case"view.show.sceneLabels":d("showViewport","sceneLabels");break;case"view.show.scenePrimitives":d("showViewport","scenePrimitives");break;case"view.show.cars":d("showViewport","cars");break;default:C.info(`暂未实现的命令:${e}`)}}async function d(e,t){const i=L[e],u=t,w=i[u];i[u]=!i[u],xe(),e==="selectFilter"&&Y();const S={};S[e]={[u]:i[u]};try{await R.setViewFilter(S)}catch(E){console.warn("[MapEditor] 写后端 viewFilter 失败:",E),i[u]=w,xe(),e==="selectFilter"&&Y(),C({message:"过滤设置写入后端失败,已回滚本地状态;请检查 SimpleLite 是否连通后重试。",type:"warning",duration:5e3,showClose:!0})}}function Ve(e){return e==="bezier"?"贝塞尔路径":e==="nurbs"?"NURBS 路径":e==="arc"?"弧形路径":"直线路径"}async function at(e,t){const i=await ne(e),u=await ne(t);if(!i||!u)return C.warning(`无法拉到 site #${e} / #${t} 的 x,y,将不带 typeInfo 创建 track(圆心需手动设置)`),null;const S=Math.hypot(i.x-u.x,i.y-u.y)/2;let E;try{const I=await H.prompt(`请输入半径 (mm),必须 ≥ ${S.toFixed(1)}(等于即半圆)`,"添加弧形路径",{inputValue:String(Math.ceil(S))});E=Number(I.value)}catch{return"cancelled"}return!Number.isFinite(E)||E<S?(C.warning(`半径必须 ≥ ${S.toFixed(1)} mm`),"cancelled"):{typeInfo:lt(i,u,E),radius:E}}function De(e){e==="bezier"||e==="nurbs"?C.success(`${e==="bezier"?"贝塞尔":"NURBS"}路径已创建。选中后可在画布看到控制点(白色端点 + 黄色中间点)和控制折线,可在属性面板拖动 / 输入坐标 / 增删控制点继续调整。`):e==="arc"&&C.success("弧形路径已创建。选中后可在画布看到圆心;属性面板「设置圆心、半径」「设定相邻切线」可继续微调。")}async function ne(e){try{const t=await q.getBundle("site",e),i=Number(t.fields?.x??NaN),u=Number(t.fields?.y??NaN);return!Number.isFinite(i)||!Number.isFinite(u)?null:{x:i,y:u}}catch{return null}}function Re(e,t){const i=[String(t),String(e.length)];for(const u of e)i.push(u.x.toFixed(3)),i.push(u.y.toFixed(3));return i.join(",")}function lt(e,t,i,u="left"){const w=t.x-e.x,S=t.y-e.y,E=Math.hypot(w,S),I=E/2,z=i*i-I*I,ee=Math.sqrt(Math.max(0,z)),ea=E>0?-S/E:0,ta=E>0?w/E:0,ht=u==="left"?1:-1,st=(e.x+t.x)/2+ht*ee*ea,it=(e.y+t.y)/2+ht*ee*ta,aa=Math.atan2(e.y-it,e.x-st)*180/Math.PI,la=Math.atan2(t.y-it,t.x-st)*180/Math.PI;return["1",st.toFixed(3),it.toFixed(3),i.toFixed(3),aa.toFixed(3),la.toFixed(3)].join(",")}function be(e){e&&(D.site.layer=e,D.track.layer=e,C.success(`默认图层已切到 "${e}"`))}async function ue(){try{const t=((await H.prompt("请输入新图层名(同名会被忽略)","新建图层",{inputValue:""})).value??"").trim();if(!t)return;if(ae.value.includes(t)){D.site.layer=t,D.track.layer=t,C.info(`图层 "${t}" 已存在,已切到该层`);return}vt(t),D.site.layer=t,D.track.layer=t,C.success(`已创建图层 "${t}",下次创建对象会落到该层`)}catch{}}async function je(e){if(m.setTool(e),fe.value.siteA=null,ye.value=!1,e==="select.clear"){n.clear(),await q.clearSelection().catch(()=>{});return}if(_e.includes(e)&&et(),e.startsWith("align.")){await K(e.replace("align.",""));return}if(e.startsWith("batch.")){await Tt(e);return}if(e==="transform.delete"){await Te();return}if(e.startsWith("select.byType.")){const t=e.replace("select.byType.","");Oe(t);return}if(e==="show.controlPoints"&&(m.showControlPoints.value=!m.showControlPoints.value),e==="show.controlHandles"&&(m.showControlHandles.value=!m.showControlHandles.value),e==="draw.image"&&Je("image"),e==="draw.model"&&Je("model"),e==="transform.copyFields"){await zt();return}}function Oe(e){e==="site"?n.filterByKind("site"):e==="polyline"||e==="bezier"||e==="arc"?n.items.value=n.items.value.filter(t=>{if(t.kind!=="track")return!1;const i=t.typeName.toLowerCase();return e==="polyline"?i==="uitrack":e==="bezier"?i.includes("bezier"):e==="arc"?i.includes("arc"):!1}):e==="decor"?n.filterByKind("special"):e==="currentLayer"&&M.value?.layer&&(n.items.value=n.items.value.filter(t=>t.layer===M.value.layer))}async function Ge(e){F.x=e.x,F.y=e.y;const t=m.activeTool.value;if(!(ye.value&&_e.includes(t))&&!Le.value){if(t==="draw.site"||t==="draw.sites.continuous"){await Ye(e.x,e.y);return}if(t==="draw.track.polyline"||t==="draw.track.bezier"||t==="draw.track.arc"||t==="draw.track.nurbs"){try{const i=await R.pick();await Fe(i.siteId)}catch{}return}}}function G(e){n.set($e(e))}function $e(e){const t=[],i=L.selectFilter;for(const u of e){const w=/^UI([A-Za-z]+)-(\d+)$/.exec(u)??/^([A-Za-z]+)-(\d+)$/.exec(u);if(!w)continue;const S=w[1],E=Number(w[2]),I=S.toLowerCase();let z;I==="site"?z="site":I==="car"||I==="vehicle"?z="car":I.includes("track")?z="track":z="special",!(z==="site"&&!i.sites)&&(z==="track"&&!i.tracks||z==="car"&&!i.cars||z==="special"&&!i.decor||t.push({kind:z,id:E,name:u,typeName:u.startsWith("UI")?`UI${S}`:S}))}return t}async function Fe(e){if(e<=0){C.warning("请先拾取一个站点");return}if(fe.value.siteA==null){fe.value.siteA=e,C.success(`已选起点站 #${e},请再拾取终点站`);return}const t=fe.value.siteA,i=e;if(fe.value.siteA=null,t===i){C.warning("起止站点不能相同");return}const u=m.activeTool.value==="draw.track.bezier"?"bezier":m.activeTool.value==="draw.track.arc"?"arc":m.activeTool.value==="draw.track.nurbs"?"nurbs":"track";let w,S="";if(u==="bezier"||u==="nurbs"){const I=await Pe(t,i,u);if(I==="cancelled")return;I!=null&&(w=I.typeInfo,S=`(控制点 ${I.midCount})`)}else if(u==="arc"){const I=await at(t,i);if(I==="cancelled")return;I!=null&&(w=I.typeInfo,S=`(半径 ${I.radius.toFixed(0)})`)}let E=-1;await _.run({label:`新建${Ve(u)} (${t}→${i})${S}`,apply:async()=>{const I={siteA:t,siteB:i,layer:D.track.layer};w&&(I.typeInfo=w),E=(await R.createTrack(u,I)).id},revert:async()=>{E>0&&await R.deleteObject("track",E)}}),De(u)}async function Pe(e,t,i){const u=await ne(e),w=await ne(t);if(!u||!w)return C.warning(`无法拉到 site #${e} / #${t} 的 x,y,将不带 typeInfo 创建 track(控制点会用兜底直线)`),null;const S=Ve(i);let E;try{const z=await H.prompt("请输入中间控制点个数(不含起止站点;默认 2,输入 0 则不带控制点直接连接两站点)",`创建${S}`,{inputValue:"2",inputPattern:/^\d+$/,inputErrorMessage:"请输入非负整数"});E=Math.max(0,Math.floor(Number(z.value)))}catch{return"cancelled"}if(E===0)return{typeInfo:Re([u,w],i==="bezier"?2:3),midCount:0};C.info(`请在画布上依次点选 ${E} 个中间控制点(任意位置;右键取消创建)`),Le.value=!0;const I=[];try{for(let z=0;z<E;z++){let ee;try{ee=await R.pick()}catch{return C.info("已取消创建"),"cancelled"}I.push({x:ee.x,y:ee.y}),C.success(`已记录第 ${z+1}/${E} 个控制点 (${ee.x.toFixed(0)}, ${ee.y.toFixed(0)})`)}}finally{Le.value=!1}return{typeInfo:Re([u,...I,w],i==="bezier"?2:3),midCount:E}}async function Ye(e,t){let i=-1;await _.run({label:`新建站点 (${e.toFixed(0)}, ${t.toFixed(0)})`,apply:async()=>{i=(await R.createSite({x:e,y:t,layer:D.site.layer,name:`${D.site.namePrefix}-${Date.now()%1e5}`})).id},revert:async()=>{i>0&&await R.deleteObject("site",i)}})}async function Te(){const e=[...n.items.value];if(e.length===0)return;const t=[];for(const i of e)try{const u=await q.getBundle(i.kind,i.id);t.push({kind:i.kind,typeName:u.typeName,data:{...u.fields??{}}})}catch{}await _.run({label:`删除 ${e.length} 个对象`,apply:async()=>{const i=e.map(u=>({action:"delete",kind:u.kind,id:u.id}));await R.batch(i),n.clear()},revert:async()=>{const i=t.map(u=>({action:"create",kind:c(u.kind,u.typeName),data:u.data}));i.length&&(await R.batch(i),C.success(`已恢复 ${i.length} 个对象(注意:id 已重排)`))}})}function c(e,t){const i=(t??"").toLowerCase();if(e==="track")return i.includes("bezier")?"bezier":i.includes("arc")?"arc":i.includes("nurbs")?"nurbs":"track";if(e==="special"){if(i.includes("image"))return"image";if(i.includes("text"))return"text";if(i.includes("model"))return"model"}return e}async function K(e){const t=[];for(const u of n.items.value)if(u.kind!=="track")try{const w=await q.getBundle(u.kind,u.id),S=Number(w.fields?.x??0),E=Number(w.fields?.y??0);t.push({kind:u.kind,id:u.id,x:S,y:E})}catch{}if(t.length<2){C.warning("对齐需要选中至少 2 个对象");return}const i=In(t,e);if(i.length===0){C.info("对齐无变化");return}await _.run({label:`对齐 (${e})`,apply:async()=>{await R.batch(i)},revert:async()=>{const u=t.map(w=>({action:"patch",kind:w.kind,id:w.id,data:{x:w.x,y:w.y}}));await R.batch(u)}})}async function Tt(e){if(e==="batch.linearH"||e==="batch.linearV"){const t=e==="batch.linearH"?"横向":"纵向";try{const{value:i}=await H.prompt(`输入 ${t}站点数量`,"批量生成",{inputValue:"5",inputType:"number"}),u=Math.max(2,Math.floor(Number(i))),w=await H.prompt("起点 X","批量生成",{inputValue:"0"}),S=await H.prompt("起点 Y","批量生成",{inputValue:"0"}),E=await H.prompt("终点 X","批量生成",{inputValue:"5000"}),I=await H.prompt("终点 Y","批量生成",{inputValue:"0"}),z=e==="batch.linearH"?Bn(Number(w.value),Number(E.value),Number(S.value),{count:u,layer:D.site.layer}):Un(Number(w.value),Number(S.value),Number(I.value),{count:u,layer:D.site.layer});await nt(`${t}间隔生成 ${u}`,z)}catch{}return}if(e==="batch.matrix"){try{const t=Number((await H.prompt("行数","矩阵生成",{inputValue:"3"})).value),i=Number((await H.prompt("列数","矩阵生成",{inputValue:"3"})).value),u=Number((await H.prompt("x1","矩阵生成",{inputValue:"0"})).value),w=Number((await H.prompt("y1","矩阵生成",{inputValue:"0"})).value),S=Number((await H.prompt("x2","矩阵生成",{inputValue:"5000"})).value),E=Number((await H.prompt("y2","矩阵生成",{inputValue:"5000"})).value),I=Ln(u,w,S,E,{rows:t,cols:i,layer:D.site.layer});await nt(`矩阵生成 ${t}×${i}`,I)}catch{}return}if(e==="batch.circular"){try{const t=Number((await H.prompt("圆心 X","环形阵列",{inputValue:"0"})).value),i=Number((await H.prompt("圆心 Y","环形阵列",{inputValue:"0"})).value),u=Number((await H.prompt("半径 (mm)","环形阵列",{inputValue:"2000"})).value),w=Number((await H.prompt("站点数量","环形阵列",{inputValue:"8"})).value),S=Mn(t,i,u,{count:w,layer:D.site.layer});await nt(`环形阵列 r=${u} n=${w}`,S)}catch{}return}if(e==="batch.alongPath"){await Et();return}}async function Et(){const e=n.items.value.filter(w=>w.kind==="track");if(e.length===0){C.warning("请先选中至少 1 条路径");return}let t=500,i=!1;try{const{value:w}=await H.prompt("输入采样间距 (mm)","沿路径采样",{inputValue:"500",inputType:"number"});t=Math.max(10,Math.floor(Number(w)));const{value:S}=await H.prompt("是否包含端点?输入 1 包含,0 不包含","沿路径采样",{inputValue:"0"});i=Number(S)===1}catch{return}const u=[];await _.run({label:`沿 ${e.length} 条路径间距 ${t}mm 采样`,apply:async()=>{for(const w of e){const S=await R.sampleSitesAlongTrack(w.id,{spacingMm:t,includeEndpoints:i,layer:D.site.layer});u.push(...S.ids)}C.success(`已采样生成 ${u.length} 个站点`)},revert:async()=>{if(!u.length)return;const w=u.map(S=>({action:"delete",kind:"site",id:S}));await R.batch(w)}})}async function zt(){if(n.items.value.length<2){C.warning("字段复制需要 ≥ 2 个选中对象(第 1 个为源,其余为目标)");return}const[e,...t]=n.items.value;try{const{value:i}=await H.prompt("输入要复制的字段名(逗号分隔),例如:x,y,layerName","字段复制",{inputValue:"x,y"}),u=i.split(",").map(S=>S.trim()).filter(Boolean);if(!u.length)return;const w=new Map;for(const S of t)try{const E=await q.getBundle(S.kind,S.id),I={};for(const z of u)I[z]=String(E.fields?.[z]??"");w.set(`${S.kind}:${S.id}`,I)}catch{}await _.run({label:`字段复制 ${u.join(",")} → ${t.length} 个`,apply:async()=>{const S=await R.copyFieldsTo(e.kind,e.id,u,t.map(E=>({kind:E.kind,id:E.id})));C.success(`已复制 ${S.copied} 项字段`)},revert:async()=>{const S=t.flatMap(E=>{const I=w.get(`${E.kind}:${E.id}`);return I?[{action:"patch",kind:E.kind,id:E.id,data:I}]:[]});S.length&&await R.batch(S)}})}catch{}}async function nt(e,t){if(t.length===0)return;let i=[];await _.run({label:e,apply:async()=>{i=(await R.batch(t)).results.filter(w=>w.ok&&w.action==="create"&&w.result?.id).map(w=>({kind:w.result.kind,id:w.result.id}))},revert:async()=>{const u=i.map(w=>({action:"delete",kind:w.kind,id:w.id}));u.length&&await R.batch(u)}}),C.success(`${e} 完成`)}async function Ke(){if(n.items.value.length===0){M.value=null,pe.value=[],ge.value=[],le.value=[];return}const e=n.items.value[0];It();try{const t=await q.getBundle(e.kind,e.id);M.value=t.summary,pe.value=Object.entries(t.fields).map(([i,u])=>({key:i,value:String(u)})),ge.value=t.methods,le.value=(t.status??[]).map(i=>({key:i.key,value:i.value}))}catch(t){C.error(`加载属性失败:${t.message}`)}finally{Bt()}}function It(){oe.value=!0}function Bt(){oe.value=!1}async function Ut(e){if(!M.value||n.items.value.length===0)return;const t=n.items.value[0],i=M.value.id,u=M.value.name??"";u!==e&&(await _.run({label:`重命名 ${u||"(无)"} → ${e}`,apply:async()=>{await q.setField(t.kind,i,"name",e)},revert:async()=>{try{await q.setField(t.kind,i,"name",u)}catch(w){C.warning(`回滚名称失败:${w.message}`)}}}),C.success("名称已更新"))}async function Lt(e){if(!M.value||n.items.value.length===0)return;const t=n.items.value[0],i=M.value.id,u=M.value.layer??"";u!==e&&(await _.run({label:`修改图层 ${u||"(无)"} → ${e}`,apply:async()=>{await q.setField(t.kind,i,"layerName",e)},revert:async()=>{try{await q.setField(t.kind,i,"layerName",u)}catch(w){C.warning(`回滚图层失败:${w.message}`)}}}),await Ke())}async function mt(e,t){if(!M.value)return;const i=n.items.value[0];let u;try{const w=await q.getBundle(i.kind,M.value.id);u=w.fields?.[e]!=null?String(w.fields[e]):void 0}catch{}await _.run({label:`修改 ${e}`,apply:async()=>{await q.setField(i.kind,M.value.id,e,t)},revert:async()=>{if(u!==void 0)try{await q.setField(i.kind,M.value.id,e,u)}catch(w){C.warning(`回滚 ${e} 失败:${w.message}`)}else C.warning(`回滚 ${e}:没拿到原值快照,仅本地撤销`)}}),await Ke()}async function Mt(){try{const e=(await H.prompt("字段名","新增字段",{inputPattern:/^[A-Za-z0-9_]+$/})).value,t=(await H.prompt("字段值","新增字段",{inputValue:""})).value;await mt(e,t)}catch{}}async function Dt(e){if(M.value)try{await q.execute(n.items.value[0].kind,M.value.id,e),C.success(`已执行 ${e}`),await Ke()}catch(t){C.error(`执行失败:${t.message}`)}}function Rt(){localStorage.setItem("mapEditor.defaults",JSON.stringify(D)),C.success("新建默认已保存(下次创建对象时生效)")}function ft(e){const t=e.site??e.Site,i=e.track??e.Track,u=(S,E,I)=>Number(S?.[E]??S?.[I]??0),w=(S,E,I)=>!!(S?.[E]??S?.[I]);return $a({site:{drawScale:u(t,"drawScale","DrawScale"),dotRadiusNormal:u(t,"dotRadiusNormal","DotRadiusNormal"),dotRadiusSelected:u(t,"dotRadiusSelected","DotRadiusSelected"),selectionRingM:u(t,"selectionRingM","SelectionRingM"),colorNormalArgb:u(t,"colorNormalArgb","ColorNormalArgb"),colorSelectedArgb:u(t,"colorSelectedArgb","ColorSelectedArgb"),labelColorNormalArgb:u(t,"labelColorNormalArgb","LabelColorNormalArgb"),labelColorSelectedArgb:u(t,"labelColorSelectedArgb","LabelColorSelectedArgb")},track:{drawScale:u(i,"drawScale","DrawScale"),widthNormal:u(i,"widthNormal","WidthNormal"),widthSelected:u(i,"widthSelected","WidthSelected"),showDirectionArrows:w(i,"showDirectionArrows","ShowDirectionArrows"),colorNormalArgb:u(i,"colorNormalArgb","ColorNormalArgb"),colorSelectedArgb:u(i,"colorSelectedArgb","ColorSelectedArgb")}})}async function ot(){se.value=!0;try{const e=await q.getViewportStyle();X.value=ft(e)}catch(e){console.warn("[MapEditor] 加载视口样式失败:",e)}finally{se.value=!1}}function Ot(e){e.site&&(me.site=e.site,X.value&&(X.value={...X.value,site:{...e.site}})),e.track&&(me.track=e.track,X.value&&(X.value={...X.value,track:{...e.track}})),N&&clearTimeout(N),N=setTimeout(()=>{const t={...me};me={},Yt(t)},350)}async function Yt(e){const t=++ie;P.value=!0;try{const i={};e.site&&(i.site=e.site),e.track&&(i.track=e.track);const u=await q.patchViewportStyle(i);if(t!==ie)return;X.value=ft(u)}catch(i){C.error(`视口样式更新失败:${i.message}`),await ot()}finally{t===ie&&(P.value=!1)}}function Kt(e){C.info("图层可见 / 可选切换暂时仅本地生效,后续接入反射 API")}function vt(e){re.value.find(t=>t.name===e)||(re.value=[...re.value,{name:e,visible:!0,selectable:!0,color:"#cccccc"}],ae.value=[...ae.value,e])}async function yt(){try{const e=await St.get();b.value=!!e.configured}catch{b.value=!1}f.value=!0}async function Ht(e){Ee();const t=(e.created??[]).filter(u=>typeof u=="object"&&u!=null&&typeof u.id=="number"&&!u.error);if(t.length===0)return;const i={label:`AI 生图:落地 ${t.length} 个对象`,apply:async()=>{},revert:async()=>{const u=t.map(w=>({action:"delete",kind:w.kind,id:w.id}));await R.batch(u),C.success(`已撤销 AI 生图(删除 ${u.length} 个对象)`)}};await _.run(i)}async function bt(e){const t=localStorage.getItem("mapEditor.lastProjectPath")??"";if(!e&&t){te.value=!0;try{const i=await R.projectSave(t);localStorage.setItem("mapEditor.lastProjectPath",i.path),C.success(`已保存:${i.path}`)}catch(i){C.error(`保存失败:${i.message}`)}finally{te.value=!1}return}k.value="save",W.value=t?t.replace(/[\\/][^\\/]*$/,""):"",T.value=!0}async function Xt(){const e=localStorage.getItem("mapEditor.lastProjectPath")??"";k.value="load",W.value=e?e.replace(/[\\/][^\\/]*$/,""):"",T.value=!0}async function Wt(e){if(e){if(k.value==="save"){te.value=!0;try{const t=await R.projectSave(e);localStorage.setItem("mapEditor.lastProjectPath",t.path),C.success(`已保存:${t.path}`)}catch(t){C.error(`保存失败:${t.message}`)}finally{te.value=!1}return}try{const t=await R.projectLoad(e);localStorage.setItem("mapEditor.lastProjectPath",t.path),C.success(`已加载:${t.sites} 站点 / ${t.tracks} 路径 / ${t.specials} 装饰 / ${t.missions} 任务`),n.clear(),M.value=null}catch(t){C.error(`加载失败:${t.message}`)}}}function Je(e){r.value=e,x.value=e==="image"?"image/*":".obj,.glb,.gltf,.fbx,.cyclemodel",h.value?.click()}async function Gt(e){const t=e.target,i=t.files?.[0];if(i)try{const u=await i.arrayBuffer(),w=Jt(u),S=await R.uploadAsset(i.name,w);C.success(`已上传:${S.fileName}`),r.value==="image"?await R.createImage({x:0,y:0,imagePath:S.savedPath,size:1e3}):await R.createModel({x:0,y:0,modelPath:S.savedPath,scale:1}),Ee()}catch(u){C.error(`上传失败:${u.message}`)}finally{t.value=""}}function Jt(e){let t="";const i=new Uint8Array(e);for(let u=0;u<i.byteLength;u++)t+=String.fromCharCode(i[u]);return btoa(t)}zn({onMouse:e=>{F.x=e.x,F.y=e.y},onPick:e=>{Ge(e)},onSelect:e=>G(e.names)});const Zt=Ca({onWorkspaceShortcut:e=>{He(e.action)},onAlarm:()=>{},onObjectCreated:()=>Ee(),onObjectDeleted:()=>Ee(),onObjectPatched:()=>Ee(),onObjectBatchChanged:()=>Ee(),onViewportStyleUpdated:()=>{ot()},onSelectionDetail:e=>{if(!Array.isArray(e.names))return;const t=$e(e.names),i=We(t);i!==Me.value&&(Me.value=i,n.set(t))}});function Ee(){Ke()}he(()=>Zt.connected.value,e=>ve.value=e,{immediate:!0}),he(()=>We(n.items.value),e=>{Ke(),Me.value=e,n.items.value.length===1&&q.setSelection(n.items.value[0].kind,n.items.value[0].id).catch(()=>{})});function qt(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 He(e){if(e==="undo"){if(!_.canUndo.value)return;await _.undo()}else if(e==="redo"){if(!_.canRedo.value)return;await _.redo()}else await Te()}function gt(e){if(qt(e.target))return;const t=e.ctrlKey||e.metaKey;t&&e.key.toLowerCase()==="z"&&!e.shiftKey?(e.preventDefault(),He("undo")):t&&(e.key.toLowerCase()==="y"||e.key.toLowerCase()==="z"&&e.shiftKey)?(e.preventDefault(),He("redo")):e.key==="Delete"&&(e.preventDefault(),He("delete"))}function wt(e){const t=e.detail?.action;(t==="undo"||t==="redo"||t==="delete")&&He(t)}async function Qt(){try{const e=await R.getViewFilter();Object.assign(L.selectFilter,e.selectFilter),Object.assign(L.alignSnap,e.alignSnap),Object.assign(L.showViewport,e.showViewport),xe()}catch(e){console.warn("[MapEditor] 拉后端 viewFilter 失败,沿用本地缓存:",e)}}return Ft(async()=>{document.addEventListener("keydown",gt,!0),window.addEventListener("workspace-shortcut",wt);try{const t=await St.get();b.value=!!t.configured}catch{}const e=localStorage.getItem("mapEditor.defaults");if(e)try{Object.assign(D,JSON.parse(e))}catch{}Ue(),await Qt(),await ot()}),xa(()=>{document.removeEventListener("keydown",gt,!0),window.removeEventListener("workspace-shortcut",wt)}),(e,t)=>{const i=Qe,u=jt,w=Nt,S=Xe,E=qe,I=pt;return V(),U("div",Dn,[a(ja,{"can-undo":O(_).canUndo.value,"can-redo":O(_).canRedo.value,saving:te.value,"view-filter":L,onCmd:v},null,8,["can-undo","can-redo","saving","view-filter"]),s("div",Rn,[a(Da,{"active-tool":O(m).activeTool.value,onSelectTool:je,onOpenAi:yt},null,8,["active-tool"]),s("div",On,[a(Va,{ref_key:"workspaceRef",ref:p,host:O(g),scope:O(A).scope??"Platform",token:O(A).token??"","read-only":!1,"embed-ui":!1,"canvas-only":!0,"hide-toolbar":!0,onPick:Ge,onSelect:G},null,8,["host","scope","token"])]),a(Wl,{"selection-count":O(n).count.value,primary:M.value,fields:pe.value,status:le.value,methods:ge.value,loading:oe.value,layers:ae.value,defaults:D,"layer-rows":re.value,"selection-kind":Se.value,"viewport-style":X.value,"viewport-style-loading":se.value,"viewport-syncing":P.value,onRename:Ut,onChangeLayer:Lt,onSetField:mt,onAddField:Mt,onExecAction:Dt,onSaveDefaults:Rt,onLayerToggle:Kt,onAddLayer:vt,onDelete:Te,onPatchViewport:Ot},null,8,["selection-count","primary","fields","status","methods","loading","layers","defaults","layer-rows","selection-kind","viewport-style","viewport-style-loading","viewport-syncing"])]),a(nn,{"selected-count":O(n).count.value,"mouse-x":F.x,"mouse-y":F.y,"tool-label":O(m).toolLabel.value,"snap-on":tt.value,"undo-size":O(_).undoStack.value.length,"redo-size":O(_).redoStack.value.length,connected:ve.value},null,8,["selected-count","mouse-x","mouse-y","tool-label","snap-on","undo-size","redo-size","connected"]),a(dn,{modelValue:f.value,"onUpdate:modelValue":t[0]||(t[0]=z=>f.value=z),configured:b.value,"default-bounds":B.value,"default-layer":D.site.layer,onGenerated:Ht},null,8,["modelValue","configured","default-bounds","default-layer"]),a(Fn,{modelValue:T.value,"onUpdate:modelValue":t[1]||(t[1]=z=>T.value=z),mode:k.value,"initial-path":W.value,onConfirm:Wt},null,8,["modelValue","mode","initial-path"]),a(I,{modelValue:ke.value,"onUpdate:modelValue":t[3]||(t[3]=z=>ke.value=z),title:"切换显示图层",width:"520px"},{footer:l(()=>[a(S,{onClick:t[2]||(t[2]=z=>ke.value=!1)},{default:l(()=>[...t[4]||(t[4]=[y("关闭",-1)])]),_:1}),a(S,{type:"primary",onClick:ue},{default:l(()=>[...t[5]||(t[5]=[y("新建图层…",-1)])]),_:1})]),default:l(()=>[a(E,{data:re.value,size:"small",style:{width:"100%"}},{default:l(()=>[a(i,{prop:"name",label:"图层","min-width":"120"}),a(i,{label:"可见",width:"80"},{default:l(({row:z})=>[a(u,{modelValue:z.visible,"onUpdate:modelValue":ee=>z.visible=ee},null,8,["modelValue","onUpdate:modelValue"])]),_:1}),a(i,{label:"可选",width:"80"},{default:l(({row:z})=>[a(u,{modelValue:z.selectable,"onUpdate:modelValue":ee=>z.selectable=ee},null,8,["modelValue","onUpdate:modelValue"])]),_:1}),a(i,{label:"颜色",width:"100"},{default:l(({row:z})=>[a(w,{modelValue:z.color,"onUpdate:modelValue":ee=>z.color=ee,size:"small"},null,8,["modelValue","onUpdate:modelValue"])]),_:1}),a(i,{label:"默认层",width:"110"},{default:l(({row:z})=>[a(S,{size:"small",type:D.site.layer===z.name?"primary":"default",onClick:ee=>be(z.name)},{default:l(()=>[y(j(D.site.layer===z.name?"当前默认":"设为默认"),1)]),_:2},1032,["type","onClick"])]),_:1})]),_:1},8,["data"])]),_:1},8,["modelValue"]),s("input",{ref_key:"fileInputRef",ref:h,type:"file",style:{display:"none"},accept:x.value,onChange:Gt},null,40,Yn)])}}}),So=Ne(Kn,[["__scopeId","data-v-cadf4150"]]);export{So as default};
|