26/12/2016
Как можно создать фильтр, содержащий все типы кривых в чертеже
Вопрос: Мне нужно дать возможность пользователю выбирать любые типы кривых - все типы полилиний, сплайны, дуги и т.д., и в том числе и пока неизвестные пользовательские кривые… Как это можно сделать?
Ответ: Для этой цели следует проанализировать SystemObjects.ClassDictionary, найти все классы-наследники класса Curve и получить их DXF-коды. Ниже приведен код, который реализует этот алгоритм:
Код - C#: [Выделить]
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.Text;
- using Autodesk.AutoCAD.Runtime;
- using Autodesk.AutoCAD.ApplicationServices;
- using Autodesk.AutoCAD.DatabaseServices;
- using Autodesk.AutoCAD.Geometry;
- using Autodesk.AutoCAD.EditorInput;
- [assembly: CommandClass(typeof(Rivilis.FilterCurve))]
- namespace Rivilis
- {
- public class FilterCurve
- {
- [CommandMethod("FilterCurves")]
- public void FilterCurves()
- {
- Document doc = Application.DocumentManager.MdiActiveDocument;
- if (doc == null) return;
- Editor ed = doc.Editor;
- string filtrStr = DXFNamesString(typeof(Curve),false);
- ed.WriteMessage("\nФильтр DXF = {0}", filtrStr); // Только для отладки
- SelectionFilter sf = new SelectionFilter(
- new TypedValue[] {
- new TypedValue((int)DxfCode.Start, filtrStr)
- }
- );
- PromptSelectionResult rs = ed.GetSelection(sf);
- }
- /// <summary>
- /// Получение строки, содержащей DXF имена класса (классов)
- /// Имена разделены запятой, как требуется для шаблонов фильтрации
- /// </summary>
- /// <param name="type">Тип объекта</param>
- /// <param name="exact">Тип соотвествует точно или это производный класс?</param>
- /// <returns></returns>
- public static string DXFNamesString(Type type, bool exact)
- {
- RXClass cls = RXClass.GetClass(type);
- List<string> names = new List<string>();
- StringBuilder dxfs = new StringBuilder();
- Dictionary classDict = SystemObjects.ClassDictionary;
- foreach (DictionaryEntry entry in classDict) {
- RXClass curCls = (RXClass)((DictionaryEntry)entry).Value;
- if (exact ? curCls == cls : curCls.IsDerivedFrom(cls)) {
- string dxfname = curCls.DxfName;
- if (dxfname != null && dxfname.Length != 0 && !names.Contains(dxfname)) {
- names.Add(dxfname);
- }
- }
- }
- names.Sort(); // Только для красоты
- if (names.Count > 0) {
- dxfs.Append(names[0]);
- for (int i = 1; i < names.Count; i++) {
- dxfs.Append(",").Append(names[i]);
- }
- }
- return dxfs.ToString();
- }
- }
- }
Видео работы команды _FilterCurves:
Автор: Александр Ривилис
Обсуждение: http://adn-cis.org/forum/index.php?topic=7533
Опубликовано 26.12.2016