itacad 发表于 2022-7-5 15:36:21

在冻结层上搜索文本

您好,我有一个问题,我认为用普通autocad命令无法解决。。。(我不想使用“数据提取”)
我使用一个与autocad一起工作的程序,并使用autocad的功能。。。使用此功能,它可以创建一系列由多层组成的图纸(页面)。。。冻结层的精确组合允许查看当前页面。
好的,在序言之后的问题是:我需要在文件中搜索文本,但我想知道文本的位置(层)。。。
是否可能知道这些信息(搜索文本所在的层)?
问候语

Lee Mac 发表于 2022-7-5 15:44:11

大致如下:
(if (setq s (ssget "_X" '((0 . "TEXT") (1 . "YourTextHere"))))
   (cdr (assoc 8 (entget (ssname s 0))))
)

itacad 发表于 2022-7-5 15:53:20

天啊!李先生!你不知道我是谁。。。但我很清楚你是谁!我借此机会感谢您在Lisp程序方面给予我的所有帮助!
说这个。。。不幸的是,我绝对不能从你的建议中得到帮助,因为我不是一个程序员。。。
无论如何,我都会考虑,甚至只是为了更好地重新制定请求!

Grrr 发表于 2022-7-5 15:58:13

除李的建议外:
 
(while (and (setq d (tblnext "LAYER" (not d))) (not s))
(and
   (ssget "_X" (list '(0 . "TEXT") '(1 . "YourTextHere") (cons 8 (cdr (assoc 2 d)))))
   (setq s d)
)
)
s

Lee Mac 发表于 2022-7-5 16:09:03

 
谢谢你的感谢,我很高兴听到我的项目帮助你起草工作。
 
 
没问题-下面是一个更全面的示例,您可以在AutoCAD命令行中加载并运行该示例:
(defun c:findtextlayer ( / enx idx lay lst sel str )
   (cond
       (   (= "" (setq str (getstring t "\nSpecify text to find: ")))
         (princ "\nNo text entered.")
       )
       (   (setq sel (ssget "_X" (list '(0 . "TEXT") (cons 1 str))))
         (repeat (setq idx (sslength sel))
               (setq idx (1- idx)
                     enx (entget (ssname sel idx))
                     lay (cdr (assoc 8 enx))
               )
               (if (not (member lay lst)) (setq lst (cons lay lst)))
         )
         (princ (strcat "\nSingle-line text with content \"" str "\" was found on the layers: "))
         (foreach lay lst (princ "\n\t") (prin1 lay))
       )
       (   (princ (strcat "\nNo single-line text with text content equal to \"" str "\" was found.")))
   )
   (princ)
)

itacad 发表于 2022-7-5 16:09:48

非常感谢。lisp正是我所需要的!唯一的问题是,它只适用于单行文字,但我还需要找到多行文字和属性的值。。。我没有指定,对不起。。。

itacad 发表于 2022-7-5 16:20:20

你好同时,我发现了一个不使用lisp的方法(很长)。。。
1) 首先我解冻所有图层,然后使用“查找”命令,在搜索结束时选择所有结果。。。
2) 在这一点上,我打开控制层窗口,我点击“新过滤器”,然后,用鼠标右键点击我选择添加。。。过滤器包含选定对象的层。。。
这不是很舒服,但总比什么都没有好。。。
问题:是否可以使用lisp列出选定对象的图层?所以我可以在第1点停止这个过程)。
提前感谢您的帮助

ronjonp 发表于 2022-7-5 16:25:06

尝试基于对象选择创建层过滤器。
(defun c:foo (/ a d e f l n s x)
;; RJP 2.6.2018
;; Creates a layer filter from a selection of objects
(cond
   ((null (setq s (ssget))) (print "Bye..."))
   ((null
      (and (setq a (cdr (assoc 330 (entget (tblobjname "layer" (getvar 'clayer))))))
    (setq d (cdr (assoc -1 (dictsearch (cdr (assoc 360 (entget a))) "ACAD_LAYERFILTERS"))))
      )
    )
    (print "No layer filter dictionary...")
   )
   (t
    (foreach x        (vl-remove-if 'listp (mapcar 'cadr (ssnamex s)))
      (and (not (member (setq l (cdr (assoc 8 (entget x)))) f)) (setq f (cons l f)))
    )
    (setq n (strcat (getenv "username") "_SelectionFilter"))
    (and (setq e (dictsearch d n)) (entdel (cdr (assoc -1 e))))
    (dictadd d
      n
      (entmakex        (list '(0 . "xrecord")
                      '(100 . "AcDbXrecord")
                      '(280 . 1)
                      (cons 1 n)
                      (cons 1 (apply 'strcat (mapcar '(lambda (x) (strcat x ",")) f)))
                      '(1 . "*")
                      '(1 . "*")
                      '(70 . 0)
                      '(1 . "*")
                      '(1 . "*")
                )
      )
    )
    (command "_.+layer" n)
    ;; Qsave regenerates layer palette to show correct filter .. bit of a kludge
    (command "_.qsave")
   )
)
(princ)
)

itacad 发表于 2022-7-5 16:34:22

哦完美的它将对我非常有用!
非常感谢你!

ronjonp 发表于 2022-7-5 16:40:48

 
很高兴你能用
页: [1]
查看完整版本: 在冻结层上搜索文本