Polyline vertext - set "name"
Hello everybody,I want to define points inautolisp, like this: select a polyline, and the first vertex to be set as P1, the second vertex P2......and so on...vertex n to be Pn .... something possible? how? Any idea? Thanks! You can do this
(setq i 0)(foreach n lst (set (read (strcat "P" (itoa (setq i (1+ i))))) n) )
... but, IMO, you can always use (nth n lst) when you need Pn value... try this :
(defun c:test( / es ent str vtxlist c txtsize)(defun make_TEXT (content textstyle layer color coo degree textsize / txt_list);;entmake text (if (null textstyle) (setq textstyle "standard")) (setq txt_list (list (cons 0 "TEXT") (cons 1 content) (cons 7 textstyle) (cons 8 layer) (cons 62 color) (cons 10 coo) (cons 50 degree) (cons 40 textsize))) (entmake txt_list) (entlast))(if (setq es (car (entsel "\nSelect Polyline >> "))) (progn(setq ent (entget es))(setq str "name");;;(setq vtxlist '())(mapcar '(lambda (x) (if (eq (car x) 10) (setq vtxlist (append vtxlist (list (cdr x)))) ) )ent);mapcar(setq c 1 txtsize 1)(foreach vtx vtxlist (make_text (strcat str (itoa c)) nil (getvar "clayer") 10 vtx 0 txtsize) (setq c (1+ c))) ) (alert "CANCELED"))(princ)) Hi Kraz,
I want to use P1 , P2...Pn to draw somethig else with them... shoult be somethig like polar function in autolisp, to define that point. To explain better, i want to draw lines from P1, P2...Pn to other points already defined with polar function - i don't need to add text in drawing for each vertex... i just want to set these points ...
Let's say i want to make a lisp that will draw vertical lines from every vertex of a polyline, perpendicular on a horizontal line - this is why i need P1, P2...Pn. I hope you understand me.
Thanks! Now i use a lisp that need to select every vertex of a polyline to define P1, P2, ..Pn. And i want to define these points only by selecting that polyline... I thought I answered your question in previous post but if you want more, here it is
(defun C:TEST ( / i ss) (if (setq i 0 ss (ssget ":E:S" '((0 . "LWPOLYLINE")))) (foreach n (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget (ssname ss 0)))) (set (read (strcat "P" (itoa (setq i (1+ i))))) n) ; - here you can draw a line like (entmakex (list '(0 . "LINE") (cons 10 n) (cons 11 some_point))) ) ))However, I still think that your approach is wrong. You can draw those lines without setting (global) variables P1 ... Pn You should be able to do what you're wanting (bigger picture) without declaring global variables... If you're going to use Visual LISP, then just go straight for the vlax-curve* functions (IMO). :wink: Thanks Stefan it's exactly what i want... You are right, is not a good approach , but i already have a big lisp that use in many places P1, P2.... Thanks! So in the end of rountine, you should put
(repeat i (set (read (strcat "P" (itoa i))) nil )(setq i (1- i)))
or sth similar to clear global variables ... maybe
(defun c:test ( / e n ) (while (not (and (setq e (car (entsel "\nSelect polyline: "))) (eq "LWPOLYLINE" (cdr (assoc 0 (setq e (entget e))))) (setq n 0) ) ) ) (foreach x e (if (eq 10 (car x)) (set (read (strcat "p" (itoa (setq n (1+ n)) ) ) ) (cdr x) ) ) ) (princ))
页:
[1]
2