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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP / Быстрый выбор примитивов по образцу

LISP / Быстрый выбор примитивов по образцу

Ответ
Поиск в этой теме
Непрочитано 27.09.2011, 13:53 1 | #1
LISP / Быстрый выбор примитивов по образцу
TararykovDG
 
Программист-энтузиаст
 
Воронеж
Регистрация: 17.07.2009
Сообщений: 571

Всем доброго здравия!
Предлагаемый код позволяет выбрать на чертеже все примитивы (или из уже выбранных) по примитиву образцу. Язык не поворачивается назвать это неким LISP аналогом всем известной программы SelSim от Александра Ривилиса, однако именно так все это и задумывалось.
Выкладываю в разделе программирования, так как на готовую программу это не тянет, к тому же возможно обсуждение самой программной реализации данной идеи и дальнейшая доработка всеми желающими. Надеюсь, что не нарушил правила форума.

UPD 2012/07/10
Добавил возможность выбора по длине в различных вариациях

Код:
[Выделить все]
  
;| (fast_select mode) - выбор примитивов по образцу
      mode - режим выбора примитивов (dxf-код, определяющий параметр, по которому будет происходить выбор примитивов аналогичных указываемому образцу)
 Примеры вызова:
 (fast_select 0) - выбрать по типу примитива
 (fast_select 2) - выбрать по имени блока
 (fast_select 6) - выбрать по типу линии
 (fast_select 8) - выбрать по слою
 (fast_select 62) - выбрать по цвету
 (fast_select 370) - выбрать по весу линии
 (fast_select '(<знак> [<допуск> <тип>])) - выбрать по длине (только для простых примитивов: отрезок, сплайн, полилиния, круг, дуга)
    Пример:
        (fast_select '(= 10 t)) - выбрать все примитивы того же типа что и образец, равный по длине с образцом с учетом допуска
        (fast_select '(> t)) - выбрать все примитивы того же типа что и образец, меньшей длины чем у образца
        (fast_select '(< t)) - выбрать все примитивы того же типа что и образец, большей длины чем у образца
        (fast_select '(= 10)) - выбрать все примитивы (типа: *LINE), равный по длине с образцом с учетом допуска
        (fast_select '(>)) - выбрать все примитивы (типа: *LINE), меньшей длины чем у образца
        (fast_select '(<)) - выбрать все примитивы (типа: *LINE), большей длины чем у образца

 Если перед запуском функции на чертеже уже были выбраны некоторые примитивы, то выбор будет производиться среди них,
 тем самым можно добиться сложного фильтра выбора, например, для выбора всех кругов красного цвета, можно вызвать (fast_select 0), 
 указать любой круг, а затем вызвать (fast_select 62), указать любой примитив красного цвета.
|;

(defun fast_select(mode / )
  (vl-load-com)
  ((lambda(ent)
     (if (and ent
              (not (vl-catch-all-error-p ent))
              )
       ((lambda(obj ed)
          ((lambda(prew_nbr curr_nbr)
             ((lambda(nbr)
                (sssetfirst nil nbr)
                (prompt (strcat "\nНайдено объектов : " (if nbr (itoa (sslength nbr)) "0")))
                )
               (if prew_nbr
                 ((lambda(lst ss)
                    (foreach item lst
                      (if (ssmemb item curr_nbr)
                        (ssadd item ss)
                        )
                      )
                    ss
                    )
                   (vl-remove-if 'listp (mapcar 'cadr (ssnamex prew_nbr)))
                   (ssadd)
                   )
                 curr_nbr
                 )
               )
             )
            (cadr (ssgetfirst))
            (cond ((or (= mode 0)
                       (= mode 8)
                       )
                   (ssget "_X" (list (cons mode (cdr (assoc mode ed)))))
                   )
                  ((= mode 62)
                   ((lambda(color)
                      (if color
                        (ssget "_X" (list color))
                        (ssget "_X" (list (cons mode 256)))
                        )
                      )
                     (assoc mode ed)
                     )
                   )
                  ((= mode 6)
                   ((lambda(linetype)
                      (if linetype
                        (ssget "_X" (list linetype))
                        (ssget "_X" (list (cons mode "ByLayer")))
                        )
                      )
                     (assoc mode ed)
                     )
                   )
                  ((= mode 370)
                   ((lambda(lineweight)
                      (if lineweight
                        (ssget "_X" (list lineweight))
                        (ssget "_X" (list (cons mode -1)))
                        )
                      )
                     (assoc mode ed)
                     )
                   )
                  ((and (= mode 2)
                        (= (cdr (assoc 0 ed)) "INSERT")
                        )
                   ((lambda(name ss)
                      (foreach item (vl-remove-if '(lambda(x)
                                                        (or (listp x)
                                                            (/= (vla-get-effectivename (vlax-ename->vla-object x)) name)
                                                            )
                                                        )
                                                     (mapcar 'cadr
                                                             (ssnamex (ssget "_X" (list (cons 0 "INSERT") (cons 2 (strcat "`*U*," name)))))
                                                             )
                                                     )
                           (ssadd item ss)
                           )
                      )
                     (vla-get-effectivename (vlax-ename->vla-object obj))
                     (ssadd)
                     )
                   )
                  ((listp mode)
                   ((lambda(len mark eps check_type type_obj)
                      (if (wcmatch type_obj "*LINE,CIRCLE,ARC")
                        ((lambda(ss)
                           (foreach item (vl-remove-if '(lambda(x)
                                                          (if (= (eval mark) =)
                                                            (not (equal (_get-length x) len eps))
                                                            (not ((eval mark) (_get-length x) len))
                                                            )
                                                          )
                                                       (mapcar 'cadr
                                                               (ssnamex (ssget "_X" (list (cons 0 (if (= (eval mark) =)
                                                                                                    (if check_type
                                                                                                      type_obj
                                                                                                      "*LINE"
                                                                                                      )
                                                                                                    (if eps
                                                                                                      type_obj
                                                                                                      "*LINE"
                                                                                                      )
                                                                                                    )
                                                                                                )
                                                                                          )
                                                                               )
                                                                        )
                                                               )
                                                       )
                             (ssadd item ss)
                             )
                           )
                          (ssadd)
                          )
                        )
                      )
                     (_get-length obj)
                     (car mode)
                     (cadr mode)
                     (caddr mode)
                     (cdr (assoc 0 ed))
                     )
                   )
                  )
            )
          )
         (car ent)
         (entget (car ent))
         )
       )
     )
    (vl-catch-all-apply 'entsel
                        (list "\nВыберете объект: ")
                        )
    )
  (princ)
  ); end fast_select


; -------------------------------------------------------------------------------------------------
(defun _get-length(obj)
  (vlax-curve-getDistAtParam obj (vlax-curve-getEndParam obj))
  ); end _get-length
; -------------------------------------------------------------------------------------------------
__________________
cadtools

Последний раз редактировалось TararykovDG, 10.07.2012 в 11:43.
Просмотров: 17775
 
Непрочитано 27.09.2011, 14:25
#2
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,091


Спасибо! Не говорите плохо о своей проге - нужная весЧь! Selsim заточен под чистый Акад и весьма (до вылета без объяснения причин) недружелюбен к вертикальным надстройкам.
kp+ вне форума  
 
Непрочитано 10.07.2012, 06:45
#3
Astartes

Котло- и реакторостроение
 
Регистрация: 25.02.2010
Барнаул
Сообщений: 807


А можно добавить критерий выбора по длине отрезка/полилинии?
Допустим нужно выбрать все отрезки с длиной 29,8 мм. Такое возмножно?
Если такая точность не возмножна (она мне в принципе и не нужна), то по округленным значениям.
Astartes вне форума  
 
Автор темы   Непрочитано 10.07.2012, 09:35
#4
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


Цитата:
Сообщение от Astartes Посмотреть сообщение
А можно добавить критерий выбора по длине отрезка/полилинии?
Допустим нужно выбрать все отрезки с длиной 29,8 мм. Такое возмножно?
Если такая точность не возмножна (она мне в принципе и не нужна), то по округленным значениям.
В общем-то можно, но данная утилита задумывалась, так чтобы требовалось как можно меньше действий со стороны пользователя, и сейчас после запуска функции с определенным параметром необходим всего лишь один клик мыши на объекте, чтобы сформировать определенный набор, а для реализации Вашей просьбы потребуется большее число запросов, и тогда проще уж воспользоваться штатной командой _qselect
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 10.07.2012, 10:09
#5
Astartes

Котло- и реакторостроение
 
Регистрация: 25.02.2010
Барнаул
Сообщений: 807


Наверное вы меня не поняли. Вот выкладываю лисп (нашел здесь на форуме). Работает только с полилиниями. Автор не захотел доработать, чтобы работал и с отрезками.
А так бы был очень полезный лисп.
Действие ровно одно, выбрать объект.

КуСелект, тем и не удобен что там нельзя задать диапазон за один раз.
Вложения
Тип файла: lsp find simple.lsp (1.6 Кб, 454 просмотров)
Astartes вне форума  
 
Автор темы   Непрочитано 10.07.2012, 11:43
#6
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


Astartes, обновил первый пост
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 10.07.2012, 12:28
#7
Astartes

Котло- и реакторостроение
 
Регистрация: 25.02.2010
Барнаул
Сообщений: 807


TararykovDG, Отлично. Разобрался. Спасибо большое. Классный лисп.

УПД: В качестве "замечания". К примеру если воспользоваться выбором по типу линии. То линии выбираются даже на скрытых слоях. По мойму это не удобно. В принципе я пользуюсь фильтром, когда мне надо выбрать допустим осевую. Тут подумал будет быстрее, изолировал нужный слой, выбрал осевую. Но увы, к выбору добались линии на выключенных слоях.

Последний раз редактировалось Astartes, 10.07.2012 в 13:44.
Astartes вне форума  
 
Автор темы   Непрочитано 10.07.2012, 15:02
#8
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


Цитата:
Сообщение от Astartes Посмотреть сообщение
TararykovDGУПД: В качестве "замечания". К примеру если воспользоваться выбором по типу линии. То линии выбираются даже на скрытых слоях. По мойму это не удобно. В принципе я пользуюсь фильтром, когда мне надо выбрать допустим осевую. Тут подумал будет быстрее, изолировал нужный слой, выбрал осевую. Но увы, к выбору добались линии на выключенных слоях.
Если я правильно понял, то можно сделать так, вызвать (fast_select 0) - выбрать линию, а потом не сбрасывая выделения с полученных примитивов вызвать (fast_select 8) - и выбрать любой примитив с нужного слоя, тогда выборка будет происходить не со всего чертежа, а из линий полученных (fast_select 0), таким образом можно получить все линии с определенного слоя
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 27.11.2013, 07:56
#9
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


Цитата:
Сообщение от SNIIP Посмотреть сообщение
ну выложить селсим думаю стоит)))
Ну, прочитать тему прежде чем что-то писать тоже думаю стоит. Особенно первый пост, где уже указана ссылка на SelSim
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 21.12.2013, 17:04
#10
EvgeniusZ


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


...

Последний раз редактировалось EvgeniusZ, 09.06.2015 в 12:04.
EvgeniusZ вне форума  
 
Непрочитано 23.11.2017, 09:55
#11
Syrex


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


Спасибо за программу. А есть какая нибудь возможность заменить все наборы примитивов, выбранные по образцу данной программой, на другой примитив, набор или блок, ну или объеденять каждую найденую группу в блок? Нашел FRTO но не подходит, т.к. меняет каждый примитив, а не набор.
Syrex вне форума  
 
Непрочитано 23.11.2017, 10:15
#12
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,091


Поиск в помощь, такие решения были в других темах, и не только FRTO. Например, https://forum.dwg.ru/showthread.php?t=35383

Последний раз редактировалось kp+, 23.11.2017 в 10:20.
kp+ вне форума  
 
Непрочитано 23.11.2017, 11:51
#13
Syrex


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


Цитата:
Сообщение от kp+ Посмотреть сообщение
Поиск в помощь, такие решения были в других темах.
Offtop: вроде бы поиском пользовался и не только здесь....да, тема не один раз подымалась, но полного решения я не нашел ... может кому еще понадобится, делаю так:
1) используя данную программу или selsim выделяю по образцу
2) обьеденяю в полилинию например вот этой программой PL-join, можно командой _pedit, но сложней
3) повторяю п.1 с одной из полилиний в центре (у меня это многогранник)
4) с помощью ftro произвожу их замену на нужный примитив/блок, при большом количестве замен, происходит обрушение акада
5) опять повторяю п.1 с оставшимся мусором и удаляю его
каждую стадию выделения/замены надо контролировать, поэтому остается много рутинного труда
PS пока писал, предыдущий ответ поменялся

Последний раз редактировалось Syrex, 23.11.2017 в 11:58.
Syrex вне форума  
 
Непрочитано 26.11.2020, 12:58
#14
nikkomp


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


Не могу запустить lisp, пишет ; ошибка: no function definition: FAST_SELECT
еще при загрузке сначала пишет что загружен успешно, а потом синтаксическая ошибка.
nikkomp вне форума  
 
Непрочитано 26.11.2020, 14:18
#15
Кулик Алексей aka kpblc
Moderator

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


Отлично. Какой именно лисп?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 26.11.2020, 14:22
#16
nikkomp


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


да в этой шапке, в закладке Код здесь
nikkomp вне форума  
 
Непрочитано 26.11.2020, 14:43
#17
Кулик Алексей aka kpblc
Moderator

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


Сначала на эту кнопочку, а потом уже копировать в буфер, в блокнот, сохранить как lsp с кодировкой ANSI
Миниатюры
Нажмите на изображение для увеличения
Название: 2020-11-26_14-42-15.png
Просмотров: 158
Размер:	29.1 Кб
ID:	232202  
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 26.11.2020, 14:53
#18
nikkomp


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


спасибо большое, получилось.
nikkomp вне форума  
 
Непрочитано 21.01.2021, 12:35
#19
Петр-и-Алекс


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


с выбором по длине - супер!
По моему опыту, если работаешь не один, а ещё с кем то (с заказчиком например), то lisp намного предпочтительней компилированному варианту...
Петр-и-Алекс вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP / Быстрый выбор примитивов по образцу

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
быстрый выбор, не работает на листах? Pave1 AutoCAD 18 27.10.2011 16:48
LISP / AutoCAD2008 / Как программно снять выделение у примитивов, не используя sssetfirst TararykovDG LISP 7 14.01.2011 10:48
LISP для поиска групп (наборов) одинаковых примитивов и замена их блоком ElectroBOG LISP 20 23.07.2010 16:00
Выбор всех примитивов одним кликом DANZZ AutoCAD 5 12.08.2006 17:49
Выбор примитивов в функции (command) mmax Программирование 12 19.05.2006 20:02