@mlightcad/cad-simple-viewer-cli 1.7.1 → 1.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +159 -143
- package/dist/cli.js +51 -0
- package/dist/cli.js.map +1 -1
- package/dist/runHeadless.js +21 -7
- package/dist/runHeadless.js.map +1 -1
- package/dist-runner/assets/cad-html-plugin-BRc2dwPr.js +1547 -0
- package/dist-runner/assets/{cad-pdf-plugin-DkcMorOI.js → cad-pdf-plugin-DvcGLYYG.js} +97 -98
- package/dist-runner/assets/cad-svg-plugin-OW21Bod7.js +16 -0
- package/dist-runner/assets/index-QZJdatvK.js +7313 -0
- package/dist-runner/index.html +12 -12
- package/dist-runner/viewer-runtime.iife.js +218 -218
- package/dist-runner/workers/libredwg-parser-worker.js +24 -20
- package/dist-runner/workers/libredwg-web.wasm +0 -0
- package/dist-runner/workers/mtext-renderer-worker.js +7048 -6961
- package/examples/batch-export-html-multi-preview.mjs +236 -236
- package/examples/batch-export-html.mjs +105 -105
- package/examples/batch-export-png.mjs +103 -103
- package/examples/create-drawing-dxf.scr +15 -15
- package/examples/create-drawing-png.scr +19 -19
- package/examples/create-shapes-dxf.scr +17 -17
- package/examples/export-dxf.scr +5 -5
- package/examples/export-html-multi-preview.scr +18 -18
- package/examples/export-html-multi.scr +13 -13
- package/examples/export-html.scr +12 -12
- package/examples/export-pdf.scr +9 -9
- package/examples/export-png.scr +9 -9
- package/examples/freeze-layer-png.scr +15 -15
- package/examples/index.json +114 -114
- package/package.json +10 -9
- package/dist-runner/assets/cad-html-plugin-CH5xALXb.js +0 -1547
- package/dist-runner/assets/cad-svg-plugin-BJNA8aLS.js +0 -17
- package/dist-runner/assets/index-BSoxUnC1.js +0 -7324
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import{j as Z,$ as Q,k as tt,ay as et,ap as H,ae as U,af as it,ag as st,h as q,ad as nt,ah as rt,ai as at,aj as ot,ak as E,al as ht,a7 as X,am as W,av as ct,ar as B,as as lt,aq as k,ax as v,ao as g,at as w,aE as ut,aF as mt}from"./index-QZJdatvK.js";import{aG as ce,aH as le}from"./index-QZJdatvK.js";class z{static toSvgTransform(t){const e=t.elements;return`matrix(${e[0]},${e[1]},${e[4]},${e[5]},${e[12]},${e[13]})`}static transformPoint(t,e){const i=t.elements,s=e.x,n=e.y,r=e.z??0,o=i[3]*s+i[7]*n+i[11]*r+i[15],h=o===0?1:1/o;return{x:(i[0]*s+i[4]*n+i[8]*r+i[12])*h,y:(i[1]*s+i[5]*n+i[9]*r+i[13])*h}}static transformBox(t,e){if(t.isEmpty())return;const i=t.min,s=t.max,n=[{x:i.x,y:i.y,z:0},{x:s.x,y:i.y,z:0},{x:s.x,y:s.y,z:0},{x:i.x,y:s.y,z:0}];let r=1/0,o=1/0,h=-1/0,c=-1/0;for(const l of n){const m=this.transformPoint(e,l);r=Math.min(r,m.x),o=Math.min(o,m.y),h=Math.max(h,m.x),c=Math.max(c,m.y)}t.min.set(r,o),t.max.set(h,c)}}class y{constructor(){this._objectId="",this._ownerId="",this._layerName="",this._visible=!0,this._userData={},this._box=new H,this._localSvg=""}get box(){return this._box}set box(t){this._box.copy(t)}get basePoint(){return this._basePoint}set basePoint(t){t==null?this._basePoint=t:this._basePoint=this._basePoint?this._basePoint.copy(t):new ct(t)}get svg(){return this.renderSvg()}set svg(t){this._localSvg=t}getLocalSvg(){return this._localSvg}renderSvg(){return this._localSvg?this._matrix?`<g transform="${z.toSvgTransform(this._matrix)}">
|
|
2
|
+
${this._localSvg}
|
|
3
|
+
</g>`:this._localSvg:""}get objectId(){return this._objectId}set objectId(t){this._objectId=t}get ownerId(){return this._ownerId}set ownerId(t){this._ownerId=t}get layerName(){return this._layerName}set layerName(t){this._layerName=t}get visible(){return this._visible}set visible(t){this._visible=t}get userData(){return this._userData}set userData(t){this._userData=t}applyMatrix(t){this._matrix?this._matrix=t.clone().multiply(this._matrix):this._matrix=t.clone(),z.transformBox(this._box,t)}recomputeBoundingBox(){}highlight(){}unhighlight(){}fastDeepClone(){return this}addChild(t){}}class u{static rgbToHex(t){const e=t>>16&255,i=t>>8&255,s=t&255;return`#${e.toString(16).padStart(2,"0")}${i.toString(16).padStart(2,"0")}${s.toString(16).padStart(2,"0")}`}static resolveRgb(t,e,i){return i==="fill"&&t.color.isForeground&&this.isSolidBackgroundHatch(t)?e.backgroundColor:U.fromBackgroundColor(e.backgroundColor).resolveSubEntityTraitsRgb(t)}static strokeAttributes(t,e){const i={stroke:this.rgbToHex(this.resolveRgb(t,e,"line")),fill:"none"};if(!e.showLineWeight)i["stroke-width"]="1",i["vector-effect"]="non-scaling-stroke";else{const r=this.resolveStrokeWidth(t.lineWeight);r!=null&&(i["stroke-width"]=String(r))}const s=this.resolveOpacity(t);s!=null&&s<1&&(i["stroke-opacity"]=String(s));const n=this.strokeDasharray(t,e);return n&&(i["stroke-dasharray"]=n),i}static fillAttributes(t,e){const i={fill:this.rgbToHex(this.resolveRgb(t,e,"fill")),stroke:"none"},s=this.resolveOpacity(t);return s!=null&&s<1&&(i["fill-opacity"]=String(s)),i}static textAttributes(t,e){const i={fill:this.rgbToHex(this.resolveRgb(t,e,"text")),stroke:"none"},s=this.resolveOpacity(t);return s!=null&&s<1&&(i["fill-opacity"]=String(s)),i}static pointAttributes(t,e){return this.textAttributes(t,e)}static formatAttributes(t){return Object.entries(t).map(([e,i])=>`${e}="${xt(i)}"`).join(" ")}static tag(t,e,i){const s=this.formatAttributes(e);return i==null?`<${t} ${s}/>`:`<${t} ${s}>${i}</${t}>`}static isSolidBackgroundHatch(t){if((t.drawOrder??0)>=0)return!1;const e=t.fillType;return e.gradient?!1:!e.definitionLines||e.definitionLines.length===0}static resolveStrokeWidth(t){return t<0?null:Math.max(.01,t/100)}static resolveOpacity(t){var e;const i=(e=t.transparency)==null?void 0:e.alpha;return i==null||Number.isNaN(i)?null:Math.min(1,Math.max(0,i))}static strokeDasharray(t,e){const i=t.lineType.pattern;if(!i||i.length===0)return;const s=e.ltscale*e.celtscale*t.lineTypeScale,n=this.patternToDashSegments(i,s);if(n.length!==0)return n.join(" ")}static patternToDashSegments(t,e){const i=[];for(const s of t){let n=s.elementLength;n<0&&s.elementTypeFlag!==0&&(n=Math.abs(n)),n*=e,n===0&&(n=.5*e),i.push(Math.abs(n))}return i}}function xt(a){return a.replace(/&/g,"&").replace(/"/g,""").replace(/</g,"<")}class gt extends y{constructor(t,e,i,s){super();const n=t.tessellate(s);let r="";for(const o of n){if(o.length===0)continue;const[h,...c]=o;r+=`M${h.x},${h.y}`;for(const l of c)r+=` L${l.x},${l.y}`;r+=" Z";for(const l of o)this._box.expandByPoint(l)}if(r){const o={d:r,"fill-rule":"evenodd",...u.fillAttributes(e,i)};this.svg=u.tag("path",o)}}}class ft extends y{constructor(t,e,i,s){super();const n=t.tessellate(s).reduce((o,h,c)=>(o+=c===0?"M":"L",o+=`${h.x},${h.y}`,o),"");if(n){const o={d:n,...u.strokeAttributes(e,i)};this.svg=u.tag("path",o)}const r=t.box;this._box.min.copy(r.min),this._box.max.copy(r.max)}}class dt extends y{constructor(t,e,i,s){super();const n=t.tessellate(s).reduce((o,h,c)=>(o+=c===0?"M":"L",o+=`${h.x},${h.y}`,o),"");if(n){const o={d:n,...u.strokeAttributes(e,i)};this.svg=u.tag("path",o)}const r=t.box;this._box.min.copy(r.min),this._box.max.copy(r.max)}}class Y{static isSafeEmbeddedUrl(t){const e=t.trim();return e.startsWith("data:")||e.startsWith("#")}static sanitizeExternalReferences(t){return t.replace(/<(?:image|use)\b[^>]*\s(?:xlink:)?href="(?!data:|#)[^"]*"[^>]*\/?>\s*/gi,"")}static async rasterizeSvgDataUrl(t){return typeof document>"u"?t:new Promise((e,i)=>{const s=new Image;s.onload=()=>{const n=Math.max(1,s.naturalWidth||1),r=Math.max(1,s.naturalHeight||1),o=document.createElement("canvas");o.width=n,o.height=r;const h=o.getContext("2d");if(!h){i(new Error("Canvas 2D context unavailable"));return}h.drawImage(s,0,0,n,r),e(o.toDataURL("image/png"))},s.onerror=()=>i(new Error("Failed to rasterize embedded SVG image")),s.src=t})}}class pt extends y{constructor(t){super(),this._childCount=t.length;const e=t.map(i=>i.renderSvg()).filter(Boolean).join(`
|
|
4
|
+
`);this._localSvg=e;for(const i of t)this._box.union(i.box)}get childCount(){return this._childCount}}class F extends y{constructor(t,e,i,s){super();const{boundary:n}=e;if(n.length<2||!Y.isSafeEmbeddedUrl(t))return;let r=1/0,o=1/0,h=-1/0,c=-1/0;for(const x of n)x.x<r&&(r=x.x),x.y<o&&(o=x.y),x.x>h&&(h=x.x),x.y>c&&(c=x.y),this._box.expandByPoint(x);const l=h-r,m=c-o,f=bt(t);this._localSvg=`<image x="${r}" y="${o}" width="${l}" height="${m}" href="${f}" xlink:href="${f}" transform="scale(1,-1) translate(0,${-(o*2+m)})"/>`}static async fromBlob(t,e,i,s){let n=await yt(t);if(t.type==="image/svg+xml"||n.startsWith("data:image/svg+xml"))try{n=await Y.rasterizeSvgDataUrl(n)}catch{return new F("",e,i,s)}return new F(n,e,i,s)}}function yt(a){return new Promise((t,e)=>{const i=new FileReader;i.onload=()=>t(i.result),i.onerror=e,i.readAsDataURL(a)})}function bt(a){return a.replace(/&/g,"&").replace(/"/g,""")}class vt extends y{constructor(t,e,i){super();const s=t.reduce((n,r,o)=>(n+=o===0?"M":"L",n+=r.x+","+r.y,this.box.expandByPoint(r),n),"");if(s){const n={d:s,...u.strokeAttributes(e,i)};this.svg=u.tag("path",n)}}}class wt extends y{constructor(t,e,i,s,n){super();const r=u.strokeAttributes(s,n),o=[];for(let h=0;h+1<i.length;h+=2){const c=i[h]*e,l=i[h+1]*e,m=t[c],f=t[c+1],x=t[l],p=t[l+1];o.push(u.tag("line",{x1:String(m),y1:String(f),x2:String(x),y2:String(p),...r})),this._box.expandByPoint({x:m,y:f}),this._box.expandByPoint({x,y:p})}this.svg=o.join(`
|
|
5
|
+
`)}}const K=/\.(shx|ttf|otf|woff2?)$/i,St={txt:"Lucida Console, Courier New, monospace",simplex:"Arial, Helvetica, sans-serif",romans:'"Times New Roman", Times, serif',romanc:'"Times New Roman", Times, serif',romand:'"Times New Roman", Times, serif',romant:'"Times New Roman", Times, serif',italic:'"Times New Roman", Times, serif',italict:'"Times New Roman", Times, serif',italicc:'"Times New Roman", Times, serif',monotxt:'"Courier New", Courier, monospace',isocp:"Arial, Helvetica, sans-serif",isocp2:"Arial, Helvetica, sans-serif",isocp3:"Arial, Helvetica, sans-serif",isoct:"Arial, Helvetica, sans-serif",isoct2:"Arial, Helvetica, sans-serif",isoct3:"Arial, Helvetica, sans-serif",gdt:"Arial, Helvetica, sans-serif",greekc:'"Times New Roman", Times, serif',greeks:'"Times New Roman", Times, serif',simsun:'SimSun, "Songti SC", STSong, serif',simhei:'SimHei, "Heiti SC", STHeiti, sans-serif',simkai:'KaiTi, "Kaiti SC", STKaiti, serif',simfang:'FangSong, "Fangsong SC", STFangsong, serif',msyh:'"Microsoft YaHei", "PingFang SC", sans-serif',dengxian:'DengXian, "Microsoft YaHei", sans-serif',arial:"Arial, Helvetica, sans-serif","times new roman":'"Times New Roman", Times, serif',courier:'"Courier New", Courier, monospace',tahoma:"Tahoma, Geneva, sans-serif",verdana:"Verdana, Geneva, sans-serif"},Tt={arial:"1",romans:"1.05",txt:"1.1",simplex:"1.05",isocp:"1"};let O={},D={};function $(a){return a.trim().replace(K,"").toLowerCase()}function I(a,t){const e=(t==null?void 0:t.trim())||"sans-serif";if(!(a!=null&&a.trim()))return I(e,"sans-serif");const i=$(a);return(O[i]??St[i]??O[a.toLowerCase()])||(K.test(a)?e:a.includes(",")?a:`"${a}", ${e}`)}function _t(a){if(!(a!=null&&a.trim()))return 1;const t=$(a),e=D[t]??Tt[t]??D[a.toLowerCase()];if(e==null)return 1;const i=Number(e);return Number.isFinite(i)&&i>0?i:1}function N(a){return $(a)}const Lt=1,G=5/3,Ct=.3,Mt=.6,Pt=1,At=4,kt=.7;function Ht(a){if(!a||a.length!==1)return!1;const t=a.codePointAt(0)??0;return t>=4352&&t<=4607||t>=11904&&t<=40959||t>=63744&&t<=64255||t>=65040&&t<=65135||t>=65280&&t<=65376||t>=131072&&t<=196607}function Rt(a,t){const e=typeof t.lineSpaceFactor=="number"?t.lineSpaceFactor:Lt,i=a*Math.max(e,0)*G;return t.lineSpaceStyle===2?i:Math.max(i,a*G)}function Ft(a){return!Number.isFinite(a.width)||a.width<=0?null:a.width}function Et(a){switch(a){case k.RIGHT_TO_LEFT:return 1;case k.TOP_TO_BOTTOM:return 2;case k.BOTTOM_TO_TOP:return 3;case k.LEFT_TO_RIGHT:case k.BY_STYLE:default:return 0}}function Bt(a){const t=a.directionVector;return t&&(t.x!==0||t.y!==0)?Math.atan2(t.y,t.x):a.rotation??0}function Yt(a){const t=a.width;if(!Number.isFinite(t)||t<=0||a.attachmentPoint==null)return v.LEFT;switch(a.attachmentPoint){case g.TopCenter:case g.MiddleCenter:case g.BottomCenter:case g.BaselineCenter:return v.CENTER;case g.TopRight:case g.MiddleRight:case g.BottomRight:case g.BaselineRight:return v.RIGHT;default:return v.LEFT}}function $t(a){return{minX:a.minX,maxX:a.maxX,minY:-a.maxY,maxY:-a.minY,baselineY:-a.firstBaselineY}}function It(a,t){const e=$t(t),i=(e.minX+e.maxX)/2,s=(e.minY+e.maxY)/2;switch(a){case g.TopCenter:return{x:-i,y:-e.maxY};case g.TopRight:return{x:-e.maxX,y:-e.maxY};case g.MiddleLeft:return{x:-e.minX,y:-s};case g.MiddleCenter:return{x:-i,y:-s};case g.MiddleRight:return{x:-e.maxX,y:-s};case g.BottomLeft:return{x:-e.minX,y:-e.minY};case g.BottomCenter:return{x:-i,y:-e.minY};case g.BottomRight:return{x:-e.maxX,y:-e.minY};case g.BaselineCenter:return{x:-i,y:-e.baselineY};case g.BaselineRight:return{x:-e.maxX,y:-e.baselineY};case g.BaselineLeft:return{x:-e.minX,y:-e.baselineY};case g.TopLeft:default:return{x:-e.minX,y:-e.maxY}}}function Nt(a,t,e,i){const s=new H,{text:n,height:r,position:o}=a;if(!n||r<=0)return{localSvg:"",box:s};const h=r,c=Rt(h,a),l=Ft(a),m=Et(a.drawingDirection),f=I(t.extendedFont||t.font,"sans-serif"),x=typeof a.widthFactor=="number"&&a.widthFactor>0?a.widthFactor:typeof t.widthFactor=="number"&&t.widthFactor>0?t.widthFactor:1,p=new B;p.capHeight={value:h,isRelative:!1},p.widthFactor={value:x,isRelative:!1},p.paragraph.align=Yt(a),typeof t.obliqueAngle=="number"&&(p.oblique=t.obliqueAngle),p.fontFace.family=N(t.extendedFont||t.font||f);const _=new lt(n,p,{resetParagraphParameters:!0,yieldPropertyCommands:!0}),d=new Wt(h,c,l,m,f,t,e,i);for(const J of _.parse())d.consume(J);d.finish();const b=d.bounds,L=It(a.attachmentPoint,b),{x:C,y:M}=o,S=Bt(a)*180/Math.PI,T=[`translate(${C},${M})`];S!==0&&T.push(`rotate(${-S})`),T.push(`translate(${L.x},${L.y})`),T.push("scale(1,-1)");const R={"font-size":String(h),"font-family":f,...u.textAttributes(e,i)},P=[u.tag("text",R,d.tspanMarkup),d.decorationMarkup].join(""),A=u.tag("g",{transform:T.join(" ")},P);return Xt(s,b,L,C,M),{localSvg:A,box:s}}function Xt(a,t,e,i,s){if(t.maxX<=t.minX&&t.maxY<=t.minY)return;const n=[{x:t.minX+e.x,y:e.y-t.minY},{x:t.maxX+e.x,y:e.y-t.minY},{x:t.minX+e.x,y:e.y-t.maxY},{x:t.maxX+e.x,y:e.y-t.maxY}];for(const r of n)a.expandByPoint({x:i+r.x,y:s+r.y})}class Wt{constructor(t,e,i,s,n,r,o,h){this.baseHeight=t,this.lineAdvance=e,this.wrapWidth=i,this.flowMode=s,this.defaultFont=n,this.style=r,this.traits=o,this.ctx=h,this.x=0,this.y=0,this.lineStartX=0,this.columnStartY=0,this.columnAdvance=0,this.isLineStart=!0,this.firstLineOfParagraph=!0,this.currentLine=null,this.lines=[],this.decorationLines=[],this.activeLineIndex=0,this.minX=0,this.maxX=0,this.minY=0,this.maxY=0,this.firstBaselineY=0,this.hasContent=!1,this.resetParagraphPosition(new B)}get tspanMarkup(){let t="",e=!0;for(const i of this.lines){let s,n;for(const r of i.spans){const o=this.tspanAttributes(r.tokenCtx,r.fontSize),h=s===void 0;this.isVertical()?(o.x=String(r.x),o.y=String(r.y)):h?(s=r.x,o.x=String(r.x),o.dy=e?"0":String(this.lineAdvance),e=!1,n=r.x+this.measureText(r.text,r.fontSize,r.tokenCtx)):n!=null&&Math.abs(r.x-n)>1e-6?(o.x=String(r.x),n=r.x+this.measureText(r.text,r.fontSize,r.tokenCtx)):n=(n??r.x)+this.measureText(r.text,r.fontSize,r.tokenCtx),t+=u.tag("tspan",o,zt(r.text))}}return t}get decorationMarkup(){return this.decorationLines.map(t=>u.tag("line",{x1:String(t.x1),y1:String(t.y1),x2:String(t.x2),y2:String(t.y2),stroke:t.stroke,"stroke-width":String(Math.max(this.baseHeight*.05,.05)),"stroke-linecap":"butt"})).join("")}get bounds(){return{minX:this.minX,maxX:this.maxX,minY:this.minY,maxY:this.maxY,firstBaselineY:this.firstBaselineY}}consume(t){switch(t.type){case w.WORD:this.emitText(String(t.data??""),t.ctx);break;case w.SPACE:this.emitSpace(t.ctx);break;case w.NBSP:this.emitText(" ",t.ctx);break;case w.TABULATOR:this.advanceToTab(t.ctx);break;case w.NEW_PARAGRAPH:this.newParagraph(t.ctx);break;case w.NEW_COLUMN:this.newColumn(t.ctx);break;case w.WRAP_AT_DIMLINE:this.wrapLine(t.ctx);break;case w.PROPERTIES_CHANGED:this.applyPropertyChange(t.data,t.ctx);break;case w.STACK:Array.isArray(t.data)&&t.data.length===3&&this.emitStack(t.data,t.ctx);break}}finish(){this.finalizeCurrentLine(),this.applyLineAlignment(),this.recomputeBoundsFromLines()}applyPropertyChange(t,e){var i,s;if(((i=t.changes.paragraph)==null?void 0:i.align)!=null&&this.currentLine&&(this.currentLine.paragraphAlign=t.changes.paragraph.align),t.command==="f"||t.command==="F")this.applyFontFaceChange(t.changes.fontFace,e);else if(t.command==="p"&&((s=t.changes.paragraph)==null?void 0:s.indent)!=null&&this.firstLineOfParagraph){const n=t.changes.paragraph.indent*this.baseHeight;this.isHorizontalRtl()?this.x-=n:this.isVertical()||(this.x+=n)}}applyFontFaceChange(t,e){if(!(t!=null&&t.family))return;const i=N(t.family);e.fontFace={...t,family:i},t.style==="Italic"&&(e.oblique=(this.style.obliqueAngle??0)||15)}applyLineAlignment(){var t;if(this.wrapWidth!=null)for(let e=0;e<this.lines.length;e++){const i=this.lines[e];if(i.maxX-i.minX<=0)continue;const s=((t=i.spans[0])==null?void 0:t.tokenCtx)??new B,n=this.wrapWidth-this.paragraphLeft(s)-this.rightMargin(s);let r=0;switch(i.paragraphAlign){case v.CENTER:r=i.columnLeft+n/2-(i.minX+i.maxX)/2;break;case v.RIGHT:r=i.columnLeft+n-i.maxX;break;case v.JUSTIFIED:case v.DISTRIBUTED:case v.LEFT:case v.DEFAULT:default:r=0;break}if(r!==0){for(const o of i.spans)o.x+=r;i.minX+=r,i.maxX+=r;for(const o of this.decorationLines)o.lineIndex===e&&(o.x1+=r,o.x2+=r)}}}recomputeBoundsFromLines(){this.minX=0,this.maxX=0,this.minY=0,this.maxY=0,this.hasContent=!1;for(const t of this.lines)for(const e of t.spans)this.includeSpanBounds(e)}emitSpace(t){const e=this.spaceWidth(t);this.isLineStart||this.isHorizontal()&&(this.ensureFits(e,t),this.isLineStart)||this.advancePosition(e,this.resolveCapHeight(t))}emitText(t,e){if(!t)return;if(this.isVertical()){for(const n of t)this.emitTextRun(n,e);return}if(this.wrapWidth==null){this.emitTextRun(t,e);return}const i=this.resolveCapHeight(e),s=this.measureText(t,i,e);!this.isLineStart&&s>0&&this.penOffset(e)+s>this.maxLineWidth(e)&&this.wrapLine(e);for(const n of t)this.emitTextRun(n,e)}emitTextRun(t,e){var i;if(!t)return;const s=this.resolveCapHeight(e),n=this.measureText(t,s,e),r=this.isVertical()?s:n;this.ensureFits(r,e);const o=this.currentPosition(),h={text:t,x:o.x,y:o.y,fontSize:s,tokenCtx:e.copy()};(i=this.currentLine)==null||i.spans.push(h),this.includeSpanBounds(h),this.advancePosition(n,s),this.firstLineOfParagraph=!1}emitStack(t,e){const[i,s,n]=t,r=this.currentPosition(),o=this.isLineStart,h=this.resolveCapHeight(e);if(n==="^"){const d=e.copy();if(d.capHeight={value:kt,isRelative:!0},i&&!s){this.setPosition(r.x,r.y-h*.35),this.isLineStart=!0,this.emitText(i,d);const b=this.measureHorizontalSpan(r,this.currentPosition());this.setPosition(r.x+b,r.y)}else if(!i&&s){this.setPosition(r.x,r.y+h*.2),this.isLineStart=!0,this.emitText(s,d);const b=this.measureHorizontalSpan(r,this.currentPosition());this.setPosition(r.x+b,r.y)}else if(i&&s){this.setPosition(r.x,r.y-h*.2),this.isLineStart=!0,this.emitText(i,d);const b=this.measureHorizontalSpan(r,this.currentPosition());this.setPosition(r.x+b,r.y)}this.isLineStart=o;return}if(n==="/"){this.emitText(`${i}/${s}`,e);return}const c=this.measureText(i,h,e),l=this.measureText(s,h,e),m=Math.max(c,l),f=(m-c)/2,x=(m-l)/2,p=V(e.color,this.traits,this.ctx);if(this.setPosition(r.x+f,r.y-h*.35),this.isLineStart=!0,this.emitText(i,e),this.setPosition(r.x+x,r.y+h*.2),this.isLineStart=!0,this.emitText(s,e),n==="/"||n==="#"){const d=r.y-h*.05+this.baseHeight*Ct;this.decorationLines.push({x1:r.x,y1:d,x2:r.x+m,y2:d,stroke:p,lineIndex:this.activeLineIndex})}const _=this.isHorizontalRtl()?r.x-m:r.x+m;this.setPosition(_,r.y),this.isLineStart=o}newParagraph(t){if(this.finalizeCurrentLine(),this.isVertical()){this.newColumn(t);return}this.y+=this.lineAdvance,this.columnStartY=this.y,this.resetParagraphPosition(t)}wrapLine(t){if(this.finalizeCurrentLine(),this.isVertical()){this.newColumn(t);return}this.y+=this.lineAdvance,this.columnStartY=this.y,this.resetLinePosition(t)}newColumn(t){if(this.finalizeCurrentLine(),this.isVertical()){this.x+=this.columnAdvance>0?this.columnAdvance:this.baseHeight,this.columnAdvance=0,this.isVerticalTtb()&&(this.columnStartY=0),this.resetParagraphPosition(t);return}this.x+=this.wrapWidth??this.baseHeight*4,this.resetParagraphPosition(t)}finalizeCurrentLine(){this.currentLine&&this.currentLine.spans.length>0&&(this.lines.push(this.currentLine),this.activeLineIndex=this.lines.length),this.currentLine=null}resetParagraphPosition(t){this.firstLineOfParagraph=!0,this.resetLinePosition(t)}resetLinePosition(t){const e=this.paragraphLeft(t),i=this.firstLineOfParagraph?this.firstLineIndent(t):0,s=this.lineLimits(t);this.isHorizontalRtl()?(this.x=s.right-i,this.y=this.columnStartY):this.isVerticalTtb()?(this.x=e,this.y=this.columnStartY+i):this.isVerticalBtt()?(this.x=e,this.y=(this.wrapWidth!=null?this.wrapWidth:this.baseHeight*10)-i,this.columnStartY=this.y):(this.x=e+i,this.y=this.columnStartY),this.lineStartX=e,this.isLineStart=!0,this.currentLine={spans:[],minX:this.x,maxX:this.x,minY:this.y,maxY:this.y,baselineY:this.y,columnLeft:e,paragraphAlign:t.paragraph.align}}wouldOverflow(t,e){if(this.wrapWidth==null||t<=0||this.isLineStart)return!1;if(this.isHorizontal())return this.penOffset(e)+t>this.maxLineWidth(e);const i=this.verticalLimits(e);return this.isVerticalTtb()?this.y+t>i.bottom:this.y-t<i.top}penOffset(t){return this.isHorizontalRtl()?this.lineLimits(t).right-this.x:this.x-this.paragraphLeft(t)}maxLineWidth(t){return this.wrapWidth==null?Number.POSITIVE_INFINITY:this.wrapWidth-this.paragraphLeft(t)-this.rightMargin(t)}ensureFits(t,e){this.wrapWidth!=null&&this.isHorizontal()&&!this.isLineStart&&this.penOffset(e)>this.maxLineWidth(e)&&this.wrapLine(e),this.wouldOverflow(t,e)&&this.wrapLine(e)}advancePosition(t,e){this.isHorizontalRtl()?this.x-=t:this.isVerticalTtb()?this.y+=e:this.isVerticalBtt()?this.y-=e:this.x+=t,this.isLineStart=!1,this.columnAdvance=Math.max(this.columnAdvance,t)}advanceToTab(t){const e=this.baseHeight*At,i=t.paragraph.tabs;if(i.length===0){const s=this.isHorizontalRtl()?Math.floor(this.x/e)*e:Math.ceil((this.x+1)/e)*e,n=this.isHorizontalRtl()?this.x-s:s-this.x;this.advancePosition(Math.max(0,n),this.resolveCapHeight(t));return}for(const s of i){const n=this.lineStartX+(typeof s=="number"?s*this.baseHeight:parseFloat(String(s))*this.baseHeight);if(this.isHorizontalRtl()){if(!Number.isNaN(n)&&n<this.x){this.advancePosition(this.x-n,this.resolveCapHeight(t));return}}else if(!Number.isNaN(n)&&n>this.x){this.advancePosition(n-this.x,this.resolveCapHeight(t));return}}this.advancePosition(e,this.resolveCapHeight(t))}lineLimits(t){const e=this.paragraphLeft(t),i=t.paragraph.right*this.baseHeight,s=this.wrapWidth!=null?e+this.wrapWidth-i:Number.POSITIVE_INFINITY;return{left:e,right:s}}verticalLimits(t){if(this.isVerticalBtt()){const s=this.columnStartY-t.paragraph.right*this.baseHeight;return{top:this.wrapWidth!=null?this.columnStartY-this.wrapWidth+this.firstLineIndent(t):Number.NEGATIVE_INFINITY,bottom:s}}const e=this.columnStartY+this.firstLineIndent(t),i=this.wrapWidth!=null?this.columnStartY+this.wrapWidth-t.paragraph.right*this.baseHeight:Number.POSITIVE_INFINITY;return{top:e,bottom:i}}currentPosition(){return{x:this.x,y:this.y}}setPosition(t,e){this.x=t,this.y=e}includeSpanBounds(t){const e=this.measureText(t.text,t.fontSize,t.tokenCtx),i=this.isHorizontalRtl()?t.x-e:t.x,s=this.isHorizontalRtl()?t.x:t.x+e,n=t.y-t.fontSize,r=t.y;this.hasContent?(this.minX=Math.min(this.minX,i),this.maxX=Math.max(this.maxX,s),this.minY=Math.min(this.minY,n),this.maxY=Math.max(this.maxY,r)):(this.minX=i,this.maxX=s,this.minY=n,this.maxY=r,this.firstBaselineY=t.y,this.hasContent=!0),this.currentLine&&(this.currentLine.minX=Math.min(this.currentLine.minX,i),this.currentLine.maxX=Math.max(this.currentLine.maxX,s),this.currentLine.minY=Math.min(this.currentLine.minY,n),this.currentLine.maxY=Math.max(this.currentLine.maxY,r))}measureHorizontalSpan(t,e){return Math.abs(e.x-t.x)}spaceWidth(t){const e=this.resolveCapHeight(t);return this.measureText(" ",e,t)}measureCharWidth(t,e,i){const s=this.resolveWidthFactor(i),n=this.resolveTracking(i),r=Ht(t)?Pt:Mt;return e*r*s*n}measureText(t,e,i){let s=0;for(const n of t)s+=this.measureCharWidth(n,e,i);return s}paragraphLeft(t){return t.paragraph.left*this.baseHeight}firstLineIndent(t){return t.paragraph.indent*this.baseHeight}rightMargin(t){return((t==null?void 0:t.paragraph.right)??0)*this.baseHeight}resolveCapHeight(t){const e=t.capHeight,i=e.isRelative?this.baseHeight*e.value:e.value,s=t.fontFace.family||this.defaultFont;return i*_t(s)}resolveWidthFactor(t){const e=t.widthFactor;if(e.isRelative){const i=this.wrapWidth??this.baseHeight*4;return e.value*i}return e.value*.85}resolveTracking(t){const e=t.charTrackingFactor;return e.isRelative?e.value+1:e.value}isHorizontal(){return this.flowMode===0||this.flowMode===1}isHorizontalRtl(){return this.flowMode===1}isVertical(){return this.flowMode===2||this.flowMode===3}isVerticalTtb(){return this.flowMode===2}isVerticalBtt(){return this.flowMode===3}tspanAttributes(t,e){const i={};Math.abs(e-this.baseHeight)>1e-9&&(i["font-size"]=String(e));const s=t.fontFace.family;i["font-family"]=I(s,this.defaultFont),t.bold&&(i["font-weight"]="700"),t.italic&&(i["font-style"]="italic");const n=this.resolveWidthFactor(t),r=this.resolveTracking(t);r!==1&&(i["letter-spacing"]=`${((r-1)*e*.25).toFixed(3)}`);const o=t.oblique;if(o!==0){const c=[`skewX(${-o})`];n!==1&&c.unshift(`scale(${n},1)`),i.transform=c.join(" ")}else n!==1&&(i.transform=`scale(${n},1)`);i.fill=V(t.color,this.traits,this.ctx);const h=[];return t.underline&&h.push("underline"),t.overline&&h.push("overline"),t.strikeThrough&&h.push("line-through"),h.length>0&&(i["text-decoration"]=h.join(" ")),i}}function V(a,t,e){if(a.isRgb&&a.rgbValue!=null)return u.rgbToHex(a.rgbValue);if(a.aci===256||a.aci==null||a.aci===0)return u.rgbToHex(u.resolveRgb(t,e,"text"));const i=new q;i.colorIndex=a.aci;const s=i.RGB;return typeof s=="number"?u.rgbToHex(s):u.rgbToHex(u.resolveRgb(t,e,"text"))}function zt(a){return a.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}class Ot extends y{constructor(t,e,i,s){super();const n=Nt(t,e,i,s);this._localSvg=n.localSvg,this._box=n.box}}const Dt=.5;class Gt extends y{constructor(t,e,i,s){super();const n=e.displaySize>0?e.displaySize/2:Dt,r={cx:String(t.x),cy:String(t.y),r:String(n),...u.pointAttributes(i,s)};this.svg=u.tag("circle",r),this._box.expandByPoint(t)}}function Vt(a,t,e,i){const s=new H,n={localSvg:"",box:s},r=a.size,o=a.position;if(!o||!(r>0))return n;const h=Kt(a,t);if(!(h!=null&&h.length))return n;const c=a.widthFactor??t.widthFactor??1,l=(t.obliqueAngle??0)*Math.PI/180,m=l!==0?Math.tan(l):0,f=jt(h,c,m);if(f.length===0)return n;const x=Ut(f),p=qt(a.rotation,a.directionVector),_=Math.cos(p),d=Math.sin(p),b=u.strokeAttributes(e,i),L=[];for(const C of f){let M="";for(let S=0;S<C.length;S++){const T=C[S].x+x.x,R=C[S].y+x.y,P=T*_-R*d+o.x,A=T*d+R*_+o.y;M+=S===0?`M${P},${A}`:`L${P},${A}`,s.expandByPoint({x:P,y:A})}M&&L.push(u.tag("path",{d:M,...b}))}return{localSvg:L.join(`
|
|
6
|
+
`),box:s}}function jt(a,t,e){const i=[];for(const s of a){if(s.length<2)continue;const n=[];for(const r of s){let o=r.x*t;const h=r.y;e!==0&&(o+=e*h),n.push({x:o,y:h})}i.push(n)}return i}function Ut(a){let t=1/0,e=1/0;for(const i of a)for(const s of i)t=Math.min(t,s.x),e=Math.min(e,s.y);return{x:Number.isFinite(t)?-t:0,y:Number.isFinite(e)?-e:0}}function qt(a,t){if(!t)return a??0;const e=t.x??0,i=t.y??0,s=t.z??1,n=Math.hypot(e,i,s);if(n<1e-12)return a??0;const r=e/n,o=i/n,h=s/n;return Math.hypot(r,o)<1e-10&&h>0?a??0:Math.acos(Math.min(1,Math.max(-1,h)))}function Kt(a,t){var e;const i=N(t.font),s=a.size,n=(e=a.name)==null?void 0:e.trim(),r=a.shapeNumber,o=ut.instance,h=n&&o.getShapeByName(n,i,s)||(r!=null&&r!==0?o.getShapeByCode(r,i,s):void 0);if(h)return Jt(h);const c=o.getFontByName(i,!1);if((c==null?void 0:c.type)!=="shx")return;const l=new mt(c.data);try{const m=n&&l.getShapeByName(n,s)||(r!=null&&r!==0?l.getCharShape(r,s):void 0),f=m==null?void 0:m.polylines;return f!=null&&f.some(x=>x.length>=2)?f:void 0}finally{l.release()}}function Jt(a){var t;const e=(t=a.shape)==null?void 0:t.polylines;if(e!=null&&e.some(i=>i.length>=2))return e}class Zt extends y{constructor(t,e,i,s){super();const n=Vt(t,e,i,s);this._localSvg=n.localSvg,this._box=n.box}}class j{constructor(){this._ltscale=1,this._celtscale=1,this._currentBackgroundColor=0,this._foregroundColor=0,this._showLineWeight=!1,this._entities=[],this._bbox=new H,this._fontMapping={},this._pendingImages=[],this._context=U.fromBackgroundColor(this._currentBackgroundColor),this._subEntityTraits={color:new q,lineType:{type:"ByLayer",name:"Continuous",standardFlag:0,description:"Solid line",totalPatternLength:0},lineTypeScale:1,lineWeight:st.ByLayer,fillType:{solidFill:!0,patternAngle:0,definitionLines:[]},transparency:new it,thickness:0,layer:"0",drawOrder:0}}static prepareExport(){nt.instance.clear()}get subEntityTraits(){return this._subEntityTraits}get context(){return this._context}setFontMapping(t){this._fontMapping=t}set ltscale(t){this._ltscale=t}set celtscale(t){this._celtscale=t}get currentBackgroundColor(){return this._currentBackgroundColor}set currentBackgroundColor(t){this._currentBackgroundColor=t,this._context.backgroundIsDark=!rt(t),this._context.foregroundOnDark=at,this._context.foregroundOnLight=ot}changeForeground(t){this._foregroundColor=t}get showLineWeight(){return this._showLineWeight}set showLineWeight(t){this._showLineWeight=t}get styleContext(){return{ltscale:this._ltscale,celtscale:this._celtscale,backgroundColor:this._currentBackgroundColor,foregroundColor:this._foregroundColor,showLineWeight:this._showLineWeight}}pushEntity(t){return this._entities.push(t),t}removeEntities(t){for(const e of t){const i=this._entities.indexOf(e);i>=0&&this._entities.splice(i,1)}}group(t){return this.removeEntities(t),this.pushEntity(new pt(t))}point(t,e){return this.pushEntity(new Gt(t,e,this._subEntityTraits,this.styleContext))}circularArc(t){return this.pushEntity(new ft(t,this._subEntityTraits,this.styleContext,E(this)))}ellipticalArc(t){return this.pushEntity(new dt(t,this._subEntityTraits,this.styleContext,E(this)))}lines(t){return this.pushEntity(new vt(t,this._subEntityTraits,this.styleContext))}lineSegments(t,e,i){return this.pushEntity(new wt(t,e,i,this._subEntityTraits,this.styleContext))}area(t){return this.pushEntity(new gt(t,this._subEntityTraits,this.styleContext,E(this)))}offsetRing(t,e){const i=new ht;return i.add(new X(t.map(s=>new W(s.x,s.y)),!0)),i.add(new X(e.map(s=>new W(s.x,s.y)),!0)),this.area(i)}mtext(t,e,i){const s=this._fontMapping[e.font]??e.font,n=s!==e.font?{...e,font:s}:e;return this.pushEntity(new Ot(t,n,this._subEntityTraits,this.styleContext))}shape(t,e,i){const s=this._fontMapping[e.font]??e.font,n=s!==e.font?{...e,font:s}:e;return this.pushEntity(new Zt(t,n,this._subEntityTraits,this.styleContext))}image(t,e){const i={...this._subEntityTraits},s=this.styleContext,n=F.fromBlob(t,e,i,s).then(r=>this.pushEntity(r));return this._pendingImages.push(n.then(()=>{})),Qt}async exportAsync(){return await Promise.all(this._pendingImages),this.export()}export(){const t=[],e=new H;for(const c of this._entities){const l=c.renderSvg();l&&(t.push(l),e.union(c.box))}this._bbox=e;const i=t.join(`
|
|
7
|
+
`),s=this._bbox.isEmpty()?0:Math.max(this._bbox.max.x-this._bbox.min.x,this._bbox.max.y-this._bbox.min.y)*.02,n=this._bbox.isEmpty()?{x:0,y:0,width:0,height:0}:{x:this._bbox.min.x-s,y:-(this._bbox.max.y+s),width:this._bbox.max.x-this._bbox.min.x+s*2,height:this._bbox.max.y-this._bbox.min.y+s*2},r=Math.max(n.width,1),o=Math.max(n.height,1),h=this.buildBackgroundRect(n);return Y.sanitizeExternalReferences(`<?xml version="1.0" encoding="UTF-8"?>
|
|
8
|
+
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"
|
|
9
|
+
preserveAspectRatio="xMinYMin meet"
|
|
10
|
+
viewBox="${n.x} ${n.y} ${n.width} ${n.height}"
|
|
11
|
+
width="${r}" height="${o}">
|
|
12
|
+
${h}
|
|
13
|
+
<g transform="matrix(1,0,0,-1,0,0)">
|
|
14
|
+
${i}
|
|
15
|
+
</g>
|
|
16
|
+
</svg>`)}buildBackgroundRect(t){const e=u.rgbToHex(this._currentBackgroundColor),i=Math.max(t.width,1),s=Math.max(t.height,1);return` <rect x="${t.x}" y="${t.y}" width="${i}" height="${s}" fill="${e}"/>`}}const Qt=new y;class te{async convert(t){j.prepareExport();const e=t.doc.database.tables.blockTable.modelSpace.newIterator(),i=new j;this.configureRenderer(i,t);for(const r of e)r.worldDraw(i);const s=await i.exportAsync(),n=tt(t.doc.fileName||t.doc.docTitle,"svg");this.createFileAndDownloadIt(s,n)}configureRenderer(t,e){const i=e.doc.database;t.ltscale=i.ltscale,t.celtscale=i.celtscale,t.showLineWeight=!!i.lwdisplay,t.setFontMapping(et.instance.fontMapping);const s=e.view,n=(s==null?void 0:s.backgroundColor)??16777215;t.currentBackgroundColor=n,t.changeForeground(n===0?16777215:0)}createFileAndDownloadIt(t,e){const i=new Blob([t],{type:"image/svg+xml;charset=utf-8"}),s=URL.createObjectURL(i),n=document.createElement("a");n.href=s,n.download=e,document.body.appendChild(n),n.click(),document.body.removeChild(n),window.setTimeout(()=>URL.revokeObjectURL(s),6e4)}}class ee extends Q{async execute(t){await new te().convert(t)}}const ie="1.7.2",se={version:ie};class ne{constructor(){this.name="SvgPlugin",this.version=se.version,this.description="SVG export (csvg) command",this.registeredCommands=[]}onLoad(t,e){const i=Z.SYSTEMT_COMMAND_GROUP_NAME;e.addCommand(i,"csvg","csvg",new ee),this.registeredCommands.push({group:i,name:"csvg"})}onUnload(t,e){for(const i of this.registeredCommands)e.removeCmd(i.group,i.name);this.registeredCommands=[]}}async function ae(){return new ne}export{ee as AcApConvertToSvgCmd,te as AcApSvgConvertor,j as AcSvgRenderer,ce as SVG_PLUGIN_NAME,le as SVG_PLUGIN_TRIGGERS,ae as createSvgPlugin};
|