{"id":3607,"date":"2025-10-03T22:23:34","date_gmt":"2025-10-03T20:23:34","guid":{"rendered":"https:\/\/davidka.net\/?p=3607"},"modified":"2025-10-24T12:41:28","modified_gmt":"2025-10-24T09:41:28","slug":"lektion-2-dein-erstes-addon-hello-world","status":"publish","type":"post","link":"http:\/\/de.davidka.net\/de\/lektion-2-dein-erstes-addon-hello-world\/","title":{"rendered":"Lektion 2. Dein erstes Addon: \u201eHello World\u201c"},"content":{"rendered":"\n<p class=\"has-neve-link-color-color has-text-color has-link-color has-medium-font-size wp-elements-39fd0c7fd2fb80875d565ce409bfa006 wp-block-paragraph\"><strong>Tutorial: Erstellen von Addons f\u00fcr FreeCAD<\/strong><\/p>\n\n\n\n<p class=\"has-neve-link-color-color has-text-color has-link-color has-medium-font-size wp-elements-511d0d20a803b1c3359c50d31f82e269 wp-block-paragraph\"><strong>Lernziel:<\/strong> Erstelle ein einfaches Addon, das eine neue Arbeitsumgebung mit einer Schaltfl\u00e4che hinzuf\u00fcgt und beim Klicken eine Nachricht anzeigt.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Schritt 1. Vorbereitung des Addon-Ordners<\/strong><br>Stelle sicher, dass du folgenden Ordner hast:<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">...\/FreeCAD\/Mod\/HelloWorldAddon\/<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><br>Falls nicht \u2013 erstelle ihn.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Der Ordnername ist wichtig: Er muss mit dem Modulnamen im Code \u00fcbereinstimmen.<br>Wir verwenden <code class=\"\" data-line=\"\">HelloWorldAddon<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Erstelle in diesem Ordner zwei Dateien:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">InitGui.py<\/code><\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">hello_workbench.py<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Wichtig:<\/strong> Verwende <strong>keine Leerzeichen oder kyrillische Zeichen<\/strong> in Datei- und Ordnernamen!<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Schritt 2. Datei <code class=\"\" data-line=\"\">InitGui.py<\/code> \u2013 Einstiegspunkt<\/strong><br>Diese Datei wird von FreeCAD beim Start automatisch ausgef\u00fchrt, wenn sie sich im Addon-Ordner befindet.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00d6ffne sie in einem Editor und f\u00fcge folgenden Code ein:<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\"># InitGui.py\nimport FreeCADGui\nfrom HelloWorldAddon.hello_workbench import HelloWorldWorkbench\n\nFreeCADGui.addWorkbench(HelloWorldWorkbench())<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Was macht dieser Code?<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Importiert unsere Arbeitsumgebung aus der Datei <code class=\"\" data-line=\"\">hello_workbench.py<\/code><\/li>\n\n\n\n<li>Registriert sie in der FreeCAD-Oberfl\u00e4che \u00fcber <code class=\"\" data-line=\"\">FreeCADGui.addWorkbench()<\/code><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Hinweis:<\/strong><br><code class=\"\" data-line=\"\">from HelloWorldAddon.hello_workbench<\/code> \u2013 hier ist <code class=\"\" data-line=\"\">HelloWorldAddon<\/code> der Ordnername und <code class=\"\" data-line=\"\">hello_workbench<\/code> der Dateiname <strong>ohne<\/strong> die Erweiterung <code class=\"\" data-line=\"\">.py<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Schritt 3. Datei <code class=\"\" data-line=\"\">hello_workbench.py<\/code> \u2013 Addon-Logik<\/strong><br>Nun erstellen wir die Arbeitsumgebung selbst.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00fcge folgenden Code in <code class=\"\" data-line=\"\">hello_workbench.py<\/code> ein:<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\"># hello_workbench.py\nimport FreeCAD, FreeCADGui\nfrom PySide import QtGui\n\n# === BEFEHL: Was passiert beim Klick auf die Schaltfl\u00e4che? ===\nclass HelloWorldCommand:\n    def GetResources(self):\n        &quot;&quot;&quot;Gibt Daten zur Anzeige des Befehls zur\u00fcck&quot;&quot;&quot;\n        return {\n            &quot;MenuText&quot;: &quot;Sag Hallo&quot;,        # Text im Men\u00fc\n            &quot;ToolTip&quot;: &quot;Zeige eine Begr\u00fc\u00dfung&quot;,  # Tooltip\n            &quot;Pixmap&quot;: &quot;&quot;                    # Pfad zum Symbol (zun\u00e4chst leer)\n        }\n\n    def Activated(self):\n        &quot;&quot;&quot;Wird aufgerufen, wenn die Schaltfl\u00e4che geklickt wird&quot;&quot;&quot;\n        QtGui.QMessageBox.information(\n            None,\n            &quot;FreeCAD Addon&quot;,\n            &quot;Hallo Welt!\\nDu hast gerade dein erstes Addon gestartet!&quot;\n        )\n\n    def IsActive(self):\n        &quot;&quot;&quot;Wann ist der Befehl verf\u00fcgbar? (hier: immer \u2192 True)&quot;&quot;&quot;\n        return True\n\n# === ARBEITSUMGEBUNG: fasst Befehle zusammen ===\nclass HelloWorldWorkbench(FreeCADGui.Workbench):\n    # Name, der in der Liste angezeigt wird\n    MenuText = &quot;Hello World&quot;\n    ToolTip = &quot;Meine erste Arbeitsumgebung&quot;\n\n    def Initialize(self):\n        &quot;&quot;&quot;Wird aufgerufen, wenn die Arbeitsumgebung aktiviert wird&quot;&quot;&quot;\n        # Liste der Befehlsnamen\n        self.list = &#091;&quot;HelloWorldCommand&quot;]\n        # Symbolleiste hinzuf\u00fcgen\n        self.appendToolbar(&quot;Hello Tools&quot;, self.list)\n        # Men\u00fceintrag hinzuf\u00fcgen\n        self.appendMenu(&quot;Hello World&quot;, self.list)\n\n    def GetClassName(self):\n        &quot;&quot;&quot;Erforderliche Methode f\u00fcr Python-Arbeitsumgebungen&quot;&quot;&quot;\n        return &quot;Gui::PythonWorkbench&quot;\n\n# === BEFEHLSREGISTRIERUNG ===\nFreeCADGui.addCommand(&quot;HelloWorldCommand&quot;, HelloWorldCommand())<\/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>Code-Analyse nach Komponenten:<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Befehl (<code class=\"\" data-line=\"\">HelloWorldCommand<\/code>)<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">GetResources()<\/code> \u2013 beschreibt, wie der Befehl in der Oberfl\u00e4che erscheint<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">Activated()<\/code> \u2013 definiert, was beim Klick geschieht<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">IsActive()<\/code> \u2013 legt fest, wann die Schaltfl\u00e4che aktiv ist (z.\u202fB. nur bei ge\u00f6ffnetem Dokument)<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Arbeitsumgebung (<code class=\"\" data-line=\"\">HelloWorldWorkbench<\/code>)<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Erbt von <code class=\"\" data-line=\"\">FreeCADGui.Workbench<\/code><\/li>\n\n\n\n<li>Die Methode <code class=\"\" data-line=\"\">Initialize()<\/code> f\u00fcgt Befehle zur Symbolleiste und zum Men\u00fc hinzu<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">GetClassName()<\/code> teilt FreeCAD mit: \u201eDies ist eine Python-Arbeitsumgebung\u201c<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Registrierung<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">FreeCADGui.addCommand()<\/code> verkn\u00fcpft den Namen <code class=\"\" data-line=\"\">&quot;HelloWorldCommand&quot;<\/code> mit der Klasse<\/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>Schritt 4. Funktionspr\u00fcfung<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Speichere beide Dateien<\/li>\n\n\n\n<li>Starte FreeCAD neu<\/li>\n\n\n\n<li>W\u00e4hle in der Arbeitsumgebung-Auswahl <strong>\u201eHello World\u201c<\/strong><\/li>\n\n\n\n<li>Klicke auf die Schaltfl\u00e4che <strong>\u201eSag Hallo\u201c<\/strong><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Ein Fenster mit der Nachricht <strong>\u201eHallo Welt!\u201c<\/strong> sollte erscheinen.<\/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 den angezeigten Text.<\/li>\n\n\n\n<li>F\u00fcge ein zweites Kommando hinzu \u2013 z.\u202fB. <strong>\u201eZeige Datum\u201c<\/strong>, das das aktuelle Datum anzeigt.<\/li>\n\n\n\n<li>Experimentiere mit <code class=\"\" data-line=\"\">IsActive()<\/code> \u2013 lasse die Schaltfl\u00e4che z.\u202fB. nur aktiv sein, wenn ein Dokument ge\u00f6ffnet ist:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">   def IsActive(self):\n       return FreeCAD.ActiveDocument is not None<\/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>Was kommt als N\u00e4chstes?<\/strong><br>In <strong>Lektion 3<\/strong> werden wir:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Lernen, wie man echte 3D-Objekte (Quader, Zylinder) per Python erstellt<\/li>\n\n\n\n<li>Die Dokumentenstruktur von FreeCAD verstehen<\/li>\n\n\n\n<li>Ein Addon bauen, das parametrische K\u00f6rper erzeugt<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Damit beginnt die echte CAD-Entwicklung!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Lernziel: Erstelle ein einfaches Addon, das eine neue Arbeitsumgebung mit einer Schaltfl\u00e4che hinzuf\u00fcgt und beim Klicken eine Nachricht anzeigt.<\/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-3607","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/posts\/3607","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=3607"}],"version-history":[{"count":0,"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/posts\/3607\/revisions"}],"wp:attachment":[{"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/media?parent=3607"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/categories?post=3607"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/tags?post=3607"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}