saim Posted November 6, 2019 Share Posted November 6, 2019 Hello again! I mannaged to read some strings from a text file and place them on a list. When I tell cad to print them on screen, I get the following result: Quote ("PV1;2;2" "PV2;6;6" "PV3;8;10") That's what I expected, so I'm fine, so far. Now I want to get those strings and convert them in information to draw something. Like a polyline from point (2,2) to (6,6) and to (8,10). In other words: how do I get CAD to undertand that list as "the point 'PV1' has the x-coordinate equal 2 and the y coordinate equal 2", and so on? The cue I used to change from one info to another is the ";" (semocolon) - is that ok or is there some kind of default? ... I may need to make this issue a bit more complex, but I need that milestone to go further... BTW, in case it matters how I got that line, I used the following code and the following text file contents: (defun c:desenha( / dflt fname fl fil plt1) (setq dflt (strcat (getvar 'dwgprefix) (substr (getvar 'dwgname) 1 (- (strlen (getvar 'dwgname)) 4)) )) ; dá um nome default pro arquivo (setq fname (getfiled "esse é o título da cx de diálogo" dflt "txt" 8)) ; usa a função getfiled pra procurar o arquivo (setq fl (open fname "r")) (while (setq fil (read-line fl)) (if (not (null fil)) (setq plt1 (append plt1 (list fil))) ) ;end if ) ;end while (close fl) (print plt1) (princ) ) Quote PV1;2;2 PV2;6;6 PV3;8;10 Quote Link to comment Share on other sites More sharing options...
Tharwat Posted November 6, 2019 Share Posted November 6, 2019 Hi, An example of how to convert a list of strings to a list of coordinates based on your list if your list is always with the same form. (foreach str '("PV1;2;2" "PV2;6;6" "PV3;8;10") (setq lst (cons (read (strcat "(" (vl-string-translate ";" "," (substr str 5)) ")")) lst)) ) You need to reverse the list afterwards. 1 Quote Link to comment Share on other sites More sharing options...
Lee Mac Posted November 6, 2019 Share Posted November 6, 2019 (edited) You could use a function such as my String to List function to convert the string to a list using a supplied token, for example: (defun c:desenha2 ( / des lst str txt ) (if (setq txt (getfiled "Esse é o título da cx de diálogo" (strcat (getvar 'dwgprefix) (vl-filename-base (getvar 'dwgname))) "txt" 8)) (if (setq des (open txt "r")) (progn (while (setq str (read-line des)) (setq lst (cons (LM:str->lst str ";") lst)) ) (close des) (if (setq lst (vl-remove nil (mapcar (function (lambda ( i / n x y ) (if (and (wcmatch (car i) "PV*") (setq n (atoi (substr (car i) 3))) (setq x (distof (cadr i) 2)) (setq y (distof (caddr i) 2)) ) (list n 10 x y) ) ) ) lst ) ) ) (entmake (append (list '(000 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline") (cons 90 (length lst)) '(070 . 0) ) (mapcar 'cdr (vl-sort lst '(lambda ( a b ) (< (car a) (car b))))) ) ) ) ) (princ "\nUnable to open file for reading.") ) (princ "\n*Cancel*") ) (princ) ) ;; String to List - Lee Mac ;; Separates a string using a given delimiter ;; str - [str] String to process ;; del - [str] Delimiter by which to separate the string ;; Returns: [lst] List of strings (defun LM:str->lst ( str del / pos ) (if (setq pos (vl-string-search del str)) (cons (substr str 1 pos) (LM:str->lst (substr str (+ pos 1 (strlen del))) del)) (list str) ) ) (princ) Edited November 6, 2019 by Lee Mac 1 Quote Link to comment Share on other sites More sharing options...
rlx Posted November 6, 2019 Share Posted November 6, 2019 oh darn , too late again... awell... (defun SplitStr ( s d / p ) (if (setq p (vl-string-search d s))(cons (substr s 1 p) (SplitStr (substr s (+ p 1 (strlen d))) d)) (list s))) (defun istext (s)(if (= (type s) 'str) t nil)) (defun plc (p l c)(entmakex (append (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline")(cons 8 l)(cons 90 (length p))(cons 70 c))(mapcar '(lambda (pt) (cons 10 pt)) p)))) (defun t1 (sl / pl )(and (vl-consp sl)(vl-every 'istext sl)(vl-every '(lambda (x)(wcmatch x "*;*;*")) sl) (vl-consp (setq pl (mapcar '(lambda (x)(mapcar 'atoi (cdr (SplitStr x ";")))) sl))) (plc pl "0" 0))) ; test : (t1 '("PV1;2;2" "PV2;6;6" "PV3;8;10")) 1 Quote Link to comment Share on other sites More sharing options...
BIGAL Posted November 7, 2019 Share Posted November 7, 2019 Rlx has done the answer but a list of lists may be usefull for other than "PV". Using lee's LM:str->lst (("PV1" 2 2)("PV2" 6 6) ("PV3" 8 10)) 1 Quote Link to comment Share on other sites More sharing options...
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.