| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Как вернуть выделение?

Как вернуть выделение?

Ответ
Поиск в этой теме
Непрочитано 25.04.2011, 17:21
Как вернуть выделение?
radist
 
Регистрация: 22.02.2011
Сообщений: 53

Знаю,что в автокаде после снятия выделения можно как-то выбрать все эти объекты снова (выделить последние объекты).
Подскажи как это сделать?
Просмотров: 22888
 
Непрочитано 18.05.2018, 09:29
#21
PsixVK


 
Регистрация: 19.10.2012
Киев
Сообщений: 749


https://forum.dwg.ru/showpost.php?p=940858&postcount=5
PsixVK вне форума  
 
Непрочитано 18.05.2018, 14:52
#22
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,035


Цитата:
Сообщение от Кондратий Тихонович Посмотреть сообщение
Ну а вообще. Как тогда решают уважаемые юзвери такую проблему:
Ведь бывает нужно вернуть предыдущий набор выделенных объектов к примеру без последних двух выделенных объектов. А набор, к примеру, состоит из 50-ти объектов.

Вручную заново прокликать 48 объектов как-то не айс.
К примеру ты минут 10 шифткликом по одному выбирал и добавлял в набор объекты, а потом случайно кликнул без шифта и всё выделение сбросилось. И вся работа насмарку. Мочи мочало - начинай сначала
Приходится заново прокликивать
это совершенно другая задача - типа "ленивого" выделения: выделяете объекты, нажимаете хоткей/кнопку и только тогда выбранные объекты добавляются в список выделения (уже существующие объекты в списке пропускаются). Другой хоткей/кнопка удаляет выбранные объекты из списка (если они были внесены туда до этого, иначе игнорируются). Третий хоткей/кнопка выделяет объекты из списка на чертеже. Четвертый хоткей/кнопка очищает список. Т.е. создать свою коллекцию выделения, работающую независимо от стандартного механизма выделения. Тогда при "промахе" ничего не потеряется, можно хоть полдня выбирать объекты.

p.s. Но это другая ветка уже - программирование.
Сергей812 вне форума  
 
Непрочитано 19.05.2018, 13:11
#23
Кондратий Тихонович


 
Регистрация: 06.06.2016
Сообщений: 327


Цитата:
Сообщение от PsixVK Посмотреть сообщение
Не очень понял. Поясните

----- добавлено через ~1 мин. -----
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Но это другая ветка уже - программирование
Да тут на форуме каждый второй ЛИСП-программист.
Может помогут решить проблему?
Кондратий Тихонович вне форума  
 
Непрочитано 19.05.2018, 17:07
#24
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,035


Цитата:
Сообщение от Кондратий Тихонович Посмотреть сообщение
Может помогут решить проблему?
ну как то так на скорую руку

// 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Список ленивого выделения для данного документа очищен!");
}

}
}
}


На самом деле его еще надо дорабатывать - например, отлавливать события сохранения вновь созданного или переименование документа (хотя и так будет работать - просто в списке будет лишний "мусор" и после переименования пропадет выборка уже выделенных элементов, все придется сначала), разделить списки объектов в пространстве модели и для каждого листа и т.д. Но это уже пускай ваш штатный программист САПР занимается, я лишь идею отобразил в виде работающего кода)

Ну и кнопочки/хоткеи прикрутить на команды - это уже типовая задача.
Сергей812 вне форума  
 
Непрочитано 19.05.2018, 19:31
#25
kifa


 
Регистрация: 03.12.2009
Сообщений: 1,847


Цитата:
Сообщение от Кондратий Тихонович Посмотреть сообщение
Вручную заново прокликать 48 объектов как-то не айс.
когда объекты грамотно рассортированы по слоям/блокам/ итд то кликать ручками приходится ну очень редко
kifa вне форума  
 
Непрочитано 21.05.2018, 15:38
1 | #26
PsixVK


 
Регистрация: 19.10.2012
Киев
Сообщений: 749


Цитата:
Сообщение от Кондратий Тихонович Посмотреть сообщение
Не очень понял. Поясните
https://dwg.ru/pub/9
я себе сделал горячую клавишу и использую тот лисп. вызов лиспа get-last-select или gls
PsixVK вне форума  
 
Непрочитано 21.05.2018, 18:32
#27
Кондратий Тихонович


 
Регистрация: 06.06.2016
Сообщений: 327


Цитата:
Сообщение от PsixVK Посмотреть сообщение
https://dwg.ru/pub/9
я себе сделал горячую клавишу и использую тот лисп. вызов лиспа get-last-select или gls
Тоже сегодня сделал себе кнопку и хоткей get-last-select ещё не видя Вашего сообщения когда ещё был на работе. Наткнулся на код шерстя форум

Это уже что-то

Но полностью проблема не решена. Хотелось бы пошагово возвращать и отменять выделение (см. п.2 и п.3)

Для этого, по видимому, в ЛИСП-коде нужно создавать какой-то динамический массив (или список) и заполнять его по мере выделения

----- добавлено через ~3 мин. -----
Цитата:
Сообщение от kifa Посмотреть сообщение
когда объекты грамотно рассортированы по слоям/блокам/ итд то кликать ручками приходится ну очень редко
Ой не факт.
Разобраться в хитросплетениях большого числа слоев, наборов слоев и иерархий МНОГОСЛОЙНЫХ блоков ой как не просто. Даже самому разработчику. Чего уж говорить про посторонних людей, которые будут разбираться в Вашем чертеже. Они будут вспоминать Вас добрым матерным словом.
Просто я пробовал лет 10 назад упорно идти таким путём. Поэтому знаю о чём говорю
А потом, критерии выделения постоянно "дышат", меняются, поэтому модель с жесткой сортировкой/иерархией/"раскладыванием по полочкам" не отражает объективную реальность.

----- добавлено через ~4 мин. -----
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
ну как то так на скорую руку
Это C# что ли?

Последний раз редактировалось Кондратий Тихонович, 21.05.2018 в 18:41.
Кондратий Тихонович вне форума  
 
Непрочитано 21.05.2018, 18:48
#28
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,035


Цитата:
Сообщение от Кондратий Тихонович Посмотреть сообщение
Для этого, по видимому, в ЛИСП-коде нужно создавать какой-то динамический массив (или список) и заполнять его по мере выделения
точнее, запоминать разницу между всеми предыдущими состояниями списка и текущим выделенным набором.

Цитата:
Сообщение от Кондратий Тихонович Посмотреть сообщение
Это C# что ли
да - под акад на нем пишу.
Сергей812 вне форума  
 
Непрочитано 26.05.2018, 11:17
#29
Кондратий Тихонович


 
Регистрация: 06.06.2016
Сообщений: 327


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
под акад на нем пишу.
В 2010 шарп не поддерживается
Кондратий Тихонович вне форума  
 
Непрочитано 26.05.2018, 12:55
1 | #30
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,035


Цитата:
Сообщение от Кондратий Тихонович Посмотреть сообщение
В 2010 шарп не поддерживается
Честно, что ли? А может просто надо скачать любую бесплатную студию, создать там проект - библиотека, подключить три библиотеки из корневой папки вашей версии акада, вставить мой код и нажать кнопочку скомпилировать?

----- добавлено через 57 сек. -----
в 2010 даже две библиотеки всего подключить к проекту.
Сергей812 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Как вернуть выделение?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вернуть конточки твердотельных объектов 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