Изменение установок Профиля 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, чтобы увидеть, какое свойство в реестре модифицируется при изменении настройки с помощью пользовательского интерфейса. В случае печати это свойство было найдено здесь:
Так что мы можем его изменить при помощи следующего кода:
- using System;
- using Autodesk.AutoCAD.Runtime;
- using Autodesk.AutoCAD.ApplicationServices;
- using Autodesk.AutoCAD.DatabaseServices;
- using acApp = Autodesk.AutoCAD.ApplicationServices.Application;
- using Win32 = Microsoft.Win32;
- [assembly: CommandClass(typeof(SimpleDotNet.Commands))]
- namespace SimpleDotNet
- {
- public class Commands
- {
- [CommandMethod("ToggleDisplayPlotBubble", CommandFlags.Session)]
- public void ToggleDisplayPlotBubble()
- {
- const string sectionName = "General";
- const string propertyName = "DisplayPlotBubble";
- string productKeyName = HostApplicationServices.Current.UserRegistryProductRootKey;
- string profileName = acApp.GetSystemVariable("CPROFILE").ToString();
- using (RegistryKey genKey = Registry.CurrentUser.OpenSubKey(
- string.Format(@"{0}\Profiles\{1}\{2}", productKeyName, profileName, sectionName), true))
- {
- int displayOn = (int)genKey.GetValue(propertyName);
- displayOn = (displayOn == 0) ? 1 : 0;
- genKey.SetValue(propertyName, displayOn, Win32.RegistryValueKind.DWord);
- }
- }
- }
- }
Замечание переводчика: Большинство переменных из реестра считываются 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
Опубликовано 17.02.2016