Типы значений, сохраняемые в атрибутах блоков

Автор Тема: Типы значений, сохраняемые в атрибутах блоков  (Прочитано 9997 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн power_factorАвтор темы

  • ADN OPEN
  • Сообщений: 6
  • Карма: 0
Добрый день!
Не являюсь программистом и только начал изучать 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, но не нашёл, где это можно посмотреть. Спасибо.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Атрибутом блока может быть только строка (string) длиной до 255 символов.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 167
    • Мои плагины к Автокаду
Достаточно заметить, что предком объекта AttributeDefinition является DBText - и уже понятно, что ни о каких типах значения речи не может быть. Текст - он и есть текст. И значения вы присваиваете свойству TextString типа string. Что, впрочем, не мешает пытаться парсить эти тексты как double или как int...

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

Оффлайн power_factorАвтор темы

  • ADN OPEN
  • Сообщений: 6
  • Карма: 0
Я говорю именно про атрибуты.
Когда я создаю блок № 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" - это строка, но при вставке этого значения в таблицу полем, работать с ним можно как с обычным числом.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Ты путаешь разные понятия. Атрибут - это атрибут, поле - это поле. Атрибут это в любом случае строка. Другое дело, что поля в атрибуте могут использоваться для ряда операций (в частности для суммирования), если формат строки позволит выполнять эти операции.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн power_factorАвтор темы

  • ADN OPEN
  • Сообщений: 6
  • Карма: 0
если формат строки позволит выполнять эти операции

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

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

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

Если я правильно понимаю, любой текст в чертеже, в том числе текст в ячейке таблицы - это экземпляр класса DBText, в свойстве TextString которого непосредственно содержится сам текст в формате string. То есть AutoCAD сам как-то определяет, что в строке число или как это работает?

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 167
    • Мои плагины к Автокаду
Автокад работает с ячейками таблиц ровно также как и Excel- если ячейка неопределенного типа данных и вы пытаетесь выполнить математическую операцию, то Автокад пытается парсить строку в число. То же самое при работе с Полями. Причем методы преобразования Автокада более мощные, чем те что вы описали - они умеют парсить числа, записанные в дробном имперском формате длин. Так что если будете где-то в своих формах преобразовывать строки, введенные пользователем в длины, то лучше используйте Автокадовские методы, а не double.Parse