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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Готовые программы > Два лиспа *подсчет элементов в контуре* и *подсчет элементов, выбранных рамкой*.

Два лиспа *подсчет элементов в контуре* и *подсчет элементов, выбранных рамкой*.

Ответ
Поиск в этой теме
Непрочитано 08.02.2025, 22:10 #1
Два лиспа *подсчет элементов в контуре* и *подсчет элементов, выбранных рамкой*.
Ingpro
 
Регистрация: 11.07.2022
Сообщений: 748

Программки несложные, но может кому пригодятся...
Спасибо Алексею aka kpblc, koMon, name02 за подсказки чайнику...

contur-insert-txt-WP.lsp -указать контур с объектами и вставить результат (количество объектов в контуре) в чертеж.
Coun-in-frame..lsp - выбрать рамкой элементы, которые надо посчитать и вставить результат в чертеж.

Вложения
Тип файла: lsp contur-insert-txt-WP.lsp (1.3 Кб, 14 просмотров)
Тип файла: lsp Coun-in-frame.lsp (608 байт, 10 просмотров)


Последний раз редактировалось Ingpro, 05.03.2025 в 14:18.
Просмотров: 440
 
Непрочитано 09.02.2025, 11:08
1 | 1 #2
Кулик Алексей aka kpblc
Moderator

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


Советую добавить перехват ошибок. И переменные перевести в локальные.

----- добавлено через ~3 мин. -----
Плюс (немного подушню) : в countour-insert-txt-wp нет контроля выбранного примитива в (setq pl (car (entsel "\nSelect the contour (polyline: ")))
Я бы, наверное, написал там примерно так:
Код:
[Выделить все]
 (if 
  (and 
    (= 
      (type 
        (setq pl (vl-catch-all-apply 
                   (function 
                     (lambda () 
                       (car (entsel "\nSelect the contour polyline <Cancel> : "))
                     )
                   )
                 )
        )
      )
      'ename
    )
    (= (cdr (assoc 0 (entget pl))) "LWPOLYLINE")
  )
; ...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 09.02.2025, 12:25
#3
andriadi

геолог
 
Регистрация: 30.01.2016
КМВ
Сообщений: 160


А пометить выбранные элементы из контура программа может?
andriadi вне форума  
 
Автор темы   Непрочитано 09.02.2025, 13:19
#4
Ingpro


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


Цитата:
Сообщение от andriadi Посмотреть сообщение
А пометить выбранные элементы из контура программа может?
Это подойдет?
Вложения
Тип файла: lsp SCWP_SCCP.lsp (7.3 Кб, 6 просмотров)
Ingpro вне форума  
 
Непрочитано 09.02.2025, 14:03
#5
andriadi

геолог
 
Регистрация: 30.01.2016
КМВ
Сообщений: 160


Спросил для интереса. Давно в FoxPro создал программу выборки скважин из контура.))
andriadi вне форума  
 
Автор темы   Непрочитано 10.02.2025, 21:48
#6
Ingpro


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Советую добавить перехват ошибок. И переменные перевести в локальные.
Плюс (немного подушню) : в countour-insert-txt-wp нет контроля выбранного примитива в (setq pl (car (entsel "\nSelect the contour (polyline: ")))
С этим не получилось...
Немного издевательств над кодом contur-insert-txt-WP.lsp:
чёй-то у меня не получилось осуществить выбор POLYLINE и LWPOLYLINE
(setq ss (ssget "_X" '((0 . "*POLYLINE"))))
или
(setq ss (ssget "_X" '((0 . "POLYLINE,LWPOLYLINE"))))
поэтому предлагаю все POLYLINE без выбра преобразовать в LWPOLYLINE, а потом выбрать контур для count...
Наверно, можно как-то поизящнее... но код выполняет свою задачу и не ругается на POLYLINE:
Код:
[Выделить все]
 ;;  преобразовать подробные POLYLINE в компактные LWPOLYLINE
;;  указать контур с объектами и вставить результат (количество объектов в контуре) в чертеж
(defun c:count-wp-lw ( / ss pl points count pt)
(setq ss (ssget "_X" '((0 . "POLYLINE"))))
  (if ss
    (progn
 (command "_.CONVERTPOLY" "_Light" ss "") ; в компактную LWPOLYLINE
      (princ (strcat "\nПреобразовано 2D-полилиний в LWPOLYLINE: " 
                     (itoa (sslength ss))))
   )
    (princ "\n2D-полилинии не найдены.")
  )
  (setq pl (car (entsel "\nSelect the contour (polyline: "))) 
  (if pl
    (progn
      (setq points (mapcar 'cdr
                           (vl-remove-if-not
                             '(lambda (x) (= (car x) 10))
                             (entget pl)
                           )
                  )
      )
      (setq count (sslength (ssget "_wp" points))) ; если нужны объекты, которые касаются контура, то заменить "_wp" на "_cp"

      (setq pt (getpoint "\nSpecify a point to insert the text: ")) 

          (entmakex
          (list
          '(0 . "TEXT")
          (cons 10 (trans pt 1 0))
          '(40 . 250.0)
          '(7 . "STANDARD")
          (cons 1 (itoa count))
          '(50 . 0.0)                                       
        )
      )

        (prompt (strcat "\nObjects found: " (itoa count))) 
    )
    (prompt "\nThe polyline is not selected.") 
  )
  (princ)
)
Ingpro вне форума  
 
Непрочитано 10.02.2025, 22:38
1 | #7
Кулик Алексей aka kpblc
Moderator

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


1. Метки отмены
2. Есть разница между command, command-s и vl-cmdf
3. Отлова ошибок как не было, так и нет. Что будет, если на запрос контура-полилинии пользователь нажмет Esc? А если нажмет Esc на запросе точки?
Код:
[Выделить все]
 ;;  преобразовать подробные POLYLINE в компактные LWPOLYLINE
;;  указать контур с объектами и вставить результат (количество объектов в контуре) в чертеж
(vl-load-com)
(defun c:count-wp-lw (/ adoc ss pl points count pt) 
  (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))

  (if (setq ss (ssget "_X" '((0 . "POLYLINE")))) 
    (progn 
      (vl-cmdf "_.CONVERTPOLY" "_Light" ss "") ; в компактную LWPOLYLINE
      (princ 
        (strcat "\nПреобразовано 2D-полилиний в LWPOLYLINE: " 
                (itoa (sslength ss))
        )
      )
    )
    (princ "\n2D-полилинии не найдены.")
  )

  (if 
    (and 
      (= 
        (type 
          (setq pl (vl-catch-all-apply 
                     (function 
                       (lambda () 
                         (car (entsel "\nSelect the contour polyline <Cancel> : "))
                       )
                     )
                   )
          )
        )
        'ename
      )
      (wcmatch (cdr (assoc 0 (entget pl))) "*POLYLINE")
      (= 
        (type 
          (setq pt (vl-catch-all-apply 
                     (function 
                       (lambda () 
                         (getpoint "\nSpecify a point to insert the text <Cancel> : ")
                       )
                     )
                   )
          )
        )
        'list
      )
      pt
    )
    (progn 
      (setq points (mapcar 'cdr 
                           (vl-remove-if-not 
                             '(lambda (x) (= (car x) 10))
                             (entget pl)
                           )
                   )
            count  (sslength (ssget "_wp" points))
      ) ; если нужны объекты, которые касаются контура, то заменить "_wp" на "_cp"

      (entmakex 
        (list 
          '(0 . "TEXT")
          (cons 10 (trans pt 1 0))
          '(40 . 250.0)
          '(7 . "STANDARD")
          (cons 1 (itoa count))
          '(50 . 0.0)
        )
      )

      (prompt (strcat "\nObjects found: " (itoa count)))
    )
    (prompt "\nThe polyline is not selected, or text point is not defined.")
  )
  (vla-endundomark adoc)
  (princ)
)
----- добавлено через 42 сек. -----
Эт я еще молчу, что в полилинии могут быть и дуговые сегменты )))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 10.02.2025, 22:45
#8
Ingpro


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
1. Метки отмены
2. Есть разница между command, command-s и vl-cmdf
3. Отлова ошибок как не было, так и нет. Что будет, если на запрос контура-полилинии пользователь нажмет Esc? А если нажмет Esc на запросе точки?
А что будет, если на запрос контура-полилинии пользователь нажмет Esc?
Select the contour (polyline: *Прервано*
; ошибка: Функция отменена


А если нажмет Esc на запросе точки?
Specify a point to insert the text: *Прервано*
; ошибка: Функция отменена


И с command тоже работает...

Последний раз редактировалось Ingpro, 10.02.2025 в 23:14.
Ingpro вне форума  
 
Непрочитано 10.02.2025, 23:51
1 | #9
Кулик Алексей aka kpblc
Moderator

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


Ну возьми свой код, и нажми Esc в момент запроса полилинии. В лучшем случае ты получишь в ком.строке сообщение об ошибке. В худшем - у тебя просто будет заблокировано дальнейшее выполнение. В общем, статье уже черт знает сколько лет. Если тебе охота наступать на грабли интерактива - мешать не буду )

----- добавлено через 32 сек. -----
Блин, забыл нажать "отправить" и отвлекся...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Готовые программы > Два лиспа *подсчет элементов в контуре* и *подсчет элементов, выбранных рамкой*.



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Расчет несущей способности элементов монтажных систем по СТО (коннекторы, опорные элементы, соединители) tanya_74 Металлические конструкции 0 16.04.2024 14:55
Как ускорить создание однотипных стальных конструктивных элементов в SCAD? serb194584 SCAD 14 22.02.2023 11:20
Как отредактировать нагрузку в Midas Civil у выбранных элементов vfc.cz Расчетные программы 1 22.02.2021 12:42
Неправдоподобно маленькие сечения элементов фермы при подборе в SCAD Олег 3108 SCAD 1 01.10.2012 13:25
Lisp: Список элементов в слоях ALFMario LISP 4 29.04.2008 17:26