UNPKG

@mlightcad/libdxfrw-converter

Version:

The `libdxfrw-converter` package provides a DWG file converter for the RealDWG-Web ecosystem, enabling reading and conversion of DWG files into the AutoCAD-like drawing database structure. It is based on the [libdxfrw](https://github.com/LibreDWG/libdxfrw

344 lines 16.5 kB
import { AcDbArc, AcDbBlockReference, AcDbCircle, AcDbEllipse, AcDbHatch, AcDbLine, AcDbMText, AcDbPoint, AcDbPolyline, AcDbRay, AcDbSpline, AcDbText, AcDbXline, AcGeCircArc2d, AcGeEllipseArc2d, AcGeLine2d, AcGeLoop2d, AcGePoint2d, AcGePoint3d, AcGePolyline2d, AcGeSpline3d, AcGeVector2d, AcGeVector3d } from '@mlightcad/data-model'; var AcDbEntityConverter = /** @class */ (function () { function AcDbEntityConverter() { } AcDbEntityConverter.prototype.convert = function (entity) { var dbEntity = this.createEntity(entity); if (dbEntity) { this.processCommonAttrs(entity, dbEntity); } return dbEntity; }; AcDbEntityConverter.prototype.createEntity = function (entity) { // @ts-expect-error libdxfrw is set in index.html var libdxfrw = window.libdxfrw; if (entity.eType == libdxfrw.DRW_ETYPE.ARC) { return this.convertArc(entity); } else if (entity.eType == libdxfrw.DRW_ETYPE.CIRCLE) { return this.convertCirle(entity); } else if (entity.eType == libdxfrw.DRW_ETYPE.DIMENSION) { // return this.convertDimension(entity as DimensionEntityCommon) } else if (entity.eType == libdxfrw.DRW_ETYPE.ELLIPSE) { return this.convertEllipse(entity); } else if (entity.eType == libdxfrw.DRW_ETYPE.HATCH) { return this.convertHatch(entity); } else if (entity.eType == libdxfrw.DRW_ETYPE.IMAGE) { // return this.convertImage(entity as ImageEntity) } else if (entity.eType == libdxfrw.DRW_ETYPE.LEADER) { // return this.convertLeader(entity as LeaderEntity) } else if (entity.eType == libdxfrw.DRW_ETYPE.LINE) { return this.convertLine(entity); } else if (entity.eType == libdxfrw.DRW_ETYPE.MTEXT) { return this.convertMText(entity); } else if (entity.eType == libdxfrw.DRW_ETYPE.POLYLINE) { // return this.convertPolyline(entity as DRW_Polyline) } else if (entity.eType == libdxfrw.DRW_ETYPE.LWPOLYLINE) { return this.convertPolyline(entity); } else if (entity.eType == libdxfrw.DRW_ETYPE.POINT) { return this.convertPoint(entity); } else if (entity.eType == libdxfrw.DRW_ETYPE.RAY) { return this.convertRay(entity); } else if (entity.eType == libdxfrw.DRW_ETYPE.SPLINE) { return this.convertSpline(entity); } else if (entity.eType == libdxfrw.DRW_ETYPE.TEXT) { return this.convertText(entity); } else if (entity.eType == libdxfrw.DRW_ETYPE.SOLID) { // return this.convertSolid(entity as SolidEntity) } else if (entity.eType == libdxfrw.DRW_ETYPE.VIEWPORT) { // return this.convertViewport(entity as ViewportEntity) } else if (entity.eType == libdxfrw.DRW_ETYPE.XLINE) { return this.convertXline(entity); } else if (entity.eType == libdxfrw.DRW_ETYPE.INSERT) { return this.convertBlockReference(entity); } return null; }; AcDbEntityConverter.prototype.convertArc = function (arc) { var dbEntity = new AcDbArc(arc.center(), arc.radius, arc.startAngle, arc.endAngle); return dbEntity; }; AcDbEntityConverter.prototype.convertCirle = function (circle) { var dbEntity = new AcDbCircle(circle.basePoint, circle.radius); return dbEntity; }; AcDbEntityConverter.prototype.convertEllipse = function (ellipse) { var majorAxis = new AcGeVector3d(ellipse.secPoint); var majorAxisRadius = majorAxis.length(); var dbEntity = new AcDbEllipse(ellipse.basePoint, AcGeVector3d.Z_AXIS, majorAxis, majorAxisRadius, majorAxisRadius * ellipse.ratio, ellipse.startAngle, ellipse.endAngle); return dbEntity; }; AcDbEntityConverter.prototype.convertBlockReference = function (blockReference) { var dbBlockReference = new AcDbBlockReference(blockReference.name); if (blockReference.basePoint) dbBlockReference.position.copy(blockReference.basePoint); dbBlockReference.scaleFactors.x = blockReference.xScale || 1; dbBlockReference.scaleFactors.y = blockReference.yScale || 1; dbBlockReference.scaleFactors.z = blockReference.zScale || 1; dbBlockReference.rotation = blockReference.angle; dbBlockReference.normal.copy(blockReference.extPoint); return dbBlockReference; }; AcDbEntityConverter.prototype.convertHatch = function (hatch) { var dbEntity = new AcDbHatch(); var definitionLines = hatch.definitionLines; for (var index = 0, size = definitionLines.size(); index < size; ++index) { var definitionLine = definitionLines.get(index); if (definitionLine != null) { dbEntity.definitionLines.push({ angle: definitionLine.angle, origin: definitionLine.base, delta: definitionLine.offset, dashPattern: this.toNumberArray(definitionLine.dashPattern) }); } } dbEntity.hatchStyle = hatch.hatchStyle; dbEntity.patternName = hatch.name; dbEntity.patternType = hatch.patternType; dbEntity.patternAngle = hatch.angle; dbEntity.patternScale = hatch.scale; var loops = hatch.getLoopList(); for (var index = 0, size = loops.size(); index < size; ++index) { var loop = loops.get(index); if (loop != null) { // Check whether it is a polyline if (loop.type == 2) { var polylineLoop = loop.getObjList().get(0); if (polylineLoop) { var polyline = new AcGePolyline2d(); // polyline.closed = ?? var vertices = polylineLoop.getVertexList(); for (var index_1 = 0, size_1 = vertices.size(); index_1 < size_1; ++index_1) { var vertex = vertices.get(index_1); if (vertex != null) { polyline.addVertexAt(index_1, { x: vertex.x, y: vertex.y, bulge: vertex.bulge }); } } dbEntity.add(polyline); } } else { // @ts-expect-error libdxfrw is set in index.html var libdxfrw = window.libdxfrw; var objects = loop.getObjList(); var loopGeometry = new AcGeLoop2d(); for (var index_2 = 0, size_2 = objects.size(); index_2 < size_2; ++index_2) { var object = objects.get(index_2); if (object != null) { if (object.eType == libdxfrw.DRW_ETYPE.LINE) { var line = object; loopGeometry.add(new AcGeLine2d(line.basePoint, line.secPoint)); } else if (object.eType == libdxfrw.DRW_ETYPE.ARC) { var arc = object; loopGeometry.add(new AcGeCircArc2d(arc.center(), arc.radius, arc.startAngle, arc.endAngle, !arc.isccw)); } else if (object.eType == libdxfrw.DRW_ETYPE.ELLIPSE) { var ellipse = object; var center = ellipse.basePoint; var secPoint = ellipse.secPoint; var majorAxis = new AcGeVector2d(secPoint); var majorAxisRadius = majorAxis.length(); var minorAxisRadius = majorAxisRadius * ellipse.ratio; var startAngle = ellipse.startAngle; var endAngle = ellipse.endAngle; var rotation = Math.atan2(secPoint.y, secPoint.x); if (!ellipse.isCounterClockwise) { // when clockwise, need to handle start/end angles startAngle = Math.PI * 2 - startAngle; endAngle = Math.PI * 2 - endAngle; } loopGeometry.add(new AcGeEllipseArc2d({ x: center.x, y: center.y, z: 0 }, majorAxisRadius, minorAxisRadius, startAngle, endAngle, !ellipse.isCounterClockwise, rotation)); } else if (object.eType == libdxfrw.DRW_ETYPE.SPLINE) { var spline = object; if (spline.numberOfControls > 0 && spline.numberOfKnots > 0) { var controlPoints = this.toPointArray(spline.getControlList(), true); var weights = this.toNumberArray(spline.weights); var knots = this.toNumberArray(spline.knots); loopGeometry.add(new AcGeSpline3d(controlPoints, knots, weights.length > 0 ? weights : undefined)); } else if (spline.numberOfFits > 0) { var fitPoints = this.toPointArray(spline.getFitList()); loopGeometry.add(new AcGeSpline3d(fitPoints, 'Uniform')); } } } } dbEntity.add(loopGeometry); } } } return dbEntity; }; AcDbEntityConverter.prototype.convertLine = function (line) { var start = line.basePoint; var end = line.secPoint; var dbEntity = new AcDbLine(new AcGePoint3d(start.x, start.y, start.z || 0), new AcGePoint3d(end.x, end.y, end.z || 0)); return dbEntity; }; AcDbEntityConverter.prototype.convertMText = function (mtext) { var dbEntity = new AcDbMText(); dbEntity.contents = mtext.text; if (mtext.style != null) { dbEntity.styleName = mtext.style; } dbEntity.height = mtext.height; // dbEntity.width = mtext. dbEntity.lineSpacingFactor = mtext.interlin; dbEntity.rotation = mtext.angle || 0; dbEntity.location = mtext.basePoint; // dbEntity.attachmentPoint = // mtext.attachmentPoint as unknown as AcGiMTextAttachmentPoint // if (mtext.direction) { // dbEntity.direction = new AcGeVector3d(mtext.direction) // } // dbEntity.drawingDirection = // mtext.drawingDirection as unknown as AcGiMTextFlowDirection return dbEntity; }; AcDbEntityConverter.prototype.convertPoint = function (point) { var dbEntity = new AcDbPoint(); dbEntity.position = point.basePoint; return dbEntity; }; AcDbEntityConverter.prototype.convertPolyline = function (polyline) { // Polyline flag (bit-coded; default = 0): // https://help.autodesk.com/view/OARX/2023/ENU/?guid=GUID-ABF6B778-BE20-4B49-9B58-A94E64CEFFF3 // // 1 = This is a closed polyline (or a polygon mesh closed in the M direction) // 2 = Curve-fit vertices have been added // 4 = Spline-fit vertices have been added // 8 = This is a 3D polyline // 16 = This is a 3D polygon mesh // 32 = The polygon mesh is closed in the N direction // 64 = The polyline is a polyface mesh // 128 = The linetype pattern is generated continuously around the vertices of this polyline var dbEntity = new AcDbPolyline(); dbEntity.closed = !!(polyline.flags & 0x01); var vertices = polyline.getVertexList(); for (var index = 0, size = vertices.size(); index < size; ++index) { var vertex = vertices.get(index); if (vertex != null) { dbEntity.addVertexAt(index, new AcGePoint2d(vertex.x, vertex.y), vertex.bulge, vertex.startWidth, vertex.endWidth); } } return dbEntity; }; AcDbEntityConverter.prototype.convertRay = function (ray) { var dbRay = new AcDbRay(); dbRay.basePoint.copy(ray.basePoint); dbRay.unitDir.copy(ray.secPoint); return dbRay; }; AcDbEntityConverter.prototype.convertSpline = function (spline) { var weights = this.toNumberArray(spline.weights); if (spline.numberOfControls > 0 && spline.numberOfKnots > 0) { return new AcDbSpline(this.toPointArray(spline.getControlList(), false), this.toNumberArray(spline.knots), weights.length > 0 ? weights : undefined, spline.degree, // Default degree !!(spline.flags & 0x01)); } else if (spline.numberOfFits > 0) { var fitPoints = this.toPointArray(spline.getFitList()); if (fitPoints.length > 0) { return new AcDbSpline(fitPoints, 'Uniform', spline.degree, !!(spline.flags & 0x01)); } } return null; }; AcDbEntityConverter.prototype.convertText = function (text) { var _a, _b; var dbEntity = new AcDbText(); dbEntity.textString = text.text; dbEntity.styleName = text.style; dbEntity.height = text.height; dbEntity.position.copy(text.basePoint); dbEntity.rotation = text.angle || 0; dbEntity.oblique = (_a = text.oblique) !== null && _a !== void 0 ? _a : 0; // dbEntity.thickness = ?? dbEntity.horizontalMode = text.alignH; dbEntity.verticalMode = text.alignV; dbEntity.widthFactor = (_b = text.widthScale) !== null && _b !== void 0 ? _b : 1; return dbEntity; }; AcDbEntityConverter.prototype.convertXline = function (xline) { var dbXline = new AcDbXline(); dbXline.basePoint.copy(xline.basePoint); dbXline.unitDir.copy(xline.secPoint); return dbXline; }; AcDbEntityConverter.prototype.processCommonAttrs = function (entity, dbEntity) { dbEntity.layer = entity.layer; dbEntity.objectId = entity.handle.toString(); dbEntity.ownerId = entity.parentHandle.toString(); if (entity.lineType != null) { dbEntity.lineType = entity.lineType; } if (entity.lWeight != null) { dbEntity.lineWeight = entity.lWeight; } if (entity.ltypeScale != null) { dbEntity.linetypeScale = entity.ltypeScale; } if (entity.color24 != null) { dbEntity.color.color = entity.color24; } if (entity.color != null) { dbEntity.color.colorIndex = entity.color; } if (entity.colorName != null) { dbEntity.color.colorName = entity.colorName; } if (entity.visible != null) { dbEntity.visibility = entity.visible; } if (entity.transparency != null) { dbEntity.transparency = entity.transparency; } }; AcDbEntityConverter.prototype.toNumberArray = function (doubleList) { var results = []; for (var index = 0, size = doubleList.size(); index < size; ++index) { var item = doubleList.get(index); if (item != null) { results.push(item); } } return results; }; AcDbEntityConverter.prototype.toPointArray = function (pointList, resetZValue) { if (resetZValue === void 0) { resetZValue = true; } var results = []; for (var index = 0, size = pointList.size(); index < size; ++index) { var item = pointList.get(index); if (item != null) { results.push({ x: item.x, y: item.y, z: resetZValue ? 0 : item.z }); } } return results; }; return AcDbEntityConverter; }()); export { AcDbEntityConverter }; //# sourceMappingURL=AcDbEntitiyConverter.js.map