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

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

Автоматический выбор объектов в последовательном порядке.

Ответ
Поиск в этой теме
Непрочитано 20.03.2010, 10:24 #1
Автоматический выбор объектов в последовательном порядке.
Terminator637
 
Регистрация: 20.03.2010
Сообщений: 11

Здравствуйте! Возникла следующая проблема:
Необходимо импортировать из акада в стороннюю программу объекты в определенном порядке, то есть сначала необходимо выбрать объекты в определенном порядке, чтобы они были подсвечены ручками, программа определяет что объекты выбраны в акаде и импортирует их в том порядке в каком они были выбраны, причем порядок очень важен. Дело в том что приходится вручную по порядку выбирать очень много объектов, а если выбирать их сразу рамкой, то они выбираются в хаотичном порядке порядке их создания в чертеже. Можно ли сделать, чтобы выбор был по рамке например слева направо, сверху вниз и тп или как то еще, а то выбирать по 100-1000 объектов каждый раз по одному вручную как то очень не по АВТОкадовски, автоматизация должна быть. Заранее спасибо!

Последний раз редактировалось Terminator637, 21.03.2010 в 23:34.
Просмотров: 5266
 
Непрочитано 22.03.2010, 15:07
#2
kp+

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


Приложи фрагмент чертежа, и поясни подробнее, как "необходимо выбрать объекты в определенном порядке"? Вдоль линии, по рядам или как?
kp+ вне форума  
 
Автор темы   Непрочитано 22.03.2010, 17:49
#3
Terminator637


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


В чертеже площадные объекты, рядом с ними номера. Их нужно выбирать в таком порядке в каком они пронумерованы, без разницы, справа налево или слева направо, главное чтобы по цепочке шел выбор как в примере. Чтобы совершить импорт в стороннюю программу нужно чтобы объекты были выделены в правильном порядке в самом автокаде, после того как они выбраны не закрывая автокад перехожу в сторонню программу и там делаю импорт, то есть программа соображает что в автокаде выделены в данный момент площадные объекты и импорт происходит в таком порядке в каком я их выбрал, этот порядок очень важен для дальнейшей обработки в этой сторонней программе. Приходится каждый раз их так вручную выбирать по одному друг за другом, что очень долго, возможно было бы просто проводить направление выбора каким то образом или что то тому подобное.
Заранее спасибо!
Вложения
Тип файла: dwg
DWG 2004
Чертеж1.dwg (35.4 Кб, 1032 просмотров)
Terminator637 вне форума  
 
Непрочитано 22.03.2010, 18:28
#4
Profan


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


Цитата:
не закрывая автокад перехожу в сторонню программу и там делаю импорт, то есть программа соображает что в автокаде выделены в данный момент площадные объекты и импорт происходит в таком порядке в каком я их выбрал
Есть такая программа, которая работает без буфера обмена?
Profan вне форума  
 
Автор темы   Непрочитано 22.03.2010, 18:37
#5
Terminator637


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


Получается что есть Даже копировать не надо просто выбрать объекты и всё.
Terminator637 вне форума  
 
Непрочитано 22.03.2010, 19:12
#6
kp+

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


Решил было попробовать написать код, но осекся:
1) в некоторых местах нумерация сбивается с ритма "сверху-вниз-слева-направо". Это наводит на мысль, что все опоры должны быть соединены линией (а иначе зачем они нужны? ), и нумеруются именно в порядке следования по ней. Будет ли на чертеже эта линия (лучше всего, представленная полилинией)? Если нет, то прога не имеет смысла, т. к. никто кроме тебя не может знать порядок следования в узловых точках и ответвлениях.
2) нумерация поставлена только для примера или действительно присутствует в чертеже? Является ли она результатом работы таинственной проги, или проставляется до ее запуска? В принципе, она может быть проставлена по результатам выполнения п. 1.
3) могут ли опоры быть представлены блоками с атрибутами, отображающими нумерацию, а не просто полилиниями с отдельно стоящим текстом? Это упростило бы задачу по п. 2.
kp+ вне форума  
 
Автор темы   Непрочитано 22.03.2010, 19:41
#7
Terminator637


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


1) в принципе они должны быть соединены линией, но не обязательно, просто последовательность должна быть примерно друг за другом, а опоры это я сам пронумеровал для примера чтобы было примерно понятно в каком порядке они должны выбираться. И для меня не важно с какой стороны начинать выбор главное чтобы он примерно шел от одного конца линии к другому. В примере она начинается с левого конца, на самом деле если мне захочется я могу выбирать с правого конца и не придерживаться строгой последовательности при этом, главное чтобы следующая выбранная опора была рядом с предыдущей ну и если идет ответвление то нумерация пойдет до конца ответвления а потом продолжится снова по главной линии.
2) Нумерация проставлена для примера
3) Опоры не рекомендуется представлять в виде блоков с атрибутами, так как блоки не импортируются в программу.

Последний раз редактировалось Terminator637, 22.03.2010 в 19:56.
Terminator637 вне форума  
 
Непрочитано 25.03.2010, 12:21
1 | #8
kp+

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


Лови код. сырой и примитивный. Сортировка (для начала) справа налево.
Ответвления обрабатываются некорректно.

Код:
[Выделить все]
(defun c:kp_ts (
	      /
	      CENTER MAXP MINP SS TS TS_COORD_LIST VL-TS i
	      )
	(setq ss (ssget  '((0 . "*OLYLINE") (70 . 1) (8 . "опоры гос гладышев"))     ))
	(setq ts (ssnamex ss));преобразование набора в список
	(setq ts (mapcar 'cadr ts));выкидывание номеров набора из списка
	(setq ts (vl-remove-if-not '(lambda (x) (eq (type x) 'ENAME)) ts))
	(setq ss nil)

  	(setq vl-ts (mapcar 'vlax-ename->vla-object ts))
  	(setq ts_coord_list nil)

  	(foreach x vl-ts
	      (vla-getboundingbox x 'minp 'maxp);область вокруг атрибута
	      (setq minp (vlax-safearray->list minp))
	      (setq maxp (vlax-safearray->list maxp))
	      (setq center (list
			     (* 0.5 (+ (nth 0 minp) (nth 0 maxp)))
			     (* 0.5 (+ (nth 1 minp) (nth 1 maxp)))
			     ;(* 0.5 (+ (nth 2 minp) (nth 2 maxp)))
			   )
	      )
	      (setq ts_coord_list (append ts_coord_list (list (list
							  ;(cons"vl" x)
							  (cons "ent" (vlax-vla-object->ename x))
							  (cons "center" center)
							))
				  )
	      )
	 )
  	 (setq ts_coord_list (vl-sort ts_coord_list
				      (function (lambda (e1 e2)
						  (> (cadr (assoc "center" e1)) (cadr (assoc "center" e2)))
						)
				      )
			     )
	 )

  	 (setq i 0)
  	 (setq ss (ssadd))
  	 (while (< i (- (length ts_coord_list) 1))

	   (vl-cmdf "_line"
		    (cdr (assoc "center" (nth i ts_coord_list)))
		    (cdr (assoc "center" (nth (1+ i) ts_coord_list)))
		    ""
	   )
	   (setq i (1+ i))
	 )
  	 (foreach x ts_coord_list
	   (setq ss (ssadd (cdr (assoc "ent" x)) ss))
	 )
         (sssetfirst ss ss)
  )
Выделенное синим можно закомментировать (рисует линию для иллюстрации). Посмотри, оцени, тогда поговорим дальше
Вложения
Тип файла: dwg
DWG 2004
Чертеж001.dwg (56.9 Кб, 1010 просмотров)

Последний раз редактировалось kp+, 25.03.2010 в 14:29.
kp+ вне форума  
 
Автор темы   Непрочитано 25.03.2010, 12:43
#9
Terminator637


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


Спасибо огромнейшее! Протестировал Ваш код. В программу всё импортируется в таком порядке в каком показано линиями, выбор происходит с подсвечиванием ручками как и требовалось, просто насколько я знаю у автокада есть еще другой режим выбора когда ручками не подсвечивается ничего, а просто контур выделяется пунктиром, независимо от количества выбранных объектов, а программа не видит выделенных объектов если они не подсвечены именно ручками. Если линия из объектов горизонтально протянута, то в принципе можно пользоваться и этим кодом. А если вертикально или смешанно, то конечно уже не то получается. Вообще если бы при выборе последующего сегмента линии предлагалось выбирать направление выбора, то любую линию можно было бы просто выбирать по сегментам, потому что полностью автоматически это наверно слишком сложно будет реализовать. Ну а насчет ответвлений да, действительно некорректность наблюдается, что связано с фиксированным порядком выбора, ну вы это и сами знаете

Последний раз редактировалось Terminator637, 25.03.2010 в 13:41.
Terminator637 вне форума  
 
Непрочитано 25.03.2010, 14:40
#10
kp+

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


Чтобы сортировать по вертикали, надо помеченное красным заменить на
Код:
[Выделить все]
(> (caddr (assoc "center" e1)) (caddr (assoc "center" e2)))
Кстати, направление сортировки задается знаком ">" или "<" в этой же строке.

Выбор по сегментам можно добавить. Будет время - сделаю.
Более серьезную автоматизацию - тоже можно, но, понятно, далеко не сразу.

Последний раз редактировалось kp+, 25.03.2010 в 14:45.
kp+ вне форума  
 
Автор темы   Непрочитано 25.03.2010, 14:57
#11
Terminator637


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


Спасибо вам огромное! Попробую сделать 4 кнопки с разными вариантами направления выбора и поэкспериментировать. Буду ждать вариант с выбором по сегментам. Спасибо Вам большущее еще раз!
Terminator637 вне форума  
 
Непрочитано 30.03.2010, 13:04
#12
kp+

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


Лови новый код, который осуществляет выбор по сегментам:
Код:
[Выделить все]
(defun kp_ts_sort (ts_coord_list dir /
		   compare_f
		   take_f
		   )
  		   (cond
		     ( (= dir 1)
		      		(vl-sort ts_coord_list
				      (function (lambda (e1 e2)
						  (> (cadr (assoc "center" e1)) (cadr (assoc "center" e2)))
						)
				      )
			        )
		     )
		     ( (= dir 2)
		      		(vl-sort ts_coord_list
				      (function (lambda (e1 e2)
						  (< (cadr (assoc "center" e1)) (cadr (assoc "center" e2)))
						)
				      )
			        )
		     )
		     ( (= dir 3)
		      		(vl-sort ts_coord_list
				      (function (lambda (e1 e2)
						  (> (caddr (assoc "center" e1)) (caddr (assoc "center" e2)))
						)
				      )
			        )
		     )
		     ( (= dir 4)
		      		(vl-sort ts_coord_list
				      (function (lambda (e1 e2)
						  (< (caddr (assoc "center" e1)) (caddr (assoc "center" e2)))
						)
				      )
			        )
		     )
		     ;(t nil)
  		   );eo cond
  
);eo defun

(defun ts->ts_coord (ts to_sort_flag dir / CENTER MAXP MINP TS_COORD_LIST VL-TS)
	(setq vl-ts (mapcar 'vlax-ename->vla-object ts))
	(setq ts_coord_list nil)

	(foreach x vl-ts
	      (vla-getboundingbox x 'minp 'maxp);область вокруг атрибута
	      (setq minp (vlax-safearray->list minp))
	      (setq maxp (vlax-safearray->list maxp))
	      (setq center (list
			     (* 0.5 (+ (nth 0 minp) (nth 0 maxp)))
			     (* 0.5 (+ (nth 1 minp) (nth 1 maxp)))
			     ;(* 0.5 (+ (nth 2 minp) (nth 2 maxp)))
			   )
	      )
	      (setq ts_coord_list (append ts_coord_list (list (list
							  ;(cons"vl" x)
							  (cons "ent" (vlax-vla-object->ename x))
							  (cons "center" center)
							))
				  )
	      )
	 )
	 (if to_sort_flag;потребность сортировки
  	   (setq ts_coord_list (kp_ts_sort  ts_coord_list dir))
	 )
  	 ts_coord_list
);eo defun ts->ts_coord


(defun c:kp_ts (
	      /
	      CENTER MAXP MINP SS TS TS_COORD_LIST VL-TS i add_flag ssi TSI TSI_COORD_LIST dir LINES SS_LINES scuco
	      )

	(setq ssi (ssget "_I" '((0 . "*OLYLINE") (70 . 1) (8 . "опоры гос гладышев"))     ))
	(setq add_flag "y");если изначального выбора нет, надо выбрать по новой
  	(if ssi
	  (progn
	    (initget 1 "y f n")
	    (setq add_flag (getkword "вообще-то, уже кое-что выбрано. добавить исчо(y)/фтопку, по-новой(f)/этого хватит(n)?\n"))
	  )
	);eo if
  	(if (= add_flag "f")
	 (progn
	  (setq ssi nil)
	  (sssetfirst nil nil)
	 )
	)

  	(if (/= add_flag "n")
	  (progn
		(sssetfirst ssi nil)
	        (setq ss (ssget  '((0 . "*OLYLINE") (70 . 1) (8 . "опоры гос гладышев"))     ))
		(setq ts (ssnamex ss));преобразование набора в список
		(setq ts (mapcar 'cadr ts));выкидывание номеров набора из списка
		(setq ts (vl-remove-if-not '(lambda (x) (eq (type x) 'ENAME)) ts))
		(setq ss nil)

	        (initget 1 "1 2 3 4")
	        (setq dir (getkword "укажите, как сортировать опоры: 1-<-/2->-/3_/4^\n"))
	        (setq dir (atoi dir))

	  	(setq ts_coord_list (ts->ts_coord ts t dir))
	  );eo progn
	 );eo if

         (if ssi;если изначальный набор есть и нужен
           (progn
	      	(setq tsi (ssnamex ssi));преобразование набора в список
		(setq tsi (mapcar 'cadr tsi));выкидывание номеров набора из списка
		(setq tsi (vl-remove-if-not '(lambda (x) (eq (type x) 'ENAME)) tsi))
		(setq tsi_coord_list (ts->ts_coord tsi nil nil));изначальный набор не сортировать
	  		     
	   )
	 );eo if

  	 

  	 ;хоть какой-то набор должен быть. если никакого нет, то нафиг всё нужно?
	 (if ts_coord_list
  	   (setq ts_coord_list (append tsi_coord_list ts_coord_list))
	   ;else
	   (setq ts_coord_list tsi_coord_list)
	 )

         ;(vl-remove-if '(lambda (x) (member x (member x ts_coord_list) ) ) ts_coord_list)
  	 ;(setq ts_coord_list (reverse ts_coord_list))

  	 (setq scuco (list(car ts_coord_list)))
;;;  	 (foreach x ts_coord_list
;;;	   (if (member x (cdr (member x ts_coord_list))) (setq ts_coord_list (vl-remove x ts_coord_list)))
;;;	 )

  	 (foreach x ts_coord_list
	   (setq ts_coord_list (vl-remove x ts_coord_list) )
	   (if ts_coord_list (setq scuco (append scuco (list (car ts_coord_list)))))

	 )
	 (setq ts_coord_list scuco)

  	 ;(setq ts_coord_list (reverse ts_coord_list))

	 
	  

  	 (setq i 0)
  	 (setq ss (ssadd))

	 (vl-cmdf "_-layer" "_m" "l" "")
	 (vl-cmdf "_zoom" "_all")
  	 (setq ss_lines (ssget "_X" '((0 . "LINE") (8 . "l") ) ))
       	 (if ss_lines (progn
	 (setq lines (ssnamex ss_lines));преобразование набора в список
	 (setq lines (mapcar 'cadr lines));выкидывание номеров набора из списка
	 (setq lines (vl-remove-if-not '(lambda (x) (eq (type x) 'ENAME)) lines))
  	 (setq ss_lines nil)
         (foreach x lines (entdel x)) ))
  	 (vl-cmdf "_zoom" "_p")
  	 
  	 

  	 (while (< i (- (length ts_coord_list) 1))

	   (vl-cmdf "_line"
		    (cdr (assoc "center" (nth i ts_coord_list)))
		    (cdr (assoc "center" (nth (1+ i) ts_coord_list)))
		    ""
	   )
	   (setq i (1+ i))
	 )
  	 (foreach x ts_coord_list
	   (setq ss (ssadd (cdr (assoc "ent" x)) ss))
	 )
         (sssetfirst ss ss)

  
	   
  )
Вызов прежний - kp_ts
линия рисуется на новом слое "L"
Кстати, а что за таинственная прога, ради которой все написано
kp+ вне форума  
 
Автор темы   Непрочитано 30.03.2010, 17:33
#13
Terminator637


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


Спасибо большое, в очередной раз, будем тестить
Terminator637 вне форума  
 
Непрочитано 31.03.2010, 11:54
#14
kp+

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


ну как, работает?
kp+ вне форума  
 
Автор темы   Непрочитано 31.03.2010, 17:36
#15
Terminator637


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


Да всё работает! Спасибо огромное!Всё как заявлено было
Terminator637 вне форума  
 
Непрочитано 31.03.2010, 19:54
#16
kp+

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


Рад, что все получилось. Как говорится, "ты, если что, заходи"
kp+ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Автоматический выбор объектов в последовательном порядке.

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
FILTER / фильтр BM60 Справочник команд 0 08.07.2008 15:35
Выбор объектов с учетом XData (VBA) e_v_a Программирование 2 23.08.2007 13:32
Выбор объектов в VBA Бродяга Программирование 19 12.03.2007 09:33
Выбор объектов подобных данному DEM AutoCAD 7 05.06.2005 13:40