Работа с API КОМПАС-3D → Урок 12 → Составные строки

от автора

На предыдущем уроке мы рассмотрели отображение простых строк. На этом поговорим о формировании составных строк, включающих в себя отклонения и дроби. Формировать такие строки мы будем с помощью метода ksText, который изучили ранее. Строго говоря, данный метод не предназначен для вывода сложных строк. Тем не менее на сегодняшнем уроке мы познакомимся с рядом флагов, которые играют ключевую роль при формировании составных строк.

Содержание цикла уроков «Работа с API КОМПАС-3D»

  1. Основы
  2. Оформление чертежа
  3. Корректное подключение к КОМПАС
  4. Основная надпись
  5. Графические примитивы
  6. Сохранение документа в различные форматы
  7. Знакомство с настройками
  8. Более сложные методы записи в основную надпись
  9. Чтение ячеек основной надписи
  10. Спецсимволы, включающие строку
  11. Простые текстовые надписи
  12. Составные строки

Хотя описываемые методы построения отклонений и дробей являются недокументированными, они, как показывают мои эксперименты, исправно работают на современных версиях КОМПАС (проверял на 15, 16 и 17). Но это поведение может быть изменено в следующих версиях.
«Правильные» методы построения составных строк будут описаны в следующих уроках.

Курсивное, полужирное и подчеркнутое начертание

Управление курсивным, полужирным и подчеркнутым начертанием осуществляется флагами, приведенными в таблице ниже. Они объявлены в заголовочном файле ldefin2d.h.

В методе ksText действие каждого из этих флагов ограничено вызовом этого метода. Ниже приводится пример программы, демонстрирующей вывод строк с различным начертанием.

Document2D->ksText(100, 100, 0, 0, 0, 0           , SysAllocString(L"Обычный текст")); Document2D->ksText(100,  90, 0, 0, 0, ITALIC_OFF  , SysAllocString(L"Текст без наклона")); Document2D->ksText(100,  80, 0, 0, 0, BOLD_ON     , SysAllocString(L"Полужирный текст")); Document2D->ksText(100,  70, 0, 0, 0, UNDERLINE_ON, SysAllocString(L"Подчеркнутый текст")); 

Для простоты в данном примере опущен код, ответственный за создание и оформление документа (эта тема рассматривалась на прошлых уроках), а также за освобождение ресурсов (в том числе после вызова функции SysAllocString).
Обратите внимание: по умолчанию КОМПАС выводит текст курсивом. Поэтому для отмены курсивного начертания мы используем флаг ITALIC_OFF. На рисунке ниже показаны строки, выведенные данной программой.

Одновременное использование парных флагов (например, BOLD_ON и BOLD_OFF) никак не влияет на отображение строки. Она выводится так, как выводилась бы, если бы ни один из этих флагов не был установлен.

Верхнее и нижнее отклонения

Верхнее и нижнее отклонения задаются с помощью флагов, приведенных в таблице ниже.

Ниже приводится пример программы, демонстрирующей вывод строки, содержащей верхнее и нижнее отклонения.

double x = 100.0; double y = 100.0;  BSTR str = SysAllocString(L"Текст до отклонения"); long itext = Document2D->ksText(x, y, 0, 0, 0, 0, str); SysFreeString(str); x += Document2D->ksGetTextLengthFromReference(itext) + 2.0;  str = SysAllocString(L"Верхнее отклонение"); itext = Document2D->ksText(x, y, 0, 0, 0, UPPER_DEVIAT, str); SysFreeString(str);  double dx1 =  Document2D->ksGetTextLengthFromReference(itext);  str = SysAllocString(L"Нижнее отклонение"); itext = Document2D->ksText(x, y, 0, 0, 0, LOWER_DEVIAT, str); SysFreeString(str);  double dx2 = Document2D->ksGetTextLengthFromReference(itext);  x += max(dx1, dx2);  str = SysAllocString(L"Текст после отклонений"); Document2D->ksText(x, y, 0, 0, 0, 0, str); SysFreeString(str); 

В данном примере мы каждый раз пересчитываем координаты точек привязок выводимых строк, чтобы знать, куда их выводить. Для этого используется метод ksGetTextLengthFromReference, описанный на предыдущем уроке. Обратите внимание: пересчитывается только горизонтальная координата, вертикальная не меняется. КОМПАС сам определяет нужное смещение строк по вертикали. На рисунке ниже показана составная строка, сформированная этой программой.

Дробь

Отрисовка дроби задается флагами, перечисленными в таблице ниже.

Ниже приводится пример программы, демонстрирующей вывод дроби в текстовую строку.

double x = 100.0; double y = 100.0;  BSTR str = SysAllocString(L"Текст до дроби"); long itext = Document2D->ksText(x, y, 0, 0, 0, 0, str); SysFreeString(str); x += Document2D->ksGetTextLengthFromReference(itext) + 2.0;  str = SysAllocString(L"Числитель"); itext = Document2D->ksText(x, y, 0, 0, 0, NUMERATOR, str); SysFreeString(str);  double dx1 = Document2D->ksGetTextLengthFromReference(itext);  str = SysAllocString(L"Знаменатель"); itext = Document2D->ksText(x, y, 0, 0, 0, DENOMINATOR, str); SysFreeString(str);  double dx2 = Document2D->ksGetTextLengthFromReference(itext);  x += max(dx1, dx2);  str = SysAllocString(L"Текст после дроби"); Document2D->ksText(x, y, 0, 0, 0, 0, str); SysFreeString(str); 

Несложно заметить, что данный пример похож на предыдущий. Действительно, вывод отклонений и дроби различается только используемыми флагами. На рисунке ниже показан результат работы программы.

Заключение
На данном уроке мы рассмотрели вопрос создания составных строк с помощью метода ksText. Описанный здесь способ является недокументированным, поэтому вы не должны использовать его в своих приложениях. На следующих уроках мы подробно рассмотрим документированные способы создания составных строк. И там нам понадобятся флаги, с которыми мы сегодня познакомились.

Продолжение следует, следите за новостями блога.

Сергей Норсеев, к.т.н., автор книги «Разработка приложений под КОМПАС в Delphi».


ссылка на оригинал статьи https://habr.com/post/424509/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *