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

12/10/2015

Закрепление панелей инструментов в рядах с использованием CUI API

Создание и закрепление панелей в AutoCAD API представлено в COM API. Хотя панели можно закреплять при помощи COM API, в нём нет возможности организовывать панели в несколько рядов. Сам AutoCAD использует внутри себя метод закрепления панелей в рядах, который не представлен в COM API.

Способ обойти это ограничение заключается в использовании для настройки панелей инструментов в рабочем пространстве при помощи CUI API. Вот пример кода, который организует панели инструментов в текущем рабочем пространстве, как показано на следующем скриншоте. Все остальные панели инструментов в текущем рабочем пространстве скрыты. При необходимости вы можете модифицировать код, чтобы показать другие панели.

Вот расположение панелей инструментов, которое мы хотим получить:

Ряд: 0 Колонка: 0 – Гладкая сеть (Smooth Mesh)

Ряд: 1 Колонка: 0 – Сглаживание сетевых примитивов (Smooth Mesh Primitives)

Ряд: 0 Колонка: 1 – Рисование (Draw)

Ряд: 1 Колонка: 1 – Порядок прорисовки (Draw order)

Ряд: 0 Колонка: 2 – Стандартная (Standard)

Ряд: 1 Колонка: 2 – Стандарты оформления (CAD Standard)

 

Код - C#: [Выделить]
  1. using  Autodesk.AutoCAD.Customization;
  2.  
  3.  [DllImport("accore.dll" , CharSet = CharSet.Ansi,
  4.  CallingConvention = CallingConvention.Cdecl,
  5.  EntryPoint = "acedCmdS" )]
  6.  private  static  extern  int  acedCmdS(System.IntPtr vlist);
  7.  
  8.  [CommandMethod("SetDockedToolbars" )]
  9.  public  void  SetDockedToolbarsMethod()
  10.  {
  11.      Document activeDoc
  12.                = Application.DocumentManager.MdiActiveDocument;
  13.      Database db = activeDoc.Database;
  14.      Editor ed = activeDoc.Editor;
  15.  
  16.      string mainCuiFile =
  17.                (string)Application.GetSystemVariable("MENUNAME" );
  18.      mainCuiFile += ".cuix" ;
  19.      CustomizationSection cs
  20.                = new  CustomizationSection(mainCuiFile);
  21.  
  22.      string curWorkspace =
  23.                (string)Application.GetSystemVariable("WSCURRENT" );
  24.      Workspace ws = cs.getWorkspace(curWorkspace); 
  25.      // Выключаем все панели в рабочем пространстве.
  26.      // Позднее мы включим только те, которые нам нужны,
  27.      // и закрепим их
  28.      foreach (WorkspaceToolbar wsTb in ws.WorkspaceToolbars)
  29.      {
  30.          wsTb.Display = 0;
  31.      }
  32.  
  33.      // Панель Гладкая сеть
  34.      Toolbar tbSmoothMesh =
  35.                cs.MenuGroup.Toolbars.
  36.                FindToolbarWithName("Гладкая сеть" );
  37.      WorkspaceToolbar wsTbSmoothMesh =
  38.                ws.WorkspaceToolbars.FindWorkspaceToolbar
  39.                (tbSmoothMesh.ElementID, cs.MenuGroup.Name);
  40.  
  41.      if (wsTbSmoothMesh == null)
  42.      {
  43.          wsTbSmoothMesh = new  WorkspaceToolbar(ws, tbSmoothMesh);
  44.          ws.WorkspaceToolbars.Add(wsTbSmoothMesh);
  45.      }
  46.      wsTbSmoothMesh.Display = 1;
  47.      wsTbSmoothMesh.ToolbarOrient = ToolbarOrient.left;
  48.      wsTbSmoothMesh.DockRow = 0;
  49.      wsTbSmoothMesh.DockColumn = 0;
  50.  
  51.      // Панель Сглаживание сетевых примитивов
  52.      Toolbar tbSmoothMeshPrimitives
  53.                = cs.MenuGroup.Toolbars.FindToolbarWithName
  54.                ("Сглаживание сетевых примитивов" );
  55.      WorkspaceToolbar wsTbSmoothMeshPrimitives
  56.                = ws.WorkspaceToolbars.FindWorkspaceToolbar
  57.                (tbSmoothMeshPrimitives.ElementID, cs.MenuGroup.Name);
  58.      if (wsTbSmoothMeshPrimitives == null)
  59.      {
  60.          wsTbSmoothMeshPrimitives =
  61.                        new  WorkspaceToolbar(ws, tbSmoothMeshPrimitives);
  62.          ws.WorkspaceToolbars.Add(wsTbSmoothMeshPrimitives);
  63.      }
  64.      wsTbSmoothMeshPrimitives.Display = 1;
  65.      wsTbSmoothMeshPrimitives.ToolbarOrient = ToolbarOrient.left;
  66.      wsTbSmoothMeshPrimitives.DockRow = 1;
  67.      wsTbSmoothMeshPrimitives.DockColumn = 0;
  68.  
  69.      // Панель Рисование
  70.      Toolbar tbDraw =
  71.                cs.MenuGroup.Toolbars.FindToolbarWithName("Рисование" );
  72.      WorkspaceToolbar wsTbDraw =
  73.                ws.WorkspaceToolbars.FindWorkspaceToolbar
  74.                (tbDraw.ElementID, cs.MenuGroup.Name);
  75.      if (wsTbDraw == null)
  76.      {
  77.          wsTbDraw = new  WorkspaceToolbar(ws, tbDraw);
  78.          ws.WorkspaceToolbars.Add(wsTbDraw);
  79.      }
  80.      wsTbDraw.Display = 1;
  81.      wsTbDraw.ToolbarOrient = ToolbarOrient.left;
  82.      wsTbDraw.DockRow = 0;
  83.      wsTbDraw.DockColumn = 1;
  84.  
  85.      // Панель Порядок прорисовки
  86.      Toolbar tbDrawOrder =
  87.                cs.MenuGroup.Toolbars.FindToolbarWithName("Порядок прорисовки" );
  88.      WorkspaceToolbar wsTbDrawOrder =
  89.                ws.WorkspaceToolbars.FindWorkspaceToolbar
  90.                (tbDrawOrder.ElementID, cs.MenuGroup.Name);
  91.      if (wsTbDrawOrder == null)
  92.      {
  93.          wsTbDrawOrder = new  WorkspaceToolbar(ws, tbDrawOrder);
  94.          ws.WorkspaceToolbars.Add(wsTbDrawOrder);
  95.      }
  96.      wsTbDrawOrder.Display = 1;
  97.      wsTbDrawOrder.ToolbarOrient = ToolbarOrient.left;
  98.      wsTbDrawOrder.DockRow = 1;
  99.      wsTbDrawOrder.DockColumn = 1;
  100.  
  101.      // Панель Стандартная
  102.      Toolbar tbStandard =
  103.                cs.MenuGroup.Toolbars.FindToolbarWithName("Стандартная" );
  104.      WorkspaceToolbar wsTbStandard =
  105.                ws.WorkspaceToolbars.FindWorkspaceToolbar
  106.                (tbStandard.ElementID, cs.MenuGroup.Name);
  107.      if (wsTbStandard == null)
  108.      {
  109.          wsTbStandard = new  WorkspaceToolbar(ws, tbStandard);
  110.          ws.WorkspaceToolbars.Add(wsTbStandard);
  111.      }
  112.      wsTbStandard.Display = 1;
  113.      wsTbStandard.ToolbarOrient = ToolbarOrient.left;
  114.      wsTbStandard.DockRow = 0;
  115.      wsTbStandard.DockColumn = 2;
  116.  
  117.      // Панель Стандарты оформления
  118.      Toolbar tbCADStandards =
  119.                cs.MenuGroup.Toolbars.FindToolbarWithName
  120.                ("Стандарты оформления");
  121.      WorkspaceToolbar wsTbCADStandards
  122.                = ws.WorkspaceToolbars.FindWorkspaceToolbar
  123.                (tbCADStandards.ElementID, cs.MenuGroup.Name);
  124.      if (wsTbCADStandards == null)
  125.      {
  126.          wsTbCADStandards =
  127.                        new  WorkspaceToolbar(ws, tbCADStandards);
  128.          ws.WorkspaceToolbars.Add(wsTbCADStandards);
  129.      }
  130.      wsTbCADStandards.Display = 1;
  131.      wsTbCADStandards.ToolbarOrient = ToolbarOrient.left;
  132.      wsTbCADStandards.DockRow = 1;
  133.      wsTbCADStandards.DockColumn = 2;
  134.  
  135.      saveCui(cs);
  136.  }
  137.  
  138.  public  static  void  saveCui(CustomizationSection cs)
  139.  {
  140.      if  (cs.IsModified)
  141.          cs.Save();
  142.  
  143.      ResultBuffer rb = new  ResultBuffer();
  144.      rb.Add(new  TypedValue(5005, "_FILEDIA" ));
  145.      rb.Add(new  TypedValue(5005, "0" ));
  146.      acedCmdS(rb.UnmanagedObject);
  147.  
  148.      string cuiMenuGroup = cs.MenuGroup.Name;
  149.      rb = new  ResultBuffer();
  150.      rb.Add(new  TypedValue(5005, "_CUIUNLOAD" ));
  151.      rb.Add(new  TypedValue(5005, cuiMenuGroup));
  152.      acedCmdS(rb.UnmanagedObject);
  153.  
  154.      string cuiFileName = cs.CUIFileName;
  155.      rb = new  ResultBuffer();
  156.      rb.Add(new  TypedValue(5005, "_CUILOAD" ));
  157.      rb.Add(new  TypedValue(5005, cuiFileName));
  158.  
  159.      acedCmdS(rb.UnmanagedObject);
  160.      ResultBuffer rb = new  ResultBuffer();
  161.      rb.Add(new  TypedValue(5005, "_FILEDIA" ));
  162.      rb.Add(new  TypedValue(5005, "1" ));
  163.      acedCmdS(rb.UnmanagedObject);
  164.  
  165.  }

 

Источник: http://adndevblog.typepad.com/autocad/2015/10/docking-toolbars-in-rows-using-cui-api.html

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

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

Опубликовано 12.10.2015
Отредактировано 13.10.2015 в 00:17:12