BudPerry 发表于 2022-7-6 07:47:30

查找中点btw 2用户点

我需要创建一个例程,允许用户选择两个点(通过交点),然后它会自动将文本(用户输入)放置在这两个点之间的中点。
 
到目前为止,我已经:
 
 

(defun c:textplacer ()
(command "_textstyle" "standard")
(command "_textsize" "6.0")
(command "_osnap" "Intersection")
(setq pt1 (getpoint "\nSelect First Point:"));gets the first user point
(setq pt2 (getpoint "\nSelect Second Point in POG Direction:"));gets the second user point
(setq pt3 (abs (- (car pt1)(car pt2))));gets the middle point btw pt1 and pt2

;need the rest here

);end function

 
甚至不确定pt3是否真的达到了中点。。。我在这里已经深不可测了。

MSasu 发表于 2022-7-6 07:56:43

请检查是否已有名为M2P的内置命令修饰符。

MSasu 发表于 2022-7-6 08:03:22

如果要使用上述AutoLISP例程,则:
(setq pt3 (list (/ (- (carpt2) (carpt1)) 2)
               (/ (- (cadr pt2) (cadr pt1)) 2)))
 
顺便说一句,请编辑您的帖子并添加代码标签。

MSasu 发表于 2022-7-6 08:12:17

或者,可以尝试:
(command "_TEXT" "_M2P" pause pause 6.0 0.0 "???")

BudPerry 发表于 2022-7-6 08:14:44

非常感谢你。我以前没有找到M2P命令。
然而,我想我可能会同意你的第一个代码建议,因为我还必须在第一点和第二点插入一个块。
 
再次感谢!

MSasu 发表于 2022-7-6 08:21:55

不客气!谢谢你修复了第一个帖子。
如果你的代码遇到了更多的问题,只要把它贴在这里,就会有人查看。

BudPerry 发表于 2022-7-6 08:30:15

我添加了这段代码,它似乎将文本沿着x轴放置在0,0附近,而不是实际上在pt1和pt2之间。。。我还没聪明到弄明白为什么!
 

(setq pt1 (getpoint "\nSelect First Point:"));gets the first user point
(setq pt2 (getpoint "\nSelect Second Point in POG Direction:"));gets the second user point
(setq pt3 (list (/ (- (carpt2) (carpt1)) 2)
               (/ (- (cadr pt2) (cadr pt1)) 2)));gets middle point
(command "_text" "j" "tc" pt3 "6.0" "0.0" "test");supposed to place text at this middle point

Lee Mac 发表于 2022-7-6 08:36:35

 
嗨,巴德,
 
放置中的错误是因为提供给命令的点受对象捕捉设置的影响。
 
为了避免这种情况,可以使用“非”(无)对象捕捉修改器忽略对象捕捉设置。
 
考虑以下代码:
 
在上述代码中,我还允许空用户输入,缩短了计算中点的方法,并考虑了具有预定义文本高度的文本样式,其中没有高度提示。
 
但是,我还建议您考虑使用entmake函数来完成此任务:
 
使用entmake比命令快得多,并且没有任何提示(因此无需更改CMDECHO),此外,entmake不受对象捕捉的影响,所有文本属性都可以通过提供的DXF列表设置。但是,请注意,上面的示例没有考虑UCS设置中的更改。
 
我使用的DXF值的参考可以在这里找到。
 
我希望这有帮助,
 

BudPerry 发表于 2022-7-6 08:41:39

哇,太快了,而且很有效!非常感谢你。我从未使用过entmake函数,但我可以看出它可能会更有用,或者至少更干净。
 
当我继续这个项目时,我可能会回来要求更多的东西,但我会尽量自己做,这样我就可以学习了。
 
再次感谢!

Lee Mac 发表于 2022-7-6 08:53:59

不客气,巴德
 
除了速度明显更快之外,与使用命令调用相比,entmake/entmakex还有几个优点(其中一些我已经提到了,但为了完整性,将重新迭代):
 
[列表]
[*]entmake(x)比使用命令调用快得多,因为此函数直接修改图形数据库。
[/列表]
 
[列表]
[*]程序在多个AutoCAD版本中更可靠,因为entmake(x)不依赖命令的提示顺序,在新版本的AutoCAD中可能会发生更改。
[/列表]
 
[列表]
[*]entmake(x)不受对象捕捉的影响,因此无需更改OSMODE系统变量,因此,如果程序遇到错误,则需要使用*error*处理程序重置对象捕捉设置。
[/列表]
 
[列表]
[*]entmake(x)不回显任何提示,因此无需更改CMDECHO系统变量。
[/列表]
 
[列表]
[*]一个实体的所有属性都可以在对entmake(x)或entmod的一次调用中设置或修改。相同的过程需要在Visual LISP ActiveX中单独设置每个属性,或使用多个命令。
[/列表]
页: [1]
查看完整版本: 查找中点btw 2用户点