如何作块内曲线的切线?
本帖最后由 tm20038175 于 2011-6-30 16:30 编辑这里有一个程序是可以作曲线切线的,但是块里曲线就出错了,请高手指点~~~~~
(vl-load-com)
(defun C:QX ()
(setq $orr *error*)
(setq *error* #err) ;当程序出错时就会执行#err函数
(setq os (getvar "osmode"))
(setvar "osmode" 8191)
(setq ent1(entsel (strcat "\n<画曲线上一点的切线>\n选择一条曲线<LINE>/<PLINE>/<SPLINE>/<ARC>:" )))
;(PRINC "\n1")
(setq ent2 (entget(car ent1)))
; (PRINC "\n2")
(if (= (cdr (assoc 0 ent2)) "INSERT")
(setq ent1 (nentselp "" (cadr ent1)))
)
(PRINC ent1)
;(PRINC "\n3")
(setq ent (car ent1))
(PRINC ent)
;(PRINC "\n4")
(setq curve-obj (vlax-ename->vla-object ent))
(while (setq pt (getpoint (strcat "\n<画曲线上一点的切线>\n选择曲线上一点:" )))
; (PRINC "\n5")
(setq para (vlax-curve-getParamAtPoint curve-obj pt))
; (PRINC "\n6")
(setq dir1 (vlax-curve-getFirstDeriv curve-obj para))
;(PRINC "\n7")
(setq ang (atan (/ (cadr dir1) (car dir1))))
;(PRINC "\n8")
(command "line" (polar pt (+ ang pi) 1000) (polar pt ang 1000) "")
;(PRINC "\n9")
(princ )
)
(setvar "osmode" os)
(setq *error* $orr)
(princ)
)
(defun #err (s)
(setvar "osmode" os)
(princ)
(setq *error* $orr)
)
自己顶一个……………… 这么好的创意,不要沉啦…… 在顶一下~~~~~~ 等待高手出现……………… 回复 tm20038175 的帖子
(defun C:QX (/ enl obj ent1 ent2 mat doc)
(setq $orr *error*)
(setq *error* #err) ;当程序出错时就会执行#err函数
(setq os (getvar "osmode"))
(setvar "osmode" 8191)
(setq ent1(entsel (strcat "\n<画曲线上一点的切线>\n选择一条曲线<LINE>/<PLINE>/<SPLINE>/<ARC>:" )))
;(PRINC "\n1")
(setq ent2 (entget(car ent1)))
; (PRINC "\n2")
(if (= (cdr (assoc 0 ent2)) "INSERT")
(progn
(setq enl (nentselp "" (cadr ent1)))
(setq mat (vlax-tmatrix (nth 2 enl)))
(setq array (vla-CopyObjects
(setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
(vlax-make-variant
(vlax-safearray-fill
(vlax-make-safearray
vlax-vbobject
(cons 0 0)
)
(list (vlax-ename->vla-object (car enl)))
)
)
(vlax-get-property doc (if (= 1 (getvar 'CVPORT)) 'PaperSpace 'ModelSpace))
)
)
(vla-TransformBy (setq obj (car (vlax-safearray->list( vlax-variant-value array)))) mat)
(setq ent1 (list (vlax-vla-object->ename obj) (cadr ent1)))
)
)
(PRINC ent1)
;(PRINC "\n3")
(setq ent (car ent1))
(PRINC ent)
;(PRINC "\n4")
(setq curve-obj (vlax-ename->vla-object ent))
(while (setq pt (getpoint (strcat "\n<画曲线上一点的切线>\n选择曲线上一点:" )))
; (PRINC "\n5")
(setq para (vlax-curve-getParamAtPoint curve-obj pt))
; (PRINC "\n6")
(setq dir1 (vlax-curve-getFirstDeriv curve-obj para))
;(PRINC "\n7")
(setq ang (atan (/ (cadr dir1) (car dir1))))
;(PRINC "\n8")
(command "line" (polar pt (+ ang pi) 1000) (polar pt ang 1000) "")
;(PRINC "\n9")
(princ )
)
(if enl (vla-delete obj))
(setvar "osmode" os)
(setq *error* $orr)
(princ)
)
(defun #err (s)
(setvar "osmode" os)
(princ)
(setq *error* $orr)
)
回复 Gu_xl 的帖子
高手终于出现了,Gu_xl!!!
真没想到Gu_xl把它解决了,哈哈,这么复杂的问题都解决了,本来还没抱多少希望的,真是不知道该如何感谢呀~~~~ 回复 tm20038175 的帖子
请注意,对于不等比例缩放的图块,上述方法就不能使用! 好的,已经很满意了,谢谢呵!………
;画任意曲线的切线 明经 ZZXXQQ 于建党90周年
(defun c:qx ()
(setvar "CMDECHO" 0)
(setq oldos (getvar "OSMODE"))
(setvar "OSMODE" 0)
(if (and (setq s1 (entsel "\n选择靠近曲线一点 :"))
(setq p1 (cadr s1))
(setq p2 (osnap p1 "NEAR"))) (progn
(setq ang (+ (angle p1 p2) (/ pi 2)))
(command "line" (polar pt (+ ang pi) 1000) (polar pt ang 1000) "")
))
(setvar "OSMODE" oldos)
(setvar "CMDECHO" 1)
(princ)
)