; -*-Lisp-*-
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Description:  MoldDesignAdvisor Customization: Functions for calculating the 
;;               Rib variables 
;; Language:     Lisp
;; Package:      MOLD-UI
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(in-package :mold-ui)
(use-package '(:oli :frame2))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;         Formulas originally used for the rib calculation
;; 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defparameter *rib-formula-list* 
    (list :default-formular-group :original
          :original (list :regi-name *original-group*
		          :rib-thickness 'rib-thickness
		          :rib-thick-low 'rib-thick-lower-limit
		          :rib-thick-high 'rib-thick-upper-limit
		          :rib-draft-ang 'rib-draft-angle
		          :rib-ang-low 'rib-draft-angle-lower-limit
		          :rib-ang-high 'rib-draft-angle-upper-limit
		          :rib-blend 'rib-blend
		          :rib-blend-low 'rib-blend-lower-limit
		          :rib-blend-high 'rib-blend-upper-limit
		          :rib-max-height 'rib-max-height
		          )))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;                      Original Formula Definition
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Rib Thickness ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; calculate value 
(defun rib-thickness(known-args &aux val)
  (let ((ref-wall-thick (inq-known-variable known-args :inq-var :ref-wall-thick
			                               :calc-var :rib-thickness)))
    (unless ref-wall-thick
      (return-from rib-thickness nil))
    (setq val (* 0.6 ref-wall-thick))
    (list :rib-thickness val) 
    ))
;; calculate lower limit: 
(defun rib-thick-lower-limit(known-args &aux val)
  (let ((ref-wall-thick (inq-known-variable known-args :inq-var :ref-wall-thick
			                               :calc-var :rib-thick-low)))
    (unless ref-wall-thick
      (return-from rib-thick-lower-limit nil))
    (setq val (* 0.5 ref-wall-thick))
    (list :rib-thick-low val) 
    ))
;; calculate upper limit: 
(defun rib-thick-upper-limit(known-args &aux val)
  (let ((ref-wall-thick (inq-known-variable known-args :inq-var :ref-wall-thick
			                               :calc-var :rib-thick-high)))
    (unless ref-wall-thick
      (return-from rib-thick-upper-limit nil))
    (setq val ref-wall-thick)
    (list :rib-thick-high val) 
    ))

;;;;;;;;;;;;;;;;;;;;;;;;;;;; Rib Draft Angle ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; calculate value 
(defun rib-draft-angle(known-args &aux val)
  (setq val (sd-deg-to-rad 2.0))
  (list :rib-draft-ang val) 
  )
;; calculate lower limit: 
(defun rib-draft-angle-lower-limit(known-args &aux val)
  (setq val (sd-deg-to-rad 0.5))
  (list :rib-ang-low val) 
  )
;; calculate upper limit: 
(defun rib-draft-angle-upper-limit(known-args &aux val)
  (setq val (sd-deg-to-rad 10.0))
  (list :rib-ang-high val) 
  )

;;;;;;;;;;;;;;;;;;;;;;;;;;; Rib Blend Radius ;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; calculate value 
(defun rib-blend(known-args &aux val)
  (let ((ref-wall-thick (inq-known-variable known-args :inq-var :ref-wall-thick
			                               :calc-var :rib-blend)))
    (unless ref-wall-thick
      (return-from rib-blend nil))
    (setq val (* 0.2 ref-wall-thick))
    (when (< val 0.15)
      (setq val 0.15))
    (list :rib-blend val) 
    ))
;; calculate lower limit: 
(defun rib-blend-lower-limit(known-args &aux val)
  (let ((ref-wall-thick (inq-known-variable known-args :inq-var :ref-wall-thick
			                               :calc-var :rib-blend-low)))
    (unless ref-wall-thick
      (return-from rib-blend-lower-limit nil))
    (setq val (* 0.12 ref-wall-thick))
    (when (< val 0.15)
      (setq val 0.15))
    (list :rib-blend-low val) 
    ))
;; calculate upper limit: 
(defun rib-blend-upper-limit(known-args &aux val)
  (let ((ref-wall-thick (inq-known-variable known-args :inq-var :ref-wall-thick
			                               :calc-var :rib-blend-high)))
    (unless ref-wall-thick
      (return-from rib-blend-upper-limit nil))
    (setq val (* 0.4 ref-wall-thick))
    (list :rib-blend-high val) 
    ))
		          
;;;;;;;;;;;;;;;;;;;;;;;;;;; Rib Max Height ;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
(defun rib-max-height(known-args &aux val)
  (let ((ref-wall-thick (inq-known-variable known-args :inq-var :ref-wall-thick
			                               :calc-var :rib-max-height)))
    (setq val (* 3.0 ref-wall-thick))
    (list :rib-max-height val) 
    ))


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Registration of User Defined Formula Sets
;;
;; A user defined formula set for calculating the parameters of the Rib 
;; Feature will be regisetered here
;; 
;; What is needed to be done by the user?
;; ======================================
;;
;; 1. Register the new formula set by invoking register-a-function-set() and 
;;    make the following specifications:
;;      :regi-keyword    a key word for the new formula set
;;      :regi-list       name of a global list which contains defined formula 
;;                       sets for calculating the parameters of a plastic feature.
;;                       (!) For creating Gusett Feature the user is only 
;;                       allowed to specify it as *rib-formula-list* (it
;;                       is defined above in this file, each different plastic 
;;                       feature will have itsown such gloable list)
;;      :redef-formulas  a p-list which contains the parameter key word and 
;;                       the new defined function to calculate the parameter
;;                       (the parameter keywords could be seen above when the 
;;                       *rib-formula-list* is defined and the meaning of 
;;                       the parameters is shown in the feature dialog) 
;;      :as-default      boolean value type to specify if the new formula set is 
;;                       desired to be the default formula set
;;
;; 2. Define the new functions for calculating the feature parameters. The
;;    following function could be used for the definition:
;;
;;    - function inq-known-variable(known-args &key inq-var calc-var)
;;
;;      checks if a input parameter used for calculating the variable has been 
;;      defined. known-args is a p-list which is passed in originally by the  
;;      feature dialog and contains the parameters needed for the calculation,
;;      inq-var gives the keyword of the parameter being checked, and calc-var 
;;      gives the variable to be calculated. If check fails, a error message will 
;;      be shown in SolidDesigner, otherwise the function returns the parameter value
;;
;;
;; Example:
;; ========
;;
;(register-a-function-set :regi-keyword :aesthetic-rib 
;                         :regi-list *rib-formula-list*
;                         :redef-formulas (list :rib-thickness 'aesthetic-rib-thickness
;					       :rib-thick-low 'aesthetic-rib-thick-lower-limit
;					       :rib-thick-low 'aesthetic-rib-thick-upper-limit)
;                         :as-default t
;  )
;
;defun aesthetic-rib-thickness(known-args &aux val)
; (let ((ref-wall-thick (inq-known-variable known-args :inq-var :ref-wall-thick
;			                               :calc-var :rib-thickness)))
;   (unless ref-wall-thick
;     (return-from aesthetic-rib-thickness nil))
;   (setq val (* 0.4 ref-wall-thick))
;   (list :rib-thickness val) 
;   ))
;; calculate lower limit: 
;defun aesthetic-rib-thick-lower-limit(known-args &aux val)
; (let ((ref-wall-thick (inq-known-variable known-args :inq-var :ref-wall-thick
;			                               :calc-var :rib-thick-low)))
;   (unless ref-wall-thick
;     (return-from aesthetic-rib-thick-lower-limit nil))
;   (setq val (* 0.4 ref-wall-thick))
;   (list :rib-thick-low val) 
;   ))
;; calculate upper limit: 
;defun aesthetic-rib-thick-upper-limit(known-args &aux val)
; (let ((ref-wall-thick (inq-known-variable known-args :inq-var :ref-wall-thick
;			                               :calc-var :rib-thick-high)))
;   (unless ref-wall-thick
;     (return-from aesthetic-rib-thick-upper-limit nil))
;   (setq val (* 0.75 ref-wall-thick))
;   (list :rib-thick-high val) 
;   ))
