明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3280|回复: 5

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

[复制链接]
发表于 2011-7-14 17:48:27 | 显示全部楼层 |阅读模式
框选矩形和圆或者多线,能自动画出中心的十字交叉线。能区分那矩形的转角。能用于用户坐标系。那中心的十字交叉线长度能记忆,那长度能用户定义。最好的是能识别那不规则的围合多线的中心。不是那质心。网上找的那些不能用于用户坐标。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 2011-7-14 17:55:56 | 显示全部楼层
网上找的那些不能识别那转角,有的不能一下框选,有的那长度不能自定义并记忆
 楼主| 发表于 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)
)
发表于 2011-7-15 12:38:20 | 显示全部楼层
本帖最后由 Andyhon 于 2011-7-15 12:39 编辑

  1. (defun zx_1 ()
  2.   (setq ent1 (entget ent0))
  3.   (setq name (cdr (assoc 0 ent1)))
  4.   (setq os (getvar "osmode"))
  5.   (setq cmd (getvar "CMDECHO"))
  6.   (setvar "cmdecho" 0)
  7.   (setvar "OSMODE" 0)
  8.   ;; 所选物体是直线
  9.   (cond
  10.     ((= name "LINE")
  11.      (setq ent2 (entget (car (entsel "\n 请选择另一条直线:"))))
  12.      (setq point10 (cdr (assoc 10 ent1))
  13.            point11 (cdr (assoc 11 ent1))
  14.            point20 (cdr (assoc 10 ent2))
  15.            point21 (cdr (assoc 11 ent2))
  16.      ) ;_求两直线2个端点的坐标
  17.      (setq ang1        (angle point10 point11)
  18.            ang2        (angle point20 point21)
  19.      )
  20.      (if (or (equal (abs (- ang1 ang2)) pi 0.0001)
  21.              (= (- ang1 ang2) 0)
  22.          )
  23.        (progn
  24.          (setq obj (vlax-Ename->vla-object ent0))
  25.          (setq p0 (vlax-curve-getClosestPointTo obj point20))
  26.          (setq inter-point
  27.                 (mapcar        '(lambda (a b) (/ (+ a b) 2))
  28.                         p0
  29.                         point20
  30.                 )
  31.          )
  32.          (print inter-point)
  33.          (command "offset" "T" ent0 inter-point "")
  34.        )
  35.        (progn
  36.          (setq inter-point (inters point10 point11 point20 point21 nil)) ;_求得两直线的交点
  37.          (setq p0 (polar inter-point (angle inter-point point10) 10)
  38.                p1 (polar inter-point (angle inter-point point20) 10)
  39.          ) ;_求2个虚拟点

  40.                                         ;直线端点离交点最近判断
  41.          (if (>        (distance inter-point point10)
  42.                 (distance inter-point point11)
  43.              )
  44.            (setq p10 point11
  45.                  p11 point10
  46.            )
  47.            (setq p10 point10
  48.                  p11 point11
  49.            )
  50.          )
  51.          (if (>        (distance inter-point point20)
  52.                 (distance inter-point point21)
  53.              )
  54.            (setq p20 point21
  55.                  p21 point20
  56.            )
  57.            (setq p20 point20
  58.                  p21 point21
  59.            )
  60.          )
  61.                                         ;求角平分线上的虚拟点
  62.          (setq inter-point0
  63.                 (mapcar '(lambda (a b) (/ (+ a b) 2)) p0 p1)
  64.          )
  65.          (setq p00 (inters p10 p20 inter-point inter-point0 nil)
  66.                p01 (inters p11 p21 inter-point inter-point0 nil)
  67.          )
  68.          (command "LINE" p00 p01 "")
  69.        )
  70.      )
  71.     )
  72.     ;; 所选物体是圆
  73.     ((or
  74.        (= name "CIRCLE")
  75.        (= name "ARC")
  76.      )
  77.      (setq point (cdr (assoc 10 ent1)))
  78.      (setq r (cdr (assoc 40 ent1)))
  79.      (setq l (+ r 300))
  80.      (setq x (car point)
  81.            y (cadr point)
  82.      )
  83.      (setq point10 (list (- x l) y))
  84.      (setq point11 (list (+ x l) y))
  85.      (setq point20 (list x (+ y l)))
  86.      (setq point21 (list x (- y l)))


  87.      (command "line" point10 point11 "")
  88.      (command "line" point20 point21 "")


  89.     )

  90.     ;; 所选物体是圆弧
  91.     ;;((= name "ARC")
  92.     ;;    )

  93.     ;; 所选物体是椭圆
  94.     ((= name "ELLIPSE")
  95.      (setq obj (vlax-Ename->Vla-Object ent0))
  96.      (setq center-point        (vlax-safearray->list
  97.                           (vlax-variant-value (vla-get-Center obj))
  98.                         )
  99.            StartPoint        (vlax-safearray->list
  100.                           (vlax-variant-value (vla-get-StartPoint obj))
  101.                         )
  102.            MajorRadius        (vla-get-MajorRadius obj)
  103.            MinorRadius        (vla-get-MinorRadius obj)
  104.      )
  105.      (setq ang1        (angle center-point startpoint)
  106.            ang2        (+ ang1 (* pi 0.5))
  107.      )
  108.      (setq point10 (polar center-point ang1 (+ MajorRadius 300))
  109.            point11 (polar center-point
  110.                           (+ ang1 pi)
  111.                           (+ MajorRadius 300)
  112.                    )
  113.            point20 (polar center-point ang2 (+ MinorRadius 300))
  114.            point21 (polar center-point
  115.                           (+ ang2 pi)
  116.                           (+ MinorRadius 300)
  117.                    )
  118.      )
  119.      (command "LINE" point10 point11 "")
  120.      (command "LINE" point20 point21 "")
  121.     )

  122.     ;; 所选物体是矩形   
  123.     ((= name "LWPOLYLINE")
  124.      (setq obj (vlax-Ename->Vla-Object ent0))
  125.      (setq point (vlax-safearray->list
  126.                    (vlax-variant-value (vla-get-Coordinates obj))
  127.                  )
  128.      )
  129.      (if (= (length point) 8)
  130.        (progn

  131.          (setq p1 (list (nth 0 point) (nth 1 point))
  132.                p2 (list (nth 2 point) (nth 3 point))
  133.                p3 (list (nth 4 point) (nth 5 point))
  134.                p4 (list (nth 6 point) (nth 7 point))
  135.          )
  136.          (setq center-point (mapcar '(lambda (a b) (/ (+ a b) 2))
  137.                                     p1
  138.                                     p3
  139.                             )
  140.                ang1            (angle p1 p2)
  141.                ang2            (angle p1 p4)
  142.                d1            (distance p1 p2)
  143.                d2            (distance p1 p4)
  144.          )
  145.          (setq point10 (polar center-point ang1 (+ (* d1 0.5) 300))
  146.                point11 (polar center-point
  147.                               (+ ang1 pi)
  148.                               (+ (* d1 0.5) 300)
  149.                        )
  150.                point20 (polar center-point ang2 (+ (* d2 0.5) 300))
  151.                point21 (polar center-point
  152.                               (+ ang2 pi)
  153.                               (+ (* d2 0.5) 300)
  154.                        )
  155.          )
  156.          (command "LINE" point10 point11 "")
  157.          (command "LINE" point20 point21 "")
  158.        )
  159.        (princ "\n所选物体不是矩形,请重新选择!")
  160.      )
  161.     )
  162.    )
  163. )

  164. (defun c:zx ()
  165.   (vl-load-com)
  166.   (princ "\n 请选择直线、圆、圆弧、椭圆和矩形:")
  167.   (setq ss (ssget '((0 . "LINE,CIRCLE,ARC,ELLIPSE,LWPOLYLINE")))
  168.          i  0
  169.   )
  170.   
  171.   (while (setq ent0 (ssname ss i))
  172.     (zx_1)
  173.     (setq i (1+ i))
  174.   )  
  175.   
  176.   (setvar "OSMODE" os)
  177.   (setvar "cmdecho" cmd)
  178.   (princ)
  179. )
 楼主| 发表于 2011-7-16 01:15:04 | 显示全部楼层
对直线结果不对,没关系。只是那多选画了那矩形的那交叉线后那捕捉没了。还有就那U不能一下U完。小问题没关系了。
发表于 2011-7-16 08:18:51 | 显示全部楼层
本帖最后由 xq4u 于 2011-7-16 08:32 编辑
Andyhon 发表于 2011-7-15 12:38


开始没注意到,原来运行命令是:zx,很好用,可以框选。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-6-10 04:07 , Processed in 0.129115 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表