Не удаётся создать Subsection (раздел в реестре) для настроек PaletteSet

Автор Тема: Не удаётся создать Subsection (раздел в реестре) для настроек PaletteSet  (Прочитано 23250 раз)

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

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Доброго времени суток.

- AutoCAD 2009 x86 SP3 Enu.

На событие PaletteSet.Save вешаю такой код:
Код - C# [Выбрать]
  1. void palette_set_Save(object sender, Win.PalettePersistEventArgs e) {
  2.         App.IConfigurationSection subsection_company = null;
  3.         App.IConfigurationSection subsection_product = null;
  4.  
  5.         GetSubsections(e.ConfigurationSection, out subsection_company, out subsection_product);
  6.  
  7.         if (palette_set != null) {
  8.                 if (subsection_company == null)
  9.                         subsection_company = e.ConfigurationSection.CreateSubsection(company_name);
  10.                
  11.                 Boolean is_read_only = subsection_company.IsReadOnly; // False
  12.  
  13.                 if (subsection_product == null)
  14.                         // COMException here!
  15.                         // Message: Error HRESULT E_FAIL has been returned from a call to a COM component.
  16.                         subsection_product = subsection_company.CreateSubsection(product_name);
  17.  
  18.                 subsection_company.WriteProperty("Copyright", "© Andrey Bushman, 2013");
  19.                 subsection_company.WriteProperty("Site", "http://sites.google.com/site/bushmansnetlaboratory/");
  20.  
  21.                 subsection_product.WriteProperty("Location X", palette_set.Location.X);
  22.                 subsection_product.WriteProperty("Location Y", palette_set.Location.Y);
  23.                 subsection_product.WriteProperty("Width", palette_set.Size.Width);
  24.                 subsection_product.WriteProperty("Height", palette_set.Size.Height);
  25.         }
  26. }
  27.  
  28. void GetSubsections(App.IConfigurationSection config_section,
  29.         out App.IConfigurationSection subsection_company,
  30.         out App.IConfigurationSection subsection_product) {
  31.  
  32.         subsection_company = null;
  33.         subsection_product = null;
  34.  
  35.         if (config_section == null)
  36.                 return;
  37.  
  38.         subsection_company = config_section.ContainsSubsection(company_name) ?
  39.                 config_section.OpenSubsection(company_name) : null;
  40.  
  41.         subsection_product = subsection_company != null && subsection_company.ContainsSubsection(product_name) ?
  42.                 subsection_product = subsection_company.OpenSubsection(product_name) : null;
  43. }

Однако получаю исключение, обозначенное в комментариях. Я пробовал создавать вложенную секцию (Subsection) и в коде, подключенном к PaletteSet.Load - там та же история.

Почему не удаётся создать вложенную секцию?

Спасибо.
« Последнее редактирование: 04-12-2013, 22:12:06 от Андрей Бушман »

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Хм... Написал простой пример, где посредством IConfigurationSection вношу изменения в реестр двумя способами (второй - это аналог коду из первого сообщения). Как это ни странно, но сейчас оба способа работают...

Возникли некоторые непонятные моменты:

1. Я не понял, почему в этот раз не возникает ошибка, обозначенная в аналогичном коде, приведённом выше.
2. Брэйкпоинт в palette_set_Save никогда не срабатывает, а срабатывает лишь в palette_set_Load.
3. Несмотря на п.2, палитра каким-то чудом запоминает свою позицию. Поиск по реестру ничего не даёт (искал по "ААА", "Location X", а так же по указанному GUID). Куда AutoCAD сохраняет эту информацию?

Наверное у меня уже глаз замылился... :(

Код - C# [Выбрать]
  1. // © Andrey Bushman, 2013
  2. using System;
  3. using Microsoft.Win32;
  4.  
  5. using cad = Autodesk.AutoCAD.ApplicationServices.Application;
  6. using App = Autodesk.AutoCAD.ApplicationServices;
  7. using Db = Autodesk.AutoCAD.DatabaseServices;
  8. using Ed = Autodesk.AutoCAD.EditorInput;
  9. using Rtm = Autodesk.AutoCAD.Runtime;
  10. using Win = Autodesk.AutoCAD.Windows;
  11. using System.IO;
  12.  
  13. [assembly: Rtm.CommandClass(typeof(Bushman.CAD.Problems.Commands))]
  14. [assembly: Rtm.ExtensionApplication(typeof(Bushman.CAD.Problems.Commands))]
  15.  
  16. namespace Bushman.CAD.Problems {
  17.  
  18.         public class Commands : Rtm.IExtensionApplication {
  19.  
  20.                 internal static Win.PaletteSet palette_set = null;
  21.  
  22.                 [Rtm.CommandMethod("cmd_1", Rtm.CommandFlags.Modal)]
  23.                 public void Command_1() {
  24.                         Ed.Editor ed = cad.DocumentManager.MdiActiveDocument.Editor;
  25.                         App.IConfigurationSection cp = cad.UserConfigurationManager.OpenCurrentProfile();
  26.  
  27.                         const String name = "Bushman";
  28.                         const String name2 = "My Some Application";
  29.                         const String propName = "Property 1";
  30.                         App.IConfigurationSection section = cp.ContainsSubsection(name) ?
  31.                                 cp.OpenSubsection(name) : cp.CreateSubsection(name);
  32.  
  33.                         App.IConfigurationSection section2 = section.ContainsSubsection(name2) ?
  34.                                 section.OpenSubsection(name2) : section.CreateSubsection(name2);
  35.  
  36.                         section2.WriteProperty(propName, "Hello, World!");
  37.                         String cprofile = cad.GetSystemVariable("cprofile") as String;
  38.                         String path = Path.Combine(Db.HostApplicationServices.Current.RegistryProductRootKey, @"Profiles\" + cprofile);
  39.                         RegistryKey regKey = Registry.CurrentUser.OpenSubKey(path, false);
  40.                         RegistryKey regKey2 = regKey.OpenSubKey(name).OpenSubKey(name2);
  41.                         String value = regKey2.GetValue(propName, String.Empty) as String;
  42.                         ed.WriteMessage("Register: {0}\n", regKey2.Name);
  43.                         ed.WriteMessage("The register is successfully changed!\n");
  44.                 }
  45.  
  46.                 [Rtm.CommandMethod("cmd_2", Rtm.CommandFlags.Modal)]
  47.                 public void Command_2() {
  48.                         Ed.Editor ed = cad.DocumentManager.MdiActiveDocument.Editor;
  49.                         if (palette_set == null) {
  50.                                 palette_set = new Win.PaletteSet("My Palette", new Guid("{49DBC66F-21BE-4D9F-A5A9-BA750543042E}"));
  51.                                 palette_set.Load += new Win.PalettePersistEventHandler(palette_set_Load);
  52.                                 palette_set.Save += new Win.PalettePersistEventHandler(palette_set_Save);
  53.                         }
  54.                         palette_set.KeepFocus = true;
  55.                         palette_set.Visible = true;
  56.                 }
  57.  
  58.                 void palette_set_Load(object sender, Win.PalettePersistEventArgs e) {
  59.                         App.IConfigurationSection section = e.ConfigurationSection;
  60.                         App.IConfigurationSection subsection = null;
  61.                         App.IConfigurationSection subsection2 = null;
  62.                         const String name = "AAA";
  63.                         const String name2 = "BBB";
  64.                         if (!section.IsReadOnly) {
  65.                                 subsection = section.ContainsSubsection(name) ?
  66.                                 section.OpenSubsection(name) : section.CreateSubsection(name);
  67.  
  68.                                 if (!subsection.IsReadOnly) {
  69.                                         subsection2 = subsection.ContainsSubsection(name2) ?
  70.                                         subsection.OpenSubsection(name2) : subsection.CreateSubsection(name2);
  71.                                 }
  72.                                 Int32 x = (Int32)subsection2.ReadProperty("Location X", 300);
  73.                                 Int32 y = (Int32)subsection2.ReadProperty("Location Y", 200);
  74.                         }
  75.                 }
  76.  
  77.                 void palette_set_Save(object sender, Win.PalettePersistEventArgs e) {
  78.                         App.IConfigurationSection section = e.ConfigurationSection;
  79.                         App.IConfigurationSection subsection = null;
  80.                         App.IConfigurationSection subsection2 = null;
  81.                         const String name = "AAA";
  82.                         const String name2 = "BBB";
  83.                         if (!section.IsReadOnly) {
  84.                                 subsection = section.ContainsSubsection(name) ?
  85.                                 section.OpenSubsection(name) : section.CreateSubsection(name);
  86.  
  87.                                 if (!subsection.IsReadOnly) {
  88.                                         subsection2 = subsection.ContainsSubsection(name2) ?
  89.                                         subsection.OpenSubsection(name2) : subsection.CreateSubsection(name2);
  90.                                 }
  91.                                 subsection2.WriteProperty("Location X", palette_set.Location.X);
  92.                                 subsection2.WriteProperty("Location Y", palette_set.Location.Y);
  93.                         }
  94.                 }
  95.  
  96.  
  97.                 public void Initialize() {
  98.                         Ed.Editor ed = cad.DocumentManager.MdiActiveDocument.Editor;
  99.                         ed.WriteMessage("The 'Hello World' is loaded... \n");
  100.                 }
  101.  
  102.                 public void Terminate() {
  103.                         // throw new NotImplementedException();
  104.                 }
  105.         }
  106. }
« Последнее редактирование: 04-12-2013, 16:44:51 от Андрей Бушман »

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
3. Несмотря на п.2, палитра каким-то чудом запоминает свою позицию. Поиск по реестру ничего не даёт (искал по "ААА", "Location X", а так же по указанному GUID). Куда AutoCAD сохраняет эту информацию?
Может по имени палитры поищешь? Мне всегда казалось, что сохраняется эта информация сюда:
HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\RXX.X\ACAD-YYYY:LLL\Profiles\<<Имя профиля>>\Dialogs
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Может по имени палитры поищешь? Мне всегда казалось, что сохраняется эта информация сюда:
HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\RXX.X\ACAD-YYYY:LLL\Profiles\<<Имя профиля>>\Dialogs
Нет, вы ошибаетесь. Как выяснилось, информация записывается в файл %AppData%\Autodesk\AutoCAD 2014\R19.1\enu\Support\Profiles\Unnamed Profile\Profile.aws Вместо Unnamed Profile подставляете имя своего профиля.
Записанная в указанном файле информация выглядит так:
Код - XML [Выбрать]
  1. <Tool CLSID="{49DBC66F-21BE-4D9F-A5A9-BA750543042E}">
  2.   <CAdUiDockControlBar Orientation="-1" AllowDocking="1">
  3.     <FloatInfo Left="342" Top="310" Width="300" Height="300"/>
  4.     <DockInfo Left="0" Top="792" Width="300" Height="798" MRUDockID="59420"/>
  5.   </CAdUiDockControlBar>
  6.   <CAdUiPaletteSet/>
  7.   <AAA>
  8.     <BBB/>
  9.   </AAA>
  10. </Tool>

Обратите внимание на то, что элементы AAA и BBB созданы за счёт выполнения метода palette_set_Load. Однако я регистрировал и метод palette_set_Save, который должен был при завершении работы AutoCAD дописывать туда два дополнительных элемента, но этого почему-то не происходит (зарегистрированный код не вызывается автокадом)...

Поскольку информация, связанная с палитрами записывается в XML фай, то сразу становится понятна причина сбоя... Я ведь изначально ожидал, что информация будет записываться в реестр и вложенному подразделу пытался задать имя "Sheet Set Viewer". В реестре такие имена допустимы, но не в XML - там в имени элемента не должно содержаться пробелов. Т.о. заменив имя подраздела на "Sheet_Set_Viewer", я тем самым устранил проблему. В XML это выглядит так:

Код - XML [Выбрать]
  1. <Tool CLSID="{E06974C1-B748-4D8A-B1CC-CB9AADA26B79}">
  2.   <CAdUiDockControlBar Orientation="-1" AllowDocking="1">
  3.     <FloatInfo Left="150" Top="200" Width="300" Height="300"/>
  4.     <DockInfo Left="0" Top="396" Width="300" Height="798" MRUDockID="59420"/>
  5.   </CAdUiDockControlBar>
  6.   <CAdUiPaletteSet/>
  7.   <Bushman>
  8.     <Sheet_Set_Viewer/>
  9.   </Bushman>
  10. </Tool>

Отсюда вывод: если не хотите, чтобы в один прекрасный момент ваш код, использующий IConfigurationSection перестал работать, когда компания Autodesk вдруг решит часть настроек перенести из реестра в XML, то имена своим пользовательским разделам, подразделам и параметрам следует на всякий случай назначать без пробелов. :)

Т.о. вопрос, обозначенный в первом сообщении темы закрыт. Однако меня по прежнему интересует, почему выполняется мой код, зарегистрированный на событие Load и не выполняется код, зарегистрированный на событие Save?

Показываю простой исходный код, демонстрирующий проблему:

Код - C# [Выбрать]
  1. // © Andrey Bushman, 2013
  2. using System;
  3. using Microsoft.Win32;
  4.  
  5. using cad = Autodesk.AutoCAD.ApplicationServices.Application;
  6. using App = Autodesk.AutoCAD.ApplicationServices;
  7. using Db = Autodesk.AutoCAD.DatabaseServices;
  8. using Ed = Autodesk.AutoCAD.EditorInput;
  9. using Rtm = Autodesk.AutoCAD.Runtime;
  10. using Win = Autodesk.AutoCAD.Windows;
  11. using System.IO;
  12.  
  13. [assembly: Rtm.CommandClass(typeof(Bushman.CAD.Problems.Commands))]
  14. [assembly: Rtm.ExtensionApplication(typeof(Bushman.CAD.Problems.Commands))]
  15.  
  16. namespace Bushman.CAD.Problems {
  17.  
  18.         public class Commands : Rtm.IExtensionApplication {
  19.  
  20.                 internal static Win.PaletteSet palette_set = null;
  21.  
  22.                 [Rtm.CommandMethod("cmd_1", Rtm.CommandFlags.Modal)]
  23.                 public void Command_1() {
  24.                         Ed.Editor ed = cad.DocumentManager.MdiActiveDocument.Editor;
  25.                         App.IConfigurationSection cp = cad.UserConfigurationManager.OpenCurrentProfile();
  26.  
  27.                         const String name = "Bushman";
  28.                         // This names can to contain the spaces
  29.                         const String name2 = "My Some Application";
  30.                         const String propName = "Property 1";
  31.                         // This settings will created in the registry (HKCU)
  32.                         App.IConfigurationSection section = cp.ContainsSubsection(name) ?
  33.                                 cp.OpenSubsection(name) : cp.CreateSubsection(name);
  34.  
  35.                         App.IConfigurationSection section2 = section.ContainsSubsection(name2) ?
  36.                                 section.OpenSubsection(name2) : section.CreateSubsection(name2);
  37.  
  38.                         section2.WriteProperty(propName, "Hello, World!");
  39.                         String cprofile = cad.GetSystemVariable("cprofile") as String;
  40.                         String path = Db.HostApplicationServices.Current.UserRegistryProductRootKey
  41.                                 + @"\Profiles\" + cprofile;
  42.  
  43.                         using (RegistryKey regKey = Registry.CurrentUser.OpenSubKey(path, false)) {
  44.                                 using (RegistryKey regKey2 = regKey.OpenSubKey(name).OpenSubKey(name2)) {
  45.                                         String value = regKey2.GetValue(propName, String.Empty) as String;
  46.                                         ed.WriteMessage("Register: {0}\n", regKey2.Name);
  47.                                         ed.WriteMessage("The register is successfully changed!\n");
  48.                                 }
  49.                         }
  50.                 }
  51.  
  52.                 [Rtm.CommandMethod("cmd_2", Rtm.CommandFlags.Modal)]
  53.                 public void Command_2() {
  54.                         Ed.Editor ed = cad.DocumentManager.MdiActiveDocument.Editor;
  55.                         if (palette_set == null) {
  56.                                 // This settings will be saved into the
  57.                                 // %AppData%\Autodesk\AutoCAD 2014\R19.1\enu\Support\Profiles\Unnamed Profile\Profile.aws
  58.                                 // if the current profile is <<Unnamed Profile>>.
  59.                                 palette_set = new Win.PaletteSet("My Palette",
  60.                                         new Guid("{49DBC66F-21BE-4D9F-A5A9-BA750543042E}"));
  61.                                 palette_set.Load += new Win.PalettePersistEventHandler(palette_set_Load);
  62.                                 palette_set.Save += new Win.PalettePersistEventHandler(palette_set_Save);
  63.                         }
  64.  
  65.                         palette_set.KeepFocus = true;
  66.                         palette_set.Visible = true;
  67.                 }
  68.  
  69.                 // This names can't to contain the spaces!
  70.                 const String name = "AAA";
  71.                 const String name2 = "BBB";
  72.                 const String val_1_name = "Value_1";
  73.                 const String val_2_name = "Value_2";
  74.  
  75.                 void palette_set_Load(object sender, Win.PalettePersistEventArgs e) {
  76.                         App.IConfigurationSection section = e.ConfigurationSection;
  77.                         App.IConfigurationSection subsection = null;
  78.                         App.IConfigurationSection subsection2 = null;
  79.  
  80.                         if (!section.IsReadOnly) {
  81.                                 subsection = section.ContainsSubsection(name) ?
  82.                                 section.OpenSubsection(name) : section.CreateSubsection(name);
  83.  
  84.                                 if (!subsection.IsReadOnly) {
  85.                                         subsection2 = subsection.ContainsSubsection(name2) ?
  86.                                         subsection.OpenSubsection(name2) : subsection.CreateSubsection(name2);
  87.                                 }
  88.                                 Int32 val_1 = (Int32)subsection2.ReadProperty(val_1_name, 100);
  89.                                 Int32 val_2 = (Int32)subsection2.ReadProperty(val_2_name, 200);
  90.                         }
  91.                 }
  92.  
  93.                 void palette_set_Save(object sender, Win.PalettePersistEventArgs e) {
  94.                         App.IConfigurationSection section = e.ConfigurationSection;
  95.                         App.IConfigurationSection subsection = null;
  96.                         App.IConfigurationSection subsection2 = null;
  97.                         if (!section.IsReadOnly) {
  98.                                 subsection = section.ContainsSubsection(name) ?
  99.                                 section.OpenSubsection(name) : section.CreateSubsection(name);
  100.  
  101.                                 if (!subsection.IsReadOnly) {
  102.                                         subsection2 = subsection.ContainsSubsection(name2) ?
  103.                                         subsection.OpenSubsection(name2) : subsection.CreateSubsection(name2);
  104.                                 }
  105.                                 subsection2.WriteProperty(val_1_name, 700);
  106.                                 subsection2.WriteProperty(val_2_name, 800);
  107.                         }
  108.                 }
  109.  
  110.  
  111.                 public void Initialize() {
  112.                         Ed.Editor ed = cad.DocumentManager.MdiActiveDocument.Editor;
  113.                         ed.WriteMessage("The 'Hello World' is loaded... \n");
  114.                 }
  115.  
  116.                 public void Terminate() {
  117.                         // throw new NotImplementedException();
  118.                 }
  119.         }
  120. }

На всякий случай прикрепляю исходники, настроенные на AutoCAD 2014 x64.

Спасибо.
« Последнее редактирование: 05-12-2013, 12:30:59 от Андрей Бушман »

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Я попробовал выполнить сохранение настроек, подписавшись на событие Application.BeginQuit, но это не помогло. В комментариях я показал точку сбоя и своё предположение о его причине...
Код - C# [Выбрать]
  1. // © Andrey Bushman, 2013
  2. using System;
  3. using Microsoft.Win32;
  4.  
  5. using cad = Autodesk.AutoCAD.ApplicationServices.Application;
  6. using App = Autodesk.AutoCAD.ApplicationServices;
  7. using Db = Autodesk.AutoCAD.DatabaseServices;
  8. using Ed = Autodesk.AutoCAD.EditorInput;
  9. using Rtm = Autodesk.AutoCAD.Runtime;
  10. using Win = Autodesk.AutoCAD.Windows;
  11. using System.IO;
  12.  
  13. [assembly: Rtm.CommandClass(typeof(Bushman.CAD.Problems.Commands))]
  14. [assembly: Rtm.ExtensionApplication(typeof(Bushman.CAD.Problems.Commands))]
  15.  
  16. namespace Bushman.CAD.Problems {
  17.  
  18.         public class Commands : Rtm.IExtensionApplication {
  19.  
  20.                 internal static Win.PaletteSet palette_set = null;
  21.  
  22.                 [Rtm.CommandMethod("cmd_1", Rtm.CommandFlags.Modal)]
  23.                 public void Command_1() {
  24.                         Ed.Editor ed = cad.DocumentManager.MdiActiveDocument.Editor;
  25.                         App.IConfigurationSection cp = cad.UserConfigurationManager.OpenCurrentProfile();
  26.  
  27.                         const String name = "Bushman";
  28.                         // This names can to contain the spaces
  29.                         const String name2 = "My Some Application";
  30.                         const String propName = "Property 1";
  31.                         // This settings will created in the registry (HKCU)
  32.                         App.IConfigurationSection section = cp.ContainsSubsection(name) ?
  33.                                 cp.OpenSubsection(name) : cp.CreateSubsection(name);
  34.  
  35.                         App.IConfigurationSection section2 = section.ContainsSubsection(name2) ?
  36.                                 section.OpenSubsection(name2) : section.CreateSubsection(name2);
  37.  
  38.                         section2.WriteProperty(propName, "Hello, World!");
  39.                         String cprofile = cad.GetSystemVariable("cprofile") as String;
  40.                         String path = Db.HostApplicationServices.Current.UserRegistryProductRootKey
  41.                                 + @"\Profiles\" + cprofile;
  42.  
  43.                         using (RegistryKey regKey = Registry.CurrentUser.OpenSubKey(path, false)) {
  44.                                 using (RegistryKey regKey2 = regKey.OpenSubKey(name).OpenSubKey(name2)) {
  45.                                         String value = regKey2.GetValue(propName, String.Empty) as String;
  46.                                         ed.WriteMessage("Register: {0}\n", regKey2.Name);
  47.                                         ed.WriteMessage("The register is successfully changed!\n");
  48.                                 }
  49.                         }
  50.                 }
  51.  
  52.                 [Rtm.CommandMethod("cmd_2", Rtm.CommandFlags.Modal)]
  53.                 public void Command_2() {
  54.                         Ed.Editor ed = cad.DocumentManager.MdiActiveDocument.Editor;
  55.                         if (palette_set == null) {
  56.                                 // This settings will be saved into the
  57.                                 // %AppData%\Autodesk\AutoCAD 2014\R19.1\enu\Support\Profiles\Unnamed Profile\Profile.aws
  58.                                 // if the current profile is <<Unnamed Profile>>.
  59.                                 palette_set = new Win.PaletteSet("My Palette",
  60.                                         new Guid("{49DBC66F-21BE-4D9F-A5A9-BA750543042E}"));
  61.                                 palette_set.Load += new Win.PalettePersistEventHandler(palette_set_Load);
  62.                                 cad.BeginQuit += new EventHandler(cad_BeginQuit);
  63.                         }
  64.  
  65.                         palette_set.KeepFocus = true;
  66.                         palette_set.Visible = true;
  67.                 }
  68.  
  69.                 static App.IConfigurationSection _palette_set = null;
  70.  
  71.                 void cad_BeginQuit(object sender, EventArgs e) {
  72.                         palette_set_Save(null, _palette_set);
  73.                 }
  74.  
  75.                 // This names can't to contain the spaces!
  76.                 const String name = "AAA";
  77.                 const String name2 = "BBB";
  78.                 const String val_1_name = "Value_1";
  79.                 const String val_2_name = "Value_2";
  80.  
  81.                 void palette_set_Load(object sender, Win.PalettePersistEventArgs e) {
  82.                         App.IConfigurationSection section = _palette_set = e.ConfigurationSection;
  83.                         App.IConfigurationSection subsection = null;
  84.                         App.IConfigurationSection subsection2 = null;
  85.  
  86.                         if (!section.IsReadOnly) {
  87.                                 subsection = section.ContainsSubsection(name) ?
  88.                                 section.OpenSubsection(name) : section.CreateSubsection(name);
  89.  
  90.                                 if (!subsection.IsReadOnly) {
  91.                                         subsection2 = subsection.ContainsSubsection(name2) ?
  92.                                         subsection.OpenSubsection(name2) : subsection.CreateSubsection(name2);
  93.                                 }
  94.                                 Int32 val_1 = (Int32)subsection2.ReadProperty(val_1_name, 100);
  95.                                 Int32 val_2 = (Int32)subsection2.ReadProperty(val_2_name, 200);
  96.                         }
  97.                 }
  98.  
  99.                 void palette_set_Save(object sender, App.IConfigurationSection section) {
  100.                         App.IConfigurationSection subsection = null;
  101.                         App.IConfigurationSection subsection2 = null;
  102.                         if (section != null && !section.IsReadOnly) {
  103.                                 // TODO: Problem is here.
  104.                                 // Here execution of code interrupts... Maybe IConfigurationSection is disposed already...
  105.                                 subsection = section.ContainsSubsection(name) ?
  106.                                 section.OpenSubsection(name) : section.CreateSubsection(name);
  107.  
  108.                                 if (!subsection.IsReadOnly) {
  109.                                         subsection2 = subsection.ContainsSubsection(name2) ?
  110.                                         subsection.OpenSubsection(name2) : subsection.CreateSubsection(name2);
  111.                                 }
  112.                                 subsection2.WriteProperty(val_1_name, 700);
  113.                                 subsection2.WriteProperty(val_2_name, 800);
  114.                         }
  115.                 }
  116.  
  117.  
  118.                 public void Initialize() {
  119.                         Ed.Editor ed = cad.DocumentManager.MdiActiveDocument.Editor;
  120.                         ed.WriteMessage("The 'Hello World' is loaded... \n");
  121.                 }
  122.  
  123.                 public void Terminate() {
  124.                         // throw new NotImplementedException();
  125.                 }
  126.         }
  127. }

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

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

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
На последний вопрос ответ готов:
Использование ActiveX интерфейса AutoCAD при его завершении
Ок, значит вопрос по Application.BeginQuit отпадает. Но остаётся тот, что мне наиболее интересен - почему Save не фурычит? Я предпочитаю использовать IConfigurationSection для того, чтобы там же хранить и настройки элементов управления, размещённых на вкладках моей палитры. Поэтому - что у нас не так с Save?

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

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

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Советую подписаться на DocumentCollection.DocumentToBeDestroyed и сохранять информацию о палитре в нём.
Это всё понятно, читал. Но во первых - не хотелось бы перезаписывать настройки каждый раз, как закрывается документ, а во вторых, что же у нас всё таки не так с Save? Я хочу разобраться.... Не стесняйтесь потревожить ADN, если это действительно баг или требуются дополнительные танцы, чтобы сие заработало... Мне требуется понимание того, что происходит. :)

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

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

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Хорошо. Потревожу. Я правильно понял, что ты проверил в AutoCAD 2014 SP1 x64? И что событие Save не возникало вообще?
Да, причём эту информацию я уже указывал и исходники прикреплял.

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

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

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Советую подписаться на DocumentCollection.DocumentToBeDestroyed и сохранять информацию о палитре в нём.

Не помогает... Вот код с примером:

Код - C# [Выбрать]
  1. // © Andrey Bushman, 2013
  2. using System;
  3. using Microsoft.Win32;
  4. using System.IO;
  5.  
  6. using cad = Autodesk.AutoCAD.ApplicationServices.Application;
  7. using App = Autodesk.AutoCAD.ApplicationServices;
  8. using Db = Autodesk.AutoCAD.DatabaseServices;
  9. using Ed = Autodesk.AutoCAD.EditorInput;
  10. using Rtm = Autodesk.AutoCAD.Runtime;
  11. using Win = Autodesk.AutoCAD.Windows;
  12.  
  13. [assembly: Rtm.CommandClass(typeof(Bushman.CAD.Problems.Commands))]
  14. [assembly: Rtm.ExtensionApplication(typeof(Bushman.CAD.Problems.Commands))]
  15.  
  16. namespace Bushman.CAD.Problems {
  17.  
  18.         public class Commands : Rtm.IExtensionApplication {
  19.  
  20.                 internal static Win.PaletteSet palette_set = null;
  21.  
  22.                 [Rtm.CommandMethod("cmd_3", Rtm.CommandFlags.Modal)]
  23.                 public void Command_3() {
  24.                         Ed.Editor ed = cad.DocumentManager.MdiActiveDocument.Editor;
  25.                         if (palette_set == null) {
  26.                                 // This settings will be saved into the
  27.                                 // %AppData%\Autodesk\AutoCAD 2014\R19.1\enu\Support\Profiles\Unnamed Profile\Profile.aws
  28.                                 // if the current profile is <<Unnamed Profile>>.
  29.                                 palette_set = new Win.PaletteSet("My Palette",
  30.                                         new Guid("{49DBC66F-21BE-4D9F-A5A9-BA750543042E}"));
  31.                                 palette_set.Load += new Win.PalettePersistEventHandler(palette_set_Load);
  32.                                 cad.DocumentManager.DocumentToBeDestroyed += new App.DocumentCollectionEventHandler(
  33.                                         DocumentManager_DocumentToBeDestroyed);
  34.                         }
  35.  
  36.                         palette_set.KeepFocus = true;
  37.                         palette_set.Visible = true;
  38.                 }
  39.  
  40.                 void DocumentManager_DocumentToBeDestroyed(object sender, App.DocumentCollectionEventArgs e) {
  41.                         palette_set_Save(null, _palette_set);
  42.                 }
  43.  
  44.                 static App.IConfigurationSection _palette_set = null;
  45.  
  46.                 // This names can't to contain the spaces!
  47.                 const String name = "AAA";
  48.                 const String name2 = "BBB";
  49.                 const String val_1_name = "Value_1";
  50.                 const String val_2_name = "Value_2";
  51.  
  52.                 void palette_set_Load(object sender, Win.PalettePersistEventArgs e) {
  53.                         App.IConfigurationSection section = _palette_set = e.ConfigurationSection;
  54.                         App.IConfigurationSection subsection = null;
  55.                         App.IConfigurationSection subsection2 = null;
  56.  
  57.                         if (!section.IsReadOnly) {
  58.                                 subsection = section.ContainsSubsection(name) ?
  59.                                 section.OpenSubsection(name) : section.CreateSubsection(name);
  60.  
  61.                                 if (!subsection.IsReadOnly) {
  62.                                         subsection2 = subsection.ContainsSubsection(name2) ?
  63.                                         subsection.OpenSubsection(name2) : subsection.CreateSubsection(name2);
  64.                                 }
  65.                                 Int32 val_1 = (Int32)subsection2.ReadProperty(val_1_name, 100);
  66.                                 Int32 val_2 = (Int32)subsection2.ReadProperty(val_2_name, 200);
  67.                         }
  68.                 }
  69.  
  70.                 void palette_set_Save(object sender, App.IConfigurationSection section) {
  71.                         if (section == null || section.IsReadOnly)
  72.                                 return;
  73.                         App.IConfigurationSection subsection = null;
  74.                         App.IConfigurationSection subsection2 = null;
  75.  
  76.                         // TODO: The problem is here!!!
  77.                         // Here execution of code interrupts... Maybe IConfigurationSection is disposed already...
  78.                         subsection = section.ContainsSubsection(name) ?
  79.                         section.OpenSubsection(name) : section.CreateSubsection(name);
  80.  
  81.                         if (!subsection.IsReadOnly) {
  82.                                 subsection2 = subsection.ContainsSubsection(name2) ?
  83.                                 subsection.OpenSubsection(name2) : subsection.CreateSubsection(name2);
  84.                         }
  85.                         subsection2.WriteProperty(val_1_name, 700);
  86.                         subsection2.WriteProperty(val_2_name, 800);
  87.                 }
  88.  
  89.  
  90.                 public void Initialize() {
  91.                         Ed.Editor ed = cad.DocumentManager.MdiActiveDocument.Editor;
  92.                         ed.WriteMessage("The 'Hello World' is loaded... \n");
  93.                 }
  94.  
  95.                 public void Terminate() {
  96.                         // throw new NotImplementedException();
  97.                 }
  98.         }
  99. }

В комментариях я пометил строку кода, в которой возникают две ошибки (строка 76), одна за другой. Получаю два сообщения (смотрим скрины). Что в этот раз может быть не так?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Мне нравится исключение с сообщением "Операция завершена успешно." :)
Интересно, а если их обернуть в try/catch - работать будет нормально?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Мне нравится исключение с сообщением "Операция завершена успешно." :-)
А мне уж как-то давно не весело. И так изо всех сил внимательно смотрю под ноги, чтобы ботинки не запачкать в этом поле, но не помогает: куда не наступлю - везде "попадаю в цель"... Я один такой "везучий"? :(