structo 发表于 2022-7-5 16:56:34

从excel向图形中添加文本

嗨,朋友们,
 
我需要添加文本从excel文件到cad绘图lisp例行程序。阅读图纸文本和excel文件文本,如果匹配,请将相关内容从excel粘贴到cad。
例如:我的绘图文本包含“B2”,我的excel文件在“D”列包含“B2”文本,然后将excel文件的“E”列中的值粘贴到B2文本旁边的Cad绘图中。
 
请查找Cad和Excel文件的示例文件。
 
谢谢
样品图纸。dxf

ziele_o2k 发表于 2022-7-5 17:02:28

首先,将excel文件保存为csv,然后尝试以下操作:

(defun c:csv2txt (/ file data ss in enx txt addtxt)
(if
   (and
   (setq file (getfiled "Select CSV File" "" "csv" 16))
   (setq data (LM:readcsv file))
   (setq ss (ssget '((0 . "TEXT"))))
   )
   (repeat (setq in (sslength ss))
   (setq enx (entget (ssname ss (setq in (1- in)))))
   (setq txt (cdr (assoc 1 enx)))
   (foreach _X data
       (if (setq addtxt (cadr(member txt _X)))
         (progn
         (setq enx (subst (cons 1 (strcat txt addtxt)) (assoc 1 enx) enx ))
         (entmod enx)
         (entupd (ssname ss in))
         )
       )
   )
   )
)
(princ)
)

当然你必须加载这个
http://www.lee-mac.com/readcsv.html

structo 发表于 2022-7-5 17:05:09

嗨,朋友,
谢谢分享。使用代码后,在命令行上将错误显示为“CSV2Text;错误:无函数定义:LM:READCSV”。文本未开发。请看一看。
样品图纸。dxf
测试文件。csv

guran 发表于 2022-7-5 17:08:34

这是你必须从这里下载的东西:http://www.lee-mac.com/readcsv.html

structo 发表于 2022-7-5 17:12:02

 
亲爱的朋友,我不知道编程技巧。请提供lisp例程。
 
非常感谢。

ziele_o2k 发表于 2022-7-5 17:15:06

 
我给了你们网站的链接,在那个里你们可以找到缺失的功能。
再一次,但直接链接到文件,您必须加载该文件才能运行我的例程。
http://www.lee-mac.com/lisp/ReadCSV-V1-3.lsp

Grrr 发表于 2022-7-5 17:16:13

考虑这一点(需要一些特定的文本重新格式化):
 

(defun C:test ( / acDoc SSX f opn row LstRows i TxtLst a b)

(setq acDoc (vla-get-ActiveDocument (vlax-get-acad-object)))
(vlax-map-collection (vla-get-Layers acDoc) (function (lambda (o) (vla-put-Lock o :vlax-false))))
(if
        (and
                (setq SSX (ssget "_X" (list (cons 0 "TEXT") (if (= 1 (getvar 'cvport)) (cons 410 (getvar 'ctab)) '(410 . "Model")))))
                (setq f (getfiled "Select CSV File" "" "csv" 0))
        )
        (progn
                (vla-EndUndoMark acDoc)(vla-StartUndoMark acDoc)
                (setq opn (open f "r"))
                (while (setq row (read-line opn)) (setq LstRows (cons row LstRows)))
                (close opn)
                (repeat (setq i (sslength SSX)) (setq TxtLst (cons (entget (ssname SSX (setq i (1- i))))TxtLst)) )
                (if (and LstRows TxtLst)
                        (foreach a LstRows
                                (foreach b TxtLst
                                        (and ; sloppy string reformatting below
                                                (wcmatch a (strcat "*" (cdr (assoc 1 b)) "*"))
                                                (setq a (vl-string-subst "(" "Reg" a))
                                                (setq a (vl-remove "\"" (vl-remove "," (mapcar 'chr (vl-string->list a)))))
                                                (if (/= (last a) ")") (setq a (strcat (apply 'strcat a) ")")) (setq a (apply 'strcat a)))
                                                (setq a (vl-string-subst "\")" ")" (vl-string-subst "\"x" "x" a)))
                                                (entmod (setq b (subst (cons 1 a) (assoc 1 b) b)))
                                                (entupd (cdr (assoc -1 b)))
                                        )
                                )
                        )
                )
                (vla-EndUndoMark acDoc)
        )
)
(princ)
);| defun |; (vl-load-com) (princ)

structo 发表于 2022-7-5 17:21:30

亲爱的朋友,
 
我遵循了你的规则,但开发了“reg”而不是像9“x18”这样的尺寸。文本后缺少括号。示例:B1(9“x4½”)格式。
 
非常感谢。

structo 发表于 2022-7-5 17:25:04

 
嗨,朋友,你的代码运行良好。但excel中的一列文本不一定是开发出来的。这是excel文件中的“A”列文本。文本应从excel的“B”列而不是“A”列中提取。文本开发为G1B1(9“x4½”)。此处不需要G1。所需格式为B1(9“x4½”)。
 
请修改以进行小修改。
 
感谢您的贡献。

Grrr 发表于 2022-7-5 17:26:36

 
快速纠正(未经测试):
 

(defun C:test ( / acDoc SSX f opn row LstRows i TxtLst a b)

(setq acDoc (vla-get-ActiveDocument (vlax-get-acad-object)))
(vlax-map-collection (vla-get-Layers acDoc) (function (lambda (o) (vla-put-Lock o :vlax-false))))
(if
        (and
                (setq SSX (ssget "_X" (list (cons 0 "TEXT") (if (= 1 (getvar 'cvport)) (cons 410 (getvar 'ctab)) '(410 . "Model")))))
                (setq f (getfiled "Select CSV File" "" "csv" 0))
        )
        (progn
                (vla-EndUndoMark acDoc)(vla-StartUndoMark acDoc)
                (setq LstRows (mapcar 'cadr (LM:readcsv f)))
                ; (setq opn (open f "r"))
                ; (while (setq row (read-line opn)) (setq LstRows (cons row LstRows)))
                ; (close opn)
                (repeat (setq i (sslength SSX)) (setq TxtLst (cons (entget (ssname SSX (setq i (1- i))))TxtLst)) )
                (if (and LstRows TxtLst)
                        (foreach a LstRows
                                (foreach b TxtLst
                                        (and ; sloppy string reformatting below
                                                (wcmatch a (strcat "*" (cdr (assoc 1 b)) "*"))
                                                (setq a (vl-string-subst "(" "Reg" a))
                                                (setq a (member "B" (vl-remove "\"" (vl-remove "," (mapcar 'chr (vl-string->list a))))))
                                                (if (/= (last a) ")") (setq a (strcat (apply 'strcat a) ")")) (setq a (apply 'strcat a)))
                                                (setq a (vl-string-subst "\")" ")" (vl-string-subst "\"x" "x" a)))
                                                (entmod (setq b (subst (cons 1 a) (assoc 1 b) b)))
                                                (entupd (cdr (assoc -1 b)))
                                        )
                                )
                        )
                )
                (vla-EndUndoMark acDoc)
        )
)
(princ)
);| defun |; (vl-load-com) (princ)


;; Read CSV-Lee Mac
;; Parses a CSV file into a matrix list of cell values.
;; csv - filename of CSV file to read

(defun LM:readcsv ( csv / des lst sep str )
(if (setq des (open csv "r"))
        (progn
                (setq sep (cond ((vl-registry-read "HKEY_CURRENT_USER\\Control Panel\\International" "sList")) (",")))
                (while (setq str (read-line des))
                        (setq lst (cons (LM:csv->lst str sep 0) lst))
                )
                (close des)
        )
)
(reverse lst)
)


;; CSV -> List-Lee Mac
;; Parses a line from a CSV file into a list of cell values.
;; str - string read from CSV file
;; sep - CSV separator token
;; pos - initial position index (always zero)

(defun LM:csv->lst ( str sep pos / s )
(cond
        (   (not (setq pos (vl-string-search sep str pos)))
                (if (wcmatch str "\"*\"")
                        (list (LM:csv-replacequotes (substr str 2 (- (strlen str) 2))))
                        (list str)
                )
        )
        (   (or (wcmatch (setq s (substr str 1 pos)) "\"*[~\"]")
                (and (wcmatch s "~*[~\"]*") (= 1 (logand 1 pos)))
        )
        (LM:csv->lst str sep (+ pos 2))
        )
        (   (wcmatch s "\"*\"")
                (cons
                        (LM:csv-replacequotes (substr str 2 (- pos 2)))
                        (LM:csv->lst (substr str (+ pos 2)) sep 0)
                )
        )
        (   (cons s (LM:csv->lst (substr str (+ pos 2)) sep 0)))
)
)

(defun LM:csv-replacequotes ( str / pos )
(setq pos 0)
(while (setq pos (vl-string-search"\"\"" str pos))
        (setq str (vl-string-subst "\"" "\"\"" str pos)
                pos (1+ pos)
        )
)
str
)               


全部归功于李·麦克。
页: [1] 2
查看完整版本: 从excel向图形中添加文本