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

17/02/2014

Как оставить видимыми элементы Ленты во время выполнения?

AutoCAD API для работы с Лентой - достаточно удобен для настройки интерфейса. Однако изменения в интерфейсе не являются постоянными. Это значит, что есть ситуации когда требуется дополнительный код для того, чтобы элементы Ленты, созданные через этот API, оставались видимыми: обычно это при переключении Рабочего пространства или когда что-то изменено в командах НПИ (_CUI) и БЫСТРНПИ (_QUICKCUI).

Вот как можно оставить эти элементы видимыми и убедиться, что ваша Лента остается видимой.

Код - C#: [Выделить]
  1. [CommandMethod("SimpleButton")]
  2. public void SimpleButton()
  3. {
  4.     Autodesk.AutoCAD.ApplicationServices.Application.
  5.         SystemVariableChanged +=
  6.         new Autodesk.AutoCAD.ApplicationServices.
  7.             SystemVariableChangedEventHandler(
  8.             Application_SystemVariableChanged);
  9.  
  10.     Autodesk.AutoCAD.ApplicationServices.Application.
  11.         DocumentManager.MdiActiveDocument.CommandEnded +=
  12.         new CommandEventHandler(MdiActiveDocument_CommandEnded);
  13.  
  14.     CreateSimpleButton();
  15. }
  16.  
  17. void MdiActiveDocument_CommandEnded(
  18.     object sender, CommandEventArgs e)
  19. {
  20.     if (e.GlobalCommandName == "QUICKCUI" ||
  21.         e.GlobalCommandName == "CUI")
  22.     {
  23.         Autodesk.AutoCAD.ApplicationServices.Application.Idle +=
  24.             new EventHandler(Application_Idle);
  25.     }
  26. }
  27.  
  28. void Application_Idle(object sender, EventArgs e)
  29. {
  30.     if (Autodesk.Windows.ComponentManager.Ribbon != null)
  31.     {
  32.         Autodesk.AutoCAD.ApplicationServices.Application.Idle -=
  33.             new EventHandler(Application_Idle);
  34.  
  35.         CreateSimpleButton();
  36.     }
  37. }
  38.  
  39. void Application_SystemVariableChanged(
  40.     object sender,
  41.     Autodesk.AutoCAD.ApplicationServices.
  42.     SystemVariableChangedEventArgs e)
  43. {
  44.     if (e.Name == "WSCURRENT")
  45.     {
  46.         string cmdNames =
  47.             (string)Autodesk.AutoCAD.ApplicationServices.Application.
  48.                 GetSystemVariable(
  49.                     "CMDNAMES");
  50.                
  51.         // Если команда QUICKCUI или CUI активна - выходим
  52.         if (cmdNames.ToUpper().IndexOf("QUICKCUI") >= 0 ||
  53.             cmdNames.ToUpper().IndexOf("CUI") >= 0)
  54.             return;
  55.                
  56.         CreateSimpleButton();
  57.     }
  58. }
  59.  
  60. public void CreateSimpleButton()
  61. {
  62.     Autodesk.Windows.RibbonControl ribbonControl =
  63.         Autodesk.Windows.ComponentManager.Ribbon;
  64.  
  65.     RibbonTab Tab = new RibbonTab();
  66.     Tab.Title = "Проверяем Ленту ";
  67.     Tab.Id = "TESTRIBBON_TAB_ID";
  68.  
  69.     ribbonControl.Tabs.Add(Tab);
  70.  
  71.     Autodesk.Windows.RibbonPanelSource srcPanel =
  72.         new RibbonPanelSource();
  73.     srcPanel.Title = "Панель1";
  74.  
  75.     RibbonPanel Panel = new RibbonPanel();
  76.     Panel.Source = srcPanel;
  77.     Tab.Panels.Add(Panel);
  78.  
  79.     Autodesk.Windows.RibbonButton button1 = new RibbonButton();
  80.     button1.Text = "Кнопка";
  81.     button1.Size = RibbonItemSize.Large;
  82.     button1.Image =
  83.         getBitmap(Properties.Resources.Apps, 16, 16);
  84.     button1.LargeImage =
  85.         getBitmap(Properties.Resources.Apps, 32, 32);
  86.     button1.ShowText = true;
  87.     button1.CommandParameter = "._LINE ";
  88.     button1.CommandHandler = new SimpleButtonCmdHandler();
  89.  
  90.     srcPanel.Items.Add(button1);
  91.            
  92.     Tab.IsActive = true;
  93. }
  94.  
  95. // Использование: getBitmap(Properties.Resources.a_large);
  96. BitmapImage getBitmap(Bitmap bitmap, int height, int width)
  97. {
  98.     MemoryStream stream = new MemoryStream();
  99.     bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
  100.  
  101.     BitmapImage bmp = new BitmapImage();
  102.     bmp.BeginInit();
  103.     bmp.StreamSource = new MemoryStream(stream.ToArray());
  104.     bmp.DecodePixelHeight = height;
  105.     bmp.DecodePixelWidth = width;
  106.     bmp.EndInit();
  107.  
  108.     return bmp;
  109. }
  110.  
  111. public class SimpleButtonCmdHandler :
  112.     System.Windows.Input.ICommand
  113. {
  114.     public bool CanExecute(object parameter)
  115.     {
  116.         return true;
  117.     }
  118.  
  119.     public event EventHandler CanExecuteChanged;
  120.  
  121.     public void Execute(object parameter)
  122.     {
  123.         if (parameter is RibbonButton)
  124.         {
  125.             // Создаем последовательность из ESC для завершения активной команды
  126.             string esc = "";
  127.  
  128.             string cmds =
  129.             (string)Autodesk.AutoCAD.ApplicationServices.Application.
  130.                 GetSystemVariable("CMDNAMES");
  131.  
  132.             if (cmds.Length > 0)
  133.             {
  134.                 int cmdNum = cmds.Split(new char[] { '\'' }).Length;
  135.  
  136.                 for (int i = 0; i < cmdNum; i++)
  137.                     esc += '\x03';
  138.             }
  139.  
  140.             RibbonButton button = parameter as RibbonButton;
  141.  
  142.             Document doc =
  143.                 Autodesk.AutoCAD.ApplicationServices.Application.
  144.                     DocumentManager.MdiActiveDocument;
  145.  
  146.             doc.SendStringToExecute(esc + button.CommandParameter,
  147.                 true, false, false);
  148.         }
  149.     }
  150. }

 

Источник: http://adndevblog.typepad.com/autocad/2014/01/how-to-ensure-your-ribbon-runtime-items-remain-visible.html

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

Опубликовано 17.02.2014
Отредактировано 17.02.2014 в 11:21:48