使用KOMPAS-3D API→第11课→简单文本标签

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




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


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

文字锚点


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的应用程序开发》一书的作者。

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


All Articles