不知道错在哪里?求指正完善
本帖最后由 fjutcivil 于 2013-8-24 11:40 编辑我想多加两个判断不知道怎么加,求大神指导,一个是如果a -b0_a0 >4(即z3开根号与b0_a0 比较大于4 开根号不知道是什么函数,囧)时最后输出采用 ( "%%132" (itoa a) "@" (/ b0_b 3)"/"(* 2 (/ b0_b 3)))即在预设的间距里面,放两根,eg预设间距200,直径14,即为18@66/133现实摆放的顺序为14 18 18 14 18 18,他们之间的间距为200/3……,控制让a - b0_a0 <=4如果无法实现时红色显示 ,如果b0_a0-a<4取a=b0_a0-4,绿色显示。还有一个判断是 z1 <0时,黄色显示,貌似挺麻烦的,求指导,求完善!!!
(defun c:tt (/ c) ;虽然纯数字可以作为命令名,但不建议使用
(if (not b0_a) ;预设a、b,对于全局变量,建议使用稍复杂的变量名,子函数也同
(setq b0_a 14)
)
(if (not b0_b)
(setq b0_b 200)
)
(initget 6 "S") ;非零非负
(setq n (getint "\n [参数设置(S)]: "))
(cond
((= n "S") ;关键字
(b0::s) ;调用参数设置子函数
(c:tt) ;设置完毕回主程序
)
((= n "X") nil)
(t ;其它情况——正常输入
(progn (b1::out) (c:tt)) ;执行完毕回主程序,形成循环
)
)
(princ)
)
(defun b1::out (/ e1 e2 a1 a2 b1 b2 z1 z2 z3 f )
(setvar "cmdecho" 0)
(setq e1 (entget (car (entsel"\n 选择欲替换的文字内容"))))
(setq e2 (entget (car (entsel" \n 选择配筋计算值:" ))))
(setq a1 (cdr (assoc 1 e1))) ;e1文字内容
(setq a2 (atof (cdr (assoc 1 e2)))) ;e2文字内容
(setq b1 (* pi (* (/ b0_a 2.0) (/ b0_a 2.0)))) ;通长筋钢筋面积
(setq b2 (* b1 (/ 1000 b0_b))) ;每延米通长筋钢筋面积
(setq z1 (- a2 b2)) ;扣除通长筋钢筋剩余面积
(setq z2 (/ z1 (/ 1000 b0_b))) ;计算钢筋面积
(setq z3 (/ (* z2 4) pi)) ;计算钢筋直径平方
(cond
((> z3 (* 18 18)) (setq a 20))
((> z3 (* 16 16)) (setq a 18))
((> z3 (* 14 14)) (setq a 16))
((> z3 (* 12 12)) (setq a 14))
((> z3 (* 10 10)) (setq a 12))
((> z3 (* 8 8)) (setq a 10))
(t (setq a 8))
)
(setq f (strcat "%%132" (itoa a) "@" (rtos b0_b)))
(setq e1 (subst (cons 1 f) (assoc 1 e1) e1 ))
(entmod e1)
(setvar "cmdecho" 1)
)
(defun b0::s (/ b0_a0 b0_b0 ) ;设置子函数
(if (not b0_a)
(setq b0_a 14)
)
(if (not b0_b)
(setq b0_b 200)
)
(initget 4) ;非零非负
(setq b0_a0 (getint (strcat "\n输入钢筋直径mm <" (itoa b0_a) "> : ")))
(if b0_a0
(setq b0_a b0_a0)
)
(setq b0_b0 (getreal (strcat "\n输入间距 <" (rtos b0_b) "> : ")))
(if b0_b0
(setq b0_b b0_b0)
)
)
简单看了一下,有几点需要改进的:
1. (setq n (getint "\n [参数设置(S)]: "))和 (setq e1 (entget (car (entsel"\n 选择欲替换的文字内容"))))可能需要合起来,否则单单前一句,用户除了输入S以为,不知道输入什么值。
2.(c:gbj) ;设置完毕回主程序,函数名错误。
3. (prompt "\n 选择配筋计算值:") (setq e2 (entget (car (nentsel )))),两句应该合并,entsel是可以带提示的。
4. (setq b1 (* pi (* (/ b0_a 2) (/ b0_a 2)))) ;通长筋钢筋面积,这里的2,都应该用2.0(实数),顺便说一句,按照钢筋的相关规范,面积的计算根据直径保留的位数不同,有点麻烦(可以看看我的网络U盘中的ca.lsp)。
5. (setq f (strcat "%%132" (itoa a) "@" b0_b)),这里的b0_b应该用rtos转换一下。
6.递归调用怎么无出口? (progn (b1::out) (c:tt)) ;执行完毕回主程序,形成循环
ZZXXQQ 发表于 2013-8-24 08:18 static/image/common/back.gif
6.递归调用怎么无出口? (progn (b1::out) (c:tt)) ;执行完毕回主程序,形成循环
他是想不断循环,这是新手常用的手段。
在提示设置参数一句增加一个退出选项X就行了,cond段增加((=n "X") nil)就行。 ll_j 发表于 2013-8-24 08:04 static/image/common/back.gif
简单看了一下,有几点需要改进的:
1. (setq n (getint "\n [参数设置(S)]: "))和 (setq e1 (entget (car...
第一点我不知道怎么下手,后面的改正了,初步能运行了,钢筋面积保留位数那个后面在研究下你的那个,还有 我加了((= n "X") nil) ,输入X的时候提示“需要正的非零整数 或选项关键字。”
还有前面说的两个判断完全不知道怎么下手,求解啊 ZZXXQQ 发表于 2013-8-24 08:18 static/image/common/back.gif
6.递归调用怎么无出口? (progn (b1::out) (c:tt)) ;执行完毕回主程序,形成循环
我是菜鸟啊,工作后自己用业余时间学了点LISP,大学那会读土木去了,就学过VF,囧,帮我看看前面两个判断咋整吧 哪里有问题的帮我完善下吧 不胜感激 500w008 发表于 2013-8-24 09:19 static/image/common/back.gif
要实现什么功能 付个图
其实就是个计算面积的过程,我也不知道怎么附图,前面的判断不知道咋弄 fjutcivil 发表于 2013-8-24 11:43 static/image/common/back.gif
第一点我不知道怎么下手,后面的改正了,初步能运行了,钢筋面积保留位数那个后面在研究下你的那个,还有 ...
第一个问题这样:
(defun c:tt (/ c) ;虽然纯数字可以作为命令名,但不建议使用
(if (not b0_a) ;预设a、b,对于全局变量,建议使用稍复杂的变量名,子函数也同
(setq b0_a 14)
)
(if (not b0_b)
(setq b0_b 200.0) ;实数
)
(initget "S X") ;非零非负
(setq n (entsel "\n选择欲替换的文字 或 [参数设置(S)/退出(X)]<X>: "))
(cond
((= n "S") ;关键字
(b0::s) ;调用参数设置子函数
(c:tt) ;设置完毕回主程序
)
((or (= n "X") (= n nil)) nil)
(t ;其它情况——正常输入
(progn (b1::out) (c:tt)) ;执行完毕回主程序,形成循环
)
)
(princ)
) ll_j 发表于 2013-8-24 13:31 static/image/common/back.gif
第一个问题这样:
换颜色那个呢?大侠
页:
[1]
2