TheSwamp

Code Red => AutoLISP (Vanilla / Visual) => Topic started by: GDF on December 08, 2010, 11:06:10 AM

Title: Auto pick a point within last created closed polyline
Post by: GDF on December 08, 2010, 11:06:10 AM
Found these links:
http://www.theswamp.org/index.php?topic=7300.msg90367#msg90367
http://www.theswamp.org/index.php?topic=28437.0

I want to auto pick a point within the last created polyline.
Polyline has been created, so using (entlast) how would I pick any point within this polyline without user input?
(getpoint) will not work for me.
Title: Re: Auto pick a point within last created closed polyline
Post by: alanjt on December 08, 2010, 11:27:31 AM
It's a hack way, but I've used this method before (object must be VLA-OBJECT)...

Code: [Select]
(defun PointInsideCurve (curve)
  ;; Alan J. Thompson, 12.08.10
  (if
    (and (not (vl-catch-all-error-p (vl-catch-all-apply 'vlax-curve-getEndParam (list curve))))
         (vlax-curve-isClosed curve)
    )
     ((lambda (area / pt)
        (foreach obj (mapcar '(lambda (o) (car (vlax-invoke curve 'Offset o))) '(0.0001 -0.0001))
          (and (< (vla-get-area obj) area) (setq pt (vlax-curve-getStartPoint obj)))
          (vla-delete obj)
        )
        pt
      )
       (vla-get-area curve)
     )
  )
)
Title: Re: Auto pick a point within last created closed polyline
Post by: GDF on December 08, 2010, 11:48:08 AM
Thanks Alan

Now how would I use this to select the last created polyline?
(PointInsideCurve...?
Title: Re: Auto pick a point within last created closed polyline
Post by: alanjt on December 08, 2010, 11:54:04 AM
Code: [Select]
(PointInsideCurve (vlax-ename->vla-object (entlast)))
Title: Re: Auto pick a point within last created closed polyline
Post by: GDF on December 08, 2010, 12:00:22 PM
You da man. Thank you.

I am using this to create a polyline tray outine within a ceiling plan using the draw rectangle routine to pick part of the floor plans existing walls. I wanted the least user input as possible.

Thank you again.

Code: [Select]
(defun C:BXX (/ foo _dist p1 p2 p3 ang insrec pnt)
  (prompt "\n* Draw Ceiling Pan *")
  ;;(ARCH:F_S-VAR)
  ;;(ARCH:LYR "A-CLNG-HIDE")
  ;; Draw rectangle based on 2 or 3 picked points
  ;; Alan J. Thompson, 07.26.10
  (defun foo (l)
    (setq foo2
    (entmake
      (append '((0 . "LWPOLYLINE") (100 . "AcDbEntity") (100 . "AcDbPolyline")(90 . 4)(70 . 1))
              (mapcar (function (lambda (p) (cons 10 (reverse (cdr (reverse (trans p 1 0))))))) l)
      )
    )
  ))
  (defun _dist (a b) (distance (list (car a) (cadr a)) (list (car b) (cadr b))))
  (if (and (setq p1 (getpoint "\n* Specify first point: "))
           (setq p2 (getpoint p1 "\n* Specify second point: "))
           (not (grdraw p1 p2 3 1))
      )
    (if (setq p3 (initget 0 "Left Right")
              p3 (getpoint p2 "\n* Specify third point: ")
        )
      (cond ((vl-consp p3) (foo (list p1 p2 p3 (polar p3 (angle p2 p1) (_dist p1 p2)))))
            ((eq (type p3) 'STR)
             (cond
               ((eq p3 "Left") (setq ang (+ (/ pi 2.) (angle p1 p2))))
               ((eq p3 "Right") (setq ang (+ (* pi 1.5) (angle p1 p2))))
             )
             (foo (list p1 p2 (polar p2 ang (_dist p1 p2)) (polar p1 ang (_dist p1 p2))))
            )
      )
    )
  )
  (setq insrec (entlast))  
  (setq pnt (PointInsideCurve (vlax-ename->vla-object (entlast))))  
  (command "offset" "18" insrec pnt "")  
  (redraw)
  (entdel insrec)
  ;;(ARCH:F_R-VAR)
  (princ)
)
Title: Re: Auto pick a point within last created closed polyline
Post by: LE3 on December 08, 2010, 12:03:41 PM
just did a quick test - and on the attached image pline sample it does not work, and also it leaves some of the auxiliar plines leftovers - :-(

sorry, i said to myself, myself don't get into lisp again, and myself goes and doit again.... slap on my face to myself....
Title: Re: Auto pick a point within last created closed polyline
Post by: alanjt on December 08, 2010, 12:08:35 PM
You da man. Thank you.

I am using this to create a polyline tray outine within a ceiling plan using the draw rectangle routine to pick part of the floor plans existing walls. I wanted the least user input as possible.

Thank you again.


LoL, if I had realized you were needing the point for offsetting purposes, I would have just modified accordingly. The hack method actually offsets the curve to get area for comparison. Off to lunch, but I'll scratch out something for you when I get back.

just did a quick test - and on the attached image pline sample it does not work, and also it leaves some of the auxiliar plines leftovers - :-(

sorry, i said to myself, myself don't get into lisp again, and myself goes and doit again.... slap on my face to myself....
Yeah, I knew it wouldn't be 100% - that's the trouble with hack ways.
Title: Re: Auto pick a point within last created closed polyline
Post by: alanjt on December 08, 2010, 04:37:48 PM
Finally finished what I was working on. Give this a try, Gary...

(I took my original BX code and just changed the functionality of the foo subroutine.)
Code: [Select]
(defun c:BXX (/ foo _dist p1 p2 p3 ang)
  ;; Alan J. Thompson, 12.08.10

  (vl-load-com)

  (defun foo (l / e)
    ((lambda (area)
       (vl-some
         (function (lambda (o / off)
                     (if (> area (vla-get-area (setq off (car (vlax-invoke e 'Offset o)))))
                       (not (vla-delete e))
                       (vla-delete off)
                     )
                   )
         )
         '(-18. 18.)
       )
     )
      (vla-get-area
        (setq e
               (vlax-ename->vla-object
                 (entmakex
                   (append
                     '((0 . "LWPOLYLINE") (100 . "AcDbEntity") (100 . "AcDbPolyline") (90 . 4) (70 . 129))
                     (mapcar (function (lambda (p) (cons 10 (reverse (cdr (reverse (trans p 1 0))))))) l)
                   )
                 )
               )
        )
      )
    )
  )

  (defun _dist (a b) (distance (list (car a) (cadr a)) (list (car b) (cadr b))))

  (if (and (setq p1 (getpoint "\nSpecify first point: "))
           (setq p2 (getpoint p1 "\nSpecify second point: "))
           (not (grdraw p1 p2 3 1))
      )
    (if (setq p3 (initget 0 "Left Right")
              p3 (getpoint p2 "\nSpecify third point or Square box or [Left/Right]: ")
        )
      (cond ((vl-consp p3) (foo (list p1 p2 p3 (polar p3 (angle p2 p1) (_dist p1 p2)))))
            ((eq (type p3) 'STR)
             (cond
               ((eq p3 "Left") (setq ang (+ (/ pi 2.) (angle p1 p2))))
               ((eq p3 "Right") (setq ang (+ (* pi 1.5) (angle p1 p2))))
             )
             (foo (list p1 p2 (polar p2 ang (_dist p1 p2)) (polar p1 ang (_dist p1 p2))))
            )
      )
    )
  )
  (redraw)
  (princ)
)

Edited to reverse offset value list (more times that not, the negative offset will be the one - no reason to offset the other if you don't have to.
Title: Re: Auto pick a point within last created closed polyline
Post by: GDF on December 08, 2010, 06:30:58 PM
Thanks Alan

Works perfectly.

Changed (70 . 129) to (70 . 1) so the the dashed line type that I use shows up correctly.
Title: Re: Auto pick a point within last created closed polyline
Post by: alanjt on December 08, 2010, 06:50:03 PM
Good deal. Enjoy.