明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2843|回复: 12

[提问] 不知道错在哪里?求指正完善

[复制链接]
发表于 2013-8-24 02:46:59 | 显示全部楼层 |阅读模式
本帖最后由 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)
  )
)
发表于 2013-8-24 08:04:25 | 显示全部楼层
简单看了一下,有几点需要改进的:
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转换一下。




发表于 2013-8-24 08:18:32 | 显示全部楼层
6.递归调用怎么无出口? (progn (b1::out) (c:tt))   ;执行完毕回主程序,形成循环
发表于 2013-8-24 08:44:52 | 显示全部楼层
ZZXXQQ 发表于 2013-8-24 08:18
6.递归调用怎么无出口? (progn (b1::out) (c:tt))   ;执行完毕回主程序,形成循环

他是想不断循环,这是新手常用的手段。
在提示设置参数一句增加一个退出选项X就行了,cond段增加((=n "X") nil)就行。
发表于 2013-8-24 09:19:22 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
 楼主| 发表于 2013-8-24 11:43:56 | 显示全部楼层
ll_j 发表于 2013-8-24 08:04
简单看了一下,有几点需要改进的:
1. (setq n (getint "\n [参数设置(S)]: "))和 (setq e1 (entget (car  ...

第一点我不知道怎么下手,后面的改正了,初步能运行了,钢筋面积保留位数那个后面在研究下你的那个,还有 我加了((= n "X") nil) ,输入X的时候提示“需要正的非零整数 或选项关键字。”
还有前面说的两个判断完全不知道怎么下手,求解啊
 楼主| 发表于 2013-8-24 11:45:44 | 显示全部楼层
ZZXXQQ 发表于 2013-8-24 08:18
6.递归调用怎么无出口? (progn (b1::out) (c:tt))   ;执行完毕回主程序,形成循环

我是菜鸟啊,工作后自己用业余时间学了点LISP,大学那会读土木去了,就学过VF,囧,帮我看看前面两个判断咋整吧 哪里有问题的帮我完善下吧 不胜感激
 楼主| 发表于 2013-8-24 11:47:54 | 显示全部楼层
500w008 发表于 2013-8-24 09:19
要实现什么功能 付个图

其实就是个计算面积的过程,我也不知道怎么附图,前面的判断不知道咋弄
发表于 2013-8-24 13:31:57 | 显示全部楼层
fjutcivil 发表于 2013-8-24 11:43
第一点我不知道怎么下手,后面的改正了,初步能运行了,钢筋面积保留位数那个后面在研究下你的那个,还有 ...

第一个问题这样:
  1. (defun c:tt (/ c)    ;虽然纯数字可以作为命令名,但不建议使用
  2.   (if (not b0_a)     ;预设a、b,对于全局变量,建议使用稍复杂的变量名,子函数也同
  3.     (setq b0_a 14)
  4.   )
  5.   (if (not b0_b)
  6.     (setq b0_b 200.0)      ;实数
  7.   )
  8.   (initget "S X")   ;非零非负
  9.   (setq n (entsel "\n选择欲替换的文字 或 [参数设置(S)/退出(X)]<X>: "))
  10.   (cond
  11.     ((= n "S")      ;关键字
  12.      (b0::s)        ;调用参数设置子函数
  13.      (c:tt)         ;设置完毕回主程序
  14.     )
  15.     ((or (= n "X") (= n nil)) nil)
  16.     (t              ;其它情况——正常输入
  17.        (progn (b1::out) (c:tt))   ;执行完毕回主程序,形成循环
  18.     )
  19.   )
  20.   (princ)
  21. )
 楼主| 发表于 2013-8-24 13:41:53 | 显示全部楼层
ll_j 发表于 2013-8-24 13:31
第一个问题这样:

换颜色那个呢?大侠
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-26 09:30 , Processed in 0.195593 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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