| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
Поиск в этой теме |
|
||||
Регистрация: 19.10.2012
Киев
Сообщений: 749
|
|
|||
|
||||
Регистрация: 10.08.2013
Сообщений: 11,049
|
Цитата:
p.s. Но это другая ветка уже - программирование. |
|||
|
||||
Регистрация: 06.06.2016
Сообщений: 327
|
Цитата:
----- добавлено через ~1 мин. ----- Да тут на форуме каждый второй ЛИСП-программист. Может помогут решить проблему? |
|||
|
||||
Регистрация: 10.08.2013
Сообщений: 11,049
|
ну как то так на скорую руку
// Windows using System; using System.Collections.Generic; // AutoCAD using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.EditorInput; namespace LazyObjectsSelection { public class Commands : IExtensionApplication { /// <summary> /// Элемент списка выделенных объектов для определенного чертежа /// </summary> private struct SelectDrawingObjectsInfo:IComparable<SelectDrawingObjectsInfo> { /// <summary> /// Имя файла DWG /// </summary> public string NameFile; /// <summary> /// Список выделенных объектов /// </summary> public List<ObjectId> ListSelectedObjects; /// <summary> /// Базовый конструктор структуры SelectDrawingObjectsInfo /// </summary> /// <param name="aNameFile">Имя файла DWG</param> public SelectDrawingObjectsInfo(string aNameFile) { NameFile = aNameFile; ListSelectedObjects = new List<ObjectId>(); } /// <summary> /// Реализация сравнения по умолчанию с другой структурой /// </summary> /// <param name="other">Другая структура</param> /// <returns>Результат сравнения</returns> public int CompareTo(SelectDrawingObjectsInfo other) { return String.Compare(NameFile, other.NameFile, true); } } /// <summary> /// Список выделенных объектов для всех открытых чертежей /// </summary> private static List<SelectDrawingObjectsInfo> _ListSels = null; /// <summary> /// Инициализация сборки /// </summary> public void Initialize() { // Создаем список выделенных объектов _ListSels = new List<SelectDrawingObjectsInfo>(); // Подписываемся на удаление (закрытие) чертежа Application.DocumentManager.DocumentDestroyed += new DocumentDestroyedEventHandler(DocumentManager_DocumentDestroyed); } /// <summary> /// Деинициализация сборки /// </summary> public void Terminate() { } /// <summary> /// Обработчик события менеджера документов - закрытие документа /// </summary> /// <param name="sender">Источник сообщения- Менеджер документов</param> /// <param name="e">Дополнительные аргументы</param> void DocumentManager_DocumentDestroyed(object sender, DocumentDestroyedEventArgs e) { int lIndex = _ListSels.BinarySearch(new SelectDrawingObjectsInfo(e.FileName)); if(lIndex>=0) _ListSels.RemoveAt(lIndex); } /// <summary> /// Добавление выделенных объектов в коллекцию /// </summary> [CommandMethod("lso_AddSelectedObjects", CommandFlags.Modal | CommandFlags.NoPaperSpace | CommandFlags.UsePickSet | CommandFlags.Redraw)] public void lso_AddSelectedObjects() { Document lDoc = Application.DocumentManager.MdiActiveDocument; PromptSelectionResult lSelResult = lDoc.Editor.SelectImplied(); if (lSelResult.Status == PromptStatus.OK) { if (lSelResult.Value.Count > 0) { // Получаем индекс текущего активного чертежа в коллекции int lIndex; do { lIndex = _ListSels.BinarySearch( new SelectDrawingObjectsInfo(lDoc.Database.Filename)); if (lIndex < 0) { _ListSels.Add(new SelectDrawingObjectsInfo(lDoc.Database.Filename)); _ListSels.Sort(); } } while (lIndex < 0); // Получаем список выделенных примитивов и заносим в коллекцию ObjectId[] lListSelObjects = lSelResult.Value.GetObjectIds(); SelectDrawingObjectsInfo lItem = _ListSels[lIndex]; int lCountAddedObjects = 0; int lCountSkipObjects = 0; foreach (ObjectId lObjId in lListSelObjects) { if (lItem.ListSelectedObjects.Contains(lObjId)) { lCountSkipObjects++; } else { lCountAddedObjects++; lItem.ListSelectedObjects.Add(lObjId); } } _ListSels[lIndex] = lItem; // Выводим статистику lDoc.Editor.WriteMessage( "\nВыделение: добавлено {0}; пропущено {1}; всего объектов {2}", lCountAddedObjects, lCountSkipObjects, lItem.ListSelectedObjects.Count); return; } } // Если что-то пошло не так lDoc.Editor.WriteMessage("\nВыделение: нет выделенных объектов для добавления!"); } /// <summary> /// Удаление выделенных объектов из коллекции /// </summary> [CommandMethod("lso_RemoveSelectedObjects", CommandFlags.Modal | CommandFlags.NoPaperSpace | CommandFlags.UsePickSet | CommandFlags.Redraw)] public void lso_RemoveSelectedObjects() { Document lDoc = Application.DocumentManager.MdiActiveDocument; PromptSelectionResult lSelResult = lDoc.Editor.SelectImplied(); if (lSelResult.Status == PromptStatus.OK) { if (lSelResult.Value.Count > 0) { // Получаем индекс текущего активного чертежа в коллекции int lIndex = _ListSels.BinarySearch( new SelectDrawingObjectsInfo(lDoc.Database.Filename)); if (lIndex >= 0) { // Получаем список выделенных примитивов и удаляем из коллекции ObjectId[] lListSelObjects = lSelResult.Value.GetObjectIds(); SelectDrawingObjectsInfo lItem = _ListSels[lIndex]; int lCountRemoveObjects = 0; int lCountNotFoundObjects = 0; foreach (ObjectId lObjId in lListSelObjects) { if (lItem.ListSelectedObjects.Contains(lObjId)) { lCountRemoveObjects++; lItem.ListSelectedObjects.Remove(lObjId); } else { lCountNotFoundObjects++; } } _ListSels[lIndex] = lItem; // Выводим статистику lDoc.Editor.WriteMessage( "\nСнятие выделения: удалено {0}; вне выделения {1}; всего объектов {2}", lCountRemoveObjects, lCountNotFoundObjects, lItem.ListSelectedObjects.Count); return; } } } // Если что-то пошло не так lDoc.Editor.WriteMessage("\nСнятие выделения: нет выделенных объектов для исключения!"); } /// <summary> /// Выделение объектов из коллекции на чертеже /// </summary> [CommandMethod("lso_SetSelectedObjects", CommandFlags.Modal | CommandFlags.NoPaperSpace | CommandFlags.Redraw)] public void lso_SetSelectedObjects() { Document lDoc = Application.DocumentManager.MdiActiveDocument; // Получаем индекс текущего активного чертежа в коллекции int lIndex = _ListSels.BinarySearch( new SelectDrawingObjectsInfo(lDoc.Database.Filename)); if (lIndex >= 0) { SelectDrawingObjectsInfo lItem = _ListSels[lIndex]; if (lItem.ListSelectedObjects.Count > 0) { lDoc.Editor.SetImpliedSelection(lItem.ListSelectedObjects.ToArray()); lDoc.Editor.WriteMessage("\nВыделено объектов: {0}", lItem.ListSelectedObjects.Count); return; } } // Что-то пошло не так lDoc.Editor.SetImpliedSelection(new ObjectId[0]); lDoc.Editor.WriteMessage("\nНет объектов для выделения!"); } /// <summary> /// Сброс коллекции выделенных объектов на чертеже /// </summary> [CommandMethod("lso_ResetSelectedObjects", CommandFlags.Modal | CommandFlags.NoPaperSpace)] public void lso_ResetSelectedObjects() { Document lDoc = Application.DocumentManager.MdiActiveDocument; // Получаем индекс текущего активного чертежа в коллекции int lIndex = _ListSels.BinarySearch( new SelectDrawingObjectsInfo(lDoc.Database.Filename)); if (lIndex >= 0) { SelectDrawingObjectsInfo lItem = _ListSels[lIndex]; lItem.ListSelectedObjects.Clear(); _ListSels[lIndex] = lItem; } lDoc.Editor.SetImpliedSelection(new ObjectId[0]); lDoc.Editor.WriteMessage( "\nСписок ленивого выделения для данного документа очищен!"); } } } } На самом деле его еще надо дорабатывать - например, отлавливать события сохранения вновь созданного или переименование документа (хотя и так будет работать - просто в списке будет лишний "мусор" и после переименования пропадет выборка уже выделенных элементов, все придется сначала), разделить списки объектов в пространстве модели и для каждого листа и т.д. Но это уже пускай ваш штатный программист САПР занимается, я лишь идею отобразил в виде работающего кода) Ну и кнопочки/хоткеи прикрутить на команды - это уже типовая задача. |
|||
|
||||
Регистрация: 19.10.2012
Киев
Сообщений: 749
|
https://dwg.ru/pub/9
я себе сделал горячую клавишу и использую тот лисп. вызов лиспа get-last-select или gls |
|||
|
||||
Регистрация: 06.06.2016
Сообщений: 327
|
Цитата:
Это уже что-то Но полностью проблема не решена. Хотелось бы пошагово возвращать и отменять выделение (см. п.2 и п.3) Для этого, по видимому, в ЛИСП-коде нужно создавать какой-то динамический массив (или список) и заполнять его по мере выделения ----- добавлено через ~3 мин. ----- Цитата:
Разобраться в хитросплетениях большого числа слоев, наборов слоев и иерархий МНОГОСЛОЙНЫХ блоков ой как не просто. Даже самому разработчику. Чего уж говорить про посторонних людей, которые будут разбираться в Вашем чертеже. Они будут вспоминать Вас добрым матерным словом. Просто я пробовал лет 10 назад упорно идти таким путём. Поэтому знаю о чём говорю А потом, критерии выделения постоянно "дышат", меняются, поэтому модель с жесткой сортировкой/иерархией/"раскладыванием по полочкам" не отражает объективную реальность. ----- добавлено через ~4 мин. ----- Это C# что ли? Последний раз редактировалось Кондратий Тихонович, 21.05.2018 в 18:41. |
|||
|
||||
Регистрация: 10.08.2013
Сообщений: 11,049
|
Цитата:
да - под акад на нем пишу. |
|||
|
||||
Регистрация: 10.08.2013
Сообщений: 11,049
|
Честно, что ли? А может просто надо скачать любую бесплатную студию, создать там проект - библиотека, подключить три библиотеки из корневой папки вашей версии акада, вставить мой код и нажать кнопочку скомпилировать?
----- добавлено через 57 сек. ----- в 2010 даже две библиотеки всего подключить к проекту. |
|||
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Вернуть конточки твердотельных объектов | NZ | AutoCAD | 18 | 12.04.2011 09:14 |
Макрос: выделение объекта находящегося в определенной области модели | dextron3 | Программирование | 29 | 14.10.2010 21:08 |
Исчезли диологовые окна в Autocad 2008(Русская версия), как их вернуть, если это не глюк? | Aleksandrizrigi | AutoCAD | 1 | 10.01.2010 20:37 |
Как снять выделение с объекта | оап | AutoCAD | 2 | 02.07.2008 01:36 |
Как убрать выделение в автокаде? | Владимир В | Программирование | 2 | 06.02.2008 17:00 |