OpenSCAD Tutorial am Beispiel eines Bausteins

In dieser Rubrik Entwicklung, Konstruktion, Design uvm. auslassen

Moderator: webmaster

Benutzeravatar
webmaster
Site Admin
Beiträge: 256
Registriert: 03 Jan 2021 21:11

Re: OpenSCAD Tutorial am Beispiel eines Bausteins

Beitrag von webmaster »

Super, vielen Dank.
Nun bitte noch eine Erklärung, warum das Inlet nicht bzw. mit einem Gitter gefüllt gedruckt wurde.
hexagon_fehler-1.jpg
hexagon_fehler-1.jpg (199.07 KiB) 16061 mal betrachtet
Tastenfuchs
Beiträge: 41
Registriert: 12 Jan 2021 18:22

Re: OpenSCAD Tutorial am Beispiel eines Bausteins

Beitrag von Tastenfuchs »

Warum ein solches Gittermuster gedruckt wird, kann ich dir nicht sagen, der Programm Code gibt es nicht her. Das ist also ein Thema des Slicer und keins von OpenSCAD.

Ich möchte kurz ein anderes Thema einschieben, anhand deines Beispiels, was nur indirekt mit OpenSCAD zu tun hat.

Im Programmieren, gibt es einige Paradigmen an die man sich halten sollte, soweit es geht.
Hier mal drei Kernpunkte:
1.) Halte deinen Code es so einfach wie möglich
2.) Zerlege deine Probleme in kleine Pakete, und lagere Problemstellungen soweit es geht aus in einzelne Sub Teile und einzelne Module.
3.) Habe keinen Code, der nicht benutzt wird. Der vergammelt, wird unwartbar und verwirrt. Das gilt auch für Variablen.

Ich habe in meiner Rolle als Chefentwickler habe ich viele Jahre Erfahrung im analysieren und prüfen der Qualität von fremden Code. Ich kann dir aus meiner Erfahrung sagen, dass es oft schwerer ist, fremden Code zu verstehen und zu beurteilen als wenn man es selbst geschrieben hat.

Nehmen wir das Beispiel von dir, da ist lustig einiges zusammen kopiert worden, was so keinen Sinn macht.

Der erste Abschnitt, wenn man ihn sich mal genauer ansieht, erzeugt ein Objekt, welches innerhalb des anderen Objektes entsteht. Man kann das auch weg lassen und es kommt das gleiche raus. Mag sogar sein, dass dein Slicer deswegen durcheinander kommt.

Code: Alles auswählen

difference() {
linear_extrude(height=h) circle(d=d,$fn=6); //outer part
translate([0,10,-eps]) linear_extrude(height=h-wt) circle(d=(w-2*wt)/cos(30),$fn=6); //inner part
}


Wie erkennt man dass, nun durch spielen mit den Parametern, * # !
Indem ich die abwechselnd mal vor die difference setze und mir anschaue, was passiert da eigentlich.


Das nächste, wenn ich schon variablen definiere, sollte man sie auch benutzen. Der relevante Code nutzt bis auf eine keine der Variablen.
cos(30) sieht echt cool aus, und es macht sicherlich sinn einen Cosinus in einer Formel zu berechnen, wenn der Eingangsparameter sich ändert, wenn das aber eine Konstante ist, bin ich ein Freund von schreib doch die Zahl, außer du bist Mathematiker und hast das im Kopf.

Ich möchte dir also raten, fang einfach an ohne fremden Code, schau dir die Befehle an und bau das Zeug Schritt für Schritt zusammen, sonst kommst du nie über das Level raus, an fremden Sachen zu drehen und vollkommen überrascht zu staunen, was da gerade passiert.

In dem Fall deines Beispiels folgender Ablauf, und mache es wirklich als einzelne Schritte, es macht keinen Sinn, zu Punkt 4 zu springen, dass macht kein professioneller Entwickler so. Wenn man eine Aufgabe hat, die komplexer ist als man es in einem Stück programmieren kann, wird das Ding in kleine Aufgaben Pakete zerlegt, die werden getestet, abgeschlossen und dann kommt erst der nächste Schritt. Was zu komplex ist, ist für dich sicherlich früher erreicht als für mich aber für uns beide gleichen die gleichen Regeln. Wenn es zu kompliziert wird, arbeite ich in kleinen Schritten, teste die und erst dann geht es weiter.




1.) Ich will ein Hexagon, deswegen $fn=6, weil der Kreis aus 6 Segmenten besteht, Spiele mal mit der fn Zahl, damit du den Effekt siehst.

Code: Alles auswählen

	cylinder(d=52.1, h=10, $fn=6);
2.) Ich will ein Fuß unten drunter. Was bedeutet das, es muss ein weiteres Hexagon her, das kleiner ist und er muss verschoben werden, da er sonst einfach im großen erzeugt wird. Also muss er in der Z-Achse um seine eigene Hoehe nach unten. Wenn er also 3mm unten raus stehen soll muss der Cylinder 3 hoch sein und 3 nach unten.

Code: Alles auswählen

	cylinder(d=52.1, h=10, $fn=6);

	//Schau ihn dir mit dem # Symbol an, damit du siehst ob das passt, spiele mit der -3 um zu sehen was passiert
	#translate([0,0,-3]) cylinder(d=34.0, h=3.00, $fn=6); 

3.) Wir wollen oben ein Loch reinschneiden, was bedeutet das, wir erzeugen ein neues Hexagon von der Größe des Lochs und ziehen es vom ersten ab indem wir es an die Stelle absenken an die es muss. das geht aber nur, wenn wir die beiden Befehle aus Abschnitt 2 in einem Union zusammenfassen. Merke : Ich hatte gesagt, Difference zieht alles ab vom ersten Objekt. Lasse also mal das union weg um zu sehen was dann passiert. Versuch dir dann zu erklären, warum das Ergebnis, dann eben aussieht wie es aussieht.

Code: Alles auswählen

difference() {
    union() {
        cylinder(d=52.1, h=10, $fn=6);

		//Schau ihn dir mit dem # Symbol an, damit du siehst ob das passt, spiele mit der -3 um zu sehen was passiert
		translate([0,0,-3]) cylinder(d=34.0, h=3.00, $fn=6); 
	}
	translate([0,0,6.01]) cylinder(d=33.8, h=4.00, $fn=6);
}


4.) du willst das ganze Teil auf den Kopf drehen, es muss also in der Y Achse um 180 Grad rotiert werden.

Code: Alles auswählen

rotate([0,180,0]) difference() {
    union() {
        cylinder(d=52.1, h=10, $fn=6);

		//Schau ihn dir mit dem # Symbol an, damit du siehst ob das passt, spiele mit der -3 um zu sehen was passiert
		translate([0,0,-3]) cylinder(d=34.0, h=3.00, $fn=6); 
	}
	translate([0,0,6.01]) cylinder(d=33.8, h=4.00, $fn=6);
}
Benutzeravatar
webmaster
Site Admin
Beiträge: 256
Registriert: 03 Jan 2021 21:11

Re: OpenSCAD Tutorial am Beispiel eines Bausteins

Beitrag von webmaster »

Hallo Siegfried,

ich gebe Dir in allen Punkten Recht.

Den ursprünglichen Code habe ich, so wie ich ihn hier gepostet habe, selbst gestrickt.
Der obere Teil mit den Variablen und den daraus resultierenden Anpassungen kam aus dem Forum.

Das Gitter hat übrigens in der Tat nichts mit dem Code zu tun, sondern basiert auf der Option "Support" im Slicer
und wurde längst behoben.

Was mich jetzt noch beschäftigt und da kommen wir wieder zu dem Punkt von Verstehen ist die Tatsache, so sehr ich auch an den Werten drehe, es ändert sich nichts an der Größe. Im Grunde stimmt kein Maß, schaffe es aber mangels Wissen ob der Variablen nicht, hier anzupassen.

Ich würde ja gerne den Code verständlich verschlanken bzw. vereinfachen....
So im Groben hab ich schon einiges verstanden... $fn beschreibt die Anzahl der "Seiten". Mein Objekt hat 6, daher $fn=6. Hätte es 10, wäre es kein Hexagon mehr, oder?


Gruß Kai
Tastenfuchs
Beiträge: 41
Registriert: 12 Jan 2021 18:22

Re: OpenSCAD Tutorial am Beispiel eines Bausteins

Beitrag von Tastenfuchs »

Ich kann mich nur wiederholen,

arbeite mein Beispiel mit den 4 Schritten ab, wenn du also mit dem Durchmesser nicht zurecht kommst, dann fange am Schritt 1 an und verändere dort den Wert "d" und schau dir das Ergebnis an, passt der Wert, kommt der nächste Schritt.
Tastenfuchs
Beiträge: 41
Registriert: 12 Jan 2021 18:22

Re: OpenSCAD Tutorial am Beispiel eines Bausteins

Beitrag von Tastenfuchs »

In dem Teil möchte ich das OpenSCAD Tutorial abschließen.

OpenSCAD verträgt keine deutschen Umlaute. Bitte also in variablen und modulen vermeiden.

Es geht um Variablen, Module, sowie einen Anriss der klassischen Programmierung.
Bisher haben wir nur Grundelemente aufeinander gesetzt oder voneinander abgezogen und verschoben.

- Ein module dient dazu thematisch zusammen gehörende Dinge zu grupieren. Man kann module auch komplett in andere Dateien auslagern und diese später wieder mit dem Befehl <use> einbinden.

- Variablen dienen der Übersichtlichkeit und späteren Wartbarkeit eines Code. Ich nutze sie hier aus bequemlichkeit nicht zu 100% sondern nur da wo ich sie vermutlich ändern will.

- Schleifen und if abfragen ermöglichen wiederholtes abarbeiten beziehungsweiße von Bedingungen abhängiges.
Hierzu ein Beispiel anhand von gravitrax, wir machen den Steckring für die Grundplatte. Die Maße sind frei erfunden und dienen nur der Erklärung.


Variablen innerhalb des module gelten nur dort, Variablen außerhalb gelten überall. Wenn innerhalb und außerhalb der gleiche name verwendet wird, gilt das innerhalb.


Das hauptmodule heißt Steckring und wird dann auch mit diesem Namen Steckring(); aufgerufen.

1.) Das Basis Hexagon

Code: Alles auswählen

durchmesser = 50;
hoehe = 2;

Steckring();

module Steckring() {
    cylinder(d = durchmesser, h = hoehe, center = true, $fn=6);
}
Unbenannt1.PNG
Unbenannt1.PNG (9.47 KiB) 16051 mal betrachtet

2.) jetzt erzeugen wir den Innen Hohlraum

Code: Alles auswählen

durchmesser = 50;
ringdurchmesser=10;
hoehe = 2;

Steckring();

module Steckring() {
     difference() {
	cylinder(d = durchmesser, h = hoehe, center = true, $fn=6);
	// die plus 0.1 bei der Hohe dient, dazu, das der Ausschnitt etwas oben udn unten raussteht, damit der Slicer keine probleme bekommt.
 	cylinder(d = durchmesser - ringdurchmesser, h = hoehe + 0.1, center = true, $fn=6);        
    }
}
3.) Ich hätte gerne außen abgerundete Kanten.
Der Befehl intersection erzeugt ein Objekt, was durch beide einzelobjekte befüllt wird. Ich lege also über das Haupt Hexagon einen greis, der minimal kleiner ist und damit am Hexagon die Kanten abschneidet.

Code: Alles auswählen

durchmesser = 50;
ringdurchmesser=10;
hoehe = 2;

Steckring();

module Steckring() {
    rundung = 0.5;
    difference() {
            intersection() {
                cylinder(d = durchmesser, h = hoehe, center = true, $fn=6);
                cylinder(d = durchmesser - rundung, h = hoehe, center = true, $fn=200);
        }
        cylinder(d = durchmesser - ringdurchmesser, h = hoehe + 0.1, center = true, $fn=6);        
    }
}
4.) Jetzt wollen wir die Hacken für die Grundplatte bauen. Ich mache den Hacken erst einmal die Richtige Position und die 6 Stück kommen später. Der Hacken wird hinzugefügt, muss also außerhalb der Difference sein, es kommt also noch mal um alles ein union;

Code: Alles auswählen

durchmesser = 50;
ringdurchmesser=10;
hoehe = 2;

Steckring();


module Steckring() {
    rundung = 0.5;
    
    union() {
        difference() {
                intersection() {
                    cylinder(d = durchmesser, h = hoehe, center = true, $fn=6);
                    cylinder(d = durchmesser - rundung, h = hoehe, center = true, $fn=200);
            }
            cylinder(d = durchmesser - ringdurchmesser, h = hoehe + 0.1, center = true, $fn=6);        
        }
        Hacken();
    }
}



module Hacken() {
    steckHoehe = 3;
    laenge = 14;
    tiefe = 1;
    
        translate([0,0,-(hoehe + steckHoehe)/2]) cube ([laenge, tiefe, steckHoehe], center = true);
}
Unbenannt2.PNG
Unbenannt2.PNG (12.5 KiB) 16051 mal betrachtet


5.) Jetzt schieben wir den ersten hacken an die Richtige Stelle und benennen das ganze noch etwas um, wir müssen ja 6 Hacken machen, der einzelne wird also ein module in einem module.

Code: Alles auswählen

durchmesser = 50;
ringdurchmesser=10;
hoehe = 2;

Steckring();


module Steckring() {
    rundung = 0.5;
    
    union() {
        difference() {
                intersection() {
                    cylinder(d = durchmesser, h = hoehe, center = true, $fn=6);
                    cylinder(d = durchmesser - rundung, h = hoehe, center = true, $fn=200);
            }
            cylinder(d = durchmesser - ringdurchmesser, h = hoehe + 0.1, center = true, $fn=6);        
        }
        Hacken();
    }
}

module Hacken() {
    //Warum ziehe ich hier etwas ab. Der Grund liegt daran, das der Durchmesser die Angabe des Kreises ist. Wir haben durch $fn=6 aber keinen kreis, das Objekt ist also kleienr im Durchmesser als erwartet. Das kann man jetzt auch ausrechnen, wieviel hier fehlt. Ich bin zu faul und ziehe es einfach ab, bis es passt
    mitteOffset = (durchmesser / 2) - 7.2 ;
    
    translate([0,mitteOffset,0]) EinzelKlammer();
        
    module EinzelKlammer() {
        steckHoehe = 3;
        laenge = 14;
        tiefe = 1;
        
        translate([0,0,-(hoehe + steckHoehe)/2]) cube ([laenge, tiefe, steckHoehe], center = true);
    }
}
5.) wir machen die Hacken mal 6;
OpenSCAD arbeitet mit vektoren, das nutzen wir jetzt für eine Schleife bei der wir angeben wie oft und um wieviel Grad der Hacken gedreht werden soll. Wir führen also den einzelnen befehl jetzt 6 mal aus.

Code: Alles auswählen

durchmesser = 50;
ringdurchmesser=10;
hoehe = 2;

Steckring();


module Steckring() {
    rundung = 0.5;
    
    union() {
        difference() {
                intersection() {
                    cylinder(d = durchmesser, h = hoehe, center = true, $fn=6);
                    cylinder(d = durchmesser - rundung, h = hoehe, center = true, $fn=200);
            }
            cylinder(d = durchmesser - ringdurchmesser, h = hoehe + 0.1, center = true, $fn=6);        
        }
        Hacken();
    }
}

module Hacken() {
    //Warum ziehe ich hier etwas ab. Der Grund liegt daran, das der Durchmesser die Angabe des Kreises ist. Wir haben durch $fn=6 aber keinen kreis, das Objekt ist also kleienr im Durchmesser als erwartet. Das kann man jetzt auch ausrechnen, wieviel hier fehlt. Ich bin zu faul und ziehe es einfach ab, bis es passt
    mitteOffset = (durchmesser / 2) - 7.2 ;
    rotateVektor=[0,180,60,-60,120,-120];
    
    for(rd = rotateVektor) {
        rotate([0,0,rd]) translate([0,mitteOffset,0]) EinzelKlammer();
    }
        
    module EinzelKlammer() {
        steckHoehe = 3;
        laenge = 14;
        tiefe = 1;
        
        translate([0,0,-(hoehe + steckHoehe)/2]) cube ([laenge, tiefe, steckHoehe], center = true);
    }
}

6. Zum schluss wollen wir es so machen, dass im preview <F5> modus das Objekt bildlich richtig ist aber im render Modus <F6> das Objekt auf den Kopf gedreht wird damit es gedruckt werden kann. hierzu fügen wir ganz am anfang ein if mit eienr Abfrage der Systemvariable $preview ein


Code: Alles auswählen

durchmesser = 50;
ringdurchmesser=10;
hoehe = 2;

if ($preview == true) { 
        rotate([0,0,0]) Steckring();
}else {
        rotate([180,0,0]) Steckring();
}

module Steckring() {
    rundung = 0.5;
    
    union() {
        difference() {
                intersection() {
                    cylinder(d = durchmesser, h = hoehe, center = true, $fn=6);
                    cylinder(d = durchmesser - rundung, h = hoehe, center = true, $fn=200);
            }
            cylinder(d = durchmesser - ringdurchmesser, h = hoehe + 0.1, center = true, $fn=6);        
        }
        Hacken();
    }
}

module Hacken() {
    //Warum ziehe ich hier etwas ab. Der Grund liegt daran, das der Durchmesser die Angabe des Kreises ist. Wir haben durch $fn=6 aber keinen kreis, das Objekt ist also kleienr im Durchmesser als erwartet. Das kann man jetzt auch ausrechnen, wieviel hier fehlt. Ich bin zu faul und ziehe es einfach ab, bis es passt
    mitteOffset = (durchmesser / 2) - 7.2 ;
    rotateVektor=[0,180,60,-60,120,-120];
    
    for(rd = rotateVektor) {
        rotate([0,0,rd]) translate([0,mitteOffset,0]) EinzelKlammer();
    }
        
    module EinzelKlammer() {
        steckHoehe = 3;
        laenge = 14;
        tiefe = 1;
        
        translate([0,0,-(hoehe + steckHoehe)/2]) cube ([laenge, tiefe, steckHoehe], center = true);
    }
}

Das wars von mir. Der Steckring kann jetzt abgespeichert werden und kann genauso behandelt werdne wie jetzt andere Objekt in OpenSCAD.
Eingebunden wird er mit.
use <Dateiname.scad>;

und aufgerufen mit Steckring();
Dateianhänge
Unbenannt3.PNG
Unbenannt3.PNG (10.97 KiB) 16051 mal betrachtet
Benutzeravatar
webmaster
Site Admin
Beiträge: 256
Registriert: 03 Jan 2021 21:11

Re: OpenSCAD Tutorial am Beispiel eines Bausteins

Beitrag von webmaster »

Ich hab´ mir mal die Mühe erlaubt und das Tutorial nachgestellt.
Es hapert noch ein wenig am Verständnis, aber im Wesentlichen muss ich sagen, leider passt keines der 3 Teile zueinander.
Lediglich der Steckring sitzt sehr sehr eng in der Grundplatte.

Siegfried wird da sicher schneller sein, aber ich versuche mal zu ergründen, was genau da anzupassen wäre.
Tastenfuchs
Beiträge: 41
Registriert: 12 Jan 2021 18:22

Re: OpenSCAD Tutorial am Beispiel eines Bausteins

Beitrag von Tastenfuchs »

Mein Zitat am Anfang des Tutorials
Ich werde hier die Entwicklung meines Bausteines präsentieren, damit wir nicht auf das fertige Modell warten müssen, anhand der aktuell vorliegenden Daten. Bitte also nicht wundern, wenn sich das Teil noch im DRAFT Modus befindet.

Das ist im Moment nur ein Tutorial zum verstehen wie man mit OpenSCAD Gravitrax Steine entwickelt. Davon ist keines zum ausdrucken gedacht, sondern wie du getan hast, nur zum nachvollziehen wie so etwas funktioniert.

Wenn du fertig auszudruckende Teile erwartet hast, war das nicht das Ziel eines Tutorials.

Der letzte Teil des Tutorials mit dem Steckring, sind komplette Fantasie Werte um den Ablauf zu erklären.

Fertig auszudruckende Teile, kommen irgendwann mal, wenn ich Zeit habe und mit meinen anderen Projekten noch fertig bin, die ich noch parallel mache.
Benutzeravatar
webmaster
Site Admin
Beiträge: 256
Registriert: 03 Jan 2021 21:11

Re: OpenSCAD Tutorial am Beispiel eines Bausteins

Beitrag von webmaster »

Wer nicht versucht, der bleibt stehen.
Ich wollte ja auch nur ein kurzes Feedback geben.
Mein Script werde ich nochmals überprüfen, danke für die vielen Tipps.
Benutzeravatar
webmaster
Site Admin
Beiträge: 256
Registriert: 03 Jan 2021 21:11

Re: OpenSCAD Tutorial am Beispiel eines Bausteins

Beitrag von webmaster »

So, ich hab jetzt mal mit den Werten in meinem Beispiel gespielt.

Zunächst hab ich wieder alle vorigen Werte eingetragen. Dabei ist mir aufgefallen, das bei der Vertiefung bei "h" ein anderer Wert als "4" zu einem Verschwinden der Vertiefung führt.

Wenn experimentieren mit der Variable "d" die oberhalb von rotate gemeint ist, dann verändert sich da nichts.
Der Abschnitt mit den Variablen liegt mir ohnehin nicht, weil unterhalb von rotate darauf bezogen wird und ich deren Zusammenhang noch nicht richtig verstanden habe.

Wie gesagt, die Maße stimmen bis auf ein paar Zehntel. Daher passt lediglich der Fuß schmatzend fest in die Grundplatte.
Benutzeravatar
webmaster
Site Admin
Beiträge: 256
Registriert: 03 Jan 2021 21:11

Re: OpenSCAD Tutorial am Beispiel eines Bausteins

Beitrag von webmaster »

Bzgl. meines Projektes, um mal im Kontext zu bleiben, hätte ich eine Bitte:
Wie kann ich alles zwischen eps und dem 2. difference durch verständliche(re) Befehle ersetzen?
Ich komme so damit nicht zurecht. Hab nochmal nachgemessen, warte auf das Druckergebnis....
Besonders stört mich nicht zu verstehen, warum bei der Vertiefung diese verschwindet, wenn ich den Wert h auf was auch immer verändere.
Antworten