;;--------------------------------------------------------------------------* ;; Copyright 1999 DC4 Technisches Büro GmbH * ;; * ;;--------------------------------------------------------------------------* ;; Dateiname: feder.lsp ;; Version : 1.0 ;; Datum : 18.11.2002 ;; Author : Gt ;;--------------------------------------------------------------------------* ;; Modulbeschreibung: Zeichnen von Federn * ;; * ;; * ;; * ;;--------------------------------------------------------------------------* ;;--------------------------------------------------------------------------* ;; in-packages * ;;--------------------------------------------------------------------------* (in-package :custom) ;;--------------------------------------------------------------------------* ;; use-packages * ;;--------------------------------------------------------------------------* (use-package :OLI) (use-package :ELAN-UI) ;;--------------------------------------------------------------------------* ;; export * ;;--------------------------------------------------------------------------* ;;--------------------------------------------------------------------------* ;; global variables * ;;--------------------------------------------------------------------------* ;;*************************************************************************** ;; DIALOGS * ;;*************************************************************************** ;; Fragt die Druckfeder-Abmessungen ab und ruft das Erzeugen auf ;; (sd-defdialog 'dc4-druckfeder-dialog :dialog-title "Druckfeder" :dialog-type :terminate :variables '( ("Material") (mat :range ((81400 :label "Stahl") (71600 :label "Nirosta")) :title "Material" :after-input (after-mat-action) ) ("Abmessungen") (md :value-type :positive-length :prompt-text "Mittleren Windungsdurchmesser angeben" :title "Mittl.Durchm." :after-input (after-md-action) ) (dd :value-type :positive-length :prompt-text " Drahtdurchmesser angeben" :title "Draht-Dm." :after-input (after-dd-action) ) (win :value-type :positive-number :prompt-text " Windungsanzahl angeben" :title "Windungen" :after-input (after-win-action) ) (frate :value-type :positive-number :prompt-text " Federrate angeben" :title "Federrate" :after-input (after-frate-action) ) (len0 :value-type :positive-number :prompt-text " Unbelastete Laenge angeben" :title "Laenge" :after-input (after-len0-action) ) (del :push-action (progn (setf md nil) (setf dd nil) (setf win nil) (setf frate nil) (setf len0 nil) (setf kraft nil)) :title "Loeschen" ) ("Einbau") (bgr :value-type :assembly :prompt-text "Baugruppe angeben" :title "Baugruppe" ) (stp :value-type :point-3d :prompt-text "Startpunkt angeben" :title "Startp." ) (rcht :value-type :measure-direction :prompt-text "Richtung angeben" :title "Richtung" ) (len :value-type :positive-number :prompt-text " Einbaulaenge angeben" :title "Einb.laenge" :after-input (after-len-action) ) (kraft :value-type :display-only :title "Kraft" ) (lab :value-type :boolean :toggle-type :wide-toggle :initial-value t :title "Beschriftung" ) ) :local-functions '((after-mat-action () (let () (cond ((and md dd win) (setf frate (/ (* (expt dd 4) mat) (expt md 3) 8 win)) );; ((and md dd frate) (setf win (/ (* (expt dd 4) mat) (expt md 3) frate 8)) );; ((and md win frate) (setf dd (expt (/ (* (expt md 3) win 8 frate) mat) .25)) );; ((and dd win frate) (setf md (expt (/ (* (expt dd 4) mat) frate win 8) (/ 1 3))) );; );;cond (if (and frate len0 len) (setf kraft (* (- len0 len) frate)) nil) );;let );;mat (after-md-action () (let () (cond ((and mat dd win) (setf frate (/ (* (expt dd 4) mat) (expt md 3) 8 win)) );; ((and mat dd frate) (setf win (/ (* (expt dd 4) mat) (expt md 3) frate 8)) );; ((and mat win frate) (setf dd (expt (/ (* (expt md 3) win 8 frate) mat) .25)) );; );;cond (if (and frate len0 len) (setf kraft (* (- len0 len) frate)) nil) );;let );;md (after-dd-action () (let () (cond ((and mat md win) (setf frate (/ (* (expt dd 4) mat) (expt md 3) 8 win)) );; ((and mat md frate) (setf win (/ (* (expt dd 4) mat) (expt md 3) frate 8)) );; ((and mat win frate) (setf md (expt (/ (* (expt dd 4) mat) frate win 8) (/ 1 3))) );; );;cond (if (and frate len0 len) (setf kraft (* (- len0 len) frate)) nil) );;let );;dd (after-win-action () (let () (cond ((and mat md dd) (setf frate (/ (* (expt dd 4) mat) (expt md 3) 8 win)) );; ((and mat md frate) (setf dd (expt (/ (* (expt md 3) win 8 frate) mat) .25)) );; ((and mat dd frate) (setf md (expt (/ (* (expt dd 4) mat) frate win 8) (/ 1 3))) );; );;cond (if (and frate len0 len) (setf kraft (* (- len0 len) frate)) nil) );;let );;win (after-frate-action () (let () (cond ((and mat md dd) (setf win (/ (* (expt dd 4) mat) (expt md 3) frate 8)) );; ((and mat md win) (setf dd (expt (/ (* (expt md 3) win 8 frate) mat) .25)) );; ((and mat dd win) (setf md (expt (/ (* (expt dd 4) mat) frate win 8) (/ 1 3))) );; );;cond (if (and frate len0 len) (setf kraft (* (- len0 len) frate)) nil) );;let );;frate (after-len0-action () (let () (if (and frate len0 len) (setf kraft (* (- len0 len) frate)) nil) );;let );;len0 (after-len-action () (let () (if (and frate len0 len) (setf kraft (* (- len0 len) frate)) nil) );;let );;len ) :ok-action-precondition '(dc4-druckfeder-pruefe md dd win len0 len) :ok-action '( sd-call-cmds (dc4-druckfeder-zeichne stp rcht bgr md dd win len0 len mat lab kraft) ) ) ;; Fragt die Zugfeder-Abmessungen ab und ruft das Erzeugen auf ;; (sd-defdialog 'dc4-zugfeder-dialog :dialog-title "Zugfeder" :dialog-type :terminate :variables '( ("Material") (mat :range ((81400 :label "Stahl") (71600 :label "Nirosta")) :title "Material" :after-input (after-mat-action) ) ("Abmessungen") (md :value-type :positive-length :prompt-text "Mittleren Windungsdurchmesser angeben" :title "Mittl.Durchm." :after-input (after-md-action) ) (dd :value-type :positive-length :prompt-text " Drahtdurchmesser angeben" :title "Draht-Dm." :after-input (after-dd-action) ) (win :value-type :positive-number :prompt-text " Windungsanzahl angeben" :title "Windungen" :after-input (after-win-action) ) (frate :value-type :positive-number :prompt-text " Federrate angeben" :title "Federrate" :after-input (after-frate-action) ) (kraft0 :value-type :number :prompt-text " Vorspannung angeben" :title "Vorspannung" :initial-value 0 :after-input (after-kraft0-action) ) (len0 :value-type :display-only :title "Laenge" ) (del :push-action (progn (setf md nil) (setf dd nil) (setf win nil) (setf frate nil) (setf kraft0 0) (setf len0 nil) (setf kraft nil)) :title "Loeschen" ) ("Einbau") (bgr :value-type :assembly :prompt-text "Baugruppe angeben" :title "Baugruppe" ) (stp :value-type :point-3d :prompt-text "Startpunkt angeben" :title "Startp." ) (rcht :value-type :measure-direction :prompt-text "Richtung der Federachse angeben" :title "Richtung" ) (oese :value-type :measure-direction :prompt-text "Richtung der ersten Oese angeben" :title "1. Oese" ) (len :value-type :positive-number :prompt-text " Einbaulaenge angeben" :title "Einb.laenge" :after-input (after-len-action) ) (kraft :value-type :display-only :title "Kraft" ) (lab :value-type :boolean :toggle-type :wide-toggle :initial-value t :title "Beschriftung" ) ) :local-functions '((after-mat-action () (let () (cond ((and md dd win) (setf frate (/ (* (expt dd 4) mat) (expt md 3) 8 win)) );; ((and md dd frate) (setf win (/ (* (expt dd 4) mat) (expt md 3) frate 8)) );; ((and md win frate) (setf dd (expt (/ (* (expt md 3) win 8 frate) mat) .25)) );; ((and dd win frate) (setf md (expt (/ (* (expt dd 4) mat) frate win 8) (/ 1 3))) );; );;cond (if (and frate len0 len) (setf kraft (+ kraft0 (* (- len len0) frate))) nil) );;let );;mat (after-md-action () (let () (cond ((and mat dd win) (setf frate (/ (* (expt dd 4) mat) (expt md 3) 8 win)) );; ((and mat dd frate) (setf win (/ (* (expt dd 4) mat) (expt md 3) frate 8)) );; ((and mat win frate) (setf dd (expt (/ (* (expt md 3) win 8 frate) mat) .25)) );; );;cond (if (and md dd win) (setf len0 (+ (* dd win) (* 2 (- md dd)) dd)) nil) (if (and frate len0 len) (setf kraft (+ kraft0 (* (- len len0) frate))) nil) );;let );;md (after-dd-action () (let () (cond ((and mat md win) (setf frate (/ (* (expt dd 4) mat) (expt md 3) 8 win)) );; ((and mat md frate) (setf win (/ (* (expt dd 4) mat) (expt md 3) frate 8)) );; ((and mat win frate) (setf md (expt (/ (* (expt dd 4) mat) frate win 8) (/ 1 3))) );; );;cond (if (and md dd win) (setf len0 (+ (* dd win) (* 2 (- md dd)) dd)) nil) (if (and frate len0 len) (setf kraft (+ kraft0 (* (- len len0) frate))) nil) );;let );;dd (after-win-action () (let () (cond ((and mat md dd) (setf frate (/ (* (expt dd 4) mat) (expt md 3) 8 win)) );; ((and mat md frate) (setf dd (expt (/ (* (expt md 3) win 8 frate) mat) .25)) );; ((and mat dd frate) (setf md (expt (/ (* (expt dd 4) mat) frate win 8) (/ 1 3))) );; );;cond (if (and md dd win) (setf len0 (+ (* dd win) (* 2 (- md dd)) dd)) nil) (if (and frate len0 len) (setf kraft (+ kraft0 (* (- len len0) frate))) nil) );;let );;win (after-frate-action () (let () (cond ((and mat md dd) (setf win (/ (* (expt dd 4) mat) (expt md 3) frate 8)) );; ((and mat md win) (setf dd (expt (/ (* (expt md 3) win 8 frate) mat) .25)) );; ((and mat dd win) (setf md (expt (/ (* (expt dd 4) mat) frate win 8) (/ 1 3))) );; );;cond (if (and md dd win) (setf len0 (+ (* dd win) (* 2 (- md dd)) dd)) nil) (if (and frate len0 len) (setf kraft (+ kraft0 (* (- len len0) frate))) nil) );;let );;frate (after-kraft0-action () (let () (if (and frate len0 len) (setf kraft (+ kraft0 (* (- len len0) frate))) nil) );;let );;kraft0 (after-len0-action () (let () (if (and frate len0 len) (setf kraft (+ kraft0 (* (- len len0) frate))) nil) );;let );;len0 (after-len-action () (let () (if (and frate len0 len) (setf kraft (+ kraft0 (* (- len len0) frate))) nil) );;let );;len ) :ok-action-precondition '(dc4-zugfeder-pruefe md dd win len) :ok-action '( sd-call-cmds (dc4-zugfeder-zeichne stp rcht oese bgr md dd win len mat lab kraft) ) ) ;;*************************************************************************** ;; FUNCTIONS * ;;*************************************************************************** ;; Ueberpruft die Eingaben fuer Druckfeder auf Machbarkeit ;; (defun dc4-druckfeder-pruefe (durchmesser draht_durchmesser windungen nullaenge einbaulaenge) (if (and durchmesser draht_durchmesser windungen nullaenge einbaulaenge) (if (and (> durchmesser draht_durchmesser) (> einbaulaenge (* (+ 3.03 windungen) draht_durchmesser)) (<= einbaulaenge nullaenge)) :default (values :error "Feder nicht real herstellbar!") );;if :default );;if ) ;; Ueberpruft die Eingaben fuer Zugfeder auf Machbarkeit ;; (defun dc4-zugfeder-pruefe (durchmesser draht_durchmesser windungen einbaulaenge) (if (and durchmesser draht_durchmesser windungen einbaulaenge) (if (and (> durchmesser (* 2 draht_durchmesser)) (> (/ (+ (- einbaulaenge (* 2 durchmesser)) draht_durchmesser) windungen) draht_durchmesser)) :default (values :error "Feder nicht real herstellbar!") );;if :default );;if ) ;; Erzeugt eine Druckfeder mit Kreisquerschnitt vom Mittelpunkt der ersten Endflaeche mit gegebener Richtung und Einbaulaenge ;; (defun dc4-druckfeder-zeichne (startpunkt richtung baugruppe durchmesser draht_durchmesser windungen nullaenge einbaulaenge mat label kraft) (let (rad drad offset lkorp stg p1 p2 p3 p4 p5 p6 wink bgr bez bestbez tnam akt_wp txt) (setf rad (/ durchmesser 2)) ;; Windungsradius (setf drad (/ draht_durchmesser 2)) ;; Drahtradius (setf offset (* 1.5 1.01 draht_durchmesser)) ;; Verschiebung (setf lkorp (- einbaulaenge (* 3.03 draht_durchmesser))) ;; Laenge des Federkoerpers (setf stg (/ lkorp windungen)) ;; Steigung (setf p1 (make-gpnt2d :x offset :y rad)) (setf p2 (make-gpnt2d :x (+ offset lkorp) :y rad)) (setf p3 (make-gpnt2d :x 0 :y (+ rad draht_durchmesser))) (setf p4 (make-gpnt2d :x (* -1 draht_durchmesser) :y (* -1 (+ rad draht_durchmesser)))) (setf p5 (make-gpnt2d :x einbaulaenge :y (+ rad draht_durchmesser))) (setf p6 (make-gpnt2d :x (+ einbaulaenge draht_durchmesser) :y (* -1 (+ rad draht_durchmesser)))) (setf wink (* 360 (- windungen (truncate windungen)))) ;; Verdrehung Federende (setf bgr (sd-inq-obj-pathname Baugruppe)) ;; Baugruppenbezeichnung (setf bez "Druckfeder") (setf bestbez (format nil "Ö~axÖ~a_~aWin_~alang" (sd-num-to-string durchmesser) (sd-num-to-string draht_durchmesser) (sd-num-to-string windungen) (sd-num-to-string nullaenge))) ;; Teilename (setf tnam (format nil "~a_~a" bez bestbez)) ;; Teilename (setf akt_wp (sd-inq-curr-wp)) ;; aktuelle Arbeitsebene (setf txt (format nil "F=~4,2,,,'0FN" kraft)) (create_part :owner bgr) (change_pa_id (sd-inq-obj-pathname (sd-inq-curr-part)) tnam) (create_workplane :new) (GEOMETRY_MODE :REAL) (position_wp :current :pt_dir :origin startpunkt :normal (car richtung)) (position_wp :current :rotate :axis :v :rotation_angle (/ (* pi -90) 180)) (circle :cen_rad p1 drad) ;; WindungsQuerschnitt (ELAN-UI::helix_add :axis :u :pitch stg :turns windungen) ;; Federkoerper wickeln (ELAN-UI::helix_add :axis :neg_u :pitch (* 1.01 draht_durchmesser) :turns 1.9) ;; Angelegte Windungen Anfang (delete_2d :all_2d) (if (> wink 0) (position_wp :current :rotate :axis :u :rotation_angle (/ (* pi wink) 180)) nil) ;; Ebene fuer Federende drehen (circle :cen_rad p2 drad) ;; Querschnitt fuer Federende (ELAN-UI::helix_add :axis :u :pitch (* 1.01 draht_durchmesser) :turns 1.9) ;; Angelegte Windungen Ende (delete_2d :all_2d) (rectangle p3 p4 p5 p6) (punch :keep_wp :no) ;; Enden abflachen (if label (cocreate_3d_note :action :create :note txt :items (sd-inq-curr-part)) nil );;if (if akt_wp (current_wp akt_wp) nil) );; end_let ) ;; Erzeugt eine Zugfeder am Startpunkt eingehängt mit gegebener Richtung und Einbaulaenge ;; (defun dc4-zugfeder-zeichne (startpunkt richtung oese baugruppe durchmesser draht_durchmesser windungen einbaulaenge mat label kraft) (let (rad hrad drad offset aug1 aug2 lkorp stg p1 p2 p3 wink bgr bez bestbez tnam akt_wp txt) (setf rad (/ durchmesser 2)) ;; Windungsradius (setf hrad (/ rad 2)) ;; Halber Windungsradius (setf drad (/ draht_durchmesser 2)) ;; Drahtradius (setf offset (- durchmesser drad)) ;; Verschiebung (setf aug1 (+ offset (* rad (- 0 1)))) ;; Achse fuer erstes Auge (setf lkorp (+ (- einbaulaenge (* 2 durchmesser)) draht_durchmesser)) ;; Laenge des Federkoerpers (setf stg (/ lkorp windungen)) ;; Steigung (setf aug2 (+ lkorp rad offset)) ;; Achse fuer zweites Auge (setf p1 (make-gpnt2d :x offset :y rad)) (setf p2 (make-gpnt2d :x offset :y 0)) (setf p3 (make-gpnt2d :x (+ offset lkorp) :y 0)) (setf wink (* 360 (- windungen (truncate windungen)))) ;; Verdrehung zweites Auge (setf bgr (sd-inq-obj-pathname Baugruppe)) ;; Baugruppenbezeichnung (setf bez "Zugfeder") (setf bestbez (format nil "Ö~axÖ~a_~aWin" (sd-num-to-string durchmesser) (sd-num-to-string draht_durchmesser) (sd-num-to-string windungen))) ;; Teilename (setf tnam (format nil "~a_~a" bez bestbez)) ;; Teilename (setf akt_wp (sd-inq-curr-wp)) ;; aktuelle Arbeitsebene (setf txt (format nil "F=~4,2,,,'0FN" kraft)) (create_part :owner bgr) (change_pa_id (sd-inq-obj-pathname (sd-inq-curr-part)) tnam) (create_workplane :new) (GEOMETRY_MODE :REAL) (position_wp :current :pt_dir :origin startpunkt :normal (car richtung) :u_dir (car oese)) (position_wp :current :rotate :axis :v :rotation_angle (/ (* pi -90) 180)) (position_wp :current :rotate :axis :u :rotation_angle (/ (* pi -90) 180)) (circle :cen_rad p1 drad) ;; WindungsQuerschnitt (ELAN-UI::helix_add :axis :u :pitch stg :turns windungen) ;; Federkoerper wickeln (turn :axis :horiz hrad :rotation_angle (/ (* pi -180) 180) :keep_profile :no) ;; Erstes Ende abbiegen (circle :cen_rad p2 drad) ;; Querschnitt fuer erstes Auge (turn :axis :vert aug1 :rotation_angle (/ (* pi -315) 180) :keep_profile :no) ;; Erstes Auge wickeln (if (> wink 0) (uic_rotate_wp_on_axis :U (/ (* pi wink) 180) :current) nil) ;; Ebene fuer zweites Auge drehen (circle :cen_rad p3 drad) ;; Querschnitt fuer zweites Auge (turn :axis :horiz hrad :rotation_angle (/ (* pi -180) 180)) ;; Zweites Ende abbiegen (turn :axis :vert aug2 :rotation_angle (/ (* pi -315) 180) :keep_wp :no) ;; Zweites Auge wickeln (if label (cocreate_3d_note :action :create :note txt :items (sd-inq-curr-part)) nil );;if (if akt_wp (current_wp akt_wp) nil) );; end_let )