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

课程系列“使用KOMPAS-3D API的工作”的内容
- 基础知识
- 图纸设计
- 正确连接到KOMPAS
- 主题词
- 图形图元
- 以各种格式保存文档
- 了解设置
- 标题栏中更复杂的书写方法
- 读取字幕单元
- 特殊字符,包括字符串
- 简单文字标签
- 复合弦
- 段落
- 多行文字
- 基于段落的复合线
上下偏差
下面是一个程序片段,该片段使用段落演示了上下偏差行的输出。 为此
,使用了第12 节中提到的标志
END_DEVIAT ,
LOWER_DEVIAT和
UPPER_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课的示例相比
,当前程序具有两个重要优点:
- 它使用了COMPASS系统记录的功能。
- 无需重新计算行的位置。 KOMPAS确定所有必要的偏移量。
注意
END_DEVIAT标志的使用。 它完成了偏差的生成并取消了
LOWER_DEVIAT和
UPPER_DEVIAT标志 。 如果我们没有使用它,则“偏差后的文本”行将显示为下偏差。
标志
LOWER_DEVIAT和
UPPER_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标志取消
NUMERATOR和
DENOMINATOR标志,
并且就偏差而言,其
作用与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的应用程序开发》一书的作者。