flopo 发表于 2022-7-5 17:41:44

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!

Stefan BMR 发表于 2022-7-5 17:46:58

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...

kraz 发表于 2022-7-5 17:49:40

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))

flopo 发表于 2022-7-5 17:54:30

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!

flopo 发表于 2022-7-5 17:55:56

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...

Stefan BMR 发表于 2022-7-5 17:59:13

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

BlackBox 发表于 2022-7-5 18:00:57

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:

flopo 发表于 2022-7-5 18:04:30

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!

ketxu 发表于 2022-7-5 18:08:15

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 ...

Lt Dan's l 发表于 2022-7-5 18:10:52

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
查看完整版本: Polyline vertext - set "name"