;zahn.lsp ; Diese Lisproutine zeichnet einen Evolventenzahnkranz auf dem Layer "ZR" als ; Polylinie, dessen Mittelpunkt dem Einfgepunkt entspricht. Der Teilkreis ; und das Zentrumkreuz werden auf dem Layer "MITTE" (sofern vorhanden) ; erzeugt. ; Es werden die Anzahl der Z„hne, das Modul, der Eingriffwinkel, das Kopfspiel ; und die Zahnfuárundung abgefragt. ; Die Vorgaben in den Abfragen k”nnen leicht eigenen Bedrfnissen angepasst ; werden. Hierzu sind die entsprechenden "cond"-Anweisungen (direkt nach dem ; jeweiligen Abfragebefehl) zu editieren. Beispiel: In der Abfrage zum ; Kopfspiel wird in der ihr folgenden Zeile ; "(cond ((null c) (setq c (* 0.25 m))))" die Zahl 0.25 durch den neuen ; Standardwert als Faktor fr das Modul m ersetzt. Desgleichen in der ; entsprechenden Abfrage selbst. ; Die Genauigkeit bei der Konstruktion der Evolvente fr die Zahnflanke bildet ; den Winkel (N-ten Teil von 15 Grad), mit dem die Eingrifflinie auf dem ; Grundkreis abgerollt wird . ;------------------------------------------------------------------------------ ;Eingabefehlerbehandlung (defun Fehler () (textscr) (princ "\n\n Fehler - Funktion abgebrochen") (princ "\n Eingriffwinkel oder Fuárundung zu groá\n") (command "layer" "se" lay "") ;alten Layer setzen (setvar "blipmode" sblip) ;Rcksetzen der Systemvariablen (setvar "cmdecho" scmde) (quit) (princ) ) ;------------------------------------------------------------------------------ (defun Fussrund1 (rhof rf winfu) ;inv_phie definieren, da dieser Wert bei der Berechnung der rechten ;Zahnflanke herangezogen wird, und sich wegen der Fallunterscheidung ;(re < rb) vom Wert aus 'Fussrund2' (re > rb) unterscheidet. (setq inv_phie 0.0) ;sinrhofs = sin des Startwinkels winrhof der Fußrundung (s. trigon. Formeln) (setq sinrhofs (/ rhof (+ rhof rf))) ;winrhof = tan des Startwinkels der Fußrundung = Bogenlänge der Fußrundung ;= Winkel im Bogenmaß. (sinx/cosx=tanx, mit cosx=sqrt(1-sinýx)) ;winrhof wird vom Winkel 0 aus in negativer Richtung abgetragen. ;---> (- (...)) (setq winrhof (- (/ sinrhofs (sqrt (- 1 (* sinrhofs sinrhofs)))))) ;Radius re vom Einfügepunkt mp zum Endpunkt des Fußrundungbogens an der ;Tangente zur Evolvente. (Das Ende des Fußrundungsbogens wird mit dem ;Startpunkt der Evolvente auf dem Grundkreis verbunden) (setq re (sqrt (- (* (+ rhof rf) (+ rhof rf)) (* rhof rhof)))) ;Definition der zu verbindenden Punkte (unterschiedlich zu Fussrund2): (setq p1 (polar mp winfu rf)) ;Start Fußkreisbogen (setq p2 (polar mp winrhof rf)) ;Start Fußrundung (setq p3 (polar mp 0 re)) ;Start Tangente zur Evolvente am Grundkreis (setq p4 (polar mp 0 rb)) ;Start Evolvente vom Grundkreis, da ;der Fußkreis kleiner als ;der Grundkreis ist. ;Zeichnen von Fußkreisbogen (=Kreis "k" mit Mittelpunkt "m" in mp von p1-p2), ;Fußrundungsbogen (Kreis "k" zwischen zwei Punkten p2-p3 und ;Linie "l" nach p4, als Polylinie. (command "_pline" p1 "_ARC" "_CE" mp p2 p3 "_Line" p4) );Ende Fussrund1 ;------------------------------------------------------------------------------ (defun Fussrund2 (rhof rf rb winfu) ;Es wird der Start- und Endpunkt des Fußrundungsbogens in Polarkoordinaten ;bezüglich der 0ø-Achse und dem Ursprung (=Einfügepunkt) des ;Polarkoordinatensystems berechnet. ;Startpunkt: (winrhof / rf) ;Endpunkt : (inv_phie / re) ;rhoe: Bogenlänge = Erzeugungsradius der Evolvente am Startpunkt, welcher ; der Endpunkt des Fußrundungsbogens ist. (setq rhoe (- (sqrt (- (* (+ rf rhof) (+ rf rhof)) (* rb rb))) rhof)) ;re : Startabstand des ersten Evolventenpunktes vom Einfügepunkt ; (= Endpunkt des Fußrundungsbogens. (setq re (sqrt (+ (* rhoe rhoe) (* rb rb)))) ;inv_phie: Endwinkel des Fußrundungsradius (setq inv_phie (- (/ rhoe rb) (atan (/ rhoe rb)))) ;Startwinkel winrhof der Fußrundung auf dem Fußkreis (setq winrhof (- (/ rhoe rb) (atan (/ (+ rhoe rhof)) rb))) ;Definition der zu verbindenden Punkte: (setq p1 (polar mp winfu rf)) ;Start Fußkreisbogen (setq p2 (polar mp winrhof rf)) ;Start Fußrundung ;Start Evolvente vom Schnittpunkt des ;Fußrundungsbogens mit der Evolvente (setq p3 (polar mp inv_phie re)) ;Zeichnen von Fußkreisbogen (=Kreis "k" mit Mittelpunkt "m" in mp von p1-p2), ;Fußrundungsbogen (Kreis "k" zwischen zwei Punkten p2-p3 ;Wenn kein Fußrundungsradius eingegeben wurde, dann wird die Polylinie ;zwischen dem Ende des Fußkreisbogens und dem Startpunkt der Evolvente im ;Linienmodus gezeichnet, ansonsten im Bogenmodus. (if (= rhof 0) (command "_pline" p1 "_ARC" "_CE" mp p2 "_LINE" p3) (command "_pline" p1 "_ARC" "_CE" mp p2 p3) ) );Ende Fussrund2 ;------------------------------------------------------------------------------ (defun C:ZAHN () (initget 1) (setq mp (getpoint "\n Einfügepunkt : ")) (initget (+ 1 2 4)) (setq z (getint "\n Zähnezahl : ")) (initget (+ 1 2 4)) (setq m (getreal "\n Modul : ")) (initget (+ 2 4)) (setq egwin (getreal "\n Eingriffswinkel <20ø> : ")) (cond ((null egwin) (setq egwin 20.0))) (initget 4) (setq c (getreal "\n Kopfspiel <0.25m> : ")) (cond ((null c) (setq c (* 0.25 m)))) (initget 4) (setq rhof (getreal "\n Zahnverrundung <0.38m> : ")) (cond ((null rhof) (setq rhof (* 0.38 m)))) (initget (+ 2 4)) (setq genau (getreal "\n Genauigkeit der Evolvente für die Zahnflanke <3>: ")) (cond ((null genau) (setq genau 3.0))) (initget 1 "j n") (setq zenkr (getkword "\n Zentrumkreuz und Teilkreis zeichnen J/N :")) (if (or (= zenkr "j") (= zenkr "J")) (list (setq uel (getreal "\n Überlänge des Zentrumkreuzes <5> : ")) (cond ((null uel) (setq uel 5))) ) ) ;------------------------------------------------------------------------------ (setq scmde (getvar "cmdecho")) ;sichern Systemvariablen (setq sblip (getvar "blipmode")) (setq lay (getvar "clayer")) ;aktuellen Layer sichern (setvar "cmdecho" 0) ;Ändern Variablen (setvar "blipmode" 0) (command "_layer" "_n" "zr" "") ;separater Layer für Zahnkranz (command "_layer" "_S" "zr" "") ;------------------------------------------------------------------------------ ;Bestimmungsgrößen (setq dt (* z m)) ;Teikreisdurchmesser (setq rt (/ dt 2.0)) (setq df (- dt (* 2.0 (+ m c)))) ;Fußkreisdurchmesser (setq rf (/ df 2.0)) (setq da (+ dt (* 2.0 m))) ;Kopfkreisdurchmesser (setq ra (/ da 2.0)) (setq db (* (cos (/ (* egwin pi) 180.0)) dt)) ;Grundkreisdurchmesser (setq rb (/ db 2.0)) (setq p (* m pi)) ;Teilung ;---------------------------------------------------------------------------- ;zeichnen Kopfkreisbogen ;Bogenlänge UT zwischen dem Schnittpunkt U (siehe DIN-Normen) der Zahnflanke ;mit dem Grundkreis (db) und dem Schnittpunkt T der Eingriffslinie g mit dem ;Grundkreis (db). ;Dies entspricht gleichzeitig der geraden Strecke C-T (=rho) der ;Eingriffslinie g vom Wälzpunkt C zum Schnittpunkt T mit dem Grundkreis (db). (setq rho (sqrt (- (* rt rt) (* rb rb)))) ;Evolventenfunktion inv_alpha ;rho/rb = tan(alpha), atan(rho/rb) = alpha ! (setq inv_alpha (- (/ rho rb) (atan (/ rho rb)))) ;Bogenlänge U'T' zwischen dem Schnittpunkt U der Zahnflanke mit dem ;Grundkreis (db) und dem Schnittpunkt T der Tangente zwischen einem ;beliebigen Punkt Y auf der Evolvente (Zahnflanke) mit dem Grundkreis (db). ;Dies entspricht gleichzeitig der geraden Strecke YT (Erzeugungsradius für ;die Evolvente im Punkt Y = ErzradY) von Y zum Schnittpunkt T mit dem ;Grundkreis (db). ;Hier interressiert das Ende der Evolvente (Y) am Kopfkreisbogen. (setq ErzradY (sqrt (- (* ra ra) (* rb rb)))) ;Differenzwinkel inv_delta zwischen der Geraden ra (=Kopfkreisradius) durch ;YT und der Geraden rb (=Grundkreisradius) durch den Anfangspunkt U der ;Evolvente am Grundkreis. (=Startwinkel Kopfkreisbogen) (setq inv_delta (- (/ ErzradY rb) (atan (/ ErzradY rb)))) ;Winkel der Spiegelachse. ;Teilungswinkel * Teilkreisradius = Teilung p (Winkel im Bogenmaß). ;Teilungswinkel = Teilung p (Bogenmaß) / Teilkreisradius. ;Der Teilkreis wird jeweils nach p/2 von den Evolventen im Wälzpunkt C ;geschnitten. Die Spiegelachse (=Symmetrieachse des Zahnes) liegt von C aus ;also p/4 entfernt. ;Vom Startpunkt U der Evolvente auf dem Grundkreis liegt die Spiegelachse ;ein Viertel der Teilung p + inv_alpha entfernt. (setq winsp (+ (/ p rt 4.0) inv_alpha)) ;Endwinkel Kopfkreisbogen bezüglich dem Anfangspunkt U der Evolvente auf dem ;Grundkreis. (setq winko (+ inv_delta (* (- winsp inv_delta) 2.0))) ;Zeichnen eines Bogens mit dem Mittelpunkt "m" in mp vom in Polarkoordinaten ;mit Ursprung in mp definierten Punkt mit dem Winkel inv_delta und dem Radius ;ra (=Startpunkt des Kopfkreisbogens) zum Punkt (in Polarkoordinaten um mp): ;(winko,ra). (command "_arc" "_C" mp (polar mp inv_delta ra) (polar mp winko ra)) (setq kobog (entlast)) ;sichern Kopfkreisbogen ;------------------------------------------------------------------------------- ;Berechnen der Endpunkte des Fußkreisbogens ;Startwinkel winfu des Fußkreisbogens bezüglich des Wälzpunktes C. ;Der Startwinkel des Fußkreisbogens liegt um p/4 vor dem Wälzpunkt C. (s.o.) ;auf dem Teilkreis. (setq winfu (- inv_alpha (/ p rt 4.0))) ;Fallunterscheidung: verschiedene Funktionen, je nach Größe des ;Fußkreisbogens und des radius des ersten Evolventenpunktes. (if (< (+ rf rhof) rb) (Fussrund1 rhof rf winfu) (Fussrund2 rhof rf rb winfu)) ;------------------------------------------------------------------------------ ;berechnen und zeichnen rechte Zahnflanke (setq inv_beta 0.0) ;Differenzwinkel involut der ;Laufvariablen beta (setq s re) ;Laufvariable s: Radius von mp zum ;augenblicklich berechneten Evolven- ;tenpunkt. (entspricht radius re des ;ersten Evolventenpunktes fr re > rb. ;Wenn der Radius des Anfangspunktes der Evolventenlinie re kleiner als der ;Grundkreisradius ist, dann wird die Laufvariable beta (im Gradmaß) von 0 ;weg gezählt. Im Gradmaß deshalb, da in der folgenden Schleife ;in's Bogenmaß umgerechnet wird. ;Sonst ist beta der Winkel, der sich ergibt, wenn die Evolventenlinie ;den Punkt durchläuft, welcher der Endpunkt des Fußrundungsradius in re ist. (if (< re rb) (setq beta (- (/ (* 0.0 180) pi) (/ 15.0 genau))) ;Gradmaß (setq beta (/ (* (/ rhoe rb) 180) pi)) ) ;Startwert der Laufvariablen beta als ;Schrittwinkel zum momentan ;berechneten Evolventenpunkt ;(im Gradmaß). ;Berechnung der Evolventenlinie ;Solange s < Kopfkreisradius ra, (while (< s ra) ;Schleifenanfang fr Evolventenpunkte (setq pn ;Def. n„chster Punkt der Evolvente Anfang (polar mp ;Polardefinition nächsten Punkt Beginn ;Selbe Problematik wie bei inv_alpha oder inv_delta. ;Es wird eine Laufvariable beta definiert, welche bei jedem Schleifen- ;durchlauf um 15.0ø/genau erhöht wird. ;Der Winkel inv_beta ist die Differenz zwischen dem Winkel ;((beta+15/genau)*pi/180) im Bogenmaß und beta, welcher sich durch die ;Umkehrung der Tangensfunktion (arctan(b/rb) ergibt. ;Unter diesem Winkel (inv_beta) wird ein Evolventenpunkt mit dem Abstand s ;von mp berechnet. ;Erreicht s ra, dann wird ein letzter Punkt berechnet und die Schleife ;beendet. ;wenn inv_beta > inv_delta... (if (> (setq inv_beta (- (* pi (/ (setq beta (+ beta (/ 15.0 genau)) ) 180.0) ) (atan (/ (setq b (/ (* pi beta rb) 180.0)) rb))) ) inv_delta) (setq inv_beta inv_delta) inv_beta ;...dann inv_beta=inv_delta setzen, ;sonst mit inv_beta fortfahren. ) (if (> (setq s (sqrt (+ (* rb rb) (* b b)))) ra) ;wenn s>ra... (setq s ra) s) ;..dann s=ra setzen, sonst mit s fortfahren ) ;Polardefinition für nächsten Punkt Ende ) ;Def. nächster Punkt der Evolvente Ende (command pn) ;zeichnen nächsten Punkt ) ;Ende Schleife (command "") (setq rzfl (entlast)) ;rechte Zahnflanke sichern ;------------------------------------------------------------------------------- ;Zahnkranz zeichnen ;spiegeln re. Zahnflanke (command "_mirror" rzfl "" mp (polar mp winsp rt) "") (setq lzfl (entlast)) ;linke Zahnflanke sichern (command "_pedit" rzfl "_j" kobog lzfl "" "") ;Polylinie Zahn kompl. bilden (setq zahn (entlast)) ;Sichern Zahn (command "_array" zahn "" "_p" mp z "" "") ;Reihe mit Anzahl z ;Polylinie Zahnrad (command "_pedit" zahn "_j" (ssget "x" '((8 . "zr"))) "" "") ;----------------------------------------------------------------------------- ;zeichnen Teilkreis und Zentrumkreuz (if (= zenkr "j") (list (command "_layer" "_n" "mitte" "") (command "_layer" "_s" "mitte" "") ;Layer "Mitte" setzen (command "_circle" mp rt) ;Kreis mit Mittelpunkt mp und ;Radius rt zeichnen. (command "_line" (polar mp winsp (+ ra uel));Erste achse um den Winkel der ;Spiegelachse gedreht mit ;Überlänge uel zeichnen. ;Zweite Hälfte der ersten Achse ;zeichnen. (polar mp (+ pi winsp) (+ ra uel)) "") ;Erste und zweite Hälfte der ;zweiten Achse zeichnen. (command "_line" (polar mp (+ (/ pi 2.0) winsp) (+ ra uel)) (polar mp (+ pi (/ pi 2.0) winsp) (+ ra uel)) "") ) ) ;------------------------------------------------------------------------------- (command "_layer" "_s" lay "") ;alten Layer setzen (setq ausg (getstring "Bestimmungsgrößen ausgeben J/ : ")) (if (or (= ausg "j") (= ausg "J")) (list (textscr) (list (princ "\n Anzahl der Zähne : ") (princ z)) (list (princ "\n Modul : ") (princ m)) (list (princ "\n Teilung : ") (princ p)) (list (princ "\n Teilkreisdurchmesser : ") (princ dt)) (list (princ "\n Kopfkreisdurchmesser : ") (princ da)) (list (princ "\n Fußkreisdurchmesser : ") (princ df)) (list (princ "\n Grundkreisdurchmesser: ") (princ db)) (list (princ "\n Kopfspiel : ") (princ c)) (list (princ "\n Eingriffwinkel : ") (princ egwin)) (list (princ "\n Zahnverrundung : ") (princ rhof)) ) ) (setvar "cmdecho" scmde) ;Rücksetzen der Systemvariablen (setvar "blipmode" sblip) (princ) );Ende