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

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

Макрос для выбора объектов по заданным характеристикам

Ответ
Поиск в этой теме
Непрочитано 25.04.2020, 15:17 #1
Макрос для выбора объектов по заданным характеристикам
modest-bp
 
Регистрация: 15.04.2019
Сообщений: 54

Здравствуйте!
Задался я целью повесить на отдельные кнопочки выбор объектов чертежа по слоям. Ну чтобы нажал на кнопку - и на чертеже выбрались бы все объекты на определённом для этой конкретной кнопки слое и, может быть, даже изолировались (объекты, а не слои). Одна кнопка - для объектов на слое "1", другая - для объектов на слое "2" и т.п.
При этом изолировать сами слои не хочется (т.к. работаю, как правило, уже в условиях изолирования того или иного набора слоёв, поэтому возвращать прежнюю конфигурацию - будет только дольше).

Иным словами, нужен аналог выбора объектов на определённом слое через QSELECT, далее - изолирование объектов через ISOLATEOBJECTS. Но на одной кнопке, в макросе которой был бы уже заранее прописан интересующий слой.

И QSELECT, и FILTER - оба вызывают диалоговые окна, и через командную строку ввести параметры выбора не получается.

Подскажите, пожалуйста, как решить эту задачу? Сам я способен только на примитивные макросы, повторяющие ввод команд с клавиатуры
Просмотров: 5066
 
Непрочитано 25.04.2020, 17:01
#2
Сергей812


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


1. Выборка всех примитивов на чертеже с использованием фильтра по DXF группе 8 (слой).
2. Выделение данных примитивов.
3. Применение команды _isolateobjects к выбранным примитивам

ну а реализация будет зависеть от выбранного вами языка программирования.
Сергей812 вне форума  
 
Автор темы   Непрочитано 25.04.2020, 18:42
#3
modest-bp


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
1. Выборка всех примитивов на чертеже с использованием фильтра по DXF группе 8 (слой).
2. Выделение данных примитивов.
3. Применение команды _isolateobjects к выбранным примитивам

ну а реализация будет зависеть от выбранного вами языка программирования.
За ответ спасибо, конечно))) Но вот, как я уже писал, иначе, как прописать макрос в виде последовательности нажимаемых на клавиатуре команд, я ничего не могу (выбирая язык программирования, выбираю из ничего).
Может быть, именно поэтому я и не имею понятия, что значит "Выборка всех примитивов на чертеже с использованием фильтра по DXF группе 8 (слой)"
modest-bp вне форума  
 
Непрочитано 25.04.2020, 19:20
#4
Сергей812


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


Цитата:
Сообщение от modest-bp Посмотреть сообщение
"Выборка всех примитивов на чертеже с использованием фильтра по DXF группе 8 (слой)"
Код:
[Выделить все]
 (ssget "_x" (list '(8 . "%Имя слоя%")))
Сергей812 вне форума  
 
Автор темы   Непрочитано 25.04.2020, 20:45
#5
modest-bp


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Код:
[Выделить все]
 (ssget "_x" (list '(8 . "%Имя слоя%")))
Вы, конечно же, не ожидали, но и это мне, тупому, ни чего не даёт. Может быть, вы не заметили, но я уже дважды написал, что языкам программирования не обучен.
А эта строчка, будучи просто вписанной в макрос, не выделяет объекты, а просто пишет, что создан очередной (с новым номером) Selection Set. При каждом нажатии кнопки номер этого сета увеличивается, что говорит о том, что какие-то непонятные мне сущности множатся, и это совсем не входило в мои планы.
Для вас, умного, это, наверное, дело понятное. А для меня, тупого, - бесполезное.
Вы чего ожидали, давая такие ответы на мои тупые вопросы? Вам нравится получать в ответ новые и новые тупые вопросы? Что ж, получайте удовольствие)

Тем не менее, продемонстрировать, что вы умный, а я - тупой, у вас получилось. Если это и есть искомый результат - то явно не мною.
Кому-то, кто поумнее меня, наверняка, ваш ответ будет полезен.
modest-bp вне форума  
 
Непрочитано 25.04.2020, 21:29
#6
Сергей812


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


Цитата:
Сообщение от modest-bp Посмотреть сообщение
Тем не менее, продемонстрировать, что вы умный, а я - тупой, у вас получилось.
вы всегда хамите в ответ на помощь?) Ну смутно я помню лисп, и вспоминать его для компенсации вашей лени явно не стоит... А на знакомом .Net это пишется за пару минут

Код:
[Выделить все]
 
// AutoCAD
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;


namespace IsolateObjects
{
    public class CommandsClass
    {
        /// <summary>
        /// Изоляция объектов на заданном слое
        /// </summary>
        /// <param name="aNameLayer">Имя слоя</param>
        private void IsolateObjects(string aNameLayer)
        {
            // Получаем текущий документ
            Document lAcadDoc = Application.DocumentManager.MdiActiveDocument;
            // Если не удалось - выходим
            if(lAcadDoc == null) return;
            // Получаем редактор чертежа
            Editor lAcadEd = lAcadDoc.Editor;
            // Запрашиваем объекты на указанном слое
            PromptSelectionResult lPromptSelectionResult = lAcadEd.SelectAll(
                new SelectionFilter(new TypedValue[] 
                    { new TypedValue((int)DxfCode.LayerName, aNameLayer) }));
            // Если выборка прошла успешно
            if (lPromptSelectionResult.Status == PromptStatus.OK)
            {
                // Получаем массив идентификаторов
                ObjectId[] lIDs = lPromptSelectionResult.Value.GetObjectIds();
                // Если массив не пустой
                if (lIDs.Length > 0)
                {
                    // Выделяем примитивы
                    lAcadEd.SetImpliedSelection(new ObjectId[0]);
                    lAcadEd.SetImpliedSelection(lIDs);
                    // Посылаем команду
                    lAcadDoc.SendStringToExecute("_ISOLATEOBJECTS ", true, false, true);
                }
            }
        }


        /// <summary>
        /// Изолируем объекты на слое Пожарная сигнализация
        /// </summary>
        [CommandMethod("IObj1")]
        public void IObj1()
        {
            IsolateObjects("Пожарная сигнализация");
        }


    }
}

наделать команд аналогичных IObj1 для нужных слоев или как то еще юзать....

Сергей812 вне форума  
 
Непрочитано 25.04.2020, 22:17
1 | #7
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,404


(command "_isolateobjects" (ssget "_x" (list (cons 8 "0"))) "")
выбор и изоляция всех примитивов слоя ""0"

(sssetfirst nil (ssget "_x" (list (cons 8 "0"))))
выбор всех примитивов слоя "0"
koMon вне форума  
 
Автор темы   Непрочитано 26.04.2020, 00:36
#8
modest-bp


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


Цитата:
Сообщение от koMon Посмотреть сообщение
(command "_isolateobjects" (ssget "_x" (list (cons 8 "0"))) "")
выбор и изоляция всех примитивов слоя ""0"

(sssetfirst nil (ssget "_x" (list (cons 8 "0"))))
выбор всех примитивов слоя "0"
Огромное спасибо! То, что надо! Помогло)))

Ещё только одна просьба... Я тут с подачи предыдущего собеседника немного стал ковырять информацию по ssget и увидел, что метод "_x" выбирает все объекты, в т.ч. на скрытых слоях и т.п. Собственно, по приведённому Вами коду оно так и работает (т.е. в количестве выбранных элементов показывает цифру с учётом ранее скрытых объектов, а также находящихся на других листах).
В официальном хелпе я так и не нашёл метод, который бы выбирал только видимые объекты в текущем пространстве (модельном ли, бумажном ли). Как добиться такого поведения макроса?

И ещё одно беспокоит... В выводимом при работе макроса системном сообщении формата: "sssetfirst nil (ssget "_x" (list (cons 8 "0")))) (nil <Selection set: 58f>" постоянно увеличивается номер этого самого Selection set. Скажите, пожалуйста, не сказывается это на росте веса файла и т.п.? От этого в базе данных не прирастает ненужных сущностей? Можно ли как-то почистить эти Selection set'ы с меньшими порядковыми номерами, чтобы они не засоряли собой файл?
А то, подозреваю, пользоваться этими кнопками (ещё раз огромное спасибо за помощь!) предстоит часто, и за пару месяцев работы над проектом этих сущностей (если они накапливаются) соберётся уже порядочно...

Последний раз редактировалось modest-bp, 26.04.2020 в 00:53.
modest-bp вне форума  
 
Непрочитано 26.04.2020, 01:09
#9
Сергей812


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


Цитата:
Сообщение от modest-bp Посмотреть сообщение
В официальном хелпе я так и не нашёл метод, который бы выбирал только видимые объекты в текущем пространстве (модельном ли, бумажном ли).
это не метод, это продолжаете расширять фильтр. Например, включение в фильтр DXF группы 67 со значением 0 выбирает объекты только в пространстве модели. С видимостью примитивов можно DXF группу 60 посмотреть.

Цитата:
Сообщение от modest-bp Посмотреть сообщение
постоянно увеличивается номер этого самого Selection set.
раньше было ограничение в 128 наборов, сейчас фиг знает. Локальная переменная освободится при выходе из функции, а вот если глобальная - то в явном виде надо присвоить nil для для освобождения набора.

Цитата:
Сообщение от modest-bp Посмотреть сообщение
не сказывается это на росте веса файла и т.п.? От этого в базе данных не прирастает ненужных сущностей?
к БД чертежа никакого отношения наборы не имеют, хранятся где-то внутри акада в памяти.
Сергей812 вне форума  
 
Непрочитано 27.04.2020, 08:55
#10
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,404


Цитата:
Сообщение от modest-bp Посмотреть сообщение
метод "_x" выбирает все объекты, в т.ч. на скрытых слоях и т.п.
так вроде требовалось выбрать объекты/примитивы только одного указанного слоя?!
Цитата:
Сообщение от modest-bp Посмотреть сообщение
который бы выбирал только видимые объекты в текущем пространстве (модельном ли, бумажном ли). Как добиться такого поведения макроса?
видимо для решения такой задачи нужно написать лисп команду (которая вряд ли будет уже простым макросом), которая будет выбирать только то, что видно и только в текущем рабочам пространстве. простым использованием аргументов и фильтров ssget этого скорее всего не достигнуть(
koMon вне форума  
 
Непрочитано 27.04.2020, 10:45
#11
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,517


Просмотрел тему... а Сергей то молодец, сподвиг пользователя развиваться, пойти почитать документацию и встать на путь написания программ. Я так не умею. Уважуха.

ЗЫ.
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
// Посылаем команду
lAcadDoc.SendStringToExecute("_ISOLATEOBJECTS ", true, false, true);
Командные методы в .NET.... фу бяка!
Тем более, что есть нативный способ добавить объекты в коллекцию изолированных.
__________________
_бложиг
Boxa на форуме  
 
Непрочитано 27.04.2020, 20:09
#12
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,627


Цитата:
Сообщение от koMon Посмотреть сообщение
видимо для решения такой задачи нужно написать лисп команду (которая вряд ли будет уже простым макросом)
Похоже на то. Если выбор только в текущем пространстве я еще представляю, как воткнуть в фильтр:
Код:
[Выделить все]
(cons 410 (getvar 'CTAB))
то как отсеять скрытые объекты, пока не понял.
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
С видимостью примитивов можно DXF группу 60 посмотреть.
Посмотрел. Все равно не понял. При скрытии объектов командой _HideObjects 60-я группа не появляется.
Цитата:
Сообщение от Boxa Посмотреть сообщение
Сергей то молодец, сподвиг пользователя развиваться, пойти почитать документацию и встать на путь написания программ. Я так не умею. Уважуха.
Offtop: Думаю, что в каждой паре "сэнсэй-подаван" в случае удачи всегда есть заслуги обеих сторон. И заслуга подавана - главная, на мой взгляд. Потому что требует больше усилий вникнуть, нежели попробовать передать, что знаешь. Не умаляю заслуг учителей, нет. Просто балбеса, который не хочет - не научишь. А вот заинтересовать - это искусство, но если ему это реально не надо, то тоже без толку. Для меня в свое время сэнсэями были в основном VVA и kpblc - за что я им безмерно благодарен. Они смогли заинтересовать именно предоставлением рыбы для затравки - показали, как это вкусно и совсем не страшно - и, уже почувствовав вкус, я захотел удочку и на море. Скажи они мне сразу, чтоб я шел в попуиск, не факт, что я бы решился, и так и сидел бы вручную все рисовал. Как вариант. Просто моё скромное мнение.
skkkk на форуме  
 
Непрочитано 27.04.2020, 20:28
#13
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,404


А мне нравится в отличие от
koMon вне форума  
 
Непрочитано 27.04.2020, 20:33
#14
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 38,813


Точно 60, а не 61-я группа?
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 27.04.2020, 20:33
#15
Сергей812


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


Цитата:
Сообщение от Boxa Посмотреть сообщение
Командные методы в .NET.... фу бяка!
увы, насколько понял по форумам - API для "_ISOLATEOBJECTS " даже в ObjectARX нет. Но как альтернатива - можно просто видимостью примитивов "играться")

----- добавлено через ~3 мин. -----
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Точно 60, а не 61-я группа?
60 Object visibility (optional): 0 = Visible; 1 = Invisible
в нескольких источниках, начиная с Полещука)

Последний раз редактировалось Сергей812, 27.04.2020 в 21:21.
Сергей812 вне форума  
 
Непрочитано 28.04.2020, 08:48
#16
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,517


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
увы, насколько понял по форумам - API для "_ISOLATEOBJECTS " даже в ObjectARX нет. Но как альтернатива - можно просто видимостью примитивов "играться")
Там все проще. И никакой специализированный API не нужен, того что есть достаточно. Выбираются объекты которые нужно спрятать, у них устанавливается параметр видимости в false и ObjectId этих объектов дописывается в соответствующий NOD, дописывается с типом значения "HardPointerId". Собственно и все. Когда нужно показать все объекты, автокад проходится по списку в NOD и включает видимость объектов, заодно удаляя из списка.
Код я тут выкладывать не буду, так как тема в общем то про Лисп, залил его в тему по указанной тобой ссылке, но там действительно все просто.
__________________
_бложиг
Boxa на форуме  
 
Непрочитано 28.04.2020, 13:07
#17
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 38,813


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
60 Object visibility (optional): 0 = Visible; 1 = Invisible
в нескольких источниках, начиная с Полещука)
Охотно верю - поскольку с DXF работаю нечасто.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Макрос для выбора объектов по заданным характеристикам

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Появилось диалоговое окно выбора из нескольких объектов. Как отключить? Tregart AutoCAD 2 04.04.2020 15:27
После выбора объектов для команды требуется дополнительное подтверждение Rustam-tam AutoCAD 2 15.03.2020 22:57
JavaScript. nanoCAD 5. Округление координат объектов с учетом ПСК Нубий-IV Готовые программы 6 04.05.2019 10:04
Простой макрос выбора и удаления всех штриховок MrBrown Программирование 9 06.06.2014 12:30
Отмена выбора объекта (объектов) stinger20112 AutoCAD 4 04.11.2011 12:15