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

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

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

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

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

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

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

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

Последний раз редактировалось Shaft, 13.04.2012 в 07:24.
Просмотров: 19627
 
Непрочитано 31.05.2015, 20:33
#21
sosococo

Генланист
 
Регистрация: 31.05.2015
г.Тюмень
Сообщений: 8


Хороший лисп, но есть некоторые предложения:
- возможность использования для множества полилиний,
- возможность использования лиспа для предварительно выбранных полилиний, или определение полилиний по слою
sosococo вне форума  
 
Непрочитано 04.01.2016, 00:26
#22
AlexZh


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


Скажите, а как можно получить список блоков на полилинии. Разобраться знаний не хватает.
AlexZh вне форума  
 
Непрочитано 04.01.2016, 17:05
1 | #23
VVA

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


Цитата:
Сообщение от AlexZh Посмотреть сообщение
Скажите, а как можно получить список блоков на полилинии. Разобраться знаний не хватает.
Код:
[Выделить все]
(defun C:BSELPOLYLIST (/ ss)
  (if (setq ss (selpoly (list (cons 0 "INSERT"))))
      (mip_MakeUniqueMembersOfList
        (mapcar 'block-get-name
                (mapcar 'vlax-ename->vla-object
                        (vl-remove-if
                          (function listp)
                          (mapcar (function cadr) (ssnamex ss))
                        ) ;_ end of vl-remove-if
                ) ;_ end of mapcar
        ) ;_ end of mapcar
      ) ;_ end of mip_MakeUniqueMembersOfList
  ) ;_ end of if
) ;_ end of defun
Недостающие функции смотри в #6
PS список блоков=список имен блоков
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 05.01.2016, 18:21
#24
AlexZh


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


Спасибо!!!
AlexZh вне форума  
 
Непрочитано 11.01.2016, 14:45
#25
AlexZh


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


А еще подскажите пожалуйста.

Я в своей программе выделяю по полилинии блоки, они подсвечиваются, но и выбираются лишние. Как в программе можно осуществить снятие выбора/добавление объектов?
AlexZh вне форума  
 
Непрочитано 12.01.2016, 03:21
1 | #26
АлексЮстасу

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


До кучи.
Не знаю с какого времени, но в Express есть для выбора пересекающих объектов команда FS.
Мы, не зная еще про нее, написали свои - PSI_SEL_INTERSECT и PSI_SEL_ON_LINE среди прочего. Наши команды отличаются тем, что можно находить нужное относительно сразу множества полилиний-линий-сплайнов-окружностей-дуг.
Цитата:
Сообщение от AlexZh Посмотреть сообщение
Я в своей программе выделяю по полилинии блоки, они подсвечиваются, но и выбираются лишние. Как в программе можно осуществить снятие выбора/добавление объектов?
В "своей" - это в какой? Какой критерий лишние/не лишние?
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 12.01.2016, 09:20
#27
AlexZh


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


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
В "своей" - это в какой? Какой критерий лишние/не лишние?
ну как, в своей?) куча программ, объединенных в одну. проектирую пожарную сигнализацию.


в одном моменте выбирается шлейф, по которому выбираются извещатели-блоки. но при этом могут захватится и блоки соседние. вот хотелось бы, чтобы пользователю после выбора шлейфа предоставлялась возможность с помощью SHIFR снятия выделения с "лишних" блоков и добор недостающих.
AlexZh вне форума  
 
Непрочитано 12.01.2016, 10:32
#28
Nike

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


Цитата:
Сообщение от AlexZh Посмотреть сообщение
в одном моменте выбирается шлейф, по которому выбираются извещатели-блоки. но при этом могут захватится и блоки соседние.
Какие соседние? Соседние блоки, не являющиеся извещателями?
Так размещай блоки разного назначения в своих слоях и выбирай с фильтром по слою.
Покажи пример чертежа.
Nike вне форума  
 
Непрочитано 12.01.2016, 10:43
#29
AlexZh


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


чертеж слишком большой.

есть контроллер на 20 шлейфов.
Мне в данный момент нужен 10 шлейф и извещатели на нем
Я выделяю шлейф №10, выделяются и подсвечиваются извещатели на выбранном шлейфе. Программно подсчитывается их кол-во и собираются данные из их атрибутов и т.д.

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

Нужно после выделения шлейфа иметь возможность добавлять/исключать объекты из созданного набора.
AlexZh вне форума  
 
Непрочитано 12.01.2016, 16:57
#30
АлексЮстасу

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


Цитата:
Сообщение от AlexZh Посмотреть сообщение
вот хотелось бы, чтобы пользователю после выбора шлейфа предоставлялась возможность с помощью SHIFR снятия выделения с "лишних" блоков и добор недостающих.
Точно с Shift не действует?
У меня, правда, тоже с Shift не всегда действует.
Я не разбирался с этим, но, возможно, в моем случае мешают растры, даже выключенные. Т.е. в файле, где подгружены растры, на указание элемента с Shift мне пишут
Цитата:
Найдено изображений: 1
, и ничего не происходит. С теми же данными, но без растров выделение снимается/добавляется.

Да, сейчас проверил - после полной выгрузки растров Shift начинает действовать для блоков и т.п. Наверное, есть какая-то настройка?
__________________
количество моих сообщений не говорит о знании Автокада

Последний раз редактировалось АлексЮстасу, 12.01.2016 в 18:25.
АлексЮстасу вне форума  
 
Непрочитано 17.01.2016, 18:26
#31
VVA

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


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
У меня, правда, тоже с Shift не всегда действует.
Я не разбирался с этим, но, возможно, в моем случае мешают растры, даже выключенные. Т.е. в файле, где подгружены растры, на указание элемента с Shift мне пишут
Цитата:
Найдено изображений: 1
Это не Автокад, это Raster Design. Shitf+указание точки внутри растра - выбирают его
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 17.01.2016, 18:46
#32
АлексЮстасу

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


Цитата:
Сообщение от VVA Посмотреть сообщение
Это не Автокад, это Raster Design. Shitf+указание точки внутри растра - выбирают его
Но у меня нет Raster Design...
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 17.01.2016, 18:53
#33
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Но у меня нет Raster Design...
По-моему, у тебя то ли Civil, то ли Map3D
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 17.01.2016, 19:14
#34
АлексЮстасу

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


Civil/Map3D без Raster Design. (Ща узрею еще одну дыру в своем образовании )
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 17.01.2016, 21:50
1 | #35
Кулик Алексей aka kpblc
Moderator

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


Если я не ошибаюсь, Civil / Map3D в себе содержат массу вещей, в том числе и для работы с растрами (в частности, использование файлов привязки растров, которые в чистом AutoCAD напрочь игнорируются). Возможно, у тебя такое поведение обусловлено именно "вертикалкой".
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 18.01.2016, 03:50
#36
АлексЮстасу

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


Да, в Map3D есть вставка растров с учетом параметров привязки. Очень полезная. И штуки 4-5 других возможностей "ни о чем" (с моей точки зрения). Ничего похожего на нормальную специальную работу с растрами не наблюдается. Даже нет элементарного "сохранить как" растр.
Растры же мы всегда выделяли как все - указанием их границ.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 18.01.2016, 17:39
1 | #37
VVA

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


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Растры же мы всегда выделяли как все - указанием их границ
Может Автодеск позаимствовал для растров из RD в Civil/Map?
В RD есть такие настройкаи
Миниатюры
Нажмите на изображение для увеличения
Название: RD.png
Просмотров: 57
Размер:	52.9 Кб
ID:	163869  
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 18.01.2016, 21:19
#38
АлексЮстасу

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


Цитата:
Сообщение от VVA Посмотреть сообщение
Может Автодеск позаимствовал для растров из RD в Civil/Map?
А ведь точно! Есть такая настройка в мап-овском Параметры растрового модуля!
(Вот! С Вашей помощью про это окно и настройки узнал )
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 18.01.2016, 22:02
1 | #39
sertor

Геодезист
 
Регистрация: 23.05.2012
Ухта
Сообщений: 1,374


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
А ведь точно! Есть такая настройка в мап-овском Параметры растрового модуля!
Да, в Civil/Map 3D есть такая опция. Особенно она полезна для выделения растра (при включенной указанной выше галке) и когда граница изображения отключена (IMAGEFRAME ->0)
Миниатюры
Нажмите на изображение для увеличения
Название: Image 1.png
Просмотров: 47
Размер:	7.2 Кб
ID:	163874  
__________________
Как-то так.
sertor вне форума  
 
Непрочитано 04.12.2017, 08:11
#40
AlexZh


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


Цитата:
Сообщение от VVA Посмотреть сообщение
Тестируй
Добавлено *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 в командной строке")
Подскажите, а что надо добавить, чтоб не выбирались блоки, у которых линия пересекает ТОЛЬКО атрибут.
__________________
Проекты СС
AlexZh вне форума  
Ответ
Вернуться   Форум 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