ADN Open CIS
Сообщество программистов Autodesk в СНГ

08/03/2014

Выравнивание выноски текстовой метки

Вопрос: Мне нужно создать текстовую метку с выноской, загнутой под прямым углом. Для создания текстовой метке и использую метод NewTextNote и задаю месторасположение метки месторасположение поворота выноски на одной высоте для того чтобы сегмент выноски располагался горизонтально.

Но, почему-то текст оказывается немного смещенным вниз и угол выноски получается не прямым:

 

Как видно из скриншота, текст смещен вниз, относительно горизонтального сегмента выноски.

В своей тестовой надстройке я получил такое результат, выбирая точки окончания выноски, точку сгиба и позицию текстовой метки.

Как можно сделать второй сегмент выноски горизонтальным?

Ответ 1: Решение для создания второго сегмента выноски в горизонтальном положении представлено ниже в виде кода:

Код - C#: [Выделить]
  1.                 // Сперва создаем тектовую метку без выноски
  2.  
  3.                 TextNote text = doc.Create.NewTextNote(
  4.                     view, ptTextOrigin, baseVec, ptVec,
  5.                     lineWidth, textAlign, "ADN-CIS");
  6.  
  7.                 // Создаем выноску для созданной текстовой метки:
  8.                 // Меняем изгиб и конечную точку;
  9.                 // Обратите внимание, кордината Y не должна меняться
  10.                 // для того чтобы сегомент оставался горизонтальным!
  11.  
  12.                 if (bLeader)
  13.                 {
  14.                     Leader noteLeader = text.AddLeader(
  15.                       TextNoteLeaderTypes.TNLT_STRAIGHT_R);
  16.  
  17.                     // Используем значение Y по умолчанию!
  18.  
  19.                     noteLeader.Elbow = new XYZ(point1.X,
  20.                       noteLeader.Elbow.Y, point1.Z);
  21.  
  22.                     noteLeader.End = point1;
  23.                 }

Но, это решение создает новую проблему: указанная точка сгиба выноски теперь не учитывается при создании метки с выноской.

Ответ 2: Вы можете скомбинировать перечисления, задающие выравнивание текста, с помощью побитового ИЛИ.

В вашем первоначальном коде вы используете:

Код - C#: [Выделить]
  1.   TextAlignFlags textAlign
  2.     = TextAlignFlags.TEF_ALIGN_CENTER;

Попробуйте вместо этого использовать такой код:

Код - C#: [Выделить]
  1.   TextAlignFlags textAlign
  2.     = TextAlignFlags.TEF_ALIGN_MIDDLE
  3.     | TextAlignFlags.TEF_ALIGN_CENTER;

В этом случае результат близок к горизонтальному:

Ответ: Я применил оба решения и в результате получил то что хотел.

Вот код, который у меня в итоге получился:

Код - C#: [Выделить]
  1.             XYZ leaderOrigin = uidoc.Selection.PickPoint(
  2.                 "Выберите конечную точку выноски");
  3.  
  4.             //XYZ leaderElbow = uidoc.Selection.PickPoint(
  5.             //  "Выберите точку сгиба");
  6.  
  7.             XYZ ptTextOrigin = uidoc.Selection.PickPoint(
  8.               "Выберите месторасположение метки");
  9.  
  10.             using (Transaction tr = new Transaction(doc))
  11.             {
  12.                 tr.Start("Создание текстовой метки");
  13.  
  14.                 XYZ baseVec = XYZ.BasisX;
  15.                 XYZ upVec = XYZ.BasisY;
  16.  
  17.                 double lineWidth = 0.06;
  18.  
  19.                 //TextAlignFlags textAlign
  20.                 //  = TextAlignFlags.TEF_ALIGN_CENTER;
  21.  
  22.                 //TextAlignFlags textAlign
  23.                 //  = TextAlignFlags.TEF_ALIGN_MIDDLE
  24.                 //  | TextAlignFlags.TEF_ALIGN_CENTER;
  25.  
  26.                 TextAlignFlags textAlign
  27.                   = TextAlignFlags.TEF_ALIGN_MIDDLE
  28.                   | TextAlignFlags.TEF_ALIGN_RIGHT;
  29.  
  30.                 string strText = "ADN-CIS";
  31.  
  32.                 // Сперва создаем тектовую метку без выноски
  33.  
  34.                 TextNote text = doc.Create.NewTextNote(
  35.                   view, ptTextOrigin, baseVec, baseVec,
  36.                   lineWidth, textAlign, strText);
  37.  
  38.                 // Создаем выноску для созданной текстовой метки:
  39.                 // Меняем изгиб и конечную точку;
  40.                 // Обратите внимание, кордината Y не должна меняться
  41.                 // для того чтобы сегомент оставался горизонтальным!
  42.  
  43.                 Leader noteLeader = text.AddLeader(
  44.                   TextNoteLeaderTypes.TNLT_STRAIGHT_R);
  45.  
  46.                 // Используем значение Y по умолчанию!
  47.  
  48.                 noteLeader.Elbow = new XYZ(leaderOrigin.X,
  49.                   noteLeader.Elbow.Y, leaderOrigin.Z);
  50.  
  51.                 noteLeader.End = leaderOrigin;
  52.  
  53.                 tr.Commit();
  54.             }

 

Источник: http://thebuildingcoder.typepad.com/blog/2014/02/textnote-leader-alignment.html

Обсуждение: http://adn-cis.org/forum/index.php?topic=596

Опубликовано 08.03.2014