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

19/11/2014

Как управлять Параметрами скрытых сообщений в .NET

Вопрос:

В AutoCAD имеется ряд диалоговых окон, которые имеют метки, предотвращающие повторный вызов этих диалоговых окон в дальнейшем.

Например, диалоговое окно «Ссылки – необработанные файлы ссылок»:

 

В команде Настройка (OPTIONS) можно управлять видимостью этих диалоговых окон:

 

А можно ли управлять появлением этих диалоговых окон из AutoCAD .NET API?

Ответ:

Фэнтон Уэбб в своей статье описывает как это можно сделать при помощи ObjectARX. Основная мысль этой статьи – в файле FixedProfile.aws, который явлется xml-файлом, есть раздел <HideableDialogs>, содержащий узлы <HideableDialog> приблизительно такого вида:

Код - XML: [Выделить]
  1. <HideableDialogs>
  2.   <HideableDialog id="AcPublish.SaveSheetList" title="Публикация — сохранение списка листов" category="Публикация" application="" result="6">
  3.     <Preview>
  4.       <TaskDialog Source="/AcTaskDialogs;component/TaskDialogs.xaml" Id="AcPublish.SaveSheetList" xmlns="clr-namespace:Autodesk.Windows;assembly=AdWindows"/>
  5.     </Preview>
  6.   </HideableDialog>
  7.   <HideableDialog id="Acad.UnresolvedFontFiles" title="Отсутствуют файлы SHX" category="Отсутствуют файлы SHX" application="" result="1002">
  8.     <Preview>
  9.       <TaskDialog Source="/AcTaskDialogs;component/TaskDialogs.xaml" Id="Acad.UnresolvedFontFiles" xmlns="clr-namespace:Autodesk.Windows;assembly=AdWindows"></TaskDialog>
  10.     </Preview>
  11.   </HideableDialog>
  12.   <HideableDialog id="AecUiBase.PreviousVersionOpen" title="Открытие чертежа - Обнаружены старые AD-объекты" category="Предупреждение о конфликте версий" application="AutoCAD 2015 — Русский (Russian)" result="8">
  13.     <Preview>C:\Temp\AecUiBase.PreviousVersionOpen.xaml</Preview>
  14.   </HideableDialog>
  15.   <HideableDialog id="Acad.UnresolvedReferenceFiles" title="Всегда игнорировать необработанные ссылки и продолжать" category="Внешние ссылки" application="AutoCAD" result="0">
  16.     <Preview>
  17.       <TaskDialog Source="/AcTaskDialogs;component/TaskDialogs.xaml" Id="Acad.UnresolvedReferenceFiles" xmlns="clr-namespace:Autodesk.Windows;assembly=AdWindows"></TaskDialog>
  18.     </Preview>
  19.   </HideableDialog>
  20. </HideableDialogs>

Имеется недокументированное внутренне API, которое позволяет получить доступ к свойствам такого диалога:

AdHideableDialogSettingsDictionary* pDict = AdTaskDialog::GetHideableDialogSettingsDictionary();

Для того, чтобы разрешить/запретить какой-нибудь диалог необходимо заглянуть в FixedProfile.aws и посмотреть какой id у нужного нам диалога. Например, для диалога внешних ссылок id = "Acad.UnresolvedReferenceFiles":

<HideableDialog id="Acad.UnresolvedReferenceFiles" title="Всегда игнорировать необработанные ссылки и продолжать" category="Внешние ссылки" application="AutoCAD" result="0">

Теперь достаточно вызвать

pDict->SetResult("Acad.UnresolvedReferenceFiles", true);
и этот диалог больше не появится.

Как оказалось имеется аналогичное недокументированное API и для .NET. В частности TaskDialog.HideableDialogSettingsDictionary. В результате для разрешения/запрещения диалога необработанных внешних ссылок можно написать такой код:

Код - C#: [Выделить]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.Geometry;
  6. using Autodesk.AutoCAD.EditorInput;
  7. using Autodesk.Windows;                   // AdWindow.dll && AcWindow.dll
  8. using Autodesk.Internal.Windows;          // AdWindow.dll && AcWindow.dll
  9. using Autodesk.AutoCAD.Internal.Windows;  // AdWindow.dll && AcWindow.dll
  10. using AcRx = Autodesk.AutoCAD.Runtime;
  11. using AcAp = Autodesk.AutoCAD.ApplicationServices;
  12. using AcDb = Autodesk.AutoCAD.DatabaseServices;
  13. using AcGe = Autodesk.AutoCAD.Geometry;
  14. using AcEd = Autodesk.AutoCAD.EditorInput;
  15. using AW = Autodesk.Windows;
  16. using AIW = Autodesk.Internal.Windows;
  17. using AAIW = Autodesk.AutoCAD.Internal.Windows;
  18. using app = Autodesk.AutoCAD.ApplicationServices.Application;
  19.  
  20. [assembly: CommandClass(typeof(HideSialogs.Utils))]
  21.  
  22. namespace HideSialogs
  23. {
  24.   public class Utils
  25.   {
  26.     [CommandMethod("HideXrefDialog")]
  27.     public void HideXrefDialog()
  28.     {
  29.       SetXrefDialogHideButton(true);
  30.     }
  31.     [CommandMethod("UnHideXrefDialog")]
  32.     public void UnHideXrefDialog()
  33.     {
  34.       SetXrefDialogHideButton(false);
  35.     }
  36.     void SetXrefDialogHideButton(bool bHide)
  37.     {
  38.       AIW.HideableDialogSettingsDictionary dictHide =
  39.         AW.TaskDialog.HideableDialogSettingsDictionary;
  40.       if (!dictHide.ContainsKey("Acad.UnresolvedReferenceFiles"))
  41.       {
  42.         AIW.HideableDialogSettings elem = new AIW.HideableDialogSettings();
  43.         elem.Id = "Acad.UnresolvedReferenceFiles";
  44.         int lcid = AcRx.SystemObjects.DynamicLinker.ProductLcid;
  45.         elem.Category = (lcid == 1049) ? "Внешние ссылки" : "External References";
  46.         elem.Title = (lcid == 1049) ?
  47.           "Всегда игнорировать необработанные ссылки и продолжать" :
  48.           "Always ignore unresolved references and continue" ;
  49.         elem.Application = "AutoCAD";
  50.         elem.Result = bHide ? 1 : 0;
  51.         dictHide.Add(elem);
  52.       }
  53.       else
  54.       {
  55.         dictHide.SetResult("Acad.UnresolvedReferenceFiles", bHide ? 1 : 0);
  56.       }
  57.       dictHide.Save();
  58.       // Сохраняем и снова считываем словарь
  59.       AAIW.ProfileManager.SaveHideableDialogSettingsDictionary();
  60.       AAIW.ProfileManager.LoadHideableDialogSettingsDictionary();
  61.     }
  62.   }
  63. }

Команда HideXrefDialog предотвращает показ диалога, а команда UnHideXrefDialog разрешает показ его.

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

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

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