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

ADN Club => AutoCAD .NET API => Тема начата: power_factor от 12-03-2023, 01:58:55

Название: Типы значений, сохраняемые в атрибутах блоков
Отправлено: power_factor от 12-03-2023, 01:58:55
Добрый день!
Не являюсь программистом и только начал изучать AutoCAD . NET. Прошу прояснить вопрос по типам данных для атрибутов блоков.
Если я задаю значение атрибута блока:
- равное 10, то оно будет сохранено как int?
- равное 10.01, то оно будет сохранено как double?
- равное asdf, то оно будет сохранено как string?
- равное s, то оно всё равно будет сохранено как string, а не как char, так как тип char AutoCAD не поддерживается?
Если я присваиваю в значение атрибута блока результат сложений/вычитания/умножений/деления значений атрибутов других блоков, то:
- int и int даст int?
- int и double, double и double даст double?
- всё остальное (например, int и string) даст ошибку/исключение?
Скачал и установил утилиту MGDDBG, но не нашёл, где это можно посмотреть. Спасибо.
Название: Re: Типы значений, сохраняемые в атрибутах блоков
Отправлено: Александр Ривилис от 12-03-2023, 02:05:46
Атрибутом блока может быть только строка (string) длиной до 255 символов.
Название: Re: Типы значений, сохраняемые в атрибутах блоков
Отправлено: avc от 12-03-2023, 04:54:16
Достаточно заметить, что предком объекта AttributeDefinition является DBText - и уже понятно, что ни о каких типах значения речи не может быть. Текст - он и есть текст. И значения вы присваиваете свойству TextString типа string. Что, впрочем, не мешает пытаться парсить эти тексты как double или как int...

Но я подозреваю, что вы возможно хотели спросить не про атрибуты, а про параметры динамических блоков. Вот там все интересней...
Название: Re: Типы значений, сохраняемые в атрибутах блоков
Отправлено: power_factor от 12-03-2023, 18:16:04
Я говорю именно про атрибуты.
Когда я создаю блок № 1 с атрибутом = 10 и блок № 2 с атрибутом = 10, то если я вставлю поля со значениями этих атрибутов в ячейки таблицы, а затем суммирую эти ячейки, то получаю значение 20.
Когда же я создаю блок № 1 с атрибутом = 10, а блок № 2 с атрибутом = 10.0, то, суммируя поля в таблице, я получаю значение 20.000000, с которым также дальше могу производить иные вычисления именно как с числом.
Если атрибуты являются строками, то не могу понять, как это работает.

Этот же вопрос относится и к Custom properties. Собственно, вопрос этот возник из-за них. Следующий код не работает:
Код - C# [Выбрать]
  1. [CommandMethod("MyGroup", "MyCommand", "MyCommandLocal", CommandFlags.Modal)]
  2.         public void MyCommand()
  3.         {
  4.             Document myDoc = Application.DocumentManager.MdiActiveDocument;
  5.             Database myDB = myDoc.Database;
  6.             DatabaseSummaryInfoBuilder myInfoBuilder = new DatabaseSummaryInfoBuilder(myDB.SummaryInfo);
  7.             myInfoBuilder.CustomPropertyTable.Add("Exapmle", 0.123);
  8.             myDB.SummaryInfo = myInfoBuilder.ToDatabaseSummaryInfo();
  9.         }

При вводе МYCOMMAND AutoCAD пишет "The value "0.123" in not of type "System.String" and cannot be used in thes generic collection."

Следующий код уже работает:
Код - C# [Выбрать]
  1. [CommandMethod("MyGroup", "MyCommand", "MyCommandLocal", CommandFlags.Modal)]
  2.         public void MyCommand()
  3.         {
  4.             Document myDoc = Application.DocumentManager.MdiActiveDocument;
  5.             Database myDB = myDoc.Database;
  6.             DatabaseSummaryInfoBuilder myInfoBuilder = new DatabaseSummaryInfoBuilder(myDB.SummaryInfo);
  7.             myInfoBuilder.CustomPropertyTable.Add("Exapmle", "0.123");
  8.             myDB.SummaryInfo = myInfoBuilder.ToDatabaseSummaryInfo();
  9.         }

То есть здесь "0.123" - это строка, но при вставке этого значения в таблицу полем, работать с ним можно как с обычным числом.
Название: Re: Типы значений, сохраняемые в атрибутах блоков
Отправлено: Александр Ривилис от 12-03-2023, 19:04:32
Ты путаешь разные понятия. Атрибут - это атрибут, поле - это поле. Атрибут это в любом случае строка. Другое дело, что поля в атрибуте могут использоваться для ряда операций (в частности для суммирования), если формат строки позволит выполнять эти операции.
Название: Re: Типы значений, сохраняемые в атрибутах блоков
Отправлено: power_factor от 14-03-2023, 05:41:28
если формат строки позволит выполнять эти операции

Объясните, пожалуйста, смысл этой фразы.
Насколько я понимаю, в C# строки можно объединять, перебирать в циклах, производить над ними всякие манипуляции с помощью LINQ, например. Но чтобы работать с ними, как с числами, их нужно преобразовывать в числовой формат через Convert, Parse/TryParse или ещё каким-нибудь неизвестным мне способом.

*Хотел записать Screencast, как указано у Вас в подписи, но он более не поддерживается* Попробую описать словами:

- Я создаю таблицу на четыре ячейки в чертеже и для всех ячеек ещё дополнительно устанавливаю Data Format -> Text.
- В четвёртую ячейку я вношу формулу сложения/умножения/деления/вычитания трёх предыдущих ячеек.
- Теперь что бы я не вносил в первые три ячейки, если это будут числа, то в четвёртой ячейке всегда будет корректный результат вычисления. Причём форма записи чисел значения не имеет - я могу в первую ячейку записать число с десятичным разделителем в виде точки, во вторую - в виде запятой, а в третью вообще записать число в экспоненциальной форме (например, 7e-2).

Если я правильно понимаю, любой текст в чертеже, в том числе текст в ячейке таблицы - это экземпляр класса DBText, в свойстве TextString которого непосредственно содержится сам текст в формате string. То есть AutoCAD сам как-то определяет, что в строке число или как это работает?
Название: Re: Типы значений, сохраняемые в атрибутах блоков
Отправлено: avc от 14-03-2023, 06:04:37
Автокад работает с ячейками таблиц ровно также как и Excel- если ячейка неопределенного типа данных и вы пытаетесь выполнить математическую операцию, то Автокад пытается парсить строку в число. То же самое при работе с Полями. Причем методы преобразования Автокада более мощные, чем те что вы описали - они умеют парсить числа, записанные в дробном имперском формате длин. Так что если будете где-то в своих формах преобразовывать строки, введенные пользователем в длины, то лучше используйте Автокадовские методы, а не double.Parse