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

ADN Club => AutoCAD .NET API => Тема начата: Atomohod от 07-10-2018, 13:33:05

Название: Динамическое изменение ширины атрибута
Отправлено: Atomohod от 07-10-2018, 13:33:05
Здравствуйте!
Нужно установить атрибут блока, чтобы текст автоматически менял ширину в зависимости от своей длины. Поставил Justify в fit, после этого значение атрибута не отображается совсем. В чем я ошибаюсь?
Код - C# [Выбрать]
  1. internal override void DrawMark(string itemNumber, Transaction tr, BlockTable bt, BlockTableRecord btr)
  2.           {
  3.                Circle circle = new Circle( );
  4.                circle.Radius = 8;
  5.                circle.LineWeight = LineWeight.LineWeight060;
  6.                circle.Layer = "-10-ItemMarks";
  7.                btr.AppendEntity(circle);
  8.                tr.AddNewlyCreatedDBObject(circle, true);
  9.                using (AttributeDefinition itemNo = new AttributeDefinition( ))
  10.                {
  11.                     itemNo.SetDatabaseDefaults(bt.Database);
  12.                     itemNo.Verifiable = true;
  13.                     itemNo.Prompt = "Item Number";
  14.                     itemNo.Tag = "ItemNumber";
  15.                     itemNo.TextString = itemNumber;
  16.                     itemNo.WidthFactor = 0.8;
  17.                     itemNo.Height = 0.75 * circle.Radius;
  18.                     itemNo.Justify = AttachmentPoint.BaseFit;
  19.                     itemNo.Position = new Point3d(0, 0, 0);
  20.                     itemNo.AlignmentPoint = new Point3d(0, 0, 0);
  21.                     itemNo.AdjustAlignment(bt.Database);
  22.                     itemNo.Layer = "0";
  23.                     btr.AppendEntity(itemNo);
  24.                }
  25.           }
Название: Re: Динамическое изменение ширины атрибута
Отправлено: Александр Ривилис от 07-10-2018, 13:59:38
Atomohod,
Исправь форматирование кода.
Название: Re: Динамическое изменение ширины атрибута
Отправлено: Александр Ривилис от 07-10-2018, 16:45:26
В чем я ошибаюсь?
Ошибаешься в понимании того:
1. Что такое выравнивание AttachmentPoint.BaseFit.
2. Что такое когда совпадают Position и AlignmentPoint.
У меня такое впечатление, что тебе нужно выравнивание по центру: BottomMid или MiddleMid
Название: Re: Динамическое изменение ширины атрибута
Отправлено: Вильдар от 07-10-2018, 17:40:17
Да, для однострочного текста выравнивание по ширине бессмысленно, т.к. у него нет свойства ширины.
После создания блока и атрибута, можно вычислить сужение текста по GeometricExtents, но для этого нужно создать временный AttributeReference  :o, вот пример:
Извините, вам запрещён просмотр содержимого спойлеров.

AttributeDefinition должен быть добавлен в базу чертежа.
Только, начальный WidthFactor = 1 сделать нужно.
Название: Re: Динамическое изменение ширины атрибута
Отправлено: Александр Ривилис от 07-10-2018, 17:49:30
Да, для однострочного текста выравнивание по ширине бессмысленно, т.к. у него нет свойства ширины.
Свойства нет. Но если у него выравнивание AttachmentPoint.BaseFit, то ширина - это расстояние между Position и AlignmentPoint:

(https://farm2.staticflickr.com/1955/43343353290_1cbe5a50f5_o.png)

Название: Re: Динамическое изменение ширины атрибута
Отправлено: Вильдар от 07-10-2018, 17:53:48
О, вот это круто. Спасибо.
Название: Re: Динамическое изменение ширины атрибута
Отправлено: Александр Ривилис от 07-10-2018, 17:59:05
О, вот это круто. Спасибо.
Хм. Ну это же азы...
Название: Re: Динамическое изменение ширины атрибута
Отправлено: Вильдар от 07-10-2018, 18:01:23
Так азы эти познаются, только боем. Нигде не описаны.
Название: Re: Динамическое изменение ширины атрибута
Отправлено: Вильдар от 07-10-2018, 18:08:46
Да, и выравнивание по ширине, нельзя задать для однострочного текста в интерфейсе самого автокада. Выдает ошибку.
Название: Re: Динамическое изменение ширины атрибута
Отправлено: Александр Ривилис от 07-10-2018, 18:22:26
Да, и выравнивание по ширине, нельзя задать для однострочного текста в интерфейсе самого автокада. Выдает ошибку.
Это как? Что-то ты недоговариваешь...
А это что?

Название: Re: Динамическое изменение ширины атрибута
Отправлено: Вильдар от 07-10-2018, 18:31:02
Для однострочного текста выбираю выравнивание по ширине и выдает такую ошибку:
(https://i.postimg.cc/5Y6YYvQk/Clipboard01.jpg) (https://postimg.cc/5Y6YYvQk)
В атрибуте блока, тоже нельзя задать выравнивание по ширине.
Название: Re: Динамическое изменение ширины атрибута
Отправлено: Александр Ривилис от 07-10-2018, 18:36:44
Для однострочного текста выбираю выравнивание по ширине и выдает такую ошибку:
(https://i.postimg.cc/5Y6YYvQk/Clipboard01.jpg) (https://postimg.cc/5Y6YYvQk)
В атрибуте блока, тоже нельзя задать выравнивание по ширине.

Похоже на баг. Возможно это связано с аннототивностью текста/текстового стиля.
Название: Re: Динамическое изменение ширины атрибута
Отправлено: Александр Ривилис от 07-10-2018, 18:42:42
Вот так в русском AutoCAD 2019:

Название: Re: Динамическое изменение ширины атрибута
Отправлено: Вильдар от 07-10-2018, 18:43:54
Да, точно, если стиль аннотативный, то сходу не дает менять выранивание по ширине.  :(
Название: Re: Динамическое изменение ширины атрибута
Отправлено: Atomohod от 07-10-2018, 21:22:27
У меня такое впечатление, что тебе нужно выравнивание по центру: BottomMid или MiddleMid
Не совсем. выравнивание по центру быть должно, но данные записываемые в атрибут, разной длины от 5 до 15 символов, и нужно чтобы они всегда влезали в жестко заданный круг.
Название: Re: Динамическое изменение ширины атрибута
Отправлено: Александр Ривилис от 07-10-2018, 21:51:04
У меня такое впечатление, что тебе нужно выравнивание по центру: BottomMid или MiddleMid
Не совсем. выравнивание по центру быть должно, но данные записываемые в атрибут, разной длины от 5 до 15 символов, и нужно чтобы они всегда влезали в жестко заданный круг.
А что при этом будет с высотой текста? Есть Fit и тогда высота не меняется, а меняется степень сжатия. Есть Align и тогда в зависимости от длины текста меняется высота. Что-то из этого тебя устраивает?
Название: Re: Динамическое изменение ширины атрибута
Отправлено: Atomohod от 08-10-2018, 20:26:43
Есть Fit и тогда высота не меняется, а меняется степень сжатия. Есть Align и тогда в зависимости от длины текста меняется высота. Что-то из этого тебя устраивает?
Мне как раз нужно динамическое изменение сжатия, высоту менять нельзя.
Название: Re: Динамическое изменение ширины атрибута
Отправлено: Александр Ривилис от 08-10-2018, 20:35:40
Есть Fit и тогда высота не меняется, а меняется степень сжатия. Есть Align и тогда в зависимости от длины текста меняется высота. Что-то из этого тебя устраивает?
Мне как раз нужно динамическое изменение сжатия, высоту менять нельзя.
Ну так используй MiddleFit, только задай правильные Position и AlignmentPoint. Они не должны совпадать.
Название: Re: Динамическое изменение ширины атрибута
Отправлено: Александр Ривилис от 08-10-2018, 20:39:01
Что-нибудь (в твоём коде):
Код - C# [Выбрать]
  1. itemNo.Position = new Point3d(-0.75 * circle.Radius, 0, 0);
  2. itemNo.AlignmentPoint = new Point3d(0.75 * circle.Radius, 0, 0);