Skip to content
ispyisail edited this page Sep 11, 2026 · 3 revisions

QElectroTech automatisieren

Wie man QET aus anderen Programmen heraus steuert, und wie die XML-Dateien aufgebaut sind.

Korrektur, September 2026. FrΓΌhere Fassungen dieser Seite behaupteten, QElectroTech unterstΓΌtze Python-Skripte und ein Plugin-System, und wiesen Leser an, Plugins nach ~/.local/share/QElectroTech/plugins/ und Entsprechendes zu installieren. Nichts davon existiert. Es gibt weder einen eingebetteten Interpreter noch eine Plugin-Schnittstelle noch ein Plugin-Verzeichnis β€” QET liest diese Pfade nie. Die folgende Seite beschreibt, was tatsΓ€chlich vorhanden ist. Das ist einiges, nur eben nicht das.

Was QET wirklich bietet:

Eine Kommandozeile ohne OberflΓ€che 13 Verben, die ein Projekt ΓΆffnen und exportieren, untersuchen oder neu schreiben, ohne GUI. Die eigentliche AutomatisierungsflΓ€che.
XML-Dateien .qet und .elmt sind gewΓΆhnliches XML, mit jedem Werkzeug les- und schreibbar.
Ein externes Begleitprogramm qet_tb_generator, aus einem MenΓΌeintrag gestartet.
C++-Quellcode FΓΌr alle, die QET selbst oder einen Fork bauen.

Was es nicht bietet: eingebettete Skripte in irgendeiner Sprache, eine Plugin-API, ein Verzeichnis ladbarer Module oder eine Automatisierungsschnittstelle zu einer laufenden Instanz.


1. Die Kommandozeile

Das ist der Teil, den die meiste Automatisierung nutzen sollte. Ein erkanntes Export-Flag wird vor dem Start der OberflΓ€che ausgewertet; der Prozess lΓ€uft ohne Anzeige, erledigt die Arbeit und endet β€” er ΓΆffnet kein Fenster und reicht nichts an eine bereits laufende Instanz weiter.

qelectrotech --export-pdf meinprojekt.qet ausgabe.pdf

Argumente sind positionsgebunden, nicht --flag=wert. Die Form lautet stets qelectrotech <flag> <projekt.qet> <ausgabe>, mit den beiden unten genannten Ausnahmen.

Die Verben

Flag Ausgabe Anmerkungen
--export-pdf ein PDF alle Folios, je eine Seite
--export-png ein Verzeichnis je ein NN_Titel.png pro Folio
--export-svg ein Verzeichnis je ein NN_Titel.svg pro Folio
--export-bom CSV StΓΌckliste, aus der Projektdatenbank β€” dieselbe Quelle wie der GUI-Export
--export-wiring CSV Von-Nach-Verdrahtungsliste, eine Zeile je Leiter β€” entspricht dem MenΓΌ Projekt β†’ Verdrahtungsliste (Datenbank) / Verdrahtungsplan exportieren
--export-cables CSV dieselbe logische Liste, aber aus dem Dokument-XML gebildet
--export-wires CSV Leiternummern β€” entspricht dem MenΓΌ Projekt β†’ Liste der Leiternamen exportieren
--export-nets CSV elektrische Netze β€” zu Potentialen gruppierte Klemmen
--export-links CSV Querverweise, mit Kennzeichnung unverknΓΌpfter Master und Slaves
--info JSON struktureller Abzug: Element- und Leiterzahlen je Folio, unverbundene Klemmen. Schreibt nach stdout, wenn kein Pfad angegeben ist
--resave .qet lΓ€dt das Projekt und schreibt sein XML zurΓΌck
--set-titleblock .qet trΓ€gt Schriftfeldwerte ein und speichert
--check-elements Bericht prΓΌft .elmt-Dateien β€” erwartet eine Datei oder ein Verzeichnis, kein Projekt

Zwei zusΓ€tzliche Schalter:

  • --show-terminals β€” zeichnet Klemmenmarken und -namen in PDF-/PNG-/SVG- Ausgaben. StandardmÀßig aus, passend zum Exportdialog der OberflΓ€che. NΓΌtzlich, um einen unverbundenen Anschluss sichtbar zu machen.
  • --set-titleblock nimmt nach dem Ausgabepfad Zuweisungen schlΓΌssel=wert entgegen: date=today oder ein ISO-Datum JJJJ-MM-TT, die Standard-SchriftfeldschlΓΌssel, oder jeden anderen SchlΓΌssel, der als benutzerdefiniertes Feld abgelegt wird. Fehlerhafte Zuweisungen scheitern, bevor irgendetwas geschrieben wird.

RΓΌckgabewerte

0 Erfolg Β· 1 die Arbeit schlug fehl (Projekt nicht zu ΓΆffnen, nichts zu exportieren, Datei nicht beschreibbar) Β· 2 falsch aufgerufen (fehlendes Argument, fehlerhafte Zuweisung). Damit lΓ€sst sich das Werkzeug direkt in einer CI-Kette verwenden.

Wissenswertes

  • --export-cables und --export-wiring sollen ΓΌbereinstimmen. Eines wird aus dem Dokument-XML gebildet, das andere aus der Projektdatenbank. Beide laufen zu lassen und zu vergleichen prΓΌft unmittelbar, ob die Datenbank das Projekt noch beschreibt β€” was sonst nur ΓΌber die OberflΓ€che sichtbar ist.
  • Setzen Sie in Skripten immer eine Zeitgrenze. Ein mit einer Γ€lteren Version gespeichertes Projekt lΓΆst beim Laden eine Warnung aus; im Kommandozeilenmodus werden Meldungsfenster automatisch beantwortet, doch ein unerwarteter modaler Dialog ist der klassische Weg, einen Lauf ohne OberflΓ€che dauerhaft hΓ€ngen zu lassen.
  • Absturzsicherungen sind im Kommandozeilenmodus bewusst abgeschaltet: Ihr Schreibvorgang im Hintergrund konkurriert mit dem Prozessende.
  • QT_QPA_PLATFORM=offscreen genΓΌgt fΓΌr diese Verben. Xvfb wird nicht benΓΆtigt.
  • Das ist auch QETs echte Antwort auf β€žDrahtbeschriftungen drucken". QET hat keinen eingebauten Drucker fΓΌr Drahtmarkierungen/AderendhΓΌlsen (siehe den Abschnitt Diagramme drucken im Benutzerhandbuch fΓΌr das, was Drucken tatsΓ€chlich abdeckt). Der im Forum dokumentierte Arbeitsablauf besteht darin, dieses CSV zu exportieren und in die eigene Software eines Etikettendruckers einzuspeisen β€” Brady, WAGO Smart-Printer und die Phoenix-Contact-Werkzeuge nehmen allesamt CSV direkt entgegen. Eine bekannte EinschrΓ€nkung, von einem Schaltschrankbauer im Forum gemeldet: Der Export liefert eine Zeile je Leiter ohne Mengenzusammenfassung, N identische Etiketten erscheinen also als N doppelte Zeilen statt einer Zeile mit Mengenspalte β€” vor dem Druck einer grâßeren Charge in einer Tabellenkalkulation entdoppeln. Cembre-artige Drucker, die eine .FNR-Datei oder eine Support-Code-Spalte brauchen, werden von diesem Export gar nicht erst erzeugt; diese Zuordnung muss von Hand aus dem CSV gebaut werden.

Beispiel: eine Revisionskette

set -e
qelectrotech --set-titleblock in.qet gestempelt.qet indexrev=C date=today
qelectrotech --export-pdf gestempelt.qet "release/rev-C.pdf"
qelectrotech --export-bom gestempelt.qet "release/rev-C-bom.csv"

Siehe auch die Kommandozeilen-Referenz.


2. Die Dateien direkt lesen und schreiben

.qet und .elmt sind XML. Alles, was XML verarbeiten kann, kann sie verarbeiten β€” Pythons xml.etree, lxml, xmlstarlet, XSLT, ganz wie Sie mΓΆgen. Das ist gemeint, wenn jemand sagt, er β€žskripte QETβ€œ: Das Skript ist ein eigenes Programm, das die Dateien liest und schreibt und neben QET lΓ€uft, nicht darin.

Ein echtes .qet-GerΓΌst

<project title="ArduinoLCD" version="0.80">
    <properties>
        <property show="1" name="saveddate">17/04/2021</property>
    </properties>
    <newdiagrams>
        <border rows="8" cols="17" rowsize="80" colsize="60" .../>
        <inset folio="%id/%total" author="" title="" .../>
        <conductors type="multi" .../>
        <report label="%f-%l%c"/>
        <xrefs>
            <xref type="coil" master_label="%f-%l%c" slave_label="(%f-%l%c)" .../>
        </xrefs>
    </newdiagrams>
    <diagram title="LCD 4 DATA" order="1" folio="%id/%total" cols="11" rows="7" ...>
        <elements>
            <element x="390" y="570" z="10" orientation="0"
                     type="embed://import/oznaczenia/tekst_08.elmt"
                     uuid="{52d4b9e8-05c3-49a2-8455-a42ff651200a}"
                     prefix="" freezeLabel="false">
                ...
            </element>
        </elements>
        <conductors> ... </conductors>
    </diagram>
    <collection> ... </collection>
</project>

Stolpersteine:

  • Es gibt keine HΓΌlle <diagrams>. <diagram>-Knoten sind direkte Kinder von <project>, einer je Folio, geordnet ΓΌber ihr Attribut order.
  • <element> hat kein id. Es wird ΓΌber uuid identifiziert, und sein Attribut type ist ein Ort, meist embed://… fΓΌr ein in die projekteigene Sammlung kopiertes Element.
  • <newdiagrams> enthΓ€lt die Vorgaben fΓΌr neue Folios, nicht die Folios selbst.
  • Die Elementdefinitionen des Projekts liegen unter <collection>; ein Projekt ist daher in der Regel in sich geschlossen.

VollstΓ€ndige Referenz: Project XML.

Ein echtes .elmt-GerΓΌst

<definition version="0.90" type="element" link_type="master"
            width="200" height="70" hotspot_x="100" hotspot_y="35">
    <uuid uuid="{2cbd2b72-1d04-f03d-758f-ce3a14dbb3c5}"/>
    <names>
        <name lang="en">UPS</name>
        <name lang="fr">UPS</name>
    </names>
    <kindInformations>
        <kindInformation name="type">coil</kindInformation>
    </kindInformations>
    <informations>Author: RDS for QelectroTech</informations>
    <description>
        <rect x="0" y="0" width="460" height="590" style="..."/>
        <terminal uuid="{73279019-…}" name="" x="-90" y="10" orientation="w" type="Generic"/>
    </description>
</definition>

Stolpersteine:

  • width, height, hotspot_x, hotspot_y sind Pflichtattribute von <definition>, und Breite/HΓΆhe mΓΌssen Vielfache von 10 sein β€” sonst rundet QET auf den nΓ€chsten Zehner auf.
  • Die uuid ist ein Attribut (<uuid uuid="{…}"/>), nicht der Elementtext.
  • <name>-EintrΓ€ge gelten je Sprache und brauchen ein lang-Attribut.
  • link_type macht ein Element zum Master, Slave oder zur Klemme β€” siehe Elemente verknΓΌpfen.

VollstΓ€ndige Referenz: Elements XML.

PrΓΌfen Sie, was Sie erzeugen

Eine von Hand geschriebene Datei wird erst geprΓΌft, wenn QET sie ΓΆffnet β€” die Kommandozeile prΓΌft Elementdateien jedoch fΓΌr Sie:

qelectrotech --check-elements meine_elemente/

Jede Datei wird als OK, WARN (lΓ€dt, aber verdΓ€chtig β€” etwa null Klemmen) oder FAIL (nicht lesbar, falsches Wurzel-Tag, fehlender Begrenzungsrahmen) gemeldet, und der RΓΌckgabewert ist bei jedem Fehlschlag ungleich null. GehΓΆrt in die CI, wenn Sie .elmt-Dateien erzeugen.

Faustregeln

  • Schließen Sie das Projekt in QET, bevor Sie seine Datei neu schreiben. QET hΓ€lt ein eigenes Modell im Speicher und ΓΌberschreibt Sie beim Speichern.
  • --resave ist ein billiger Normalisierer: laden, zurΓΌckschreiben, dann vergleichen β€” so sehen Sie, was QET stillschweigend umschreibt, bevor Sie ein Werkzeug auf eine Annahme ΓΌber das Markup stΓΌtzen.
  • Elemente und Leiter werden ΓΌber UUID identifiziert. Einen Elementknoten zu kopieren, ohne ihm eine neue uuid zu geben, erzeugt zwei Elemente, die QET fΓΌr dasselbe hΓ€lt.

3. qet_tb_generator β€” was β€žPluginβ€œ bei QET bedeutet

Es gibt einen Menüeintrag, Plugin zur Klemmenleistenerstellung starten, und ein Programm dahinter. qet_tb_generator ist ein eigenstÀndiges Drittprogramm, über PyPI verteilt, das .qet-Dateien von außen liest und schreibt, um Klemmenleisten zu erzeugen.

python -m pip install --upgrade qet_tb_generator

QET startet es, indem es eine feste Liste von Orten durchsucht β€” QETApp::dataDir() + "/binary/", das aktuelle Verzeichnis, ~/.qet/ und dann, was PATH auflΓΆst β€” und es als gewΓΆhnlichen Kindprozess ausfΓΌhrt. Das ist die gesamte Integration: kein gemeinsamer Speicher, keine API, keine RΓΌckrufe. Liegt die ausfΓΌhrbare Datei auf keinem dieser Pfade, findet der MenΓΌeintrag sie nicht.

UnterstΓΌtzung durch die Gemeinschaft gibt es im Forum: Skripte Β· Code/Programmierung

β€žEin Plugin schreibenβ€œ heißt daher: ein eigenstΓ€ndiges Programm schreiben, das die Dateien bearbeitet, genau wie in Β§2 beschrieben. Es gibt keine Schnittstelle zu implementieren und kein Verzeichnis, in das man installiert.


4. Der C++-Quellcode

Um QET selbst zu Γ€ndern oder einen Fork zu bauen:

Orientierungspunkte, alle in sources/:

Klasse Datei Rolle
QETProject qetproject.cpp ein Projekt: Folios, Sammlung, Laden und Speichern
Diagram diagram.cpp ein Folio (eine QGraphicsScene)
Element qetgraphicsitem/element.cpp ein platziertes Symbol
Conductor qetgraphicsitem/conductor.cpp ein Leiter
Terminal qetgraphicsitem/terminal.cpp ein Anschlusspunkt
projectDataBase dataBase/projectdatabase.cpp der Abfrage-Cache β€” siehe Die Projektdatenbank

Man beachte die Wortlücke: Die OberflÀche sagt Draht, Seite und Symbol, der Code sagt conductor, diagram und element. Nach dem OberflÀchenwort zu suchen ist der übliche Weg, fÀlschlich zu schließen, etwas sei nicht implementiert.


5. Was es nicht gibt

Deutlich gesagt, weil diese Seite zuvor das Gegenteil behauptete:

Behauptung Wirklichkeit
Eingebettete Python-Skripte Es ist kein Interpreter eingebunden oder geladen. Jede Python-ErwΓ€hnung im Quellcode betrifft den Starter fΓΌr qet_tb_generator.
Ein Plugin-System / eine Plugin-Schnittstelle Kein QPluginLoader, keine Plugin-ABI, nichts, was externen Code lΓ€dt.
~/.local/share/QElectroTech/plugins/ und Entsprechungen QET liest diese Pfade nie. Sie anzulegen bewirkt nichts.
Eine Automatisierungs-API zu einer laufenden Instanz Keine. SingleApplication reicht Dateiargumente an eine laufende Instanz weiter, mehr nicht.

Ob QET eine Skriptschnittstelle bekommen sollte, ist eine offene Frage β€” siehe die Seiten Vision und Entwicklungs-Roadmap. Wenn es so weit ist, wird diese Seite es sagen β€” dann, wenn es stimmt, und nicht frΓΌher.

Getting Started

Home

🌐 Languages β€” English Β· FranΓ§ais Β· Deutsch

Downloads

Windows without admin rights β€” the portable archive, no installer

Quick Start Guide

User Manual

FAQ

Tips & Tricks

Guides

Conductors β€” wire properties, what feeds which export, cables, and hops where wires cross

Wires per terminal β€” limit the wires on a terminal, chain wiring instead of stars

Printing and exporting β€” paper, PDF, images, and what each path does differently

Linking elements β€” master, slave, terminal

PLC modules β€” I/O tables and linking a wire to a specific point

Using the element editor β€” drawing tools, saving, checks

Grid size and element size β€” why symbols aren't all the same scale, and scaling one without leaving the grid

Preferences reference β€” what each settings page does

Saving and loading settings β€” your whole setup in one file, to copy or keep

Keyboard-only control β€” mouseless QET, and what still needs a mouse

Mouse modifiers β€” what Shift, Ctrl and Alt change while you drag

3D mouse β€” SpaceMouse pan, zoom and buttons

Aligning items β€” snap symbols back to the grid, or line them up

Pictures on a sheet β€” labels, crop, transparency, what they cost in the file

Arcs and curved wires β€” the Arc tool, pulling an arc in or out, rounding a corner with a fillet, dashed arcs for lighting layouts

Grouping items β€” select, move and copy several items as one

Finding your place on a sheet β€” go to a cell like B13 or 4-B7, keep the headers in sight, show the cell limits, zoom and pan

Showing and hiding kinds of items β€” hide texts, wire numbers, shapes, pictures, tables or cross-references on every sheet

Drawing faster β€” place without dragging, the S shortcut bar, command search, gestures

Customising QElectroTech β€” keys, toolbar size and contents, the gesture ring (partly pending)

Managing collections β€” folders, writability, building your own shortlist

Templates β€” reusable multi-element blocks, placed by double-click or drag

Search & Replace β€” bulk property changes

Building a nomenclature query β€” the BOM/summary table builder

Linking wires across pages β€” sheet reports

Variables & formulas β€” %f, %{label}, sequences

Auto-numbering β€” schemes, sequences, freezing

Terminal strips β€” strips, levels, bridges

Title block templates β€” the .titleblock format

Importing EPLAN parts (.edz) β€” EPLAN Data Portal

DXF import & export β€” two unrelated features, one format; command-line export and layers

The project database β€” the in-memory SQLite cache

File formats
Elements XML
Project XML
Development

Building from Source

Contributing Code

Automating QET β€” CLI, XML formats, external tools

CLI Reference β€” command line usage

JavaScript Scripting β€” --run, geometry editing, undo

MCP server β€” let an AI assistant read, verify and edit projects

Connecting an AI assistant β€” setup for Claude, Copilot, Gemini, Codex, Cursor, LM Studio

Script buttons β€” stored scripts with an icon, by hand or by an assistant

Live mode β€” an assistant working in the open project while you watch

Macro recorder β€” record a task by hand, for an assistant to script

Development Roadmap

Vision β€” proposal, under discussion

Developer Tools

About

Features

History

Community

License

Contributing to this Wiki

Clone this wiki locally