发布网友 发布时间:2022-05-07 05:23
共3个回答
热心网友 时间:2023-10-16 20:13
偏移曲线【ENT1】,【要求这个曲线不变形】,得到对象【ENT2】。
取得ENT1对象上一点,画垂直ENT2对象直线。
直线对象旋转90°得到切线。
利用这个方法,可以编程实现这个过程,代码如下:
(defun c:tes ( / &ac0 &ang1 &dis1 &dis6 &ent1 &n1 &n2 &p1 &p2 &p3 &sel)
(if (null vlax-mp-object) (vl-load-com) )
(if (null &dis5) (setq &dis5 100) )
(if (> (setq &dis6 (getdist (strcat "\n请输入切线长度:<" (rtos &dis5) ">"))) 0)
(setq &dis5 (abs &dis6))
)
(setq &dis6 (* &dis5 0.5))
(if (and (setq &sel (entsel "\n请选择曲线"))
(setq &sel (car &sel))
(setq &ac0 (cdr (assoc 0 (entget &sel))))
(member &ac0 '("CIRCLE" "ARC" "SPLINE"))
(setq &sel (vlax-ename->vla-object &sel))
(setq &dis1 (vlax-curve-getDistAtParam &sel (vlax-curve-getEndParam &sel)))
(> &dis1 0)
)
(progn
(while (and (setq &p1 (getpoint "\n请选择要绘制切线的点"))
(setq &p2 (vlax-curve-getclosestpointto &sel &p1))
(<= (distance &p1 &p2) 5)
)
(setq &n2 (vlax-curve-getParamAtPoint &sel &p2))
(if (setq &n1 (vl-catch-all-error-p (vl-catch-all-apply 'vla-offset (list &sel 1))))
(setq &n1 (vl-catch-all-error-p (vl-catch-all-apply 'vla-offset (list &sel -1))))
)
(if (null &n1)
(progn
(setq &ent1 (entlast) &ent1 (vlax-ename->vla-object &ent1))
(setq &p3 (vlax-curve-getPointAtDist &ent1 (vlax-curve-getDistAtParam &ent1 &n2)))
(vla-delete &ent1)
(setq &ang1 (+ (angle &p2 &p3) (* pi 0.5)) &p3 (polar &p2 &ang1 &dis6) &p2 (polar &p2 &ang1 (* &dis6 -1)))
(entmake (list '(0 . "LINE") (cons 10 &p2) (cons 11 &p3)));绘制切线,长度100
)
);if
);while
);progn
);if
(princ)
);;复制到记事本,以【.lsp】为后缀命名,autolisp加载,命令【TES】,就可以绘制切线。
;绘制切线对象是圆,圆弧,样条曲线。效果如下:
热心网友 时间:2023-10-16 20:13
利用约束,先进行相切约束,然后旋转复制90度热心网友 时间:2023-10-16 20:13
用构造线作热心网友 时间:2023-10-16 20:13
偏移曲线【ENT1】,【要求这个曲线不变形】,得到对象【ENT2】。
取得ENT1对象上一点,画垂直ENT2对象直线。
直线对象旋转90°得到切线。
利用这个方法,可以编程实现这个过程,代码如下:
(defun c:tes ( / &ac0 &ang1 &dis1 &dis6 &ent1 &n1 &n2 &p1 &p2 &p3 &sel)
(if (null vlax-mp-object) (vl-load-com) )
(if (null &dis5) (setq &dis5 100) )
(if (> (setq &dis6 (getdist (strcat "\n请输入切线长度:<" (rtos &dis5) ">"))) 0)
(setq &dis5 (abs &dis6))
)
(setq &dis6 (* &dis5 0.5))
(if (and (setq &sel (entsel "\n请选择曲线"))
(setq &sel (car &sel))
(setq &ac0 (cdr (assoc 0 (entget &sel))))
(member &ac0 '("CIRCLE" "ARC" "SPLINE"))
(setq &sel (vlax-ename->vla-object &sel))
(setq &dis1 (vlax-curve-getDistAtParam &sel (vlax-curve-getEndParam &sel)))
(> &dis1 0)
)
(progn
(while (and (setq &p1 (getpoint "\n请选择要绘制切线的点"))
(setq &p2 (vlax-curve-getclosestpointto &sel &p1))
(<= (distance &p1 &p2) 5)
)
(setq &n2 (vlax-curve-getParamAtPoint &sel &p2))
(if (setq &n1 (vl-catch-all-error-p (vl-catch-all-apply 'vla-offset (list &sel 1))))
(setq &n1 (vl-catch-all-error-p (vl-catch-all-apply 'vla-offset (list &sel -1))))
)
(if (null &n1)
(progn
(setq &ent1 (entlast) &ent1 (vlax-ename->vla-object &ent1))
(setq &p3 (vlax-curve-getPointAtDist &ent1 (vlax-curve-getDistAtParam &ent1 &n2)))
(vla-delete &ent1)
(setq &ang1 (+ (angle &p2 &p3) (* pi 0.5)) &p3 (polar &p2 &ang1 &dis6) &p2 (polar &p2 &ang1 (* &dis6 -1)))
(entmake (list '(0 . "LINE") (cons 10 &p2) (cons 11 &p3)));绘制切线,长度100
)
);if
);while
);progn
);if
(princ)
);;复制到记事本,以【.lsp】为后缀命名,autolisp加载,命令【TES】,就可以绘制切线。
;绘制切线对象是圆,圆弧,样条曲线。效果如下:
热心网友 时间:2023-10-16 20:13
利用约束,先进行相切约束,然后旋转复制90度热心网友 时间:2023-10-16 20:13
用构造线作热心网友 时间:2023-10-16 20:13
偏移曲线【ENT1】,【要求这个曲线不变形】,得到对象【ENT2】。
取得ENT1对象上一点,画垂直ENT2对象直线。
直线对象旋转90°得到切线。
利用这个方法,可以编程实现这个过程,代码如下:
(defun c:tes ( / &ac0 &ang1 &dis1 &dis6 &ent1 &n1 &n2 &p1 &p2 &p3 &sel)
(if (null vlax-mp-object) (vl-load-com) )
(if (null &dis5) (setq &dis5 100) )
(if (> (setq &dis6 (getdist (strcat "\n请输入切线长度:<" (rtos &dis5) ">"))) 0)
(setq &dis5 (abs &dis6))
)
(setq &dis6 (* &dis5 0.5))
(if (and (setq &sel (entsel "\n请选择曲线"))
(setq &sel (car &sel))
(setq &ac0 (cdr (assoc 0 (entget &sel))))
(member &ac0 '("CIRCLE" "ARC" "SPLINE"))
(setq &sel (vlax-ename->vla-object &sel))
(setq &dis1 (vlax-curve-getDistAtParam &sel (vlax-curve-getEndParam &sel)))
(> &dis1 0)
)
(progn
(while (and (setq &p1 (getpoint "\n请选择要绘制切线的点"))
(setq &p2 (vlax-curve-getclosestpointto &sel &p1))
(<= (distance &p1 &p2) 5)
)
(setq &n2 (vlax-curve-getParamAtPoint &sel &p2))
(if (setq &n1 (vl-catch-all-error-p (vl-catch-all-apply 'vla-offset (list &sel 1))))
(setq &n1 (vl-catch-all-error-p (vl-catch-all-apply 'vla-offset (list &sel -1))))
)
(if (null &n1)
(progn
(setq &ent1 (entlast) &ent1 (vlax-ename->vla-object &ent1))
(setq &p3 (vlax-curve-getPointAtDist &ent1 (vlax-curve-getDistAtParam &ent1 &n2)))
(vla-delete &ent1)
(setq &ang1 (+ (angle &p2 &p3) (* pi 0.5)) &p3 (polar &p2 &ang1 &dis6) &p2 (polar &p2 &ang1 (* &dis6 -1)))
(entmake (list '(0 . "LINE") (cons 10 &p2) (cons 11 &p3)));绘制切线,长度100
)
);if
);while
);progn
);if
(princ)
);;复制到记事本,以【.lsp】为后缀命名,autolisp加载,命令【TES】,就可以绘制切线。
;绘制切线对象是圆,圆弧,样条曲线。效果如下:
热心网友 时间:2023-10-16 20:13
利用约束,先进行相切约束,然后旋转复制90度热心网友 时间:2023-10-16 20:13
用构造线作