在本周期的先前课程中,我们学习了在标题栏中显示文本。 今天,我们将讨论如何将文本输出到文档本身。 我们将考虑最简单的示例,并在以下课程中显示更多复杂的技巧。

课程系列“使用KOMPAS-3D API的工作”的内容
- 基础知识
- 图纸设计
- 正确连接到KOMPAS
- 主题词
- 图形图元
- 以各种格式保存文档
- 了解设置
- 标题栏中更复杂的书写方法
- 读取字幕单元
- 特殊字符,包括字符串
- 简单文字标签
文字锚点
KOMPAS中的文本始终相对于某个点显示,这称为锚点。 文本相对于文本的位置可以不同。 为了找出文本相对于锚点的位置,
使用了
ksDocument2D接口的
ksGetTextAlign方法。 以下是其原型。
long ksGetTextAlign ( long pText
作为唯一参数,它需要一个指向
文本对象的整数指针。 该方法返回
binding的
类型,如果发生错误,则返回
-1 。 有效的绑定类型如下表所示。
有效绑定类型表要更改文本绑定,请使用
ksDocument2D接口的
ksSetTextAlign方法。 以下是其原型。
long ksSetTextAlign ( long pText, // «» long align // );
如果成功,则此方法返回
1 ,如果发生错误,则返回
零 。
文字输出
对于简单文本输出,请使用
ksDocument2D接口的
ksText方法。 以下是此方法的原型。
long ksText ( double x, // double y, double ang, // double hStr, // double ksuStr, // long bitVector, // BSTR s // );
让我们
分析ksText方法
的参数。 我们在上一节中讨论了锚点。
ang参数设置文本行和水平线之间的角度(以度为单位)。 角度是逆时针计数的。 下图显示了以
45°角绘制的线。
45°弦hStr参数以毫米为单位设置字符串字符的大小。 如果此参数的值
为零 ,则使用默认大小。
ksuStr参数指定文本的拉伸(缩小)。 下图显示了几行带有不同
ksuStr参数值的行。
具有不同拉伸值的多行从该图可以看出,“拉伸0”等同于“拉伸1”,即没有任何拉伸。
bitVector参数包含一组确定字符样式的标志。 下表列出了有效的标志。
字符标志表实际上,还有其他有效的标志,但是它们的工作仅出现在复杂的复合字符串的构造中。 在下一课中,我们将考虑其中的一些。
请记住-输出字符串不应包含
@ ,
$ ,
& ,
〜 ,
^和
#字符,因为它们是控制字符。 在本周期的下一课中,我们将讨论与他们合作。
如果成功,则
ksText方法将返回一个指向文本的整数指针。 例如,可以将该指针传递给
ksSetTextAlign方法,以更改文本相对于锚点的位置。 如果发生错误,则
ksText方法返回
零 。
例子
下面是一个示例程序,演示了使用
ksText方法输出字符串的方法。
// BSTR str = SysAllocString(L""); long itext; itext = Document2D->ksText(100, 100, // 0, // 11, // 0, // 0, // str); SysFreeString(str); // Document2D->ksSetTextAlign(itext, txta_Left); Document2D.Unbind(); // kompas->Visible = true; kompas.Unbind();
为了简单起见,在此示例中省略了负责创建和执行文档的代码。 作为该程序的结果,在文档中显示文本
“ String” 。
文字大小
在文档中显示文本时,知道需要多少空间很有用。 文本高度由
ksText方法的
hStr参数设置。 但是其长度直接取决于输出字符串。
要确定它,请使用
ksDocument2D接口的
ksGetTextLengthFromReference方法。 此方法只有一个参数-指向文本的整数指针。 它返回以毫米为单位的文本长度。
ksGetTextLengthFromReference方法不方便,因为它不允许您在将行输出到文档之前确定行的长度。 要确定尚未输出到文档的字符串的长度,您需要使用
ksGetTextLength方法。 但是在考虑之前,让我们先谈一下样式。
文字样式
KOMPAS系统为文档中显示的文本预定义了几种样式。 每个样式都有一个整数。 下表列出了最常用的样式。
常用文字样式该表中未提供所有样式:仅其中一部分。 可用常量的完整列表可
在 KOMPAS文档
中的“参数结构和常量\常量\文本常量\系统文本样式”页面上找到。
KsGetTextLength方法
通过
ksDocument2D接口的
ksGetTextLength方法,可以在将字符串输出到文档之前确定其长度。 下面是此方法的原型。
double ksGetTextLength ( BSTR text, // long style // );
该方法返回以毫米为单位的字符串长度。 请注意:该方法接受字符串本身作为参数,而不是指向“文本”对象的指针。 这样,您可以在将行输出到文档之前评估行的大小。
例子
考虑使用
ksGetTextLength方法的示例。 假设我们有一条线,我们需要将其放置在一定长度的矩形中(此任务在段落的帮助下更容易解决,但在下一课中会涉及到它们)。 如果该行适合,则显示为完整。 如果不是,则将其切除并在其末尾放置省略号。 下面是解决此问题的程序的源代码。
const wchar_t FULLSTR[] = L" ! ! !"; const wchar_t DOTS[] = L"..."; const long STYLE = 1; double maxSize = 100.0; BSTR str = SysAllocString(FULLSTR); if(Document2D->ksGetTextLength(str, STYLE) > maxSize) { // BSTR str_dots = SysAllocString(DOTS); double size_dots = Document2D->ksGetTextLength(str_dots, STYLE); SysFreeString(str_dots); // maxSize -= size_dots; SysReAllocStringLen(&str, str, SysStringLen(str) - 4); // , while(Document2D->ksGetTextLength(str, STYLE) > maxSize) SysReAllocStringLen(&str, str, SysStringLen(str) - 1); // size_t len = SysStringLen(str); SysFreeString(str); // wchar_t *p = new wchar_t[len + wcslen(DOTS) + 1]; wcsncpy(p, FULLSTR, len); p[len] = L'\0'; wcscat(p, DOTS); str = SysAllocString(p); delete [] p; } // Document2D->ksText(100, 100, // 0, // 0, // 0, // 0, // str); // SysFreeString(str); Document2D.Unbind(); // kompas->Visible = true; kompas.Unbind();
源字符串在
FULLSTR常量中指定。 变量
maxSize设置要在其中输入字符串的矩形的长度。 稍后指定该值,从中减去省略号,该大小存储在
size_dots变量中。 如果该行不适合,则从该行中切除一个字符,直到它适合指定大小的矩形。 这发生在
while循环中 。
请注意非常重要的一点:输出字符串时,
ksText方法的所有参数(锚点的坐标除外)的值均为
零 。 事实是
ksGetTextLength方法对这些参数一无所知,因此在计算字符串长度时无法将它们考虑在内。 因此,如果字符串的输出使用
ksText方法的参数的非零值,则结果字符串长度可能与
ksGetTextLength方法获得的字符串长度不同。
结论在本课程中,我们学习了如何使用
ksText方法显示简单的文本标签。 这不是显示文本的唯一方法,而是最简单的方法。 在下一课中,我们将研究如何使用此方法输出此复合线。 接下来,我们将考虑更复杂的文本输出方法。
要继续,请关注博客新闻。
Sergey Norseev博士,《在Delphi中进行COMPAS的应用程序开发》一书的作者。