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...
;; 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
)