Тема: Как найти расстояние между буквами в AcGiTextStyle?
Собственно, название темы.
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → ObjectARX → Как найти расстояние между буквами в AcGiTextStyle?
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Собственно, название темы.
Наверное никак. Оно разное в зависимости от символов. К тому же если текст под наклоном... то вообще не понятно что это.
Зачем тебе это надо? Посчитать реальную ширину текста?
> KonstantinM
Нужно в строку добавить свой символ (например, диаметр).
Может расстояние между символами равняется ширине пробела поделить на 3 и что-то типа того?
А почему тебя не устраивает %%c? - Типа печатает символ диаметра в строке?
Т.е. типа Труба %%c15мм - Будет напечатана с символом диаметра в акаде.
Или принципиально париться именно со своим символов?
Если вопрос производительнсти не сильно критичен, то возможен следующий подход:
Скажем, есть строка "abc" - необходимо выяснить растояние между буквами 'b' и 'c'. Для этого нам необходимо вычислить ширину строк "abc", "ab", "c". Пусть у нас есть функция text_width(const char *), которая вычисляет длину ширину текста. Теперь, получаем искомое растояние
s = text_width("abc") - text_width("ab") - text_width("c").
Как реализовать функцию text_width смотрим здесь: https://www.caduser.ru/forum/topic22505.html
И получаем s < 0 :) :) :) :) :)
Если используешь метод text(), то %%c не проходит
:( а это чей метод?
Даже в команде text с консоли %%c переходит в знак диаметра.
Так чей метод text()?
> KonstantinM
AcGiGeometry
Если используешь метод text(), то %%c не проходит
Проходит, если AcGiTextStyle основан на шрифте, в котором символ диаметра определен (т.е. символ с номером 0x2205 есть и соответствует символу диаметра). Можешь вместо "%%c" использовать "\\U+2205".
> Александр Ривилис
Нужно выводить диаметр, независимо от того, есть ли он в шрифте
> JD
Тогда объясни потолковее.
Вот функция, которая позволяет вычислить интервал между конкретным символами в строке:
//------------------------------------------------------------ // Функция для переданного style вычисляет расстояние // между символами let1 и let2 //--------------------------------------------------------- static double GetLetterInterval(AcGiTextStyle *style, char let1, char let2) { style->loadStyleRec(); // На всякий случай char buf[2]; buf[0]=let1; buf[1]=let2; double w1 = style->extents(buf, false,1,false)[X]; double w2 = style->extents(buf+1,false,1,false)[X]; double w3 = style->extents(buf, false,2,false)[X]; return(w3-w1-w2); } // // Функция для проверки работоспособности GetLetterInterval // static void TestGetLetterInterval(void) { // Используем текущий стиль и текущую высоту текста // в чертеже для определения расстояния между буквами. AcGiTextStyle MyStyle; Acad::ErrorStatus es; AcDbObjectId idStyle = acdbCurDwg()->textstyle(); double dTextSize = acdbCurDwg()->textsize(); if ((es = fromAcDbTextStyle(MyStyle,idStyle)) != Acad::eOk) { acutPrintf("\nОшибка fromAcDbTextStyle(MyStyle,idStyle): %s",acadErrorStatusText(es)); return; } if (dTextSize > 1e-6) MyStyle.setTextSize(dTextSize); acutPrintf("\nОпределение интервала между символами в строке..."); char buf1[256],buf2[256]; if (acedGetString(TRUE,"\nУкажите первый символ: ",buf1) == RTNORM && acedGetString(TRUE,"\nУкажите второй символ: ",buf2) == RTNORM) acutPrintf("\nРасстояние между буквами: %g",GetLetterInterval(&MyStyle,buf1[0],buf2[0])); }
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → ObjectARX → Как найти расстояние между буквами в AcGiTextStyle?
Форум работает на PunBB, при поддержке Informer Technologies, Inc