明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 8730|回复: 21

cad图块的自动标注定位

  [复制链接]
发表于 2012-1-4 14:47:04 | 显示全部楼层 |阅读模式
1明经币
请问哪位大侠能否帮忙编一个块的自动定位程序啊。就是将一个图块的基点自动与相邻最近的两条垂直的直线(轴线)进行标注。论坛中有朋友指点:先算出图块的基点及 水平线和垂直线的交点,然后分成 两个数字表 X坐标,Y坐标,然后对两个表排序,然后取基点的X坐标值与相邻的两个数值相减,取绝对值,较小的就是要找的,Y坐标同样如此,X,Y合起来的那个点就是要找的点,再标注。能否可行,不知哪位高手可以帮忙编出来么!!

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

最佳答案

查看完整内容

这个贴好久没有人回答,由于没测试图,发个给你看看,能否符合要求
发表于 2012-1-4 14:47:05 | 显示全部楼层
这个贴好久没有人回答,由于没测试图,发个给你看看,能否符合要求
  1. (defun c:tt( / lay ss n xlist ylist en pt1 pt2 ang ss1 pt x y xlist1 ylist1 dimx dimy x1 x2 y1 y2)
  2.   (command "_.undo" "be")
  3.   (setvar "dimdsep" ".")
  4.   (setvar "dimtxt" 5)
  5.   (setvar "dimblk" "_archtick")
  6.   (setq lay (cdr (assoc 8 (entget (car (entsel "\n请选择轴线所在图层:"))))))
  7.   (setq ss (ssget "x" (list (cons 0 "line") (cons 8 lay))))
  8.   (setq n 0 xlist nil ylist nil)
  9.   (if ss
  10.     (progn
  11.       (repeat (sslength ss)
  12.         (setq en (ssname ss n))
  13.         (setq pt1 (cdr (assoc 10 (entget en))) pt2 (cdr (assoc 11 (entget en))))
  14.         (setq ang (angle pt1 pt2))
  15.         (cond ((or (= ang 0) (= ang pi)) (setq ylist (cons (cadr pt1) ylist)))
  16.               ((or (= ang (* 0.5 pi)) (= ang (* 1.5 pi))) (setq xlist (cons (car pt1) xlist)))
  17.               )
  18.         (setq n (1+ n))
  19.       )
  20.       (princ "\n请选择要标注尺寸的图块:")
  21.       (setq ss1 (ssget '((0 . "insert"))) n 0)
  22.       (if ss1
  23.         (progn
  24.           (repeat (sslength ss1)
  25.             (setq en (ssname ss1 n))
  26.             (setq pt (cdr (assoc 10 (entget en))))
  27.             (setq x (car pt) y (cadr pt))
  28.             (setq xlist1 (vl-sort (cons x xlist) '<))
  29.             (cond ((= x (car xlist1)) (setq dimx (cadr xlist1)))
  30.                   ((= x (last xlist1)) (setq dimx (cadr (member x (reverse xlist1)))))
  31.                   (t  (setq x1 (cadr (member x (reverse xlist1))) x2 (cadr (member x xlist1)))
  32.                       (if (> (- x2 x) (- x x1)) (setq dimx x1) (setq dimx x2))
  33.                   )
  34.             )
  35.             (command "_dimaligned" pt (list dimx (cadr pt)) (list dimy (- (cadr pt) 10)))
  36.             (setq ylist1 (vl-sort (cons y ylist) '<))
  37.             (cond ((= y (car ylist1)) (setq dimy (cadr ylist1)))
  38.                   ((= y (last ylist1)) (setq dimy (cadr (member y (reverse ylist1)))))
  39.                   (t  (setq y1 (cadr (member y (reverse ylist1))) y2 (cadr (member y ylist1)))
  40.                       (if (> (- y2 y) (- y y1)) (setq dimy y1) (setq dimy y2))
  41.                   )
  42.             )
  43.             (command "_dimaligned" pt (list (car pt) dimy) (list (- (car pt) 10) dimy))
  44.             (setq n (1+ n))
  45.           )
  46.           )
  47.         )
  48.       )
  49.     (princ "\n没有轴线")
  50.     )
  51.   (command "_.undo" "e")
  52.   )
回复

使用道具 举报

 楼主| 发表于 2012-1-5 10:30:32 | 显示全部楼层
兄弟们给力啊
回复

使用道具 举报

发表于 2012-1-5 11:06:26 | 显示全部楼层
可以上传测试图来看看
回复

使用道具 举报

 楼主| 发表于 2012-1-9 11:10:56 | 显示全部楼层
回复

使用道具 举报

发表于 2012-1-9 12:30:14 | 显示全部楼层
帮忙顶一下
回复

使用道具 举报

发表于 2012-1-10 03:16:12 | 显示全部楼层
好像没什么难度,10个币值得一试。
回复

使用道具 举报

发表于 2012-1-10 05:35:15 | 显示全部楼层
;自己优化一下,碰到多条线时暂不处理
(defun c:1 (/ mid dxf ss-y ss-x MINDIST ss ss1 name pt pt1 dis i test)
  (defun MID (PT1 PT2)
    (list
      (* 0.5 (+ (nth 0 PT1) (nth 0 PT2)))
      (* 0.5 (+ (nth 1 PT1) (nth 1 PT2)))
    )
  )
  (defun dxf (i name /)
    (cdr (assoc i (entget name)))
  )
  (defun ss-y (pt dis / pt1 pt2)
    (setq pt1 (list (- (car pt) dis) (- (cadr pt) 0.5)))
    (setq pt2 (list (+ (car pt) dis) (+ (cadr pt) 0.5)))
    (if        (setq ss1 (ssget "c" pt1 pt2 '((0 . "LINE"))))
      (if (and (= (sslength ss1) 1)
               (setq name (ssname ss1 0))
               (or
                 (equal        (angle (dxf 10 name) (dxf 11 name))
                        (* 0.5 pi)
                        0.0001
                 )
                 (equal        (angle (dxf 10 name) (dxf 11 name))
                        (* 1.5 pi)
                        0.0001
                 )
               )
          )
        T
        nil
      )
    )
  )
  (defun ss-x (pt dis / pt1 pt2)
    (setq pt1 (list (- (car pt) 0.5) (- (cadr pt) dis)))
    (setq pt2 (list (+ (car pt) 0.5) (+ (cadr pt) dis)))
    (if        (setq ss1 (ssget "c" pt1 pt2 '((0 . "LINE"))))
      (if (and (= (sslength ss1) 1)
               (setq name (ssname ss1 0))
               (or
                 (equal        (angle (dxf 10 name) (dxf 11 name))
                        0
                        0.0001
                 )
                 (equal        (angle (dxf 10 name) (dxf 11 name))
                        pi
                        0.0001
                 )
               )
          )
        T
        nil
      )
    )
  )
  (defun MINDIST (PT NAME /)
    (vlax-curve-getclosestpointto
      (vlax-ename->vla-object name)
      pt
      t
    )
  )
  (if (setq ss (ssget '((0 . "INSERT"))))
    (progn
      (setvar "osmode" 0)
      (setq i -1)
      (while (setq name (ssname ss (setq i (1+ i))))
        (setq pt   (trans (dxf 10 name) 0 1)
              test T
              dis  0
        )
        (while test
          (setq dis (+ dis 10))
          (if (> dis 2000)
            (setq test nil)
            (if        (ss-y pt dis)
              (progn
                (setq pt1 (trans (MINDIST (trans pt 1 0) name) 0 1))
                (if (> (distance pt pt1) 0)
                  (command "dimlinear" pt pt1 (mid pt pt1))
                )
                (setq test nil)
              )
            )
          )
        )
        (setq test T
              dis 0
        )
        (while test
          (setq dis (+ dis 10))
          (if (> dis 2000)
            (setq test nil)
            (if        (ss-x pt dis)
              (progn
                (setq pt1 (trans (MINDIST (trans pt 1 0) name) 0 1))
                (if (> (distance pt pt1) 0)
                  (command "dimlinear" pt pt1 (mid pt pt1))
                )
                (setq test nil)
              )
            )
          )
        )
      )
    )
  )
)

评分

参与人数 1明经币 +1 收起 理由
10410024 + 1 虽然没达到我的目的,但还是非常感谢兄弟相.

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2012-1-10 09:53:42 | 显示全部楼层
byghbcx 发表于 2012-1-10 09:25
这个贴好久没有人回答,由于没测试图,发个给你看看,能否符合要求

虽然目前为止未能解决问题,还是非常感谢兄弟的相助!!其实我想法很简单,第一步是选择相互垂直或平行的多条直线,第二步是选择希望定位标注的“块”,然后自动完成块的定位(块基点到最近的两条直线的垂直距离)。哪位大哥能否帮忙修改!!
回复

使用道具 举报

发表于 2012-1-10 10:02:29 | 显示全部楼层
10410024 发表于 2012-1-10 09:53
虽然目前为止未能解决问题,还是非常感谢兄弟的相助!!其实我想法很简单,第一步是选择相互垂直或平行的 ...

你的原图呢,我的测试图中可以运行

本帖子中包含更多资源

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

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-18 19:57 , Processed in 0.218256 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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