Text and Font Questions

  1. FAQ
  2. »
  3. Products Overview
  4. »
  5. Text and Font Questions

当我从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?

由于图纸包含不同图框,无法直接将不同窗口区域导出到不同页面。但有以下两种替代方法:

  1. 可以在图纸中创建多个布局,在这些布局上放置包含所需区域的视口,这样就可以将每个布局导出为PDF的不同页面。

  2. 可以尝试使用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);
  1. 将字体文件放在与图纸相同的文件夹中。确保该字体包含所需字符。
  2. 如果图纸与应用程序不在同一文件夹,可以使用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。