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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Подскажите варианты для автоматизации оформления чертежа.

Подскажите варианты для автоматизации оформления чертежа.

Ответ
Поиск в этой теме
Непрочитано 16.12.2010, 12:27 #1
Подскажите варианты для автоматизации оформления чертежа.
Pontelimon
 
Регистрация: 16.11.2010
Сообщений: 89

Добрый день!

Есть вот такой вот чертеж (см прилагаемый файл). По сути автоматизировать я хочу только преобразование трубопровода и колодцев (состоящих из отрезков) в полилинии с глобальной шириной 0,5.
Может быть кто-то уже имеет успешный опыт решения подобных проблем ?
Сразу оговорюсь, проблема НЕ в конвертации из линии в полилинию, проблема в том, что нужно каждый раз выбирать все эти отрезки для конвертации вручную.
И еще, если это как-то может помочь делу, нижний правый угол чертежа всегда находиться по этим координатам (как в чертеже под заголовком *До*)

X = -130.0000 Y = -135.0000 Z = 0.0000

Всем спасибо за внимание.

Последний раз редактировалось Pontelimon, 22.12.2010 в 13:56.
Просмотров: 4452
 
Непрочитано 16.12.2010, 15:12
#2
VVA

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


SelSim тебе в помощь

__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 16.12.2010, 17:14
#3
Pontelimon


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


Цитата:
Сообщение от VVA Посмотреть сообщение
SelSim тебе в помощь

Спасибо за совет, но SelSim у меня уже есть и он не может выбрать колодцы(выбрать конечно он их может но в месте с ними выберет еще кучу не нужных отрезков), только трубопровод, который и так находиться на отдельном слое и выбрать его отдельно не представляется особо проблематичным.
Может быть есть что-то в этом же духе, но получше подходящее к моему, частному случаю ?
Pontelimon вне форума  
 
Непрочитано 16.12.2010, 20:22
#4
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Цитата:
Сообщение от Pontelimon Посмотреть сообщение
Спасибо за совет, но SelSim у меня уже есть и он не может выбрать колодцы(выбрать конечно он их может но в месте с ними выберет еще кучу не нужных отрезков), только трубопровод, который и так находиться на отдельном слое и выбрать его отдельно не представляется особо проблематичным.
Может быть есть что-то в этом же духе, но получше подходящее к моему, частному случаю ?
мнен каатца здесь ничего не сделать, только выбирать
все по-одному объекту и потом менять свойства
ИМО
Олег (jr.) вне форума  
 
Непрочитано 16.12.2010, 21:44
#5
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от Pontelimon Посмотреть сообщение
проблема в том, что нужно каждый раз выбирать все эти отрезки для конвертации вручную
Если эти отрезки имеют какие-то уникальные, только им присущие свойства - то это легко реализуемо.
Do$ вне форума  
 
Автор темы   Непрочитано 17.12.2010, 09:54
#6
Pontelimon


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


Цитата:
Сообщение от Do$ Посмотреть сообщение
Если эти отрезки имеют какие-то уникальные, только им присущие свойства - то это легко реализуемо.
К сожалению ничего уникального я в них пока не увидел =(

Но 1 идея у меня появилась, правда я не знаю можно ли ее реализовать... быть может, если это реально и не нужно писать какой-то очень заумный код, я бы, не без помощи кончено, осилил это, в общем суть такая:

1. Выбор всех объектов в слоях: TR_UP и TR_DN.
2. Выбор всех параллельных, вертикальных отрезков(X начала и X конца 1 отрезка равны), (они могут иметь разную длину по Y), находящиеся на расстоянии(по X) между собой 4 ед. Начало и конец их должен быть X>0 Y>0 Z=0, находятся в 0-ом слое.
3. Выбор всех горизонтальных отрезков начало или конец которых совпадают с началом или концом отрезков из пункта 2 и их длина по X не превышает 4 ед и находиться в 0-ом слое.
4. Преобразование их всех в полилинию с глобальной шириной 0.5 (хотя это я с помощью других скриптов могу сделать).

Это не сложно сделать ?
Pontelimon вне форума  
 
Непрочитано 17.12.2010, 10:43
#7
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Пункт 1 прост до безобразия, оставим это для самостоятельного "осиливания"
Фильтр по пунктам 2 и 3 посложнее, тут надо подумать.
Do$ вне форума  
 
Автор темы   Непрочитано 17.12.2010, 11:51
#8
Pontelimon


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


Я эту строчку минут 40 писал :
Код:
[Выделить все]
(setq selset (ssget "_:L" '((0 . "LINE")(-4 . "<OR")(8 . "TR_UP")(8 . "TR_DN")(-4 . "OR>"))))
Правильно ?
Pontelimon вне форума  
 
Непрочитано 17.12.2010, 11:54
1 | #9
Лиспер


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


Код:
[Выделить все]
(setq selset (ssget "_:L" '((0 . "LINE") (8 . "TR_UP,TR_DN"))))
Написано без проверок.
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 17.12.2010, 12:11
1 | #10
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от Pontelimon Посмотреть сообщение
Правильно ?
Фильтр правильно, но можно проще - как Лиспер показал.
А вот метод "_:L" нам не подходит, мы ж хотим автоматическое формирование набора.
Do$ вне форума  
 
Автор темы   Непрочитано 17.12.2010, 12:38
#11
Pontelimon


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


Цитата:
Сообщение от Do$ Посмотреть сообщение
Фильтр правильно, но можно проще - как Лиспер показал.
А вот метод "_:L" нам не подходит, мы ж хотим автоматическое формирование набора.
Ммм... согласен, так действительно проще ! =) Спасибо Лиспер!
насчет метода, не хочется тыкать наугад, я пока не очень понимаю их действий, но могу предположить что "_X" ?
В принципе 1 пунктом все более менее понятно, дальше все намного интересней =) я так понимаю что группы кодов 10, 20 и 30 это начальные точки отрезков ? не совсем понятно какими кодами тогда указывают конечные ? 11,21,31 ? Соответственно указать через оператора что чему должно быть равно то я получу горизонтальные и вертикальные отрезки через фильтр, но как сделать условие на расстояние между ними ...
Pontelimon вне форума  
 
Непрочитано 17.12.2010, 13:03
1 | #12
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


По пункту 2 этого достаточно:
Цитата:
Сообщение от Pontelimon Посмотреть сообщение
Выбор всех параллельных, вертикальных отрезков(X начала и X конца 1 отрезка равны), (они могут иметь разную длину по Y), находящиеся на расстоянии(по X) между собой 4 ед.
Цитата:
Сообщение от Pontelimon Посмотреть сообщение
находятся в 0-ом слое
Накидал функцию:
Код:
[Выделить все]
(defun _dwgru-conv-pickset-to-list (value / tab item)
  (repeat (setq	tab  nil
		item (sslength value)
	  ) ;_ end setq
    (setq tab (cons (ssname value (setq item (1- item))) tab))
  ) ;_ end repeat
) ;_ end defun

(defun get-vert-parallel-line-with-spacing (sp lrs / ss lst)
;;;(get-vert-parallel-line-with-spacing 4.0 "0")
;;;(get-vert-parallel-line-with-spacing 4.0 "0,TR_DN")
;;;(get-vert-parallel-line-with-spacing 4.0 "TR_UP,TR_DN")
  (if (and (numberp sp) (= (type lrs) 'str))
    (progn
      (setq ss (ssget "_X"
		      (list (cons 0 "LINE")
			    (cons 8
				  (if lrs
				    lrs
				    "*"
				  ) ;_ end of if
			    ) ;_ end of cons
		      ) ;_ end of list
	       ) ;_ end of ssget
      ) ;_ end of setq
      (if
	ss
	 (progn
	   (setq lst
		  (vl-remove-if-not
		    '(lambda (ent)
		       (= (cadr (assoc 10 (entget ent)))
			  (cadr (assoc 11 (entget ent)))
		       ) ;_ end of =
		     ) ;_ end of lambda
		    (_dwgru-conv-pickset-to-list ss)
		  ) ;_ end of vl-remove-if-not
	   ) ;_ end of setq
	   (if lst
	     (progn
	       (setq lst
		      (mapcar
			'(lambda (a) (cons (cadr (assoc 10 (entget a))) a))
			lst
		      ) ;_ end of mapcar
	       ) ;_ end of setq
	       (mapcar
		 'cdr
		 (vl-remove-if-not
		   '(lambda (a)
		      (vl-member-if
			'(lambda (b / c)
			   (setq c (- (car a) (car b)))
			   (or (equal c sp 1e-8) (equal c (- sp) 1e-8))
			 ) ;_ end of lambda
			lst
		      ) ;_ end of vl-member-if
		    ) ;_ end of lambda
		   lst
		 ) ;_ end of vl-remove-if-not
	       ) ;_ end of mapcar
	     ) ;_ end of progn
	     (prompt
	       (strcat
		 "\nВ чертеже нет вертикальных отрезков на слое(ях): "
		 lrs
	       ) ;_ end of strcat
	     ) ;_ end of princ
	   ) ;_ end of if
	 ) ;_ end of progn
	 (prompt
	   (strcat "\nВ чертеже нет отрезков на слое(ях): " lrs)
	 ) ;_ end of prompt
      ) ;_ end of if
    ) ;_ end of progn
    (prompt
      "\nНеправильный тип аргументов функции GET-VERT-PARALLEL-LINE-WITH-SPACING!"
    ) ;_ end of princ
  ) ;_ end of if
) ;_ end of defun
Do$ вне форума  
 
Непрочитано 17.12.2010, 13:40
1 | #13
Лиспер


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


Pontelimon, ключ "_X" выделяет объекты в пространствах модели и листов (если они там есть); ключ "_A" (которым, правда, я почти не пользуюсь) - по-моему, только для активного пространства; ключ "_:L" запрашивает у пользователя "какие объекты будем обрабатывать" и при этом исключает объекты на заблокированных слоях.
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 17.12.2010, 14:41
#14
Pontelimon


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


Do$, Спасибо Вам за функцию! Я правильно понимаю это еще только часть того скрипта, который должен выделять трубы и колодцы ? И пока что, он не работает ?

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

Лиспер, Спасибо за мини-экскурс =), теперь отличия мне понятны. Правда в справке я насчитал их порядка 15 шт, я так полагаю Вы перечислил самые ходовые ?
Pontelimon вне форума  
 
Непрочитано 17.12.2010, 15:03
#15
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от Pontelimon Посмотреть сообщение
Я правильно понимаю это еще только часть того скрипта, который должен выделять трубы и колодцы ?
Зачем выделять? Сразу преобразовывать в нужные полилинии. Был обед, было время, было интересно - часть задачки сделал. Выложил на случай, если кто-то захочет подключиться и доделать п.3 и п.4, а то у меня пока времени свободного нет.
Do$ вне форума  
 
Непрочитано 20.12.2010, 17:20
1 | #16
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Запускать командой select_lines.
Код:
[Выделить все]
(defun _dwgru-conv-pickset-to-list (value / tab item)
  (repeat (setq	tab  nil
		item (sslength value)
	  ) ;_ end setq
    (setq tab (cons (ssname value (setq item (1- item))) tab))
  ) ;_ end repeat
) ;_ end defun

(defun get-vert-parallel-line-with-spacing (sp lrs / ss lst)
;;;(get-vert-parallel-line-with-spacing 4.0 "0")
;;;(get-vert-parallel-line-with-spacing 4.0 "0,TR_DN")
;;;(get-vert-parallel-line-with-spacing 4.0 "TR_UP,TR_DN")
  (if (and (numberp sp)
	   (or (= (type lrs) 'str) (not lrs))
	   (setq ss (ssget "_X"
			   (list (cons 0 "LINE")
				 (cons 8
				       (if lrs
					 lrs
					 "*"
				       ) ;_ end of if
				 ) ;_ end of cons
			   ) ;_ end of list
		    ) ;_ end of ssget
	   ) ;_ end of setq
	   (setq lst
		  (vl-remove-if-not
		    '(lambda (ent)
		       (= (cadr (assoc 10 (entget ent)))
			  (cadr (assoc 11 (entget ent)))
		       ) ;_ end of =
		     ) ;_ end of lambda
		    (_dwgru-conv-pickset-to-list ss)
		  ) ;_ end of vl-remove-if-not
	   ) ;_ end of setq
      ) ;_ end of and
    (progn
      (setq lst
	     (mapcar
	       '(lambda (a) (cons (cadr (assoc 10 (entget a))) a))
	       lst
	     ) ;_ end of mapcar
      ) ;_ end of setq
      (mapcar
	'cdr
	(vl-remove-if-not
	  '(lambda (a)
	     (vl-member-if
	       '(lambda	(b / c)
		  (setq c (- (car a) (car b)))
		  (or (equal c sp 1e-8) (equal c (- sp) 1e-8))
		) ;_ end of lambda
	       lst
	     ) ;_ end of vl-member-if
	   ) ;_ end of lambda
	  lst
	) ;_ end of vl-remove-if-not
      ) ;_ end of mapcar
    ) ;_ end of progn
  ) ;_ end of if
) ;_ end of defun

(defun get-line	(lrs / ss)
  (if (and (or (= (type lrs) 'str) (not lrs))
	   (setq ss (ssget "_X"
			   (list (cons 0 "LINE")
				 (cons 8
				       (if lrs
					 lrs
					 "*"
				       ) ;_ end of if
				 ) ;_ end of cons
			   ) ;_ end of list
		    ) ;_ end of ssget
	   ) ;_ end of setq
      ) ;_ end of and
    (_dwgru-conv-pickset-to-list ss)
  ) ;_ end of if
) ;_ end of defun


(defun get-goriz-line-with-max-length (len lrs / ss lst)
  (if (and (numberp len)
	   (< 0 len)
	   (or (= (type lrs) 'str) (not lrs))
	   (setq ss (ssget "_X"
			   (list (cons 0 "LINE")
				 (cons 8
				       (if lrs
					 lrs
					 "*"
				       ) ;_ end of if
				 ) ;_ end of cons
			   ) ;_ end of list
		    ) ;_ end of ssget
	   ) ;_ end of setq

      ) ;_ end of and
    (setq lst
	   (vl-remove-if-not
	     '(lambda (ent / eg)
		(setq eg (entget ent))
		(and (=	(caddr (assoc 10 eg))
			(caddr (assoc 11 eg))
		     ) ;_ end of =
		     (<= (- len)
			 (- (cadr (assoc 10 eg))
			    (cadr (assoc 11 eg))
			 ) ;_ end of -
			 len
		     ) ;_ end of <=
		) ;_ end of and
	      ) ;_ end of lambda
	     (_dwgru-conv-pickset-to-list ss)
	   ) ;_ end of vl-remove-if-not
    ) ;_ end of setq
  ) ;_ end of if
) ;_ end of defun


(defun c:select_lines (/ lst lst1 lst2 ss)
  (setq lst (get-line "TR_UP,TR_DN"))
  (or (not
	(setq lst1 (get-vert-parallel-line-with-spacing 4.0 "0"))
      ) ;_ end of not
      (progn
	(setq lst2 (get-goriz-line-with-max-length 4.0 "0"))
	(setq
	  pts
	   (apply
	     'append
	     (mapcar '(lambda (ent / eg)
			(setq eg (entget ent))
			(list (cdr (assoc 10 eg)) (cdr (assoc 11 eg)))
		      ) ;_ end of lambda
		     lst1
	     ) ;_ end of mapcar
	   ) ;_ end of apply
	) ;_ end of setq
	(setq lst2
	       (vl-remove-if-not
		 '(lambda (ent / eg)
		    (setq eg (entget ent))
		    (or	(member (cdr (assoc 10 eg)) pts)
			(member (cdr (assoc 11 eg)) pts)
		    ) ;_ end of or
		  ) ;_ end of lambda
		 lst2
	       ) ;_ end of vl-remove-if-not
	) ;_ end of setq
      ) ;_ end of progn
  ) ;_ end of or
  (if (setq lst (append lst lst1 lst2))
    (progn
      (setq ss (ssadd))
      (while lst
	(setq ss  (ssadd (car lst) ss)
	      lst (cdr lst)
	) ;_ end of setq
      ) ;_ end of while
      (sssetfirst ss ss)
    ) ;_ end of progn
  ) ;_ end of if
  (princ)
) ;_ end of defun

Проверял 2 раза
Гарантированно работает только на представленном чертеже
Do$ вне форума  
 
Автор темы   Непрочитано 21.12.2010, 09:55
#17
Pontelimon


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


Do$, спасибо Вам за время потраченное на разработку данного скрипта, это именно то что нужно ! Вы наверное даже не представляете, как это сильно сократит время на оформление чертежей , а учитывая еще и то, что Вы помогли с тем скриптом на изменения чисел ...

Единственное, о чем я бы хотел еще Вас попросить, это сделать то ограничение на X>0 Y>0, т.к. на некоторых чертежах могут быть случайно выбраны линии не относящиеся к колодцам, как допустим в примере, который я прикрепил к этому сообщению.

Последний раз редактировалось Pontelimon, 22.12.2010 в 13:56.
Pontelimon вне форума  
 
Непрочитано 21.12.2010, 10:51
1 | #18
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Условия те же, что и в #16, добавил обработку на положительность X и Y. За оптимальность алгоритма не ручаюсь
Код:
[Выделить все]
(defun _dwgru-conv-pickset-to-list (value / tab item)
  (repeat (setq	tab  nil
		item (sslength value)
	  ) ;_ end setq
    (setq tab (cons (ssname value (setq item (1- item))) tab))
  ) ;_ end repeat
) ;_ end defun

(defun get-vert-parallel-line-with-spacing (sp lrs / ss lst)
;;;(get-vert-parallel-line-with-spacing 4.0 "0")
;;;(get-vert-parallel-line-with-spacing 4.0 "0,TR_DN")
;;;(get-vert-parallel-line-with-spacing 4.0 "TR_UP,TR_DN")
  (if (and (numberp sp)
	   (or (= (type lrs) 'str) (not lrs))
	   (setq ss (ssget "_X"
			   (list (cons 0 "LINE")
				 (cons 8
				       (if lrs
					 lrs
					 "*"
				       ) ;_ end of if
				 ) ;_ end of cons
			   ) ;_ end of list
		    ) ;_ end of ssget
	   ) ;_ end of setq
	   (setq lst
		  (vl-remove-if-not
		    '(lambda (ent)
		       (= (cadr (assoc 10 (entget ent)))
			  (cadr (assoc 11 (entget ent)))
		       ) ;_ end of =
		     ) ;_ end of lambda
		    (_dwgru-conv-pickset-to-list ss)
		  ) ;_ end of vl-remove-if-not
	   ) ;_ end of setq
      ) ;_ end of and
    (progn
      (setq lst
	     (mapcar
	       '(lambda (a) (cons (cadr (assoc 10 (entget a))) a))
	       lst
	     ) ;_ end of mapcar
      ) ;_ end of setq
      (mapcar
	'cdr
	(vl-remove-if-not
	  '(lambda (a)
	     (vl-member-if
	       '(lambda	(b / c)
		  (setq c (- (car a) (car b)))
		  (or (equal c sp 1e-8) (equal c (- sp) 1e-8))
		) ;_ end of lambda
	       lst
	     ) ;_ end of vl-member-if
	   ) ;_ end of lambda
	  lst
	) ;_ end of vl-remove-if-not
      ) ;_ end of mapcar
    ) ;_ end of progn
  ) ;_ end of if
) ;_ end of defun

(defun get-line	(lrs / ss)
  (if (and (or (= (type lrs) 'str) (not lrs))
	   (setq ss (ssget "_X"
			   (list (cons 0 "LINE")
				 (cons 8
				       (if lrs
					 lrs
					 "*"
				       ) ;_ end of if
				 ) ;_ end of cons
			   ) ;_ end of list
		    ) ;_ end of ssget
	   ) ;_ end of setq
      ) ;_ end of and
    (_dwgru-conv-pickset-to-list ss)
  ) ;_ end of if
) ;_ end of defun


(defun get-goriz-line-with-max-length (len lrs / ss lst)
  (if (and (numberp len)
	   (< 0 len)
	   (or (= (type lrs) 'str) (not lrs))
	   (setq ss (ssget "_X"
			   (list (cons 0 "LINE")
				 (cons 8
				       (if lrs
					 lrs
					 "*"
				       ) ;_ end of if
				 ) ;_ end of cons
			   ) ;_ end of list
		    ) ;_ end of ssget
	   ) ;_ end of setq

      ) ;_ end of and
    (setq lst
	   (vl-remove-if-not
	     '(lambda (ent / eg)
		(setq eg (entget ent))
		(and (=	(caddr (assoc 10 eg))
			(caddr (assoc 11 eg))
		     ) ;_ end of =
		     (<= (- len)
			 (- (cadr (assoc 10 eg))
			    (cadr (assoc 11 eg))
			 ) ;_ end of -
			 len
		     ) ;_ end of <=
		) ;_ end of and
	      ) ;_ end of lambda
	     (_dwgru-conv-pickset-to-list ss)
	   ) ;_ end of vl-remove-if-not
    ) ;_ end of setq
  ) ;_ end of if
) ;_ end of defun



(defun c:select_lines (/ lst lst1 lst2 ss)
  (setq lst (get-line "TR_UP,TR_DN"))
  (or (not
	(setq lst1 (get-vert-parallel-line-with-spacing 4.0 "0"))
      ) ;_ end of not
      (progn
	(setq lst2 (get-goriz-line-with-max-length 4.0 "0"))
	(setq
	  pts
	   (apply
	     'append
	     (mapcar '(lambda (ent / eg)
			(setq eg (entget ent))
			(list (cdr (assoc 10 eg)) (cdr (assoc 11 eg)))
		      ) ;_ end of lambda
		     lst1
	     ) ;_ end of mapcar
	   ) ;_ end of apply
	) ;_ end of setq
	(setq lst2
	       (vl-remove-if-not
		 '(lambda (ent / eg)
		    (setq eg (entget ent))
		    (or	(member (cdr (assoc 10 eg)) pts)
			(member (cdr (assoc 11 eg)) pts)
		    ) ;_ end of or
		  ) ;_ end of lambda
		 lst2
	       ) ;_ end of vl-remove-if-not
	) ;_ end of setq
      ) ;_ end of progn
  ) ;_ end of or
  (if (setq
	lst
	 (vl-remove-if
	   '(lambda (ent / eg)
	      (setq eg (entget ent))
	      (or
		(> 0 (cadr (assoc 10 eg)))
		(> 0 (cadr (assoc 11 eg)))
		(> 0 (caddr (assoc 11 eg)))
		(> 0 (caddr (assoc 11 eg)))
	      ) ;_ end of or
	    ) ;_ end of lambda
	   (append lst lst1 lst2)
	 ) ;_ end of vl-remove-if
      ) ;_ end of setq
    (progn
      (setq ss (ssadd))
      (while lst
	(setq ss  (ssadd (car lst) ss)
	      lst (cdr lst)
	) ;_ end of setq
      ) ;_ end of while
      (sssetfirst ss ss)
    ) ;_ end of progn
  ) ;_ end of if
  (princ)
) ;_ end of defun
Do$ вне форума  
 
Автор темы   Непрочитано 21.12.2010, 11:08
#19
Pontelimon


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


Вот это да ... СПАСИБО !!!
А можно, очень не удобно уже Вас просить о чем-то, сделать тут заодно и конвертацию в полилинию с толщиной 0.5 всех выделенных отрезков ?

Сам я это делаю с помощью программы total purge, но для этого я сначала все выделенное кидаю в 1 слой, т.к. она не умеет работать с выделенным набором, но зато может весь слой переделать в полилнию.
Pontelimon вне форума  
 
Непрочитано 21.12.2010, 12:57
1 | #20
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Разросся кодище
Запускается командой lines-to-plines
Код:
[Выделить все]
(defun _dwgru-conv-pickset-to-list (value / tab item)
  (repeat (setq	tab  nil
		item (sslength value)
	  ) ;_ end setq
    (setq tab (cons (ssname value (setq item (1- item))) tab))
  ) ;_ end repeat
) ;_ end defun

(defun get-vert-parallel-line-with-spacing (sp lrs / ss lst)
;;;(get-vert-parallel-line-with-spacing 4.0 "0")
;;;(get-vert-parallel-line-with-spacing 4.0 "0,TR_DN")
;;;(get-vert-parallel-line-with-spacing 4.0 "TR_UP,TR_DN")
  (if (and (numberp sp)
	   (or (= (type lrs) 'str) (not lrs))
	   (setq ss (ssget "_X"
			   (list (cons 0 "LINE")
				 (cons 8
				       (if lrs
					 lrs
					 "*"
				       ) ;_ end of if
				 ) ;_ end of cons
			   ) ;_ end of list
		    ) ;_ end of ssget
	   ) ;_ end of setq
	   (setq lst
		  (vl-remove-if-not
		    '(lambda (ent)
		       (= (cadr (assoc 10 (entget ent)))
			  (cadr (assoc 11 (entget ent)))
		       ) ;_ end of =
		     ) ;_ end of lambda
		    (_dwgru-conv-pickset-to-list ss)
		  ) ;_ end of vl-remove-if-not
	   ) ;_ end of setq
      ) ;_ end of and
    (progn
      (setq lst
	     (mapcar
	       '(lambda (a) (cons (cadr (assoc 10 (entget a))) a))
	       lst
	     ) ;_ end of mapcar
      ) ;_ end of setq
      (mapcar
	'cdr
	(vl-remove-if-not
	  '(lambda (a)
	     (vl-member-if
	       '(lambda	(b / c)
		  (setq c (- (car a) (car b)))
		  (or (equal c sp 1e-8) (equal c (- sp) 1e-8))
		) ;_ end of lambda
	       lst
	     ) ;_ end of vl-member-if
	   ) ;_ end of lambda
	  lst
	) ;_ end of vl-remove-if-not
      ) ;_ end of mapcar
    ) ;_ end of progn
  ) ;_ end of if
) ;_ end of defun

(defun get-line	(lrs / ss)
  (if (and (or (= (type lrs) 'str) (not lrs))
	   (setq ss (ssget "_X"
			   (list (cons 0 "LINE")
				 (cons 8
				       (if lrs
					 lrs
					 "*"
				       ) ;_ end of if
				 ) ;_ end of cons
			   ) ;_ end of list
		    ) ;_ end of ssget
	   ) ;_ end of setq
      ) ;_ end of and
    (_dwgru-conv-pickset-to-list ss)
  ) ;_ end of if
) ;_ end of defun


(defun get-goriz-line-with-max-length (len lrs / ss lst)
  (if (and (numberp len)
	   (< 0 len)
	   (or (= (type lrs) 'str) (not lrs))
	   (setq ss (ssget "_X"
			   (list (cons 0 "LINE")
				 (cons 8
				       (if lrs
					 lrs
					 "*"
				       ) ;_ end of if
				 ) ;_ end of cons
			   ) ;_ end of list
		    ) ;_ end of ssget
	   ) ;_ end of setq

      ) ;_ end of and
    (setq lst
	   (vl-remove-if-not
	     '(lambda (ent / eg)
		(setq eg (entget ent))
		(and (=	(caddr (assoc 10 eg))
			(caddr (assoc 11 eg))
		     ) ;_ end of =
		     (<= (- len)
			 (- (cadr (assoc 10 eg))
			    (cadr (assoc 11 eg))
			 ) ;_ end of -
			 len
		     ) ;_ end of <=
		) ;_ end of and
	      ) ;_ end of lambda
	     (_dwgru-conv-pickset-to-list ss)
	   ) ;_ end of vl-remove-if-not
    ) ;_ end of setq
  ) ;_ end of if
) ;_ end of defun


(defun line-to-pline (ent / eg)
  ;;(line-to-pline (car (entsel)))
  (if
    (and
      (= "LINE" (cdr (assoc 0 (setq eg (entget ent)))))
      (entmakex
	(vl-remove-if
	  'null
	  (append
	    '((0 . "LWPOLYLINE")
	      (100 . "AcDbEntity")
	     )
	    (mapcar '(lambda (cd) (assoc cd eg))
		    (list 67 410 8 62 420 6 370)
	    ) ;_ end of mapcar
	    '((100 . "AcDbPolyline")
	      (90 . 2)
	      (70 . 0)
	      (43 . 0.5)
	      ;;Global width
	      (38 . 0.0)
	      (39 . 0.0)
	     )
	    (apply
	      'append
	      (mapcar
		'(lambda (cd)
		   (cons
		     (cons 10
			   (reverse (cdr (reverse (cdr (assoc cd eg)))))
		     ) ;_ end of cons
		     '((40 . 0.0) (41 . 0.0) (42 . 0.0))
		   ) ;_ end of cons
		 ) ;_ end of lambda
		(list 10 11)
	      ) ;_ end of mapcar
	    ) ;_ end of apply
	    '((210 0.0 0.0 1.0))
	  ) ;_ end of append
	) ;_ end of vl-remove-if
      ) ;_ end of entmakex
    ) ;_ end of and
     (entdel ent)
  ) ;_ end of if
) ;_ end of defun







(defun c:lines-to-plines (/ lst lst1 lst2 adoc *error*)

  (defun *error* (msg)
    (if	adoc
      (vla-EndUndoMark adoc)
    ) ;_ end of if
    (princ msg)
    (princ)
  ) ;_ end of defun

  (setq lst (get-line "TR_UP,TR_DN"))
  (or (not
	(setq lst1 (get-vert-parallel-line-with-spacing 4.0 "0"))
      ) ;_ end of not
      (progn
	(setq lst2 (get-goriz-line-with-max-length 4.0 "0"))
	(setq
	  pts
	   (apply
	     'append
	     (mapcar '(lambda (ent / eg)
			(setq eg (entget ent))
			(list (cdr (assoc 10 eg)) (cdr (assoc 11 eg)))
		      ) ;_ end of lambda
		     lst1
	     ) ;_ end of mapcar
	   ) ;_ end of apply
	) ;_ end of setq
	(setq lst2
	       (vl-remove-if-not
		 '(lambda (ent / eg)
		    (setq eg (entget ent))
		    (or	(member (cdr (assoc 10 eg)) pts)
			(member (cdr (assoc 11 eg)) pts)
		    ) ;_ end of or
		  ) ;_ end of lambda
		 lst2
	       ) ;_ end of vl-remove-if-not
	) ;_ end of setq
      ) ;_ end of progn
  ) ;_ end of or
  (if (setq
	lst
	 (vl-remove-if
	   '(lambda (ent / eg)
	      (setq eg (entget ent))
	      (or
		(> 0 (cadr (assoc 10 eg)))
		(> 0 (cadr (assoc 11 eg)))
		(> 0 (caddr (assoc 11 eg)))
		(> 0 (caddr (assoc 11 eg)))
	      ) ;_ end of or
	    ) ;_ end of lambda
	   (append lst lst1 lst2)
	 ) ;_ end of vl-remove-if
      ) ;_ end of setq
    (progn
      (vla-StartUndoMark
	(setq adoc (vla-get-ActiveDocument (vlax-get-acad-object)))
      ) ;_ end of vla-StartUndoMark
      (prompt
	(strcat
	  "\nПреобразовано в полилинии отрезков: "
	  (itoa
	    (length (vl-remove-if 'null (mapcar 'line-to-pline lst)))
	  ) ;_ end of itoa
	  "шт."
	) ;_ end of strcat
      ) ;_ end of prompt
      (vla-EndUndoMark adoc)
    ) ;_ end of progn
  ) ;_ end of if
  (princ)
) ;_ end of defun
Do$ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Подскажите варианты для автоматизации оформления чертежа.

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Потеря стандартов оформления при конвертации чертежа из Inventor в Autocad andrus77 Прочее ПО от Autodesk 1 20.02.2012 09:07
Несвойственные Автокаду вещи Vova AutoCAD 49 01.02.2012 19:33
Подскажите, гуру! Можно ли в разделенном на 2 части окне автокада открыть два разных чертежа? Или это возможно только в 2 запущенных копиях АВТОКАДА? Ridder AutoCAD 5 22.07.2010 06:02
Подскажите варианты перекрытия в помещении в построенном здании бесперспективняк Конструкции зданий и сооружений 13 29.07.2009 12:39
Подскажите с оформлением чертежа Gesha AutoCAD 3 25.04.2006 12:46