漂亮的洞口符号,原理图如下:
核心是计算pt0,采用四点交点,用inters命令即可,而确定pt1-pt11直线和pt2-pt22直线的角度至关重要,角度的关系通过弧长相等关系转换而来,并且在使用上不受输入点pt1,pt2的位置限值,引入符号修正。具体代码如下:
(defun c:rhh( / pt1 pt11 pt2 pt22 pt0 a b c d a1 a2 oldhpassoc oldlayer)
;函数rh-hole
;Desiged by 林霄云 2021年10月31日
(setq oldlayer (getvar "clayer"))
(setup "slab_out")
(command "rectangle" (setq pt1 (getpoint "\n输入第一点")) (setq pt2 (getcorner pt1 "\n输入第二点")) )
(setup "symbol")
(setq a (- (cadr pt2) (cadr pt1)) b (- (car pt2) (car pt1)) c (distance pt1 pt2) d (/ a b))
;(setq a1 (* 0.2 0.5 pi d ) a2 (/ (* 0.2 0.5 pi ) d))
;a1 为终点横边偏移角度,正方形取0.2*0.5*pi,即18°,长方形时,偏移角度乘以宽高比。a为竖边长度,b为横边长度
;当b为长边时,a1角度,压缩,比例为a/b,同时用a/b的符号修正a2;否则修正a2,压缩为b/a,同时用a/b的符号,修正a1
;a2 为始点竖边偏移角度
(if (>= (abs b) (abs a))
(setq a1 (* 0.2 0.5 pi d ) a2 (* 0.2 0.5 pi (/ (abs d) d)) )
(setq a1 (* 0.2 0.5 pi (/ (abs d) d)) a2 (/ (* 0.2 0.5 pi ) d ))
);end if
(setq pt11 (polar pt1 (- (* 0.5 pi) a2) c))
(setq pt22 (polar pt2 (+ pi a1) c))
(setq pt0 (inters pt1 pt11 pt2 pt22 nil))
(command "pline" pt1 pt0 pt2 "")
(setvar 'clayer oldlayer)
(princ "\n洞口符号绘制完成!")
(princ)
)
pt1、pt2不同输入次序的效果如下:
Last Modified·2021年11月2日 10:36
您尚未登录,请先登录才能评论。