На предыдущем уроке мы рассмотрели отображение простых строк. На этом поговорим о формировании составных строк, включающих в себя отклонения и дроби. Формировать такие строки мы будем с помощью метода ksText, который изучили ранее. Строго говоря, данный метод не предназначен для вывода сложных строк. Тем не менее на сегодняшнем уроке мы познакомимся с рядом флагов, которые играют ключевую роль при формировании составных строк.
Хотя описываемые методы построения отклонений и дробей являются недокументированными, они, как показывают мои эксперименты, исправно работают на современных версиях КОМПАС (проверял на 15, 16 и 17). Но это поведение может быть изменено в следующих версиях.
«Правильные» методы построения составных строк будут описаны в следующих уроках.
Управление курсивным, полужирным и подчеркнутым начертанием осуществляется флагами, приведенными в таблице ниже. Они объявлены в заголовочном файле ldefin2d.h.
В методе ksText действие каждого из этих флагов ограничено вызовом этого метода. Ниже приводится пример программы, демонстрирующей вывод строк с различным начертанием.
Для простоты в данном примере опущен код, ответственный за создание и оформление документа (эта тема рассматривалась на прошлых уроках), а также за освобождение ресурсов (в том числе после вызова функции SysAllocString).
Обратите внимание: по умолчанию КОМПАС выводит текст курсивом. Поэтому для отмены курсивного начертания мы используем флаг ITALIC_OFF. На рисунке ниже показаны строки, выведенные данной программой.
Одновременное использование парных флагов (например, BOLD_ON и BOLD_OFF) никак не влияет на отображение строки. Она выводится так, как выводилась бы, если бы ни один из этих флагов не был установлен.
Верхнее и нижнее отклонения задаются с помощью флагов, приведенных в таблице ниже.
Ниже приводится пример программы, демонстрирующей вывод строки, содержащей верхнее и нижнее отклонения.
В данном примере мы каждый раз пересчитываем координаты точек привязок выводимых строк, чтобы знать, куда их выводить. Для этого используется метод ksGetTextLengthFromReference, описанный на предыдущем уроке. Обратите внимание: пересчитывается только горизонтальная координата, вертикальная не меняется. КОМПАС сам определяет нужное смещение строк по вертикали. На рисунке ниже показана составная строка, сформированная этой программой.
Отрисовка дроби задается флагами, перечисленными в таблице ниже.
Ниже приводится пример программы, демонстрирующей вывод дроби в текстовую строку.
Несложно заметить, что данный пример похож на предыдущий. Действительно, вывод отклонений и дроби различается только используемыми флагами. На рисунке ниже показан результат работы программы.
Заключение
На данном уроке мы рассмотрели вопрос создания составных строк с помощью метода ksText. Описанный здесь способ является недокументированным, поэтому вы не должны использовать его в своих приложениях. На следующих уроках мы подробно рассмотрим документированные способы создания составных строк. И там нам понадобятся флаги, с которыми мы сегодня познакомились.
Продолжение следует, следите за новостями блога.
Сергей Норсеев, к.т.н., автор книги «Разработка приложений под КОМПАС в Delphi».
Содержание цикла уроков «Работа с API КОМПАС-3D»
- Основы
- Оформление чертежа
- Корректное подключение к КОМПАС
- Основная надпись
- Графические примитивы
- Сохранение документа в различные форматы
- Знакомство с настройками
- Более сложные методы записи в основную надпись
- Чтение ячеек основной надписи
- Спецсимволы, включающие строку
- Простые текстовые надписи
- Составные строки
Хотя описываемые методы построения отклонений и дробей являются недокументированными, они, как показывают мои эксперименты, исправно работают на современных версиях КОМПАС (проверял на 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».
bypeso
Возможно вы знаете, почему наложение флагов нейтрализует их? Это несколько не здраво
kompas_3d Автор
Если текст создать через 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 );