明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 790|回复: 12

[源码] 检查图纸中尺寸标注的比例,并设置成需要的线性比例

  [复制链接]
发表于 2023-12-10 12:23 | 显示全部楼层 |阅读模式
;;;检查图纸中尺寸标注的比例,并设置成需要的线性比例,用于解决尺寸标注比例系数不是1的情况下,偶然个别尺寸忘改的问题。


(defun c:zzzz (/ oldvalue nb ss newvalue sel obj i newvalue1 newvalue2 sz szz)
  (setvar "cmdecho" 0)
  (textpage)
  (if (= newvalue2 nil)  (setq newvalue2 "1")  )
  (princ "\n 请选择标注:")
  (setq        ss (ssget '((0 . "DIMENSION")))  nb 0  )
  (if (/= ss nil) (setq nb (sslength ss)))
  
  (setq i 0)
  (repeat nb
       (setq oldvalue (vla-get-linearscalefactor (vlax-ename->vla-object (ssname ss i)) )  )
       (setq sz (cons oldvalue sz))
       (princ (strcat "\n 第 "(rtos (1+ i)) " 个标注,线性比例是" (rtos oldvalue)))
       (setq i (1+ i))
    )
    (setq szz nil)
    (while (setq szz (cons (car sz) szz) sz (vl-remove(car sz)(cdr sz))))
    (setq sz (reverse szz))  ;消重

   (setq i  (length sz))
   (princ (strcat "\n 共有" (rtos i) "种线性比例是: " ))

   (setq  szz sz)
       (repeat  (length szz)
       (setq aa (car szz) szz (cdr szz))
       (princ (strcat " "(rtos aa) " " ))
       )
  (setq newvalue1 (getstring  (strcat "\n 请输入新尺寸比例<dimlfac>,输入回车表示取消 :") )  )

  (if (/= newvalue1 "")
    (progn
      (setq newvalue (atof newvalue1))
      (setq i 0)
      (repeat nb
        (progn
          (setq sel (ssname ss i))
          (setq obj (vlax-ename->vla-object sel))
          (vla-put-linearscalefactor obj newvalue)
          (setq i (1+ i))
        )))
  (princ "\n 用户取消尺寸线性比例设置 ")   
  )
  
  (setq newvalue2 newvalue1)
  (princ "\n 尺寸线性比例设置完毕,欢迎使用  2023-12-9 ")
  (princ)
)

评分

参与人数 1明经币 +1 收起 理由
xj6019 + 1 赞一个!

查看全部评分

 楼主| 发表于 2023-12-16 12:14 | 显示全部楼层
直接改好,用这个:

;;; 修改标注线性比例BZXX。
(defun c:BZXX (/ oldvalue nb ss newvalue sel obj i newvalue1 newvalue2 sz szz)
  (setvar "cmdecho" 0)
  (textpage)
  (sssetfirst nil)
  (if (= newvalue2 nil)  (setq newvalue2 "1")  )
  (princ "\n 请选择标注:")
  (setq        ss (ssget '((0 . "DIMENSION")))  nb 0  )

  (if (/= ss nil) (setq nb (sslength ss)))
  
  (setq i 0 ss1 (ssadd) )
  (repeat nb
       (setq oldvalue (vla-get-linearscalefactor (vlax-ename->vla-object (ssname ss i)) )  )
       (setq sz (cons oldvalue sz))
       (princ (strcat "\n 第 "(rtos (1+ i)) " 个标注,线性比例是" (rtos oldvalue)))
       (if (/= oldvalue 1.0)
           (setq ss1 (ssadd (ssname ss i) ss1)))
   
       (setq i (1+ i))
    )
  
   (if (< (sslength ss1) 100)   ;小于100个夹点亮显,大于则普通亮显,因为选择大于100不能夹点亮显
       (sssetfirst nil ss1)     ;比例不是1的,且数量小于100时亮显。
       (draw ss1 3))
   
  
    (setq szz nil)
    (while (setq szz (cons (car sz) szz) sz (vl-remove(car sz)(cdr sz))))
    (setq sz (reverse szz))  ;消重

  
   (setq i  (length sz))
   (princ (strcat "\n 共有" (rtos i) "种线性比例是: " ))

   (setq  szz sz)
   (repeat  (length szz)
       (setq aa (car szz) szz (cdr szz))
       (princ (strcat " "(rtos aa) " " )) )

  (setq        newvalue1 1.0)
  (setq        newvalue1 (getstring  (strcat "\n 请输入新尺寸比例<dimlfac>,输入回车表示取消 :") )  )

  (if (/= newvalue1 "")
    (progn
      (setq newvalue (atof newvalue1))
      (setq i 0)
      (repeat nb
        (progn
          (setq sel (ssname ss i))
          (setq obj (vlax-ename->vla-object sel))
          (vla-put-linearscalefactor obj newvalue)
          (setq i (1+ i))
        )))
     (princ "\n 用户取消尺寸线性比例设置 ")   
   )
  
  (defun draw (ss i / j)               ; 亮显子函数
    (repeat (setq j (sslength ss))
      (redraw (ssname ss (setq j (1- j))) i)
    )
  )
  
   (princ "\n 尺寸线性比例设置完毕,欢迎使用  2023-12-9 ")
  (princ)
)

评分

参与人数 1明经币 +1 收起 理由
cj52000 + 1 很给力!

查看全部评分

回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-12-11 20:22 | 显示全部楼层
这个都能设置,当然可以,加几句话即可。不过需求不大,一幅图,要么1:1,要么不是,最大的问题是本来不是1:1的,但偶尔弄成1:1的,很难发现,所以用此命令,直接选择一张不是1:1的图,设置成多少,全图刷新,确保漏网之鱼。
   这个程序有个问题,就是遇到角度尺寸,就会出错,因为角度尺寸没有线性比例的属性。这个正在考虑如何解决中。现在人为就是剔除角度尺寸。
 楼主| 发表于 2023-12-10 12:25 | 显示全部楼层
一页图纸一把检查出结果,不用像以往那样,一个个尺寸查看标注比例。
发表于 2023-12-10 15:56 | 显示全部楼层
怎么是繁体字,表示不会用
 楼主| 发表于 2023-12-11 18:55 | 显示全部楼层
zilong136 发表于 2023-12-10 15:56
怎么是繁体字,表示不会用

?
没有啊,简体的啊。
发表于 2023-12-11 19:32 | 显示全部楼层
woxin168 发表于 2023-12-10 12:25
一页图纸一把检查出结果,不用像以往那样,一个个尺寸查看标注比例。

这个能把不是1:1的尺寸全高亮选中吗
 楼主| 发表于 2023-12-13 19:29 | 显示全部楼层
抽空加两句话,满足楼上的亮显需求:
      (setq  ss1 (ssadd) )
      (if (/= oldvalue 1.0)
           (setq ss1 (ssadd (ssname ss i) ss1)))
  (sssetfirst nil ss1)
即可满足不是1:1的亮显。
发表于 2023-12-13 20:41 | 显示全部楼层
感谢分享,很好用
发表于 2023-12-14 08:25 | 显示全部楼层
woxin168 发表于 2023-12-13 19:29
抽空加两句话,满足楼上的亮显需求:
      (setq  ss1 (ssadd) )
      (if (/= oldvalue 1.0)

谢谢,具体是加在哪一块啊,我加在以下位置还是没有亮显


本帖子中包含更多资源

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

x
 楼主| 发表于 2023-12-16 12:13 | 显示全部楼层
加的位置不对。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-18 07:17 , Processed in 0.193284 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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