Главная » Хабрахабр » Работа с API КОМПАС-3D → Урок 11 → Простые текстовые надписи

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

На предыдущих уроках цикла мы научились выводить текст в основную надпись. Сегодня поговорим о том, как выводить текст в сам документ. Мы рассмотрим простейшие примеры, а более сложные приемы покажем на следующих уроках.

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

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

Точка привязки текста

Текст в КОМПАСе всегда выводится относительно некоторой точки, которую называют точкой привязки. Текст может по-разному располагаться относительно нее. Для того, чтобы узнать расположение текста относительно точки привязки, используется метод ksGetTextAlign интерфейса ksDocument2D. Ниже приводится его прототип.

long ksGetTextAlign (
long pText //Указатель на текст
);

В качестве единственного параметра он принимает целочисленный указатель на объект «текст». Метод возвращает тип привязки, или -1 в случае ошибки. Допустимые типы привязок приведены в таблице ниже.


Таблица допустимых типов привязок

Ниже приводится его прототип. Для изменения привязки текста используется метод ksSetTextAlign интерфейса ksDocument2D.

long ksSetTextAlign (
long pText, //Указатель на объект «текст»
long align //Тип привязки
);

В случае успеха данный метод возвращает значение 1, а в случае ошибки – ноль.

Вывод текста

Для простого вывода текста используется метод ksText интерфейса ksDocument2D. Ниже приводится прототип данного метода.

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


Таблица флагов, определяющих начертание символов

Часть из них мы рассмотрим на следующем уроке.
Помните – выводимая строка не должна содержать символы @, $, &, ~, ^ и #, так как они являются управляющими символами. На самом деле, существуют и другие допустимые флаги, но их работа проявляется только при конструировании сложных составных строк. Этот указатель может быть передан, например, в метод ksSetTextAlign для изменения расположения текста относительно точки привязки. О работе с ними мы поговорим на следующих уроках нашего цикла.
В случае успеха метод ksText возвращает целочисленный указатель на текст. В случае ошибки метод 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();

Для простоты в данном примере опущен код, ответственный за создание и оформление документа. В результате работы этой программы в документ выводится текстовая надпись «Строка».

Размер текста

При выводе текста в документ полезно знать, сколько места он занимает. Высота текста задается параметром hStr метода ksText. А вот его длина напрямую зависит от выводимой строки.

У этого метода всего один параметр – целочисленный указатель на текст. Для ее определения используется метод ksGetTextLengthFromReference интерфейса ksDocument2D. Он возвращает длину текста в миллиметрах.

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

Стили текста

Система КОМПАС предопределяет несколько стилей для текстов, выводимых в документах. Каждому стилю соответствует целое число. Наиболее часто используемые стили – в таблице ниже.


Наиболее часто используемые стили текста

С полным перечнем доступных констант можно ознакомиться на странице «Структуры параметров и константы\Константы\Константы текста\Системные стили текста» документации КОМПАС. В данной таблице приведены не все стили: только их часть.

Метод ksGetTextLength

Метод ksGetTextLength интерфейса ksDocument2D позволяет определить длину строки до ее вывода в документ. Ниже – прототип этого метода.

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.

Дело в том, что метод ksGetTextLength ничего не знает об этих параметрах, поэтому не может учитывать их при расчете длины строки. Обратите внимание на очень важный момент: при выводе строки все параметры метода ksText (кроме координат точки привязки) имеют нулевое значение. Таким образом, если при выводе строки используются ненулевые значения параметров метода ksText, то результирующая длина строки может отличаться от той, что была получена методом ksGetTextLength.

Заключение

Это не единственный способ вывода текста, но, пожалуй, самый простой. На этом уроке мы научились выводить простые текстовые надписи с помощью метода ksText. А на последующих рассмотрим и более сложные методы вывода текста. На следующем уроке мы рассмотрим, как с помощью этого метода можно выводить сложные составные строки.

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

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


Оставить комментарий

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

*

x

Ещё Hi-Tech Интересное!

Пишем торговых роботов с помощью графического фреймворка StockSharp. Часть 1

Один из них – бесплатная платформа StockSharp, которую можно использовать для профессиональной разработки торговых терминалов и торговых роботов на языке C#. В нашем блоге мы много пишем о технологиях и полезных инструментах, связанных с биржевой торговлей. API, с целью создания ...

[Перевод] Сверхинтеллект: идея, не дающая покоя умным людям

Расшифровка выступления на конференции Web Camp Zagreb Мачея Цегловского, американского веб-разработчика, предпринимателя, докладчика и социального критика польского происхождения. В 1945 году, когда американские физики готовились к испытанию атомной бомбы, кому-то пришло в голову спросить, не может ли такое испытание зажечь ...