@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
352 lines • 17.2 kB
JavaScript
import { AcCmTransparency, AcDbArc, AcDbBlockReference, AcDbCircle, AcDbEllipse, AcDbHatch, AcDbLine, AcDbMText, AcDbPoint, AcDbPolyline, AcDbRay, AcDbSpline, AcDbText, AcDbXline, AcGeCircArc2d, AcGeEllipseArc2d, AcGeLine2d, AcGeLoop2d, AcGePoint2d, AcGePoint3d, AcGePolyline2d, AcGeSpline3d, AcGeVector2d, AcGeVector3d, transformOcsPointToWcs } 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 _a;
var normal = (_a = arc.extPoint) !== null && _a !== void 0 ? _a : AcGeVector3d.Z_AXIS;
var dbEntity = new AcDbArc(transformOcsPointToWcs(arc.center(), normal), arc.radius, arc.startAngle, arc.endAngle, normal);
return dbEntity;
};
AcDbEntityConverter.prototype.convertCirle = function (circle) {
var _a;
var normal = (_a = circle.extPoint) !== null && _a !== void 0 ? _a : AcGeVector3d.Z_AXIS;
var dbEntity = new AcDbCircle(transformOcsPointToWcs(circle.basePoint, normal), circle.radius, normal);
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,
base: definitionLine.base,
offset: definitionLine.offset,
dashLengths: this.toNumberArray(definitionLine.dashPattern) // TODO: rename dashPattern to dashLengths
});
}
}
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) {
var _a, _b, _c;
// 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 defaultWidth = (_a = polyline.width) !== null && _a !== void 0 ? _a : -1;
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, (_b = vertex.startWidth) !== null && _b !== void 0 ? _b : defaultWidth, (_c = vertex.endWidth) !== null && _c !== void 0 ? _c : defaultWidth);
}
}
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();
if (entity.parentHandle != null) {
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.setRGBValue(entity.color24);
}
if (entity.color != null) {
dbEntity.color.colorIndex = entity.color;
}
if (entity.colorName) {
dbEntity.color.colorName = entity.colorName;
}
if (entity.visible != null) {
dbEntity.visibility = entity.visible;
}
if (entity.transparency != null) {
dbEntity.transparency = AcCmTransparency.deserialize(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