Page 2 of 2 FirstFirst 12
Results 11 to 16 of 16

Thread: Automatically dimension all sides and angles of selected polylines/polygons

  1. #11
    I could stop if I wanted to
    Join Date
    2011-09
    Posts
    308
    Login to Give a bone
    0

    Default Re: Automatically dimension all sides and angles of selected polylines/polygons

    OK, well, I've been beating my head against this for a long time.

    I have the routine doing what I want but I'm not proud of how I did it. It's clunky, Inelegant and amateurish.

    I have added the following line of code to it at the end:

    Code:
    (command "_.-dimstyle" "A" "ALL" "")
    So at the end it just selects all dimensions in the drawing and applys the current dimstyle to them. Very poor form, I realize.

    What I'd really like to do is apply the current dimstyle to only the angular dims created during the current execution of the lisp routine.

    What I'd really really like to do is get the routine to make the angular dims with arrowheads (the way they are defined in the standard dimstyle) to begin with.

    As always, any help at all is greatly appreciated.

  2. #12
    I could stop if I wanted to
    Join Date
    2011-09
    Posts
    308
    Login to Give a bone
    0

    Default Re: Automatically dimension all sides and angles of selected polylines/polygons

    OK, well I went back to an old routine I had and now its working... better. Still inelegant if you ask me as I still have to modify the dimensions after they are created. But at least it's only dealing with the dimensions that were created during the execution of the routine and not all dimensions in the drawing.

    I'd still rather the angular dimensions were created with arrows to begin with as defined in our standard dimstyle.

    Any help, as always, is appreciated.

    New code in red:

    Code:
    (defun c:dimpolygons ( / *error* mr_IsPointInside mid adoc spc sel d i lw enx pl lwn enxn plni plno plnom plm clr lastent ss en)
    
      (vl-load-com)
    
      (defun *error* ( m )
        (vla-endundomark adoc)
        (if m
          (prompt m)
        )
        (princ)
      )
    (setq lastEnt (entlast))
    (setq clr (getvar "CLAYER"))
    (command "-layer" "Make" "0-Dims" "color" "3" "" "")
    
      (defun mr_IsPointInside ( pt ptlst / trianglst ptinsidetriangle-p trl )
    
        (defun trianglst ( ptlst / unique LM:ListClockwise-p clockwise-p l p1 p2 p3 trl )
    
          (defun unique ( l )
            (if l (cons (car l) (unique (vl-remove-if (function (lambda ( x ) (equal x (car l) 1e-6))) l))))
          )
    
          ;; List Clockwise-p - Lee Mac
          ;; Returns T if the point list is clockwise oriented
    
          (defun LM:ListClockwise-p ( lst )
            (minusp
              (apply '+
                (mapcar
                  (function
                    (lambda ( a b )
                      (- (* (car b) (cadr a)) (* (car a) (cadr b)))
                    )
                  )
                  lst (cons (last lst) lst)
                )
              )
            )
          )
    
          (defun clockwise-p ( p1 p2 p3 )
            (< (* (- (car  p2) (car  p1)) (- (cadr p3) (cadr p1)))
               (* (- (cadr p2) (cadr p1)) (- (car  p3) (car  p1)))
            )
          )
    
          (setq l ptlst)
          (while (> (length ptlst) 3)
            (setq p1 (car ptlst) p2 (cadr ptlst) p3 (caddr ptlst))
            (cond
              ( (LM:ListClockwise-p ptlst)
                (if
                  (and
                    (clockwise-p p1 p2 p3)
                    (= (length (unique (vl-remove nil (mapcar (function (lambda ( a b ) (inters p1 p2 a b))) l (cdr (reverse (cons (car l) (reverse l)))))))) 2)
                    (= (length (unique (vl-remove nil (mapcar (function (lambda ( a b ) (inters p2 p3 a b))) l (cdr (reverse (cons (car l) (reverse l)))))))) 2)
                    (= (length (unique (vl-remove nil (mapcar (function (lambda ( a b ) (inters p3 p1 a b))) l (cdr (reverse (cons (car l) (reverse l)))))))) 2)
                  )
                  (progn
                    (setq trl (cons (list p1 p2 p3) trl))
                    (setq ptlst (vl-remove p2 ptlst))
                    (setq ptlst (cdr (reverse (cons (car ptlst) (reverse ptlst)))))
                  )
                  (setq ptlst (cdr (reverse (cons (car ptlst) (reverse ptlst)))))
                )
              )
              ( (not (LM:ListClockwise-p ptlst))
                (if
                  (and
                    (not (clockwise-p p1 p2 p3))
                    (= (length (unique (vl-remove nil (mapcar (function (lambda ( a b ) (inters p1 p2 a b))) l (cdr (reverse (cons (car l) (reverse l)))))))) 2)
                    (= (length (unique (vl-remove nil (mapcar (function (lambda ( a b ) (inters p2 p3 a b))) l (cdr (reverse (cons (car l) (reverse l)))))))) 2)
                    (= (length (unique (vl-remove nil (mapcar (function (lambda ( a b ) (inters p3 p1 a b))) l (cdr (reverse (cons (car l) (reverse l)))))))) 2)
                  )
                  (progn
                    (setq trl (cons (list p1 p2 p3) trl))
                    (setq ptlst (vl-remove p2 ptlst))
                    (setq ptlst (cdr (reverse (cons (car ptlst) (reverse ptlst)))))
                  )
                  (setq ptlst (cdr (reverse (cons (car ptlst) (reverse ptlst)))))
                )
              )
            )
          )
          (setq trl (cons (list (car ptlst) (cadr ptlst) (caddr ptlst)) trl))
          trl
        )
    
        (defun ptinsidetriangle-p ( pt p1 p2 p3 )
          (and
            (not
              (or
                (inters pt p1 p2 p3)
                (inters pt p2 p1 p3)
                (inters pt p3 p1 p2)
              )
            )
            (not
              (or
                (> (+ (distance pt p1) (distance pt p2)) (+ (distance p3 p1) (distance p3 p2)))
                (> (+ (distance pt p2) (distance pt p3)) (+ (distance p1 p2) (distance p1 p3)))
                (> (+ (distance pt p3) (distance pt p1)) (+ (distance p2 p3) (distance p2 p1)))
              )
            )
          )
        )
    
        (setq trl (trianglst ptlst))
        (vl-some (function (lambda ( x ) (ptinsidetriangle-p pt (car x) (cadr x) (caddr x)))) trl)
      )
    
      (defun mid ( p1 p2 )
        (mapcar (function (lambda ( a b ) (/ (+ a b) 2.0))) p1 p2)
      )
    
      (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
      (setq spc (vla-get-block (vla-get-activelayout adoc)))
      (if (not (tblsearch "DIMSTYLE" "MVVA Standard Imperial"))
        (Alert "MVVA Standard Imperial dimension style not loaded")
        (Command "-dimstyle" "r" "MVVA Standard Imperial")
      )
      (prompt "\nSelect closed POLYGONS...")
      (setq sel (ssget (list '(0 . "LWPOLYLINE") '(-4 . "&=") '(70 . 1) '(-4 . "<not") '(-4 . "<>") '(42 . 0.0) '(-4 . "not>"))))
      (initget 7)
      (setq d (getdist "\nPick or specify offset distance for dimensioning : "))
      (if sel
        (progn
          (repeat (setq i (sslength sel))
            (setq lw (ssname sel (setq i (1- i))))
            (setq enx (entget lw))
            (setq pl (mapcar (function (lambda ( x ) (trans (list (car x) (cadr x) (cdr (assoc 38 enx))) lw 1))) (mapcar (function cdr) (vl-remove-if (function (lambda ( x ) (/= (car x) 10))) enx))))
            (vla-offset (vlax-ename->vla-object lw) d)
            (setq lwn (entlast))
            (setq enxn (entget lwn))
            (setq plni (mapcar (function (lambda ( x ) (trans (list (car x) (cadr x) (cdr (assoc 38 enxn))) lwn 1))) (mapcar (function cdr) (vl-remove-if (function (lambda ( x ) (/= (car x) 10))) enxn))))
            (if (not (mr_IsPointInside (car plni) pl))
              (progn
                (entdel lwn)
                (vla-offset (vlax-ename->vla-object lw) (- d))
                (setq lwn (entlast))
                (setq enxn (entget lwn))
                (setq plni (mapcar (function (lambda ( x ) (trans (list (car x) (cadr x) (cdr (assoc 38 enxn))) lwn 1))) (mapcar (function cdr) (vl-remove-if (function (lambda ( x ) (/= (car x) 10))) enxn))))
              )
            )
            (entdel lwn)
            (setq plno (mapcar (function (lambda ( a b ) (mapcar (function +) a (mapcar (function -) a b)))) pl plni))
            (setq plnom (mapcar (function (lambda ( a b ) (mid a b))) plno (cdr (reverse (cons (car plno) (reverse plno))))))
            (mapcar (function (lambda ( a b c ) (vla-addDimAligned spc (vlax-3d-point a) (vlax-3d-point b) (vlax-3d-point c)))) pl (cdr (reverse (cons (car pl) (reverse pl)))) plnom)	
    	(setq pl (reverse (cons (car pl) (reverse pl))))
            (setq plm (mapcar (function (lambda ( a b ) (mid a b))) pl (cdr pl)))
            (mapcar (function (lambda ( a b c d ) (vla-AddDim3PointAngular spc (vlax-3d-point a) (vlax-3d-point b) (vlax-3d-point c) (vlax-3d-point d)))) (cdr pl) plm (cdr (reverse (cons (car plm) (reverse plm)))) 	
    	(cdr (reverse (cons (car plni) (reverse plni)))))
          )
        )
        (prompt "\nEmpty sel. set... Retry routine with valid sel. set...")
      )
    
    (setq ss (ssadd))
      (if (setq en (entnext LastEnt)) ;Check if there's a new entity created since the last one
        (while en ;Step through all new entities
          (ssadd en ss) ;Add it to the selection set
          (setq en (entnext en)) ;Get the next entity
        )
      )
    
      (command "_.-dimstyle" "Apply" ss "")
      (*error* nil)
      (setvar "CLAYER" clr)
    )

  3. #13
    I could stop if I wanted to
    Join Date
    2011-09
    Posts
    308
    Login to Give a bone
    0

    Post Re: Automatically dimension all sides and angles of selected polylines/polygons

    Just to clarify,

    I'm not calling Marko Ribars original code inelegant, it is in fact terrific.

    It's my own ham-fisted additions to his code that I'm calling inelegant.

    Thanks again Marko

  4. #14
    Woo! Hoo! my 1st post
    Join Date
    2010-05
    Posts
    1
    Login to Give a bone
    0

    Default Re: Automatically dimension all sides and angles of selected polylines/polygons

    Hi, would it be possible that you could modify the program so that it also encloses arcs or semicircles?
    From already thank you very much.

    Code:
    (defun c:dimpolygons ( / *error* mr_IsPointInside mid adoc sel lay d ts i lw enx pl lwn enxn plni plno plnom plm )
    
      (vl-load-com)
    
      (defun *error* ( m )
        (if lay
          (setvar 'clayer lay)
        )
        (vla-endundomark adoc)
        (if m
          (prompt m)
        )
        (princ)
      )
    
      (defun mr_IsPointInside ( pt ptlst / trianglst ptinsidetriangle-p trl )
    
        (defun trianglst ( ptlst / unique LM:ListClockwise-p clockwise-p l p1 p2 p3 trl )
    
          (defun unique ( l )
            (if l (cons (car l) (unique (vl-remove-if (function (lambda ( x ) (equal x (car l) 1e-6))) l))))
          )
    
          ;; List Clockwise-p - Lee Mac
          ;; Returns T if the point list is clockwise oriented
    
          (defun LM:ListClockwise-p ( lst )
            (minusp
              (apply '+
                (mapcar
                  (function
                    (lambda ( a b )
                      (- (* (car b) (cadr a)) (* (car a) (cadr b)))
                    )
                  )
                  lst (cons (last lst) lst)
                )
              )
            )
          )
    
          (defun clockwise-p ( p1 p2 p3 )
            (< (* (- (car  p2) (car  p1)) (- (cadr p3) (cadr p1)))
               (* (- (cadr p2) (cadr p1)) (- (car  p3) (car  p1)))
            )
          )
    
          (setq l ptlst)
          (while (> (length ptlst) 3)
            (setq p1 (car ptlst) p2 (cadr ptlst) p3 (caddr ptlst))
            (cond
              ( (LM:ListClockwise-p ptlst)
                (if
                  (and
                    (clockwise-p p1 p2 p3)
                    (= (length (unique (vl-remove nil (mapcar (function (lambda ( a b ) (inters p1 p2 a b))) l (cdr (reverse (cons (car l) (reverse l)))))))) 2)
                    (= (length (unique (vl-remove nil (mapcar (function (lambda ( a b ) (inters p2 p3 a b))) l (cdr (reverse (cons (car l) (reverse l)))))))) 2)
                    (= (length (unique (vl-remove nil (mapcar (function (lambda ( a b ) (inters p3 p1 a b))) l (cdr (reverse (cons (car l) (reverse l)))))))) 2)
                  )
                  (progn
                    (setq trl (cons (list p1 p2 p3) trl))
                    (setq ptlst (vl-remove p2 ptlst))
                    (setq ptlst (cdr (reverse (cons (car ptlst) (reverse ptlst)))))
                  )
                  (setq ptlst (cdr (reverse (cons (car ptlst) (reverse ptlst)))))
                )
              )
              ( (not (LM:ListClockwise-p ptlst))
                (if
                  (and
                    (not (clockwise-p p1 p2 p3))
                    (= (length (unique (vl-remove nil (mapcar (function (lambda ( a b ) (inters p1 p2 a b))) l (cdr (reverse (cons (car l) (reverse l)))))))) 2)
                    (= (length (unique (vl-remove nil (mapcar (function (lambda ( a b ) (inters p2 p3 a b))) l (cdr (reverse (cons (car l) (reverse l)))))))) 2)
                    (= (length (unique (vl-remove nil (mapcar (function (lambda ( a b ) (inters p3 p1 a b))) l (cdr (reverse (cons (car l) (reverse l)))))))) 2)
                  )
                  (progn
                    (setq trl (cons (list p1 p2 p3) trl))
                    (setq ptlst (vl-remove p2 ptlst))
                    (setq ptlst (cdr (reverse (cons (car ptlst) (reverse ptlst)))))
                  )
                  (setq ptlst (cdr (reverse (cons (car ptlst) (reverse ptlst)))))
                )
              )
            )
          )
          (setq trl (cons (list (car ptlst) (cadr ptlst) (caddr ptlst)) trl))
          trl
        )
    
        (defun ptinsidetriangle-p ( pt p1 p2 p3 )
          (and
            (not
              (or
                (inters pt p1 p2 p3)
                (inters pt p2 p1 p3)
                (inters pt p3 p1 p2)
              )
            )
            (not
              (or
                (> (+ (distance pt p1) (distance pt p2)) (+ (distance p3 p1) (distance p3 p2)))
                (> (+ (distance pt p2) (distance pt p3)) (+ (distance p1 p2) (distance p1 p3)))
                (> (+ (distance pt p3) (distance pt p1)) (+ (distance p2 p3) (distance p2 p1)))
              )
            )
          )
        )
    
        (setq trl (trianglst ptlst))
        (vl-some (function (lambda ( x ) (ptinsidetriangle-p pt (car x) (cadr x) (caddr x)))) trl)
      )
    
      (defun mid ( p1 p2 )
        (mapcar (function (lambda ( a b ) (/ (+ a b) 2.0))) p1 p2)
      )
    
      (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
      (prompt "\nSelect closed POLYGONS...")
      (setq sel (ssget (list '(0 . "LWPOLYLINE") '(-4 . "&=") '(70 . 1) '(-4 . "<not") '(-4 . "<>") '(42 . 0.0) '(-4 . "not>"))))
      (setq lay (getvar 'clayer))
      (initget 7)
      (setq d (getdist "\nPick or specify offset distance for dimensioning : "))
      (setq ts (/ d 2.0))
      (setvar 'dimtxsty "Standard")
      (setvar 'dimjust 0)
      (setvar 'dimtad 0)
      (setvar 'dimtih 0)
      (setvar 'dimupt 0)
      (setvar 'dimtix 1)
      (setvar 'dimtofl 1)
      (setvar 'dimaunit 1)
      (setvar 'dimlunit 2)
      (setvar 'dimadec 1)
      (setvar 'dimdec 2)
      (setvar 'dimasz (/ ts 2.0))
      (vla-put-height (vlax-ename->vla-object (tblobjname "STYLE" "Standard")) ts)
      (if sel
        (progn
          (repeat (setq i (sslength sel))
            (setq lw (ssname sel (setq i (1- i))))
            (setq enx (entget lw))
            (setq pl (mapcar (function (lambda ( x ) (trans (list (car x) (cadr x) (cdr (assoc 38 enx))) lw 1))) (mapcar (function cdr) (vl-remove-if (function (lambda ( x ) (/= (car x) 10))) enx))))
            (vla-offset (vlax-ename->vla-object lw) d)
            (setq lwn (entlast))
            (setq enxn (entget lwn))
            (setq plni (mapcar (function (lambda ( x ) (trans (list (car x) (cadr x) (cdr (assoc 38 enxn))) lwn 1))) (mapcar (function cdr) (vl-remove-if (function (lambda ( x ) (/= (car x) 10))) enxn))))
            (if (not (mr_IsPointInside (car plni) pl))
              (progn
                (entdel lwn)
                (vla-offset (vlax-ename->vla-object lw) (- d))
                (setq lwn (entlast))
                (setq enxn (entget lwn))
                (setq plni (mapcar (function (lambda ( x ) (trans (list (car x) (cadr x) (cdr (assoc 38 enxn))) lwn 1))) (mapcar (function cdr) (vl-remove-if (function (lambda ( x ) (/= (car x) 10))) enxn))))
              )
            )
            (entdel lwn)
            (setq plno (mapcar (function (lambda ( a b ) (mapcar (function +) a (mapcar (function -) a b)))) pl plni))
            (setq plnom (mapcar (function (lambda ( a b ) (mid a b))) plno (cdr (reverse (cons (car plno) (reverse plno))))))
            (if (not (tblsearch "LAYER" "DIMALIGNED"))
              (command "_.-LAYER" "_M" "DIMALIGNED" "")
              (progn
                (command "_.-LAYER" "_T" "DIMALIGNED" "")
                (setvar 'clayer "DIMALIGNED")
              )
            )
            (mapcar (function (lambda ( a b c ) (command "_.DIMALIGNED" "_non" a "_non" b "_non" c))) pl (cdr (reverse (cons (car pl) (reverse pl)))) plnom)
            (if (not (tblsearch "LAYER" "DIMANGULAR"))
              (command "_.-LAYER" "_M" "DIMANGULAR" "")
              (setvar 'clayer "DIMANGULAR")
            )
            (command "_.-LAYER" "_F" "DIMALIGNED" "")
            (setq pl (reverse (cons (car pl) (reverse pl))))
            (setq plm (mapcar (function (lambda ( a b ) (mid a b))) pl (cdr pl)))
            (mapcar (function (lambda ( a b c d ) (command "_.DIMANGULAR" "" "_non" a "_non" b "_non" c "_non" d))) (cdr pl) plm (cdr (reverse (cons (car plm) (reverse plm)))) (cdr (reverse (cons (car plni) (reverse plni)))))
          )
          (command "_.-LAYER" "_T" "DIMALIGNED" "")
        )
        (prompt "\nEmpty sel. set... Retry routine with valid sel. set...")
      )
      (*error* nil)
    )

  5. #15
    Woo! Hoo! my 1st post
    Join Date
    2018-06
    Posts
    1
    Login to Give a bone
    0

    Default Re: Automatically dimension all sides and angles of selected polylines/polygons

    I need a lisp to dimension angles,arcs end lines of a polygonal, but no extensions and dimension line. just numbers.
    Thnaks

  6. #16
    I could stop if I wanted to
    Join Date
    2011-09
    Posts
    308
    Login to Give a bone
    0

    Default Re: Automatically dimension all sides and angles of selected polylines/polygons

    Quote Originally Posted by marcosjocol View Post
    I need a lisp to dimension angles,arcs end lines of a polygonal, but no extensions and dimension line. just numbers.
    Thnaks
    Well, that's a bit beyond me I'm afraid.

    The LISP just uses the current dimstyle.

    You try making a dimstyle with no extensions, ticks or dimension lines (if possible).

    Hope that helps.

Page 2 of 2 FirstFirst 12

Similar Threads

  1. Replies: 0
    Last Post: 2016-11-21, 05:02 AM
  2. add areas of multiple selected polygons
    By Darren Allen in forum AutoLISP
    Replies: 3
    Last Post: 2014-09-26, 03:48 PM
  3. Convert Polylines to AEC Polygons
    By medwards.119413 in forum ACA Wish List
    Replies: 2
    Last Post: 2008-12-14, 11:48 PM
  4. Getting polylines or polygons out of mulitple arcs
    By Ernie.Salazar in forum AutoCAD Map 3D - General
    Replies: 3
    Last Post: 2004-08-13, 04:05 PM

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •