使用KOMPAS-3D API→第15课→基于段落的复合行

在第12课中,我们介绍了复合线,并研究了未记录的创建它们的方法。 在第13课中 ,介绍了段落。 今天,我们将研究如何使用它们创建复合字符串。 首先,让我们以包含偏差和分数的行为例,并熟悉复合行的组成部分,例如上标,子字符串和特殊字符。



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


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

上下偏差


下面是一个程序片段,该片段使用段落演示了上下偏差行的输出。 为此,使用了第12 中提到的标志END_DEVIATLOWER_DEVIATUPPER_DEVIAT

程式码片段
//     DynamicArrayPtr items; items = static_cast<DynamicArrayPtr>(kompas->GetDynamicArray(TEXT_ITEM_ARR)); items->ksClearArray(); TextItemParamPtr itemParam; itemParam = static_cast<TextItemParamPtr>(kompas->GetParamStruct(ko_TextItemParam)); itemParam->Init(); TextItemFontPtr itemFont; itemFont = static_cast<TextItemFontPtr>(itemParam->GetItemFont()); //   BSTR str = SysAllocString(OLESTR("  ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(UPPER_DEVIAT); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(LOWER_DEVIAT); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(END_DEVIAT); str = SysAllocString(OLESTR("  ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); // ,     itemFont.Unbind(); itemParam.Unbind(); //  ksTextLineParam TextLineParamPtr lineParam; lineParam = static_cast<TextLineParamPtr>(kompas->GetParamStruct(ko_TextLineParam)); lineParam->Init(); lineParam->SetTextItemArr(items); //  ksParagraphParam ParagraphParamPtr paragraphParam; paragraphParam= static_cast<ParagraphParamPtr>(kompas->GetParamStruct(ko_ParagraphParam)); paragraphParam->Init(); paragraphParam->set_x(30.0); paragraphParam->set_y(100.0); //  Document2D->ksParagraph(paragraphParam); Document2D->ksTextLine(lineParam); Document2D->ksEndObj(); //  items->ksDeleteArray(); items.Unbind(); lineParam.Unbind(); paragraphParam.Unbind(); 


与构造偏离第12课的示例相比当前程序具有两个重要优点:

  1. 它使用了COMPASS系统记录的功能。
  2. 无需重新计算行的位置。 KOMPAS确定所有必要的偏移量。

注意END_DEVIAT标志的使用。 它完成了偏差的生成并取消了LOWER_DEVIATUPPER_DEVIAT标志 。 如果我们没有使用它,则“偏差后的文本”行将显示为下偏差。

标志LOWER_DEVIATUPPER_DEVIAT互相抵消。 当同时使用时,将在不指定这些标志的情况下输出显示的字符串。

由于在我们的示例中未使用NEW_LINE标志,因此只需调用ksTextLine方法即可显示所有行。 为此,它们以ksTextLineParam接口的形式执行

程序的结果如下图所示。



分数


下面是一个程序示例,该示例演示了包含分数的字符串的输出。

程式范例
 //     DynamicArrayPtr items; items = static_cast<DynamicArrayPtr>(kompas->GetDynamicArray(TEXT_ITEM_ARR)); items->ksClearArray(); TextItemParamPtr itemParam; itemParam = static_cast<TextItemParamPtr>(kompas->GetParamStruct(ko_TextItemParam)); itemParam->Init(); TextItemFontPtr itemFont; itemFont = static_cast<TextItemFontPtr>(itemParam->GetItemFont()); //   BSTR str = SysAllocString(OLESTR("  ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(NUMERATOR); str = SysAllocString(OLESTR("")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(DENOMINATOR); str = SysAllocString(OLESTR("")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(END_FRACTION); str = SysAllocString(OLESTR("  ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); // ,     itemFont.Unbind(); itemParam.Unbind(); //  ksTextLineParam TextLineParamPtr lineParam; lineParam = static_cast<TextLineParamPtr>(kompas->GetParamStruct(ko_TextLineParam)); lineParam->Init(); lineParam->SetTextItemArr(items); //  ksParagraphParam ParagraphParamPtr paragraphParam; paragraphParam= static_cast<ParagraphParamPtr>(kompas->GetParamStruct(ko_ParagraphParam)); paragraphParam->Init(); paragraphParam->set_x(30.0); paragraphParam->set_y(100.0); //  Document2D->ksParagraph(paragraphParam); Document2D->ksTextLine(lineParam); Document2D->ksEndObj(); //  items->ksDeleteArray(); items.Unbind(); lineParam.Unbind(); paragraphParam.Unbind(); 


小数的构造与偏差的构造几乎没有什么不同。 唯一的区别是使用的标志。 END_FRACTION标志取消NUMERATORDENOMINATOR标志, 并且就偏差而言,其作用与END_DEVIAT标志相同。
下图显示了该程序的结果。



与第12课中的同一课文相比,此行看起来更整洁。

分数大小控制


显示的分数可以具有不同的大小,该大小可以通过ksTextItemParam接口进行控制。 如果其type属性为FRACTION_TYPE ,则此接口除其他外将设置分数的大小。 大小本身在iSNumb属性中指定。 其有效值如下表所示。



如果iSNumb属性指定的值无效,则KOMPAS使用默认高度。

以下是使用FRACTION_TYPE标志的示例。

标记用法示例
 //   DynamicArrayPtr items; items = static_cast<DynamicArrayPtr>(kompas->GetDynamicArray(TEXT_ITEM_ARR)); items->ksClearArray(); TextItemParamPtr itemParam; itemParam = static_cast<TextItemParamPtr>(kompas->GetParamStruct(ko_TextItemParam)); itemParam->Init(); TextItemFontPtr itemFont; itemFont = static_cast<TextItemFontPtr>(itemParam->GetItemFont()); //   BSTR str = SysAllocString(OLESTR("  ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(NUMERATOR); itemParam->set_type(FRACTION_TYPE); itemParam->set_iSNumb(3); str = SysAllocString(OLESTR("")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(DENOMINATOR); str = SysAllocString(OLESTR("")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(END_FRACTION); str = SysAllocString(OLESTR("  ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); // ,     itemFont.Unbind(); itemParam.Unbind(); //  ksTextLineParam TextLineParamPtr lineParam; lineParam = static_cast<TextLineParamPtr>(kompas->GetParamStruct(ko_TextLineParam)); lineParam->Init(); lineParam->SetTextItemArr(items); //  ksParagraphParam ParagraphParamPtr paragraphParam; paragraphParam= static_cast<ParagraphParamPtr>(kompas->GetParamStruct(ko_ParagraphParam)); paragraphParam->Init(); paragraphParam->set_x(30.0); paragraphParam->set_y(100.0); //  Document2D->ksParagraph(paragraphParam); Document2D->ksTextLine(lineParam); Document2D->ksEndObj(); //  items->ksDeleteArray(); items.Unbind(); lineParam.Unbind(); paragraphParam.Unbind(); 


此示例与上一个示例的区别仅在于在输出分子时在ksTextItemParam接口的type属性中设置了FRACTION_TYPE 类型 。 但是,这足以调整分数的大小。 下图显示了该程序的结果(将其与上一个示例的结果进行比较)。



注意:显示分子时会设置分数大小。 如我的实验所示,显示分母时指定的分数大小将被忽略。

上标和子串



子字符串和子字符串的构造由下表中列出的标志控制。



下面是一个示例程序,演示了带有子字符串和子字符串的字符串的输出。

程式范例
 //   DynamicArrayPtr items; items = static_cast<DynamicArrayPtr>(kompas->GetDynamicArray(TEXT_ITEM_ARR)); items->ksClearArray(); TextItemParamPtr itemParam; itemParam = static_cast<TextItemParamPtr>(kompas->GetParamStruct(ko_TextItemParam)); itemParam->Init(); TextItemFontPtr itemFont; itemFont = static_cast<TextItemFontPtr>(itemParam->GetItemFont()); //   BSTR str = SysAllocString(OLESTR("  ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(S_BASE); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(S_UPPER_INDEX); str = SysAllocString(OLESTR("")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(S_LOWER_INDEX); str = SysAllocString(OLESTR("")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(S_END); str = SysAllocString(OLESTR("  ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); // ,     itemFont.Unbind(); itemParam.Unbind(); //  ksTextLineParam TextLineParamPtr lineParam; lineParam = static_cast<TextLineParamPtr>(kompas->GetParamStruct(ko_TextLineParam)); lineParam->Init(); lineParam->SetTextItemArr(items); //  ksParagraphParam ParagraphParamPtr paragraphParam; paragraphParam= static_cast<ParagraphParamPtr>(kompas->GetParamStruct(ko_ParagraphParam)); paragraphParam->Init(); paragraphParam->set_x(30.0); paragraphParam->set_y(100.0); //  Document2D->ksParagraph(paragraphParam); Document2D->ksTextLine(lineParam); Document2D->ksEndObj(); //  items->ksDeleteArray(); items.Unbind(); lineParam.Unbind(); paragraphParam.Unbind(); 


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



不能使用ksDocument2D :: ksText方法构建子字符串和子字符串。

主行大小控制


主行可以具有不同的大小,可以使用ksTextItemParam接口进行更改。 为此,在其type 属性中指定SUM_TYPE常量,并在iSNumb属性中指定主行的所需大小。 有效值如下表所示:



如果iSNumb属性包含无效值,则KOMPAS将使用默认值。

以下是演示SUM_TYPE常量用法的程序片段。

程序片段
 //   DynamicArrayPtr items; items = static_cast<DynamicArrayPtr>(kompas->GetDynamicArray(TEXT_ITEM_ARR)); items->ksClearArray(); TextItemParamPtr itemParam; itemParam = static_cast<TextItemParamPtr>(kompas->GetParamStruct(ko_TextItemParam)); itemParam->Init(); TextItemFontPtr itemFont; itemFont = static_cast<TextItemFontPtr>(itemParam->GetItemFont()); //   BSTR str = SysAllocString(OLESTR("  ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(S_BASE); itemParam->set_type(SUM_TYPE); itemParam->set_iSNumb(2); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(S_UPPER_INDEX); itemParam->set_type(0); itemParam->set_iSNumb(0); str = SysAllocString(OLESTR("")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(S_LOWER_INDEX); str = SysAllocString(OLESTR("")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(S_END); str = SysAllocString(OLESTR("  ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); // ,     itemFont.Unbind(); itemParam.Unbind(); //  ksTextLineParam TextLineParamPtr lineParam; lineParam = static_cast<TextLineParamPtr>(kompas->GetParamStruct(ko_TextLineParam)); lineParam->Init(); lineParam->SetTextItemArr(items); //  ksParagraphParam ParagraphParamPtr paragraphParam; paragraphParam= static_cast<ParagraphParamPtr>(kompas->GetParamStruct(ko_ParagraphParam)); paragraphParam->Init(); paragraphParam->set_x(30.0); paragraphParam->set_y(100.0); //  Document2D->ksParagraph(paragraphParam); Document2D->ksTextLine(lineParam); Document2D->ksEndObj(); //  items->ksDeleteArray(); items.Unbind(); lineParam.Unbind(); paragraphParam.Unbind(); 



显示主行时,在ksTextItemParam接口的type属性中输入SUM_TYPE常量 。 在输出外接程序之前, ksTextItemParam接口将还原为其初始状态。 这是本示例与上一个示例之间的唯一区别。

下图显示了程序的结果(将其与上一个示例的结果进行比较)。



SUM_TYPE常量允许您调整主字符串的大小,但不能调整子字符串和子字符串的大小。 未提供在KOMPAS中更改其大小的操作。

特殊字符,包括子字符串


一段可以处理包含字符串的特殊字符(在周期的第10课中已讨论了这些字符)。 以下是程序的片段,在段落中演示了它们的用法。

程序片段
 //  DynamicArrayPtr items; items = static_cast<DynamicArrayPtr>(kompas->GetDynamicArray(TEXT_ITEM_ARR)); items->ksClearArray(); DynamicArrayPtr lines; lines = static_cast<DynamicArrayPtr>(kompas->GetDynamicArray(TEXT_LINE_ARR)); lines->ksClearArray(); //   TextLineParamPtr lineParam; lineParam = static_cast<TextLineParamPtr>(kompas->GetParamStruct(ko_TextLineParam)); lineParam->Init(); TextItemParamPtr itemParam; itemParam = static_cast<TextItemParamPtr>(kompas->GetParamStruct(ko_TextItemParam)); itemParam->Init(); TextItemFontPtr itemFont = static_cast<TextItemFontPtr>(itemParam->GetItemFont()); //   BSTR str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); lineParam->SetTextItemArr(items); lines->ksAddArrayItem(-1, lineParam); lineParam->Init(); SysFreeString(str); str = NULL; //     itemFont->set_bitVector(NEW_LINE | SPECIAL_SYMBOL); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); itemParam->set_type(SPECIAL_SYMBOL); itemParam->set_iSNumb(169); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); str = NULL; //   itemFont->set_bitVector(SPECIAL_SYMBOL_END); itemParam->set_s(NULL); itemParam->set_type(0); itemParam->set_iSNumb(0); items->ksAddArrayItem(-1, itemParam); lineParam->SetTextItemArr(items); lines->ksAddArrayItem(-1, lineParam); lineParam->Init(); //     itemFont->set_bitVector(NEW_LINE | SPECIAL_SYMBOL); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); itemParam->set_type(SPECIAL_SYMBOL); itemParam->set_iSNumb(96); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); str = NULL; //   itemFont->set_bitVector(SPECIAL_SYMBOL_END); itemParam->set_s(NULL); itemParam->set_type(0); itemParam->set_iSNumb(0); items->ksAddArrayItem(-1, itemParam); lineParam->SetTextItemArr(items); lines->ksAddArrayItem(-1, lineParam); lineParam->Init(); //   itemFont->set_bitVector(NEW_LINE); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); itemParam->set_type(0); itemParam->set_iSNumb(0); items->ksAddArrayItem(-1, itemParam); lineParam->SetTextItemArr(items); lines->ksAddArrayItem(-1, lineParam); lineParam->Init(); SysFreeString(str); str = NULL; itemParam.Unbind(); lineParam.Unbind(); itemFont.Unbind(); items.Unbind(); //    ParagraphParamPtr paragraphParam; paragraphParam= static_cast<ParagraphParamPtr>(kompas->GetParamStruct(ko_ParagraphParam)); paragraphParam->Init(); paragraphParam->set_x(100.0); paragraphParam->set_y(100.0); paragraphParam->set_width(60.0); paragraphParam->set_hFormat(2); //    TextParamPtr textParam = static_cast<TextParamPtr>(kompas->GetParamStruct(ko_TextParam)); textParam->SetParagraphParam(paragraphParam); textParam->SetTextLineArr(lines); //  Document2D->ksTextEx(textParam, 1); lines->ksDeleteArray(); lines.Unbind(); paragraphParam.Unbind(); textParam.Unbind(); 


该示例看起来非常复杂,但是如果仔细观察,您会发现它由重复的部分组成。 其中,在特殊字符的帮助下,显示带划线和下划线的文本。 在每个这样的块之后,将显示带有标志SPECIAL_SYMBOL_END的空行。 它的任务是取消特殊字符的动作。 如果未显示该段落,则可能无法正确构造该段落。 特殊字符的作用扩展到整个ksTextLineParam块,直至其整个长度,而不管其实际内容如何(该论文如下图所示)。



取消行必须是ksTextLineParam块的一部分。 否则,该段落可能无法正确构建。 ksTextLineParam块可能包含几个控制字符。 他们每个人都有自己的取消行。

标志SPECIAL_SYMBOL_END仅用于具有子字符串的特殊字符。 对于普通的特殊字符,则不需要。

下图显示了我们示例的结果。



结论

在本课程中,我们学习了如何使用段落创建复合线(包括偏差和分数),并研究了记录的基于段落创建复合线的方法。 这不是创建它们的唯一且并非最简单的方法。 另一种更简单的方法,我们将在下一课中考虑。

要继续,请关注博客新闻。

Sergey Norseev博士,《在Delphi中进行COMPAS的应用程序开发》一书的作者。

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


All Articles