Autocad 2021 сбрасывает выделение объектов при переходе в другой файл - как исправить?
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Autocad 2021 сбрасывает выделение объектов при переходе в другой файл - как исправить?

Autocad 2021 сбрасывает выделение объектов при переходе в другой файл - как исправить?

Ответ
Поиск в этой теме
Непрочитано 22.03.2023, 19:39 #1
Autocad 2021 сбрасывает выделение объектов при переходе в другой файл - как исправить?
S_Vitaliy
 
Регистрация: 13.10.2015
Сообщений: 14

Приветствую всех!
Autocad 2021 сбрасывает выделение объектов при переходе в другой файл автокада, хоть через файловую панель, хоть через Ctrl-Tab. Не нашел пути решения на полях интернета, поэтому воспользовался костылём - поставил лисп GET-LAST-SELECT, но и он при повторе выделения периодически пишет после каких-то действий в другом файле, что в исходном, где до перехода в другой файл были выделены объекты, "На чертеже еще не было сформировано ни одного набора". Ситуация уже поднадоела, поэтому занялся новым поиском решения проблемы автокада. Что забавно - стоит на компе ещё и 2011 версия автокада, в которой выделение сохраняется и работает штатно.
Есть ли у кого-нибудь идеи как можно победить сброс выделения объектов в автокаде 2021?
Просмотров: 2427
 
Непрочитано 22.03.2023, 22:33
1 | #2
Сергей812


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


элементарно - подцепиться на события менеджера документов акада


Код:
[Выделить все]
 
// Windows
using System;
using System.Collections.Generic;

// AutoCAD
using aaps = Autodesk.AutoCAD.ApplicationServices;
using adbs = Autodesk.AutoCAD.DatabaseServices;
using aedi = Autodesk.AutoCAD.EditorInput;
using artm = Autodesk.AutoCAD.Runtime;

namespace RestoreSelectEntities
{
    public class Commands : artm.IExtensionApplication
    {
        private Dictionary<string, adbs.ObjectId[]> _SelSets = new Dictionary<string, adbs.ObjectId[]>();
        
        private void DM_DocumentActivated(object sender, aaps.DocumentCollectionEventArgs e)
        {
            aaps.Document lDoc = e.Document;
            if (lDoc == null) return;
            if (_SelSets.TryGetValue(lDoc.Name, out adbs.ObjectId[] lSS))
            {
                try
                {
                    lDoc.Editor.SetImpliedSelection(lSS);
                }
                catch (Exception ex)
                {
                    lDoc.Editor.WriteMessage($"RestoreSelectEntities : Error > {ex.Message}\n");
                }
            }
        }

        private void DM_DocumentToBeDeactivated(object sender, aaps.DocumentCollectionEventArgs e)
        {
            aaps.Document lDoc = e.Document;
            if (lDoc == null) return;
            try
            {
                aedi.PromptSelectionResult lRes =  lDoc.Editor.SelectImplied();
                if (lRes.Status == aedi.PromptStatus.OK)
                {
                    _SelSets[lDoc.Name] = lRes.Value.GetObjectIds();
                }
                else _SelSets.Remove(lDoc.Name);
            }
            catch (Exception ex)
            {
                lDoc.Editor.WriteMessage($"RestoreSelectEntities : Error > {ex.Message}\n");
            }
        }

        private void DM_DocumentDestroyed(object sender, aaps.DocumentDestroyedEventArgs e)
        {
            _SelSets.Remove(e.FileName);
        }

        public void Initialize()
        {
            aaps.Application.DocumentManager.DocumentActivated += 
                new aaps.DocumentCollectionEventHandler(DM_DocumentActivated); 
            aaps.Application.DocumentManager.DocumentToBeDeactivated += 
                new aaps.DocumentCollectionEventHandler(DM_DocumentToBeDeactivated);
            aaps.Application.DocumentManager.DocumentDestroyed += 
                new aaps.DocumentDestroyedEventHandler(DM_DocumentDestroyed);
        }

        public void Terminate()
        {
        }
    }
}


Соберите его в сборку *.dll под свою версию акада (сброс выделения не только в 2021 версии, кстати) и загрузите через _NetLoad. Работает полностью автоматически.
Сергей812 вне форума  
 
Непрочитано 22.03.2023, 23:17
#3
DS1974


 
Регистрация: 30.11.2009
Санкт-Петербург
Сообщений: 705
<phrase 1=


выделил - собрал в группу или изолировал - потом легко это выделение восстановить
DS1974 вне форума  
 
Автор темы   Непрочитано 27.03.2023, 19:53
#4
S_Vitaliy


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Соберите его в сборку *.dll под свою версию акада
Подскажите пожалуйста, какой для этого софт нужен?
S_Vitaliy вне форума  
 
Непрочитано 27.03.2023, 20:28
1 | #5
Сергей812


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


Цитата:
Сообщение от S_Vitaliy Посмотреть сообщение
Подскажите пожалуйста, какой для этого софт нужен?
бесплатная среда разработки типа Visual Studio Community, там при установке выбрать только .Net desktop development - чтобы лишнее не скачивать (полные дистрибутивы студий - несколько десятков гигов достигают).

Затем в студии создать проект Библиотека классов с именем RestoreSelectEntities, выбрав при этом соответствующую версию .Net из системных требований. Если ошибетесь - просто будет сильно ругаться, пока в свойствах проектах нужную версию не поставите.

Дальше в разделах Ссылки проекта через контекстное меню добавляете из папки акада, где лежит acad.exe - файлы accoremgd.dll, acdbmgd.dll и Acmgd.dll. И СРАЗУ ЖЕ, выделив эти файлы в дереве ссылок проекта - ставите Копировать локально: False.

А дальше в основном окне, где сам код - удаляете полностью заготовку класса и вставляете мой код. И нажимаете в меню - собрать проект. Собственно в папке проекта находите сборку RestoreSelectEntities.dll - её и загружаете в акад. При этом акад ругнется - что не из доверенных путей загрузка, разрешите загрузить.

Ну для красоты можно в дереве проекта переименовать имя файла с Class1 на Commands - хотя на работоспособности это не как не отразиться) Физические имена файлов и логические пути проекта в студии - это две независимые вещи.
Сергей812 вне форума  
 
Непрочитано 28.03.2023, 01:11
1 | #6
Сергей812


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


язык программирования C# для проекта
Сергей812 вне форума  
 
Автор темы   Непрочитано 25.07.2024, 21:27
#7
S_Vitaliy


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Соберите его в сборку *.dll под свою версию акада
Сергей812, нижайший вам поклон, всё теперь просто великолепно работает. Выложил dll на сервер в сети вместе с Acaddoc.lsp для его автозапуска и забыл о проблеме.
Прикладываю сборку для 21 када, если кому-то нужна.
Вложения
Тип файла: zip RestoreSelectEntities_2021.zip (2.6 Кб, 8 просмотров)
S_Vitaliy вне форума  
 
Непрочитано 26.07.2024, 13:53
#8
Сергей812


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


Offtop: Нежданчик) 1,5 года компилировали сборку, что ли?)
Сергей812 вне форума  
 
Автор темы   Непрочитано 29.07.2024, 14:57
#9
S_Vitaliy


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


Offtop: Таки да, нужно было найти время и победить админа
S_Vitaliy вне форума  
 
Непрочитано 29.07.2024, 16:44
#10
Сергей812


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


Цитата:
Сообщение от S_Vitaliy Посмотреть сообщение
и победить админа
ну на самом деле скомпилировать могли и дома, утянув на время с работы эти три файла
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
файлы accoremgd.dll, acdbmgd.dll и Acmgd.dll
они нужны лишь чтобы компилятор удостоверился по так называемым метаданным *.dll сборок, что пользовательский код нормально потом "интегрируется" в акад после компиляции. А чтобы загрузить готовую сборку на рабочем месте - достаточно прав обычного пользователя.
Сергей812 вне форума  
 
Автор темы   Непрочитано 31.07.2024, 16:59
#11
S_Vitaliy


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


Offtop: Согласен, не подумал об этом.

Сергей812, если создать новый файл при активном файле с выделением, то выделение не сохраняется. Можно что-то в ваш код добавить, чтобы этого избежать?
S_Vitaliy вне форума  
 
Непрочитано 31.07.2024, 20:19
#12
Сергей812


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


Это странная логика разработчиков акада) При создании нового файла генерируется событие DocumentCreateStarted (Начало создания документа), и в этот момент сбрасывается выделение в активном файле. А потом в случае создания нового документа срабатывает событие деактивации текущего активного документа в моем коде и метод SelectImplied() честно сообщает - что ничего не выделено и сохранять, естественно, нечего.

Последний раз редактировалось Сергей812, 31.07.2024 в 21:20.
Сергей812 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Autocad 2021 сбрасывает выделение объектов при переходе в другой файл - как исправить?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Мастер извлечения данных AutoCAD 2021 некорректно извлекает свойства объектов Flo_Master AutoCAD 7 28.11.2022 12:53
AutoCAD 2021. При переходе из чертежа в чертеж слетает выделение объектов в первом dorogi-dorogi AutoCAD 1 26.06.2020 10:28
Внедрение / связь инородных объектов с AutoCAD Reka AutoCAD 8 07.12.2009 16:55
Выделение нескольких объектов без использования нажатой клавиши SHIFT. AutoCad 2006. AndroiD AutoCAD 4 05.06.2009 10:33
Выделение объектов в Autocad 2007 skalder AutoCAD 2 26.03.2007 06:45