Jump to content

Create vertices on polyline


jes_g

Recommended Posts

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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 by jes_g
Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

Lee Mac's example is a bit advanced, since he goes with the vanilla route along with a 'bit' of list manipulation. :lol:

 

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 code

    Your 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 trouble

    Some of the steps you mention might be impossible to achieve

    the 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 skill

    Simple 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 things

    Your 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 routine

    You 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 up

    Just give up, skip all the above steps and ask someone else to write your "golden pony on a pink background wallpaper routine".


Link to comment
Share on other sites

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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...