明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 6611|回复: 25

如何自动检查图纸中有无手改尺寸?

    [复制链接]
发表于 2011-10-14 15:57 | 显示全部楼层 |阅读模式
1明经币
;此代码必须手动输入命令才能实现查找“手改尺寸”,如何实现“打开一张图纸就会弹出是否有手改尺寸”,记住,重点不在于“启动组”、“S::STARTUP " 、(c:xg)这些东西上面,因为程度的第一步在于选择图上的标注,不手动选择就会卡在选择这一步而进行不下去, 我们可以参考(command ”eraser" "all")这个句子,如何自动将所有的图元选中是关键(句子中过滤的部分了)。另外还有一个问题是当图纸中含有yellow颜色的图层时,修改后的标注颜色不变,也就是和其它的区别不开,最好是建一个金色的图层(rgb R:255 G:215 B:000)这样冷门的颜色来避免冲突。
  1. ;============================================================================
  2. (defun C:XG (/ Diment n cnt entn Dimn txtlst oldtxt newtxt I)
  3.    (SETVAR CMDECHO_OLD (GETVAR "CMDECHO"))
  4.    (SETVAR "CMDECHO" 0)
  5.    (ssget)
  6.    (SETQ Diment (SSGET "p" '((0 . "DIMENSION")))           
  7.          n      (sslength Diment)
  8.          cnt    0
  9.          I      0
  10.    )
  11.    (PRINC (strcat "共有" (itoa N) " 个尺寸被选择。\n"))
  12.    (if (not (tblseArch "layer" "YTM"))                  
  13.                                                          
  14.       (command ".-layer" "N" "YTM" "")
  15.    )
  16.    (WHILE (< I n)                                
  17.       (PROGN (SETQ entn (ssname Diment I)
  18.                    Dimn (entget entn)
  19.              )
  20.              (setq oldtxt (cdr (setq txtlst (assoc 1 Dimn))))
  21.              (if (OR (WCMATCH OLDTXT "*<>*") (= OLDTXT ""))
  22.                                                            
  23.                 (terpri)
  24.                 (progn (setq newtxt (strcat oldtxt "(<>)"))
  25.                                                            
  26.                        (SETQ DIMN (subst (cons 1 newtxt) txtlst Dimn))
  27.                        (SETQ DIMN (SUBST (CONS 8 "YTM") (ASSOC 8 DIMN) DIMN))
  28.                        (entmod Dimn)                    
  29.                        (setq cnt (1+ cnt))
  30.                 )
  31.              )
  32.              (SETQ I (1+ I))
  33.       )
  34.    )
  35.    (COMMAND ".-LAYER" "c" "yellow" "YTM" "")
  36.    (ALERT (strcat "合计查到 " (itoA cnt) " 个尺寸被手动改变!" "\n已放到YTM图层(黄色显示)"))
  37.    (SETVAR "CMDECHO" CMDECHO_OLD)
  38.    (GRTEXT)
  39.    (princ)
  40.    (GC)
  41. )
  42. ;============================================================================

最佳答案

查看完整内容

我的解决方法说明: 1、用(ssget "x" [filterlist])可以不用手动选择干预,选择图形数据库中所有对象。 2、我不认为标注内容带""的就不是伪标,如果是标注内容是"12"呢?所以只要标注图元组码1不为空字符串,就认为是伪标。 3、新建不同颜色的图层不一定合适,很难保证和正确的标注有强烈的反差。如果加上红色的文字背景,则二者的反差就大了,几乎不会有人设置标注样式的时候会添加标注文字背景。 所以我的解决方案是这样的 ...
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2011-10-14 15:57 | 显示全部楼层
本帖最后由 vormittag 于 2011-10-14 18:14 编辑

我的解决方法说明:
1、用(ssget "x" [filterlist])可以不用手动选择干预,选择图形数据库中所有对象。
2、我不认为标注内容带"<>"的就不是伪标,如果是标注内容是"1<>2"呢?所以只要标注图元组码1不为空字符串,就认为是伪标。
3、新建不同颜色的图层不一定合适,很难保证和正确的标注有强烈的反差。如果加上红色的文字背景,则二者的反差就大了,几乎不会有人设置标注样式的时候会添加标注文字背景。

所以我的解决方案是这样的:
  1. (defun c:wbxs( / ss i ename)
  2.     (setq ss (ssget "X" '((0 . "DIMENSION")(-4 . "<NOT") (1 . "")(-4 . "NOT>")))
  3.              i  0
  4.     );setq
  5.     (if (/= nil ss)
  6.         (repeat (sslength ss)
  7.               (setq ename (ssname ss i)
  8.                        i          (1+ i)
  9.               );setq
  10.               (set_pseudodim ename)
  11.          );repeat
  12.      );if
  13.     (princ)
  14. )
  15. ;;;设置伪标显示扩展数据
  16. (defun set_pseudodim (ename / nel l ll)
  17.     (setq ll (list (cons 1002 "}"))
  18.               l  (cons 1070 2)
  19.                   ll (cons l ll)
  20.                   l  (cons 1070 69)
  21.                   ll (cons l ll)
  22.                   l  (cons 1070 1)
  23.                   ll (cons l ll)
  24.                   l  (cons 1070 70)
  25.                   ll (cons l ll)
  26.                   l  (cons 1002 "{")
  27.                   ll (cons l ll)
  28.                   l  (cons 1000 "DSTYLE")
  29.                   ll (cons l ll)
  30.                   ll (list -3 (cons "ACAD" ll))
  31.                   el (entget ename)
  32.                   nel (cons ll el)
  33.         );setq
  34.         (regapp "ACAD")
  35.         (entmod nel)
  36. )
如果要恢复标注的样式,去掉文字背景,用下面的代码:
  1. ;;;恢复样式的方法
  2. (defun c:bzyshf ( / ss i ename ell)
  3.     (setq ss (ssget "X" '((0 . "DIMENSION") (-3 ("ACAD"))))
  4.              i 0
  5.     );setq
  6.     (if (/= nil ss)
  7.         (repeat (sslength ss)
  8.                (setq ename (ssname ss i)
  9.                         i          (1+ i)
  10.                );setq
  11.                (removexdata ename "ACAD")
  12.         );repeat
  13.      );if
  14.         (princ)
  15. )
  16. ;;; 删除指定扩展数据
  17. (defun removexdata(ename appid / id idlist ell1 ell2)
  18.     (setq id  (tblnext "APPID" 'T)
  19.              idlist nil
  20.     );setq
  21.     (while id
  22.          (setq idlist (cons (cdr (assoc 2 id)) idlist)
  23.                  id     (tblnext "APPID")
  24.           );setq
  25.     );while
  26.     (if idlist
  27.         (progn
  28.             (setq ell1 (entget ename idlist)
  29.                      ell2 (assoc -3 ell1)
  30.             );setq
  31.             (if (assoc appid (cdr ell2))
  32.                 (progn
  33.                      (setq ell2 (cdr ell2)
  34.                            ell2 (append (list -3)
  35.                               (reverse (cdr (member (assoc appid ell2) (reverse ell2))))
  36.                                (cdr (member (assoc appid ell2) ell2))
  37.                               );append
  38.                               ell1 (subst ell2 (assoc -3 ell1) ell1)
  39.                        );setq
  40.                        (entdel ename)
  41.                        (entmake ell1)
  42.                  );progn
  43.             );if
  44.         );progn
  45.     );if
  46. )
回复

使用道具 举报

 楼主| 发表于 2011-10-14 15:58 | 显示全部楼层
悬赏不是目的,希望能有高人将这个问题完美解决,这样我们就不用对手改尺寸而烦恼了!
回复

使用道具 举报

发表于 2011-10-14 21:08 | 显示全部楼层
vla-get-textoverride可以判断
回复

使用道具 举报

发表于 2011-10-15 11:03 | 显示全部楼层
这个有点意思,先占个位置
回复

使用道具 举报

 楼主| 发表于 2011-10-15 11:26 | 显示全部楼层
;============================================================================
(defun C:XG (/ Diment n cnt entn Dimn txtlst oldtxt newtxt I)
   (SETVAR "CMDECHO" 0)
   ;(ssget)
   ;(SETQ Diment (SSGET "p" '((0 . "DIMENSION")))
   (SETQ Diment (ssget "X" '((0 . "DIMENSION")(-4 . "<NOT") (1 . "")(-4 . "NOT>")))
         
         n      (sslength Diment)
         cnt    0
         I      0
   )
   (PRINC (strcat "共有" (itoa N) " 个尺寸被选择。\n"))
   (if (not (tblseArch "layer" "YTM"))                  
                                                         
      (command ".-layer" "N" "YTM" "")
   )
   
   (WHILE (< I n)                                
      (PROGN (SETQ entn (ssname Diment I)
                   Dimn (entget entn)
             )
             (setq oldtxt (cdr (setq txtlst (assoc 1 Dimn))))
             (if (OR (WCMATCH OLDTXT "*<>*") (= OLDTXT ""))
                                                           
                (terpri)
                (progn (setq newtxt (strcat oldtxt "(<>)"))
                                                           
                       (SETQ DIMN (subst (cons 1 newtxt) txtlst Dimn))
                       (SETQ DIMN (SUBST (CONS 8 "YTM") (ASSOC 8 DIMN) DIMN))
                       (entmod Dimn)                    
                       (setq cnt (1+ cnt))
                )
             )
             (SETQ I (1+ I))
      )
   )
   ;(COMMAND ".-LAYER" "c" "YELLOW"  "YTM" "")原来在这个位置
   (COMMAND ".-LAYER" "c" "T" "255,215,0" "YTM" "")
   (IF (> cnt 0)
       (ALERT (strcat "合计查到 " (itoA cnt) " 个尺寸被手动改变!" "\n已放到YTM图层(金黄色显示)"))
   )
   (SETVAR "CMDECHO" 1)
   (GRTEXT)
   (princ)
   (GC)
)
(C:XG)
;--------------------------------------------------------------------------------------------------
;|暂时修改到这一步了,可以自动选择所有标,对于无手改尺寸的,不弹出提示,但如何醒目地显示什么地方改动了还不能实现。如果图纸中图层很少,可以正确执行,但附件中的却不能得到想要的结果,请大侠指教。|;
回复

使用道具 举报

 楼主| 发表于 2011-10-15 11:27 | 显示全部楼层
这里面是不能正确运行的图纸,不知道是什么原因造成了这段代码不能正确运行?

本帖子中包含更多资源

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

x
回复

使用道具 举报

 楼主| 发表于 2011-10-15 23:33 | 显示全部楼层
;本程序用于自动检查图纸中是否有手工修改标尺寸的问题,无手改尺寸不提示
;对于手工添加直径符号等不认为是手改尺寸
;本程序由YTM、vormittag、ZZXXQQ合作完成,在此向二位表示感谢。2011.10.15
;============================================================================
(defun C:XG (/ Diment n cnt entn Dimn txtlst oldtxt newtxt I)
(SETVAR "CMDECHO" 0)
(setvar "CECOLOR" "BYLAYER")
(setvar "DIMCLRD" 0)
(setvar "DIMCLRE" 0)
(setvar "DIMCLRT" 0)
(command "-DIMSTYLE" "S" (getvar "DIMSTYLE") "Y")
(SETQ Diment (ssget "X" '((0 . "DIMENSION")(-4 . "<NOT") (1 . "")(-4 . "NOT>")))
       n      (sslength Diment)
       cnt    0
       I      0)
(PRINC (strcat "共有" (itoa N) " 个尺寸被选择。\n"))
(command ".-layer" "M" "YTM" "")
(command ".CHPROP" Diment "" "C" "BYLAYER" "")
(WHILE (< I n)                                
  (SETQ entn (ssname Diment I)
        Dimn (entget entn))
  (setq oldtxt (cdr (setq txtlst (assoc 1 Dimn))))
  (if (OR (WCMATCH OLDTXT "*<>*") (= OLDTXT ""))
   (terpri)
  (progn
   (setq newtxt (strcat oldtxt "(<>)"))
   (SETQ DIMN (subst (cons 1 newtxt) txtlst Dimn))
   (SETQ DIMN (SUBST (CONS 8 "YTM") (ASSOC 8 DIMN) DIMN))
   (entmod Dimn)
   (setq cnt (1+ cnt))
  ))
  (SETQ I (1+ I))
)
(COMMAND ".-LAYER" "c" "T" "255,215,0" "YTM" "")
(IF (> cnt 0)
  (ALERT (strcat "合计查到 " (itoA cnt) " 个尺寸被手动改变!" "\n已放到YTM图层(金黄色显示)"))
)
(SETVAR "CMDECHO" 1)
(GRTEXT)
(princ)
(GC)
)
(C:XG)
;--------------------------------------------------------------------------------------------------

本帖子中包含更多资源

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

x
回复

使用道具 举报

 楼主| 发表于 2011-10-15 23:34 | 显示全部楼层
想请教一下,为什么有时候代码为染色,还有滚动条,有时候没有?我不太懂
回复

使用道具 举报

发表于 2011-10-15 23:48 | 显示全部楼层
本帖最后由 ZZXXQQ 于 2012-1-15 09:04 编辑

游客,本帖隐藏的内容需要发帖数高于 5 才可浏览,你当前发帖数只有 0


评分

参与人数 2明经币 +1 金钱 +20 收起 理由
hbgsw + 10 很给力!
cabinsummer + 1 + 10 赞一个!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-9 09:52 , Processed in 1.844344 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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