На предыдущем уроке мы рассмотрели отображение простых строк. На этом поговорим о формировании составных строк, включающих в себя отклонения и дроби. Формировать такие строки мы будем с помощью метода 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».

Комментарии (2)


  1. bypeso
    27.09.2018 16:30

    Возможно вы знаете, почему наложение флагов нейтрализует их? Это несколько не здраво


    1. kompas_3d Автор
      27.09.2018 16:30

      Если текст создать через Paragraph или TextEx
      как в функции DrawText() из примеров SDK
      как в SDK\Samples\C++\Visualc\step3\step3.cpp
      или в SDK\Samples\C++\CBUILDERAUTO\step3\step3.cpp,
      то там используется комбинации флагов:

      font->SetBitVectorValue( END_FRACTION, true );
      font->SetBitVectorValue( BOLD_OFF, true );
      font->SetBitVectorValue( ITALIC_OFF, true );