Jump to content

Recommended Posts

jes_g

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

Share this post


Link to post
Share on other sites
Grrr

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

Share this post


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

Share this post


Link to post
Share on other sites
BIGAL

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

Share this post


Link to post
Share on other sites
ronjonp
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.

Share this post


Link to post
Share on other sites
Roy_043

The OP has created 3 topics related to this problem. And Ronjonp has already provided a solution here.

Share this post


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

Share this post


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

Share this post


Link to post
Share on other sites
jes_g
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                         ;;
;;------------------------------------------------------------;;

Share this post


Link to post
Share on other sites
Grrr

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


Share this post


Link to post
Share on other sites
BIGAL
I'm just new in AutoLISP and really pressed for time
we all have this problem a solution can take minutes another hours.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×