我希望修改dwg内容后,再重新保存,但是重新保存后,新的dwg无法打开,代码如下

public static void main(String[] args) {
// 输入 CAD 文件路径
String inputFilePath = “C:\Users\木木\Downloads\电度表 (1).dwg”;
// 输出 CAD 文件路径
String outputFilePath = “C:\Users\木木\Downloads\电度表444.dwg”;

    try {

        // 加载 CAD 文件
        CadImage cadImage = (CadImage) CadImage.load(inputFilePath);
        // 获取所有的块(Block)
        CadBlockDictionary blockEntities = cadImage.getBlockEntities();

        // 遍历每个块记录
        for (String blockName : blockEntities.getKeys()) {
            // 获取对应的 CadBlockEntity
            CadBlockEntity blockEntity = blockEntities.get_Item(blockName);
            // 获取块内的所有实体
            for (Object entity : blockEntity.getEntities()) {
                if (entity instanceof CadText cadText) {
                    cadText.setDefaultValue("111");
                }
            }
        }
        
        DwgOptions dwgOptions =new DwgOptions();
        cadImage.save(outputFilePath,dwgOptions);
        System.out.println(outputFilePath);
    } catch (Exception e) {
        System.err.println("CAD发生错误:");
        e.printStackTrace();
    }
}

dwg.zip (142.6 KB)

转换前和转换后的dwg文件

假如不传dwgOptions会出现如下报错

image.png (100.9 KB)

@lumu,
您好。
我们已创建 CADJAVA-11848 来调查并修复此问题。

我们已创建 CADJAVA-11848 来调查并修复此问题。
解决了吗

@lumu,
我们发现与此任务相关的其他问题,我们正在努力解决这些问题。我们希望在 25.02 版本中完成它,但由于免费论坛支持政策,无法保证交付时间。任务的状态可在此页面底部的线程中查看。

这个问题在最新的25.10版本解决了吗,我也有这错误,保存了之后打不开了
package com.mica;

import com.aspose.cad.Image;
import com.aspose.cad.License;
import com.aspose.cad.fileformats.cad.CadImage;
import com.aspose.cad.fileformats.cad.cadobjects.CadEntityBase;
import com.aspose.cad.fileformats.cad.cadobjects.CadText;
import com.aspose.cad.imageoptions.CadRasterizationOptions;
import com.aspose.cad.imageoptions.DwgOptions;
import com.aspose.cad.imageoptions.PdfOptions;

public class ModifySpecificText {
public static void main(String[] args) throws Exception{
// 1. 定义输入和输出文件

	 License license = new  License();
	license.setLicense(new java.io.FileInputStream(C.CFG_PATH + "Aspose.CAD.Java.lic"));
	
 
    String inputFile = "e:\\13.dwg";
    String outputFile = "e:\\10086K.dwg"; // “_m” 代表已修改
    
    try {
        // 2. 加载DWG文件
        System.out.println("正在加载文件: " + inputFile);
        CadImage cadImage = (CadImage) Image.load(inputFile);
      
        // 3. 执行查找和修改
        int modifiedCount = modifyTextInDrawing(cadImage);
        
        if (modifiedCount > 0) 
        { 
            // 4. 保存修改后的文件
            System.out.println("正在保存修改后的文件: " + outputFile); 
            DwgOptions dwgOptions =new DwgOptions();
            
            cadImage.save(outputFile,dwgOptions);
            System.out.println("✅ 保存成功!共修改了 " + modifiedCount + " 处文本。");
        } else {
            System.out.println("⚠️ 未找到文本 \"自由放空\",文件未作修改。");
        }
        
    } catch (Exception e) {
        System.err.println("❌ 处理过程中发生错误: ");
        e.printStackTrace();
    }
}

/**
 * 核心函数:遍历所有实体,找到并修改特定文本
 * @param cadImage 加载的CAD图像对象
 * @return 成功修改的文本数量
 */
private static int modifyTextInDrawing(CadImage cadImage) {
    int modifiedCount = 0;
    
    // 遍历所有CAD实体
    
    for (CadEntityBase entity : cadImage.getEntities()) {
        // 检查实体类型是否为单行文字 (CadText)
        if (entity instanceof CadText) {
            CadText textEntity = (CadText) entity;
            String originalText = textEntity.getDefaultValue();
            
            // 如果文本不为空且包含目标字符串
            if (originalText != null && originalText.contains("01-VL-110111-2K2-50")) {
                // 执行替换
                String newText = originalText.replace("01-VL-110111-2K2-50", "屏住呼吸");
                textEntity.setDefaultValue(newText); // 关键:修改实体内容
                modifiedCount++;
                
                // 打印修改日志
                System.out.println("找到并修改文本: \"" + originalText + "\" -> \"" + newText + "\"");
            }
        }
  
    }
    return modifiedCount;
}

}

@easycalc.163.com,
您好,

原问题已部分解决,但您遇到的问题原因可能完全不同。请附上一些测试文件,以便我们重现并验证问题。

我手头的dwg都没办法保存,同时新的问题您也帮我看一下 private TFRect getEntityBounds(CadEntityBase entity) {
try {

	List<Cad3DPoint> bounds = entity.getBounds(); //永远为null
	if (bounds != null && bounds.size() >= 2) {
		Cad3DPoint minPoint = bounds.get(0);  // 最小点 (left, bottom)
		Cad3DPoint maxPoint = bounds.get(1);  // 最大点 (right, top)
		//expandFRect2D(rect, point);
		// 转换为TFRect格式
		return new TFRect(
				minPoint.getX(),  // left
				maxPoint.getY(),  // top (Y轴向上,maxY是top)
				maxPoint.getX(),  // right
				minPoint.getY()   // bottom (Y轴向上,minY是bottom)
				);
	}
	} catch (Exception e) {
		e.printStackTrace();
	}

	// 如果获取失败,返回一个无效的矩形
	return new TFRect(0, 0, 0, 0);
}

@easycalc.163.com,
请描述一下最后一个代码示例的问题所在?可能是您需要先调用 cadImage.getBounds,然后再获取特定实体的边界,请尝试一下。

请注意,如果我们无法重现问题,我们将无能为力。文件保存后损坏的原因可能有很多,我们需要检查其初始内部结构和重新保存后的版本。

非常感谢,cadImage.getBounds(Entity);就可以了,现在留下保存dwg的,迄今未能成功,继续您的帮助,我就打开dwg,然后文字修改后,保存为另外的dwg,而且文件大小也变化很大,也打不开了

@easycalc.163.com,
谢谢,是的,我们可以从示例中看出这一点。还有很多其他细节也很重要:初始 DWG 文件的版本可能是文件大小变化的原因(由于我们输出的是 DWG 2018,结果可能被线性化了);文本实体使用的字体;文本实体的大小。但问题很可能并非由文本更改引起,而是由于样式、对象、图层保存的内部错误导致的,我们需要检查/排查所有这些方面。您能否创建一个只包含这样一个文本实体的示例文件?

我在需要 完整结果给您例子;还有一点,insert中如何得到图块,以及图块的元素,及遍历图块的元素,非常感谢

@easycalc.163.com,
请测试一下这是否有帮助:

// iterate over all entities
for (CadEntityBase entity : cadImage.getEntities())
{
	// if (entity.getTypeName().toString().equals("INSERT"))
	if (entity instanceof CadInsertObject)
	{
		CadInsertObject insert = (CadInsertObject)entity;

		CadBlockEntity block = cadImage.getBlockEntities().get_Item(insert.getName());

		// look inside items in block
		for (CadEntityBase blockEntity: block.getEntities())
		{
			// if (blockEntity.getTypeName().toString().equals("TEXT"))
			if (blockEntity instanceof CadText)
			{
				CadText text = (CadText)blockEntity;
				// ...
			}
		}
	}
}

我用的是最新的25.10版本,代码如下,保存为dwg后,就没办法正常了,在附件中,您把我检查一下,这很重要,感谢
public class ModifySpecificText {
public static void main(String[] args) throws Exception{

    String inputFile = "e:\\300T.dwg";
    String outputFile = "e:\\999.dwg";  
    
    try {

        System.out.println("正在加载文件: " + inputFile);
        
        LoadOptions loadOptions = new LoadOptions();

        CadImage cadImage = (CadImage)CadImage.load(inputFile,loadOptions);
        
        System.out.println("count: " + cadImage.getEntities().size());
        for (CadEntityBase entity : cadImage.getEntities()) {
           
            if (entity instanceof CadText) {
                CadText textEntity = (CadText) entity;
                String originalText = textEntity.getDefaultValue();
                System.out.println(originalText);
            }
        }

        int modifiedCount = modifyTextInDrawing(cadImage);
   
        if (modifiedCount > 0) 
        { 
          
            System.out.println("正在保存修改后的文件: " + outputFile); 
            DwgOptions dwgOptionsc =new DwgOptions();
          
            cadImage.save(outputFile,dwgOptionsc);
            System.out.println("✅ 保存成功!共修改了 " + modifiedCount + " 处文本。");
        } else {
            System.out.println("⚠️ 未找到文本 文件未作修改。");
        }
        
    } catch (Exception e) {
        System.err.println("❌ 处理过程中发生错误: ");
        e.printStackTrace();
    }
}


private static int modifyTextInDrawing(CadImage cadImage) {
    int modifiedCount = 0;

    for (CadEntityBase entity : cadImage.getEntities()) {
   
        if (entity instanceof CadText) {
            CadText textEntity = (CadText) entity;
            String originalText = textEntity.getDefaultValue();
     
            if (originalText != null && originalText.contains("法兰蝶阀")) {
         
                String newText = originalText.replace("法兰蝶阀", "屏住呼吸485");
                textEntity.setDefaultValue(newText);  
                modifiedCount++;
             
                System.out.println("找到并修改文本: \"" + originalText + "\" -> \"" + newText + "\"");
            }
        }
  
    }
    return modifiedCount;
}

300T.zip (113.3 KB)

}

@easycalc.163.com,
感谢您提供详细信息,我们已能够重现该问题。我们已创建工单 CADJAVA-12059 来解决此问题。

cadImage.getBounds(entity)这个函数有两个问题
第一、性能比较差,这个问题很明显,跟自己去算box差了数量级
第二、insert里面的block绝对坐标和inserpoint叠加后,轮廓不一致
请帮我确认一下,目前仅仅能调用接口,没办法观察实现过程细节,比较棘手

@easycalc.163.com,
如何在无法进行直接比较的情况下确认某个操作的性能呢?:slight_smile:
性能会受到诸如实体类型、阻塞实体以及文件格式版本等因素的影响。
请提供一个运行较慢的示例,以便我们理解使用场景、实体类型,并改进性能。
另外,请提供一个展示边界错误的示例,以便我们修复该问题。