mdwin 发表于 2022-7-6 14:22:41

将表格文本转换为CSV(&O)

您好,我是autocad和lisp新手。我已经在网上搜索了2周,试图找到代码来修改我正在使用的lisp,但运气不好。
 
我修改了原始的BOMtoCSV。lisp代码可以完成我需要的几乎所有工作。我试图从图形中的表中提取文本,用逗号分隔字段。然后将其他两个文本字段添加到同一行。
 
例:COL1 COL2 COL3
第1行:XXX XXX XXX
 
文本被转储为XXX,XXX,XXX,但我还想添加另外两个字段,我认为需要添加为坐标。也用逗号分隔,并为表的每一行复制。
 
例如(ssget“_W”(列表16.8 10.3)(列表18.9 5.0)((0。“TEXT”)))
 
我通常不会发帖,因为我知道新手的请求有多烦人,但我一直找不到在编写之前修改提取文本布局的方法。
 
如果可能的话,我们将不胜感激。谢谢
 
 
我在下面添加了代码

mdwin 发表于 2022-7-6 15:20:56


;; BOM to CSV; A program to create a csv file from a text based table in AutoCAD
;; Author: Doug Barnes
;; Company: Grantek Systems Integration
(defun Cleanup_Text ()
;; find all the text with no content and erase them
(setq nil_text
(ssget "x"
'((-4 . "<and") (0 . "TEXT") (1 . "") (-4 . "and>"))
)
)
;; search for text with no content
(if nil_text
(command "erase" nil_text "")
)
;; erase text with no content
)
;; end cleanup_text defun
;;==========================================================================================
(defun Gather_Text (/ sel2 ct)

(setq Text_SS (ssget "_W" (list 16.8 10.3)(list 18.9 5.0) '((0 . "TEXT"))))
(setq sel2 (ssget "_W" (list 16.8 16.6)(list 25.8 11.0) '((0 . "TEXT"))))
(setq ct 0)
;set counter to zero
(repeat (sslength sel2)
;get the number of items in selection set 2
;and loop that number of times
(ssadd (ssname sel2 ct) Text_SS)
;get the name of the entity from selection set 2
;by using the counter index number and add it to
;selection set 1
(setq ct (1+ ct))
;increment the counter by 1

);end repeat
)
;; create a selection set for all text selected by the user.
;; end Gather_Text defun
;;==========================================================================================
(defun MakeList_X_Y_Text (Text_SS)
;; Make a list of x-coords, y-coords and text
(setq MakeList_cnt 0)
(repeat (sslength Text_SS)
(setq X_cord
(if (= (cdr (assoc 72 (entget (ssname Text_SS MakeList_cnt))))
0
)
;; check for the text's justification
(cadr (assoc 10 (entget (ssname Text_SS MakeList_cnt))))
;; if left justified use first alignment point
(cadr (assoc 11 (entget (ssname Text_SS MakeList_cnt))))
;; else use second alignment point
)
;;end if
)
;;end Setq
(setq y_cord
(if (= (cdr (assoc 72 (entget (ssname Text_SS MakeList_cnt))))
0
)
;; check for the text's justification
(caddr (assoc 10 (entget (ssname Text_SS MakeList_cnt))))
;; if left justified use first alignment point
(caddr (assoc 11 (entget (ssname Text_SS MakeList_cnt))))
;; else use second alignment point
)
;;end if
)
(setq List_X_Y_Text
(append
List_X_Y_Text
(list
(list
(cons "X coord"
X_cord
)
(cons "Y coord" y_cord)
(cons "Text"
(cdr (assoc 1 (entget (ssname Text_SS MakeList_cnt))))
)
)
)
)
)
;;make assocation list of x, y and text dotted pairs
(setq MakeList_cnt (1+ MakeList_cnt))
;; index to next entity
)
;;repeat
)
;;end MakeList_X_Y_Text defun
;;==========================================================================================
(defun Sort_by_X (List_X_Y_Text)
;; re-order list from left to right
(setq X_List
(vl-sort
List_X_Y_Text
(FUNCTION (LAMBDA (E1 E2) (< (cdar E1) (cdar E2))))
)
)
)
;; end Sort_by_X defun
;;==========================================================================================
(defun Sort_by_Y (List_X_Y_Text_Col)
;; re-order list from top to bottom
(setq Y_List
(vl-sort
List_X_Y_Text_Col
(FUNCTION (LAMBDA (E1 E2) (> (cdadr E1) (cdadr E2))))
)
)
)
;; end Sort_by_Y defun
;;==========================================================================================
(defun Get_Columns (X_List)
;; determine the number of columns text
(setq Column_Qty 1
X_List_cnt 0
)
(repeat (length X_List)
;; add a column number to List_X_Y_Text
(setq List_X_Y_Text_Col
(append List_X_Y_Text_Col
(list (list
(assoc "X coord" (nth X_List_cnt X_List))
(assoc "Y coord" (nth X_List_cnt X_List))
(assoc "Text" (nth X_List_cnt X_List))
(cons "Column" Column_Qty)
)
)
)
)
(if (/= (nth (+ X_List_cnt 1) X_List) nil)
;; Check for end of list
(progn
(if
(>=
(- (cdr (car (nth (+ X_List_cnt 1) X_List))) Line_Tolerance)
(cdr (car (nth X_List_cnt X_List)))
)
;; if the X Coord of the next text is out of tolerance with the current text then increase the column count
(setq Column_Qty (1+ Column_Qty))
)
)
)
(setq X_List_cnt (1+ X_List_cnt))
;; index list position
)
;; end repeat
)
;; end Get_Columns defun
;;==========================================================================================
(defun Get_Rows (Y_List)
;; determine the number of rows of text
(setq Row_Qty 1
Y_List_cnt
0
)
(repeat (length Y_List)
;; add a row number to List_X_Y_Text_Col
(setq List_All
(append
List_All
(list (list ;; make a list of x, y, text, column and row
(assoc "X coord" (nth Y_List_cnt Y_List))
(assoc "Y coord" (nth Y_List_cnt Y_List))
(assoc "Text" (nth Y_List_cnt Y_List))
(assoc "Column" (nth Y_List_cnt Y_List))
(cons "Row" Row_Qty)
)
)
)
)
(if (/= (nth (+ Y_List_cnt 1) Y_List) nil)
;; Check for end of list
(progn
(if (<= (cdr (cadr (nth (+ Y_List_cnt 1) Y_List)))
(- (cdr (cadr (nth Y_List_cnt Y_List))) Line_Tolerance)
)
;; if the Y Coord of the next text is out of tolerance with the current text then increase the row count
(setq Row_Qty (1+ Row_Qty))
)
;; end if
)
;;end progn
)
;; end if
(setq Y_List_cnt (1+ Y_List_cnt))
;; index list position
)
;; end repeat
)
;; end Get_Rows defun
;;==========================================================================================
(defun Write_BOM_to_CSV ()
(setq Position 0)
(setq Path (getvar "dwgprefix"))
;; Obtain the file path of the drawing
(setq Dwg_Name (substr (getvar "dwgname")
1
(- (strlen (getvar "dwgname")) 4)
)
)
;; remove the .dwg from the file name
(setq BOM_CSV_File (open (strcat Path Dwg_Name " WELD.txt") "a"))
;; Open a CSV file for ammending
(while (/= (nth Position List_All) nil)
(setq Current_Row (cddr (nth Position List_All)))
;; setup to gather all of the same row text
(setq Next_Row (cddr (nth (+ Position 1) List_All)))
;; setup to check end of row
(while (= (cdr (assoc "Row" Current_Row))
(cdr (assoc "Row" Next_Row))
)
;; loop for all the same row
(setq Text_Column
(append Text_Column
(list (list (cdr (assoc "Text" Current_Row))
(cdr (assoc "Column" Current_Row))
)
)
)
)
;; create a list of text and column only
(setq Position (1+ Position))
;; index position in list
(setq Current_Row (cddr (nth Position List_All)))
(setq Next_Row (cddr (nth (+ Position 1) List_All)))
)
;; end if
(setq Text_Column
(append Text_Column
(list (list (cdr (assoc "Text" Current_Row))
(cdr (assoc "Column" Current_Row))
)
)
)
)
;; append Text_Column with the last text in the current row
(setq Text_Column
(vl-sort
Text_Column
(FUNCTION (LAMBDA (E1 E2) (< (cadr E1) (cadr E2))))
)
)
;; Sort list by Column number (left to right)
(setq Column_Qty_Count
1
Write_Row ""
Column_List_Position
0
)
(repeat Column_Qty
;; repeat for the maximum number of columns
(if (= (cadr (nth Column_List_Position Text_Column))
Column_Qty_Count
)
;; check the position of the current text's postion with the column count
(progn ;; if equal string together the cuurent text and a comma
(setq
Write_Row (strcat
Write_Row
(car (nth Column_List_Position Text_Column))
","
)
)
(setq Column_List_Position (1+ Column_List_Position))
;; index position
)
;; end progn
;; if not equal string together previous text and a comma
(setq Write_Row (strcat Write_Row ","))
)
;; end if
(setq Column_Qty_Count (1+ Column_Qty_Count))
;; index the column count
)
;; end repeat
;;(print Write_Row)
(write-line Write_Row BOM_CSV_File)
;; write the current row to the csv file
(setq Position (1+ Position))
;; index list position
(setq Text_Column nil)
;; reset for next row
)
;; end while
(close BOM_CSV_File)
;; close the csv file
)
;; end Write_BOM_to_CSV defun
;;==========================================================================================
;; Create a CSV file from a text based Bill of Materials in AutoCAD
(defun c:weld (/ X_List Y_List
Text_Column List_X_Y_Text List_X_Y_Text_Col
List_All
)
(Cleanup_Text)
(Gather_Text)
(MakeList_X_Y_Text Text_SS)
(Sort_by_X List_X_Y_Text)
(setq Text_Height (cdr (assoc 40 (entget (ssname Text_SS 0)))))
;; get the text height used
(setq Line_Tolerance (+ Text_Height (* Text_Height 0.1)))
;; set up a line spacing tolerance
(Get_Columns X_List)
(Sort_by_Y List_X_Y_Text_Col)
(Get_Rows Y_List)
(Write_BOM_to_CSV)
)
;; end defun

mdwin 发表于 2022-7-6 15:33:08

页: [1]
查看完整版本: 将表格文本转换为CSV(&O)