我使用java的kabeja组件编写代码,将 dxf文件内 dxfLine框内的内容写到jpg文件里,其他 dxfText, dxfMText, dxfLine等都处理正常,只是发现部分 dxfInsert和子类无法在正常的位置显示
以下是DXF文件内容

以下是程序生成的图片

以下是部分代码:
public static List<DXFEntity> getEntities(String fileName) {
List<DXFEntity> list = new ArrayList<>();
try {
Parser parser = ParserBuilder.createDefaultParser();
parser.parse(new FileInputStream(fileName), "utf-8");
DXFDocument doc = parser.getDocument();
Iterator<DXFLayer> layers = doc.getDXFLayerIterator();
while (layers.hasNext()) {
DXFLayer layer = layers.next();
Iterator<String> types = layer.getDXFEntityTypeIterator();
while (types.hasNext()) {
String type = types.next();
List<DXFEntity> entities = layer.getDXFEntities(type);
list.addAll(entities);
for (DXFEntity entity: entities) {
if (entity.getColor() == 256) {
entity.setColor(layer.getColor());
}
if (entity.getColor() == 0) {
entity.setColor(layer.getColor());
}
if (!layer.isVisible()) entity.setVisibile(false);
if ("ByLayer".equals(entity.getLineType())) {
entity.setLineType(layer.getLineType());
}
if (entity.getClass() == DXFInsert.class) {
DXFInsert insert = (DXFInsert) entity;
processInsert(insert, doc, list);
}
}
}
}
} catch (Exception e) {
}
return list;
}
```java
private static void processInsert(DXFInsert insert, DXFDocument doc, List<DXFEntity> list) {
DXFBlock block = doc.getDXFBlock(insert.getBlockID());
if (block != null) {
Iterator<DXFEntity> entities = block.getDXFEntitiesIterator();
while (entities.hasNext()) {
DXFEntity entity = entities.next();
// 如果是嵌套块,递归处理
if (entity instanceof DXFInsert) {
processInsert((DXFInsert)entity, doc, list);
}
// 计算实体的实际位置
if (entity instanceof DXFText) {
DXFText text = (DXFText) entity;
Point position = convertEntityPosition(insert, text.getInsertPoint());
text.setX(position.getX());
text.setY(position.getY());
text.setZ(position.getZ());
}
if (entity instanceof DXFMText) {
DXFMText text = (DXFMText) entity;
Point position = convertEntityPosition(insert, text.getInsertPoint());
text.setX(position.getX());
text.setY(position.getY());
text.setZ(position.getZ());
}
if (entity instanceof DXFLWPolyline) {
DXFLWPolyline line = (DXFLWPolyline) entity;
Iterator<DXFVertex> vertexs = line.getVertexIterator();
while (vertexs.hasNext()) {
DXFVertex vertex = vertexs.next();
Point position = convertEntityPosition(insert, vertex.getPoint());
vertex.setX(position.getX());
vertex.setY(position.getY());
vertex.setZ(position.getZ());
}
}
if (entity instanceof DXFLine) {
DXFLine line = (DXFLine) entity;
Point position = convertEntityPosition(insert, line.getStartPoint());
line.setStartPoint(position);
position = convertEntityPosition(insert, line.getEndPoint());
line.setEndPoint(position);
}
if (entity instanceof DXFLeader) {
}
if (entity instanceof DXFPoint) {
}
if (entity instanceof DXFHatch) {
}
if (entity instanceof DXFEllipse) {
}
list.add(entity);
}
}
}
//此处为豆包和元宝给的解决方法
public static Point convertEntityPosition(DXFInsert insert, Point entityPoint) {
// 获取插入点
Point insertPoint = insert.getPoint();
// 获取缩放比例(默认为1.0)
double scaleX = insert.getScaleX();
double scaleY = insert.getScaleY();
double scaleZ = insert.getScaleZ();
// 获取旋转角度(弧度)
double rotation = Math.toRadians(insert.getRotate());
// 获取实体在块中的原始位置
//Point entityPoint = getEntityReferencePoint(entity);
// 应用缩放
double scaledX = entityPoint.getX() * scaleX;
double scaledY = entityPoint.getY() * scaleY;
double scaledZ = entityPoint.getZ() * scaleZ;
// 应用旋转
double rotatedX = scaledX * Math.cos(rotation) - scaledY * Math.sin(rotation);
double rotatedY = scaledX * Math.sin(rotation) + scaledY * Math.cos(rotation);
double rotatedZ = scaledZ;
// 应用平移(插入点)
double finalX = insertPoint.getX() + rotatedX;
double finalY = insertPoint.getY() + rotatedY;
double finalZ = insertPoint.getZ() + rotatedZ;
return new Point(finalX, finalY, finalZ);
}
以下遍历list,将dxftext, dxfline等写入图片
```