2dpline to 3dpline routine.

Discussion in 'AutoCAD' started by alex, Apr 6, 2004.

  1. alex

    alex Guest

    (i could not send an attachment so am pasting it)


    ; pav.lsp pline add vertices with elevations by alex konieczka with great
    help from Rakesh Rao, and Michael Puckett and rodny estep.


    (defun c:pav ()
    (setq vlist nil plist nil dy 0 cnt 0)

    (setq el1 (getreal "Enter starting elev: "))
    (print "Select pline: ")(gent)
    (if (= (ass 0) "LWPOLYLINE") (progn (setq ename (ass -1)))(progn (print
    "Must be a pline.")(quit)))

    (command "area" "ob" ename)
    (setq l (getvar "perimeter") slen 5.0)
    (setq divs (fix (/ l slen)))
    (initget 0 "1 2")
    (setq dr1 (getkword "\nEnter Choice: 1. Elev 2. Slope "))
    (if (= dr1 "1")
    (progn (setq el2 (getreal "Enter ending elev: ") slope (/ (- el2 el1) l)
    el2 (+ el1 (* slope l)) dy (/ (- el2 el1) (/ l slen)) ) )
    (progn (setq slope (/ (getreal "Enter slope% (e.g. 2 = 0.02:") 100.0) el2
    (+ el1 (* slope l)) dy (/ (- el2 el1) (/ l slen)) ))
    )
    (PL_DividedPoints ename divs)

    (foreach n vlist (progn
    (setq pt (nth cnt vlist) pt (list (car pt) (cadr pt) (+ el1 (* cnt dy)) ))
    (setq plist (append (list pt) plist))
    (setq cnt (1+ cnt)) ))

    (Make3DPoly plist)


    (princ))

    ;/////////




    ; make poly function

    (defun Make3DPoly ( pointlist / lastent )

    (setq lastent (entlast))

    (foreach definition

    (append

    '((
    (0 . "POLYLINE")
    (100 . "AcDbEntity")
    (100 . "AcDb3dPolyline")
    (66 . 1)
    (10 0.0 0.0 0.0)
    (70 . 8)
    (40 . 0.0)
    (41 . 0.0)
    (210 0.0 0.0 1.0)
    (71 . 0)
    (72 . 0)
    (73 . 0)
    (74 . 0)
    (75 . 0)
    ))

    (mapcar
    '(lambda (point)
    (append
    '( (0 . "VERTEX")
    (100 . "AcDbEntity")
    (100 . "AcDbVertex")
    (100 . "AcDb3dPolylineVertex")
    )
    (list (cons 10 point))
    '( (40 . 0.0)
    (41 . 0.0)
    (42 . 0.0)
    (70 . 32)
    (50 . 0.0)
    (71 . 0)
    (72 . 0)
    (73 . 0)
    (74 . 0)
    )
    )
    )
    PointList
    )

    '((
    (0 . "SEQEND")
    (100 . "AcDbEntity")

    ))

    )

    (entmake definition)

    )

    (not (eq (entlast) lastent))

    )


    ; subs

    ;; !
    ***************************************************************************
    ;; ! LI_item
    ;; !
    ***************************************************************************
    ;; ! Function : Returns the first occurence of a DXF dotted pair from a list
    ;; ! Argument : 'n' - The DXF code to check
    ;; ! 'alist' - The List to check
    ;; ! Returns : The value of the DXF dotted pair, if it exists else returns
    nil
    ;; ! Update : December 26, 1998

    (defun LI_item (n alist)
    (cdr (assoc n alist))
    )

    ;; !
    ****************************************************************************
    ;; ! PL_DividedPoints
    ;; !
    ****************************************************************************
    ;; ! Function : Returns the points obtained by dividing the given polyline
    ;; ! (either in 'entity' form or list form )
    ;; ! Arguments:
    ;; ! 'ename' - Polyline Object name or list [ overloaded ]
    ;; ! 'NumSegs' - Number of segments to divide the polyline into
    ;; ! 'prevPt' - The previous point digitized
    ;; ! Updated : April 26, 1999
    ;; ! Copyright: (C) 2000, Four Dimension Technologies, Singapore
    ;; ! Contact : for help/support/info

    ;(defun PL_DividedPoints ( ename NumSegs / vlist ss p1 p2 OS )
    (defun PL_DividedPoints ( ename NumSegs )
    (setq OS (getvar "OSMODE"))
    (setvar "OSMODE" 0)

    (if (= (type ename) 'ENAME)
    (progn
    (command "._Divide" ename NumSegs)
    (setq
    vlist (PL_plist ename)
    p1 (car vlist)
    p2 (last vlist)
    ss (ssget "P")

    )
    )
    (progn
    (setq
    vlist ename
    p1 (car vlist)
    p2 (last vlist)
    ename (PL_mk_pl vlist 8 0.0)
    )
    (command "._Divide" ename NumSegs)
    (setq ss (ssget "P"))
    (entdel ename)
    ))

    (if ss
    (progn
    (setq
    vlist (cons p1 (SS_SS2Pt ss))
    vlist (append vlist (list p2))
    )
    (command "._Erase" ss "")
    )
    (setq vlist nil)
    )
    (setvar "OSMODE" OS)
    vlist
    )


    ;; !
    ****************************************************************************
    ;; ! PL_plist
    ;; !
    ****************************************************************************
    ;; ! Function : Return list of points from an LWPOLYLINE or POLYLINE
    ;; ! Arguments:
    ;; ! 'ename' - The entity name of the polyline, line, 3dface or
    ;; ! spline. In case of a SPLINE, the fit points are
    ;; ! returned.
    ;; ! Action : Returns a list of all fit points of the polyline
    ;; ! Does not return the control points of splione polylines
    ;; ! or SPLINE objects.
    ;; ! Returns : List of all points (3D format)
    ;; ! Updated : Septemer 22, 1998
    ;; ! Copyright: (C) 2000, Four Dimension Technologies, Singapore
    ;; ! Contact : for help/support/info

    (defun PL_plist ( ename / en entl flag vlist pt Elev )
    (setq
    vlist '()
    entl (entget ename)
    en (LI_item 0 entl)
    )
    (cond
    ((= en "LWPOLYLINE")
    (setq
    vlist '()
    Elev (LI_item 38 entl)
    )
    (foreach pt entl
    (if (= (car pt) 10)
    (setq vlist (cons (list (cadr pt) (caddr pt) Elev) vlist))
    )
    )
    )
    ((= en "SPLINE")
    (setq vlist (LI_mitem 11 entl))
    )
    ((= en "POLYLINE")
    (setq
    ename (entnext ename)
    entl (entget ename)
    en (LI_item 0 entl)
    vlist '()
    )
    (while (= en "VERTEX")
    (setq flag (LI_item 70 entl))
    (if (and
    (zerop (logand flag 1))
    (zerop (logand flag 2))
    (zerop (logand flag 8))
    (/= flag 128)
    )
    (setq
    pt (LI_item 10 entl)
    vlist (cons pt vlist)
    )
    )
    (setq
    ename (entnext ename)
    entl (entget ename)
    en (LI_item 0 entl)
    )
    )
    )
    ((= en "LINE")
    (setq vlist (list (LI_item 10 entl) (LI_item 11 entl)))
    )
    ((= en "3DFACE")
    (setq vlist (list
    (LI_item 10 entl) (LI_item 11 entl)
    (LI_item 12 entl) (LI_item 13 entl)
    )
    )
    )
    )
    (if vlist (reverse vlist) nil)
    )


    ;; !
    ****************************************************************************
    *
    ;; ! SS_ss2pt
    ;; !
    ****************************************************************************
    *
    ;; ! Function : Convert Selection Set of points to Points List
    ;; ! Arguments: 'ss' - Selection Set to process
    ;; ! Return : A List of all DXF Code 10 values from the selection set
    entities
    ;; ! Updated : December 30, 1998
    ;; ! Copyright: (C) 2000, Four Dimension Technologies, Singapore
    ;; ! Contact : for help/support/info

    (defun SS_ss2pt ( ss / ssl cnt ename entl pt Lst )
    (setq Lst '())
    (if ss
    (progn
    (setq
    ssl (sslength ss)
    cnt 0
    )
    (repeat ssl
    (setq
    ename (ssname ss cnt)
    entl (entget ename)
    pt (LI_item 10 entl)
    Lst (append Lst (list pt))
    cnt (1+ cnt)
    )
    )
    ))
    (if (> (length Lst) 0) Lst nil)
    )



    ; gent returns the entity name of the item picked
    (defun gent ()
    (setq entn (entsel))
    (setq entcodes (entget (car entn)))
    (setq entpt (cadr entn))
    (setq entt (cdr (assoc 0 entcodes)))
    )

    ; ass returns the (cdr (assoc n)) of the the item. (ass 10) => (10 . 1 2 3)
    (defun ass (code / )
    (cdr (assoc code entcodes))
    )
     
    alex, Apr 6, 2004
    #1
Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.