2021.01.20 18:12
;2013년 07월 01일
;작성자 : 박주근
;용도 : 두면이 이루는 각도를 계산한다.
(defun get-face-to-face-angle (@EN1 @EN2 @EN3 @Z / &A &B &D &D_PER1 &PTEN1 &PTEN3 &PTPER1 &PTZ &X1 &X2 PTSE_EN1 PTSE_EN3 PT_EN2 PT_ORI X)
; (setq @EN1 (car (entsel)))
; (setq @EN2 (car (entsel)))
; (setq @EN3 (car (entsel)))
; (setq @Z 510.7747)
; en1 과 en3가 만나는 점을 pt_ori에 저장
(command "ucs" "")
(setq pt_ori (inters2en @EN1 @EN3))
(setq pt_en2 (cadr (get_angle_by_pt_to_en pt_ori @EN2)))
(command "ucs" "3p" "none" pt_en2 "none" pt_ori "")
(setq pt_ori (trans pt_ori 0 1))
(setq pt_en2 (trans pt_en2 0 1))
(setq &D (distance pt_ori pt_en2))
(setq &ptZ (list 0 (* -1 @Z)))
(setq &ptPer1 (get_Per_Point_by_3pt (list pt_ori &ptZ pt_en2) nil))
(setq ptSE_en1 (mapcar '(lambda (x) (trans x 0 1)) (get_start_end_point @EN1)))
(setq ptSE_en3 (mapcar '(lambda (x) (trans x 0 1)) (get_start_end_point @EN3)))
(setq &ptEn3 (inters (car ptSE_en3) (cadr ptSE_en3) pt_en2 (list (car pt_en2) 10000) nil))
(setq &ptEn1 (inters (car ptSE_en1) (cadr ptSE_en1) pt_en2 (list (car pt_en2) 10000) nil))
(setq &A (abs (cadr &ptEn3)))
(setq &B (abs (cadr &ptEn1)))
(setq &D_per1 (distance &ptPer1 pt_en2))
(setq &X1 (atan (/ &A &D_per1)))
(setq &X2 (atan (/ &B &D_per1)))
(command "ucs" "")
(+ &X1 &X2))
(defun c:2fa ( / 2F-ANG EN1 EN2 EN3 X$)
(prompt "\n 이면각을 구하고자 하는 빗변을 선택하십시요")
(setq en2 (car (entsel)))
(prompt "\n 양쪽 평면선을 선택 하십시요")
(setq en1 (car (entsel)))
(setq en3 (car (entsel)))
(if (= *Z-val* nil) (setq *Z-val* "1000"))
(setq x$ (getstring (strcat "\n 물체의 높이 Z값을 입력 하십시요 [" *Z-val* "]:")))
(setq *Z-val* (if (= x$ "")
*Z-val*
x$))
(if (equal *Z-val* 0 1) (alert "입력한 Z값이 0에 가깝습니다. 다시 해 주십시요")
(progn
(setq 2f-ang (rtd (get-face-to-face-angle en1 en2 en3 (atof *Z-val*))))
(princ (strcat "이면각은 [" (rtos 2f-ang 2 2) "]도입니다."))))
(princ))
(defun inters2en (en1 en2)
(inters (vlax-curve-getstartpoint (vlax-ename->vla-object en1))
(vlax-curve-getendpoint (vlax-ename->vla-object en1))
(vlax-curve-getstartpoint (vlax-ename->vla-object en2))
(vlax-curve-getendpoint (vlax-ename->vla-object en2)) nil))
; 어떤 한점과 요소이름(선)을 입력하면 선의 한점중 입력한 점에서 가까운점과 반대편 점의 좌표를 추출한다.
(defun get_angle_by_pt_to_en (inpt ename / vl_en en_p1 en_p2 result)
; (setq inpt j_pt)
; (setq ename (car el_90))
(setq vl_en (vlax-ename->vla-object ename))
(setq en_p1 (vlax-curve-getstartpoint vl_en))
(setq en_p2 (vlax-curve-getendpoint vl_en))
(if (< (distance inpt en_p1) (distance inpt en_p2))
(setq result (list en_p1 en_p2))
(setq result (list en_p2 en_p1)))
result)
;용도 : 두점에 수직으로 만나는 좌표를 추출한다.
(defun get_Per_Point_by_3pt (@ptl @opt / ANG_B PTR1 PTR2)
; (setq @ptl '((339227.0 221364.0 0.0) (334283.0 220039.0 0.0)))
; (setq @ptl (append @ptl (list (list 0 0))))
; (setq @opt T)
(setq ang_B (apply 'angle (cdr (reverse @ptl))))
(setq ptR1 (polar (last @ptl) (+ ang_B (/ pi 2.0)) 100000))
(setq ptR2 (polar (last @ptl) (- ang_B (/ pi 2.0)) 100000))
(inters (car @ptl) (cadr @ptl) ptR1 ptR2 @opt))
;Line, Pline의 시작점과 끝점을 리턴한다.
(defun get_start_end_point (ien / IOBJNAME IVEN PTE PTS )
; (setq ien (car (entsel)))
(setq iven (vlax-ename->vla-object ien))
(setq iobjName (vla-get-objectname iven))
; polyline일경우와 아닌경우
(if (= "AcDbPolyline" iobjName)
(progn
(setq ptS (lib_*vtxtlist iven 1))
(setq ptE (last ptS))
(setq ptS (car ptS)))
(progn
(setq ptS (vlax-safearray->list (vlax-variant-value (vla-get-startpoint iven))))
(setq ptE (vlax-safearray->list (vlax-variant-value (vla-get-endpoint iven))))))
(list (list (car ptS) (cadr ptS) 0.0) (list (car ptE) (cadr ptE) 0.0)))