使用KOMPAS-3D API→第16课→控制字符

我们继续阅读有关使用CAD API COMPASS-3D的系列文章。 在本周期的先前课程中,控制字符已经出现过几次了。 然后每次都说输出行不应包含它们,因为COMPAS以特殊方式处理它们。 现在是时候更好地了解他们了。

掌握了它们的工作之后,您将了解创建复杂的复合字符串是一项微不足道的任务,在大多数情况下,不需要编写大量代码。

在本课中,我们将研究如何将特殊字符和字体字符与控制字符一起使用,讨论如何在它们的帮助下创建小数和偏差,并考虑将其与段落结合使用。



课程系列“使用KOMPAS-3D API的工作”的内容


  1. 基础知识
  2. 图纸设计
  3. 正确连接到KOMPAS
  4. 主题词
  5. 图形图元
  6. 以各种格式保存文档
  7. 了解设置
  8. 标题栏中更复杂的书写方法
  9. 读取字幕单元
  10. 特殊字符,包括字符串
  11. 简单文字标签
  12. 复合弦
  13. 段落
  14. 多行文字
  15. 基于段落的复合线
  16. 控制字符

课程复习


控制字符为:@,$,&,;,〜,^和#。 不幸的是,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 ^( FNAMEYXXXX〜BB

在哪里
AA-位于插入字符之前的字符串,
FNAME-提取字符的字体名称,
Y-修饰符,用于表示字符代码(类似于@),
XXXX-插入字符的数字代码,
BB-插入字符后的一行。

就其目的而言,控制字符^@相似。 它们甚至具有相似的语法。 但是它们之间有两个重要区别:

  1. ^不是插入特殊字符,而是按其代码插入字体字符;
  2. 对于要插入的字符,可以在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有效,并且未记录。 在其他版本中,它可能有所不同。

插入字符的其他方式


字符@^分别具有类似物- 。 它们具有相似的语法:

AAXX〜BB
AA #( FNAMEXX〜BB

在哪里

AA-在插入的字符之前显示的字符串,
XX-插入字符的代码(对于&-特殊字符,对于#-字体字符),
BB-在插入字符后显示的字符串,
FNAME-字体名称。

@^字符及其对应的字符之间只有两个区别:

  1. &和#字符没有Y修饰符,字符代码始终以十进制表示法指定。
  2. 要插入的字符的代码最多由两位数字指定。

以下是演示如何使用字符的程序的源代码。

 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 ,即在第一个$之后立即变为“ ; ”,则随后的最接近$的整行将解释为较低的偏差。

注意:偏差较大文本不应以字母bdsml (小写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-分数后显示的文本。

请注意:分数输出和偏差输出之间的唯一区别是$的第一个符号后紧跟字母db 。 否则,它们的语法是相同的。

如果字符$ d$ b )和$之间没有“ ” ”,那么它们之间的整行将被解释为分子。 如果不存在组件XX ,即在$ d$ b )之后立即出现“ ; ,然后将最接近的$的整行都解释为分母。

注意:分子文本不能以字母sml (小写L )开头。 其原因将在后面解释。

下面是一个程序示例,该示例演示使用控制字符输出小数。

 BSTR str = SysAllocString(OLESTR(" $d;$ ")); document2D->ksText(100.0,100.0,0.0,0.0,0.0,0,str); SysFreeString(str); 

下图显示了该程序的结果。



请注意,KOMPAS处理“额外”字符“ ; »以及出现偏差的情况。 此行为是未记录的,不能依赖。

变化和馏分大小控制


在偏差或分数构建的最开始,可以找到一个字母: sml (小写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); 

下图显示了该程序的结果。



尽管在此示例中,字母sml用于分数,但它们用于偏差的用法没有什么不同。

请注意,如果在分数或偏差的开头( $$ d$ b )与字母sml之间,至少有一个“外部”字符(例如空格),则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的应用程序开发》一书的作者。

Source: https://habr.com/ru/post/zh-CN457702/


All Articles