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

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

Выбор всех объектов внутри замкнутой полилинии

Ответ
Поиск в этой теме
Непрочитано 29.09.2011, 12:19 #1
Выбор всех объектов внутри замкнутой полилинии
fellow123
 
Регистрация: 29.09.2011
Сообщений: 13

Доброго времени суток!
Поискали на форуме, но так и не нашел ответ на вопрос: есть ли программным путем или стандартными средствами в Autocad решить проблему выбора объектов находящихся внутри замкнутой полилинии. Я занимаюсь топографическим съемками и при обновлении информации иногда нужно просто удалить старую находящуюся в определенном контуре и просто вставить обновленную. Если кто уже решал подобную задачу, подскажите!!
Заранее благодарен за ответы!
Просмотров: 20755
 
Автор темы   Непрочитано 29.09.2011, 12:24 Выбор всех объектов внутри замкнутой полилинии
#2
fellow123


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


Доброго времени суток!
Поискали на форуме, но так и не нашел ответ на вопрос: есть ли программным путем или стандартными средствами в Autocad решить проблему выбора объектов находящихся внутри замкнутой полилинии. Я занимаюсь топографическим съемками и при обновлении информации иногда нужно просто удалить старую находящуюся в определенном контуре и просто вставить обновленную. Если кто уже решал подобную задачу, подскажите!!
Заранее благодарен за ответы!
fellow123 вне форума  
 
Непрочитано 29.09.2011, 12:25
#3
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Использовать для выбора объектов секущий многоугольник (обвести им полилинию)?
Profan вне форума  
 
Автор темы   Непрочитано 29.09.2011, 12:30
#4
fellow123


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


Цитата:
Сообщение от Profan Посмотреть сообщение
Использовать для выбора объектов секущий многоугольник (обвести им полилинию)?

Можно подробней? Какая команда?
fellow123 вне форума  
 
Непрочитано 29.09.2011, 12:36
#5
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Команда "_ERASE" ("СТЕРЕТЬ") с опцией "_CP" ("СМ").
Profan вне форума  
 
Автор темы   Непрочитано 29.09.2011, 12:43
#6
fellow123


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


не получается что то
секущий многоугольник имеется ввиду region?
как набрать в ком. строке: _erase_cp не проходит
fellow123 вне форума  
 
Непрочитано 29.09.2011, 12:46
#7
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Сначала ввести _erase, потом на запрос выбора объектов ввести _cp.
Profan вне форума  
 
Автор темы   Непрочитано 29.09.2011, 12:46
#8
fellow123


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


Цитата:
Сообщение от Profan Посмотреть сообщение
Команда "_ERASE" ("СТЕРЕТЬ") с опцией "_CP" ("СМ").
не получается что то
секущий многоугольник имеется ввиду region?
как набрать в ком. строке: _erase_cp не проходит
fellow123 вне форума  
 
Непрочитано 29.09.2011, 12:48
#9
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Смотри #6.
Profan вне форума  
 
Автор темы   Непрочитано 29.09.2011, 12:51
#10
fellow123


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


Цитата:
Сообщение от Profan Посмотреть сообщение
Сначала ввести _erase, потом на запрос выбора объектов ввести _cp.
да так работает!
ну все таки может с помощью полилинии как то возможно так сделать?
просто участки довольно большие с большим количеством точек, а полилинию я создаю с помощью склейки многих линий. так что на это уходит не много времени, а обводить таким полигоном довольно длительный процесс!
fellow123 вне форума  
 
Непрочитано 29.09.2011, 12:59
1 | #11
getr

Конструктор
 
Регистрация: 06.04.2005
Из тех ворот-откуда весь народ.
Сообщений: 361
<phrase 1=


Тоже как-то был озадачен похожей проблемой..решил для себя этим лиспом- попробуй, может пригодится...сразу оговорюсь,что не сильно разбираюсь в Lisp и данный код собрал из кусков..не помню уж в каких случаях,но бывает что работает не так как хочется..короче -пробуй.
Вложения
Тип файла: lsp CLAR.lsp (22.5 Кб, 1168 просмотров)
__________________
"Мнение не бывает ни истинным, ни ложным, а лишь полезным в жизни или бесполезным. ",- Ауробиндо
И не надо делать удивленных движений руками.
getr вне форума  
 
Автор темы   Непрочитано 29.09.2011, 13:08
#12
fellow123


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


Цитата:
Сообщение от getr Посмотреть сообщение
Тоже как-то был озадачен похожей проблемой..решил для себя этим лиспом- попробуй, может пригодится...сразу оговорюсь,что не сильно разбираюсь в Lisp и данный код собрал из кусков..не помню уж в каких случаях,но бывает что работает не так как хочется..короче -пробуй.


Спасибо! работает!!
fellow123 вне форума  
 
Непрочитано 29.09.2011, 14:08
2 | #13
Кулик Алексей aka kpblc
Moderator

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


Чтобы по всем вершинам не кликать:
Код:
[Выделить все]
 (defun sel-by-pline (/ ent ss)
  (if (and (= (type (setq ent (vl-catch-all-apply
                                (function
                                  (lambda ()
                                    (ssname (ssget "_:E" '((0 . "LWPOLYLINE") (70 . 1))) 0)
                                    ) ;_ end of lambda
                                  ) ;_ end of function
                                ) ;_ end of vl-catch-all-apply
                          ) ;_ end of setq
                    ) ;_ end of type
              'ename
              ) ;_ end of =
           (= (type (setq ss (vl-catch-all-apply
                               (function
                                 (lambda ()
                                   (ssget "_wP"
                                          (mapcar
                                            (function cdr)
                                            (vl-remove-if-not
                                              (function
                                                (lambda (x)
                                                  (= (car x) 10)
                                                  ) ;_ end of lambda
                                                ) ;_ end of function
                                              (entget ent)
                                              ) ;_ end of vl-remove-if-not
                                            ) ;_ end of mapcar
                                          ) ;_ end of ssget
                                   ) ;_ end of lambda
                                 ) ;_ end of function
                               ) ;_ end of vl-catch-all-apply
                          ) ;_ end of setq
                    ) ;_ end of type
              ) ;_ end of =
           ) ;_ end of and
    (sssetfirst ss ss)
    ) ;_ end of if
  ) ;_ end of defun
Парочка "но": полилиния не должна иметь самопересечений; дуговые сегменты не обрабатываются.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 29.09.2011, 14:40
#14
fellow123


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


СпасибО!! Работает!!
fellow123 вне форума  
 
Непрочитано 29.09.2011, 19:18
1 | #15
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


LISP.Выделение объектов в области контура
Выделение объектов в области контура, AutoCAD
Выделение снаружи _pline
Удаление объектов находящихся за заданным контуром
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 30.09.2011, 07:04
#16
fellow123


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


Еще один вопрос! Думаю он тоже может подойти к этой теме!
Может есть лисп который может сделать такие же действия только по заданным координатам Z (высотам, отметкам)? То есть удалить всю информацию ниже какой то отметки, высоты или выше.

Последний раз редактировалось fellow123, 30.09.2011 в 13:17.
fellow123 вне форума  
 
Непрочитано 30.09.2011, 13:53
#17
Victor


 
Регистрация: 14.06.2009
Бат-Ям
Сообщений: 295


А точно лисп нужен? Я обычно сбоку смотрю и стираю то что ниже опеделённой отметки. Часто бывает 3Д-линия идёт нормально,
а потом вдруг скачет на ноль. Я её отмечаю, возвращаюсь в обычный вид и исправляю ошибку.
Victor вне форума  
 
Автор темы   Непрочитано 30.09.2011, 13:59
#18
fellow123


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


дело в том что я занимаюсь проектированием и нужно частенько делать погоризонтные планы. Было бы очень удобно если бы нужный диапазон отметок сразу отсекался автоматически!
fellow123 вне форума  
 
Непрочитано 07.03.2017, 08:58
#19
tujn08


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


Привет! Как правильно использовать: (ssget "_WP"....?
или то, что поможет выбирать многоугольником, визуально показывая границы выбора (не секущей рамкой)
Хочу получить набор блоков из слоя, а визуально как если бы выбирал: (command "_select" "_wp").

Спасибо!
tujn08 вне форума  
 
Непрочитано 07.03.2017, 09:13
#20
Кулик Алексей aka kpblc
Moderator

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


См.ключи ssget. Ну и не забывай про то, что при подобных режимах выбора все точки должны быть видны на экране.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 07.03.2017, 10:18
#21
tujn08


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


Уточню:
Код:
[Выделить все]
 (progn
	 (setq point_1(getpoint "Точка: "))
	 (setq point_2(getpoint "Точка: "))
	 (setq point_3(getpoint "Точка: "))
  	(setq ls (list point_1 point_2 point_3))
	(setq nab (ssget "_WP" ls (list (cons 8 "Pr_Equipment") (cons 0 "INSERT"))))
	(setq
		i 0
		b (sslength nab)
	)
	(princ (itoa b))
)
Как видеть контуры многоугольника из точек?

----- добавлено через ~4 мин. -----
На подобие "getcorner"
tujn08 вне форума  
 
Непрочитано 07.03.2017, 10:40
#22
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от tujn08 Посмотреть сообщение
Как видеть контуры многоугольника из точек?
Как вариант - grdraw. Но если этот многоугольник надо отображать в процессе выбора, то задача усложняется: grread не понимает привязок, приходится использовать обходные пути (на theswamp.org, если не ошибаюсь, Евгений Елпанов выкладывал коды)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 08.03.2017, 05:30
#23
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,072


Может быть тоже пригодится - на днях выложили здесь для поиска по многим контурам на основе программ выбора SCWP и SSWP от VVA:
Код:
[Выделить все]
 (defun test (op / ob sel ssget->ename)
  (defun ssget->ename (s)
    (if	(and s (= (type s) 'PICKSET))
      (vl-remove-if 'listp (mapcar 'cadr (ssnamex s)))
    )
  )
  (or (setq sel (ssget "_I")) (setq sel (ssget)))
  (setq ob (ssadd))
  (mapcar (function (lambda (k / x)
		      (SelectContour op k)
		      (if (setq x (ssget "_I"))
			(mapcar	(function (lambda (b) (ssadd b ob)))
				(ssget->ename x)
			)
		      )
		    )
	  )
	  (ssget->ename sel)
  )
  (SSSETFIRST ob ob)
  (princ)
)

(defun SelectContour ( opt en / ss lst)
(defun DTR (a)(* pi (/ a 180.0)))
(defun  lib:pt_extents (vlist / tmp)
(setq tmp (mapcar '(lambda (x) (vl-remove-if 'null x))
(mapcar '(lambda (what) (mapcar '(lambda (x) (nth what x)) vlist))
'(0 1 2))));_setq
  (list (mapcar '(lambda(x)(apply 'min x)) tmp)(mapcar '(lambda(x)(apply 'max x)) tmp)))
(defun lib:IsPtInView (pt / VCTR Y_Len SSZ X_Pix Y_Pix X_Len Lc Uc)
(setq pt (trans pt 0 1))
(setq VCTR (getvar "VIEWCTR") Y_Len (getvar "VIEWSIZE")
   SSZ (getvar "SCREENSIZE")
   X_Pix (car SSZ) Y_Pix (cadr SSZ)
   X_Len (* (/ X_Pix Y_Pix) Y_Len)
   Lc (polar VCTR (dtr 180.0) (* 0.5 X_Len))
   Uc (polar Lc 0.0 X_Len)
   Lc (polar Lc (dtr 270.0) (* 0.5 Y_Len))
   Uc (polar Uc (dtr 90.0) (* 0.5 Y_Len)))
(if (and (> (car pt) (car Lc))(< (car pt) (car Uc))
    (> (cadr pt) (cadr Lc))(< (cadr pt) (cadr Uc)))
   T nil))
(defun lib:Zoom2Lst( vlist / bl tr Lst OS)
(setq   Lst (lib:pt_extents vlist) bl (car Lst) tr (cadr Lst))
(if (not (and (lib:IsPtInView bl) (lib:IsPtInView tr)))
(progn  (setq OS (getvar "OSMODE"))(setvar "OSMODE" 0)
(command-s "_.Zoom" "_Window" (trans bl 0 1)(trans tr 0 1)
   "_.Zoom" "0.95x")
(setvar "OSMODE" OS) T) NIL))
(defun TraceObject (obj / typlst typ TracePline TraceACE TraceLine
                         TraceSpline TraceType1Pline
                          TraceType23Pline)
    (defun ZClosed (lst)
    (if (and (vlax-curve-isClosed obj)
       (not(equal (car lst)(last lst) 1e-6)))
      (append lst (list (car lst)))
      lst))
  (defun TracePline (obj / param endparam anginc tparam pt blg
                           ptlst delta inc arcparam flag)
    (setq param (vlax-curve-getStartParam obj)
          endparam (vlax-curve-getEndParam obj)
          anginc (* pi (/ 7.5 180.0)))
    (setq tparam param)
      (while (<= param endparam)
        (setq pt (vlax-curve-getPointAtParam obj param))
        (if (not (equal pt (car ptlst) 1e-12))
          (setq ptlst (cons pt ptlst)))
        (if  (and (/= param endparam)
            (setq blg (abs (vlax-invoke obj 'GetBulge param)))
            (/= 0 blg))
          (progn
            (setq delta (* 4 (atan blg)) ;included angle
                  inc (/ 1.0 (1+ (fix (/ delta anginc))))
                  arcparam (+ param inc))
            (while (< arcparam (1+ param))
              (setq pt (vlax-curve-getPointAtParam obj arcparam)
                    ptlst (cons pt ptlst)
                    arcparam (+ inc arcparam))))
        )
        (setq param (1+ param)))
    (if (and (apply 'and ptlst)
        (> (length ptlst) 1))
     (ZClosed (reverse ptlst)))) ;end
  (defun TraceACE (obj / startparam endparam anginc
                         delta div inc pt ptlst)
    (setq startparam (vlax-curve-getStartParam obj)
          endparam (vlax-curve-getEndParam obj)
          anginc (* pi (/ 5.0 180.0)))
    (if (equal endparam (* pi 2) 1e-12)
      (setq delta endparam)
      (setq delta (NormalAngle (- endparam startparam))))
    (setq div (1+ (fix (/ delta anginc)))
          inc (/ delta div))
    (while (or
        (< startparam endparam)
        (equal startparam endparam 1e-12))
      (setq pt (vlax-curve-getPointAtParam obj startparam)
            ptlst (cons pt ptlst)
            startparam (+ inc startparam)))
    (reverse ptlst)) ;end
  (defun TraceLine (obj)(list (vlax-get obj 'StartPoint)
        (vlax-get obj 'EndPoint)))
  (defun TraceSpline (obj / startparam endparam ncpts inc param
                            fd ptlst pt1 pt2 ang1 ang2 a)
    (setq startparam (vlax-curve-getStartParam obj)
          endparam (vlax-curve-getEndParam obj)
          ncpts (vlax-get obj 'NumberOfControlPoints)
          inc (/ (- endparam startparam) (* ncpts 7))
          param (+ inc startparam)
          fd (vlax-curve-getfirstderiv obj param)
          ptlst (cons (vlax-curve-getStartPoint obj) ptlst))
    (while (< param endparam)
      (setq pt1 (vlax-curve-getPointAtParam obj param)
            ang1 fd
            param (+ param inc)
            pt2 (vlax-curve-getPointAtParam obj param)
            fd (vlax-curve-getfirstderiv obj param)
            ang2 fd
            a (abs (3d_angw1w2 ang1 ang2)))
      (if (> a 0.00218166)(setq ptlst (cons pt1 ptlst))))
    (if (not (equal
          (setq pt1 (vlax-curve-getEndPoint obj)) (car ptlst) 1e-8))
      (setq ptlst (cons pt1 ptlst)))
    (reverse ptlst)) ;end
  (defun TraceType1Pline (obj / ptlst objlst lst)
    (setq ptlst (list (vlax-curve-getStartPoint obj))
          objlst (vlax-invoke obj 'Explode))
    (foreach x objlst
      (setq lst (TraceACE x))
      (if (not (equal (car lst) (last ptlst) 1e-8))
        (setq lst (reverse lst)))
      (setq ptlst (append ptlst (cdr lst)))
      (vla-delete x))(ZClosed  ptlst)) ;end
  (defun TraceType23Pline (obj / objlst ptlst lastpt)
    (setq objlst (vlax-invoke obj 'Explode)
          lastpt (vlax-get (last objlst) 'EndPoint))
    (foreach x objlst
      (setq ptlst (cons (vlax-get x 'StartPoint) ptlst))
      (vla-delete x))(ZClosed (reverse (cons lastpt ptlst)))) ;end
  (defun Trace3DPline (obj / coord ptlst)
    (setq coord (vlax-get obj 'Coordinates))
    (repeat (/ (length coord) 3)
      (setq ptlst (cons (list (car coord) (cadr coord)(caddr coord)) ptlst))
      (setq coord (cdddr coord)))(ZClosed (reverse ptlst))) ;end
(defun NormalAngle (a)(if (numberp a)(angtof (angtos a 0 14) 0)))
(defun 3d_angw1w2 (Wekt1 Wekt2 / CosA)
(if (equal (setq CosA (/ (apply '+ (mapcar '* Wekt1 Wekt2))
        (distance '(0 0 0) Wekt1) (distance '(0 0 0) Wekt2))) -1.0 1e-6)
  Pi
  (if (equal CosA 0.0 1e-6) (* 0.5 PI)(atan (sqrt (- 1 (* CosA CosA))) CosA))))
  (setq typlst '("AcDb2dPolyline" "AcDbPolyline" "AcDb3dPolyline" "AcDbCircle"
     "AcDbArc" "AcDbEllipse" "AcDbSpline" "AcDbLine"))
  (or (eq (type obj) 'VLA-OBJECT)
    (setq obj (vlax-ename->vla-object obj)))
  (setq typ (vlax-get obj 'ObjectName))
  (if (vl-position typ typlst)
    (cond ((or (eq typ "AcDb2dPolyline") (eq typ "AcDbPolyline"))
      (cond ((or
               (not (vlax-property-available-p obj 'Type))
               (= 0 (vlax-get obj 'Type)))
              (TracePline obj))
            ((or (= 3 (vlax-get obj 'Type)) (= 2 (vlax-get obj 'Type)))
              (TraceType23Pline obj))
            ((= 1 (vlax-get obj 'Type))
              (TraceType1Pline obj))))
       ((eq typ "AcDbLine")(TraceLine obj))
       ((or (eq typ "AcDbCircle") (eq typ "AcDbArc") (eq typ "AcDbEllipse"))
         (TraceACE obj))
       ((eq typ "AcDbSpline")(TraceSpline obj))
       ((eq typ "AcDb3dPolyline")(Trace3DPline obj))
    )))
(vl-load-com)
;;;  (setq en (car(entsel "\nУкажите контур: ")))
  (if (and en (wcmatch (cdr(assoc 0 (entget en))) "*POLYLINE,SPLINE,CIRCLE,ARC,ELLIPSE"))
    (progn
      (setq lst (TraceObject (vlax-ename->vla-object en)))
      (lib:Zoom2Lst lst);_Гарантированно полилиния на экране
;;;      (setq lst (mapcar '(lambda(x)(trans x 0 1)) lst))
      (setq lst (mapcar '(lambda(x)(list (car x)(cadr x))) lst))
(if (setq ss (ssget opt lst))(SSSETFIRST ss ss))
(setq ss nil)))(princ))
;_Select Contour Window Polygon
(defun C:SCWP ()(test "_WP"))
;_Select Contour Crossing Polygon
(defun C:SCCP ()(test "_CP"))
(princ "\nНаберите в командной строке SCWP или SCCP")
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Выбор всех объектов внутри замкнутой полилинии

Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Простановка площадей внутри полилинии. Klo LISP 26 14.12.2018 17:43
Задание начальной точки у замкнутой полилинии Sky_cool Программирование 2 23.01.2008 11:11
как узнать координаты всех объектов в определенных слоях? kikach Программирование 2 04.01.2008 11:54
некорректно определяется площадь замкнутой полилинии elena_din AutoCAD 16 23.09.2005 17:37
Нужна прога для преобразования ВСЕХ примитивов в полилинии timurka AutoCAD 4 25.11.2003 05:15