我们继续阅读有关使用CAD API COMPASS-3D的系列文章。 在本周期的先前课程中,控制字符已经出现过几次了。 然后每次都说输出行不应包含它们,因为COMPAS以特殊方式处理它们。 现在是时候更好地了解他们了。
掌握了它们的工作之后,您将了解创建复杂的复合字符串是一项微不足道的任务,在大多数情况下,不需要编写大量代码。
在本课中,我们将研究如何将特殊字符和字体字符与控制字符一起使用,讨论如何在它们的帮助下创建小数和偏差,并考虑将其与段落结合使用。

课程系列“使用KOMPAS-3D API的工作”的内容
- 基础知识
- 图纸设计
- 正确连接到KOMPAS
- 主题词
- 图形图元
- 以各种格式保存文档
- 了解设置
- 标题栏中更复杂的书写方法
- 读取字幕单元
- 特殊字符,包括字符串
- 简单文字标签
- 复合弦
- 段落
- 多行文字
- 基于段落的复合线
- 控制字符
课程复习
控制字符为:@,$,&,;,〜,^和#。 不幸的是,KOMPAS SDK几乎没有关于如何使用它们的信息。 有关更多信息,请参见
“ 9.部分
”中的KOMPAS帮助
。 KOMPAS-3D设置/系统设置存储/服务文件/用户菜单文件/文件语法 。
”
所有控制字符都可以有条件地分为两组:主要和辅助。 辅助符号仅与主要符号一起使用,并且它们本身不描述任何组件。 下表简要说明了控制字符。

让我们更详细地考虑它们。
插入特殊字符
我们已经考虑了特殊字符(请参阅第
4和第
10课)。 然后,要插入一个特殊字符,使用了
ksTextItemParam接口的单独实例。 使用控制字符,您可以在字符串中插入尽可能多的特殊字符,而无需
重新使用ksTextItemParam接口。
插入特殊字符的语法为:
AA @ YXXXX〜BB在哪里
AA-位于特殊字符之前的字符串,
Y-表示特殊字符代码的修饰符,
XXXX-插入的特殊字符的代码。
BB-特殊字符后的一行。
插入的特殊字符的代码在
@和
〜之间指定。 此外,根据修饰符
Y的值,可以十进制或十六进制表示。 下表中显示了有效的修饰符
Y值。
注意:如我的实验所示,COMPASS通常会处理
〜字符的缺失。 在这种情况下,需要插入特殊字符。 但是,我强烈建议不要依赖此行为,并始终使用
〜字符完成插入操作。
以下是演示特殊字符输出的程序示例。
BSTR str = SysAllocString(OLESTR(" @+51~ ")); document2D->ksText(100.0,100.0,0.0,0.0,0.0,0,str); SysFreeString(str); str = SysAllocString(OLESTR(" @*33~ ")); document2D->ksText(100.0,90.0,0.0,0.0,0.0,0,str); SysFreeString(str);
在此示例中,相同的字符(αalpha)显示两次。 第一次以十进制指定其代码,第二次以十六进制指定。 下图显示了程序的结果。

控制字符使您可以在同一行上显示几个特殊字符。 因此,在以下示例中,在一次对
ksText方法的调用中显示了希腊字母的前三个字母。
BSTR str = SysAllocString(OLESTR("@+51~ @+52~ @+53~")); document2D->ksText(100.0,100.0,0.0,0.0,0.0,0,str); SysFreeString(str);
下图显示了该程序的结果。

修饰符+是默认修饰符。 因此,上面的行可以这样写:
“ @ 51〜@ 52〜@ 53〜”在这种情况下,程序的结果将保持不变。
如果
@是无效字符,则
@和
〜之间的行将按原样显示。 字符
@和
〜被省略。 例如,使用以下行:
“在@ T51之前〜之后”该文档将显示:
T51之前之后注意: KOMPAS的这种行为是未记录的,并且在程序的不同版本中可能有所不同。
注意:控制字符不适用于插入包含字符串的特殊字符。 事实是,要限制其行为,您需要使用标志SPECIAL_SYMBOL_END(有关更多详细信息,请参见
本周期的
10节 ),但是控制字符不允许使用标志。
插入字体字符
除特殊字符外,您还可以按其代码插入普通字符。 控制字符
^和
〜用于此目的。 它们的语法在下面给出。
AA ^( FNAME ) YXXXX〜BB在哪里
AA-位于插入字符之前的字符串,
FNAME-提取字符的字体名称,
Y-修饰符,用于表示字符代码(类似于@),
XXXX-插入字符的数字代码,
BB-插入字符后的一行。
就其目的而言,控制字符
^与
@相似。 它们甚至具有相似的语法。 但是它们之间有两个重要区别:
- ^不是插入特殊字符,而是按其代码插入字体字符;
- 对于要插入的字符,可以在FNAME字段中设置字体(@不允许这样做)。
可以使用charmap应用程序(符号表)查看符号代码,该应用程序是Windows操作系统的一部分。
如果未指定字体,则使用默认字体。 以下是使用
^字符的示例。
BSTR str = SysAllocString(OLESTR(" ^(Arial)*B1~ ^*39~ ")); document2D->ksText(100.0,100.0,0.0,0.0,0.0,0,str); SysFreeString(str);
在此示例中,在结果字符串中插入了两个字符,第一个字符选择字体
Arial ,第二个字符保留默认字体。 下图显示了输出到文档的行。

请注意:仅针对显示的字符设置字体。 如我的实验所示,KOMPAS通常处理不存在终止子的情况。 但是,我不建议依赖此行为,并且始终设置终结器。
如果在
^之后指定了无效字符(或无效代码),
则会省略
^和
〜 ,并使用默认字体按原样显示它们之间的行。 例如,与行
“ ^ Q(Arial)前* B1〜之后”该文档将显示:
“ Q之前(Arial)* B1之后”如果在
FNAME字段中输入了错误的字体名称,则KOMPAS将选择该字体并在其中显示字符。
如果该行中没有右括号,则不会完全显示该行。 例如,使用以下行:
“在^ Q之前(Arial * B1〜之后)”该文件只会显示
“直到”注意:以上带有错误控制字符语法的行为对于KOMPAS-3D V17有效,并且未记录。 在其他版本中,它可能有所不同。
插入字符的其他方式
字符
@和
^分别具有类似物-
&和
# 。 它们具有相似的语法:
AA和XX〜BB
AA #( FNAME ) XX〜BB在哪里
AA-在插入的字符之前显示的字符串,
XX-插入字符的代码(对于&-特殊字符,对于#-字体字符),
BB-在插入字符后显示的字符串,
FNAME-字体名称。
@和
^字符及其对应的字符之间只有两个区别:
- &和#字符没有Y修饰符,字符代码始终以十进制表示法指定。
- 要插入的字符的代码最多由两位数字指定。
以下是演示如何使用
&和
#字符的程序的源代码。
BSTR str = SysAllocString(OLESTR(" &51~ ")); document2D->ksText(100.0,100.0,0.0,0.0,0.0,0,str); SysFreeString(str); str = SysAllocString(OLESTR(" #(Arial)37~ #37~ ")); document2D->ksText(100.0,90.0,0.0,0.0,0.0,0,str); SysFreeString(str);
下图显示了该程序的结果。

多行文字
使用控制字符,可以显示多行文本。 为此,在转移到新行的位置,您需要插入以下序列:
@ / 。 注意:
@字符不带终止符
〜 。 以下是使用控制字符显示多行文本的程序的源代码。
BSTR str = SysAllocString(OLESTR(" @/ ")); document2D->ksText(100.0,100.0,0.0,0.0,0.0,0,str); SysFreeString(str);
请注意:由于使用了控制字符,我们仅需调用
ksText方法即可显示两行文本。 下图显示了该程序的结果。

插入控制字符
我们想出了如何插入任意特殊字符和Unicode字符。 但是,如果您想插入控制字符本身怎么办? 在这里,您可以通过两种方式进行。 第一种方法是使用
^字符并将其粘贴为常规字体字符。 但是,有一种更简单的方法。
符号
; 是辅助的,可以直接插入文本中。 要插入其他控制字符,您需要将它们加倍。 也就是说,一对
@@字符将单个
@字符插入文本中。 其他控制字符也是如此。
下面是一个示例程序,演示了如何在字符串中插入控制字符。
BSTR str = SysAllocString(OLESTR(" : @@ $$ && ; ~~ ^^ ##")); document2D->ksText(100.0,100.0,0.0,0.0,0.0,0,str); SysFreeString(str);
下图显示了该程序的结果。

上下偏差
以下语法用于插入偏差:
AA $ XX ; YY $ BB在哪里
AA-偏差前显示的文字;
XX-上限偏差;
YY为下偏差;
BB-偏差后显示的文本。
请注意:整个结构仅限于
$个字符,“ »用作上下偏差之间的分隔符。
如果在字符
$之间没有定界符“
; ”,那么它们之间的整条线将被解释为最大偏差。 如果不存在组件
XX ,即在第一个
$之后立即变为“
; ”,则随后的最接近
$的整行将
被解释为较低的偏差。
注意:偏差较大
的文本不应以字母
b ,
d ,
s ,
m和
l (小写
L )开头。 其原因将在后面解释。
以下是显示偏差输出的程序示例
BSTR str = SysAllocString(OLESTR(" $;$ ")); document2D->ksText(100.0,100.0,0.0,0.0,0.0,0,str); SysFreeString(str);
下图显示了该程序的结果:

请注意KOMPAS只处理一个字符“
; ”。 第二个字符是“
; “可以解释为整个结构的终结者。 例如,在“
11 $ 22; 33; 44 $ ”行中,屏幕将显示:
注意: KOMPAS的这种行为没有记录,因此您不能依赖它。
分数
分数语法与偏差语法相似,并且具有两个等效选项:
AA $ bXX ; YY $ BB
AA $ dXX ; YY $ BB在哪里
AA-文本输出为分数;
XX是分子;
YY是分母;
BB-分数后显示的文本。
请注意:分数输出和偏差输出之间的唯一区别是
$的第一个符号后紧跟字母
d或
b 。 否则,它们的语法是相同的。
如果字符
$ d (
$ b )和
$之间没有“
; ” ”,那么它们之间的整行将被解释为分子。 如果不存在组件
XX ,即在
$ d (
$ b )之后立即出现“
; ,然后将最接近的
$的整行都解释为分母。
注意:分子文本不能以字母
s ,
m或
l (小写
L )开头。 其原因将在后面解释。
下面是一个程序示例,该示例演示使用控制字符输出小数。
BSTR str = SysAllocString(OLESTR(" $d;$ ")); document2D->ksText(100.0,100.0,0.0,0.0,0.0,0,str); SysFreeString(str);
下图显示了该程序的结果。

请注意,KOMPAS处理“额外”字符“
; »以及出现偏差的情况。 此行为是未记录的,不能依赖。
变化和馏分大小控制
在偏差或分数构建的最开始,可以找到一个字母:
s ,
m或
l (小写
L )。 它们指定偏差的大小和分数的元素(分子和分母)。 下表描述了它们的目的。

如果未指定这些字母,则将
l用作分数,将
m用作偏差。 下面是一个示例程序,演示了这些字母的用法。
BSTR str = SysAllocString(OLESTR(" $d;$ ")); document2D->ksText(100.0,100.0,0.0,0.0,0.0,0,str); SysFreeString(str); str = SysAllocString(OLESTR(" $dl;$ ")); document2D->ksText(100.0,85.0,0.0,0.0,0.0,0,str); SysFreeString(str); str = SysAllocString(OLESTR(" $dm;$ ")); document2D->ksText(100.0,70.0,0.0,0.0,0.0,0,str); SysFreeString(str); str = SysAllocString(OLESTR(" $ds;$ ")); document2D->ksText(100.0,60.0,0.0,0.0,0.0,0,str); SysFreeString(str);
下图显示了该程序的结果。

尽管在此示例中,字母
s ,
m和
l用于分数,但它们用于偏差的用法没有什么不同。
请注意,如果在分数或偏差的开头(
$ ,
$ d或
$ b )与字母
s ,
m或
l之间,至少有一个“外部”字符(例如空格),则COMPAS将不会“看到”字母,并且分数或偏差将是默认大小。
嵌套控制字符
输出分数和偏差时,将对其组成中包含的线进行递归处理。 这意味着在形成分子和分母时,也可以使用控制字符。 下面的示例演示了这种方法。
BSTR str = SysAllocString(OLESTR("@54~$s2$ + $d@+51~;@+52~$ - ^(Symbol)*70~")); document2D->ksText(100.0,100.0,0.0,0.0,0.0,0,str); SysFreeString(str);
下图显示了该程序的结果。

要插入希腊字母,我们使用控制字符@和^(用于字母pi)。 第一项的度是使用偏差得出的。 子字符串
$ s2 $显示它。 字母
s表示偏差很小,但是由于没有分隔符“
; »仅显示上偏差。
为了形成分数,使用了组合
$ d; $ 。 此外,分子和分母包括控制字符,这些控制字符提供希腊字母的输出。
使用控制字符
^和
〜将最后减去的(πpi)显示为Symbol字体的符号。
不幸的是,这种“递归”的可能性非常有限。 我们不能将分数和偏差相互投资。 问题在于它们两者都是使用
$控制字符形成的。 因此,COMPASS无法正确解析哪个
$属于哪个元素。
段落中的控制字符
您可以使用段落使用嵌套的控制字符部分地绕过限制。 一起使用控制字符和段落可以使您构建更复杂的结构。 下面的示例演示了4级分数的构造。
用于构建4级分数的程序代码 // DynamicArrayPtr dynamicArray; dynamicArray = static_cast<DynamicArrayPtr>(kompas->GetDynamicArray(TEXT_ITEM_ARR)); dynamicArray->ksClearArray(); TextItemParamPtr textItemParam; textItemParam = static_cast<TextItemParamPtr>(kompas->GetParamStruct(ko_TextItemParam)); // BSTR str = SysAllocString(OLESTR(" ")); textItemParam->set_s(str); dynamicArray->ksAddArrayItem(-1, textItemParam); SysFreeString(str); // TextItemFontPtr textItemFont; textItemFont = static_cast<TextItemFontPtr>(textItemParam->GetItemFont()); textItemFont->set_bitVector(NUMERATOR); str = SysAllocString(OLESTR("1 + $d@+51~;2$")); textItemParam->set_s(str); dynamicArray->ksAddArrayItem(-1, textItemParam); SysFreeString(str); // textItemFont->set_bitVector(DENOMINATOR); str = SysAllocString(OLESTR("1 + $d@+56~;2$")); textItemParam->set_s(str); dynamicArray->ksAddArrayItem(-1, textItemParam); SysFreeString(str); // textItemFont->set_bitVector(END_FRACTION); str = SysAllocString(OLESTR(" ")); textItemParam->set_s(str); dynamicArray->ksAddArrayItem(-1, textItemParam); SysFreeString(str); // textItemFont.Unbind(); textItemParam.Unbind(); // ksTextLineParam TextLineParamPtr textLineParam; textLineParam = static_cast<TextLineParamPtr>(kompas->GetParamStruct(ko_TextLineParam)); textLineParam->Init(); textLineParam->SetTextItemArr(dynamicArray); dynamicArray.Unbind(); // ParagraphParamPtr paragraphParam; paragraphParam=static_cast<ParagraphParamPtr>(kompas->GetParamStruct(ko_ParagraphParam)); paragraphParam->Init(); paragraphParam->set_x(100.0); paragraphParam->set_y(100.0); document2D->ksParagraph(paragraphParam); document2D->ksTextLine(textLineParam); document2D->ksEndObj(); // textLineParam.Unbind(); paragraphParam.Unbind();
在此示例中,控制字符用于构造主分数的分子和分母中的分数,以及插入希腊字母。 下图显示了该程序的结果。

结论
在本课程中,我们遇到了控制字符,并学习了如何使用它们来显示特殊字符和字体字符。 如您所见,它们为创建包含特殊字符,分数和偏差的字符串提供了一种简单的语法。 不幸的是,它们不适合插入包含字符串的特殊字符。 但是这种特殊字符极为罕见。 这是控制字符的局限之一。 此外,它们不能用于创建子字符串和子字符串,并且在处理包含字符串的特殊字符时存在一些限制。 但这并没有减损他们的优点。 至此,我们对控制字符的讨论结束了。
要继续,请关注博客新闻。
Sergey Norseev博士,《在Delphi中进行COMPAS的应用程序开发》一书的作者。