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