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

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

Как выделить объекты пересекаемые полилинией?

Ответ
Поиск в этой теме
Непрочитано 13.04.2012, 07:14 #1
Как выделить объекты пересекаемые полилинией?
Shaft
 
отдел открытых горных работ
 
Новокузнецк
Регистрация: 06.05.2009
Сообщений: 124

Всем доброго времени суток и отличного настроения!

Значит задача заключается в следующем:
Чтобы при выборе полилинии(ий) (не замкнутой как правило) выделялись все объекты которые она пересекает.

Чувствую, что подобная задача уже когда-то, перед кем-то вставала. И скорее всего уже решение есть.
Но мне пока не удалось его отыскать.

Зато нашел кучу решений в которых на пересечениях
  • вставляются вершины
  • разрываются объекты
  • либо выбираются (но при условии что полилиния является замкутым контуром)
Поделитесь пожалуйста, если кто знает решение моей задачи.

Последний раз редактировалось Shaft, 13.04.2012 в 07:24.
Просмотров: 19391
 
Непрочитано 13.04.2012, 07:37
1 | #2
Profan


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


Если полилиния состоит только из линейных сегментов, то можно воспользоваться опцией "_fence" ("линия") команды "_select" ("выбрать"), для которой передать определенные программно координаты вершин полилинии.
При разовой задаче можно просто провести выделяющую линию вдоль отрисованной полилинии.
Profan вне форума  
 
Автор темы   Непрочитано 13.04.2012, 07:44
#3
Shaft

отдел открытых горных работ
 
Регистрация: 06.05.2009
Новокузнецк
Сообщений: 124


задача не разовая
про доп.опции комадны "выбрать" (см; рм; л) мне известно и я ими успшно пользуюсь.
но сейчас мне надо выбирать объекты пересекаемые полилинией (а она бывает не только прямой) и я не знаю пока как это можно сделать?

Цитата:
передать определенные программно координаты вершин полилинии
не пойму каким образом это можно сделать, можете разьяснить хотябы в кратце?
Shaft вне форума  
 
Непрочитано 13.04.2012, 08:13
1 | #4
Profan


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


Пока могу дать только ссылку:
http://forum.dwg.ru/showthread.php?t=64518
Profan вне форума  
 
Автор темы   Непрочитано 13.04.2012, 08:46
#5
Shaft

отдел открытых горных работ
 
Регистрация: 06.05.2009
Новокузнецк
Сообщений: 124


Эх! Спасибо вам Profan, за ссылку конечно. Но это увы не мой уровень. Т.к. я в програмировании не силен.
Offtop: Пробовал 2 года назад книгу про Lisp почитать. Честно скажу, что я долго мусолил первые две или три главы... но так ничего и не понял. Не знаю, может это не моё? Или просто нужен другой подход для меня
Shaft вне форума  
 
Непрочитано 13.04.2012, 09:37
3 | #6
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Тестируй
Добавлено *2012-12-02*
2 команды
SELPOLY - Выделение объектов, пересекаемых полилинией
BSELPOLY - Выделение блоков, пересекаемых полилинией
Учтен момент, показанный в #17 (наличие совпадающих вершин в полилинии)
Код:
[Выделить все]
(defun C:SELPOLY ()
  ;;; Выделение объектов, пересекаемых полилинией
  (selpoly nil)
  (princ)
  )
(defun C:BSELPOLY ()
  ;;; Выделение блоков, пересекаемых полилинией
  (selpoly (list(cons 0 "INSERT")))
  (princ)
  )
(defun block-get-name (blkobj)
(cond
  ((and (vlax-property-available-p blkobj 'isdynamicblock)
	(= (vla-get-isdynamicblock blkobj) :vlax-true)
	) ;_ end of and
   (vla-get-effectivename blkobj)
   )
  (t (vla-get-name blkobj))
  ) ;_ end of cond
  )
;| ! *******************************************************************
;; !                  _IsPtInView
;; ! *******************************************************************
;; ! Проверяет находится ли точка в видовом экране
;; ! Auguments: 'pt'  - Точка для анализа в МСК!!!
;; ! Return   : T или nil если 'pt' в видовом экране или нет
;; ! *******************************************************************|;
(defun _get-viewctr-size ( / VCTR Y_Len SSZ X_Pix Y_Pix X_Len)
  (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)
        )
   (list(mapcar '- VCTR (list (* 0.5 X_len)(* 0.5 Y_len)))
        (mapcar '+ VCTR (list (* 0.5 X_len)(* 0.5 Y_len)))
        )
  )
(defun _IsPtInView (pt / Lc Uc)
(setq pt (trans pt 0 1))
(setq Lc (_get-viewctr-size)
      Uc (cadr Lc)
      Lc (car Lc)
      )
  (if (and (> (car pt) (car Lc))(< (car pt) (car Uc))
	 (> (cadr pt) (cadr Lc))(< (cadr pt) (cadr Uc))
         )
	T nil))
;| ! ***************************************************************************
;; !           _pt_extents
;; ! ***************************************************************************
;; ! Function : Возвращает границы MIN, MAX X,Y,Z списка точек
;; ! Argument : 'vlist' - Список точек
;; ! Returns  : Список точек (ЛевНижн ПравВерхн)
;; ! ***************************************************************************|;
(defun  _pt_extents (vlist / tmp)
  (setq tmp (apply 'mapcar (cons 'list vlist)))
  (list (mapcar '(lambda(x)(apply 'min x)) tmp)(mapcar '(lambda(x)(apply 'max x)) tmp)));_defun
  ;; !                             _Zoom2Lst
;; ! **********************************************************
;; ! Function : Zoom границ списка точек
;; ! Arguments: 'vlist' - Список точек в МСК!!!!
;; ! Зуммирует экран, чтобы все точки были видны
;; ! Returns  : t - было зуммирование nil - нет
;; ! **********************************************************
  (defun _Zoom2Lst (vlist / pts)
    (setq pts (_pt_extents (mip:ZZero vlist)))
    (if (not (and (_IsPtInView (car pts)) (_IsPtInView (cadr pts))))
      (progn
        (vla-ZoomWindow (vlax-get-acad-object)(vlax-3d-point (car pts))(vlax-3d-point (cadr pts)))
	(vlax-invoke (vlax-get-acad-object) 'ZoomScaled 0.85 acZoomScaledRelative)
	T
	)
      nil
      )
  ) ;end
(defun mip:entsel (promt filter entlist / key n newentlist ent_point promt)
;;;Функция mip:entsel
;;;Еденичный выбор объекта, замена функции entsel
;;;Возвращает entity name выбранного примитива или nil, точку указания запоминает в переменной LASTPOINT
;;;Параметры:
;;;promt - предложение выбрать объект (string)
;;;filter - фильтр объектов для выбора вида '("LINE" "LWPOLYLINE")
;;;entlist - список примитивов которые не надо выбирать (либо список entity name, либо PICKSET)
;;;
;;;Примеры:
;;;(mip:entsel "\nВыберите объекты" '("LINE" "LWPOLYLINE") nil)
;;;(mip:entsel "\nВыберите объекты" nil nil)
;;;(setq aa nil) (mip:entsel "\nВыберите объекты" '("LINE" "LWPOLYLINE") (while (setq a (car (entsel))) (setq aa (append aa (list a)))))
;;;(mip:entsel "\nВыберите объекты" '("LINE" "LWPOLYLINE") (ssget))
  (setq key T n 0 newentlist nil)
  (if (eq (type entlist) 'PICKSET)
    (progn
    	(while (setq a (ssname entlist n)) (setq newentlist (append newentlist (list a)) n (1+ n)))
    	(setq entlist newentlist)
    );progn
   );if
    (while key
    	(if (or (setq ent_point (entsel promt)) (= (getvar "ERRNO") 7))
	  	(if (or (eq (type ent_point) 'LIST) (not ent_point))
		  (if ent_point
		    (if (member (setq ent (car ent_point)) entlist)
		      (princ "\nПримитив уже выбран")
		      (if filter
			      (if (not (member (cdr (assoc 0 (entget ent))) filter))
				(progn (setq str "\nНе верный выбор, выберите: ")
				  (princ (substr (setq str (foreach n filter (setq str (strcat str n ", ")))) 1 (- (strlen str) 2)))
				);progn
				(setq key nil)
			      );if
				(setq key nil)
			);if
		    );if
		    (setq key T)
		  );if
	    	(setq key nil)
	    );if
	  (setq key nil)
      	);if
     );while
  (if (eq (type ent_point) 'LIST)
    (progn (setvar "LASTPOINT" (cadr ent_point)) ent)
    ent_point
  );if
);defun
  (defun mip_MakeUniqueMembersOfList  ( lst / OutList head)
;;;Удаляет одинаковые (дубликаты) элементы из списка
;;; На основе http://www.theswamp.org/index.php?topic=19128.0
;;; Изменено для сравнения вещественных чисел (equal ... 1e-6)

  (while lst
    (setq head (car lst)
          OutList (cons head OutList)
          lst (vl-remove-if '(lambda(pt)(equal pt head 1e-6))(cdr lst))
          )
    )
  (reverse OutList)
  )
(defun mip:ZZero (lst)
  (mapcar '(lambda(x)(list (car x)(cadr x))) lst)
  )
(defun massoc (key alist / x nlist)
  (foreach x alist
    (if (eq key (car x))
      (setq nlist (cons (cdr x) nlist))
    ))
  (reverse nlist))
(defun SELPOLY ( filter-list / pl lst ss)
;;; Выделение объектов, пересекаемых полилинией
;;; Vladimir Azarko (VVA) for dwg.ru
;;;  filter-list - фильтр список, см. описание ф-ции ssget или nil
;;; http://forum.dwg.ru/showthread.php?t=82243
;;;http://www.cadtutor.net/forum/showthread.php?68857-Counting-objects-not-blocks-in-a-polyline&p=471167#post471167
(vl-load-com)
(and
  (setq pl (mip:entsel "\nВыберите полилинию" '("LWPOLYLINE") nil))
  (setq lst (massoc 10 (entget pl)))
  (or (_Zoom2Lst lst) t)
  (setq ss nil
	ss
	 (if filter-list
	 (ssget
	   "_F"
	   (mip_MakeUniqueMembersOfList
	     (mapcar '(lambda(x)(trans x 0 1)) lst)
	     )
	     filter-list
	     )
	   (ssget
	   "_F"
	   (mip_MakeUniqueMembersOfList
	     (mapcar '(lambda(x)(trans x 0 1)) lst)
	     )
	   )
	   )
	)
  (sssetfirst nil ss)
  )
  ss
  )
(princ "\nНаберите SELPOLY или BSELPOLY в командной строке")
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 04.01.2016 в 17:03. Причина: Учтена ПСК
VVA вне форума  
 
Автор темы   Непрочитано 13.04.2012, 10:47
#7
Shaft

отдел открытых горных работ
 
Регистрация: 06.05.2009
Новокузнецк
Сообщений: 124


VVA, вот что выдало в командной строке

Код:
[Выделить все]
Команда: _appload SELPOLY.lsp успешно загружено.


Команда:
Наберите SELPOLY в командной строке
Команда:
Команда: SELPOLY

Выберите полилинию; ошибка: no function definition: MIP:ZZERO
На что конкретно ругается автокад непонятно. Может в коде нужно руками что-то заменить?
Shaft вне форума  
 
Непрочитано 13.04.2012, 11:05
#8
Nike

Шаражпроектхалтурмонтаж
 
Регистрация: 29.10.2004
Талды-Париж
Сообщений: 5,989


Команда: SELPOLY
Выберите полилинию; ошибка: no function definition: MIP:ZZERO
Nike вне форума  
 
Непрочитано 13.04.2012, 11:31
1 | #9
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Shaft, Nike, Обновил #6 пробуйте снова
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 13.04.2012, 11:46
#10
Shaft

отдел открытых горных работ
 
Регистрация: 06.05.2009
Новокузнецк
Сообщений: 124


Уважаемый VVA, ничего не происходит после выбора полилинии. Просто экран зумируется до тех пор, чтобы было видно всю полилинию целиком. А выбора объектов под линией не происходит.
Shaft вне форума  
 
Непрочитано 13.04.2012, 11:50
#11
Nike

Шаражпроектхалтурмонтаж
 
Регистрация: 29.10.2004
Талды-Париж
Сообщений: 5,989


Shaft, у меня все выбирается.
VVA, спасибо!
Nike вне форума  
 
Автор темы   Непрочитано 13.04.2012, 12:03
#12
Shaft

отдел открытых горных работ
 
Регистрация: 06.05.2009
Новокузнецк
Сообщений: 124


Цитата:
Сообщение от Nike Посмотреть сообщение
Shaft, у меня все выбирается.
VVA, спасибо!
Блин, а в чем тогда у меня может быть проблема? Пока не могу найти...

в новом чертеже все работает прекрасно!
а в рабочем не хочет?
Если решение найду, объязательно расскажу.

VVA, БЛАГОДАРЮ ВАС ЗА ПОМОЩЬ В ОЧЕРЕДНОЙ РАЗ!!!

UPD: Решение найдено!
Я повернул чертеж согласно МСК и тогда все сразу же разаботало!!!

Последний раз редактировалось Shaft, 13.04.2012 в 12:22.
Shaft вне форума  
 
Непрочитано 13.04.2012, 12:18
1 | #13
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Shaft,
Я немного изменил код #6. Попробуй снова. Если ничего не поменяется, то выложи файл с примером
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 13.04.2012, 12:36
#14
Danver

Генпланист
 
Регистрация: 02.04.2009
Жуковский
Сообщений: 415


VVA, Спасибо! Хороший лисп. Сохранил себе.
Danver вне форума  
 
Непрочитано 13.04.2012, 16:42
#15
Агент СмиТ

Gti
 
Регистрация: 14.01.2010
МО Железнодорожный
Сообщений: 121


Присоединяюсь к поблагодарившим, лисп полезный! Спасибо!
Агент СмиТ вне форума  
 
Непрочитано 14.04.2012, 18:02
#16
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от Shaft Посмотреть сообщение
Я повернул чертеж согласно МСК
Ну да, про ПСК то я совсем забыл . Внес изменения в #6
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 23.05.2012, 19:47
#17
beeliy


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


спасибо за лисп!
только у меня при работе иногда возникает проблемка такого же плана:

"ничего не происходит после выбора полилинии. Просто экран зумируется до тех пор, чтобы было видно всю полилинию целиком. А выбора объектов под линией не происходит". Не всегда, но бывает.
Файл выкладываю.
Вложения
Тип файла: dwg
DWG 2007
пример.dwg (84.4 Кб, 2755 просмотров)
beeliy вне форума  
 
Непрочитано 29.11.2012, 11:01
#18
pobat

инжинириг
 
Регистрация: 26.01.2012
Сообщений: 20


Shaft
Здравствуйте!
Скажите пожалуйста, а как можно модифицировать Ваш lsp что вдоль полилинии выделялись не все объекты, а только блоки
pobat вне форума  
 
Непрочитано 02.12.2012, 11:23
#19
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от pobat Посмотреть сообщение
как можно модифицировать Ваш lsp что вдоль полилинии выделялись не все объекты, а только блоки
См новый вариант в #6
>Shaft
Цитата:
Блин, а в чем тогда у меня может быть проблема? Пока не могу найти...
>beeliy
Цитата:
"ничего не происходит после выбора полилинии. Просто экран зумируется до тех пор, чтобы было видно всю полилинию целиком. А выбора объектов под линией не происходит". Не всегда, но бывает.
Это происходит из-за того, что в полилинии есть совпадающие вершины. Для функции ssget все точки должны быть уникальные. В частности в примере из #17 в длинной полилинии совпадают 2 и 3 вершина. В новой версии в #6 я учел этот момент
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 03.12.2012 в 09:24. Причина: орфография
VVA вне форума  
 
Непрочитано 04.12.2012, 20:58
#20
pobat

инжинириг
 
Регистрация: 26.01.2012
Сообщений: 20


VVA Сердечно благодарю!
pobat вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Как выделить объекты пересекаемые полилинией?

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как выделить все объекты одного слоя или быстро сделать н... Валера_ AutoCAD 42 02.08.2022 12:13
Как определить стоимость проектных работ, если не известна стоимость строительства? dextron3 Поиск литературы, чертежей, моделей и прочих материалов 37 27.08.2014 18:32
Как выделить объекты на слое Serjik7 AutoCAD 34 16.07.2012 11:37
как выделить определённые объекты vba dickens Программирование 12 15.12.2011 15:54
Как программно выделить (подсветить) объекты на текущи чертеже? Michigan Программирование 2 26.05.2009 22:09