frostrap 发表于 2022-7-6 15:12:17

复制Dist命令

这件事让我抓狂,所以我希望这里的人能给我一个解决方案。
 
我在这里使用lisp例程来标注管道尺寸。
 
基本上,程序会提示用户选择两个点。然后,它计算这两个点之间的距离,并在两个初始点之间插入一个具有在中心点格式化尺寸的块。然后,程序将第二个点保存为第一个点,然后循环并要求另一个点进行标注。
 
问题是,我希望程序在第一个点和光标之间绘制一条重影(“抖动”)线,同时用户决定下一个要拾取的点(就像dist命令一样)。
 
这是症结所在:
 
我知道getdistance函数通常会为我处理这个问题,但我认为我无法使用它。相反,我调用了两次getpoint函数,然后使用距离函数计算两点之间的距离。我必须这样做的原因是允许程序执行我之前描述的循环。我需要将输入的第二个点保存为第一个点,以便程序可以在接近开始的地方循环,并请求新的第二个点。getdistance函数只返回一个数字,而不是一个点,因此使用getdistance函数可以防止我需要的循环功能。
 
下面是一些针对ya的伪ish代码(实际程序大约有250行):
 
(setq点1(getpoint“选择点”))
(而(=1 1)
(setq点2(getpoint“选择另一个点”))
(setq长度(距离点1点2))
(InsertBlockWithLengthBetweenPoints)
(setq点1点2)
);虽然
 
你可以看到,如果我使用getdistance函数,我将无法在漂亮的无限while循环中循环。
 
我曾想过做一些复杂的事情,比如使用grdraw和grread或grvecs来创建重影线,但我不能很好地做到这一点,因为这些函数有点难以使用。也许有一个我不知道的可视化lisp函数可以帮我解决这个问题?
 
有什么想法吗?

lpseifert 发表于 2022-7-6 15:48:37

大概

(setq point2 (getpoint "select another point" point1)

CAB 发表于 2022-7-6 15:57:27

像这样的?
(defun c:test(/ p1 p2)
(setvar "errno" 0) ; must pre set the errno to 0
(setqp1 nil)            
(while
   (cond
   ((null p1)
      (setq p1 (getpoint "\nSelect first point."))
   )
   ((= (getvar "errno") 52) ; exit if user pressed ENTER
      nil ; exit loop
   )
   ((setq p2 (getpoint p1 "\nSelect next point."))
      ;;do you block insert
      (setq p1 p2)
   )
   )
)
(princ)
)

frostrap 发表于 2022-7-6 16:20:26

哈!当然我完全忘记了你可以这样指定一个基点。
 
谢谢大家的简单回答!
页: [1]
查看完整版本: 复制Dist命令