找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 4473|回复: 18

[研讨] wowan1314,讨论下尺寸避让的算法吧。

[复制链接]

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-7-7 13:16:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
wowowan,你和大家讲讲尺寸避让的算法吧,虽然不是你写的,但是你用的最熟,和大家讲讲需要注意的地方。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2013-7-7 13:37:23 | 显示全部楼层
     {:soso_e149:}不好意思,您高估我了。我只会用。

对于标注我都没怎么学习过。因为工作中标注用的不多。

算法思路还是大家直接来看YAD的源码或许更好些。
  1. ;;尺寸文字避让函数---------BY YAD
  2. (defun yad_dimad1 (SS / yad-dxf yad-perpt yad-chgent ss n m ent en ang w h l_dat l_mov oldang mov s pt pt1 pt2 l_adj en l_en disang disw dish item item1)
  3.   (defun yad-dxf(en n)
  4.     (if (not (listp en)) (setq en (entget en)))
  5.     (cdr (assoc n en))
  6.   )
  7.   (defun yad-perpt(pt pt1 pt2)
  8.     (inters pt1 pt2 pt (polar pt (+ (angle pt1 pt2) (/ pi 2)) 1200) nil)
  9.   )
  10.   (defun yad-chgent(en n / m val)
  11.     (if (not (listp en)) (setq en (entget en)))
  12.     (foreach itm n
  13.       (setq m (car itm) val (cadr itm))
  14.       (if (assoc m en)
  15.         (setq en (subst (cons m val) (assoc m en) en))
  16.         (setq en (append en (list (cons m val))))
  17.       )
  18.     )
  19.     (entmod en)
  20.   )
  21.   ;(prompt "\n选择需要自动调整文字位置的一组标注尺寸:")
  22.   (if SS
  23.     (progn
  24.      ; (vl-cmdf "_undo" "_be")
  25.       (vl-cmdf "_.dimedit" "_h" ss "")
  26.       (setq n -1 m 0)
  27.       (repeat (sslength ss)
  28.         (setq ent (ssname ss (setq n (1+ n))))
  29.         (setq en (yad-dxf (tblsearch "block" (yad-dxf ent 2)) -2))
  30.         (while (/= (yad-dxf (setq en (entnext en)) 0) "MTEXT"))
  31.         (setq ang (yad-dxf en 50) h (yad-dxf en 43) w (+ (/ (yad-dxf en 42) 2) (* 0.2 h)) h (* 0.6 h))
  32.         (setq l_dat (cons (list ent ang w h) l_dat))
  33.         (if (< (/ (yad-dxf ent 42) 2) w)
  34.           (if (= (rem (setq m (1+ m)) 2) 0)
  35.             (setq l_mov (cons (list ent ang w h) l_mov))
  36.             (setq l_mov (append l_mov (list (list ent ang w h))))
  37.           )
  38.         )
  39.       )
  40.       (foreach itm l_mov
  41.         (setq ent (car itm) ang (cadr itm) w (caddr itm) h (cadddr itm) pt (yad-dxf ent 11) oldang (angle pt (yad-perpt pt (setq pt1 (yad-dxf ent 10)) (polar pt1 ang 1200))) mov T)
  42.         (while (and mov (setq s (ssget "_f" (list (setq pt1 (polar (polar pt ang w) (+ ang (/ pi 2)) h)) (setq pt2 (polar pt1 (+ ang pi) (* 2 w))) (setq pt2 (polar pt2 (- ang (/ pi 2)) (* 2 h))) (polar pt2 ang (* 2 w)) pt1)
  43.                                            '((0 . "dimension")(-4 . "<or")(70 . 0)(70 . 1)(70 . 32)(70 . 33)(70 . 128)(70 . 129)(70 . 160)(70 . 161)(-4 . "or>"))
  44.                                 )))
  45.           (setq n -1 l_adj nil)
  46.           (repeat (sslength s)
  47.             (setq en (ssname s (setq n (1+ n))))
  48.             (if (and (ssmemb en ss) (not (equal en ent)) (setq l_en (yad-dxf l_dat en)) (equal ang (car l_en) 0.01))
  49.               (progn
  50.                 (setq pt1 (yad-perpt (yad-dxf en 11) pt (polar pt ang 1200))
  51.                       disang (angle pt1 pt)
  52.                       disw (- (+ w (cadr l_en)) (distance pt pt1))
  53.                       dish (- (+ h (caddr l_en)) (distance pt (yad-perpt (yad-dxf en 11) pt (polar pt (+ ang (/ pi 2)) 1200))))
  54.                 )
  55.                 (if (and (> dish 0) (not (equal dish 0 1)))
  56.                   (if (setq item (vl-member-if '(lambda(e) (equal (car e) disang 0.01)) l_adj))
  57.                     (setq item (car item) l_adj (subst (list disang (max disw (cadr item)) (max dish (caddr item))) item l_adj))
  58.                     (setq l_adj (cons (list disang disw dish) l_adj))
  59.                   )
  60.                 )
  61.               )
  62.             )
  63.           )
  64.           (cond
  65.             ((not l_adj) (setq mov nil))
  66.             ((and (= (length l_adj) 1) (setq item (car l_adj)) (> (setq disw (cadr item)) 0) (not (equal disw 0 1)) (> (caddr item) 0))
  67.               (if (> (yad-dxf ent 70) 128)
  68.                 (progn
  69.                   (setq pt1 (yad-perpt pt (setq pt2 (yad-dxf ent 10)) (polar pt2 ang 1200)))
  70.                   (yad-chgent ent (list (list 11 (setq pt (polar pt (setq disang (angle pt pt1)) (* 2 (+ (distance pt pt1) (if (equal disang oldang 0.01) 0 h)))))) (list 70 (+ 128 (rem (yad-dxf ent 70) 128)))))
  71.                 )
  72.                 (progn
  73.                   (setq mov nil)
  74.                   (yad-chgent ent (list (list 11 (polar pt (car item) disw)) (list 70 (+ 128 (rem (yad-dxf ent 70) 128)))))
  75.                 )
  76.               )
  77.             )
  78.             ((and (= (length l_adj) 2) (setq item (car l_adj) item1 (cadr l_adj))
  79.                   (or (and (> (setq disw (cadr item)) 0) (not (equal disw 0 1)) (> (caddr item) 0))
  80.                       (and (> (setq disw (cadr item1)) 0) (not (equal disw 0 1)) (> (caddr item1) 0))
  81.                   ))
  82.               (if (or (> (yad-dxf ent 70) 128) (and (> (caddr item) 0) (> (caddr item1) 0) (> (setq disw (+ (cadr item) (cadr item1))) 0) (not (equal disw 0 1))))
  83.                 (progn
  84.                   (setq pt1 (yad-perpt pt (setq pt2 (yad-dxf ent 10)) (polar pt2 ang 1200)))
  85.                   (if (equal pt pt1 1) (setq disang (- ang (/ pi 2))) (setq disang (angle pt pt1)))
  86.                   (yad-chgent ent (list (list 11 (setq pt (polar pt disang (* 2 (+ (distance pt pt1) (if (equal disang oldang 0.01) 0 h)))))) (list 70 (+ 128 (rem (yad-dxf ent 70) 128)))))
  87.                 )
  88.                 (progn
  89.                   (setq mov nil)
  90.                   (if (or (< (caddr item) 0) (and (< (setq disw (cadr item)) 0) (not (equal disw 0 1))))
  91.                     (setq item item1)
  92.                   )
  93.                   (yad-chgent ent (list (list 11 (polar pt (car item) (cadr item))) (list 70 (+ 128 (rem (yad-dxf ent 70) 128)))))
  94.                 )
  95.               )
  96.             )
  97.             (T (setq mov nil))
  98.           )
  99.         )
  100.       )
  101.       ;(prompt "\n自动调整完毕!")
  102.      ; (vl-cmdf "_undo" "_e")
  103.     )
  104.   )
  105.   (princ)
  106. )

点评

这个工作中确实非常有用,支持老大。  详情 回复 发表于 2013-7-7 16:59

评分

参与人数 1D豆 +10 收起 理由
XDSoft + 10 很给力!经验;技术要点;资料分享奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-7-7 16:59:05 | 显示全部楼层
wowan1314 发表于 2013-7-7 13:37
不好意思,您高估我了。我只会用。

对于标注我都没怎么学习过。因为工作中标注用的不 ...

这个工作中确实非常有用,支持老大。{:soso_e113:}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

发表于 2013-7-7 19:56:57 | 显示全部楼层
本帖最后由 /db_自贡黄明儒_ 于 2013-7-7 20:02 编辑

好像这个避让不怎么管用。
我有一个想法,就是把刚标注的尺寸炸开,然后得到MText(or)text的包围框,搜索包围框内有没有尺寸。

点评

如果找到重合的了,你的算法想怎么移动文字呢,什么时候上,什么时候下,什么时候左,什么时候右?  详情 回复 发表于 2013-7-7 20:52
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-7-7 20:52:57 | 显示全部楼层
/db_自贡黄明儒_ 发表于 2013-7-7 19:56
好像这个避让不怎么管用。
我有一个想法,就是把刚标注的尺寸炸开,然后得到MText(or)text的包围框,搜索包 ...

如果找到重合的了,你的算法想怎么移动文字呢,什么时候上,什么时候下,什么时候左,什么时候右?

点评

既然炸开,那么就可以获取mtext下面的那条线,根据mtext与线的关系,决定尺寸怎么移动  详情 回复 发表于 2013-7-7 21:18
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3884个

财富等级: 富可敌国

发表于 2013-7-7 21:15:14 | 显示全部楼层
感觉标注还是不要搞程序了,简单的图形倒可以用程序,复杂点的,非手工不可。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

发表于 2013-7-7 21:18:34 | 显示全部楼层
newer 发表于 2013-7-7 20:52
如果找到重合的了,你的算法想怎么移动文字呢,什么时候上,什么时候下,什么时候左,什么时候右?

既然炸开了,那么就可以获取mtext下面的那条线,根据mtext与线的关系,决定尺寸怎么移动

点评

怎么会不管用呢? 不知道你的标注是什么样子的。对于对齐标注。这个函数是表现很好的。 另外对于标注里的文字不需要砸开就可以找到。对标注不感兴趣,所以我也没仔细的学习这个函数。  详情 回复 发表于 2013-7-7 21:53
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-7-7 21:53:15 | 显示全部楼层
/db_自贡黄明儒_ 发表于 2013-7-7 21:18
既然炸开了,那么就可以获取mtext下面的那条线,根据mtext与线的关系,决定尺寸怎么移动

    怎么会不管用呢? 不知道你的标注是什么样子的。对于对齐标注。这个函数是表现很好的。

另外对于标注里的文字不需要砸开就可以找到。对标注不感兴趣,所以我也没仔细的学习这个函数。


1111.gif

点评

我使用就相互重叠了!!!  发表于 2013-7-7 22:30
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 185个

财富等级: 日进斗金

发表于 2013-7-8 09:17:33 | 显示全部楼层
我用过yad的尺寸避让,还是觉得tssd的尺寸避让好用,高手们研究下tssd的吧

点评

TSSD的尺寸避让哪里好,和大家说说啊。  详情 回复 发表于 2013-7-8 10:03
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-7-8 10:03:54 | 显示全部楼层
gdslqs 发表于 2013-7-8 09:17
我用过yad的尺寸避让,还是觉得tssd的尺寸避让好用,高手们研究下tssd的吧

TSSD的尺寸避让哪里好,和大家说说啊。

点评

就是感觉避让合理一些,比如避让开了不重叠,又不是拉得很远,刚合适  详情 回复 发表于 2013-7-8 11:17
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 185个

财富等级: 日进斗金

发表于 2013-7-8 11:17:32 | 显示全部楼层
newer 发表于 2013-7-8 10:03
TSSD的尺寸避让哪里好,和大家说说啊。

就是感觉避让合理一些,比如避让开了不重叠,又不是拉得很远,刚合适

点评

可否截取个图片贴论坛来? 或者做个动画的演示,看看。  详情 回复 发表于 2013-7-8 12:19
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-7-8 12:19:40 | 显示全部楼层
gdslqs 发表于 2013-7-8 11:17
就是感觉避让合理一些,比如避让开了不重叠,又不是拉得很远,刚合适

可否截取个图片贴论坛来? 或者做个动画的演示,看看。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 862个

财富等级: 财运亨通

发表于 2013-7-11 08:26:18 | 显示全部楼层
发一个tssd的源码看看~~~~~~~~~~~~~~~~~~~~~~~~~~~~~·
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 9个

财富等级: 恭喜发财

发表于 2014-5-7 23:36:45 | 显示全部楼层
所有标注尺寸文字避让里面,tssd最好用,可以框选一大片,都能很好避让
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-14 22:06 , Processed in 0.252035 second(s), 68 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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