BrianTFC Posted February 6, 2015 Posted February 6, 2015 Hi all, I need some help with a lisp routine that I'm attempting to write. What I need to do is extract a panel label by selecting the text and then select the dimensions that I need extract, I've managed to extract the dimensions correctly but when the information is extracted I get is "nil" in the first cell where the panel label should be and the dimensions in the next to cells. I don't Have Excel on my workstation so I have to use CSV file, I've already wrote an extraction code to run in Excel to retrieve the information in the CVS file. Also is there a way to save the CVS file in the same location that I have the drawing open? If someone could help me I would appreciate it. (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) Thanks Brian Quote
Commandobill Posted February 6, 2015 Posted February 6, 2015 Not exactly sure what you are trying to accomplish in the first part of your question without an example, but the second part is easy. To put the CSV in the same folder as your drawing you just need to get the "dwgprefix" variable. ie: (setq fn (getvar 'dwgprefix)) That will put it in the same folder. You state that you are selecting the text THEN selecting dimensions, but you only have one SSGET. Could be part of your problem. Quote
Lee Mac Posted February 7, 2015 Posted February 7, 2015 I've managed to extract the dimensions correctly but when the information is extracted I get is "nil" in the first cell where the panel label should be and the dimensions in the next to cells. Consider that DXF Group 42 will only be present for *DIMENSION entities, and will not be present in the DXF data for *TEXT entities, meaning your variable 'm' will be null for some iterations of the repeat loop. Quote
BrianTFC Posted February 8, 2015 Author Posted February 8, 2015 (edited) Lee, how do I make this work? do I need to have a separate ssget for the text? I added the new dxf group for text but now I get just the text. for some reason I can't put this code in the code tags. (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) Edited February 9, 2015 by SLW210 added code tags Quote
Tharwat Posted February 8, 2015 Posted February 8, 2015 [ Not Tested ] (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) ) Quote
BrianTFC Posted February 8, 2015 Author Posted February 8, 2015 Tharwat, thanks, I tested it and it gives me all three in row A in the CSV file, can you make it put the "TEXT" in row A and the first "Dimension" in row B and the second "Dimension" in row C? Quote
Lee Mac Posted February 8, 2015 Posted February 8, 2015 I tested it and it gives me all three in row A in the CSV file, can you make it put the "TEXT" in row A and the first "Dimension" in row B and the second "Dimension" in row C? Assuming you mean columns instead of rows, try the following: (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 ((car txt)) ("")) "," (cond ((car dim)) ("")) "," (cond ((cadr dim)) ("")) ) des ) (setq txt (cdr txt) dim (cddr dim) ) ) ) ) (if (= 'file (type des)) (close des)) (princ) ) 1 Quote
BrianTFC Posted February 9, 2015 Author Posted February 9, 2015 (edited) Lee, thank you, yes I meant columns. it works great. Is there a way to have the CSV file save in the same place as the drawing? and have the name of the CSV be the same as the name of the drawing? Edited February 9, 2015 by BrianTFC Quote
Tharwat Posted February 9, 2015 Posted February 9, 2015 Is there a way to have the CSV file save in the same place as the drawing? and have the name of the CSV be the same as the name of the drawing? (strcat (getvar 'DWGPREFIX) (vl-filename-base (getvar 'DWGNAME)) ".csv") Quote
BrianTFC Posted February 9, 2015 Author Posted February 9, 2015 Lee & Tharwat, First of all I would to thank you for all of your help, I'm still learning how to write lisp routine correctly. I don't know where to put the line of code that Tharwat wrote in the lisp routine that Lee wrote. After running my excel extracting macro I found out that I would have to save all of my files in one location but with just the drawing name, so if you could show me where it goes in the lisp that would help me a lot. I have a feeling from looking at the two different lisp written by you guys that it not that easy just to put the line of code in the lisp.. Thanks Brian. Quote
Lee Mac Posted February 9, 2015 Posted February 9, 2015 Hi Brian, Thank you for your gratitude, I'm glad the program is working well. The expression: (strcat (getvar 'dwgprefix) (vl-filename-base (getvar 'dwgname)) ".csv") Will construct & return the filepath of a CSV file with the same filename as the active drawing, and residing in the same location as the active drawing (i.e. in the working directory). My current code is writing to the filepath: "f:\\BrianD\\Dims.csv" Therefore, replacing this filepath with the expression given above with produce the required result. And so: (setq des (open [color=red]"f:\\BrianD\\Dims.csv"[/color] "a")) Becomes: (setq des (open [color=red](strcat (getvar 'dwgprefix) (vl-filename-base (getvar 'dwgname)) ".csv")[/color] "a")) Quote
BrianTFC Posted February 9, 2015 Author Posted February 9, 2015 Lee, ok now im starting to understand, so what if I just wanted to save the file i.e. "f:\\BrianD\\dwgname.csv" . what would the code look like? Quote
Tharwat Posted February 9, 2015 Posted February 9, 2015 Brian . Open the Visual Lisp editor with the command name vlisp then activate the console window then copy and paste every single line of codes separately as shown below to see the return of each line of codes , so that would explain the aim of these codes in your example very clearly . (getvar 'dwgprefix) Then this . (getvar 'dwgname) Finally this one . (vl-filename-base (getvar 'dwgname)) Quote
Lee Mac Posted February 9, 2015 Posted February 9, 2015 [color="red"](strcat "f:\\BrianD\\" (vl-filename-base (getvar 'dwgname)) ".csv")[/color] Quote
BrianTFC Posted February 9, 2015 Author Posted February 9, 2015 Lee, What line determines what the type of dimension output is going to be? i.e. 5'-7" to 67. for my extracting program I need to have it be just the numbers, no feet or inch marks. Thanks Brian Quote
Lee Mac Posted February 9, 2015 Posted February 9, 2015 What line determines what the type of dimension output is going to be? i.e. 5'-7" to 67. for my extracting program I need to have it be just the numbers, no feet or inch marks. The formatting is determined by the following rtos expression: (rtos (cdr (assoc 42 enx))) Since the rtos function is being called without the units & precision arguments, the dimension measurement value is formatted based on your values for the LUNITS & LUPREC system variables. You can override this formatting by providing the units (mode) & precision arguments as described by the rtos documentation, e.g. for decimal formatting with precision controlled by LUPREC, you would use: (rtos (cdr (assoc 42 enx)) 2) For decimal formatting to 4 decimal places: (rtos (cdr (assoc 42 enx)) 2 4) Quote
BrianTFC Posted February 10, 2015 Author Posted February 10, 2015 (edited) Lee, Tharwat Thank you guys for explaining everything to me. I've managed to get it to work just the way I need it. Edited February 10, 2015 by BrianTFC Quote
Tharwat Posted February 10, 2015 Posted February 10, 2015 Lee, Tharwat Thank you guys for explaining everything to me. I've managed to get it to work just the way I need it. I am Happy to help and good luck with your work Brian . Quote
athran Posted August 14, 2017 Posted August 14, 2017 Hi Mr. Lee, Can you please help me with this program? It is almost the same as what is mentioned before but I want it to be written in csv file like this: code1 code2 dimension dimension quantity it will ask the user to select 2 text and 2 dimensions then input quantity. Thanks! 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.