找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: 行雲

[求助] 一个输入问题

[复制链接]
 楼主| 发表于 2017-1-25 17:17:11 | 显示全部楼层
没实现记忆功能,,,,,,
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2017-1-25 17:48:34 | 显示全部楼层

T 那段,就是上面所有都不满足的时候 进入这里处理,可以让你纠错。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2017-1-25 18:00:08 | 显示全部楼层

你仔细运行给你修改的代码了吗? 你要是自己没改,是有记忆的

看下图, 运行的时候,默认的是9, 上次输入的

QQ截图20170125175649.png
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2017-1-25 20:55:25 | 显示全部楼层
t条件测试是在cond函数中常用的,也是建议使用的,主要就是容错。
t的那段对本类情况有点复杂了,这里用(t nil)就可以了,除非initget给出特殊的要求,否则getkword无法输入关键字以外的其它字母,所以不太可能出现其它输入。
假定有其它特殊输入被接受,那么则应该转入默认的状况,也就是被记忆的状况,则需要的结果可能就不是这样了。
t还有一种用法,就是留一个分支作为其它输入不在前面测试,这种情况在一些类型的测试中会节省代码,比如多条件联合判断,使用and、or等关系表达式有时候会很绕,于是把一些相对简单的关系列出来,最终有些“说不清的”,全部交给t。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-1-25 21:04:23 | 显示全部楼层

感谢ll_j的详细解述,每次都是从原理讲起,谢谢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-1-25 21:08:55 | 显示全部楼层
这有个类似的,也没能实现记忆,不知是否与循环有关
  (if (null danjia)(setq danjia 0.02))
  (if (null qijia)(setq qijia 12.0))
  (if (null huodu)(setq huodu 25.0))
  (setq zhuanhuan (getstring "\n执行 或 设置1:"))
  (if (/= zhuanhuan "")(progn
  (setq danjia (getdist (strcat "\n单价:<" (rtos danjia) ">")))
  (if (= danjia nil) (setq danjia 0.02))
  (setq qijia (getdist (strcat "\n起价:<" (rtos qijia) ">")))
  (if (= qijia nil) (setq qijia 12.0))
  (setq huodu (getdist (strcat "\n厚度:<" (rtos huodu) ">")))
  (if (= huodu nil) (setq huodu 25.0))
   ))

  (vl-load-com)
  (setq ss (ssget '((0 . "circle,ellipse,line,*polyline,spline,arc"))))
  (if (and ss (= (type danjia) 'real) (= (type huodu) 'real) (= (type qijia) 'real))
    (progn
      (setq n 0)
      (setq zoca 0)
      (setq geshu 0)
      (setq bijazs 0)
      (repeat (sslength ss)
        (setq curve-obj (vlax-ename->vla-object (setq en (ssname ss n))))
        (setq danc (vlax-curve-getdistatparam curve-obj (vlax-curve-getendparam curve-obj))
              en   (entget en)
              ptbq (cdr (assoc 10 en))
       bija (* danjia (* danc huodu))
        )
(if (< bija qijia)
   (setq
     bija 0
     danc 0
     geshu (+ 1 geshu)
     )
   )
(setq
   zoca   (+ zoca danc)
   bijazs (+ bijazs bija)
   n      (1+ n)
   )
)
      )
    )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-1-25 21:17:12 | 显示全部楼层

建议t 后面还是不要NIL的好,因为有种情况是 initget 设置了多了关键字,而COND里面没处理,这样是有可能造成错误的
比如
(initget "1 2 3 4")
(setq a (getkword "\n....."))
(cond
   ((= a 1)
      ....
   )
   ((= a 2)
      ...
   )
)

输入3,4的时候是会让程序继续走的,下面如果用到cond里面设置的变量会出错的,这样的错误还不好排查,至少应该在T后面加上个打印警告语句什么的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2017-1-25 21:18:44 | 显示全部楼层

原理都是一样,就像我在5楼所说,简单一点的方法,就是留一个全局变量在边上,用其它变量来进行计算,结果是需要的,再替换掉这个全局变量,那么这个保留的值就不会受你的过程影响。等熟练了以后,也可以让这个全局变量参与进来。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2017-1-25 21:33:13 | 显示全部楼层

再多的关键字也是有限的,而且是有目的的,程序中很少会遗漏这样的分支,在关键字时使用t分支一般只是考虑一些非正常状态,比如对initget的那些非零非空状态的不完全排查,这种情况强行转入一个有效分支也是不合适的,可以警告,否则我认为最好是nil。
在非关键字情况下使用cond测试时,可以使用不闭合条件测试,t作为补全,否则t分支也最好使用nil,实际上就是让程序运行下去,而这个分支只是作为程序防止崩溃的方法,同时当然也可能带来结果不正确的风险,所以测试条件的闭合问题应该是测试关系中最重要的一步。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-1-25 21:50:49 | 显示全部楼层

你好。请问21楼的代码如何实现记忆?可以顺手帮我改一改么。它与一楼那个不太一样,它在别的程序上都能实现记忆,唯独在这个程序上不能实现记忆,不知如何入手。

另外,该程序中有段求图元几何中心的代码,不是很理想,具体表现在,对于多义线图元时,求出来的点不在几何中心上,跑到端点上去了。
是不是 ptbq (cdr (assoc 10 en))里面的10改成别的什么即可?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 86个

财富等级: 招财进宝

发表于 2017-1-25 22:02:15 | 显示全部楼层
路过学习...............
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2017-1-25 22:13:00 | 显示全部楼层

好久不写程序了,VL也没研究过,修改有点困难,就不献丑了,还是讲点原理吧。
仔细看5楼的内容,记忆一个变量值都是三句代码,第一句是检查这个变量值是否原本存在,不存在则赋一个常用值,这主要是为第二句交互输入设置提示值。第二句是交互输入。第三句是保存输入结果。
Lisphk的第二步和第三步是合并的,逻辑稍许复杂,你可以先每步分开,应该可以简单些。

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-1-25 22:16:50 | 显示全部楼层

写程序是给别人用的,别人可能不知道程序的流程,遇到输入错也会茫然,所以,我认为,对于不是期望的关键字的输入的处理,还是用T 进行最想默认的那个选项。 就如第一次运行时候设置那个初始变量,两个保险进行最常用的那个关键字的处理。习惯而已。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-1-25 22:27:28 | 显示全部楼层
本帖最后由 newer 于 2017-1-25 22:32 编辑

分析下

(if (null caizhi)
  (setq caizhi "1")
)


程序第一次运行的时候,caizhi变量是nil (没值),所以,如果第一次,(null caizhi)的值是T,进入IF分之执行SETQ,设置caizhi ="1" 后面的GETKWORD里面的默认地方提示就是<1>

(initget "1 2 3 4 5 6 7 8 9 11")
(if (setq val (getkword (strcat "\n材质<"  caizhi ">(1)SKD11  (2)SLD  (3)D2  (4)Gr12mov  (5)Gr12m1ov1  (6)Gr12  (7)S45C  (8)45#  (9)A3  (11)黄牌:")))
  (setq caizhi val)
)


开始你的交互了,1、如果你输入了选项(没回车),那么val 的值 等于你输入的,这时候 (setq val ....)这个括号的表达式求值返回的是非NIL,那么就进入IF的分之,把你输入的变量VAL的值赋给你的全局变量 caizhi ,
接下来,你通过caizhi的内容,进行cond里面的各个分之,val只是一个中间的变量。

2、如果你不输入选项,而是回车,那么 val的值是NIL,不进入IF,不会给CAIZHI赋值,CAIZHI的值还是你上次输入的。


程序第二次执行的时候,因为caizhi 已经有值了(你上次运行输入的),所以

(if (null caizhi)
  (setq caizhi "1")
)
里面的给caizhi=“1”的语句是不执行的,你下面的getkword里面的 <"  caizhi "> 这个内容就变成你上次的输入,如:<4>

理解了吗?

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-1-26 04:57:23 来自手机 | 显示全部楼层

иó(TxЩУcaz21ǘCaizhiλ1ε壬Caizhiλ
裿У裬Щ
лл壬δ
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-24 06:21 , Processed in 0.403709 second(s), 56 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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