一次CAD参数化设计的尝试(2009-05-16 20:29:04)
我已经退隐江湖多年了,要不是这些年参数化设计越来越火,我可能还懒得从书架上拿下那本积满厚厚尘土的《autolisp R13
& DCL
从入门到精通》,好多函数的用法都有点忘了,我还需要想查字典一样边翻翻边写,R13的年代,美好的回忆。
这次W同学算是被我引到沟里了,参数化迷人的外表总是那么明眸善睐,大凡没有一定自知之明的人断然无法抵挡这种诱惑。但是他掉沟里里,还是要我来拉他上来。
不过w的方案,我还是要简单解释一下的:
这是一片郁郁葱葱的水杉林,在树草土当中,有传说中的空间,
这是一棵鸟粪滋润的水杉树,在枝干叶当中,有生态里的层次;
在几十棵树当中,不同的高度,简直有无数的平台可以用来作层:
基地基本数据:
首先,必须先把树的位置定好,并因此获得可以支撑平台的点坐标X和Y;
第二,把每个树干范围(可以搭建平台的地方)用H1-H2这个范围来控制;
参数化控制思路:
第一,H1-H2范围按照输入的模数,随机选定一个高度,这个模数是H1-H2范围的细分程度;
第二,建筑需要几条平台的连廊,这个参数用来控制建筑的复杂程度;
第三,随机选择若干点进行连廊的连接,并生成空间的连线;
像掷骰子那样,随意生成空间直线的感觉,还真的很特别。
好了,以下是LSP程序,可另存为XXX.lsp文件。
用appload装载,然后在命令行:wzy
依次输入:
1.需要的连线数量
2.放置点
3.输入高度上的模数
;---------------------------------------------------------------------------------------------
(defun rnd (jd / sjlist numlist sj
i)
(setq numlist nil)
(setq i
1)
(while
(<= i jd)
(setq numlist (cons i numlist))
(setq i (+ i 1))
)
;-------------------先将组数顺序排列成表
(while
(> jd 0)
(setq sj
(fix (rem (* (rem (getvar "DATE") 1) 100000000) (length
numlist)))
)
(setq sjlist (cons (nth sj numlist)
sjlist))
(setq numlist (vl-remove (nth sj numlist)
numlist))
(setq jd (- jd 1))
)
sjlist
)
;-----------------------------------将一个list打乱顺序
(defun rndlist (jd / sjlist numlist sj i)
(while
jd
(setq sj
(fix (rem (* (rem (getvar "DATE") 1) 100000000) (length jd)))
)
(setq sjlist (cons (nth sj jd) sjlist))
(setq jd (vl-remove (nth sj jd) jd))
)
sjlist
)
(defun c:wzy(/ list1 list2 p1 p2 lnum h j k i
highth)
(command"undo" "g")
(setvar "cmdecho" 0)
(setq oldsn(getvar "osmode"))
(setvar "osmode" 0)
(alert
"\n 随机点连线命令(在命令行键入:wzy)\n\n
使用说明(步骤) \n\n
1.输入需要的连线数量\n
2.选选择放置点\n
3.输入高度上的模数\n
\n
sk5692@sina.com "
)
;==================================================
(setq lnum
(getint "\n输入需要的连线数量"))
(setq p1
(getpoint "\n选择放置点:"))
(setq highth
(getint "\n输入高度上的模数"))
;(setq rnum
(getint "\n希望生成的随机数量"))
(command
"ucs" "o" p1)
;=============以下这些点是试验用,单位mm======================================
(setq
list1 (list
'(0 0 1000
5000)
'(1000 1000 2000 6000)
'(2000 2000 1500 4500)
'(3000 1000 1000 3000)
'(1000 5000 2000 8000)
'(1000 6000 2000 6000)
'(1000 7000 2000 6000)
'(2000 8000 1500 4500)
'(3000 9000 1000 3000)
'(1000 10000 2000 8000)
'(1000 11000 2000 6000)
'(2000 1000 2000 6000)
'(3000 2000 1500 4500)
'(4000 1000 1000 3000)
'(5000 5000 2000 8000)
'(6000 6000 2000 6000)
'(7000 7000 2000 6000)
'(8000 8000 1500 4500)
'(9000 9000 1000 3000)
'(9000 10000 2000 8000)
'(11000 11000 2000 6000)
)
)
;=======================点高度确定===========================
(setq i
0)
(setq list2
nil)
(while
(< i (length list1))
(setq p1 (nth i list1))
(setq k (fix
(/ (- (nth 3 p1) (nth 2 p1)) highth)
)
)
(setq k (nth 0 (rnd k) ) )
(setq k (+ (nth 2 p1) (* highth k)))
(setq p1 (list
(nth 0 p1) (nth 1 p1) k)
)
(setq list2 (cons p1 list2))
(setq i (+ i 1))
)
;==================================================
(setq list2
(rndlist list2))
(setq h
(length list2))
(setq k
(fix
(/ lnum h))
)
(setq i (-
lnum (* k h)))
(while
(>= (length list2) 2)
(setq p1 (nth 0 list2))
(if (> (- h (length list2))
i)
(setq j (+ 1 k))
(setq j k)
)
(while (> j 0)
(setq p2 (nth j list2))
(command "line" p1 p2 "")
(setq j (- j 1))
)
(setq list2 (vl-remove p1 list2))
)
;==================================================
(command
"ucs" "p")
(setvar
"cmdecho" 1)
(setvar
"osmode" oldsn)
(command
"undo" "e")
)
(未完待续.....随课程更新ing)
加载中,请稍候...