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

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

Офисная перегородка. Хочу написать Лисп, рисующий вид сбоку.

Ответ
Поиск в этой теме
Непрочитано 09.09.2008, 11:38 #1
Офисная перегородка. Хочу написать Лисп, рисующий вид сбоку.
welldone
 
Конструктор
 
Москва
Регистрация: 09.07.2008
Сообщений: 15

Доброго всем времени суток.
Я хочу написать лисп, который будет рисовать офисную перегородку. Перегородка состоит из вертикальных и горизонтальных пересекающихся стоек алюминиевого профиля и заполнения между ними(стекло, ДСтП, гипсокартон и т.п.)
В Автокаде мне нужно получить условное обозначение офисной перегородки. Это большой прямоугольник с высотой «A» и длиной «B». Шириной стойки «LL».
Эту задачу мне частично, вроде бы, удалось решить(см код ниже).
Код:
[Выделить все]
(defun c:wall2 (/ a b p x1 y1 x2 y2 LL x11 x12 y11)
	(initget 7)
	(setq a (getdist "\Введите длину перегородки:"))
	(initget 7)
	(setq b (getdist "\Введите высоту перегородки:"))
        (initget 7)
        (setq LL (getdist "\Введите ширину стойки:"))
	(setq p (getpoint "\Укажите точку вставки:<по умолчанию (0,0)>"))
	(if (null p) (setq p (quote (0 0 0)))
	)
	(setq x1 (car p))
	(setq y1 (car (cdr p)))
	(setq x2 (+ (car p) a))
	(setq y2 (+ (car (cdr p)) b))
        (setq x11 (+ (car p) LL))
        (setq x12 (+ (car p) (- a LL)))
        (setq y11 (+ (car (cdr p)) LL))
        (setq y12 (+ (car p) (- b LL)))
	(command "._pline"
		(list x1 y1)
		(list x1 y2)
		(list x2 y2)
		(list X2 y1)
		"_close"
        )
        (command "._pline"
		(list x1 y1)
		(list x1 y2)
		(list x11 y2)
		(list x11 y1)
		"_close"
        )
        (command "._pline"
		(list x12 y1)
		(list x12 y2)
		(list x2 y2)
		(list x2 y1)
		"_close"
	)
        (command "._pline"
		(list x1 y11)
		(list x2 y11)
                "_close"
	)
          (command "._pline"
		(list x1 y12)
		(list x2 y12)
                "_close"
	)
)
Но лисп срабатывает всего один раз, и то в новом файле – когда я призываю его нарисовать вторую перегородку, он честно запрашивает высоту и длину перегородки, ширину стойки, а потом выдаёт только квадрат…

Далее, я хочу поделить этот прямоугольник, стойками (прямоугольниками с шириной LL) на равные части по вертикали и горизонтали.
Что то вроде этого:
(setq goriz (getdist "На сколько равных частей делим перегородку по длине?"))
И
(setq vertical (getdist "На сколько равных частей делим перегородку по высоте?"))
, только вот не знаю как это реализовать в лиспе.

PS Заранее спасибо тем, кто найдёт время помочь.
Просмотров: 3345
 
Непрочитано 09.09.2008, 12:04
#2
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


При рисовании командным способом, надо выключать привязки на момент рисования. Скорее всего причина в этом.

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

Последний раз редактировалось Alaspher, 09.09.2008 в 12:10.
Alaspher вне форума  
 
Непрочитано 09.09.2008, 13:12
#3
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


welldone, По поводу OSMODE (Грабли №1) почитай посты со 167 по 241. Найдешь много для себя полезного.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 09.09.2008, 17:00
#4
welldone

Конструктор
 
Регистрация: 09.07.2008
Москва
Сообщений: 15


Alaspher , геометрию я уже расчитал, даже на листе в клеточку разрисовал, только с Лиспом я на "вы", поэтому пока не знаю как это реализовать в коде...

VVA, сейчас почитаю, спасибо.
welldone вне форума  
 
Автор темы   Непрочитано 17.09.2008, 12:25
#5
welldone

Конструктор
 
Регистрация: 09.07.2008
Москва
Сообщений: 15


C привязками разобрался, а вот как поделить свой прямоугольник, на равные части-нет.
Я понимаю, что нужно использовать "_array" либо "vla-arrayrectangular", но как их прикрутить с своему коду(так чтоб работало) не соображу
Сейчас код выглядит так:
Код:
[Выделить все]
 (defun c:wall2 (/ a b p x1 y1 x2 y2 LL x11 x12 y11)
(setq old_osmode (getvar "osmode"))
(setvar "osmode" 0)

	(initget 7)
	(setq a (getdist "\Введите длину перегородки:"))
	(initget 7)
	(setq b (getdist "\Введите высоту перегородки:"))
        (initget 7)
        (setq LL (getdist "\Введите ширину стойки:"))
	(setq p (getpoint "\Укажите точку вставки:<по умолчанию (0,0)>"))
	(if (null p) (setq p (quote (0 0 0)))
	)
	(setq x1 (car p))
	(setq y1 (car (cdr p)))
	(setq x2 (+ (car p) a))
	(setq y2 (+ (car (cdr p)) b))
        (setq x11 (+ (car p) LL))
        (setq x12 (+ (car p) (- a LL)))
        (setq y11 (+ (car (cdr p)) LL))
        (setq y12 (+ (car (cdr p)) (- b ll)))
	(command "._pline"
		(list x1 y1)
		(list x1 y2)
		(list x2 y2)
		(list X2 y1)
		"_close"
        )
        (command "._pline"
		(list x1 y1)
		(list x1 y2)
		(list x11 y2)
		(list x11 y1)
		"_close"
        )
        (command "._pline"
		(list x12 y1)
		(list x12 y2)
		(list x2 y2)
		(list x2 y1)
		"_close"
	)
        (command "._pline"
		(list x1 y11)
		(list x2 y11)
                "_close"
	)
          (command "._pline"
		(list x1 y12)
		(list x2 y12)
                "_close"
	)
(setvar "osmode" old_osmode)
)
Нужно добавить пару строчек с массивом
Код:
[Выделить все]
(setq goriz (getdist "На сколько равных частей делим перегородку по длине?"))
(setq vertical (getdist "На сколько равных частей делим перегородку по высоте?"))
а потом в конце программы, в месте, перед возвращением к привязке вписать
Код:
[Выделить все]
(command "_array" [а дальше какие-то действия с переменной goriz, но я не знаю какие])
Но как это правильно сделать? Сможете помочь?
welldone вне форума  
 
Непрочитано 19.09.2008, 00:19
#6
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


Цитата:
Код:
[Выделить все]
(command "_array"
Введи в командную строку _array и _-array увидишь разницу, нельзя передавать с помощью функции command параметры в диалоговые окна.
Sleekka вне форума  
 
Автор темы   Непрочитано 22.09.2008, 13:38
#7
welldone

Конструктор
 
Регистрация: 09.07.2008
Москва
Сообщений: 15


Чего то ничего не выходить...
welldone вне форума  
 
Непрочитано 22.09.2008, 14:52
#8
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


Дык ты пиши конкретнее что не выходит, догадаться сложно.
Sleekka вне форума  
 
Автор темы   Непрочитано 22.09.2008, 17:12
#9
welldone

Конструктор
 
Регистрация: 09.07.2008
Москва
Сообщений: 15



Sleekka
я понял разницу между _array и _-array.
Но не могу написать лисп, чтоб он какой либо обьект множил...
welldone вне форума  
 
Непрочитано 22.09.2008, 19:06
#10
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


Код:
[Выделить все]
^C^C(setq os (getvar "osmode"));(setvar "osmode" 15359));_.cal;p1=cur;\;p2=cur;\;p3=cur;\;p4=cur;\;a1=ang(p1,p2,p3);'_.cal;a2=ang(p1,p3,p4);(setvar "osmode" os));_.-array;!ss;;p;!p1;;!a2;!a1;y;
Ну например вот - один из моих первых макросов.
Sleekka вне форума  
 
Автор темы   Непрочитано 30.09.2008, 11:18
#11
welldone

Конструктор
 
Регистрация: 09.07.2008
Москва
Сообщений: 15


Sleekka спасибо, но я наверное плохо формулирую чего хочу...
Вот допустим, если я имею прямоугольник(со сторонами A и B)-и хочу поделить его на N частей. Для этого мне нужно задать массив, в котором одна из сторон повторяется N раз с расстоянием (/ A N).
Как это будет правильно выглядеть в коде-я как раз и не могу сообразить...
welldone вне форума  
 
Непрочитано 30.09.2008, 16:54
#12
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


Код:
[Выделить все]
(defun C:gg (/ sl_lst)
(if (and (setq ss (ssget ))
           (setq sl_lst (car (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))))
	 )
	 (progn
	   
(command "_-array" sl_lst "" "_r" "4" "4" "34" "34")
  
	 )
	 
  )
  (princ)
  )
Для одного выбранного объекта вот так, для нескольких - я не знаю как передать много объектов в command
Sleekka вне форума  
 
Автор темы   Непрочитано 30.09.2008, 17:14
#13
welldone

Конструктор
 
Регистрация: 09.07.2008
Москва
Сообщений: 15


Sleekka , спасибо. Попробую прикрутить это к своему лиспу.
welldone вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Офисная перегородка. Хочу написать Лисп, рисующий вид сбоку.