Grrr 发表于 2022-7-5 17:39:26

Getint+极坐标和不同分辨率

大家好,
我刚刚写道:
; Attempt for dimaligned + dimcontinue
(defun C:test ( / oldosm pt1 pt2 pt3 ang dist )
(setq oldosm (getvar 'osmode))
(if
        (and
                (setq dist (getint "\nSpecify offset value"))
                (setq pt1 (getpoint "\nPoint1 "))
        )
        (while
                (setq pt2 (getpoint pt1 "\nPoint2 "))
                (setq ang (angle pt1 pt2))
                (setq pt3 (polar (mid pt1 pt2) (+ ang (/ 2 PI)) dist)) ; should be perpendicular from the midpoint between pt1 and pt2, on "dist" distance
                (setvar 'osmode 0)
                (command "_.dimaligned" pt1 pt2 pt3)
                (setq pt1 pt2)
                (setvar 'osmode oldosm)
        )
)
(princ)
)

(defun mid (p1 p2)
(mapcar '(lambda (x1 x2) (/ (+ x1 x2) 2.0)) p1 p2)
)
 
我对极函数没有太多经验,但老实说,我看不出有什么错。
然而,在为偏移值输入100后,我得到了这个结果:

不是100个单位的偏移量,而是59,xxx。
我想不出是什么问题。pt3应垂直于pt1-pt2线的中点,距离为dist。

Tharwat 发表于 2022-7-5 17:49:15

很好的开始,除了以弧度表示90度角的值外,极性函数没有任何错误。
如:

(/ pi 2.0)

 
如果您想:
[列表]
[*]当您要求用户输入一个值,并且该值必须是实数时,最好使用getdist或甚至getreal,而不是函数getint,因为最后一个函数将返回整数而不是实数。
[*]尽量避免使用系统变量osmode,因为当用户点击ESC按钮结束程序时,您没有错误函数处理程序来重新设置它们,因此在您的情况下,您可以使用选项“\u non”或“\u none”忽略OPSNAP的设置。
[/列表]

Grrr 发表于 2022-7-5 17:51:56

谢谢你,塔瓦!
找到垂直向量一直是我的一个问题,直到你的回答。现在,我可以修复一些我脑海中的其他代码。
我确实有意使用getint,我对getdist和getreal很熟悉。
我会遵循你的第二个建议,但当我真的决定在日常工作中使用一些“练习”例程时,我总是添加函数错误处理程序。
 
至于版权,我不会从写代码中获利(它们只是帮我完成工作)。
因此,我把那些帮助我的人(通常是你和/或李·麦克)加在一起,我以作者的身份写自己的作品,以知道代码中可能有错误。

Tharwat 发表于 2022-7-5 18:01:53

期待看到您对上述代码的最终修改。

Grrr 发表于 2022-7-5 18:04:20

老实说,我在体验方面做得更进一步了,决定把DIMSPACE搞砸。
我改变了这个:
(setq dist (getint "\nSpecify offset value"))
为此:
(setq dist (distance pt1 pt2))
所以我可以从错误处理程序中跟踪结果。
以下是我为这个实验准备的内容:
; Attempt for dimaligned + dimcontinue
(defun C:test ( / *error* oldosm pt1 pt2 pt3 ang dist ss )

(defun *error* ( msg )
        (if oldosm (setvar 'osmode oldosm))
        (command-s "_.DIMSPACE" (entlast) ss "" 0)
       (if (not (member msg '("Function cancelled" "quit / exit abort")))
         (princ (strcat "\nError: " msg))
        )
       (princ)
)

(setq oldosm (getvar 'osmode))
(if
        (and
                ; (setq dist (getint "\nSpecify offset value"))
                (setq pt1 (getpoint "\nPoint1 "))
        )
        (progn
                (setq ss (ssadd))
                (while
                        (and
                                (setq pt2 (getpoint pt1 "\nPoint2 "))       
                        )
                        (setq ang (angle pt1 pt2))
                        (setq dist (distance pt1 pt2))
                        (setq pt3 (polar (mid pt1 pt2) (+ ang (/ PI 2)) dist)) ; should be perpendicular from the midpoint between pt1 and pt2, on "dist" distance
                        (setvar 'osmode 0)
                        (command "_.dimaligned" "_non" pt1 "_non" pt2 "_non" pt3)
                        (setq pt1 pt2)
                        (setvar 'osmode oldosm)
                        (setq ss (ssadd (entlast) ss))       
                )
        )
)
(princ)
)

(defun mid (p1 p2)
(mapcar '(lambda (x1 x2) (/ (+ x1 x2) 2.0)) p1 p2)
)       
使用示例:
在不同距离处选择共线的点(因此创建的尺寸将平行,但显然不共线)。
然后按ESC键,它们应该与上次创建的对象共线。
 
我必须承认,当你随着时间的推移变得更熟练时,写这些东西真的很有趣!

Tharwat 发表于 2022-7-5 18:09:37

我想你没有理解我所说的OSMODE设置,因为你再次使用了带有“\u non”选项的OSMODE设置,所以请使用这些OSMODE或“\u non”。
 
您已经使用并运行了两次,而不需要它。
当你们期望一个实数除以另一个数时,为了得到一个正确的返回值,你们应该给它们两个实数,就像我用π除以二一样。

Grrr 发表于 2022-7-5 18:19:01

我什么都懂!
我只是不想在不断更改代码时删除和函数(并且不想麻烦重写它们),progn函数也是如此。
但是,是的,我没有注意到我应该用reals来喂养PI,我会记住的!

Tharwat 发表于 2022-7-5 18:22:14

我很抱歉,如果我上次回复的意思是冒犯你。

Grrr 发表于 2022-7-5 18:31:32

我一点也不生气,我知道你在试图帮助别人,你的帖子被称为建设性批评。

BIGAL 发表于 2022-7-5 18:34:40

对于许多90、180、270、45等,生成一系列全局值,并将代码保存在类似acaddoc的lisp库中。lsp。
 

(setq p90 (/ pi 2.0))
(setq p180 pi)
(setq p45 (/ pi 4.0))
(setq p270 (* pi 1.5))
页: [1] 2
查看完整版本: Getint+极坐标和不同分辨率