Выравнивание выноски текстовой метки
Вопрос: Мне нужно создать текстовую метку с выноской, загнутой под прямым углом. Для создания текстовой метке и использую метод NewTextNote и задаю месторасположение метки месторасположение поворота выноски на одной высоте для того чтобы сегмент выноски располагался горизонтально.
Но, почему-то текст оказывается немного смещенным вниз и угол выноски получается не прямым:
Как видно из скриншота, текст смещен вниз, относительно горизонтального сегмента выноски.
В своей тестовой надстройке я получил такое результат, выбирая точки окончания выноски, точку сгиба и позицию текстовой метки.
Как можно сделать второй сегмент выноски горизонтальным?
Ответ 1: Решение для создания второго сегмента выноски в горизонтальном положении представлено ниже в виде кода:
- // Сперва создаем тектовую метку без выноски
- TextNote text = doc.Create.NewTextNote(
- view, ptTextOrigin, baseVec, ptVec,
- lineWidth, textAlign, "ADN-CIS");
- // Создаем выноску для созданной текстовой метки:
- // Меняем изгиб и конечную точку;
- // Обратите внимание, кордината Y не должна меняться
- // для того чтобы сегомент оставался горизонтальным!
- if (bLeader)
- {
- Leader noteLeader = text.AddLeader(
- TextNoteLeaderTypes.TNLT_STRAIGHT_R);
- // Используем значение Y по умолчанию!
- noteLeader.Elbow = new XYZ(point1.X,
- noteLeader.Elbow.Y, point1.Z);
- noteLeader.End = point1;
- }
Но, это решение создает новую проблему: указанная точка сгиба выноски теперь не учитывается при создании метки с выноской.
Ответ 2: Вы можете скомбинировать перечисления, задающие выравнивание текста, с помощью побитового ИЛИ.
В вашем первоначальном коде вы используете:
- TextAlignFlags textAlign
- = TextAlignFlags.TEF_ALIGN_CENTER;
Попробуйте вместо этого использовать такой код:
- TextAlignFlags textAlign
- = TextAlignFlags.TEF_ALIGN_MIDDLE
- | TextAlignFlags.TEF_ALIGN_CENTER;
В этом случае результат близок к горизонтальному:
Ответ: Я применил оба решения и в результате получил то что хотел.
Вот код, который у меня в итоге получился:
- XYZ leaderOrigin = uidoc.Selection.PickPoint(
- "Выберите конечную точку выноски");
- //XYZ leaderElbow = uidoc.Selection.PickPoint(
- // "Выберите точку сгиба");
- XYZ ptTextOrigin = uidoc.Selection.PickPoint(
- "Выберите месторасположение метки");
- using (Transaction tr = new Transaction(doc))
- {
- tr.Start("Создание текстовой метки");
- XYZ baseVec = XYZ.BasisX;
- XYZ upVec = XYZ.BasisY;
- double lineWidth = 0.06;
- //TextAlignFlags textAlign
- // = TextAlignFlags.TEF_ALIGN_CENTER;
- //TextAlignFlags textAlign
- // = TextAlignFlags.TEF_ALIGN_MIDDLE
- // | TextAlignFlags.TEF_ALIGN_CENTER;
- TextAlignFlags textAlign
- = TextAlignFlags.TEF_ALIGN_MIDDLE
- | TextAlignFlags.TEF_ALIGN_RIGHT;
- string strText = "ADN-CIS";
- // Сперва создаем тектовую метку без выноски
- TextNote text = doc.Create.NewTextNote(
- view, ptTextOrigin, baseVec, baseVec,
- lineWidth, textAlign, strText);
- // Создаем выноску для созданной текстовой метки:
- // Меняем изгиб и конечную точку;
- // Обратите внимание, кордината Y не должна меняться
- // для того чтобы сегомент оставался горизонтальным!
- Leader noteLeader = text.AddLeader(
- TextNoteLeaderTypes.TNLT_STRAIGHT_R);
- // Используем значение Y по умолчанию!
- noteLeader.Elbow = new XYZ(leaderOrigin.X,
- noteLeader.Elbow.Y, leaderOrigin.Z);
- noteLeader.End = leaderOrigin;
- tr.Commit();
- }
Источник: http://thebuildingcoder.typepad.com/blog/2014/02/textnote-leader-alignment.html
Обсуждение: http://adn-cis.org/forum/index.php?topic=596
Опубликовано 08.03.2014