sspatriots Posted February 11, 2011 Posted February 11, 2011 Hi, I 'm new to the group. I'm hoping someone can shed some light on why I'm getting the following error everytime I run the popular free lisp routine: ; error: bad argument type: streamp nil Thanks, Steve ;; 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 . "")) ) ) ;; 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 () (setq Text_SS (ssget '((0 . "TEXT")))) ;; 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) ( ) ) ) ;; 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 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 " BOM.csv") "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) ( ) ) ;; 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:bom (/ 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 Quote
barnesd Posted February 14, 2011 Posted February 14, 2011 Do you still need help with this? Doug Barnes Quote
ShocksRock Posted February 14, 2011 Posted February 14, 2011 Hi Doug, I managed to get your lisp file to work after a lot of trial and error and then stumbling across what was causing my issues by accident. The file I was in was read-only and it didn't like that fact. Once I saved to my hard drive it worked fine. However, now I've run into another issue. I'm trying to use a lisp file called ATTDEF2Text.lsp. When I run it, it says to "Select objects", however, I can't seem to select any of the attribute blocks on my screen. Since I don't use AutoCad that much, I could be doing something way off base here. Any ideas would be greatly appreciated. Thanks, Steve Quote
ShocksRock Posted February 15, 2011 Posted February 15, 2011 Hi, Not sure how to send, so I'm copying what I found on the web below. Basically, I was able to get the BOM to CSV lisp file working on regular text on a drawing, but when I got to drawings that had these attribute lines for a drawing bill of material, I needed to try and find something that would extract the tag input values. However, not much success so far. (defun c:AttDef2Text (/ ActDoc LayoutCol tmpLayoutBlk) ; Changes attdef entities (attributes that haven't been put into a block) into dtext (vl-load-com) (setq ActDoc (vla-get-ActiveDocument (vlax-get-Acad-Object))) (vla-StartUndoMark ActDoc) (setq LayoutCol (vla-get-Layouts ActDoc)) (vlax-for LayoutObj LayoutCol (setq tmpLayoutBlk (vla-get-Block LayoutObj)) (vlax-for Obj tmpLayoutBlk (if (= (vla-get-ObjectName Obj) "AcDbAttributeDefinition") (progn (setq TextObj (vla-AddText tmpLayoutBlk (vla-get-TagString Obj) (vla-get-InsertionPoint Obj) (vla-get-Height Obj))) (vla-put-Alignment TextObj (vla-get-Alignment Obj)) (if (/= (vla-get-Alignment TextObj) 0) (vla-put-TextAlignmentPoint TextObj (vla-get-TextAlignmentPoint Obj)) ) (vla-put-Backward TextObj (vla-get-Backward Obj)) (vla-put-Layer TextObj (vla-get-Layer Obj)) (vla-put-Normal TextObj (vla-get-Normal Obj)) (vla-put-ObliqueAngle TextObj (vla-get-ObliqueAngle Obj)) (vla-put-Rotation TextObj (vla-get-Rotation Obj)) (vla-put-ScaleFactor TextObj (vla-get-ScaleFactor Obj)) (vla-put-StyleName TextObj (vla-get-StyleName Obj)) (vla-put-UpsideDown TextObj (vla-get-UpsideDown Obj)) (vla-Delete Obj) ) ) ) ) (vla-EndUndoMark ActDoc) (princ) ) Regards, Steve Quote
barnesd Posted February 15, 2011 Posted February 15, 2011 As a quick fix. You could use the Express tools to Explode Attributes to text, then run the BOM to CSV. Quote
ShocksRock Posted February 15, 2011 Posted February 15, 2011 How would I go about getting Express Tools? Please advise, Steve Quote
barnesd Posted February 15, 2011 Posted February 15, 2011 Steve, send me an email doug.barnes@grantek.com Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.