start4444 发表于 2014-4-30 17:38:11

自己写的lisp,有疑问请教大侠们完善

根据自己工作需要写了个lisp,不是很熟有两点希望高人指点:1,前面的两个变量怎么可以保存上次命令输入的数值;2,点取p4点怎么可以重复点选,用while能行不,望指点,谢谢。

(defun c:ttg()
(setq       n1      (getint "\n请输入1值:")
         n2      (getdist "\n请输入2值:")
         p1       (getpoint "\n请输入第一点:")
       p2       (getpoint p1 "\n请输入第二点:"))
(setq p1x (car p1)
      p1y (cadr p1)
      p2x (car p2)
      p2y (cadr p2))
(setq p3 (list p2x (+ p2y n1)))
(command "line" p1 p2 "")

(setqp4       (getpoint p1 "\n请输入下一点:"))

(setqp4x (car p4)
         p4y (cadr p4)
         p5(list p4x (+ p4y 500))
         p6(inters p1 p3 p4 p5 )
         p6x (car p6)
         p6y (cadr p6)
         p7(list p6x (- p6y n2)))
(command "line" p1 p6 p7 "")
(setvar "osmode" 16383)
)

llsheng_73 发表于 2014-4-30 17:49:35

本帖最后由 llsheng_73 于 2014-4-30 18:48 编辑

(defun c:ttg()
(if (null n1)(setq          n1      (getint "\n请输入1值:")));;如果n1有值就不输入,下同
(if (null n2)(setq          n2      (getint "\n请输入2值:")))
;;不清楚你说的记住是指直接用已有的值还是输入的时候提示它,如果是前者,上边这样就行了,如果是后者得再改下,把下边两句打开,把上边两句注解掉
;;(setq p1 n1 n1(getint(strcat"\n请输入1值["(itoa p1)"]"))) (if (null n1)(setq n1 p1))
;;(setq p1 n2 n2(getint(strcat"\n请输入2值["(itoa p1)"]"))) (if (null n2)(setq n2 p1))
   (setq          p1         (getpoint "\n请输入第一点:")
          p2         (getpoint p1 "\n请输入第二点:"))
   (setq p1x (car p1)
         p1y (cadr p1)
         p2x (car p2)
         p2y (cadr p2))
   (setq p3 (list p2x (+ p2y n1)))
(setvar "osmode" 16384);;此句你原来没有,但在最后把捕捉全开,这就导致第一次运行以后捕捉是全开着的,可能会对line命令产生影响
   (command "line" p1 p2 "")
(while
   (setqp4         (getpoint p1 "\n请输入下一点(右键结束):"));以p4非空作为循环条件

   (setqp4x (car p4)
          p4y (cadr p4)
          p5(list p4x (+ p4y 500))
          p6(inters p1 p3 p4 p5 )
          p6x (car p6)
          p6y (cadr p6)
          p7(list p6x (- p6y n2)))
   (command "line" p1 p6 p7 "")
);while end
   (setvar "osmode" 16383)
)

start4444 发表于 2014-4-30 18:19:20

llsheng_73 发表于 2014-4-30 17:49 static/image/common/back.gif
(defun c:ttg()
(if (null n1)(setq          n1      (getint "\n请输入1值:")));;如果n1有值就不输入, ...

谢谢大侠回复,我试了下出错啊。。。
就是好像cad偏移命令那样按空格或者右键就默认上次的数值,重复点选p4点命令好像也不行呢

llsheng_73 发表于 2014-4-30 18:46:45

start4444 发表于 2014-4-30 18:19 static/image/common/back.gif
谢谢大侠回复,我试了下出错啊。。。
就是好像cad偏移命令那样按空格或者右键就默认上次的数值,重复点选 ...

不好意思,原来把while写成whille了,改过后试下

ysq101 发表于 2014-4-30 18:58:47

llsheng_73 发表于 2014-4-30 17:49 static/image/common/back.gif
(defun c:ttg()
(if (null n1)(setq          n1      (getint "\n请输入1值:")));;如果n1有值就不输入, ...

大师。。要想写一个检查很多圆是不是同一条线上(X Y)
来点思路??

llsheng_73 发表于 2014-4-30 19:00:53

本帖最后由 llsheng_73 于 2014-4-30 19:08 编辑

晕,搞错了,可以进群里边去问,那里活人要多些

llsheng_73 发表于 2014-4-30 19:07:55

ysq101 发表于 2014-4-30 18:58 static/image/common/back.gif
大师。。要想写一个检查很多圆是不是同一条线上(X Y)
来点思路??

计算圆心到线的距离来看它是不是在线上
如果线是存在的,可以用VL函数(vlax-curve-getClosestPointTo curve-obj givenPnt )得到最近点的坐标,再计算最近点到圆心的距离
如果线不存在,只知道线的方程的话那就得用纯数学的方法去计算圆心坐标是否满足直线(或者曲线方程),当方程比较复杂的时候要求解析几何比较历害才写得出来,当然也可以把线画出来,判断完了后再删除它

lyqiezi 发表于 2014-4-30 20:52:14

论坛里不是有点是否在线上的判断吗?

lyqiezi 发表于 2014-4-30 21:15:01

(defun c:ttg(/ n11 n22);增加局部变量作为中间变量
(if (setq n11 (getint "\n请输入1值:"));n1为全局变量
      (setq n1 n11))                           ;如果有输入,则按n11输入值,否则不另外赋
(if (setq n21 (getint "\n请输入2值:"));n2为全局变量
      (setq n2 n21))                            ;如果有输入,则按n21输入值,否则不另外赋

         
      (setq p1 (getpoint "\n请输入第一点:")
            p2 (getpoint p1 "\n请输入第二点:"))
(setq p1x (car p1)
      p1y (cadr p1)
      p2x (car p2)
      p2y (cadr p2))
(setq p3 (list p2x (+ p2y n1)))
(command "line" p1 p2 "")

(setqp4 (getpoint p1 "\n请输入下一点:"))

(setqp4x (car p4)
         p4y (cadr p4)
         p5(list p4x (+ p4y 500))
         p6(inters p1 p3 p4 p5 )
         p6x (car p6)
         p6y (cadr p6)
         p7(list p6x (- p6y n2)))
(command "line" p1 p6 p7 "")
(setvar "osmode" 16383)
)

不知道这样改行不行?

lyqiezi 发表于 2014-4-30 21:20:50

LLSHENG的输入提示不错,哈哈,又学会一招
页: [1] 2
查看完整版本: 自己写的lisp,有疑问请教大侠们完善