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。 很好的开始,除了以弧度表示90度角的值外,极性函数没有任何错误。
如:
(/ pi 2.0)
如果您想:
[列表]
[*]当您要求用户输入一个值,并且该值必须是实数时,最好使用getdist或甚至getreal,而不是函数getint,因为最后一个函数将返回整数而不是实数。
[*]尽量避免使用系统变量osmode,因为当用户点击ESC按钮结束程序时,您没有错误函数处理程序来重新设置它们,因此在您的情况下,您可以使用选项“\u non”或“\u none”忽略OPSNAP的设置。
[/列表] 谢谢你,塔瓦!
找到垂直向量一直是我的一个问题,直到你的回答。现在,我可以修复一些我脑海中的其他代码。
我确实有意使用getint,我对getdist和getreal很熟悉。
我会遵循你的第二个建议,但当我真的决定在日常工作中使用一些“练习”例程时,我总是添加函数错误处理程序。
至于版权,我不会从写代码中获利(它们只是帮我完成工作)。
因此,我把那些帮助我的人(通常是你和/或李·麦克)加在一起,我以作者的身份写自己的作品,以知道代码中可能有错误。 期待看到您对上述代码的最终修改。 老实说,我在体验方面做得更进一步了,决定把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键,它们应该与上次创建的对象共线。
我必须承认,当你随着时间的推移变得更熟练时,写这些东西真的很有趣! 我想你没有理解我所说的OSMODE设置,因为你再次使用了带有“\u non”选项的OSMODE设置,所以请使用这些OSMODE或“\u non”。
您已经使用并运行了两次,而不需要它。
当你们期望一个实数除以另一个数时,为了得到一个正确的返回值,你们应该给它们两个实数,就像我用π除以二一样。 我什么都懂!
我只是不想在不断更改代码时删除和函数(并且不想麻烦重写它们),progn函数也是如此。
但是,是的,我没有注意到我应该用reals来喂养PI,我会记住的! 我很抱歉,如果我上次回复的意思是冒犯你。 我一点也不生气,我知道你在试图帮助别人,你的帖子被称为建设性批评。 对于许多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