明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2198|回复: 8

[源码] 取得对象的图层,文字样式,标注样式置位当前。

[复制链接]
发表于 2022-11-14 13:33:34 | 显示全部楼层 |阅读模式
本帖最后由 liuhe 于 2022-11-14 13:34 编辑

CAD其实自带一个把对象的图层置位当前当前图层,但是个人觉得功能不够用。
于是就写了一个 对实体进行分析,
如果是text、mtext,就把实体的文字样式和文字高度设置为激活状态。
同理MULTILEADER(多重引线)、DIMENSION(标注样式)、AcDbTable(表格)。
没啥技术含量。特意用dxf码和对象属性混写的,有兴趣的可以写成纯lisp或者vlisp。


(prompt "\n快捷键SETVARLAYDIMDLI")
(DEFUN C:SETVARLAYDIMDLI (/ E);;;;;把当前的标注样式,文字样式,图层作为当前设置SETVARLAYDIMDLI
  (IF (SETQ E (CAR (ENTSEL)))
    (progn
      (COND
        ((= "TEXT" (CDR (ASSOC 0 (ENTGET E))))
         (if (/= (getvar 'textstyle)
                 (VLA-GET-StyleName (vlax-ename->vla-object E))
             )
           (SETVAR 'textstyle
                   (VLA-GET-StyleName (vlax-ename->vla-object E))
           )
         )
         (if (/= (getvar 'textsize)
                 (CDR (ASSOC 40 (ENTGET E)))
             )
           (SETVAR 'textsize
                   (CDR (ASSOC 40 (ENTGET E)))
           )
         )         
        )
        ((= "MTEXT" (CDR (ASSOC 0 (ENTGET E))))
         (if (/= (getvar 'textstyle)
                 (VLA-GET-StyleName (vlax-ename->vla-object E))
             )
           (SETVAR 'textstyle
                   (VLA-GET-StyleName (vlax-ename->vla-object E))
           )
         )
         (if (/= (getvar 'textsize)
                 (CDR (ASSOC 40 (ENTGET E)))
             )
           (SETVAR 'textsize
                   (CDR (ASSOC 40 (ENTGET E)))
           )
         )         
        )
        ((= "MULTILEADER" (CDR (ASSOC 0 (ENTGET E))))
         (if (/= (getvar 'CMLEADERSTYLE)
                 (VLA-GET-StyleName (vlax-ename->vla-object E))
             )
           (SETVAR 'CMLEADERSTYLE
                   (VLA-GET-StyleName (vlax-ename->vla-object E))
           )
         )
         (if (/= (VLA-GET-Name
                   (vla-get-ActiveTextStyle
                     (vla-get-ActiveDocument (vlax-get-acad-object))
                   )
                 )
                 (VLA-GET-TextStylename (vlax-ename->vla-object E))
             )
           (setvar 'textstyle
                   (VLA-GET-TextStylename (vlax-ename->vla-object E))
           )
         )
        )
        ((= "DIMENSION" (CDR (ASSOC 0 (ENTGET E))))
         (if (/= (VLA-GET-Name
                   (vla-get-ActiveDimStyle
                     (vla-get-ActiveDocument (vlax-get-acad-object))
                   )
                 )
                 (VLA-GET-StyleName (vlax-ename->vla-object E))
             )
           (vla-put-ActiveDimStyle
             (vla-get-ActiveDocument (vlax-get-acad-object))
             (vlax-ename->vla-object
               (tblobjname
                 "dimstyle"
                 (VLA-GET-StyleName (vlax-ename->vla-object E))
               )
             )
           )
         )
         (if (/= (VLA-GET-Name
                   (vla-get-ActiveTextStyle
                     (vla-get-ActiveDocument (vlax-get-acad-object))
                   )
                 )
                 (VLA-GET-TextStyle (vlax-ename->vla-object E))
             )
           (setvar 'textstyle
                   (VLA-GET-TextStyle (vlax-ename->vla-object E))
           )
         )
        )
        ((= "AcDbTable"
            (VLA-GET-ObjectName (vlax-ename->vla-object E))
         )
         (if (/= (getvar 'CTableSTYLE)
                 (VLA-GET-StyleName (vlax-ename->vla-object E))
             )
           (SETVAR 'CTableSTYLE
                   (VLA-GET-StyleName (vlax-ename->vla-object E))
           )
         )
         (if
           (/= (VLA-GET-Name
                 (vla-get-ActiveTextStyle
                   (vla-get-ActiveDocument (vlax-get-acad-object))
                 )
               )
               (vla-getTextStyle (vlax-ename->vla-object E) acDataRow)
           )
            (setvar
              'textstyle
              (vla-getTextStyle (vlax-ename->vla-object E) acDataRow)
            )
         )
        )

      )
      (if (/= (GETVAR 'clayer) (CdR (ASSOC 8 (ENTGET E))))
        (SETVAR 'clayer (CdR (ASSOC 8 (ENTGET E))))
      )
    )
  )
  (princ)
)


评分

参与人数 3明经币 +3 收起 理由
圣天诺杰 + 1
xj6019 + 1 赞一个!
自贡黄明儒 + 1 有想法

查看全部评分

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

本帖被以下淘专辑推荐:

发表于 2022-11-14 20:15:48 | 显示全部楼层
太多的if基本多余
 楼主| 发表于 2022-11-14 22:54:30 | 显示全部楼层
xyp1964 发表于 2022-11-14 20:15
太多的if基本多余

vla函数有一个问题,如果当前设置跟对象设置一样,会出现未知出错。为了避免报错,才进行先判断再激活
发表于 2022-11-15 14:15:07 | 显示全部楼层
进来看看,学习前辈的经验
发表于 2022-11-20 14:04:43 | 显示全部楼层
不错的想法。可以加个面板最方便了,勾选相应的内容。要不没提示不太明白。
发表于 2024-2-14 12:40:36 | 显示全部楼层
本帖最后由 pxt2001 于 2024-2-14 12:46 编辑

楼主代码和思路很不错,这个功能的确很有必要,但要加上以下红色代码,否则如截图所示,不能立即更新。
我的CAD版本:64位 CAD2017,不知道是不是CAD自身的原因导致。
(DEFUN C:SETVARLAYDIMDLI (/ E);;;;;把当前的标注样式,文字样式,图层作为当前设置SETVARLAYDIMDLI
  (IF (SETQ E (CAR (ENTSEL)))
    (progn
      ……
     (arxload "acopm.arx")
     (command "PSELECT" e "") ;亮显对象
     (command "SELECT" "p" "");取消亮显
    )
  )
  (princ)
)



本帖子中包含更多资源

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

x
发表于 2024-2-14 16:07:44 来自手机 | 显示全部楼层
谢谢流河大神的分享,好好学习下。
发表于 2024-2-17 12:50:19 | 显示全部楼层
谢谢老师们分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-16 04:50 , Processed in 0.177786 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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