BrianTFC 发表于 2022-7-5 16:07:37

提取文本标签和尺寸

大家好,
 
我需要一些关于我正在尝试编写的lisp例程的帮助。我需要做的是通过选择文本来提取一个面板标签,然后选择我需要提取的维度,我已经成功地正确提取了维度,但是当提取信息时,我在面板标签应该在的第一个单元格中得到“nil”,在下一个单元格中得到维度。我的工作站上没有Excel,所以我必须使用CSV文件,我已经编写了一个提取代码,在Excel中运行,以检索CVS文件中的信息。还有没有办法将CVS文件保存在打开图形的同一位置?如果有人能帮助我,我将不胜感激。
 
(defun c:test( / s tx fn i d dl m file)
(setq ss (ssget '((0 . "*text,*DIMENSION")))
      fn "f:\\BrianD\\Dims.csv")
(repeat (setq i (sslength ss))
(setq d (ssname ss (setq i (1- i)))
      dl (entget d)
      m (cdr (assoc 42 dl)))
      
      (setq tx (cons m tx)))
(if tx
   (progn
(setq file (open fn "a"))
   (write-line "" file)
   (foreach ss tx
   (princ ss file)
       (princ "," file)
      )

   (if file (close file))
)
)
)
(princ)
 
谢谢Brian

Commandobill 发表于 2022-7-5 16:13:46

在没有例子的情况下,不太确定你在问题的第一部分想要完成什么,但第二部分很简单。要将CSV与图形放在同一文件夹中,只需获取“dwgprefix”变量。即:
 
(setq fn (getvar 'dwgprefix))
 
这将把它放在同一个文件夹中。
 
您声明正在选择文本,然后选择维度,但您只有一个SSGET。可能是你问题的一部分。

Lee Mac 发表于 2022-7-5 16:15:52

 
考虑到DXF组42只会出现在*维度实体中,而不会出现在*文本实体的DXF数据中,这意味着在重复循环的某些迭代中,变量“m”将为空。

BrianTFC 发表于 2022-7-5 16:18:57

李,
我该怎么做?我需要为文本单独设置ssget吗?我为文本添加了新的dxf组,但现在我只得到了文本。由于某种原因,我无法将此代码放入代码标记中。
 
 
(defun c:test2( / s tx fn i d dl m file)
(setq ss (ssget '((0 . "*text,*DIMENSION")))
      fn "C:\\Lisp routines\\myDims.csv")
(repeat (setq i (sslength ss))
(setq d (ssname ss (setq i (1- i)))
      dl (entget d)
      m (cdr (assoc 42 dl))
      m (cdr (assoc 1 dl)))
      (setq tx (cons m tx)))
(if tx
   (progn
(setq file (open fn "a"))
   (write-line "" file)
   (foreach ss tx
   (princ ss file)
       (princ "," file)
      )

   (if file (close file))
)
)
)
(princ)

Tharwat 发表于 2022-7-5 16:21:11

[未测试]
 

(defun c:Test (/ fn ss o i e v)
(if (and (findfile (setq fn "f:\\BrianD\\Dims.csv"))
          (setq ss (ssget '((0 . "TEXT,MTEXT,*DIMENSION"))))
   )
   (progn
   (setq o (open fn "a"))
   (write-line "" o)
   (repeat (setq i (sslength ss))
       (setq e (entget (ssname ss (setq i (1- i)))))
       (if (wcmatch (cdr (assoc 0 e)) "TEXT,MTEXT")
         (write-line (cdr (assoc 1 e)) o)
         (write-line
         (if (not (eq (type (setq v (cdr (assoc 42 e)))) 'STR))
             (rtos v 2)
             v
         )
         o
         )
       )
   )
   (close o)
   )
)
(princ)
)

BrianTFC 发表于 2022-7-5 16:25:38

塔尔瓦特,
 
 
谢谢
 
 
我测试了它,它给了我CSV文件A行中的所有三个,你能让它把“文本”放在A行,第一个“维度”放在B行,第二个“维度”放在C行吗?

Lee Mac 发表于 2022-7-5 16:28:07

 
假设您指的是列而不是行,请尝试以下操作:
(defun c:dimtxtexp ( / des dim enx idx sel txt )
   (if (and (setq sel (ssget '((0 . "TEXT,MTEXT,*DIMENSION"))))
            (setq des (open "f:\\BrianD\\Dims.csv" "a"))
       )
       (progn
         (repeat (setq idx (sslength sel))
               (setq enx (entget (ssname sel (setq idx (1- idx)))))
               (if (wcmatch (cdr (assoc 0 enx)) "*DIMENSION")
                   (setq dim (cons (rtos (cdr (assoc 42 enx))) dim))
                   (setq txt (cons (cdr (assoc 1 enx)) txt))
               )
         )
         (while (or dim txt)
               (write-line
                   (strcat
                     (cond ((cartxt)) ("")) ","
                     (cond ((cardim)) ("")) ","
                     (cond ((cadr dim)) (""))
                   )
                   des
               )
               (setq txt (cdrtxt)
                     dim (cddr dim)
               )
         )
       )
   )
   (if (= 'file (type des)) (close des))
   (princ)
)

BrianTFC 发表于 2022-7-5 16:31:05

李,
 
 
谢谢,是的,我指的是专栏。它工作得很好。有没有办法将CSV文件保存在与图形相同的位置?CSV的名称是否与图纸的名称相同?

Tharwat 发表于 2022-7-5 16:33:06

 
(strcat (getvar 'DWGPREFIX) (vl-filename-base (getvar 'DWGNAME)) ".csv")

BrianTFC 发表于 2022-7-5 16:36:51

李和塔瓦,
 
 
首先我要感谢你们的帮助,我还在学习如何正确编写lisp例程。我不知道在Lee编写的lisp例程中Tharwat编写的代码行放在哪里。在运行excel Extraction宏后,我发现我必须将所有文件保存在一个位置,但只使用图形名称,因此如果您能在lisp中显示它的位置,这将对我有很大帮助。看着你们写的两个不同的lisp,我有一种感觉,仅仅把代码行放在lisp中并不是那么容易。。
 
 
谢谢你,布莱恩。
页: [1] 2
查看完整版本: 提取文本标签和尺寸