#|
|# (in-package :EXAMPLES) (use-package :OLI ) (defun remove-paint-feat(feat) (sd-call-cmds (progn (clear_face_color :by_feature feat) (remove_feature feat)) :success t) ) (sd-deffeature 'PAINT ; Feature Identification attributes :library 'CoCreate :revision 1.0 :description "Paint Feature demonstration" :feature-type :non-geometric ; Feature Behavior attributes :on-copy :copy ;default for non-geometric :maintain :on-merge :maintain ;default for non-geometric :maintain :on-split :copy ;default for non-geometric :copy :on-xform :maintain ;default for non-geometric :maintain :on-invalidate :maintain ; default :filing '(:sd-file :mi-file :vrml-file :annotator) ;default is :sd-file :warning NIL ;default is '(:modify :rename :delete) :destructor 'remove-paint-feat :verifier NIL ; default is always valid ; Feature Appearance attributes :category "/Mfg/Finishing" :src-location "goodies/example_features" :pixmap "personality/pixmaps/paint.pm" :name-str '(format nil "~A_~A" F_TYPE "Paint") ;:label-str '(format nil "~A_~A" F_TYPE "Paint") ;;use same as name ; Feature Control attributes :select-variable 'F_ITEMS :start-variable 'F_ITEMS :save-variables :all-visible ;(:none, :all, :all-visible, list) ; sd-defdialog attributes :dialog-title "My Paint" ; Create, Modify, Copy, Delete get added :ok-action '(let (faces) (setq faces (sd-call-cmds(get_selection :allow_face_part :select :by_feature (sd-active-cust-feat)))) (sd-call-cmds(set_face_color faces F_COLOR)) ) :variables '((F_ITEMS :selection (*sd-face-seltype*) :multiple-items t :face-part-allowed t :title "Selection" :modifies :contents :prompt-text "Select Faces for paint feature") (F_COLOR :value-type :rgb-color :title "Color" :prompt-text "Specify a color") (F_TYPE :value-type :string :title "Type" :prompt-text "Specify the paint type." :initial-value "Latex")) ) (sd-deffeature 'TAPPED-HOLE ; Feature Identification attributes :library 'CoCreate :revision 7.1 :description "Simple Tapped Hole Feature demonstration" :feature-type :geometric ; Feature Behavior attributes :on-copy :copy :on-merge :maintain :on-split :copy :on-xform :maintain :on-invalidate :maintain :filing '(:sd-file :mi-file :vrml-file :annotator) :warning :none :save-variables :all :owner-variable 'OWNER :constructor '(let ((curr-part (sd-inq-curr-part)) relax-pnt normal name) (block construct (setq relax-pnt (sd-proj-pnt-on-face (first CENTER_PT) (second CENTER_PT) :source-space :global)) (unless relax-pnt (return-from construct nil)) (setq normal (sd-inq-face-pnt (first CENTER_PT) :u (sd-face-relax-pnt-u relax-pnt) :v (sd-face-relax-pnt-v relax-pnt) :normal t :dest-space :global)) (setq normal (getf normal :normal)) (sd-call-cmds (create_workplane :new :pt_dir :origin (second CENTER_PT) :normal normal)) (sd-call-cmds(CIRCLE :CEN_RAD 0,0 (/ DIA 2.0))) (setq name (format nil "/~A" (sd-gen-obj-basename :part))) (sd-call-cmds (extrude :sel_part name :distance DEPTH :reverse :keep_wp :no)) (sd-call-cmds (subtract_3d :blanks (sd-inq-parent-obj (first CENTER_PT)) :tools name :keep_tool :no)) (sd-call-cmds (current_part curr-part)) ) ) :destructor NIL ; use the default == destroy feat :ok-action NIL ; nothing to be done :verifier NIL ; default - always true ; Feature Appearance attributes :category "/Mfg/Machining" :src-location "goodies/example_features" :pixmap "personality/pixmaps/tapped_hole.pm" :name-str `(format nil "M~Ax~A ~A" DIA DEPTH "Unc") ; sd-defdialog attributes :start-variable 'CENTER_PT :after-initialization '(sd-set-range 'DIA '(10.0 12.0 14.0 20.0)) :dialog-title "Simple Tapped-Hole" ; Create, Modify, Copy, Delete get added :variables '((CENTER_PT :value-type :face :incl-position :3d :modifies :contents :multiple-items nil :title "Center Pt" :after-input (setq OWNER (sd-inq-parent-obj (first CENTER_PT))) :prompt-text "Pick Center Pt.") (OWNER :value-type :part :toggle-type :invisible :modifies :contents :initial-value nil) (DIA :range (10.0 12.0 14.0 20.0) :display-units :length :title "Diameter" :initial-value 20.0 :prompt-text "Enter Diameter") (SPECIFICATION :value-type :url :initial-value "http://www.spiralock.com/sl-info.htm" :toggle-type :invisible) (DEPTH :value-type :positive-length :prompt-text "Specify Depth of tapped hole." :check-function check-depth :confirmation (:max-depth-exceeded :dialog :warning :prompt "Specified Depth Exceed 2 times Dia., tool breakage is more likely" :severity :medium :top-label "Tapped Hole Advisor") :initial-value 10)) :local-functions '((check-depth(depth) (cond ((> depth (* 2.0 DIA)) :max-depth-exceeded) ((< depth (/ DIA 4.0)) (values :error "Specified Depth is too shallow for tapping operation")) (t :ok))) ) ) ;WG_tap.lsp ;This program drills a clearance hole into the current part using the current ; work plane and a table as standard tap sizes. It uses the current wp ;as the normal direction and drill depth and tap depth can be changed after ;tap is selected to suit. It then changes the tapped cylinder face to white ;so that it is easily identified. ;Two things that could be improved on is the next key sometimes doesn't change ;the work plane back and it would be nice to be able to label the face and ;be able to select the face to see what the tap size was. (defvar *tapped-face-color* 1.0,1.0,1.0) ;;----- Logical Table --------------------------------------------------------- ;; NOTE: :std_tap_clearance is approximately equal to (6 * thread pitch) (sd-create-logical-table "wg_Threaded_Holes" :columns '(:tap_units :Tap :drill_rad :tap_rad :cham_rad :std_tap_clearance) :columnNames '("Tap Units" "Tap Size" "Drill Rad" "Tap Rad" "Chamfer Rad" "Std Tap Clearance") :types '(:string :string :length :length :length :length) :units '(nil nil :mm :mm :mm :mm) :contents '( ("inch" "#4-40" (0.0445 :inch) (0.056 :inch) (0.0675 :inch) (0.15 :inch)) ("inch" "#5-40" (0.05075 :inch) (0.0625 :inch) (0.074 :inch) (0.15 :inch)) ("inch" "#6-32" (0.05325 :inch) (0.069 :inch) (0.08325 :inch) (0.188 :inch)) ("inch" "#8-32" (0.068 :inch) (0.082 :inch) (0.09625 :inch) (0.188 :inch)) ("inch" "#10-24" (0.0735 :inch) (0.095 :inch) (0.11425 :inch) (0.25 :inch)) ("inch" "#10-32" (0.0795 :inch) (0.095 :inch) (0.10925 :inch) (0.188 :inch)) ("inch" "#12-24" (0.0885 :inch) (0.108 :inch) (0.12725 :inch) (0.25 :inch)) ("inch" "#12-28" (0.09 :inch) (0.108 :inch) (0.12725 :inch) (0.215 :inch)) ("inch" "1/4-20" (0.1005 :inch) (0.125 :inch) (0.148 :inch) (0.300 :inch)) ("inch" "1/4-28" (0.1065 :inch) (0.125 :inch) (0.14125 :inch) (0.215 :inch)) ("inch" "5/16-18" (0.1285 :inch) (0.15625 :inch) (0.1815 :inch) (0.333 :inch)) ("inch" "5/16-24" (0.132 :inch) (0.15625 :inch) (0.17525 :inch) (0.25 :inch)) ("inch" "3/8-16" (0.15625 :inch) (0.1875 :inch) (0.216 :inch) (0.375 :inch)) ("inch" "3/8-24" (0.166 :inch) (0.1875 :inch) (0.20675 :inch) (0.25 :inch)) ("inch" "7/16-14" (0.184 :inch) (0.21875 :inch) (0.2515 :inch) (0.429 :inch)) ("inch" "7/16-20" (0.1953 :inch) (0.21875 :inch) (0.2415 :inch) (0.300 :inch)) ("inch" "1/2-13" (0.21095 :inch) (0.25 :inch) (0.2855 :inch) (0.462 :inch)) ("inch" "1/2-20" (0.2265 :inch) (0.25 :inch) (0.273 :inch) (0.300 :inch)) ("inch" "9/16-12" (0.2422 :inch) (0.28125 :inch) (0.3195 :inch) (0.500 :inch)) ("inch" "9/16-18" (0.2578 :inch) (0.28125 :inch) (0.3065 :inch) (0.333 :inch)) ("inch" "5/8-11" (0.2656 :inch) (0.3125 :inch) (0.3545 :inch) (0.546 :inch)) ("inch" "5/8-18" (0.28905 :inch) (0.3125 :inch) (0.338 :inch) (0.333 :inch)) ("inch" "3/4-10" (0.3281 :inch) (0.375 :inch) (0.421 :inch) (0.600 :inch)) ("inch" "3/4-16" (0.34375 :inch) (0.375 :inch) (0.4035 :inch) (0.375 :inch)) ("inch" "7/8-9" (0.3828 :inch) (0.4375 :inch) (0.4885 :inch) (0.667 :inch)) ("inch" "7/8-14" (0.40625 :inch) (0.4375 :inch) (0.4705 :inch) (0.429 :inch)) ("inch" "1-8" (0.4375 :inch) (0.5 :inch) (0.5575 :inch) (0.750 :inch)) ("inch" "1-12" (0.46095 :inch) (0.5 :inch) (0.5375 :inch) (0.500 :inch)) ("metric" "3-.5" 1.25 1.5 1.7 3.0) ("metric" "4-.7" 1.65 2.0 2.315 4.2) ("metric" "5-.8" 2.1 2.5 2.86 4.8) ("metric" "6-1" 2.5 3.0 3.45 5) ("metric" "8-1.25" 3.4 4.0 4.5625 7.5) ("metric" "10-1.5" 4.25 5.0 5.675 9) ("metric" "12-1.75" 5.1 6.0 6.7875 10.5) ("metric" "16-2" 7.0 8.0 8.9 12.0) ) ) ;;----- Display Table --------------------------------------------------------- (sd-create-display-table "wg_Threaded_Holes" :tableTitle "WG Threaded Holes" :logicalTable "wg_Threaded_Holes" :columns '(:tap_units :Tap) :filterStatusLine nil :applyColumns '(:Tap) :selectionMode :single-row :applyAction :default-tokens ) (defun wg-show-tap-table (tap_units &rest args) (declare (ignore args)) (sd-filter-display-table "wg_Threaded_Holes" :column :tap_units :test1 :equal :value1 tap_units) (sd-show-display-table "wg_Threaded_Holes" :position '("WG_LIBRARY_FEATURE_TAP-OPTIONS-OPT-CONT-TAP-TB" :lefttop ) ) ) (defun wg-hide-tap-table () (sd-hide-display-table "wg_Threaded_Holes" :ignorePin t)) (defun tap_hole (&key drill-radius drill-depth drill-point parts &aux mlt) (setq mlt (/ drill-radius (sin (/ drill-point 2))) ) (if (eql 0.0 drill-depth) (POLYGON 0.0,0.0 (gpnt2d 0.0 drill-radius) (gpnt2d (+ drill-depth (* mlt (cos (/ drill-point 2)))) 0.0) :close) (POLYGON 0.0,0.0 (gpnt2d 0.0 drill-radius) (gpnt2d drill-depth drill-radius) (gpnt2d (+ drill-depth (* mlt (cos (/ drill-point 2)))) 0.0) :close)) (BORE :parts parts :axis :u :rotation_angle (* 2 pi) :keep_wp :yes) (delete_2d :all_2d) ) (sd-deffeature 'feature_tap ; Feature identification attributes :library 'WG_library :revision 7.1 :description "Comples Tapped hole example" :feature-type :geometric :name-str "Tapping" ; Feature behavior attributes :on-split :copy :on-merge :maintain :on-xform :maintain :on-copy :copy :on-invalidate :maintain :attachment :contents :filing '(:sd-file :mi-file :vrml-file) :warning '(:invalidate :conflict) :constructor '(make_drillhole) :owner-variable 'A_PART :save-variables :all :start-variable 'SEL_FACE ; Feature appearance attributes :category '("/Documentation" "/Mfg/Machining") :src-location "goodies/example_features" ; :pixmap NIL :label-str '(format nil "TAPPED HOLE~%Drill ~a Dia Hole to depth ~a~% ~a to depth ~a" (sd-num-to-string (sd-sys-to-user-units :length (* 2 drill_rad)) 3) (sd-num-to-string (sd-sys-to-user-units :length drill-depth) 3) tap (sd-num-to-string (sd-sys-to-user-units :length tap-depth) 3)) ; SD-DEFDIALOG attributes :dialog-title "Tap Hole" :variables '( (do_next_action :initial-value t) (tap_rad :initial-value 0.0) (drill_rad :initial-value 0.0) (cham_rad :initial-value nil) (curr_wp :initial-value (sd-inq-curr-wp)) (temp :initial-value nil) (A_PART :value-type :part :toggle-type :invisible :modifies :contents :intial-value nil) (SEL_FACE :value-type :face :incl-position :3d :title "CenterPt" :modifies :contents :prompt-text "Select the face you to put the tapped hole." :after-input (setq do_next_action t A_PART (sd-inq-parent-obj (first SEL_FACE))) ) (tap_units :before-input '(setq temp tap_units) :range ("inch" "metric") :after-input '(if (not (equal temp tap_units)) (setq Tap nil Tap-Depth nil Drill-Depth nil) ) ) (Tap :value-type :string :prompt-text "Specify Tap Type" :show-input-tool (wg-show-tap-table tap_units) :hide-input-tool (wg-hide-tap-table) :after-input (let (tap_clear Table_values) (setq do_next_action t Table_values (sd-read-logical-table-row "wg_Threaded_Holes" :pList `(:Tap ,tap) :units :internal ) tap_rad (getf Table_values :tap_rad) drill_rad (getf Table_values :drill_rad) cham_rad (getf Table_values :cham_rad) tap_clear (getf Table_values :std_tap_clearance) tap-depth (* 4 tap_rad) drill-depth (+ tap-depth tap_clear) ) ) ) (Tap-Depth :value-type :length :prompt-text "Specify Minimum tap depth" :after-input (progn (setq do_next_action t) (if (> Tap-depth Drill-Depth) (setq Drill-Depth nil) ) ) ) (Drill-Depth :value-type :length :prompt-text "Specify Drill Depth" :after-input (progn (setq do_next_action t) (if (< Drill-Depth Tap-depth) (setq Tap-Depth nil) ) ) ) ;(Next ; :push-action (make_drillhole) ;) ) :local-functions '((make_drillhole () (let ((wp-origin (second SEL_FACE)) (owner (sd-inq-parent-obj (first SEL_FACE))) (relax-pnt (sd-proj-pnt-on-face (first SEL_FACE) (second SEL_FACE) :source-space :global)) normal ) (unless relax-pnt (sd-display-error "There is no material to tap at that location") (return-from make_drillhole nil) ) (setq normal (getf (sd-inq-face-pnt (first SEL_FACE) :u (sd-face-relax-pnt-u relax-pnt) :v (sd-face-relax-pnt-v relax-pnt) :normal t :dest-space :global) :normal)) (sd-call-cmds (progn (CREATE_WORKPLANE :new :pt_dir :origin wp-origin :normal normal) ;; Rotate workplane about 90 degrees (position_wp :current :rotate :axis :ref_wp :current :v :rotation_angle (/ pi 2)) ;; Bore the pilot hole (tap_hole :drill-radius drill_rad :drill-depth drill-depth :drill-point (/ (* pi 118) 180) :parts a_part) ;; Bore the tap hole (tap_hole :drill-radius tap_rad :drill-depth tap-depth :drill-point pi :parts a_part) ;; Changed color of the tapped face(s) to white ; (dolist (face facelist) ; (SET_FACE_COLOR face :rgb *tapped-face-color*) ; (sd-attach-item-attribute face "WG-THD" :values (list :tap tap)) ; ) ;; Bore the chamfer (tap_hole :drill-radius cham_rad :drill-depth 0.0 :drill-point (/ pi 2) :parts a_part) ;; Delete the temporary workplane used for the bores (delete_3d (sd-inq-curr-wp)) (if curr_wp (CURRENT_WP curr_wp)) )) (setq do_next_action t) owner ) ) (cleanup () (sd-call-cmds (progn (if curr_wp (CURRENT_WP curr_wp)) ) ) ) ) :ok-action '(if do_next_action (let ((facelist (sd-call-cmds (get_selection :focus_type *sd-cylinder-seltype* :select :by_feature (sd-active-cust-feat)))) (tmp-rad 0) f cylinder nr) (dolist (face facelist) (setq cylinder (sd-inq-geo-props face)) (setq nr (sd-cylinder-radius cylinder)) (when (> nr tmp-rad) (setq tmp-rad nr) (setq f face))) (when f (sd-call-cmds (SET_FACE_COLOR f :rgb *tapped-face-color*))) (display :hide) ;(make_drillhole) ;(cleanup) ) ) :cancel-action '(cleanup) ) (sd-defdialog 'verify_cust_feat :dialog-title "Re-validate" :dialog-control :sequential :variables '( (FEAT :value-type :feature :prompt-test "Select a Design Info to validate" :check-function #'(lambda(feat) (cust_feat::check-modify feat :any)) )) :ok-action '(let ((dialog (cust_feat::load-feature-def-if-needed FEAT)) verifier ) (unless dialog (sd-display-error "Can not validate a DesignInfo without access to its definition") (sd-return-from-ok-action)) (setq verifier (get dialog :verifier)) (if verifier (cust_feat:prim-set-cust-feat-validity (elan::sel_item-item feat) (cust_feat::verify-feat feat verifier)) (cust_feat:prim-set-cust-feat-validity :unknown)) ) ) ;;