@mlightcad/libredwg-converter 3.5.27 → 3.5.28

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.
@@ -1 +1 @@
1
- (function(d,r){typeof exports=="object"&&typeof module<"u"?r(exports,require("@mlightcad/data-model")):typeof define=="function"&&define.amd?define(["exports","@mlightcad/data-model"],r):(d=typeof globalThis<"u"?globalThis:d||self,r(d["libredwg-converter"]={},d.dataModel))})(this,function(d,r){"use strict";class y{convert(e){const n=this.createEntity(e);return n&&this.processCommonAttrs(e,n),n}createEntity(e){return e.type=="3DFACE"?this.convertFace(e):e.type=="ARC"?this.convertArc(e):e.type=="ATTDEF"?this.convertAttributeDefinition(e):e.type=="ATTRIB"?this.convertAttribute(e):e.type=="CIRCLE"?this.convertCirle(e):e.type=="DIMENSION"?this.convertDimension(e):e.type=="ELLIPSE"?this.convertEllipse(e):e.type=="HATCH"?this.convertHatch(e):e.type=="IMAGE"?this.convertImage(e):e.type=="LEADER"?this.convertLeader(e):e.type=="LINE"?this.convertLine(e):e.type=="LWPOLYLINE"?this.convertLWPolyline(e):e.type=="MTEXT"?this.convertMText(e):e.type=="POINT"?this.convertPoint(e):e.type=="POLYLINE2D"?this.convertPolyline2d(e):e.type=="POLYLINE3D"?this.convertPolyline3d(e):e.type=="RAY"?this.convertRay(e):e.type=="SPLINE"?this.convertSpline(e):e.type=="ACAD_TABLE"?this.convertTable(e):e.type=="TEXT"?this.convertText(e):e.type=="SOLID"?this.convertSolid(e):e.type=="VIEWPORT"?this.convertViewport(e):e.type=="WIPEOUT"?this.convertWipeout(e):e.type=="XLINE"?this.convertXline(e):e.type=="INSERT"?this.convertBlockReference(e):null}convertFace(e){const n=new r.AcDbFace;return e.corner1&&n.setVertexAt(0,e.corner1),e.corner2&&n.setVertexAt(1,e.corner2),e.corner3&&n.setVertexAt(2,e.corner3),e.corner4&&n.setVertexAt(3,e.corner4),n.setEdgeInvisibilities(e.flag),n}convertArc(e){const n=e.extrusionDirection??r.AcGeVector3d.Z_AXIS;return new r.AcDbArc(r.transformOcsPointToWcs(e.center,n),e.radius,e.startAngle,e.endAngle,n)}convertCirle(e){const n=e.extrusionDirection??r.AcGeVector3d.Z_AXIS;return new r.AcDbCircle(r.transformOcsPointToWcs(e.center,n),e.radius,n)}convertEllipse(e){const n=new r.AcGeVector3d(e.majorAxisEndPoint),s=n.length();return new r.AcDbEllipse(e.center,e.extrusionDirection??r.AcGeVector3d.Z_AXIS,n,s,s*e.axisRatio,e.startAngle,e.endAngle)}convertLine(e){const n=e.startPoint,s=e.endPoint;return new r.AcDbLine(new r.AcGePoint3d(n.x,n.y,n.z),new r.AcGePoint3d(s.x,s.y,s.z))}convertSpline(e){try{if(e.numberOfControlPoints>0&&e.numberOfKnots>0)return new r.AcDbSpline(e.controlPoints,e.knots,e.weights,e.degree,!!(e.flag&1));if(e.numberOfFitPoints>0)return new r.AcDbSpline(e.fitPoints,"Uniform",e.degree,!!(e.flag&1))}catch{}return null}convertPoint(e){const n=new r.AcDbPoint;return n.position=e.position,n}convertSolid(e){const n=new r.AcDbTrace;return n.setPointAt(0,{...e.corner1,z:0}),n.setPointAt(1,{...e.corner2,z:0}),n.setPointAt(2,{...e.corner3,z:0}),n.setPointAt(3,e.corner4?{...e.corner4,z:0}:{...e.corner3,z:0}),n.thickness=e.thickness,n}convertLWPolyline(e){const n=new r.AcDbPolyline;n.closed=!!(e.flag&512);const s=e.constantWidth??-1;return e.vertices.forEach((o,t)=>{n.addVertexAt(t,new r.AcGePoint2d(o.x,o.y),o.bulge,o.startWidth??s,o.endWidth??s)}),n}convertPolyline2d(e){const n=!!(e.flag&1),s=!!(e.flag&16),o=!!(e.flag&64),t=!!(e.flag&32),i=[],p=[],l=[];if(e.vertices.map(c=>{if(!(c.flag&16))if(o&&c.flag&128)if(c.flag&64)i.push({x:c.x,y:c.y,z:c.z}),p.push(c.bulge??0);else{const f=[];c.polyfaceIndex0!=null&&c.polyfaceIndex0!=0&&f.push(Math.abs(c.polyfaceIndex0)-1),c.polyfaceIndex1!=null&&c.polyfaceIndex1!=0&&f.push(Math.abs(c.polyfaceIndex1)-1),c.polyfaceIndex2!=null&&c.polyfaceIndex2!=0&&f.push(Math.abs(c.polyfaceIndex2)-1),c.polyfaceIndex3!=null&&c.polyfaceIndex3!=0&&f.push(Math.abs(c.polyfaceIndex3)-1),f.length>=3&&l.push(f)}else i.push({x:c.x,y:c.y,z:c.z}),p.push(c.bulge??0)}),s){const c=e.meshMVertexCount??2,f=e.meshNVertexCount??2;return new r.AcDbPolygonMesh(c,f,i,n,t)}else{if(o)return new r.AcDbPolyFaceMesh(i,l);{let c=r.AcDbPoly2dType.SimplePoly;return e.flag&2?c=r.AcDbPoly2dType.FitCurvePoly:e.flag&4&&(e.smoothType==6?c=r.AcDbPoly2dType.CubicSplinePoly:e.smoothType==5&&(c=r.AcDbPoly2dType.QuadSplinePoly)),new r.AcDb2dPolyline(c,i,0,n,e.startWidth,e.endWidth,p)}}}convertPolyline3d(e){const n=!!(e.flag&1),s=[];e.vertices.map(t=>{t.flag&16||s.push({x:t.x,y:t.y,z:t.z})});let o=r.AcDbPoly3dType.SimplePoly;return e.flag&4&&(e.smoothType==6?o=r.AcDbPoly3dType.CubicSplinePoly:e.smoothType==5&&(o=r.AcDbPoly3dType.QuadSplinePoly)),new r.AcDb3dPolyline(o,s,n)}convertHatch(e){var o;const n=new r.AcDbHatch;if((o=e.definitionLines)==null||o.forEach(t=>{n.definitionLines.push({angle:t.angle,base:t.base,offset:t.offset,dashLengths:t.numberOfDashLengths>0?t.dashLengths:[]})}),n.isSolidFill=e.solidFill==1,n.hatchStyle=e.hatchStyle,n.patternName=e.patternName,n.patternType=e.patternType,n.patternAngle=e.patternAngle==null?0:e.patternAngle,n.patternScale=e.patternScale==null?0:e.patternScale,e.boundaryPaths.forEach(t=>{if(t.boundaryPathTypeFlag&2){const p=t,l=new r.AcGePolyline2d;l.closed=p.isClosed,p.vertices.forEach((c,f)=>{l.addVertexAt(f,{x:c.x,y:c.y,bulge:c.bulge})}),n.add(l)}else{const p=t,l=[];p.edges.forEach(f=>{if(f!=null){if(f.type==1){const a=f;l.push(new r.AcGeLine2d(a.start,a.end))}else if(f.type==2){const a=f;l.push(new r.AcGeCircArc2d(a.center,a.radius,a.startAngle,a.endAngle,!a.isCCW))}else if(f.type==3){const a=f;new r.AcGeVector2d().subVectors(a.end,a.center);const u=Math.sqrt(Math.pow(a.end.x,2)+Math.pow(a.end.y,2)),g=u*a.lengthOfMinorAxis;let h=a.startAngle,A=a.endAngle;const w=Math.atan2(a.end.y,a.end.x);a.isCCW||(h=Math.PI*2-h,A=Math.PI*2-A),l.push(new r.AcGeEllipseArc2d({...a.center,z:0},u,g,h,A,!a.isCCW,w))}else if(f.type==4){const a=f;if(a.numberOfControlPoints>0&&a.numberOfKnots>0){const D=a.controlPoints.map(h=>({x:h.x,y:h.y,z:0}));let u=!0;const g=a.controlPoints.map(h=>(h.weight==null&&(u=!1),h.weight||1));l.push(new r.AcGeSpline3d(D,a.knots,u?g:void 0))}else if(a.numberOfFitData>0){const D=a.fitDatum.map(u=>({x:u.x,y:u.y,z:0}));l.push(new r.AcGeSpline3d(D,"Uniform"))}}}});const c=r.AcGeLoop2d.buildFromEdges(l);c.length==0&&l.length>0?n.add(new r.AcGeLoop2d(l)):c.forEach(f=>n.add(f))}}),e.gradientFlag){const t=e;if(n.hatchObjectType=r.AcDbHatchObjectType.GradientObject,n.gradientName=t.gradientName,n.gradientAngle=t.gradientRotation??0,n.gradientShift=t.gradientDefinition??0,n.gradientOneColorMode=t.gradientColorFlag==1,n.shadeTintValue=t.colorTint??0,t.gradientColors){const i=t.gradientColors.length;i>1?(n.gradientStartColor=t.gradientColors[0].rgb,n.gradientEndColor=t.gradientColors[1].rgb):i>0&&(n.gradientStartColor=t.gradientColors[0].rgb)}}return n}convertTable(e){const n=new r.AcDbTable(e.name,e.rowCount,e.columnCount);return n.tableStyleId=e.tableStyleId,n.owningBlockRecordId=e.blockRecordHandle,e.directionVector&&(n.horizontalDirection=new r.AcGeVector3d(e.directionVector)),n.attachmentPoint=e.attachmentPoint,n.position.copy(e.startPoint),n.tableValueFlag=e.tableValue,n.tableOverrideFlag=e.overrideFlag,n.borderColorOverrideFlag=e.borderColorOverrideFlag,n.borderLineweightOverrideFlag=e.borderLineWeightOverrideFlag,n.borderVisibilityOverrideFlag=e.borderVisibilityOverrideFlag,e.columnWidthArr.forEach((s,o)=>n.setColumnWidth(o,s)),e.rowHeightArr.forEach((s,o)=>n.setRowHeight(o,s)),e.cells.forEach((s,o)=>{n.setCell(o,s)}),n}convertText(e){const n=new r.AcDbText;return n.textString=e.text,n.styleName=e.styleName,n.height=e.textHeight,n.position.copy(e.startPoint),n.rotation=e.rotation,n.oblique=e.obliqueAngle??0,n.thickness=e.thickness,n.horizontalMode=e.halign,n.verticalMode=e.valign,n.widthFactor=e.xScale??1,n}convertMText(e){const n=new r.AcDbMText;return n.contents=e.text,e.styleName!=null&&(n.styleName=e.styleName),n.height=e.textHeight,n.width=e.rectWidth,n.rotation=e.rotation||0,n.location=e.insertionPoint,n.attachmentPoint=e.attachmentPoint,e.direction&&(n.direction=new r.AcGeVector3d(e.direction)),n.drawingDirection=e.drawingDirection,n}convertLeader(e){const n=new r.AcDbLeader;return e.vertices.forEach(s=>{n.appendVertex(s)}),n.hasArrowHead=e.isArrowheadEnabled,n.hasHookLine=e.isHooklineExists,n.isSplined=e.isSpline,n.dimensionStyle=e.styleName,n.annoType=e.leaderCreationFlag,n}convertDimension(e){if(e.subclassMarker=="AcDbAlignedDimension"){const n=e,s=new r.AcDbAlignedDimension(n.subDefinitionPoint1,n.subDefinitionPoint2,n.definitionPoint);return n.insertionPoint&&(s.dimBlockPosition={x:n.insertionPoint.x,y:n.insertionPoint.y,z:0}),s.rotation=n.rotationAngle,this.processDimensionCommonAttrs(e,s),s}else if(e.subclassMarker=="AcDbRotatedDimension"){const n=e,s=new r.AcDbRotatedDimension(n.subDefinitionPoint1,n.subDefinitionPoint2,n.definitionPoint);return n.insertionPoint&&(s.dimBlockPosition={x:n.insertionPoint.x,y:n.insertionPoint.y,z:0}),s.rotation=n.rotationAngle,this.processDimensionCommonAttrs(e,s),s}else if(e.subclassMarker=="AcDb3PointAngularDimension"){const n=e,s=new r.AcDb3PointAngularDimension(n.centerPoint,n.subDefinitionPoint1,n.subDefinitionPoint2,n.definitionPoint);return this.processDimensionCommonAttrs(e,s),s}else if(e.subclassMarker=="AcDbOrdinateDimension"){const n=e,s=new r.AcDbOrdinateDimension(n.subDefinitionPoint1,n.subDefinitionPoint2);return this.processDimensionCommonAttrs(e,s),s}else if(e.subclassMarker=="AcDbRadialDimension"){const n=e,s=new r.AcDbRadialDimension(n.definitionPoint,n.centerPoint,n.leaderLength);return this.processDimensionCommonAttrs(e,s),s}else if(e.subclassMarker=="AcDbDiametricDimension"){const n=e,s=new r.AcDbDiametricDimension(n.definitionPoint,n.centerPoint,n.leaderLength);return this.processDimensionCommonAttrs(e,s),s}return null}processImage(e,n){n.position.copy(e.position),n.brightness=e.brightness,n.contrast=e.contrast,n.fade=e.fade,n.imageSize.copy(e.imageSize),n.imageDefId=e.imageDefHandle,n.isClipped=e.clipping>0,n.isShownClipped=(e.flags|4)>0,n.isImageShown=(e.flags|3)>0,n.isImageTransparent=(e.flags|8)>0,e.clippingBoundaryPath.forEach(s=>{n.clipBoundary.push(new r.AcGePoint2d(s))}),n.clipBoundaryType=e.clippingBoundaryType,n.width=Math.sqrt(e.uPixel.x**2+e.uPixel.y**2+e.uPixel.z**2)*e.imageSize.x,n.height=Math.sqrt(e.vPixel.x**2+e.vPixel.y**2+e.vPixel.z**2)*e.imageSize.y,n.rotation=Math.atan2(e.uPixel.y,e.uPixel.x)}convertImage(e){const n=new r.AcDbRasterImage;return this.processImage(e,n),n}convertWipeout(e){const n=new r.AcDbWipeout;return this.processImage(e,n),n}convertViewport(e){const n=new r.AcDbViewport;return n.number=e.viewportId,n.centerPoint.copy(e.viewportCenter),n.height=e.height,n.width=e.width,n.viewCenter.copy(e.displayCenter),n.viewHeight=e.viewHeight,n}convertRay(e){const n=new r.AcDbRay;return n.basePoint.copy(e.firstPoint),n.unitDir.copy(e.unitDirection),n}convertXline(e){const n=new r.AcDbXline;return n.basePoint.copy(e.firstPoint),n.unitDir.copy(e.unitDirection),n}convertAttributeCommon(e,n){const s=e.text;n.textString=s.text,n.styleName=s.styleName,n.height=s.textHeight,n.position.copy(s.startPoint),n.rotation=s.rotation,n.oblique=s.obliqueAngle??0,n.thickness=s.thickness,n.horizontalMode=s.halign,n.verticalMode=s.valign,n.widthFactor=s.xScale??1,n.tag=e.tag,n.fieldLength=e.fieldLength,n.isInvisible=(e.flags&r.AcDbAttributeFlags.Invisible)!==0,n.isConst=(e.flags&r.AcDbAttributeFlags.Const)!==0,n.isVerifiable=(e.flags&r.AcDbAttributeFlags.Verifiable)!==0,n.isPreset=(e.flags&r.AcDbAttributeFlags.Preset)!==0,n.lockPositionInBlock=e.lockPositionFlag,n.isReallyLocked=e.isReallyLocked,n.isMTextAttribute=(e.mtextFlag&r.AcDbAttributeMTextFlag.MultiLine)!==0,n.isConstMTextAttribute=(e.mtextFlag&r.AcDbAttributeMTextFlag.ConstMultiLine)!==0}convertAttribute(e){const n=new r.AcDbAttribute;return this.convertAttributeCommon(e,n),n}convertAttributeDefinition(e){const n=new r.AcDbAttributeDefinition;return this.convertAttributeCommon(e,n),n.prompt=e.prompt,n}convertBlockReference(e){const n=new r.AcDbBlockReference(e.name);return e.insertionPoint&&n.position.copy(e.insertionPoint),n.scaleFactors.x=e.xScale,n.scaleFactors.y=e.yScale,n.scaleFactors.z=e.zScale,n.rotation=e.rotation,n.normal.copy(e.extrusionDirection),e.handle!=null&&(n.objectId=e.handle),e.attribs&&e.attribs.forEach(s=>{const o=this.convert(s);o instanceof r.AcDbAttribute&&n.appendAttributes(o)}),n}processDimensionCommonAttrs(e,n){n.dimBlockId=e.name,n.textPosition.copy(e.textPoint),n.textRotation=e.textRotation||0,e.textLineSpacingFactor&&(n.textLineSpacingFactor=e.textLineSpacingFactor),e.textLineSpacingStyle&&(n.textLineSpacingStyle=e.textLineSpacingStyle),n.dimensionStyleName=e.styleName,n.dimensionText=e.text||"",n.measurement=e.measurement}processCommonAttrs(e,n){if(n.layer=e.layer||"0",n.objectId=e.handle,e.ownerBlockRecordSoftId!=null&&(n.ownerId=e.ownerBlockRecordSoftId),e.lineType!=null&&(n.lineType=e.lineType),e.lineweight!=null&&(n.lineWeight=e.lineweight),e.lineTypeScale!=null&&(n.linetypeScale=e.lineTypeScale),e.color!=null&&n.color.setRGBValue(e.color),e.colorIndex!=null&&(e.color==null||e.colorIndex===7)&&(n.color.colorIndex=e.colorIndex),e.colorName&&(n.color.colorName=e.colorName),e.isVisible!=null&&(n.visibility=e.isVisible),e.transparency!=null){const s=new r.AcCmTransparency;s.method=e.transparencyType,(s.isByBlock||s.isByBlock)&&(s.alpha=e.transparency),n.transparency=s}}}const b="*MODEL_SPACE";class I extends r.AcDbDatabaseConverter{constructor(e={}){super(e),e.useWorker=!0,e.parserWorkerUrl||(e.parserWorkerUrl="/assets/libredwg-parser-worker.js")}async parse(e,n){const s=this.config,o=this.getParserWorkerTimeout(e,n);if(s.useWorker&&s.parserWorkerUrl){const t=r.createWorkerApi({workerUrl:s.parserWorkerUrl,timeout:o,maxConcurrentWorkers:1}),i=await t.execute(e);if(t.destroy(),i.success)return i.data;throw new Error(`Failed to parse drawing due to error: '${i.error}'`)}else throw new Error("dwg converter can run in web worker only!")}getFonts(e){const n=new Map;e.tables.BLOCK_RECORD.entries.forEach(i=>{n.set(i.name,i)});const s=new Map,o=i=>{if(i){const p=i.lastIndexOf(".");return p>=0?i.substring(0,p).toLowerCase():i.toLowerCase()}};e.tables.STYLE.entries.forEach(i=>{const p=[];let l=o(i.font);l&&p.push(l),l=o(i.bigFont),l&&p.push(l),s.set(i.name,p)});const t=new Set;return this.getFontsInBlock(e.entities,n,s,t),Array.from(t)}getFontsInBlock(e,n,s,o){const t=/\\f(.*?)\|/g;e.forEach(i=>{if(i.type=="MTEXT"){const p=i;[...p.text.matchAll(t)].forEach(c=>{o.add(c[1].toLowerCase())});const l=s.get(p.styleName);l==null||l.forEach(c=>o.add(c))}else if(i.type=="TEXT"){const p=i,l=s.get(p.styleName);l==null||l.forEach(c=>o.add(c))}else if(i.type=="INSERT"){const p=i,l=n.get(p.name);l&&this.getFontsInBlock(l.entities,n,s,o)}})}processLineTypes(e,n){e.tables.LTYPE.entries.forEach(o=>{const t={name:o.name,description:o.description,standardFlag:o.standardFlag,totalPatternLength:o.totalPatternLength,pattern:o.pattern},i=new r.AcDbLinetypeTableRecord(t);this.processCommonTableEntryAttrs(o,i),i.name=o.name,n.tables.linetypeTable.add(i)})}processTextStyles(e,n){e.tables.STYLE.entries.forEach(o=>{const t=new r.AcDbTextStyleTableRecord(o);this.processCommonTableEntryAttrs(o,t),n.tables.textStyleTable.add(t)})}processDimStyles(e,n){e.tables.DIMSTYLE.entries.forEach(o=>{const t={name:o.name,ownerId:o.ownerHandle,dimpost:o.DIMPOST||"",dimapost:o.DIMAPOST||"",dimscale:o.DIMSCALE,dimasz:o.DIMASZ,dimexo:o.DIMEXO,dimdli:o.DIMDLI,dimexe:o.DIMEXE,dimrnd:o.DIMRND,dimdle:o.DIMDLE,dimtp:o.DIMTP,dimtm:o.DIMTM,dimtxt:o.DIMTXT,dimcen:o.DIMCEN,dimtsz:o.DIMTSZ,dimaltf:o.DIMALTF,dimlfac:o.DIMLFAC,dimtvp:o.DIMTVP,dimtfac:o.DIMTFAC,dimgap:o.DIMGAP,dimaltrnd:o.DIMALTRND,dimtol:o.DIMTOL==null||o.DIMTOL==0?0:1,dimlim:o.DIMLIM==null||o.DIMLIM==0?0:1,dimtih:o.DIMTIH==null||o.DIMTIH==0?0:1,dimtoh:o.DIMTOH==null||o.DIMTOH==0?0:1,dimse1:o.DIMSE1==null||o.DIMSE1==0?0:1,dimse2:o.DIMSE2==null||o.DIMSE2==0?0:1,dimtad:o.DIMTAD,dimzin:o.DIMZIN,dimazin:o.DIMAZIN,dimalt:o.DIMALT,dimaltd:o.DIMALTD,dimtofl:o.DIMTOFL,dimsah:o.DIMSAH,dimtix:o.DIMTIX,dimsoxd:o.DIMSOXD,dimclrd:o.DIMCLRD,dimclre:o.DIMCLRE,dimclrt:o.DIMCLRT,dimadec:o.DIMADEC||0,dimunit:o.DIMUNIT||2,dimdec:o.DIMDEC,dimtdec:o.DIMTDEC,dimaltu:o.DIMALTU,dimalttd:o.DIMALTTD,dimaunit:o.DIMAUNIT,dimfrac:o.DIMFRAC,dimlunit:o.DIMLUNIT,dimdsep:o.DIMDSEP||".",dimtmove:o.DIMTMOVE||0,dimjust:o.DIMJUST,dimsd1:o.DIMSD1,dimsd2:o.DIMSD2,dimtolj:o.DIMTOLJ,dimtzin:o.DIMTZIN,dimaltz:o.DIMALTZ,dimalttz:o.DIMALTTZ,dimfit:o.DIMFIT||0,dimupt:o.DIMUPT,dimatfit:o.DIMATFIT,dimtxsty:r.DEFAULT_TEXT_STYLE,dimldrblk:"",dimblk:o.DIMBLK||"",dimblk1:o.DIMBLK1||"",dimblk2:o.DIMBLK2||"",dimlwd:o.DIMLWD,dimlwe:o.DIMLWE},i=new r.AcDbDimStyleTableRecord(t);this.processCommonTableEntryAttrs(o,i),n.tables.dimStyleTable.add(i)})}processLayers(e,n){e.tables.LAYER.entries.forEach(o=>{const t=new r.AcCmColor;t.colorIndex=o.colorIndex;const i=new r.AcDbLayerTableRecord({name:o.name,standardFlags:o.standardFlag,linetype:o.lineType,lineWeight:o.lineweight,isOff:o.off,color:t,isPlottable:o.plotFlag!=0});this.processCommonTableEntryAttrs(o,i),n.tables.layerTable.add(i)})}processViewports(e,n){e.tables.VPORT.entries.forEach(o=>{const t=new r.AcDbViewportTableRecord;this.processCommonTableEntryAttrs(o,t),o.circleSides&&(t.circleSides=o.circleSides),t.standardFlag=o.standardFlag,t.center.copy(o.center),t.lowerLeftCorner.copy(o.lowerLeftCorner),t.upperRightCorner.copy(o.upperRightCorner),o.snapBasePoint&&t.snapBase.copy(o.snapBasePoint),o.snapRotationAngle&&(t.snapAngle=o.snapRotationAngle),o.snapSpacing&&t.snapIncrements.copy(o.snapSpacing),o.majorGridLines&&(t.gridMajor=o.majorGridLines),o.gridSpacing&&t.gridIncrements.copy(o.gridSpacing),o.backgroundObjectId&&(t.backgroundObjectId=o.backgroundObjectId),t.gsView.center.copy(o.center),t.gsView.viewDirectionFromTarget.copy(o.viewDirectionFromTarget),t.gsView.viewTarget.copy(o.viewTarget),o.lensLength&&(t.gsView.lensLength=o.lensLength),o.frontClippingPlane&&(t.gsView.frontClippingPlane=o.frontClippingPlane),o.backClippingPlane&&(t.gsView.backClippingPlane=o.backClippingPlane),o.viewHeight&&(t.gsView.viewHeight=o.viewHeight),o.viewTwistAngle&&(t.gsView.viewTwistAngle=o.viewTwistAngle),o.frozenLayers&&(t.gsView.frozenLayers=o.frozenLayers),o.styleSheet&&(t.gsView.styleSheet=o.styleSheet),o.renderMode&&(t.gsView.renderMode=o.renderMode),o.viewMode&&(t.gsView.viewMode=o.viewMode),o.ucsIconSetting&&(t.gsView.ucsIconSetting=o.ucsIconSetting),o.ucsOrigin&&t.gsView.ucsOrigin.copy(o.ucsOrigin),o.ucsXAxis&&t.gsView.ucsXAxis.copy(o.ucsXAxis),o.ucsYAxis&&t.gsView.ucsYAxis.copy(o.ucsYAxis),o.orthographicType&&(t.gsView.orthographicType=o.orthographicType),o.shadePlotSetting&&(t.gsView.shadePlotSetting=o.shadePlotSetting),o.shadePlotObjectId&&(t.gsView.shadePlotObjectId=o.shadePlotObjectId),o.visualStyleObjectId&&(t.gsView.visualStyleObjectId=o.visualStyleObjectId),o.isDefaultLightingOn&&(t.gsView.isDefaultLightingOn=o.isDefaultLightingOn),o.defaultLightingType&&(t.gsView.defaultLightingType=o.defaultLightingType),o.brightness&&(t.gsView.brightness=o.brightness),o.contrast&&(t.gsView.contrast=o.contrast),o.ambientColor&&(t.gsView.ambientColor=o.ambientColor),n.tables.viewportTable.add(t)})}processBlockTables(e,n){e.tables.BLOCK_RECORD.entries.forEach(o=>{let t=n.tables.blockTable.getAt(o.name);t||(t=new r.AcDbBlockTableRecord,t.objectId=o.handle,t.name=o.name,t.ownerId=o.ownerHandle,t.origin.copy(o.basePoint),t.layoutId=o.layout,t.blockInsertUnits=o.insertionUnits,t.explodability=o.explodability,t.blockScaling=o.scalability,o.bmpPreview&&(t.bmpPreview=o.bmpPreview),n.tables.blockTable.add(t)),!t.isModelSapce&&o.entities&&o.entities.length>0&&this.processEntitiesInBlock(o.entities,t)})}processBlocks(e,n){}async processEntitiesInBlock(e,n){const s=new y,o=e.length,t=[];for(let i=0;i<o;i++){const p=e[i],l=s.convert(p);l&&t.push(l)}n.appendEntity(t)}async processEntities(e,n,s,o,t){const i=new y;let p=[];e.tables.BLOCK_RECORD.entries.forEach(a=>{this.isModelSpace(a.name)&&(p=a.entities)});const l=p.length,c=new r.AcDbBatchProcessing(l,100-o.value,s);this.config.convertByEntityType&&(p=this.groupAndFlattenByType(p));const f=n.tables.blockTable.modelSpace;await c.processChunk(async(a,D)=>{const u=[];for(let g=a;g<D;g++){const h=p[g],A=i.convert(h);A&&u.push(A)}if(f.appendEntity(u),t){let g=o.value+D/l*(100-o.value);g>100&&(g=100),await t(g,"ENTITY","IN-PROGRESS")}})}processHeader(e,n){const s=e.header;s.CECOLOR&&(s.CECOLOR.index>=0&&s.CECOLOR.index<=256?n.cecolor.colorIndex=s.CECOLOR.index:n.cecolor.setRGBValue(s.CECOLOR.rgb)),n.angBase=s.ANGBASE??0,n.angDir=s.ANGDIR??0,n.aunits=s.AUNITS??0,n.celtype=s.CELTYPE??r.ByLayer,n.celtscale=s.CELTSCALE??1,n.ltscale=s.LTSCALE??1,s.EXTMAX&&(n.extmax=s.EXTMAX),s.EXTMIN&&(n.extmin=s.EXTMIN),n.insunits=s.INSUNITS??1,n.pdmode=s.PDMODE??0,n.pdsize=s.PDSIZE??0,n.textstyle=s.TEXTSTYLE??r.DEFAULT_TEXT_STYLE}processCommonTableEntryAttrs(e,n){n.name=e.name,n.objectId=e.handle,e.ownerHandle!=null&&(n.ownerId=e.ownerHandle)}processObjects(e,n){this.processLayouts(e,n),this.processImageDefs(e,n)}processLayouts(e,n){const s=n.objects.layout;e.objects.LAYOUT.forEach(t=>{const i=new r.AcDbLayout;i.layoutName=t.layoutName,i.tabOrder=t.tabOrder;const p=n.tables.blockTable.newIterator();i.objectId=t.handle;for(const l of p)if(l.layoutId===i.objectId){i.blockTableRecordId=l.objectId;break}i.blockTableRecordId||t.layoutName==="Model"&&(i.blockTableRecordId=n.tables.blockTable.modelSpace.objectId),i.limits.min.copy(t.minLimit),i.limits.max.copy(t.maxLimit),i.extents.min.copy(t.minExtent),i.extents.max.copy(t.maxExtent),t.viewportId&&i.viewportArray.push(t.viewportId),this.processCommonObjectAttrs(t,i),s.setAt(i.layoutName,i)})}processImageDefs(e,n){const s=n.objects.imageDefinition;e.objects.IMAGEDEF.forEach(t=>{const i=new r.AcDbRasterImageDef;i.sourceFileName=t.fileName,this.processCommonObjectAttrs(t,i),s.setAt(i.objectId,i)})}processCommonObjectAttrs(e,n){n.objectId=e.handle,e.ownerHandle!=null&&(n.ownerId=e.ownerHandle)}groupAndFlattenByType(e){const n={},s=[];for(const o of e)n[o.type]||(n[o.type]=[],s.push(o.type)),n[o.type].push(o);return s.flatMap(o=>n[o])}isModelSpace(e){return e&&e.toUpperCase()==b}}d.AcDbLibreDwgConverter=I,Object.defineProperty(d,Symbol.toStringTag,{value:"Module"})});
1
+ (function(b,i){typeof exports=="object"&&typeof module<"u"?i(exports,require("@mlightcad/data-model")):typeof define=="function"&&define.amd?define(["exports","@mlightcad/data-model"],i):(b=typeof globalThis<"u"?globalThis:b||self,i(b["libredwg-converter"]={},b.dataModel))})(this,function(b,i){"use strict";class T{convert(e){const t=this.createEntity(e);return t&&this.processCommonAttrs(e,t),t}createEntity(e){return e.type=="3DFACE"?this.convertFace(e):e.type=="ARC"?this.convertArc(e):e.type=="ATTDEF"?this.convertAttributeDefinition(e):e.type=="ATTRIB"?this.convertAttribute(e):e.type=="CIRCLE"?this.convertCirle(e):e.type=="DIMENSION"?this.convertDimension(e):e.type=="ELLIPSE"?this.convertEllipse(e):e.type=="HATCH"?this.convertHatch(e):e.type=="IMAGE"?this.convertImage(e):e.type=="LEADER"?this.convertLeader(e):e.type=="LINE"?this.convertLine(e):e.type=="LWPOLYLINE"?this.convertLWPolyline(e):e.type=="MLINE"?this.convertMLine(e):e.type=="MTEXT"?this.convertMText(e):e.type=="MULTILEADER"||e.type=="MLEADER"?this.convertMLeader(e):e.type=="POINT"?this.convertPoint(e):e.type=="POLYLINE2D"?this.convertPolyline2d(e):e.type=="POLYLINE3D"?this.convertPolyline3d(e):e.type=="RAY"?this.convertRay(e):e.type=="SPLINE"?this.convertSpline(e):e.type=="ACAD_TABLE"?this.convertTable(e):e.type=="TEXT"?this.convertText(e):e.type=="SOLID"?this.convertSolid(e):e.type=="VIEWPORT"?this.convertViewport(e):e.type=="WIPEOUT"?this.convertWipeout(e):e.type=="XLINE"?this.convertXline(e):e.type=="INSERT"?this.convertBlockReference(e):null}convertFace(e){const t=new i.AcDbFace;return e.corner1&&t.setVertexAt(0,e.corner1),e.corner2&&t.setVertexAt(1,e.corner2),e.corner3&&t.setVertexAt(2,e.corner3),e.corner4&&t.setVertexAt(3,e.corner4),t.setEdgeInvisibilities(e.flag),t}convertArc(e){const t=e.extrusionDirection??i.AcGeVector3d.Z_AXIS;return new i.AcDbArc(i.transformOcsPointToWcs(e.center,t),e.radius,e.startAngle,e.endAngle,t)}convertCirle(e){const t=e.extrusionDirection??i.AcGeVector3d.Z_AXIS;return new i.AcDbCircle(i.transformOcsPointToWcs(e.center,t),e.radius,t)}convertEllipse(e){const t=new i.AcGeVector3d(e.majorAxisEndPoint),o=t.length();return new i.AcDbEllipse(e.center,e.extrusionDirection??i.AcGeVector3d.Z_AXIS,t,o,o*e.axisRatio,e.startAngle,e.endAngle)}convertLine(e){const t=e.startPoint,o=e.endPoint;return new i.AcDbLine(new i.AcGePoint3d(t.x,t.y,t.z),new i.AcGePoint3d(o.x,o.y,o.z))}convertSpline(e){try{if(e.numberOfControlPoints>0&&e.numberOfKnots>0)return new i.AcDbSpline(e.controlPoints,e.knots,e.weights,e.degree,!!(e.flag&1));if(e.numberOfFitPoints>0)return new i.AcDbSpline(e.fitPoints,"Uniform",e.degree,!!(e.flag&1))}catch{}return null}convertPoint(e){const t=new i.AcDbPoint;return t.position=e.position,t}convertSolid(e){const t=new i.AcDbTrace;return t.setPointAt(0,{...e.corner1,z:0}),t.setPointAt(1,{...e.corner2,z:0}),t.setPointAt(2,{...e.corner3,z:0}),t.setPointAt(3,e.corner4?{...e.corner4,z:0}:{...e.corner3,z:0}),t.thickness=e.thickness,t}convertLWPolyline(e){const t=new i.AcDbPolyline;t.closed=!!(e.flag&512);const o=e.constantWidth??-1;return e.vertices.forEach((n,r)=>{t.addVertexAt(r,new i.AcGePoint2d(n.x,n.y),n.bulge,n.startWidth??o,n.endWidth??o)}),t}convertPolyline2d(e){const t=!!(e.flag&1),o=!!(e.flag&16),n=!!(e.flag&64),r=!!(e.flag&32),s=[],a=[],c=[];if(e.vertices.map(l=>{if(!(l.flag&16))if(n&&l.flag&128)if(l.flag&64)s.push({x:l.x,y:l.y,z:l.z}),a.push(l.bulge??0);else{const p=[];l.polyfaceIndex0!=null&&l.polyfaceIndex0!=0&&p.push(Math.abs(l.polyfaceIndex0)-1),l.polyfaceIndex1!=null&&l.polyfaceIndex1!=0&&p.push(Math.abs(l.polyfaceIndex1)-1),l.polyfaceIndex2!=null&&l.polyfaceIndex2!=0&&p.push(Math.abs(l.polyfaceIndex2)-1),l.polyfaceIndex3!=null&&l.polyfaceIndex3!=0&&p.push(Math.abs(l.polyfaceIndex3)-1),p.length>=3&&c.push(p)}else s.push({x:l.x,y:l.y,z:l.z}),a.push(l.bulge??0)}),o){const l=e.meshMVertexCount??2,p=e.meshNVertexCount??2;return new i.AcDbPolygonMesh(l,p,s,t,r)}else{if(n)return new i.AcDbPolyFaceMesh(s,c);{let l=i.AcDbPoly2dType.SimplePoly;return e.flag&2?l=i.AcDbPoly2dType.FitCurvePoly:e.flag&4&&(e.smoothType==6?l=i.AcDbPoly2dType.CubicSplinePoly:e.smoothType==5&&(l=i.AcDbPoly2dType.QuadSplinePoly)),new i.AcDb2dPolyline(l,s,0,t,e.startWidth,e.endWidth,a)}}}convertPolyline3d(e){const t=!!(e.flag&1),o=[];e.vertices.map(r=>{r.flag&16||o.push({x:r.x,y:r.y,z:r.z})});let n=i.AcDbPoly3dType.SimplePoly;return e.flag&4&&(e.smoothType==6?n=i.AcDbPoly3dType.CubicSplinePoly:e.smoothType==5&&(n=i.AcDbPoly3dType.QuadSplinePoly)),new i.AcDb3dPolyline(n,o,t)}convertHatch(e){var n;const t=new i.AcDbHatch;if((n=e.definitionLines)==null||n.forEach(r=>{t.definitionLines.push({angle:r.angle,base:r.base,offset:r.offset,dashLengths:r.numberOfDashLengths>0?r.dashLengths:[]})}),t.isSolidFill=e.solidFill==1,t.hatchStyle=e.hatchStyle,t.patternName=e.patternName,t.patternType=e.patternType,t.patternAngle=e.patternAngle==null?0:e.patternAngle,t.patternScale=e.patternScale==null?0:e.patternScale,e.boundaryPaths.forEach(r=>{if(r.boundaryPathTypeFlag&2){const a=r,c=new i.AcGePolyline2d;c.closed=a.isClosed,a.vertices.forEach((l,p)=>{c.addVertexAt(p,{x:l.x,y:l.y,bulge:l.bulge})}),t.add(c)}else{const a=r,c=[];a.edges.forEach(p=>{if(p!=null){if(p.type==1){const f=p;c.push(new i.AcGeLine2d(f.start,f.end))}else if(p.type==2){const f=p;c.push(new i.AcGeCircArc2d(f.center,f.radius,f.startAngle,f.endAngle,!f.isCCW))}else if(p.type==3){const f=p;new i.AcGeVector2d().subVectors(f.end,f.center);const g=Math.sqrt(Math.pow(f.end.x,2)+Math.pow(f.end.y,2)),d=g*f.lengthOfMinorAxis;let h=f.startAngle,A=f.endAngle;const D=Math.atan2(f.end.y,f.end.x);f.isCCW||(h=Math.PI*2-h,A=Math.PI*2-A),c.push(new i.AcGeEllipseArc2d({...f.center,z:0},g,d,h,A,!f.isCCW,D))}else if(p.type==4){const f=p;if(f.numberOfControlPoints>0&&f.numberOfKnots>0){const u=f.controlPoints.map(h=>({x:h.x,y:h.y,z:0}));let g=!0;const d=f.controlPoints.map(h=>(h.weight==null&&(g=!1),h.weight||1));c.push(new i.AcGeSpline3d(u,f.knots,g?d:void 0))}else if(f.numberOfFitData>0){const u=f.fitDatum.map(g=>({x:g.x,y:g.y,z:0}));c.push(new i.AcGeSpline3d(u,"Uniform"))}}}});const l=i.AcGeLoop2d.buildFromEdges(c);l.length==0&&c.length>0?t.add(new i.AcGeLoop2d(c)):l.forEach(p=>t.add(p))}}),e.gradientFlag){const r=e;if(t.hatchObjectType=i.AcDbHatchObjectType.GradientObject,t.gradientName=r.gradientName,t.gradientAngle=r.gradientRotation??0,t.gradientShift=r.gradientDefinition??0,t.gradientOneColorMode=r.gradientColorFlag==1,t.shadeTintValue=r.colorTint??0,r.gradientColors){const s=r.gradientColors.length;s>1?(t.gradientStartColor=r.gradientColors[0].rgb,t.gradientEndColor=r.gradientColors[1].rgb):s>0&&(t.gradientStartColor=r.gradientColors[0].rgb)}}return t}convertTable(e){const t=new i.AcDbTable(e.name,e.rowCount,e.columnCount);return t.tableStyleId=e.tableStyleId,t.owningBlockRecordId=e.blockRecordHandle,e.directionVector&&(t.horizontalDirection=new i.AcGeVector3d(e.directionVector)),t.attachmentPoint=e.attachmentPoint,t.position.copy(e.startPoint),t.tableValueFlag=e.tableValue,t.tableOverrideFlag=e.overrideFlag,t.borderColorOverrideFlag=e.borderColorOverrideFlag,t.borderLineweightOverrideFlag=e.borderLineWeightOverrideFlag,t.borderVisibilityOverrideFlag=e.borderVisibilityOverrideFlag,e.columnWidthArr.forEach((o,n)=>t.setColumnWidth(n,o)),e.rowHeightArr.forEach((o,n)=>t.setRowHeight(n,o)),e.cells.forEach((o,n)=>{t.setCell(n,o)}),t}convertText(e){const t=new i.AcDbText;return t.textString=e.text,t.styleName=e.styleName,t.height=e.textHeight,t.position.copy(e.startPoint),t.rotation=e.rotation,t.oblique=e.obliqueAngle??0,t.thickness=e.thickness,t.horizontalMode=e.halign,t.verticalMode=e.valign,t.widthFactor=e.xScale??1,t}convertMText(e){const t=new i.AcDbMText;return t.contents=e.text,e.styleName!=null&&(t.styleName=e.styleName),t.height=e.textHeight,t.width=e.rectWidth,t.rotation=e.rotation||0,t.location=e.insertionPoint,t.attachmentPoint=e.attachmentPoint,e.direction&&(t.direction=new i.AcGeVector3d(e.direction)),t.drawingDirection=e.drawingDirection,t}convertLeader(e){const t=new i.AcDbLeader;return e.vertices.forEach(o=>{t.appendVertex(o)}),t.hasArrowHead=e.isArrowheadEnabled,t.hasHookLine=e.isHooklineExists,t.isSplined=e.isSpline,t.dimensionStyle=e.styleName,t.annoType=e.leaderCreationFlag,t}convertMLine(e){const t=new i.AcDbMLine;return t.styleName=e.mlineStyle||"STANDARD",t.scale=e.scale,t.flags=e.flags,t.justification=e.justification,t.startPosition=e.startPoint,t.normal=e.extrusionDirection??i.AcGeVector3d.Z_AXIS,t.styleCount=e.numberOfLines??0,t.segments=(e.vertices??[]).map(o=>({position:o.vertex,direction:o.vertexDirection,miterDirection:o.miterDirection,elements:(o.lines??[]).map(n=>({parameterCount:n.numberOfSegmentParams,parameters:n.segmentParams??[],fillCount:n.numberOfAreaFillParams,fillParameters:n.areaFillParams??[]}))})),t}convertMLeader(e){var g,d,h,A;const t=new i.AcDbMLeader,o=e;t.leaderLineType=this.readNumber(o,["multileaderType","leaderLineType","leaderType"])??i.AcDbMLeaderLineType.StraightLeader;const n=this.readNumber(o,["contentType"])??(e.textContent?i.AcDbMLeaderContentType.MTextContent:e.blockContent?i.AcDbMLeaderContentType.BlockContent:i.AcDbMLeaderContentType.NoneContent);t.contentType=n,t.doglegEnabled=this.readBoolean(o,["doglegEnabled","enableDogleg"])??!1,t.doglegLength=this.readNumber(o,["doglegLength"])??0,e.landingPoint&&(t.landingPoint=e.landingPoint),e.doglegVector&&(t.doglegVector=e.doglegVector);const r=this.readString(o,["mleaderStyleId","mLeaderStyleId","mleaderStyleHandle","styleHandle","styleName"]);r&&(t.mleaderStyleId=r);const s=this.readPoint(o,["normal","extrusionDirection"]);s&&(t.normal=s);const a=e.textContent,c=this.readString(a??{},["styleName","textStyleName"])??this.readString(o,["textStyleName","textStyle","styleName"]);c&&(t.textStyleName=c),t.textHeight=this.readNumber(a??{},["textHeight","height"])??this.readNumber(o,["textHeight","mtextHeight","textContentHeight"])??t.textHeight,t.textWidth=this.readNumber(a??{},["textWidth","width"])??this.readNumber(o,["textWidth","mtextWidth","textContentWidth"])??t.textWidth;const l=this.readNumber(a??{},["textRotation","rotation"])??this.readNumber(o,["textRotation","mtextRotation","textContentRotation"]);l!=null&&(t.textRotation=l);const p=this.readPoint(o,["textDirection","mtextDirection","textDirectionVector"]);p&&(t.textDirection=p);const f=this.readNumber(o,["textAttachmentPoint","attachmentPoint"]);f!=null&&(t.textAttachmentPoint=f);const u=this.readNumber(o,["textDrawingDirection","drawingDirection"]);if(u!=null&&(t.textDrawingDirection=u),((g=e.textContent)==null?void 0:g.text)!=null&&e.textContent.anchorPoint)t.mtextContent={text:e.textContent.text,anchorPoint:e.textContent.anchorPoint};else{const D=this.readString(o,["text","contents","mtext"]),y=this.readPoint(o,["textLocation","textPosition","textAnchorPoint"]);D!=null&&y&&(t.mtextContent={text:D,anchorPoint:y})}if((d=e.blockContent)!=null&&d.blockHandle&&e.blockContent.position)t.blockContent={blockHandle:e.blockContent.blockHandle,position:e.blockContent.position};else{const D=this.readString(o,["blockHandle","blockContentHandle","blockId"]),y=this.readPoint(o,["blockPosition","blockContentPosition"]);D&&y&&(t.blockContent={blockHandle:D,position:y})}return(h=e.leaders)==null||h.forEach(D=>{var I;const y=t.addLeader({landingPoint:D.landingPoint??e.landingPoint,doglegVector:D.doglegVector??e.doglegVector,doglegLength:D.doglegLength??e.doglegLength});(I=D.leaderLines)==null||I.forEach(P=>{var w;const S=t.addLeaderLine(y,P.vertices??[]);(w=P.breaks)==null||w.forEach(L=>{t.addBreak(y,S,L.start,L.end)})})}),t.numberOfLeaders===0&&((A=this.readLeaderLineArray(o))==null||A.forEach(D=>{const y=t.addLeader({landingPoint:e.landingPoint,doglegVector:e.doglegVector,doglegLength:e.doglegLength});t.addLeaderLine(y,D)})),t}convertDimension(e){if(e.subclassMarker=="AcDbAlignedDimension"){const t=e,o=new i.AcDbAlignedDimension(t.subDefinitionPoint1,t.subDefinitionPoint2,t.definitionPoint);return t.insertionPoint&&(o.dimBlockPosition={x:t.insertionPoint.x,y:t.insertionPoint.y,z:0}),o.rotation=t.rotationAngle,this.processDimensionCommonAttrs(e,o),o}else if(e.subclassMarker=="AcDbRotatedDimension"){const t=e,o=new i.AcDbRotatedDimension(t.subDefinitionPoint1,t.subDefinitionPoint2,t.definitionPoint);return t.insertionPoint&&(o.dimBlockPosition={x:t.insertionPoint.x,y:t.insertionPoint.y,z:0}),o.rotation=t.rotationAngle,this.processDimensionCommonAttrs(e,o),o}else if(e.subclassMarker=="AcDb3PointAngularDimension"){const t=e,o=new i.AcDb3PointAngularDimension(t.centerPoint,t.subDefinitionPoint1,t.subDefinitionPoint2,t.definitionPoint);return this.processDimensionCommonAttrs(e,o),o}else if(e.subclassMarker=="AcDbOrdinateDimension"){const t=e,o=new i.AcDbOrdinateDimension(t.subDefinitionPoint1,t.subDefinitionPoint2);return this.processDimensionCommonAttrs(e,o),o}else if(e.subclassMarker=="AcDbRadialDimension"){const t=e,o=new i.AcDbRadialDimension(t.definitionPoint,t.centerPoint,t.leaderLength);return this.processDimensionCommonAttrs(e,o),o}else if(e.subclassMarker=="AcDbDiametricDimension"){const t=e,o=new i.AcDbDiametricDimension(t.definitionPoint,t.centerPoint,t.leaderLength);return this.processDimensionCommonAttrs(e,o),o}return null}processImage(e,t){t.position.copy(e.position),t.brightness=e.brightness,t.contrast=e.contrast,t.fade=e.fade,t.imageSize.copy(e.imageSize),t.imageDefId=e.imageDefHandle,t.isClipped=e.clipping>0,t.isShownClipped=(e.flags|4)>0,t.isImageShown=(e.flags|3)>0,t.isImageTransparent=(e.flags|8)>0,e.clippingBoundaryPath.forEach(o=>{t.clipBoundary.push(new i.AcGePoint2d(o))}),t.clipBoundaryType=e.clippingBoundaryType,t.width=Math.sqrt(e.uPixel.x**2+e.uPixel.y**2+e.uPixel.z**2)*e.imageSize.x,t.height=Math.sqrt(e.vPixel.x**2+e.vPixel.y**2+e.vPixel.z**2)*e.imageSize.y,t.rotation=Math.atan2(e.uPixel.y,e.uPixel.x)}convertImage(e){const t=new i.AcDbRasterImage;return this.processImage(e,t),t}convertWipeout(e){const t=new i.AcDbWipeout;return this.processImage(e,t),t}convertViewport(e){const t=new i.AcDbViewport;return t.number=e.viewportId,t.centerPoint.copy(e.viewportCenter),t.height=e.height,t.width=e.width,t.viewCenter.copy(e.displayCenter),t.viewHeight=e.viewHeight,t}convertRay(e){const t=new i.AcDbRay;return t.basePoint.copy(e.firstPoint),t.unitDir.copy(e.unitDirection),t}convertXline(e){const t=new i.AcDbXline;return t.basePoint.copy(e.firstPoint),t.unitDir.copy(e.unitDirection),t}convertAttributeCommon(e,t){const o=e.text;t.textString=o.text,t.styleName=o.styleName,t.height=o.textHeight,t.position.copy(o.startPoint),t.rotation=o.rotation,t.oblique=o.obliqueAngle??0,t.thickness=o.thickness,t.horizontalMode=o.halign,t.verticalMode=o.valign,t.widthFactor=o.xScale??1,t.tag=e.tag,t.fieldLength=e.fieldLength,t.isInvisible=(e.flags&i.AcDbAttributeFlags.Invisible)!==0,t.isConst=(e.flags&i.AcDbAttributeFlags.Const)!==0,t.isVerifiable=(e.flags&i.AcDbAttributeFlags.Verifiable)!==0,t.isPreset=(e.flags&i.AcDbAttributeFlags.Preset)!==0,t.lockPositionInBlock=e.lockPositionFlag,t.isReallyLocked=e.isReallyLocked,t.isMTextAttribute=(e.mtextFlag&i.AcDbAttributeMTextFlag.MultiLine)!==0,t.isConstMTextAttribute=(e.mtextFlag&i.AcDbAttributeMTextFlag.ConstMultiLine)!==0}convertAttribute(e){const t=new i.AcDbAttribute;return this.convertAttributeCommon(e,t),t}convertAttributeDefinition(e){const t=new i.AcDbAttributeDefinition;return this.convertAttributeCommon(e,t),t.prompt=e.prompt,t}convertBlockReference(e){const t=new i.AcDbBlockReference(e.name);return e.insertionPoint&&t.position.copy(e.insertionPoint),t.scaleFactors.x=e.xScale,t.scaleFactors.y=e.yScale,t.scaleFactors.z=e.zScale,t.rotation=e.rotation,t.normal.copy(e.extrusionDirection),e.handle!=null&&(t.objectId=e.handle),e.attribs&&e.attribs.forEach(o=>{const n=this.convert(o);n instanceof i.AcDbAttribute&&t.appendAttributes(n)}),t}processDimensionCommonAttrs(e,t){t.dimBlockId=e.name,t.textPosition.copy(e.textPoint),t.textRotation=e.textRotation||0,e.textLineSpacingFactor&&(t.textLineSpacingFactor=e.textLineSpacingFactor),e.textLineSpacingStyle&&(t.textLineSpacingStyle=e.textLineSpacingStyle),t.dimensionStyleName=e.styleName,t.dimensionText=e.text||"",t.measurement=e.measurement}processCommonAttrs(e,t){if(t.layer=e.layer||"0",t.objectId=e.handle,e.ownerBlockRecordSoftId!=null&&(t.ownerId=e.ownerBlockRecordSoftId),e.lineType!=null&&(t.lineType=e.lineType),e.lineweight!=null&&(t.lineWeight=e.lineweight),e.lineTypeScale!=null&&(t.linetypeScale=e.lineTypeScale),e.color!=null&&t.color.setRGBValue(e.color),e.colorIndex!=null&&(e.color==null||e.colorIndex===7)&&(t.color.colorIndex=e.colorIndex),e.colorName&&(t.color.colorName=e.colorName),e.isVisible!=null&&(t.visibility=e.isVisible),e.transparency!=null){const o=new i.AcCmTransparency;o.method=e.transparencyType,(o.isByBlock||o.isByBlock)&&(o.alpha=e.transparency),t.transparency=o}}readNumber(e,t){for(const o of t){const n=e[o];if(typeof n=="number"&&Number.isFinite(n))return n}}readString(e,t){for(const o of t){const n=e[o];if(typeof n=="string")return n}}readBoolean(e,t){for(const o of t){const n=e[o];if(typeof n=="boolean")return n;if(typeof n=="number")return n!==0}}readPoint(e,t){for(const o of t){const n=e[o];if(this.isPointLike(n))return n;if(Array.isArray(n)&&typeof n[0]=="number"&&typeof n[1]=="number")return{x:n[0],y:n[1],z:n[2]??0}}}readLeaderLineArray(e){const t=e.leaderLines;if(Array.isArray(t))return t.map(n=>{if(!n||typeof n!="object")return;const r=n.vertices;return Array.isArray(r)?r.filter(s=>this.isPointLike(s)):void 0}).filter(n=>!!n&&n.length>0);const o=e.vertices;if(Array.isArray(o)){const n=o.filter(r=>this.isPointLike(r));return n.length>0?[n]:void 0}}isPointLike(e){return!!e&&typeof e=="object"&&typeof e.x=="number"&&typeof e.y=="number"}}const x="*MODEL_SPACE";class C extends i.AcDbDatabaseConverter{constructor(e={}){super(e),e.useWorker=!0,e.parserWorkerUrl||(e.parserWorkerUrl="/assets/libredwg-parser-worker.js")}async parse(e,t){const o=this.config,n=this.getParserWorkerTimeout(e,t);if(o.useWorker&&o.parserWorkerUrl){const r=i.createWorkerApi({workerUrl:o.parserWorkerUrl,timeout:n,maxConcurrentWorkers:1}),s=await r.execute(e);if(r.destroy(),s.success)return s.data;throw new Error(`Failed to parse drawing due to error: '${s.error}'`)}else throw new Error("dwg converter can run in web worker only!")}getFonts(e){const t=new Map;e.tables.BLOCK_RECORD.entries.forEach(s=>{t.set(s.name,s)});const o=new Map,n=s=>{if(s){const a=s.lastIndexOf(".");return a>=0?s.substring(0,a).toLowerCase():s.toLowerCase()}};e.tables.STYLE.entries.forEach(s=>{const a=[];let c=n(s.font);c&&a.push(c),c=n(s.bigFont),c&&a.push(c),o.set(s.name,a)});const r=new Set;return this.getFontsInBlock(e.entities,t,o,r),Array.from(r)}getFontsInBlock(e,t,o,n){const r=/\\f(.*?)\|/g;e.forEach(s=>{if(s.type=="MTEXT"){const a=s;[...a.text.matchAll(r)].forEach(l=>{n.add(l[1].toLowerCase())});const c=o.get(a.styleName);c==null||c.forEach(l=>n.add(l))}else if(s.type=="TEXT"){const a=s,c=o.get(a.styleName);c==null||c.forEach(l=>n.add(l))}else if(s.type=="MULTILEADER"||s.type=="MLEADER"){const a=s,c=a.textContent;[...(typeof(c==null?void 0:c.text)=="string"?c.text:"").matchAll(r)].forEach(u=>{n.add(u[1].toLowerCase())});const p=typeof(c==null?void 0:c.styleName)=="string"?c.styleName:typeof a.textStyleName=="string"?a.textStyleName:typeof a.styleName=="string"?a.styleName:void 0,f=p?o.get(p):void 0;f==null||f.forEach(u=>n.add(u))}else if(s.type=="INSERT"){const a=s,c=t.get(a.name);c&&this.getFontsInBlock(c.entities,t,o,n)}})}processLineTypes(e,t){e.tables.LTYPE.entries.forEach(n=>{const r={name:n.name,description:n.description,standardFlag:n.standardFlag,totalPatternLength:n.totalPatternLength,pattern:n.pattern},s=new i.AcDbLinetypeTableRecord(r);this.processCommonTableEntryAttrs(n,s),s.name=n.name,t.tables.linetypeTable.add(s)})}processTextStyles(e,t){e.tables.STYLE.entries.forEach(n=>{const r=new i.AcDbTextStyleTableRecord(n);this.processCommonTableEntryAttrs(n,r),t.tables.textStyleTable.add(r)})}processDimStyles(e,t){e.tables.DIMSTYLE.entries.forEach(n=>{const r={name:n.name,ownerId:n.ownerHandle,dimpost:n.DIMPOST||"",dimapost:n.DIMAPOST||"",dimscale:n.DIMSCALE,dimasz:n.DIMASZ,dimexo:n.DIMEXO,dimdli:n.DIMDLI,dimexe:n.DIMEXE,dimrnd:n.DIMRND,dimdle:n.DIMDLE,dimtp:n.DIMTP,dimtm:n.DIMTM,dimtxt:n.DIMTXT,dimcen:n.DIMCEN,dimtsz:n.DIMTSZ,dimaltf:n.DIMALTF,dimlfac:n.DIMLFAC,dimtvp:n.DIMTVP,dimtfac:n.DIMTFAC,dimgap:n.DIMGAP,dimaltrnd:n.DIMALTRND,dimtol:n.DIMTOL==null||n.DIMTOL==0?0:1,dimlim:n.DIMLIM==null||n.DIMLIM==0?0:1,dimtih:n.DIMTIH==null||n.DIMTIH==0?0:1,dimtoh:n.DIMTOH==null||n.DIMTOH==0?0:1,dimse1:n.DIMSE1==null||n.DIMSE1==0?0:1,dimse2:n.DIMSE2==null||n.DIMSE2==0?0:1,dimtad:n.DIMTAD,dimzin:n.DIMZIN,dimazin:n.DIMAZIN,dimalt:n.DIMALT,dimaltd:n.DIMALTD,dimtofl:n.DIMTOFL,dimsah:n.DIMSAH,dimtix:n.DIMTIX,dimsoxd:n.DIMSOXD,dimclrd:n.DIMCLRD,dimclre:n.DIMCLRE,dimclrt:n.DIMCLRT,dimadec:n.DIMADEC||0,dimunit:n.DIMUNIT||2,dimdec:n.DIMDEC,dimtdec:n.DIMTDEC,dimaltu:n.DIMALTU,dimalttd:n.DIMALTTD,dimaunit:n.DIMAUNIT,dimfrac:n.DIMFRAC,dimlunit:n.DIMLUNIT,dimdsep:n.DIMDSEP||".",dimtmove:n.DIMTMOVE||0,dimjust:n.DIMJUST,dimsd1:n.DIMSD1,dimsd2:n.DIMSD2,dimtolj:n.DIMTOLJ,dimtzin:n.DIMTZIN,dimaltz:n.DIMALTZ,dimalttz:n.DIMALTTZ,dimfit:n.DIMFIT||0,dimupt:n.DIMUPT,dimatfit:n.DIMATFIT,dimtxsty:i.DEFAULT_TEXT_STYLE,dimldrblk:"",dimblk:n.DIMBLK||"",dimblk1:n.DIMBLK1||"",dimblk2:n.DIMBLK2||"",dimlwd:n.DIMLWD,dimlwe:n.DIMLWE},s=new i.AcDbDimStyleTableRecord(r);this.processCommonTableEntryAttrs(n,s),t.tables.dimStyleTable.add(s)})}processLayers(e,t){e.tables.LAYER.entries.forEach(n=>{const r=new i.AcCmColor;r.colorIndex=n.colorIndex;const s=new i.AcDbLayerTableRecord({name:n.name,standardFlags:n.standardFlag,linetype:n.lineType,lineWeight:n.lineweight,isOff:n.off,color:r,isPlottable:n.plotFlag!=0});this.processCommonTableEntryAttrs(n,s),t.tables.layerTable.add(s)})}processViewports(e,t){e.tables.VPORT.entries.forEach(n=>{const r=new i.AcDbViewportTableRecord;this.processCommonTableEntryAttrs(n,r),n.circleSides&&(r.circleSides=n.circleSides),r.standardFlag=n.standardFlag,r.center.copy(n.center),r.lowerLeftCorner.copy(n.lowerLeftCorner),r.upperRightCorner.copy(n.upperRightCorner),n.snapBasePoint&&r.snapBase.copy(n.snapBasePoint),n.snapRotationAngle&&(r.snapAngle=n.snapRotationAngle),n.snapSpacing&&r.snapIncrements.copy(n.snapSpacing),n.majorGridLines&&(r.gridMajor=n.majorGridLines),n.gridSpacing&&r.gridIncrements.copy(n.gridSpacing),n.backgroundObjectId&&(r.backgroundObjectId=n.backgroundObjectId),r.gsView.center.copy(n.center),r.gsView.viewDirectionFromTarget.copy(n.viewDirectionFromTarget),r.gsView.viewTarget.copy(n.viewTarget),n.lensLength&&(r.gsView.lensLength=n.lensLength),n.frontClippingPlane&&(r.gsView.frontClippingPlane=n.frontClippingPlane),n.backClippingPlane&&(r.gsView.backClippingPlane=n.backClippingPlane),n.viewHeight&&(r.gsView.viewHeight=n.viewHeight),n.viewTwistAngle&&(r.gsView.viewTwistAngle=n.viewTwistAngle),n.frozenLayers&&(r.gsView.frozenLayers=n.frozenLayers),n.styleSheet&&(r.gsView.styleSheet=n.styleSheet),n.renderMode&&(r.gsView.renderMode=n.renderMode),n.viewMode&&(r.gsView.viewMode=n.viewMode),n.ucsIconSetting&&(r.gsView.ucsIconSetting=n.ucsIconSetting),n.ucsOrigin&&r.gsView.ucsOrigin.copy(n.ucsOrigin),n.ucsXAxis&&r.gsView.ucsXAxis.copy(n.ucsXAxis),n.ucsYAxis&&r.gsView.ucsYAxis.copy(n.ucsYAxis),n.orthographicType&&(r.gsView.orthographicType=n.orthographicType),n.shadePlotSetting&&(r.gsView.shadePlotSetting=n.shadePlotSetting),n.shadePlotObjectId&&(r.gsView.shadePlotObjectId=n.shadePlotObjectId),n.visualStyleObjectId&&(r.gsView.visualStyleObjectId=n.visualStyleObjectId),n.isDefaultLightingOn&&(r.gsView.isDefaultLightingOn=n.isDefaultLightingOn),n.defaultLightingType&&(r.gsView.defaultLightingType=n.defaultLightingType),n.brightness&&(r.gsView.brightness=n.brightness),n.contrast&&(r.gsView.contrast=n.contrast),n.ambientColor&&(r.gsView.ambientColor=n.ambientColor),t.tables.viewportTable.add(r)})}processBlockTables(e,t){e.tables.BLOCK_RECORD.entries.forEach(n=>{let r=t.tables.blockTable.getAt(n.name);r||(r=new i.AcDbBlockTableRecord,r.objectId=n.handle,r.name=n.name,r.ownerId=n.ownerHandle,r.origin.copy(n.basePoint),r.layoutId=n.layout,r.blockInsertUnits=n.insertionUnits,r.explodability=n.explodability,r.blockScaling=n.scalability,n.bmpPreview&&(r.bmpPreview=n.bmpPreview),t.tables.blockTable.add(r)),!r.isModelSapce&&n.entities&&n.entities.length>0&&this.processEntitiesInBlock(n.entities,r)})}processBlocks(e,t){}async processEntitiesInBlock(e,t){const o=new T,n=e.length,r=[];for(let s=0;s<n;s++){const a=e[s],c=o.convert(a);c&&r.push(c)}t.appendEntity(r)}async processEntities(e,t,o,n,r){const s=new T;let a=[];e.tables.BLOCK_RECORD.entries.forEach(f=>{this.isModelSpace(f.name)&&(a=f.entities)});const c=a.length,l=new i.AcDbBatchProcessing(c,100-n.value,o);this.config.convertByEntityType&&(a=this.groupAndFlattenByType(a));const p=t.tables.blockTable.modelSpace;await l.processChunk(async(f,u)=>{const g=[];for(let d=f;d<u;d++){const h=a[d],A=s.convert(h);A&&g.push(A)}if(p.appendEntity(g),r){let d=n.value+u/c*(100-n.value);d>100&&(d=100),await r(d,"ENTITY","IN-PROGRESS")}})}processHeader(e,t){const o=e.header;o.CECOLOR&&(o.CECOLOR.index>=0&&o.CECOLOR.index<=256?t.cecolor.colorIndex=o.CECOLOR.index:t.cecolor.setRGBValue(o.CECOLOR.rgb)),t.angBase=o.ANGBASE??0,t.angDir=o.ANGDIR??0,t.aunits=o.AUNITS??0,t.celtype=o.CELTYPE??i.ByLayer,t.celtscale=o.CELTSCALE??1,t.ltscale=o.LTSCALE??1,o.EXTMAX&&(t.extmax=o.EXTMAX),o.EXTMIN&&(t.extmin=o.EXTMIN),t.insunits=o.INSUNITS??1,t.pdmode=o.PDMODE??0,t.pdsize=o.PDSIZE??0,t.textstyle=o.TEXTSTYLE??i.DEFAULT_TEXT_STYLE}processCommonTableEntryAttrs(e,t){t.name=e.name,t.objectId=e.handle,e.ownerHandle!=null&&(t.ownerId=e.ownerHandle)}processObjects(e,t){this.processLayouts(e,t),this.processImageDefs(e,t)}processLayouts(e,t){const o=t.objects.layout;e.objects.LAYOUT.forEach(r=>{const s=new i.AcDbLayout;s.layoutName=r.layoutName,s.tabOrder=r.tabOrder;const a=t.tables.blockTable.newIterator();s.objectId=r.handle;for(const c of a)if(c.layoutId===s.objectId){s.blockTableRecordId=c.objectId;break}s.blockTableRecordId||r.layoutName==="Model"&&(s.blockTableRecordId=t.tables.blockTable.modelSpace.objectId),s.limits.min.copy(r.minLimit),s.limits.max.copy(r.maxLimit),s.extents.min.copy(r.minExtent),s.extents.max.copy(r.maxExtent),r.viewportId&&s.viewportArray.push(r.viewportId),this.processCommonObjectAttrs(r,s),o.setAt(s.layoutName,s)})}processImageDefs(e,t){const o=t.objects.imageDefinition;e.objects.IMAGEDEF.forEach(r=>{const s=new i.AcDbRasterImageDef;s.sourceFileName=r.fileName,this.processCommonObjectAttrs(r,s),o.setAt(s.objectId,s)})}processCommonObjectAttrs(e,t){t.objectId=e.handle,e.ownerHandle!=null&&(t.ownerId=e.ownerHandle)}groupAndFlattenByType(e){const t={},o=[];for(const n of e)t[n.type]||(t[n.type]=[],o.push(n.type)),t[n.type].push(n);return o.flatMap(n=>t[n])}isModelSpace(e){return e&&e.toUpperCase()==x}}b.AcDbLibreDwgConverter=C,Object.defineProperty(b,Symbol.toStringTag,{value:"Module"})});