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

26/12/2016

Как можно создать фильтр, содержащий все типы кривых в чертеже

Вопрос: Мне нужно дать возможность пользователю выбирать любые типы кривых - все типы полилиний, сплайны, дуги и т.д., и в том числе и пока неизвестные пользовательские кривые… Как это можно сделать?

Ответ: Для этой цели следует проанализировать SystemObjects.ClassDictionary, найти все классы-наследники класса Curve и получить их DXF-коды. Ниже приведен код, который реализует этот алгоритм:

Код - C#: [Выделить]
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Text;
  5. using Autodesk.AutoCAD.Runtime;
  6. using Autodesk.AutoCAD.ApplicationServices;
  7. using Autodesk.AutoCAD.DatabaseServices;
  8. using Autodesk.AutoCAD.Geometry;
  9. using Autodesk.AutoCAD.EditorInput;
  10.  
  11. [assembly: CommandClass(typeof(Rivilis.FilterCurve))]
  12.  
  13. namespace Rivilis
  14. {
  15.   public class FilterCurve
  16.   {
  17.     [CommandMethod("FilterCurves")]
  18.     public void FilterCurves()
  19.     {
  20.       Document doc = Application.DocumentManager.MdiActiveDocument;
  21.       if (doc == null) return;
  22.       Editor ed = doc.Editor;
  23.       string filtrStr = DXFNamesString(typeof(Curve),false);
  24.       ed.WriteMessage("\nФильтр DXF = {0}", filtrStr); // Только для отладки
  25.       SelectionFilter sf = new SelectionFilter(
  26.         new TypedValue[] {
  27.           new TypedValue((int)DxfCode.Start, filtrStr)
  28.         }
  29.       );
  30.       PromptSelectionResult rs = ed.GetSelection(sf);
  31.     }
  32.     /// <summary>
  33.     /// Получение строки, содержащей DXF имена класса (классов)
  34.     /// Имена разделены запятой, как требуется для шаблонов фильтрации
  35.     /// </summary>
  36.     /// <param name="type">Тип объекта</param>
  37.     /// <param name="exact">Тип соотвествует точно или это производный класс?</param>
  38.     /// <returns></returns>
  39.     public static string DXFNamesString(Type type, bool exact)
  40.     {
  41.       RXClass cls = RXClass.GetClass(type);
  42.       List<string> names = new List<string>();
  43.       StringBuilder dxfs = new StringBuilder();
  44.       Dictionary classDict = SystemObjects.ClassDictionary;
  45.       foreach (DictionaryEntry entry in classDict) {
  46.         RXClass curCls = (RXClass)((DictionaryEntry)entry).Value;
  47.         if (exact ? curCls == cls : curCls.IsDerivedFrom(cls)) {
  48.           string dxfname = curCls.DxfName;
  49.           if (dxfname != null && dxfname.Length != 0 && !names.Contains(dxfname)) {
  50.             names.Add(dxfname);
  51.           }
  52.         }
  53.       }
  54.       names.Sort(); // Только для красоты
  55.       if (names.Count > 0) {
  56.         dxfs.Append(names[0]);
  57.         for (int i = 1; i < names.Count; i++) {
  58.           dxfs.Append(",").Append(names[i]);
  59.         }
  60.       }
  61.       return dxfs.ToString();
  62.     }
  63.   }
  64. }

 

Видео работы команды _FilterCurves:

 

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

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

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