如何用lisp画出这样的楼梯呢?已解决【感谢zhynt大侠相助】
本帖最后由 qcw911 于 2011-8-2 14:15 编辑大家好,我们公司经常画这样的平面图
红色线就是要花的东西
黄色线为画图的范围
绿色线未标注方向
要求1:倾斜的红线各个角度为30度
2:楼梯登有固定的距离(有可能多有可能少)
如何才能画出这个黄色区域
里面的红色线和绿色线就自动出来了呢?
用lisp编写
都是大神太厉害了 牛啊,这个------- 自己顶 这个题目可不是看上去这么简单啊。大家可有什么好的思路?
我是这样想的,选择围合边线(黄色的线)根据层高和给出的踏步高计算步数,中间的扇形踏步是固定的。 回复 zhynt 的帖子
是的,但是这个仅仅是 平面图就行了,踏步个数(踏步宽一定)能算出来更好,太麻烦直接给出上踏步和下踏步数也行。 初稿:
作图说明:
回复 zhynt 的帖子
太感谢了!
我马上看 回复 zhynt 的帖子
指引的箭头能加在里面吗?
DN的那样(如图) 不是说了吗,是初稿而已,先让你看看,这样行不行。 回复 zhynt 的帖子
已经非常接近了不愧为大师
我改了红色部分
希望圆弧的地方为方块
但是倾斜踏的好像还是按照原来的那个圆弧截止的
怎么办呢?
还有就是不想用stair这个层
随层就可以
(defun err (s)
(if (and (/= s "console break")
(/= s "Function cancelled")
(/= s "quit/exit abort")
)
(progn (setvar "osmode" oldos)
(setvar "cmdecho" oldcmd)
(setq *error* olderr)
(command "UNDO" "E")
(princ (strcat "\n错误弹出:" s))
)
)
)
(defun make_line (lay pts pte)
(entmake (list '(0 . "LINE")
(cons 8 lay)
(cons 10 pts)
(cons 11 pte)
)
)
(setq en (entlast))
(setq ss (ssadd en ss))
)
(defun make_line2 (lay pt ang)
(setq pts (polar pt (+ s_ang ang) (/ gap 2))
pte (polar pts (+ s_ang ang) dist)
)
(make_line lay pts pte)
(setq en (entlast))
(setq ss (ssadd en ss))
)
(defun make_arc (lay cen Radius angs ange)
(entmake (list '(0 . "ARC")
(cons 8 lay)
(cons 10 cen)
(cons 40 Radius)
(cons 50 angs)
(cons 51 ange)
)
)
(setq en (entlast))
(setq ss (ssadd en ss))
)
(defun dtor (ang) (/ (* ang PI) 180))
;;;;
;;;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;;;;
(defun c:ltpm ()
(command "undo" "BE")
(setq oldos (getvar "osmode")
oldcmd (getvar "cmdecho")
oldlay (getvar "CLAYER")
olderr *error*
*error* err
)
(setvar "cmdecho" 0)
(if (= (TBLOBJNAME "LAYER" "Stair") nil)
(command "layer" "m" "Stair" "c" "4" "" "")
)
(setvar "clayer" oldlay)
(setq ss (ssadd))
(setq pta (getpoint "\n插入点:"))
(setq ptb (getpoint pta "\n楼梯宽度及角度:"))
(setq Stair_width (distance pta ptb))
(setq s_ang (angle pta ptb))
(setq pt (polar pta
(+ s_ang (dtor 315))
(* 0.5 Stair_width (sqrt 2))
)
)
(if (< oldos 16384)
(setvar "osmode" (+ oldos 16384))
)
(setq Bench_width (getreal "\n楼梯段宽度:<880>"))
(if (= Bench_width nil)
(setq Bench_width 880.0)
)
(while (> (- Bench_width (/ Stair_width 2.0)) 0)
(setq Bench_width (getreal "\n从新输入:"))
)
(setq Stepping_width (getreal "\n如踏宽度200>"))
(if (= Stepping_width nil)
(setq Stepping_width 200.0)
)
(setq Bench_UP (getint "\n上梯段数:<2>"))
(if (= Bench_UP nil)
(setq Bench_UP 2)
)
(setq Bench_DN (getint "\n下梯段数:<4>"))
(if (= Bench_DN nil)
(setq Bench_DN 4)
)
(setq Gap (- Stair_width (* Bench_width 2))) ;(if (/= gap 0)
(progn (setq pt1 (polar pts_ang (/ gap 2))
pt2 (polar pt (+ s_angpi) (/ gap 2))
)
;;; (make_arc "Stair" pt (/ gap 2) s_ang (+ s_ang pi))
(setq pt11 (polar pt(+ s_ang(/ pi 4)) (*(sqrt 2) (/ gap 2)));;;;;;;;qiuw1
pt12 (polar pt (+ s_ang(* 3 (/ pi 4))) (*(sqrt 2) (/ gap 2)));;;;;;;;qiuw1
)
(make_line "Stair" pt11 pt12);qiuw1
(setq pt3 (polar pt1 (+ s_ang (* 1.5 pi)) (* Bench_DN Stepping_width))
pt4 (polar pt2 (+ s_ang (* 1.5 pi)) (* Bench_up Stepping_width))
)
(make_line "Stair" pt11 pt3)
(make_line "Stair" pt12 pt4)
(make_line "Stair" pt1 (polar pt1 s_ang Bench_width))
(make_line "Stair" pt2 (polar pt2 (+ s_ang pi) Bench_width))
(setq n 0)
(repeat Bench_DN
(setq pt5 (polar pt3 (+ s_ang (* 0.5 pi)) (* n Stepping_width))
pt6 (polar pt5 s_ang Bench_width)
)
(make_line "Stair" pt5 pt6)
(setq n (1+ n))
)
(setq n 0)
(repeat Bench_up
(setq pt5 (polar pt4 (+ s_ang (* 0.5 pi)) (* n Stepping_width))
pt6 (polar pt5 (+ s_ang pi) Bench_width)
)
(make_line "Stair" pt5 pt6)
(setq n (1+ n))
)
(setq dist (- (/ (+ Bench_width (/ gap 2)) (cos (dtor 30))) (/ gap 2)))
(make_line2 "Stair" pt (dtor 30))
(make_line2 "Stair" pt (dtor 60))
(make_line2 "Stair" pt (dtor 120))
(make_line2 "Stair" pt (dtor 150))
(setq pt5 (polar pt (+ s_ang (dtor 90)) (/ gap 2))
pt6 (polar pt5 (+ s_ang (dtor 90)) Bench_width)
)
(make_line "Stair" pt5 pt6)
;;; (command "_.group" "" "*" "" ss "")
)
;)
(setvar "osmode" oldos)
(setvar "cmdecho" oldcmd)
(command "UNDO" "E")
(princ)
)
晚上再改。
页:
[1]
2