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

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

Помощь с лиспом не могу победить полилинию

Ответ
Поиск в этой теме
Непрочитано 24.12.2010, 11:51 #1
Помощь с лиспом не могу победить полилинию
void2005
 
Инженегр-констбезруктор
 
Красноярск
Регистрация: 12.11.2010
Сообщений: 61

Необходим лисп объекта (см. вложения) в котором всего лишь одна несчастная переменная В (от 400 до 1000), и 2 точки вставки блоков (блоки разные, ссылки на них выставлю сам позже) вызов лиспа с команды (допустим kass) не знаю с чего начать, за что хвататься? Поизучал литературку, посмотрел примеры, ужаснулся...ПОМОЖИТЕ ХОТЬ НАЧАТЬ... дальше будет легче...

Последний раз редактировалось void2005, 11.06.2013 в 05:12.
Просмотров: 2995
 
Непрочитано 24.12.2010, 13:06
1 | #2
Олег (jr.)

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


Пробуем
Код:
[Выделить все]
(defun C:demo(/ acsp bname cnt coords elist en ent )
(if (setq ent (entsel "\nSelect vertical polyline >"))
  (progn
    (setq en (car ent))
    (setq elist (entget en))
    (if
      (eq "LWPOLYLINE" (cdr (assoc 0 elist)))
       (progn
	 (setq coords (vl-remove-if
			'not
			(mapcar	(function (lambda (x)
					    (if	(= 10 (car x))
					      (trans (cdr x) 0 1))))
				elist)))
	 (setq coords (vl-sort coords
			       (function (lambda (a b) (< (cadr a) (cadr b))))))

	 (if (and coords
		  (eq (length coords) 2))
	   (progn
	     (vl-load-com)
	     (setq acsp	(vla-get-block
			  (vla-get-activelayout
			    (vla-get-activedocument
			      (vlax-get-acad-object)))))
	     (setq cnt 0)

	     (foreach point  coords

	       (setq bname (getstring t
				      (if (zerop cnt)
					"\nНижний блок : "
					"\nВерхний блок : ")))
	       (vlax-invoke-method
		 acsp
		 'InsertBlock
		 (vlax-3d-point
		   point)
		 bname
		 1
		 1
		 1
		 0)
	       (setq cnt (1+ cnt))
	       )
	     )
	     (alert
	       "Error\nMust be a LWPOLYLINE with two coodinates only")
	     )
	 )
	   (alert
	     "Error\nUnsupported polyline type in this program\n Must be a LWPOLYLINE")
	   )

       )
    (alert "Nothing selected")
    )
  

   (princ)
   )
   (C:demo)
Олег (jr.) вне форума  
 
Непрочитано 24.12.2010, 13:36
#3
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


А что насчет динамических блоков?
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 24.12.2010, 18:24
#4
void2005

Инженегр-констбезруктор
 
Регистрация: 12.11.2010
Красноярск
Сообщений: 61


необходимо чтоб лисп-програмка строила фигуру как на эскизе (см. приложение) с задаванием переменной В!Лисп Олег (jr.) очень пригодится!!

Последний раз редактировалось void2005, 24.12.2010 в 18:35.
void2005 вне форума  
 
Непрочитано 24.12.2010, 21:43
#5
Олег (jr.)

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


Цитата:
Сообщение от void2005 Посмотреть сообщение
необходимо чтоб лисп-програмка строила фигуру как на эскизе (см. приложение) с задаванием переменной В!Лисп Олег (jr.) очень пригодится!!
Ты не поверишь но это было первое что я узнал об Автолипе
http://aco.ifmo.ru/~nadinet/html/lectures/lsp_3.html
бери за основу
Олег (jr.) вне форума  
 
Непрочитано 24.12.2010, 23:36
#6
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от Олег (jr.) Посмотреть сообщение
http://aco.ifmo.ru/~nadinet/html/lectures/lsp_3.html
бери за основу
Я не претендую на истину - но мне кажется, что подобный пример только портит представление об Автолиспе. ИХМО лучше разбирать реальные примеры (Ваш то пример на "ссылочный" не больно похож), а не забивать мозг ненужным мусором.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 26.12.2010, 08:59
#7
void2005

Инженегр-констбезруктор
 
Регистрация: 12.11.2010
Красноярск
Сообщений: 61


Цитата:
Сообщение от Олег (jr.) Посмотреть сообщение
Ты не поверишь но это было первое что я узнал об Автолипе
http://aco.ifmo.ru/~nadinet/html/lectures/lsp_3.html
бери за основу
Ну помогите хоть начать на моем примере..!
void2005 вне форума  
 
Непрочитано 26.12.2010, 10:11
#8
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от Олег (jr.) Посмотреть сообщение
Ты не поверишь но это было первое что я узнал об Автолипе
http://aco.ifmo.ru/~nadinet/html/lectures/lsp_3.html
Таких бы преподов да на рынок... там им и место
gomer вне форума  
 
Непрочитано 26.12.2010, 14:08
#9
Олег (jr.)

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


Цитата:
Сообщение от void2005 Посмотреть сообщение
Ну помогите хоть начать на моем примере..!
Посмотри код, добавил кое-какие пояснения
Писал специально как можно проще чтобы было легче понять
Для начала пиши так же каждое выражение отдельной строкой
потом научишься задавать значения одним блоком

Успехов,

Код:
[Выделить все]
(defun C:DETAL(/ dia en hgt1 hgt2 hgt3 op p0 p1 p2 p3 p4 p5 p6 p7 p8 p9 pd1 thk wid1 wid2)

(setq p0 (getpoint "\nНижняя правая точка: "))
  (initget 6);<-- запрет ввода нуля и отрицательного значения, возможность ввода по умолчанию(по Enter)
(setq thk (getdist "\n Толщина детали <4>: "))
(if (not thk)(setq thk 4.0))

(initget 6)
(setq wid1 (getdist "\n Ширина снаружи внизу <20>: "))
(if (not wid1)(setq wid1 20.0))
  
(setq hgt1 nil)
  ;;;Пример  ввода значений строго в дипазоне 400-1000
  (while
;;;начало блока условий
    (not
      (and
	(or
	  (initget 7);<-- запрет ввода нуля, отрицательного значения и о ввода по умолчанию (по Enter)
	  (setq hgt1 (getdist "\n Высота слева (400-1000): ")))
	(>= 1000 hgt1 400))
      );<-- _конец блока условий ввода
     (alert "значение строго в дипазоне 400-1000")
     )
(initget 6)
(setq wid2 (getdist "\n Ширина снаружи вверху <39>: "))
(if (not wid2)(setq wid2 20.0))
  
(initget 6)
(setq hgt2 (getdist "\n Высота изгиба изнутри <7.8>: "))
(if (not hgt2)(setq hgt2 7.8))
  
(initget 6)
(setq dia (getdist "\n даметр отверстия <4.1>: "))
(if (not dia)(setq dia 4.1))
  
(initget 6)
(setq hgt3 (getdist "\n Высота оставшейся части <8>: "))
(if (not hgt3)(setq hgt3 8))

(setq p1 (list (- (car p0) wid1)(cadr p0)))

(setq p2 (list (car p1)(+ (cadr p1) hgt1)))
      
(setq p3 (list (+ (car p1)(- wid2 thk))(cadr p2)))
       
(setq p4 (list (car p3)(+ (cadr p3) hgt2)))
      
(setq p5 (list (+ (car p4) thk) (cadr p4)))

(setq p6 (list (car p5)(- (cadr p3) thk)))

(setq p7 (list (+ (car p2)thk) (cadr p6) ))

(setq p8 (list (car p7) (+ (cadr p0) thk)))

(setq p9 (list (car p0) (cadr p8) ))
  
(setq op (list (/ (+ (car p2)(car p7)) 2.)(/ (+ (cadr p2)(cadr p7)) 2.)));<--точка указания области штриховки

(setq pd1 (list (- (car p2) 15)(cadr p2)));<-- точка позиционирования размерной линии (только для одного размера-остальные сам)
  
(command "_zoom" "_W" p1 p5);<-- для создания штриховки командой обязательно чтобы границы ее были полностью видны на экране

(command "_pline" "_non" p0 "_non"  p1 "_non" p2 "_non"  p3 "_non" p4 "_non"  p5 "_non"  p6 "_non"  p7 "_non" p8 "_non"  p9 "_non"   "_CL");<-- "_non" для отключения привязок, "_CL"-замкнутая 

(setq en (entlast))
      
(command "-hatch" "_P" "ANSI37" "20" "0" "_A" "_B" "N" en "" "" "_non" op "")
      
(command "_dimlinear" p1 p2 pd1);<-- размер слева

(setq p1  (list (car p4)(+ (cadr p4) dia)))
  
  
(setq p2 (list  (+ (car p1)thk) (+ (cadr p1) hgt3)))
  
(setq op (list (/ (+ (car p1)(cadr p1)) 2.)(/ (+ (car p2)(cadr p2)) 2.)));<--точка указания области штриховки
  
(command "_zoom" "_W" p1 p5)
  
(command "_rectang" p1 p2)

  (setq en (entlast))

  (command "_zoom" "_W" p1 p2);<-- для создания штриховки командой обязательно чтобы границы ее были полностью видны на экране

  (command "_zoom" ".9X" );<-- масштаб зуммирования 0.9


 (command "-hatch" "_P" "ANSI37" "20" "0.0" "_S" en "" "" "_non" op "")

  (command "_zoom" "_W" p0 p1)

 (command "_zoom" ".7X" )

(princ)
      
)
(prompt "\n\t\t   ***   *Для старта ввести DETAL*   ***")

(prin1)

Последний раз редактировалось Кулик Алексей aka kpblc, 26.12.2010 в 17:22.
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 26.12.2010, 17:12
#10
void2005

Инженегр-констбезруктор
 
Регистрация: 12.11.2010
Красноярск
Сообщений: 61


Класс!!! маленько не то что хотелось, но мелочи постaраюсь додумать сам. Вот только со вставкой блоков не понятно..?
void2005 вне форума  
 
Непрочитано 26.12.2010, 19:08
#11
Олег (jr.)

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


Цитата:
Сообщение от void2005 Посмотреть сообщение
Класс!!! маленько не то что хотелось, но мелочи постaраюсь додумать сам. Вот только со вставкой блоков не понятно..?
Потому что ты не сказал какие блоки?
С атрибутами или без?
Команда для вставки одна, но далее могут быть дополнения
в смысле изменения значений атрибутов
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 27.12.2010, 04:23
#12
void2005

Инженегр-констбезруктор
 
Регистрация: 12.11.2010
Красноярск
Сообщений: 61


Цитата:
Сообщение от Олег (jr.) Посмотреть сообщение
Потому что ты не сказал какие блоки?
С атрибутами или без?
Команда для вставки одна, но далее могут быть дополнения
в смысле изменения значений атрибутов
пытаюсь воткнуть блок в точку р8, не встает! Где ошибка?
(command "_.insert" "C:/macro/GORblocks/salazniz.dwg" "p8" "1" "1" "0")

Последний раз редактировалось void2005, 27.12.2010 в 07:43.
void2005 вне форума  
 
Непрочитано 27.12.2010, 09:03
#13
Олег (jr.)

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


Цитата:
Сообщение от void2005 Посмотреть сообщение
пытаюсь воткнуть блок в точку р8, не встает! Где ошибка?
(command "_.insert" "C:/macro/GORblocks/salazniz.dwg" "p8" "1" "1" "0")
Во-первых p8 это переменная а не строка
Во-вторых синтаксис расписан в справке:
Код:
[Выделить все]
(command "_.-insert" "имя блока которое ты будешь использовать для вставляемого из чертежа=C:/macro/GORblocks/salazniz.dwg" p8 "1.0" "1.0" "0.0")
т.е. в твоем случае:

В третьих перед вставкой блока неплохо заблокировать окно атрибутов:
Код:
[Выделить все]
(setvar 'attreq 0)
а после вставки блока вернуть его нормальный статус
Код:
[Выделить все]
(setvar 'attreq 1)
Неплохо проверять наличие блока в базе данных перед вставкой и после нее с помощью функции tblsearch
и уже после прописываить вызов команды insert:
Код:
[Выделить все]
(if (not (tblsearch "blocks" "salazniz"))
  (progn
  (princ "\nБлок вставляется из другого документа")
(command "_.insert" "salazniz=C:/macro/GORblocks/salazniz.dwg" p8 "1" "1" "0");<--если блока salazniz пока еще не существует
  )
  (progn
    (princ "\nБлок уже в документе вставляем его из коллекции блоков данного документа")
(command "_.insert" "salazniz=" p8 "1" "1" "0");<--когда блок уже появился в списке
)
  )
Вообще-то проверка и откат должны быть более совершенными (см. на форуме или в Google: error handling AutoLisp)
Но по минимуму этого достаточно
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 27.12.2010, 09:16
#14
void2005

Инженегр-констбезруктор
 
Регистрация: 12.11.2010
Красноярск
Сообщений: 61


Вроде работает

Код:
[Выделить все]
 
 
(defun C:kassgor(/ dia en hgt1 hgt2 hgt3 op p0 p1 p2 p3 p4 p5 p6 p7 p8 p9 pd1 thk wid1 wid2)
 
(setq p0 (getpoint "\nТочка вставки: "))
(initget 6);<-- запрет ввода нуля и отрицательного значения, возможность ввода по умолчанию(по Enter)
(setq thk (getdist "\n Толщина кассеты <4>: "))
(if (not thk)(setq thk 4.0))
 
(initget 6)
;(setq wid1 (getdist "\n Ширина снаружи внизу <29>: "))
(if (not wid1)(setq wid1 29.0))
 
(setq hgt1 nil)
;;;Пример ввода значений строго в дипазоне 200-2000
(while
;;;начало блока условий
(not
(and
(or
(initget 7);<-- запрет ввода нуля, отрицательного значения и о ввода по умолчанию (по Enter)
(setq hgt1 (getdist "\n Высота кассеты (200-2000): ")))
(>= 2000 hgt1 200))
);<-- _конец блока условий ввода
(alert "значение строго в дипазоне 200-2000")
)
(initget 6)
;(setq wid2 (getdist "\n Ширина снаружи вверху <39>: "))
(if (not wid2)(setq wid2 39.0))
 
(initget 6)
;(setq hgt2 (getdist "\n Высота изгиба изнутри <7.8>: "))
(if (not hgt2)(setq hgt2 7.8))
 
(initget 6)
;(setq dia (getdist "\n даметр отверстия <4.35>: "))
(if (not dia)(setq dia 4.35))
 
(initget 6)
;(setq hgt3 (getdist "\n Высота оставшейся части <8>: "))
(if (not hgt3)(setq hgt3 7.75))
 
(setq p1 (list (- (car p0) wid1)(cadr p0)))
 
(setq p2 (list (car p1)(+ (cadr p1) hgt1)))
 
(setq p3 (list (+ (car p1)(- wid2 thk))(cadr p2)))
 
(setq p4 (list (car p3)(+ (cadr p3) hgt2)))
 
(setq p5 (list (+ (car p4) thk) (cadr p4)))
 
(setq p6 (list (car p5)(- (cadr p3) thk)))
 
(setq p7 (list (+ (car p2)thk) (cadr p6) ))
 
(setq p8 (list (car p7) (+ (cadr p0) thk)))
 
(setq p9 (list (car p0) (cadr p8) ))
 
(setq op (list (/ (+ (car p2)(car p7)) 2.)(/ (+ (cadr p2)(cadr p7)) 2.)));<--точка указания области штриховки
 
(setq pd1 (list (- (car p2) 15)(cadr p2)));<-- точка позиционирования размерной линии (только для одного размера-остальные сам)
 
(command "_zoom" "_W" p1 p5);<-- для создания штриховки командой обязательно чтобы границы ее были полностью видны на экране
 
(command "_pline" "_non" p0 "_non" p1 "_non" p2 "_non" p3 "_non" p4 "_non" p5 "_non" p6 "_non" p7 "_non" p8 "_non" p9 "_non" "_CL");<-- "_non" для отключения привязок, "_CL"-замкнутая 
 
(setq en (entlast))
 
(command "_-layer" "_n" "shtrich" "_c" "3" "shtrich" "_s" "shtrich" "")
 
(command "-hatch" "_P" "ANSI37" "10" "0" "_A" "_B" "N" en "" "" "_non" op "")
 
(command "_-layer" "_s" "0" "") 
 
;(command "_dimlinear" p1 p2 pd1);<-- размер слева
 
(setq p1 (list (car p4)(+ (cadr p4) dia)))
 
 
(setq p2 (list (+ (car p1)thk) (+ (cadr p1) hgt3)))
 
(setq op (list (/ (+ (car p1)(cadr p1)) 2.)(/ (+ (car p2)(cadr p2)) 2.)));<--точка указания области штриховки
 
(command "_zoom" "_W" p1 p5)
 
(command "_rectang" p1 p2)
 
(setq en (entlast))
 
(command "_zoom" "_W" p1 p2);<-- для создания штриховки командой обязательно чтобы границы ее были полностью видны на экране
 
(command "_zoom" ".9X" );<-- масштаб зуммирования 0.9
 
(command "_-layer" "_n" "shtrich" "_c" "3" "shtrich" "_s" "shtrich" "")
 
(command "-hatch" "_P" "ANSI37" "10" "0.0" "_S" en "" "" "_non" op "")
 
(command "_zoom" "_W" p0 p1)
 
(command "_zoom" ".7X" )
 
(command "_-layer" "_s" "0" "")
 
(command "_-Insert" "*C:/macro/GORblocks/salazniz.dwg" "_non" p8 "1" "0")
 
(command "_-Insert" "*C:/macro/GORblocks/salazverh.dwg" "_non" p7 "1" "0")
 
(princ)
 
)
(prompt "\n\t\t *** *Для старта ввести kassgor* ***")
 
(prin1)
Вопрос такой, почемуто блок не всегда встает в масштабе, бывает выскакивает больше в 2.5раза

Последний раз редактировалось void2005, 27.12.2010 в 09:46.
void2005 вне форума  
 
Непрочитано 27.12.2010, 09:33
#15
Лиспер


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


void2005, ты хоть тэг закрой... Читать невозможно!
Цитата:
Сообщение от void2005 Посмотреть сообщение
почемуто блок не всегда встает в масштабе, бывает васкакивает больше в 2.5раза
Проверяй единицы блока.
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 27.12.2010, 10:27
#16
Олег (jr.)

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


Выделяй код в окне сообщений и потом нажми кнопку # в меню окна сообщений!
Добавь в программу локальную функцию:
Код:
[Выделить все]
;set block scale uniformly to given value
(defun put-scale-all  (blk scale)
  (and (eq (type blk) 'ENAME)
       (setq elist (entget blk))
       (eq "INSERT"(cdr (assoc 0 elist)))
	   (setq elist (subst (cons 41 scale) (assoc 41 elist) elist)
		 elist (subst (cons 42 scale) (assoc 42 elist) elist)
		 elist (subst (cons 43 scale) (assoc 43 elist) elist)
		 )
	   (entmod elist)
	   (entupd blk)
	   )
       )
и сразу после вставки блока добавляй такую строку:
Код:
[Выделить все]
(put-scale-all (entlast) 1.0)
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 28.12.2010, 09:40
#17
void2005

Инженегр-констбезруктор
 
Регистрация: 12.11.2010
Красноярск
Сообщений: 61


Огромное спасибо ВСЕМ за содействие!!!

Последний раз редактировалось void2005, 28.12.2010 в 10:10.
void2005 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Помощь с лиспом не могу победить полилинию

Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужна помощь. не могу найти параметры профайлера SergeySV Другие CAD системы 1 28.07.2009 12:48
Нужна помощь Не могу открыть файл AutoCAD 2006 Костяныч AutoCAD 14 05.10.2007 18:15