Тема: Как найти расстояние между буквами в AcGiTextStyle?

Собственно, название темы.

Re: Как найти расстояние между буквами в AcGiTextStyle?

Наверное никак. Оно разное в зависимости от символов. К тому же если текст под наклоном... то вообще не понятно что это.
Зачем тебе это надо? Посчитать реальную ширину текста?

Re: Как найти расстояние между буквами в AcGiTextStyle?

> KonstantinM
Нужно в строку добавить свой символ (например, диаметр).

Re: Как найти расстояние между буквами в AcGiTextStyle?

Может расстояние между символами равняется ширине пробела поделить на 3 и что-то типа того?

Re: Как найти расстояние между буквами в AcGiTextStyle?

А почему тебя не устраивает %%c? - Типа печатает символ диаметра в строке?
Т.е. типа Труба %%c15мм - Будет напечатана с символом диаметра в акаде.
Или принципиально париться именно со своим символов?

Re: Как найти расстояние между буквами в AcGiTextStyle?

Если вопрос производительнсти не сильно критичен, то возможен следующий подход:
Скажем, есть строка "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

Re: Как найти расстояние между буквами в AcGiTextStyle?

И получаем s < 0 :) :) :) :) :)

Re: Как найти расстояние между буквами в AcGiTextStyle?

Если используешь метод text(), то %%c не проходит

Re: Как найти расстояние между буквами в AcGiTextStyle?

:( а это чей метод?

Re: Как найти расстояние между буквами в AcGiTextStyle?

Даже в команде text с консоли %%c переходит в знак диаметра.
Так чей метод text()?

Re: Как найти расстояние между буквами в AcGiTextStyle?

> KonstantinM
AcGiGeometry

Re: Как найти расстояние между буквами в AcGiTextStyle?

JD пишет:

Если используешь метод text(), то %%c не проходит

Проходит, если AcGiTextStyle основан на шрифте, в котором символ диаметра определен (т.е. символ с номером 0x2205 есть и соответствует символу диаметра). Можешь вместо "%%c" использовать "\\U+2205".

Re: Как найти расстояние между буквами в AcGiTextStyle?

> Александр Ривилис
Нужно выводить диаметр, независимо от того, есть ли он в шрифте

Re: Как найти расстояние между буквами в AcGiTextStyle?

> JD
Тогда объясни потолковее.

Re: Как найти расстояние между буквами в AcGiTextStyle?

Вот функция, которая позволяет вычислить интервал между конкретным символами в строке:

  //------------------------------------------------------------
  // Функция для переданного 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]));
  }