【Lisp】【Python】在CAD中用插件获取选中字块的文字,在rhino中批量生成图层

1 get_selected_text.lsp

1.1 使用方法

  1. 用记事本复制以下代码,改文件名为get_selected_text.lsp

    (defun c:GatherText ()
      (setq ss (ssget '((0 . "TEXT,MTEXT"))))
      (if ss
        (progn
          (setq i -1
                all_texts ""
          )
          (while (setq ent (ssname ss (setq i (1+ i))))
            (setq text_content (if (= (cdr (assoc 0 (entget ent))) "TEXT")
                                    (cdr (assoc 1 (entget ent)))
                                    (cdr (assoc 1 (entget ent)))
                              )
            )
            (setq all_texts (strcat all_texts text_content " "))
          )
          (princ all_texts)
        )
        (princ "\nNo text objects selected. Please try again.")
      )
      (princ)
    )
    
  2. 加载get_selected_text.lsp

  3. 在AutoCAD命令行中键入GatherText并按Enter。这将激活您创建的LISP程序。

  4. 按照提示选择文本对象。程序将显示所选文本对象的内容。

LISP代码解析

AutoLISP程序,用于收集AutoCAD图纸中的所有文本对象(包括单行文本(“TEXT”)和多行文本(“MTEXT”))的内容,并将它们连接成一个字符串。下面是对这段代码的逐行解析。

  1. (defun c:GatherText ():定义一个名为GatherText的新命令。AutoCAD中的命令名称通常以c:为前缀。

  2. (setq ss (ssget '((0 . "TEXT,MTEXT")))):使用ssget函数选择所有类型为"TEXT"或"MTEXT"的对象,并将选择集赋值给变量ss

  3. (if ss:检查ss是否包含任何对象。如果包含对象,执行以下代码块,否则跳到第13行。

  4. (progn:开始一个新的代码块。

  5. (setq i -1 all_texts ""):初始化变量i为-1,all_texts为空字符串。

  6. (while (setq ent (ssname ss (setq i (1+ i)))):遍历选择集ss中的所有对象。1+ i表示将i加1,ssname函数返回指定索引处的对象。循环将持续到ssname返回nil

  7. (setq text_content (if (= (cdr (assoc 0 (entget ent))) "TEXT"):使用entget函数获取对象的属性列表,然后使用assoc函数查找键值为0的属性,以确定对象的类型(“TEXT"或"MTEXT”)。如果对象类型为"TEXT",则执行下一行。

  8. (cdr (assoc 1 (entget ent))):如果对象类型为"TEXT",使用assoc函数查找键值为1的属性,以获取文本内容。

  9. (cdr (assoc 1 (entget ent))):如果对象类型为"MTEXT",执行的操作与上一行相同。这里可能存在错误,因为MTEXT的内容通常用键值为3的属性表示。应该将此行更改为(cdr (assoc 3 (entget ent)))

  10. ):结束if语句。

  11. (setq all_texts (strcat all_texts text_content " ")):将获取到的文本内容与当前all_texts字符串连接,用空格分隔。

  12. ):结束while循环。

  13. (princ all_texts):打印包含所有文本内容的all_texts字符串。

  14. ):结束if语句。

  15. (princ "\nNo text objects selected. Please try again."):如果没有找到任何文本对象,打印提示信息。

  16. (princ):结束并退出GatherText命令。

请注意,第9行可能存在错误,应将其更改为(cdr (assoc 3 (entget ent)))以正确处理"MTEXT"对象的内容。

要在AutoCAD中运行此代码,请将其保存为一个.lsp文件,然后在AutoCAD命令行中输入(load "YourFileName.lsp")以加载文件。接着,输入GatherText并按Enter键,程序将运行并显示所有文本对象的内容。

1.2 动图

20230620214116

2 Rhino中使用PythonScript批量建立图层.py

2.1 直接生成

import rhinoscriptsyntax as rs
# 定义了一个名为`create_layers`的函数,该函数接受一个图层名称列表作为输入参数。然后,对于列表中的每个图层名称,它检查图层是否已经存在;如果不存在,则创建新图层。
def create_layers(layer_names):
    for layer_name in layer_names:
        if not rs.IsLayer(layer_name):
            rs.AddLayer(layer_name)

if __name__ == "__main__":
    layer_names = ['DXT-LZ', 'DXT-YL', 'DXT-GL', 'DXT-ZCSC', 'DXT-ZCSB', 'DXT-ZCSA', 'DXT-ZCDC', 'DXT-ZCDB', 'DXT-ZCDA', 'DXT-2PSR15', 'DXT-PSR15', 'DXT-BR3', 'DXT-SB8a', 'DXT-6SB8b', 'DXT-5SB8b', 'DXT-4SB8b', 'DXT-3SB8b', 'DXT-2SB8b', 'DXT-ZC2', 'DXT-ZC1', 'DXT-LINK']
    create_layers(layer_names)
    

定义了一个名为create_layers的函数,该函数接受一个图层名称列表作为输入参数。然后,对于列表中的每个图层名称,它检查图层是否已经存在;如果不存在,则创建新图层。

2.2 带颜色生成

import rhinoscriptsyntax as rs
#定义了一个名为`create_layers`的函数,该函数接受一个图层名称列表作为输入参数。然后,对于列表中的每个图层名称,它检查图层是否已经存在;如果不存在,则创建新图层。
def create_layers(layer_names, colors):
    for layer_name, color in zip(layer_names, colors):
        if not rs.IsLayer(layer_name):
            rs.AddLayer(layer_name)
            rs.LayerColor(layer_name, color) #rs.LayerColor()函数为新创建的图层分配颜色。

if __name__ == "__main__":
    layer_names = ['DXT-LZ', 'DXT-YL', 'DXT-GL', 'DXT-ZCSC', 'DXT-ZCSB', 'DXT-ZCSA', 'DXT-ZCDC', 'DXT-ZCDB', 'DXT-ZCDA', 'DXT-2PSR15', 'DXT-PSR15', 'DXT-BR3', 'DXT-SB8a', 'DXT-6SB8b', 'DXT-5SB8b', 'DXT-4SB8b', 'DXT-3SB8b', 'DXT-2SB8b', 'DXT-ZC2', 'DXT-ZC1', 'DXT-LINK']
    
    colors = [
        (255, 0, 0),   # Red
        (0, 255, 0),   # Green
        (0, 0, 255),   # Blue
        (255, 255, 0), # Yellow
        (255, 0, 255), # Magenta
        (0, 255, 255), # Cyan
        # Add more colors as needed
    ]
    
    # Repeat the colors list if there are more layers than colors
    colors = colors * (len(layer_names) // len(colors)) + colors[:len(layer_names) % len(colors)]
    
    create_layers(layer_names, colors)

2.3 动图展示

在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hmywillstronger

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值