#|
|# (in-package :EXAMPLES) (use-package :OLI) ;;----- Logical Table --------------------------------------------------------- (sd-create-logical-table "Standard-Pipe-Bends" :columns '(:pipe_radius :bend_radius :bend_angle) :columnNames '("Pipe Radius" "Bend Radius" "Angle") :types '(:length :length :angle) :units '(:mm :mm :deg) :contents '(( 5 5 15) ( 5 5 30) ( 5 5 45) ( 5 5 60) ( 5 5 90) ( 5 10 15) ( 5 10 30) ( 5 10 45) ( 5 10 60) ( 5 10 90) ( 5 20 15) ( 5 20 30) ( 5 20 45) ( 5 20 60) ( 5 20 90) (10 10 15) (10 10 30) (10 10 45) (10 10 60) (10 10 90) (10 15 15) (10 15 30) (10 15 45) (10 15 60) (10 15 90) (10 20 15) (10 20 30) (10 20 45) (10 20 60) (10 20 90) (10 30 15) (10 30 30) (10 30 45) (10 30 60) (10 30 90) )) ;;----- Display Table --------------------------------------------------------- (sd-create-display-table "STANDARD-PIPE-BENDS" :tableTitle "Standard Pipe Bends" :logicalTable "Standard-Pipe-Bends" :columns '(:pipe_radius :bend_radius :bend_angle) :applyColumns '(:bend_radius :bend_angle) :selectionMode :single-row :applyAction :default-tokens) ;;----- Table show and hide functions ----------------------------------------- (defun show-standard-bend-table (&rest args) (let ((type (pop args)) (pipe-radius (getf args :pipe-radius)) (bend-radius (getf args :bend-radius)) (bend-angle (getf args :bend-angle)) (show-table nil)) (if pipe-radius (when (sd-read-logical-table-row "Standard-Pipe-Bends" :pList `(:pipe_radius ,pipe-radius)) ;; Yes, there is at least one row with a correct pipe radius (sd-filter-display-table "STANDARD-PIPE-BENDS" :column :pipe_radius :test1 :equal :value1 pipe-radius) (setq show-table t)) (progn (sd-reset-display-table-filter "STANDARD-PIPE-BENDS" :column :pipe_radius) (setq show-table t))) (when show-table (case type (:radius (sd-reset-display-table-filter "STANDARD-PIPE-BENDS" :column :bend_radius) (if bend-angle (when (sd-read-logical-table-row "Standard-Pipe-Bends" :pList `(:bend_angle ,bend-angle)) (sd-filter-display-table "STANDARD-PIPE-BENDS" :column :bend_angle :test1 :equal :value1 bend-angle) (setq show-table t)) (progn (sd-reset-display-table-filter "STANDARD-PIPE-BENDS" :column :bend_angle) (setq show-table t)))) (:angle (sd-reset-display-table-filter "STANDARD-PIPE-BENDS" :column :bend_angle) (if bend-radius (when (sd-read-logical-table-row "Standard-Pipe-Bends" :pList `(:bend_radius ,bend-radius)) (sd-filter-display-table "STANDARD-PIPE-BENDS" :column :bend_radius :test1 :equal :value1 bend-radius) (setq show-table t)) (progn (sd-reset-display-table-filter "STANDARD-PIPE-BENDS" :column :bend_radius) (setq show-table t)))))) (when show-table (sd-show-display-table "STANDARD-PIPE-BENDS" :position '("PIPE-OPTIONS-OPT-CONT-BEND_ANGLE-TB" :leftcenter -10 -20))))) ;;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (defun hide-standard-bend-table () (sd-hide-display-table "STANDARD-PIPE-BENDS" :ignorePin t)) ;;----- Pipe Dialog ----------------------------------------------------------- (sd-defdialog 'pipe :dialog-title "Piping" :variables '( ;; local variables: (BACK-STATES :initial-value nil) (CURR-WP :initial-value (sd-inq-curr-wp)) (PIPE-WP :initial-value (let ((name (sd-gen-obj-basename :workplane :prefix "pipe-plane"))) (sd-call-cmds (create_workplane :new :name name)) (sd-pathname-to-obj (sd-pathlist-to-pathname (list "/" name))))) (PIPE-PROFILE :initial-value nil) (DIR-FBACK :initial-value nil) (PREVIEW-FBACK :initial-value nil) (NEXT-PERFORMED :initial-value nil) (STRAIGHT :initial-value t) ;; straight or bend section? (STRAIGHT-LEN :initial-value nil) (BEND-AXIS :initial-value nil) ;; dialog vaiables: (PIPE_PART :value-type :part-incl-new :title "Part" :after-input (handle-ok-next-action)) (ORIGIN :value-type :point-3d :title "Origin" :initial-value (sd-inq-wp-origin pipe-wp) :after-input (progn (handle-ok-next-action) (sd-call-cmds (position_wp pipe-wp :pt_dir :origin origin :normal :w :done)) (start-dir-fback))) (DIRECTION :value-type :measure-direction :built-in-feedback nil :title "Direction" :initial-value (let ((dir (sd-inq-wp-w-dir pipe-wp))) (setq dir-fback (sd-start-direction-feedback :point origin :direction dir :disc nil)) (list dir)) :check-function #'(lambda (new-dir) (if (first bend_dir) (if (vec-collinear-p (first new-dir) (first bend_dir)) (values :error "Direction collinear to specified Bend direction not allowed.") :ok) :ok)) :after-input (progn (handle-ok-next-action) (sd-call-cmds (position_wp pipe-wp :pt_dir :origin origin :normal (first direction) :done)) (start-dir-fback))) (RADIUS :value-type :positive-length :title "Radius" :after-input (progn (handle-ok-next-action) (when pipe-profile (sd-call-cmds (delete_2d :all_2d))) (sd-call-cmds (circle :cen_rad 0,0 radius)) (sd-call-cmds (c_point 0,0)) (when (and bend_radius (< bend_radius radius)) ;; invalid bend_radius for this radius => reset (setq bend_radius nil)) (setq pipe-profile t))) ("Straight") (STRAIGHT_LENGTH :value-type :positive-length :title "Length" :after-input (switch-to-straight)) (STRAIGHT_TO_PNT :value-type :point-3d :title "To Pnt" :after-input (switch-to-straight)) ("Bend") (BEND_RADIUS :value-type :positive-length :title "Radius" :toggle-type :toggle-data :show-input-tool (sd-subscribe-event *sd-interactive-event* #'show-standard-bend-table :radius :pipe-radius radius :bend-radius bend_radius :bend-angle bend_angle) :hide-input-tool (progn (sd-unsubscribe-event *sd-interactive-event* #'show-standard-bend-table) (hide-standard-bend-table)) :check-function #'(lambda (new-radius) (if (or (not radius) (>= new-radius radius)) :ok (values :error "Bend radius less than pipe radius not allowed."))) :after-input (switch-to-bend)) (BEND_ANGLE :value-type :angle :title "Angle" :initial-optional t :show-input-tool (sd-subscribe-event *sd-interactive-event* #'show-standard-bend-table :angle :pipe-radius radius :bend-radius bend_radius :bend-angle bend_angle) :hide-input-tool (progn (sd-unsubscribe-event *sd-interactive-event* #'show-standard-bend-table) (hide-standard-bend-table)) :after-input (switch-to-bend)) (BEND_DIR :value-type :measure-direction :built-in-feedback nil :title "Direction" :initial-optional t :check-function #'(lambda (new-dir) (if (first direction) (if (vec-collinear-p (first new-dir) (first direction)) (values :error "Bend direction collinear to Direction not allowed.") :ok) :ok)) :after-input (switch-to-bend)) ("-") (NEXT :toggle-type :grouped-toggle :title "Next" :push-action (next-action)) (BACK :toggle-type :grouped-toggle :title "Back" :initial-enable nil :push-action (back-action)) ) :mutual-exclusion '(straight_length straight_to_pnt bend_radius) :local-functions ;;-------------- '((cleanup () (sd-end-feedback preview-fback) (sd-end-feedback dir-fback) (sd-call-cmds (delete_3d pipe-wp)) (sd-call-cmds (current_wp curr-wp))) ;; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (handle-ok-next-action () (setq next-performed nil) (sd-enable-must-variable-check)) ;; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (vec-collinear-p (vec1 vec2) (let ((angle (sd-vec-angle-between vec1 vec2))) (if (or (< (abs angle) (sd-inq-default-geo-resolution)) (< (abs (- angle PI)) (sd-inq-default-geo-resolution))) t nil))) ;; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (start-dir-fback () (when (and origin (first direction)) (sd-end-feedback dir-fback) (setq dir-fback (sd-start-direction-feedback :point origin :direction (first direction) :disc nil)))) ;; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (end-dir-fback () (sd-end-feedback dir-fback)) ;; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (start-preview-fback () (end-preview-fback) (if straight (progn (if straight_length (setq straight-len straight_length) (setq straight-len (sd-call-cmds (measure_dist :between_points origin straight_to_pnt :direction (first direction))))) (setq preview-fback (sd-start-direction-feedback :point (sd-vec-translate origin (first direction) straight-len) :direction (first direction)))) ;; ELSE: bend preview (if (and bend_radius bend_angle bend_dir) (let* ((cross1 (sd-vec-cross-product (first direction) (first bend_dir))) (cross2 (sd-vec-cross-product cross1 (first direction))) (point (sd-vec-translate origin cross2 bend_radius))) (setq preview-fback (sd-start-direction-feedback :point (sd-vec-rotate origin bend_angle :point point :direction cross1) :direction (sd-dir-rotate (first direction) bend_angle :point point :direction cross1))) (setq bend-axis (list point cross1))) (setq bend-axis nil)))) ;; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (end-preview-fback () (sd-end-feedback preview-fback)) ;; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (switch-to-straight () (handle-ok-next-action) (setq straight t) (sd-set-variable-status 'bend_angle :optional t) (sd-set-variable-status 'bend_dir :optional t) (setq bend_angle nil) (setq bend_dir nil) (start-preview-fback)) ;; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (switch-to-bend () (handle-ok-next-action) (setq straight nil) (sd-set-variable-status 'bend_radius :optional nil) (sd-set-variable-status 'bend_angle :optional nil) (sd-set-variable-status 'bend_dir :optional nil) (start-preview-fback)) ;; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (next-action () (setq next-performed t) (sd-disable-must-variable-check) (when (and pipe_part origin direction radius) (if straight (when straight-len ;; calculated in start-preview-fback (end-dir-fback) (end-preview-fback) ;; remember current model state: (push (list (sd-set-model-checkpoint) origin direction) back-states) ;; perform extrude and position_wp: (sd-call-cmds (extrude :part pipe_part :wp pipe-wp :distance straight-len :keep_wp :yes)) (sd-call-cmds (position_wp pipe-wp :translate :dir_len (first direction) straight-len)) (setq origin (sd-inq-wp-origin pipe-wp)) (start-dir-fback)) ;; ELSE: perform bend operation: (when bend-axis ;; calculated in start-preview-fback (end-dir-fback) (end-preview-fback) ;; remember current model state: (push (list (sd-set-model-checkpoint) origin direction) back-states) ;; perform turn and position_wp: (sd-call-cmds (turn :part pipe_part :wp pipe-wp :axis (first bend-axis) (second bend-axis) :rotation_angle bend_angle :keep_wp :yes)) (sd-call-cmds (position_wp pipe-wp :rotate :axis (first bend-axis) (second bend-axis) :rotation_angle bend_angle :done)) (setq bend_dir nil) (setq origin (sd-inq-wp-origin pipe-wp)) (setq direction (list (sd-inq-wp-w-dir pipe-wp))) (start-dir-fback)))) (when back-states (sd-set-variable-status 'back :enable t))) ;; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (back-action () (when back-states (let ((state (pop back-states))) (end-dir-fback) (sd-return-to-model-checkpoint (first state)) (setq origin (second state)) (setq direction (third state)) (start-dir-fback)) (unless back-states (sd-set-variable-status 'back :enable nil)))) ) ;; end of local functions :ok-action '(progn (unless next-performed (next-action)) (cleanup)) :cancel-action '(cleanup) ) ;