明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1122|回复: 18

[讨论] 请高手进来:同时输入一个实数或者在屏幕取一个点。

[复制链接]
发表于 2023-3-15 13:19:56 | 显示全部楼层 |阅读模式
如题,以下lsp语句,我现在是如果输入,按输入值,不输入则默认取0

(setq qszh (getreal "\n请输入路线的起点桩号<默认0>:"))


但是我现在想加一个功能,这一步的时候,可以同时在屏幕上取一个点,如果是取点,就转向其他的处理流程。
请问各位高手我的想法可以实现吗?



发表于 2023-3-15 15:31:15 | 显示全部楼层
getreal改为getdist ,可以在屏上点两点,也可以输入一个值
回复 支持 1 反对 0

使用道具 举报

发表于 2023-3-15 17:41:10 | 显示全部楼层
本帖最后由 wzg356 于 2023-3-15 17:49 编辑

(defun getDorP(/ loop n p gr)
(setq loop t n nil)
(while loop
        (setq gr (grread t 8))
        (cond
                ((= (car gr) 3)(setq p(cadr gr)(setq loop nil))
                ((and(= (car gr)2)
                        (setq i(vl-position (cadr gr)'(48 49 50 51 52 53 54 55 56 57)))
                        )
                        (prompt (strcat "\n距离:"(rtos(setq n(if n(+ i(* n 10)) i)))))                                       
                );记录键盘数字输入并显示在命令行
                ((or(member (car gr) '(3 25))(equal gr '(2 13))(equal gr '(2 32)))(setq loop nil))
        )
)(if p p(if n n))
)
没有十字光标
发表于 2023-3-15 17:46:47 | 显示全部楼层
本帖最后由 e2002 于 2023-3-15 17:50 编辑

用户输入桩号,或者应该是在图中选择一个已经有的桩号(可能是Insert的Attrib,也可能是个Text对象),那你initget 指定 Keyword 如 “Select“ :

  1. (initget "Select")
  2. (setq qszh (getint "\n请输入路线的起点桩号 [从图中选择(S)/0/1/2/3/4/5/6/7/8/9/10]: <默认桩号: 0>"))
  3. (cond
  4. ((= qszh "Select") (fooSelect ....))
  5. ((= (type qszh) 'INT) (fooInt ....))
  6. ...
  7. );_cond
  8. ...


桩号应该是个正整数吧?使用 getint 更加合适。pick point 返回的是 point的坐标值,似乎不是你需要的结果吧?
grread 更适合在其他的交互需求。
发表于 2023-3-15 14:34:53 | 显示全部楼层
可以用grread
发表于 2023-3-15 14:49:12 | 显示全部楼层
(initget [bits] [string])
(getpoint [pt] [msg])
这两个组合一起试试,组合一块去  (getpoint [pt] [msg]) 可以输入点、距离,关键字
发表于 2023-3-15 15:58:10 | 显示全部楼层
自己想清楚起始桩号这个变量怎么复制就好了。
 楼主| 发表于 2023-3-15 16:07:31 | 显示全部楼层
vormittag 发表于 2023-3-15 15:58
自己想清楚起始桩号这个变量怎么复制就好了。

恩,看情况只能先取点,要是没取到就手动输入。
这样我增加功能就少改一点。楼上几位的回复好像都不行,没法一步到位。
发表于 2023-3-15 16:31:36 | 显示全部楼层
grread可以实现
只是代码会比较复杂
建议还是initget+get*组合
通过增加一个选项来控制流程
程序结构简单也易于实现
实际操作也就是多两次按键而已
发表于 2023-3-15 17:07:49 | 显示全部楼层
本帖最后由 wzg356 于 2023-3-15 17:11 编辑

(getDorP)
(defun getDorP ( / p1 p2 l)
(setq p1(cadr (grread '(2 13))))
(command "line" p1 pause "")
(setq p2(getvar "lastpoint"))
(setq D(distance p1 p2))
(entdel(last))
(list P2 D)
)
要哪一个自己选

点评

咋说呢,楼主希望输入取点右键三合一,只有grread可以实现,这个前面不止一人给出了这个答案。而且我也说了,代码很复杂。基于楼主的能力,暂时不推荐他在这方面下功夫。你的代码,不说别的,光输入就无法实现  发表于 2023-3-15 17:23
可达到目的,细节还要优化而与,比如判断动作返回数值或点  发表于 2023-3-15 17:14
您太牛了,真牛,太棒了。这样就省了一个步骤了。 但是这多的线我又不知道咋办了,我先收下,有时间再来研究吧。 谢谢大侠!  发表于 2023-3-15 17:14
这....理解错题意了吧  发表于 2023-3-15 17:11
发表于 2023-3-15 17:30:43 | 显示全部楼层
上面的发言不对

不用grread应该也可以实现三合一
(iniget 128)
(setq a (getpoint))
判断a的类型
再执行相应的流程

发表于 2023-3-15 17:32:26 | 显示全部楼层
判断a为字符串时
需要再判断a是否可以解析成为一个数值
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-16 13:03 , Processed in 0.213004 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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