Author Topic: Elevation of Object x distance above a TIN ?  (Read 2477 times)

0 Members and 1 Guest are viewing this topic.

snownut2

  • Swamp Rat
  • Posts: 971
  • Bricscad 22 Ultimate
Elevation of Object x distance above a TIN ?
« on: August 11, 2013, 02:47:41 AM »
I am looking to acquire the elevation of a 2d rectangle that needs to be x distance above/below an existing TIN.

Any ideas on a quick way to calculate this elevation?

Thanks,

ribarm

  • Gator
  • Posts: 3313
  • Marko Ribar, architect
Re: Elevation of Object x distance above a TIN ?
« Reply #1 on: August 11, 2013, 06:19:27 AM »
Get bounding box of TIN, maybe like this :

Code: [Select]
(setq ext (ACET-GEOM-SS-EXTENTS-ACCURATE (ssget "_X" '((0 . "3DFACE") (8 . "TIN")))))

Get Z coordinates of TIN with :

Code: [Select]
(setq z1 (caddr (car ext)))
(setq z2 (caddr (cadr ext)))

Then get elevation of rectangle with :

Code: [Select]
(setq rec (car (entsel "\nPick rectangle")))
(setq elev (cdr (assoc 38 (entget rec))))

And then, just compare differences between elev and z1 or z2 :
(- elev z1) or (- elev z2)
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

snownut2

  • Swamp Rat
  • Posts: 971
  • Bricscad 22 Ultimate
Re: Elevation of Object x distance above a TIN ?
« Reply #2 on: August 11, 2013, 09:27:32 AM »
ribarm,

Thanks for your assistance, is there not an alternative to the "ACET-GEOM-SS-EXTENTS-ACCURATE" function, I do not have Express Tools....installed

bruce

ribarm

  • Gator
  • Posts: 3313
  • Marko Ribar, architect
Re: Elevation of Object x distance above a TIN ?
« Reply #3 on: August 11, 2013, 10:01:30 AM »
Load this :

Code: [Select]
(defun bbtin (ss / n ent minpt maxpt minptlst maxptlst minptbbx minptbby minptbbz minptbb maxptbbx maxptbby maxptbbz maxptbb)
  (vl-load-com)
  (if ss
    (progn
      (repeat (setq n (sslength ss))
        (setq ent (ssname ss (setq n (1- n))))
        (vla-getboundingbox (vlax-ename->vla-object ent) 'minpoint 'maxpoint)
        (setq minpt (vlax-safearray->list minpoint))
        (setq maxpt (vlax-safearray->list maxpoint))
        (setq minptlst (cons minpt minptlst))
        (setq maxptlst (cons maxpt maxptlst))
      )
      (setq minptbbx (caar (vl-sort minptlst '(lambda (a b) (< (car a) (car b))))))
      (setq minptbby (cadar (vl-sort minptlst '(lambda (a b) (< (cadr a) (cadr b))))))
      (setq minptbbz (caddar (vl-sort minptlst '(lambda (a b) (< (caddr a) (caddr b))))))
      (setq maxptbbx (caar (vl-sort maxptlst '(lambda (a b) (> (car a) (car b))))))
      (setq maxptbby (cadar (vl-sort maxptlst '(lambda (a b) (> (cadr a) (cadr b))))))
      (setq maxptbbz (caddar (vl-sort maxptlst '(lambda (a b) (> (caddr a) (caddr b))))))
      (setq minptbb (list minptbbx minptbby minptbbz))
      (setq maxptbb (list maxptbbx maxptbby maxptbbz))
      (list minptbb maxptbb)
    )
    (prompt "\nNo selected TIN 3DFACE objects")
  )
)

Then, use it instead of (acet-...)

Code: [Select]
(setq ext (bbtin (ssget "_X" '((0 . "3DFACE") (8 . "TIN")))))

[EDIT] : There was (princ) at the end of subfunction - now removed, it should work if you have vlisp extensions installed - function (vla-getboundingbox)
« Last Edit: August 11, 2013, 10:28:56 AM by ribarm »
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

snownut2

  • Swamp Rat
  • Posts: 971
  • Bricscad 22 Ultimate
Re: Elevation of Object x distance above a TIN ?
« Reply #4 on: August 11, 2013, 10:48:12 AM »
Marko,

Thank you your code worked fine, I don't think I explained my issue properly.  I have attached a dwg, showing a TIN and rectangle, I am looking for the distance the rectangle (z-coordinate) is away from the TIN @ the location (x,y coordinates) of the rectangle.




« Last Edit: August 11, 2013, 11:00:56 AM by snownut2 »

ribarm

  • Gator
  • Posts: 3313
  • Marko Ribar, architect
Re: Elevation of Object x distance above a TIN ?
« Reply #5 on: August 12, 2013, 02:17:20 AM »
Hey snownut2, you can check intersection point z coordinate (intersection between line parallel to z axis that passes checked point and tin 3dface triangle)... Hope it doesn't matter if I borrowed Lee's subfunctions...

Code: [Select]
;; Point inside triangle  -  MR
;; Returns T if point pt lies inside triangle
;; or returns nil if point pt lies outside triangle defined by points p1,p2,p3

(defun ptinsidetriangle-p ( pt p1 p2 p3 / LM:Coplanar-p v^v )

  (defun v^v ( u v )
    (mapcar '(lambda ( n ) (- (* (nth (car n) u) (nth (cadr n) v)) (* (nth (cadr n) u) (nth (car n) v)))) '((1 2) (2 0) (0 1)))
  )

  (defun LM:Coplanar-p ( p1 p2 p3 p4 )
    (
      (lambda ( n )
        (equal
          (last (trans p3 0 n))
          (last (trans p4 0 n))
          1e-8
        )
      )
      (v^v (mapcar '- p1 p2) (mapcar '- p1 p3))
    )
  )

  (if
    (and
      (LM:Coplanar-p pt p1 p2 p3)
      (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)))
        )
      )
    )
    T
    nil
  )
)

;|
;; InsideTriangle-p  -  Lee Mac
;; Returns T if pt lies inside the triangle formed by p1,p2,p3

(defun LM:InsideTriangle-p ( pt p1 p2 p3 )
    (
        (lambda ( a1 a2 a3 )
            (or
                (and (<= 0.0 a1) (<= 0.0 a2) (<= 0.0 a3))
                (and (<= a1 0.0) (<= a2 0.0) (<= a3 0.0))
            )
        )
        (sin (- (angle p1 pt) (angle p1 p2)))
        (sin (- (angle p2 pt) (angle p2 p3)))
        (sin (- (angle p3 pt) (angle p3 p1)))
    )
)
|;
;; Line-Plane Intersection  -  Lee Mac
;; Returns the point of intersection of a line defined by
;; points p1,p2 and a plane defined by its origin and normal

(defun LM:IntersLinePlane ( p1 p2 org nm )
    (setq org (trans org 0 nm)
          p1  (trans p1  0 nm)
          p2  (trans p2  0 nm)
    )
    (trans
        (inters p1 p2
            (list (car p1) (cadr p1) (caddr org))
            (list (car p2) (cadr p2) (caddr org))
            nil
        )
        nm 0
    )
)

(defun v^v ( u v )
  (mapcar '(lambda ( n ) (- (* (nth (car n) u) (nth (cadr n) v)) (* (nth (cadr n) u) (nth (car n) v)))) '((1 2) (2 0) (0 1)))
)

(defun c:projptontin ( / p tin i 3df p1 p2 p3 p4 pint )
  (command "_.ucs" "w")
  (setq p (getpoint "\nPick point x,y coordinate in WCS : "))
  (setq tin (ssget "_X" '((0 . "3DFACE") (8 . "TIN"))))
  (setq i -1)
  (while (setq 3df (ssname tin (setq i (1+ i))))
    (setq p1 (cdr (assoc 10 (entget 3df)))
          p2 (cdr (assoc 11 (entget 3df)))
          p3 (cdr (assoc 12 (entget 3df)))
          p4 (cdr (assoc 13 (entget 3df)))
    )
    (if (equal p1 p2 1e-6) (setq p1 p2 p2 p3 p3 p4))
    (if (ptinsidetriangle-p (list (car p) (cadr p)) (list (car p1) (cadr p1)) (list (car p2) (cadr p2)) (list (car p3) (cadr p3)))
      (progn
        (setq pint (LM:IntersLinePlane p (mapcar '+ p '(0.0 0.0 1.0)) p1 (v^v (mapcar '- p2 p1) (mapcar '- p3 p1))))
        (sssetfirst nil (ssadd 3df))
      )
    )
  )
  pint
)
« Last Edit: August 13, 2013, 08:56:45 AM by ribarm »
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

GP

  • Newt
  • Posts: 83
  • Vercelli, Italy
Re: Elevation of Object x distance above a TIN ?
« Reply #6 on: August 12, 2013, 10:20:39 AM »
My...
Code: [Select]
(defun c:test ( / L_v R 3DF tr p1 p2 p3 p4 diff)
    (if (and
            (ver_ucs)
            (princ "\nSelect Rectangle")
            (setq R (ssname (ssget  "_+.:S" '((0 . "LWPOLYLINE"))) 0))
        )
        (progn
            (setq L_v (pl_coord R))           
            (command "_zoom" "_obj" R "")
            (if
                (setq 3DF (ssget "_F" (cons (last L_v) L_v) '((0 . "3DFACE"))))
                (progn
                    (command "_zoom" "_p")
                    (repeat (setq i (length L_v))
                        (setq v (nth (setq i (1- i)) L_v))                 
                        (repeat (setq n (sslength 3DF))
                            (setq tr (ssname 3DF (setq n (1- n))))
                            (setq p1 (trans (cdr (assoc 10 (entget tr))) 0 1)
                                  p2 (trans (cdr (assoc 11 (entget tr))) 0 1)
                                  p3 (trans (cdr (assoc 12 (entget tr))) 0 1)
                                  p4 (trans (cdr (assoc 13 (entget tr))) 0 1)
                            )
                            (if (equal p1 p2 1e-6) (setq p1 p2 p2 p3 p3 p4))
                            (setq diff nil)
                            (if (LM:InsideTriangle-p v p1 p2 p3 )
                                (progn
                                    (setq diff (- (caddr v) (caddr (psp p1 p2 p3 v))))
                                    (entmake
                                        (list
                                            (cons 0 "TEXT")
                                            (cons 7 (getvar 'textstyle))
                                            (cons 10 (trans v 1 0))
                                            (cons 40 (getvar 'textsize))
                                            (cons 1 (rtos diff))
                                        )
                                    )
                                )
                            )
                        )                                   
                    )             
                )
                (progn
                    (command "_zoom" "_p")
                    (alert "\nNo selected TIN 3DFACE objects")
                )
            )
        )
    )
)

(defun ver_ucs ()           
    (if (or
            (not (equal (caddr (getvar 'ucsxdir)) 0.0 1e-8))
            (not (equal (caddr (getvar 'ucsydir)) 0.0 1e-8))
        )
        (progn
            (alert "Z-axis of the current UCS not normal to the WCS.")
            (exit)
        )
        t
    )
)

(defun pl_coord (# / p m)
    (setq p (if (vlax-curve-IsClosed #)
                (fix (vlax-curve-getEndParam #))
                (1+ (fix (vlax-curve-getEndParam #)))
            )
    )
    (while (/= 0 p)
        (setq m (cons (trans (vlax-curve-getPointAtParam # (setq p (1- p))) 0 1) m))
    )
)

;; InsideTriangle-p  -  Lee Mac
;; Returns T if pt lies inside the triangle formed by p1,p2,p3
(defun LM:InsideTriangle-p ( pt p1 p2 p3 )
    (
        (lambda ( a1 a2 a3 )
            (or
                (and (<= 0.0 a1) (<= 0.0 a2) (<= 0.0 a3))
                (and (<= a1 0.0) (<= a2 0.0) (<= a3 0.0))
            )
        )
        (sin (- (angle p1 pt) (angle p1 p2)))
        (sin (- (angle p2 pt) (angle p2 p3)))
        (sin (- (angle p3 pt) (angle p3 p1)))
    )
)

;================ punto sul piano ==================
; restituisce il punto sul piano definito dai punti
; a, b, c, sulla perpendicolare del punto p         
(defun psp (a b c p / *a *b *c)
    (setq *a
             (-
                 (* (- (cadr a) (cadr b)) (- (caddr a) (caddr c)))
                 (* (- (caddr a) (caddr b)) (- (cadr a) (cadr c)))
             )
    )
    (setq *b
             (-
                 (* (- (caddr a) (caddr b)) (- (car a) (car c)))
                 (* (- (car a) (car b)) (- (caddr a) (caddr c)))
             )
    )
    (setq *c
             (-
                 (* (- (car a) (car b)) (- (cadr a) (cadr c)))
                 (* (- (cadr a) (cadr b)) (- (car a) (car c)))
             )
    )
    (list
        (car p)
        (cadr p)
        (+
            (-
                (/
                    (+
                        (* (- (car p) (car a)) *a)
                        (* (- (cadr p) (cadr a)) *b)
                    )
                    *c
                )
            )
            (caddr a)
        )
    )   
)

 

ribarm

  • Gator
  • Posts: 3313
  • Marko Ribar, architect
Re: Elevation of Object x distance above a TIN ?
« Reply #7 on: August 12, 2013, 10:43:56 AM »
Look, you can project any closed LWPOLYLINE on TIN... If everything is properly installed this code should work :

Code - Auto/Visual Lisp: [Select]
  1. (defun l3dpl ( ss / chkduppt choice1 choice2 enent enpt enptt ent k nxtenten nxtentst osm ptlst sept septn septs ss sss stent stpt )
  2.   (setq osm (getvar 'osmode))
  3.   (setvar 'osmode 0)
  4.   (setq sss (ssadd))
  5.   (repeat (setq k (sslength ss))
  6.     (setq ent (ssname ss (setq k (1- k))))
  7.     (ssadd ent sss)
  8.   )    
  9.   (repeat (setq k (sslength ss))
  10.     (setq ent (ssname ss (setq k (1- k))))
  11.     (setq stpt (cdr (assoc 10 (entget ent))))
  12.     (setq enpt (cdr (assoc 11 (entget ent))))
  13.     (setq septs (cons stpt septs))
  14.     (setq septs (cons enpt septs))
  15.   )
  16.   (setq sept septs)
  17.  
  18.   (defun chkduppt (pt lst / chk)
  19.     (foreach ptt lst
  20.       (if (equal pt ptt 1e-6) (setq chk (cons T chk)))
  21.     )
  22.     chk
  23.   )
  24.  
  25.   (foreach pt septs
  26.     (if (eq (length (chkduppt pt septs)) 2) (setq septn (cons pt septn)))
  27.   )
  28.   (foreach pt septn
  29.     (setq sept (vl-remove pt sept))
  30.   )
  31.   (if (eq sept nil) (setq sept (acet-list-remove-duplicates septs 1e-6)))
  32.   (repeat (setq k (sslength ss))
  33.     (setq ent (ssname ss (setq k (1- k))))
  34.     (setq stpt (cdr (assoc 10 (entget ent))))
  35.     (if (equal stpt (car sept) 1e-6) (setq stent ent))
  36.   )
  37.   (if (eq stent nil)
  38.     (repeat (setq k (sslength ss))
  39.       (setq ent (ssname ss (setq k (1- k))))
  40.       (setq enpt (cdr (assoc 11 (entget ent))))
  41.       (if (equal enpt (car sept) 1e-6) (setq enent ent))
  42.     )
  43.   )
  44.   (if stent
  45.     (progn
  46.       (setq ptlst (cons (cdr (assoc 10 (entget stent))) ptlst))
  47.       (setq ptlst (cons (cdr (assoc 11 (entget stent))) ptlst))
  48.       (setq enpt (cdr (assoc 11 (entget stent))))
  49.       (ssdel stent ss)
  50.     )
  51.     (progn
  52.       (setq ptlst (cons (cdr (assoc 11 (entget enent))) ptlst))
  53.       (setq ptlst (cons (cdr (assoc 10 (entget enent))) ptlst))
  54.       (setq enpt (cdr (assoc 10 (entget enent))))
  55.       (ssdel enent ss)
  56.     )
  57.   )
  58.   (while (/= (sslength ss) 0)
  59.     (setq nxtentst nil)
  60.     (setq nxtenten nil)
  61.     (repeat (setq k (sslength ss))
  62.       (setq ent (ssname ss (setq k (1- k))))
  63.       (setq stpt (cdr (assoc 10 (entget ent))))
  64.       (if (equal enpt stpt 1e-6) (setq nxtentst ent))
  65.     )
  66.     (if nxtentst nil
  67.       (repeat (setq k (sslength ss))
  68.         (setq ent (ssname ss (setq k (1- k))))
  69.         (setq enptt (cdr (assoc 11 (entget ent))))
  70.         (if (equal enpt enptt 1e-6) (setq nxtenten ent))
  71.       )
  72.     )
  73.     (if nxtentst
  74.       (progn
  75.         (setq ptlst (cons (cdr (assoc 10 (entget nxtentst))) ptlst))
  76.         (setq ptlst (cons (cdr (assoc 11 (entget nxtentst))) ptlst))
  77.         (setq enpt (cdr (assoc 11 (entget nxtentst))))
  78.         (ssdel nxtentst ss)
  79.       )
  80.       (progn
  81.         (setq ptlst (cons (cdr (assoc 11 (entget nxtenten))) ptlst))
  82.         (setq ptlst (cons (cdr (assoc 10 (entget nxtenten))) ptlst))
  83.         (setq enpt (cdr (assoc 10 (entget nxtenten))))
  84.         (ssdel nxtenten ss)
  85.       )
  86.     )
  87.   )
  88.   (setq ptlst (acet-list-remove-duplicates ptlst 1e-6))
  89.   (entmake
  90.     (list
  91.       '(0 . "POLYLINE")
  92.       '(100 . "AcDbEntity")
  93.       '(100 . "AcDb3dPolyline")
  94.       '(66 . 1)
  95.       '(62 . 1)
  96.       '(10 0.0 0.0 0.0)
  97.       '(70 . 9)
  98.       '(210 0.0 0.0 1.0)
  99.     )
  100.   )
  101.   (foreach pt ptlst
  102.     (entmake
  103.       (list
  104.         '(0 . "VERTEX")
  105.         '(100 . "AcDbEntity")
  106.         '(100 . "AcDbVertex")
  107.         '(100 . "AcDb3dPolylineVertex")
  108.         (cons 10 pt)
  109.         '(70 . 32)
  110.       )
  111.     )
  112.   )
  113.     (list
  114.       '(0 . "SEQEND")
  115.       '(100 . "AcDbEntity")
  116.     )
  117.   )
  118.   (command "erase" sss "")
  119.   (setvar 'osmode osm)
  120.   (princ)
  121. )
  122.  
  123. ;; Point inside triangle  -  MR
  124. ;; Returns T if point pt lies inside triangle
  125. ;; or returns nil if point pt lies outside triangle defined by points p1,p2,p3
  126.  
  127. (defun ptinsidetriangle-p ( pt p1 p2 p3 / LM:Coplanar-p v^v )
  128.  
  129.   (defun v^v ( u v )
  130.     (mapcar '(lambda ( n ) (- (* (nth (car n) u) (nth (cadr n) v)) (* (nth (cadr n) u) (nth (car n) v)))) '((1 2) (2 0) (0 1)))
  131.   )
  132.  
  133.   (defun LM:Coplanar-p ( p1 p2 p3 p4 )
  134.     (
  135.       (lambda ( n )
  136.         (equal
  137.           (last (trans p3 0 n))
  138.           (last (trans p4 0 n))
  139.           1e-8
  140.         )
  141.       )
  142.       (v^v (mapcar '- p1 p2) (mapcar '- p1 p3))
  143.     )
  144.   )
  145.  
  146.   (if
  147.     (and
  148.       (LM:Coplanar-p pt p1 p2 p3)
  149.       (not
  150.         (or
  151.           (inters pt p1 p2 p3)
  152.           (inters pt p2 p1 p3)
  153.           (inters pt p3 p1 p2)
  154.         )
  155.       )
  156.       (not
  157.         (or
  158.           (> (+ (distance pt p1) (distance pt p2)) (+ (distance p3 p1) (distance p3 p2)))
  159.           (> (+ (distance pt p2) (distance pt p3)) (+ (distance p1 p2) (distance p1 p3)))
  160.           (> (+ (distance pt p3) (distance pt p1)) (+ (distance p2 p3) (distance p2 p1)))
  161.         )
  162.       )
  163.     )
  164.     T
  165.     nil
  166.   )
  167. )
  168.  
  169. ;; Line-Plane Intersection  -  Lee Mac
  170. ;; Returns the point of intersection of a line defined by
  171. ;; points p1,p2 and a plane defined by its origin and normal
  172.  
  173. (defun LM:IntersLinePlane ( p1 p2 org nm )
  174.     (setq org (trans org 0 nm)
  175.           p1  (trans p1  0 nm)
  176.           p2  (trans p2  0 nm)
  177.     )
  178.     (trans
  179.         (inters p1 p2
  180.             (list (car p1) (cadr p1) (caddr org))
  181.             (list (car p2) (cadr p2) (caddr org))
  182.             nil
  183.         )
  184.         nm 0
  185.     )
  186. )
  187.  
  188. (defun v^v ( u v )
  189.   (mapcar '(lambda ( n ) (- (* (nth (car n) u) (nth (cadr n) v)) (* (nth (cadr n) u) (nth (car n) v)))) '((1 2) (2 0) (0 1)))
  190. )
  191.  
  192. (defun ptonline ( pt p1 p2 )
  193.   (if (and (not (vl-catch-all-error-p pt)) pt (equal (distance p1 p2) (+ (distance p1 pt) (distance pt p2)) 1e-6)) T nil)
  194. )
  195.  
  196. (defun IntersLinePlane ( pl1 pl2 pp3 pp4 pp5 )
  197.   (LM:IntersLinePlane pl1 pl2 pp3 (v^v (mapcar '- pp4 pp3) (mapcar '- pp5 pp3)))
  198. )
  199.  
  200. (defun c:projplsontin ( / sspl inc pl ss plv elev plve plp1 plp2 plp3 plp4 i 3df 3dfp1 3dfp2 3dfp3 3dfp4 ptint1 ptint2 ptint3 ptint4 ptint5 s )
  201.  
  202.   (vl-cmdf "_.UCS" "w")
  203.   (or (tblsearch "LAYER" "PLPROJ")
  204.             (entmake
  205.         (list
  206.           '(0 . "LAYER")
  207.           '(100 . "AcDbSymbolTableRecord")
  208.           '(100 . "AcDbLayerTableRecord")
  209.           '(2 . "PLPROJ")
  210.           '(70 . 0)
  211.           '(62 . 10)
  212.           '(6 . "Continuous")
  213.           '(290 . 1)
  214.           '(370 . -3)
  215.         )
  216.       )
  217.   )
  218.  
  219.   (setvar "CLAYER" "PLPROJ")
  220.  
  221.   (setq sspl (ssget "_:L" '((0 . "LWPOLYLINE"))))
  222.   (setq inc -1)
  223.   (initget 7)
  224.   (setq elev (getreal "\nSpecify top elevation of projected LWPOLYLINES (must be higher than TIN) : "))
  225.   (while (setq pl (ssname sspl (setq inc (1+ inc))))
  226.     (setq plv (mapcar '(lambda ( x ) (list (car x) (cadr x) (- elev))) (mapcar 'cdr (vl-remove-if-not '(lambda ( x ) (= (car x) 10)) (entget pl)))))
  227.     (setq ss (ssget "_CP" plv '((0 . "3DFACE") (8 . "TIN"))))
  228.     (setq plve (mapcar '(lambda ( x ) (list (car x) (cadr x) elev)) plv))
  229.     (setq plv (reverse (cons (car plv) (reverse plv))) plve (reverse (cons (car plve) (reverse plve))))
  230.     (repeat (length plv)
  231.       (setq plp1 (car plv)
  232.             plp2 (cadr plv)
  233.             plp3 (cadr plve)
  234.             plp4 (car plve)
  235.       )
  236.       (setq i -1)
  237.       (while (setq 3df (ssname ss (setq i (1+ i))))
  238.         (setq 3dfp1 (cdr (assoc 10 (entget 3df)))
  239.               3dfp2 (cdr (assoc 11 (entget 3df)))
  240.               3dfp3 (cdr (assoc 12 (entget 3df)))
  241.               3dfp4 (cdr (assoc 13 (entget 3df)))
  242.         )
  243.         (if (equal 3dfp1 3dfp2 1e-6) (setq 3dfp1 3dfp2 3dfp2 3dfp3 3dfp3 3dfp4))
  244.         (setq ptint1 (vl-catch-all-apply 'IntersLinePlane (list 3dfp1 3dfp2 plp1 plp2 plp3)))
  245.         (if (not (and (ptonline ptint1 3dfp1 3dfp2) (ptonline (list (car ptint1) (cadr ptint1)) plp1 plp2))) (setq ptint1 nil))
  246.         (setq ptint2 (vl-catch-all-apply 'IntersLinePlane (list 3dfp2 3dfp3 plp1 plp2 plp3)))
  247.         (if (not (and (ptonline ptint2 3dfp2 3dfp3) (ptonline (list (car ptint2) (cadr ptint2)) plp1 plp2))) (setq ptint2 nil))
  248.         (setq ptint3 (vl-catch-all-apply 'IntersLinePlane (list 3dfp1 3dfp3 plp1 plp2 plp3)))
  249.         (if (not (and (ptonline ptint3 3dfp1 3dfp3) (ptonline (list (car ptint3) (cadr ptint3)) plp1 plp2))) (setq ptint3 nil))
  250.         (setq ptint4 (vl-catch-all-apply 'IntersLinePlane (list plp1 plp4 3dfp1 3dfp2 3dfp3)))
  251.         (if (not (and (ptonline ptint4 plp1 plp4) (ptinsidetriangle-p ptint4 3dfp1 3dfp2 3dfp3))) (setq ptint4 nil))
  252.         (setq ptint5 (vl-catch-all-apply 'IntersLinePlane (list plp2 plp3 3dfp1 3dfp2 3dfp3)))
  253.         (if (not (and (ptonline ptint5 plp2 plp3) (ptinsidetriangle-p ptint5 3dfp1 3dfp2 3dfp3))) (setq ptint5 nil))
  254.         (cond
  255.           ( (and ptint1 ptint2)
  256.             (entmake (list '(0 . "LINE") (cons 10 ptint1) (cons 11 ptint2)))
  257.           )
  258.           ( (and ptint1 ptint3)
  259.             (entmake (list '(0 . "LINE") (cons 10 ptint1) (cons 11 ptint3)))
  260.           )
  261.           ( (and ptint1 ptint4)
  262.             (entmake (list '(0 . "LINE") (cons 10 ptint1) (cons 11 ptint4)))
  263.           )
  264.           ( (and ptint1 ptint5)
  265.             (entmake (list '(0 . "LINE") (cons 10 ptint1) (cons 11 ptint5)))
  266.           )
  267.           ( (and ptint2 ptint3)
  268.             (entmake (list '(0 . "LINE") (cons 10 ptint2) (cons 11 ptint3)))
  269.           )
  270.           ( (and ptint2 ptint4)
  271.             (entmake (list '(0 . "LINE") (cons 10 ptint2) (cons 11 ptint4)))
  272.           )
  273.           ( (and ptint2 ptint5)
  274.             (entmake (list '(0 . "LINE") (cons 10 ptint2) (cons 11 ptint5)))
  275.           )
  276.           ( (and ptint3 ptint4)
  277.             (entmake (list '(0 . "LINE") (cons 10 ptint3) (cons 11 ptint4)))
  278.           )
  279.           ( (and ptint3 ptint5)
  280.             (entmake (list '(0 . "LINE") (cons 10 ptint3) (cons 11 ptint5)))
  281.           )
  282.           ( (and ptint4 ptint5)
  283.             (entmake (list '(0 . "LINE") (cons 10 ptint4) (cons 11 ptint5)))
  284.           )
  285.         )
  286.       )
  287.       (setq plv (cdr plv) plve (cdr plve))
  288.     )
  289.    
  290.     (setq s (ssget "_X" '((0 . "LINE") (8 . "PLPROJ"))))
  291.     (l3dpl s)
  292.   )
  293.   (vl-cmdf "_.UCS" "p")
  294.  
  295.   (princ)
  296. )
  297.  

M.R.
« Last Edit: August 13, 2013, 08:57:25 AM by ribarm »
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

ymg

  • Guest
Re: Elevation of Object x distance above a TIN ?
« Reply #8 on: August 12, 2013, 11:07:01 AM »
Snownut2,

Here is a routine posted by Gilles Chanteau a long time ago for projecting unto a plane.


Code - Auto/Visual Lisp: [Select]
  1. ;; PROJ_PT (gile)
  2. ;; Retourne les coordonnées de la projection orthogonale
  3. ;; du point pt sur le plan défini par son origine et sa normale
  4. ;;
  5. ;; Arguments
  6. ;; pt : le point dont on cherche la projection
  7. ;; org : un point quelconque du plan de projection
  8. ;; nor : le vecteur normal du plan de projection
  9.  
  10. (defun proj_pt (pt org norm)
  11.   (mapcar '-
  12.           pt
  13.           (mapcar
  14.             '(lambda (x)
  15.                (* x
  16.                   (cos (angle_3pts org (mapcar '+ org norm) pt))
  17.                   (distance org pt)
  18.                )
  19.              )
  20.             norm
  21.           )
  22.   )
  23. )
  24.  
  25. ;; NORM_3PTS (gile)
  26. ;; Retourne le vecteur normal du plan défini par 3 points
  27. ;;
  28. ;; Arguments : trois points
  29.  
  30. (defun norm_3pts (p0 p1 p2)
  31.   (vunit (v^v (mapcar '- p1 p0) (mapcar '- p2 p0)))
  32. )
  33.  
  34.  
  35. ;; V^V (gile)
  36. ;; Retourne le produit vectoriel (vecteur) de deux vecteurs
  37. ;;
  38. ;; Arguments : deux vecteurs
  39.  
  40. (defun v^v (v1 v2)
  41.   (list (- (* (cadr v1) (caddr v2)) (* (caddr v1) (cadr v2)))
  42.         (- (* (caddr v1) (car v2)) (* (car v1) (caddr v2)))
  43.         (- (* (car v1) (cadr v2)) (* (cadr v1) (car v2)))
  44.   )
  45. )
  46.  

You'll have to come up with the anglle_3pts part dont't know where I put it.

ymg

« Last Edit: August 12, 2013, 11:16:01 AM by ymg »

ribarm

  • Gator
  • Posts: 3313
  • Marko Ribar, architect
Re: Elevation of Object x distance above a TIN ?
« Reply #9 on: August 12, 2013, 12:35:30 PM »
I've updated my above posted code, so that now works with multiple LWPOLYLINES... Also improved speed - it can now operate on obtained Voronoi LWPOLYLINES - look into ==={Challenge}=== Voronoi diagram topic at the end - there is code that converts REGIONS to LWPOLYLINES, and now you can convert those LWPOLYLINES into 3DPOLYLINES with my above posted code... It did on my comp. 4680 LWPOLYLINES to 3DPOLYLINES for ab 5 min...

M.R.
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

ymg

  • Guest
Re: Elevation of Object x distance above a TIN ?
« Reply #10 on: August 12, 2013, 09:33:42 PM »
Marko,

For point inside triangle, try this.
No intersection needed so you'll probably gain speed.
I did not tested it however. Also your triangle must be CCW

ymg

Code - Auto/Visual Lisp: [Select]
  1. ; (onrightp p e1 e2)                                                                              
  2. ; Given point p and directed vector v1 --> v2 defined by two points.                              
  3. ; Returns: T if point lies to the right of Vector,                                                
  4. ;          Nil otherwise.                                                                          
  5.  
  6. (defun onrightp (p v1 v2 / a b)
  7.     (setq a (mapcar '- v2 v1)
  8.           b (mapcar '-  p v1)
  9.     )
  10.     (minusp
  11.        (- (* (car a)(cadr b))
  12.           (* (car b)(cadr a))
  13.        )
  14.     )
  15. )
  16.  
  17. ; (intrianglep p t1 t2 t3)                                                                        
  18. ; Given point p and triangle defined by points t1, t2, t3     (Strictly CCW)                      
  19. ; Returns: T if p is inside the triangle,                                                          
  20. ;          Nil otherwise.                                                                          
  21. ; Depends on onrightp                                                                              
  22.  
  23. (defun intrianglep (p t1 t2 t3)
  24.       (not
  25.         (or
  26.                   (onrightp p t1 t2)
  27.                   (onrightp p t2 t3)
  28.                   (onrightp p t3 t1)
  29.         )
  30.       )
  31. )
  32.  



ribarm

  • Gator
  • Posts: 3313
  • Marko Ribar, architect
Re: Elevation of Object x distance above a TIN ?
« Reply #11 on: August 13, 2013, 08:03:52 AM »
ymg, thanks for reply, but I don't want to implement much more subfunctions (CCW checking), as with my ptinsidetriangle-p subfunction code works just fine - it is totally applicable for 3d points and I don't think I'll gain much better performances...

One note : I've modified my code once again - if someone uses DTM.vlx - it creates TIN above and below 0.0 elevation, so I've changed my plv list to take (- elev) as Z coordinates, so the function won't fail and in this case...

M.R.

[EDIT] : To add one more code - if someone want to sweep these 3DPOLYLINES with circle as shape, here is quickly written code :

Code: [Select]
(defun c:cirsweep3dpls ( / cmde r ss i pl ci )
  (setq cmde (getvar 'cmdecho))
  (setvar 'cmdecho 0)
  (initget 7)
  (setq r (getdist "\nPick or enter radius for circles to be swept along 3dpolylines : "))
  (prompt "\nSelect closed 3dpolylines")
  (setq ss (ssget "_:L" '((0 . "POLYLINE") (70 . 9))))
  (setq i -1)
  (while (setq pl (ssname ss (setq i (1+ i))))
    (setq ci (entmakex (list '(0 . "CIRCLE") '(10 0.0 0.0 0.0) (cons 40 r) '(210 0.0 0.0 1.0))))
    (vl-cmdf "_.sweep" ci "" pl)
  )
  (setvar 'cmdecho cmde)
  (princ)
)
« Last Edit: August 13, 2013, 08:07:34 AM by ribarm »
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

ribarm

  • Gator
  • Posts: 3313
  • Marko Ribar, architect
Re: Elevation of Object x distance above a TIN ?
« Reply #12 on: August 13, 2013, 09:00:37 AM »
I've changed my (ptinsidetriangle-p) subfunction to be really 3D... Had to implement (LM:Coplanar-p) subfunction inside... Thanks, L.M.

Code - Auto/Visual Lisp: [Select]
  1. ;; Point inside triangle  -  MR
  2. ;; Returns T if point pt lies inside triangle
  3. ;; or returns nil if point pt lies outside triangle defined by points p1,p2,p3
  4.  
  5. (defun ptinsidetriangle-p ( pt p1 p2 p3 / LM:Coplanar-p v^v )
  6.  
  7.   (defun v^v ( u v )
  8.     (mapcar '(lambda ( n ) (- (* (nth (car n) u) (nth (cadr n) v)) (* (nth (cadr n) u) (nth (car n) v)))) '((1 2) (2 0) (0 1)))
  9.   )
  10.  
  11.   (defun LM:Coplanar-p ( p1 p2 p3 p4 )
  12.     (
  13.       (lambda ( n )
  14.         (equal
  15.           (last (trans p3 0 n))
  16.           (last (trans p4 0 n))
  17.           1e-8
  18.         )
  19.       )
  20.       (v^v (mapcar '- p1 p2) (mapcar '- p1 p3))
  21.     )
  22.   )
  23.  
  24.   (if
  25.     (and
  26.       (LM:Coplanar-p pt p1 p2 p3)
  27.       (not
  28.         (or
  29.           (inters pt p1 p2 p3)
  30.           (inters pt p2 p1 p3)
  31.           (inters pt p3 p1 p2)
  32.         )
  33.       )
  34.       (not
  35.         (or
  36.           (> (+ (distance pt p1) (distance pt p2)) (+ (distance p3 p1) (distance p3 p2)))
  37.           (> (+ (distance pt p2) (distance pt p3)) (+ (distance p1 p2) (distance p1 p3)))
  38.           (> (+ (distance pt p3) (distance pt p1)) (+ (distance p2 p3) (distance p2 p1)))
  39.         )
  40.       )
  41.     )
  42.     T
  43.     nil
  44.   )
  45. )
  46.  

Not much slower, but the most correct one...
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

snownut2

  • Swamp Rat
  • Posts: 971
  • Bricscad 22 Ultimate
Re: Elevation of Object x distance above a TIN ?
« Reply #13 on: August 13, 2013, 02:20:30 PM »
Thanks guys for the assistance, below is the Function I was looking to achieve.

The code below finds the Highest point of a TIN along a pline, by creating points at intervals determined by the "dis" variable.

Code - Auto/Visual Lisp: [Select]
  1. (defun c:HiTinElev ( / L_v R 3DF tr p1 p2 p3 p4 diff   ;Function to determine Highest Elevation of TIN along a PLINE
  2.                        )(vl-load-com)
  3.   (defun ver_ucs ()
  4.     (if (or
  5.             (not (equal (caddr (getvar 'ucsxdir)) 0.0 1e-8))
  6.             (not (equal (caddr (getvar 'ucsydir)) 0.0 1e-8))
  7.         )
  8.         (progn
  9.             (alert "Z-axis of the current UCS not normal to the WCS.")
  10.             (exit)
  11.         )
  12.         t
  13.       )
  14.     );defun (ver_ucs)
  15.  
  16.  
  17. ;; InsideTriangle-p  -  Lee Mac
  18. ;; Returns T if pt lies inside the triangle formed by p1,p2,p3
  19.   (defun LM:InsideTriangle-p ( pt p1 p2 p3 )
  20.     (
  21.         (lambda ( a1 a2 a3 )
  22.             (or
  23.                 (and (<= 0.0 a1) (<= 0.0 a2) (<= 0.0 a3))
  24.                 (and (<= a1 0.0) (<= a2 0.0) (<= a3 0.0))
  25.             )
  26.         )
  27.         (sin (- (angle p1 pt) (angle p1 p2)))
  28.         (sin (- (angle p2 pt) (angle p2 p3)))
  29.         (sin (- (angle p3 pt) (angle p3 p1)))
  30.         )
  31.     );defun (LM:InsideTriangle-p)
  32.  
  33. ;================ punto sul piano ==================
  34. ; restituisce il punto sul piano definito dai punti
  35. ; a, b, c, sulla perpendicolare del punto p
  36.  
  37.   (defun psp (a b c p / *a *b *c)
  38.     (setq *a
  39.              (-
  40.                  (* (- (cadr a) (cadr b)) (- (caddr a) (caddr c)))
  41.                  (* (- (caddr a) (caddr b)) (- (cadr a) (cadr c)))
  42.              )
  43.     )
  44.     (setq *b
  45.              (-
  46.                  (* (- (caddr a) (caddr b)) (- (car a) (car c)))
  47.                  (* (- (car a) (car b)) (- (caddr a) (caddr c)))
  48.              )
  49.     )
  50.     (setq *c
  51.              (-
  52.                  (* (- (car a) (car b)) (- (cadr a) (cadr c)))
  53.                  (* (- (cadr a) (cadr b)) (- (car a) (car c)))
  54.              )
  55.     )
  56.     (list
  57.         (car p)
  58.         (cadr p)
  59.         (+
  60.             (-
  61.                 (/
  62.                     (+
  63.                         (* (- (car p) (car a)) *a)
  64.                         (* (- (cadr p) (cadr a)) *b)
  65.                     )
  66.                     *c
  67.                 )
  68.             )
  69.             (caddr a)
  70.             )
  71.         )
  72.     );defun (psp)
  73.  
  74.   (defun mklistR ( / cnt dis ent inc nPt pLst pt1 pt2)
  75.     (setvar 'osmode 1)
  76.     (setq pt1  (getpoint     "\nSelect Corner @ High Side of the EDA  ; ")
  77.           pt2  (getpoint pt1 "\nSelect Other High Side Corner of EDA  ; ")
  78.           pt1  (subst 0.0 (caddr pt1) pt1)
  79.           pt2  (subst 0.0 (caddr pt2) pt2)
  80.           pLst (list pt1)
  81.           dis  0.5
  82.           inc  (- (/ dis 2.0) dis)
  83.           cnt  (- (fix(/ (distance pt1 pt2)dis))1)
  84.           )
  85.     (ENTMAKE
  86.       (APPLY
  87.         (FUNCTION APPEND)
  88.         (CONS (LIST '(0 . "LWPOLYLINE")
  89.                     '(100 . "AcDbEntity")
  90.                     '(67 . 0)
  91.                     '(410 . "Model" )
  92.                     '(100 . "AcDbPolyline")
  93.                     (CONS 90   2)       ; Vertices
  94.                     (CONS 70   1)
  95.                     )
  96.               (MAPCAR (FUNCTION LIST)
  97.                     (MAPCAR (FUNCTION (LAMBDA (a) (CONS 10 a))) (list pt1 pt2))
  98.                     )
  99.               )
  100.         )
  101.       )
  102.     (setq ent (entlast))
  103.     (while (/=  cnt 0)
  104.       (setq nPt  (vlax-curve-getpointatdist ent (setq inc (+ inc dis)))
  105.             pLst (cons nPt pLst)
  106.             cnt  (1- cnt)
  107.             )
  108.       )
  109.     (entdel ent)
  110.     (cons Pt2 pLst)
  111.     );(MKLISTR)
  112.  
  113. ;-------------------------------------- START HiTinElev Function ------------------------------------
  114.      (if (and
  115.            (ver_ucs)
  116.    ;         (princ "\nSelect Rectangle")
  117.    ;         (setq R (ssname (ssget  "_+.:S" '((0 . "LWPOLYLINE"))) 0))
  118.             (setq helev 0)         
  119.         )
  120.         (progn
  121.             (setq L_v (MKLISTR))
  122. ;            (setq L_v (pl_coord R))            
  123. ;            (command "_zoom" "_obj" R "")
  124.             (if
  125.                 (setq 3DF (ssget "_F" (cons (last L_v) L_v) '((0 . "3DFACE"))))
  126.                 (progn
  127.  ;                   (command "_zoom" "_p")
  128.                     (repeat (setq i (length L_v))
  129.                         (setq v (nth (setq i (1- i)) L_v))                  
  130.                         (repeat (setq n (sslength 3DF))
  131.                             (setq tr (ssname 3DF (setq n (1- n))))
  132.                             (setq p1 (trans (cdr (assoc 10 (entget tr))) 0 1)
  133.                                   p2 (trans (cdr (assoc 11 (entget tr))) 0 1)
  134.                                   p3 (trans (cdr (assoc 12 (entget tr))) 0 1)
  135.                                   p4 (trans (cdr (assoc 13 (entget tr))) 0 1)
  136.                             )
  137.                             (if (equal p1 p2 1e-6) (setq p1 p2 p2 p3 p3 p4))
  138.                             (setq diff nil)
  139.                             (if (LM:InsideTriangle-p v p1 p2 p3 )
  140.                                 (progn
  141.                                   (setq diff (-(- (caddr v) (caddr (psp p1 p2 p3 v))))
  142.                                         helev (max diff helev)
  143.                                         )
  144. ;|                                (entmake
  145.                                     (list
  146.                                       (cons 0 "TEXT")
  147.                                       (cons 7 (getvar 'textstyle))
  148.                                       (cons 10 (trans v 1 0))
  149.                                       (cons 40 (getvar 'textsize))
  150.                                       (cons 1 (rtos diff))
  151.                                       )
  152.                                     )|;
  153.                                   )
  154.                               )
  155.                           )
  156.                       )
  157.                   (princ (strcat "\nHighest TIN Elev. @ High Side of EDA  ; < " (rtos helev 2 2) "' >"))
  158.                   (princ)
  159.                   )
  160.               (progn
  161.  ;                   (command "_zoom" "_p")
  162.                 (alert "\n   No selected TIN 3DFACE objects\n\n<Turn on A Layer CONTAINING a TIN>")
  163.                 (princ "\n- Function Cancelled -")
  164.                 (princ)
  165.                 )
  166.               )
  167.           )
  168.        )
  169.   );defun

ymg

  • Guest
Re: Elevation of Object x distance above a TIN ?
« Reply #14 on: August 19, 2013, 08:24:40 PM »
Quote
ymg, thanks for reply, but I don't want to implement much more subfunctions (CCW checking)

Marko,

In a properly built triangulation, all the triangles are either all CW or all CCW.

CCW is the most general case.  So you don't need  to check.

Also function onrightp could  be modified to return the value instead of t or nil.
This way if you are negative point lies to the right, positive point lies to the left and
finally 0 means point is smack on the vector.

ymg