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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Нужен лисп (добавить вершину в полилинию)

Нужен лисп (добавить вершину в полилинию)

Ответ
Поиск в этой теме
Непрочитано 28.06.2006, 04:09 #1
Нужен лисп (добавить вершину в полилинию)
Димас
 
джедай
 
Магадан
Регистрация: 31.01.2005
Сообщений: 460

Уважаемые гуру!
Помогите пожалуйста с такой проблемой.
Нужен лисп способный добавлять вершины в полилинию. (нечто такое - ткнул мышем на полилинию примерно в том месте куда хочу добавить вершину, ткнул мышем на точку куда ее поставить)
при этом нужно чтоб и ассоциативность штриховки не потерялась
В инете нашел очень много подобных но у всех есть большой недостаток - не работают в 3D (либо взрывают полилинию при работе)
т.е. если полилиния нарисована не в мировых координатах - работать они отказываются
пробовал написать сам но в лиспе не силен - не смог разобраться с переводом координат((
Просмотров: 13525
 
Непрочитано 28.06.2006, 06:07
#2
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,825


Маленько сноровки и привычки и я думаю можно свободно обойтись командой _Pedit > Edit vertex > Insert.
В 3D работает, полилинию не взрывает, ассоциативность не нарушается.
Krieger вне форума  
 
Автор темы   Непрочитано 28.06.2006, 07:05
#3
Димас

джедай
 
Регистрация: 31.01.2005
Магадан
Сообщений: 460
<phrase 1=


спасибо за хороший совет))
прям вот не знаю чтоб я без вас делал)))
как вы думаете как я сейчас вершины добавляю?
а вот представте - полилиния с 300-ми вершинами...
почему-то очень много времени тратится на переход к нужному месту вставки вершины (PE E затем N допустим 200 раз нажать...)
да я знаю что можно сделать zoom к нужному месту и тогда меньше прийдется перебирать вершин
но ведь с лиспом же было бы намного проще и быстрее - можно буквально в два-три щелчка добавить вершину
в общем спасет только лисп
Димас вне форума  
 
Непрочитано 28.06.2006, 08:35
#4
Кулик Алексей aka kpblc
Moderator

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


А здесь был?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 28.06.2006, 08:42
#5
Димас

джедай
 
Регистрация: 31.01.2005
Магадан
Сообщений: 460
<phrase 1=


Цитата:
Сообщение от kpblc
А здесь был?
был) за сегодня туда уже второй раз посылали)) и по поиску туда попадал
но ведь там тоже линия рвется?
Цитата:
;; Собственно разрыв и дополнительный одновременный _.stretch.
разве при этом штриховка не перестанет быть ассоциативной?
Димас вне форума  
 
Непрочитано 28.06.2006, 08:56
#6
Кулик Алексей aka kpblc
Moderator

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


Перестает. Все дело в том, что для штриховки, по-моему, надо массу дополнительных телодвижений делать - снимать старые настройки, выполнять добавление вершин, удалять и создавать по новой. Снять ассоциативность - это запросто, а вот поставить ее обратно после изменения окружающего объекта - по-моему, невозможно. По крайней мере изменение через vla и через (entmode) у меня не сработало.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 28.06.2006, 09:03
#7
Кочетков Андрей

Java/Kotlin backend
 
Регистрация: 03.02.2006
Сообщений: 5,737


Toolpac 9
Команда PVI.
Кочетков Андрей вне форума  
 
Автор темы   Непрочитано 28.06.2006, 09:08
#8
Димас

джедай
 
Регистрация: 31.01.2005
Магадан
Сообщений: 460
<phrase 1=


нужно чтоб не переставала
и чтоб работало в 3D (не в WCS)
Димас вне форума  
 
Автор темы   Непрочитано 28.06.2006, 09:14
#9
Димас

джедай
 
Регистрация: 31.01.2005
Магадан
Сообщений: 460
<phrase 1=


Цитата:
Сообщение от Кочетков Андрей
Toolpac 9
Команда PVI.
пробовал, вот что выдает
Код:
[Выделить все]
Command: pvi
DS> Pick Point to Insert:
DS> Select Polyline Segment: ; error: bad argument type: 2D/3D point: (nil nil)
нужно чтоб в 3D работало
но, хотелось бы отметить, Toolpac штриховку не портит))
Димас вне форума  
 
Непрочитано 28.06.2006, 09:14 Re: Нужен лисп (добавить вершину в полилинию)
#10
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от Димас
Уважаемые гуру!
Помогите пожалуйста с такой проблемой.
Нужен лисп способный добавлять вершины в полилинию. (нечто такое - ткнул мышем на полилинию примерно в том месте куда хочу добавить вершину, ткнул мышем на точку куда ее поставить)
при этом нужно чтоб и ассоциативность штриховки не потерялась
В инете нашел очень много подобных но у всех есть большой недостаток - не работают в 3D (либо взрывают полилинию при работе)
т.е. если полилиния нарисована не в мировых координатах - работать они отказываются
пробовал написать сам но в лиспе не силен - не смог разобраться с переводом координат((
Я писал такую программу - можно добавлять точки в уже заштрихованную полилинию и штриховка не теряет ассоциативность...
http://www.autocad.ru/cgi-bin/f1/board.cgi?t=20156yO
Правда она не пошла в массы
Выкладываю код здесь - под указанной ссылкой слетело форматирование - появились переносы посередине функций.

Забыл добавить...
Эта программа преобразует дуги, круги, линии в полилинии с добавлением точки в указанном месте, но тогда штриховка перестает быть ассоциативной!
Код:
[Выделить все]
(defun c:lw_pt (/ ent i gr lst lw par pt)
 (princ "\n Укажите новую вершину на полилинии. ")
 (while	(and (setq gr (grread 5)) (= (car gr) 5))
  (if lw
   (redraw lw 4)
  ) ;_  if
  (if (and (setq pt (osnap (cadr gr) "_nea,_end"))
	   (setq lw (ssget pt
			   '((0
			      .
			      "LWPOLYLINE,LINE,ARC,CIRCLE"
			     )
			    )
		    ) ;_  ssget
	   ) ;_  setq
	   (setq lw (ssname lw 0))
	   (setq ent (entget lw))
      ) ;_  and
   (redraw lw 3)
  ) ;_  if
 ) ;_  while
 (cond
  ((= (cdr (assoc 0 ent)) "LWPOLYLINE")
   (setq par (vlax-curve-getparamatpoint lw
					 (vlax-curve-getclosestpointto
					  lw
					  pt
					 ) ;_  vlax-curve-
	     ) ;_  vlax-curve-getparamatpoint
	 ent (subst (cons 90 (1+ (cdr (assoc 90 ent))))
		    (assoc 90
			   ent
		    ) ;_  assoc
		    ent
	     ) ;_  subst
	 i   0
	 lst nil
   ) ;_  setq
   (if (/= par (fix par))
    (progn (while (or (/= (caar ent) 41)
		      (if (< i (fix par))
		       (setq i (1+ i))
		      ) ;_  if
		  ) ;_  or
	    (setq lst (cons (car ent) lst)
		  ent (cdr ent)
	    ) ;_  setq
	   ) ;_  while
	   (setq lst (cons (cons 41
				 (+ (cdr (assoc 40 lst))
				    (* (- (cdr (assoc 41 ent)) (cdr (assoc 40 lst)))
				       (-
					par
					(fix par)
				       ) ;_  -
				    ) ;_  *
				 ) ;_  +
			   ) ;_  cons
			   lst
		     ) ;_  cons
		 lst (cons (cons 42
				 (/ (sin (setq i (- (angle (vlax-curve-getpointatparam
							    lw
							    (fix par)
							   ) ;_  vlax-curve-getpointatparam
							   pt
						    ) ;_  angle
						    (angle (vlax-curve-getpointatparam lw (fix par))
							   (vlax-curve-getpointatparam lw
										       (+ (fix par)
											  (/ (-
											      par
											      (fix par)
											     ) ;_  -
											     2.
											  ) ;_  /
										       ) ;_  +
							   ) ;_  vlax-curve-getpointatparam
						    ) ;_  angle
						 ) ;_  -
					 ) ;_  setq
				    ) ;_  sin
				    (cos i)
				 ) ;_  /
			   ) ;_  cons
			   lst
		     ) ;_  cons
		 lst (cons (assoc 41 ent)
			   (cons (cons 40 (cdr (assoc 41 lst)))
				 (cons (list 10 (car pt) (cadr pt))
				       lst
				 ) ;_  cons
			   ) ;_  cons
		     ) ;_  cons
		 lst (cons (cons 42
				 (/ (sin (setq i (- (angle pt
							   (vlax-curve-getpointatparam
							    lw
							    (1+ (fix par))
							   ) ;_  vlax-curve-
						    ) ;_  angle
						    (angle pt
							   (vlax-curve-getpointatparam lw
										       (+ par
											  (/ (-
											      (1+ (fix par))
											      par
											     ) ;_  -
											     2.
											  ) ;_  /
										       ) ;_  +
							   ) ;_  vlax-curve-getpointatparam
						    ) ;_  angle
						 ) ;_  -
					 ) ;_  setq
				    ) ;_  sin
				    (cos i)
				 ) ;_  /
			   ) ;_  cons
			   lst
		     ) ;_  cons
	   ) ;_  setq
	   (vla-startundomark (vla-get-activedocument (vlax-get-acad-object
						      ) ;_  vlax-get-
			      ) ;_  vla-get-activedocument
	   ) ;_  vla-startundomark
	   (entmod (append (reverse lst) (cddr ent)))
	   (entupd lw)
	   (vla-endundomark (vla-get-activedocument (vlax-get-acad-object
						    ) ;_  vlax-get-
			    ) ;_  vla-get-activedocument
	   ) ;_  vla-endundomark
    ) ;_  progn
   ) ;_  if
   (vl-cmdf "_.stretch"
	    "_C"
	    pt
	    pt
	    ""
	    pt
	    (getpoint pt
		      "Укажите новую точку : "
	    ) ;_  getpoint
   ) ;_  vl-cmdf
  )
  ((= (cdr (assoc 0 ent)) "LINE")
   (setq lst '((0 . "LWPOLYLINE")))
   (foreach x '(100 67 410 8 62 6 370)
    (if	(assoc x ent)
     (setq lst (cons (assoc x ent) lst))
    ) ;_  if
   ) ;_  foreach
   (vla-startundomark (vla-get-activedocument (vlax-get-acad-object
					      ) ;_  vlax-get-
		      ) ;_  vla-get-activedocument
   ) ;_  vla-startundomark
   (entmakex
    (append (reverse lst)
	    (list '(100 . "AcDbPolyline")
		  '(90 . 3)
		  '(70 . 0)
		  (cons 38 (cadddr (assoc 10 ent)))
		  (assoc 10 ent)
		  '(40 . 0)
		  '(41 . 0)
		  '(42 . 0)
		  (cons 10 (list (car pt) (cadr pt)))
		  '(40 . 0)
		  '(41 . 0)
		  '(42 . 0)
		  (cons	10
			(list (cadr (assoc 11 ent))
			      (caddr (assoc 11
					    ent
				     ) ;_  assoc
			      ) ;_  caddr
			) ;_  list
		  ) ;_  cons
		  '(40 . 0)
		  '(41 . 0)
		  '(42 . 0)
		  (assoc 210 ent)
	    ) ;_  list
    ) ;_  append
   ) ;_  entmakex
   (entdel lw)
   (vla-endundomark (vla-get-activedocument (vlax-get-acad-object
					    ) ;_  vlax-get-
		    ) ;_  vla-get-activedocument
   ) ;_  vla-endundomark
   (vl-cmdf "_.stretch"
	    "_C"
	    pt
	    pt
	    ""
	    pt
	    (getpoint pt
		      "Укажите новую точку : "
	    ) ;_  getpoint
   ) ;_  vl-cmdf
  )
  ((= (cdr (assoc 0 ent)) "ARC")
   (setq lst '((0 . "LWPOLYLINE"))
	 par (vlax-curve-getparamatpoint lw
					 (vlax-curve-getclosestpointto
					  lw
					  pt
					 ) ;_  vlax-curve-
	     ) ;_  vlax-curve-getparamatpoint
   ) ;_  setq
   (foreach x '(100 67 410 8 62 6 370)
    (if	(assoc x
	       ent
	) ;_  assoc
     (setq lst (cons (assoc x ent) lst))
    ) ;_  if
   ) ;_  foreach
   (vla-startundomark (vla-get-activedocument (vlax-get-acad-object
					      ) ;_  vlax-get-
		      ) ;_  vla-get-activedocument
   ) ;_  vla-startundomark
   (entmakex
    (append
     (reverse lst)
     (list '(100 . "AcDbPolyline")
	   '(90 . 3)
	   '(70 . 0)
	   (cons 38 (cadddr (assoc 10 ent)))
	   (cons 10
		 (reverse (cdr (reverse	(polar (cdr (assoc 10
							   ent
						    ) ;_  assoc
					       ) ;_  cdr
					       (cdr (assoc 50 ent))
					       (cdr (assoc 40 ent))
					) ;_  polar
			       ) ;_  reverse
			  ) ;_  cdr
		 ) ;_  reverse
	   ) ;_  cons
	   '(40 . 0)
	   '(41 . 0)
	   (cons 42
		 (/ (sin (setq i (- (angle (vlax-curve-getstartpoint lw)
					   pt
				    ) ;_  angle
				    (angle (vlax-curve-getstartpoint lw)
					   (vlax-curve-getpointatparam
					    lw
					    (+ (vlax-curve-getstartparam lw)
					       (/ (- par
						     (vlax-curve-getstartparam
						      lw
						     ) ;_  vlax-curve-
						  ) ;_  -
						  2.
					       ) ;_  /
					    ) ;_  +
					   ) ;_  vlax-curve-getpointatparam
				    ) ;_  angle
				 ) ;_  -
			 ) ;_  setq
		    ) ;_  sin
		    (cos i)
		 ) ;_  /
	   ) ;_  cons
	   (cons 10 (list (car pt) (cadr pt)))
	   '(40 . 0)
	   '(41 . 0)
	   (cons 42
		 (/ (sin
		     (setq i (-	(angle pt (vlax-curve-getendpoint lw))
				(angle pt
				       (vlax-curve-getpointatparam lw
								   (+ par
								      (/ (-
									  (vlax-curve-getendparam lw)
									  par
									 ) ;_  -
									 2.
								      ) ;_  /
								   ) ;_  +
				       ) ;_  vlax-curve-getpointatparam
				) ;_  angle
			     ) ;_  -
		     ) ;_  setq
		    ) ;_  sin
		    (cos i)
		 ) ;_  /
	   ) ;_  cons
	   (cons 10
		 (reverse (cdr (reverse	(polar (cdr (assoc 10
							   ent
						    ) ;_  assoc
					       ) ;_  cdr
					       (cdr (assoc 51 ent))
					       (cdr (assoc 40 ent))
					) ;_  polar
			       ) ;_  reverse
			  ) ;_  cdr
		 ) ;_  reverse
	   ) ;_  cons
	   '(40 . 0)
	   '(41 . 0)
	   '(42 . 0)
	   (assoc 210 ent)
     ) ;_  list
    ) ;_  append
   ) ;_  entmakex
   (entdel lw)
   (vla-endundomark (vla-get-activedocument (vlax-get-acad-object
					    ) ;_  vlax-get-
		    ) ;_  vla-get-activedocument
   ) ;_  vla-endundomark
   (vl-cmdf "_.stretch"
	    "_C"
	    pt
	    pt
	    ""
	    pt
	    (getpoint pt
		      "Укажите новую точку : "
	    ) ;_  getpoint
   ) ;_  vl-cmdf
  )
  ((= (cdr (assoc 0 ent)) "CIRCLE")
   (setq lst '((0 . "LWPOLYLINE")))
   (foreach x '(100 67 410 8 62 6 370)
    (if	(assoc x ent)
     (setq lst (cons (assoc x ent) lst))
    ) ;_  if
   ) ;_  foreach
   (vla-startundomark (vla-get-activedocument (vlax-get-acad-object
					      ) ;_  vlax-get-
		      ) ;_  vla-get-activedocument
   ) ;_  vla-startundomark
   (entmakex
    (append (reverse lst)
	    (list '(100 . "AcDbPolyline")
		  '(90 . 2)
		  '(70 . 1)
		  (cons 38 (cadddr (assoc 10 ent)))
		  (cons 10 (list (car pt) (cadr pt)))
		  '(40 . 0)
		  '(41 . 0)
		  (cons 42 (/ (sin (/ pi 4.)) (cos (/ pi 4.))))
		  (cons	10
			(reverse
			 (cdr (reverse (polar (cdr (assoc 10 ent))
					      (angle
					       pt
					       (cdr (assoc 10 ent))
					      ) ;_  angle
					      (cdr (assoc 40 ent))
				       ) ;_  polar
			      ) ;_  reverse
			 ) ;_  cdr
			) ;_  reverse
		  ) ;_  cons
		  '(40 . 0)
		  '(41 . 0)
		  (cons 42 (/ (sin (/ pi 4.)) (cos (/ pi 4.))))
		  (assoc 210 ent)
	    ) ;_  list
    ) ;_  append
   ) ;_  entmakex
   (entdel lw)
   (vla-endundomark (vla-get-activedocument (vlax-get-acad-object
					    ) ;_  vlax-get-
		    ) ;_  vla-get-activedocument
   ) ;_  vla-endundomark
   (vl-cmdf "_.stretch"
	    "_C"
	    pt
	    pt
	    ""
	    pt
	    (getpoint pt
		      "Укажите новую точку : "
	    ) ;_  getpoint
   ) ;_  vl-cmdf
  )
  (t (princ "\n Указанная точка не лежит на полилинии.
 "))
 ) ;_  cond
) ;_  defun
Елпанов Евгений вне форума  
 
Непрочитано 28.06.2006, 09:16
#11
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Блин...
Плохо читал предыдущие посты
Моя программа работает в 2Д...
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 28.06.2006, 09:25
#12
Димас

джедай
 
Регистрация: 31.01.2005
Магадан
Сообщений: 460
<phrase 1=


Цитата:
Сообщение от Елпанов Евгений
Блин...
Плохо читал предыдущие посты :(
Моя программа работает в 2Д...
ну не надо на себя наговаривать))))
попробовал вашу программу прекрасно работает в 3D, штриховка не портится
у меня все полилинии не сглаженные - без дуг, кругов и т.д. возможно по этому работает?
а вы не пробовали свою программу продавать?) нашел программу буржуйскую называется что-то вроду polytools или polyline tools...
по функциональности хуже намного - не работает корректно со штриховками, не работает в 3D... за нее просят 100$))
Димас вне форума  
 
Автор темы   Непрочитано 28.06.2006, 09:27
#13
Димас

джедай
 
Регистрация: 31.01.2005
Магадан
Сообщений: 460
<phrase 1=


Елпанов Евгений нашел только один несущественный недостаток - если включена привязка - программа ведет себя немного неадекватно - точки привязываются непонятно к чему
но это легко обойти))
огромное вам спасибо))
Димас вне форума  
 
Непрочитано 28.06.2006, 09:33
#14
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


[quote="Димас"]
Цитата:
Сообщение от Елпанов Евгений
а вы не пробовали свою программу продавать?) нашел программу буржуйскую называется что-то вроду polytools или polyline tools...
по функциональности хуже намного - не работает корректно со штриховками, не работает в 3D... за нее просят 100$))
Нет!
Продавать свои программы, написанные чисто для форума (простенькие и небольшие) я не пробовал...
А программы написанные для работы, я не имею права публиковать
Если честно, я не уверен, что вы согласитесь покупать ТАКИЕ программы, даже с тех поддержкой, за те-же 100%.

PS. По поводу 3Д - главное программу запускать в мировой системе координат...
Елпанов Евгений вне форума  
 
Непрочитано 28.06.2006, 09:42
#15
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Кстати, я общаюсь с Луисом (Luis Esquivel) разработчиком упомянутой вами программы...
Часть исходников он опубликовал на форуме
http://www.theswamp.org/index.php
правда, там нужна регистрация (без нее только читать и нельзя посмотреть прикрепленные файлы) и еще все на английском... Рекомендую заглянуть, хотя dwg.ru и autocad.ru лучше!
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 28.06.2006, 09:53
#16
Димас

джедай
 
Регистрация: 31.01.2005
Магадан
Сообщений: 460
<phrase 1=


Цитата:
Сообщение от Елпанов Евгений
Кстати, я общаюсь с Луисом (Luis Esquivel) разработчиком упомянутой вами программы...
Часть исходников он опубликовал на форуме
http://www.theswamp.org/index.php
правда, там нужна регистрация (без нее только читать и нельзя посмотреть прикрепленные файлы) и еще все на английском... Рекомендую заглянуть, хотя dwg.ru и autocad.ru лучше!
спасибо за ссылку обязательно посмотрю
Цитата:
PS. По поводу 3Д - главное программу запускать в мировой системе координат...
скорее всего по этому и проблемы иногда - работаю в UCS) но тем не менее работает))
Димас вне форума  
 
Непрочитано 28.06.2006, 09:57
#17
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от Димас
спасибо за ссылку обязательно посмотрю
Полная ссылка на упомянутую тему...
http://www.theswamp.org/index.php?topic=9441.0
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 28.06.2006, 10:01
#18
Димас

джедай
 
Регистрация: 31.01.2005
Магадан
Сообщений: 460
<phrase 1=


хмм странно
перестала работать(
значит дело было не в привязке
Димас вне форума  
 
Автор темы   Непрочитано 28.06.2006, 10:08
#19
Димас

джедай
 
Регистрация: 31.01.2005
Магадан
Сообщений: 460
<phrase 1=


вот на этом файлике можно посмотреть - то работает то не работает - тыкаю в разных частях полилинии - ведет себя по разному почему-то
[ATTACH]1151474910.dwg[/ATTACH]
Димас вне форума  
 
Непрочитано 28.06.2006, 10:11
#20
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от Димас
хмм странно
перестала работать(
значит дело было не в привязке
Вообще то да...
если тебе нужно работать с полилиниями в своей системе координат, скажи, посмотрю, что можно сделать...
Елпанов Евгений вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Нужен лисп (добавить вершину в полилинию)

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

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