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

18/02/2016

Изменение установок Профиля AutoCAD при помощи .NET

Есть много параметров, используемых AutoCAD, которые хранятся в различных частях реестра. Многие из них также можно читать и писать через getenv / setenv в LISP или acedGetEnv / acedSetEnv в ObjectARX и вот так в .NET:

Простая альтернатива использованию COM-объекта Preferences в AutoCAD

Если это не переменная окружения и к ней нет доступа через getenv/setenv к ней можно получить доступ при помощи API Реестра для чтения/модификации значений.
Замечание: если интересующее значение является строчным, тогда к нему можно получить доступ при помощи объекта UserConfigurationManager  для чтения/записи:
http://through-the-interface.typepad.com/through_the_interface/2008/05/storing-custom.html

В качестве примера попробуем изменить переключатель "Разрешить уведомления" для печати из .NET.

 

Если вы хотите выяснить где данная настройка сохраняется в реестре (если она действительно хранится там), то вы можете использовать такой инструмент, как Process Monitor, чтобы увидеть, какое свойство в реестре модифицируется при изменении настройки с помощью пользовательского интерфейса. В случае печати это свойство было найдено здесь:

 

Так что мы можем его изменить при помощи следующего кода:

Код - C#: [Выделить]
  1. using System;
  2.  
  3. using Autodesk.AutoCAD.Runtime;
  4. using Autodesk.AutoCAD.ApplicationServices;
  5. using Autodesk.AutoCAD.DatabaseServices;
  6.  
  7. using acApp = Autodesk.AutoCAD.ApplicationServices.Application;
  8. using Win32 = Microsoft.Win32;
  9.  
  10. [assembly: CommandClass(typeof(SimpleDotNet.Commands))]
  11.  
  12. namespace SimpleDotNet
  13. {
  14.   public class Commands
  15.   {
  16.     [CommandMethod("ToggleDisplayPlotBubble", CommandFlags.Session)]
  17.     public void ToggleDisplayPlotBubble()
  18.     {
  19.       const string sectionName = "General";
  20.       const string propertyName = "DisplayPlotBubble";
  21.  
  22.       string productKeyName = HostApplicationServices.Current.UserRegistryProductRootKey;
  23.       string profileName = acApp.GetSystemVariable("CPROFILE").ToString();
  24.       using (RegistryKey genKey = Registry.CurrentUser.OpenSubKey(
  25.         string.Format(@"{0}\Profiles\{1}\{2}", productKeyName, profileName, sectionName), true))
  26.       {
  27.         int displayOn = (int)genKey.GetValue(propertyName);
  28.         displayOn = (displayOn == 0) ? 1 : 0;
  29.         genKey.SetValue(propertyName, displayOn, Win32.RegistryValueKind.DWord);
  30.       }
  31.     }
  32.   }
  33. }

 

Замечание переводчика: Большинство переменных из реестра считываются AutoCAD при его запуске и записываются обратно перед завершении его работы. Так что этот алгоритм годится лишь для некоторых переменных (в число которых попала и DisplayPlotBubble). Для ряда переменных изменённое таким образом значение будет воспринято AutoCAD только после его перезапуска в следующей сессии. Будьте внимательны!

 

Источник: http://adndevblog.typepad.com/autocad/2016/02/change-profile-settings-from-net.html

 

Автор перевода: Александр Ривилис

Обсуждение: http://adn-cis.org/forum/index.php?topic=4294

Опубликовано 18.02.2016