明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1140|回复: 22

[提问] 请教一下有没有能获取标注注释比例的函数

[复制链接]
发表于 2022-4-29 21:04:36 | 显示全部楼层 |阅读模式


请教一下论坛的各位大神、有没有什么函数、可以获取到标注的注释比例 (如图中所示)

本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2022-4-30 09:43:28 | 显示全部楼层
这部分很少人去搞,下面是代码,供参考,和大家共同学习:


  1. ;;============================================================================
  2. ;;获取对象的注释比例列表值 (对象访问方法)

  3. (defun lkax_Annotative_GetEntityAnnoScales (en / ob xDicts lxDicts oDict loScales x y lenScales lelScales lScale_Name_Value)
  4.   (setq ob (vlax-ename->vla-object en))
  5.   (if (= (vla-get-HasExtensionDictionary ob) :VLAX-TRUE)
  6.     (progn
  7.       (setq xDicts (vla-GetExtensionDictionary ob))
  8.       (setq lxDicts '())
  9.       (vlax-for item xDicts
  10.     (setq lxDicts (cons item lxDicts))
  11.       )
  12.       (setq lxDicts (reverse lxDicts))
  13.       (setq vvv (nth 0 lxDicts))
  14.       (setq oDict  (vla-item vvv 0))
  15.       (setq loScales '())
  16.       (vlax-for item oDict
  17.     (setq loScales (cons item loScales))
  18.       )
  19.       (setq lenScales (mapcar 'vlax-vla-object->ename loScales))
  20.       (setq lelScales (mapcar '(lambda (x) (cdr (assoc 340 (entget x)))) lenScales))
  21.       (setq lScale_Name_Value (mapcar '(lambda (x) (mapcar '(lambda (y) (cdr (assoc y (entget x)))) '(300 140 141))) lelScales))
  22.       (setq lReturn (reverse lScale_Name_Value))
  23.     )
  24.   );_fi
  25. );_defun




  1. ;;获取对象的注释比例列表值 (传统 LISP 函数)

  2. (defun lkvl_Annotative_GetEntityAnnoScales (en / el v360 v350 elDictScales lenScales lelScales v340 elScale l lReturn)
  3.    (if (lkvl_en_AnnotativeP en)
  4.     (progn
  5.       (setq el   (entget en)
  6.             v360 (cdr (assoc 360 el))
  7.         v360 (cdr (assoc 360 (entget v360)))
  8.         v350 (cdr (assoc 350 (entget v360)))
  9.         elDictScales (entget v350)
  10.             lenScales (vl-remove-if (function (lambda (x) (/= (car x) 350))) elDictScales)
  11.         lelScales (mapcar (function (lambda (x) (entget (cdr x)))) lenScales)
  12.       )
  13.       (foreach item lelScales
  14.      (setq v340 (cdr (assoc 340 item))
  15.            elScale (entget v340)
  16.            l    (list (cdr (assoc 300 elScale))
  17.               (cdr (assoc 140 elScale))
  18.               (cdr (assoc 141 elScale))
  19.                  )
  20.            lReturn (cons l lReturn)
  21.      )
  22.        );;for
  23.        (setq lReturn (reverse lReturn))
  24.      )
  25.    );_fi
  26. );_defun


  27. ;;=====================================
  28. (defun lkvl_en_AnnotativeP (en / el g-3 l_xdata iFlag)
  29.   (setq el (entget en '("AcadAnnotative")))
  30.   (if (setq g-3 (assoc -3 el))
  31.     (progn
  32.       (setq l_xdata (cadr g-3)
  33.         iFlag   (cdr (nth 4 l_xdata));g=1070 ,if iFlag=0 , the object have been changed to not_Annotative.
  34.       )
  35.       (and l_xdata (= iFlag 1))
  36.     )
  37.   );_fi
  38. );_defun





发表于 2022-4-30 15:13:31 | 显示全部楼层
把e版的lisp方法也改了下 在17CAD中可用了
;;获取对象的注释比例列表值 (传统 LISP 函数)
;(lkvl_Annotative_GetEntityAnnoScales (setq en(car(entsel))))
(defun lkvl_Annotative_GetEntityAnnoScales (en / el v360 v350 elDictScales lenScales lelScales v340 elScale l lReturn)
   (if(lkvl_en_AnnotativeP en)
    (progn
      (setq el (entget en)
            v360(cdr (assoc 360 el)))
      (if(and(setq v360(cdr (assoc 360 (entget v360))))
             (assoc 350 (entget v360))
         )
        (setq v350(cdr (assoc 350 (entget v360))))
        (progn
          (setq v360(cdr (assoc 360 el))
                v360(cdr(last(entget v360)))
                v350(cdr (assoc 350 (entget v360))))
        )
      )
      (setq elDictScales (entget v350)
            lenScales (vl-remove-if (function (lambda (x) (/= (car x) 350))) elDictScales)
            lelScales (mapcar (function (lambda (x) (entget (cdr x)))) lenScales))
     (foreach item lelScales
     (setq v340 (cdr (assoc 340 item))
           elScale (entget v340)
           l    (list (cdr (assoc 300 elScale))
              (cdr (assoc 140 elScale))
              (cdr (assoc 141 elScale))
                 )
           lReturn (cons l lReturn)
     )
       );;for
       (setq lReturn (reverse lReturn))
     )
   );_fi
);_defun

;;=====================================
(defun lkvl_en_AnnotativeP (en / el g-3 l_xdata iFlag)
  (setq el (entget en '("AcadAnnotative")))
  (if (setq g-3 (assoc -3 el))
    (progn
      (setq l_xdata (cadr g-3)
        iFlag   (cdr (nth 4 l_xdata));g=1070 ,if iFlag=0 , the object have been changed to not_Annotative.
      )
      (and l_xdata (= iFlag 1))
    )
  );_fi
);_defun
发表于 2022-4-30 14:19:19 | 显示全部楼层
本帖最后由 guosheyang 于 2022-4-30 14:33 编辑

把e版的代码改了一行   在我的17CAD中可以得到正确结果了 ;;============================================================================
;;获取对象的注释比例列表值 (对象访问方法)
;(lkax_Annotative_GetEntityAnnoScales (setq en(car(entsel))))
(defun lkax_Annotative_GetEntityAnnoScales (en / ob xDicts lxDicts oDict loScales x y lenScales lelScales lScale_Name_Value)
  (setq ob (vlax-ename->vla-object en))
  (if (= (vla-get-HasExtensionDictionary ob) :VLAX-TRUE)
    (progn
      (setq xDicts (vla-GetExtensionDictionary ob))
      (setq lxDicts '())
      (vlax-for item xDicts
    (setq lxDicts (cons item lxDicts))
      )
      (setq lxDicts (reverse lxDicts))
      ;(setq vvv (nth 0 lxDicts))
      (if(vlax-property-available-p (nth 0 lxDicts)'count )
         (setq oDict(vla-item (nth 0 lxDicts);|vvv |;0))
         (setq oDict(vla-item (nth 1 lxDicts) 0))
      )
      (setq loScales '())
      (vlax-for item oDict
    (setq loScales (cons item loScales))
      )
      (setq lenScales (mapcar 'vlax-vla-object->ename loScales))
      (setq lelScales (mapcar '(lambda (x) (cdr (assoc 340 (entget x)))) lenScales))
      (setq lScale_Name_Value (mapcar '(lambda (x) (mapcar '(lambda (y) (cdr (assoc y (entget x)))) '(300 140 141))) lelScales))
      (setq lReturn (reverse lScale_Name_Value))
    )
  );_fi
);_defun
发表于 2022-4-30 09:32:03 | 显示全部楼层
(getvar ' CANNOSCALE)
 楼主| 发表于 2022-4-30 10:03:47 | 显示全部楼层
e2002 发表于 2022-4-30 09:43
这部分很少人去搞,下面是代码,供参考,和大家共同学习:

谢谢、我去试一下、注释性确实很少有人搞、所以找不到相关的函数
 楼主| 发表于 2022-4-30 10:04:59 | 显示全部楼层

你这只能获取当前注释比例、不是对象的注释比例、不过还是感谢你
发表于 2022-4-30 15:03:01 | 显示全部楼层
e2002 发表于 2022-4-30 09:43
这部分很少人去搞,下面是代码,供参考,和大家共同学习:

版主能解释一下,标注“注释性比例”同“使用全局比例”有什么关系吗?有了“使用全局比例”,还用“注释性比例”做什么?难道“注释性比例”仅仅是使“使用全局比例”保持为1,对后来的尺寸进行标注?

点评

这个功能已经出现10年以上了。 黄工可以先看看帮助文档,了解一下他具体能解决什么问题....8-)  发表于 2022-4-30 21:00
发表于 2022-4-30 15:54:52 | 显示全部楼层
使用CAD中自带的命令 OBJECTSCALE 也完全可以实现!

点评

我们讨论的是如何使用代码来获取,而不是说用哪个 command。 由于 Anntotative提供的方法不多,有一些功能目前还只能通过调用command来操作,而不是直接通过操控对象来处理。  发表于 2022-4-30 21:03
发表于 2022-4-30 21:08:14 | 显示全部楼层
前两天讨论的如何拆分 Text 为单个字符的Texts 的程序中,就需要处理 Text对象的 Annotative 特性,由于某些功能确实没有提供对象访问的方法,所以不得不在程序中调用了相关注释性比例的命令。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-14 14:42 , Processed in 0.230858 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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