hbgsw 发表于 2015-7-13 14:25:28

根据得到的2条线画垂直线

如附件中的图片所示:
根据用户输入得到2条有夹角的线,怎样求出红色垂直的线(线条3=线条2)?
因为输入的时候,2条线会有各种角度及方向,不知道怎么去算,初学没有多久,请各位给点提示。

819534890 发表于 2015-7-13 15:46:36

1、选择线条1,获得线条1的角度。
2、选择线条2,获得线条2的角度、长度。
3、获得线条1、2的交点。
4。求红线的另外端点(polar 交点 线条2长度 求出的角度),若线条2在线条1的顺时针方向,红线的角度是线条1角度减90度,否则变为线条1角度加90度。
5. 端点和交点的连线即为红线。

fan_zh 发表于 2015-7-13 16:04:58

(defun C:cx(/ xEntPick entName pickPt pt1 pt2 en1 cz)
(vl-load-com)
(setvar 'osmode 0)
(while (not (and (setq xEntPick (entsel "\n选择线: ")))))
(setq entName (car xEntPick))
(setq pickPt (cadr xEntPick))
(setq pt1 (osnap pickpt "_nea"))
(setq pt2 (getpoint "\n另一点"))
(command ".line" pt2 (osnap pt1 "_per") "")
(setq en1 (entlast))
(setq pt1 (osnap pt1 "end"))
(setq cz (vlax-curve-getClosestPointTo entname pt2 T))
(command "_move" en1 "" cz pt1)
(princ)
)

cable2004 发表于 2015-7-13 16:09:51

好像没有规律只能一条一条的选了。

hbgsw 发表于 2015-7-13 17:25:08

819534890 发表于 2015-7-13 15:46 static/image/common/back.gif
1、选择线条1,获得线条1的角度。
2、选择线条2,获得线条2的角度、长度。
3、获得线条1、2的交点。


听您这么一说,大概思路出来了,但还有个问题:
若线条2在线条1的顺时针方向 ,这个有没有好的判断方法,或者函数?

hbgsw 发表于 2015-7-13 17:30:26

fan_zh 发表于 2015-7-13 16:04 static/image/common/back.gif
(defun C:cx(/ xEntPick entName pickPt pt1 pt2 en1 cz)
(vl-load-com)
(setvar 'osmode 0)


谢谢了,对象捕捉也是一个方法,之前没有想到。

edata 发表于 2015-7-14 11:02:01

;;;计算cp到p1 p2的垂足点
(defun PerToLine(cp p1 p2 / norm)
(setq      norm (mapcar '- p2 p1)
      p1   (trans p1 0 norm)
      cp   (trans cp 0 norm)
      )
(trans (list (car p1) (cadr p1) (caddr cp)) norm 0)
)
;;;by edata@mjtd 2015-7-14
(defun sk_dxf(ent code)(cdr (assoc code(entget ent))))
(defun sk_type(ent str)(=(sk_dxf ent 0) str))
(defun c:tt(/ cpt e1 e2 elist ipt p1 p2 p3 p4 p5 p6)
(if(and (setq e1(car(entsel "\n选择直线1:")))
          (sk_type e1 "LINE")
          (setq e2(car(entsel "\n选择直线2:")))
          (sk_type e2 "LINE")
          )
    (progn
      (setq p1(sk_dxf e1 10)
          p2(sk_dxf e1 11)
          p3(sk_dxf e2 10)
          p4(sk_dxf e2 11))
      (setq ipt(inters p1 p2 p3 p4 nil))
      (if(>(distance p3 ipt)(distance p4 ipt))
        (setq p5 p3)
        (setq p5 p4)
        )
        (setq cpt(PerToLine p5 p1 p2))
        (setq p6(polar ipt (angle cpt p5)(distance p3 p4)))
      (setq elist(entget e2))
      (setq elist(subst(cons 10 ipt)(assoc 10 elist)elist)
          elist(subst(cons 11 p6)(assoc 11 elist)elist)
          )
      (entmake elist)
      )
    (princ "\n请选择直线.")
    )
(princ)
)
   

hbgsw 发表于 2015-7-14 13:22:25

edata 发表于 2015-7-14 11:02 static/image/common/back.gif


膜拜啊,对比了自己的代码,这差距太大了。
页: [1]
查看完整版本: 根据得到的2条线画垂直线