Сохранение введенных параметров команды для повторного использования

Автор Тема: Сохранение введенных параметров команды для повторного использования  (Прочитано 13285 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN OPEN
  • Сообщений: 47
  • Карма: 0
Добрый день!
Прошу извинить за возможно глупый вопрос! Каким образом можно сохранять значения, введенные пользователем для использования при последующих вызовах моей команды. К примеру, моя команда при выборе соответствующей опции запрашивает величину угла или расстояния. Как введенную величину сохранить до следующего вызова, что бы использовать ее по умолчанию? И что бы это значение сохранялось в чертеже, где команда использовалась?
Шаблон для Visual Studio сообщает о такой возможности, но не вполне понятно, как ее использовать:
    ' This class is instantiated by AutoCAD for each document when
    ' a command is called by the user the first time in the context
    ' of a given document. In other words, non static data in this class
    ' is implicitly per-document!

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Шаблон сообщает совсем не об этом. Я лично предпочитаю хранить настройки своих плагинов в реестре независимо от чертежей. Сейчас делаю плагин работающий с блоками - сохраняю в атрибуты блока. Если надо сохранить в чертеж - я бы использовал словари и xRecord

Онлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Хм... я использую обычную сериализацию и десериализацию в xml файл, который лежит в нужном месте.
Просто, быстро и очень, очень гибко.

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Зависит от конкретной задачи
1. Если это одно значение в небольшом плагине без окна, то можно использовать хранение в XData чертежа. Правда в этом случае значение будет хранится в конкретном чертеже и в каждом новом будет использоваться значение по-умолчанию
2. Если вам не очень важно контролировать файл хранения параметров вашего плагина, то вам отлично подойдут возможности, которые предоставляет VisualStudio - свойства проекта, вкладка "Параметры". Достаточно гибкий инструмент, который все делает сам - и создает классы для работы с параметрами и папку хранения параметров, в которой хранится тот-же самый xml-файл. Папка создается в каталоге AppData пользователя. Главный плюс - стабильная работа
3. Ну и вариант, когда вы создаете свои методы хранения данных в нужном вам файле. Лучший и удобный, на мой взгляд, вариант - xml-файл. Есть конечно еще староверы, которые пользуются txt или ini =) Единственный минус - может случится такое, что файл испортится при записи в него данных. Это вы должны сами уже предусмотреть

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

  • ADN OPEN
  • Сообщений: 47
  • Карма: 0
2. Если вам не очень важно контролировать файл хранения параметров вашего плагина, то вам отлично подойдут возможности, которые предоставляет VisualStudio - свойства проекта, вкладка "Параметры". Достаточно гибкий инструмент, который все делает сам - и создает классы для работы с параметрами и папку хранения параметров, в которой хранится тот-же самый xml-файл. Папка создается в каталоге AppData пользователя. Главный плюс - стабильная работа
Я использую Visual Studio крайне эпизодически, ткните носом пожалуйста, как извлекать/записывать значения из своей процедуры в эти параметры?
Да и кстати, а как сам AutoCAD поступает с сохранением параметров своих команд? К примеру, команда ФАСКА. Параметры сохраняются в чертеже, в новом - параметры по умолчанию (а может из шаблона?)

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

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

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

  • ADN OPEN
  • Сообщений: 47
  • Карма: 0
Если они сохраняются, то обычно в системных переменных
А можно ли такие системные переменные создавать? Если да, то каким образом?

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

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

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
2. Если вам не очень важно контролировать файл хранения параметров вашего плагина, то вам отлично подойдут возможности, которые предоставляет VisualStudio - свойства проекта, вкладка "Параметры". Достаточно гибкий инструмент, который все делает сам - и создает классы для работы с параметрами и папку хранения параметров, в которой хранится тот-же самый xml-файл. Папка создается в каталоге AppData пользователя. Главный плюс - стабильная работа
Александр, а можно поподробнее? Не очень понимаю, о чём речь.

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

  • ADN OPEN
  • Сообщений: 47
  • Карма: 0
Александр, а можно поподробнее? Не очень понимаю, о чём речь.
В Visual Basic все оказалось достаточно просто: нужно открыть вкладку My Project в обозревателе решений, далее в ней открыть закладку Параметры. Там надо создать необходимые параметры. В коде их можно использовать через объект My.Settings. Соответствующие свойства объекта создаются автоматически, их можно читать/записывать. Эффективно, но не вижу возможности использовать значения по умолчанию для каждого нового чертежа. Свойства доcтупны для чтения и изменения из всех чертежей.
« Последнее редактирование: 12-03-2018, 10:39:58 от Phil »

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Раз вам все-таки надо хранить разные настройки в разных чертежах, то вариант с хранением во внешних файлах вам не подходит. Используйте пользовательские свойства чертежа или xData или xRecord для хранения любых своих данных внутри файла dwg

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

  • ADN OPEN
  • Сообщений: 47
  • Карма: 0
Раз вам все-таки надо хранить разные настройки в разных чертежах, то вариант с хранением во внешних файлах вам не подходит. Используйте пользовательские свойства чертежа или xData или xRecord для хранения любых своих данных внутри файла dwg
xData и xRecord создаются для конкретных объектов? Как использовать пользовательские свойства чертежа?

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Вот мой хелпер для записи в свойства чертежа
Код - C# [Выбрать]
  1.     /// <summary>
  2.     /// Запись в свойства чертежа нового свойства или изменение старого
  3.     /// сохраняет все имеющиеся свойства чертежа
  4.     /// Document должен быть заблокирован
  5.     /// </summary>
  6.     /// <param name="ProrertyName">имя свойства. недопустимы двоеточия</param>
  7.     /// <param name="Value">значение свойства. будет преобразовано в строку</param>
  8.     /// <param name="doc">какому чертежу назначать. если null - текущему</param>
  9.     /// <returns>успех</returns>
  10.     public static bool SetDrawingProperty(this Database db, string ProrertyName, object Value)
  11.     {
  12.       if (db == null || string.IsNullOrEmpty(ProrertyName) || Value == null) return false;
  13.       DatabaseSummaryInfoBuilder ib = GetSummary(db);
  14.       IDictionaryEnumerator ff = db.SummaryInfo.CustomProperties;
  15.       while (ff.MoveNext())
  16.       {
  17.         if (ff.Key.ToString() != ProrertyName)
  18.           ib.CustomPropertyTable.Add(ff.Key, ff.Value);
  19.       }
  20.       ib.CustomPropertyTable.Add(ProrertyName, Value.ToString());
  21.       db.SummaryInfo = ib.ToDatabaseSummaryInfo();
  22.       return true;
  23.     }

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Александр, а можно поподробнее? Не очень понимаю, о чём речь.
Эффективно, но не вижу возможности использовать значения по умолчанию для каждого нового чертежа. Свойства доcтупны для чтения и изменения из всех чертежей.
Ну как я и сказал - открываете свойства проекта и идете на вкладку "Параметры". Её многие привыкли использовать для локализации (не лучший способ, ИМХО). Там ручками создаем параметры. При этом мы задаем тип данных и значение по умолчанию (которое Phil почему-то не увидел).



При этом VisualStudio создает специальный класс



Дальше уже в коде использовать эти параметры проще простого
Код - C# [Выбрать]
  1. var isCurrent = Properties.Settings.Default.IsCurrent;
При задании новых значений нужно не забывать вызывать метод сохранения, так как само это не происходит
Код - C# [Выбрать]
  1. Properties.Settings.Default.IsCurrent = true;
  2. Properties.Settings.Default.Save();

Еще эти параметры удобно биндить на WPF окна, что сокращает количество кода в разы

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

  • ADN OPEN
  • Сообщений: 47
  • Карма: 0
Ну как я и сказал - открываете свойства проекта и идете на вкладку "Параметры". Её многие привыкли использовать для локализации (не лучший способ, ИМХО). Там ручками создаем параметры. При этом мы задаем тип данных и значение по умолчанию (которое Phil почему-то не увидел).
Значения по умолчанию я увидел и уже использовал. Проблема в другом: изменения этих параметров видят все открытые в данный момент чертежи. То есть они являются не локальными для каждого чертежа, а глобальными. Иначе говоря, изменяя параметры команды в одном чертеже и сохраняя их таким способом, в другом параллельно открытом чертеже, читаю только что измененные параметры.