Как управлять Параметрами скрытых сообщений в .NET
Вопрос:
В AutoCAD имеется ряд диалоговых окон, которые имеют метки, предотвращающие повторный вызов этих диалоговых окон в дальнейшем.
Например, диалоговое окно «Ссылки – необработанные файлы ссылок»:
В команде Настройка (OPTIONS) можно управлять видимостью этих диалоговых окон:
А можно ли управлять появлением этих диалоговых окон из AutoCAD .NET API?
Ответ:
Фэнтон Уэбб в своей статье описывает как это можно сделать при помощи ObjectARX. Основная мысль этой статьи – в файле FixedProfile.aws, который явлется xml-файлом, есть раздел <HideableDialogs>, содержащий узлы <HideableDialog> приблизительно такого вида:
- <HideableDialogs>
- <HideableDialog id="AcPublish.SaveSheetList" title="Публикация — сохранение списка листов" category="Публикация" application="" result="6">
- <Preview>
- <TaskDialog Source="/AcTaskDialogs;component/TaskDialogs.xaml" Id="AcPublish.SaveSheetList" xmlns="clr-namespace:Autodesk.Windows;assembly=AdWindows"/>
- </Preview>
- </HideableDialog>
- <HideableDialog id="Acad.UnresolvedFontFiles" title="Отсутствуют файлы SHX" category="Отсутствуют файлы SHX" application="" result="1002">
- <Preview>
- <TaskDialog Source="/AcTaskDialogs;component/TaskDialogs.xaml" Id="Acad.UnresolvedFontFiles" xmlns="clr-namespace:Autodesk.Windows;assembly=AdWindows"></TaskDialog>
- </Preview>
- </HideableDialog>
- <HideableDialog id="AecUiBase.PreviousVersionOpen" title="Открытие чертежа - Обнаружены старые AD-объекты" category="Предупреждение о конфликте версий" application="AutoCAD 2015 — Русский (Russian)" result="8">
- <Preview>C:\Temp\AecUiBase.PreviousVersionOpen.xaml</Preview>
- </HideableDialog>
- <HideableDialog id="Acad.UnresolvedReferenceFiles" title="Всегда игнорировать необработанные ссылки и продолжать" category="Внешние ссылки" application="AutoCAD" result="0">
- <Preview>
- <TaskDialog Source="/AcTaskDialogs;component/TaskDialogs.xaml" Id="Acad.UnresolvedReferenceFiles" xmlns="clr-namespace:Autodesk.Windows;assembly=AdWindows"></TaskDialog>
- </Preview>
- </HideableDialog>
- </HideableDialogs>
Имеется недокументированное внутренне API, которое позволяет получить доступ к свойствам такого диалога:
Для того, чтобы разрешить/запретить какой-нибудь диалог необходимо заглянуть в FixedProfile.aws и посмотреть какой id у нужного нам диалога. Например, для диалога внешних ссылок id = "Acad.UnresolvedReferenceFiles":
Теперь достаточно вызвать
Как оказалось имеется аналогичное недокументированное API и для .NET. В частности TaskDialog.HideableDialogSettingsDictionary. В результате для разрешения/запрещения диалога необработанных внешних ссылок можно написать такой код:
- using System;
- using Autodesk.AutoCAD.Runtime;
- using Autodesk.AutoCAD.ApplicationServices;
- using Autodesk.AutoCAD.DatabaseServices;
- using Autodesk.AutoCAD.Geometry;
- using Autodesk.AutoCAD.EditorInput;
- using Autodesk.Windows; // AdWindow.dll && AcWindow.dll
- using Autodesk.Internal.Windows; // AdWindow.dll && AcWindow.dll
- using Autodesk.AutoCAD.Internal.Windows; // AdWindow.dll && AcWindow.dll
- using AcRx = Autodesk.AutoCAD.Runtime;
- using AcAp = Autodesk.AutoCAD.ApplicationServices;
- using AcDb = Autodesk.AutoCAD.DatabaseServices;
- using AcGe = Autodesk.AutoCAD.Geometry;
- using AcEd = Autodesk.AutoCAD.EditorInput;
- using AW = Autodesk.Windows;
- using AIW = Autodesk.Internal.Windows;
- using AAIW = Autodesk.AutoCAD.Internal.Windows;
- using app = Autodesk.AutoCAD.ApplicationServices.Application;
- [assembly: CommandClass(typeof(HideSialogs.Utils))]
- namespace HideSialogs
- {
- public class Utils
- {
- [CommandMethod("HideXrefDialog")]
- public void HideXrefDialog()
- {
- SetXrefDialogHideButton(true);
- }
- [CommandMethod("UnHideXrefDialog")]
- public void UnHideXrefDialog()
- {
- SetXrefDialogHideButton(false);
- }
- void SetXrefDialogHideButton(bool bHide)
- {
- AIW.HideableDialogSettingsDictionary dictHide =
- AW.TaskDialog.HideableDialogSettingsDictionary;
- if (!dictHide.ContainsKey("Acad.UnresolvedReferenceFiles"))
- {
- AIW.HideableDialogSettings elem = new AIW.HideableDialogSettings();
- elem.Id = "Acad.UnresolvedReferenceFiles";
- int lcid = AcRx.SystemObjects.DynamicLinker.ProductLcid;
- elem.Category = (lcid == 1049) ? "Внешние ссылки" : "External References";
- elem.Title = (lcid == 1049) ?
- "Всегда игнорировать необработанные ссылки и продолжать" :
- "Always ignore unresolved references and continue" ;
- elem.Application = "AutoCAD";
- elem.Result = bHide ? 1 : 0;
- dictHide.Add(elem);
- }
- else
- {
- dictHide.SetResult("Acad.UnresolvedReferenceFiles", bHide ? 1 : 0);
- }
- dictHide.Save();
- // Сохраняем и снова считываем словарь
- AAIW.ProfileManager.SaveHideableDialogSettingsDictionary();
- AAIW.ProfileManager.LoadHideableDialogSettingsDictionary();
- }
- }
- }
Команда HideXrefDialog предотвращает показ диалога, а команда UnHideXrefDialog разрешает показ его.
Автор перевода: Александр Ривилис
Обсуждение: http://adn-cis.org/forum/index.php?topic=1088
Опубликовано 19.11.2014