{"id":3610,"date":"2025-10-03T22:38:10","date_gmt":"2025-10-03T20:38:10","guid":{"rendered":"https:\/\/davidka.net\/?p=3610"},"modified":"2025-10-24T12:41:11","modified_gmt":"2025-10-24T09:41:11","slug":"lektion-3-erstellen-von-3d-objekten-parametrischer-quader","status":"publish","type":"post","link":"http:\/\/de.davidka.net\/de\/lektion-3-erstellen-von-3d-objekten-parametrischer-quader\/","title":{"rendered":"Lektion 3. Erstellen von 3D-Objekten: Parametrischer Quader"},"content":{"rendered":"\n<p class=\"has-neve-link-color-color has-text-color has-link-color has-medium-font-size wp-elements-113ef5558bb243e568e70dae679f134b wp-block-paragraph\"><strong>Lernziel:<\/strong> Lerne, \u00fcber Python feste K\u00f6rper (Quader, Zylinder) zu erstellen, verstehe die Dokumentenstruktur von FreeCAD und erstelle ein Addon, das ein parametrisches Bauteil erzeugt.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Teil 1. Wie ist ein Dokument in FreeCAD aufgebaut?<\/strong><br>Bevor du Objekte erstellst, ist es wichtig, die Datenhierarchie in FreeCAD zu verstehen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Dokument<\/strong> \u2013 ist eine ge\u00f6ffnete Datei (.FCStd). Alles, was du erstellst, befindet sich innerhalb eines Dokuments.<\/li>\n\n\n\n<li><strong>Objekt<\/strong> \u2013 ist ein parametrisches Objekt: Quader, Zylinder, Skizze usw.<\/li>\n\n\n\n<li><strong>Form<\/strong> \u2013 ist ein geometrischer K\u00f6rper (B-Rep), der visualisiert werden kann.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Du arbeitest immer im Kontext des aktiven Dokuments.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>So erh\u00e4ltst du das aktuelle Dokument:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">doc = FreeCAD.ActiveDocument<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Falls kein Dokument existiert, erstelle ein neues:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">doc = FreeCAD.newDocument(&quot;MeinEntwurf&quot;)<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Teil 2. Erstellen eines Quaders per Python<\/strong><br>Das einfachste 3D-Objekt in FreeCAD ist <code class=\"\" data-line=\"\">Part::Box<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Code-Beispiel:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">doc = FreeCAD.ActiveDocument or FreeCAD.newDocument()\nbox = doc.addObject(&quot;Part::Box&quot;, &quot;MeinQuader&quot;)\nbox.Length = 20.0\nbox.Width = 10.0\nbox.Height = 5.0\ndoc.recompute()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Was passiert hier?<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">doc.addObject(&quot;Part::Box&quot;, &quot;MeinQuader&quot;)<\/code><br>\u2192 Erstellt ein neues Objekt vom Typ \u201eQuader\u201c mit dem Namen \u201eMeinQuader\u201c.<\/li>\n\n\n\n<li>Das Objekt besitzt parametrische Eigenschaften: <code class=\"\" data-line=\"\">Length<\/code>, <code class=\"\" data-line=\"\">Width<\/code>, <code class=\"\" data-line=\"\">Height<\/code>.<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">doc.recompute()<\/code> \u2192 Baut das Modell neu auf (zwingend erforderlich nach \u00c4nderungen!).<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Alle Ma\u00dfe sind standardm\u00e4\u00dfig in <strong>Millimetern<\/strong> angegeben.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Teil 3. Addon: \u201eParametrischer Quader\u201c<\/strong><br>Nun erstellen wir ein Addon, das einen Quader mit vorgegebenen Abmessungen erzeugt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Schritt 1. Ordner erstellen<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">...\/Mod\/ParamBoxAddon\/<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Schritt 2. Datei <code class=\"\" data-line=\"\">InitGui.py<\/code><\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\"># InitGui.py\nimport FreeCADGui\nfrom ParamBoxAddon.param_box_workbench import ParamBoxWorkbench\n\nFreeCADGui.addWorkbench(ParamBoxWorkbench())<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Schritt 3. Datei <code class=\"\" data-line=\"\">param_box_workbench.py<\/code><\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\"># param_box_workbench.py\nimport FreeCAD, FreeCADGui\n\nclass CreateBoxCommand:\n    def GetResources(self):\n        return {\n            &quot;MenuText&quot;: &quot;Quader erstellen&quot;,\n            &quot;ToolTip&quot;: &quot;Erstelle einen parametrischen Quader mit Standardgr\u00f6\u00dfe&quot;\n        }\n\n    def Activated(self):\n        # Dokument abrufen oder erstellen\n        doc = FreeCAD.ActiveDocument\n        if not doc:\n            doc = FreeCAD.newDocument(&quot;QuaderEntwurf&quot;)\n\n        # Quaderobjekt erstellen\n        box = doc.addObject(&quot;Part::Box&quot;, &quot;MeinParamQuader&quot;)\n        box.Length = 30.0\n        box.Width = 20.0\n        box.Height = 10.0\n\n        # Neuberechnung ist zwingend erforderlich!\n        doc.recompute()\n\n        # Optional: Objekt ausw\u00e4hlen\n        FreeCADGui.Selection.clearSelection()\n        FreeCADGui.Selection.addSelection(box)\n\n    def IsActive(self):\n        return True\n\nclass ParamBoxWorkbench(FreeCADGui.Workbench):\n    MenuText = &quot;Parametrischer Quader&quot;\n    ToolTip = &quot;Erstelle einen einfachen parametrischen Quader&quot;\n\n    def Initialize(self):\n        self.list = &#091;&quot;CreateBoxCommand&quot;]\n        self.appendToolbar(&quot;Quader-Werkzeuge&quot;, self.list)\n        self.appendMenu(&quot;ParamQuader&quot;, self.list)\n\n    def GetClassName(self):\n        return &quot;Gui::PythonWorkbench&quot;\n\nFreeCADGui.addCommand(&quot;CreateBoxCommand&quot;, CreateBoxCommand())<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Schritt 4. Funktionspr\u00fcfung<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Speichere die Dateien<\/li>\n\n\n\n<li>Starte FreeCAD neu<\/li>\n\n\n\n<li>W\u00e4hle die Arbeitsumgebung \u201eParametrischer Quader\u201c aus<\/li>\n\n\n\n<li>Klicke auf die Schaltfl\u00e4che \u201eQuader erstellen\u201c<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Ein grauer Quader sollte im 3D-Fenster erscheinen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Pr\u00fcfe die Parametrie!<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Klicke im Modellbaum (\u201eModel\u201c) doppelt auf <code class=\"\" data-line=\"\">MeinParamQuader<\/code><\/li>\n\n\n\n<li>\u00c4ndere im Datenpanel z.\u202fB. die L\u00e4nge auf <code class=\"\" data-line=\"\">50<\/code><\/li>\n\n\n\n<li>Dr\u00fccke Enter \u2192 das Modell aktualisiert sich automatisch!<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Das ist <strong>parametrisches Modellieren<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Teil 4. Weitere Grundobjekte<\/strong><br>Du kannst mehr als nur Quader erstellen. Hier einige Beispiele:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Zylinder<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">cyl = doc.addObject(&quot;Part::Cylinder&quot;, &quot;MeinZylinder&quot;)\ncyl.Radius = 10.0\ncyl.Height = 25.0<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Kugel<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">sphere = doc.addObject(&quot;Part::Sphere&quot;, &quot;MeineKugel&quot;)\nsphere.Radius = 15.0<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Kegel<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">cone = doc.addObject(&quot;Part::Cone&quot;, &quot;MeinKegel&quot;)\ncone.Radius1 = 10.0  # unterer Radius\ncone.Radius2 = 5.0   # oberer Radius\ncone.Height = 20.0<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Alle diese Objekte stammen aus dem <strong>Part-Modul<\/strong>, das in FreeCAD integriert ist.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Praktische Aufgabe<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u00c4ndere das Addon so, dass es stattdessen einen <strong>Zylinder<\/strong> erstellt.<\/li>\n\n\n\n<li>Stelle sicher, dass das Objekt beim Erstellen einen <strong>eindeutigen Namen<\/strong> erh\u00e4lt (z.\u202fB. <code class=\"\" data-line=\"\">Quader_1<\/code>, <code class=\"\" data-line=\"\">Quader_2<\/code>, \u2026), falls ein Objekt mit diesem Namen bereits existiert.<\/li>\n\n\n\n<li>F\u00fcge einen <strong>zweiten Befehl<\/strong> \u2013 \u201eZylinder erstellen\u201c \u2013 in dieselbe Arbeitsumgebung ein.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Hinweis f\u00fcr eindeutige Namen:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">base_name = &quot;MeinQuader&quot;\nindex = 1\nname = base_name\nwhile name in &#091;obj.Name for obj in doc.Objects]:\n    name = f&quot;{base_name}_{index}&quot;\n    index += 1\nbox = doc.addObject(&quot;Part::Box&quot;, name)<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Tipps zum Debuggen<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Rufe <strong>immer<\/strong> <code class=\"\" data-line=\"\">doc.recompute()<\/code> nach \u00c4nderungen auf.<\/li>\n\n\n\n<li>Verwende <code class=\"\" data-line=\"\">FreeCAD.Console.PrintMessage(&quot;Text\\n&quot;)<\/code> zur Fehlersuche (Nachrichten erscheinen in der \u201eBerichtsansicht\u201c).<\/li>\n\n\n\n<li>Pr\u00fcfe vor der Arbeit, ob ein Dokument existiert.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Was kommt als N\u00e4chstes?<\/strong><br>In <strong>Lektion 4<\/strong> werden wir:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Lernen, eine grafische Benutzeroberfl\u00e4che (GUI) mit Eingabefeldern zu erstellen<\/li>\n\n\n\n<li>Ein Fenster entwickeln, in dem der Benutzer L\u00e4nge, Breite und H\u00f6he eingibt<\/li>\n\n\n\n<li>Durch Klick auf eine Schaltfl\u00e4che einen Quader mit diesen Parametern erzeugen<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Damit wird es bereits ein echtes Werkzeug \u2013 nicht nur eine Demonstration!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Lernziel: Lerne, \u00fcber Python feste K\u00f6rper (Quader, Zylinder) zu erstellen, verstehe die Dokumentenstruktur von FreeCAD und erstelle ein Addon, das ein parametrisches Bauteil erzeugt.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","_themeisle_gutenberg_block_has_review":false,"footnotes":""},"categories":[],"tags":[],"class_list":["post-3610","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/posts\/3610","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/comments?post=3610"}],"version-history":[{"count":0,"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/posts\/3610\/revisions"}],"wp:attachment":[{"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/media?parent=3610"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/categories?post=3610"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/tags?post=3610"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}