明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 34271|回复: 197

[源码] 尺寸避让源码,请指正

    [复制链接]
发表于 2012-10-16 20:32 | 显示全部楼层 |阅读模式
本帖最后由 x_s_s_1 于 2013-5-18 15:24 编辑

写了个尺寸避让的程序,有建议,请指正。如觉得好用的,赏个币,小生确实太穷了

谢谢大家关注,去掉回复限制了,世界末日都挺过来了
  1. (DEFUN C:ccbr (/ SS SC EN_DATA_LST DIS1 DIS2)
  2.   (if (or (= (getvar "userr1") "") (equal (getvar "userr1") 0))(setvar "userr1" (getreal "\n请输入比例:")))
  3.   (defun x_get_dxf (en n /)
  4.     (cdr (assoc n (entget en)))
  5.   )
  6. ;;;x_ssn函数(x_ssn ss)
  7. ;;;ss参数:选折集
  8. ;;;返回图元名表
  9.   (defun x_ssn (ss / n lst)
  10.     (repeat (setq N (sslength ss))
  11.       (setq LST (cons (ssname SS (setq N (1- N))) LST))
  12.     ) ;_ 结束repeat
  13.   ) ;_ 结束defun
  14. ;;;修改组码en 图元名 num 组码 ch 修改为
  15.   (defun ch_dxf  (en num ch / old_num new_num ent)
  16.     (if  (setq ent     (entget en)
  17.         new_num (cons num ch)
  18.         old_num (assoc num ent)
  19.   ) ;_ 结束setq
  20.       (entmod (subst new_num old_num ent))
  21.       (entmod (reverse (cons new_num (reverse ent))))
  22.     ) ;_ 结束if
  23.   ) ;_ 结束defun
  24. ;;;获取尺寸图元文字中点坐标,文字宽度,文字角度,文字中点距线距离,图元名
  25.           ;(dim_txt_data(car (entsel)))
  26.   (defun dim_txt_data (dim_en / en pt1 pt2 ang pt3 dist)
  27.     (setq en (cdr (assoc -2 (tblsearch "block" (x_get_dxf dim_en 2)))))
  28.           ;获取尺寸块图元名
  29.     (while (/= (x_get_dxf (setq en (entnext en)) 0) "MTEXT"))
  30.           ;获取尺寸内文字图元名
  31.     (setq pt1  (x_get_dxf dim_en 11)  ;文字中点坐标
  32.     pt2  (x_get_dxf dim_en 10)  ;定义点
  33.     ang  (x_get_dxf en 50)  ;角度
  34.     pt3  (inters pt2
  35.            (polar pt2 ang 100)
  36.            pt1
  37.            (polar pt1 (+ ang (/ pi 2)) 100)
  38.            nil
  39.          )
  40.     dist (distance pt1 pt3)
  41.     )
  42.     (list pt1 (x_get_dxf en 42) ang dist dim_en)
  43.   )
  44. ;;;尺寸文字顺尺寸线方向移动
  45.           ;(setq en_data(cadr en_data_lst))
  46.   (defun dim_txt_move_l  (dis1 dis2 ang en_data / dis)
  47.     (setq dis (- dis2 dis1))
  48.     (ch_dxf
  49.       (last en_data)
  50.       70
  51.       (+ 128 (rem (x_get_dxf (last en_data) 70) 128))
  52.     )
  53.     (ch_dxf
  54.       (last en_data)
  55.       11
  56.       (polar (car en_data) ang dis)
  57.     )
  58.   )
  59. ;;;尺寸文字垂直尺寸线方向移动
  60.   (defun dim_txt_move_v  (dis ang en /)
  61.     (ch_dxf en 70 (+ 128 (rem (x_get_dxf en 70) 128)))
  62.     (ch_dxf en 11 (polar (x_get_dxf en 11) ang dis))
  63.   )
  64. ;;;根据表内第一元素的xy排序
  65.   (defun dim_sort (lst /)
  66.     (setq lst
  67.      (vl-sort
  68.        lst
  69.        (function (lambda (e1 e2) (< (car (car e1)) (car (car e2))))
  70.        )
  71.      )
  72.     )
  73.     (vl-sort lst
  74.        (function
  75.          (lambda (e1 e2) (< (cadr (car e1)) (cadr (car e2))))
  76.        )
  77.     )
  78.   )
  79. ;;;(setq lst'(1 2 3 4 5 6 7 8 9) newlst nil)
  80. ;;;->((1 2 3) (3 4 5) (5 6))
  81. ;;;(list->3@2 lst)
  82.   (defun list->3@2 (lst / newlst x y)
  83.     (repeat (length lst)
  84.       (if lst
  85.   (setq newlst (cons (list (car lst) (cadr lst) (caddr lst)) newlst)
  86.         lst    (cddr lst)
  87.   )
  88.       )
  89.     )
  90.     (setq
  91.       nwelst
  92.        (mapcar '(lambda  (x)
  93.       (vl-remove-if (FUNCTION (LAMBDA (y) (= y nil))) x)
  94.     )
  95.          (reverse newlst)
  96.        )
  97.     )
  98.   )
  99.   (defun dist< (lst sc /)
  100.     (if  (< (distance (car (nth 0 lst)) (car (nth 1 lst)))
  101.      (+ (/ (cadr (nth 0 lst)) 2) (/ (cadr (nth 1 lst)) 2) sc)
  102.   )
  103.       t
  104.       (if (< (distance (car (nth 1 lst)) (car (nth 2 lst)))
  105.        (+ (/ (cadr (nth 1 lst)) 2) (/ (cadr (nth 2 lst)) 2) sc)
  106.     )
  107.   t
  108.       )
  109.     )
  110.   )
  111.   (setq  ss (ssget '((0 . "DIMENSION")))
  112.   sc (getvar "userr1")
  113.   )
  114.   (vl-cmdf "_.dimedit" "_h" ss "")
  115.   (setq en_data_lst (dim_sort (mapcar 'dim_txt_data (x_ssn ss))))
  116.   (cond
  117.     ((= (length en_data_lst) 2)
  118.      (if (< (setq dis1 (distance (car (nth 0 en_data_lst))
  119.          (car (nth 1 en_data_lst))
  120.            )
  121.       )
  122.       (setq dis2 (+ (/ (cadr (nth 0 en_data_lst)) 2)
  123.         (/ (cadr (nth 1 en_data_lst)) 2)
  124.         sc
  125.            )
  126.       )
  127.    )
  128.        (progn
  129.    (dim_txt_move_l
  130.      dis1
  131.      dis2
  132.      (+ (caddr (car en_data_lst)) pi)
  133.      (car en_data_lst)
  134.    )
  135.    (dim_txt_move_l
  136.      dis1
  137.      dis2
  138.      (caddr (cadr en_data_lst))
  139.      (cadr en_data_lst)
  140.    )
  141.        )
  142.      )
  143.     )
  144.     ((> (length en_data_lst) 2)
  145.      (cond
  146.        ((= 1
  147.      (length (last (setq en_data_lst (list->3@2 en_data_lst))))
  148.   )
  149.   (mapcar  '(lambda (x)
  150.        (if (dist< x sc)
  151.          (dim_txt_move_v
  152.            (* 2 (cadddr (cadr x)))
  153.            (+ (* 1.5 pi) (caddr (cadr x)))
  154.            (last (cadr x))
  155.          )
  156.        )
  157.      )
  158.     (reverse (cdr (reverse en_data_lst)))
  159.   )
  160.        )
  161.        ((= 2 (length (last en_data_lst)))
  162.   (mapcar  '(lambda (x)
  163.        (if (dist< x sc)
  164.          (dim_txt_move_v
  165.            (* 2 (cadddr (cadr x)))
  166.            (+ (* 1.5 pi) (caddr (cadr x)))
  167.            (last (cadr x))
  168.          )
  169.        )
  170.      )
  171.     (reverse (cdr (reverse en_data_lst)))
  172.   )
  173.   (setq en_data_lst (car (reverse en_data_lst)))
  174.   (if (< (setq dis1 (distance (car (nth 0 en_data_lst))
  175.             (car (nth 1 en_data_lst))
  176.         )
  177.          )
  178.          (setq dis2 (+ (/ (cadr (nth 0 en_data_lst)) 2)
  179.            (/ (cadr (nth 1 en_data_lst)) 2)
  180.            (* 2 sc)
  181.         )
  182.          )
  183.       )
  184.     (dim_txt_move_l
  185.       dis1
  186.       dis2
  187.       (caddr (cadr en_data_lst))
  188.       (cadr en_data_lst)
  189.     )
  190.   )
  191.        )
  192.      )
  193.     )
  194.   )
  195.   (princ)
  196. )

本帖子中包含更多资源

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

x

评分

参与人数 14明经币 +13 金钱 +20 收起 理由
lee50310 + 1 赞一个!
cq4920 + 1 赞一个!
songyujie928 + 1 赞一个!
xjf + 1 赞一个!
abbasabbs + 20
头大无恼 + 1 赞一个!
zhouren_cmi + 1 很给力!
nt8011 + 1 赞一个!
xzqk132 + 1 很给力!
sz721 + 1 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

发表于 2012-10-17 08:54 | 显示全部楼层
很少用得到的程序
回复 支持 1 反对 0

使用道具 举报

发表于 2012-10-16 20:44 | 显示全部楼层
坐沙发支持一下
发表于 2012-10-16 20:47 | 显示全部楼层
看看楼主的程序!
发表于 2012-10-16 21:02 | 显示全部楼层
高手的程序,一定要学习!
发表于 2012-10-16 21:07 | 显示全部楼层
看看楼主的程序
提个想法很多时候那尺寸调整是手动比较好
那尺寸文字以那字高为准,像第1列的话往左移就1倍字高,往右移动就2倍自高。其他同。本可以用夹点移动,但是要准确的话每次要输入距离值。(或者那移动距离定个默认值,根据移动的方向自动判断。)移动都是正交的.最好是支持UCS

本帖子中包含更多资源

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

x
发表于 2012-10-16 21:10 | 显示全部楼层
看看,学习一下
发表于 2012-10-16 21:35 | 显示全部楼层
看看楼主的程序!
发表于 2012-10-16 21:36 | 显示全部楼层
发表于 2012-10-16 22:00 | 显示全部楼层
支持一下......
发表于 2012-10-16 22:10 | 显示全部楼层
这是一定用的到的,谢谢啦!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-28 22:20 , Processed in 0.560757 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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