明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1534|回复: 5

[讨论]为活跃论坛气氛,看看如下代码有什么错误!

[复制链接]
发表于 2005-5-4 19:47:00 | 显示全部楼层 |阅读模式
;绘制三维管线的程序 (defun pipe3d(/ rad r n)
(setvar "blipmode" 0)
(setvar "cmdecho" 0)
(initget 1)
(alert "\nAutoCAD三维管线绘制程序")
(write-line "请输入管线数据")
(while(< n 2)
(setq n (getint "\n 转弯处的数目(包括两端)(n>=2):"))
)
(setq rad (/ (getreal "\n 管子的直径:") 2))
(if ( > n 2)
(while (< r rad)
(setq r(getreal "\n 弯曲半径:"))
)
)
;以上代码提示用户输入的命令 (setq m 0)
(setq pontok ())
(while (< m n)
(setq m (1+m))
(setq adatbe (strcat "\n" (itoa) ".?转折点[x,y,z]: "))
(setq pt (getpoint adatbe))
(setq pontok (cons pt pontok))
)
;用户在系统提示下输入包括两端点在内的转折点,n为端点的个数,m为系统得到的点的个数,端点的坐标放在pontok()中 (setq m (1-m))
(setq cen1 (nth m pontok))
(while (> m 0)
(setq cen2 (nth (- m 1) pontok))
(setq x1 (nth 0 cen1))
(setq y1 (nth 1 cen1))
(setq z1 (nth 2 cen1))
(setq x2 (nth 0 cen1))
(setq y2 (nth 1 cen1))
(setq z2 (nth 2 cen1))
(setq alfa1 (atan (- y2 y1 ) (- x2 x1)))
(setq beta1 (sqrt (+ (* (-x2 x1) (- x2 x1)) (* (- y2 y1) (- y2 y1)))))
(setq beta1 (atan beta1 (- z2 z1)))
(setq apt cen2)
(if (> m 1)
(progn
(setq cen3 (nth (- m 2) pontok)) ;cen3 为第三个端点的坐标
(setq x3 (nth 0 cen3))
(setq y3 (nth 1 cen3))
(setq z3 (nth 2 cen3))
(setq alfa2 (atan (- y2 y3) (- x2 x3)))
(setq beta2 (sqrt (+ (* (-x2 x3) (- x2 x3)) (* (- y2 y3) (- y2 y3)))))
(setq beta2 (atan beta2 (- z2 z3)))
(setq a (sqrt (+(* (- x2 x1) (- x2 x1)) (* (- y2 y1) (- y2 y1)) (* (- z2 z1) (- z2 z1)) )))
(setq b (sqrt (+(* (- x3 x2) (- x3 x2)) (* (- y3 y2) (- y3 y2)) (* (- z3 z2) (- z3 z2)) )))
(setq c (sqrt (+(* (- x3 x1) (- x3 x1)) (* (- y3 y1) (- y3 y1)) (* (- z3 z1) (- z3 z1)) )))
(setq cgamma (/ (- (+ (* a a) (* b b)) (* c c)) (* 2 a b)))
(if (= cgamma 0)
(setq gamma (/ pi 2))
(progn
(setq tgamma (sqrt (1- (/ 1 (* cgamma cgamma)))))
(setq gamma (atan tgamma))
)
);第一个if结束 (if (> cgamma 0)
(setq gamma (- pi gamma))
);第二个if结束
(setq h (cos (/ gamma 2)))
(setq h (* (sqrt (1- (/ 1 (* h h)))) r))
(setq dz1 (* (cos beta1) h))
(setq dy1 (* (sin beta1) h (sin alfa1)))
(setq dx1 (* (sin beta1) h (cos alfa1)))
(setq za (- z2 dz1))
(setq ya (- y2 dy1))
(setq xa (- x2 dx1))
(setq apt (list xa ya za)) ;得到第一个转折点坐标 (setq dz2 (* (cos beta2) h))
(setq dy2 (* (sin beta2) h (sin alfa2)))
(setq dx2 (* (sin beta2) h (cos alfa2)))
(setq zb (- z2 dz2))
(setq yb (- y2 dy2))
(setq xb (- x2 dx2))
(setq bpt (list xb yb zb)) ;得到第二个转折点坐标 (setq xc (/ (+ xa xb) 2))
(setq yc (/ (+ ya yb) 2))
(setq zc (/ (+ za zb) 2))
(setq alfac (atan (- yc y2) (- xc x2)))
(setq betac (sprt (+ (* (- xc x2) (- xc x2)) (* (- yc y2) (- yc y2)))))
(setq betac (atan betac (- zc z2)))
(setq l (sqrt (+ (* r r) (* h h))))
(setq dz (* (cos betac) l))
(setq dy (* (sin betac) l (sin alfac)))
(setq dx (* (sin betac) l (cos alfac)))
(setq z (+ z2 dz))
(setq y (+ y2 dy))
(setq x (+ y2 dx))
(setq cen (list x y z)) ;得到曲面网格的曲率中心cen
(setq gamma (atof (angtos gamma 0 1))) ;得到旋转角
)
) (setq alfa1 (atof (angtos alfa1 0 1)))
(setq beta1 (atof (angtos beta1 0 1)))
(setq numseg 36)
(setvar "surftab1" numseg) ;设置网格的直纹密度
(command "_.ucs" "_z" alfa1)
(command "_.ucs" "_y" beta1) ;转换视口
(setq cen1 (trans cen1 0 1))
(setq apt (trans apt 0 1))
(command "_.circle" cen1 rad) ;在cen1点处做一个圆
(setq e1 (entlast))
(command "_.circle" apt rad) ;在cen2点处做一个圆
(setq e1 (entlast))
(command "_.rulesurf" (list e1 cen1) (list e2 apt)) ;创建直纹网格
(entdel e1)
(if (> m 1)
(pron
(setq sz (fix (/ gamma 10)))
(if (= sz 0) (setq sz 1))
(setq numseg1 sz)
(setq "surftab1" numseg1)
(setq "surftab2" numseg)
(setq bpt (trans bpt 0 1))
(setq cen (trans cen 0 1))
(setq hrad (- r rad))
(setq tcen (list (+ (+ (car cen) rad) hrad) (cadr cen) (caddr cen)))
(setq a (- (cadr cen) (cadr apt)))
(setq b (- (car cen) (car apt)))
(setq ax (list (+ (car cen) a) (- cadr cen) b) (caddr cen)))
(command "_.revsurf" (list e2 tcen) (list e1 ax) "" gamma) ;创建曲面网格
(entdel e1)
(entdel e2)
(setq bpt (trans bpt 1 0))
(command "_.ucs" "_w")
(setq cen1 bpt)
)
(pron
(command "_.ucs" "_w')
(entdel e2)
)
)
(setq m (1-m))
)
发表于 2005-5-4 21:29:00 | 显示全部楼层
(defun pipe3d(/ rad r n)改成(defun C:PIPE3D (/ rad r n)
发表于 2005-5-4 22:47:00 | 显示全部楼层
1.(while (< n 2)
(setq n (getint "\n 转弯处的数目(包括两端)(n>=2):"))
);这个就规定了n是要>=2
然后又写到(if (> n 2)
(while (< r rad)
(setq r (getreal "\n 弯曲半径:"))
)
);问题:当n=2的时候呢???? 2.(setq m (1+m));类似这样的好象该写成(setq m (1+ m))吧,1+和m间是有空格的吧 3.(setq adatbe (strcat "\n" (itoa) ".?转折点[x,y,z]: "));这句中的(itoa)漏了参数了吧 4.程序靠后的部分: (if (> m 1)
(pron
(setq sz (fix (/ gamma 10)))
.......................... (command "_.ucs" "_w")
(setq cen1 bpt)
);参数过多 5.最后的(command "_.ucs" "_w')
应该是(command "_.ucs" "_w");注意是双引号
 楼主| 发表于 2005-5-9 23:01:00 | 显示全部楼层
(if (> m 1)
(pron
(setq sz (fix (/ gamma 10)))
.......................... (command "_.ucs" "_w")
(setq cen1 bpt)
);参数过多 我也调试出来了,可是具体什么命令出错呢?
发表于 2005-5-10 17:51:00 | 显示全部楼层
1、"surftab1"不是变量。 (setq "surftab1" numseg1)
(setq "surftab2" numseg) 2、赋值方式不对,如同(setq a b c) (setq ax
(list
(+ (car cen) a)
(- cadr cen)
b
) ;_ 结束list
(caddr cen)
) ;_ 结束setq 3、if 函数中第一个progn的结束位置不对。如同: (if t a b c )
 楼主| 发表于 2005-5-12 11:20:00 | 显示全部楼层
呵呵,我已经调试差不多了,过两天把正确的发上来!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-17 06:53 , Processed in 0.180232 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表