lumu
1
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();
}
}
@lumu,
您好。
我们已创建 CADJAVA-11848 来调查并修复此问题。
lumu
5
我们已创建 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,
如何在无法进行直接比较的情况下确认某个操作的性能呢?
性能会受到诸如实体类型、阻塞实体以及文件格式版本等因素的影响。
请提供一个运行较慢的示例,以便我们理解使用场景、实体类型,并改进性能。
另外,请提供一个展示边界错误的示例,以便我们修复该问题。