Jump to content
alm865

Can't get verticies of viewport

Recommended Posts

So, this is a weird problem.

 

I can't get the vertices of the polyline that makes up a non-rectangular viewport. To replicate my problem, start with a rectangular viewport, rotate it in the paper space and move one of it's vertices. Now for some reason property number 340 is not the polyline that makes up the viewport.

 

I was originally using lee-mac's 'vpoutline' lisp script (can't add link since I'm a newbie) to draw an outline of the viewport but that doesn't even work (if lee-mac's script can't work it out then something is very wrong!!)

 

As you can see on the left is the viewport. Prop 340 should be the pline. Go into the pline and it has no vertices (middle)!

 

On the right and bottom are me finding the correct pline a different way (not programmatically) and the vertices are all there and indeed correct.

 

attachment.php?attachmentid=58948&cid=1&stc=1

To be very clear, if you draw a polygonal viewport from scratch everything is fine, that's not my problem. This only applies to a rectangular viewport you have rotated and moved one of it's vertices.

 

So how do I get the vertices of the pline that makes up the viewport?

 

 

 

 

Untitled.jpg

Edited by alm865

Share this post


Link to post
Share on other sites

Here is an example of a viewport that I am referring to.

 

It appears polygonal until you try and get the pline details. Something just isn't right and I can't work it out... I'm hoping I'm doing something silly and someone can point out what I have missed.

 

Please try the 'vpoutline' lisp script from lee-mac's website for a starting point.

 

(not the same drawing as above by the way so the entity names are going to be different. Sorry)

 

Drawing1.dwg

Edited by alm865

Share this post


Link to post
Share on other sites

For some strange reason the polyline is an "AcDb2dPolyline" and not an "AcDbPolyline". The vertices for an "AcDb2dPolyline" are stored as separate entities which is why you do not see them in the entity list.

For the first vertex:

(entget (entnext (car (entsel))))

Share this post


Link to post
Share on other sites

Awesome! That works. Thanks for the help.

 

It's an easy enough check too to see if it's a "AcDb2dPolyline" or a normal "AcDbPolyline".

 

This has been doing my head in for a while now. Thanks again.

Share this post


Link to post
Share on other sites

For anyone looking to make lee-mac's 'vpoutline.lsp' work for these weird viewports, download lee-mac's script from his webpage then change this function:

 


(defun c:vpo ( / *error* _lwvertices cen ent lst ocs vpe vpt vpt2)

   (defun *error* ( msg )
       (LM:endundo (LM:acdoc))
       (if (not (wcmatch (strcase msg t) "*break,*cancel*,*exit*"))
           (princ (strcat "\nError: " msg))
       )
       (princ)
   )

   (LM:startundo (LM:acdoc))
   (cond
       (   (/= 1 (getvar 'cvport))
           (princ "\nCommand not available in Modelspace.")
       )
       (   (setq vpt (LM:ssget "\nSelect viewport: " '("_+.:E:S" ((0 . "VIEWPORT")))))
           
       (setq vpt2 (ssname vpt 0))
       (setq vpt (entget vpt2))
           (if (setq ent (cdr (assoc 340 vpt)))
         (progn
       (if (member '(100 . "AcDb2dPolyline") (entget ent))
         (progn
                       (setq lst (vpo:lw2dvertices (entnext vpt2)))
           )
         (progn
                   (setq lst (vpo:lwvertices (entget ent)))
           )
         )
         )
         (progn
       (setq cen (mapcar 'list (cdr (assoc 10 vpt))
                             (list
                                 (/ (cdr (assoc 40 vpt)) 2.0)
                                 (/ (cdr (assoc 41 vpt)) 2.0)
                             )
                         )
                     lst (mapcar
                            '(lambda ( a ) (cons (mapcar 'apply a cen) '(42 . 0.0)))
                            '((- -) (+ -) (+ +) (- +))
                         )
       )
         )
           )
           (setq vpe (cdr (assoc -1 vpt))
                 ocs (cdr (assoc 16 vpt))
           )
           (entmake
               (append
                   (list
                      '(000 . "LWPOLYLINE")
                      '(100 . "AcDbEntity")
                      '(100 . "AcDbPolyline")
                       (cons 90 (length lst))
                      '(070 . 1)
                      '(410 . "Model")
                   )
                   (apply 'append
                       (mapcar
                          '(lambda ( x )
                               (list (cons 10 (trans (pcs2wcs (car x) vpe) 0 ocs)) (cdr x))
                           )
                           lst
                       )
                   )
                   (list (cons 210 ocs))
               )
           )
       )
   )
   (LM:endundo (LM:acdoc))
   (princ)
)

 

... and add in this extra function:

 


(defun vpo:lw2dvertices ( e / ent)
 (setq ent e)
 (setq e (entget e))
 (if (eq (assoc 42 e) nil)
      (progn
    ;;For whatever reason the first vertex is not to be used
       (if (setq e (member (assoc 10 e) e))
       (vpo:lw2dvertices (entnext ent))
       )
    )
   (progn
       (if (setq e (member (assoc 10 e) e))
           (cons
               (cons (cdr (assoc 10 e)) (assoc 42 e))
               (vpo:lw2dvertices (entnext ent))
           )
       )

     )

 )
)

 

It's an ugly hack but works. Thanks lee-mac for the original example BTW.

Share this post


Link to post
Share on other sites

Thanks Lee Mac.

 

You have some very impressive samples on your webpage! They've certainly helped me learn many things in Autolisp.

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

×