lz123456 发表于 2011-7-14 17:48:27

请各位老大,帮忙搞个画十字交叉线小程序。谢谢

框选矩形和圆或者多线,能自动画出中心的十字交叉线。能区分那矩形的转角。能用于用户坐标系。那中心的十字交叉线长度能记忆,那长度能用户定义。最好的是能识别那不规则的围合多线的中心。不是那质心。网上找的那些不能用于用户坐标。

lz123456 发表于 2011-7-14 17:55:56

网上找的那些不能识别那转角,有的不能一下框选,有的那长度不能自定义并记忆

lz123456 发表于 2011-7-15 11:13:49

找到个合适的,只是不能框选。老大帮忙把那对圆,矩形改成可以框选就爽了。
(defun c:zx ()
(vl-load-com)
(setq ent0 (car (entsel "\n 请选择直线、圆、圆弧、椭圆和矩形:")))
(setq ent1 (entget ent0))
(setq name (cdr (assoc 0 ent1)))
(setq os (getvar "osmode"))
(setq cmd (getvar "CMDECHO"))
(setvar "cmdecho" 0)
(setvar "OSMODE" 0)
;;;所选物体是直线
(cond    ((= name "LINE")
   (setq ent2 (entget (car (entsel "\n 请选择另一条直线:"))))
   (setq point10 (cdr (assoc 10 ent1))
         point11 (cdr (assoc 11 ent1))
         point20 (cdr (assoc 10 ent2))
         point21 (cdr (assoc 11 ent2))
   ) ;_求两直线2个端点的坐标
   (setq ang1 (angle point10 point11)
         ang2 (angle point20 point21)
   )
   (if (or (equal (abs (- ang1 ang2)) pi 0.0001)
         (= (- ang1 ang2) 0)
         )
       (progn
         (setq obj (vlax-Ename->vla-object ent0))
         (setq p0 (vlax-curve-getClosestPointTo obj point20))
         (setq inter-point
            (mapcar '(lambda (a b) (/ (+ a b) 2))
                p0
                point20
            )
         )
         (print inter-point)
         (command "offset" "T" ent0 inter-point "")
       )
       (progn
         (setq inter-point (inters point10 point11 point20 point21 nil)) ;_求得两直线的交点
         (setq p0 (polar inter-point (angle inter-point point10) 10)
         p1 (polar inter-point (angle inter-point point20) 10)
         ) ;_求2个虚拟点

                  ;直线端点离交点最近判断
         (if (> (distance inter-point point10)
            (distance inter-point point11)
         )
         (setq p10 point11
             p11 point10
         )
         (setq p10 point10
             p11 point11
         )
         )
         (if (> (distance inter-point point20)
            (distance inter-point point21)
         )
         (setq p20 point21
             p21 point20
         )
         (setq p20 point20
             p21 point21
         )
         )
                  ;求角平分线上的虚拟点
         (setq inter-point0
            (mapcar '(lambda (a b) (/ (+ a b) 2)) p0 p1)
         )
         (setq p00 (inters p10 p20 inter-point inter-point0 nil)
         p01 (inters p11 p21 inter-point inter-point0 nil)
         )
         (command "LINE" p00 p01 "")
       )
   )
    )
;;;所选物体是圆
    ((or
       (= name "CIRCLE")
       (= name "ARC")
   )
   (setq point (cdr (assoc 10 ent1)))
   (setq r (cdr (assoc 40 ent1)))
   (setq l (+ r 300))
   (setq x (car point)
         y (cadr point)
   )
   (setq point10 (list (- x l) y))
   (setq point11 (list (+ x l) y))
   (setq point20 (list x (+ y l)))
   (setq point21 (list x (- y l)))


   (command "line" point10 point11 "")
   (command "line" point20 point21 "")


    )

;;;所选物体是圆弧
    ;;((= name "ARC")
    ;;    )

;;;所选物体是椭圆
    ((= name "ELLIPSE")
   (setq obj (vlax-Ename->Vla-Object ent0))
   (setq center-point (vlax-safearray->list
                  (vlax-variant-value (vla-get-Center obj))
                )
         StartPoint   (vlax-safearray->list
                  (vlax-variant-value (vla-get-StartPoint obj))
                )
         MajorRadius(vla-get-MajorRadius obj)
         MinorRadius(vla-get-MinorRadius obj)
   )
   (setq ang1 (angle center-point startpoint)
         ang2 (+ ang1 (* pi 0.5))
   )
   (setq point10 (polar center-point ang1 (+ MajorRadius 300))
         point11 (polar center-point
                  (+ ang1 pi)
                  (+ MajorRadius 300)
               )
         point20 (polar center-point ang2 (+ MinorRadius 300))
         point21 (polar center-point
                  (+ ang2 pi)
                  (+ MinorRadius 300)
               )
   )
   (command "LINE" point10 point11 "")
   (command "LINE" point20 point21 "")
    )

;;;所选物体是矩形   
    ((= name "LWPOLYLINE")
   (setq obj (vlax-Ename->Vla-Object ent0))
   (setq point (vlax-safearray->list
               (vlax-variant-value (vla-get-Coordinates obj))
             )
   )
   (if (= (length point) 8)
       (progn

         (setq p1 (list (nth 0 point) (nth 1 point))
         p2 (list (nth 2 point) (nth 3 point))
         p3 (list (nth 4 point) (nth 5 point))
         p4 (list (nth 6 point) (nth 7 point))
         )
         (setq center-point    (mapcar    '(lambda (a b) (/ (+ a b) 2))
                  p1
                  p3
                )
         ang1      (angle p1 p2)
         ang2      (angle p1 p4)
         d1      (distance p1 p2)
         d2      (distance p1 p4)
         )
         (setq point10 (polar center-point ang1 (+ (* d1 0.5) 300))
         point11 (polar center-point
                  (+ ang1 pi)
                  (+ (* d1 0.5) 300)
               )
         point20 (polar center-point ang2 (+ (* d2 0.5) 300))
         point21 (polar center-point
                  (+ ang2 pi)
                  (+ (* d2 0.5) 300)
               )
         )
         (command "LINE" point10 point11 "")
         (command "LINE" point20 point21 "")
       )
       (princ "\n所选物体不是矩形,请重新选择!")
   )
    )
    (T
   (princ
       "\n 所选物体不属于直线、圆、圆弧、椭圆和矩形之内,请重新选择!"
   )
    )
)
(setvar "OSMODE" os)
(setvar "cmdecho" cmd)
(princ)
)

Andyhon 发表于 2011-7-15 12:38:20

本帖最后由 Andyhon 于 2011-7-15 12:39 编辑


(defun zx_1 ()
(setq ent1 (entget ent0))
(setq name (cdr (assoc 0 ent1)))
(setq os (getvar "osmode"))
(setq cmd (getvar "CMDECHO"))
(setvar "cmdecho" 0)
(setvar "OSMODE" 0)
;; 所选物体是直线
(cond
    ((= name "LINE")
   (setq ent2 (entget (car (entsel "\n 请选择另一条直线:"))))
   (setq point10 (cdr (assoc 10 ent1))
         point11 (cdr (assoc 11 ent1))
         point20 (cdr (assoc 10 ent2))
         point21 (cdr (assoc 11 ent2))
   ) ;_求两直线2个端点的坐标
   (setq ang1      (angle point10 point11)
         ang2      (angle point20 point21)
   )
   (if (or (equal (abs (- ang1 ang2)) pi 0.0001)
             (= (- ang1 ang2) 0)
         )
       (progn
         (setq obj (vlax-Ename->vla-object ent0))
         (setq p0 (vlax-curve-getClosestPointTo obj point20))
         (setq inter-point
                (mapcar      '(lambda (a b) (/ (+ a b) 2))
                        p0
                        point20
                )
         )
         (print inter-point)
         (command "offset" "T" ent0 inter-point "")
       )
       (progn
         (setq inter-point (inters point10 point11 point20 point21 nil)) ;_求得两直线的交点
         (setq p0 (polar inter-point (angle inter-point point10) 10)
               p1 (polar inter-point (angle inter-point point20) 10)
         ) ;_求2个虚拟点

                                        ;直线端点离交点最近判断
         (if (>      (distance inter-point point10)
                (distance inter-point point11)
             )
         (setq p10 point11
               p11 point10
         )
         (setq p10 point10
               p11 point11
         )
         )
         (if (>      (distance inter-point point20)
                (distance inter-point point21)
             )
         (setq p20 point21
               p21 point20
         )
         (setq p20 point20
               p21 point21
         )
         )
                                        ;求角平分线上的虚拟点
         (setq inter-point0
                (mapcar '(lambda (a b) (/ (+ a b) 2)) p0 p1)
         )
         (setq p00 (inters p10 p20 inter-point inter-point0 nil)
               p01 (inters p11 p21 inter-point inter-point0 nil)
         )
         (command "LINE" p00 p01 "")
       )
   )
    )
    ;; 所选物体是圆
    ((or
       (= name "CIRCLE")
       (= name "ARC")
   )
   (setq point (cdr (assoc 10 ent1)))
   (setq r (cdr (assoc 40 ent1)))
   (setq l (+ r 300))
   (setq x (car point)
         y (cadr point)
   )
   (setq point10 (list (- x l) y))
   (setq point11 (list (+ x l) y))
   (setq point20 (list x (+ y l)))
   (setq point21 (list x (- y l)))


   (command "line" point10 point11 "")
   (command "line" point20 point21 "")


    )

    ;; 所选物体是圆弧
    ;;((= name "ARC")
    ;;    )

    ;; 所选物体是椭圆
    ((= name "ELLIPSE")
   (setq obj (vlax-Ename->Vla-Object ent0))
   (setq center-point      (vlax-safearray->list
                        (vlax-variant-value (vla-get-Center obj))
                        )
         StartPoint      (vlax-safearray->list
                        (vlax-variant-value (vla-get-StartPoint obj))
                        )
         MajorRadius      (vla-get-MajorRadius obj)
         MinorRadius      (vla-get-MinorRadius obj)
   )
   (setq ang1      (angle center-point startpoint)
         ang2      (+ ang1 (* pi 0.5))
   )
   (setq point10 (polar center-point ang1 (+ MajorRadius 300))
         point11 (polar center-point
                        (+ ang1 pi)
                        (+ MajorRadius 300)
                   )
         point20 (polar center-point ang2 (+ MinorRadius 300))
         point21 (polar center-point
                        (+ ang2 pi)
                        (+ MinorRadius 300)
                   )
   )
   (command "LINE" point10 point11 "")
   (command "LINE" point20 point21 "")
    )

    ;; 所选物体是矩形   
    ((= name "LWPOLYLINE")
   (setq obj (vlax-Ename->Vla-Object ent0))
   (setq point (vlax-safearray->list
                   (vlax-variant-value (vla-get-Coordinates obj))
               )
   )
   (if (= (length point) 8)
       (progn

         (setq p1 (list (nth 0 point) (nth 1 point))
               p2 (list (nth 2 point) (nth 3 point))
               p3 (list (nth 4 point) (nth 5 point))
               p4 (list (nth 6 point) (nth 7 point))
         )
         (setq center-point (mapcar '(lambda (a b) (/ (+ a b) 2))
                                    p1
                                    p3
                            )
               ang1            (angle p1 p2)
               ang2            (angle p1 p4)
               d1            (distance p1 p2)
               d2            (distance p1 p4)
         )
         (setq point10 (polar center-point ang1 (+ (* d1 0.5) 300))
               point11 (polar center-point
                              (+ ang1 pi)
                              (+ (* d1 0.5) 300)
                     )
               point20 (polar center-point ang2 (+ (* d2 0.5) 300))
               point21 (polar center-point
                              (+ ang2 pi)
                              (+ (* d2 0.5) 300)
                     )
         )
         (command "LINE" point10 point11 "")
         (command "LINE" point20 point21 "")
       )
       (princ "\n所选物体不是矩形,请重新选择!")
   )
    )
   )
)

(defun c:zx ()
(vl-load-com)
(princ "\n 请选择直线、圆、圆弧、椭圆和矩形:")
(setq ss (ssget '((0 . "LINE,CIRCLE,ARC,ELLIPSE,LWPOLYLINE")))
         i0
)

(while (setq ent0 (ssname ss i))
    (zx_1)
    (setq i (1+ i))
)

(setvar "OSMODE" os)
(setvar "cmdecho" cmd)
(princ)
)

lz123456 发表于 2011-7-16 01:15:04

对直线结果不对,没关系。只是那多选画了那矩形的那交叉线后那捕捉没了。还有就那U不能一下U完。小问题没关系了。

xq4u 发表于 2011-7-16 08:18:51

本帖最后由 xq4u 于 2011-7-16 08:32 编辑

Andyhon 发表于 2011-7-15 12:38 http://bbs.mjtd.com/static/image/common/back.gif


开始没注意到,原来运行命令是:zx,很好用,可以框选。
页: [1]
查看完整版本: 请各位老大,帮忙搞个画十字交叉线小程序。谢谢