jes_g Posted February 5, 2018 Posted February 5, 2018 sample_MPoly2.dwg Hi all, I have six polylines, one of them is closed. I need to create vertices on a closed polyline. The sample drawing is attached. The vertex coordinates to be created are the coordinates of first vertex of other polylines. So far I only managed to store the coordinate of starting vertex of one polyline. (vl-load-com) (setq s1 (car (entsel))) (setq pl (vlax-ename->vla-object s1)) (defun vlax-list->2D-point (lst) (if lst (cons (list (car lst) (cadr lst)) (vlax-list->2D-point (cddr lst))))) (setq vertCoord(vlax-list->2D-point (vlax-get pl 'Coordinates))) (setq vertStart (car vertCoord)) Appreciate your help. Thank you Quote
Grrr Posted February 5, 2018 Posted February 5, 2018 Here are 3 different types of checks if the polyline is closed: (if (setq polyline (car (entsel))) (or (= 1 (logand 1 (cdr (assoc 70 (entget polyline))))) (vlax-curve-isClosed polyline) (eq :vlax-true (vla-get-Closed (vlax-ename->vla-object polyline))) ) ) Quote
jes_g Posted February 5, 2018 Author Posted February 5, 2018 (edited) Here are 3 different types of checks if the polyline is closed: (if (setq polyline (car (entsel))) (or (= 1 (logand 1 (cdr (assoc 70 (entget polyline))))) (vlax-curve-isClosed polyline) (eq :vlax-true (vla-get-Closed (vlax-ename->vla-object polyline))) ) ) Interesting methods, might be helpful. Thanks Edited February 6, 2018 by jes_g Quote
BIGAL Posted February 6, 2018 Posted February 6, 2018 Works for open or closed ; pline co-ords example ; By Alan H (defun getcoords (ent) (vlax-safearray->list (vlax-variant-value (vlax-get-property (vlax-ename->vla-object ent) "Coordinates" ) ) ) ) (defun co-ords2xy () ; convert now to a list of xy as co-ords are x y x y x y if 3d x y z x y z (setq len (length co-ords)) (setq numb (/ len 2)) ; even and odd check required (setq I 0) (repeat numb (setq xy (list (nth i co-ords)(nth (+ I 1) co-ords) )) ; odd (setq xy (list (nth i co-ords)(nth (+ I 1) co-ords)(nth (+ I 2) co-ords) )) (setq co-ordsxy (cons xy co-ordsxy)) (setq I (+ I 2)) ) ) ; program starts here (setq co-ords (getcoords (car (entsel "\nplease pick pline")))) (co-ords2xy) ; list of 2d points making pline Quote
ronjonp Posted February 6, 2018 Posted February 6, 2018 Interesting methods, might be helpful. Unfortunately, the question was still not answered.Thank you Fwiw .. You've been given some complete solutions to big problems. Time to start learning to fish rather than expect a meal. Quote
Lee Mac Posted February 6, 2018 Posted February 6, 2018 Here's an example of how to add a vertex to a polyline. Quote
Roy_043 Posted February 6, 2018 Posted February 6, 2018 The OP has created 3 topics related to this problem. And Ronjonp has already provided a solution here. Quote
jes_g Posted February 6, 2018 Author Posted February 6, 2018 Fwiw .. You've been given some complete solutions to big problems. Time to start learning to fish rather than expect a meal. You're right, sorry. I'm just new in AutoLISP and really pressed for time. But slowly getting the hang of LISP Quote
jes_g Posted February 6, 2018 Author Posted February 6, 2018 Works for open or closed ; pline co-ords example ; By Alan H (defun getcoords (ent) (vlax-safearray->list (vlax-variant-value (vlax-get-property (vlax-ename->vla-object ent) "Coordinates" ) ) ) ) (defun co-ords2xy () ; convert now to a list of xy as co-ords are x y x y x y if 3d x y z x y z (setq len (length co-ords)) (setq numb (/ len 2)) ; even and odd check required (setq I 0) (repeat numb (setq xy (list (nth i co-ords)(nth (+ I 1) co-ords) )) ; odd (setq xy (list (nth i co-ords)(nth (+ I 1) co-ords)(nth (+ I 2) co-ords) )) (setq co-ordsxy (cons xy co-ordsxy)) (setq I (+ I 2)) ) ) ; program starts here (setq co-ords (getcoords (car (entsel "\nplease pick pline")))) (co-ords2xy) ; list of 2d points making pline Thanks, BIGAL Quote
jes_g Posted February 6, 2018 Author Posted February 6, 2018 Here's an example of how to add a vertex to a polyline. Thank you, Lee Mac. I was using your AddLWPolylineVertexV1-0.lsp routine. Could you possibly explain your code just a bit, I've got trouble understanding it. I started breaking down the program line by line ;;----------------=={ Add LWPolyline Vertex }==---------------;; ;; ;; ;; Adds a new vertex to an LWPolyline at a point specified ;; ;; by the user; compatible with LWPolylines at any ;; ;; orientation, with varying width and arc segments. ;; ;;------------------------------------------------------------;; ;; Author: Lee Mac, Copyright © 2012 - www.lee-mac.com ;; ;;------------------------------------------------------------;; ;; Version 1.0 - 17-12-2012 ;; ;; ;; ;; First release. ;; ;;------------------------------------------------------------;; (defun c:apv ( / a b e h l n p r w x z ) (while ;;inf loop (progn (setq p (getpoint "\nPick Point for New Vertex: ")) (cond ( (null p) nil) ;; 1st cond - if p not equal 0 return nil ( (null (setq e (nentselp p))) ;; 2nd cond ? The nentselp function returns a 4×4 transformation matrix. What for? (princ "\nPoint does not lie on an LWPolyline.") ;; so if the returned matrix is empty (nil), print this ) ( (= 4 (length e)) ;; 3rd cond - ?? (princ "\nObject is Nested.") ;; what is nested object? ) ( (/= "LWPOLYLINE" (cdr (assoc 0 (entget (setq e (car e)))))) ;; 4th cond - compare. If not equal... (princ "\nObject is not an LWPolyline.") ;; ...print this ) ) ) ) (if (and p e ;; expression returns T if both p and e are not nil, else nil (setq p (vlax-curve-getclosestpointto e (trans p 1 0)) ;; the UCS is rotated 90 degrees counterclockwise around the WCS Z axis?? Closest point between e and rotated list n (vlax-curve-getparamatpoint e p) ;; still don't understand what getparamatpoint means ) ) (if (not (equal n (fix n) 1e-) ;; checks if not equal - n and its truncated value with fuzz distance of 1e-8 (progn (setq e (entget e) h (reverse (member (assoc 39 e) (reverse e))) ;; returns list consisting of 14 lists - what for? l (LM:LWVertices e) z (assoc 210 e) ) (repeat (fix n) (setq a (cons (car l) a) l (cdr l) ) ) (setq x (car l) r (- n (fix n)) w (cdr (assoc 40 x)) w (+ w (* r (- (cdr (assoc 41 x)) w))) b (atan (cdr (assoc 42 x))) ) (entmod (append h (apply 'append (reverse a)) (list (assoc 10 x) (assoc 40 x) (cons 41 w) (cons 42 (tan (* r b))) ) (list (cons 10 (trans p 0 (cdr z))) (cons 40 w) (assoc 41 x) (cons 42 (tan (* (- 1.0 r) b))) ) (apply 'append (cdr l)) (list z) ) ) ) ) ) (princ) ) ;; Tangent - Lee Mac ;; Args: x - real (defun tan ( x ) (if (not (equal 0.0 (cos x) 1e-10)) (/ (sin x) (cos x)) ) ) ;; LW Vertices - Lee Mac ;; Returns a list of lists in which each sublist describes ;; the position, starting width, ending width and bulge of the ;; vertex of a supplied LWPolyline (defun LM:LWVertices ( e ) (if (setq e (member (assoc 10 e) e)) (cons (list (assoc 10 e) (assoc 40 e) (assoc 41 e) (assoc 42 e) ) (LM:LWVertices (cdr e)) ) ) ) (vl-load-com) (princ) ;;------------------------------------------------------------;; ;; End of File ;; ;;------------------------------------------------------------;; Quote
Grrr Posted February 6, 2018 Posted February 6, 2018 Lee Mac's example is a bit advanced, since he goes with the vanilla route along with a 'bit' of list manipulation. If I was you I'd look into the AddVertex method, there are also alot of simple examples in the web, that use it. Also save the sample dwg in a bit older version, I'm using now ACAD 2017 and I'm unable to open it... Could you possibly explain your code just a bit, I've got trouble understanding it. BTW asking him to explain/comment his complete program is much more work/effort than if he had to code it the same from scratch.. But even if he did so, would that mean that you will be able to reproduce the same working code from zero? Generally speaking (not pointing at you), Here are some basic tips to start writing your own code: List the steps for your codeYour request/question must be logical and structured, which means that you have to know what valid steps must be performed in order for your program to work as expected.Sometimes more of a problem is to know the steps to follow, rather your overwhelming coding skill.So without a plan the request"WHEN I TYPE 2+2 ON THE WINDOWS CALCULATOR TO GIVE ME 6 AND THEN PUT A GOLDEN PONY ON A PINK BACKGROUND AS MY WALLPAPER" won't work. List the steps that are giving you troubleSome of the steps you mention might be impossible to achievethe rest are solvable or may contain known bugs.However now you know how achieavalalable are your request(s). Just start simple - how simple?: depends on you'simple' varies depending on your current coding skillSimple for me might be hard for you and hard for me might be easy for Lee. 'Short code' for one it could be 15 lines, for other it could be 50, for some 300.. others(pros) don't care - top priority is to get the job done (and done well) At first you might feel writing codes like a very hard essays, but with time and practice you could compare it like writing the alphabet! Start complicating thingsYour code works! However if you don't pick the exact object..*crash* if you type the wrong input.. *crash* and you have 15 lines of code that can be reduced to 3, all this for a cost to make the code a bit more complicated Assemble the routineYou have all the pieces from the puzzle (code blocks/subroutines).You already tested them, made sure they work as supposed..The final thing is just to assemble the main routine. Give upJust give up, skip all the above steps and ask someone else to write your "golden pony on a pink background wallpaper routine". Quote
BIGAL Posted February 7, 2018 Posted February 7, 2018 I'm just new in AutoLISP and really pressed for time we all have this problem a solution can take minutes another hours. 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.