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

文章目录

  • 1 get_selected_text.lsp
    • 1.1 使用方法
    • LISP代码解析
    • 1.2 动图
  • 2 Rhino中使用PythonScript批量建立图层.py
    • 2.1 直接生成
    • 2.2 带颜色生成
  • 2.3 动图展示

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 -1all_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 动图

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 colorscolors = colors * (len(layer_names) // len(colors)) + colors[:len(layer_names) % len(colors)]create_layers(layer_names, colors)

2.3 动图展示

本文链接:https://my.lmcjl.com/post/2915.html

展开阅读全文

4 评论

留下您的评论.