当我从DWG文件(CAD 2000版本)读取文本时,得到类似""\M+5BFAA\M+5B9D8""的字符,而实际应为中文""开关""。此问题出现在Linux平台的Java环境中,Windows平台运行正常。
DWG文件CAD 2000版本使用多字节编码存储文本,更高版本则使用Unicode。要将多字节转换为Unicode,需在应用程序启动时初始化映射表:OdCharMapper.initialize(""adinit.dat""),其中""adinit.dat""需指定完整路径。
更多字体支持详情请参阅此处(需ODA账号登录) here
OdPdfExportEx 中有一个标志选项允许使用嵌入式TTF字体,这是否意味着PDF导出会从DWG文件中收集字体?
在将文本导出为PDF时,TTF字体可通过两种方式处理:
仅引用字体:PDF文件会标注字体名称,打开时需依赖系统环境中的对应字体;
完整嵌入字体文件:将整个TTF文件写入PDF,虽增加文件体积,但能确保跨设备渲染一致,避免兼容性问题。
需注意:PDF导出功能不会从图纸中提取字体,而是从系统中获取。启用该标志后,导出器会将完整的字体文件嵌入PDF。
更多细节请参阅PDF导出参数的官方文档 documentation about pdf export parameters.
如果DWG文件不包含字体数据会怎样?
若DWG文件未包含字体数据,则意味着也不包含对应文本内容,因此不会产生任何导出结果(特指字体相关数据)。
如何通过窗口区域(非布局)将模型空间中的图纸导出为多页PDF?
由于图纸包含不同图框,无法直接将不同窗口区域导出到不同页面。但有以下两种替代方法:
可以在图纸中创建多个布局,在这些布局上放置包含所需区域的视口,这样就可以将每个布局导出为PDF的不同页面。
可以尝试使用PdfPublish功能。通过Publish,您可以先将图纸导出为PDF,然后将图纸参照放置到PDF的多个页面中,甚至可以在同一页面的不同位置放置参照,最后对它们应用裁剪功能(https://www.opendesign.com/blog/2018/december/publishing-2d-cad-objects)。
若转换时未找到输入文件使用的字体类型会怎样?
ODA Drawings SDK支持TTF和SHX字体,但ODA不重新分发字体文件。若未找到所需字体,默认将使用类似Simplex的内置字体。详情请参阅《字体处理》专题文档。 Font Handling
如何从SHX字体文本中提取几何形状?
参考 /Drawing/Examples/ExCommands/ExTxtExp.cpp 文件,该示例实现了以下功能:
将SHX字体文本分解为线段和椭圆
将TTF字体文本转换为三角形轮廓
如何将文字对象居中放置在闭合多段线内?当将中心坐标设为文字位置时,文字会从该点向右排列。
使用以下代码设置文字居中:
pText->setAlignmentPoint(OdGePoint3d(outlineCenter.x(), outlineCenter.y(), outlineCenter.z()));
并通过以下方式设置文字对齐:
pText->setHorizontalMode(OdDb::TextHorzMode::kTextCenter );
pText->setVerticalMode(OdDb::TextVertMode::kTextVertMid) ;
adjustAlignment()方法会在文字实体关闭时自动调用,但也可在添加到块后直接调用:
m_blockTableRecordPtr->appendOdDbEntity(pText);
pText->adjustAlignment(NULL);
为什么Autodesk® AutoCAD®无法显示由ODA SDK创建的DWG文件中的.otf字体?
AutoCAD仅支持.ttf字体,不兼容.otf字体格式。而ODA SDK可正确处理.otf和.ttf两种字体格式。
为何OdaMfcApp与OdSvgExportEx的输出文本不一致?
该差异源于两者定位.shx字体的算法不同。您可在OdaMfcApp::findFile()方法设置断点进行调试。需注意:OdSvgExportEx示例不会在Autodesk® AutoCAD®目录中搜索字体。
如何提取图纸对象中包含的所有文本数据?
请参阅《Text Data Extraction 》技术文档,并参考Drawing/Examples/OdExtractTextEx示例应用程序的实现方案。
如何删除文字样式?
可通过以下代码删除文字样式:
styleId.safeOpenObject(OdDb::kForWrite)->erase(true);
注意:
无法删除"Standard"样式
当前正在使用的文字样式不可删除
如何设置单行文字倒置显示?
请使用以下OdDbText类方法: setRotation(), mirrorInX(), mirrorInY().
能否去除MText对象中的文本格式代码?
可以。请使用OdDbMText::explodeFragments()方法,并配合OdDbMTextFragment结构中的以下成员实现:
int changeStyle; // 0 == No change; 1 == Change to original; 2 == Change to other
bool lineBreak; // Text is followed by a line break.
bool newParagraph; // Text fragment starts a new paragraph.
如何将文字实体分解为多段线?
您可在Drawing/Examples/ExCustObjs/DrxDebugCmds.cpp文件中查看TextContourExplode命令的实现,该命令支持将.shx和.ttf字体文字分解为多段线轮廓
为什么在代码页设置为CP_ANSI_932时,TrueView中打开的日文文本显示乱码?
您需要为文本实体设置正确的Unicode文本。例如:
char* txt = ""; // Some multi-byte Japanese text in CP_ANSI_932
OdAnsiString mbStr(txt, CP_ANSI_932);
OdString unicodeStr(mbStr);
OdDbTextPtr textEnt; // Some database text entity
textEnt->setTextString(unicodeStr);
保存时,图纸文本内容将由ODA自动解码为合适格式。
如何将OdDbMText对象分解为MTextFragments时获取特殊符号的Unicode值?
OdDbMTextFragment结构体中的OdString类型成员变量text可直接提供包含Unicode字符的文本内容。
为何多行文字在Windows®和非Windows平台分解后显示效果不同?
要实现相同效果,各平台需安装相同字体。某些字体可能无法同时在非Windows和Windows平台上使用。此时,系统会使用可用字体替换缺失字体,并可能为每个短语、单词甚至符号生成独立文本实体。若多行文字使用的字体在计算机上可用,则所有符号将应用该字体并生成单一文本实体。详见《开发者指南》中的“Font Handling ”章节。
如何获取OdDbText对象的字体名称和大小?
通过OdDbTextStyleTableRecord::font()方法可获取关联文字样式的字体特征(包括字型、粗体、斜体、字符集及字距族等Windows字体属性)。
若font()方法返回空字型,请改用OdDbTextStyleTableRecord::fileName()方法,该方法将返回关联文字样式的独立字体文件名。文字大小作为OdDbText实体的属性,可通过height()方法直接获取。更多细节请参阅开发者指南中的《Font Handling》章节。
为什么在macOS上读取.dxf文件后汉字显示不正确?
在运行时及最新的.dwg版本中,文本以Unicode格式存储。旧版本则使用MBCS(多字节字符集)存储文本。要将文本转换为Unicode,必须知道代码页信息(该信息存储在.dwg/.dxf文件中)。但某些早期版本(或由特定应用程序生成的.dxf文件)可能不包含代码页信息,此时将使用系统默认代码页。系统代码页的实现可参考Kernel/Extensions/ExServices/ExSystemServices.cpp文件。
加载此类文件的结果可能因计算机语言设置而异。在非Windows平台上,需通过包含MBCS代码页文本转换表的adinit.dat文件初始化OdCharMapper。该文件位于/Kernel文件夹中。另请参阅Drawing/Examples/OdReadEx/OdReadEx.cpp文件中的示例
为什么.dwg文件中使用的字体显示不正确?
可能原因是当前应用程序无法获取该字体。以下是几种解决方案:
OdString fontFile = pHostApp->findFile(L"fontFileName.ttf"); // Or use the full path name
OdTtfDescriptor descr;
pHostApp->ttfFileNameByDescriptor(descr, fontFile);
- 将字体文件放在与图纸相同的文件夹中。确保该字体包含所需字符。
- 如果图纸与应用程序不在同一文件夹,可以使用ACAD环境变量设置包含所需字体的文件夹,或使用应用程序的findFile()方法指定字体文件位置:
有关字体处理的详细信息请参阅: https://docs.opendesign.com/td/FontHandling.html
为什么.dxf文件中的文字对象在OdaMfcApp应用中打开时对齐不正确?
ODA SDK在加载.dxf文件时不会重新计算文字实体的位置,因为如果引用的字体不可用,这种重新计算可能在往返操作中破坏文字位置。基于ODA SDK 3.5或更高版本的客户端应用程序可以通过调用OdDbHostAppServices::setDxfTextAdjustAlignment(true);方法来覆盖此默认行为
为什么在非Autodesk® AutoCAD®软件创建的.dwg文件中,GDT符号显示不正确?
并非所有字体都包含完整的GDT符号集。要正确显示这些符号,必须使用具有相同编码的正确字体(无需转换字符代码)。例如:显示西里尔字符只需使用西里尔字体,无需额外设置。
在Microsoft® Windows®系统上,您可通过"Windows字符映射表"查看TTF字体包含的所有字符。
更多字体处理细节请参阅开发者指南《Font Handling topic》章节。
为什么纯中文字符的文本高度和宽度显示错误?
并非所有字体都包含中文字符。当图纸中使用的字体缺失时,ODA SDK 会替换为其他字体,但这可能导致显示差异。需注意,Autodesk® AutoCAD® 可能呈现不同效果,且同一文字实体可能混合使用多种字体。
ODA SDK默认使用什么字体?
ODA SDK内置两种默认SHX字体:一种类似txt.shx的简易字体,另一种为GDT专用字体。关于字体支持的详细信息,请参阅开发者指南中的《 Font Handling 》章节。
如何设置文本的“下划线”、“上划线”和“删除线”效果?
您可在开发者指南的《Single-Line Text Special Codes and Unicode Symbols》章节中,找到管理OdDbText实体属性(如“下划线”和“上划线”)的特殊代码。若需设置OdDbMText格式代码,请参阅《 Multi-Line Text Format Codes》章节
ODA SDK是否提供与Autodesk® AutoCAD®的simplex.shx文件字符集相同的替代.shx文件?
ODA SDK不提供额外的字体文件,仅内置一个包含基础符号(拉丁字母和数字)的简易字体,其功能类似于simplex.shx。