tm20038175 发表于 2011-7-1 22:40:53

回复 ZZXXQQ 的帖子

很好的近似,谢谢…………
今天是党的生日,写在今天这个特别的日子!……

edoumxx 发表于 2011-7-5 10:42:46

用起来很方便,不用每次都先画圆心再画半径,才能画切线了

highflybird 发表于 2011-7-6 03:11:13

本帖最后由 highflybird 于 2011-7-6 03:15 编辑

老实地说,如果想得到一个正确的画块内曲线切线的程序,还是要考虑很多问题的。
譬如,UCS ,嵌套块,非等比缩放块,旋转的块,法线不是'(0 0 1)的块,切线长度满足要求,nentselp如果返回的图元不是曲线,以及支持捕捉等等,这些细节都应该考虑到。

GU_xl 和ZZXXQQ他们的方法很好,但是还是存在一定的bug. 读者可以自行验证。

下面我给出程序,不仅能画出一般曲线的切线,而且也能画处块(包括嵌套块)内曲线的切线。程序参考了国外Gile的一些片段,在此感谢。

(prompt "\n命令为Test,你可自行修改.右键或者回车退出.")
(vl-load-com)
(defun c:test (/ an Bs en LST m pp P0 P1 P2 P3 P4 P5 P6 vt rt D L S)
(defun CheckIsCurve(en / dxf typ)   ;检查是否是曲线
    (and
      en      ;存在实体
      (setq dxf (entget en))      ;DXF码
      (setq typ (cdr (assoc 0 dxf)))   ;图元类型
      (or (member typ '("ELLIPSE" "CIRCLE" "ARC" "RAY"))
          (wcmatch typ "*LINE")
      )
    )
)

(initget 14)
(setq L (getdist "\n输入要画切线长度<1000>:"))
(and (null L) (setq L 1000))
(setq L (/ L 2))

(while (setq P0 (getpoint "\n曲线上的一点:"))      
    (setq lst (nentselp P0))
    (setq en (car lst))       ;光标处图元
    (if (CheckIsCurve en)
      (setq P0 (cadr lst)      ;光标点
   m(caddr lst)      ;变换矩阵
   Bs (cadddr lst)      ;块参照列表(可能有嵌套)
   P1 (TransNested P0 Bs 1 2)      ;把点变换到图块坐标系
   P1 (vlax-curve-getclosestpointto en P1)   ;得到最近点
   pp (vlax-curve-getParamAtPoint en P1)   ;得到这点参数
   vt (vlax-curve-getFirstDeriv en pp)    ;得到切线
       an (angle '(0 0 0) vt)            ;切线角
   P3 (mapcar '+ P1 vt)   ;切线端点(RCS)
   P4 (mapcar '- P1 vt)   ;切线端点(RCS)
   p2 (TransNested P1 Bs 2 0)   ;切点
   P5 (TransNested P3 Bs 2 0)   ;切线端点(WCS)
   P6 (transNested P4 Bs 2 0)   ;切线端点(WCS)
         ;到上面其实已知道切线了
   d(distance p2 p5)      ;下面用来求出满足长度的切线两点
   S(/ L D)
   S(list (- 1 S) S)      ;定比分点
   P5 (mxv (trp (list p2 p5)) S)
   P6 (mxv (trp (list p2 p6)) S)
   rt (entmake (list '(0 . "LINE") (cons 10 p5) (cons 11 p6))) ;画切线;rt (makeXLine p2 (mapcar '- p5 p6))
   
      )
      (princ "\n你没点中或者此处不是曲线类物体!")
    )
)
(princ)
)
完整的代码请见附件:


highflybir 发表于 2011-7-6 08:41:04

回复 tm20038175 的帖子

这是动画演示

mandala 发表于 2011-7-6 09:45:46

本帖最后由 mandala 于 2011-7-6 09:47 编辑

回复 highflybird 的帖子
非常好的程序,谢谢。

tm20038175 发表于 2011-7-6 21:56:36

回复 highflybird 的帖子

这么好的程序,不得不狂顶。。。。

今天开始,我要连续顶至少一个星期,感谢大师给我们带来了如此完美的程序!………

tm20038175 发表于 2011-7-7 08:56:02

顶一个。。。。…………

tm20038175 发表于 2011-7-7 22:36:09

在顶一个,这么好的程序。。。。。

tm20038175 发表于 2011-7-8 13:06:19

继续顶,好程序,顶满一个星期。。。。

祥子 发表于 2011-7-8 18:59:57

大师出馬,的确与众不同, 这样大家又学了很多东西,希望大师们经常发表高见啊
页: 1 [2] 3
查看完整版本: 如何作块内曲线的切线?