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

15/01/2014

Синхронизация Ленты и системной переменной

Это пример кода, который показывает в комбобоксе Ленты список возможных значений системной переменной LUNITS и обеспечивает синхронизацию этой переменной и комбобокса. Системная переменная LUNITS используется только для демонстрации возможности  синхронизации и этот код легко адаптируется для других системных переменных AutoCAD.

Код - C#: [Выделить]
  1. // AcMgd.dll
  2. using Autodesk.AutoCAD.Windows.Data;
  3. // AdWindows.dll
  4. using Autodesk.Windows;
  5. // AcWindows.dll
  6. using Autodesk.AutoCAD.Ribbon;
  7.  
  8. public class ExtApp : IExtensionApplication
  9. {
  10.     private String[] lunitValues = new String[]
  11.                                           { "1 - Научные",
  12.                                             "2 - Десятичные",
  13.                                             "3 - Инженерные",
  14.                                             "4 - Архитектурные",
  15.                                             "5 - Дробные"
  16.                                           };
  17.  
  18.     // Создаем вкладку на Ленте, панель и комбобокс для LUNITS
  19.     [CommandMethod("Test")]
  20.     public void createLUNITSRibbonCombo()
  21.     {
  22.         RibbonControl ribCntrl
  23.               = RibbonServices.RibbonPaletteSet.RibbonControl;
  24.  
  25.         RibbonTab ribTab = new RibbonTab();
  26.         ribTab.Title = "Моя вкладка ";
  27.         ribTab.Name = "MyTab";
  28.         ribTab.Id = "MY_TAB_ID";
  29.         ribCntrl.Tabs.Add(ribTab);
  30.  
  31.         RibbonPanelSource ribSourcePanel = new RibbonPanelSource();
  32.         ribSourcePanel.Title = "МояПанель1";
  33.         RibbonPanel ribPanel = new RibbonPanel();
  34.         ribPanel.Source = ribSourcePanel;
  35.         ribTab.Panels.Add(ribPanel);
  36.  
  37.         RibbonCombo lunitsRibbonCombo = new RibbonCombo();
  38.         lunitsRibbonCombo.Name = "LUNITSCombo";
  39.         lunitsRibbonCombo.Id = "AdskLUNITSCombo";
  40.         System.Windows.Data.Binding bind1
  41.                            = new System.Windows.Data.Binding();
  42.         bind1.Source = lunitValues;
  43.         lunitsRibbonCombo.ShowText = true;
  44.         lunitsRibbonCombo.Size = RibbonItemSize.Large;
  45.         lunitsRibbonCombo.ShowImage = false;
  46.         lunitsRibbonCombo.ItemsSourceBinding = bind1;
  47.  
  48.         System.Windows.Data.Binding bind2
  49.                            = new System.Windows.Data.Binding();
  50.         bind2.Path = new System.Windows.PropertyPath(".");
  51.         lunitsRibbonCombo.ItemTemplateTextBinding = bind2;
  52.  
  53.         // Устанавливаем начальное значение
  54.         Int16 index = (Int16)
  55.         Application.UIBindings.SystemVariables["LUNITS"].Value;
  56.  
  57.         lunitsRibbonCombo.Current = lunitValues[index];
  58.  
  59.         lunitsRibbonCombo.CurrentChanged
  60.             += new EventHandler<RibbonPropertyChangedEventArgs>
  61.                                     (ribCombo_CurrentChanged);
  62.  
  63.         ribSourcePanel.Items.Add(lunitsRibbonCombo);
  64.  
  65.         ribTab.IsActive = true;
  66.     }
  67.  
  68.     // Функция обратного вызова отслеживает изменения комбобокса для
  69.     // системной переменной LUNITS и установка системной переменной.
  70.     void ribCombo_CurrentChanged
  71.                         (
  72.                             object sender,
  73.                             RibbonPropertyChangedEventArgs e
  74.                         )
  75.     {
  76.         ILookup<SystemVariable> sysvars
  77.                        = Application.UIBindings.SystemVariables;
  78.         SystemVariable sv = sysvars["LUNITS"];
  79.         String newValue = e.NewValue.ToString();
  80.         int lunits = 1;
  81.  
  82.         // Установим системную переменную на основе значения комбобокса.
  83.         if (int.TryParse(newValue[0].ToString(), out lunits))
  84.         {
  85.             if (!lunits.ToString().Equals(
  86.                 Application.UIBindings.SystemVariables["LUNITS"]
  87.                                             .Value.ToString()))
  88.             {
  89.                 Application.UIBindings.SystemVariables["LUNITS"]
  90.                                                .Value = lunits;
  91.             }
  92.         }
  93.     }
  94.  
  95.     // Функция обратного вызова, отслеживающая изменения системной
  96.     // переменной LUNITS и обновляющая комбобокс на основе значения LUNITS
  97.     void sv_PropertyChanged(
  98.                                 object sender,
  99.                                 PropertyChangedEventArgs e
  100.                             )
  101.     {
  102.         SystemVariable sv = sender as SystemVariable;
  103.         Type svType = sv.GetType();
  104.         PropertyInfo pi = svType.GetProperty(e.PropertyName);
  105.         object propValue = pi.GetValue(sv, null);
  106.         String typeName = propValue.GetType().Name;
  107.  
  108.         Int16 lunits = (Int16)propValue;
  109.  
  110.         RibbonControl ribCntrl
  111.                 = RibbonServices.RibbonPaletteSet.RibbonControl;
  112.         RibbonItem ri = ribCntrl.FindItem("AdskLUNITSCombo", false);
  113.         RibbonCombo ribbonCombo = ri as RibbonCombo;
  114.  
  115.         if (ribbonCombo != null)
  116.         {
  117.             object currentItem = ribbonCombo.Current;
  118.             if (!currentItem.ToString().Equals(
  119.                                     lunitValues[lunits - 1]))
  120.             {
  121.                 ribbonCombo.Current = lunitValues[lunits - 1];
  122.             }
  123.         }
  124.     }
  125.  
  126.     void IExtensionApplication.Initialize()
  127.     {
  128.         // Регистрируем обработчик события изменения
  129.         // системной переменной LUNITS
  130.         ILookup<SystemVariable> sysvars
  131.                       = Application.UIBindings.SystemVariables;
  132.         SystemVariable sv = sysvars["LUNITS"];
  133.         sv.PropertyChanged
  134.          += new PropertyChangedEventHandler(sv_PropertyChanged);
  135.     }
  136.  
  137.     void IExtensionApplication.Terminate()
  138.     {
  139.         // Удаляем обработчик события
  140.         ILookup<SystemVariable> sysvars
  141.                       = Application.UIBindings.SystemVariables;
  142.         SystemVariable sv = sysvars["LUNITS"];
  143.         sv.PropertyChanged
  144.        -= new PropertyChangedEventHandler(sv_PropertyChanged);
  145.     }
  146. }

Источник: http://adndevblog.typepad.com/autocad/2013/07/keeping-a-ribboncombo-in-sync-with-systemvariable.html

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

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