From 287689d18593b051960e371594d4abbe9e0aefff Mon Sep 17 00:00:00 2001 From: Beat Hangartner Date: Wed, 7 Oct 2026 06:18:45 +0200 Subject: [PATCH 01/22] Serve the French UI from qet_fr.ts instead of the code text MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The strings in the code are French and serve as both translation key and displayed text. lang/qet_fr.ts was almost empty: 3425 messages and 22 plural messages had no translation, so lrelease compiled them as null-string records (3469 in qet_fr.qm) and the French UI showed the code text through QTranslator's null fallback. Correcting French wording therefore meant changing the key, which orphans the translation of that string in all 33 other language files; the "Élement" typo fix needed a key rename in 34 files for one accent. This copies every empty French entry's source text into its own translation, so qet_fr.qm is complete (514 KB, 0 null records, like the other languages) and French wording can be corrected in the .ts alone. Translations that already had text (113 French renderings of English-written sources, 16 identical, 54 plurals) are untouched, as are the 10 vanished entries. The file is byte-identical outside the rewritten elements. misc/i18n/mirror_source_language.py does the copy and is meant to run after update_translations; --check exits 1 when a run is needed. Forgetting it breaks nothing: an empty entry still falls back to the code text. INSTALL.md section 10 explains the rule and that -removeidentical must never be added to lrelease. Tests: misc/i18n/test_mirror_source_language.py with a before/after fixture pair covering every message class. No visible change in the application. Co-Authored-By: Claude Fable 5.1 --- INSTALL.md | 17 + lang/qet_fr.ts | 7180 +++++++++++----------- misc/i18n/fixtures/mirror_after.ts | 84 + misc/i18n/fixtures/mirror_before.ts | 82 + misc/i18n/mirror_source_language.py | 211 + misc/i18n/test_mirror_source_language.py | 198 + 6 files changed, 4303 insertions(+), 3469 deletions(-) create mode 100644 misc/i18n/fixtures/mirror_after.ts create mode 100644 misc/i18n/fixtures/mirror_before.ts create mode 100755 misc/i18n/mirror_source_language.py create mode 100755 misc/i18n/test_mirror_source_language.py diff --git a/INSTALL.md b/INSTALL.md index eeb14e741..c651085f6 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -363,3 +363,20 @@ and running it concurrently with the normal `lrelease` compilation step (as would happen under `-j`/parallel builds) can corrupt a `.ts` file mid-write, causing `lrelease` to fail with "Premature end of document". Run it on its own, review the diff, and commit the updated `.ts` files separately. + +The strings in the code are French, so `lang/qet_fr.ts` is the source +language's own file. After `update_translations`, run + +```sh +python3 misc/i18n/mirror_source_language.py lang/qet_fr.ts +``` + +before committing: it copies every new French source string into its own +translation, so `qet_fr.qm` stays complete and French wording can later be +corrected in the `.ts` alone, without changing the key that the other +languages are attached to. Forgetting it breaks nothing (an empty entry +falls back to the code text); `--check` reports whether a run is needed. +A French correction typed into `qet_fr.ts` is lost like any other +translation when the code string is reworded; the vanished entry keeps the +old text for recovery. Never add `-removeidentical` to the `lrelease` +options: it would strip these entries again. diff --git a/lang/qet_fr.ts b/lang/qet_fr.ts index 8d230574c..872b72a3a 100644 --- a/lang/qet_fr.ts +++ b/lang/qet_fr.ts @@ -6,75 +6,75 @@ À propos de QElectrotech - + À propos de QElectrotech À propos - + À propos Auteurs - + Auteurs Traducteurs - + Traducteurs Contributeurs - + Contributeurs Version - + Version Projet annexe - + Projet annexe Bibliothèques - + Bibliothèques Licenses - + Licenses log - + log QElectroTech, une application de réalisation de schémas électriques. about tab, description line - + QElectroTech, une application de réalisation de schémas électriques. Les développeurs de QElectroTech about tab, developers line - + Les développeurs de QElectroTech Contact : <a href="mailto:qet@lists.tuxfamily.org">qet@lists.tuxfamily.org</a> about tab, contact line - + Contact : <a href="mailto:qet@lists.tuxfamily.org">qet@lists.tuxfamily.org</a> Idée originale - + Idée originale @@ -88,241 +88,241 @@ Développement - + Développement Convertisseur DXF - + Convertisseur DXF Plugin Bornier - + Plugin Bornier Collection - + Collection Traduction en espagnol - + Traduction en espagnol Traduction en russe - + Traduction en russe Traduction en portugais - + Traduction en portugais Traduction en tchèque - + Traduction en tchèque Traduction en polonais - + Traduction en polonais Traduction en allemand - + Traduction en allemand Traduction en roumain - + Traduction en roumain Traduction en italien - + Traduction en italien Traduction en arabe - + Traduction en arabe Traduction en croate - + Traduction en croate Traduction en catalan - + Traduction en catalan Traduction en grec - + Traduction en grec Traduction en néerlandais - + Traduction en néerlandais Traduction en flamand - + Traduction en flamand Traduction en danois - + Traduction en danois Traduction en brézilien - + Traduction en brézilien Traduction en Turc - + Traduction en Turc Traduction en hongrois - + Traduction en hongrois Traduction en serbe - + Traduction en serbe Traduction en japonais - + Traduction en japonais Traduction en coréen - + Traduction en coréen Traduction en mongol - + Traduction en mongol Paquets Fedora et Red Hat - + Paquets Fedora et Red Hat Paquets Mageia - + Paquets Mageia Paquets Debian - + Paquets Debian Paquets Gentoo - + Paquets Gentoo Paquets OS/2 - + Paquets OS/2 Paquets FreeBSD - + Paquets FreeBSD Paquets MAC OS X - + Paquets MAC OS X Paquets Archlinux AUR - + Paquets Archlinux AUR Icônes - + Icônes Documentation - + Documentation Collection d'éléments - + Collection d'éléments Redimensionneur d'éléments Element scaler - + Redimensionneur d'éléments Convertisseur d'élément DXF Dxf2elmt - + Convertisseur d'élément DXF Outil de traduction d'éléments Qet_translate - + Outil de traduction d'éléments Paquets Snap - + Paquets Snap Traduction en ukrainien - + Traduction en ukrainien Traduction en norvégien - + Traduction en norvégien Traduction en slovène - + Traduction en slovène Générateur d'élément lambda Lambda element generator - + Générateur d'élément lambda @@ -340,7 +340,7 @@ URL: - + URL: @@ -348,99 +348,99 @@ Ajouter un tableau - + Ajouter un tableau Affichage - + Affichage Ajuster la taille du tableau au folio - + Ajuster la taille du tableau au folio Ajouter de nouveau folio et tableau si nécessaire. - + Ajouter de nouveau folio et tableau si nécessaire. Nom du tableau - + Nom du tableau Texte des en-têtes - + Texte des en-têtes Gauche - + Gauche Centre - + Centre Droite - + Droite Police : - + Police : Éditer - + Éditer Marges : - + Marges : Alignement : - + Alignement : Texte du tableau - + Texte du tableau Configuration - + Configuration Contenu - + Contenu Sélectionner la police des en tête du tableau - + Sélectionner la police des en tête du tableau Sélectionner la police des cellules du tableau - + Sélectionner la police des cellules du tableau @@ -448,12 +448,12 @@ Dialog - + Dialog Ajouter le plan de bornes suivant : - + Ajouter le plan de bornes suivant : @@ -461,127 +461,127 @@ Connecter un assistant IA - + Connecter un assistant IA Un assistant IA (Claude, GitHub Copilot, Gemini…) peut ouvrir, vérifier et modifier vos schémas grâce au serveur MCP de QElectroTech, qui fonctionne sur cet ordinateur. Copiez le texte ci-dessous dans la configuration de votre assistant. <a href="%1">Guide détaillé</a> - + Un assistant IA (Claude, GitHub Copilot, Gemini…) peut ouvrir, vérifier et modifier vos schémas grâce au serveur MCP de QElectroTech, qui fonctionne sur cet ordinateur. Copiez le texte ci-dessous dans la configuration de votre assistant. <a href="%1">Guide détaillé</a> <b>Le serveur MCP n'est pas installé avec cette version de QElectroTech.</b> Le guide explique comment l'obtenir. - + <b>Le serveur MCP n'est pas installé avec cette version de QElectroTech.</b> Le guide explique comment l'obtenir. <b>Python n'est peut-être pas installé.</b> Seul le raccourci « python » du Microsoft Store a été trouvé : sans Python, il ouvre le Store au lieu de lancer le serveur. - + <b>Python n'est peut-être pas installé.</b> Seul le raccourci « python » du Microsoft Store a été trouvé : sans Python, il ouvre le Store au lieu de lancer le serveur. <b>Python est introuvable sur cet ordinateur</b> (commande « %1 »). Le serveur en a besoin. - + <b>Python est introuvable sur cet ordinateur</b> (commande « %1 »). Le serveur en a besoin. Relancez l'installateur de QElectroTech et cochez « Python pour l'assistant IA », ou installez Python depuis python.org. - + Relancez l'installateur de QElectroTech et cochez « Python pour l'assistant IA », ou installez Python depuis python.org. Installez Python 3 avec le gestionnaire de paquets de votre système. - + Installez Python 3 avec le gestionnaire de paquets de votre système. Assistant : - + Assistant : Le dossier de vos schémas - + Le dossier de vos schémas Parcourir… - + Parcourir… Dossier accessible : - + Dossier accessible : Autoriser l'assistant à modifier les schémas - + Autoriser l'assistant à modifier les schémas L'assistant ne peut lire et écrire que dans ce dossier. Sans modification autorisée, il peut seulement lire, comparer et exporter. Un assistant lit le texte des projets (repères, notes…) : un texte écrit comme une instruction peut l'influencer. Laissez les modifications désactivées pour les schémas reçus d'autres personnes. - + L'assistant ne peut lire et écrire que dans ce dossier. Sans modification autorisée, il peut seulement lire, comparer et exporter. Un assistant lit le texte des projets (repères, notes…) : un texte écrit comme une instruction peut l'influencer. Laissez les modifications désactivées pour les schémas reçus d'autres personnes. Copier - + Copier Si le fichier contient déjà d'autres serveurs, ajoutez seulement l'entrée « qet ». - + Si le fichier contient déjà d'autres serveurs, ajoutez seulement l'entrée « qet ». Choisissez d'abord le dossier de vos schémas. - + Choisissez d'abord le dossier de vos schémas. Dossier accessible à l'assistant - + Dossier accessible à l'assistant Copié - + Copié Dans Claude Desktop : Paramètres → Développeur → Modifier la configuration. Puis quittez et relancez Claude. - + Dans Claude Desktop : Paramètres → Développeur → Modifier la configuration. Puis quittez et relancez Claude. Enregistrez-le sous le nom .mcp.json dans le dossier de vos schémas. - + Enregistrez-le sous le nom .mcp.json dans le dossier de vos schémas. Enregistrez-le sous le nom .vscode/mcp.json dans le dossier ouvert dans VS Code. Copilot utilise les outils en mode agent. - + Enregistrez-le sous le nom .vscode/mcp.json dans le dossier ouvert dans VS Code. Copilot utilise les outils en mode agent. Ajoutez-le au fichier .cursor/mcp.json de votre dossier personnel. - + Ajoutez-le au fichier .cursor/mcp.json de votre dossier personnel. Ajoutez-le au fichier .gemini/settings.json de votre dossier personnel. Gemini CLI demande de faire confiance au dossier la première fois. - + Ajoutez-le au fichier .gemini/settings.json de votre dossier personnel. Gemini CLI demande de faire confiance au dossier la première fois. Ajoutez-le au fichier .codex/config.toml de votre dossier personnel. - + Ajoutez-le au fichier .codex/config.toml de votre dossier personnel. Dans LM Studio : onglet Program → Install → Edit mcp.json. - + Dans LM Studio : onglet Program → Install → Edit mcp.json. @@ -589,7 +589,7 @@ Alignement du texte - + Alignement du texte @@ -597,32 +597,32 @@ Centre : - + Centre : Diamètres : - + Diamètres : horizontal : - + horizontal : vertical : - + vertical : Angle de départ : - + Angle de départ : Angle : - + Angle : @@ -630,32 +630,32 @@ Le nom de la numérotation ne peut pas être vide. - + Le nom de la numérotation ne peut pas être vide. Une numérotation nommée « %1 » existe déjà. - + Une numérotation nommée « %1 » existe déjà. Créer la numérotation %1 - + Créer la numérotation %1 Renommer la numérotation %1 en %2 - + Renommer la numérotation %1 en %2 Modifier la numérotation %1 - + Modifier la numérotation %1 Supprimer la numérotation %1 - + Supprimer la numérotation %1 @@ -663,111 +663,111 @@ Sélection numérotation auto - + Sélection numérotation auto Valeur - + Valeur Incrément - + Incrément Suivant - + Suivant Réinitialiser à la valeur de départ - + Réinitialiser à la valeur de départ Valeur actuelle du compteur. Saisir une nouvelle valeur et valider pour la modifier. - + Valeur actuelle du compteur. Saisir une nouvelle valeur et valider pour la modifier. Incrément : valeur ajoutée au compteur à chaque nouvelle numérotation - + Incrément : valeur ajoutée au compteur à chaque nouvelle numérotation Prochaine valeur qui sera appliquée avec cet incrément - + Prochaine valeur qui sera appliquée avec cet incrément Element - + Element Conducteur - + Conducteur Configurer les règles d'auto numérotation - + Configurer les règles d'auto numérotation Configurer - + Configurer Folio - + Folio Appliquer cette numérotation aux éléments sélectionnés - + Appliquer cette numérotation aux éléments sélectionnés Appliquer la numérotation - + Appliquer la numérotation Choisissez une numérotation d'éléments du projet. - + Choisissez une numérotation d'éléments du projet. Sélectionnez d'abord des éléments dans le folio. - + Sélectionnez d'abord des éléments dans le folio. (figé) - + (figé) (autre numérotation) - + (autre numérotation) Rien à appliquer : les éléments sélectionnés suivent déjà la numérotation « %1 », ou prennent leur nom d'un autre élément. - + Rien à appliquer : les éléments sélectionnés suivent déjà la numérotation « %1 », ou prennent leur nom d'un autre élément. @@ -780,7 +780,7 @@ Aucun élément ne peut recevoir la numérotation « %1 » sans remplacer ce qu'il a. - + Aucun élément ne peut recevoir la numérotation « %1 » sans remplacer ce qu'il a. @@ -809,12 +809,12 @@ Autonumérotation - + Autonumérotation Sélectionnez d'abord des éléments dans le folio - + Sélectionnez d'abord des éléments dans le folio @@ -938,17 +938,17 @@ Renuméroter les éléments - + Renuméroter les éléments Renuméroter les éléments (%1) - + Renuméroter les éléments (%1) Aucun élément ne suit cette numérotation. - + Aucun élément ne suit cette numérotation. @@ -1009,81 +1009,83 @@ Remarque: Ces options n'autorisent ou bloquent l'auto numérotation, s Dialog - + Dialog Mise en page - + Mise en page inclure les en-têtes - + inclure les en-têtes Formater en tant que liste de materiel - + Formater en tant que liste de materiel Aperçu - + Aperçu nomenclature_ - + nomenclature_ Enregister sous... - + Enregister sous... Fichiers csv (*.csv) - + Fichiers csv (*.csv) Erreur - + Erreur Impossible d'enregistrer la nomenclature dans %1. %2 - + Impossible d'enregistrer la nomenclature dans %1. +%2 Position - + Position Position du folio - + Position du folio Quantité numéro d'article Special field with name : designation quantity - + Quantité numéro d'article Requête refusée - + Requête refusée Erreur dans la requête : %1 - + Erreur dans la requête : +%1 @@ -1092,25 +1094,25 @@ Remarque: Ces options n'autorisent ou bloquent l'auto numérotation, s Créer une copie de sauvegarde ? window title - + Créer une copie de sauvegarde ? Souhaitez-vous créer une copie de sauvegarde ? dialog message - + Souhaitez-vous créer une copie de sauvegarde ? Oui yes button - + Oui Non no button - + Non @@ -1119,19 +1121,19 @@ Remarque: Ces options n'autorisent ou bloquent l'auto numérotation, s Fichiers de restauration window title - + Fichiers de restauration <b>Des fichiers de restauration ont été trouvés,<br>voulez-vous les ouvrir ?</b><br>Pour un projet ayant plusieurs versions de restauration, la plus récente est sélectionnée par défaut. dialog message - + <b>Des fichiers de restauration ont été trouvés,<br>voulez-vous les ouvrir ?</b><br>Pour un projet ayant plusieurs versions de restauration, la plus récente est sélectionnée par défaut. %1 (la plus récente) recovery generation label - + %1 (la plus récente) @@ -1139,12 +1141,12 @@ Remarque: Ces options n'autorisent ou bloquent l'auto numérotation, s Form - + Form Dimensions du folio - + Dimensions du folio @@ -1152,29 +1154,29 @@ Remarque: Ces options n'autorisent ou bloquent l'auto numérotation, s px pixel pixel - + px x - + x Lignes : - + Lignes : Colonnes : - + Colonnes : Afficher les en-têtes - + Afficher les en-têtes @@ -1182,7 +1184,7 @@ Remarque: Ces options n'autorisent ou bloquent l'auto numérotation, s Cliquez pour choisir une couleur - + Cliquez pour choisir une couleur @@ -1190,12 +1192,12 @@ Remarque: Ces options n'autorisent ou bloquent l'auto numérotation, s Rechercher une commande… - + Rechercher une commande… Entrée pour lancer · Échap pour fermer - + Entrée pour lancer · Échap pour fermer @@ -1203,18 +1205,18 @@ Remarque: Ces options n'autorisent ou bloquent l'auto numérotation, s Texte composé - + Texte composé Ajouter une variable : - + Ajouter une variable : Entrée votre texte composé ici, en vous aidant des variables disponible - + Entrée votre texte composé ici, en vous aidant des variables disponible @@ -1223,13 +1225,13 @@ Remarque: Ces options n'autorisent ou bloquent l'auto numérotation, s Modifier les propriétés d'un conducteur undo caption - + Modifier les propriétés d'un conducteur Modifier les propriétés de plusieurs conducteurs undo caption - + Modifier les propriétés de plusieurs conducteurs @@ -1237,82 +1239,82 @@ Remarque: Ces options n'autorisent ou bloquent l'auto numérotation, s Noir - + Noir Marron - + Marron Gris - + Gris Bleu - + Bleu Vert - + Vert Rouge - + Rouge Orange - + Orange Violet - + Violet Blanc - + Blanc Couleur de conducteur - + Couleur de conducteur Applique une couleur aux conducteurs sélectionnés, et l'utilise pour les prochains conducteurs tracés status bar tip - + Applique une couleur aux conducteurs sélectionnés, et l'utilise pour les prochains conducteurs tracés Récemment utilisées - + Récemment utilisées Autre couleur… - + Autre couleur… Modifier la couleur de %n conducteur(s) undo caption - - + Modifier la couleur de %n conducteur(s) + Modifier la couleur de %n conducteur(s) Choisir une couleur de conducteur - + Choisir une couleur de conducteur @@ -1320,24 +1322,24 @@ Remarque: Ces options n'autorisent ou bloquent l'auto numérotation, s Éditer les propriétés d'un conducteur - + Éditer les propriétés d'un conducteur Appliquer les propriétés à l'ensemble des conducteurs de ce potentiel - + Appliquer les propriétés à l'ensemble des conducteurs de ce potentiel Modifier les propriétés d'un conducteur undo caption - + Modifier les propriétés d'un conducteur Modifier les propriétés de plusieurs conducteurs undo caption - + Modifier les propriétés de plusieurs conducteurs @@ -1345,24 +1347,24 @@ Remarque: Ces options n'autorisent ou bloquent l'auto numérotation, s Appliquer les propriétés à l'ensemble des conducteurs de ce potentiel - + Appliquer les propriétés à l'ensemble des conducteurs de ce potentiel Modifier les propriétés d'un conducteur undo caption - + Modifier les propriétés d'un conducteur Modifier les propriétés de plusieurs conducteurs undo caption - + Modifier les propriétés de plusieurs conducteurs Conducteur - + Conducteur @@ -1379,265 +1381,266 @@ Remarque: Ces options n'autorisent ou bloquent l'auto numérotation, s Form - + Form Type - + Type Taille du texte : - + Taille du texte : Taille du texte - + Taille du texte Tension / Protocole : - + Tension / Protocole : Texte : - + Texte : Fonction : - + Fonction : Texte - + Texte Texte visible - + Texte visible Formule du texte : - + Formule du texte : activer l'option un texte par potentiel - + activer l'option un texte par potentiel &Multifilaire - + &Multifilaire Afficher un texte de potentiel par folio. - + Afficher un texte de potentiel par folio. Autonumérotation - + Autonumérotation éditer les numérotations - + éditer les numérotations Section du conducteur - + Section du conducteur cable - + cable bus - + bus Unifilaire - + Unifilaire Nombre de phase - + Nombre de phase Neutre - + Neutre neutre - + neutre Phase - + Phase phase - + phase Protective Earth Neutral - + Protective Earth Neutral PEN - + PEN Terre - + Terre terre - + terre TextLabel - + TextLabel Apparence - + Apparence Couleur du conducteur - + Couleur du conducteur Couleur : - + Couleur : Taille : - + Taille : Style du conducteur - + Style du conducteur Style : - + Style : Horizontal en haut - + Horizontal en haut Horizontal en bas - + Horizontal en bas Vertical à gauche - + Vertical à gauche Couleur du texte: - + Couleur du texte: Vertical à droite - + Vertical à droite Position et rotation du texte de conducteur : - + Position et rotation du texte de conducteur : Couleur secondaire : - + Couleur secondaire : px - + px Taille de trait : - + Taille de trait : Texte visible Verrouillé par l'option « Afficher un texte de potentiel par folio » de ce folio, dans Propriétés du folio. - + Texte visible +Verrouillé par l'option « Afficher un texte de potentiel par folio » de ce folio, dans Propriétés du folio. Trait plein conductor style: solid line - + Trait plein Trait en pointillés conductor style: dashed line - + Trait en pointillés Traits et points conductor style: dashed and dotted line - + Traits et points Plusieurs valeurs several conductors, different values - + Plusieurs valeurs Plusieurs conducteurs sélectionnés : le texte se modifie sur un seul conducteur à la fois. - + Plusieurs conducteurs sélectionnés : le texte se modifie sur un seul conducteur à la fois. @@ -1645,12 +1648,12 @@ Verrouillé par l'option « Afficher un texte de potentiel par folio » de GroupBox - + GroupBox Configuration - + Configuration @@ -1658,124 +1661,124 @@ Verrouillé par l'option « Afficher un texte de potentiel par folio » de Sélectionner un groupe de contacts - + Sélectionner un groupe de contacts Sélectionnez le groupe de contacts à assigner à cet élément esclave : - + Sélectionnez le groupe de contacts à assigner à cet élément esclave : # - + # Type - + Type Sous-type - + Sous-type Contacts - + Contacts Bornes - + Bornes T%1 - + T%1 (déjà assigné) - + (déjà assigné) (état ne correspond pas) - + (état ne correspond pas) (sous-type ne correspond pas) - + (sous-type ne correspond pas) (nombre de contacts ne correspond pas) - + (nombre de contacts ne correspond pas) OK - + OK Annuler - + Annuler Normalement ouvert - + Normalement ouvert Normalement fermé - + Normalement fermé Inverseur - + Inverseur Autre - + Autre Inconnu - + Inconnu Simple - + Simple Puissance - + Puissance Temporisé travail - + Temporisé travail Temporisé repos - + Temporisé repos Temporisé travail & repos - + Temporisé travail & repos @@ -1783,7 +1786,7 @@ Verrouillé par l'option « Afficher un texte de potentiel par folio » de Compteur de la numérotation - + Compteur de la numérotation @@ -1799,7 +1802,10 @@ Verrouillé par l'option « Afficher un texte de potentiel par folio » de Les nouveaux éléments sauteront les numéros déjà pris : ils ne recevront pas forcément les numéros à partir de %1. Continuer ? - + +Les nouveaux éléments sauteront les numéros déjà pris : ils ne recevront pas forcément les numéros à partir de %1. + +Continuer ? @@ -1807,7 +1813,7 @@ Continuer ? Déplacer une primitive - + Déplacer une primitive @@ -1815,17 +1821,17 @@ Continuer ? nom_de_la_propriete - + nom_de_la_propriete Lettres minuscules, chiffres, tiret et underscore uniquement - + Lettres minuscules, chiffres, tiret et underscore uniquement Supprimer cette propriété - + Supprimer cette propriété @@ -1833,27 +1839,27 @@ Continuer ? Enregistrer... - + Enregistrer... Enregistrer le rapport de diagnostic - + Enregistrer le rapport de diagnostic Fichiers texte (*.txt);;Tous les fichiers (*) - + Fichiers texte (*.txt);;Tous les fichiers (*) Erreur - + Erreur Impossible d'écrire dans le fichier « %1 ». - + Impossible d'écrire dans le fichier « %1 ». @@ -1861,7 +1867,7 @@ Continuer ? Modifier la profondeur - + Modifier la profondeur @@ -1869,63 +1875,63 @@ Continuer ? Blanc - + Blanc Blanc cassé - + Blanc cassé Gris clair - + Gris clair Gris - + Gris Gris foncé - + Gris foncé Noir - + Noir Couleur de fond du folio - + Couleur de fond du folio Choisir la couleur de fond du folio status bar tip - + Choisir la couleur de fond du folio Couleur système - + Couleur système Récemment utilisées - + Récemment utilisées Autre couleur… - + Autre couleur… Choisir une couleur de fond - + Choisir une couleur de fond @@ -1939,17 +1945,17 @@ Continuer ? Les noms ne peuvent contenir que des lettres minuscules, des chiffres et des tirets. - + Les noms ne peuvent contenir que des lettres minuscules, des chiffres et des tirets. Nom - + Nom Valeur - + Valeur @@ -1962,22 +1968,22 @@ Continuer ? Poignées : - + Poignées : x 1 - + x 1 x 2 - + x 2 x 3 - + x 3 @@ -1985,7 +1991,7 @@ Continuer ? Ajouter %1 - + Ajouter %1 @@ -1993,7 +1999,7 @@ Continuer ? Clic : positionner à la taille d'origine. Cliquer-glisser : positionner et redimensionner. Clic droit : pivoter de 90°. Ctrl+molette : ajuster la taille. - + Clic : positionner à la taille d'origine. Cliquer-glisser : positionner et redimensionner. Clic droit : pivoter de 90°. Ctrl+molette : ajuster la taille. @@ -2002,7 +2008,7 @@ Continuer ? Cliquez pour poser le collage, Échap ou clic droit pour annuler status bar tip while positioning a paste - + Cliquez pour poser le collage, Échap ou clic droit pour annuler @@ -2010,7 +2016,7 @@ Continuer ? Clic: point anguleux. Cliquer-glisser: point courbe. Clic sur le premier point: fermer. Échap/Entrée: terminer. Clic droit: annuler le dernier point. - + Clic: point anguleux. Cliquer-glisser: point courbe. Clic sur le premier point: fermer. Échap/Entrée: terminer. Clic droit: annuler le dernier point. @@ -2018,47 +2024,47 @@ Continuer ? Clic gauche : positionner le point de départ (Ctrl = position libre) - + Clic gauche : positionner le point de départ (Ctrl = position libre) Clic gauche : positionner une extrémité de l'arc (Ctrl = position libre) - + Clic gauche : positionner une extrémité de l'arc (Ctrl = position libre) Clic gauche : positionner le premier coin (Ctrl = point central, position libre) - + Clic gauche : positionner le premier coin (Ctrl = point central, position libre) Clic gauche : positionner le premier point (Ctrl = position libre) - + Clic gauche : positionner le premier point (Ctrl = position libre) Clic gauche : positionner le point final (Ctrl = position libre) ; clic droit : annuler - + Clic gauche : positionner le point final (Ctrl = position libre) ; clic droit : annuler Clic gauche : positionner le coin opposé (Maj = carré, Ctrl = depuis le centre + position libre, Ctrl+Maj = carré centré) ; clic droit : annuler - + Clic gauche : positionner le coin opposé (Maj = carré, Ctrl = depuis le centre + position libre, Ctrl+Maj = carré centré) ; clic droit : annuler Clic gauche : positionner l'autre extrémité et la hauteur de l'arc (Maj = demi-cercle, Ctrl = position libre) ; clic droit : annuler - + Clic gauche : positionner l'autre extrémité et la hauteur de l'arc (Maj = demi-cercle, Ctrl = position libre) ; clic droit : annuler Clic gauche : positionner le coin opposé (Maj = cercle, Ctrl = depuis le centre + position libre, Ctrl+Maj = cercle centré) ; clic droit : annuler - + Clic gauche : positionner le coin opposé (Maj = cercle, Ctrl = depuis le centre + position libre, Ctrl+Maj = cercle centré) ; clic droit : annuler Clic gauche : point suivant ; double-clic ou Entrée : terminer ; clic droit : annuler le dernier point - + Clic gauche : point suivant ; double-clic ou Entrée : terminer ; clic droit : annuler le dernier point @@ -2066,57 +2072,57 @@ Continuer ? Aucune ligne ici : cliquez sur une ligne dessinée sur le folio - + Aucune ligne ici : cliquez sur une ligne dessinée sur le folio Cliquez sur la deuxième ligne ; clic droit : annuler - + Cliquez sur la deuxième ligne ; clic droit : annuler Cliquez sur une autre ligne ; clic droit : annuler - + Cliquez sur une autre ligne ; clic droit : annuler Ces deux lignes sont parallèles : pas de congé possible - + Ces deux lignes sont parallèles : pas de congé possible Une des lignes s'arrête au coin : rien à arrondir de ce côté - + Une des lignes s'arrête au coin : rien à arrondir de ce côté Ces deux lignes sont presque alignées : pas de congé possible - + Ces deux lignes sont presque alignées : pas de congé possible Congé - + Congé Rayon : - + Rayon : Rayon trop grand pour ces lignes (%1 au plus) - + Rayon trop grand pour ces lignes (%1 au plus) Ajouter un congé - + Ajouter un congé Congé : cliquez sur deux lignes, ou une fois là où elles se rejoignent ; Échap ou clic droit : terminer - + Congé : cliquez sur deux lignes, ou une fois là où elles se rejoignent ; Échap ou clic droit : terminer @@ -2124,224 +2130,224 @@ Continuer ? redimensionner - + redimensionner pivoter/incliner - + pivoter/incliner Cliquer : mode %1 - + Cliquer : mode %1 Glisser un coin/bord : redimensionner (Ctrl = depuis le centre, Maj = conserver les proportions) - + Glisser un coin/bord : redimensionner (Ctrl = depuis le centre, Maj = conserver les proportions) Glisser un coin : pivoter (Maj = par pas de 15°) ; glisser un bord : incliner (Maj = par pas de 15°) ; point rouge : déplacer le centre de rotation - + Glisser un coin : pivoter (Maj = par pas de 15°) ; glisser un bord : incliner (Maj = par pas de 15°) ; point rouge : déplacer le centre de rotation -- %1 : mode %2 - + -- %1 : mode %2 Cliquer - + Cliquer Glisser : redimensionner (Maj = conserver les proportions, Ctrl = depuis le centre) - + Glisser : redimensionner (Maj = conserver les proportions, Ctrl = depuis le centre) Glisser : pivoter (Maj = par pas de 15°) - + Glisser : pivoter (Maj = par pas de 15°) Glisser : incliner (Maj = par pas de 15°) - + Glisser : incliner (Maj = par pas de 15°) Glisser : déplacer le centre de rotation - + Glisser : déplacer le centre de rotation Redimensionner une image - + Redimensionner une image Faire pivoter une image - + Faire pivoter une image Incliner une image - + Incliner une image Déplacer le centre de rotation d'une image - + Déplacer le centre de rotation d'une image Modifier une image - + Modifier une image Restaurer les proportions d'une image - + Restaurer les proportions d'une image Enregistrer l'image sous... - + Enregistrer l'image sous... Enregistrer l'image d'origine sous... - + Enregistrer l'image d'origine sous... Image PNG (*.png) - + Image PNG (*.png) Image JPEG (*.jpg *.jpeg) - + Image JPEG (*.jpg *.jpeg) Image BMP (*.bmp) - + Image BMP (*.bmp) Image SVG (*.svg) - + Image SVG (*.svg) Tous les fichiers (*) - + Tous les fichiers (*) Transparence non conservée - + Transparence non conservée Ce format ne prend pas en charge la transparence : l'image sera enregistrée telle qu'elle était avant l'application de la couleur transparente. Continuer ? - + Ce format ne prend pas en charge la transparence : l'image sera enregistrée telle qu'elle était avant l'application de la couleur transparente. Continuer ? Échec de l'enregistrement - + Échec de l'enregistrement Impossible d'enregistrer l'image à cet emplacement. - + Impossible d'enregistrer l'image à cet emplacement. une image - + une image Remplacer l'image... - + Remplacer l'image... Couleur transparente... - + Couleur transparente... Rogner... - + Rogner... Miroir horizontal - + Miroir horizontal Miroir vertical - + Miroir vertical Restaurer les proportions - + Restaurer les proportions Selectionner une image... - + Selectionner une image... Image Files (*.png *.jpg *.jpeg *.bmp *.svg) - + Image Files (*.png *.jpg *.jpeg *.bmp *.svg) Erreur - + Erreur Impossible de charger l'image. - + Impossible de charger l'image. Remplacer une image - + Remplacer une image Miroir horizontal d'une image - + Miroir horizontal d'une image Miroir vertical d'une image - + Miroir vertical d'une image Définir une couleur transparente - + Définir une couleur transparente Rogner une image - + Rogner une image @@ -2350,7 +2356,7 @@ Continuer ? Propriétés du folio window title - + Propriétés du folio @@ -2358,7 +2364,7 @@ Continuer ? Maintenir ctrl pour un déplacement libre - + Maintenir ctrl pour un déplacement libre @@ -2374,83 +2380,84 @@ Maintenir Maj et faire glisser pour déplacer ce texte seul Ceci est la zone dans laquelle vous concevez vos schémas en y ajoutant des éléments et en posant des conducteurs entre leurs bornes. Il est également possible d'ajouter des textes indépendants. "What's this?" tip - + Ceci est la zone dans laquelle vous concevez vos schémas en y ajoutant des éléments et en posant des conducteurs entre leurs bornes. Il est également possible d'ajouter des textes indépendants. Coller ici context menu action - + Coller ici Collage multiple - + Collage multiple Créer un template context menu action - + Créer un template Générer une vignette d'armoire context menu action - + Générer une vignette d'armoire Renvoi de folio - + Renvoi de folio X: %1 Y: %2 - + X: %1 Y: %2 Connecter les bornes sélectionnées - + Connecter les bornes sélectionnées Sans titre what to display for untitled diagrams - + Sans titre Modèle enregistré - + Modèle enregistré Le modèle a été enregistré avec succès sous : %1 - + Le modèle a été enregistré avec succès sous : +%1 Erreur - + Erreur Le fichier n'a pas pu être écrit. - + Le fichier n'a pas pu être écrit. Choisir la nouvelle couleur de ce conducteur - + Choisir la nouvelle couleur de ce conducteur Modifier les propriétés d'un conducteur undo caption - + Modifier les propriétés d'un conducteur @@ -2458,17 +2465,17 @@ Maintenir Maj et faire glisser pour déplacer ce texte seul Merci de patienter - + Merci de patienter Titre - + Titre TextLabel - + TextLabel @@ -2476,42 +2483,42 @@ Maintenir Maj et faire glisser pour déplacer ce texte seul Dupliquer - + Dupliquer pas de grille - + pas de grille Espacement : - + Espacement : Haut - + Haut Bas - + Bas Gauche - + Gauche Droite - + Droite Direction : - + Direction : @@ -2519,17 +2526,17 @@ Maintenir Maj et faire glisser pour déplacer ce texte seul Texte - + Texte Éditer un texte d'élément - + Éditer un texte d'élément Redimensionner un texte d'élément - + Redimensionner un texte d'élément @@ -2542,7 +2549,7 @@ Maintenir Maj et faire glisser pour déplacer ce texte seul Exporter l'actuelle configuration des textes - + Exporter l'actuelle configuration des textes @@ -2551,57 +2558,57 @@ Maintenir Maj et faire glisser pour déplacer ce texte seul ... - + ... Importer une configuration de texte - + Importer une configuration de texte Ajouter un texte - + Ajouter un texte Ajouter un groupe de textes - + Ajouter un groupe de textes Supprimer la sélection - + Supprimer la sélection Textes - + Textes Modifier des textes d'élément - + Modifier des textes d'élément Modifier un texte d'élément - + Modifier un texte d'élément Modifier %1 textes d'élément - + Modifier %1 textes d'élément Nom du groupe - + Nom du groupe Entrer le nom du nouveau groupe - + Entrer le nom du nouveau groupe @@ -2609,17 +2616,17 @@ Maintenir Maj et faire glisser pour déplacer ce texte seul Propriété - + Propriété Valeur - + Valeur Source du texte - + Source du texte @@ -2628,7 +2635,7 @@ Maintenir Maj et faire glisser pour déplacer ce texte seul Texte utilisateur - + Texte utilisateur @@ -2637,7 +2644,7 @@ Maintenir Maj et faire glisser pour déplacer ce texte seul Information de l'élément - + Information de l'élément @@ -2646,173 +2653,173 @@ Maintenir Maj et faire glisser pour déplacer ce texte seul Texte composé - + Texte composé Texte - + Texte Information - + Information Mon texte composé - + Mon texte composé Taille - + Taille Police - + Police Largeur - + Largeur Conserver la rotation visuel - + Conserver la rotation visuel Éditer - + Éditer Modifier la police d'un texte d'élément - + Modifier la police d'un texte d'élément Modifier le maintient de la rotation d'un texte d'élément - + Modifier le maintient de la rotation d'un texte d'élément Modifier l'alignement d'un texte d'élément - + Modifier l'alignement d'un texte d'élément Modifier la taille d'un texte d'élément - + Modifier la taille d'un texte d'élément Modifier la couleur d'un texte d'élément - + Modifier la couleur d'un texte d'élément Modifier le cadre d'un texte d'élément - + Modifier le cadre d'un texte d'élément Modifier la largeur d'un texte d'élément - + Modifier la largeur d'un texte d'élément Déplacer un texte d'élément - + Déplacer un texte d'élément Pivoter un texte d'élément - + Pivoter un texte d'élément Éditer un groupe de textes - + Éditer un groupe de textes Gauche - + Gauche Droite - + Droite Centre - + Centre Alignement - + Alignement Ajustement vertical - + Ajustement vertical Maintenir en bas de page - + Maintenir en bas de page Déplacer un texte dans un autre groupe - + Déplacer un texte dans un autre groupe Couleur - + Couleur Cadre - + Cadre Position X - + Position X Position Y - + Position Y Rotation - + Rotation Éditer un texte d'élément - + Éditer un texte d'élément @@ -2825,135 +2832,135 @@ Maintenir Maj et faire glisser pour déplacer ce texte seul Source du texte - + Source du texte Couleur - + Couleur Conserver la rotation visuel - + Conserver la rotation visuel Texte utilisateur - + Texte utilisateur Information de l'élément - + Information de l'élément Encadrer le texte - + Encadrer le texte Texte composé - + Texte composé Police - + Police X - + X Largeur - + Largeur Tourner autour de son propre centre - + Tourner autour de son propre centre Y - + Y Alignement - + Alignement Rotation - + Rotation Déplacer un champ texte - + Déplacer un champ texte Pivoter un champ texte - + Pivoter un champ texte Modifier le texte d'un champ texte - + Modifier le texte d'un champ texte Modifier la police d'un champ texte - + Modifier la police d'un champ texte Modifier la couleur d'un champ texte - + Modifier la couleur d'un champ texte Modifier la conservation de l'angle - + Modifier la conservation de l'angle Modifier le point de rotation d'un champ texte - + Modifier le point de rotation d'un champ texte Modifier le cadre d'un champ texte - + Modifier le cadre d'un champ texte Modifier la largeur d'un texte - + Modifier la largeur d'un texte Modifier l'information d'un texte - + Modifier l'information d'un texte Modifier la source de texte, d'un texte - + Modifier la source de texte, d'un texte Modifier l'alignement d'un champ texte - + Modifier l'alignement d'un champ texte @@ -2961,32 +2968,32 @@ Maintenir Maj et faire glisser pour déplacer ce texte seul Texte utilisateur - + Texte utilisateur Information de l'élément - + Information de l'élément Texte composé - + Texte composé Gauche - + Gauche Centre - + Centre Droite - + Droite @@ -2994,12 +3001,12 @@ Maintenir Maj et faire glisser pour déplacer ce texte seul ex. 80.5 - + ex. 80.5 Nombre décimal avec un point comme séparateur (ex. 80.5) - + Nombre décimal avec un point comme séparateur (ex. 80.5) @@ -3041,7 +3048,7 @@ Maintenir Maj et faire glisser pour déplacer ce texte seul Numéroter automatiquement un élément undo caption - + Numéroter automatiquement un élément @@ -3049,72 +3056,72 @@ Maintenir Maj et faire glisser pour déplacer ce texte seul Le nom de la numérotation ne peut pas être vide. - + Le nom de la numérotation ne peut pas être vide. Une numérotation nommée « %1 » existe déjà. - + Une numérotation nommée « %1 » existe déjà. Cet élément n'est dans aucun folio. - + Cet élément n'est dans aucun folio. Cet élément ne suit aucune numérotation. - + Cet élément ne suit aucune numérotation. La numérotation « %1 » n'a pas un seul numéro : on ne peut pas en choisir un à la main. - + La numérotation « %1 » n'a pas un seul numéro : on ne peut pas en choisir un à la main. Le numéro doit être au moins 1. - + Le numéro doit être au moins 1. Le numéro %1 n'est pas libre. - + Le numéro %1 n'est pas libre. Attribuer le numéro %1 - + Attribuer le numéro %1 Appliquer la numérotation %1 - + Appliquer la numérotation %1 Numéroter les éléments collés (%1) - + Numéroter les éléments collés (%1) Créer la numérotation d'éléments %1 - + Créer la numérotation d'éléments %1 Renommer la numérotation d'éléments %1 en %2 - + Renommer la numérotation d'éléments %1 en %2 Modifier la numérotation d'éléments %1 - + Modifier la numérotation d'éléments %1 Supprimer la numérotation d'éléments %1 - + Supprimer la numérotation d'éléments %1 @@ -3123,144 +3130,145 @@ Maintenir Maj et faire glisser pour déplacer ce texte seul Ouvrir un élément dialog title - + Ouvrir un élément Choisissez l'élément que vous souhaitez ouvrir. dialog content - + Choisissez l'élément que vous souhaitez ouvrir. Enregistrer un élément dialog title - + Enregistrer un élément Choisissez l'élément dans lequel vous souhaitez enregistrer votre définition. dialog content - + Choisissez l'élément dans lequel vous souhaitez enregistrer votre définition. Ouvrir une catégorie dialog title - + Ouvrir une catégorie Choisissez une catégorie. dialog content - + Choisissez une catégorie. Enregistrer une catégorie dialog title - + Enregistrer une catégorie Enregistrer un template dialog title - + Enregistrer un template Choisissez l'emplacement dans lequel vous souhaitez enregistrer votre template. dialog content - + Choisissez l'emplacement dans lequel vous souhaitez enregistrer votre template. Titre - + Titre Label - + Label Nom du nouveau dossier - + Nom du nouveau dossier Nom du nouveau template - + Nom du nouveau template Nom de fichier de l'élément placeholder: the element's file name, not its display name - + Nom de fichier de l'élément Nom de fichier de l'élément : chiffres, minuscules, « - », « _ » et « . » uniquement. Le nom affiché de l'élément se modifie séparément dans les propriétés de l'élément. tooltip for the element file-name field - + Nom de fichier de l'élément : chiffres, minuscules, « - », « _ » et « . » uniquement. +Le nom affiché de l'élément se modifie séparément dans les propriétés de l'élément. Sélection inexistante message box title - + Sélection inexistante La sélection n'existe pas. message box content - + La sélection n'existe pas. Sélection incorrecte message box title - + Sélection incorrecte La sélection n'est pas un élément. message box content - + La sélection n'est pas un élément. Écraser l'élément ? message box title - + Écraser l'élément ? Écraser le template ? message box title - + Écraser le template ? L'élément existe déjà. Voulez-vous l'écraser ? message box content - + L'élément existe déjà. Voulez-vous l'écraser ? Le template existe déjà. Voulez-vous l'écraser ? message box content - + Le template existe déjà. Voulez-vous l'écraser ? Vous devez sélectionner un élément ou une catégorie avec un nom pour l'élément. message box content - + Vous devez sélectionner un élément ou une catégorie avec un nom pour l'élément. @@ -3268,33 +3276,33 @@ Le nom affiché de l'élément se modifie séparément dans les propriété Form - + Form TextLabel - + TextLabel Supprimer ce texte - + Supprimer ce texte Choisir un article dans la liste de matériaux tooltip of the button opening the material file; it fills the fields of this block from a catalogue entry - + Choisir un article dans la liste de matériaux ex. 80.5 - + ex. 80.5 Nombre décimal avec un point comme séparateur (ex. 80.5) - + Nombre décimal avec un point comme séparateur (ex. 80.5) @@ -3307,32 +3315,32 @@ Le nom affiché de l'élément se modifie séparément dans les propriété Exclure de la numérotation auto - + Exclure de la numérotation auto Informations - + Informations Ajouter une propriété personnalisée - + Ajouter une propriété personnalisée Séparation de potentiel - + Séparation de potentiel Exclure de la nomenclature - + Exclure de la nomenclature Liste de matériaux absente - + Liste de matériaux absente @@ -3341,95 +3349,100 @@ Le nom affiché de l'élément se modifie séparément dans les propriété Le créer ? message asking to create the material file - + Aucun fichier de liste de matériaux n'existe à cet emplacement : +%1 + +Le créer ? Création impossible - + Création impossible Impossible de créer le fichier : %1 %2 - + Impossible de créer le fichier : +%1 +%2 Numérotation automatique - + Numérotation automatique … - + … Ouvrir les numérotations d'éléments du projet - + Ouvrir les numérotations d'éléments du projet Figer le nom - + Figer le nom Un nom figé n'est pas changé par la numérotation automatique, et son numéro n'est pas donné à un autre élément. - + Un nom figé n'est pas changé par la numérotation automatique, et son numéro n'est pas donné à un autre élément. Numéro - + Numéro Seuls les numéros libres sont proposés : un élément qui doit garder son numéro réel peut le retrouver si personne ne l'a. - + Seuls les numéros libres sont proposés : un élément qui doit garder son numéro réel peut le retrouver si personne ne l'a. %1 (actuel) - + %1 (actuel) — (numéro inconnu) - + — (numéro inconnu) %1 → %2 - + %1 → %2 Le nom est figé : dégelez-le pour changer son numéro. - + Le nom est figé : dégelez-le pour changer son numéro. Le numéro se choisit quand l'élément garde sa numérotation. - + Le numéro se choisit quand l'élément garde sa numérotation. Aucune (nom saisi à la main) - + Aucune (nom saisi à la main) Formule propre : %1 - + Formule propre : %1 Nom figé - + Nom figé @@ -3437,7 +3450,10 @@ Le créer ? Changer sa numérotation le remplacera ou l'effacera. Continuer ? - + Le nom de cet élément est figé. +Changer sa numérotation le remplacera ou l'effacera. + +Continuer ? @@ -3446,80 +3462,80 @@ Continuer ? Personnaliser la barre… - + Personnaliser la barre… Glissez les commandes et les éléments dans la barre, hors de la barre, ou d'une place à l'autre. Un double-clic fait passer une commande ou un élément d'une liste à l'autre. - + Glissez les commandes et les éléments dans la barre, hors de la barre, ou d'une place à l'autre. Un double-clic fait passer une commande ou un élément d'une liste à l'autre. Rechercher un élément… - + Rechercher un élément… Éléments : - + Éléments : Valeurs par défaut - + Valeurs par défaut Annuler - + Annuler Terminé - + Terminé Dans la barre : - + Dans la barre : Autres commandes : - + Autres commandes : Entrée pour insérer · Échap pour fermer - + Entrée pour insérer · Échap pour fermer Glisser pour changer la largeur de la barre - + Glisser pour changer la largeur de la barre Personnaliser la barre de raccourcis : %1 - + Personnaliser la barre de raccourcis : %1 Aucun résultat - + Aucun résultat Tapez pour rechercher un élément · Échap pour fermer - + Tapez pour rechercher un élément · Échap pour fermer Palette vide — glissez des éléments dans votre collection personnelle, ou tapez pour rechercher - + Palette vide — glissez des éléments dans votre collection personnelle, ou tapez pour rechercher @@ -3527,7 +3543,7 @@ Continuer ? Propriété de l'élément - + Propriété de l'élément @@ -3536,261 +3552,261 @@ Continuer ? Type - + Type Type de base : - + Type de base : margin: 5px; font-weight: bold; - + margin: 5px; font-weight: bold; Exclure de la nomenclature - + Exclure de la nomenclature Élément esclave - + Élément esclave Nombre de contact représenté - + Nombre de contact représenté Type de contact - + Type de contact État du contact - + État du contact Élément maître - + Élément maître Type concret - + Type concret Définir le nombre maximal d'esclaves - + Définir le nombre maximal d'esclaves Définir les éléments esclave - + Définir les éléments esclave Contact - + Contact Nb. contacts - + Nb. contacts Nb. bornes - + Nb. bornes Élément bornier - + Élément bornier Fonction - + Fonction Verrouiller la numérotation automatique - + Verrouiller la numérotation automatique Séparation de potentiel - + Séparation de potentiel Informations - + Informations Nom - + Nom Valeurs - + Valeurs Simple - + Simple Maître - + Maître Esclave - + Esclave Renvoi de folio suivant - + Renvoi de folio suivant Renvoi de folio précédent - + Renvoi de folio précédent Bornier - + Bornier Vignette - + Vignette Définition de conducteur - + Définition de conducteur Normalement ouvert - + Normalement ouvert Normalement fermé - + Normalement fermé Inverseur - + Inverseur Other - + Other Esclave PLC - + Esclave PLC Puissance - + Puissance Temporisé travail - + Temporisé travail Temporisé repos - + Temporisé repos Temporisé travail & repos - + Temporisé travail & repos Bobine - + Bobine Organe de protection - + Organe de protection Commutateur / bouton - + Commutateur / bouton Module PLC - + Module PLC Générique - + Générique Fusible - + Fusible Séctionnable - + Séctionnable Diode - + Diode Phase - + Phase Neutre - + Neutre @@ -3799,153 +3815,153 @@ Continuer ? T%1 - + T%1 Autre - + Autre Configuration PLC - + Configuration PLC + - + + - - + - Adresse - + Adresse Commentaire - + Commentaire Réf. croisée - + Réf. croisée Nb. - + Nb. T1 - + T1 Police des en-têtes - + Police des en-têtes Configurer la police des en-têtes de colonnes - + Configurer la police des en-têtes de colonnes Police du texte - + Police du texte Configurer la police du texte dans les cellules - + Configurer la police du texte dans les cellules Afficher les en-têtes sur la feuille - + Afficher les en-têtes sur la feuille Afficher ou masquer les en-têtes de colonnes du tableau PLC sur la feuille - + Afficher ou masquer les en-têtes de colonnes du tableau PLC sur la feuille Saut %1 après: - + Saut %1 après: Aucun - + Aucun H. ligne: - + H. ligne: mm - + mm Réf. - + Réf. Nom personnalisé de la colonne (vide = par défaut) - + Nom personnalisé de la colonne (vide = par défaut) Visible - + Visible Coller depuis le presse-papiers - + Coller depuis le presse-papiers Police des en-têtes: %1 %2pt - + Police des en-têtes: %1 %2pt Police du texte: %1 %2pt - + Police du texte: %1 %2pt Police des en-têtes de colonnes - + Police des en-têtes de colonnes Police du texte des cellules - + Police du texte des cellules Terre - + Terre @@ -3953,7 +3969,7 @@ Continuer ? Général - + Général @@ -3966,100 +3982,114 @@ Continuer ? Nom : %1 - + Nom : %1 + Folio : %1 - + Folio : %1 + Type : %1 - + Type : %1 + Sous-type : %1 - + Sous-type : %1 + Position : %1 - + Position : %1 + Rotation : %1° - + Rotation : %1° + Dimensions : %1*%2 - + Dimensions : %1*%2 + Bornes : %1 - + Bornes : %1 + Nombre maximum de contacts esclaves définis : non défini - + Nombre maximum de contacts esclaves définis : non défini + Nombre maximum de contacts esclaves définis : %1 - + Nombre maximum de contacts esclaves définis : %1 + Nombre de contacts esclaves utilisés : %1 - + Nombre de contacts esclaves utilisés : %1 + Contacts : NO : %1/%2, NC : %3/%4, inverseurs : %5/%6, autres : %7/%8 - + Contacts : NO : %1/%2, NC : %3/%4, inverseurs : %5/%6, autres : %7/%8 + Contacts : NO : %1, NC : %2, inverseurs : %3, autres : %4 - + Contacts : NO : %1, NC : %2, inverseurs : %3, autres : %4 + Emplacement : %1 - + Emplacement : %1 + Verrouiller la position - + Verrouiller la position Retrouver dans le panel - + Retrouver dans le panel Éditer l'élément - + Éditer l'élément @@ -4072,205 +4102,205 @@ Continuer ? Informations disponibles - + Informations disponibles Informations à exporter - + Informations à exporter Monter la sélection - + Monter la sélection Ajouter la sélection - + Ajouter la sélection Supprimer la sélection - + Supprimer la sélection Descendre la sélection - + Descendre la sélection Pas de filtre - + Pas de filtre N'est pas vide - + N'est pas vide Est vide - + Est vide Contient - + Contient Ne contient pas - + Ne contient pas Est égal à - + Est égal à N'est pas égale à - + N'est pas égale à Filtre : - + Filtre : Type d'éléments - + Type d'éléments Simples - + Simples Tous - + Tous Vignettes - + Vignettes Contacteurs et relais - + Contacteurs et relais Boutons et commutateurs - + Boutons et commutateurs Borniers - + Borniers Organes de protection - + Organes de protection Automates (MAE/SPS) - + Automates (MAE/SPS) Configuration - + Configuration Ouvrir la configuration sélectionné - + Ouvrir la configuration sélectionné Sauvegarder la configuration actuelle - + Sauvegarder la configuration actuelle Importer des rapports depuis un fichier - + Importer des rapports depuis un fichier Importer... - + Importer... Exporter tous les rapports enregistrés vers un fichier - + Exporter tous les rapports enregistrés vers un fichier Exporter... - + Exporter... Requête SQL personnalisée - + Requête SQL personnalisée Requête SQL : - + Requête SQL : Position - + Position Titre du folio - + Titre du folio Position du folio - + Position du folio Numéro du folio - + Numéro du folio Exporter - + Exporter Aucun rapport enregistré à exporter. - + Aucun rapport enregistré à exporter. Exporter les rapports - + Exporter les rapports Fichiers JSON (*.json) - + Fichiers JSON (*.json) @@ -4278,58 +4308,58 @@ Continuer ? Erreur - + Erreur Impossible d'écrire dans %1. - + Impossible d'écrire dans %1. Importer des rapports - + Importer des rapports Impossible de lire %1. - + Impossible de lire %1. %1 ne contient pas des rapports QElectroTech valides. - + %1 ne contient pas des rapports QElectroTech valides. Importer - + Importer Ce fichier ne contient aucun rapport. - + Ce fichier ne contient aucun rapport. Rapport déjà existant - + Rapport déjà existant Un rapport nommé « %1 » existe déjà. Le remplacer ? - + Un rapport nommé « %1 » existe déjà. Le remplacer ? Impossible d'écrire la configuration locale. - + Impossible d'écrire la configuration locale. %1 rapport(s) importé(s), %2 ignoré(s). - + %1 rapport(s) importé(s), %2 ignoré(s). @@ -4337,29 +4367,29 @@ Continuer ? Déplacer une primitive - + Déplacer une primitive Éditer les informations sur l'auteur window title - + Éditer les informations sur l'auteur Vous pouvez utiliser ce champ libre pour mentionner les auteurs de l'élément, sa licence, ou tout autre renseignement que vous jugerez utile. - + Vous pouvez utiliser ce champ libre pour mentionner les auteurs de l'élément, sa licence, ou tout autre renseignement que vous jugerez utile. Éditer les noms window title - + Éditer les noms Vous pouvez spécifier le nom de l'élément dans plusieurs langues. - + Vous pouvez spécifier le nom de l'élément dans plusieurs langues. @@ -4368,101 +4398,101 @@ Continuer ? L'item n'est pas une catégorie message box title - + L'item n'est pas une catégorie L'item demandé n'est pas une categrie. Abandon. message box content - + L'item demandé n'est pas une categrie. Abandon. Catégorie inexistante message box title - + Catégorie inexistante La catégorie demandée n'existe pas. Abandon. message box content - + La catégorie demandée n'existe pas. Abandon. Éditer une catégorie window title - + Éditer une catégorie Créer une nouvelle catégorie window title - + Créer une nouvelle catégorie Nom de la nouvelle catégorie default name when creating a new category - + Nom de la nouvelle catégorie Édition en lecture seule message box title - + Édition en lecture seule Vous n'avez pas les privilèges nécessaires pour modifier cette catégorie. Elle sera donc ouverte en lecture seule. message box content - + Vous n'avez pas les privilèges nécessaires pour modifier cette catégorie. Elle sera donc ouverte en lecture seule. Nom interne : - + Nom interne : Vous pouvez spécifier un nom par langue pour la catégorie. - + Vous pouvez spécifier un nom par langue pour la catégorie. Nom interne manquant message box title - + Nom interne manquant Vous devez spécifier un nom interne. message box content - + Vous devez spécifier un nom interne. Nom interne déjà utilisé message box title - + Nom interne déjà utilisé Le nom interne que vous avez choisi est déjà utilisé par une catégorie existante. Veuillez en choisir un autre. message box content - + Le nom interne que vous avez choisi est déjà utilisé par une catégorie existante. Veuillez en choisir un autre. Erreur message box title - + Erreur Impossible de créer la catégorie message box content - + Impossible de créer la catégorie @@ -4470,117 +4500,119 @@ Continuer ? Ouvrir le dossier correspondant - + Ouvrir le dossier correspondant Éditer l'élément - + Éditer l'élément Supprimer l'élément - + Supprimer l'élément Supprimer le dossier - + Supprimer le dossier Recharger les collections - + Recharger les collections Éditer le dossier - + Éditer le dossier Nouveau dossier - + Nouveau dossier Nouvel élément - + Nouvel élément Importer une pièce EPLAN (.edz)… - + Importer une pièce EPLAN (.edz)… Afficher uniquement ce dossier - + Afficher uniquement ce dossier Afficher tous les dossiers - + Afficher tous les dossiers Propriété du dossier - + Propriété du dossier Supprimer l'élément ? message box title - + Supprimer l'élément ? Êtes-vous sûr de vouloir supprimer cet élément ? message box content - + Êtes-vous sûr de vouloir supprimer cet élément ? + Suppression de l'élément message box title - + Suppression de l'élément La suppression de l'élément a échoué. message box content - + La suppression de l'élément a échoué. Supprimer le dossier? message box title - + Supprimer le dossier? Êtes-vous sûr de vouloir supprimer le dossier ? Tout les éléments et les dossier contenus dans ce dossier seront supprimés. message box content - + Êtes-vous sûr de vouloir supprimer le dossier ? +Tout les éléments et les dossier contenus dans ce dossier seront supprimés. Suppression du dossier message box title - + Suppression du dossier La suppression du dossier a échoué. message box content - + La suppression du dossier a échoué. Avertissement — Importation d'un fichier EPLAN (.edz) - + Avertissement — Importation d'un fichier EPLAN (.edz) @@ -4596,43 +4628,55 @@ En important ce fichier, vous confirmez que : • vous connaissez son origine et êtes autorisé à l'utiliser dans ce contexte, au regard des conditions applicables à cette source ; • cette importation est effectuée à vos propres risques et responsabilité ; • ni QElectroTech, ni ses mainteneurs, ni ses contributeurs ne peuvent être tenus responsables d'une utilisation non conforme de ces données. - + Le format .edz peut provenir de deux sources différentes : + +• Le portail EPLAN Data Portal (dataportal.eplan.com), soumis aux conditions d'utilisation de l'environnement EPLAN Cloud ; +• Le site d'un fabricant de composants (ou d'un distributeur) qui met ses fichiers .edz à disposition directement, selon ses propres conditions. + +QElectroTech ne peut pas déterminer automatiquement l'origine du fichier que vous importez, ni les conditions qui s'y appliquent. + +En important ce fichier, vous confirmez que : + +• vous connaissez son origine et êtes autorisé à l'utiliser dans ce contexte, au regard des conditions applicables à cette source ; +• cette importation est effectuée à vos propres risques et responsabilité ; +• ni QElectroTech, ni ses mainteneurs, ni ses contributeurs ne peuvent être tenus responsables d'une utilisation non conforme de ces données. J'ai lu et j'accepte ces conditions. - + J'ai lu et j'accepte ces conditions. Importer - + Importer Importer une pièce EPLAN - + Importer une pièce EPLAN Pièces EPLAN (*.edz) - + Pièces EPLAN (*.edz) Import EPLAN - + Import EPLAN Impossible d'importer cette pièce : %1 - + Impossible d'importer cette pièce : +%1 Le dossier %1 contient - + Le dossier %1 contient @@ -4653,32 +4697,32 @@ En important ce fichier, vous confirmez que : Chemin de la collection : %1 - + Chemin de la collection : %1 Chemin dans le système de fichiers : %1 - + Chemin dans le système de fichiers : %1 Rechercher... - + Rechercher... Collections - + Collections Modèles - + Modèles Propriété du dossier %1 - + Propriété du dossier %1 @@ -4687,36 +4731,36 @@ En important ce fichier, vous confirmez que : Double-cliquez pour réduire ou développer ce projet Status tip - + Double-cliquez pour réduire ou développer ce projet Cartouches embarqués - + Cartouches embarqués Double-cliquez pour réduire ou développer cette collection de cartouches embarquée Status tip - + Double-cliquez pour réduire ou développer cette collection de cartouches embarquée Glissez-déposez ce modèle de cartouche sur un folio pour l'y appliquer. Status tip displayed when selecting a title block template - + Glissez-déposez ce modèle de cartouche sur un folio pour l'y appliquer. Double-cliquez pour réduire ou développer la collection de cartouches QElectroTech Status tip - + Double-cliquez pour réduire ou développer la collection de cartouches QElectroTech Ceci est la collection de cartouches fournie avec QElectroTech. Installée en tant que composant système, vous ne pouvez normalement pas la personnaliser. "What's this" tip - + Ceci est la collection de cartouches fournie avec QElectroTech. Installée en tant que composant système, vous ne pouvez normalement pas la personnaliser. @@ -4734,13 +4778,13 @@ En important ce fichier, vous confirmez que : Double-cliquez pour réduire ou développer votre collection personnelle de cartouches Status tip - + Double-cliquez pour réduire ou développer votre collection personnelle de cartouches Ceci est votre collection personnelle de cartouches -- utilisez-la pour créer, stocker et éditer vos propres cartouches. "What's this" tip - + Ceci est votre collection personnelle de cartouches -- utilisez-la pour créer, stocker et éditer vos propres cartouches. @@ -4748,107 +4792,107 @@ En important ce fichier, vous confirmez que : Ouvrir le dossier correspondant - + Ouvrir le dossier correspondant Copier le chemin - + Copier le chemin Basculer vers ce projet - + Basculer vers ce projet Fermer ce projet - + Fermer ce projet Propriétés du projet - + Propriétés du projet Propriétés du folio - + Propriétés du folio Ajouter un folio - + Ajouter un folio Insérer un folio au-dessus - + Insérer un folio au-dessus Insérer un folio en dessous - + Insérer un folio en dessous Copier et coller - + Copier et coller Supprimer ce folio - + Supprimer ce folio Remonter ce folio - + Remonter ce folio Abaisser ce folio - + Abaisser ce folio Remonter ce folio x10 - + Remonter ce folio x10 Remonter ce folio x100 - + Remonter ce folio x100 Remonter ce folio au debut - + Remonter ce folio au debut Abaisser ce folio x10 - + Abaisser ce folio x10 Abaisser ce folio x100 - + Abaisser ce folio x100 Nouveau modèle - + Nouveau modèle Éditer ce modèle - + Éditer ce modèle Supprimer ce modèle - + Supprimer ce modèle @@ -4860,12 +4904,12 @@ En important ce fichier, vous confirmez que : Panneau des éléments - + Panneau des éléments Filtrer - + Filtrer @@ -4878,32 +4922,32 @@ En important ce fichier, vous confirmez que : Centre : - + Centre : Y - + Y X - + X Vertical : - + Vertical : Horizontal : - + Horizontal : Diamètres : - + Diamètres : @@ -4912,7 +4956,7 @@ En important ce fichier, vous confirmez que : Export configuration page title - + Export @@ -4921,101 +4965,101 @@ En important ce fichier, vous confirmez que : Exporter les folios du projet window title - + Exporter les folios du projet Exporter - + Exporter Choisissez les folios que vous désirez exporter ainsi que leurs dimensions : - + Choisissez les folios que vous désirez exporter ainsi que leurs dimensions : Tout cocher - + Tout cocher Tout décocher - + Tout décocher Titre du folio - + Titre du folio Nom de fichier - + Nom de fichier Dimensions - + Dimensions Noms des fichiers cibles message box title - + Noms des fichiers cibles Vous devez entrer un nom de fichier non vide et unique pour chaque folio à exporter. message box content - + Vous devez entrer un nom de fichier non vide et unique pour chaque folio à exporter. Dossier non spécifié message box title - + Dossier non spécifié Vous devez spécifier le chemin du dossier dans lequel seront enregistrés les fichiers images. message box content - + Vous devez spécifier le chemin du dossier dans lequel seront enregistrés les fichiers images. Images non incluses dans l'export DXF message box title - + Images non incluses dans l'export DXF Le format DXF utilisé ici (AC1006) ne permet pas d'inclure d'image. Les images seront représentées uniquement par un rectangle de contour (position, taille, rotation et inclinaison conservées), sans le contenu de l'image. message box content - + Le format DXF utilisé ici (AC1006) ne permet pas d'inclure d'image. Les images seront représentées uniquement par un rectangle de contour (position, taille, rotation et inclinaison conservées), sans le contenu de l'image. Impossible d'écrire dans ce fichier message box title - + Impossible d'écrire dans ce fichier Il semblerait que vous n'ayez pas les permissions nécessaires pour écrire dans le fichier %1. message box content - + Il semblerait que vous n'ayez pas les permissions nécessaires pour écrire dans le fichier %1. Aperçu - + Aperçu px - + px @@ -5024,93 +5068,93 @@ En important ce fichier, vous confirmez que : Exporter dans le dossier dialog title - + Exporter dans le dossier Dossier cible : - + Dossier cible : Parcourir - + Parcourir Format : - + Format : PNG (*.png) - + PNG (*.png) JPEG (*.jpg) - + JPEG (*.jpg) Bitmap (*.bmp) - + Bitmap (*.bmp) SVG (*.svg) - + SVG (*.svg) DXF (*.dxf) - + DXF (*.dxf) Options de rendu groupbox title - + Options de rendu Exporter entièrement le folio - + Exporter entièrement le folio Exporter seulement les éléments - + Exporter seulement les éléments Dessiner la grille - + Dessiner la grille Dessiner le cadre - + Dessiner le cadre Dessiner le cartouche - + Dessiner le cartouche Dessiner les bornes - + Dessiner les bornes Dessiner les noms des bornes - + Dessiner les noms des bornes Conserver les couleurs des conducteurs - + Conserver les couleurs des conducteurs @@ -5123,47 +5167,47 @@ En important ce fichier, vous confirmez que : Form - + Form Options de numérotation - + Options de numérotation C&réer de nouveaux folios - + C&réer de nouveaux folios Numérotation automatique des folios sélectionnés - + Numérotation automatique des folios sélectionnés Nouveaux folios - + Nouveaux folios À - + À De - + De Sélection: - + Sélection: Numérotation automatique de Folio : - + Numérotation automatique de Folio : @@ -5186,7 +5230,18 @@ Si le chiffre défini dans le champ Valeur possède moins de digits que le type Le champ "Incrémentation" n'est pas utilisé. help dialog about the folio autonumerotation - + C'est ici que vous pouvez définir la manière dont seront numérotés les nouveaux folios. +-Une numérotation est composée d'une variable minimum. +-Vous pouvez ajouter ou supprimer une variable de numérotation par le biais des boutons - et +. +-Une variable de numérotation comprend : un type, une valeur et une incrémentation. + +-les types "Chiffre 1", "Chiffre 01" et "Chiffre 001", représentent un type numérique défini dans le champ "Valeur", qui s'incrémente à chaque nouveau folio de la valeur du champ "Incrémentation". +-"Chiffre 01" et "Chiffre 001", sont respectivement représentés sur le schéma par deux et trois digits minimum. +Si le chiffre défini dans le champ Valeur possède moins de digits que le type choisi,celui-ci sera précédé par un ou deux 0 afin de respecter son type. + +-Le type "Texte", représente un texte fixe. +Le champ "Incrémentation" n'est pas utilisé. + @@ -5194,17 +5249,17 @@ Le champ "Incrémentation" n'est pas utilisé. Assistant de formule - + Assistant de formule TextLabel - + TextLabel Formule - + Formule @@ -5217,12 +5272,12 @@ Le champ "Incrémentation" n'est pas utilisé. Dénomination automatique : - + Dénomination automatique : Formule - + Formule @@ -5263,98 +5318,98 @@ que vous créez. entrées de texte et nombres sont Déplacer dans : - + Déplacer dans : Type : - + Type : Fonction : - + Fonction : LED : - + LED : Appliquer le déplacement - + Appliquer le déplacement Générique - + Générique Fusible - + Fusible Sectionnable - + Sectionnable Diode - + Diode Terre - + Terre Phase - + Phase Neutre - + Neutre Sans - + Sans Avec - + Avec Modifier des propriétés de borniers - + Modifier des propriétés de borniers Le projet n'a aucun bornier : créez-en un avec le bouton + - + Le projet n'a aucun bornier : créez-en un avec le bouton + Appliquez ou annulez les modifications en cours avant de déplacer - + Appliquez ou annulez les modifications en cours avant de déplacer Sélectionnez dans le tableau les bornes à déplacer - + Sélectionnez dans le tableau les bornes à déplacer Déplacer les bornes sélectionnées vers le bornier choisi - + Déplacer les bornes sélectionnées vers le bornier choisi @@ -5362,27 +5417,27 @@ que vous créez. entrées de texte et nombres sont Label - + Label Référence croisé - + Référence croisé Type - + Type Fonction - + Fonction led - + led @@ -5390,48 +5445,48 @@ que vous créez. entrées de texte et nombres sont Apparence - + Apparence Utiliser les couleurs du système - + Utiliser les couleurs du système Projets - + Projets Utiliser les numéros de folio à la place de leur position dans le projet - + Utiliser les numéros de folio à la place de leur position dans le projet Numéroter les colonnes de cartouche à partir de 0 (1 sinon) Choix de l'increment de depart 1 ou 0 - + Numéroter les colonnes de cartouche à partir de 0 (1 sinon) Sauvegarde automatique des projets (appliqué au prochain lancement de QElectroTech) - + Sauvegarde automatique des projets (appliqué au prochain lancement de QElectroTech) Utiliser les gestes du pavé tactile - + Utiliser les gestes du pavé tactile Ne pas conserver les labels des éléments lors des copier coller - + Ne pas conserver les labels des éléments lors des copier coller Autoriser le dézoom au delà du folio - + Autoriser le dézoom au delà du folio @@ -5441,12 +5496,12 @@ que vous créez. entrées de texte et nombres sont Chemin de la collection utilisateur - + Chemin de la collection utilisateur Chemin de la collection commune - + Chemin de la collection commune @@ -5456,7 +5511,7 @@ que vous créez. entrées de texte et nombres sont Par defaut - + Par defaut @@ -5467,89 +5522,90 @@ que vous créez. entrées de texte et nombres sont Parcourir... - + Parcourir... (Recharger les collections d'éléments pour appliquer les changements) - + (Recharger les collections d'éléments pour appliquer les changements) Désactivé - + Désactivé min minute - + min Chemin des cartouches utilisateur - + Chemin des cartouches utilisateur Collections - + Collections Accès aux collections - + Accès aux collections Répertoire de la collection commune - + Répertoire de la collection commune Répertoire de la collection utilisateur - + Répertoire de la collection utilisateur Répertoire des cartouches utilisateur - + Répertoire des cartouches utilisateur Gestion des éléments - + Gestion des éléments Mettre en valeur dans le panel les éléments fraîchement intégrés - + Mettre en valeur dans le panel les éléments fraîchement intégrés Chaque élément embarque des informations sur ses auteurs, sa licence, ou tout autre renseignement que vous jugerez utile dans un champ libre. Vous pouvez spécifier ici la valeur par défaut de ce champ pour les éléments que vous créerez : - + Chaque élément embarque des informations sur ses auteurs, sa licence, ou tout autre renseignement que vous jugerez utile dans un champ libre. +Vous pouvez spécifier ici la valeur par défaut de ce champ pour les éléments que vous créerez : Appliqué au prochain lancement de QElectroTech - + Appliqué au prochain lancement de QElectroTech Vous pouvez définir ici l'apparence par defaut des differents textes de QElectroTech - + Vous pouvez définir ici l'apparence par defaut des differents textes de QElectroTech Grille + Clavier - + Grille + Clavier Grille : 1 - 30 - + Grille : 1 - 30 @@ -5564,142 +5620,142 @@ Vous pouvez spécifier ici la valeur par défaut de ce champ pour les éléments Couleur de l'application - + Couleur de l'application Afficher les propriétés d'un conducteur sélectionné dans le panneau Propriétés de la sélection - + Afficher les propriétés d'un conducteur sélectionné dans le panneau Propriétés de la sélection Décoché, aucune règle de conducteurs par borne n'est appliquée, quels que soient les réglages des projets. - + Décoché, aucune règle de conducteurs par borne n'est appliquée, quels que soient les réglages des projets. Appliquer les règles de conducteurs par borne des projets - + Appliquer les règles de conducteurs par borne des projets Nombre maximal de conducteurs par borne : - + Nombre maximal de conducteurs par borne : Pour tous les projets, sauf ceux qui ont leurs propres réglages. Un nouveau conducteur qui dépasserait ce nombre sur une borne est refusé ; les conducteurs déjà dessinés ne sont pas modifiés. 4 correspond à deux embouts doubles, un de chaque côté de la vis. - + Pour tous les projets, sauf ceux qui ont leurs propres réglages. Un nouveau conducteur qui dépasserait ce nombre sur une borne est refusé ; les conducteurs déjà dessinés ne sont pas modifiés. 4 correspond à deux embouts doubles, un de chaque côté de la vis. Sans limite - + Sans limite Un renvoi de folio est un point virtuel : il ne reçoit qu'un conducteur, celui qui continue sur l'autre folio. - + Un renvoi de folio est un point virtuel : il ne reçoit qu'un conducteur, celui qui continue sur l'autre folio. Un seul conducteur par renvoi de folio - + Un seul conducteur par renvoi de folio Afficher la grille par défaut (appliqué au prochain lancement) - + Afficher la grille par défaut (appliqué au prochain lancement) Par défaut, un double-clic insère l'élément sur le folio ; l'édition reste accessible par le menu contextuel. - + Par défaut, un double-clic insère l'élément sur le folio ; l'édition reste accessible par le menu contextuel. Double-cliquer dans la collection ouvre l'éditeur d'élément au lieu de l'insérer - + Double-cliquer dans la collection ouvre l'éditeur d'élément au lieu de l'insérer Coché : une seule liste, la meilleure correspondance en premier. Décoché : l'arborescence de la collection, filtrée sur la recherche. - + Coché : une seule liste, la meilleure correspondance en premier. Décoché : l'arborescence de la collection, filtrée sur la recherche. Afficher les résultats de recherche sous forme de liste triée - + Afficher les résultats de recherche sous forme de liste triée Après un clic qui sélectionne un élément ou un conducteur, les commandes de la barre de raccourcis apparaissent près du curseur et s'effacent quand la souris s'éloigne. - + Après un clic qui sélectionne un élément ou un conducteur, les commandes de la barre de raccourcis apparaissent près du curseur et s'effacent quand la souris s'éloigne. Afficher les commandes près de la sélection - + Afficher les commandes près de la sélection Maintenir le bouton droit et glisser dans une direction lance une commande de la barre de raccourcis. Un simple clic droit ouvre toujours le menu contextuel, au relâchement du bouton. - + Maintenir le bouton droit et glisser dans une direction lance une commande de la barre de raccourcis. Un simple clic droit ouvre toujours le menu contextuel, au relâchement du bouton. Gestes de la souris avec le bouton droit - + Gestes de la souris avec le bouton droit Afficher les guides par défaut (appliqué au prochain lancement) - + Afficher les guides par défaut (appliqué au prochain lancement) Utiliser des fen&êtres (appliqué au prochain lancement de QElectroTech) - + Utiliser des fen&êtres (appliqué au prochain lancement de QElectroTech) Utiliser des onglets (appliqué au prochain lance&ment de QElectroTech) - + Utiliser des onglets (appliqué au prochain lance&ment de QElectroTech) Méthode de mise à l'echelle des écrans à haute densité de pixels (hdpi) (appliqué au prochain lancement de QElectroTech) : - + Méthode de mise à l'echelle des écrans à haute densité de pixels (hdpi) (appliqué au prochain lancement de QElectroTech) : Numéroter automatiquement les éléments collés ou dupliqués qui suivent une numérotation - + Numéroter automatiquement les éléments collés ou dupliqués qui suivent une numérotation Un élément collé reçoit le numéro suivant de sa numérotation au lieu du nom de l'élément copié, et la numérotation avance. - + Un élément collé reçoit le numéro suivant de sa numérotation au lieu du nom de l'élément copié, et la numérotation avance. Autoriser l'exécution de scripts JavaScript (Projet > Exécuter un script, et --run) - + Autoriser l'exécution de scripts JavaScript (Projet > Exécuter un script, et --run) Un script s'exécute avec vos droits : il peut lire et modifier le projet ouvert et écrire des fichiers. Désactivé par défaut ; n'exécutez que des scripts dont vous connaissez l'origine. - + Un script s'exécute avec vos droits : il peut lire et modifier le projet ouvert et écrire des fichiers. Désactivé par défaut ; n'exécutez que des scripts dont vous connaissez l'origine. Autoriser un assistant IA à agir sur le projet ouvert (mode direct) - + Autoriser un assistant IA à agir sur le projet ouvert (mode direct) Un assistant connecté par le serveur MCP peut alors exécuter des scripts sur le projet ouvert, sous vos yeux. Un avertissement est affiché à chaque démarrage tant que ce réglage est activé. Prend effet au prochain démarrage ; le décocher coupe la connexion tout de suite. - + Un assistant connecté par le serveur MCP peut alors exécuter des scripts sur le projet ouvert, sous vos yeux. Un avertissement est affiché à chaque démarrage tant que ce réglage est activé. Prend effet au prochain démarrage ; le décocher coupe la connexion tout de suite. @@ -5710,13 +5766,13 @@ Vous pouvez spécifier ici la valeur par défaut de ce champ pour les éléments Créer ou modifier le préfixe des dossiers de la collection utilisateur (fichier qet_labels.xml) tooltip of the button opening the prefix configuration dialog of the user collection - + Créer ou modifier le préfixe des dossiers de la collection utilisateur (fichier qet_labels.xml) Configurer les préfixes… button opening the dialog where the folder prefixes of the user collection are configured - + Configurer les préfixes… @@ -5726,104 +5782,104 @@ Vous pouvez spécifier ici la valeur par défaut de ce champ pour les éléments Répertoire des Macros utilisateur - + Répertoire des Macros utilisateur Fichier de la liste de matériaux - + Fichier de la liste de matériaux Répertoire de matériaux utilisé pour renseigner les articles d'un élément tooltip of the material file path field - + Répertoire de matériaux utilisé pour renseigner les articles d'un élément Non configuré hint shown when no material file is configured yet - + Non configuré Créer le fichier de la liste avec ses en-têtes tooltip of the button creating the material file with its header line - + Créer le fichier de la liste avec ses en-têtes Créer... - + Créer... Langues - + Langues Textes - + Textes Textes d'éléments - + Textes d'éléments Police : - + Police : ° - + ° Longueur : - + Longueur : Rotation : - + Rotation : Textes indépendants - + Textes indépendants Autres textes - + Autres textes La Grille doite etre active pour pouvoir voir les modifications. - + La Grille doite etre active pour pouvoir voir les modifications. Grille des textes déplacés à la souris - + Grille des textes déplacés à la souris Fraction de la grille des folios. Maintenir Ctrl pendant le déplacement pour placer librement. - + Fraction de la grille des folios. Maintenir Ctrl pendant le déplacement pour placer librement. Déplacement au clavier : 1 - 30 - + Déplacement au clavier : 1 - 30 @@ -5838,7 +5894,7 @@ Vous pouvez spécifier ici la valeur par défaut de ce champ pour les éléments Déplacement au clavier avec la touche ALT : 1 - 9 - + Déplacement au clavier avec la touche ALT : 1 - 9 @@ -5853,39 +5909,39 @@ Vous pouvez spécifier ici la valeur par défaut de ce champ pour les éléments Affichage Grille - + Affichage Grille max: - + max: À l'enregistrement d'un élément : refuser deux bornes portant le même nom, et signaler les bornes sans nom (IEC 61666). - + À l'enregistrement d'un élément : refuser deux bornes portant le même nom, et signaler les bornes sans nom (IEC 61666). Vérifier les noms des bornes à l'enregistrement - + Vérifier les noms des bornes à l'enregistrement Taille des points de la grille de Diagram-Editor : 1 - 5 - + Taille des points de la grille de Diagram-Editor : 1 - 5 min: - + min: Taille des points de la grille de l'éditeur d'éléments : 1 - 5 - + Taille des points de la grille de l'éditeur d'éléments : 1 - 5 @@ -5900,154 +5956,154 @@ Vous pouvez spécifier ici la valeur par défaut de ce champ pour les éléments Arrondi supérieur pour 0.5 et plus - + Arrondi supérieur pour 0.5 et plus Toujours arrondi supérieur - + Toujours arrondi supérieur Toujours arrondi inférieur - + Toujours arrondi inférieur Arrondi supérieur pour 0.75 et plus - + Arrondi supérieur pour 0.75 et plus Pas d'arrondi - + Pas d'arrondi Désactivée - + Désactivée Activé par la variable d'environnement QET_ENABLE_SCRIPTING ; ce réglage est sans effet tant qu'elle est définie. - + Activé par la variable d'environnement QET_ENABLE_SCRIPTING ; ce réglage est sans effet tant qu'elle est définie. Non configuré (par défaut : %1) hint shown in the material file field when no file is configured yet - + Non configuré (par défaut : %1) Général configuration page title - + Général Système - + Système Arabe - + Arabe Brézilien - + Brézilien Catalan - + Catalan Tchèque - + Tchèque Allemand - + Allemand Danois - + Danois Grec - + Grec Anglais - + Anglais Espagnol - + Espagnol Français - + Français Croate - + Croate Italien - + Italien Japonais - + Japonais Coréen - + Coréen Polonais - + Polonais Portugais - + Portugais Roumains - + Roumains Russe - + Russe Slovène - + Slovène Pays-Bas - + Pays-Bas @@ -6057,37 +6113,37 @@ Vous pouvez spécifier ici la valeur par défaut de ce champ pour les éléments Belgique-Flemish - + Belgique-Flemish Turc - + Turc Hongrois - + Hongrois Mongol - + Mongol Ukrainien - + Ukrainien Chinois - + Chinois Suédois - + Suédois @@ -6102,57 +6158,62 @@ Vous pouvez spécifier ici la valeur par défaut de ce champ pour les éléments Chemin des macros utilisateur - + Chemin des macros utilisateur Répertoire introuvable - + Répertoire introuvable Le répertoire de la collection utilisateur : %1 n'existe pas et n'a pas pu être créé. - + Le répertoire de la collection utilisateur : +%1 +n'existe pas et n'a pas pu être créé. Aucun sous-dossier - + Aucun sous-dossier La collection utilisateur : %1 ne contient aucun sous-dossier : il n'y a donc aucun préfixe à configurer. - + La collection utilisateur : +%1 +ne contient aucun sous-dossier : il n'y a donc aucun préfixe à configurer. Fichier de préfixes illisible - + Fichier de préfixes illisible Fichier de préfixes endommagé - + Fichier de préfixes endommagé Le fichier %1 n'est pas un fichier XML valide : %2 - + Le fichier %1 n'est pas un fichier XML valide : +%2 Corriger le fichier - + Corriger le fichier Reconstruire - + Reconstruire @@ -6161,40 +6222,46 @@ ne contient aucun sous-dossier : il n'y a donc aucun préfixe à configurer « Corriger le fichier » : cette fenêtre se ferme sans rien changer. Ouvrez le fichier dans un éditeur de texte à l'endroit indiqué, corrigez-le puis relancez cette commande. « Reconstruire » : l'arborescence des dossiers est recréée, mais tous les préfixes actuels sont perdus. Le fichier actuel est conservé sous le nom qet_labels.xml.bak avant d'être remplacé. - + Rien n'a encore été modifié. + +« Corriger le fichier » : cette fenêtre se ferme sans rien changer. Ouvrez le fichier dans un éditeur de texte à l'endroit indiqué, corrigez-le puis relancez cette commande. + +« Reconstruire » : l'arborescence des dossiers est recréée, mais tous les préfixes actuels sont perdus. Le fichier actuel est conservé sous le nom qet_labels.xml.bak avant d'être remplacé. Fichier : %1 - + Fichier : %1 Sélectionner le fichier de la liste de matériaux - + Sélectionner le fichier de la liste de matériaux Fichiers csv (*.csv) - + Fichiers csv (*.csv) Créer le fichier de la liste de matériaux - + Créer le fichier de la liste de matériaux Création impossible - + Création impossible Impossible de créer le fichier : %1 %2 - + Impossible de créer le fichier : +%1 +%2 @@ -6204,7 +6271,7 @@ ne contient aucun sous-dossier : il n'y a donc aucun préfixe à configurer Fonctionnalité expérimental - + Fonctionnalité expérimental @@ -6214,7 +6281,12 @@ Toutes valeurs autre que ‘Pas d’arrondi’ peut causer des erreurs de rendu 1 - la valeur sélectionnée 2 - du dpi de l'écran 3 - Modifier le projet sur un autre ordinateur et/ou écran n'ayant pas les mêmes paramètres des points 1 et 2. - + AVERTISSEMENT : +Toutes valeurs autre que ‘Pas d’arrondi’ peut causer des erreurs de rendu du projet en fonction de : + +1 - la valeur sélectionnée +2 - du dpi de l'écran +3 - Modifier le projet sur un autre ordinateur et/ou écran n'ayant pas les mêmes paramètres des points 1 et 2. @@ -6223,48 +6295,48 @@ Toutes valeurs autre que ‘Pas d’arrondi’ peut causer des erreurs de rendu Pas de fichier tooltip for a file-less project in the element panel - + Pas de fichier Ceci est un projet QElectroTech, c'est-à-dire un fichier d'extension .qet regroupant plusieurs folios. Il embarque également les éléments et modèles de cartouches utilisés dans ces folios. "What's this" tip - + Ceci est un projet QElectroTech, c'est-à-dire un fichier d'extension .qet regroupant plusieurs folios. Il embarque également les éléments et modèles de cartouches utilisés dans ces folios. Folio sans titre Fallback label when a diagram has no title - + Folio sans titre %1 - %2 label displayed for a diagram in the panel ; %1 is the folio index, %2 is the diagram title - + %1 - %2 Modèles de cartouche - + Modèles de cartouche Modèle "%1" used to display a title block template - + Modèle "%1" Ceci est un modèle de cartouche, qui peut être appliqué à un folio. "What's this" tip - + Ceci est un modèle de cartouche, qui peut être appliqué à un folio. %1 [non utilisé dans le projet] - + %1 [non utilisé dans le projet] @@ -6276,48 +6348,48 @@ Toutes valeurs autre que ‘Pas d’arrondi’ peut causer des erreurs de rendu Aucun - + Aucun Déplacer un tableau - + Déplacer un tableau Modifier le nombre de ligne affiché par un tableau - + Modifier le nombre de ligne affiché par un tableau Modifier les marges d'une en tête de tableau - + Modifier les marges d'une en tête de tableau Modifier les marges d'un tableau - + Modifier les marges d'un tableau Modifier l'alignement d'une en tête de tableau - + Modifier l'alignement d'une en tête de tableau Modifier l'alignement des textes d'un tableau - + Modifier l'alignement des textes d'un tableau Modifier la police d'une en tête de tableau - + Modifier la police d'une en tête de tableau Changer la police d'un tableau - + Changer la police d'un tableau @@ -6331,7 +6403,7 @@ Toutes valeurs autre que ‘Pas d’arrondi’ peut causer des erreurs de rendu Appliquer la géometrie d'un tableau aux tableau liée à celui-ci - + Appliquer la géometrie d'un tableau aux tableau liée à celui-ci @@ -6339,38 +6411,38 @@ Toutes valeurs autre que ‘Pas d’arrondi’ peut causer des erreurs de rendu Orientation - + Orientation Position - + Position Couleur - + Couleur Ajouter - + Ajouter Supprimer - + Supprimer Horizontal - + Horizontal Vertical - + Vertical @@ -6378,22 +6450,22 @@ Toutes valeurs autre que ‘Pas d’arrondi’ peut causer des erreurs de rendu Rogner l'image - + Rogner l'image Faites glisser les poignées, ou l'intérieur du cadre, pour ajuster la zone à conserver. - + Faites glisser les poignées, ou l'intérieur du cadre, pour ajuster la zone à conserver. Réinitialiser - + Réinitialiser Revenir à l'image complète, sans rognage - + Revenir à l'image complète, sans rognage @@ -6401,102 +6473,102 @@ Toutes valeurs autre que ‘Pas d’arrondi’ peut causer des erreurs de rendu Form - + Form Largeur - + Largeur % - + % Verrouillé : modifier la largeur ou la hauteur ajuste l'autre pour conserver les proportions. Cliquer pour déverrouiller. - + Verrouillé : modifier la largeur ou la hauteur ajuste l'autre pour conserver les proportions. Cliquer pour déverrouiller. Hauteur - + Hauteur Restaurer les proportions - + Restaurer les proportions Angle - + Angle ° - + ° Inclinaison X - + Inclinaison X Inclinaison Y - + Inclinaison Y Libellé - + Libellé Texte affiché sous l'image. Il suit l'image quand elle est déplacée, copiée ou tournée. - + Texte affiché sous l'image. Il suit l'image quand elle est déplacée, copiée ou tournée. Verrouiller la position - + Verrouiller la position Modifier la largeur d'une image - + Modifier la largeur d'une image Modifier la hauteur d'une image - + Modifier la hauteur d'une image Modifier l'angle d'une image - + Modifier l'angle d'une image Modifier l'inclinaison d'une image - + Modifier l'inclinaison d'une image Modifier le libellé d'une image - + Modifier le libellé d'une image Déverrouillé : largeur et hauteur peuvent être modifiées indépendamment. Cliquer pour verrouiller. - + Déverrouillé : largeur et hauteur peuvent être modifiées indépendamment. Cliquer pour verrouiller. @@ -6504,42 +6576,42 @@ Toutes valeurs autre que ‘Pas d’arrondi’ peut causer des erreurs de rendu Couleur transparente - + Couleur transparente Image source - + Image source Aperçu - + Aperçu rgb(%1, %2, %3) - + rgb(%1, %2, %3) Tolérance pour cette couleur - + Tolérance pour cette couleur Retirer cette couleur - + Retirer cette couleur Cliquez sur l'image pour ajouter une couleur. Ajustez la tolérance de chaque couleur avec son curseur, ou cliquez sur × pour la retirer. - + Cliquez sur l'image pour ajouter une couleur. Ajustez la tolérance de chaque couleur avec son curseur, ou cliquez sur × pour la retirer. Cliquez sur l'image pour choisir une couleur - + Cliquez sur l'image pour choisir une couleur @@ -6547,7 +6619,7 @@ Toutes valeurs autre que ‘Pas d’arrondi’ peut causer des erreurs de rendu Intégration d'un élément - + Intégration d'un élément @@ -6580,17 +6652,17 @@ Toutes valeurs autre que ‘Pas d’arrondi’ peut causer des erreurs de rendu Dialog - + Dialog TextLabel - + TextLabel Écraser les textes existants - + Écraser les textes existants @@ -6604,53 +6676,53 @@ Toutes valeurs autre que ‘Pas d’arrondi’ peut causer des erreurs de rendu Police - + Police Déplacer un champ texte - + Déplacer un champ texte Pivoter un champ texte - + Pivoter un champ texte Modifier un champ texte - + Modifier un champ texte Modifier la taille d'un champ texte - + Modifier la taille d'un champ texte Modifier la police d'un champ texte - + Modifier la police d'un champ texte Pivoter plusieurs champs texte - + Pivoter plusieurs champs texte Modifier la taille de plusieurs champs texte - + Modifier la taille de plusieurs champs texte Modifier la police de plusieurs champs texte - + Modifier la police de plusieurs champs texte Modifier les propriétés d'un texte - + Modifier les propriétés d'un texte @@ -6659,54 +6731,54 @@ Toutes valeurs autre que ‘Pas d’arrondi’ peut causer des erreurs de rendu Impossible d'accéder à la catégorie parente error message - + Impossible d'accéder à la catégorie parente Impossible d'obtenir la description XML de ce modèle error message - + Impossible d'obtenir la description XML de ce modèle Erreur message box title - + Erreur Intégration d'un modèle de cartouche - + Intégration d'un modèle de cartouche Le modèle a déjà été intégré dans le projet. Toutefois, la version que vous tentez d'appliquer semble différente. Que souhaitez-vous faire ? dialog content - %1 is a title block template name - + Le modèle a déjà été intégré dans le projet. Toutefois, la version que vous tentez d'appliquer semble différente. Que souhaitez-vous faire ? Utiliser le modèle déjà intégré dialog content - + Utiliser le modèle déjà intégré Intégrer le modèle déposé dialog content - + Intégrer le modèle déposé Écraser le modèle déjà intégré dialog content - + Écraser le modèle déjà intégré Faire cohabiter les deux modèles dialog content - + Faire cohabiter les deux modèles @@ -6715,27 +6787,27 @@ Toutes valeurs autre que ‘Pas d’arrondi’ peut causer des erreurs de rendu Atteindre un élément window title - + Atteindre un élément Nom, label ou information de l'élément, ou case (ex. B13 ou 3-B13)… - + Nom, label ou information de l'élément, ou case (ex. B13 ou 3-B13)… Case %1 - + Case %1 Folio %1, case %2 - + Folio %1, case %2 Folio %1 (%2), case %3 - + Folio %1 (%2), case %3 @@ -6745,41 +6817,41 @@ Toutes valeurs autre que ‘Pas d’arrondi’ peut causer des erreurs de rendu Normale type of the 1st end of a line - + Normale Flèche simple type of the 1st end of a line - + Flèche simple Flèche triangulaire type of the 1st end of a line - + Flèche triangulaire Cercle type of the 1st end of a line - + Cercle Carré type of the 1st end of a line - + Carré Modifier une ligne - + Modifier une ligne @@ -6789,38 +6861,38 @@ Toutes valeurs autre que ‘Pas d’arrondi’ peut causer des erreurs de rendu X1 : - + X1 : Y1 : - + Y1 : X2 : - + X2 : Fin 1 : - + Fin 1 : Y2 : - + Y2 : Fin 2 : - + Fin 2 : Longueur : - + Longueur : @@ -6828,46 +6900,46 @@ Toutes valeurs autre que ‘Pas d’arrondi’ peut causer des erreurs de rendu Form - + Form Cet élément est déjà lié - + Cet élément est déjà lié Recherche - + Recherche Masquer les éléments maîtres pleins - + Masquer les éléments maîtres pleins Label - + Label Commentaire - + Commentaire N° de folio - + N° de folio Label de folio - + Label de folio @@ -6875,7 +6947,7 @@ Toutes valeurs autre que ‘Pas d’arrondi’ peut causer des erreurs de rendu Titre de folio - + Titre de folio @@ -6883,97 +6955,97 @@ Toutes valeurs autre que ‘Pas d’arrondi’ peut causer des erreurs de rendu Position - + Position N° de fil - + N° de fil Fonction - + Fonction Tension / Protocole - + Tension / Protocole Couleur du conducteur - + Couleur du conducteur Section du conducteur - + Section du conducteur (déjà utilisé) - + (déjà utilisé) Sélectionner un IO PLC - + Sélectionner un IO PLC IO disponible: - + IO disponible: Délier - + Délier Voir cet élément - + Voir cet élément Voir l'élément lié - + Voir l'élément lié Lier l'élément - + Lier l'élément Montrer l'élément - + Montrer l'élément Montrer l'élément esclave - + Montrer l'élément esclave Enregistrer la disposition - + Enregistrer la disposition Report de folio - + Report de folio Référence croisée (esclave) - + Référence croisée (esclave) @@ -6981,7 +7053,7 @@ Toutes valeurs autre que ‘Pas d’arrondi’ peut causer des erreurs de rendu Mode direct - + Mode direct @@ -6990,58 +7062,62 @@ Toutes valeurs autre que ‘Pas d’arrondi’ peut causer des erreurs de rendu Chaque action s'annule d'un Ctrl+Z, et le bouton « Arrêter » de la barre d'état coupe la connexion. Ce réglage se trouve dans Configurer QElectroTech > Général > Projets. - + Le mode direct est activé : un assistant IA connecté pourra exécuter des scripts sur le projet ouvert. + +Chaque action s'annule d'un Ctrl+Z, et le bouton « Arrêter » de la barre d'état coupe la connexion. + +Ce réglage se trouve dans Configurer QElectroTech > Général > Projets. &Continuer - + &Continuer &Pas pour cette session - + &Pas pour cette session &Désactiver - + &Désactiver script - + script Assistant : %1 - + Assistant : %1 L'assistant veut exécuter un script - + L'assistant veut exécuter un script « %1 » sur le projet ouvert. Une fois exécuté, Ctrl+Z l'annule. - + « %1 » sur le projet ouvert. Une fois exécuté, Ctrl+Z l'annule. &Exécuter - + &Exécuter &Refuser - + &Refuser &Toujours pour cette session - + &Toujours pour cette session @@ -7049,20 +7125,22 @@ Ce réglage se trouve dans Configurer QElectroTech > Général > Projets.< Macro du %1 - + Macro du %1 projet fermé pendant l'enregistrement : pas de after.qet - + projet fermé pendant l'enregistrement : pas de after.qet J'ai enregistré une macro dans QElectroTech : « %1 », %n étape(s) (identifiant %2, dossier %3). Avec le serveur MCP qet : lis-la avec qet_recording_read, écris un script qui fait la même chose de façon générale (par exemple sur les éléments sélectionnés plutôt que sur ceux-là précisément), vérifie-le avec qet_recording_check jusqu'à ce qu'il corresponde, puis propose-le comme bouton avec qet_script_install. - - + J'ai enregistré une macro dans QElectroTech : « %1 », %n étape(s) (identifiant %2, dossier %3). +Avec le serveur MCP qet : lis-la avec qet_recording_read, écris un script qui fait la même chose de façon générale (par exemple sur les éléments sélectionnés plutôt que sur ceux-là précisément), vérifie-le avec qet_recording_check jusqu'à ce qu'il corresponde, puis propose-le comme bouton avec qet_script_install. + J'ai enregistré une macro dans QElectroTech : « %1 », %n étape(s) (identifiant %2, dossier %3). +Avec le serveur MCP qet : lis-la avec qet_recording_read, écris un script qui fait la même chose de façon générale (par exemple sur les éléments sélectionnés plutôt que sur ceux-là précisément), vérifie-le avec qet_recording_check jusqu'à ce qu'il corresponde, puis propose-le comme bouton avec qet_script_install. @@ -7071,27 +7149,27 @@ Avec le serveur MCP qet : lis-la avec qet_recording_read, écris un script qui f Editer les marges - + Editer les marges Haut : - + Haut : Gauche : - + Gauche : Droit : - + Droit : Bas : - + Bas : @@ -7099,132 +7177,134 @@ Avec le serveur MCP qet : lis-la avec qet_recording_read, écris un script qui f Form - + Form <html><head/><body><p>Délier l'élément sélectionné</p></body></html> - + <html><head/><body><p>Délier l'élément sélectionné</p></body></html> <html><head/><body><p>Lier l'élément sélectionné</p></body></html> - + <html><head/><body><p>Lier l'élément sélectionné</p></body></html> Vignette - + Vignette N° de folio - + N° de folio Label de folio - + Label de folio Titre de folio - + Titre de folio Position - + Position Éléments disponibles - + Éléments disponibles Éléments liés - + Éléments liés Lier l'élément - + Lier l'élément Délier l'élément - + Délier l'élément Montrer l'élément - + Montrer l'élément Montrer l'élément maître - + Montrer l'élément maître Enregistrer la disposition - + Enregistrer la disposition Nombre maximal d'esclaves atteint. - + Nombre maximal d'esclaves atteint. La limite fixée pour cet élément maître est atteinte (Limite: %1). Voulez-vous tout de même lier ce contact esclave ? - + La limite fixée pour cet élément maître est atteinte (Limite: %1). + +Voulez-vous tout de même lier ce contact esclave ? Type - + Type Adresse - + Adresse Fonction - + Fonction Commentaire - + Commentaire Réf. croisée - + Réf. croisée Bornes - + Bornes Coller depuis le presse-papiers - + Coller depuis le presse-papiers Référence croisée (maître) - + Référence croisée (maître) @@ -7232,32 +7312,32 @@ Voulez-vous tout de même lier ce contact esclave ? Nouvelle entrée - + Nouvelle entrée Renseignez l'article à ajouter. Les champs laissés vides restent vides dans le fichier. - + Renseignez l'article à ajouter. Les champs laissés vides restent vides dans le fichier. Enregistrer - + Enregistrer Annuler - + Annuler Aucun renseignement - + Aucun renseignement Saisissez au moins un renseignement pour créer une entrée. - + Saisissez au moins un renseignement pour créer une entrée. @@ -7266,22 +7346,22 @@ Voulez-vous tout de même lier ce contact esclave ? Bloc auxiliaire - + Bloc auxiliaire Aucun récepteur pour le répertoire de matériaux. - + Aucun récepteur pour le répertoire de matériaux. Le fichier ne contient pas d'en-tête : colonnes manquantes. - + Le fichier ne contient pas d'en-tête : colonnes manquantes. Le fichier existe déjà et n'est pas vide. - + Le fichier existe déjà et n'est pas vide. @@ -7289,94 +7369,98 @@ Voulez-vous tout de même lier ce contact esclave ? Liste de matériaux - + Liste de matériaux Rechercher : - + Rechercher : Tous les mots saisis doivent apparaître quelque part dans la ligne placeholder of the search field of the material list; several words narrow the results down (AND) - + Tous les mots saisis doivent apparaître quelque part dans la ligne Rechercher dans toutes les colonnes placeholder of the search field of the material list - + Rechercher dans toutes les colonnes Entrées : 0 - + Entrées : 0 Ajouter un nouvel article à la liste button adding a new row to the material list file - + Ajouter un nouvel article à la liste Nouvelle entrée - + Nouvelle entrée Appliquer - + Appliquer Annuler - + Annuler Lecture impossible - + Lecture impossible Impossible de lire le fichier : %1 %2 - + Impossible de lire le fichier : +%1 +%2 Entrées : %1 - + Entrées : %1 Entrées : %1 sur %2 - + Entrées : %1 sur %2 Aucune sélection - + Aucune sélection Sélectionnez d'abord un article dans la liste. - + Sélectionnez d'abord un article dans la liste. Écriture impossible - + Écriture impossible Impossible d'écrire dans le fichier : %1 %2 - + Impossible d'écrire dans le fichier : +%1 +%2 @@ -7384,58 +7468,58 @@ Voulez-vous tout de même lier ce contact esclave ? Collage multiple - + Collage multiple Décalage - + Décalage px - + px x: - + x: y: - + y: Nombre de copie - + Nombre de copie Auto-connexion - + Auto-connexion Auto-numérotation des éléments - + Auto-numérotation des éléments Auto-numérotation des conducteurs - + Auto-numérotation des conducteurs Multi-collage - + Multi-collage Numéroter les éléments collés - + Numéroter les éléments collés @@ -7443,12 +7527,12 @@ Voulez-vous tout de même lier ce contact esclave ? Dialog - + Dialog Variables de cartouche - + Variables de cartouche @@ -7461,12 +7545,12 @@ Voulez-vous tout de même lier ce contact esclave ? Langue - + Langue Texte - + Texte @@ -7476,7 +7560,7 @@ Voulez-vous tout de même lier ce contact esclave ? Copier dans le presse papier - + Copier dans le presse papier @@ -7484,64 +7568,64 @@ Voulez-vous tout de même lier ce contact esclave ? Folio - + Folio Conducteur - + Conducteur Reports de folio - + Reports de folio Références croisées - + Références croisées Guides - + Guides Définir les règles de numérotation automatique par défaut pour les nouveaux projets : - + Définir les règles de numérotation automatique par défaut pour les nouveaux projets : Conducteurs - + Conducteurs Eléments - + Eléments Folios - + Folios Numérotation auto - + Numérotation auto Nouveau folio configuration page title - + Nouveau folio Nouveau projet configuration page title - + Nouveau projet @@ -7550,64 +7634,64 @@ Voulez-vous tout de même lier ce contact esclave ? Créer un nouvel élément : Assistant window title - + Créer un nouvel élément : Assistant &Suivant > - + &Suivant > Étape 1/3 : Catégorie parente wizard page title - + Étape 1/3 : Catégorie parente Sélectionnez une catégorie dans laquelle enregistrer le nouvel élément. wizard page subtitle - + Sélectionnez une catégorie dans laquelle enregistrer le nouvel élément. Étape 2/3 : Nom du fichier wizard page title - + Étape 2/3 : Nom du fichier Indiquez le nom du fichier dans lequel enregistrer le nouvel élément. wizard page subtitle - + Indiquez le nom du fichier dans lequel enregistrer le nouvel élément. nouvel_element - + nouvel_element Vous n'êtes pas obligé de préciser l'extension *.elmt. Elle sera ajoutée automatiquement. - + Vous n'êtes pas obligé de préciser l'extension *.elmt. Elle sera ajoutée automatiquement. Étape 3/3 : Noms de l'élément wizard page title - + Étape 3/3 : Noms de l'élément Indiquez le ou les noms de l'élément. wizard page subtitle - + Indiquez le ou les noms de l'élément. Nom du nouvel élément default name when creating a new element - + Nom du nouvel élément @@ -7615,24 +7699,24 @@ Voulez-vous tout de même lier ce contact esclave ? Erreur message box title - + Erreur Vous devez sélectionner une catégorie. message box content - + Vous devez sélectionner une catégorie. Vous devez entrer un nom de fichier message box content - + Vous devez entrer un nom de fichier Un élément portant le même nom existe déjà - + Un élément portant le même nom existe déjà @@ -7640,32 +7724,32 @@ Voulez-vous tout de même lier ce contact esclave ? Form - + Form Mettre à 0 pour un chiffre qui n'avance que par le report d'un chiffre cyclique suivant (ex: le "0" de "0.7") - + Mettre à 0 pour un chiffre qui n'avance que par le report d'un chiffre cyclique suivant (ex: le "0" de "0.7") Valeur à laquelle ce chiffre revient à 0 en incrémentant le chiffre précédent (0 = pas de cycle) - + Valeur à laquelle ce chiffre revient à 0 en incrémentant le chiffre précédent (0 = pas de cycle) mod. - + mod. Format d'affichage : une suite de zéros donne le nombre minimum de chiffres (00 = 07, 000 = 007). Vide = largeur naturelle du type. - + Format d'affichage : une suite de zéros donne le nombre minimum de chiffres (00 = 07, 000 = 007). Vide = largeur naturelle du type. 0 - + 0 @@ -7674,7 +7758,7 @@ Voulez-vous tout de même lier ce contact esclave ? Chiffre 1 - + Chiffre 1 @@ -7683,7 +7767,7 @@ Voulez-vous tout de même lier ce contact esclave ? Chiffre 01 - + Chiffre 01 @@ -7692,7 +7776,7 @@ Voulez-vous tout de même lier ce contact esclave ? Chiffre 001 - + Chiffre 001 @@ -7701,7 +7785,7 @@ Voulez-vous tout de même lier ce contact esclave ? Cyclique (modulo) - + Cyclique (modulo) @@ -7710,7 +7794,7 @@ Voulez-vous tout de même lier ce contact esclave ? Alphabétique - + Alphabétique @@ -7719,7 +7803,7 @@ Voulez-vous tout de même lier ce contact esclave ? Texte - + Texte @@ -7727,7 +7811,7 @@ Voulez-vous tout de même lier ce contact esclave ? N° folio - + N° folio @@ -7735,7 +7819,7 @@ Voulez-vous tout de même lier ce contact esclave ? Folio - + Folio @@ -7743,7 +7827,7 @@ Voulez-vous tout de même lier ce contact esclave ? Chiffre 1 - Folio - + Chiffre 1 - Folio @@ -7751,7 +7835,7 @@ Voulez-vous tout de même lier ce contact esclave ? Chiffre 01 - Folio - + Chiffre 01 - Folio @@ -7759,7 +7843,7 @@ Voulez-vous tout de même lier ce contact esclave ? Chiffre 001 - Folio - + Chiffre 001 - Folio @@ -7767,7 +7851,7 @@ Voulez-vous tout de même lier ce contact esclave ? Locmach - + Locmach @@ -7775,28 +7859,28 @@ Voulez-vous tout de même lier ce contact esclave ? Installation - + Installation Element Line - + Element Line Element Column - + Element Column Element Prefix - + Element Prefix @@ -7807,7 +7891,7 @@ Voulez-vous tout de même lier ce contact esclave ? Modifier un arc - + Modifier un arc @@ -7816,12 +7900,12 @@ Voulez-vous tout de même lier ce contact esclave ? Champ de texte dynamique element part name - + Champ de texte dynamique Déplacer un champ texte - + Déplacer un champ texte @@ -7829,7 +7913,7 @@ Voulez-vous tout de même lier ce contact esclave ? Modifier un rectangle - + Modifier un rectangle @@ -7837,7 +7921,7 @@ Voulez-vous tout de même lier ce contact esclave ? Modifier une ligne - + Modifier une ligne @@ -7845,27 +7929,27 @@ Voulez-vous tout de même lier ce contact esclave ? Ajouter un point - + Ajouter un point Supprimer ce point - + Supprimer ce point Modifier un polygone - + Modifier un polygone Ajouter un point à un polygone - + Ajouter un point à un polygone Supprimer un point d'un polygone - + Supprimer un point d'un polygone @@ -7873,7 +7957,7 @@ Voulez-vous tout de même lier ce contact esclave ? Déplacer le label d'une borne - + Déplacer le label d'une borne @@ -7881,12 +7965,12 @@ Voulez-vous tout de même lier ce contact esclave ? Déplacer un texte - + Déplacer un texte Modifier un champ texte - + Modifier un champ texte @@ -7894,7 +7978,7 @@ Voulez-vous tout de même lier ce contact esclave ? Numérotation absente de ce projet - + Numérotation absente de ce projet @@ -7916,45 +8000,45 @@ Les importer ? Les éléments recevront alors les prochains numéros, à partir Sélectionner une page - + Sélectionner une page Ce document PDF contient %n page(s) - - + Ce document PDF contient %n page(s) + Ce document PDF contient %n page(s) Page à importer : - + Page à importer : Résolution : - + Résolution : 150 DPI (écran) - + 150 DPI (écran) 300 DPI (impression) - + 300 DPI (impression) 600 DPI (haute qualité) - + 600 DPI (haute qualité) Aperçu : - + Aperçu : @@ -7962,77 +8046,77 @@ Les importer ? Les éléments recevront alors les prochains numéros, à partir Cet élément est déjà lié - + Cet élément est déjà lié Délier - + Délier Voir cet élément - + Voir cet élément Masquer les éléments connectés - + Masquer les éléments connectés Recherche - + Recherche Label - + Label Type - + Type Adresse - + Adresse Fonction - + Fonction Commentaire - + Commentaire Bornes - + Bornes Remarque : les éléments maîtres ayant atteint leur nombre maximal d'esclaves sont masqués. - + Remarque : les éléments maîtres ayant atteint leur nombre maximal d'esclaves sont masqués. Automate (PLC) - + Automate (PLC) Lié à: %1 - + Lié à: %1 Connecter - + Connecter @@ -8045,60 +8129,60 @@ Les importer ? Les éléments recevront alors les prochains numéros, à partir X - + X Y - + Y Polygone fermé - + Polygone fermé Ajouter un point - + Ajouter un point Supprimer ce point - + Supprimer ce point Points du polygone : - + Points du polygone : Erreur message box title - + Erreur Le polygone doit comporter au moins deux points. message box content - + Le polygone doit comporter au moins deux points. Ajouter un point à un polygone - + Ajouter un point à un polygone Supprimer un point d'un polygone - + Supprimer un point d'un polygone Modifier un polygone - + Modifier un polygone @@ -8106,13 +8190,14 @@ Les importer ? Les éléments recevront alors les prochains numéros, à partir Sélectionner le potentiel éléctrique - + Sélectionner le potentiel éléctrique Vous tentez de lier deux potentiels différents ensemble. Veuillez choisir les propriétées à appliquer au nouveau potentiel. - + Vous tentez de lier deux potentiels différents ensemble. +Veuillez choisir les propriétées à appliquer au nouveau potentiel. @@ -8120,7 +8205,8 @@ Veuillez choisir les propriétées à appliquer au nouveau potentiel. Fonction : %1 - + +Fonction : %1 @@ -8128,7 +8214,8 @@ Fonction : %1 Tension/protocole : %1 - + +Tension/protocole : %1 @@ -8145,13 +8232,15 @@ Tension/protocole : %1 Numéro : %1 - + +Numéro : %1 Veuillez choisir un potentiel électrique de la liste à utiliser pour le nouveau potentiel - + Veuillez choisir un potentiel électrique de la liste +à utiliser pour le nouveau potentiel @@ -8159,7 +8248,8 @@ Numéro : %1 Couleur du conducteur : %1 - + +Couleur du conducteur : %1 @@ -8167,23 +8257,24 @@ Couleur du conducteur : %1 Section du conducteur : %1 - + +Section du conducteur : %1 Ajouter au câble: %1 - + Ajouter au câble: %1 Ajouter au bus: %1 - + Ajouter au bus: %1 Modifier les propriétés de plusieurs conducteurs undo caption - + Modifier les propriétés de plusieurs conducteurs @@ -8191,7 +8282,10 @@ Section du conducteur : %1 Veuillez saisir une formule compatible pour ce potentiel. Les variables suivantes sont incompatibles : %sequf_ %seqtf_ %seqhf_ %id %F %M %LM - + La formule du nouveau potentiel contient des variables incompatibles avec les reports de folio. +Veuillez saisir une formule compatible pour ce potentiel. +Les variables suivantes sont incompatibles : +%sequf_ %seqtf_ %seqhf_ %id %F %M %LM @@ -8200,95 +8294,101 @@ Les variables suivantes sont incompatibles : Préfixes de la collection utilisateur title of the dialog configuring the prefixes of the user collection - + Préfixes de la collection utilisateur Chaque dossier de la collection possède un préfixe : il est ajouté devant l'étiquette des éléments du dossier. Un champ vide signifie que le dossier reprend le préfixe de son dossier parent. - + Chaque dossier de la collection possède un préfixe : il est ajouté devant l'étiquette des éléments du dossier. +Un champ vide signifie que le dossier reprend le préfixe de son dossier parent. Dossier column header of the folder tree - + Dossier Préfixe column header of the prefix column - + Préfixe Tout déplier - + Tout déplier Tout replier - + Tout replier Entrées sans dossier - + Entrées sans dossier %n entrée(s) de qet_labels.xml ne correspond à aucun dossier de la collection : les conserver ou les supprimer ? - - + %n entrée(s) de qet_labels.xml ne correspond à aucun dossier de la collection : +les conserver ou les supprimer ? + %n entrée(s) de qet_labels.xml ne correspond à aucun dossier de la collection : +les conserver ou les supprimer ? Conserver - + Conserver Supprimer - + Supprimer aucun préfixe : n'hérite pas du parent placeholder of an empty prefix field whose folder explicitly has no prefix, which cancels the inheritance - + aucun préfixe : n'hérite pas du parent hériter du dossier parent placeholder of an empty prefix field - + hériter du dossier parent Enregistrement impossible - + Enregistrement impossible Le fichier %1 n'a pas pu être enregistré : %2 - + Le fichier %1 n'a pas pu être enregistré : +%2 Fichier endommagé remplacé - + Fichier endommagé remplacé Le fichier %1 était illisible : il a été remplacé. Sa copie a été conservée sous : %2 - + Le fichier %1 était illisible : il a été remplacé. +Sa copie a été conservée sous : +%2 @@ -8297,7 +8397,7 @@ Sa copie a été conservée sous : Impression configuration page title - + Impression @@ -8305,23 +8405,23 @@ Sa copie a été conservée sous : Numérotation auto - + Numérotation auto Conducteurs - + Conducteurs N° - + N° Nom - + Nom @@ -8331,70 +8431,70 @@ Sa copie a été conservée sous : Élément - + Élément Figé - + Figé Attribuer un numéro libre… - + Attribuer un numéro libre… Donner à l'élément sélectionné un numéro que personne n'a : il garde sa numérotation, seul son numéro change. - + Donner à l'élément sélectionné un numéro que personne n'a : il garde sa numérotation, seul son numéro change. Eléments - + Eléments Folios - + Folios Numérotation auto des folios - + Numérotation auto des folios Importer depuis un autre projet... - + Importer depuis un autre projet... Reprendre les numérotations automatiques enregistrées dans un autre projet - + Reprendre les numérotations automatiques enregistrées dans un autre projet figé - + figé — libre — - + — libre — aucun élément n'a ce numéro (supprimé ou renuméroté) - + aucun élément n'a ce numéro (supprimé ou renuméroté) Aucun élément ne suit cette numérotation - + Aucun élément ne suit cette numérotation @@ -8415,44 +8515,44 @@ Sa copie a été conservée sous : Cette numérotation a plusieurs numéros (ou un numéro par folio) : on ne peut pas en choisir un à la main. - + Cette numérotation a plusieurs numéros (ou un numéro par folio) : on ne peut pas en choisir un à la main. Attribuer un numéro libre - + Attribuer un numéro libre Le nom de cet élément est figé : dégelez-le d'abord. - + Le nom de cet élément est figé : dégelez-le d'abord. Aucun numéro n'est libre. - + Aucun numéro n'est libre. %1 → %2 - + %1 → %2 Numéro libre pour l'élément « %1 » (%2) : - + Numéro libre pour l'élément « %1 » (%2) : Nom de la numérotation : - + Nom de la numérotation : Modifier la numérotation - + Modifier la numérotation @@ -8468,13 +8568,13 @@ Sa copie a été conservée sous : Nouvelle numérotation - + Nouvelle numérotation Renommer la numérotation - + Renommer la numérotation @@ -8507,7 +8607,7 @@ Dégelez-les d'abord (voir la liste), ou renommez seulement la numérotatio Supprimer la numérotation - + Supprimer la numérotation @@ -8523,7 +8623,7 @@ Donnez-leur une autre numérotation ou un nom fixe d'abord. Aucun folio ne nomme cette numérotation - + Aucun folio ne nomme cette numérotation @@ -8536,7 +8636,7 @@ Donnez-leur une autre numérotation ou un nom fixe d'abord. Aucun folio ne suit cette numérotation - + Aucun folio ne suit cette numérotation @@ -8560,85 +8660,85 @@ Donnez-leur une autre numérotation d'abord. Importer les numérotations d'un projet - + Importer les numérotations d'un projet Projet QElectroTech (*.qet) - + Projet QElectroTech (*.qet) Import impossible - + Import impossible Impossible d'ouvrir %1 - + Impossible d'ouvrir %1 %1 n'est pas un projet QElectroTech valide. - + %1 n'est pas un projet QElectroTech valide. Aucune numérotation - + Aucune numérotation Ce projet ne contient aucune numérotation automatique. - + Ce projet ne contient aucune numérotation automatique. Numérotations à importer - + Numérotations à importer Numérotations trouvées dans %1 : - + Numérotations trouvées dans %1 : %1 : %2 (existe déjà) - + %1 : %2 (existe déjà) Remplacer les numérotations de même nom - + Remplacer les numérotations de même nom Importer des numérotations - + Importer des numérotations Import terminé - + Import terminé %1 numérotation(s) importée(s), %2 conservée(s) telles quelles. - + %1 numérotation(s) importée(s), %2 conservée(s) telles quelles. %1 numérotation(s) importée(s). - + %1 numérotation(s) importée(s). Management - + Management @@ -8646,12 +8746,12 @@ Donnez-leur une autre numérotation d'abord. Position - + Position Position du folio - + Position du folio @@ -8667,134 +8767,134 @@ Donnez-leur une autre numérotation d'abord. Général configuration page title - + Général Titre du projet : label when configuring - + Titre du projet : Ce titre sera disponible pour tous les folios de ce projet en tant que %projecttitle. informative label - + Ce titre sera disponible pour tous les folios de ce projet en tant que %projecttitle. Vous pouvez définir ci-dessous des propriétés personnalisées qui seront disponibles pour tous les folios de ce projet (typiquement pour les cartouches). informative label - + Vous pouvez définir ci-dessous des propriétés personnalisées qui seront disponibles pour tous les folios de ce projet (typiquement pour les cartouches). Temps passé sur ce projet : label when configuring - + Temps passé sur ce projet : Suivre le temps passé sur ce projet (uniquement enregistré localement dans ce fichier) checkbox label - + Suivre le temps passé sur ce projet (uniquement enregistré localement dans ce fichier) Réinitialiser button label - + Réinitialiser Croisements de conducteurs : label when configuring - + Croisements de conducteurs : Sans saut wire crossings - + Sans saut Saut sur les conducteurs horizontaux wire crossings - + Saut sur les conducteurs horizontaux Saut sur les conducteurs verticaux wire crossings - + Saut sur les conducteurs verticaux Dessine un petit arc là où deux conducteurs se croisent sans être reliés. Seul le dessin change : aucun élément n'est ajouté et aucun conducteur n'est coupé. tooltip - + Dessine un petit arc là où deux conducteurs se croisent sans être reliés. Seul le dessin change : aucun élément n'est ajouté et aucun conducteur n'est coupé. Conducteurs par borne group box title - + Conducteurs par borne Utiliser les réglages de l'application checkbox label - + Utiliser les réglages de l'application Les réglages de Configurer QElectroTech > Général s'appliquent. Décochez pour donner à ce projet ses propres réglages, enregistrés dans le projet. tooltip - + Les réglages de Configurer QElectroTech > Général s'appliquent. Décochez pour donner à ce projet ses propres réglages, enregistrés dans le projet. Nombre maximal de conducteurs par borne : label when configuring - + Nombre maximal de conducteurs par borne : Sans limite wires per terminal - + Sans limite Un nouveau conducteur qui dépasserait ce nombre sur une borne est refusé. Les conducteurs déjà dessinés ne sont pas modifiés. 4 correspond à deux embouts doubles, un de chaque côté de la vis. tooltip - + Un nouveau conducteur qui dépasserait ce nombre sur une borne est refusé. Les conducteurs déjà dessinés ne sont pas modifiés. 4 correspond à deux embouts doubles, un de chaque côté de la vis. Un seul conducteur par renvoi de folio checkbox label - + Un seul conducteur par renvoi de folio Un renvoi de folio est un point virtuel : il ne reçoit qu'un conducteur, celui qui continue sur l'autre folio. tooltip - + Un renvoi de folio est un point virtuel : il ne reçoit qu'un conducteur, celui qui continue sur l'autre folio. Ces règles sont désactivées pour tous les projets (Configurer QElectroTech > Général). informative label - + Ces règles sont désactivées pour tous les projets (Configurer QElectroTech > Général). %1 h %2 min hours and minutes of time spent on a project - + %1 h %2 min @@ -8802,214 +8902,214 @@ Donnez-leur une autre numérotation d'abord. MainWindow - + MainWindow Folios à imprimer : - + Folios à imprimer : Tout cocher - + Tout cocher Tout décocher - + Tout décocher Toutes les dates - + Toutes les dates À partir de la date du : - + À partir de la date du : À la date du : - + À la date du : Option de rendu - + Option de rendu Dessiner le cadre - + Dessiner le cadre Dessiner le cartouche - + Dessiner le cartouche Conserver les couleurs des conducteurs - + Conserver les couleurs des conducteurs Dessiner les bornes - + Dessiner les bornes Dessiner les noms des bornes - + Dessiner les noms des bornes Inscrire les informations des composants - + Inscrire les informations des composants Option d'impression - + Option d'impression Adapter le folio à la page - + Adapter le folio à la page Utiliser toute la feuille - + Utiliser toute la feuille Si cette option est cochée, le folio sera agrandi ou rétréci de façon à remplir toute la surface imprimable d'une et une seule page." - + Si cette option est cochée, le folio sera agrandi ou rétréci de façon à remplir toute la surface imprimable d'une et une seule page." Si cette option est cochée, les marges de la feuille seront ignorées et toute sa surface sera utilisée pour l'impression. Cela peut ne pas être supporté par votre imprimante. - + Si cette option est cochée, les marges de la feuille seront ignorées et toute sa surface sera utilisée pour l'impression. Cela peut ne pas être supporté par votre imprimante. toolBar - + toolBar Ajuster la largeur - + Ajuster la largeur Ajuster la page - + Ajuster la page Zoom arrière - + Zoom arrière Zoom avant - + Zoom avant Paysage - + Paysage Portrait - + Portrait Première page - + Première page Page précédente - + Page précédente Page suivante - + Page suivante Dernière page - + Dernière page Afficher une seule page - + Afficher une seule page Afficher deux pages - + Afficher deux pages Afficher un aperçu de toutes les pages - + Afficher un aperçu de toutes les pages mise en page - + mise en page Options d'impression window title - + Options d'impression projet string used to generate a filename - + projet Imprimer - + Imprimer Exporter en pdf - + Exporter en pdf Mise en page (non disponible sous Windows pour l'export PDF) - + Mise en page (non disponible sous Windows pour l'export PDF) Folio sans titre - + Folio sans titre Exporter sous : - + Exporter sous : Fichier (*.pdf) - + Fichier (*.pdf) @@ -9018,90 +9118,91 @@ Donnez-leur une autre numérotation d'abord. Le projet à été modifié. Voulez-vous enregistrer les modifications ? - + Le projet à été modifié. +Voulez-vous enregistrer les modifications ? Enregistrer sous dialog title - + Enregistrer sous sansnom - + sansnom Projet QElectroTech (*.qet) filetypes allowed when saving a project file - + Projet QElectroTech (*.qet) aucun projet affiché error message - + aucun projet affiché Supprimer le folio ? message box title - + Supprimer le folio ? Êtes-vous sûr de vouloir supprimer ce folio du projet ? message box content - + Êtes-vous sûr de vouloir supprimer ce folio du projet ? Projet en lecture seule message box title - + Projet en lecture seule Ce projet est en lecture seule. Il n'est donc pas possible de le nettoyer. message box content - + Ce projet est en lecture seule. Il n'est donc pas possible de le nettoyer. Supprimer les modèles de cartouche inutilisés dans le projet - + Supprimer les modèles de cartouche inutilisés dans le projet Supprimer les éléments inutilisés dans le projet - + Supprimer les éléments inutilisés dans le projet Supprimer les catégories vides - + Supprimer les catégories vides Nettoyer le projet window title - + Nettoyer le projet Ajouter un folio - + Ajouter un folio Revenir au debut du projet - + Revenir au debut du projet Aller à la fin du projet - + Aller à la fin du projet @@ -9117,18 +9218,18 @@ Voulez-vous enregistrer les modifications ? Ce projet ne contient aucun folio label displayed when a project contains no diagram - + Ce projet ne contient aucun folio <p align="center"><b>Ouverture du projet en cours...</b><br/>Création des onglets de folio :</p> - + <p align="center"><b>Ouverture du projet en cours...</b><br/>Création des onglets de folio :</p> Projet window title for a project-less ProjectView - + Projet @@ -9136,7 +9237,7 @@ Voulez-vous enregistrer les modifications ? Propriétés de la sélection - + Propriétés de la sélection @@ -9145,31 +9246,31 @@ Voulez-vous enregistrer les modifications ? Chargement... Initialisation du cache des collections d'éléments splash screen caption - + Chargement... Initialisation du cache des collections d'éléments Chargement... Éditeur de schéma splash screen caption - + Chargement... Éditeur de schéma Chargement... Ouverture des fichiers splash screen caption - + Chargement... Ouverture des fichiers LTR Translate this string to RTL if you are translating to a Right-to-Left language, else translate to LTR - + LTR Cartouches QET title of the title block templates collection provided by QElectroTech - + Cartouches QET @@ -9181,85 +9282,85 @@ Voulez-vous enregistrer les modifications ? Cartouches utilisateur title of the user's title block templates collection - + Cartouches utilisateur Q Single-letter example text - translate length, not meaning - + Q QET Small example text - translate length, not meaning - + QET Schema Normal example text - translate length, not meaning - + Schema Electrique Normal example text - translate length, not meaning - + Electrique QElectroTech Long example text - translate length, not meaning - + QElectroTech Configurer QElectroTech window title - + Configurer QElectroTech Enregistrer la configuration sous... dialog title - + Enregistrer la configuration sous... Configurations QElectroTech (*.conf) file dialog filter - + Configurations QElectroTech (*.conf) Erreur message box title - + Erreur Impossible d'enregistrer la configuration dans « %1 ». - + Impossible d'enregistrer la configuration dans « %1 ». Charger une configuration... dialog title - + Charger une configuration... « %1 » n'est pas une configuration enregistrée par QElectroTech. - + « %1 » n'est pas une configuration enregistrée par QElectroTech. Charger une configuration message box title - + Charger une configuration @@ -9268,152 +9369,159 @@ Voulez-vous enregistrer les modifications ? QElectroTech va ensuite se fermer. Relancez-le pour utiliser la nouvelle configuration. Voulez-vous continuer ? - + Cette configuration va remplacer vos réglages actuels, sauf la disposition des fenêtres et la liste des fichiers récents. + +QElectroTech va ensuite se fermer. Relancez-le pour utiliser la nouvelle configuration. + +Voulez-vous continuer ? Chargement... splash screen caption - + Chargement... Chargement... icône du systray splash screen caption - + Chargement... icône du systray QElectroTech systray menu title - + QElectroTech &Quitter - + &Quitter &Masquer - + &Masquer &Restaurer - + &Restaurer &Masquer tous les éditeurs de schéma - + &Masquer tous les éditeurs de schéma &Restaurer tous les éditeurs de schéma - + &Restaurer tous les éditeurs de schéma &Masquer tous les éditeurs d'élément - + &Masquer tous les éditeurs d'élément &Restaurer tous les éditeurs d'élément - + &Restaurer tous les éditeurs d'élément &Masquer tous les éditeurs de cartouche systray submenu entry - + &Masquer tous les éditeurs de cartouche &Restaurer tous les éditeurs de cartouche systray submenu entry - + &Restaurer tous les éditeurs de cartouche &Nouvel éditeur de schéma - + &Nouvel éditeur de schéma &Nouvel éditeur d'élément - + &Nouvel éditeur d'élément Ferme l'application QElectroTech - + Ferme l'application QElectroTech Réduire QElectroTech dans le systray - + Réduire QElectroTech dans le systray Restaurer QElectroTech - + Restaurer QElectroTech QElectroTech systray icon tooltip - + QElectroTech Éditeurs de schémas - + Éditeurs de schémas Éditeurs d'élément - + Éditeurs d'élément Éditeurs de cartouche systray menu entry - + Éditeurs de cartouche Rapport de plantage - + Rapport de plantage QElectroTech ne s'est pas fermé correctement lors de sa dernière exécution. Voici les derniers messages enregistrés avant l'arrêt -- vous pouvez les enregistrer pour les joindre à un rapport de bug. - + QElectroTech ne s'est pas fermé correctement lors de sa dernière exécution. +Voici les derniers messages enregistrés avant l'arrêt -- vous pouvez les enregistrer pour les joindre à un rapport de bug. Rapport de diagnostic - + Rapport de diagnostic Ceci contient les derniers messages de journalisation de cette session. Vérifiez le contenu avant de le joindre à un rapport de bug public. - + Ceci contient les derniers messages de journalisation de cette session. Vérifiez le contenu avant de le joindre à un rapport de bug public. Usage : - + Usage : [options] [fichier]... - + [options] [fichier]... + + @@ -9424,37 +9532,48 @@ Options disponibles : -v, --version Afficher la version --license Afficher la licence - + QElectroTech, une application de réalisation de schémas électriques. + +Options disponibles : + --help Afficher l'aide sur les options + -v, --version Afficher la version + --license Afficher la licence + --common-elements-dir=DIR Definir le dossier de la collection d'elements - + --common-elements-dir=DIR Definir le dossier de la collection d'elements + --common-tbt-dir=DIR Definir le dossier de la collection de modeles de cartouches - + --common-tbt-dir=DIR Definir le dossier de la collection de modeles de cartouches + --config-dir=DIR Definir le dossier de configuration - + --config-dir=DIR Definir le dossier de configuration + --data-dir=DIR Definir le dossier de data - + --data-dir=DIR Definir le dossier de data + --lang-dir=DIR Definir le dossier contenant les fichiers de langue - + --lang-dir=DIR Definir le dossier contenant les fichiers de langue + @@ -9465,201 +9584,201 @@ Options disponibles : QElectroTech window title - + QElectroTech QElectroTech status bar message - + QElectroTech Projets dock title - + Projets Collections - + Collections Aucune modification - + Aucune modification Cliquez sur une action pour revenir en arrière dans l'édition de votre schéma Status tip - + Cliquez sur une action pour revenir en arrière dans l'édition de votre schéma Ce panneau liste les différentes actions effectuées sur le folio courant. Cliquer sur une action permet de revenir à l'état du schéma juste après son application. "What's this" tip - + Ce panneau liste les différentes actions effectuées sur le folio courant. Cliquer sur une action permet de revenir à l'état du schéma juste après son application. Annulations dock title - + Annulations E&xporter - + E&xporter Imprimer - + Imprimer &Quitter - + &Quitter Annuler - + Annuler Refaire - + Refaire Annule l'action précédente status bar tip - + Annule l'action précédente Restaure l'action annulée status bar tip - + Restaure l'action annulée Co&uper - + Co&uper Cop&ier - + Cop&ier C&oller - + C&oller Transfère les éléments sélectionnés dans le presse-papier status bar tip - + Transfère les éléments sélectionnés dans le presse-papier Copie les éléments sélectionnés dans le presse-papier status bar tip - + Copie les éléments sélectionnés dans le presse-papier Place les éléments du presse-papier sur le folio status bar tip - + Place les éléments du presse-papier sur le folio Réinitialiser les conducteurs - + Réinitialiser les conducteurs Création automatique de conducteur(s) Tool tip of auto conductor - + Création automatique de conducteur(s) Utiliser la création automatique de conducteur(s) quand cela est possible Status tip of auto conductor - + Utiliser la création automatique de conducteur(s) quand cela est possible Afficher la grille - + Afficher la grille Affiche ou masque la grille des folios - + Affiche ou masque la grille des folios Propriétés du folio - + Propriétés du folio Propriétés du projet - + Propriétés du projet Ajouter un folio - + Ajouter un folio Supprimer le folio - + Supprimer le folio Nettoyer le projet - + Nettoyer le projet Ajouter un sommaire - + Ajouter un sommaire en utilisant des onglets - + en utilisant des onglets en utilisant des fenêtres - + en utilisant des fenêtres Mode Selection - + Mode Selection Mode Visualisation - + Mode Visualisation &Mosaïque - + &Mosaïque @@ -9714,327 +9833,328 @@ Options disponibles : Éditeur de schémas - + Éditeur de schémas Exporter en pdf - + Exporter en pdf Exporte un ou plusieurs folios du projet courant status bar tip - + Exporte un ou plusieurs folios du projet courant Coller au point d'origine - + Coller au point d'origine Place les éléments du presse-papier à leur position d'origine et déplace le curseur vers ce point status bar tip - + Place les éléments du presse-papier à leur position d'origine et déplace le curseur vers ce point Dupli&quer - + Dupli&quer Copie la sélection, décalée de l'espacement configuré status bar tip - + Copie la sélection, décalée de l'espacement configuré Configurer la duplication... - + Configurer la duplication... Choisir l'espacement et la direction utilisés par Dupliquer status bar tip - + Choisir l'espacement et la direction utilisés par Dupliquer Coupure automatique de conducteur(s) Tool tip of auto break conductor - + Coupure automatique de conducteur(s) Couper automatiquement les conducteurs existants lors du placement d'un élément Status tip of auto break conductor - + Couper automatiquement les conducteurs existants lors du placement d'un élément Grille des textes - + Grille des textes Grille d'accrochage des textes déplacés à la souris. Maintenir Ctrl pendant le déplacement pour placer librement. - + Grille d'accrochage des textes déplacés à la souris. +Maintenir Ctrl pendant le déplacement pour placer librement. Désactivée - + Désactivée Afficher les guides - + Afficher les guides Affiche ou masque les guides - + Affiche ou masque les guides Garder les en-têtes visibles - + Garder les en-têtes visibles Garde les numéros de colonne et les lettres de ligne du folio visibles au bord de la vue - + Garde les numéros de colonne et les lettres de ligne du folio visibles au bord de la vue Afficher les limites des cases - + Afficher les limites des cases Trace les limites des colonnes et des lignes du folio sur le schéma, à l'écran seulement - + Trace les limites des colonnes et des lignes du folio sur le schéma, à l'écran seulement Afficher - + Afficher Textes des éléments - + Textes des éléments Textes des conducteurs - + Textes des conducteurs Champs de texte - + Champs de texte Formes - + Formes Images - + Images Tableaux - + Tableaux Références croisées - + Références croisées Voir Affichage > Afficher - + Voir Affichage > Afficher Exporter au format CSV - + Exporter au format CSV Gestionnaire de borniers (DEV) - + Gestionnaire de borniers (DEV) Lancer le plugin de création de borniers - + Lancer le plugin de création de borniers Exporter la liste des noms de conducteurs - + Exporter la liste des noms de conducteurs Exporter le plan de câblage - + Exporter le plan de câblage Liste de câblage (base de données) - + Liste de câblage (base de données) Numérotation automatique des bornes - + Numérotation automatique des bornes Recharger les dessins des éléments - + Recharger les dessins des éléments Redessine chaque élément placé d'après sa définition actuelle, sans avoir à fermer et rouvrir le projet (action non annulable) - + Redessine chaque élément placé d'après sa définition actuelle, sans avoir à fermer et rouvrir le projet (action non annulable) Exécuter un script... - + Exécuter un script... Exécute un script JavaScript sur le projet courant (voir qet.* dans le script pour l'API disponible) - + Exécute un script JavaScript sur le projet courant (voir qet.* dans le script pour l'API disponible) Enregistrer une macro - + Enregistrer une macro Enregistre ce que vous faites sur le projet, pour qu'un assistant IA en fasse un script ; recliquez pour arrêter - + Enregistre ce que vous faites sur le projet, pour qu'un assistant IA en fasse un script ; recliquez pour arrêter Gérer les scripts… - + Gérer les scripts… Écrire un script et en faire un bouton avec une icône - + Écrire un script et en faire un bouton avec une icône Ouvrir le dossier des scripts - + Ouvrir le dossier des scripts Chaque fichier .js de ce dossier qui commence par un en-tête // ==QETScript== devient un bouton - + Chaque fichier .js de ce dossier qui commence par un en-tête // ==QETScript== devient un bouton Exporter la base de donnée interne du projet - + Exporter la base de donnée interne du projet &Cascade - + &Cascade Projet suivant - + Projet suivant Projet précédent - + Projet précédent &Nouveau - + &Nouveau &Ouvrir - + &Ouvrir &Enregistrer - + &Enregistrer Enregistrer sous - + Enregistrer sous &Fermer - + &Fermer Crée un nouveau projet status bar tip - + Crée un nouveau projet Ouvre un projet existant status bar tip - + Ouvre un projet existant Ferme le projet courant status bar tip - + Ferme le projet courant Enregistre le projet courant et tous ses folios status bar tip - + Enregistre le projet courant et tous ses folios Enregistre le projet courant avec un autre nom de fichier status bar tip - + Enregistre le projet courant avec un autre nom de fichier Ajouter une colonne - + Ajouter une colonne Enlever une colonne - + Enlever une colonne @@ -10052,438 +10172,438 @@ Maintenir Ctrl pendant le déplacement pour placer librement. Ajoute une colonne au folio status bar tip - + Ajoute une colonne au folio Enlève une colonne au folio status bar tip - + Enlève une colonne au folio Agrandit le folio en hauteur status bar tip - + Agrandit le folio en hauteur Rétrécit le folio en hauteur status bar tip - + Rétrécit le folio en hauteur Supprimer - + Supprimer Pivoter - + Pivoter Pivoter le groupe - + Pivoter le groupe Orienter les textes - + Orienter les textes Retrouver dans le panel - + Retrouver dans le panel Éditer l'item sélectionné - + Éditer l'item sélectionné Grouper - + Grouper Dégrouper - + Dégrouper Insérer le dernier élément - + Insérer le dernier élément Place à nouveau le dernier élément inséré status bar tip - + Place à nouveau le dernier élément inséré Rechercher une commande… - + Rechercher une commande… Tapez une partie du nom d'une commande et appuyez sur Entrée pour la lancer status bar tip - + Tapez une partie du nom d'une commande et appuyez sur Entrée pour la lancer Insérer un élément… - + Insérer un élément… Ouvre le sélecteur d'éléments à la position du curseur status bar tip - + Ouvre le sélecteur d'éléments à la position du curseur Barre de raccourcis - + Barre de raccourcis Ouvre à la position du curseur les commandes utiles pour la sélection, et le sélecteur d'éléments status bar tip - + Ouvre à la position du curseur les commandes utiles pour la sélection, et le sélecteur d'éléments Répéter la dernière commande - + Répéter la dernière commande Relance le dernier outil de dessin ou la dernière insertion d'élément (Entrée sur le folio) status bar tip - + Relance le dernier outil de dessin ou la dernière insertion d'élément (Entrée sur le folio) Enlève les éléments sélectionnés du folio status bar tip - + Enlève les éléments sélectionnés du folio Pivote les éléments et textes sélectionnés status bar tip - + Pivote les éléments et textes sélectionnés Pivote la sélection comme un groupe autour de son centre, au lieu de chaque élément sur place status bar tip - + Pivote la sélection comme un groupe autour de son centre, au lieu de chaque élément sur place Pivote les textes sélectionnés à un angle précis status bar tip - + Pivote les textes sélectionnés à un angle précis Retrouve l'élément sélectionné dans le panel status bar tip - + Retrouve l'élément sélectionné dans le panel Groupe les éléments, textes, formes et images sélectionnés : ils se sélectionnent, se déplacent et se copient ensemble status bar tip - + Groupe les éléments, textes, formes et images sélectionnés : ils se sélectionnent, se déplacent et se copient ensemble Défait les groupes sélectionnés status bar tip - + Défait les groupes sélectionnés Aligner sur la grille - + Aligner sur la grille Remet les éléments, images et textes sélectionnés sur la grille status bar tip - + Remet les éléments, images et textes sélectionnés sur la grille Aligner à gauche - + Aligner à gauche Aligne les bords gauches des objets sélectionnés status bar tip - + Aligne les bords gauches des objets sélectionnés Centrer horizontalement - + Centrer horizontalement Aligne les objets sélectionnés sur une même verticale, par leur point d'origine pour les éléments status bar tip - + Aligne les objets sélectionnés sur une même verticale, par leur point d'origine pour les éléments Aligner à droite - + Aligner à droite Aligne les bords droits des objets sélectionnés status bar tip - + Aligne les bords droits des objets sélectionnés Aligner en haut - + Aligner en haut Aligne les bords supérieurs des objets sélectionnés status bar tip - + Aligne les bords supérieurs des objets sélectionnés Centrer verticalement - + Centrer verticalement Aligne les objets sélectionnés sur une même horizontale, par leur point d'origine pour les éléments status bar tip - + Aligne les objets sélectionnés sur une même horizontale, par leur point d'origine pour les éléments Aligner en bas - + Aligner en bas Aligne les bords inférieurs des objets sélectionnés status bar tip - + Aligne les bords inférieurs des objets sélectionnés Tout sélectionner - + Tout sélectionner Désélectionner tout - + Désélectionner tout Inverser la sélection - + Inverser la sélection Sélectionner tous les conducteurs - + Sélectionner tous les conducteurs Sélectionner tous les champs de texte - + Sélectionner tous les champs de texte Sélectionne tous les éléments du folio status bar tip - + Sélectionne tous les éléments du folio Désélectionne tous les éléments du folio status bar tip - + Désélectionne tous les éléments du folio Désélectionne les éléments sélectionnés et sélectionne les éléments non sélectionnés status bar tip - + Désélectionne les éléments sélectionnés et sélectionne les éléments non sélectionnés Sélectionne tous les conducteurs du folio, désélectionne le reste status bar tip - + Sélectionne tous les conducteurs du folio, désélectionne le reste Sélectionne tous les champs de texte du folio, désélectionne le reste status bar tip - + Sélectionne tous les champs de texte du folio, désélectionne le reste Zoom avant - + Zoom avant Zoom arrière - + Zoom arrière Zoom sur le contenu - + Zoom sur le contenu Zoom adapté - + Zoom adapté Pas de zoom - + Pas de zoom Centrer sur le curseur - + Centrer sur le curseur Agrandit le folio status bar tip - + Agrandit le folio Rétrécit le folio status bar tip - + Rétrécit le folio Adapte le zoom de façon à afficher tout le contenu du folio indépendamment du cadre - + Adapte le zoom de façon à afficher tout le contenu du folio indépendamment du cadre Adapte le zoom exactement sur le cadre du folio status bar tip - + Adapte le zoom exactement sur le cadre du folio Restaure le zoom par défaut status bar tip - + Restaure le zoom par défaut Centre le folio sur le point sous le curseur de la souris, sans changer le zoom status bar tip - + Centre le folio sur le point sous le curseur de la souris, sans changer le zoom Ajouter un champ de texte - + Ajouter un champ de texte Ajouter une image - + Ajouter une image Ajouter un PDF - + Ajouter un PDF Ajouter une ligne Draw line - + Ajouter une ligne Ajouter un rectangle - + Ajouter un rectangle Ajouter une ellipse - + Ajouter une ellipse Ajouter un arc - + Ajouter un arc Ajouter une polyligne - + Ajouter une polyligne Ajouter un congé - + Ajouter un congé Ajoute un arc sur le folio actuel - + Ajoute un arc sur le folio actuel Arrondit le coin entre deux lignes du folio actuel - + Arrondit le coin entre deux lignes du folio actuel Scripts toolbar title - + Scripts Scripts - + Scripts Folio %1 : %2 - + Folio %1 : %2 Conducteurs non chargés message box title - + Conducteurs non chargés @@ -10492,77 +10612,81 @@ Maintenir Ctrl pendant le déplacement pour placer librement. Si vous enregistrez le projet, ces conducteurs disparaîtront du fichier. Fermez-le sans enregistrer pour conserver le fichier tel quel. message box content - - + %n conducteur(s) n'ont pas pu être reliés à leurs bornes et n'ont pas été chargés. La définition de l'élément dans le projet a probablement été remplacée par une autre dont les bornes diffèrent. + +Si vous enregistrez le projet, ces conducteurs disparaîtront du fichier. Fermez-le sans enregistrer pour conserver le fichier tel quel. + %n conducteur(s) n'ont pas pu être reliés à leurs bornes et n'ont pas été chargés. La définition de l'élément dans le projet a probablement été remplacée par une autre dont les bornes diffèrent. + +Si vous enregistrez le projet, ces conducteurs disparaîtront du fichier. Fermez-le sans enregistrer pour conserver le fichier tel quel. %n objet(s) aligné(s) - - + %n objet(s) aligné(s) + %n objet(s) aligné(s) Sélectionnez au moins deux éléments, images, textes, formes ou groupes non verrouillés - + Sélectionnez au moins deux éléments, images, textes, formes ou groupes non verrouillés La sélection est déjà alignée, à la grille près - + La sélection est déjà alignée, à la grille près Répéter : insérer « %1 » - + Répéter : insérer « %1 » Répéter : %1 - + Répéter : %1 folio %1 - + folio %1 %n élément(s) redessiné(s). - - + %n élément(s) redessiné(s). + %n élément(s) redessiné(s). %n élément(s) dont la définition est introuvable ou illisible : leur dessin actuel a été conservé. - - + %n élément(s) dont la définition est introuvable ou illisible : leur dessin actuel a été conservé. + %n élément(s) dont la définition est introuvable ou illisible : leur dessin actuel a été conservé. %n élément(s) non redessiné(s) : leur taille, leur point de saisie ou leurs bornes ont changé (borne ajoutée, supprimée ou déplacée). - - + %n élément(s) non redessiné(s) : leur taille, leur point de saisie ou leurs bornes ont changé (borne ajoutée, supprimée ou déplacée). + %n élément(s) non redessiné(s) : leur taille, leur point de saisie ou leurs bornes ont changé (borne ajoutée, supprimée ou déplacée). Pour les mettre à jour, il faut les supprimer puis les réinsérer. Attention : cette opération supprime les conducteurs déjà reliés à ces éléments, qu'il faudra retracer. - + Pour les mettre à jour, il faut les supprimer puis les réinsérer. Attention : cette opération supprime les conducteurs déjà reliés à ces éléments, qu'il faudra retracer. Exécuter un script - + Exécuter un script @@ -10571,41 +10695,45 @@ Si vous enregistrez le projet, ces conducteurs disparaîtront du fichier. Fermez Un script s'exécute avec vos droits : il peut lire et modifier le projet ouvert et écrire des fichiers. N'exécutez que des scripts dont vous connaissez l'origine. Activer les scripts ? Ce réglage est modifiable dans Configurer QElectroTech > Général > Projets. - + Les scripts sont désactivés. + +Un script s'exécute avec vos droits : il peut lire et modifier le projet ouvert et écrire des fichiers. N'exécutez que des scripts dont vous connaissez l'origine. + +Activer les scripts ? Ce réglage est modifiable dans Configurer QElectroTech > Général > Projets. Scripts JavaScript (*.js);;Tous les fichiers (*) - + Scripts JavaScript (*.js);;Tous les fichiers (*) Ignoré : %1 - + Ignoré : %1 Arrêter - + Arrêter Arrêter l'enregistrement de la macro - + Arrêter l'enregistrement de la macro ● Enregistrement : %n étape(s) - - + ● Enregistrement : %n étape(s) + ● Enregistrement : %n étape(s) Macro enregistrée - + Macro enregistrée @@ -10613,60 +10741,64 @@ Activer les scripts ? Ce réglage est modifiable dans Configurer QElectroTech &g Pour en faire un script, demandez-le à votre assistant IA : le bouton ci-dessous copie la demande, il suffit de la coller dans sa fenêtre. - - + « %1 » : %n étape(s). + +Pour en faire un script, demandez-le à votre assistant IA : le bouton ci-dessous copie la demande, il suffit de la coller dans sa fenêtre. + « %1 » : %n étape(s). + +Pour en faire un script, demandez-le à votre assistant IA : le bouton ci-dessous copie la demande, il suffit de la coller dans sa fenêtre. &Copier la demande pour l'assistant - + &Copier la demande pour l'assistant &Ouvrir le dossier - + &Ouvrir le dossier Demande copiée : collez-la dans la fenêtre de l'assistant - + Demande copiée : collez-la dans la fenêtre de l'assistant Couper la connexion de l'assistant pour le reste de la session - + Couper la connexion de l'assistant pour le reste de la session Mode direct : assistant connecté - + Mode direct : assistant connecté Mode direct : en attente d'un assistant - + Mode direct : en attente d'un assistant Assistant - + Assistant Demander avant d'exécuter un script écrit par l'assistant - + Demander avant d'exécuter un script écrit par l'assistant Pour cette session seulement : chaque démarrage redemande - + Pour cette session seulement : chaque démarrage redemande Mode direct : %1 %2 à %3 - + Mode direct : %1 %2 à %3 @@ -10680,332 +10812,332 @@ Pour en faire un script, demandez-le à votre assistant IA : le bouton ci-dessou Textes %1 - + Textes %1 Exporte le folio courant dans un autre format status bar tip - + Exporte le folio courant dans un autre format Imprime un ou plusieurs folios du projet courant status bar tip - + Imprime un ou plusieurs folios du projet courant Ferme l'application QElectroTech status bar tip - + Ferme l'application QElectroTech Recalcule les chemins des conducteurs sans tenir compte des modifications status bar tip - + Recalcule les chemins des conducteurs sans tenir compte des modifications Édite les propriétés du folio (dimensions, informations du cartouche, propriétés des conducteurs...) status bar tip - + Édite les propriétés du folio (dimensions, informations du cartouche, propriétés des conducteurs...) Présente les différents projets ouverts dans des sous-fenêtres status bar tip - + Présente les différents projets ouverts dans des sous-fenêtres Présente les différents projets ouverts des onglets status bar tip - + Présente les différents projets ouverts des onglets Permet de sélectionner les éléments status bar tip - + Permet de sélectionner les éléments Permet de visualiser le folio sans pouvoir le modifier status bar tip - + Permet de visualiser le folio sans pouvoir le modifier Dispose les fenêtres en mosaïque status bar tip - + Dispose les fenêtres en mosaïque Ajouter une nomenclature - + Ajouter une nomenclature Dispose les fenêtres en cascade status bar tip - + Dispose les fenêtres en cascade Active le projet suivant status bar tip - + Active le projet suivant Active le projet précédent status bar tip - + Active le projet précédent Grouper les textes sélectionnés - + Grouper les textes sélectionnés Ajouter une courbe - + Ajouter une courbe Ajouter un plan de bornes - + Ajouter un plan de bornes Ajoute un champ de texte sur le folio actuel - + Ajoute un champ de texte sur le folio actuel Ajoute une image sur le folio actuel - + Ajoute une image sur le folio actuel Ajoute une page PDF sur le folio actuel - + Ajoute une page PDF sur le folio actuel Ajoute une ligne sur le folio actuel - + Ajoute une ligne sur le folio actuel Ajoute un rectangle sur le folio actuel - + Ajoute un rectangle sur le folio actuel Ajoute une ellipse sur le folio actuel - + Ajoute une ellipse sur le folio actuel Ajoute une polyligne sur le folio actuel - + Ajoute une polyligne sur le folio actuel Ajoute une courbe de Bézier sur le folio actuel - + Ajoute une courbe de Bézier sur le folio actuel Ajoute un plan de bornier sur le folio actuel - + Ajoute un plan de bornier sur le folio actuel Chercher/remplacer - + Chercher/remplacer Atteindre un élément - + Atteindre un élément Recherche et sélectionne rapidement un élément du folio status bar tip - + Recherche et sélectionne rapidement un élément du folio Outils - + Outils Affichage - + Affichage Schéma - + Schéma Ajouter - + Ajouter Profondeur toolbar title - + Profondeur &Fichier - + &Fichier &Édition - + &Édition &Projet - + &Projet Afficha&ge - + Afficha&ge Fe&nêtres - + Fe&nêtres &Récemment ouverts - + &Récemment ouverts A&jouter - + A&jouter Aligner - + Aligner Lignes et colonnes - + Lignes et colonnes Affiche ou non la barre d'outils principale - + Affiche ou non la barre d'outils principale Affiche ou non la barre d'outils Affichage - + Affiche ou non la barre d'outils Affichage Affiche ou non la barre d'outils Schéma - + Affiche ou non la barre d'outils Schéma Affiche ou non le panel d'appareils - + Affiche ou non le panel d'appareils Affiche ou non la liste des modifications - + Affiche ou non la liste des modifications Afficher les projets - + Afficher les projets Projet %1 enregistré dans le repertoire: %2. - + Projet %1 enregistré dans le repertoire: %2. Ouvrir un fichier - + Ouvrir un fichier Projets QElectroTech (*.qet);;Fichiers XML (*.xml);;Tous les fichiers (*) - + Projets QElectroTech (*.qet);;Fichiers XML (*.xml);;Tous les fichiers (*) Impossible d'ouvrir le fichier message box title - + Impossible d'ouvrir le fichier Il semblerait que le fichier %1 que vous essayez d'ouvrir n'existe pas ou plus. - + Il semblerait que le fichier %1 que vous essayez d'ouvrir n'existe pas ou plus. Il semblerait que le fichier que vous essayez d'ouvrir ne soit pas accessible en lecture. Il est donc impossible de l'ouvrir. Veuillez vérifier les permissions du fichier. - + Il semblerait que le fichier que vous essayez d'ouvrir ne soit pas accessible en lecture. Il est donc impossible de l'ouvrir. Veuillez vérifier les permissions du fichier. Ouverture du projet en lecture seule message box title - + Ouverture du projet en lecture seule Il semblerait que le projet que vous essayez d'ouvrir ne soit pas accessible en écriture. Il sera donc ouvert en lecture seule. - + Il semblerait que le projet que vous essayez d'ouvrir ne soit pas accessible en écriture. Il sera donc ouvert en lecture seule. Échec de l'ouverture du projet message box title - + Échec de l'ouverture du projet Il semblerait que le fichier %1 ne soit pas un fichier projet QElectroTech. Il ne peut donc être ouvert. message box content - + Il semblerait que le fichier %1 ne soit pas un fichier projet QElectroTech. Il ne peut donc être ouvert. %n description(s) de police écrite(s) dans un format étranger ou corrompu ont été restaurée(s). Elles seront réécrites dans un format stable au prochain enregistrement du projet. message box content - - + %n description(s) de police écrite(s) dans un format étranger ou corrompu ont été restaurée(s). Elles seront réécrites dans un format stable au prochain enregistrement du projet. + %n description(s) de police écrite(s) dans un format étranger ou corrompu ont été restaurée(s). Elles seront réécrites dans un format stable au prochain enregistrement du projet. @@ -11013,113 +11145,114 @@ Pour en faire un script, demandez-le à votre assistant IA : le bouton ci-dessou %n description(s) de police n'ont pas pu être lue(s) ; la police par défaut sera utilisée pour ces textes. message box content - - + %n description(s) de police n'ont pas pu être lue(s) ; la police par défaut sera utilisée pour ces textes. + %n description(s) de police n'ont pas pu être lue(s) ; la police par défaut sera utilisée pour ces textes. Polices du projet message box title - + Polices du projet Suppression de borne impossible - + Suppression de borne impossible La suppression ne peut être effectué car la selection possède une ou plusieurs bornes ponté et/ou appartenant à une borne à niveau multiple. Déponter et/ou supprimer les niveaux des bornes concerné afin de pouvoir les supprimer - + La suppression ne peut être effectué car la selection possède une ou plusieurs bornes ponté et/ou appartenant à une borne à niveau multiple. +Déponter et/ou supprimer les niveaux des bornes concerné afin de pouvoir les supprimer Groupe - + Groupe %n objet(s) remis sur la grille - - + %n objet(s) remis sur la grille + %n objet(s) remis sur la grille La sélection est déjà sur la grille - + La sélection est déjà sur la grille (%n objet(s) verrouillé(s) laissé(s) en place) - - + (%n objet(s) verrouillé(s) laissé(s) en place) + (%n objet(s) verrouillé(s) laissé(s) en place) Éditer l'élement edit element - + Éditer l'élement Éditer le champ de texte edit text field - + Éditer le champ de texte Éditer l'image edit image - + Éditer l'image Éditer le conducteur edit conductor - + Éditer le conducteur Éditer l'objet sélectionné edit selected item - + Éditer l'objet sélectionné Une erreur est survenue lors de l'ouverture du fichier %1. message box content - + Une erreur est survenue lors de l'ouverture du fichier %1. Active le projet « %1 » - + Active le projet « %1 » Êtes-vous sûr de vouloir supprimer ce folio ? - + Êtes-vous sûr de vouloir supprimer ce folio ? Supprimer les folios - + Supprimer les folios Êtes-vous sûr de vouloir supprimer les %1 folios sélectionnés ? - + Êtes-vous sûr de vouloir supprimer les %1 folios sélectionnés ? Supprimer %1 folios - + Supprimer %1 folios @@ -11130,13 +11263,13 @@ Déponter et/ou supprimer les niveaux des bornes concerné afin de pouvoir les s Déplacer les folios - + Déplacer les folios Erreur message box title - + Erreur @@ -11144,372 +11277,372 @@ Déponter et/ou supprimer les niveaux des bornes concerné afin de pouvoir les s &Nouveau - + &Nouveau &Ouvrir - + &Ouvrir &Ouvrir depuis un fichier - + &Ouvrir depuis un fichier &Enregistrer - + &Enregistrer Enregistrer sous - + Enregistrer sous Enregistrer dans un fichier - + Enregistrer dans un fichier Recharger - + Recharger Tout sélectionner - + Tout sélectionner QElectroTech - Éditeur d'élément - + QElectroTech - Éditeur d'élément &Aide - + &Aide Annulations - + Annulations Parties - + Parties Informations - + Informations Outils - + Outils Affichage - + Affichage Élément - + Élément Annulation - + Annulation Exporter en SVG - + Exporter en SVG &Fermer cet éditeur - + &Fermer cet éditeur Fermer cet éditeur - + Fermer cet éditeur Désélectionner tout - + Désélectionner tout Co&uper - + Co&uper Cop&ier - + Cop&ier C&oller - + C&oller C&oller dans la zone - + C&oller dans la zone Un fichier - + Un fichier Un élément - + Un élément À &propos de QElectroTech - + À &propos de QElectroTech Affiche des informations sur QElectroTech - + Affiche des informations sur QElectroTech Manuel en ligne - + Manuel en ligne Lance le navigateur par défaut vers le manuel en ligne de QElectroTech - + Lance le navigateur par défaut vers le manuel en ligne de QElectroTech Chaine Youtube - + Chaine Youtube Lance le navigateur par défaut vers la chaine Youtube de QElectroTech - + Lance le navigateur par défaut vers la chaine Youtube de QElectroTech Soutenir le projet par un don - + Soutenir le projet par un don Soutenir le projet QElectroTech par un don - + Soutenir le projet QElectroTech par un don À propos de &Qt - + À propos de &Qt Affiche des informations sur la bibliothèque Qt - + Affiche des informations sur la bibliothèque Qt Rotation - + Rotation Fine-Rotation - + Fine-Rotation Mirror - + Mirror Flip - + Flip Importer un dxf - + Importer un dxf importer un élément à redimensionner - + importer un élément à redimensionner Inverser la sélection - + Inverser la sélection &Supprimer - + &Supprimer Éditer le nom et les traductions de l'élément - + Éditer le nom et les traductions de l'élément Éditer les informations sur l'auteur - + Éditer les informations sur l'auteur Éditer les propriétés de l'élément - + Éditer les propriétés de l'élément Annuler - + Annuler Refaire - + Refaire Profondeur toolbar title - + Profondeur Zoom avant - + Zoom avant Zoom arrière - + Zoom arrière Zoom adapté - + Zoom adapté Pas de zoom - + Pas de zoom Ajouter une ligne - + Ajouter une ligne Ajouter un rectangle - + Ajouter un rectangle Ajouter une ellipse - + Ajouter une ellipse Ajouter un polygone - + Ajouter un polygone Ajouter du texte - + Ajouter du texte Ajouter un arc de cercle - + Ajouter un arc de cercle Ajouter une borne - + Ajouter une borne Ajouter un champ texte dynamique - + Ajouter un champ texte dynamique Double-click pour terminer la forme, Click droit pour annuler le dernier point - + Double-click pour terminer la forme, Click droit pour annuler le dernier point Parties toolbar title - + Parties &Fichier - + &Fichier &Édition - + &Édition Afficha&ge - + Afficha&ge Coller depuis... - + Coller depuis... [Modifié] window title tag - + [Modifié] [lecture seule] window title tag - + [lecture seule] Aucune modification - + Aucune modification Éditeur d'éléments status bar message - + Éditeur d'éléments @@ -11523,35 +11656,35 @@ Déponter et/ou supprimer les niveaux des bornes concerné afin de pouvoir les s Trop de primitives, liste non générée: %1 - + Trop de primitives, liste non générée: %1 Absence de borne warning title - + Absence de borne <br>En l'absence de borne, l'élément ne pourra être relié à d'autres éléments par l'intermédiaire de conducteurs. warning description - + <br>En l'absence de borne, l'élément ne pourra être relié à d'autres éléments par l'intermédiaire de conducteurs. Absence de borne - + Absence de borne <br><b>Erreur</b> :<br>Les reports de folio doivent posséder une seul borne.<br><b>Solution</b> :<br>Verifier que l'élément ne possède qu'une seul borne - + <br><b>Erreur</b> :<br>Les reports de folio doivent posséder une seul borne.<br><b>Solution</b> :<br>Verifier que l'élément ne possède qu'une seul borne La vérification de cet élément a généré message box content - + La vérification de cet élément a généré @@ -11565,121 +11698,121 @@ Déponter et/ou supprimer les niveaux des bornes concerné afin de pouvoir les s et - + et <b>%1</b> : %2 warning title: warning description - + <b>%1</b> : %2 Erreurs - + Erreurs Avertissements - + Avertissements Le fichier %1 n'existe pas. message box content - + Le fichier %1 n'existe pas. Afficher menu entry - + Afficher Impossible d'ouvrir le fichier %1. message box content - + Impossible d'ouvrir le fichier %1. Ce fichier n'est pas un document XML valide message box content - + Ce fichier n'est pas un document XML valide Erreur toolbar title - + Erreur Édition en lecture seule message box title - + Édition en lecture seule Vous n'avez pas les privilèges nécessaires pour modifier cet élement. Il sera donc ouvert en lecture seule. message box content - + Vous n'avez pas les privilèges nécessaires pour modifier cet élement. Il sera donc ouvert en lecture seule. Erreur message box title - + Erreur Impossible d'écrire dans ce fichier message box content - + Impossible d'écrire dans ce fichier Impossible d'enregistrer l'élément message box content - + Impossible d'enregistrer l'élément Nombre de bornes incorrect - + Nombre de bornes incorrect <br><b>Erreur</b> :<br>Les définitions de conducteur ne peuvent posséder qu'une seule borne.<br><b>Solution</b> :<br>Vérifier que l'élément ne possède qu'une seule borne - + <br><b>Erreur</b> :<br>Les définitions de conducteur ne peuvent posséder qu'une seule borne.<br><b>Solution</b> :<br>Vérifier que l'élément ne possède qu'une seule borne Noms de bornes en double - + Noms de bornes en double <br><b>Erreur</b> :<br>Plusieurs bornes portent le même nom : %1.<br><b>Solution</b> :<br>Donner un nom unique à chaque borne, par exemple N.1 et N.2. Les bornes concernées sont sélectionnées. - + <br><b>Erreur</b> :<br>Plusieurs bornes portent le même nom : %1.<br><b>Solution</b> :<br>Donner un nom unique à chaque borne, par exemple N.1 et N.2. Les bornes concernées sont sélectionnées. Bornes sans nom - + Bornes sans nom <br>%n borne(s) sans nom. Sans noms de bornes uniques, la liste de câblage (qui relie quoi à quoi) ne peut pas désigner chaque borne, et ne peut donc pas servir à câbler l'armoire en atelier. - - + <br>%n borne(s) sans nom. Sans noms de bornes uniques, la liste de câblage (qui relie quoi à quoi) ne peut pas désigner chaque borne, et ne peut donc pas servir à câbler l'armoire en atelier. + <br>%n borne(s) sans nom. Sans noms de bornes uniques, la liste de câblage (qui relie quoi à quoi) ne peut pas désigner chaque borne, et ne peut donc pas servir à câbler l'armoire en atelier. @@ -11714,96 +11847,97 @@ Déponter et/ou supprimer les niveaux des bornes concerné afin de pouvoir les s Éditeur d'élément - + Éditeur d'élément Ajouter un texte d'élément non éditable dans les schémas - + Ajouter un texte d'élément non éditable dans les schémas Ajouter un texte d'élément pouvant être édité dans les schémas - + Ajouter un texte d'élément pouvant être édité dans les schémas Afficher le cadre de fond - + Afficher le cadre de fond Taille du cadre de fond... - + Taille du cadre de fond... Taille du cadre de fond - + Taille du cadre de fond px - + px Largeur - + Largeur Hauteur - + Hauteur X: %1 Y: %2 - + X: %1 Y: %2 Exporter en SVG dialog title - + Exporter en SVG Image SVG (*.svg) filetypes allowed when exporting an element to SVG - + Image SVG (*.svg) Échec de l'export - + Échec de l'export Impossible d'écrire dans le fichier « %1 ». - + Impossible d'écrire dans le fichier « %1 ». Avertissement - + Avertissement L'import d'un dxf volumineux peut prendre du temps veuillez patienter durant l'import... - + L'import d'un dxf volumineux peut prendre du temps +veuillez patienter durant l'import... Importer un élément à redimensionner - + Importer un élément à redimensionner Éléments QElectroTech (*.elmt) - + Éléments QElectroTech (*.elmt) @@ -11818,31 +11952,31 @@ veuillez patienter durant l'import... Impossible d'ouvrir le fichier message box title - + Impossible d'ouvrir le fichier Il semblerait que le fichier %1 que vous essayez d'ouvrir n'existe pas ou plus. - + Il semblerait que le fichier %1 que vous essayez d'ouvrir n'existe pas ou plus. Recharger l'élément dialog title - + Recharger l'élément Vous avez efffectué des modifications sur cet élément. Si vous le rechargez, ces modifications seront perdues. Voulez-vous vraiment recharger l'élément ? dialog content - + Vous avez efffectué des modifications sur cet élément. Si vous le rechargez, ces modifications seront perdues. Voulez-vous vraiment recharger l'élément ? Echec de l'enregistrement - + Echec de l'enregistrement @@ -11850,43 +11984,44 @@ veuillez patienter durant l'import... L'enregistrement à échoué, les conditions requises ne sont pas valides - + L'enregistrement à échoué, +les conditions requises ne sont pas valides Enregistrer sous dialog title - + Enregistrer sous Éléments QElectroTech (*.elmt) filetypes allowed when saving an element file - + Éléments QElectroTech (*.elmt) Enregistrer l'élément en cours ? dialog title - + Enregistrer l'élément en cours ? Voulez-vous enregistrer l'élément %1 ? dialog content - %1 is an element name - + Voulez-vous enregistrer l'élément %1 ? Ouvrir un fichier dialog title - + Ouvrir un fichier Éléments QElectroTech (*.elmt);;Fichiers XML (*.xml);;Tous les fichiers (*) filetypes allowed when opening an element file - + Éléments QElectroTech (*.elmt);;Fichiers XML (*.xml);;Tous les fichiers (*) @@ -11895,21 +12030,21 @@ les conditions requises ne sont pas valides Élément inexistant. message box title - + Élément inexistant. Le chemin virtuel choisi ne correspond pas à un élément. message box content - + Le chemin virtuel choisi ne correspond pas à un élément. L'élément n'existe pas. message box content - + L'élément n'existe pas. @@ -11917,57 +12052,57 @@ les conditions requises ne sont pas valides &Configurer QElectroTech - + &Configurer QElectroTech Permet de régler différents paramètres de QElectroTech status bar tip - + Permet de régler différents paramètres de QElectroTech À &propos de QElectroTech - + À &propos de QElectroTech Affiche des informations sur QElectroTech status bar tip - + Affiche des informations sur QElectroTech Manuel en ligne - + Manuel en ligne Chaine Youtube - + Chaine Youtube Télécharger une nouvelle version (dev) - + Télécharger une nouvelle version (dev) Lance le navigateur par défaut vers le manuel en ligne de QElectroTech status bar tip - + Lance le navigateur par défaut vers le manuel en ligne de QElectroTech Enregistrer la configuration sous... - + Enregistrer la configuration sous... Enregistre les réglages de QElectroTech dans un fichier status bar tip - + Enregistre les réglages de QElectroTech dans un fichier @@ -11975,115 +12110,115 @@ les conditions requises ne sont pas valides Général - + Général Charger une configuration... - + Charger une configuration... Remplace les réglages de QElectroTech par ceux d'un fichier, puis ferme QElectroTech status bar tip - + Remplace les réglages de QElectroTech par ceux d'un fichier, puis ferme QElectroTech Connecter un assistant IA... - + Connecter un assistant IA... Affiche la configuration qui permet à un assistant IA d'utiliser QElectroTech status bar tip - + Affiche la configuration qui permet à un assistant IA d'utiliser QElectroTech Lance le navigateur par défaut vers la chaine Youtube de QElectroTech status bar tip - + Lance le navigateur par défaut vers la chaine Youtube de QElectroTech Lance le navigateur par défaut vers le dépot Nightly en ligne de QElectroTech status bar tip - + Lance le navigateur par défaut vers le dépot Nightly en ligne de QElectroTech Soutenir le projet par un don - + Soutenir le projet par un don Soutenir le projet QElectroTech par un don status bar tip - + Soutenir le projet QElectroTech par un don À propos de &Qt - + À propos de &Qt Affiche des informations sur la bibliothèque Qt status bar tip - + Affiche des informations sur la bibliothèque Qt Enregistrer un rapport de diagnostic... - + Enregistrer un rapport de diagnostic... Génère un rapport avec les derniers messages de journalisation, pour l'inclure dans un rapport de bug status bar tip - + Génère un rapport avec les derniers messages de journalisation, pour l'inclure dans un rapport de bug &Configuration window menu - + &Configuration &Aide window menu - + &Aide Sortir du &mode plein écran - + Sortir du &mode plein écran Affiche QElectroTech en mode fenêtré status bar tip - + Affiche QElectroTech en mode fenêtré Passer en &mode plein écran - + Passer en &mode plein écran Affiche QElectroTech en mode plein écran status bar tip - + Affiche QElectroTech en mode plein écran Afficher menu entry - + Afficher @@ -12092,31 +12227,31 @@ les conditions requises ne sont pas valides Projet « %1 : %2» displayed title for a ProjectView - %1 is the project title, -%2 is the project path - + Projet « %1 : %2» Projet %1 displayed title for a title-less project - %1 is the file name - + Projet %1 Projet sans titre displayed title for a project-less, file-less project - + Projet sans titre %1 [lecture seule] displayed title for a read-only project - %1 is a displayable title - + %1 [lecture seule] %1 [modifié] displayed title for a modified project - %1 is a displayable title - + %1 [modifié] @@ -12131,7 +12266,7 @@ les conditions requises ne sont pas valides Système de contacts modifié - + Système de contacts modifié @@ -12139,61 +12274,70 @@ les conditions requises ne sont pas valides Les éléments esclaves existants ne seront pas automatiquement assignés. Vous devrez relier manuellement les esclaves et assigner les groupes de contacts. Voulez-vous continuer ? - + Le nouvel élément définit des groupes de contacts esclaves. +Les éléments esclaves existants ne seront pas automatiquement assignés. Vous devrez relier manuellement les esclaves et assigner les groupes de contacts. + +Voulez-vous continuer ? Une erreur s'est produite durant l'intégration du modèle. error message - + Une erreur s'est produite durant l'intégration du modèle. Avertissement message box title - + Avertissement Ce document semble avoir été enregistré avec une version %1 qui est ultérieure à votre version ! Vous utilisez actuellement QElectroTech en version %2 - + Ce document semble avoir été enregistré avec une version %1 + qui est ultérieure à votre version ! +Vous utilisez actuellement QElectroTech en version %2 . Il est alors possible que l'ouverture de tout ou partie de ce document échoue. Que désirez vous faire ? - + . + Il est alors possible que l'ouverture de tout ou partie de ce document échoue. +Que désirez vous faire ? Avertissement message box title - + Avertissement Le projet que vous tentez d'ouvrir est partiellement compatible avec votre version %1 de QElectroTech. - + Le projet que vous tentez d'ouvrir est partiellement compatible avec votre version %1 de QElectroTech. + Afin de le rendre totalement compatible veuillez ouvrir ce même projet avec la version 0.8, ou 0.80 de QElectroTech et sauvegarder le projet et l'ouvrir à nouveau avec cette version. Que désirez vous faire ? - + Afin de le rendre totalement compatible veuillez ouvrir ce même projet avec la version 0.8, ou 0.80 de QElectroTech et sauvegarder le projet et l'ouvrir à nouveau avec cette version. +Que désirez vous faire ? <p align="center"><b>Ouverture du projet en cours...</b><br/>Création des folios</p> - + <p align="center"><b>Ouverture du projet en cours...</b><br/>Création des folios</p> <p align="center"><b>Ouverture du projet en cours...</b><br/>Mise en place des références croisées</p> - + <p align="center"><b>Ouverture du projet en cours...</b><br/>Mise en place des références croisées</p> @@ -12201,17 +12345,17 @@ Que désirez vous faire ? Impossible de vérifier la requête : la base de données ne peut pas être mise en lecture seule. - + Impossible de vérifier la requête : la base de données ne peut pas être mise en lecture seule. Seules les requêtes en lecture seule sont autorisées : cette requête modifierait la base de données. - + Seules les requêtes en lecture seule sont autorisées : cette requête modifierait la base de données. Requête SQL invalide : %1 - + Requête SQL invalide : %1 @@ -12220,151 +12364,151 @@ Que désirez vous faire ? Enregistrer le modèle en cours ? dialog title - + Enregistrer le modèle en cours ? Voulez-vous enregistrer le modèle %1 ? dialog content - %1 is a title block template name - + Voulez-vous enregistrer le modèle %1 ? nouveau_modele template name suggestion when duplicating the default one - + nouveau_modele Dupliquer un modèle de cartouche input dialog title - + Dupliquer un modèle de cartouche Pour dupliquer ce modèle, entrez le nom voulu pour sa copie input dialog text - + Pour dupliquer ce modèle, entrez le nom voulu pour sa copie &Nouveau menu entry - + &Nouveau &Ouvrir menu entry - + &Ouvrir Ouvrir depuis un fichier menu entry - + Ouvrir depuis un fichier &Enregistrer menu entry - + &Enregistrer Enregistrer sous menu entry - + Enregistrer sous Enregistrer vers un fichier menu entry - + Enregistrer vers un fichier &Quitter menu entry - + &Quitter Co&uper menu entry - + Co&uper Cop&ier menu entry - + Cop&ier C&oller menu entry - + C&oller Gérer les logos menu entry - + Gérer les logos Éditer les informations complémentaires menu entry - + Éditer les informations complémentaires Zoom avant menu entry - + Zoom avant Zoom arrière menu entry - + Zoom arrière Zoom adapté menu entry - + Zoom adapté Pas de zoom menu entry - + Pas de zoom Ajouter une &ligne menu entry - + Ajouter une &ligne Ajouter une &colonne menu entry - + Ajouter une &colonne &Fusionner les cellules menu entry - + &Fusionner les cellules &Séparer les cellules menu entry - + &Séparer les cellules @@ -12387,157 +12531,157 @@ Que désirez vous faire ? Éditeur de cartouche - + Éditeur de cartouche &Fichier menu title - + &Fichier &Édition menu title - + &Édition Afficha&ge menu title - + Afficha&ge Outils toolbar title - + Outils Édition toolbar title - + Édition Affichage toolbar title - + Affichage Aucune modification label displayed in the undo list when empty - + Aucune modification Annulations dock title - + Annulations Propriétés de la cellule dock title - + Propriétés de la cellule [Modifié] window title tag - + [Modifié] [Lecture seule] window title tag - + [Lecture seule] %1 %2 part of the window title - %1 is the filepath or template name, %2 is the [Changed] or [Read only] tag - + %1 %2 QElectroTech - Éditeur de modèle de cartouche titleblock template editor: base window title - + QElectroTech - Éditeur de modèle de cartouche %1 - %2 window title: %1 is the base window title, %2 is a template name - + %1 - %2 Erreur message box title - + Erreur Impossible d'enregistrer le modèle « %1 ». message box content - %1 is a title block template name - + Impossible d'enregistrer le modèle « %1 ». Ouvrir un modèle File > open dialog window title - + Ouvrir un modèle Ouvrir un fichier dialog title - + Ouvrir un fichier Modèles de cartouches QElectroTech (*%1);;Fichiers XML (*.xml);;Tous les fichiers (*) filetypes allowed when opening a title block template file - %1 is the .titleblock extension - + Modèles de cartouches QElectroTech (*%1);;Fichiers XML (*.xml);;Tous les fichiers (*) Enregistrer le modèle sous dialog window title - + Enregistrer le modèle sous Le nom « %1 » n'est pas valide : il ne doit pas contenir les caractères suivants : \ / : * ? " < > | message box content - %1 is the rejected template name - + Le nom « %1 » n'est pas valide : il ne doit pas contenir les caractères suivants : \ / : * ? " < > | Enregistrer sous dialog title - + Enregistrer sous Modèles de cartouches QElectroTech (*%1) filetypes allowed when saving a title block template file - %1 is the .titleblock extension - + Modèles de cartouches QElectroTech (*%1) Éditer les informations complémentaires window title - + Éditer les informations complémentaires Vous pouvez utiliser ce champ libre pour mentionner les auteurs du cartouche, sa licence, ou tout autre renseignement que vous jugerez utile. - + Vous pouvez utiliser ce champ libre pour mentionner les auteurs du cartouche, sa licence, ou tout autre renseignement que vous jugerez utile. @@ -12550,7 +12694,11 @@ Que désirez vous faire ? - le tiret [-], l'underscore [_] et le point [.] tooltip content when editing a filename - + Les caractères autorisés sont : + - les chiffres [0-9] + - les minuscules [a-z] + - le tiret [-], l'underscore [_] et le point [.] + @@ -12678,12 +12826,12 @@ Que désirez vous faire ? Le fichier texte contenant la licence GNU/GPL est introuvable - bon bah de toute façon, vous la connaissez par coeur non ? - + Le fichier texte contenant la licence GNU/GPL est introuvable - bon bah de toute façon, vous la connaissez par coeur non ? Le fichier texte contenant la licence GNU/GPL existe mais n'a pas pu être ouvert - bon bah de toute façon, vous la connaissez par coeur non ? - + Le fichier texte contenant la licence GNU/GPL existe mais n'a pas pu être ouvert - bon bah de toute façon, vous la connaissez par coeur non ? @@ -12691,53 +12839,53 @@ Que désirez vous faire ? Impossible d'ouvrir le fichier %1 en écriture, erreur %2 rencontrée. error message when attempting to write an XML file - + Impossible d'ouvrir le fichier %1 en écriture, erreur %2 rencontrée. Une erreur est survenue lors de l'écriture du fichier %1, erreur %2 rencontrée. error message when attempting to write an XML file - + Une erreur est survenue lors de l'écriture du fichier %1, erreur %2 rencontrée. Amener au premier plan - + Amener au premier plan Rapprocher - + Rapprocher Éloigner - + Éloigner Envoyer au fond - + Envoyer au fond Ramène la ou les sélections au premier plan - + Ramène la ou les sélections au premier plan Rapproche la ou les sélections - + Rapproche la ou les sélections Éloigne la ou les sélections - + Éloigne la ou les sélections Envoie en arrière plan la ou les sélections - + Envoie en arrière plan la ou les sélections @@ -12745,61 +12893,61 @@ Que désirez vous faire ? Profondeur - + Profondeur Insertion d'une ligne label used in the title block template editor undo list - + Insertion d'une ligne Suppression d'une ligne label used in the title block template editor undo list - + Suppression d'une ligne Insertion d'une colonne label used in the title block template editor undo list - + Insertion d'une colonne Suppression d'une colonne label used in the title block template editor undo list - + Suppression d'une colonne Modification d'une ligne label used in the title block template editor undo list - + Modification d'une ligne Modification d'une colonne label used in the title block template editor undo list - + Modification d'une colonne Fusion de %1 cellules label used in the title block template editor undo list; %1 is the number of merged cells - + Fusion de %1 cellules Séparation d'une cellule en %1 label used in the title block template editor undo list; %1 is the number of cells after the split - + Séparation d'une cellule en %1 modification des informations complémentaires undo caption - + modification des informations complémentaires @@ -12822,7 +12970,7 @@ Que désirez vous faire ? Collection QET - + Collection QET @@ -12832,12 +12980,12 @@ Que désirez vous faire ? Collection utilisateur - + Collection utilisateur Macros - + Macros Makros @@ -12846,126 +12994,126 @@ Que désirez vous faire ? Collection inconnue - + Collection inconnue Le fichier « %1 » est absent ou illisible : le nom traduit de ce dossier n'a pas pu être lu, son nom de dossier est affiché à la place. - + Le fichier « %1 » est absent ou illisible : le nom traduit de ce dossier n'a pas pu être lu, son nom de dossier est affiché à la place. Projet sans titre - + Projet sans titre Collection - + Collection Modifier les propriétés d'un conducteur undo caption - + Modifier les propriétés d'un conducteur Modifier les propriétés de plusieurs conducteurs undo caption - + Modifier les propriétés de plusieurs conducteurs Numéroter automatiquement un conducteur undo caption - + Numéroter automatiquement un conducteur un champ texte - + un champ texte un conducteur - + un conducteur un element graphique - + un element graphique supprimer %1 undo caption - %1 is a sentence listing the removed content - + supprimer %1 coller %1 undo caption - %1 is a sentence listing the content to paste - + coller %1 couper %1 undo caption - %1 is a sentence listing the content to cut - + couper %1 déplacer %1 undo caption - %1 is a sentence listing the moved content - + déplacer %1 modifier le texte undo caption - + modifier le texte modifier un conducteur undo caption - + modifier un conducteur Réinitialiser %1 undo caption - %1 is a sentence listing the reset content - + Réinitialiser %1 modifier le cartouche undo caption - + modifier le cartouche modifier les dimensions du folio undo caption - + modifier les dimensions du folio Ajouter - + Ajouter Selectionner une image... - + Selectionner une image... Image Files (*.png *.jpg *.jpeg *.bmp *.svg) - + Image Files (*.png *.jpg *.jpeg *.bmp *.svg) @@ -12975,371 +13123,373 @@ Que désirez vous faire ? Erreur - + Erreur Impossible de charger l'image. - + Impossible de charger l'image. Auteur - + Auteur Titre - + Titre Date - + Date suppression undo caption - + suppression couper des parties undo caption - + couper des parties déplacement undo caption - + déplacement modification noms undo caption - + modification noms amener au premier plan undo caption - + amener au premier plan rapprocher undo caption - + rapprocher éloigner undo caption - + éloigner envoyer au fond undo caption - + envoyer au fond modification informations complementaires undo caption - + modification informations complementaires redimensionnement %1 undo caption -- %1 is the resized primitive type name - + redimensionnement %1 redimensionnement de %1 primitives undo caption -- %1 always > 1 - + redimensionnement de %1 primitives Modifier les propriétées de l'élément - + Modifier les propriétées de l'élément Pivoter la selection undo caption - + Pivoter la selection Miroir de sélection undo caption - + Miroir de sélection Retourner la sélection undo caption - + Retourner la sélection Arc - + Arc Ellipse - + Ellipse ligne - + ligne Polygone - + Polygone Rectangle - + Rectangle Borne - + Borne Texte - + Texte arc element part name - + arc ellipse element part name - + ellipse ligne element part name - + ligne polygone element part name - + polygone rectangle element part name - + rectangle T default text when adding a text in the element editor - + T texte element part name - + texte Folio sans titre - + Folio sans titre schema - + schema Conserver les proportions - + Conserver les proportions Réinitialiser les dimensions - + Réinitialiser les dimensions Aperçu - + Aperçu Exporter vers le presse-papier - + Exporter vers le presse-papier numero_de_fileries_ - + numero_de_fileries_ Enregister sous... - + Enregister sous... Fichiers csv (*.csv) - + Fichiers csv (*.csv) Impossible de remplacer le fichier! - + Impossible de remplacer le fichier! + + Position du folio - + Position du folio Numéro de folio - + Numéro de folio Avertissement : l'élément a été enregistré avec une version ultérieure de QElectroTech. - + Avertissement : l'élément a été enregistré avec une version ultérieure de QElectroTech. Borne tooltip - + Borne %1px titleblock: absolute width - + %1px %1% titleblock: width relative to total length - + %1% %1% du restant titleblock: width relative to remaining length - + %1% du restant type title block cell property human name - + type nom title block cell property human name - + nom logo title block cell property human name - + logo label title block cell property human name - + label affichage du label title block cell property human name - + affichage du label valeur affichée title block cell property human name - + valeur affichée alignement du texte title block cell property human name - + alignement du texte taille du texte title block cell property human name - + taille du texte ajustement horizontal title block cell property human name - + ajustement horizontal Propriétés du projet window title - + Propriétés du projet Modifier les informations de l'élément : %1 - + Modifier les informations de l'élément : %1 Modifier les informations de plusieurs éléments - + Modifier les informations de plusieurs éléments Éditer les référence croisé edite the cross reference - + Éditer les référence croisé Ce groupe ne peut pas être déplacé : la position d'un de ses éléments est verrouillée. - + Ce groupe ne peut pas être déplacé : la position d'un de ses éléments est verrouillée. @@ -13353,53 +13503,53 @@ Que désirez vous faire ? Champ texte dynamique - + Champ texte dynamique Ajouter un texte d'élément - + Ajouter un texte d'élément Ajouter un groupe de textes d'élément - + Ajouter un groupe de textes d'élément Grouper des textes d'élément - + Grouper des textes d'élément Supprimer un groupe de textes d'élément - + Supprimer un groupe de textes d'élément Insérer un texte d'élément dans un groupe de textes - + Insérer un texte d'élément dans un groupe de textes Enlever un texte d'élément d'un groupe de textes - + Enlever un texte d'élément d'un groupe de textes Modifier l'alignement d'un groupe de textes - + Modifier l'alignement d'un groupe de textes Pivoter la selection - + Pivoter la selection Pivoter le groupe - + Pivoter le groupe @@ -13413,55 +13563,56 @@ Que désirez vous faire ? Pivoter %1 - + Pivoter %1 Orienter les textes sélectionnés window title - + Orienter les textes sélectionnés Configuration de textes - + Configuration de textes Une configuration de textes nommée << %1 >> existe déjà. Voulez-vous la remplacer ? - + Une configuration de textes nommée << %1 >> existe déjà. +Voulez-vous la remplacer ? Nom de la configuration - + Nom de la configuration Entrer le nom de la configuration à créer - + Entrer le nom de la configuration à créer Aucune configuration de textes existante. - + Aucune configuration de textes existante. Sélectionner une configuration de textes - + Sélectionner une configuration de textes Sélectionner la configuration de textes à ajouter à l'élément - + Sélectionner la configuration de textes à ajouter à l'élément Importer la configuration de texte : %1 - + Importer la configuration de texte : %1 @@ -13472,123 +13623,123 @@ Voulez-vous la remplacer ? chargement %p% (%v sur %m) - + chargement %p% (%v sur %m) Chercher/remplacer les propriétés de folio - + Chercher/remplacer les propriétés de folio Chercher/remplacer les propriétés d'éléments. - + Chercher/remplacer les propriétés d'éléments. Chercher/remplacer les propriétés de conducteurs. - + Chercher/remplacer les propriétés de conducteurs. Rechercher / remplacer avancé - + Rechercher / remplacer avancé Chercher/remplacer des textes independants - + Chercher/remplacer des textes independants Fichier - + Fichier Installation (=) - + Installation (=) Localisation (+) - + Localisation (+) Indice de révision - + Indice de révision Position - + Position Version de QElectroTech - + Version de QElectroTech Nombre de folio - + Nombre de folio Numéro du folio précédent - + Numéro du folio précédent Numéro du folio suivant - + Numéro du folio suivant Titre du projet - + Titre du projet Chemin du fichier du projet - + Chemin du fichier du projet Nom du fichier - + Nom du fichier Date d'enregistrement du fichier format local - + Date d'enregistrement du fichier format local Date d'enregistrement du fichier format yyyy-MM-dd - + Date d'enregistrement du fichier format yyyy-MM-dd Formule du label - + Formule du label Label - + Label Table PLC - + Table PLC Table PLC (vide) - + Table PLC (vide) @@ -13596,7 +13747,7 @@ Voulez-vous la remplacer ? Type - + Type @@ -13604,7 +13755,7 @@ Voulez-vous la remplacer ? Adresse - + Adresse @@ -13613,7 +13764,7 @@ Voulez-vous la remplacer ? Commentaire - + Commentaire @@ -13622,7 +13773,7 @@ Voulez-vous la remplacer ? Réf. croisée - + Réf. croisée @@ -13632,337 +13783,337 @@ Voulez-vous la remplacer ? Fonction - + Fonction Largeur [mm] - + Largeur [mm] Hauteur [mm] - + Hauteur [mm] Profondeur [mm] - + Profondeur [mm] Bloc auxiliaire 1 - + Bloc auxiliaire 1 Description textuelle auxiliaire 1 - + Description textuelle auxiliaire 1 Numéro d'article auxiliaire 1 - + Numéro d'article auxiliaire 1 Fabricant auxiliaire 1 - + Fabricant auxiliaire 1 Numéro de commande auxiliaire 1 - + Numéro de commande auxiliaire 1 Numéro interne auxiliaire 1 - + Numéro interne auxiliaire 1 Fournisseur auxiliaire 1 - + Fournisseur auxiliaire 1 Quantité auxiliaire 1 - + Quantité auxiliaire 1 Unité auxiliaire 1 - + Unité auxiliaire 1 Bloc auxiliaire 2 - + Bloc auxiliaire 2 Description textuelle auxiliaire 2 - + Description textuelle auxiliaire 2 Numéro d'article auxiliaire 2 - + Numéro d'article auxiliaire 2 Fabricant auxiliaire 2 - + Fabricant auxiliaire 2 Numéro de commande auxiliaire 2 - + Numéro de commande auxiliaire 2 Numéro interne auxiliaire 2 - + Numéro interne auxiliaire 2 Fournisseur auxiliaire 2 - + Fournisseur auxiliaire 2 Quantité auxiliaire 2 - + Quantité auxiliaire 2 Unité auxiliaire 2 - + Unité auxiliaire 2 Bloc auxiliaire 3 - + Bloc auxiliaire 3 Description textuelle auxiliaire 3 - + Description textuelle auxiliaire 3 Numéro d'article auxiliaire 3 - + Numéro d'article auxiliaire 3 Fabricant auxiliaire 3 - + Fabricant auxiliaire 3 Numéro de commande auxiliaire 3 - + Numéro de commande auxiliaire 3 Numéro interne auxiliaire 3 - + Numéro interne auxiliaire 3 Fournisseur auxiliaire 3 - + Fournisseur auxiliaire 3 Quantité auxiliaire 3 - + Quantité auxiliaire 3 Unité auxiliaire 3 - + Unité auxiliaire 3 Bloc auxiliaire 4 - + Bloc auxiliaire 4 Description textuelle auxiliaire 4 - + Description textuelle auxiliaire 4 Numéro d'article auxiliaire 4 - + Numéro d'article auxiliaire 4 Fabricant auxiliaire 4 - + Fabricant auxiliaire 4 Numéro de commande auxiliaire 4 - + Numéro de commande auxiliaire 4 Numéro interne auxiliaire 4 - + Numéro interne auxiliaire 4 Fournisseur auxiliaire 4 - + Fournisseur auxiliaire 4 Quantité auxiliaire 4 - + Quantité auxiliaire 4 Unité auxiliaire 4 - + Unité auxiliaire 4 Type PLC - + Type PLC Adresse PLC - + Adresse PLC Fonction PLC - + Fonction PLC Commentaire PLC - + Commentaire PLC Réf. croisée PLC - + Réf. croisée PLC Description textuelle - + Description textuelle Modèle - + Modèle Catégorie - + Catégorie Tension nominale - + Tension nominale Courant nominal - + Courant nominal Notes - + Notes Numéro d'article - + Numéro d'article Fabricant - + Fabricant Numéro de commande - + Numéro de commande Numéro interne - + Numéro interne Fournisseur - + Fournisseur Quantité - + Quantité Unité - + Unité Tension / Protocole - + Tension / Protocole Couleur du fil - + Couleur du fil Section du fil - + Section du fil Formule du texte - + Formule du texte Date d'enregistrement du fichier format dd-MM-yyyy - + Date d'enregistrement du fichier format dd-MM-yyyy Heure d'enregistrement du fichier - + Heure d'enregistrement du fichier Nom du fichier enregistré - + Nom du fichier enregistré Chemin du fichier enregistré - + Chemin du fichier enregistré Création de conducteurs - + Création de conducteurs @@ -13972,7 +14123,7 @@ Voulez-vous la remplacer ? To install the plugin qet_tb_generator<br>Visit :<br><a href='https://pypi.python.org/pypi/qet-tb-generator'>qet-tb-generator</a><br><B><U> First install on macOSX</B></U><br>1. Install, if required, python 3.11 bundle only, <a href='https://www.python.org/ftp/python/3.11.2/python-3.11.2-macos11.pkg'>python-3.11.2-macos11.pkg</a><br>2 Run Profile.command script<br>because program use hardcoded PATH for localise qet-tb-generator plugin <br> Visit :<br><a href='https://qelectrotech.org/forum/viewtopic.php?pid=5674#p5674'>howto</a><br>2. pip3 install qet_tb_generator<br><B><U> Update on macOSX</B></U><br> pip3 install --upgrade qet_tb_generator<br> - + To install the plugin qet_tb_generator<br>Visit :<br><a href='https://pypi.python.org/pypi/qet-tb-generator'>qet-tb-generator</a><br><B><U> First install on macOSX</B></U><br>1. Install, if required, python 3.11 bundle only, <a href='https://www.python.org/ftp/python/3.11.2/python-3.11.2-macos11.pkg'>python-3.11.2-macos11.pkg</a><br>2 Run Profile.command script<br>because program use hardcoded PATH for localise qet-tb-generator plugin <br> Visit :<br><a href='https://qelectrotech.org/forum/viewtopic.php?pid=5674#p5674'>howto</a><br>2. pip3 install qet_tb_generator<br><B><U> Update on macOSX</B></U><br> pip3 install --upgrade qet_tb_generator<br> @@ -13987,17 +14138,17 @@ Voulez-vous la remplacer ? Ajouter une nomenclature - + Ajouter une nomenclature Ajouter un sommaire - + Ajouter un sommaire Coller - + Coller @@ -14016,194 +14167,194 @@ Voulez-vous la remplacer ? Compilation : - + Compilation : Compilation : - + Compilation : Ajouter un groupe de bornes - + Ajouter un groupe de bornes Supprimer un groupe de bornes - + Supprimer un groupe de bornes Modifier les proriétés d'un groupe de bornes - + Modifier les proriétés d'un groupe de bornes Trier le bornier %1 - + Trier le bornier %1 Générique generic terminal element type - + Générique Fusible fuse terminal element type - + Fusible Sectionable sectional terminal element type - + Sectionable Diode diode terminal element type - + Diode Terre ground terminal element type - + Terre Générique generic terminal element function - + Générique Phase phase terminal element function - + Phase Neutre neutral terminal element function - + Neutre Entrée digitale - + Entrée digitale Sortie digitale - + Sortie digitale Entrée analogique - + Entrée analogique Sortie analogique - + Sortie analogique Entrée universelle - + Entrée universelle Sortie universelle - + Sortie universelle Modifier les propriétés d'un élement - + Modifier les propriétés d'un élement Ponter des bornes entre-elles - + Ponter des bornes entre-elles Supprimer des ponts de bornes - + Supprimer des ponts de bornes Modifier la couleur d'un pont de bornes - + Modifier la couleur d'un pont de bornes Ouvrir un element - + Ouvrir un element Importer un fichier dxf - + Importer un fichier dxf Disposition par défaut - + Disposition par défaut Entrer le facteur d'échelle - + Entrer le facteur d'échelle Facteur X: - + Facteur X: Facteur Y: - + Facteur Y: sans - + sans horizontal - + horizontal vertical - + vertical horizontal + vertical - + horizontal + vertical Retourner l'élément : - + Retourner l'élément : direction - + direction @@ -14216,7 +14367,8 @@ informations supplémentaires sur l'importation/mise à l'échelle de Le logiciel QET_ElementScaler est nécessaire pour mettre les éléments à l'échelle. Veuillez télécharger celui-ci en suivant le lien ci dessous et le dézipper dans le dossier d'installation - + Le logiciel QET_ElementScaler est nécessaire pour mettre les éléments à l'échelle. +Veuillez télécharger celui-ci en suivant le lien ci dessous et le dézipper dans le dossier d'installation @@ -14235,7 +14387,8 @@ Erreur : assurez-vous que le fichier %1 est un fichier .dxf valide L'import dxf nécessite le logiciel dxf2elmt. Veuillez télécharger celui-ci en suivant le lien ci dessous et le dézipper dans le dossier d'installation - + L'import dxf nécessite le logiciel dxf2elmt. +Veuillez télécharger celui-ci en suivant le lien ci dessous et le dézipper dans le dossier d'installation @@ -14246,70 +14399,70 @@ Veuillez télécharger celui-ci en suivant le lien ci dessous et le dézipper da table PLC element part name - + table PLC Ajouter un folio undo command text - + Ajouter un folio Déplacer un folio undo command text - + Déplacer un folio Supprimer un folio undo command text - + Supprimer un folio Sélectionner un fichier PDF... - + Sélectionner un fichier PDF... Fichiers PDF (*.pdf) - + Fichiers PDF (*.pdf) Impossible de charger le fichier PDF. - + Impossible de charger le fichier PDF. Le fichier PDF ne contient aucune page. - + Le fichier PDF ne contient aucune page. Impossible de déterminer la taille de la page PDF. - + Impossible de déterminer la taille de la page PDF. Impossible de rendre la page PDF. - + Impossible de rendre la page PDF. Transformer %1 - + Transformer %1 Grille des textes %1. Relâcher Maj et maintenir Ctrl pour placer librement. - + Grille des textes %1. Relâcher Maj et maintenir Ctrl pour placer librement. Grille des textes désactivée. - + Grille des textes désactivée. @@ -14333,27 +14486,27 @@ Veuillez télécharger celui-ci en suivant le lien ci dessous et le dézipper da Déplacer %1 - + Déplacer %1 Ajouter une borne à un groupe de bornes - + Ajouter une borne à un groupe de bornes Ajouter la borne %1 à un groupe de bornes - + Ajouter la borne %1 à un groupe de bornes Ajouter une borne au groupe de bornes %1 - + Ajouter une borne au groupe de bornes %1 Ajouter la borne %1 au groupe de bornes %2 - + Ajouter la borne %1 au groupe de bornes %2 @@ -14390,42 +14543,42 @@ Veuillez télécharger celui-ci en suivant le lien ci dessous et le dézipper da Déplacer une borne d'un groupe de bornes vers un autre groupe de bornes - + Déplacer une borne d'un groupe de bornes vers un autre groupe de bornes Déplacer une borne d'un groupe de bornes vers le groupe de bornes %1 - + Déplacer une borne d'un groupe de bornes vers le groupe de bornes %1 Déplacer une borne du groupe de bornes %1 vers un autre groupe de bornes - + Déplacer une borne du groupe de bornes %1 vers un autre groupe de bornes Déplacer une borne du groupe de bornes %1 vers le groupe de bornes %2 - + Déplacer une borne du groupe de bornes %1 vers le groupe de bornes %2 Déplacer la borne %1 d'un groupe de bornes vers un autre groupe de bornes - + Déplacer la borne %1 d'un groupe de bornes vers un autre groupe de bornes Déplacer la borne %1 d'un groupe de bornes vers le groupe de bornes %2 - + Déplacer la borne %1 d'un groupe de bornes vers le groupe de bornes %2 Déplacer la borne %1 du groupe de bornes %2 vers un autre groupe de bornes - + Déplacer la borne %1 du groupe de bornes %2 vers un autre groupe de bornes Déplacer la borne %1 du groupe de bornes %2 vers le groupe de bornes %3 - + Déplacer la borne %1 du groupe de bornes %2 vers le groupe de bornes %3 @@ -14471,97 +14624,97 @@ Veuillez télécharger celui-ci en suivant le lien ci dessous et le dézipper da Aligner %n objet(s) - - + Aligner %n objet(s) + Aligner %n objet(s) Ajouter %1 - + Ajouter %1 Modifier les propriétés du conducteur - + Modifier les propriétés du conducteur Modifier un texte - + Modifier un texte Modifier la couleur d'un texte - + Modifier la couleur d'un texte Pivoter un texte - + Pivoter un texte Modifier le trait d'une forme - + Modifier le trait d'une forme Modifier le remplissage d'une forme - + Modifier le remplissage d'une forme Pivoter une forme - + Pivoter une forme Modifier la forme d'%1 - + Modifier la forme d'%1 Fermer/Ouvrir %1 - + Fermer/Ouvrir %1 Redimensionner une image - + Redimensionner une image Pivoter une image - + Pivoter une image Modifier un texte d'élément - + Modifier un texte d'élément Numéroter automatiquement un élément - + Numéroter automatiquement un élément Renuméroter les éléments (%1) - + Renuméroter les éléments (%1) Rechercher et remplacer - + Rechercher et remplacer Script - + Script @@ -14570,43 +14723,47 @@ Veuillez télécharger celui-ci en suivant le lien ci dessous et le dézipper da Un script a accès à l'ensemble du projet et peut écrire des fichiers, aussi cette fonction est-elle désactivée par défaut. Pour l'activer : Configurer QElectroTech > Général > Projets, ou définir la variable d'environnement QET_ENABLE_SCRIPTING=1 pour une exécution sans interface (CI, traitement par lot). - + Les scripts sont désactivés. + +Un script a accès à l'ensemble du projet et peut écrire des fichiers, aussi cette fonction est-elle désactivée par défaut. + +Pour l'activer : Configurer QElectroTech > Général > Projets, ou définir la variable d'environnement QET_ENABLE_SCRIPTING=1 pour une exécution sans interface (CI, traitement par lot). Assistant : %1 - + Assistant : %1 Script : %1 - + Script : %1 Grouper %n objet(s) - - + Grouper %n objet(s) + Grouper %n objet(s) Dégrouper %n objet(s) - - + Dégrouper %n objet(s) + Dégrouper %n objet(s) Figer le nom de l'élément - + Figer le nom de l'élément Dégeler le nom de l'élément - + Dégeler le nom de l'élément @@ -14620,7 +14777,7 @@ Pour l'activer : Configurer QElectroTech > Général > Projets, ou d Ex. Short example string - + Ex. @@ -14635,23 +14792,25 @@ Pour l'activer : Configurer QElectroTech > Général > Projets, ou d Les information à afficher sont supérieurs à la quantité maximal pouvant être affiché par les tableaux. Veuillez ajouter un nouveau tableau ou regler les tableaux existant afin d'afficher l'integralité des informations. - + Les information à afficher sont supérieurs à la quantité maximal pouvant être affiché par les tableaux. +Veuillez ajouter un nouveau tableau ou regler les tableaux existant afin d'afficher l'integralité des informations. Les information à afficher sont supérieurs à la quantité maximal pouvant être affiché par le tableau. Veuillez ajouter un nouveau tableau ou regler le tableau existant afin d'afficher l'integralité des informations. - + Les information à afficher sont supérieurs à la quantité maximal pouvant être affiché par le tableau. +Veuillez ajouter un nouveau tableau ou regler le tableau existant afin d'afficher l'integralité des informations. Limitation de tableau - + Limitation de tableau Modifier la géometrie d'un tableau - + Modifier la géometrie d'un tableau @@ -14661,22 +14820,23 @@ Veuillez ajouter un nouveau tableau ou regler le tableau existant afin d'af erreur de syntaxe à la ligne %1, colonne %2 : %3 - + erreur de syntaxe à la ligne %1, colonne %2 : +%3 Aucun répertoire de collection n'a été donné. - + Aucun répertoire de collection n'a été donné. l'élément racine <%1> n'est pas <labels>. - + l'élément racine <%1> n'est pas <labels>. le fichier n'a pas pu être ouvert : %1 - + le fichier n'a pas pu être ouvert : %1 @@ -14686,23 +14846,29 @@ reprennent le préfixe de ce dossier, sauf s'ils portent eux-mêmes une étiquette. Un dossier sans préfixe reprend celui de son dossier parent. Ce fichier est créé et modifié par QElectroTech (Programme de réglages : Configurer les préfixes…), mais reste modifiable à la main. - + Fichier de préfixes (étiquettes) de la collection utilisateur. +Un préfixe est attribué à chaque dossier : les éléments d'un dossier +reprennent le préfixe de ce dossier, sauf s'ils portent eux-mêmes une +étiquette. Un dossier sans préfixe reprend celui de son dossier parent. +Ce fichier est créé et modifié par QElectroTech (Programme de réglages : +Configurer les préfixes…), mais reste modifiable à la main. Aucun fichier de préfixes à enregistrer. - + Aucun fichier de préfixes à enregistrer. Le répertoire %1 n'a pas pu être créé. - + Le répertoire %1 n'a pas pu être créé. Le fichier %1 n'a pas pu être copié à côté avant d'être remplacé : rien n'a été modifié. - + Le fichier %1 n'a pas pu être copié à côté avant d'être remplacé : +rien n'a été modifié. @@ -14711,353 +14877,353 @@ rien n'a été modifié. Ajouter un point - + Ajouter un point Supprimer ce point - + Supprimer ce point Déformer une courbe - + Déformer une courbe Nœud le plus proche - + Nœud le plus proche Lisse - + Lisse Symétrique - + Symétrique Anguleux - + Anguleux Supprimer le nœud le plus proche - + Supprimer le nœud le plus proche Convertir en polyligne - + Convertir en polyligne Convertir en courbe de Bézier - + Convertir en courbe de Bézier Miroir horizontal - + Miroir horizontal Miroir vertical - + Miroir vertical Taille - + Taille Coins arrondis - + Coins arrondis Édition des nœuds - + Édition des nœuds Rotation/Inclinaison - + Rotation/Inclinaison Cliquer : mode %1 - + Cliquer : mode %1 Glisser un coin/bord : redimensionner (Ctrl = depuis le centre, Maj = proportions, Alt = détacher en polyligne) - + Glisser un coin/bord : redimensionner (Ctrl = depuis le centre, Maj = proportions, Alt = détacher en polyligne) ; point turquoise : arc - + ; point turquoise : arc Glisser une extrémité : la déplacer - + Glisser une extrémité : la déplacer Glisser un point : le déplacer - + Glisser un point : le déplacer Glisser le point violet : arrondir les coins - + Glisser le point violet : arrondir les coins Glisser une poignée ou la courbe : déformer (Alt = briser la tangente) ; Alt+glisser un point anguleux : créer des poignées ; clic droit : menu du nœud le plus proche - + Glisser une poignée ou la courbe : déformer (Alt = briser la tangente) ; Alt+glisser un point anguleux : créer des poignées ; clic droit : menu du nœud le plus proche une extrémité - + une extrémité un coin - + un coin un point - + un point Glisser %1 : rotation (Maj = 15°) - + Glisser %1 : rotation (Maj = 15°) ; un bord : inclinaison - + ; un bord : inclinaison ; point rouge : glisser pour repositionner le centre de rotation - + ; point rouge : glisser pour repositionner le centre de rotation (Ctrl pendant le glissement = position libre, sans accrochage à la grille) - + (Ctrl pendant le glissement = position libre, sans accrochage à la grille) — Cliquer : mode %1 - + — Cliquer : mode %1 Glisser : déplacer ce point - + Glisser : déplacer ce point Glisser : redimensionner (Ctrl = depuis le centre + position libre, Maj = proportions - + Glisser : redimensionner (Ctrl = depuis le centre + position libre, Maj = proportions , Alt = détacher en polyligne - + , Alt = détacher en polyligne Glisser : rotation (Ctrl = position libre, Maj = 15°) - + Glisser : rotation (Ctrl = position libre, Maj = 15°) Glisser : inclinaison (Ctrl = position libre, Maj = 15°) - + Glisser : inclinaison (Ctrl = position libre, Maj = 15°) Glisser : repositionner le centre de rotation (Ctrl = position libre) - + Glisser : repositionner le centre de rotation (Ctrl = position libre) Glisser : arrondir les coins (Ctrl = position libre) - + Glisser : arrondir les coins (Ctrl = position libre) Glisser : ajuster l'arc (Ctrl = position libre, Maj = 15°) - + Glisser : ajuster l'arc (Ctrl = position libre, Maj = 15°) Glisser : creuser ou aplatir l'arc, ses extrémités restent en place (Ctrl = position libre) - + Glisser : creuser ou aplatir l'arc, ses extrémités restent en place (Ctrl = position libre) Glisser : déplacer le point (Ctrl = position libre - + Glisser : déplacer le point (Ctrl = position libre , Alt = créer des poignées - + , Alt = créer des poignées Glisser : déformer la courbe (Ctrl = position libre, Alt = briser la tangente) - + Glisser : déformer la courbe (Ctrl = position libre, Alt = briser la tangente) Ajouter un point à un polygone - + Ajouter un point à un polygone Supprimer un point d'un polygone - + Supprimer un point d'un polygone Ajouter un point à une courbe - + Ajouter un point à une courbe Supprimer un point d'une courbe - + Supprimer un point d'une courbe Convertir %1 en courbe de Bézier - + Convertir %1 en courbe de Bézier Convertir %1 en polyligne - + Convertir %1 en polyligne Miroir impossible : inclinaison trop extrême pour cette forme - + Miroir impossible : inclinaison trop extrême pour cette forme Miroir horizontal de %1 - + Miroir horizontal de %1 Miroir vertical de %1 - + Miroir vertical de %1 Modifier le type d'un nœud - + Modifier le type d'un nœud Redimensionner %1 - + Redimensionner %1 Faire pivoter %1 - + Faire pivoter %1 Incliner %1 - + Incliner %1 Deplacer le centre de rotation - + Deplacer le centre de rotation Arrondir les coins d'%1 - + Arrondir les coins d'%1 Modifier l'angle d'un arc - + Modifier l'angle d'un arc Modifier la courbure d'un arc - + Modifier la courbure d'un arc Modifier la forme d'%1 - + Modifier la forme d'%1 Modifier la courbure d'%1 - + Modifier la courbure d'%1 Modifier %1 - + Modifier %1 une ligne - + une ligne un rectangle - + un rectangle une éllipse - + une éllipse un arc - + un arc une polyligne - + une polyligne une courbe - + une courbe une shape - + une shape @@ -15065,43 +15231,43 @@ rien n'a été modifié. Dimensions : - + Dimensions : y - + y Coin supérieur gauche : - + Coin supérieur gauche : Largeur : - + Largeur : Arrondi : - + Arrondi : x - + x Hauteur : - + Hauteur : Modifier un rectangle - + Modifier un rectangle @@ -15109,37 +15275,37 @@ rien n'a été modifié. Dialog - + Dialog Nouveau nom : - + Nouveau nom : Écraser - + Écraser Renommer - + Renommer Annuler - + Annuler TextLabel - + TextLabel L'élément « %1 » existe déjà. Que souhaitez-vous faire ? - + L'élément « %1 » existe déjà. Que souhaitez-vous faire ? @@ -15196,22 +15362,22 @@ rien n'a été modifié. Élément - + Élément Nom actuel - + Nom actuel Nouveau nom - + Nouveau nom (figé) - + (figé) @@ -15219,12 +15385,12 @@ rien n'a été modifié. Type - + Type &Multifilaire - + &Multifilaire @@ -15241,27 +15407,27 @@ rien n'a été modifié. Ne pas modifier - + Ne pas modifier En haut - + En haut En bas - + En bas Texte sur conducteur horizontal : - + Texte sur conducteur horizontal : Tension / protocol : - + Tension / protocol : @@ -15269,190 +15435,190 @@ rien n'a été modifié. Supprimer ce texte - + Supprimer ce texte Fonction : - + Fonction : Formule du texte : - + Formule du texte : Texte visible - + Texte visible Angle : - + Angle : Texte sur conducteur vertical : - + Texte sur conducteur vertical : Taille du texte : - + Taille du texte : Texte : - + Texte : À gauche - + À gauche À droite - + À droite Couleur du conducteur - + Couleur du conducteur ° - + ° Section du conducteur - + Section du conducteur Unifilaire - + Unifilaire Protective Earth Neutral - + Protective Earth Neutral PEN - + PEN Phase - + Phase phase - + phase Nombre de phase - + Nombre de phase Neutre - + Neutre neutre - + neutre Terre - + Terre terre - + terre TextLabel - + TextLabel PushButton - + PushButton Apparence - + Apparence Taille : - + Taille : Couleur : - + Couleur : Style : - + Style : Modifier - + Modifier Couleur secondaire : - + Couleur secondaire : Taille de trait : - + Taille de trait : px - + px Trait plein conductor style: solid line - + Trait plein Trait en pointillés conductor style: dashed line - + Trait en pointillés Traits et points conductor style: dashed and dotted line - + Traits et points @@ -15460,7 +15626,7 @@ rien n'a été modifié. Ne pas modifier - + Ne pas modifier @@ -15473,27 +15639,27 @@ rien n'a été modifié. Principales - + Principales Indice Rev - + Indice Rev Localisation - + Localisation Fichier : - + Fichier : Disponible en tant que %title pour les modèles de cartouches - + Disponible en tant que %title pour les modèles de cartouches @@ -15505,67 +15671,67 @@ rien n'a été modifié. Ne pas modifier - + Ne pas modifier Disponible en tant que %author pour les modèles de cartouches - + Disponible en tant que %author pour les modèles de cartouches Auteur : - + Auteur : Date : - + Date : Installation : - + Installation : Disponible en tant que %indexrev pour les modèles de cartouches - + Disponible en tant que %indexrev pour les modèles de cartouches Disponible en tant que %filename pour les modèles de cartouches - + Disponible en tant que %filename pour les modèles de cartouches Folio : - + Folio : Pas de date - + Pas de date Disponible en tant que %date pour les modèles de cartouches - + Disponible en tant que %date pour les modèles de cartouches Date fixe : - + Date fixe : Appliquer la date actuelle - + Appliquer la date actuelle <html><head/><body><p>Disponible en tant que %plant pour les modèles de cartouches</p></body></html> - + <html><head/><body><p>Disponible en tant que %plant pour les modèles de cartouches</p></body></html> @@ -15574,17 +15740,21 @@ Les variables suivantes sont utilisables : - %id : numéro du folio courant dans le projet - %total : nombre total de folios dans le projet - %autonum : Folio Auto Numeration - + Disponible en tant que %folio pour les modèles de cartouches +Les variables suivantes sont utilisables : +- %id : numéro du folio courant dans le projet +- %total : nombre total de folios dans le projet +- %autonum : Folio Auto Numeration Disponible en tant que %locmach pour les modèles de cartouches - + Disponible en tant que %locmach pour les modèles de cartouches Titre : - + Titre : @@ -15595,18 +15765,19 @@ Les variables suivantes sont utilisables : Supprimer ce texte - + Supprimer ce texte Personnalisées - + Personnalisées Vous pouvez définir ici vos propres associations noms/valeurs pour que le cartouche en tienne compte. Exemple : associer le nom "volta" et la valeur "1745" remplacera %{volta} par 1745 dans le cartouche. - + Vous pouvez définir ici vos propres associations noms/valeurs pour que le cartouche en tienne compte. Exemple : +associer le nom "volta" et la valeur "1745" remplacera %{volta} par 1745 dans le cartouche. @@ -15614,12 +15785,12 @@ associer le nom "volta" et la valeur "1745" remplacera %{vol Form - + Form Label de report de folio - + Label de report de folio @@ -15631,7 +15802,14 @@ Créer votre propre texte en vous aidant des variables suivantes : %LM : la localisation %l : le numéro de ligne %c : le numéro de colonne - + Vous pouvez définir un label personnalisé pour les reports de folio. +Créer votre propre texte en vous aidant des variables suivantes : +%f : la position du folio dans le projet +%F : le numéro de folio +%M : l'installation +%LM : la localisation +%l : le numéro de ligne +%c : le numéro de colonne @@ -15641,117 +15819,117 @@ Créer votre propre texte en vous aidant des variables suivantes : Gérer les scripts - + Gérer les scripts &Nouveau - + &Nouveau Supp&rimer - + Supp&rimer Le texte du bouton - + Le texte du bouton vide : les initiales du nom ; builtin:<nom> : une icône du thème - + vide : les initiales du nom ; builtin:<nom> : une icône du thème Choisir une image (SVG ou PNG)… - + Choisir une image (SVG ou PNG)… Toujours - + Toujours Avec une sélection - + Avec une sélection Avec un conducteur sélectionné - + Avec un conducteur sélectionné Nom : - + Nom : Icône : - + Icône : Info-bulle : - + Info-bulle : Raccourci : - + Raccourci : Actif : - + Actif : &Tester - + &Tester Enregistre puis exécute le script sur le projet courant (Ctrl+Z annule l'exécution) - + Enregistre puis exécute le script sur le projet courant (Ctrl+Z annule l'exécution) &Enregistrer - + &Enregistrer Ouvrir le &dossier - + Ouvrir le &dossier &Fermer - + &Fermer Script (l'objet qet ; qet.currentFolio() est le folio affiché) : - + Script (l'objet qet ; qet.currentFolio() est le folio affiché) : Pas de bouton : %1 - + Pas de bouton : %1 Pas de bouton pour ce fichier : %1 - + Pas de bouton pour ce fichier : %1 Nouveau script - + Nouveau script @@ -15760,57 +15938,61 @@ Créer votre propre texte en vous aidant des variables suivantes : var f = qet.currentFolio(); qet.addText(f, "Texte", 40, 40); - + // qet.currentFolio() est le folio affiché ; un clic s'annule +// d'un seul Ctrl+Z. Liste des appels : qet.apiSignatures() +var f = qet.currentFolio(); +qet.addText(f, "Texte", 40, 40); + Pas encore enregistré - + Pas encore enregistré Le script doit avoir un nom. - + Le script doit avoir un nom. Non enregistré : %1 - + Non enregistré : %1 Impossible d'écrire %1 - + Impossible d'écrire %1 Supprimer le script - + Supprimer le script Supprimer « %1 » et son bouton ? - + Supprimer « %1 » et son bouton ? Icône du script - + Icône du script Images (*.svg *.png) - + Images (*.svg *.png) Impossible de copier %1 - + Impossible de copier %1 Le script affiché n'est pas enregistré. Enregistrer ? - + Le script affiché n'est pas enregistré. Enregistrer ? @@ -15823,42 +16005,42 @@ qet.addText(f, "Texte", 40, 40); Aller à la correspondance suivante - + Aller à la correspondance suivante <html><head/><body><p>Afficher les options avancées</p></body></html> - + <html><head/><body><p>Afficher les options avancées</p></body></html> Aller à la correspondance précédente - + Aller à la correspondance précédente Quitter - + Quitter <html><head/><body><p>Définir les propriétés à remplacer dans les éléments</p></body></html> - + <html><head/><body><p>Définir les propriétés à remplacer dans les éléments</p></body></html> Champ texte de folio - + Champ texte de folio <html><head/><body><p>Définir les propriétés à remplacer dans les conducteurs</p></body></html> - + <html><head/><body><p>Définir les propriétés à remplacer dans les conducteurs</p></body></html> <html><head/><body><p>Définir les propriétés à remplacer dans les folios</p></body></html> - + <html><head/><body><p>Définir les propriétés à remplacer dans les folios</p></body></html> @@ -15868,132 +16050,132 @@ qet.addText(f, "Texte", 40, 40); Texte brut - + Texte brut Mode - + Mode Mots entiers - + Mots entiers Sensible à la casse - + Sensible à la casse <html><head/><body><p>Remplacer la correspondance sélectionnée</p></body></html> - + <html><head/><body><p>Remplacer la correspondance sélectionnée</p></body></html> <html><head/><body><p>Remplacer les correspondances cochées</p></body></html> - + <html><head/><body><p>Remplacer les correspondances cochées</p></body></html> avancé - + avancé Élément - + Élément Conducteur - + Conducteur Remplacer : - + Remplacer : Remplacer - + Remplacer Tout remplacer - + Tout remplacer Chercher : - + Chercher : Actualiser - + Actualiser Correspondance : - + Correspondance : Folios - + Folios Champs texte - + Champs texte Eléments - + Eléments Eléments simple - + Eléments simple Eléments maître - + Eléments maître Eléments esclave - + Eléments esclave Eléments report de folio - + Eléments report de folio Eléments bornier - + Eléments bornier Sélectionner les éléments de ce folio - + Sélectionner les éléments de ce folio Sélectionner les conducteurs de ce folio - + Sélectionner les conducteurs de ce folio Sélectionner les textes de ce folio - + Sélectionner les textes de ce folio @@ -16021,17 +16203,17 @@ qet.addText(f, "Texte", 40, 40); [édité] - + [édité] Conducteurs - + Conducteurs Inconnue - + Inconnue @@ -16039,88 +16221,88 @@ qet.addText(f, "Texte", 40, 40); Form - + Form Numérotations disponibles : - + Numérotations disponibles : Nom de la nouvelle numérotation - + Nom de la nouvelle numérotation Supprimer la numérotation - + Supprimer la numérotation Définition - + Définition <html><head/><body><p>Supprimer une variable de numérotation</p></body></html> - + <html><head/><body><p>Supprimer une variable de numérotation</p></body></html> <html><head/><body><p>Ajouter une variable de numérotation</p></body></html> - + <html><head/><body><p>Ajouter une variable de numérotation</p></body></html> Type - + Type Pour un numéro : le prochain numéro attribué. Pour un texte : le texte fixe. - + Pour un numéro : le prochain numéro attribué. Pour un texte : le texte fixe. Valeur - + Valeur Incrémentation - + Incrémentation Annuler - + Annuler Revenir à la définition enregistrée - + Revenir à la définition enregistrée Monter cette variable - + Monter cette variable Descendre cette variable - + Descendre cette variable Supprimer cette variable - + Supprimer cette variable Folio Autonumérotation title window - + Folio Autonumérotation @@ -16137,7 +16319,18 @@ Si le chiffre défini dans le champ Valeur possède moins de digits que le type Le champ "Incrémentation" n'est pas utilisé. help dialog about the folio autonumerotation - + C'est ici que vous pouvez définir la manière dont seront numérotés les nouveaux folios. +-Une numérotation est composée d'une variable minimum. +-Vous pouvez ajouter ou supprimer une variable de numérotation par le biais des boutons - et +. +-Une variable de numérotation comprend : un type, une valeur et une incrémentation. + +-les types "Chiffre 1", "Chiffre 01" et "Chiffre 001", représentent un type numérique défini dans le champ "Valeur", qui s'incrémente à chaque nouveau folio de la valeur du champ "Incrémentation". +-"Chiffre 01" et "Chiffre 001", sont respectivement représentés sur le schéma par deux et trois digits minimum. +Si le chiffre défini dans le champ Valeur possède moins de digits que le type choisi,celui-ci sera précédé par un ou deux 0 afin de respecter son type. + +-Le type "Texte", représente un texte fixe. +Le champ "Incrémentation" n'est pas utilisé. + @@ -16159,13 +16352,29 @@ Les autres champs ne sont pas utilisés. -Le type "Folio" représente le nom du folio en cours. Les autres champs ne sont pas utilisés. help dialog about the conductor autonumerotation - + C'est ici que vous pouvez définir la manière dont seront numérotés les nouveaux conducteurs. +-Une numérotation est composée d'une variable minimum. +-Vous pouvez ajouter ou supprimer une variable de numérotation par le biais des boutons - et +. +-Une variable de numérotation comprend : un type, une valeur et une incrémentation. + +-les types "Chiffre 1", "Chiffre 01" et "Chiffre 001", représentent un type numérique défini dans le champ "Valeur", qui s'incrémente à chaque nouveau conducteur de la valeur du champ "Incrémentation". +-"Chiffre 01" et "Chiffre 001", sont respectivement représentés sur le schéma par deux et trois digits minimum. +Si le chiffre défini dans le champ Valeur possède moins de digits que le type choisi,celui-ci sera précédé par un ou deux 0 afin de respecter son type. + +-Le type "Texte", représente un texte fixe. +Le champ "Incrémentation" n'est pas utilisé. + +-Le type "N° folio" représente le n° du folio en cours. +Les autres champs ne sont pas utilisés. + +-Le type "Folio" représente le nom du folio en cours. +Les autres champs ne sont pas utilisés. Element Autonumérotation title window - + Element Autonumérotation @@ -16187,23 +16396,39 @@ Les autres champs ne sont pas utilisés. -Le type "Folio" représente le nom du folio en cours. Les autres champs ne sont pas utilisés. help dialog about the element autonumerotation - + C'est ici que vous pouvez définir la manière dont seront numérotés les nouveaux elements. +-Une numérotation est composée d'une variable minimum. +-Vous pouvez ajouter ou supprimer une variable de numérotation par le biais des boutons - et +. +-Une variable de numérotation comprend : un type, une valeur et une incrémentation. + +-les types "Chiffre 1", "Chiffre 01" et "Chiffre 001", représentent un type numérique défini dans le champ "Valeur", qui s'incrémente à chaque nouveau conducteur de la valeur du champ "Incrémentation". +-"Chiffre 01" et "Chiffre 001", sont respectivement représentés sur le schéma par deux et trois digits minimum. +Si le chiffre défini dans le champ Valeur possède moins de digits que le type choisi,celui-ci sera précédé par un ou deux 0 afin de respecter son type. + +-Le type "Texte", représente un texte fixe. +Le champ "Incrémentation" n'est pas utilisé. + +-Le type "N° folio" représente le n° du folio en cours. +Les autres champs ne sont pas utilisés. + +-Le type "Folio" représente le nom du folio en cours. +Les autres champs ne sont pas utilisés. Nouvelle numérotation… - + Nouvelle numérotation… Renommer la numérotation… - + Renommer la numérotation… Conducteur Autonumérotation title window - + Conducteur Autonumérotation @@ -16211,241 +16436,241 @@ Les autres champs ne sont pas utilisés. Form - + Form Trait - + Trait Épaisseur - + Épaisseur Normal - + Normal Tiret - + Tiret Pointillé - + Pointillé Traits et points - + Traits et points Traits points points - + Traits points points Tiret custom - + Tiret custom Type - + Type Couleur - + Couleur Remplissage - + Remplissage Style - + Style Aucun - + Aucun Géométrie - + Géométrie Largeur - + Largeur Hauteur - + Hauteur Angle - + Angle ° - + ° Plein - + Plein Densité 1 - + Densité 1 Densité 2 - + Densité 2 Densité 3 - + Densité 3 Densité 4 - + Densité 4 Densité 5 - + Densité 5 Densité 6 - + Densité 6 Densité 7 - + Densité 7 Horizontal - + Horizontal Vertical - + Vertical Croix - + Croix Diagonal arrière - + Diagonal arrière Diagonal avant - + Diagonal avant Diagonal en croix - + Diagonal en croix Verrouiller la position - + Verrouiller la position Forme fermée - + Forme fermée Modifier la longueur d'une ligne - + Modifier la longueur d'une ligne Modifier la taille d'une forme - + Modifier la taille d'une forme Modifier l'angle d'une forme - + Modifier l'angle d'une forme Modifier le trait d'une forme - + Modifier le trait d'une forme Modifier le remplissage d'une forme - + Modifier le remplissage d'une forme Fermer le polygone - + Fermer le polygone Modifier une forme simple - + Modifier une forme simple Modifier les propriétés d'une forme simple - + Modifier les propriétés d'une forme simple Longueur - + Longueur Rayon X - + Rayon X Rayon Y - + Rayon Y Éditer les propriétés d'une primitive - + Éditer les propriétés d'une primitive @@ -16453,53 +16678,53 @@ Les autres champs ne sont pas utilisés. La barre de raccourcis s'ouvre à la position du curseur (touche S par défaut). Elle montre les commandes choisies ici selon ce qui est sélectionné, puis le sélecteur d'éléments. - + La barre de raccourcis s'ouvre à la position du curseur (touche S par défaut). Elle montre les commandes choisies ici selon ce qui est sélectionné, puis le sélecteur d'éléments. Ajouter → - + Ajouter → ← Retirer - + ← Retirer Monter - + Monter Descendre - + Descendre Valeurs par défaut - + Valeurs par défaut Commandes disponibles - + Commandes disponibles Dans la barre, dans l'ordre - + Dans la barre, dans l'ordre Contexte : - + Contexte : Barre de raccourcis configuration page title - + Barre de raccourcis @@ -16507,17 +16732,17 @@ Les autres champs ne sont pas utilisés. Folio, rien de sélectionné - + Folio, rien de sélectionné Éléments sélectionnés - + Éléments sélectionnés Conducteurs sélectionnés - + Conducteurs sélectionnés @@ -16525,66 +16750,66 @@ Les autres champs ne sont pas utilisés. Filtrer les raccourcis… - + Filtrer les raccourcis… Tous - + Tous Attribués uniquement - + Attribués uniquement Non attribués uniquement - + Non attribués uniquement Conflits uniquement - + Conflits uniquement Action - + Action Raccourci - + Raccourci Tout réinitialiser - + Tout réinitialiser Réinitialiser ce raccourci - + Réinitialiser ce raccourci %n action(s) - - + %n action(s) + %n action(s) Ce raccourci est aussi utilisé par : %1 - + Ce raccourci est aussi utilisé par : %1 Raccourcis configuration page title - + Raccourcis @@ -16593,1987 +16818,1987 @@ Les autres champs ne sont pas utilisés. Noir element part color - + Noir Blanc element part color - + Blanc Vert element part color - + Vert Rouge element part color - + Rouge Bleu element part color - + Bleu Gris element part color - + Gris Marron element part color - + Marron Jaune element part color - + Jaune Cyan element part color - + Cyan Magenta element part color - + Magenta Gris clair element part color - + Gris clair Orange element part color - + Orange Violet element part color - + Violet Pink : Pink element part color - + Pink : Pink Pink : LightPink element part color - + Pink : LightPink Pink : HotPink element part color - + Pink : HotPink Pink : DeepPink element part color - + Pink : DeepPink Pink : PaleVioletRed element part color - + Pink : PaleVioletRed Pink : MediumVioletRed element part color - + Pink : MediumVioletRed Red : LightSalmon element part color - + Red : LightSalmon Red : Salmon element part color - + Red : Salmon Red : DarkSalmon element part color - + Red : DarkSalmon Red : LightCoral element part color - + Red : LightCoral Red : IndianRed element part color - + Red : IndianRed Red : Crimson element part color - + Red : Crimson Red : Firebrick element part color - + Red : Firebrick Red : DarkRed element part color - + Red : DarkRed Red : Red element part color - + Red : Red Orange : OrangeRed element part color - + Orange : OrangeRed Orange : Tomato element part color - + Orange : Tomato Orange : Coral element part color - + Orange : Coral Orange : DarkOrange element part color - + Orange : DarkOrange Orange : Orange element part color - + Orange : Orange Yellow : Yellow element part color - + Yellow : Yellow Yellow : LightYellow element part color - + Yellow : LightYellow Yellow : LemonChiffon element part color - + Yellow : LemonChiffon Yellow : LightGoldenrodYellow element part color - + Yellow : LightGoldenrodYellow Yellow : PapayaWhip element part color - + Yellow : PapayaWhip Yellow : Moccasin element part color - + Yellow : Moccasin Yellow : PeachPuff element part color - + Yellow : PeachPuff Yellow : PaleGoldenrod element part color - + Yellow : PaleGoldenrod Yellow : Khaki element part color - + Yellow : Khaki Yellow : DarkKhaki element part color - + Yellow : DarkKhaki Yellow : Gold element part color - + Yellow : Gold Brown : Cornsilk element part color - + Brown : Cornsilk Brown : BlanchedAlmond element part color - + Brown : BlanchedAlmond Brown : Bisque element part color - + Brown : Bisque Brown : NavajoWhite element part color - + Brown : NavajoWhite Brown : Wheat element part color - + Brown : Wheat Brown : Burlywood element part color - + Brown : Burlywood Brown : Tan element part color - + Brown : Tan Brown : RosyBrown element part color - + Brown : RosyBrown Brown : SandyBrown element part color - + Brown : SandyBrown Brown : Goldenrod element part color - + Brown : Goldenrod Brown : DarkGoldenrod element part color - + Brown : DarkGoldenrod Brown : Peru element part color - + Brown : Peru Brown : Chocolate element part color - + Brown : Chocolate Brown : SaddleBrown element part color - + Brown : SaddleBrown Brown : Sienna element part color - + Brown : Sienna Brown : Brown element part color - + Brown : Brown Brown : Maroon element part color - + Brown : Maroon Green : DarkOliveGreen element part color - + Green : DarkOliveGreen Green : Olive element part color - + Green : Olive Green : OliveDrab element part color - + Green : OliveDrab Green : YellowGreen element part color - + Green : YellowGreen Green : LimeGreen element part color - + Green : LimeGreen Green : Lime element part color - + Green : Lime Green : LawnGreen element part color - + Green : LawnGreen Green : Chartreuse element part color - + Green : Chartreuse Green : GreenYellow element part color - + Green : GreenYellow Green : SpringGreen element part color - + Green : SpringGreen Green : MediumSpringGreen element part color - + Green : MediumSpringGreen Green : LightGreen element part color - + Green : LightGreen Green : PaleGreen element part color - + Green : PaleGreen Green : DarkSeaGreen element part color - + Green : DarkSeaGreen Green : MediumAquamarine element part color - + Green : MediumAquamarine Green : MediumSeaGreen element part color - + Green : MediumSeaGreen Green : SeaGreen element part color - + Green : SeaGreen Green : ForestGreen element part color - + Green : ForestGreen Green : Green element part color - + Green : Green Green : DarkGreen element part color - + Green : DarkGreen Cyan : Aqua element part color - + Cyan : Aqua Cyan : Cyan element part color - + Cyan : Cyan Cyan : LightCyan element part color - + Cyan : LightCyan Cyan : PaleTurquoise element part color - + Cyan : PaleTurquoise Cyan : Aquamarine element part color - + Cyan : Aquamarine Cyan : Turquoise element part color - + Cyan : Turquoise Cyan : MediumTurquoise element part color - + Cyan : MediumTurquoise Cyan : DarkTurquoise element part color - + Cyan : DarkTurquoise Cyan : LightSeaGreen element part color - + Cyan : LightSeaGreen Cyan : CadetBlue element part color - + Cyan : CadetBlue Cyan : DarkCyan element part color - + Cyan : DarkCyan Cyan : Teal element part color - + Cyan : Teal Blue : LightSteelBlue element part color - + Blue : LightSteelBlue Blue : PowderBlue element part color - + Blue : PowderBlue Blue : LightBlue element part color - + Blue : LightBlue Blue : SkyBlue element part color - + Blue : SkyBlue Blue : LightSkyBlue element part color - + Blue : LightSkyBlue Blue : DeepSkyBlue element part color - + Blue : DeepSkyBlue Blue : DodgerBlue element part color - + Blue : DodgerBlue Blue : CornflowerBlue element part color - + Blue : CornflowerBlue Blue : SteelBlue element part color - + Blue : SteelBlue Blue : RoyalBlue element part color - + Blue : RoyalBlue Blue : Blue element part color - + Blue : Blue Blue : MediumBlue element part color - + Blue : MediumBlue Blue : DarkBlue element part color - + Blue : DarkBlue Blue : Navy element part color - + Blue : Navy Blue : MidnightBlue element part color - + Blue : MidnightBlue Purple : Lavender element part color - + Purple : Lavender Purple : Thistle element part color - + Purple : Thistle Purple : Plum element part color - + Purple : Plum Purple : Violet element part color - + Purple : Violet Purple : Orchid element part color - + Purple : Orchid Purple : Fuchsia element part color - + Purple : Fuchsia Purple : Magenta element part color - + Purple : Magenta Purple : MediumOrchid element part color - + Purple : MediumOrchid Purple : MediumPurple element part color - + Purple : MediumPurple Purple : BlueViolet element part color - + Purple : BlueViolet Purple : DarkViolet element part color - + Purple : DarkViolet Purple : DarkOrchid element part color - + Purple : DarkOrchid Purple : DarkMagenta element part color - + Purple : DarkMagenta Purple : Purple element part color - + Purple : Purple Purple : Indigo element part color - + Purple : Indigo Purple : DarkSlateBlue element part color - + Purple : DarkSlateBlue Purple : SlateBlue element part color - + Purple : SlateBlue Purple : MediumSlateBlue element part color - + Purple : MediumSlateBlue White : White element part color - + White : White White : Snow element part color - + White : Snow White : Honeydew element part color - + White : Honeydew White : MintCream element part color - + White : MintCream White : Azure element part color - + White : Azure White : AliceBlue element part color - + White : AliceBlue White : GhostWhite element part color - + White : GhostWhite White : WhiteSmoke element part color - + White : WhiteSmoke White : Seashell element part color - + White : Seashell White : Beige element part color - + White : Beige White : OldLace element part color - + White : OldLace White : FloralWhite element part color - + White : FloralWhite White : Ivory element part color - + White : Ivory White : AntiqueWhite element part color - + White : AntiqueWhite White : Linen element part color - + White : Linen White : LavenderBlush element part color - + White : LavenderBlush White : MistyRose element part color - + White : MistyRose Gray : Gainsboro element part color - + Gray : Gainsboro Gray : LightGray element part color - + Gray : LightGray Gray : Silver element part color - + Gray : Silver Gray : DarkGray element part color - + Gray : DarkGray Gray : Gray element part color - + Gray : Gray Gray : DimGray element part color - + Gray : DimGray Gray : LightSlateGray element part color - + Gray : LightSlateGray Gray : SlateGray element part color - + Gray : SlateGray Gray : DarkSlateGray element part color - + Gray : DarkSlateGray Gray : Black element part color - + Gray : Black Aucun element part color - + Aucun Normal element part line style - + Normal Tiret element part line style - + Tiret Pointillé element part line style - + Pointillé Traits et points element part line style - + Traits et points Nulle element part weight - + Nulle Fine element part weight - + Fine Normale element part weight - + Normale Forte element part weight - + Forte Élevé element part weight - + Élevé Aucun element part filling - + Aucun Noir element part filling - + Noir Blanc element part filling - + Blanc Vert element part filling - + Vert Rouge element part filling - + Rouge Bleu element part filling - + Bleu Gris element part filling - + Gris Marron element part filling - + Marron Jaune element part filling - + Jaune Cyan element part filling - + Cyan Magenta element part filling - + Magenta Gris clair element part filling - + Gris clair Orange element part filling - + Orange Violet element part filling - + Violet Pink : Pink element part filling - + Pink : Pink Pink : LightPink element part filling - + Pink : LightPink Pink : HotPink element part filling - + Pink : HotPink Pink : DeepPink element part filling - + Pink : DeepPink Pink : PaleVioletRed element part filling - + Pink : PaleVioletRed Pink : MediumVioletRed element part filling - + Pink : MediumVioletRed Red : LightSalmon element part filling - + Red : LightSalmon Red : Salmon element part filling - + Red : Salmon Red : DarkSalmon element part filling - + Red : DarkSalmon Red : LightCoral element part filling - + Red : LightCoral Red : IndianRed element part filling - + Red : IndianRed Red : Crimson element part filling - + Red : Crimson Red : Firebrick element part filling - + Red : Firebrick Red : DarkRed element part filling - + Red : DarkRed Red : Red element part filling - + Red : Red Orange : OrangeRed element part filling - + Orange : OrangeRed Orange : Tomato element part filling - + Orange : Tomato Orange : Coral element part filling - + Orange : Coral Orange : DarkOrange element part filling - + Orange : DarkOrange Orange : Orange element part filling - + Orange : Orange Yellow : Yellow element part filling - + Yellow : Yellow Yellow : LightYellow element part filling - + Yellow : LightYellow Yellow : LemonChiffon element part filling - + Yellow : LemonChiffon Yellow : LightGoldenrodYellow element part filling - + Yellow : LightGoldenrodYellow Yellow : PapayaWhip element part filling - + Yellow : PapayaWhip Yellow : Moccasin element part filling - + Yellow : Moccasin Yellow : PeachPuff element part filling - + Yellow : PeachPuff Yellow : PaleGoldenrod element part filling - + Yellow : PaleGoldenrod Yellow : Khaki element part filling - + Yellow : Khaki Yellow : DarkKhaki element part filling - + Yellow : DarkKhaki Yellow : Gold element part filling - + Yellow : Gold Brown : Cornsilk element part filling - + Brown : Cornsilk Brown : BlanchedAlmond element part filling - + Brown : BlanchedAlmond Brown : Bisque element part filling - + Brown : Bisque Brown : NavajoWhite element part filling - + Brown : NavajoWhite Brown : Wheat element part filling - + Brown : Wheat Brown : Burlywood element part filling - + Brown : Burlywood Brown : Tan element part filling - + Brown : Tan Brown : RosyBrown element part filling - + Brown : RosyBrown Brown : SandyBrown element part filling - + Brown : SandyBrown Brown : Goldenrod element part filling - + Brown : Goldenrod Brown : DarkGoldenrod element part filling - + Brown : DarkGoldenrod Brown : Peru element part filling - + Brown : Peru Brown : Chocolate element part filling - + Brown : Chocolate Brown : SaddleBrown element part filling - + Brown : SaddleBrown Brown : Sienna element part filling - + Brown : Sienna Brown : Brown element part filling - + Brown : Brown Brown : Maroon element part filling - + Brown : Maroon Green : DarkOliveGreen element part filling - + Green : DarkOliveGreen Green : Olive element part filling - + Green : Olive Green : OliveDrab element part filling - + Green : OliveDrab Green : YellowGreen element part filling - + Green : YellowGreen Green : LimeGreen element part filling - + Green : LimeGreen Green : Lime element part filling - + Green : Lime Green : LawnGreen element part filling - + Green : LawnGreen Green : Chartreuse element part filling - + Green : Chartreuse Green : GreenYellow element part filling - + Green : GreenYellow Green : SpringGreen element part filling - + Green : SpringGreen Green : MediumSpringGreen element part filling - + Green : MediumSpringGreen Green : LightGreen element part filling - + Green : LightGreen Green : PaleGreen element part filling - + Green : PaleGreen Green : DarkSeaGreen element part filling - + Green : DarkSeaGreen Green : MediumAquamarine element part filling - + Green : MediumAquamarine Green : MediumSeaGreen element part filling - + Green : MediumSeaGreen Green : SeaGreen element part filling - + Green : SeaGreen Green : ForestGreen element part filling - + Green : ForestGreen Green : Green element part filling - + Green : Green Green : DarkGreen element part filling - + Green : DarkGreen Cyan : Aqua element part filling - + Cyan : Aqua Cyan : Cyan element part filling - + Cyan : Cyan Cyan : LightCyan element part filling - + Cyan : LightCyan Cyan : PaleTurquoise element part filling - + Cyan : PaleTurquoise Cyan : Aquamarine element part filling - + Cyan : Aquamarine Cyan : Turquoise element part filling - + Cyan : Turquoise Cyan : MediumTurquoise element part filling - + Cyan : MediumTurquoise Cyan : DarkTurquoise element part filling - + Cyan : DarkTurquoise Cyan : LightSeaGreen element part filling - + Cyan : LightSeaGreen Cyan : CadetBlue element part filling - + Cyan : CadetBlue Cyan : DarkCyan element part filling - + Cyan : DarkCyan Cyan : Teal element part filling - + Cyan : Teal Blue : LightSteelBlue element part filling - + Blue : LightSteelBlue Blue : PowderBlue element part filling - + Blue : PowderBlue Blue : LightBlue element part filling - + Blue : LightBlue Blue : SkyBlue element part filling - + Blue : SkyBlue Blue : LightSkyBlue element part filling - + Blue : LightSkyBlue Blue : DeepSkyBlue element part filling - + Blue : DeepSkyBlue Blue : DodgerBlue element part filling - + Blue : DodgerBlue Blue : CornflowerBlue element part filling - + Blue : CornflowerBlue Blue : SteelBlue element part filling - + Blue : SteelBlue Blue : RoyalBlue element part filling - + Blue : RoyalBlue Blue : Blue element part filling - + Blue : Blue Blue : MediumBlue element part filling - + Blue : MediumBlue Blue : DarkBlue element part filling - + Blue : DarkBlue Blue : Navy element part filling - + Blue : Navy Blue : MidnightBlue element part filling - + Blue : MidnightBlue Purple : Lavender element part filling - + Purple : Lavender Purple : Thistle element part filling - + Purple : Thistle Purple : Plum element part filling - + Purple : Plum Purple : Violet element part filling - + Purple : Violet Purple : Orchid element part filling - + Purple : Orchid Purple : Fuchsia element part filling - + Purple : Fuchsia Purple : Magenta element part filling - + Purple : Magenta Purple : MediumOrchid element part filling - + Purple : MediumOrchid Purple : MediumPurple element part filling - + Purple : MediumPurple Purple : BlueViolet element part filling - + Purple : BlueViolet Purple : DarkViolet element part filling - + Purple : DarkViolet Purple : DarkOrchid element part filling - + Purple : DarkOrchid Purple : DarkMagenta element part filling - + Purple : DarkMagenta Purple : Purple element part filling - + Purple : Purple Purple : Indigo element part filling - + Purple : Indigo Purple : DarkSlateBlue element part filling - + Purple : DarkSlateBlue Purple : SlateBlue element part filling - + Purple : SlateBlue Purple : MediumSlateBlue element part filling - + Purple : MediumSlateBlue White : White element part filling - + White : White White : Snow element part filling - + White : Snow White : Honeydew element part filling - + White : Honeydew White : MintCream element part filling - + White : MintCream White : Azure element part filling - + White : Azure White : AliceBlue element part filling - + White : AliceBlue White : GhostWhite element part filling - + White : GhostWhite White : WhiteSmoke element part filling - + White : WhiteSmoke White : Seashell element part filling - + White : Seashell White : Beige element part filling - + White : Beige White : OldLace element part filling - + White : OldLace White : FloralWhite element part filling - + White : FloralWhite White : Ivory element part filling - + White : Ivory White : AntiqueWhite element part filling - + White : AntiqueWhite White : Linen element part filling - + White : Linen White : LavenderBlush element part filling - + White : LavenderBlush White : MistyRose element part filling - + White : MistyRose Gray : Gainsboro element part filling - + Gray : Gainsboro Gray : LightGray element part filling - + Gray : LightGray Gray : Silver element part filling - + Gray : Silver Gray : DarkGray element part filling - + Gray : DarkGray Gray : Gray element part filling - + Gray : Gray Gray : DimGray element part filling - + Gray : DimGray Gray : LightSlateGray element part filling - + Gray : LightSlateGray Gray : SlateGray element part filling - + Gray : SlateGray Gray : DarkSlateGray element part filling - + Gray : DarkSlateGray Gray : Black element part filling - + Gray : Black Lignes Horizontales element part filling - + Lignes Horizontales Lignes Verticales element part filling - + Lignes Verticales Hachures gauche element part filling - + Hachures gauche Hachures droite element part filling - + Hachures droite Antialiasing - + Antialiasing Apparence : - + Apparence : Contour : - + Contour : Remplissage : - + Remplissage : Style : - + Style : Épaisseur : - + Épaisseur : Géométrie : - + Géométrie : style antialiasing - + style antialiasing style couleur - + style couleur style ligne - + style ligne style epaisseur - + style epaisseur style remplissage - + style remplissage @@ -18586,27 +18811,27 @@ Les autres champs ne sont pas utilisés. Informations disponibles - + Informations disponibles Information à afficher - + Information à afficher Configuration - + Configuration Requête SQL : - + Requête SQL : Position - + Position @@ -18626,32 +18851,32 @@ Les autres champs ne sont pas utilisés. Nord - + Nord Est - + Est Sud - + Sud Ouest - + Ouest Modifier l'orientation d'une borne - + Modifier l'orientation d'une borne Déplacer une borne - + Déplacer une borne @@ -18659,106 +18884,106 @@ Les autres champs ne sont pas utilisés. T%1 - + T%1 Générique - + Générique Bornier intérieur - + Bornier intérieur Bornier extérieur - + Bornier extérieur NO (contact SW) - + NO (contact SW) NC (contact SW) - + NC (contact SW) Commun (contact SW) - + Commun (contact SW) Modifier le nom du terminal - + Modifier le nom du terminal Modifier le type d'une borne - + Modifier le type d'une borne Afficher/cacher le nom du terminal - + Afficher/cacher le nom du terminal Modifier la position du label - + Modifier la position du label Modifier la police du label - + Modifier la police du label Modifier la taille de police du label - + Modifier la taille de police du label Modifier la rotation du label - + Modifier la rotation du label Modifier l'alignement du label - + Modifier l'alignement du label Afficher/cacher le cadre du label - + Afficher/cacher le cadre du label Modifier la couleur du label - + Modifier la couleur du label Modifier l'étiquette du maître - + Modifier l'étiquette du maître Modifier le nom de la borne - + Modifier le nom de la borne Modifier l'index de l'étiquette du maître - + Modifier l'index de l'étiquette du maître @@ -18768,92 +18993,92 @@ Les autres champs ne sont pas utilisés. y : - + y : Orientation : - + Orientation : x : - + x : Nom : - + Nom : Type : - + Type : Nom de la borne - + Nom de la borne Afficher le nom - + Afficher le nom Propriétés du texte - + Propriétés du texte Police - + Police X : - + X : Y : - + Y : Rotation : - + Rotation : ° - + ° Alignement - + Alignement Couleur : - + Couleur : Encadrer le texte - + Encadrer le texte Étiquette du maître - + Étiquette du maître Reprendre du maître - + Reprendre du maître @@ -18861,57 +19086,57 @@ Les autres champs ne sont pas utilisés. Numérotation automatique des bornes - + Numérotation automatique des bornes Cette fonction numérote les bornes du projet selon leur position. Les bornes vides ou verrouillées sont ignorées.Le marquage des bornes doit être configuré au préalable comme suit : '-X:AB'. La partie avant les deux-points (le bornier) peut être nommée au choix. 'AB' peut être composé de chiffres ou de lettres." - + Cette fonction numérote les bornes du projet selon leur position. Les bornes vides ou verrouillées sont ignorées.Le marquage des bornes doit être configuré au préalable comme suit : '-X:AB'. La partie avant les deux-points (le bornier) peut être nommée au choix. 'AB' peut être composé de chiffres ou de lettres." Priorité des axes - + Priorité des axes Priorité à l'axe X (horizontal) - + Priorité à l'axe X (horizontal) Priorité à l'axe Y (vertical) - + Priorité à l'axe Y (vertical) Type de numérotation - + Type de numérotation Numérique uniquement (1, 2, 3...) - + Numérique uniquement (1, 2, 3...) Alphanumérique (A, B, C... 1, 2...) - + Alphanumérique (A, B, C... 1, 2...) Numéroter également les lettres - + Numéroter également les lettres Borniers - + Borniers Décochez les borniers dont la numérotation doit être exclue - + Décochez les borniers dont la numérotation doit être exclue @@ -18919,32 +19144,32 @@ Les autres champs ne sont pas utilisés. Création groupe de bornes - + Création groupe de bornes Localisation : - + Localisation : Nom : - + Nom : Installation : - + Installation : Description : - + Description : Commentaire : - + Commentaire : @@ -18952,63 +19177,63 @@ Les autres champs ne sont pas utilisés. Disposition - + Disposition Ponter les bornes - + Ponter les bornes Déponter les bornes - + Déponter les bornes Propriétés - + Propriétés Nom : - + Nom : Commentaire : - + Commentaire : Description - + Description Installation : - + Installation : Localisation : - + Localisation : Type : - + Type : Degrouper les bornes - + Degrouper les bornes Générique - + Générique @@ -19018,92 +19243,92 @@ Les autres champs ne sont pas utilisés. Effectuer le déplacement - + Effectuer le déplacement Couleur pont : - + Couleur pont : Fusible - + Fusible Sectionnable - + Sectionnable Diode - + Diode Terre - + Terre Déplacer dans : - + Déplacer dans : Phase - + Phase Neutre - + Neutre Position automatique - + Position automatique Étage : - + Étage : Grouper les bornes - + Grouper les bornes Fonction : - + Fonction : Sans - + Sans Avec - + Avec LED : - + LED : Bornes indépendantes - + Bornes indépendantes Modifier des propriétés de borniers - + Modifier des propriétés de borniers @@ -19111,42 +19336,42 @@ Les autres champs ne sont pas utilisés. Gestionnaire de borniers - + Gestionnaire de borniers toolBar - + toolBar Ajouter un bornier - + Ajouter un bornier Ajouter un bornier au projet - + Ajouter un bornier au projet Supprimer le bornier - + Supprimer le bornier Supprimer le bornier du projet - + Supprimer le bornier du projet Recharger - + Recharger Recharger les borniers - + Recharger les borniers @@ -19154,7 +19379,7 @@ Les autres champs ne sont pas utilisés. plan de bornes - + plan de bornes @@ -19167,142 +19392,142 @@ Les autres champs ne sont pas utilisés. Borne niveau 0 : - + Borne niveau 0 : En tête : - + En tête : Point de pont - + Point de pont Décalage vertical - + Décalage vertical Afficher l'aide - + Afficher l'aide Largeur - + Largeur Orientation - + Orientation Alignement - + Alignement Police : - + Police : Taille : - + Taille : Texte d'en tête - + Texte d'en tête Origine vertical - + Origine vertical Longueur maximal - + Longueur maximal Texte borne - + Texte borne Référence croisée - + Référence croisée Hauteur - + Hauteur Prévisualisation : - + Prévisualisation : Gauche - + Gauche Centre - + Centre Droite - + Droite Horizontal - + Horizontal Vertical - + Vertical Borne niveau 2 : - + Borne niveau 2 : Espace : - + Espace : Borne niveau 3 : - + Borne niveau 3 : Borne niveau 1 : - + Borne niveau 1 : @@ -19310,52 +19535,52 @@ Les autres champs ne sont pas utilisés. Position - + Position Étage - + Étage Label - + Label Référence croisé - + Référence croisé Câble - + Câble Couleur / numéro de fil câble - + Couleur / numéro de fil câble Type - + Type Fonction - + Fonction led - + led Numéro de conducteur - + Numéro de conducteur @@ -19363,7 +19588,7 @@ Les autres champs ne sont pas utilisés. Plan de bornes - + Plan de bornes @@ -19371,17 +19596,17 @@ Les autres champs ne sont pas utilisés. Explorateur de bornier - + Explorateur de bornier Projet sans titre - + Projet sans titre Bornes indépendante - + Bornes indépendante @@ -19389,29 +19614,29 @@ Les autres champs ne sont pas utilisés. Modifier le contenu d'un champ texte - + Modifier le contenu d'un champ texte Pivoter un champ texte - + Pivoter un champ texte Modifier la police d'un texte - + Modifier la police d'un texte Modifier la couleur d'un texte - + Modifier la couleur d'un texte Déplacer un champ texte - + Déplacer un champ texte @@ -19421,52 +19646,52 @@ Les autres champs ne sont pas utilisés. Y : - + Y : Police : - + Police : ° - + ° Rotation : - + Rotation : X : - + X : Entrer votre texte ici - + Entrer votre texte ici Couleur : - + Couleur : Alignement - + Alignement Point d'ancrage du texte et alignement des lignes entre elles - + Point d'ancrage du texte et alignement des lignes entre elles Modifier l'alignement d'un champ texte - + Modifier l'alignement d'un champ texte @@ -19474,17 +19699,17 @@ Les autres champs ne sont pas utilisés. Logiciel tiers requis - + Logiciel tiers requis Télechargement - + Télechargement Dossier installation - + Dossier installation @@ -19493,37 +19718,37 @@ Les autres champs ne sont pas utilisés. Largeur : default dialog label - + Largeur : Absolu a traditional, absolute measure - + Absolu Relatif au total a percentage of the total width - + Relatif au total Relatif au restant a percentage of what remains from the total width - + Relatif au restant % spinbox suffix when changing the dimension of a row/column - + % px spinbox suffix when changing the dimension of a row/column - + px @@ -19531,112 +19756,112 @@ Les autres champs ne sont pas utilisés. Form - + Form Informations des cartouches - + Informations des cartouches Modèle : - + Modèle : Principales - + Principales Date : - + Date : Auteur : - + Auteur : Disponible en tant que %locmach pour les modèles de cartouches - + Disponible en tant que %locmach pour les modèles de cartouches Disponible en tant que %title pour les modèles de cartouches - + Disponible en tant que %title pour les modèles de cartouches Folio : - + Folio : Fichier : - + Fichier : Disponible en tant que %author pour les modèles de cartouches - + Disponible en tant que %author pour les modèles de cartouches Disponible en tant que %filename pour les modèles de cartouches - + Disponible en tant que %filename pour les modèles de cartouches Pas de date - + Pas de date Date courante - + Date courante Appliquer la date actuelle - + Appliquer la date actuelle Disponible en tant que %date pour les modèles de cartouches - + Disponible en tant que %date pour les modèles de cartouches Date fixe : - + Date fixe : Titre : - + Titre : Page Num: - + Page Num: <html><head/><body><p>Affiche le cartouche en bas (horizontalement) ou à droite (verticalement) du folio.</p></body></html> - + <html><head/><body><p>Affiche le cartouche en bas (horizontalement) ou à droite (verticalement) du folio.</p></body></html> Installation : - + Installation : Disponible en tant que %indexrev pour les modèles de cartouches - + Disponible en tant que %indexrev pour les modèles de cartouches @@ -19645,62 +19870,67 @@ Les variables suivantes sont utilisables : - %id : numéro du folio courant dans le projet - %total : nombre total de folios dans le projet - %autonum : Folio Auto Numeration - + Disponible en tant que %folio pour les modèles de cartouches +Les variables suivantes sont utilisables : +- %id : numéro du folio courant dans le projet +- %total : nombre total de folios dans le projet +- %autonum : Folio Auto Numeration Indice Rev: - + Indice Rev: <html><head/><body><p>Disponible en tant que %plant pour les modèles de cartouches</p></body></html> - + <html><head/><body><p>Disponible en tant que %plant pour les modèles de cartouches</p></body></html> Localisation: - + Localisation: Personnalisées - + Personnalisées Vous pouvez définir ici vos propres associations noms/valeurs pour que le cartouche en tienne compte. Exemple : associer le nom "volta" et la valeur "1745" remplacera %{volta} par 1745 dans le cartouche. - + Vous pouvez définir ici vos propres associations noms/valeurs pour que le cartouche en tienne compte. Exemple : +associer le nom "volta" et la valeur "1745" remplacera %{volta} par 1745 dans le cartouche. Éditer ce modèle menu entry - + Éditer ce modèle Dupliquer et éditer ce modèle menu entry - + Dupliquer et éditer ce modèle Title block templates actions - + Title block templates actions Créer un Folio Numérotation Auto - + Créer un Folio Numérotation Auto Modèle par défaut - + Modèle par défaut @@ -19709,12 +19939,12 @@ associer le nom "volta" et la valeur "1745" remplacera %{vol %1 : %2 titleblock content - please let the blank space at the beginning - + %1 : %2 %1 - + %1 @@ -19722,146 +19952,146 @@ associer le nom "volta" et la valeur "1745" remplacera %{vol Type de cellule : - + Type de cellule : Vide - + Vide Texte - + Texte Logo - + Logo Nom : - + Nom : Attention : les bordures des cellules vides n'apparaissent pas lors du rendu final sur le folio. - + Attention : les bordures des cellules vides n'apparaissent pas lors du rendu final sur le folio. Aucun logo - + Aucun logo Gérer les logos - + Gérer les logos Afficher un label : - + Afficher un label : Editer - + Editer Texte : - + Texte : Alignement : - + Alignement : horizontal : - + horizontal : Gauche - + Gauche Centré - + Centré Droite - + Droite vertical : - + vertical : Haut - + Haut Milieu - + Milieu Bas - + Bas Police : - + Police : Ajuster la taille de police si besoin - + Ajuster la taille de police si besoin Label de cette cellule - + Label de cette cellule Valeur de cette cellule - + Valeur de cette cellule Aucun logo text displayed in the combo box when a template has no logo - + Aucun logo Édition d'une cellule : %1 label of and undo command when editing a cell - + Édition d'une cellule : %1 Par défaut, les variables suivantes sont disponibles :<ul><li>%{author} : auteur du folio</li><li>%{date} : date du folio</li><li>%{title} : titre du folio</li><li>%{filename} : nom de fichier du projet</li><li>%{plant} : nom de l'installation (=) dans laquelle se trouve le folio</li><li>%{locmach} : nom de la localisation (+) dans laquelle se trouve le folio</li><li>%{indexrev} : indice de révision du folio</li><li>%{version} : version du logiciel</li><li>%{folio} : numéro du folio</li><li>%{folio-id} : position du folio dans le projet</li><li>%{folio-total} : nombre total de folios dans le projet</li><li>%{previous-folio-num} : numéro du folio précédent</li><li>%{next-folio-num} : numéro du folio suivant</li><li>%{projecttitle} : titre du projet</li><li>%{projectpath} : chemin du projet</li><li>%{projectfilename} : nom du fichier</li><li>%{saveddate} : date d'enregistrement du fichier format local</li><li>%{saveddate-eu} : date d'enregistrement du fichier format dd-MM-yyyy</li><li>%{saveddate-us} : date d'enregistrement du fichier format yyyy-MM-dd</li><li>%{savedtime} : heure d'enregistrement du fichier</li><li>%{savedfilename} : nom du fichier enregistré</li><li>%{savedfilepath} : chemin du fichier enregistré</li></ul> - + Par défaut, les variables suivantes sont disponibles :<ul><li>%{author} : auteur du folio</li><li>%{date} : date du folio</li><li>%{title} : titre du folio</li><li>%{filename} : nom de fichier du projet</li><li>%{plant} : nom de l'installation (=) dans laquelle se trouve le folio</li><li>%{locmach} : nom de la localisation (+) dans laquelle se trouve le folio</li><li>%{indexrev} : indice de révision du folio</li><li>%{version} : version du logiciel</li><li>%{folio} : numéro du folio</li><li>%{folio-id} : position du folio dans le projet</li><li>%{folio-total} : nombre total de folios dans le projet</li><li>%{previous-folio-num} : numéro du folio précédent</li><li>%{next-folio-num} : numéro du folio suivant</li><li>%{projecttitle} : titre du projet</li><li>%{projectpath} : chemin du projet</li><li>%{projectfilename} : nom du fichier</li><li>%{saveddate} : date d'enregistrement du fichier format local</li><li>%{saveddate-eu} : date d'enregistrement du fichier format dd-MM-yyyy</li><li>%{saveddate-us} : date d'enregistrement du fichier format yyyy-MM-dd</li><li>%{savedtime} : heure d'enregistrement du fichier</li><li>%{savedfilename} : nom du fichier enregistré</li><li>%{savedfilepath} : chemin du fichier enregistré</li></ul> Chaque cellule d'un cartouche affiche une valeur, optionnellement précédée d'un label. Tous deux peuvent être traduits en plusieurs langues.<br/>Comme ce que vous éditez actuellement est un <em>modèle</em> de cartouche, ne saisissez pas directement des données brutes : insérez plutôt des variables sous la forme %{nom-de-variable}, qui seront ensuite remplacées par les valeurs adéquates sur le folio. - + Chaque cellule d'un cartouche affiche une valeur, optionnellement précédée d'un label. Tous deux peuvent être traduits en plusieurs langues.<br/>Comme ce que vous éditez actuellement est un <em>modèle</em> de cartouche, ne saisissez pas directement des données brutes : insérez plutôt des variables sous la forme %{nom-de-variable}, qui seront ensuite remplacées par les valeurs adéquates sur le folio. @@ -19870,14 +20100,15 @@ associer le nom "volta" et la valeur "1745" remplacera %{vol Supprimer le modèle de cartouche ? message box title - + Supprimer le modèle de cartouche ? Êtes-vous sûr de vouloir supprimer ce modèle de cartouche (%1) ? message box content - + Êtes-vous sûr de vouloir supprimer ce modèle de cartouche (%1) ? + @@ -19886,13 +20117,13 @@ associer le nom "volta" et la valeur "1745" remplacera %{vol Collection parente used in save as form - + Collection parente Modèle existant used in save as form - + Modèle existant @@ -19901,13 +20132,13 @@ associer le nom "volta" et la valeur "1745" remplacera %{vol ou nouveau nom used in save as form - + ou nouveau nom Nouveau modèle (entrez son nom) combox box entry - + Nouveau modèle (entrez son nom) @@ -19915,125 +20146,125 @@ associer le nom "volta" et la valeur "1745" remplacera %{vol Gestionnaire de logos - + Gestionnaire de logos Logos embarqués dans ce modèle : - + Logos embarqués dans ce modèle : Ajouter un logo - + Ajouter un logo Exporter ce logo - + Exporter ce logo Supprimer ce logo - + Supprimer ce logo Propriétés - + Propriétés Nom : - + Nom : Renommer - + Renommer Type : - + Type : Logo déjà existant - + Logo déjà existant Remplacer - + Remplacer Il existe déjà un logo portant le nom "%1" au sein de ce modèle de cartouche. Voulez-vous le remplacer ou préférez-vous spécifier un autre nom pour ce nouveau logo ? - + Il existe déjà un logo portant le nom "%1" au sein de ce modèle de cartouche. Voulez-vous le remplacer ou préférez-vous spécifier un autre nom pour ce nouveau logo ? Type : %1 - + Type : %1 Choisir une image / un logo - + Choisir une image / un logo Images vectorielles (*.svg);;Images bitmap (*.png *.jpg *.jpeg *.gif *.bmp *.xpm);;Tous les fichiers (*) - + Images vectorielles (*.svg);;Images bitmap (*.png *.jpg *.jpeg *.gif *.bmp *.xpm);;Tous les fichiers (*) Erreur - + Erreur Impossible d'ouvrir le fichier spécifié - + Impossible d'ouvrir le fichier spécifié Choisir un fichier pour exporter ce logo - + Choisir un fichier pour exporter ce logo Tous les fichiers (*);;Images vectorielles (*.svg);;Images bitmap (*.png *.jpg *.jpeg *.gif *.bmp *.xpm) - + Tous les fichiers (*);;Images vectorielles (*.svg);;Images bitmap (*.png *.jpg *.jpeg *.gif *.bmp *.xpm) Impossible d'exporter vers le fichier spécifié - + Impossible d'exporter vers le fichier spécifié Renommer un logo - + Renommer un logo Vous devez saisir un nouveau nom. - + Vous devez saisir un nouveau nom. Le nouveau nom ne peut pas être vide. - + Le nouveau nom ne peut pas être vide. Le nom saisi est déjà utilisé par un autre logo. - + Le nom saisi est déjà utilisé par un autre logo. @@ -20042,153 +20273,158 @@ associer le nom "volta" et la valeur "1745" remplacera %{vol Changer la largeur de la colonne window title when changing a column with - + Changer la largeur de la colonne Largeur : text before the spinbox to change a column width - + Largeur : Changer la hauteur de la ligne window title when changing a row height - + Changer la hauteur de la ligne Hauteur : text before the spinbox to change a row height - + Hauteur : Ajouter une colonne (avant) context menu - + Ajouter une colonne (avant) Ajouter une ligne (avant) context menu - + Ajouter une ligne (avant) Ajouter une colonne (après) context menu - + Ajouter une colonne (après) Ajouter une ligne (après) context menu - + Ajouter une ligne (après) Modifier les dimensions de cette colonne context menu - + Modifier les dimensions de cette colonne Modifier les dimensions de cette ligne context menu - + Modifier les dimensions de cette ligne Supprimer cette colonne context menu - + Supprimer cette colonne Supprimer cette ligne context menu - + Supprimer cette ligne Modifier la largeur de cet aperçu context menu - + Modifier la largeur de cet aperçu [%1px] content of the extra cell added when the total width of cells is less than the preview width - + [%1px] [%1px] content of the extra helper cell added when the total width of cells is greater than the preview width - + [%1px] %1px format displayed in rows helper cells - + %1px %1px - + %1px Changer la largeur de l'aperçu - + Changer la largeur de l'aperçu Largeur de l'aperçu : - + Largeur de l'aperçu : Attention : la somme des largeurs relatives dépasse 100%% de la largeur totale, ce modèle de cartouche ne peut être satisfait par aucune largeur. tooltip warning shown when a template's relative-to-total-length columns alone already exceed 100%% of the total width - + Attention : la somme des largeurs relatives dépasse 100%% de la largeur totale, ce modèle de cartouche ne peut être satisfait par aucune largeur. + Attention : les colonnes de largeur fixe ne peuvent pas tenir dans la largeur restante, ce modèle de cartouche ne peut être satisfait par aucune largeur. tooltip warning shown when a template's relative-to-total-length columns already consume all available width, leaving no room for its fixed-width columns - + Attention : les colonnes de largeur fixe ne peuvent pas tenir dans la largeur restante, ce modèle de cartouche ne peut être satisfait par aucune largeur. + Longueur minimale : %1px tooltip showing the minimum width of the edited template - + Longueur minimale : %1px + Longueur maximale : %1px tooltip showing the maximum width of the edited template - + Longueur maximale : %1px + Longueur non contrainte. tooltip shown when the edited template has neither a minimum nor a maximum width constraint - + Longueur non contrainte. + Largeur totale pour cet aperçu : %1px displayed at the top of the preview when editing a title block template - + Largeur totale pour cet aperçu : %1px @@ -20197,13 +20433,13 @@ associer le nom "volta" et la valeur "1745" remplacera %{vol Cartouches du projet sans titre (id %1) collection title when the parent project has an empty title -- %1 is the project internal id - + Cartouches du projet sans titre (id %1) Cartouches du projet "%1" collection title when the project has a suitable title -- %1 is the project title - + Cartouches du projet "%1" @@ -20212,37 +20448,37 @@ associer le nom "volta" et la valeur "1745" remplacera %{vol Liste de câblage window title - + Liste de câblage Fil column title - + Fil Composant 1 column title - + Composant 1 Borne 1 column title - + Borne 1 Composant 2 column title - + Composant 2 Borne 2 column title - + Borne 2 @@ -20256,8 +20492,8 @@ associer le nom "volta" et la valeur "1745" remplacera %{vol %n conducteur(s) listé(s). wiring list summary - - + %n conducteur(s) listé(s). + %n conducteur(s) listé(s). @@ -20265,8 +20501,8 @@ associer le nom "volta" et la valeur "1745" remplacera %{vol %n conducteur(s) exclu(s) : une extrémité n'est rattachée à aucun élément. wiring list exclusion warning - - + %n conducteur(s) exclu(s) : une extrémité n'est rattachée à aucun élément. + %n conducteur(s) exclu(s) : une extrémité n'est rattachée à aucun élément. @@ -20276,97 +20512,97 @@ associer le nom "volta" et la valeur "1745" remplacera %{vol Erreur - + Erreur Impossible de lire la structure en mémoire du projet. - + Impossible de lire la structure en mémoire du projet. Exporter le plan de câblage - + Exporter le plan de câblage Fichiers CSV (*.csv) - + Fichiers CSV (*.csv) Impossible d'ouvrir le fichier pour l'écriture. - + Impossible d'ouvrir le fichier pour l'écriture. Page Wiring list CSV header - + Page Composant 1 Wiring list CSV header - + Composant 1 Borne 1 Wiring list CSV header - + Borne 1 Composant 2 Wiring list CSV header - + Composant 2 Borne 2 Wiring list CSV header - + Borne 2 Tension / Protocole Wiring list CSV header - + Tension / Protocole Couleur du fil Wiring list CSV header - + Couleur du fil Section du fil Wiring list CSV header - + Section du fil Fonction Wiring list CSV header - + Fonction Câble Wiring list CSV header - + Câble Export réussi - + Export réussi Le plan de câblage a été exporté avec succès ! - + Le plan de câblage a été exporté avec succès ! @@ -20374,12 +20610,12 @@ associer le nom "volta" et la valeur "1745" remplacera %{vol Avertissement - + Avertissement <b>Les règles de conducteurs par borne sont une fonction expérimentale.</b><br><br>Elles comptent les conducteurs tels que QElectroTech les représente aujourd'hui. Elles pourraient changer, et vos réglages devoir être refaits, si les fils et les conducteurs deviennent des objets distincts dans une version future.<br><br>Toutes ces règles peuvent être désactivées dans Configurer QElectroTech > Général. - + <b>Les règles de conducteurs par borne sont une fonction expérimentale.</b><br><br>Elles comptent les conducteurs tels que QElectroTech les représente aujourd'hui. Elles pourraient changer, et vos réglages devoir être refaits, si les fils et les conducteurs deviennent des objets distincts dans une version future.<br><br>Toutes ces règles peuvent être désactivées dans Configurer QElectroTech > Général. @@ -20387,22 +20623,22 @@ associer le nom "volta" et la valeur "1745" remplacera %{vol Form - + Form Type : - + Type : Représentation: - + Représentation: Positionner : - + Positionner : @@ -20432,62 +20668,62 @@ associer le nom "volta" et la valeur "1745" remplacera %{vol Distance label - slave : - + Distance label - slave : Distance in pixels between the label and the slave cross reference - + Distance in pixels between the label and the slave cross reference Afficher les numéros de bornes dans les Xrefs - + Afficher les numéros de bornes dans les Xrefs Afficher dans le peigne de contacts tous les contacts esclaves définis par le maître, même ceux qui ne sont pas encore reliés, dans l'ordre défini par le maître - + Afficher dans le peigne de contacts tous les contacts esclaves définis par le maître, même ceux qui ne sont pas encore reliés, dans l'ordre défini par le maître Afficher tous les esclaves définis par le maître - + Afficher tous les esclaves définis par le maître Affiche&r en contacts - + Affiche&r en contacts Afficher en croix - + Afficher en croix Label des références croisées - + Label des références croisées Maitre - + Maitre %f-%l%c - + %f-%l%c Esclave - + Esclave (%f-%l%c) - + (%f-%l%c) @@ -20498,62 +20734,68 @@ associer le nom "volta" et la valeur "1745" remplacera %{vol %c : le numéro de colonne %M: Installation %LM: Localisation - + Créer votre propre texte en vous aidant des variables suivantes : +%f : le numéro de folio +%F: le label de folio +%l : le numéro de ligne +%c : le numéro de colonne +%M: Installation +%LM: Localisation Option d'affichage en croix - + Option d'affichage en croix Afficher les contacts de puissance dans la croix - + Afficher les contacts de puissance dans la croix Préfixe des contacts de puissance : - + Préfixe des contacts de puissance : Préfixe des contacts temporisés : - + Préfixe des contacts temporisés : Préfixe des contacts inverseurs : - + Préfixe des contacts inverseurs : Bobine - + Bobine Organe de protection - + Organe de protection Commutateur / bouton - + Commutateur / bouton Automate (PLC) - + Automate (PLC) En bas de page - + En bas de page Sous le label de l'élément - + Sous le label de l'élément @@ -20583,7 +20825,7 @@ associer le nom "volta" et la valeur "1745" remplacera %{vol Champ de texte - + Champ de texte @@ -20591,27 +20833,27 @@ associer le nom "volta" et la valeur "1745" remplacera %{vol La requête est vide. - + La requête est vide. Une seule requête SELECT est autorisée (le caractère ';' ne peut apparaître qu'à la toute fin). - + Une seule requête SELECT est autorisée (le caractère ';' ne peut apparaître qu'à la toute fin). Seules les requêtes en lecture seule (SELECT ou WITH ... SELECT) sont autorisées. - + Seules les requêtes en lecture seule (SELECT ou WITH ... SELECT) sont autorisées. Exporter la base de données interne du projet - + Exporter la base de données interne du projet sans_nom - + sans_nom @@ -20645,12 +20887,12 @@ associer le nom "volta" et la valeur "1745" remplacera %{vol Source - + Source &OK - + &OK @@ -20663,24 +20905,24 @@ associer le nom "volta" et la valeur "1745" remplacera %{vol Texte en gras - + Texte en gras Éditeur de texte - + Éditeur de texte Texte en italique - + Texte en italique Texte souligé - + Texte souligé @@ -20705,22 +20947,22 @@ associer le nom "volta" et la valeur "1745" remplacera %{vol Superscript - + Superscript Subscript - + Subscript Insérer un lien - + Insérer un lien Insert &Image - + Insert &Image @@ -20733,27 +20975,27 @@ associer le nom "volta" et la valeur "1745" remplacera %{vol Rechercher/Remplacer avancé - + Rechercher/Remplacer avancé par : - + par : Remplacer : - + Remplacer : Qui : - + Qui : Texte ou expression régulière - + Texte ou expression régulière @@ -20763,22 +21005,22 @@ associer le nom "volta" et la valeur "1745" remplacera %{vol Élément - + Élément Conducteur - + Conducteur Texte indépendant - + Texte indépendant Quoi : - + Quoi : diff --git a/misc/i18n/fixtures/mirror_after.ts b/misc/i18n/fixtures/mirror_after.ts new file mode 100644 index 000000000..c83caeb28 --- /dev/null +++ b/misc/i18n/fixtures/mirror_after.ts @@ -0,0 +1,84 @@ + + + + + Alpha + + + Ouvrir le projet + Ouvrir le projet + + + + Fermer le projet + Fermer le projet + + + + Apply to Entire Project + Appliquer au projet entier + + + + QElectroTech + QElectroTech + + + + Brouillon + Brouillon (à revoir) + + + + %n élément(s) + + %n élément + %n élément(s) + + + + + %n conducteur(s) + + %n conducteur(s) + %n conducteur(s) + + + + Ancien texte + Ancien texte + + + Autre ancien texte + + + + + Beta + + + <b>%1</b> : %2 + <b>%1</b> : %2 + + + + &Aide + menu + &Aide + + + + l'élément "x" + l'élément "x" + + + + Ligne 1 +Ligne 2 + + Ligne 1 +Ligne 2 + + + + diff --git a/misc/i18n/fixtures/mirror_before.ts b/misc/i18n/fixtures/mirror_before.ts new file mode 100644 index 000000000..48e1aaf4d --- /dev/null +++ b/misc/i18n/fixtures/mirror_before.ts @@ -0,0 +1,82 @@ + + + + + Alpha + + + Ouvrir le projet + + + + + Fermer le projet + + + + + Apply to Entire Project + Appliquer au projet entier + + + + QElectroTech + QElectroTech + + + + Brouillon + Brouillon (à revoir) + + + + %n élément(s) + + %n élément + + + + + + %n conducteur(s) + + + + + + + Ancien texte + Ancien texte + + + Autre ancien texte + + + + + Beta + + + <b>%1</b> : %2 + + + + + &Aide + menu + + + + + l'élément "x" + + + + + Ligne 1 +Ligne 2 + + + + + diff --git a/misc/i18n/mirror_source_language.py b/misc/i18n/mirror_source_language.py new file mode 100755 index 000000000..2f7c7e469 --- /dev/null +++ b/misc/i18n/mirror_source_language.py @@ -0,0 +1,211 @@ +#!/usr/bin/env python3 +# Copyright 2006-2026 The QElectroTech Team +# This file is part of QElectroTech. +# +# QElectroTech is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# QElectroTech is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with QElectroTech. If not, see . +""" +mirror_source_language.py — give every source-language string its own +translation in the source language's .ts file. + + python3 misc/i18n/mirror_source_language.py lang/qet_fr.ts + python3 misc/i18n/mirror_source_language.py --check lang/qet_fr.ts + +WHY THIS EXISTS + +The strings in the code are French, and they are both the translation +key and the text the French UI shows. lang/qet_fr.ts was almost empty: +an empty entry falls back to the code text at run time, so French never +needed a translation. The price is that a French wording fix is a key +change, which orphans the translation of that string in every other +language file. + +With every French string mirrored into qet_fr.ts, the French UI is +served from qet_fr.qm like any other language, and French wording can +be corrected in the .ts alone. The key in the code then only has to +stay stable. + +WHAT IT DOES + +For every message whose translation is empty, the source text is copied +into the translation and the entry is finished. Nothing else changes: + + - a translation with text is never touched, whether it is a French + rendering of an English source, identical to the source, or marked + unfinished (a translator's work in progress); + - vanished and obsolete entries are left to lupdate; + - in a plural message only the empty s are filled; + - the file stays byte-identical outside the rewritten + elements: header, locations, comments, indentation, escaping. + +The source text is copied as lupdate wrote it, escaping included, so +' stays '. A with a child element (lupdate's ) +is refused rather than guessed at. + +Run it after `cmake --build . --target update_translations`, before +committing. Forgetting it breaks nothing: an empty entry still falls +back to the code text, and the next run fills it. `--check` exits 1 +when a run would change the file, so it can gate a commit. +""" + +from __future__ import annotations + +import argparse +import re +import sys +from dataclasses import dataclass +from pathlib import Path +import xml.etree.ElementTree as ET + +MESSAGE_RE = re.compile(r"[^>]*)>(?P.*?)", re.S) +SOURCE_RE = re.compile(r"(?P.*?)", re.S) +TRANSLATION_RE = re.compile( + r"[^>]*)>(?P.*?)", re.S) +FORM_RE = re.compile(r"(?P.*?)", re.S) +TYPE_RE = re.compile(r'\s*type="(?P[^"]*)"') + +# lupdate's own layout: at 8 spaces, at 12. +FORM_INDENT = " " * 12 +CLOSE_INDENT = " " * 8 + + +class SourceError(ValueError): + """A that cannot be copied verbatim.""" + + +@dataclass +class Stats: + mirrored_messages: int = 0 + mirrored_forms: int = 0 + unfinished_cleared: int = 0 + kept_translated: int = 0 + kept_identical: int = 0 + kept_vanished: int = 0 + kept_unfinished_with_text: int = 0 + + def changed(self) -> bool: + return self.mirrored_messages > 0 + + def summary(self) -> str: + return ( + f"mirrored {self.mirrored_messages} message(s), " + f"{self.mirrored_forms} plural form(s), " + f"cleared {self.unfinished_cleared} unfinished flag(s); kept " + f"{self.kept_translated} translated, {self.kept_identical} identical, " + f"{self.kept_vanished} vanished, " + f"{self.kept_unfinished_with_text} unfinished with text") + + +def _translation_type(attrs: str) -> str: + m = TYPE_RE.search(attrs) + return m.group("type") if m else "" + + +def _mirror_message(match: re.Match, forms: int, stats: Stats) -> str: + whole = match.group(0) + attrs, body = match.group("attrs"), match.group("body") + numerus = 'numerus="yes"' in attrs + sm = SOURCE_RE.search(body) + tm = TRANSLATION_RE.search(body) + if sm is None or tm is None: + return whole + source = sm.group("text") + if "<" in source: + raise SourceError( + "a contains a child element and cannot be copied: " + + source[:60]) + tattrs, tbody = tm.group("attrs"), tm.group("body") + ttype = _translation_type(tattrs) + if ttype in ("vanished", "obsolete"): + stats.kept_vanished += 1 + return whole + + if numerus: + found = FORM_RE.findall(tbody) + empty = [f for f in found if f == ""] + if found and not empty: + if ttype == "unfinished": + stats.kept_unfinished_with_text += 1 + elif all(f == source for f in found): + stats.kept_identical += 1 + else: + stats.kept_translated += 1 + return whole + if found: + new_body = FORM_RE.sub( + lambda f: f.group(0) if f.group("text") != "" + else f"{source}", tbody) + stats.mirrored_forms += len(empty) + else: + new_body = "\n" + "".join( + f"{FORM_INDENT}{source}\n" + for _ in range(forms)) + CLOSE_INDENT + stats.mirrored_forms += forms + else: + if tbody != "": + if ttype == "unfinished": + stats.kept_unfinished_with_text += 1 + elif tbody == source: + stats.kept_identical += 1 + else: + stats.kept_translated += 1 + return whole + new_body = source + + stats.mirrored_messages += 1 + if ttype == "unfinished": + stats.unfinished_cleared += 1 + kept_attrs = TYPE_RE.sub("", tattrs) + new_translation = f"{new_body}" + new_message_body = body[:tm.start()] + new_translation + body[tm.end():] + return f"{new_message_body}" + + +def mirror_text(text: str, forms: int = 2) -> tuple[str, Stats]: + """Return the mirrored .ts text and what was done to it.""" + stats = Stats() + new = MESSAGE_RE.sub(lambda m: _mirror_message(m, forms, stats), text) + return new, stats + + +def main(argv: list[str] | None = None) -> int: + parser = argparse.ArgumentParser( + description="Copy each empty translation's source text into the " + "translation of a source-language .ts file.") + parser.add_argument("ts", type=Path, help="the .ts file, e.g. lang/qet_fr.ts") + parser.add_argument("--check", action="store_true", + help="change nothing; exit 1 if a run would change the file") + parser.add_argument("--forms", type=int, default=2, + help="plural forms to write when a plural message has " + "none (default 2, French)") + args = parser.parse_args(argv) + + with open(args.ts, encoding="utf-8", newline="") as f: + text = f.read() + try: + new, stats = mirror_text(text, args.forms) + ET.fromstring(new.encode("utf-8")) + except (SourceError, ET.ParseError) as e: + print(f"{args.ts}: {e}", file=sys.stderr) + return 2 + print(f"{args.ts}: {stats.summary()}") + if args.check: + return 1 if stats.changed() else 0 + if new != text: + with open(args.ts, "w", encoding="utf-8", newline="") as f: + f.write(new) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/misc/i18n/test_mirror_source_language.py b/misc/i18n/test_mirror_source_language.py new file mode 100755 index 000000000..92aa1ffa2 --- /dev/null +++ b/misc/i18n/test_mirror_source_language.py @@ -0,0 +1,198 @@ +#!/usr/bin/env python3 +""" +Regression suite for mirror_source_language.py. + + python3 misc/i18n/test_mirror_source_language.py + +The fixtures are a hand-written pair: mirror_before.ts is what lupdate +leaves behind, mirror_after.ts is what the script must produce from it, +byte for byte. Every message class the script distinguishes appears +once in the pair, so a change in behaviour shows up as a diff in a +known place. + +The last test looks at the repository's own lang/qet_fr.ts and fails +when it needs a mirror run: that is the maintenance rule from +INSTALL.md, kept honest. +""" + +from __future__ import annotations + +import os +import re +import subprocess +import sys +import tempfile +import unittest +import xml.etree.ElementTree as ET +from pathlib import Path + +HERE = Path(__file__).resolve().parent +sys.path.insert(0, str(HERE)) +import mirror_source_language as m # noqa: E402 + +SCRIPT = HERE / "mirror_source_language.py" +BEFORE = HERE / "fixtures" / "mirror_before.ts" +AFTER = HERE / "fixtures" / "mirror_after.ts" +REPO_FR = HERE.parent.parent / "lang" / "qet_fr.ts" + + +def read(path: Path) -> str: + with open(path, encoding="utf-8", newline="") as f: + return f.read() + + +def messages(text: str) -> dict[tuple[str, str], ET.Element]: + """(context, source) -> element.""" + out = {} + for ctx in ET.fromstring(text.encode("utf-8")).iter("context"): + name = ctx.findtext("name") + for msg in ctx.iter("message"): + out[(name, msg.findtext("source"))] = msg + return out + + +TRANSLATION_RE = re.compile(r"]*>.*?", re.S) + + +def outside_translations(text: str) -> str: + """The file with every element blanked out.""" + return TRANSLATION_RE.sub("", text) + + +class MirrorText(unittest.TestCase): + def test_nothing_to_do_is_byte_identical(self): + after = read(AFTER) + out, stats = m.mirror_text(after) + self.assertEqual(out, after) + self.assertEqual(stats.mirrored_messages, 0) + self.assertEqual(stats.mirrored_forms, 0) + self.assertEqual(stats.unfinished_cleared, 0) + + def test_before_becomes_after(self): + out, stats = m.mirror_text(read(BEFORE)) + self.assertEqual(out, read(AFTER)) + self.assertEqual(stats.mirrored_messages, 8) + self.assertEqual(stats.mirrored_forms, 3) + self.assertEqual(stats.unfinished_cleared, 2) + self.assertEqual(stats.kept_translated, 1) + self.assertEqual(stats.kept_identical, 1) + self.assertEqual(stats.kept_vanished, 2) + self.assertEqual(stats.kept_unfinished_with_text, 1) + + def test_nothing_outside_translation_elements_changes(self): + """Header, locations, comments, sources and indentation are untouched.""" + self.assertEqual(outside_translations(read(BEFORE)), + outside_translations(read(AFTER))) + + def test_idempotent(self): + once, _ = m.mirror_text(read(BEFORE)) + twice, stats = m.mirror_text(once) + self.assertEqual(once, twice) + self.assertFalse(stats.changed()) + + def test_untouched_classes(self): + before, after = messages(read(BEFORE)), messages(read(AFTER)) + for key in [("Alpha", "Apply to Entire Project"), # English source, translated + ("Alpha", "QElectroTech"), # identical + ("Alpha", "Brouillon"), # unfinished with text + ("Alpha", "Ancien texte"), # vanished with text + ("Alpha", "Autre ancien texte")]: # vanished, empty + self.assertEqual(ET.tostring(before[key]), ET.tostring(after[key]), key) + self.assertEqual(after[("Alpha", "Brouillon")].find("translation").get("type"), + "unfinished") + + def test_escaping_is_copied_verbatim(self): + """' must stay ', never become &apos; (a re-escape bug).""" + out, _ = m.mirror_text(read(BEFORE)) + for raw in ("<b>%1</b> : %2", + "&Aide", + "l'élément "x""): + self.assertIn(raw, out) + for key, msg in messages(out).items(): + tr = msg.find("translation") + if key[0] == "Beta": + self.assertEqual(tr.text, msg.findtext("source"), key) + + def test_multiline_and_spaces_kept(self): + out, _ = m.mirror_text(read(BEFORE)) + self.assertIn(" Ligne 1\nLigne 2\n", out) + + def test_plural_half_empty_fills_only_the_empty_form(self): + out, _ = m.mirror_text(read(BEFORE)) + forms = [f.text for f in messages(out)[("Alpha", "%n élément(s)")] + .find("translation").iter("numerusform")] + self.assertEqual(forms, ["%n élément", "%n élément(s)"]) + + def test_plural_both_empty_fills_both_and_clears_unfinished(self): + out, _ = m.mirror_text(read(BEFORE)) + tr = messages(out)[("Alpha", "%n conducteur(s)")].find("translation") + self.assertIsNone(tr.get("type")) + self.assertEqual([f.text for f in tr.iter("numerusform")], + ["%n conducteur(s)", "%n conducteur(s)"]) + + def test_plural_without_forms_gets_default_forms(self): + text = ('C\n' + ' %n x\n' + ' \n' + ' ') + out, stats = m.mirror_text(text, forms=3) + self.assertEqual(stats.mirrored_forms, 3) + self.assertEqual(out.count("%n x"), 3) + self.assertNotIn("unfinished", out) + ET.fromstring(out) + + def test_source_with_child_element_is_refused(self): + text = ('C\n' + ' ab\n' + ' \n' + ' ') + with self.assertRaises(m.SourceError): + m.mirror_text(text) + + +class CommandLine(unittest.TestCase): + def run_script(self, *args): + return subprocess.run([sys.executable, str(SCRIPT), *args], + capture_output=True, text=True) + + def copy(self, src: Path) -> Path: + d = tempfile.mkdtemp() + dst = Path(d) / src.name + dst.write_bytes(src.read_bytes()) + self.addCleanup(lambda: (dst.unlink(), os.rmdir(d))) + return dst + + def test_check_exit_codes(self): + self.assertEqual(self.run_script("--check", str(BEFORE)).returncode, 1) + self.assertEqual(self.run_script("--check", str(AFTER)).returncode, 0) + self.assertEqual(read(BEFORE).count(""), 5, + "--check must not write") + + def test_rewrite_then_check_passes(self): + tmp = self.copy(BEFORE) + r = self.run_script(str(tmp)) + self.assertEqual(r.returncode, 0, r.stderr) + self.assertIn("mirrored 8 message(s), 3 plural form(s)", r.stdout) + self.assertEqual(read(tmp), read(AFTER)) + self.assertEqual(self.run_script("--check", str(tmp)).returncode, 0) + + def test_child_element_exits_2_and_leaves_file(self): + tmp = self.copy(BEFORE) + bad = read(tmp).replace("Ouvrir le projet", + 'ab') + tmp.write_text(bad, encoding="utf-8", newline="") + r = self.run_script(str(tmp)) + self.assertEqual(r.returncode, 2) + self.assertIn("child element", r.stderr) + self.assertEqual(read(tmp), bad) + + @unittest.skipUnless(REPO_FR.is_file(), "lang/qet_fr.ts not found next to the tool") + def test_repository_french_file_is_mirrored(self): + """The maintenance rule: run the mirror after update_translations.""" + r = self.run_script("--check", str(REPO_FR)) + self.assertEqual(r.returncode, 0, + f"lang/qet_fr.ts needs a mirror run:\n{r.stdout}") + + +if __name__ == "__main__": + unittest.main() From f32d9365e5e6a81db08dd025101efcda38cf6e77 Mon Sep 17 00:00:00 2001 From: Beat Hangartner Date: Wed, 7 Oct 2026 10:08:03 +0200 Subject: [PATCH 02/22] Finish unfinished French entries that equal their source After a lupdate refresh, the same-text heuristic fills a new string with the translation of an existing identical one and marks it unfinished. In the source-language file that guess is the source text itself, which is exactly what a mirror run writes, but the script left it alone as "work in progress": 39 such entries stayed unfinished in qet_fr.ts after refreshing it on 2026-10-07. The script now finishes an unfinished translation (or plural with all forms) that is identical to its source. Unfinished translations with other text stay untouched. Two fixture messages and a test cover it. Co-Authored-By: Claude Opus 5.5 --- misc/i18n/fixtures/mirror_after.ts | 13 ++++++++++++ misc/i18n/fixtures/mirror_before.ts | 13 ++++++++++++ misc/i18n/mirror_source_language.py | 26 ++++++++++++++++++++++-- misc/i18n/test_mirror_source_language.py | 14 ++++++++++++- 4 files changed, 63 insertions(+), 3 deletions(-) diff --git a/misc/i18n/fixtures/mirror_after.ts b/misc/i18n/fixtures/mirror_after.ts index c83caeb28..0309fd987 100644 --- a/misc/i18n/fixtures/mirror_after.ts +++ b/misc/i18n/fixtures/mirror_after.ts @@ -28,6 +28,19 @@ Brouillon Brouillon (à revoir) + + + Copier + Copier + + + + %n page(s) + + %n page(s) + %n page(s) + + %n élément(s) diff --git a/misc/i18n/fixtures/mirror_before.ts b/misc/i18n/fixtures/mirror_before.ts index 48e1aaf4d..613011833 100644 --- a/misc/i18n/fixtures/mirror_before.ts +++ b/misc/i18n/fixtures/mirror_before.ts @@ -28,6 +28,19 @@ Brouillon Brouillon (à revoir) + + + Copier + Copier + + + + %n page(s) + + %n page(s) + %n page(s) + + %n élément(s) diff --git a/misc/i18n/mirror_source_language.py b/misc/i18n/mirror_source_language.py index 2f7c7e469..dab5a9b1a 100755 --- a/misc/i18n/mirror_source_language.py +++ b/misc/i18n/mirror_source_language.py @@ -42,7 +42,11 @@ into the translation and the entry is finished. Nothing else changes: - a translation with text is never touched, whether it is a French rendering of an English source, identical to the source, or marked - unfinished (a translator's work in progress); + unfinished (a translator's work in progress), with one exception: + an unfinished translation identical to its source is finished. + That is what lupdate's same-text heuristic leaves behind when a new + string repeats an existing one, and it is what a mirror run would + have written anyway; - vanished and obsolete entries are left to lupdate; - in a plural message only the empty s are filled; - the file stays byte-identical outside the rewritten @@ -87,6 +91,7 @@ class SourceError(ValueError): class Stats: mirrored_messages: int = 0 mirrored_forms: int = 0 + finished_identical: int = 0 unfinished_cleared: int = 0 kept_translated: int = 0 kept_identical: int = 0 @@ -94,12 +99,13 @@ class Stats: kept_unfinished_with_text: int = 0 def changed(self) -> bool: - return self.mirrored_messages > 0 + return self.mirrored_messages > 0 or self.finished_identical > 0 def summary(self) -> str: return ( f"mirrored {self.mirrored_messages} message(s), " f"{self.mirrored_forms} plural form(s), " + f"finished {self.finished_identical} identical unfinished, " f"cleared {self.unfinished_cleared} unfinished flag(s); kept " f"{self.kept_translated} translated, {self.kept_identical} identical, " f"{self.kept_vanished} vanished, " @@ -111,6 +117,18 @@ def _translation_type(attrs: str) -> str: return m.group("type") if m else "" +def _finish(whole: str, body: str, tm: re.Match, tattrs: str, + stats: Stats) -> str: + """Drop the unfinished flag of a translation equal to its source.""" + stats.finished_identical += 1 + stats.unfinished_cleared += 1 + start = whole.index(body) + tm.start() + old = tm.group(0) + new = old.replace(f"", + f"", 1) + return whole[:start] + new + whole[start + len(old):] + + def _mirror_message(match: re.Match, forms: int, stats: Stats) -> str: whole = match.group(0) attrs, body = match.group("attrs"), match.group("body") @@ -134,6 +152,8 @@ def _mirror_message(match: re.Match, forms: int, stats: Stats) -> str: found = FORM_RE.findall(tbody) empty = [f for f in found if f == ""] if found and not empty: + if ttype == "unfinished" and all(f == source for f in found): + return _finish(whole, body, tm, tattrs, stats) if ttype == "unfinished": stats.kept_unfinished_with_text += 1 elif all(f == source for f in found): @@ -153,6 +173,8 @@ def _mirror_message(match: re.Match, forms: int, stats: Stats) -> str: stats.mirrored_forms += forms else: if tbody != "": + if ttype == "unfinished" and tbody == source: + return _finish(whole, body, tm, tattrs, stats) if ttype == "unfinished": stats.kept_unfinished_with_text += 1 elif tbody == source: diff --git a/misc/i18n/test_mirror_source_language.py b/misc/i18n/test_mirror_source_language.py index 92aa1ffa2..7b462d4e3 100755 --- a/misc/i18n/test_mirror_source_language.py +++ b/misc/i18n/test_mirror_source_language.py @@ -66,6 +66,7 @@ class MirrorText(unittest.TestCase): self.assertEqual(out, after) self.assertEqual(stats.mirrored_messages, 0) self.assertEqual(stats.mirrored_forms, 0) + self.assertEqual(stats.finished_identical, 0) self.assertEqual(stats.unfinished_cleared, 0) def test_before_becomes_after(self): @@ -73,7 +74,8 @@ class MirrorText(unittest.TestCase): self.assertEqual(out, read(AFTER)) self.assertEqual(stats.mirrored_messages, 8) self.assertEqual(stats.mirrored_forms, 3) - self.assertEqual(stats.unfinished_cleared, 2) + self.assertEqual(stats.finished_identical, 2) + self.assertEqual(stats.unfinished_cleared, 4) self.assertEqual(stats.kept_translated, 1) self.assertEqual(stats.kept_identical, 1) self.assertEqual(stats.kept_vanished, 2) @@ -113,6 +115,16 @@ class MirrorText(unittest.TestCase): if key[0] == "Beta": self.assertEqual(tr.text, msg.findtext("source"), key) + def test_unfinished_identical_to_source_is_finished(self): + """lupdate's same-text heuristic leaves these behind after a refresh; + 39 of them appeared in lang/qet_fr.ts on 2026-10-07.""" + out, _ = m.mirror_text(read(BEFORE)) + msgs = messages(out) + for key in [("Alpha", "Copier"), ("Alpha", "%n page(s)")]: + self.assertIsNone(msgs[key].find("translation").get("type"), key) + self.assertEqual(msgs[("Alpha", "Brouillon")].find("translation").get("type"), + "unfinished", "a different unfinished text stays unfinished") + def test_multiline_and_spaces_kept(self): out, _ = m.mirror_text(read(BEFORE)) self.assertIn(" Ligne 1\nLigne 2\n", out) From 8fa73f72a2334ece5711074c25f3969895c80952 Mon Sep 17 00:00:00 2001 From: Beat Hangartner Date: Wed, 7 Oct 2026 10:08:03 +0200 Subject: [PATCH 03/22] Refresh qet_fr.ts and mirror the strings added since 4 October lupdate over sources/ adds the 164 strings merged after the last translations update (da39ec1c8) and revives 3 entries it had wrongly marked vanished (the issue #1366 describes for English); the mirror script then fills the new ones. qet_fr.qm: 3792 finished, 0 unfinished, 0 null records. Co-Authored-By: Claude Fable 5.1 --- lang/qet_fr.ts | 3080 +++++++++++++++++++++++++++++++----------------- 1 file changed, 1998 insertions(+), 1082 deletions(-) diff --git a/lang/qet_fr.ts b/lang/qet_fr.ts index 872b72a3a..e7750a75b 100644 --- a/lang/qet_fr.ts +++ b/lang/qet_fr.ts @@ -1027,61 +1027,71 @@ Remarque: Ces options n'autorisent ou bloquent l'auto numérotation, s Formater en tant que liste de materiel - + + Bornes sans repère, désignation, fabricant ni référence fabricant + Bornes sans repère, désignation, fabricant ni référence fabricant + + + + Laisser de côté les jonctions + Laisser de côté les jonctions + + + Aperçu Aperçu - + nomenclature_ nomenclature_ - + Enregister sous... Enregister sous... - + Fichiers csv (*.csv) Fichiers csv (*.csv) - - + + Erreur Erreur - + Impossible d'enregistrer la nomenclature dans %1. %2 Impossible d'enregistrer la nomenclature dans %1. %2 - + Position Position - + Position du folio Position du folio - + Quantité numéro d'article Special field with name : designation quantity Quantité numéro d'article - + Requête refusée Requête refusée - + Erreur dans la requête : %1 Erreur dans la requête : @@ -1172,12 +1182,37 @@ Remarque: Ces options n'autorisent ou bloquent l'auto numérotation, s Colonnes : Colonnes : + + + Format : + Format : + + + + Règle les colonnes et les lignes pour que le folio, cartouche compris, ait la taille de ce format de papier, à 96 points par pouce comme l'export PDF. + Règle les colonnes et les lignes pour que le folio, cartouche compris, ait la taille de ce format de papier, à 96 points par pouce comme l'export PDF. + Afficher les en-têtes Afficher les en-têtes + + + Personnalisé + Personnalisé + + + + Paysage + Paysage + + + + Portrait + Portrait + ClickableImageLabel @@ -1834,6 +1869,15 @@ Continuer ? Supprimer cette propriété + + CustomizeDialog + + + Personnaliser + window title + Personnaliser + + DiagnosticsReportDialog @@ -1904,6 +1948,7 @@ Continuer ? + Couleur de fond du folio Couleur de fond du folio @@ -2128,224 +2173,224 @@ Continuer ? DiagramImageItem - + redimensionner redimensionner - + pivoter/incliner pivoter/incliner - + Cliquer : mode %1 Cliquer : mode %1 - + Glisser un coin/bord : redimensionner (Ctrl = depuis le centre, Maj = conserver les proportions) Glisser un coin/bord : redimensionner (Ctrl = depuis le centre, Maj = conserver les proportions) - + Glisser un coin : pivoter (Maj = par pas de 15°) ; glisser un bord : incliner (Maj = par pas de 15°) ; point rouge : déplacer le centre de rotation Glisser un coin : pivoter (Maj = par pas de 15°) ; glisser un bord : incliner (Maj = par pas de 15°) ; point rouge : déplacer le centre de rotation - + -- %1 : mode %2 -- %1 : mode %2 - + Cliquer Cliquer - + Glisser : redimensionner (Maj = conserver les proportions, Ctrl = depuis le centre) Glisser : redimensionner (Maj = conserver les proportions, Ctrl = depuis le centre) - + Glisser : pivoter (Maj = par pas de 15°) Glisser : pivoter (Maj = par pas de 15°) - + Glisser : incliner (Maj = par pas de 15°) Glisser : incliner (Maj = par pas de 15°) - + Glisser : déplacer le centre de rotation Glisser : déplacer le centre de rotation - + Redimensionner une image Redimensionner une image - + Faire pivoter une image Faire pivoter une image - + Incliner une image Incliner une image - + Déplacer le centre de rotation d'une image Déplacer le centre de rotation d'une image - + Modifier une image Modifier une image - + Restaurer les proportions d'une image Restaurer les proportions d'une image - - + + Enregistrer l'image sous... Enregistrer l'image sous... - - + + Enregistrer l'image d'origine sous... Enregistrer l'image d'origine sous... - + Image PNG (*.png) Image PNG (*.png) - + Image JPEG (*.jpg *.jpeg) Image JPEG (*.jpg *.jpeg) - + Image BMP (*.bmp) Image BMP (*.bmp) - + Image SVG (*.svg) Image SVG (*.svg) - + Tous les fichiers (*) Tous les fichiers (*) - + Transparence non conservée Transparence non conservée - + Ce format ne prend pas en charge la transparence : l'image sera enregistrée telle qu'elle était avant l'application de la couleur transparente. Continuer ? Ce format ne prend pas en charge la transparence : l'image sera enregistrée telle qu'elle était avant l'application de la couleur transparente. Continuer ? - + Échec de l'enregistrement Échec de l'enregistrement - + Impossible d'enregistrer l'image à cet emplacement. Impossible d'enregistrer l'image à cet emplacement. - + une image une image - + Remplacer l'image... Remplacer l'image... - + Couleur transparente... Couleur transparente... - + Rogner... Rogner... - + Miroir horizontal Miroir horizontal - + Miroir vertical Miroir vertical - + Restaurer les proportions Restaurer les proportions - + Selectionner une image... Selectionner une image... - + Image Files (*.png *.jpg *.jpeg *.bmp *.svg) Image Files (*.png *.jpg *.jpeg *.bmp *.svg) - + Erreur Erreur - + Impossible de charger l'image. Impossible de charger l'image. - + Remplacer une image Remplacer une image - + Miroir horizontal d'une image Miroir horizontal d'une image - + Miroir vertical d'une image Miroir vertical d'une image - + Définir une couleur transparente Définir une couleur transparente - + Rogner une image Rogner une image @@ -2362,99 +2407,122 @@ Continuer ? DiagramTextItem - + Maintenir ctrl pour un déplacement libre Maintenir ctrl pour un déplacement libre - + <Shift> to move Maintenir Maj et faire glisser pour déplacer ce texte seul + + DiagramToolbarSettings + + + Taille des poignées + Taille des poignées + + + + Grille des textes + Grille des textes + + + + Couleur de fond du folio + Couleur de fond du folio + + + + Couleur des conducteurs + Couleur des conducteurs + + DiagramView - + Ceci est la zone dans laquelle vous concevez vos schémas en y ajoutant des éléments et en posant des conducteurs entre leurs bornes. Il est également possible d'ajouter des textes indépendants. "What's this?" tip Ceci est la zone dans laquelle vous concevez vos schémas en y ajoutant des éléments et en posant des conducteurs entre leurs bornes. Il est également possible d'ajouter des textes indépendants. - + Coller ici context menu action Coller ici - + Collage multiple Collage multiple - + Créer un template context menu action Créer un template - + Générer une vignette d'armoire context menu action Générer une vignette d'armoire - + Renvoi de folio Renvoi de folio - + X: %1 Y: %2 X: %1 Y: %2 - + Connecter les bornes sélectionnées Connecter les bornes sélectionnées - + Sans titre what to display for untitled diagrams Sans titre - + Modèle enregistré Modèle enregistré - + Le modèle a été enregistré avec succès sous : %1 Le modèle a été enregistré avec succès sous : %1 - + Erreur Erreur - + Le fichier n'a pas pu être écrit. Le fichier n'a pas pu être écrit. - + Choisir la nouvelle couleur de ce conducteur Choisir la nouvelle couleur de ce conducteur - + Modifier les propriétés d'un conducteur undo caption Modifier les propriétés d'un conducteur @@ -2534,7 +2602,7 @@ Maintenir Maj et faire glisser pour déplacer ce texte seul Éditer un texte d'élément - + Redimensionner un texte d'élément Redimensionner un texte d'élément @@ -2830,7 +2898,7 @@ Maintenir Maj et faire glisser pour déplacer ce texte seul Formulaire - + Source du texte Source du texte @@ -2855,23 +2923,23 @@ Maintenir Maj et faire glisser pour déplacer ce texte seul Information de l'élément - + Encadrer le texte Encadrer le texte - + Texte composé Texte composé - + Police Police - + X X @@ -2886,79 +2954,89 @@ Maintenir Maj et faire glisser pour déplacer ce texte seul Tourner autour de son propre centre - + + Auto + Auto + + + + px + px + + + Y Y - + Alignement Alignement - + Rotation Rotation - - + + Déplacer un champ texte Déplacer un champ texte - + Pivoter un champ texte Pivoter un champ texte - + Modifier le texte d'un champ texte Modifier le texte d'un champ texte - - + + Modifier la police d'un champ texte Modifier la police d'un champ texte - + Modifier la couleur d'un champ texte Modifier la couleur d'un champ texte - + Modifier la conservation de l'angle Modifier la conservation de l'angle - + Modifier le point de rotation d'un champ texte Modifier le point de rotation d'un champ texte - + Modifier le cadre d'un champ texte Modifier le cadre d'un champ texte - + Modifier la largeur d'un texte Modifier la largeur d'un texte - + Modifier l'information d'un texte Modifier l'information d'un texte - + Modifier la source de texte, d'un texte Modifier la source de texte, d'un texte - + Modifier l'alignement d'un champ texte Modifier l'alignement d'un champ texte @@ -2981,17 +3059,17 @@ Maintenir Maj et faire glisser pour déplacer ce texte seul Texte composé - + Gauche Gauche - + Centre Centre - + Droite Droite @@ -3045,7 +3123,7 @@ Maintenir Maj et faire glisser pour déplacer ce texte seul Element - + Numéroter automatiquement un élément undo caption Numéroter automatiquement un élément @@ -4215,47 +4293,52 @@ Continuer ? Automates (MAE/SPS) - + + Contacts esclaves + Contacts esclaves + + + Configuration Configuration - + Ouvrir la configuration sélectionné Ouvrir la configuration sélectionné - + Sauvegarder la configuration actuelle Sauvegarder la configuration actuelle - + Importer des rapports depuis un fichier Importer des rapports depuis un fichier - + Importer... Importer... - + Exporter tous les rapports enregistrés vers un fichier Exporter tous les rapports enregistrés vers un fichier - + Exporter... Exporter... - + Requête SQL personnalisée Requête SQL personnalisée - + Requête SQL : Requête SQL : @@ -4280,84 +4363,84 @@ Continuer ? Numéro du folio - - + + Exporter Exporter - - + + Aucun rapport enregistré à exporter. Aucun rapport enregistré à exporter. - + Exporter les rapports Exporter les rapports - - + + Fichiers JSON (*.json) Fichiers JSON (*.json) - - - - + + + + Erreur Erreur - + Impossible d'écrire dans %1. Impossible d'écrire dans %1. - + Importer des rapports Importer des rapports - + Impossible de lire %1. Impossible de lire %1. - + %1 ne contient pas des rapports QElectroTech valides. %1 ne contient pas des rapports QElectroTech valides. - - + + Importer Importer - + Ce fichier ne contient aucun rapport. Ce fichier ne contient aucun rapport. - + Rapport déjà existant Rapport déjà existant - + Un rapport nommé « %1 » existe déjà. Le remplacer ? Un rapport nommé « %1 » existe déjà. Le remplacer ? - + Impossible d'écrire la configuration locale. Impossible d'écrire la configuration locale. - + %1 rapport(s) importé(s), %2 ignoré(s). %1 rapport(s) importé(s), %2 ignoré(s). @@ -4365,29 +4448,29 @@ Continuer ? ElementScene - + Déplacer une primitive Déplacer une primitive - + Éditer les informations sur l'auteur window title Éditer les informations sur l'auteur - + Vous pouvez utiliser ce champ libre pour mentionner les auteurs de l'élément, sa licence, ou tout autre renseignement que vous jugerez utile. Vous pouvez utiliser ce champ libre pour mentionner les auteurs de l'élément, sa licence, ou tout autre renseignement que vous jugerez utile. - + Éditer les noms window title Éditer les noms - + Vous pouvez spécifier le nom de l'élément dans plusieurs langues. Vous pouvez spécifier le nom de l'élément dans plusieurs langues. @@ -4953,7 +5036,7 @@ En important ce fichier, vous confirmez que : ExportConfigPage - + Export configuration page title Export @@ -5065,102 +5148,122 @@ En important ce fichier, vous confirmez que : ExportPropertiesWidget - + Exporter dans le dossier dialog title Exporter dans le dossier - + Dossier cible : Dossier cible : - + Parcourir Parcourir - + Format : Format : - + PNG (*.png) PNG (*.png) - + JPEG (*.jpg) JPEG (*.jpg) - + Bitmap (*.bmp) Bitmap (*.bmp) - + SVG (*.svg) SVG (*.svg) - + DXF (*.dxf) DXF (*.dxf) - + Options de rendu groupbox title Options de rendu - + Exporter entièrement le folio Exporter entièrement le folio - + Exporter seulement les éléments Exporter seulement les éléments - + Dessiner la grille Dessiner la grille - + Dessiner le cadre Dessiner le cadre - + Dessiner le cartouche Dessiner le cartouche - + Dessiner les bornes Dessiner les bornes - + Dessiner les noms des bornes Dessiner les noms des bornes - + Conserver les couleurs des conducteurs Conserver les couleurs des conducteurs - + SVG: fond transparent SVG: fond transparent + + + DXF : symboles en blocs + DXF : symboles en blocs + + + + Chaque symbole devient un bloc DXF, sélectionnable d'un clic dans un logiciel de CAO + Chaque symbole devient un bloc DXF, sélectionnable d'un clic dans un logiciel de CAO + + + + DXF : textes des symboles en attributs + DXF : textes des symboles en attributs + + + + Les textes d'un symbole (repère, fonction...) deviennent des attributs de son bloc. LibreCAD n'affiche pas les attributs. + Les textes d'un symbole (repère, fonction...) deviennent des attributs de son bloc. LibreCAD n'affiche pas les attributs. + FolioAutonumberingW @@ -6340,16 +6443,212 @@ Toutes valeurs autre que ‘Pas d’arrondi’ peut causer des erreurs de rendu - GraphicsTablePropertiesEditor + GesturesConfigPage - Form - Formulaire + + Faites glisser avec le bouton droit sur un folio : un anneau de commandes s'ouvre, relâchez vers celle à lancer. Tant que vous ne changez pas l'anneau d'un contexte, il montre les commandes de la barre de raccourcis. Les gestes s'activent ou se désactivent dans la page Général. + Faites glisser avec le bouton droit sur un folio : un anneau de commandes s'ouvre, relâchez vers celle à lancer. Tant que vous ne changez pas l'anneau d'un contexte, il montre les commandes de la barre de raccourcis. Les gestes s'activent ou se désactivent dans la page Général. + + 8 directions + 8 directions + + + + 4 directions + 4 directions + + + + Placer → + Placer → + + + + Vider la direction + Vider la direction + + + + Comme la barre de raccourcis + Comme la barre de raccourcis + + + + Commandes disponibles + Commandes disponibles + + + + Anneau, la direction choisie en surbrillance + Anneau, la direction choisie en surbrillance + + + + Directions : + Directions : + + + + Contexte : + Contexte : + + + + Gestes de la souris + configuration page title + Gestes de la souris + + + + (direction vide) + (direction vide) + + + + Anneau personnalisé pour ce contexte. + Anneau personnalisé pour ce contexte. + + + + Cet anneau suit la barre de raccourcis. + Cet anneau suit la barre de raccourcis. + + + + GraphicsTablePropertiesEditor + + + Form + Formulaire + + + + Affichage + Affichage + + + + Nom du tableau + Nom du tableau + + + + Géometrie et lignes + Géometrie et lignes + + + + Toutes + Toutes + + + + Tableau suivant + Tableau suivant + + + Aucun Aucun + + + Ajuster le tableau au folio + Ajuster le tableau au folio + + + + Y : + Y : + + + + X : + X : + + + + Tableau précédent + Tableau précédent + + + + Appliquer la géometrie à tous les tableaux liée à celui-ci + Appliquer la géometrie à tous les tableaux liée à celui-ci + + + + Tableau précédent : + Tableau précédent : + + + + Lignes à afficher : + Lignes à afficher : + + + + TextLabel + TextLabel + + + + En tête + En tête + + + + + Marge + Marge + + + + Aligement : + Aligement : + + + + + Gauche + Gauche + + + + + Centré + Centré + + + + + Droite + Droite + + + + + Police + Police + + + + Tableau + Tableau + + + + Alignement : + Alignement : + + + + Contenu + Contenu + @@ -6488,7 +6787,7 @@ Toutes valeurs autre que ‘Pas d’arrondi’ peut causer des erreurs de rendu - + Verrouillé : modifier la largeur ou la hauteur ajuste l'autre pour conserver les proportions. Cliquer pour déverrouiller. Verrouillé : modifier la largeur ou la hauteur ajuste l'autre pour conserver les proportions. Cliquer pour déverrouiller. @@ -6540,33 +6839,48 @@ Toutes valeurs autre que ‘Pas d’arrondi’ peut causer des erreurs de rendu Verrouiller la position - + + Adapter l’image au thème sombre + Adapter l’image au thème sombre + + + + Adapte les couleurs à l’affichage sombre uniquement. L’image originale, les exports et les impressions restent inchangés. + Adapte les couleurs à l’affichage sombre uniquement. L’image originale, les exports et les impressions restent inchangés. + + + Modifier la largeur d'une image Modifier la largeur d'une image - + Modifier la hauteur d'une image Modifier la hauteur d'une image - + Modifier l'angle d'une image Modifier l'angle d'une image - - + + Modifier l'inclinaison d'une image Modifier l'inclinaison d'une image - + Modifier le libellé d'une image Modifier le libellé d'une image - + + Modifier l'adaptation d'une image au thème sombre + Modifier l'adaptation d'une image au thème sombre + + + Déverrouillé : largeur et hauteur peuvent être modifiées indépendamment. Cliquer pour verrouiller. Déverrouillé : largeur et hauteur peuvent être modifiées indépendamment. Cliquer pour verrouiller. @@ -6668,59 +6982,140 @@ Toutes valeurs autre que ‘Pas d’arrondi’ peut causer des erreurs de rendu IndiTextPropertiesWidget + Form - Formulaire + Formulaire - - - + + X : + X : + + + + Éditeur avancé + Éditeur avancé + + + + Taille : + Taille : + + + + Angle : + Angle : + + + + + + px + px + + + + ° + ° + + + + Y : + Y : + + + + Largeur : + Largeur : + + + + Largeur du texte, le texte passe à la ligne. Auto : pas de retour à la ligne automatique + Largeur du texte, le texte passe à la ligne. Auto : pas de retour à la ligne automatique + + + + Auto + Auto + + + + Le contenu, la taille et la police du texte ne peuvent être modifié car formaté en html. +Veuillez utiliser l'éditeur avancé pour cela. + Le contenu, la taille et la police du texte ne peuvent être modifié car formaté en html. +Veuillez utiliser l'éditeur avancé pour cela. + + + + Cliquez ici pour annuler le formatage html + Cliquez ici pour annuler le formatage html + + + + Texte + Texte + + + + + + Police Police - - + + Déplacer un champ texte Déplacer un champ texte - + Pivoter un champ texte Pivoter un champ texte - + Modifier un champ texte Modifier un champ texte - + Modifier la taille d'un champ texte Modifier la taille d'un champ texte - + Modifier la police d'un champ texte Modifier la police d'un champ texte - + + Modifier la largeur d'un champ texte + Modifier la largeur d'un champ texte + + + Pivoter plusieurs champs texte Pivoter plusieurs champs texte - + Modifier la taille de plusieurs champs texte Modifier la taille de plusieurs champs texte - + Modifier la police de plusieurs champs texte Modifier la police de plusieurs champs texte - + + Modifier la largeur de plusieurs champs texte + Modifier la largeur de plusieurs champs texte + + + Modifier les propriétés d'un texte Modifier les propriétés d'un texte @@ -7051,12 +7446,12 @@ Toutes valeurs autre que ‘Pas d’arrondi’ peut causer des erreurs de rendu LiveServer - + Mode direct Mode direct - + Le mode direct est activé : un assistant IA connecté pourra exécuter des scripts sur le projet ouvert. Chaque action s'annule d'un Ctrl+Z, et le bouton « Arrêter » de la barre d'état coupe la connexion. @@ -7069,55 +7464,93 @@ Chaque action s'annule d'un Ctrl+Z, et le bouton « Arrêter » de la Ce réglage se trouve dans Configurer QElectroTech > Général > Projets. - + &Continuer &Continuer - + &Pas pour cette session &Pas pour cette session - + &Désactiver &Désactiver - - + + Ne plus demander au démarrage + Ne plus demander au démarrage + + + + Le mode direct s'ouvrira à chaque démarrage. Pour être de nouveau averti, désactivez-le puis réactivez-le dans Configurer QElectroTech > Général > Projets. + Le mode direct s'ouvrira à chaque démarrage. Pour être de nouveau averti, désactivez-le puis réactivez-le dans Configurer QElectroTech > Général > Projets. + + + + script script - + + Impression + Impression + + + + L'assistant veut imprimer %n folio(s) de « %1 » sur « %2 ». + + L'assistant veut imprimer %n folio(s) de « %1 » sur « %2 ». + L'assistant veut imprimer %n folio(s) de « %1 » sur « %2 ». + + + + + &Imprimer + &Imprimer + + + + &Annuler + &Annuler + + + + Assistant : %1 Assistant : %1 - + L'assistant veut exécuter un script L'assistant veut exécuter un script - + « %1 » sur le projet ouvert. Une fois exécuté, Ctrl+Z l'annule. « %1 » sur le projet ouvert. Une fois exécuté, Ctrl+Z l'annule. - + &Exécuter &Exécuter - + &Refuser &Refuser - + + &Toujours + &Toujours + + &Toujours pour cette session - &Toujours pour cette session + &Toujours pour cette session @@ -7566,63 +7999,63 @@ Voulez-vous tout de même lier ce contact esclave ? NewDiagramPage - + Folio Folio - + Conducteur Conducteur - + Reports de folio Reports de folio - + Références croisées Références croisées - + Guides Guides - + Définir les règles de numérotation automatique par défaut pour les nouveaux projets : Définir les règles de numérotation automatique par défaut pour les nouveaux projets : - + Conducteurs Conducteurs - + Eléments Eléments - + Folios Folios - + Numérotation auto Numérotation auto - + Nouveau folio configuration page title Nouveau folio - + Nouveau projet configuration page title Nouveau projet @@ -7631,90 +8064,90 @@ Voulez-vous tout de même lier ce contact esclave ? NewElementWizard - + Créer un nouvel élément : Assistant window title Créer un nouvel élément : Assistant - + &Suivant > &Suivant > - + Étape 1/3 : Catégorie parente wizard page title Étape 1/3 : Catégorie parente - + Sélectionnez une catégorie dans laquelle enregistrer le nouvel élément. wizard page subtitle Sélectionnez une catégorie dans laquelle enregistrer le nouvel élément. - + Étape 2/3 : Nom du fichier wizard page title Étape 2/3 : Nom du fichier - + Indiquez le nom du fichier dans lequel enregistrer le nouvel élément. wizard page subtitle Indiquez le nom du fichier dans lequel enregistrer le nouvel élément. - + nouvel_element nouvel_element - + Vous n'êtes pas obligé de préciser l'extension *.elmt. Elle sera ajoutée automatiquement. Vous n'êtes pas obligé de préciser l'extension *.elmt. Elle sera ajoutée automatiquement. - + Étape 3/3 : Noms de l'élément wizard page title Étape 3/3 : Noms de l'élément - + Indiquez le ou les noms de l'élément. wizard page subtitle Indiquez le ou les noms de l'élément. - + Nom du nouvel élément default name when creating a new element Nom du nouvel élément - - - + + + Erreur message box title Erreur - + Vous devez sélectionner une catégorie. message box content Vous devez sélectionner une catégorie. - + Vous devez entrer un nom de fichier message box content Vous devez entrer un nom de fichier - + Un élément portant le même nom existe déjà Un élément portant le même nom existe déjà @@ -7903,7 +8336,7 @@ Voulez-vous tout de même lier ce contact esclave ? Champ de texte dynamique - + Déplacer un champ texte Déplacer un champ texte @@ -8394,7 +8827,7 @@ Sa copie a été conservée sous : PrintConfigPage - + Impression configuration page title Impression @@ -8403,101 +8836,101 @@ Sa copie a été conservée sous : ProjectAutoNumConfigPage - + Numérotation auto Numérotation auto - - + + Conducteurs Conducteurs - + N° N° - + Nom Nom - + Folio Folio - + Élément Élément - + Figé Figé - + Attribuer un numéro libre… Attribuer un numéro libre… - - + + Donner à l'élément sélectionné un numéro que personne n'a : il garde sa numérotation, seul son numéro change. Donner à l'élément sélectionné un numéro que personne n'a : il garde sa numérotation, seul son numéro change. - - + + Eléments Eléments - - + + Folios Folios - + Numérotation auto des folios Numérotation auto des folios - + Importer depuis un autre projet... Importer depuis un autre projet... - + Reprendre les numérotations automatiques enregistrées dans un autre projet Reprendre les numérotations automatiques enregistrées dans un autre projet - + figé figé - + — libre — — libre — - + aucun élément n'a ce numéro (supprimé ou renuméroté) aucun élément n'a ce numéro (supprimé ou renuméroté) - + Aucun élément ne suit cette numérotation Aucun élément ne suit cette numérotation - + %n élément(s) suivent cette numérotation, dont %1 au nom figé %n élément suivent cette numérotation, dont %1 au nom figé @@ -8505,7 +8938,7 @@ Sa copie a été conservée sous : - + ; %n numéro(s) sans élément ; %n numéro sans élément @@ -8513,49 +8946,49 @@ Sa copie a été conservée sous : - + Cette numérotation a plusieurs numéros (ou un numéro par folio) : on ne peut pas en choisir un à la main. Cette numérotation a plusieurs numéros (ou un numéro par folio) : on ne peut pas en choisir un à la main. - + Attribuer un numéro libre Attribuer un numéro libre - + Le nom de cet élément est figé : dégelez-le d'abord. Le nom de cet élément est figé : dégelez-le d'abord. - + Aucun numéro n'est libre. Aucun numéro n'est libre. - + %1 → %2 %1 → %2 - + Numéro libre pour l'élément « %1 » (%2) : Numéro libre pour l'élément « %1 » (%2) : - - + + Nom de la numérotation : Nom de la numérotation : - - + + Modifier la numérotation Modifier la numérotation - + %n élément(s) suivent cette numérotation et vont changer de formule et de nom. %n élément suivent cette numérotation et vont changer de formule et de nom. @@ -8563,21 +8996,21 @@ Sa copie a été conservée sous : - - - - + + + + Nouvelle numérotation Nouvelle numérotation - - + + Renommer la numérotation Renommer la numérotation - + La numérotation « %1 » ne peut pas être modifiée : %n élément(s) au nom figé la suivent. Dégelez-les d'abord (voir la liste), ou renommez seulement la numérotation. @@ -8588,7 +9021,7 @@ Dégelez-les d'abord (voir la liste), ou renommez seulement la numérotatio - + %n numérotation(s) suivie(s) par des éléments au nom figé n'ont pas été remplacées. %n numérotation suivie par des éléments au nom figé n'ont pas été remplacées. @@ -8596,7 +9029,7 @@ Dégelez-les d'abord (voir la liste), ou renommez seulement la numérotatio - + %n élément(s) ont changé de formule. %n élément ont changé de formule. @@ -8604,13 +9037,13 @@ Dégelez-les d'abord (voir la liste), ou renommez seulement la numérotatio - - + + Supprimer la numérotation Supprimer la numérotation - + %n élément(s) suivent la numérotation « %1 », elle ne peut pas être supprimée. Donnez-leur une autre numérotation ou un nom fixe d'abord. @@ -8621,12 +9054,12 @@ Donnez-leur une autre numérotation ou un nom fixe d'abord. - + Aucun folio ne nomme cette numérotation Aucun folio ne nomme cette numérotation - + %n folio(s) nomment cette numérotation %n folio nomment cette numérotation @@ -8634,12 +9067,12 @@ Donnez-leur une autre numérotation ou un nom fixe d'abord. - + Aucun folio ne suit cette numérotation Aucun folio ne suit cette numérotation - + %n folio(s) suivent cette numérotation %n folio suivent cette numérotation @@ -8647,7 +9080,7 @@ Donnez-leur une autre numérotation ou un nom fixe d'abord. - + %n folio(s) suivent la numérotation « %1 », elle ne peut pas être supprimée. Donnez-leur une autre numérotation d'abord. @@ -8658,85 +9091,85 @@ Donnez-leur une autre numérotation d'abord. - + Importer les numérotations d'un projet Importer les numérotations d'un projet - + Projet QElectroTech (*.qet) Projet QElectroTech (*.qet) - - + + Import impossible Import impossible - + Impossible d'ouvrir %1 Impossible d'ouvrir %1 - + %1 n'est pas un projet QElectroTech valide. %1 n'est pas un projet QElectroTech valide. - - + + Aucune numérotation Aucune numérotation - - + + Ce projet ne contient aucune numérotation automatique. Ce projet ne contient aucune numérotation automatique. - + Numérotations à importer Numérotations à importer - + Numérotations trouvées dans %1 : Numérotations trouvées dans %1 : - + %1 : %2 (existe déjà) %1 : %2 (existe déjà) - + Remplacer les numérotations de même nom Remplacer les numérotations de même nom - + Importer des numérotations Importer des numérotations - + Import terminé Import terminé - + %1 numérotation(s) importée(s), %2 conservée(s) telles quelles. %1 numérotation(s) importée(s), %2 conservée(s) telles quelles. - + %1 numérotation(s) importée(s). %1 numérotation(s) importée(s). - + Management Management @@ -8757,8 +9190,19 @@ Donnez-leur une autre numérotation d'abord. ProjectDBModelPropertiesWidget + Form - Formulaire + Formulaire + + + + Requête + Requête + + + + Recharger + Recharger @@ -8770,128 +9214,140 @@ Donnez-leur une autre numérotation d'abord. Général - + Titre du projet : label when configuring Titre du projet : - + Ce titre sera disponible pour tous les folios de ce projet en tant que %projecttitle. informative label Ce titre sera disponible pour tous les folios de ce projet en tant que %projecttitle. - + Vous pouvez définir ci-dessous des propriétés personnalisées qui seront disponibles pour tous les folios de ce projet (typiquement pour les cartouches). informative label Vous pouvez définir ci-dessous des propriétés personnalisées qui seront disponibles pour tous les folios de ce projet (typiquement pour les cartouches). - + Temps passé sur ce projet : label when configuring Temps passé sur ce projet : - + Suivre le temps passé sur ce projet (uniquement enregistré localement dans ce fichier) checkbox label Suivre le temps passé sur ce projet (uniquement enregistré localement dans ce fichier) - + Réinitialiser button label Réinitialiser - + Croisements de conducteurs : label when configuring Croisements de conducteurs : - + Sans saut wire crossings Sans saut - + Saut sur les conducteurs horizontaux wire crossings Saut sur les conducteurs horizontaux - + Saut sur les conducteurs verticaux wire crossings Saut sur les conducteurs verticaux - + Dessine un petit arc là où deux conducteurs se croisent sans être reliés. Seul le dessin change : aucun élément n'est ajouté et aucun conducteur n'est coupé. tooltip Dessine un petit arc là où deux conducteurs se croisent sans être reliés. Seul le dessin change : aucun élément n'est ajouté et aucun conducteur n'est coupé. - + + Garder horizontaux les textes des symboles pivotés + checkbox label + Garder horizontaux les textes des symboles pivotés + + + + Les textes dessinés dans un symbole et les noms de ses bornes restent lisibles quand le symbole est pivoté : leur cadre tourne avec le symbole, pas le texte. Décochez pour qu'ils tournent avec le symbole, comme avant. + tooltip + Les textes dessinés dans un symbole et les noms de ses bornes restent lisibles quand le symbole est pivoté : leur cadre tourne avec le symbole, pas le texte. Décochez pour qu'ils tournent avec le symbole, comme avant. + + + Conducteurs par borne group box title Conducteurs par borne - + Utiliser les réglages de l'application checkbox label Utiliser les réglages de l'application - + Les réglages de Configurer QElectroTech > Général s'appliquent. Décochez pour donner à ce projet ses propres réglages, enregistrés dans le projet. tooltip Les réglages de Configurer QElectroTech > Général s'appliquent. Décochez pour donner à ce projet ses propres réglages, enregistrés dans le projet. - + Nombre maximal de conducteurs par borne : label when configuring Nombre maximal de conducteurs par borne : - + Sans limite wires per terminal Sans limite - + Un nouveau conducteur qui dépasserait ce nombre sur une borne est refusé. Les conducteurs déjà dessinés ne sont pas modifiés. 4 correspond à deux embouts doubles, un de chaque côté de la vis. tooltip Un nouveau conducteur qui dépasserait ce nombre sur une borne est refusé. Les conducteurs déjà dessinés ne sont pas modifiés. 4 correspond à deux embouts doubles, un de chaque côté de la vis. - + Un seul conducteur par renvoi de folio checkbox label Un seul conducteur par renvoi de folio - + Un renvoi de folio est un point virtuel : il ne reçoit qu'un conducteur, celui qui continue sur l'autre folio. tooltip Un renvoi de folio est un point virtuel : il ne reçoit qu'un conducteur, celui qui continue sur l'autre folio. - + Ces règles sont désactivées pour tous les projets (Configurer QElectroTech > Général). informative label Ces règles sont désactivées pour tous les projets (Configurer QElectroTech > Général). - - + + %1 h %2 min hours and minutes of time spent on a project %1 h %2 min @@ -9243,127 +9699,127 @@ Voulez-vous enregistrer les modifications ? QETApp - + Chargement... Initialisation du cache des collections d'éléments splash screen caption Chargement... Initialisation du cache des collections d'éléments - + Chargement... Éditeur de schéma splash screen caption Chargement... Éditeur de schéma - + Chargement... Ouverture des fichiers splash screen caption Chargement... Ouverture des fichiers - + LTR Translate this string to RTL if you are translating to a Right-to-Left language, else translate to LTR LTR - + Cartouches QET title of the title block templates collection provided by QElectroTech Cartouches QET - + Cartouches company title of the company's title block templates collection Cartouches entreprise - + Cartouches utilisateur title of the user's title block templates collection Cartouches utilisateur - + Q Single-letter example text - translate length, not meaning Q - + QET Small example text - translate length, not meaning QET - + Schema Normal example text - translate length, not meaning Schema - + Electrique Normal example text - translate length, not meaning Electrique - + QElectroTech Long example text - translate length, not meaning QElectroTech - + Configurer QElectroTech window title Configurer QElectroTech - + Enregistrer la configuration sous... dialog title Enregistrer la configuration sous... - - + + Configurations QElectroTech (*.conf) file dialog filter Configurations QElectroTech (*.conf) - - + + Erreur message box title Erreur - + Impossible d'enregistrer la configuration dans « %1 ». Impossible d'enregistrer la configuration dans « %1 ». - + Charger une configuration... dialog title Charger une configuration... - + « %1 » n'est pas une configuration enregistrée par QElectroTech. « %1 » n'est pas une configuration enregistrée par QElectroTech. - + Charger une configuration message box title Charger une configuration - + Cette configuration va remplacer vos réglages actuels, sauf la disposition des fenêtres et la liste des fichiers récents. QElectroTech va ensuite se fermer. Relancez-le pour utiliser la nouvelle configuration. @@ -9376,146 +9832,146 @@ QElectroTech va ensuite se fermer. Relancez-le pour utiliser la nouvelle configu Voulez-vous continuer ? - + Chargement... splash screen caption Chargement... - + Chargement... icône du systray splash screen caption Chargement... icône du systray - + QElectroTech systray menu title QElectroTech - + &Quitter &Quitter - + &Masquer &Masquer - + &Restaurer &Restaurer - + &Masquer tous les éditeurs de schéma &Masquer tous les éditeurs de schéma - + &Restaurer tous les éditeurs de schéma &Restaurer tous les éditeurs de schéma - + &Masquer tous les éditeurs d'élément &Masquer tous les éditeurs d'élément - + &Restaurer tous les éditeurs d'élément &Restaurer tous les éditeurs d'élément - + &Masquer tous les éditeurs de cartouche systray submenu entry &Masquer tous les éditeurs de cartouche - + &Restaurer tous les éditeurs de cartouche systray submenu entry &Restaurer tous les éditeurs de cartouche - + &Nouvel éditeur de schéma &Nouvel éditeur de schéma - + &Nouvel éditeur d'élément &Nouvel éditeur d'élément - + Ferme l'application QElectroTech Ferme l'application QElectroTech - + Réduire QElectroTech dans le systray Réduire QElectroTech dans le systray - + Restaurer QElectroTech Restaurer QElectroTech - + QElectroTech systray icon tooltip QElectroTech - + Éditeurs de schémas Éditeurs de schémas - + Éditeurs d'élément Éditeurs d'élément - + Éditeurs de cartouche systray menu entry Éditeurs de cartouche - + Rapport de plantage Rapport de plantage - + QElectroTech ne s'est pas fermé correctement lors de sa dernière exécution. Voici les derniers messages enregistrés avant l'arrêt -- vous pouvez les enregistrer pour les joindre à un rapport de bug. QElectroTech ne s'est pas fermé correctement lors de sa dernière exécution. Voici les derniers messages enregistrés avant l'arrêt -- vous pouvez les enregistrer pour les joindre à un rapport de bug. - + Rapport de diagnostic Rapport de diagnostic - + Ceci contient les derniers messages de journalisation de cette session. Vérifiez le contenu avant de le joindre à un rapport de bug public. Ceci contient les derniers messages de journalisation de cette session. Vérifiez le contenu avant de le joindre à un rapport de bug public. - + Usage : Usage : - + [options] [fichier]... @@ -9524,7 +9980,7 @@ Voici les derniers messages enregistrés avant l'arrêt -- vous pouvez les - + QElectroTech, une application de réalisation de schémas électriques. Options disponibles : @@ -9541,35 +9997,35 @@ Options disponibles : - + --common-elements-dir=DIR Definir le dossier de la collection d'elements --common-elements-dir=DIR Definir le dossier de la collection d'elements - + --common-tbt-dir=DIR Definir le dossier de la collection de modeles de cartouches --common-tbt-dir=DIR Definir le dossier de la collection de modeles de cartouches - + --config-dir=DIR Definir le dossier de configuration --config-dir=DIR Definir le dossier de configuration - + --data-dir=DIR Definir le dossier de data --data-dir=DIR Definir le dossier de data - + --lang-dir=DIR Definir le dossier contenant les fichiers de langue --lang-dir=DIR Definir le dossier contenant les fichiers de langue @@ -9579,1034 +10035,1114 @@ Options disponibles : QETDiagramEditor - - - + + + QElectroTech window title QElectroTech - + QElectroTech status bar message QElectroTech - + Projets dock title Projets - + Collections Collections - + Aucune modification Aucune modification - + Cliquez sur une action pour revenir en arrière dans l'édition de votre schéma Status tip Cliquez sur une action pour revenir en arrière dans l'édition de votre schéma - + Ce panneau liste les différentes actions effectuées sur le folio courant. Cliquer sur une action permet de revenir à l'état du schéma juste après son application. "What's this" tip Ce panneau liste les différentes actions effectuées sur le folio courant. Cliquer sur une action permet de revenir à l'état du schéma juste après son application. - + Annulations dock title Annulations - + E&xporter E&xporter - + Imprimer Imprimer - + &Quitter &Quitter - + Annuler Annuler - + Refaire Refaire - + Annule l'action précédente status bar tip Annule l'action précédente - + Restaure l'action annulée status bar tip Restaure l'action annulée - + Co&uper Co&uper - + Cop&ier Cop&ier - + C&oller C&oller - + Transfère les éléments sélectionnés dans le presse-papier status bar tip Transfère les éléments sélectionnés dans le presse-papier - + Copie les éléments sélectionnés dans le presse-papier status bar tip Copie les éléments sélectionnés dans le presse-papier - + Place les éléments du presse-papier sur le folio status bar tip Place les éléments du presse-papier sur le folio - + Réinitialiser les conducteurs Réinitialiser les conducteurs - + Création automatique de conducteur(s) Tool tip of auto conductor Création automatique de conducteur(s) - + Utiliser la création automatique de conducteur(s) quand cela est possible Status tip of auto conductor Utiliser la création automatique de conducteur(s) quand cela est possible - + Afficher la grille Afficher la grille - + Affiche ou masque la grille des folios Affiche ou masque la grille des folios - + Propriétés du folio Propriétés du folio - + Propriétés du projet Propriétés du projet - + Ajouter un folio Ajouter un folio - - - + + + Supprimer le folio Supprimer le folio - + Nettoyer le projet Nettoyer le projet - + Ajouter un sommaire Ajouter un sommaire - + en utilisant des onglets en utilisant des onglets - + en utilisant des fenêtres en utilisant des fenêtres - + Mode Selection Mode Selection - + Mode Visualisation Mode Visualisation - + &Mosaïque &Mosaïque - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + Éditeur de schémas Éditeur de schémas - + Exporter en pdf Exporter en pdf - + Exporte un ou plusieurs folios du projet courant status bar tip Exporte un ou plusieurs folios du projet courant - + Coller au point d'origine Coller au point d'origine - + + + Coller les informations de l'élément + Coller les informations de l'élément + + + Place les éléments du presse-papier à leur position d'origine et déplace le curseur vers ce point status bar tip Place les éléments du presse-papier à leur position d'origine et déplace le curseur vers ce point - + + Copie les informations renseignées de l'élément du presse-papier sur les éléments sélectionnés + status bar tip + Copie les informations renseignées de l'élément du presse-papier sur les éléments sélectionnés + + + Dupli&quer Dupli&quer - + Copie la sélection, décalée de l'espacement configuré status bar tip Copie la sélection, décalée de l'espacement configuré - + Configurer la duplication... Configurer la duplication... - + Choisir l'espacement et la direction utilisés par Dupliquer status bar tip Choisir l'espacement et la direction utilisés par Dupliquer - + Coupure automatique de conducteur(s) Tool tip of auto break conductor Coupure automatique de conducteur(s) - + Couper automatiquement les conducteurs existants lors du placement d'un élément Status tip of auto break conductor Couper automatiquement les conducteurs existants lors du placement d'un élément - + Grille des textes Grille des textes - + Grille d'accrochage des textes déplacés à la souris. Maintenir Ctrl pendant le déplacement pour placer librement. Grille d'accrochage des textes déplacés à la souris. Maintenir Ctrl pendant le déplacement pour placer librement. - + Désactivée Désactivée - + Afficher les guides Afficher les guides - + Affiche ou masque les guides Affiche ou masque les guides - + Garder les en-têtes visibles Garder les en-têtes visibles - + Garde les numéros de colonne et les lettres de ligne du folio visibles au bord de la vue Garde les numéros de colonne et les lettres de ligne du folio visibles au bord de la vue - + Afficher les limites des cases Afficher les limites des cases - + Trace les limites des colonnes et des lignes du folio sur le schéma, à l'écran seulement Trace les limites des colonnes et des lignes du folio sur le schéma, à l'écran seulement - + Afficher Afficher - + Textes des éléments Textes des éléments - + Textes des conducteurs Textes des conducteurs - + Champs de texte Champs de texte - + Formes Formes - + Images Images - + Tableaux Tableaux - + Références croisées Références croisées - + Voir Affichage > Afficher Voir Affichage > Afficher - + Exporter au format CSV Exporter au format CSV - + Gestionnaire de borniers (DEV) Gestionnaire de borniers (DEV) - + Lancer le plugin de création de borniers Lancer le plugin de création de borniers - + Exporter la liste des noms de conducteurs Exporter la liste des noms de conducteurs - + Exporter le plan de câblage Exporter le plan de câblage - + Liste de câblage (base de données) Liste de câblage (base de données) - + Numérotation automatique des bornes Numérotation automatique des bornes - - - + + + Recharger les dessins des éléments Recharger les dessins des éléments - + Redessine chaque élément placé d'après sa définition actuelle, sans avoir à fermer et rouvrir le projet (action non annulable) Redessine chaque élément placé d'après sa définition actuelle, sans avoir à fermer et rouvrir le projet (action non annulable) - + Exécuter un script... Exécuter un script... - + Exécute un script JavaScript sur le projet courant (voir qet.* dans le script pour l'API disponible) Exécute un script JavaScript sur le projet courant (voir qet.* dans le script pour l'API disponible) - + Enregistrer une macro Enregistrer une macro - + Enregistre ce que vous faites sur le projet, pour qu'un assistant IA en fasse un script ; recliquez pour arrêter Enregistre ce que vous faites sur le projet, pour qu'un assistant IA en fasse un script ; recliquez pour arrêter - + Gérer les scripts… Gérer les scripts… - + Écrire un script et en faire un bouton avec une icône Écrire un script et en faire un bouton avec une icône - + Ouvrir le dossier des scripts Ouvrir le dossier des scripts - + Chaque fichier .js de ce dossier qui commence par un en-tête // ==QETScript== devient un bouton Chaque fichier .js de ce dossier qui commence par un en-tête // ==QETScript== devient un bouton - + Exporter la base de donnée interne du projet Exporter la base de donnée interne du projet - + &Cascade &Cascade - + Projet suivant Projet suivant - + Projet précédent Projet précédent - + &Nouveau &Nouveau - + &Ouvrir &Ouvrir - + &Enregistrer &Enregistrer - + Enregistrer sous Enregistrer sous - - + + &Fermer &Fermer - + Crée un nouveau projet status bar tip Crée un nouveau projet - + Ouvre un projet existant status bar tip Ouvre un projet existant - + Ferme le projet courant status bar tip Ferme le projet courant - + Enregistre le projet courant et tous ses folios status bar tip Enregistre le projet courant et tous ses folios - + Enregistre le projet courant avec un autre nom de fichier status bar tip Enregistre le projet courant avec un autre nom de fichier - + Ajouter une colonne Ajouter une colonne - + Enlever une colonne Enlever une colonne - + Ajouter une ligne Add row Ajouter une ligne - + Enlever une ligne Remove row Enlever une ligne - + Ajoute une colonne au folio status bar tip Ajoute une colonne au folio - + Enlève une colonne au folio status bar tip Enlève une colonne au folio - + Agrandit le folio en hauteur status bar tip Agrandit le folio en hauteur - + Rétrécit le folio en hauteur status bar tip Rétrécit le folio en hauteur - + Supprimer Supprimer - + Pivoter Pivoter - + Pivoter le groupe Pivoter le groupe - + Orienter les textes Orienter les textes - + + Miroir horizontal + Miroir horizontal + + + + Miroir vertical + Miroir vertical + + + Retrouver dans le panel Retrouver dans le panel - + Éditer l'item sélectionné Éditer l'item sélectionné - + + Grouper Grouper - + Dégrouper Dégrouper - + Insérer le dernier élément Insérer le dernier élément - + Place à nouveau le dernier élément inséré status bar tip Place à nouveau le dernier élément inséré - + Rechercher une commande… Rechercher une commande… - + Tapez une partie du nom d'une commande et appuyez sur Entrée pour la lancer status bar tip Tapez une partie du nom d'une commande et appuyez sur Entrée pour la lancer - + Insérer un élément… Insérer un élément… - + Ouvre le sélecteur d'éléments à la position du curseur status bar tip Ouvre le sélecteur d'éléments à la position du curseur - + Barre de raccourcis Barre de raccourcis - + Ouvre à la position du curseur les commandes utiles pour la sélection, et le sélecteur d'éléments status bar tip Ouvre à la position du curseur les commandes utiles pour la sélection, et le sélecteur d'éléments - + Répéter la dernière commande Répéter la dernière commande - + Relance le dernier outil de dessin ou la dernière insertion d'élément (Entrée sur le folio) status bar tip Relance le dernier outil de dessin ou la dernière insertion d'élément (Entrée sur le folio) - + Enlève les éléments sélectionnés du folio status bar tip Enlève les éléments sélectionnés du folio - + Pivote les éléments et textes sélectionnés status bar tip Pivote les éléments et textes sélectionnés - + Pivote la sélection comme un groupe autour de son centre, au lieu de chaque élément sur place status bar tip Pivote la sélection comme un groupe autour de son centre, au lieu de chaque élément sur place - + Pivote les textes sélectionnés à un angle précis status bar tip Pivote les textes sélectionnés à un angle précis - + + Retourne les éléments sélectionnés de gauche à droite + status bar tip + Retourne les éléments sélectionnés de gauche à droite + + + + Retourne les éléments sélectionnés de haut en bas + status bar tip + Retourne les éléments sélectionnés de haut en bas + + + Retrouve l'élément sélectionné dans le panel status bar tip Retrouve l'élément sélectionné dans le panel - + Groupe les éléments, textes, formes et images sélectionnés : ils se sélectionnent, se déplacent et se copient ensemble status bar tip Groupe les éléments, textes, formes et images sélectionnés : ils se sélectionnent, se déplacent et se copient ensemble - + Défait les groupes sélectionnés status bar tip Défait les groupes sélectionnés - + Aligner sur la grille Aligner sur la grille - + Remet les éléments, images et textes sélectionnés sur la grille status bar tip Remet les éléments, images et textes sélectionnés sur la grille - + Aligner à gauche Aligner à gauche - + Aligne les bords gauches des objets sélectionnés status bar tip Aligne les bords gauches des objets sélectionnés - + Centrer horizontalement Centrer horizontalement - + Aligne les objets sélectionnés sur une même verticale, par leur point d'origine pour les éléments status bar tip Aligne les objets sélectionnés sur une même verticale, par leur point d'origine pour les éléments - + Aligner à droite Aligner à droite - + Aligne les bords droits des objets sélectionnés status bar tip Aligne les bords droits des objets sélectionnés - + Aligner en haut Aligner en haut - + Aligne les bords supérieurs des objets sélectionnés status bar tip Aligne les bords supérieurs des objets sélectionnés - + Centrer verticalement Centrer verticalement - + Aligne les objets sélectionnés sur une même horizontale, par leur point d'origine pour les éléments status bar tip Aligne les objets sélectionnés sur une même horizontale, par leur point d'origine pour les éléments - + Aligner en bas Aligner en bas - + Aligne les bords inférieurs des objets sélectionnés status bar tip Aligne les bords inférieurs des objets sélectionnés - + Tout sélectionner Tout sélectionner - + Désélectionner tout Désélectionner tout - + Inverser la sélection Inverser la sélection - + Sélectionner tous les conducteurs Sélectionner tous les conducteurs - + Sélectionner tous les champs de texte Sélectionner tous les champs de texte - + Sélectionne tous les éléments du folio status bar tip Sélectionne tous les éléments du folio - + Désélectionne tous les éléments du folio status bar tip Désélectionne tous les éléments du folio - + Désélectionne les éléments sélectionnés et sélectionne les éléments non sélectionnés status bar tip Désélectionne les éléments sélectionnés et sélectionne les éléments non sélectionnés - + Sélectionne tous les conducteurs du folio, désélectionne le reste status bar tip Sélectionne tous les conducteurs du folio, désélectionne le reste - + Sélectionne tous les champs de texte du folio, désélectionne le reste status bar tip Sélectionne tous les champs de texte du folio, désélectionne le reste - + Zoom avant Zoom avant - + Zoom arrière Zoom arrière - + Zoom sur le contenu Zoom sur le contenu - + Zoom adapté Zoom adapté - + Pas de zoom Pas de zoom - + Centrer sur le curseur Centrer sur le curseur - + Agrandit le folio status bar tip Agrandit le folio - + Rétrécit le folio status bar tip Rétrécit le folio - + Adapte le zoom de façon à afficher tout le contenu du folio indépendamment du cadre Adapte le zoom de façon à afficher tout le contenu du folio indépendamment du cadre - + Adapte le zoom exactement sur le cadre du folio status bar tip Adapte le zoom exactement sur le cadre du folio - + Restaure le zoom par défaut status bar tip Restaure le zoom par défaut - + Centre le folio sur le point sous le curseur de la souris, sans changer le zoom status bar tip Centre le folio sur le point sous le curseur de la souris, sans changer le zoom - + Ajouter un champ de texte Ajouter un champ de texte - + Ajouter une image Ajouter une image - + Ajouter un PDF Ajouter un PDF - + Ajouter une ligne Draw line Ajouter une ligne - + Ajouter un rectangle Ajouter un rectangle - + Ajouter une ellipse Ajouter une ellipse - + Ajouter un arc Ajouter un arc - + Ajouter une polyligne Ajouter une polyligne - + Ajouter un congé Ajouter un congé - + Ajoute un arc sur le folio actuel Ajoute un arc sur le folio actuel - + Arrondit le coin entre deux lignes du folio actuel Arrondit le coin entre deux lignes du folio actuel - + Scripts toolbar title Scripts - - + + Sélection + Sélection + + + + Profondeur + Profondeur + + + + Scripts Scripts - + Folio %1 : %2 Folio %1 : %2 - + Conducteurs non chargés message box title Conducteurs non chargés - + %n conducteur(s) n'ont pas pu être reliés à leurs bornes et n'ont pas été chargés. La définition de l'élément dans le projet a probablement été remplacée par une autre dont les bornes diffèrent. Si vous enregistrez le projet, ces conducteurs disparaîtront du fichier. Fermez-le sans enregistrer pour conserver le fichier tel quel. @@ -10621,7 +11157,7 @@ Si vous enregistrez le projet, ces conducteurs disparaîtront du fichier. Fermez - + %n objet(s) aligné(s) %n objet(s) aligné(s) @@ -10629,32 +11165,32 @@ Si vous enregistrez le projet, ces conducteurs disparaîtront du fichier. Fermez - + Sélectionnez au moins deux éléments, images, textes, formes ou groupes non verrouillés Sélectionnez au moins deux éléments, images, textes, formes ou groupes non verrouillés - + La sélection est déjà alignée, à la grille près La sélection est déjà alignée, à la grille près - + Répéter : insérer « %1 » Répéter : insérer « %1 » - + Répéter : %1 Répéter : %1 - + folio %1 folio %1 - + %n élément(s) redessiné(s). %n élément(s) redessiné(s). @@ -10662,7 +11198,7 @@ Si vous enregistrez le projet, ces conducteurs disparaîtront du fichier. Fermez - + %n élément(s) dont la définition est introuvable ou illisible : leur dessin actuel a été conservé. %n élément(s) dont la définition est introuvable ou illisible : leur dessin actuel a été conservé. @@ -10670,7 +11206,7 @@ Si vous enregistrez le projet, ces conducteurs disparaîtront du fichier. Fermez - + %n élément(s) non redessiné(s) : leur taille, leur point de saisie ou leurs bornes ont changé (borne ajoutée, supprimée ou déplacée). %n élément(s) non redessiné(s) : leur taille, leur point de saisie ou leurs bornes ont changé (borne ajoutée, supprimée ou déplacée). @@ -10678,18 +11214,18 @@ Si vous enregistrez le projet, ces conducteurs disparaîtront du fichier. Fermez - + Pour les mettre à jour, il faut les supprimer puis les réinsérer. Attention : cette opération supprime les conducteurs déjà reliés à ces éléments, qu'il faudra retracer. Pour les mettre à jour, il faut les supprimer puis les réinsérer. Attention : cette opération supprime les conducteurs déjà reliés à ces éléments, qu'il faudra retracer. - - + + Exécuter un script Exécuter un script - + Les scripts sont désactivés. Un script s'exécute avec vos droits : il peut lire et modifier le projet ouvert et écrire des fichiers. N'exécutez que des scripts dont vous connaissez l'origine. @@ -10702,28 +11238,33 @@ Un script s'exécute avec vos droits : il peut lire et modifier le projet o Activer les scripts ? Ce réglage est modifiable dans Configurer QElectroTech > Général > Projets. - + + Retenu après un redémarrage + Retenu après un redémarrage + + + Scripts JavaScript (*.js);;Tous les fichiers (*) Scripts JavaScript (*.js);;Tous les fichiers (*) - + Ignoré : %1 Ignoré : %1 - - + + Arrêter Arrêter - + Arrêter l'enregistrement de la macro Arrêter l'enregistrement de la macro - + ● Enregistrement : %n étape(s) ● Enregistrement : %n étape(s) @@ -10731,12 +11272,12 @@ Activer les scripts ? Ce réglage est modifiable dans Configurer QElectroTech &g - + Macro enregistrée Macro enregistrée - + « %1 » : %n étape(s). Pour en faire un script, demandez-le à votre assistant IA : le bouton ci-dessous copie la demande, il suffit de la coller dans sa fenêtre. @@ -10750,58 +11291,57 @@ Pour en faire un script, demandez-le à votre assistant IA : le bouton ci-dessou - + &Copier la demande pour l'assistant &Copier la demande pour l'assistant - + &Ouvrir le dossier &Ouvrir le dossier - + Demande copiée : collez-la dans la fenêtre de l'assistant Demande copiée : collez-la dans la fenêtre de l'assistant - + Couper la connexion de l'assistant pour le reste de la session Couper la connexion de l'assistant pour le reste de la session - + Mode direct : assistant connecté Mode direct : assistant connecté - + Mode direct : en attente d'un assistant Mode direct : en attente d'un assistant - - + + Assistant Assistant - + Demander avant d'exécuter un script écrit par l'assistant Demander avant d'exécuter un script écrit par l'assistant - Pour cette session seulement : chaque démarrage redemande - Pour cette session seulement : chaque démarrage redemande + Pour cette session seulement : chaque démarrage redemande - + Mode direct : %1 %2 à %3 Mode direct : %1 %2 à %3 - + %n type(s) d'objets masqué(s) %n type d'objets masqué @@ -10809,330 +11349,335 @@ Pour en faire un script, demandez-le à votre assistant IA : le bouton ci-dessou - - + + Textes %1 Textes %1 - + Exporte le folio courant dans un autre format status bar tip Exporte le folio courant dans un autre format - + Imprime un ou plusieurs folios du projet courant status bar tip Imprime un ou plusieurs folios du projet courant - + Ferme l'application QElectroTech status bar tip Ferme l'application QElectroTech - + Recalcule les chemins des conducteurs sans tenir compte des modifications status bar tip Recalcule les chemins des conducteurs sans tenir compte des modifications - + Édite les propriétés du folio (dimensions, informations du cartouche, propriétés des conducteurs...) status bar tip Édite les propriétés du folio (dimensions, informations du cartouche, propriétés des conducteurs...) - + Présente les différents projets ouverts dans des sous-fenêtres status bar tip Présente les différents projets ouverts dans des sous-fenêtres - + Présente les différents projets ouverts des onglets status bar tip Présente les différents projets ouverts des onglets - + Permet de sélectionner les éléments status bar tip Permet de sélectionner les éléments - + Permet de visualiser le folio sans pouvoir le modifier status bar tip Permet de visualiser le folio sans pouvoir le modifier - + Dispose les fenêtres en mosaïque status bar tip Dispose les fenêtres en mosaïque - + Ajouter une nomenclature Ajouter une nomenclature - + Dispose les fenêtres en cascade status bar tip Dispose les fenêtres en cascade - + Active le projet suivant status bar tip Active le projet suivant - + Active le projet précédent status bar tip Active le projet précédent - + Grouper les textes sélectionnés Grouper les textes sélectionnés - + Ajouter une courbe Ajouter une courbe - + Ajouter un plan de bornes Ajouter un plan de bornes - + Ajoute un champ de texte sur le folio actuel Ajoute un champ de texte sur le folio actuel - + Ajoute une image sur le folio actuel Ajoute une image sur le folio actuel - + Ajoute une page PDF sur le folio actuel Ajoute une page PDF sur le folio actuel - + Ajoute une ligne sur le folio actuel Ajoute une ligne sur le folio actuel - + Ajoute un rectangle sur le folio actuel Ajoute un rectangle sur le folio actuel - + Ajoute une ellipse sur le folio actuel Ajoute une ellipse sur le folio actuel - + Ajoute une polyligne sur le folio actuel Ajoute une polyligne sur le folio actuel - + Ajoute une courbe de Bézier sur le folio actuel Ajoute une courbe de Bézier sur le folio actuel - + Ajoute un plan de bornier sur le folio actuel Ajoute un plan de bornier sur le folio actuel - + Chercher/remplacer Chercher/remplacer - + Atteindre un élément Atteindre un élément - + Recherche et sélectionne rapidement un élément du folio status bar tip Recherche et sélectionne rapidement un élément du folio - + + Outils Outils - + + Affichage Affichage - + + Schéma Schéma - + + Ajouter Ajouter - + + Profondeur toolbar title Profondeur - + &Fichier &Fichier - + &Édition &Édition - + &Projet &Projet - + Afficha&ge Afficha&ge - + Fe&nêtres Fe&nêtres - + &Récemment ouverts &Récemment ouverts - + A&jouter A&jouter - + Aligner Aligner - + Lignes et colonnes Lignes et colonnes - + Affiche ou non la barre d'outils principale Affiche ou non la barre d'outils principale - + Affiche ou non la barre d'outils Affichage Affiche ou non la barre d'outils Affichage - + Affiche ou non la barre d'outils Schéma Affiche ou non la barre d'outils Schéma - + Affiche ou non le panel d'appareils Affiche ou non le panel d'appareils - + Affiche ou non la liste des modifications Affiche ou non la liste des modifications - + Afficher les projets Afficher les projets - - + + Projet %1 enregistré dans le repertoire: %2. Projet %1 enregistré dans le repertoire: %2. - + Ouvrir un fichier Ouvrir un fichier - + Projets QElectroTech (*.qet);;Fichiers XML (*.xml);;Tous les fichiers (*) Projets QElectroTech (*.qet);;Fichiers XML (*.xml);;Tous les fichiers (*) - - + + Impossible d'ouvrir le fichier message box title Impossible d'ouvrir le fichier - + Il semblerait que le fichier %1 que vous essayez d'ouvrir n'existe pas ou plus. Il semblerait que le fichier %1 que vous essayez d'ouvrir n'existe pas ou plus. - + Il semblerait que le fichier que vous essayez d'ouvrir ne soit pas accessible en lecture. Il est donc impossible de l'ouvrir. Veuillez vérifier les permissions du fichier. Il semblerait que le fichier que vous essayez d'ouvrir ne soit pas accessible en lecture. Il est donc impossible de l'ouvrir. Veuillez vérifier les permissions du fichier. - + Ouverture du projet en lecture seule message box title Ouverture du projet en lecture seule - + Il semblerait que le projet que vous essayez d'ouvrir ne soit pas accessible en écriture. Il sera donc ouvert en lecture seule. Il semblerait que le projet que vous essayez d'ouvrir ne soit pas accessible en écriture. Il sera donc ouvert en lecture seule. - - + + Échec de l'ouverture du projet message box title Échec de l'ouverture du projet - + Il semblerait que le fichier %1 ne soit pas un fichier projet QElectroTech. Il ne peut donc être ouvert. message box content Il semblerait que le fichier %1 ne soit pas un fichier projet QElectroTech. Il ne peut donc être ouvert. - + %n description(s) de police écrite(s) dans un format étranger ou corrompu ont été restaurée(s). Elles seront réécrites dans un format stable au prochain enregistrement du projet. message box content @@ -11141,7 +11686,7 @@ Pour en faire un script, demandez-le à votre assistant IA : le bouton ci-dessou - + %n description(s) de police n'ont pas pu être lue(s) ; la police par défaut sera utilisée pour ces textes. message box content @@ -11150,30 +11695,30 @@ Pour en faire un script, demandez-le à votre assistant IA : le bouton ci-dessou - + Polices du projet message box title Polices du projet - + Suppression de borne impossible Suppression de borne impossible - + La suppression ne peut être effectué car la selection possède une ou plusieurs bornes ponté et/ou appartenant à une borne à niveau multiple. Déponter et/ou supprimer les niveaux des bornes concerné afin de pouvoir les supprimer La suppression ne peut être effectué car la selection possède une ou plusieurs bornes ponté et/ou appartenant à une borne à niveau multiple. Déponter et/ou supprimer les niveaux des bornes concerné afin de pouvoir les supprimer - + Groupe Groupe - + %n objet(s) remis sur la grille %n objet(s) remis sur la grille @@ -11181,12 +11726,12 @@ Déponter et/ou supprimer les niveaux des bornes concerné afin de pouvoir les s - + La sélection est déjà sur la grille La sélection est déjà sur la grille - + (%n objet(s) verrouillé(s) laissé(s) en place) (%n objet(s) verrouillé(s) laissé(s) en place) @@ -11194,79 +11739,79 @@ Déponter et/ou supprimer les niveaux des bornes concerné afin de pouvoir les s - + Éditer l'élement edit element Éditer l'élement - + Éditer le champ de texte edit text field Éditer le champ de texte - + Éditer l'image edit image Éditer l'image - + Éditer le conducteur edit conductor Éditer le conducteur - + Éditer l'objet sélectionné edit selected item Éditer l'objet sélectionné - + Une erreur est survenue lors de l'ouverture du fichier %1. message box content Une erreur est survenue lors de l'ouverture du fichier %1. - + Active le projet « %1 » Active le projet « %1 » - + Êtes-vous sûr de vouloir supprimer ce folio ? Êtes-vous sûr de vouloir supprimer ce folio ? - + Supprimer les folios Supprimer les folios - + Êtes-vous sûr de vouloir supprimer les %1 folios sélectionnés ? Êtes-vous sûr de vouloir supprimer les %1 folios sélectionnés ? - + Supprimer %1 folios Supprimer %1 folios - - - - - - - + + + + + + + Déplacer les folios Déplacer les folios - + Erreur message box title Erreur @@ -11515,17 +12060,17 @@ Déponter et/ou supprimer les niveaux des bornes concerné afin de pouvoir les s Éditer les propriétés de l'élément - + Annuler Annuler - + Refaire Refaire - + Profondeur toolbar title Profondeur @@ -11551,52 +12096,52 @@ Déponter et/ou supprimer les niveaux des bornes concerné afin de pouvoir les s Pas de zoom - + Ajouter une ligne Ajouter une ligne - + Ajouter un rectangle Ajouter un rectangle - + Ajouter une ellipse Ajouter une ellipse - + Ajouter un polygone Ajouter un polygone - + Ajouter du texte Ajouter du texte - + Ajouter un arc de cercle Ajouter un arc de cercle - + Ajouter une borne Ajouter une borne - + Ajouter un champ texte dynamique Ajouter un champ texte dynamique - + Double-click pour terminer la forme, Click droit pour annuler le dernier point Double-click pour terminer la forme, Click droit pour annuler le dernier point - + Parties toolbar title Parties @@ -11622,31 +12167,31 @@ Déponter et/ou supprimer les niveaux des bornes concerné afin de pouvoir les s Coller depuis... - + [Modifié] window title tag [Modifié] - + [lecture seule] window title tag [lecture seule] - + Aucune modification Aucune modification - + Éditeur d'éléments status bar message Éditeur d'éléments - - + + %n partie(s) sélectionnée(s). %n partie sélectionnée. @@ -11654,40 +12199,40 @@ Déponter et/ou supprimer les niveaux des bornes concerné afin de pouvoir les s - + Trop de primitives, liste non générée: %1 Trop de primitives, liste non générée: %1 - + Absence de borne warning title Absence de borne - + <br>En l'absence de borne, l'élément ne pourra être relié à d'autres éléments par l'intermédiaire de conducteurs. warning description <br>En l'absence de borne, l'élément ne pourra être relié à d'autres éléments par l'intermédiaire de conducteurs. - + Absence de borne Absence de borne - + <br><b>Erreur</b> :<br>Les reports de folio doivent posséder une seul borne.<br><b>Solution</b> :<br>Verifier que l'élément ne possède qu'une seul borne <br><b>Erreur</b> :<br>Les reports de folio doivent posséder une seul borne.<br><b>Solution</b> :<br>Verifier que l'élément ne possède qu'une seul borne - + La vérification de cet élément a généré message box content La vérification de cet élément a généré - + %n erreur(s) errors @@ -11696,119 +12241,119 @@ Déponter et/ou supprimer les niveaux des bornes concerné afin de pouvoir les s - + et et - + <b>%1</b> : %2 warning title: warning description <b>%1</b> : %2 - + Erreurs Erreurs - + Avertissements Avertissements - + Le fichier %1 n'existe pas. message box content Le fichier %1 n'existe pas. - + Afficher menu entry Afficher - - + + Impossible d'ouvrir le fichier %1. message box content Impossible d'ouvrir le fichier %1. - - + + Ce fichier n'est pas un document XML valide message box content Ce fichier n'est pas un document XML valide - - + + Erreur toolbar title Erreur - - + + Édition en lecture seule message box title Édition en lecture seule - - + + Vous n'avez pas les privilèges nécessaires pour modifier cet élement. Il sera donc ouvert en lecture seule. message box content Vous n'avez pas les privilèges nécessaires pour modifier cet élement. Il sera donc ouvert en lecture seule. - - + + Erreur message box title Erreur - + Impossible d'écrire dans ce fichier message box content Impossible d'écrire dans ce fichier - + Impossible d'enregistrer l'élément message box content Impossible d'enregistrer l'élément - + Nombre de bornes incorrect Nombre de bornes incorrect - + <br><b>Erreur</b> :<br>Les définitions de conducteur ne peuvent posséder qu'une seule borne.<br><b>Solution</b> :<br>Vérifier que l'élément ne possède qu'une seule borne <br><b>Erreur</b> :<br>Les définitions de conducteur ne peuvent posséder qu'une seule borne.<br><b>Solution</b> :<br>Vérifier que l'élément ne possède qu'une seule borne - + Noms de bornes en double Noms de bornes en double - + <br><b>Erreur</b> :<br>Plusieurs bornes portent le même nom : %1.<br><b>Solution</b> :<br>Donner un nom unique à chaque borne, par exemple N.1 et N.2. Les bornes concernées sont sélectionnées. <br><b>Erreur</b> :<br>Plusieurs bornes portent le même nom : %1.<br><b>Solution</b> :<br>Donner un nom unique à chaque borne, par exemple N.1 et N.2. Les bornes concernées sont sélectionnées. - + Bornes sans nom Bornes sans nom - + <br>%n borne(s) sans nom. Sans noms de bornes uniques, la liste de câblage (qui relie quoi à quoi) ne peut pas désigner chaque borne, et ne peut donc pas servir à câbler l'armoire en atelier. <br>%n borne(s) sans nom. Sans noms de bornes uniques, la liste de câblage (qui relie quoi à quoi) ne peut pas désigner chaque borne, et ne peut donc pas servir à câbler l'armoire en atelier. @@ -11816,10 +12361,8 @@ Déponter et/ou supprimer les niveaux des bornes concerné afin de pouvoir les s - - - - + + @@ -11832,115 +12375,117 @@ Déponter et/ou supprimer les niveaux des bornes concerné afin de pouvoir les s - - + + + - - - - - - - + + + + + + - - + + + + Éditeur d'élément Éditeur d'élément - + Ajouter un texte d'élément non éditable dans les schémas Ajouter un texte d'élément non éditable dans les schémas - + Ajouter un texte d'élément pouvant être édité dans les schémas Ajouter un texte d'élément pouvant être édité dans les schémas - + Afficher le cadre de fond Afficher le cadre de fond - + Taille du cadre de fond... Taille du cadre de fond... - + Taille du cadre de fond Taille du cadre de fond - - + + px px - + Largeur Largeur - + Hauteur Hauteur - + X: %1 Y: %2 X: %1 Y: %2 - + Exporter en SVG dialog title Exporter en SVG - + Image SVG (*.svg) filetypes allowed when exporting an element to SVG Image SVG (*.svg) - + Échec de l'export Échec de l'export - + Impossible d'écrire dans le fichier « %1 ». Impossible d'écrire dans le fichier « %1 ». - + Avertissement Avertissement - + L'import d'un dxf volumineux peut prendre du temps veuillez patienter durant l'import... L'import d'un dxf volumineux peut prendre du temps veuillez patienter durant l'import... - + Importer un élément à redimensionner Importer un élément à redimensionner - + Éléments QElectroTech (*.elmt) Éléments QElectroTech (*.elmt) - + %n avertissement(s) warnings @@ -11949,99 +12494,99 @@ veuillez patienter durant l'import... - + Impossible d'ouvrir le fichier message box title Impossible d'ouvrir le fichier - + Il semblerait que le fichier %1 que vous essayez d'ouvrir n'existe pas ou plus. Il semblerait que le fichier %1 que vous essayez d'ouvrir n'existe pas ou plus. - + Recharger l'élément dialog title Recharger l'élément - + Vous avez efffectué des modifications sur cet élément. Si vous le rechargez, ces modifications seront perdues. Voulez-vous vraiment recharger l'élément ? dialog content Vous avez efffectué des modifications sur cet élément. Si vous le rechargez, ces modifications seront perdues. Voulez-vous vraiment recharger l'élément ? - - - + + + Echec de l'enregistrement Echec de l'enregistrement - - - + + + L'enregistrement à échoué, les conditions requises ne sont pas valides L'enregistrement à échoué, les conditions requises ne sont pas valides - + Enregistrer sous dialog title Enregistrer sous - + Éléments QElectroTech (*.elmt) filetypes allowed when saving an element file Éléments QElectroTech (*.elmt) - + Enregistrer l'élément en cours ? dialog title Enregistrer l'élément en cours ? - + Voulez-vous enregistrer l'élément %1 ? dialog content - %1 is an element name Voulez-vous enregistrer l'élément %1 ? - + Ouvrir un fichier dialog title Ouvrir un fichier - + Éléments QElectroTech (*.elmt);;Fichiers XML (*.xml);;Tous les fichiers (*) filetypes allowed when opening an element file Éléments QElectroTech (*.elmt);;Fichiers XML (*.xml);;Tous les fichiers (*) - - - - + + + + Élément inexistant. message box title Élément inexistant. - - + + Le chemin virtuel choisi ne correspond pas à un élément. message box content Le chemin virtuel choisi ne correspond pas à un élément. - - + + L'élément n'existe pas. message box content L'élément n'existe pas. @@ -12055,167 +12600,189 @@ les conditions requises ne sont pas valides &Configurer QElectroTech - + Permet de régler différents paramètres de QElectroTech status bar tip Permet de régler différents paramètres de QElectroTech - + À &propos de QElectroTech À &propos de QElectroTech - + Affiche des informations sur QElectroTech status bar tip Affiche des informations sur QElectroTech - + Manuel en ligne Manuel en ligne - + Chaine Youtube Chaine Youtube - - + + Télécharger une nouvelle version (dev) Télécharger une nouvelle version (dev) - + Lance le navigateur par défaut vers le manuel en ligne de QElectroTech status bar tip Lance le navigateur par défaut vers le manuel en ligne de QElectroTech - + Enregistrer la configuration sous... Enregistrer la configuration sous... - + Enregistre les réglages de QElectroTech dans un fichier status bar tip Enregistre les réglages de QElectroTech dans un fichier - - - - + + + + + + + + + + + + + + + Général Général - + + &Personnaliser... + &Personnaliser... + + + + Barres d'outils, barre de raccourcis, clavier et gestes de la souris, dans une seule fenêtre + status bar tip + Barres d'outils, barre de raccourcis, clavier et gestes de la souris, dans une seule fenêtre + + + Charger une configuration... Charger une configuration... - + Remplace les réglages de QElectroTech par ceux d'un fichier, puis ferme QElectroTech status bar tip Remplace les réglages de QElectroTech par ceux d'un fichier, puis ferme QElectroTech - + Connecter un assistant IA... Connecter un assistant IA... - + Affiche la configuration qui permet à un assistant IA d'utiliser QElectroTech status bar tip Affiche la configuration qui permet à un assistant IA d'utiliser QElectroTech - + Lance le navigateur par défaut vers la chaine Youtube de QElectroTech status bar tip Lance le navigateur par défaut vers la chaine Youtube de QElectroTech - - + + Lance le navigateur par défaut vers le dépot Nightly en ligne de QElectroTech status bar tip Lance le navigateur par défaut vers le dépot Nightly en ligne de QElectroTech - + Soutenir le projet par un don Soutenir le projet par un don - + Soutenir le projet QElectroTech par un don status bar tip Soutenir le projet QElectroTech par un don - + À propos de &Qt À propos de &Qt - + Affiche des informations sur la bibliothèque Qt status bar tip Affiche des informations sur la bibliothèque Qt - + Enregistrer un rapport de diagnostic... Enregistrer un rapport de diagnostic... - + Génère un rapport avec les derniers messages de journalisation, pour l'inclure dans un rapport de bug status bar tip Génère un rapport avec les derniers messages de journalisation, pour l'inclure dans un rapport de bug - + &Configuration window menu &Configuration - + &Aide window menu &Aide - + Sortir du &mode plein écran Sortir du &mode plein écran - + Affiche QElectroTech en mode fenêtré status bar tip Affiche QElectroTech en mode fenêtré - + Passer en &mode plein écran Passer en &mode plein écran - + Affiche QElectroTech en mode plein écran status bar tip Affiche QElectroTech en mode plein écran - + Afficher menu entry Afficher @@ -12224,52 +12791,52 @@ les conditions requises ne sont pas valides QETProject - + Projet « %1 : %2» displayed title for a ProjectView - %1 is the project title, -%2 is the project path Projet « %1 : %2» - + Projet %1 displayed title for a title-less project - %1 is the file name Projet %1 - + Projet sans titre displayed title for a project-less, file-less project Projet sans titre - + %1 [lecture seule] displayed title for a read-only project - %1 is a displayable title %1 [lecture seule] - + %1 [modifié] displayed title for a modified project - %1 is a displayable title %1 [modifié] - + Renumber elements Renuméroter les ' éléments - + Renumber elements (%1) Renuméroter l ' élément (%1) - + Système de contacts modifié Système de contacts modifié - + Le nouvel élément définit des groupes de contacts esclaves. Les éléments esclaves existants ne seront pas automatiquement assignés. Vous devrez relier manuellement les esclaves et assigner les groupes de contacts. @@ -12280,19 +12847,19 @@ Les éléments esclaves existants ne seront pas automatiquement assignés. Vous Voulez-vous continuer ? - + Une erreur s'est produite durant l'intégration du modèle. error message Une erreur s'est produite durant l'intégration du modèle. - + Avertissement message box title Avertissement - + Ce document semble avoir été enregistré avec une version %1 qui est ultérieure à votre version ! Vous utilisez actuellement QElectroTech en version %2 @@ -12301,7 +12868,7 @@ Vous utilisez actuellement QElectroTech en version %2 Vous utilisez actuellement QElectroTech en version %2 - + . Il est alors possible que l'ouverture de tout ou partie de ce document échoue. Que désirez vous faire ? @@ -12310,32 +12877,32 @@ Que désirez vous faire ? Que désirez vous faire ? - + Avertissement message box title Avertissement - + Le projet que vous tentez d'ouvrir est partiellement compatible avec votre version %1 de QElectroTech. Le projet que vous tentez d'ouvrir est partiellement compatible avec votre version %1 de QElectroTech. - + Afin de le rendre totalement compatible veuillez ouvrir ce même projet avec la version 0.8, ou 0.80 de QElectroTech et sauvegarder le projet et l'ouvrir à nouveau avec cette version. Que désirez vous faire ? Afin de le rendre totalement compatible veuillez ouvrir ce même projet avec la version 0.8, ou 0.80 de QElectroTech et sauvegarder le projet et l'ouvrir à nouveau avec cette version. Que désirez vous faire ? - + <p align="center"><b>Ouverture du projet en cours...</b><br/>Création des folios</p> <p align="center"><b>Ouverture du projet en cours...</b><br/>Création des folios</p> - + <p align="center"><b>Ouverture du projet en cours...</b><br/>Mise en place des références croisées</p> <p align="center"><b>Ouverture du projet en cours...</b><br/>Mise en place des références croisées</p> @@ -12361,158 +12928,156 @@ Que désirez vous faire ? QETTitleBlockTemplateEditor - + Enregistrer le modèle en cours ? dialog title Enregistrer le modèle en cours ? - + Voulez-vous enregistrer le modèle %1 ? dialog content - %1 is a title block template name Voulez-vous enregistrer le modèle %1 ? - + nouveau_modele template name suggestion when duplicating the default one nouveau_modele - + Dupliquer un modèle de cartouche input dialog title Dupliquer un modèle de cartouche - + Pour dupliquer ce modèle, entrez le nom voulu pour sa copie input dialog text Pour dupliquer ce modèle, entrez le nom voulu pour sa copie - + &Nouveau menu entry &Nouveau - + &Ouvrir menu entry &Ouvrir - + Ouvrir depuis un fichier menu entry Ouvrir depuis un fichier - + &Enregistrer menu entry &Enregistrer - + Enregistrer sous menu entry Enregistrer sous - + Enregistrer vers un fichier menu entry Enregistrer vers un fichier - + &Quitter menu entry &Quitter - + Co&uper menu entry Co&uper - + Cop&ier menu entry Cop&ier - + C&oller menu entry C&oller - + Gérer les logos menu entry Gérer les logos - + Éditer les informations complémentaires menu entry Éditer les informations complémentaires - + Zoom avant menu entry Zoom avant - + Zoom arrière menu entry Zoom arrière - + Zoom adapté menu entry Zoom adapté - + Pas de zoom menu entry Pas de zoom - + Ajouter une &ligne menu entry Ajouter une &ligne - + Ajouter une &colonne menu entry Ajouter une &colonne - + &Fusionner les cellules menu entry &Fusionner les cellules - + &Séparer les cellules menu entry &Séparer les cellules - - @@ -12530,156 +13095,158 @@ Que désirez vous faire ? + + Éditeur de cartouche Éditeur de cartouche - + &Fichier menu title &Fichier - + &Édition menu title &Édition - + Afficha&ge menu title Afficha&ge - + Outils toolbar title Outils - + Édition toolbar title Édition - + Affichage toolbar title Affichage - + Aucune modification label displayed in the undo list when empty Aucune modification - + Annulations dock title Annulations - + Propriétés de la cellule dock title Propriétés de la cellule - + [Modifié] window title tag [Modifié] - + [Lecture seule] window title tag [Lecture seule] - + %1 %2 part of the window title - %1 is the filepath or template name, %2 is the [Changed] or [Read only] tag %1 %2 - + QElectroTech - Éditeur de modèle de cartouche titleblock template editor: base window title QElectroTech - Éditeur de modèle de cartouche - + %1 - %2 window title: %1 is the base window title, %2 is a template name %1 - %2 - - + + Erreur message box title Erreur - + Impossible d'enregistrer le modèle « %1 ». message box content - %1 is a title block template name Impossible d'enregistrer le modèle « %1 ». - + Ouvrir un modèle File > open dialog window title Ouvrir un modèle - + Ouvrir un fichier dialog title Ouvrir un fichier - + Modèles de cartouches QElectroTech (*%1);;Fichiers XML (*.xml);;Tous les fichiers (*) filetypes allowed when opening a title block template file - %1 is the .titleblock extension Modèles de cartouches QElectroTech (*%1);;Fichiers XML (*.xml);;Tous les fichiers (*) - + Enregistrer le modèle sous dialog window title Enregistrer le modèle sous - + Le nom « %1 » n'est pas valide : il ne doit pas contenir les caractères suivants : \ / : * ? " < > | message box content - %1 is the rejected template name Le nom « %1 » n'est pas valide : il ne doit pas contenir les caractères suivants : \ / : * ? " < > | - + Enregistrer sous dialog title Enregistrer sous - + Modèles de cartouches QElectroTech (*%1) filetypes allowed when saving a title block template file - %1 is the .titleblock extension Modèles de cartouches QElectroTech (*%1) - + Éditer les informations complémentaires window title Éditer les informations complémentaires - + Vous pouvez utiliser ce champ libre pour mentionner les auteurs du cartouche, sa licence, ou tout autre renseignement que vous jugerez utile. Vous pouvez utiliser ce champ libre pour mentionner les auteurs du cartouche, sa licence, ou tout autre renseignement que vous jugerez utile. @@ -13137,7 +13704,7 @@ Que désirez vous faire ? - + Titre Titre @@ -13268,8 +13835,8 @@ Que désirez vous faire ? Borne - + Texte Texte @@ -13380,8 +13947,8 @@ Que désirez vous faire ? Numéro de folio - - + + Avertissement : l'élément a été enregistré avec une version ultérieure de QElectroTech. Avertissement : l'élément a été enregistré avec une version ultérieure de QElectroTech. @@ -13560,8 +14127,8 @@ Que désirez vous faire ? + - Pivoter %1 Pivoter %1 @@ -13743,45 +14310,45 @@ Voulez-vous la remplacer ? - - - + + + Type Type - - - + + + Adresse Adresse - - - - + + + + Commentaire Commentaire - - - - + + + + Réf. croisée Réf. croisée + + + + - - - - Fonction Fonction @@ -14116,22 +14683,22 @@ Voulez-vous la remplacer ? Création de conducteurs - + To install the plugin qet_tb_generator<br>Visit :<br><a href='https://pypi.python.org/pypi/qet-tb-generator'>qet-tb-generator</a><br>Requires python 3.5 or above.<br><B><U> First install on Windows</B></U><br>1. Install, if required, python 3.5 or above<br> Visit :<br><a href='https://www.python.org/downloads/'>python.org</a><br>2. pip install qet_tb_generator<br><B><U> Update on Windows</B></U><br>python -m pip install --upgrade qet_tb_generator<br>>>user could launch in a terminal this script in this directory<br> C:\users\XXXX\AppData\Local\Programs\Python\Python36-32\Scripts <br> Pour installer le plugin qet_tb_generator <br> : visitez le site: <br><a href='https://pypi.python.org/pypi/qet-tb-generator'> qet-tb-generateur </a><br> requiert Python version 3.5 ou supérieure. <br><B><U> Premièrement , installation sous Windows </B></U><br>1. Installez, si nécessaire, Python 3.5 ou version ultérieure <br><br><a href='https://www.python.org/downloads/'> python.org </a><br> 2. pip installer qet_tb_generator <br><B><U> Mise à jour sous Windows </B></U><br> python -m installation de pip --upgrade qet_tb_generator <br> >> l'utilisateur peut lancer dans un terminal ce script dans cette Répertoire <br> C: \ Utilisateurs \ XXXX \ AppData \ Local \ Programmes \ Python \ Python36-32 \ Scripts <br> - + To install the plugin qet_tb_generator<br>Visit :<br><a href='https://pypi.python.org/pypi/qet-tb-generator'>qet-tb-generator</a><br><B><U> First install on macOSX</B></U><br>1. Install, if required, python 3.11 bundle only, <a href='https://www.python.org/ftp/python/3.11.2/python-3.11.2-macos11.pkg'>python-3.11.2-macos11.pkg</a><br>2 Run Profile.command script<br>because program use hardcoded PATH for localise qet-tb-generator plugin <br> Visit :<br><a href='https://qelectrotech.org/forum/viewtopic.php?pid=5674#p5674'>howto</a><br>2. pip3 install qet_tb_generator<br><B><U> Update on macOSX</B></U><br> pip3 install --upgrade qet_tb_generator<br> To install the plugin qet_tb_generator<br>Visit :<br><a href='https://pypi.python.org/pypi/qet-tb-generator'>qet-tb-generator</a><br><B><U> First install on macOSX</B></U><br>1. Install, if required, python 3.11 bundle only, <a href='https://www.python.org/ftp/python/3.11.2/python-3.11.2-macos11.pkg'>python-3.11.2-macos11.pkg</a><br>2 Run Profile.command script<br>because program use hardcoded PATH for localise qet-tb-generator plugin <br> Visit :<br><a href='https://qelectrotech.org/forum/viewtopic.php?pid=5674#p5674'>howto</a><br>2. pip3 install qet_tb_generator<br><B><U> Update on macOSX</B></U><br> pip3 install --upgrade qet_tb_generator<br> - + To install the plugin qet_tb_generator<br>Visit :<br><a href='https://pypi.python.org/pypi/qet-tb-generator'>qet-tb-generator</a><br><br>Requires python 3.5 or above.<br><br><B><U> First install on Linux</B></U><br>1. check you have pip3 installed: pip3 --version<br>If not install with: sudo apt-get install python3-pip<br>2. Install the program: sudo pip3 install qet_tb_generator<br>3. Run the program: qet_tb_generator<br><br><B><U> Update on Linux</B></U><br>sudo pip3 install --upgrade qet_tb_generator<br> Pour installer le plugin qet_tb_generator<br>Visitez:<br><a.href='https://pypi.python.org/pypi/qet-tb-generator'>qet-tb-generator</a><br><br>Nécessite python 3.5 ou supérieur.<br><br><B><U>Première installation sous Linux</B></U><br>1. vérifiez que pip3 est installé: pip3 --version <br>Si ce n'est pas le cas, installez avec: sudo apt-get install python3-pip <br>2. Installez le programme: sudo pip3 install qet_tb_generator <br> 3. Exécutez le programme: qet_tb_generator <br><br><B><U> Mise à jour sous Linux </B></U><br>sudo pip3 install --upgrade qet_tb_generator<br> - + Error launching qet_tb_generator plugin Erreur lors du lancement du plugin qet_tb_generator @@ -14152,9 +14719,9 @@ Voulez-vous la remplacer ? - - + + @@ -14301,7 +14868,7 @@ Voulez-vous la remplacer ? Ouvrir un element - + Importer un fichier dxf Importer un fichier dxf @@ -14483,8 +15050,8 @@ Veuillez télécharger celui-ci en suivant le lien ci dessous et le dézipper da - - + + Déplacer %1 Déplacer %1 @@ -14629,88 +15196,88 @@ Veuillez télécharger celui-ci en suivant le lien ci dessous et le dézipper da - + Ajouter %1 Ajouter %1 - + Modifier les propriétés du conducteur Modifier les propriétés du conducteur - + Modifier un texte Modifier un texte - + Modifier la couleur d'un texte Modifier la couleur d'un texte - + Pivoter un texte Pivoter un texte - + Modifier le trait d'une forme Modifier le trait d'une forme - + Modifier le remplissage d'une forme Modifier le remplissage d'une forme - + Pivoter une forme Pivoter une forme - - + + Modifier la forme d'%1 Modifier la forme d'%1 - + Fermer/Ouvrir %1 Fermer/Ouvrir %1 - + Redimensionner une image Redimensionner une image - + Pivoter une image Pivoter une image - + Modifier un texte d'élément Modifier un texte d'élément - + Numéroter automatiquement un élément Numéroter automatiquement un élément - + Renuméroter les éléments (%1) Renuméroter les éléments (%1) - + Rechercher et remplacer Rechercher et remplacer - + Script @@ -14766,10 +15333,26 @@ Pour l'activer : Configurer QElectroTech > Général > Projets, ou d Dégeler le nom de l'élément - + Folio Folio + + + (Aucune action) + spacemouse config: unbound button + (Aucune action) + + + + Miroir horizontal + Miroir horizontal + + + + Miroir vertical + Miroir vertical + QTextOrientationWidget @@ -16748,52 +17331,90 @@ Les autres champs ne sont pas utilisés. ShortcutsConfigPage - + Filtrer les raccourcis… Filtrer les raccourcis… - + Tous Tous - + Attribués uniquement Attribués uniquement - + Non attribués uniquement Non attribués uniquement - + Conflits uniquement Conflits uniquement - + + Toutes les catégories + Toutes les catégories + + + + Appuyez sur une combinaison de touches pour voir quelle commande l'utilise + Appuyez sur une combinaison de touches pour voir quelle commande l'utilise + + + + Effacer la touche recherchée + Effacer la touche recherchée + + + + Rechercher par touche : + Rechercher par touche : + + + + Action Action - + + Raccourci Raccourci - + + + Menu + Menu + + + Tout réinitialiser Tout réinitialiser - + + Copier la liste + Copier la liste + + + + Copie les raccourcis affichés, à coller dans un tableur ou un document + Copie les raccourcis affichés, à coller dans un tableur ou un document + + + Réinitialiser ce raccourci Réinitialiser ce raccourci - + %n action(s) %n action(s) @@ -16801,17 +17422,117 @@ Les autres champs ne sont pas utilisés. - + Ce raccourci est aussi utilisé par : %1 Ce raccourci est aussi utilisé par : %1 - + + Catégorie + Catégorie + + + Raccourcis configuration page title Raccourcis + + SpaceMouseConfigPage + + + Associez un numéro de bouton de votre souris 3D (SpaceMouse, SpacePilot...) à une action de QElectroTech. Le numéro de bouton dépend de votre appareil et de son pilote -- reportez-vous à sa documentation, ou essayez successivement les valeurs à partir de 0. + spacemouse config page intro + Associez un numéro de bouton de votre souris 3D (SpaceMouse, SpacePilot...) à une action de QElectroTech. Le numéro de bouton dépend de votre appareil et de son pilote -- reportez-vous à sa documentation, ou essayez successivement les valeurs à partir de 0. + + + + N° bouton + N° bouton + + + + Action + Action + + + + Ajouter une association + Ajouter une association + + + + Boutons + Boutons + + + + Les petits mouvements en dessous de ce seuil sont ignorés. Augmentez-le si la vue dérive quand vous ne touchez pas la souris. + Les petits mouvements en dessous de ce seuil sont ignorés. Augmentez-le si la vue dérive quand vous ne touchez pas la souris. + + + + Pousser / tirer le capuchon + Pousser / tirer le capuchon + + + + Tourner le capuchon + Tourner le capuchon + + + + Inverser le déplacement horizontal + Inverser le déplacement horizontal + + + + Inverser le déplacement vertical + Inverser le déplacement vertical + + + + Inverser le zoom + Inverser le zoom + + + + Vitesse de déplacement : + Vitesse de déplacement : + + + + Vitesse du zoom : + Vitesse du zoom : + + + + Zoomer en : + Zoomer en : + + + + Zone morte : + Zone morte : + + + + Mouvement + Mouvement + + + + Supprimer cette association + Supprimer cette association + + + + Souris 3D + configuration page title + Souris 3D + + StyleEditor @@ -18837,7 +19558,7 @@ Les autres champs ne sont pas utilisés. Terminal - + Cette borne a déjà %n conducteur(s), la limite du projet. Ajoutez une borne pour raccorder un conducteur de plus. wire refused by the wires-per-terminal limit @@ -18881,8 +19602,8 @@ Les autres champs ne sont pas utilisés. - - + + T%1 T%1 @@ -18963,25 +19684,25 @@ Les autres champs ne sont pas utilisés. Afficher/cacher le cadre du label - - + + Modifier la couleur du label Modifier la couleur du label - + Modifier l'étiquette du maître Modifier l'étiquette du maître - - - + + + Modifier le nom de la borne Modifier le nom de la borne - + Modifier l'index de l'étiquette du maître Modifier l'index de l'étiquette du maître @@ -19599,12 +20320,12 @@ Les autres champs ne sont pas utilisés. Explorateur de bornier - + Projet sans titre Projet sans titre - + Bornes indépendante Bornes indépendante @@ -19694,6 +20415,22 @@ Les autres champs ne sont pas utilisés. Modifier l'alignement d'un champ texte + + TextResizeCommand + + + Redimensionner un texte + Redimensionner un texte + + + + TextResizeHandles + + + Glisser pour changer la largeur du texte, double-cliquer pour une largeur automatique + Glisser pour changer la largeur du texte, double-cliquer pour une largeur automatique + + ThirdPartyBinaryInstallDialog @@ -19904,31 +20641,31 @@ associer le nom "volta" et la valeur "1745" remplacera %{vol associer le nom "volta" et la valeur "1745" remplacera %{volta} par 1745 dans le cartouche. - + Éditer ce modèle menu entry Éditer ce modèle - + Dupliquer et éditer ce modèle menu entry Dupliquer et éditer ce modèle - + Title block templates actions Title block templates actions - - + + Créer un Folio Numérotation Auto Créer un Folio Numérotation Auto - + Modèle par défaut Modèle par défaut @@ -19936,13 +20673,13 @@ associer le nom "volta" et la valeur "1745" remplacera %{vol TitleBlockTemplate - + %1 : %2 titleblock content - please let the blank space at the beginning %1 : %2 - + %1 %1 @@ -20442,6 +21179,175 @@ associer le nom "volta" et la valeur "1745" remplacera %{vol Cartouches du projet "%1" + + ToolbarCommandsConfigPage + + + Choisissez les commandes de chaque barre d'outils de l'éditeur de schémas. Glissez une commande de la liste de gauche vers la barre, ou double-cliquez dessus ; Suppr la retire. + Choisissez les commandes de chaque barre d'outils de l'éditeur de schémas. Glissez une commande de la liste de gauche vers la barre, ou double-cliquez dessus ; Suppr la retire. + + + + Nouvelle barre… + Nouvelle barre… + + + + Renommer… + Renommer… + + + + Supprimer la barre + Supprimer la barre + + + + Valeurs par défaut + Valeurs par défaut + + + + Rechercher une commande + Rechercher une commande + + + + Ajouter → + Ajouter → + + + + Séparateur + Séparateur + + + + ← Retirer + ← Retirer + + + + Monter + Monter + + + + Descendre + Descendre + + + + Commandes disponibles + Commandes disponibles + + + + Dans la barre, dans l'ordre + Dans la barre, dans l'ordre + + + + Barre d'outils : + Barre d'outils : + + + + Contenu des barres + configuration page title: what each toolbar holds + Contenu des barres + + + + Nouvelle barre d'outils + Nouvelle barre d'outils + + + + + Nom de la barre d'outils : + Nom de la barre d'outils : + + + + Renommer la barre d'outils + Renommer la barre d'outils + + + + ─── Séparateur ─── + ─── Séparateur ─── + + + + ToolbarsConfigPage + + + Par défaut + Par défaut + + + + Petites (16 px) + Petites (16 px) + + + + Moyennes (24 px) + Moyennes (24 px) + + + + Grandes (32 px) + Grandes (32 px) + + + + Très grandes (48 px) + Très grandes (48 px) + + + + Icône seule + Icône seule + + + + Texte à côté de l'icône + Texte à côté de l'icône + + + + Texte sous l'icône + Texte sous l'icône + + + + Verrouiller les barres d'outils (elles ne peuvent plus être déplacées) + Verrouiller les barres d'outils (elles ne peuvent plus être déplacées) + + + + Taille des icônes : + Taille des icônes : + + + + Boutons : + Boutons : + + + + Pour afficher ou masquer une barre d'outils, faites un clic droit sur une barre d'outils. + Pour afficher ou masquer une barre d'outils, faites un clic droit sur une barre d'outils. + + + + Barres d'outils + configuration page title + Barres d'outils + + WiringListDialog @@ -20661,72 +21567,82 @@ associer le nom "volta" et la valeur "1745" remplacera %{vol Par défaut - Ajuster à la hauteur XRef - + + Quand les textes de deux références croisées se chevauchent, celle de l'élément le plus haut est placée au-dessus de l'autre. + Quand les textes de deux références croisées se chevauchent, celle de l'élément le plus haut est placée au-dessus de l'autre. + + + + Empiler les références dont les textes se chevauchent + Empiler les références dont les textes se chevauchent + + + XRef slave position Position XRef de l'esclave - + Distance label - slave : Distance label - slave : - + Distance in pixels between the label and the slave cross reference Distance in pixels between the label and the slave cross reference - + Afficher les numéros de bornes dans les Xrefs Afficher les numéros de bornes dans les Xrefs - + Afficher dans le peigne de contacts tous les contacts esclaves définis par le maître, même ceux qui ne sont pas encore reliés, dans l'ordre défini par le maître Afficher dans le peigne de contacts tous les contacts esclaves définis par le maître, même ceux qui ne sont pas encore reliés, dans l'ordre défini par le maître - + Afficher tous les esclaves définis par le maître Afficher tous les esclaves définis par le maître - + Affiche&r en contacts Affiche&r en contacts - + Afficher en croix Afficher en croix - + Label des références croisées Label des références croisées - + Maitre Maitre - + %f-%l%c %f-%l%c - + Esclave Esclave - + (%f-%l%c) (%f-%l%c) - + Créer votre propre texte en vous aidant des variables suivantes : %f : le numéro de folio %F: le label de folio @@ -20743,27 +21659,27 @@ associer le nom "volta" et la valeur "1745" remplacera %{vol %LM: Localisation - + Option d'affichage en croix Option d'affichage en croix - + Afficher les contacts de puissance dans la croix Afficher les contacts de puissance dans la croix - + Préfixe des contacts de puissance : Préfixe des contacts de puissance : - + Préfixe des contacts temporisés : Préfixe des contacts temporisés : - + Préfixe des contacts inverseurs : Préfixe des contacts inverseurs : @@ -20846,12 +21762,12 @@ associer le nom "volta" et la valeur "1745" remplacera %{vol Seules les requêtes en lecture seule (SELECT ou WITH ... SELECT) sont autorisées. - + Exporter la base de données interne du projet Exporter la base de données interne du projet - + sans_nom sans_nom @@ -20875,27 +21791,27 @@ associer le nom "volta" et la valeur "1745" remplacera %{vol qdesigner_internal::RichTextEditorDialog - + Edit text Éditer le texte - + Rich Text Texte enrichi - + Source Source - + &OK &OK - + &Cancel &Annuler @@ -20903,69 +21819,69 @@ associer le nom "volta" et la valeur "1745" remplacera %{vol qdesigner_internal::RichTextEditorToolBar - + Texte en gras Texte en gras - - - + + + Éditeur de texte Éditeur de texte - + Texte en italique Texte en italique - + Texte souligé Texte souligé - + Left Align Aligner à gauche - + Center Centrer - + Right Align Aligner à droite - + Justify Justifier - + Superscript Superscript - + Subscript Subscript - + Insérer un lien Insérer un lien - + Insert &Image Insert &Image - + Simplify Rich Text Simplifier le texte enrichi From be48b59e8f6e03853a7d62d906e031f961c1a8c5 Mon Sep 17 00:00:00 2001 From: Beat Hangartner Date: Wed, 7 Oct 2026 11:33:22 +0200 Subject: [PATCH 04/22] Drop a picture's stale crop when loading a project Before #1310, undoing a crop left the crop rectangle in place, so a project saved afterwards has a but shows the uncropped picture. Since #1368 the picture shown is computed from the original and the crop, so the first mirror or colour key of such a picture applied the old crop again, and undoing that edit showed the cropped picture. The picture shown is always exactly the size of the crop. fromXml() now drops a crop that does not match it: the crop becomes the whole original, and when the shown picture is not the original's size either, the shown picture becomes the original. Valid files load and save as before. New tst_imagestalecrop: a valid crop is kept; a stale one is dropped for a shown picture of the original's size and of another size, where a later crop cuts the picture that was shown. Co-Authored-By: Claude Opus 5.5 --- sources/qetgraphicsitem/diagramimageitem.cpp | 12 ++ tests/qttest/CMakeLists.txt | 14 ++ tests/qttest/tst_imagestalecrop.cpp | 196 +++++++++++++++++++ 3 files changed, 222 insertions(+) create mode 100644 tests/qttest/tst_imagestalecrop.cpp diff --git a/sources/qetgraphicsitem/diagramimageitem.cpp b/sources/qetgraphicsitem/diagramimageitem.cpp index e2dc0f5ce..da8931748 100644 --- a/sources/qetgraphicsitem/diagramimageitem.cpp +++ b/sources/qetgraphicsitem/diagramimageitem.cpp @@ -1595,6 +1595,18 @@ bool DiagramImageItem::fromXml(const QDomElement &e) m_crop_rect = m_crop_rect.intersected(m_base_pixmap.rect()); if (m_crop_rect.isEmpty()) m_crop_rect = m_base_pixmap.rect(); + + // The picture shown is always exactly the crop's size. When it is + // not, the crop is stale: older versions saved it after the crop + // was undone (fixed in #1310), with the uncropped picture shown. + // The next edit would apply that crop again, and undoing the edit + // would show the cropped picture. Keep what was shown instead. + if (hasCrop && pixmap.size() != m_crop_rect.size()) + { + if (pixmap.size() != m_base_pixmap.size()) + m_base_pixmap = pixmap; + m_crop_rect = m_base_pixmap.rect(); + } } // Baseline: the plain "rotation"/"size" attributes, understood by diff --git a/tests/qttest/CMakeLists.txt b/tests/qttest/CMakeLists.txt index bd8a82c01..5d7e8d30f 100644 --- a/tests/qttest/CMakeLists.txt +++ b/tests/qttest/CMakeLists.txt @@ -894,6 +894,20 @@ if(QET_HAS_SCRIPTING) "QET_EXAMPLES_DIR=\"${QET_DIR}/examples\"") endif() +# A picture whose saved crop does not match the picture shown (an undone +# crop, saved before #1310) loads without that crop; a valid crop is kept. +if(QET_HAS_SCRIPTING) + add_executable( + tst_imagestalecrop + tst_imagestalecrop.cpp) + add_test(NAME tst_imagestalecrop COMMAND tst_imagestalecrop) + add_dependencies(tst_imagestalecrop qelectrotech) + target_link_libraries(tst_imagestalecrop PRIVATE Qt::Test Qt::Gui) + target_compile_definitions(tst_imagestalecrop PRIVATE + "QET_TEST_BINARY_PATH=\"$\"" + "QET_EXAMPLES_DIR=\"${QET_DIR}/examples\"") +endif() + # Saving a project that was just saved changes nothing: runs the real # binary's --resave twice on every project in examples/, and on one whose # title block holds a single-space value (#973). diff --git a/tests/qttest/tst_imagestalecrop.cpp b/tests/qttest/tst_imagestalecrop.cpp new file mode 100644 index 000000000..d2f889493 --- /dev/null +++ b/tests/qttest/tst_imagestalecrop.cpp @@ -0,0 +1,196 @@ +/* + Copyright 2006-2026 The QElectroTech Team + This file is part of QElectroTech. + + QElectroTech is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + QElectroTech is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with QElectroTech. If not, see . +*/ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/** + Before #1310, a project saved after a crop was undone kept the undone + , with the uncropped picture shown. Loading such a file has to + drop that crop: the picture shown is always exactly the crop's size, + so a picture of another size means the crop is stale. Otherwise the + next edit of the picture applies the crop again. + + Runs the real binary: a script adds and crops a picture and saves; + the test then puts another picture where the shown one is, and lets + the binary load and save that file again. +*/ +class tst_imagestalecrop : public QObject +{ + Q_OBJECT + + QTemporaryDir m_dir; + + // Runs the binary on @p project with a script that saves it to @p out. + bool run(const QString &script, const QString &project) + { + const QString path = m_dir.filePath(QStringLiteral("probe.js")); + const QString home = m_dir.filePath(QStringLiteral("home")); + QDir().mkpath(home); + QFile f(path); + if (!f.open(QIODevice::WriteOnly)) return false; + f.write(script.toUtf8()); + f.close(); + QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); + env.insert(QStringLiteral("QT_QPA_PLATFORM"), QStringLiteral("offscreen")); + env.insert(QStringLiteral("QET_ENABLE_SCRIPTING"), QStringLiteral("1")); + env.insert(QStringLiteral("HOME"), home); + env.insert(QStringLiteral("XDG_CONFIG_HOME"), home + QStringLiteral("/config")); + env.insert(QStringLiteral("XDG_DATA_HOME"), home + QStringLiteral("/data")); + env.insert(QStringLiteral("TMPDIR"), m_dir.path()); + QProcess proc; + proc.setProcessEnvironment(env); + proc.start(QStringLiteral(QET_TEST_BINARY_PATH), + {QStringLiteral("--run"), path, project}); + return proc.waitForFinished(120000) && proc.exitStatus() == QProcess::NormalExit; + } + + // Opens @p in and saves it to @p out. + bool resave(const QString &in, const QString &out) + { + return run(QStringLiteral("qet.save('%1');\n").arg(out), in) && QFile::exists(out); + } + + static QByteArray read(const QString &path) + { + QFile f(path); + return f.open(QIODevice::ReadOnly) ? f.readAll() : QByteArray(); + } + + static QByteArray png(const QSize &size) + { + QImage img(size, QImage::Format_RGB32); + img.fill(Qt::darkGreen); + QByteArray bytes; + QBuffer buffer(&bytes); + buffer.open(QIODevice::WriteOnly); + img.save(&buffer, "PNG"); + return bytes.toBase64(); + } + + // The size of the saved original (), or an empty size. + static QSize baseSize(const QByteArray &xml) + { + const QRegularExpression base(QStringLiteral("\\s*([A-Za-z0-9+/=]+)")); + const QRegularExpressionMatch m = base.match(QString::fromLatin1(xml)); + if (!m.hasMatch()) return {}; + return QImage::fromData(QByteArray::fromBase64(m.captured(1).toLatin1())).size(); + } + + // @p xml with the shown picture (the element's first text) + // replaced by a PNG of @p size. + static QByteArray withShown(QByteArray xml, const QSize &size) + { + const QRegularExpression shown(QStringLiteral("(]*>\\s*)([A-Za-z0-9+/=]+)")); + const QRegularExpressionMatch m = shown.match(QString::fromLatin1(xml)); + if (!m.hasMatch()) return {}; + return xml.replace(m.capturedStart(2), m.capturedLength(2), png(size)); + } + + QString m_cropped; // a picture of 40 x 30, cropped to 10,5,20,10 + +private slots: + void initTestCase() + { + QVERIFY(m_dir.isValid()); + QVERIFY(QFile::exists(QStringLiteral(QET_TEST_BINARY_PATH))); + QImage img(40, 30, QImage::Format_RGB32); + img.fill(Qt::darkGreen); + const QString pic = m_dir.filePath(QStringLiteral("pic.png")); + QVERIFY(img.save(pic)); + + m_cropped = m_dir.filePath(QStringLiteral("cropped.qet")); + QVERIFY(run(QStringLiteral(R"JS( +var i = qet.addImage(0, '%1', 100, 100); +qet.cropImage(0, i, 10, 5, 20, 10); +qet.save('%2'); +)JS").arg(pic, m_cropped), QStringLiteral(QET_EXAMPLES_DIR "/741.qet"))); + const QByteArray xml = read(m_cropped); + QCOMPARE(xml.count("")); + } + + // A valid crop is kept, byte for byte. + void validCropIsKept() + { + const QString out = m_dir.filePath(QStringLiteral("valid-out.qet")); + QVERIFY(resave(m_cropped, out)); + const QByteArray xml = read(out); + // Attributes in any order: Qt before 6.5 writes them unordered. + const QRegularExpression crop(QStringLiteral("]*\\bx=\"10\")(?=[^>]*\\by=\"5\")" + "(?=[^>]*\\bw=\"20\")(?=[^>]*\\bh=\"10\")")); + QVERIFY2(crop.match(QString::fromLatin1(xml)).hasMatch(), "the valid crop was lost"); + QVERIFY(xml.contains("")); + } + + // The shown picture is the whole original (40 x 30): the crop was + // undone before the file was saved. It is dropped, and with nothing + // else to remember the original is not saved twice any more. + void staleCropOfWholeOriginalIsDropped() + { + const QString stale = m_dir.filePath(QStringLiteral("stale.qet")); + const QByteArray xml = withShown(read(m_cropped), QSize(40, 30)); + QVERIFY(!xml.isEmpty()); + QFile f(stale); + QVERIFY(f.open(QIODevice::WriteOnly)); + f.write(xml); + f.close(); + + const QString out = m_dir.filePath(QStringLiteral("stale-out.qet")); + QVERIFY(resave(stale, out)); + const QByteArray saved = read(out); + QCOMPARE(saved.count("")); + } + + // The shown picture matches neither the crop nor the original: it is + // what the user saw, so it becomes the original -- a crop made after + // loading cuts it, not the old original. + void shownPictureOfOtherSizeBecomesTheOriginal() + { + const QString odd = m_dir.filePath(QStringLiteral("odd.qet")); + const QByteArray xml = withShown(read(m_cropped), QSize(25, 25)); + QVERIFY(!xml.isEmpty()); + QFile f(odd); + QVERIFY(f.open(QIODevice::WriteOnly)); + f.write(xml); + f.close(); + + const QString out = m_dir.filePath(QStringLiteral("odd-out.qet")); + QVERIFY(resave(odd, out)); + const QByteArray saved = read(out); + QVERIFY2(!saved.contains("")); + + const QString recropped = m_dir.filePath(QStringLiteral("odd-recropped.qet")); + QVERIFY(run(QStringLiteral("qet.cropImage(0, 0, 0, 0, 10, 10);\nqet.save('%1');\n") + .arg(recropped), odd)); + QCOMPARE(baseSize(read(recropped)), QSize(25, 25)); + } +}; + +QTEST_MAIN(tst_imagestalecrop) +#include "tst_imagestalecrop.moc" From 0795281d79948953260d84393f65a6c0243c4882 Mon Sep 17 00:00:00 2001 From: Beat Hangartner Date: Wed, 7 Oct 2026 21:10:38 +0200 Subject: [PATCH 05/22] Initialise the rotation of a new line and polygon in the element editor PartLine and PartPolygon keep their rotation in m_rot, which nothing sets until setRotation() is called. rotation() reads it, and setRotation() computes the difference from it, so the first rotate of a freshly drawn line or polygon in the element editor starts from garbage: qRound(m_rot * 100.0) on an arbitrary value is undefined behaviour, and the angle stored afterwards is arbitrary too. PartRectangle and PartEllipse already start at 0. Give m_rot a default value of 0 in both headers, as PartEllipse has. Only the two headers change. No file-format change, and no change for a part loaded from a file or rotated once, since both set m_rot before reading it. Tests: none of their own; an uninitialised read is what a sanitizer finds, and this one is the same kind as the BorderTitleBlock and ConductorProfile fixes (#1358, #1359). ctest on macOS, and all example projects through --resave and --export-svg, unchanged. Co-Authored-By: Claude Fable 5.1 Signed-off-by: Beat Hangartner --- sources/editor/graphicspart/partline.h | 2 +- sources/editor/graphicspart/partpolygon.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sources/editor/graphicspart/partline.h b/sources/editor/graphicspart/partline.h index 1e3082a53..7d09b7d60 100644 --- a/sources/editor/graphicspart/partline.h +++ b/sources/editor/graphicspart/partline.h @@ -127,6 +127,6 @@ class PartLine : public CustomElementGraphicPart int m_vector_index = -1; QPropertyUndoCommand *m_undo_command; QVector m_handler_vector; - qreal m_rot; + qreal m_rot = 0; }; #endif diff --git a/sources/editor/graphicspart/partpolygon.h b/sources/editor/graphicspart/partpolygon.h index bee786be4..f2d959460 100644 --- a/sources/editor/graphicspart/partpolygon.h +++ b/sources/editor/graphicspart/partpolygon.h @@ -119,6 +119,6 @@ class PartPolygon : public CustomElementGraphicPart QAction *m_insert_point, *m_remove_point; QPointF m_context_menu_pos; - qreal m_rot; + qreal m_rot = 0; }; #endif From 863c5e07ba7b11eb303f06ab59f4c18ef48ee163 Mon Sep 17 00:00:00 2001 From: Beat Hangartner Date: Wed, 7 Oct 2026 21:10:30 +0200 Subject: [PATCH 06/22] Initialise the read-only flag of the title block logo manager TitleBlockTemplateLogoManager never sets read_only_: its constructor leaves the member uninitialised, and setReadOnly() returns early when the new value equals the member. The template editor calls setReadOnly() right after creating the manager, so whenever the garbage value happened to match, the call did nothing: the add, delete and rename buttons stayed enabled on a read-only template, and isReadOnly() returned garbage. Give the member a default value, false, in the header, matching the buttons' state after construction. Only sources/titleblock/templatelogomanager.h changes. No behaviour change for an editable template: setReadOnly(false) on a manager that is already editable still returns early. No file-format change. Tests: none of their own; an uninitialised read is what a sanitizer finds, and this one is the same kind as the BorderTitleBlock and ConductorProfile fixes (#1358, #1359). ctest on macOS, and all example projects through --resave and --export-svg, unchanged. Co-Authored-By: Claude Fable 5.1 Signed-off-by: Beat Hangartner --- sources/titleblock/templatelogomanager.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sources/titleblock/templatelogomanager.h b/sources/titleblock/templatelogomanager.h index 7e26c9c56..3a4ff5e90 100644 --- a/sources/titleblock/templatelogomanager.h +++ b/sources/titleblock/templatelogomanager.h @@ -73,6 +73,6 @@ class TitleBlockTemplateLogoManager : public QWidget { QLabel *logo_type_; ///< current logo type QDialogButtonBox *buttons_; ///< ok/cancel buttons QDir open_dialog_dir_; ///< last opened directory - bool read_only_; ///< Whether this logo manager should allow logo edition (renaming, addition, deletion) + bool read_only_ = false; ///< Whether this logo manager should allow logo edition (renaming, addition, deletion) }; #endif From 6b83fdf7b332c6db8c7c1e3b899d543c09b3a63b Mon Sep 17 00:00:00 2001 From: Beat Hangartner Date: Wed, 7 Oct 2026 21:03:12 +0200 Subject: [PATCH 07/22] Read a folio's freeze flags back as the words they are saved as Diagram::toXml() writes freezeNewElement and freezeNewConductor as "true"/"false", but Diagram::fromXml() read them with toInt(), which is 0 for both words. So "freeze new elements" and "freeze new conductors" were off again on every folio after a project was saved and reopened, since the day the flags were added. Compare the attribute with "true" instead. The project-level flags in QETProject already do this. No file-format change: the attributes are written exactly as before, and a file without them still loads with both flags off. Tests: tst_foliofreezeflags runs the binary's --resave on a fixture with one folio per combination (both, elements only, none, attributes missing) and reads the saved attributes back. The two frozen folios fail on master. Co-Authored-By: Claude Fable 5.1 Signed-off-by: Beat Hangartner --- sources/diagram.cpp | 8 +- tests/qttest/CMakeLists.txt | 12 +++ tests/qttest/fixtures/folio_freeze_flags.qet | 36 +++++++ tests/qttest/tst_foliofreezeflags.cpp | 103 +++++++++++++++++++ 4 files changed, 157 insertions(+), 2 deletions(-) create mode 100644 tests/qttest/fixtures/folio_freeze_flags.qet create mode 100644 tests/qttest/tst_foliofreezeflags.cpp diff --git a/sources/diagram.cpp b/sources/diagram.cpp index f257729c0..978614106 100644 --- a/sources/diagram.cpp +++ b/sources/diagram.cpp @@ -1614,10 +1614,14 @@ bool Diagram::fromXml(QDomElement &document, m_conductors_autonum_name = root.attribute(QStringLiteral("conductorAutonum")); // Load Freeze New Element - m_freeze_new_elements = root.attribute(QStringLiteral("freezeNewElement")).toInt(); + // Written as "true"/"false" by toXml(), so compare the text: + // toInt() of either word is 0. + m_freeze_new_elements = root.attribute(QStringLiteral("freezeNewElement")) + == QLatin1String("true"); // Load Freeze New Conductor - m_freeze_new_conductors_ = root.attribute(QStringLiteral("freezeNewConductor")).toInt(); + m_freeze_new_conductors_ = root.attribute(QStringLiteral("freezeNewConductor")) + == QLatin1String("true"); //Load Element Folio Sequential folioSequentialsFromXml(root, diff --git a/tests/qttest/CMakeLists.txt b/tests/qttest/CMakeLists.txt index bd8a82c01..d20eb3711 100644 --- a/tests/qttest/CMakeLists.txt +++ b/tests/qttest/CMakeLists.txt @@ -908,6 +908,18 @@ target_compile_definitions(tst_resaveunchanged PRIVATE "QET_TEST_BINARY_PATH=\"$\"" "QET_EXAMPLES_DIR=\"${QET_DIR}/examples\"") +# A folio's "freeze new elements/conductors" flags, saved as the words +# "true"/"false", are read back as words: the real binary's --resave on +# fixtures/folio_freeze_flags.qet, one folio per combination. +add_executable( + tst_foliofreezeflags + tst_foliofreezeflags.cpp) +add_test(NAME tst_foliofreezeflags COMMAND tst_foliofreezeflags) +add_dependencies(tst_foliofreezeflags qelectrotech) +target_link_libraries(tst_foliofreezeflags PRIVATE Qt::Test Qt::Xml) +target_compile_definitions(tst_foliofreezeflags PRIVATE + "QET_TEST_BINARY_PATH=\"$\"") + # Replacing a symbol's definition in a project keeps its terminal uuids, so # the wires saved against them still load: TerminalUuids::keep() on its own, # then the real binary's --info on an example whose symbols were replaced. diff --git a/tests/qttest/fixtures/folio_freeze_flags.qet b/tests/qttest/fixtures/folio_freeze_flags.qet new file mode 100644 index 000000000..a2e3c6661 --- /dev/null +++ b/tests/qttest/fixtures/folio_freeze_flags.qet @@ -0,0 +1,36 @@ + + + folio_freeze_flags + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Imported elements + + + + diff --git a/tests/qttest/tst_foliofreezeflags.cpp b/tests/qttest/tst_foliofreezeflags.cpp new file mode 100644 index 000000000..6824215a8 --- /dev/null +++ b/tests/qttest/tst_foliofreezeflags.cpp @@ -0,0 +1,103 @@ +/* + Copyright 2006-2026 The QElectroTech Team + This file is part of QElectroTech. + + QElectroTech is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + QElectroTech is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with QElectroTech. If not, see . +*/ +#include +#include +#include +#include + +/** + A folio's "freeze new elements" and "freeze new conductors" flags are + saved as freezeNewElement="true" and freezeNewConductor="true" on its + . Loading must read the words back: the flags used to be read + with toInt(), which is 0 for "true" as well as for "false", so both were + off again after every reload. Runs the real binary's --resave on a + project with one folio per combination and reads the saved attributes. +*/ +class tst_foliofreezeflags : public QObject +{ + Q_OBJECT + + QTemporaryDir m_dir; + + static bool runQet(const QStringList &arguments) + { + QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); + env.insert(QStringLiteral("QT_QPA_PLATFORM"), QStringLiteral("offscreen")); + QProcess proc; + proc.setProcessEnvironment(env); + proc.start(QStringLiteral(QET_TEST_BINARY_PATH), arguments); + return proc.waitForFinished(60000) + && proc.exitStatus() == QProcess::NormalExit + && proc.exitCode() == 0; + } + + /// The elements of a saved project, in file order. + static QList diagrams(const QString &path) + { + QFile file(path); + QDomDocument doc; + if (!file.open(QIODevice::ReadOnly) || !doc.setContent(&file)) return {}; + QList list; + for (QDomElement e = doc.documentElement().firstChildElement(QStringLiteral("diagram")); + !e.isNull(); + e = e.nextSiblingElement(QStringLiteral("diagram"))) + list << e; + return list; + } + +private slots: + void initTestCase() + { + QVERIFY2(QFile::exists(QStringLiteral(QET_TEST_BINARY_PATH)), "qelectrotech binary not found"); + QVERIFY(m_dir.isValid()); + } + + // Folio 1 has both flags, folio 2 only the element one, folio 3 none, + // and folio 4 is an older file without the attributes at all. + void flagsSurviveASave_data() + { + QTest::addColumn("folio"); + QTest::addColumn("element"); + QTest::addColumn("conductor"); + QTest::newRow("both frozen") << 0 << "true" << "true"; + QTest::newRow("elements frozen") << 1 << "true" << "false"; + QTest::newRow("not frozen") << 2 << "false" << "false"; + QTest::newRow("no attributes") << 3 << "false" << "false"; + } + + void flagsSurviveASave() + { + QFETCH(int, folio); + QFETCH(QString, element); + QFETCH(QString, conductor); + + const QString fixture = QFINDTESTDATA("fixtures/folio_freeze_flags.qet"); + QVERIFY2(!fixture.isEmpty(), "fixture project not found"); + const QString out = m_dir.filePath(QStringLiteral("resaved%1.qet").arg(folio)); + QVERIFY2(runQet({QStringLiteral("--resave"), fixture, out}), "--resave failed"); + + const QList list = diagrams(out); + QCOMPARE(list.size(), 4); + const QDomElement e = list.at(folio); + QCOMPARE(e.attribute(QStringLiteral("freezeNewElement")), element); + QCOMPARE(e.attribute(QStringLiteral("freezeNewConductor")), conductor); + } +}; + +QTEST_MAIN(tst_foliofreezeflags) +#include "tst_foliofreezeflags.moc" From 7933e89dc04f56fffcf99bd63ae1c634d300ebf1 Mon Sep 17 00:00:00 2001 From: Beat Hangartner Date: Wed, 7 Oct 2026 21:04:22 +0200 Subject: [PATCH 08/22] Read the default conductor width from the settings as a decimal ConductorProperties::toSettings() writes the conductor width with QString::number(cond_size), e.g. "1.4", and fromSettings() read it back with toInt(), which is 0 for any value that is not a whole number. A default width of 1.4 set in the configuration became 0 on the next start, so every new conductor was drawn with a pen of width 0. Read it with toDouble(), and fall back to 1 when the stored value is not a positive finite number (a hand-edited or truncated settings file), as the other fallbacks in fromSettings() do. No file-format change: this is the settings file only; the project file's condsize attribute was already read with toDouble(). Tests: tst_conductorsizesetting compiles conductorproperties.cpp alone and round-trips 2, 1.4, 0.4, 61.3 and 61.7 through toSettings() and fromSettings() in a QSettings scope of its own; text, 0, -1, nan, inf and a missing value give 1. Nine of the cases fail on master. Co-Authored-By: Claude Fable 5.1 Signed-off-by: Beat Hangartner --- sources/conductorproperties.cpp | 5 +- tests/qttest/CMakeLists.txt | 13 +++ tests/qttest/tst_conductorsizesetting.cpp | 113 ++++++++++++++++++++++ 3 files changed, 130 insertions(+), 1 deletion(-) create mode 100644 tests/qttest/tst_conductorsizesetting.cpp diff --git a/sources/conductorproperties.cpp b/sources/conductorproperties.cpp index 12a55539c..6cf2f40fd 100644 --- a/sources/conductorproperties.cpp +++ b/sources/conductorproperties.cpp @@ -436,7 +436,10 @@ void ConductorProperties::fromSettings(QSettings &settings, const QString &prefi m_wire_color = settings.value(prefix + "conductor_color", "").toString(); m_wire_section = settings.value(prefix + "conductor_section", "").toString(); text_size = settings.value(prefix + "textsize", "7").toInt(); - cond_size = settings.value(prefix + "size", "1").toInt(); + // Saved with QString::number(cond_size): a decimal such as 1.4, + // which toInt() would read as 0. + cond_size = settings.value(prefix + "size", "1").toDouble(); + if (!qIsFinite(cond_size) || cond_size <= 0) cond_size = 1; m_show_text = settings.value(prefix + "displaytext", true).toBool(); m_one_text_per_folio = settings.value(prefix + "onetextperfolio", false).toBool(); verti_rotate_text = settings.value((prefix + "vertirotatetext"), "270").toDouble(); diff --git a/tests/qttest/CMakeLists.txt b/tests/qttest/CMakeLists.txt index bd8a82c01..42814d580 100644 --- a/tests/qttest/CMakeLists.txt +++ b/tests/qttest/CMakeLists.txt @@ -935,6 +935,19 @@ add_test(NAME tst_conductorapplychanges COMMAND tst_conductorapplychanges) target_include_directories(tst_conductorapplychanges PRIVATE ${QET_DIR}/sources) target_link_libraries(tst_conductorapplychanges PRIVATE Qt::Test Qt::Widgets Qt::Xml pugixml::pugixml) +# ConductorProperties::fromSettings() -- the default conductor width is a +# decimal and comes back as saved (1.4 used to be read as 0). +add_executable( + tst_conductorsizesetting + tst_conductorsizesetting.cpp + ${QET_DIR}/sources/conductorproperties.cpp + ${QET_DIR}/sources/qet.cpp + ${QET_DIR}/sources/qeticons.cpp + ${QET_DIR}/sources/shortcutmanager.cpp) +add_test(NAME tst_conductorsizesetting COMMAND tst_conductorsizesetting) +target_include_directories(tst_conductorsizesetting PRIVATE ${QET_DIR}/sources) +target_link_libraries(tst_conductorsizesetting PRIVATE Qt::Test Qt::Widgets Qt::Xml pugixml::pugixml) + # ConductorMultiEdit -- editing several wires at once in the Selection # properties panel: order, which wires an edit reaches, one undo step for # all of them, and fields shown blank because the wires disagree. diff --git a/tests/qttest/tst_conductorsizesetting.cpp b/tests/qttest/tst_conductorsizesetting.cpp new file mode 100644 index 000000000..7a8afbeac --- /dev/null +++ b/tests/qttest/tst_conductorsizesetting.cpp @@ -0,0 +1,113 @@ +/* + Copyright 2006-2026 The QElectroTech Team + This file is part of QElectroTech. + + QElectroTech is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + QElectroTech is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with QElectroTech. If not, see . +*/ +#include "conductorproperties.h" +#include "qetapp.h" + +#include +#include + +// qet.cpp, compiled in for ConductorProperties, refers to this static. +QString QETApp::m_interface_language; + +/** + ConductorProperties::toSettings()/fromSettings() keep the conductor + width (cond_size) as it was saved. The width is a decimal, written with + QString::number(); reading it with toInt() gave 0 for every value that + was not a whole number, so a default width of 1.4 came back as 0 after + a restart. + + This test owns its own QSettings scope (organization + application + name), so it cannot read or write the configuration of whoever runs it. +*/ +class tst_conductorsizesetting : public QObject +{ + Q_OBJECT + +private slots: + void initTestCase() + { + QCoreApplication::setOrganizationName( + QStringLiteral("QElectroTech-tst_conductorsizesetting")); + QCoreApplication::setApplicationName(QStringLiteral("tst_conductorsizesetting")); + QSettings settings; + settings.clear(); + } + + void init() + { + QSettings settings; + settings.clear(); + settings.sync(); + } + + void widthSurvivesARoundTrip_data() + { + QTest::addColumn("width"); + QTest::newRow("whole number") << 2.0; + QTest::newRow("decimal") << 1.4; + QTest::newRow("minimum") << 0.4; + QTest::newRow("rounds down") << 61.3; + QTest::newRow("rounds up") << 61.7; + } + + void widthSurvivesARoundTrip() + { + QFETCH(qreal, width); + QSettings settings; + ConductorProperties saved; + saved.cond_size = width; + saved.toSettings(settings, QStringLiteral("test/")); + + ConductorProperties loaded; + loaded.fromSettings(settings, QStringLiteral("test/")); + QCOMPARE(loaded.cond_size, width); + } + + // A hand-edited or truncated settings file must not give a width of 0. + void unusableValueFallsBackToOne_data() + { + QTest::addColumn("value"); + QTest::newRow("text") << QStringLiteral("wide"); + QTest::newRow("zero") << QStringLiteral("0"); + QTest::newRow("negative") << QStringLiteral("-1"); + QTest::newRow("nan") << QStringLiteral("nan"); + QTest::newRow("inf") << QStringLiteral("inf"); + } + + void unusableValueFallsBackToOne() + { + QFETCH(QString, value); + QSettings settings; + settings.setValue(QStringLiteral("test/size"), value); + + ConductorProperties loaded; + loaded.fromSettings(settings, QStringLiteral("test/")); + QCOMPARE(loaded.cond_size, 1.0); + } + + void missingValueIsOne() + { + QSettings settings; + ConductorProperties loaded; + loaded.fromSettings(settings, QStringLiteral("test/")); + QCOMPARE(loaded.cond_size, 1.0); + } +}; + +QTEST_GUILESS_MAIN(tst_conductorsizesetting) +#include "tst_conductorsizesetting.moc" From 6674bae05778f41dcd5f71cec78c98fa847f4c7e Mon Sep 17 00:00:00 2001 From: Beat Hangartner Date: Wed, 7 Oct 2026 21:05:33 +0200 Subject: [PATCH 09/22] Read the default border's column width and row height as decimals BorderProperties::toXml() writes colsize and rowsize with "%1", so a project whose default border has a width such as 60.5 saves it as "60.5". fromXml() read both back with toInt(), which is 0 for a decimal, and the folio clamps 0 to its 5 px minimum. New folios of such a project got 5 px columns and rows. The folio's own reader, BorderTitleBlock::borderFromXml(), already uses toDouble(). Read the two sizes with toDouble(&ok) and keep the previous value when the attribute is missing, not a number, or not finite. No file-format change: toXml() is untouched, and whole-number sizes, which every example project has, load exactly as before. Tests: tst_borderpropertiesxml compiles borderproperties.cpp alone and reads 50, 60.5, 61.3 and 61.7 back, round-trips 60.5/80.25 through toXml(), and leaves the value alone for a missing, text, nan or inf attribute. Seven cases fail on master. Co-Authored-By: Claude Fable 5.1 Signed-off-by: Beat Hangartner --- sources/borderproperties.cpp | 10 +- tests/qttest/CMakeLists.txt | 10 ++ tests/qttest/tst_borderpropertiesxml.cpp | 119 +++++++++++++++++++++++ 3 files changed, 137 insertions(+), 2 deletions(-) create mode 100644 tests/qttest/tst_borderpropertiesxml.cpp diff --git a/sources/borderproperties.cpp b/sources/borderproperties.cpp index b1812032c..b9ab708bd 100644 --- a/sources/borderproperties.cpp +++ b/sources/borderproperties.cpp @@ -117,9 +117,15 @@ void BorderProperties::toXml(QDomElement &e) const */ void BorderProperties::fromXml(QDomElement &e) { if (e.hasAttribute("cols")) columns_count = e.attribute("cols").toInt(); - if (e.hasAttribute("colsize")) columns_width = e.attribute("colsize").toInt(); if (e.hasAttribute("rows")) rows_count = e.attribute("rows").toInt(); - if (e.hasAttribute("rowsize")) rows_height = e.attribute("rowsize").toInt(); + // The sizes are decimals (toXml() writes them with %1), read as + // BorderTitleBlock::borderFromXml() does; an unreadable value is + // left as it was. + bool ok; + qreal size = e.attribute("colsize").toDouble(&ok); + if (ok && qIsFinite(size)) columns_width = size; + size = e.attribute("rowsize").toDouble(&ok); + if (ok && qIsFinite(size)) rows_height = size; if (e.hasAttribute("displaycols")) display_columns = e.attribute("displaycols") == "true"; if (e.hasAttribute("displayrows")) display_rows = e.attribute("displayrows") == "true"; } diff --git a/tests/qttest/CMakeLists.txt b/tests/qttest/CMakeLists.txt index bd8a82c01..f91e99343 100644 --- a/tests/qttest/CMakeLists.txt +++ b/tests/qttest/CMakeLists.txt @@ -976,6 +976,16 @@ add_test(NAME tst_xrefpos COMMAND tst_xrefpos) target_include_directories(tst_xrefpos PRIVATE ${QET_DIR}/sources) target_link_libraries(tst_xrefpos PRIVATE Qt::Test Qt::Widgets Qt::Xml pugixml::pugixml) +# BorderProperties::fromXml() -- the project's for new folios: +# column width and row height are decimals and are read as such. +add_executable( + tst_borderpropertiesxml + tst_borderpropertiesxml.cpp + ${QET_DIR}/sources/borderproperties.cpp) +add_test(NAME tst_borderpropertiesxml COMMAND tst_borderpropertiesxml) +target_include_directories(tst_borderpropertiesxml PRIVATE ${QET_DIR}/sources) +target_link_libraries(tst_borderpropertiesxml PRIVATE Qt::Test Qt::Xml) + # Qt 6.4.2 writes the attributes of an element in an order that changes from # one process to the next, so a project saved twice by two runs of the binary # differs in bytes only (seen on projects without any numbering, too). A fixed diff --git a/tests/qttest/tst_borderpropertiesxml.cpp b/tests/qttest/tst_borderpropertiesxml.cpp new file mode 100644 index 000000000..c5aedc7c1 --- /dev/null +++ b/tests/qttest/tst_borderpropertiesxml.cpp @@ -0,0 +1,119 @@ +/* + Copyright 2006-2026 The QElectroTech Team + This file is part of QElectroTech. + + QElectroTech is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + QElectroTech is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with QElectroTech. If not, see . +*/ +#include "borderproperties.h" + +#include +#include + +/** + BorderProperties::fromXml() -- the element a project keeps for + its new folios. Its column width and row height are decimals, written + by toXml() as "%1"; they used to be read with toInt(), which is 0 for + "60.5", and 0 is then clamped to the 5 px minimum by the folio. +*/ +class tst_borderpropertiesxml : public QObject +{ + Q_OBJECT + + static QDomElement border(const QString &attributes) + { + static QDomDocument doc; + doc.setContent(QStringLiteral("").arg(attributes)); + return doc.documentElement(); + } + + static BorderProperties base() + { + BorderProperties p; + p.columns_count = 17; + p.columns_width = 60; + p.rows_count = 8; + p.rows_height = 80; + p.display_columns = true; + p.display_rows = true; + return p; + } + +private slots: + void sizesAreReadAsDecimals_data() + { + QTest::addColumn("colsize"); + QTest::addColumn("rowsize"); + QTest::addColumn("width"); + QTest::addColumn("height"); + QTest::newRow("whole numbers") << "50" << "100" << 50.0 << 100.0; + QTest::newRow("decimals") << "60.5" << "80.25" << 60.5 << 80.25; + QTest::newRow("rounds down") << "61.3" << "61.3" << 61.3 << 61.3; + QTest::newRow("rounds up") << "61.7" << "61.7" << 61.7 << 61.7; + } + + void sizesAreReadAsDecimals() + { + QFETCH(QString, colsize); + QFETCH(QString, rowsize); + QFETCH(qreal, width); + QFETCH(qreal, height); + + BorderProperties p = base(); + QDomElement e = border(QStringLiteral("cols=\"17\" colsize=\"%1\" rows=\"8\" rowsize=\"%2\"") + .arg(colsize, rowsize)); + p.fromXml(e); + QCOMPARE(p.columns_width, width); + QCOMPARE(p.rows_height, height); + QCOMPARE(p.columns_count, 17); + QCOMPARE(p.rows_count, 8); + } + + void savedSizesComeBack() + { + BorderProperties saved = base(); + saved.columns_width = 60.5; + saved.rows_height = 80.25; + QDomDocument doc; + QDomElement e = doc.createElement(QStringLiteral("border")); + saved.toXml(e); + + BorderProperties loaded = base(); + loaded.fromXml(e); + QCOMPARE(loaded.columns_width, 60.5); + QCOMPARE(loaded.rows_height, 80.25); + } + + // An unreadable size leaves the previous value, as a missing one does. + void unreadableSizeIsLeftAlone_data() + { + QTest::addColumn("attributes"); + QTest::newRow("missing") << "cols=\"17\" rows=\"8\""; + QTest::newRow("text") << "colsize=\"wide\" rowsize=\"tall\""; + QTest::newRow("nan") << "colsize=\"nan\" rowsize=\"nan\""; + QTest::newRow("inf") << "colsize=\"inf\" rowsize=\"-inf\""; + } + + void unreadableSizeIsLeftAlone() + { + QFETCH(QString, attributes); + BorderProperties p = base(); + QDomElement e = border(attributes); + p.fromXml(e); + QCOMPARE(p.columns_width, 60.0); + QCOMPARE(p.rows_height, 80.0); + } +}; + +QTEST_GUILESS_MAIN(tst_borderpropertiesxml) +#include "tst_borderpropertiesxml.moc" From e3a1a67c6637b35a68aa99db2529e9868714664f Mon Sep 17 00:00:00 2001 From: Beat Hangartner Date: Wed, 7 Oct 2026 21:08:25 +0200 Subject: [PATCH 10/22] Recognise seqhf_1 when loading sequential numbers saved the old way Before the element, an element's or conductor's sequential numbers were saved as the attributes sequ_1, sequf_1, seqt_1, seqtf_1, seqh_1 and seqhf_1. The readers check for one of them to take the old route, and all three lists had the same slip: sequf_1 twice, seqhf_1 never (Element::fromXml, Conductor::fromXml, and readSequence() in the project database). A file whose only old sequence was the hundred-folio one took the new route, found no , and lost it; the database built its labels from an empty sequence instead of refusing the fast path as it does for the other five attributes. Name seqhf_1 in the three lists. No file-format change: nothing is written differently, and a file with any of the other five attributes loads exactly as before. Tests: tst_legacysequentialattributes runs the binary's --resave on a fixture whose element and conductor carry only seqhf_1 (and a second pair carrying sequ_1 as a control) and reads the written back. The two seqhf_1 cases fail on master. Co-Authored-By: Claude Fable 5.1 Signed-off-by: Beat Hangartner --- sources/dataBase/projectdatabase.cpp | 2 +- sources/qetgraphicsitem/conductor.cpp | 2 +- sources/qetgraphicsitem/element.cpp | 2 +- tests/qttest/CMakeLists.txt | 13 + .../fixtures/legacy_sequential_attributes.qet | 351 ++++++++++++++++++ .../qttest/tst_legacysequentialattributes.cpp | 126 +++++++ 6 files changed, 493 insertions(+), 3 deletions(-) create mode 100644 tests/qttest/fixtures/legacy_sequential_attributes.qet create mode 100644 tests/qttest/tst_legacysequentialattributes.cpp diff --git a/sources/dataBase/projectdatabase.cpp b/sources/dataBase/projectdatabase.cpp index e93d53061..6bbf6598f 100644 --- a/sources/dataBase/projectdatabase.cpp +++ b/sources/dataBase/projectdatabase.cpp @@ -236,7 +236,7 @@ struct DocumentElement //the attributes files written before carry. bool readSequence(const QDomElement &item, autonum::sequentialNumbers *sequence) { - for (const char *name : {"sequ_1", "sequf_1", "seqt_1", "seqtf_1", "seqh_1"}) { + for (const char *name : {"sequ_1", "sequf_1", "seqt_1", "seqtf_1", "seqh_1", "seqhf_1"}) { if (item.hasAttribute(QLatin1String(name))) { return false; } diff --git a/sources/qetgraphicsitem/conductor.cpp b/sources/qetgraphicsitem/conductor.cpp index c51c4f8ce..a1cc60205 100644 --- a/sources/qetgraphicsitem/conductor.cpp +++ b/sources/qetgraphicsitem/conductor.cpp @@ -1142,7 +1142,7 @@ bool Conductor::fromXml(QDomElement &dom_element) pr.fromXml(dom_element); //Load Sequential Values - if (dom_element.hasAttribute("sequ_1") || dom_element.hasAttribute("sequf_1") || dom_element.hasAttribute("seqt_1") || dom_element.hasAttribute("seqtf_1") || dom_element.hasAttribute("seqh_1") || dom_element.hasAttribute("sequf_1")) + if (dom_element.hasAttribute("sequ_1") || dom_element.hasAttribute("sequf_1") || dom_element.hasAttribute("seqt_1") || dom_element.hasAttribute("seqtf_1") || dom_element.hasAttribute("seqh_1") || dom_element.hasAttribute("seqhf_1")) ConductorXmlRetroCompatibility::loadSequential(dom_element, this); else m_autoNum_seq.fromXml(dom_element.firstChildElement("sequentialNumbers")); diff --git a/sources/qetgraphicsitem/element.cpp b/sources/qetgraphicsitem/element.cpp index 139ccb1ae..80804145e 100644 --- a/sources/qetgraphicsitem/element.cpp +++ b/sources/qetgraphicsitem/element.cpp @@ -1055,7 +1055,7 @@ bool Element::fromXml(QDomElement &e, || e.hasAttribute(QStringLiteral("seqt_1")) || e.hasAttribute(QStringLiteral("seqtf_1")) || e.hasAttribute(QStringLiteral("seqh_1")) - || e.hasAttribute(QStringLiteral("sequf_1"))) + || e.hasAttribute(QStringLiteral("seqhf_1"))) ElementXmlRetroCompatibility::loadSequential(e, this); else m_autoNum_seq.fromXml(e.firstChildElement(QStringLiteral("sequentialNumbers"))); diff --git a/tests/qttest/CMakeLists.txt b/tests/qttest/CMakeLists.txt index bd8a82c01..c6fb19dd0 100644 --- a/tests/qttest/CMakeLists.txt +++ b/tests/qttest/CMakeLists.txt @@ -922,6 +922,19 @@ target_compile_definitions(tst_terminaluuids PRIVATE "QET_TEST_BINARY_PATH=\"$\"" "QET_EXAMPLES_DIR=\"${QET_DIR}/examples\"") +# Sequential numbers saved the old way, as sequ_1/.../seqhf_1 attributes, +# are all read: the real binary's --resave on +# fixtures/legacy_sequential_attributes.qet, whose element and conductor +# carry only seqhf_1. +add_executable( + tst_legacysequentialattributes + tst_legacysequentialattributes.cpp) +add_test(NAME tst_legacysequentialattributes COMMAND tst_legacysequentialattributes) +add_dependencies(tst_legacysequentialattributes qelectrotech) +target_link_libraries(tst_legacysequentialattributes PRIVATE Qt::Test Qt::Xml) +target_compile_definitions(tst_legacysequentialattributes PRIVATE + "QET_TEST_BINARY_PATH=\"$\"") + # ConductorProperties::applyChanges() -- the Selection properties panel # writes only the fields the user edited. add_executable( diff --git a/tests/qttest/fixtures/legacy_sequential_attributes.qet b/tests/qttest/fixtures/legacy_sequential_attributes.qet new file mode 100644 index 000000000..966f75b90 --- /dev/null +++ b/tests/qttest/fixtures/legacy_sequential_attributes.qet @@ -0,0 +1,351 @@ + + + 10/4/26 + 04-10-2026 + 2026-10-04 + skeleton + 10:28 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 14 + + + 11 + + + + label + + + + + + + + + + + + + 14 + + + 11 + + + + label + + + + + + + + + + + + + 14 + + + 11 + + + + label + + + + + + + + + + + + + 14 + + + 11 + + + + label + + + + + + + + + + + + + + + + + + + Elements importats + Zavedené prvky + Importerede elementer + Importierte Elemente + Εισηγμένα στοιχεία + Imported elements + Elementos importados + Éléments importés + Uvezeni elementi + Elementi importati + インバートされた要素 + 전기 심볼 요소 + 전기 심볼 요소 + Elementen geïmporteerd + Elementen geïmporteerd + Elementy importowane + Elementos importados + Elementos importados + Elemente importate + Импортированные элементы + Uvoženi elementi + Importerade element + İthal öğeler + Імпортовані елементи + 导入元件 + + + + كهربائي + Elèctric + Elektrotechnika + Elektrisk + Elektrik + Ηλεκτρικά + Electric + Eléctrica + Sähkö + Electrique + Električno + Elektromos + Elettrica + 電気 + 전기 + Цахилгаан + Elektrisk + Elektrotechniek + Elektrisch + Elektrotechnika + Elétrico + Elétrica + Electric + Электротехника + Elektrické + Elektrika + Електрика + El + Elektrik + Електрика + 10_电气 + 电气工程 + + + + متعدد الأقطاب + Multifilar + Vícežilový + Flere ledere + Allpolig + Πολυγραμμικό + All-pole + Multifilar + Yleisnapa + Multifilaire + Univerzalni + Többvonalas szimbólumok + Multifilare + 複線 + 다-극 + Бүх туйл + Alle poler + Veel polig + All-pole + Schematy wieloliniowe + Multipolar + Multifilar + Bipolar + Многополюсные + Všepólové + Vsi poli + Свe-полни + Allpolig + Çok kutuplu + Багатополюсні + 10_全极 + + + + المرحّلات والموصّلات وجهات الاتصال + Relés, contactors i contactes + Relé, stykače a kontakty + Relæer, kontaktorer og kontakter + Relais, Schütze und Kontakte + Ηλεκτρονόμοι και επαφές + Relays, contactors and contacts + Relevadores, contactores y contactos + Releet, kontaktorit ja koskettimet + Relais, contacteurs et contacts + Releji, kontaktori i kontakti + Relék, kontaktorok és érintkezők + Relè, contattori e contatti + 継電器、接触器、接点 + 릴레이, 커넥터및 접점 + Реле, контактор болон контакт + Reléer, kontaktorere og kontakter + Relais, contactoren en contacten + Relais, contacteurs en contacten + Przekaźniki i styczniki + Relés, contatores e contactos + Relés, Contatores e contatos + Relee, contactoare și contacte + Реле, пускатели и контакты + Relé, stykače a kontakty + Releji, kontaktorji in kontakti + Релеји, контактори и контакти + Reläer, kontaktorer och kontakter + Röleler, kontaktörler ve kontaklar + Реле, контактори та контакти + 继电器、接触器与触点 + + + + جهات الاتصال + Contactes + Kontakty + Kontaktpersoner + Kontakte + Επαφές + Contacts + Contactos + Kosketimet + Contacts + Kontakti + Kapcsolatok + Contatti + 連絡先 + 접점 + Харилцагчид + Kontakter + Contacten + Contacten + Łączność + Contatos + Contatos + Contacte + Контакты + Kontakty + Stiki + Контакти + Kontakter + Kişiler + Контакти + 触点 + + + + + + عدّاد مفتوح عادة + Taulell normalment obert + Kontakt čítače (NO) + Normalt åben tæller + Öffner Zähler betätigt + Ανοικτή επαφή μετρητή + Normally open counter + Contador NA + Normaalisti avoin laskuri + Actionné par comptage NO + Brojač normalno otvoren + Alaphelyzetben nyitott számláló + Contatto azionato da un contatore (NO) + 常開カウンター + 평상시 열림 카운터 + Ихэвчлэн нээлттэй тоолуур + Normalt åpen teller + Teller contact (NO) + Normaal open teller + Zestyk zwierny licznika + Contador normalmente aberto + Contato NA acionado por contador + Contor normal deschis + Счётчик с нормально открытым контактом + Počítadlo s kontaktom NO + Števec normalno odprt + Бројач нормално отворен + Räknare med slutande kontakt + Normalde açık sayaç + Лічильник нормально розімкнений + 计数驱动常开触点 + + Author: The QElectroTech team +License: see http://qelectrotech.org/wiki/doc/elements_license + + + + + 14 + + + 11 + + + + label + + + + + + + + + + + + + + + + diff --git a/tests/qttest/tst_legacysequentialattributes.cpp b/tests/qttest/tst_legacysequentialattributes.cpp new file mode 100644 index 000000000..905793f7d --- /dev/null +++ b/tests/qttest/tst_legacysequentialattributes.cpp @@ -0,0 +1,126 @@ +/* + Copyright 2006-2026 The QElectroTech Team + This file is part of QElectroTech. + + QElectroTech is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + QElectroTech is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with QElectroTech. If not, see . +*/ +#include +#include +#include +#include + +/** + Projects saved before the element keep an element's + or conductor's sequential numbers as attributes: sequ_1, sequf_1, seqt_1, + seqtf_1, seqh_1 and seqhf_1. The loaders look for one of them to take + the old route; the list named sequf_1 twice and seqhf_1 never, so a + file whose only sequence was the hundred-folio one lost it. Runs the + real binary's --resave on fixtures/legacy_sequential_attributes.qet + and reads the it writes. +*/ +class tst_legacysequentialattributes : public QObject +{ + Q_OBJECT + + QTemporaryDir m_dir; + QDomDocument m_resaved; + + static bool runQet(const QStringList &arguments) + { + QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); + env.insert(QStringLiteral("QT_QPA_PLATFORM"), QStringLiteral("offscreen")); + QProcess proc; + proc.setProcessEnvironment(env); + proc.start(QStringLiteral(QET_TEST_BINARY_PATH), arguments); + return proc.waitForFinished(60000) + && proc.exitStatus() == QProcess::NormalExit + && proc.exitCode() == 0; + } + + /// The first @p tag element of the saved project with this uuid. + QDomElement item(const QString &tag, const QString &uuid) const + { + const QDomNodeList list = m_resaved.elementsByTagName(tag); + for (int i = 0; i < list.size(); ++i) { + const QDomElement e = list.at(i).toElement(); + if (e.attribute(QStringLiteral("uuid")) == uuid) return e; + } + return QDomElement(); + } + + /// The text of <@p part> under @p e. + static QString sequence(const QDomElement &e, const QString &part) + { + return e.firstChildElement(QStringLiteral("sequentialNumbers")) + .firstChildElement(part).text(); + } + +private slots: + void initTestCase() + { + QVERIFY2(QFile::exists(QStringLiteral(QET_TEST_BINARY_PATH)), "qelectrotech binary not found"); + QVERIFY(m_dir.isValid()); + const QString fixture = QFINDTESTDATA("fixtures/legacy_sequential_attributes.qet"); + QVERIFY2(!fixture.isEmpty(), "fixture project not found"); + const QString out = m_dir.filePath(QStringLiteral("resaved.qet")); + QVERIFY2(runQet({QStringLiteral("--resave"), fixture, out}), "--resave failed"); + QFile file(out); + QVERIFY(file.open(QIODevice::ReadOnly)); + QVERIFY(m_resaved.setContent(&file)); + } + + // The element and the conductor whose only old attribute is seqhf_1. + void hundredFolioSequenceIsKept_data() + { + QTest::addColumn("tag"); + QTest::addColumn("uuid"); + QTest::addColumn("value"); + QTest::newRow("element") << "element" << "{6c58a5a1-aa4e-40c4-9e9d-a76524f76e52}" << "5"; + QTest::newRow("conductor") << "conductor" << "{f5162c59-0c59-4e94-b6a6-4cf259a52d91}" << "7"; + } + + void hundredFolioSequenceIsKept() + { + QFETCH(QString, tag); + QFETCH(QString, uuid); + QFETCH(QString, value); + const QDomElement e = item(tag, uuid); + QVERIFY2(!e.isNull(), "item not found in the resaved project"); + QVERIFY2(!e.hasAttribute(QStringLiteral("seqhf_1")), "the old attribute is not written back"); + QCOMPARE(sequence(e, QStringLiteral("hundredFolio")), value); + } + + // The unit sequence, whose attribute was already in the list, as before. + void unitSequenceIsKept_data() + { + QTest::addColumn("tag"); + QTest::addColumn("uuid"); + QTest::addColumn("value"); + QTest::newRow("element") << "element" << "{29b32d7b-5ec3-42c8-afda-788e9614c0fd}" << "3"; + QTest::newRow("conductor") << "conductor" << "{89cacce1-b12a-4ec3-aadf-d3f8feb7494d}" << "4"; + } + + void unitSequenceIsKept() + { + QFETCH(QString, tag); + QFETCH(QString, uuid); + QFETCH(QString, value); + const QDomElement e = item(tag, uuid); + QVERIFY2(!e.isNull(), "item not found in the resaved project"); + QCOMPARE(sequence(e, QStringLiteral("unit")), value); + } +}; + +QTEST_MAIN(tst_legacysequentialattributes) +#include "tst_legacysequentialattributes.moc" From fc39acaf75a45ba229a87bc9a15b5681bd9e69f0 Mon Sep 17 00:00:00 2001 From: Beat Hangartner Date: Wed, 7 Oct 2026 21:10:23 +0200 Subject: [PATCH 11/22] Replace %sequ_10 before %sequ_1 in label formulas AssignVariables::assignSequence() replaced the sequential-number placeholders from 1 upwards with a plain QString::replace(). "%sequ_1" is also the start of "%sequ_10", so with ten or more sequences a formula's %sequ_10 became the first value followed by a "0". The same held for every family (%sequf_, %seqt_, %seqtf_, %seqh_, %seqhf_, %seqw_, %seqa_). Run the loop from the highest number down to 1, so the longer placeholder is gone before the shorter one is looked for. No file-format change. Labels with fewer than ten sequences come out exactly as before. Tests: tst_tensequentialnumbers runs the binary's --export-bom on a fixture whose element has the formula %sequ_10-%sequ_1 and the unit values A to J, and expects the label "J-A". On master the label is "A0-A". Co-Authored-By: Claude Fable 5.1 Signed-off-by: Beat Hangartner --- sources/autoNum/assignvariables.cpp | 5 +- tests/qttest/CMakeLists.txt | 12 + .../fixtures/ten_sequential_numbers.qet | 359 ++++++++++++++++++ tests/qttest/tst_tensequentialnumbers.cpp | 77 ++++ 4 files changed, 452 insertions(+), 1 deletion(-) create mode 100644 tests/qttest/fixtures/ten_sequential_numbers.qet create mode 100644 tests/qttest/tst_tensequentialnumbers.cpp diff --git a/sources/autoNum/assignvariables.cpp b/sources/autoNum/assignvariables.cpp index ac92a4e9f..633fe7da3 100644 --- a/sources/autoNum/assignvariables.cpp +++ b/sources/autoNum/assignvariables.cpp @@ -482,7 +482,10 @@ namespace autonum m_seq_struct.wrap.size())) ); - for (int i=1; i<=max ; i++) + // Highest number first: "%sequ_1" is also the start of + // "%sequ_10", so replacing 1 before 10 would turn %sequ_10 + // into the first value followed by a "0". + for (int i=max; i>=1 ; i--) { if (m_assigned_label.contains("%sequ_" + QString::number(i)) && m_seq_struct.unit.size() >= i) { m_assigned_label.replace("%sequ_" + QString::number(i),m_seq_struct.unit.at(i-1)); diff --git a/tests/qttest/CMakeLists.txt b/tests/qttest/CMakeLists.txt index bd8a82c01..bf6448d29 100644 --- a/tests/qttest/CMakeLists.txt +++ b/tests/qttest/CMakeLists.txt @@ -557,6 +557,18 @@ target_compile_definitions(tst_wiringlistexport PRIVATE "QET_TEST_BINARY_PATH=\"$\"" "QET_EXAMPLES_DIR=\"${QET_DIR}/examples\"") +# A label formula with ten or more sequential numbers gets the tenth value +# for %sequ_10 (not the first one and a "0"): the real binary's +# --export-bom on fixtures/ten_sequential_numbers.qet. +add_executable( + tst_tensequentialnumbers + tst_tensequentialnumbers.cpp) +add_test(NAME tst_tensequentialnumbers COMMAND tst_tensequentialnumbers) +add_dependencies(tst_tensequentialnumbers qelectrotech) +target_link_libraries(tst_tensequentialnumbers PRIVATE Qt::Test) +target_compile_definitions(tst_tensequentialnumbers PRIVATE + "QET_TEST_BINARY_PATH=\"$\"") + # --export-dxf writes a wrapped symbol text line by line, as it is drawn. add_executable( tst_dxfwrappedtext diff --git a/tests/qttest/fixtures/ten_sequential_numbers.qet b/tests/qttest/fixtures/ten_sequential_numbers.qet new file mode 100644 index 000000000..bbadee1d4 --- /dev/null +++ b/tests/qttest/fixtures/ten_sequential_numbers.qet @@ -0,0 +1,359 @@ + + + 10/4/26 + 04-10-2026 + 2026-10-04 + skeleton + 10:28 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + %sequ_10-%sequ_1 + + + A;B;C;D;E;F;G;H;I;J + + + + 14 + + + 11 + + + + label + + + + + + + + + + + + + 14 + + + 11 + + + + label + + + + + + + + + + + + + 14 + + + 11 + + + + label + + + + + + + + + + + + + 14 + + + 11 + + + + label + + + + + + + + + + + + + + + + + + + + + Elements importats + Zavedené prvky + Importerede elementer + Importierte Elemente + Εισηγμένα στοιχεία + Imported elements + Elementos importados + Éléments importés + Uvezeni elementi + Elementi importati + インバートされた要素 + 전기 심볼 요소 + 전기 심볼 요소 + Elementen geïmporteerd + Elementen geïmporteerd + Elementy importowane + Elementos importados + Elementos importados + Elemente importate + Импортированные элементы + Uvoženi elementi + Importerade element + İthal öğeler + Імпортовані елементи + 导入元件 + + + + كهربائي + Elèctric + Elektrotechnika + Elektrisk + Elektrik + Ηλεκτρικά + Electric + Eléctrica + Sähkö + Electrique + Električno + Elektromos + Elettrica + 電気 + 전기 + Цахилгаан + Elektrisk + Elektrotechniek + Elektrisch + Elektrotechnika + Elétrico + Elétrica + Electric + Электротехника + Elektrické + Elektrika + Електрика + El + Elektrik + Електрика + 10_电气 + 电气工程 + + + + متعدد الأقطاب + Multifilar + Vícežilový + Flere ledere + Allpolig + Πολυγραμμικό + All-pole + Multifilar + Yleisnapa + Multifilaire + Univerzalni + Többvonalas szimbólumok + Multifilare + 複線 + 다-극 + Бүх туйл + Alle poler + Veel polig + All-pole + Schematy wieloliniowe + Multipolar + Multifilar + Bipolar + Многополюсные + Všepólové + Vsi poli + Свe-полни + Allpolig + Çok kutuplu + Багатополюсні + 10_全极 + + + + المرحّلات والموصّلات وجهات الاتصال + Relés, contactors i contactes + Relé, stykače a kontakty + Relæer, kontaktorer og kontakter + Relais, Schütze und Kontakte + Ηλεκτρονόμοι και επαφές + Relays, contactors and contacts + Relevadores, contactores y contactos + Releet, kontaktorit ja koskettimet + Relais, contacteurs et contacts + Releji, kontaktori i kontakti + Relék, kontaktorok és érintkezők + Relè, contattori e contatti + 継電器、接触器、接点 + 릴레이, 커넥터및 접점 + Реле, контактор болон контакт + Reléer, kontaktorere og kontakter + Relais, contactoren en contacten + Relais, contacteurs en contacten + Przekaźniki i styczniki + Relés, contatores e contactos + Relés, Contatores e contatos + Relee, contactoare și contacte + Реле, пускатели и контакты + Relé, stykače a kontakty + Releji, kontaktorji in kontakti + Релеји, контактори и контакти + Reläer, kontaktorer och kontakter + Röleler, kontaktörler ve kontaklar + Реле, контактори та контакти + 继电器、接触器与触点 + + + + جهات الاتصال + Contactes + Kontakty + Kontaktpersoner + Kontakte + Επαφές + Contacts + Contactos + Kosketimet + Contacts + Kontakti + Kapcsolatok + Contatti + 連絡先 + 접점 + Харилцагчид + Kontakter + Contacten + Contacten + Łączność + Contatos + Contatos + Contacte + Контакты + Kontakty + Stiki + Контакти + Kontakter + Kişiler + Контакти + 触点 + + + + + + عدّاد مفتوح عادة + Taulell normalment obert + Kontakt čítače (NO) + Normalt åben tæller + Öffner Zähler betätigt + Ανοικτή επαφή μετρητή + Normally open counter + Contador NA + Normaalisti avoin laskuri + Actionné par comptage NO + Brojač normalno otvoren + Alaphelyzetben nyitott számláló + Contatto azionato da un contatore (NO) + 常開カウンター + 평상시 열림 카운터 + Ихэвчлэн нээлттэй тоолуур + Normalt åpen teller + Teller contact (NO) + Normaal open teller + Zestyk zwierny licznika + Contador normalmente aberto + Contato NA acionado por contador + Contor normal deschis + Счётчик с нормально открытым контактом + Počítadlo s kontaktom NO + Števec normalno odprt + Бројач нормално отворен + Räknare med slutande kontakt + Normalde açık sayaç + Лічильник нормально розімкнений + 计数驱动常开触点 + + Author: The QElectroTech team +License: see http://qelectrotech.org/wiki/doc/elements_license + + + + + 14 + + + 11 + + + + label + + + + + + + + + + + + + + + + diff --git a/tests/qttest/tst_tensequentialnumbers.cpp b/tests/qttest/tst_tensequentialnumbers.cpp new file mode 100644 index 000000000..ff56982e0 --- /dev/null +++ b/tests/qttest/tst_tensequentialnumbers.cpp @@ -0,0 +1,77 @@ +/* + Copyright 2006-2026 The QElectroTech Team + This file is part of QElectroTech. + + QElectroTech is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + QElectroTech is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with QElectroTech. If not, see . +*/ +#include +#include +#include + +/** + A label formula with ten or more sequential numbers: %sequ_10 must get + the tenth value, not the first value followed by a "0". The values are + put in by AssignVariables::assignSequence(), which the bill of + materials uses for every label, so the real binary's --export-bom on + fixtures/ten_sequential_numbers.qet shows the result: its element has + the formula %sequ_10-%sequ_1 and the unit values A to J. +*/ +class tst_tensequentialnumbers : public QObject +{ + Q_OBJECT + + QTemporaryDir m_dir; + + static bool runQet(const QStringList &arguments) + { + QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); + env.insert(QStringLiteral("QT_QPA_PLATFORM"), QStringLiteral("offscreen")); + QProcess proc; + proc.setProcessEnvironment(env); + proc.start(QStringLiteral(QET_TEST_BINARY_PATH), arguments); + return proc.waitForFinished(60000) + && proc.exitStatus() == QProcess::NormalExit + && proc.exitCode() == 0; + } + +private slots: + void initTestCase() + { + QVERIFY2(QFile::exists(QStringLiteral(QET_TEST_BINARY_PATH)), "qelectrotech binary not found"); + QVERIFY(m_dir.isValid()); + } + + void tenthValueIsUsed() + { + const QString fixture = QFINDTESTDATA("fixtures/ten_sequential_numbers.qet"); + QVERIFY2(!fixture.isEmpty(), "fixture project not found"); + const QString out = m_dir.filePath(QStringLiteral("bom.csv")); + QVERIFY2(runQet({QStringLiteral("--export-bom"), fixture, out}), "--export-bom failed"); + + QFile file(out); + QVERIFY(file.open(QIODevice::ReadOnly | QIODevice::Text)); + const QStringList lines = QString::fromUtf8(file.readAll()).split(QLatin1Char('\n')); + QStringList labels; + for (const QString &line : lines) { + if (line.startsWith(QLatin1Char('"'))) + labels << line.section(QLatin1Char(';'), 0, 0); + } + QVERIFY2(labels.contains(QStringLiteral("\"J-A\"")), + qPrintable(QStringLiteral("labels: %1").arg(labels.join(QLatin1Char(' '))))); + QVERIFY2(!labels.contains(QStringLiteral("\"A0-A\"")), "the first value with a 0 appended"); + } +}; + +QTEST_MAIN(tst_tensequentialnumbers) +#include "tst_tensequentialnumbers.moc" From c7a9ddbf8c5a5114d72ba88a448c91a2339ec650 Mon Sep 17 00:00:00 2001 From: Beat Hangartner Date: Tue, 6 Oct 2026 14:05:57 +0200 Subject: [PATCH 12/22] CI: build and run the unit tests in the Windows job The Windows job configured with -DPACKAGE_TESTS=OFF, so no test ever ran on Windows. Build the tests and run ctest after the build, with the offscreen platform. ctest prints no output for failed tests in the MSYS2 shell, so each failed test runs again with QtTest writing its log to a file, which is printed in its own log group. The ctest log is added to the artifact uploaded on failure. No change to the app or its files. Co-Authored-By: Claude Opus 5.5 --- .github/workflows/windows-build.yml | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/.github/workflows/windows-build.yml b/.github/workflows/windows-build.yml index 9d6cfb9a0..bc0ff10e5 100644 --- a/.github/workflows/windows-build.yml +++ b/.github/workflows/windows-build.yml @@ -117,7 +117,7 @@ jobs: -DQT_VERSION_MAJOR=6 \ -DBUILD_WITH_KF=ON \ -DBUILD_KF=OFF \ - -DPACKAGE_TESTS=OFF \ + -DPACKAGE_TESTS=ON \ -DCMAKE_POLICY_DEFAULT_CMP0077=NEW \ -DCMAKE_POLICY_VERSION_MINIMUM=3.5 \ -DQET_EXPORT_PROJECT_DB=ON \ @@ -136,6 +136,32 @@ jobs: echo "=== ccache statistics ===" /ucrt64/bin/ccache -s + - name: Run the unit tests + shell: msys2 {0} + env: + QT_QPA_PLATFORM: offscreen + run: | + set -euo pipefail + cd "$GITHUB_WORKSPACE/build" + ctest --output-on-failure --timeout 300 && exit 0 + # ctest shows no output for failed tests in this shell, so run each + # failed test again with QtTest writing its log to a file, and print it. + set +e + while IFS=: read -r _ name; do + name=${name%$'\r'} + exe=$(find tests -name "$name.exe" | head -1) + echo "::group::$name" + if [ -n "$exe" ]; then + QT_QPA_PLATFORM=offscreen "$exe" -o "$name.txt,txt" + echo "exit code $?" + cat "$name.txt" 2>/dev/null + else + echo "no executable for $name" + fi + echo "::endgroup::" + done < Testing/Temporary/LastTestsFailed.log + exit 1 + - name: Verify exe was built shell: msys2 {0} run: | @@ -436,6 +462,7 @@ jobs: name: build-logs-qt6 path: | build/CMakeFiles/*.log + build/Testing/Temporary/LastTest*.log nsis_root/files/bin/ if-no-files-found: warn From d0657f36db5515a67fc78fc188f51466e89ed3fc Mon Sep 17 00:00:00 2001 From: ispyisail Date: Thu, 8 Oct 2026 12:29:08 +1300 Subject: [PATCH 13/22] Fix 9 messages always shown in French; add missing English Nine messages were never passed through tr(), so every user saw them in French: the undo entries for grouping and ungrouping terminals, for editing an arc (3), an ellipse, a rectangle and a PLC table in the element editor, and the error box when integrating a title block template fails. They are now wrapped, text unchanged. qet_en.ts also lacked English for 63 messages added since the last translations update (Customize dialog, mouse gestures, toolbar contents, mirror, element scale, paste element information, paper format). update_translations was run on qet_en.ts with lupdate's guessing heuristics off, then the 72 new entries were translated. Most of the diff is lupdate refreshing line numbers. Co-Authored-By: Claude Opus 5.5 --- lang/qet_en.ts | 2205 ++++++++++------- .../UndoCommand/groupterminalscommand.cpp | 4 +- sources/editor/arceditor.cpp | 6 +- sources/editor/graphicspart/partplctable.cpp | 2 +- sources/editor/graphicspart/partrectangle.cpp | 2 +- sources/editor/ui/ellipseeditor.cpp | 2 +- .../integrationmovetemplateshandler.cpp | 2 +- 7 files changed, 1316 insertions(+), 907 deletions(-) diff --git a/lang/qet_en.ts b/lang/qet_en.ts index 66474e997..34e6ee5e2 100644 --- a/lang/qet_en.ts +++ b/lang/qet_en.ts @@ -624,6 +624,21 @@ Angle : Angle: + + + Modifier l'angle de depart d'un arc + Change the start angle of an arc + + + + Modifier l'angle d'un arc + Change the angle of an arc + + + + Modifier un arc + Change an arc + AutoNumSchemeCommand @@ -1166,6 +1181,16 @@ Note: these options DO NOT allow or block auto numberings, only their update pol Colonnes : Columns: + + + Format : + Format: + + + + Règle les colonnes et les lignes pour que le folio, cartouche compris, ait la taille de ce format de papier, à 96 points par pouce comme l'export PDF. + Sets the columns and rows so the sheet, title block included, has the size of this paper format, at 96 dots per inch like the PDF export. + @@ -1187,6 +1212,21 @@ Note: these options DO NOT allow or block auto numberings, only their update pol Dimensions du folio Sheet size + + + Personnalisé + Custom + + + + Paysage + Landscape + + + + Portrait + Portrait + ClickableImageLabel @@ -1843,6 +1883,15 @@ Continue? Delete this property + + CustomizeDialog + + + Personnaliser + window title + Customize + + DiagnosticsReportDialog @@ -2138,204 +2187,204 @@ Continue? DiagramImageItem - + redimensionner resize - + pivoter/incliner rotate/skew - + Cliquer : mode %1 Click: mode %1 - + Glisser un coin/bord : redimensionner (Ctrl = depuis le centre, Maj = conserver les proportions) Drag a corner/edge: resize (Ctrl = from center, Shift = keep proportions) - + Glisser un coin : pivoter (Maj = par pas de 15°) ; glisser un bord : incliner (Maj = par pas de 15°) ; point rouge : déplacer le centre de rotation Drag a corner: rotate (Shift = 15° steps); drag an edge: skew (Shift = 15° steps); red point: move the rotation center - + -- %1 : mode %2 -- %1: mode %2 - + Cliquer Click - + Glisser : redimensionner (Maj = conserver les proportions, Ctrl = depuis le centre) Drag: resize (Shift = keep proportions, Ctrl = from center) - + Glisser : pivoter (Maj = par pas de 15°) Drag: rotate (Shift = 15° steps) - + Glisser : incliner (Maj = par pas de 15°) Drag: skew (Shift = 15° steps) - + Glisser : déplacer le centre de rotation Drag: move the rotation center - + Redimensionner une image Resize an image - + Faire pivoter une image Rotate an image - + Incliner une image Skew an image - + Déplacer le centre de rotation d'une image Move an image's rotation center - + Modifier une image Edit an image - + Restaurer les proportions d'une image Restore an image's proportions - - + + Enregistrer l'image sous... Save image as... - - + + Enregistrer l'image d'origine sous... Save original image as... - + Image PNG (*.png) PNG image (*.png) - + Image JPEG (*.jpg *.jpeg) JPEG image (*.jpg *.jpeg) - + Image BMP (*.bmp) BMP image (*.bmp) - + Image SVG (*.svg) SVG image (*.svg) - + Tous les fichiers (*) All files (*) - + Transparence non conservée Transparency not preserved - + Ce format ne prend pas en charge la transparence : l'image sera enregistrée telle qu'elle était avant l'application de la couleur transparente. Continuer ? This format does not support transparency: the image will be saved as it was before the transparent colour was applied. Continue? - + Échec de l'enregistrement Saving failed - + Impossible d'enregistrer l'image à cet emplacement. Unable to save the image to this location. - + une image image - + Remplacer l'image... Replace the image... - + Couleur transparente... Transparent color... - + Rogner... Crop... - + Miroir horizontal Horizontal mirror - + Miroir vertical Vertical mirror - + Restaurer les proportions Restore proportions - + Selectionner une image... Select an image ... - + Image Files (*.png *.jpg *.jpeg *.bmp *.svg) Image Files (*.png *.jpg *.jpeg *.bmp *.svg) - + Erreur Error - + Impossible de charger l'image. Unable to load the image. - + Remplacer une image Replace an image @@ -2350,12 +2399,12 @@ Continue? Vertical mirror of an image - + Définir une couleur transparente Set a transparent color - + Rogner une image Crop an image @@ -2384,87 +2433,110 @@ Continue? Hold Shift and drag to move this text on its own + + DiagramToolbarSettings + + + Taille des poignées + Handle size + + + + Grille des textes + Text grid + + + + Couleur de fond du folio + Sheet background color + + + + Couleur des conducteurs + Conductor color + + DiagramView - + Coller ici context menu action Paste Here - + Ceci est la zone dans laquelle vous concevez vos schémas en y ajoutant des éléments et en posant des conducteurs entre leurs bornes. Il est également possible d'ajouter des textes indépendants. "What's this?" tip In this area you conceive your diagrams by adding elements and conductors between their terminals. You may also add independent texts. - + Collage multiple Multiple paste - + Créer un template context menu action Create a template - + Générer une vignette d'armoire context menu action Make a cabinet thumbnail - + Renvoi de folio Sheet reference - + X: %1 Y: %2 X: %1 Y: %2 - + Connecter les bornes sélectionnées Connect the selected terminals - + Sans titre what to display for untitled diagrams Untitled - + Modèle enregistré Registered template - + Le modèle a été enregistré avec succès sous : %1 The template has been successfully saved as : %1 - + Erreur Error - + Le fichier n'a pas pu être écrit. The file could not be written. - + Choisir la nouvelle couleur de ce conducteur Choose the new color for this conductor - + Modifier les propriétés d'un conducteur undo caption Edit conductor properties @@ -2534,17 +2606,17 @@ Hold Shift and drag to move this text on its own DynamicElementTextItem - + Texte Text - + Éditer un texte d'élément Edit an element text - + Redimensionner un texte d'élément Resize an element text @@ -3001,17 +3073,17 @@ Hold Shift and drag to move this text on its own Composite text - + Gauche Left - + Centre Middle - + Droite Right @@ -3065,7 +3137,7 @@ Hold Shift and drag to move this text on its own Element - + Numéroter automatiquement un élément undo caption Automatically number an element @@ -4970,11 +5042,16 @@ By importing this file, you confirm that: Diamètres : Diameters: + + + Modifier une ellipse + Change an ellipse + ExportConfigPage - + Export configuration page title Export @@ -6379,6 +6456,80 @@ Any setting other than “No rounding” may cause rendering errors in the proje %1 [unused in the project] + + GesturesConfigPage + + + Faites glisser avec le bouton droit sur un folio : un anneau de commandes s'ouvre, relâchez vers celle à lancer. Tant que vous ne changez pas l'anneau d'un contexte, il montre les commandes de la barre de raccourcis. Les gestes s'activent ou se désactivent dans la page Général. + Drag with the right mouse button on a sheet: a ring of commands opens, release towards the one to run. Until you change the ring for a context, it shows the commands of the shortcut bar. Gestures are turned on or off in the General page. + + + + 8 directions + 8 directions + + + + 4 directions + 4 directions + + + + Placer → + Place → + + + + Vider la direction + Clear the direction + + + + Comme la barre de raccourcis + Same as the shortcut bar + + + + Commandes disponibles + Available commands + + + + Anneau, la direction choisie en surbrillance + Ring, the chosen direction highlighted + + + + Directions : + Directions: + + + + Contexte : + Context: + + + + Gestes de la souris + configuration page title + Mouse gestures + + + + (direction vide) + (empty direction) + + + + Anneau personnalisé pour ce contexte. + Custom ring for this context. + + + + Cet anneau suit la barre de raccourcis. + This ring follows the shortcut bar. + + GraphicsTablePropertiesEditor @@ -6995,6 +7146,11 @@ Please use the advanced editor for this. error message Unable to get this template's XML description + + + Une erreur s'est produite avec le modèle %1 : %2 + An error occurred with the template %1: %2 + Erreur @@ -7359,17 +7515,17 @@ This setting is in Configure QElectroTech > General > Projects. - + script script - + Impression Print - + L'assistant veut imprimer %n folio(s) de « %1 » sur « %2 ». The assistant wants to print %n folio of “%1” on “%2”. @@ -7377,43 +7533,43 @@ This setting is in Configure QElectroTech > General > Projects. - + &Imprimer &Print - + &Annuler &Cancel - - + + Assistant : %1 Assistant: %1 - + L'assistant veut exécuter un script The assistant wants to run a script - + « %1 » sur le projet ouvert. Une fois exécuté, Ctrl+Z l'annule. “%1” on the open project. Once it has run, Ctrl+Z undoes it. - + &Exécuter &Run - + &Refuser &Decline - + &Toujours &Always @@ -7868,63 +8024,63 @@ Do you still want to link this slave contact? NewDiagramPage - + Folio Sheet - + Conducteur Conductor - + Reports de folio Sheet references - + Références croisées Cross-references - + Guides Guides - + Définir les règles de numérotation automatique par défaut pour les nouveaux projets : Set the default automatic numbering rules for new projects: - + Conducteurs Conductors - + Eléments Elements - + Folios Sheets - + Numérotation auto Auto Numbering - + Nouveau folio configuration page title New sheet - + Nouveau projet configuration page title New project @@ -8226,6 +8382,14 @@ Do you still want to link this slave contact? Edit a line + + PartPlcTable + + + Modifier une table PLC + Change a PLC table + + PartPolygon @@ -8254,6 +8418,14 @@ Do you still want to link this slave contact? Delete a point from a polygon + + PartRectangle + + + Modifier un rectangle + Change a rectangle + + PartTerminal @@ -8696,7 +8868,7 @@ Its copy was kept as: PrintConfigPage - + Impression configuration page title Printing @@ -8705,106 +8877,106 @@ Its copy was kept as: ProjectAutoNumConfigPage - + Numérotation auto Auto Numbering - + Management Management - - + + Conducteurs Conductors - + N° No. - + Nom Name - + Folio Sheet - + Élément Element - + Figé Frozen - + Attribuer un numéro libre… Assign a free number… - - + + Donner à l'élément sélectionné un numéro que personne n'a : il garde sa numérotation, seul son numéro change. Give the selected element a number nobody has: it keeps its numbering, only its number changes. - - + + Eléments Elements - - + + Folios Sheets - + Numérotation auto des folios Sheet Auto Numbering - + Importer depuis un autre projet... Import from another project... - + Reprendre les numérotations automatiques enregistrées dans un autre projet Reuse the automatic numbering saved in another project - + figé frozen - + — libre — — free — - + aucun élément n'a ce numéro (supprimé ou renuméroté) no element has this number (deleted or renumbered) - + Aucun élément ne suit cette numérotation No element follows this numbering - + %n élément(s) suivent cette numérotation, dont %1 au nom figé %n element follows this numbering, %1 with a frozen name @@ -8812,7 +8984,7 @@ Its copy was kept as: - + ; %n numéro(s) sans élément ; %n number without an element @@ -8820,49 +8992,49 @@ Its copy was kept as: - + Cette numérotation a plusieurs numéros (ou un numéro par folio) : on ne peut pas en choisir un à la main. This numbering has several numbers (or one number per sheet): one cannot be chosen by hand. - + Attribuer un numéro libre Assign a free number - + Le nom de cet élément est figé : dégelez-le d'abord. This element's name is frozen: unfreeze it first. - + Aucun numéro n'est libre. No number is free. - + %1 → %2 %1 → %2 - + Numéro libre pour l'élément « %1 » (%2) : Free number for element “%1” (%2): - - + + Nom de la numérotation : Numbering name: - - + + Modifier la numérotation Modify numbering - + %n élément(s) suivent cette numérotation et vont changer de formule et de nom. %n element follows this numbering and will change formula and name. @@ -8870,21 +9042,21 @@ Its copy was kept as: - - - - + + + + Nouvelle numérotation New numbering - - + + Renommer la numérotation Rename numbering - + La numérotation « %1 » ne peut pas être modifiée : %n élément(s) au nom figé la suivent. Dégelez-les d'abord (voir la liste), ou renommez seulement la numérotation. @@ -8895,7 +9067,7 @@ Unfreeze them first (see the list), or just rename the numbering. - + %n numérotation(s) suivie(s) par des éléments au nom figé n'ont pas été remplacées. %n numbering followed by elements with a frozen name was not replaced. @@ -8903,7 +9075,7 @@ Unfreeze them first (see the list), or just rename the numbering. - + %n élément(s) ont changé de formule. %n element changed formula. @@ -8911,13 +9083,13 @@ Unfreeze them first (see the list), or just rename the numbering. - - + + Supprimer la numérotation Delete numbering - + %n élément(s) suivent la numérotation « %1 », elle ne peut pas être supprimée. Donnez-leur une autre numérotation ou un nom fixe d'abord. @@ -8928,12 +9100,12 @@ Give them another numbering or a fixed name first. - + Aucun folio ne nomme cette numérotation No sheet names this numbering - + %n folio(s) nomment cette numérotation %n sheet names this numbering @@ -8941,12 +9113,12 @@ Give them another numbering or a fixed name first. - + Aucun folio ne suit cette numérotation No sheet follows this numbering - + %n folio(s) suivent cette numérotation %n sheet follows this numbering @@ -8954,7 +9126,7 @@ Give them another numbering or a fixed name first. - + %n folio(s) suivent la numérotation « %1 », elle ne peut pas être supprimée. Donnez-leur une autre numérotation d'abord. @@ -8969,80 +9141,80 @@ Give them another numbering first. No name - + Importer les numérotations d'un projet Import numbering from a project - + Projet QElectroTech (*.qet) Project QElectroTech (*.qet) - - + + Import impossible Import not possible - + Impossible d'ouvrir %1 Unable to open %1 - + %1 n'est pas un projet QElectroTech valide. %1 is not a valid QElectroTech project. - - + + Aucune numérotation No numbering - - + + Ce projet ne contient aucune numérotation automatique. This project does not contain any automatic numbering. - + Numérotations à importer Numbering to import - + Numérotations trouvées dans %1 : Numbering found in %1: - + %1 : %2 (existe déjà) %1: %2 (already exists) - + Remplacer les numérotations de même nom Replace numbering with the same name - + Importer des numérotations Import numberings - + Import terminé Import complete - + %1 numérotation(s) importée(s), %2 conservée(s) telles quelles. %1 numbering(s) imported, %2 kept unchanged. - + %1 numérotation(s) importée(s). %1 numbering(s) imported. @@ -9091,128 +9263,140 @@ Give them another numbering first. General - + Titre du projet : label when configuring Project title : - + Ce titre sera disponible pour tous les folios de ce projet en tant que %projecttitle. informative label This title is made available to all child sheets as %projecttitle. - + Vous pouvez définir ci-dessous des propriétés personnalisées qui seront disponibles pour tous les folios de ce projet (typiquement pour les cartouches). informative label You may define below custom properties that will be made available to all sheets of the project (typically to use within title blocks). - + Temps passé sur ce projet : label when configuring Time spent on this project: - + Suivre le temps passé sur ce projet (uniquement enregistré localement dans ce fichier) checkbox label Track the time spent on this project (recorded locally in this file only) - + Réinitialiser button label Reset - + Croisements de conducteurs : label when configuring Conductor crossings: - + Sans saut wire crossings No hop - + Saut sur les conducteurs horizontaux wire crossings Hop on horizontal conductors - + Saut sur les conducteurs verticaux wire crossings Hop on vertical conductors - + Dessine un petit arc là où deux conducteurs se croisent sans être reliés. Seul le dessin change : aucun élément n'est ajouté et aucun conducteur n'est coupé. tooltip Draws a small arc where two conductors cross without being connected. Only the drawing changes: no element is added and no conductor is cut. - + + Garder horizontaux les textes des symboles pivotés + checkbox label + Keep the texts of rotated elements horizontal + + + + Les textes dessinés dans un symbole et les noms de ses bornes restent lisibles quand le symbole est pivoté : leur cadre tourne avec le symbole, pas le texte. Décochez pour qu'ils tournent avec le symbole, comme avant. + tooltip + Texts drawn in an element and the names of its terminals stay readable when the element is rotated: their frame turns with the element, not the text. Uncheck to make them turn with the element, as before. + + + Conducteurs par borne group box title Conductors per terminal - + Utiliser les réglages de l'application checkbox label Use the application settings - + Les réglages de Configurer QElectroTech > Général s'appliquent. Décochez pour donner à ce projet ses propres réglages, enregistrés dans le projet. tooltip The settings in Configure QElectroTech > General apply. Untick to give this project its own settings, saved in the project. - + Nombre maximal de conducteurs par borne : label when configuring Maximum conductors per terminal: - + Sans limite wires per terminal No limit - + Un nouveau conducteur qui dépasserait ce nombre sur une borne est refusé. Les conducteurs déjà dessinés ne sont pas modifiés. 4 correspond à deux embouts doubles, un de chaque côté de la vis. tooltip A new conductor that would take a terminal past this number is refused. Conductors already drawn are not changed. 4 means two twin ferrules, one on each side of the screw. - + Un seul conducteur par renvoi de folio checkbox label Only one conductor per sheet reference - + Un renvoi de folio est un point virtuel : il ne reçoit qu'un conducteur, celui qui continue sur l'autre folio. tooltip A sheet reference is a virtual point: it takes only one conductor, the one that continues on the other sheet. - + Ces règles sont désactivées pour tous les projets (Configurer QElectroTech > Général). informative label These rules are turned off for every project (Configure QElectroTech > General). - - + + %1 h %2 min hours and minutes of time spent on a project %1 h %2 min @@ -9564,73 +9748,73 @@ Do you want to save changes? QETApp - + LTR Translate this string to RTL if you are translating to a Right-to-Left language, else translate to LTR LTR - + Cartouches QET title of the title block templates collection provided by QElectroTech QET title blocks - + Cartouches company title of the company's title block templates collection Company title-blocks - + Cartouches utilisateur title of the user's title block templates collection User title blocks - + Enregistrer la configuration sous... dialog title Save settings as... - - + + Configurations QElectroTech (*.conf) file dialog filter QElectroTech settings (*.conf) - - + + Erreur message box title Error - + Impossible d'enregistrer la configuration dans « %1 ». Cannot save the settings to “%1”. - + Charger une configuration... dialog title Load settings... - + « %1 » n'est pas une configuration enregistrée par QElectroTech. “%1” is not a settings file saved by QElectroTech. - + Charger une configuration message box title Load settings - + Cette configuration va remplacer vos réglages actuels, sauf la disposition des fenêtres et la liste des fichiers récents. QElectroTech va ensuite se fermer. Relancez-le pour utiliser la nouvelle configuration. @@ -9643,89 +9827,89 @@ QElectroTech will then close. Start it again to use the new settings. Do you want to continue? - + &Quitter &Quit - + &Masquer &Hide - + &Restaurer &Show - + &Masquer tous les éditeurs de schéma &Hide diagram editor - + &Restaurer tous les éditeurs de schéma &Show diagram editors - + &Masquer tous les éditeurs d'élément &Hide element editor - + &Restaurer tous les éditeurs d'élément &Show element editor - + &Masquer tous les éditeurs de cartouche systray submenu entry &Hide title block template editor - + &Restaurer tous les éditeurs de cartouche systray submenu entry &Show title block template editors - + &Nouvel éditeur de schéma &New diagram editor - + &Nouvel éditeur d'élément &New element editor - + Ferme l'application QElectroTech Closes QElectroTech - + Réduire QElectroTech dans le systray Reduces QElectroTech into the systray - + Restaurer QElectroTech Restore QElectroTech - + Éditeurs de schémas Diagram editors - + Éditeurs d'élément Element editors - + Éditeurs de cartouche systray menu entry Title block template editors @@ -9743,34 +9927,34 @@ Do you want to continue? Restore file - + Rapport de plantage Crash report - + QElectroTech ne s'est pas fermé correctement lors de sa dernière exécution. Voici les derniers messages enregistrés avant l'arrêt -- vous pouvez les enregistrer pour les joindre à un rapport de bug. QElectroTech did not close correctly the last time it was run. Here are the last messages logged before it closed — you can save them to include them in a bug report. - + Rapport de diagnostic Diagnostic report - + Ceci contient les derniers messages de journalisation de cette session. Vérifiez le contenu avant de le joindre à un rapport de bug public. This contains the latest log entries for this session. Please check the contents before attaching it to a public bug report. - + Usage : Usage: - + QElectroTech, une application de réalisation de schémas électriques. Options disponibles : @@ -9787,7 +9971,7 @@ Available options: - + [options] [fichier]... @@ -9796,114 +9980,114 @@ Available options: - + --common-elements-dir=DIR Definir le dossier de la collection d'elements --common-elements-dir=DIR Define the elements collection directory - + --common-tbt-dir=DIR Definir le dossier de la collection de modeles de cartouches --common-tbt-dir=DIR Define the title block templates collection directory - + --config-dir=DIR Definir le dossier de configuration --config-dir=DIR Define configuration directory - + --data-dir=DIR Definir le dossier de data --data-dir=DIR Define data directory - + --lang-dir=DIR Definir le dossier contenant les fichiers de langue --lang-dir=DIR Define the language files directory - + Chargement... Initialisation du cache des collections d'éléments splash screen caption Loading... Initializing the elements collection cache - + Chargement... Éditeur de schéma splash screen caption Loading... Sheets editor - + Chargement... Ouverture des fichiers splash screen caption Loading... Opening files - + Q Single-letter example text - translate length, not meaning Q - + QET Small example text - translate length, not meaning QET - + Schema Normal example text - translate length, not meaning Diagram - + Electrique Normal example text - translate length, not meaning Electric - + QElectroTech Long example text - translate length, not meaning QElectroTech - + Configurer QElectroTech window title Configure QElectroTech - + Chargement... splash screen caption Loading... - + Chargement... icône du systray splash screen caption Loading... Systray icon - + QElectroTech systray menu title QElectroTech - + QElectroTech systray icon tooltip QElectroTech @@ -9912,103 +10096,103 @@ Available options: QETDiagramEditor - + Afficha&ge Displ&ay - + Affiche ou non le panel d'appareils Show or hide the elements panel - + Ajouter une colonne Add a column - + &Cascade &Cascade - + C&oller &Paste - + Cop&ier &Copy - + Co&uper Cu&t - + Désélectionner tout Select none - + &Édition &Edit - + Enlever une colonne Remove a column - + &Enregistrer &Save - + Enregistrer sous Save as - + E&xporter &Export - + Fe&nêtres Wi&ndows - - + + &Fermer &Close - + &Fichier &File - + Imprimer Print - + Inverser la sélection Invert selection - + Mode Selection Select - + Ce panneau liste les différentes actions effectuées sur le folio courant. Cliquer sur une action permet de revenir à l'état du schéma juste après son application. "What's this" tip This panel lists the various changes applied to the current sheet. Clicking a change gets the sheet back to its state right after it was applied. @@ -10024,1252 +10208,1294 @@ Available options: Displays the background color of the sheet in white or gray - + Afficher la grille Display the grid - + Affiche ou masque la grille des folios Display or hide the grid of sheet - + Propriétés du folio Sheet properties - + Ajouter un folio Add a sheet - - - + + + Supprimer le folio Delete this sheet - + Mode Visualisation Move - + &Mosaïque &Tile - - - - - + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - + + + + + - - - - - - - - - + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + Éditeur de schémas Diagram editors - + Exporter en pdf Export in pdf - + Exporte un ou plusieurs folios du projet courant status bar tip Export one or more sheets of the current project - + Afficher les guides View the guides - + Affiche ou masque les guides Shows or hides the guides - + Exporter au format CSV Export to CSV - + Gestionnaire de borniers (DEV) Terminal block manager (DEV) - + Lancer le plugin de création de borniers Launch the terminal block creation plugin - + Exporter la liste des noms de conducteurs Export the list of names of wires - + Exporter le plan de câblage Export the wiring diagram - + Numérotation automatique des bornes Automatic numbering of terminals - + Exporter la base de donnée interne du projet Export the internal project database - + &Nouveau &New - + Crée un nouveau projet status bar tip Creates a new project - + Ouvre un projet existant status bar tip Opens an existing project - + Ferme le projet courant status bar tip Closes the current project - + Enregistre le projet courant et tous ses folios status bar tip Saves the current project and all its sheets - + Enregistre le projet courant avec un autre nom de fichier status bar tip Saves the current project with a different file name - + Ajouter une ligne Add row Add row - + Enlever une ligne Remove row Remove a row - + Ajoute une colonne au folio status bar tip Add a column to the sheet - + Enlève une colonne au folio status bar tip Remove a column from the sheet - + Agrandit le folio en hauteur status bar tip Expands the sheet height - + Rétrécit le folio en hauteur status bar tip Shrinks the sheet height - + Enlève les éléments sélectionnés du folio status bar tip Removes selected elements from the sheet - + Sélectionne tous les éléments du folio status bar tip Selects all elements on the sheet - + Désélectionne tous les éléments du folio status bar tip Deselect all elements on the sheet - + Agrandit le folio status bar tip Expand the sheet - + Rétrécit le folio status bar tip Shrinks the sheet - + Adapte le zoom de façon à afficher tout le contenu du folio indépendamment du cadre Adjusts the zoom to display all the contents of sheet regardless of context - + Adapte le zoom exactement sur le cadre du folio status bar tip Adjusts the zoom on exactly the part of the sheet - + Ajouter une ligne Draw line Add line - + Ajouter un rectangle Add a rectangle - + Ajouter une ellipse Add an ellipse - + Ajouter une polyligne Add a polygon - + Exporte le folio courant dans un autre format status bar tip Exports the current sheet to another format - + Imprime un ou plusieurs folios du projet courant status bar tip Prints one or more sheet of the current project - + + Profondeur toolbar title Depth - + Groupe Group - + Place les éléments du presse-papier sur le folio status bar tip Pastes elements from the clipboard into the sheet - + Édite les propriétés du folio (dimensions, informations du cartouche, propriétés des conducteurs...) status bar tip Edits the properties of the sheet (size, title block information, conductor properties...) - + Permet de visualiser le folio sans pouvoir le modifier status bar tip Allows to view the sheet without modifying it - + + Outils Tools - + &Ouvrir &Open - + Ouvrir un fichier Open a file - + Pas de zoom Reset zoom - + Pivoter Rotate - + &Quitter &Quit - + Supprimer Delete - + Tout sélectionner Select All - + Zoom adapté Fit in view - + Zoom arrière Zoom Out - + Zoom avant Zoom In - + Annuler Undo - + Refaire Redo - + Réinitialiser les conducteurs Reset conductors - + Affiche ou non la barre d'outils principale Display or hide the main toolbar - + Affiche ou non la barre d'outils Affichage Display or hide the Display toolbar - + Affiche ou non la barre d'outils Schéma Display or hide the Diagram toolbar - + + Affichage Display - + + Schéma Diagram - + Ajouter un champ de texte Add a textfield - + Aucune modification No modification - + Affiche ou non la liste des modifications Display or hide the undo list - + Éditer l'item sélectionné Edit the selected item - + Grouper les textes sélectionnés Group selected texts - + Pivote les éléments et textes sélectionnés status bar tip Rotate selected elements and texts - + Pivote les textes sélectionnés à un angle précis status bar tip Rotate selected texts to a specific angle - + Chercher/remplacer Search / Replace - + &Projet &Project - + &Récemment ouverts &Latest files - - + + Projet %1 enregistré dans le repertoire: %2. Project %1 registered in the directory: %2. - + Il semblerait que le fichier que vous essayez d'ouvrir ne soit pas accessible en lecture. Il est donc impossible de l'ouvrir. Veuillez vérifier les permissions du fichier. The file you try to open does not seem readable and can not be opened. Please check the file permissions. - + Il semblerait que le projet que vous essayez d'ouvrir ne soit pas accessible en écriture. Il sera donc ouvert en lecture seule. The project you try to open does not seem writable. It will be opened read-only. - + en utilisant des onglets using tabs - + en utilisant des fenêtres using windows - + Afficher les projets Display projects - + Propriétés du projet Project properties - + Nettoyer le projet Clean project - - + + Échec de l'ouverture du projet message box title Unable to open project - + Il semblerait que le fichier %1 ne soit pas un fichier projet QElectroTech. Il ne peut donc être ouvert. message box content The file %1 does not appear to be a QElectroTech project file. Thus it cannot be opened. - - - + + + QElectroTech window title QElectroTech - + QElectroTech status bar message QElectroTech - + Annulations dock title Undo - + Cliquez sur une action pour revenir en arrière dans l'édition de votre schéma Status tip Click an action to get back in the changes you made to your diagram - + Orienter les textes Choose texts orientation - + Retrouver dans le panel Find in the panel - + Ajouter une image Add a picture - + Ajouter un sommaire Add a summary - + Zoom sur le contenu Zoom content - + Ferme l'application QElectroTech status bar tip Closes QElectroTech - + Annule l'action précédente status bar tip Undoes the previous action - + Restaure l'action annulée status bar tip Restores the undone action - + Transfère les éléments sélectionnés dans le presse-papier status bar tip Puts selected elements into the clipboard - + Copie les éléments sélectionnés dans le presse-papier status bar tip Copies selected elements - + Désélectionne les éléments sélectionnés et sélectionne les éléments non sélectionnés status bar tip Inverts selection of elements - + Retrouve l'élément sélectionné dans le panel status bar tip Find the selected item in the panel - + Recalcule les chemins des conducteurs sans tenir compte des modifications status bar tip Reset the conductors path ignoring the user changes - + Création automatique de conducteur(s) Tool tip of auto conductor Automatic creation conductor (s) - + Projets dock title Projects - + Collections Collections - + Utiliser la création automatique de conducteur(s) quand cela est possible Status tip of auto conductor Using the automatic creation of conductor (s) when possible - + Restaure le zoom par défaut status bar tip Restores default zoom level - + Présente les différents projets ouverts dans des sous-fenêtres status bar tip Shows the various opened projects in windows - + Coller au point d'origine Paste at the original position - + + + Coller les informations de l'élément + Paste element information + + + Place les éléments du presse-papier à leur position d'origine et déplace le curseur vers ce point status bar tip Places the clipboard's items at their original position and moves the cursor to that point - + + Copie les informations renseignées de l'élément du presse-papier sur les éléments sélectionnés + status bar tip + Copies the filled-in information of the element on the clipboard to the selected elements + + + Dupli&quer &Duplicate - + Copie la sélection, décalée de l'espacement configuré status bar tip Copies the selection, offset by the configured spacing - + Configurer la duplication... Configure duplication... - + Choisir l'espacement et la direction utilisés par Dupliquer status bar tip Choose the spacing and direction used by Duplicate - + Coupure automatique de conducteur(s) Tool tip of auto break conductor Automatic disconnection of conductor(s) - + Couper automatiquement les conducteurs existants lors du placement d'un élément Status tip of auto break conductor Automatically cut existing conductors when placing an element - + Grille des textes Text grid - + Grille d'accrochage des textes déplacés à la souris. Maintenir Ctrl pendant le déplacement pour placer librement. Snap grid for texts moved with the mouse. Hold Ctrl while moving to place freely. - + Désactivée Disabled - + Garder les en-têtes visibles Keep headers visible - + Garde les numéros de colonne et les lettres de ligne du folio visibles au bord de la vue Keeps the sheet's column numbers and row letters visible at the edge of the view - + Afficher les limites des cases Show cell boundaries - + Trace les limites des colonnes et des lignes du folio sur le schéma, à l'écran seulement Draws the boundaries of the sheet's columns and rows on the diagram, on screen only - + Afficher Show - + Textes des éléments Element texts - + Textes des conducteurs Conductor texts - + Champs de texte Text fields - + Formes Shapes - + Images Pictures - + Tableaux Tables - + Références croisées Cross-references - + Voir Affichage > Afficher See Display > Show - + Ajouter une nomenclature Add a nomenclature - + Liste de câblage (base de données) Wiring list (database) - - - + + + Recharger les dessins des éléments Reload element drawings - + Redessine chaque élément placé d'après sa définition actuelle, sans avoir à fermer et rouvrir le projet (action non annulable) Redraws each placed element from its current definition, without having to close and reopen the project (action cannot be undone) - + Exécuter un script... Run a script... - + Exécute un script JavaScript sur le projet courant (voir qet.* dans le script pour l'API disponible) Runs a JavaScript script on the current project (see qet.* in the script for the available API) - + Enregistrer une macro Record a macro - + Enregistre ce que vous faites sur le projet, pour qu'un assistant IA en fasse un script ; recliquez pour arrêter Records what you do on the project, for an AI assistant to make a script of; click again to stop - + Gérer les scripts… Manage scripts… - + Écrire un script et en faire un bouton avec une icône Write a script and make it a button with an icon - + Ouvrir le dossier des scripts Open the scripts folder - + Chaque fichier .js de ce dossier qui commence par un en-tête // ==QETScript== devient un bouton Every .js file in this folder that starts with a // ==QETScript== header becomes a button - + Présente les différents projets ouverts des onglets status bar tip Shows the various opened projects in tabs - + Permet de sélectionner les éléments status bar tip Allows to select elements - + Pivoter le groupe Rotate the group - - + + Miroir horizontal + Horizontal mirror + + + + Miroir vertical + Vertical mirror + + + + Grouper Group - + Dégrouper Ungroup - + Insérer le dernier élément Insert the last element - + Place à nouveau le dernier élément inséré status bar tip Places the last inserted element again - + Rechercher une commande… Search for a command… - + Tapez une partie du nom d'une commande et appuyez sur Entrée pour la lancer status bar tip Type part of a command name and press Enter to launch it - + Insérer un élément… Insert an element… - + Ouvre le sélecteur d'éléments à la position du curseur status bar tip Opens the element picker at the cursor position - + Barre de raccourcis Shortcut bar - + Ouvre à la position du curseur les commandes utiles pour la sélection, et le sélecteur d'éléments status bar tip Opens, at the cursor position, the commands useful for the selection, and the element picker - + Répéter la dernière commande Repeat the last command - + Relance le dernier outil de dessin ou la dernière insertion d'élément (Entrée sur le folio) status bar tip Relaunches the last drawing tool or element insertion (Enter on the sheet) - + Pivote la sélection comme un groupe autour de son centre, au lieu de chaque élément sur place status bar tip Rotates the selection as a group around its centre, rather than each element in place - + + Retourne les éléments sélectionnés de gauche à droite + status bar tip + Flips the selected elements from left to right + + + + Retourne les éléments sélectionnés de haut en bas + status bar tip + Flips the selected elements from top to bottom + + + Groupe les éléments, textes, formes et images sélectionnés : ils se sélectionnent, se déplacent et se copient ensemble status bar tip Groups the selected elements, texts, shapes and images: they are selected, moved and copied together - + Défait les groupes sélectionnés status bar tip Breaks up the selected groups - + Aligner sur la grille Align to grid - + Remet les éléments, images et textes sélectionnés sur la grille status bar tip Puts the selected elements, images and texts back on the grid - + Aligner à gauche Align left - + Aligne les bords gauches des objets sélectionnés status bar tip Aligns the left edges of the selected items - + Centrer horizontalement Centre horizontally - + Aligne les objets sélectionnés sur une même verticale, par leur point d'origine pour les éléments status bar tip Aligns the selected items on one vertical line, by their origin point for elements - + Aligner à droite Align right - + Aligne les bords droits des objets sélectionnés status bar tip Aligns the right edges of the selected items - + Aligner en haut Align top - + Aligne les bords supérieurs des objets sélectionnés status bar tip Aligns the top edges of the selected items - + Centrer verticalement Centre vertically - + Aligne les objets sélectionnés sur une même horizontale, par leur point d'origine pour les éléments status bar tip Aligns the selected items on one horizontal line, by their origin point for elements - + Aligner en bas Align bottom - + Aligne les bords inférieurs des objets sélectionnés status bar tip Aligns the bottom edges of the selected items - + Sélectionner tous les conducteurs Select all conductors - + Sélectionner tous les champs de texte Select all text fields - + Sélectionne tous les conducteurs du folio, désélectionne le reste status bar tip Selects all conductors on the sheet, deselects the rest - + Sélectionne tous les champs de texte du folio, désélectionne le reste status bar tip Selects all text fields on the sheet, deselects the rest - + Centrer sur le curseur Centre on the cursor - + Centre le folio sur le point sous le curseur de la souris, sans changer le zoom status bar tip Centres the sheet on the point under the mouse cursor, without changing the zoom - + Ajouter un PDF Add a PDF - + Ajouter un arc Add an arc - + Ajouter une courbe Add a curve - + Ajouter un congé Add a fillet - + Ajouter un plan de bornes Add a terminal plan - + Ajoute un champ de texte sur le folio actuel Adds a text field to the current sheet - + Ajoute une image sur le folio actuel Add an image to the current sheet - + Ajoute une page PDF sur le folio actuel Adds a PDF page to the current sheet - + Ajoute une ligne sur le folio actuel Add a line to the current sheet - + Ajoute un rectangle sur le folio actuel Adds a rectangle on the current sheet - + Ajoute une ellipse sur le folio actuel Add an ellipse to the current sheet - + Ajoute un arc sur le folio actuel Adds an arc on the current sheet - + Ajoute une polyligne sur le folio actuel Adds a polyline to the current sheet - + Ajoute une courbe de Bézier sur le folio actuel Adds a Bézier curve to the current sheet - + Arrondit le coin entre deux lignes du folio actuel Rounds the corner between two lines of the current sheet - + Ajoute un plan de bornier sur le folio actuel Adds a terminal plan to the current sheet - + Atteindre un élément Navigate to an element - + Recherche et sélectionne rapidement un élément du folio status bar tip Quickly search for and select an element in the sheet - + + Ajouter Add - + Scripts toolbar title Scripts - + A&jouter &Add - + Sélection Selection - + Aligner Align - + Lignes et colonnes Rows and columns - + Profondeur Depth - - + + Scripts Scripts - + Projets QElectroTech (*.qet);;Fichiers XML (*.xml);;Tous les fichiers (*) QElectroTech project(*.qet);;XML Files (*.xml);;All files (*) - - + + Impossible d'ouvrir le fichier message box title Unable to open file - + Il semblerait que le fichier %1 que vous essayez d'ouvrir n'existe pas ou plus. It appears the %1 file which you are trying to open does not exist or does not exist anymore. - + Ouverture du projet en lecture seule message box title Opening the file read-only - + %n description(s) de police écrite(s) dans un format étranger ou corrompu ont été restaurée(s). Elles seront réécrites dans un format stable au prochain enregistrement du projet. message box content @@ -11278,7 +11504,7 @@ Hold Ctrl while moving to place freely. - + %n description(s) de police n'ont pas pu être lue(s) ; la police par défaut sera utilisée pour ces textes. message box content @@ -11287,24 +11513,24 @@ Hold Ctrl while moving to place freely. - + Polices du projet message box title Project fonts - + Folio %1 : %2 Sheet %1: %2 - + Conducteurs non chargés message box title Conductors not loaded - + %n conducteur(s) n'ont pas pu être reliés à leurs bornes et n'ont pas été chargés. La définition de l'élément dans le projet a probablement été remplacée par une autre dont les bornes diffèrent. Si vous enregistrez le projet, ces conducteurs disparaîtront du fichier. Fermez-le sans enregistrer pour conserver le fichier tel quel. @@ -11319,19 +11545,19 @@ If you save the project, these conductors will disappear from the file. Close it - + Suppression de borne impossible Unable to delete the terminal - + La suppression ne peut être effectué car la selection possède une ou plusieurs bornes ponté et/ou appartenant à une borne à niveau multiple. Déponter et/ou supprimer les niveaux des bornes concerné afin de pouvoir les supprimer The deletion cannot be performed because the selection contains one or more terminals that are bridged and/or belong to a multi-level terminal. Unbridge and/or remove the levels from the affected terminals so that they can be deleted - + %n objet(s) remis sur la grille %n item put back on the grid @@ -11339,7 +11565,7 @@ Unbridge and/or remove the levels from the affected terminals so that they can b - + %n objet(s) aligné(s) %n item aligned @@ -11347,22 +11573,22 @@ Unbridge and/or remove the levels from the affected terminals so that they can b - + La sélection est déjà sur la grille The selection is already on the grid - + Sélectionnez au moins deux éléments, images, textes, formes ou groupes non verrouillés Select at least two unlocked elements, images, texts, shapes or groups - + La sélection est déjà alignée, à la grille près The selection is already aligned, to the nearest grid step - + (%n objet(s) verrouillé(s) laissé(s) en place) (%n locked object left in place) @@ -11370,100 +11596,100 @@ Unbridge and/or remove the levels from the affected terminals so that they can b - + Éditer l'élement edit element Edit the element - + Éditer le champ de texte edit text field Edit the text field - + Éditer l'image edit image Edit the image - + Éditer le conducteur edit conductor Edit conductor - + Éditer l'objet sélectionné edit selected item Edit the selected object - + Une erreur est survenue lors de l'ouverture du fichier %1. message box content An error occurred while opening file %1. - + Active le projet « %1 » Activates the project « %1 » - + Êtes-vous sûr de vouloir supprimer ce folio ? Are you sure you want to delete this sheet? - + Supprimer les folios Delete the sheets - + Êtes-vous sûr de vouloir supprimer les %1 folios sélectionnés ? Are you sure you want to delete the selected %1 sheets ? - + Supprimer %1 folios Delete %1 sheets - - - - - - - + + + + + + + Déplacer les folios Move the sheets - + Erreur message box title Error - + Répéter : insérer « %1 » Repeat: insert "%1" - + Répéter : %1 Repeat: %1 - + folio %1 sheet %1 - + %n élément(s) redessiné(s). %n element redrawn. @@ -11471,7 +11697,7 @@ Unbridge and/or remove the levels from the affected terminals so that they can b - + %n élément(s) dont la définition est introuvable ou illisible : leur dessin actuel a été conservé. %n element for which no definition could be found or which were illegible: their current design has been retained. @@ -11479,7 +11705,7 @@ Unbridge and/or remove the levels from the affected terminals so that they can b - + %n élément(s) non redessiné(s) : leur taille, leur point de saisie ou leurs bornes ont changé (borne ajoutée, supprimée ou déplacée). %n element not redrawn: its size, grip point or terminals have changed (a terminal was added, removed or moved). @@ -11487,18 +11713,18 @@ Unbridge and/or remove the levels from the affected terminals so that they can b - + Pour les mettre à jour, il faut les supprimer puis les réinsérer. Attention : cette opération supprime les conducteurs déjà reliés à ces éléments, qu'il faudra retracer. To update them, they must be deleted then reinserted. Warning: this operation removes the conductors already connected to these elements, which will need to be redrawn. - - + + Exécuter un script Run a script - + Les scripts sont désactivés. Un script s'exécute avec vos droits : il peut lire et modifier le projet ouvert et écrire des fichiers. N'exécutez que des scripts dont vous connaissez l'origine. @@ -11511,33 +11737,33 @@ A script runs with your permissions: it can read and modify the open project and Enable scripts? This setting can be changed in Configure QElectroTech > General > Projects. - + Retenu après un redémarrage Remembered after a restart - + Scripts JavaScript (*.js);;Tous les fichiers (*) JavaScript scripts (*.js);;All files (*) - + Ignoré : %1 Ignored: %1 - - + + Arrêter Stop - + Arrêter l'enregistrement de la macro Stop recording the macro - + ● Enregistrement : %n étape(s) ● Recording: %n step @@ -11545,12 +11771,12 @@ Enable scripts? This setting can be changed in Configure QElectroTech > Gener - + Macro enregistrée Macro recorded - + « %1 » : %n étape(s). Pour en faire un script, demandez-le à votre assistant IA : le bouton ci-dessous copie la demande, il suffit de la coller dans sa fenêtre. @@ -11564,43 +11790,43 @@ To make a script of it, ask your AI assistant: the button below copies the reque - + &Copier la demande pour l'assistant &Copy the request for the assistant - + &Ouvrir le dossier &Open the folder - + Demande copiée : collez-la dans la fenêtre de l'assistant Request copied: paste it into the assistant's window - + Couper la connexion de l'assistant pour le reste de la session Close the assistant's connection for the rest of the session - + Mode direct : assistant connecté Live mode: assistant connected - + Mode direct : en attente d'un assistant Live mode: waiting for an assistant - - + + Assistant Assistant - + Demander avant d'exécuter un script écrit par l'assistant Ask before running a script the assistant wrote @@ -11609,12 +11835,12 @@ To make a script of it, ask your AI assistant: the button below copies the reque For this session only: every start asks again - + Mode direct : %1 %2 à %3 Live mode: %1 %2 at %3 - + %n type(s) d'objets masqué(s) %n kind of item hidden @@ -11622,41 +11848,41 @@ To make a script of it, ask your AI assistant: the button below copies the reque - - + + Textes %1 Texts %1 - + Dispose les fenêtres en mosaïque status bar tip Arranges windows in a tile pattern - + Dispose les fenêtres en cascade status bar tip Arranges windows in a cascade pattern - + Projet suivant Next project - + Projet précédent Previous project - + Active le projet suivant status bar tip Activates the next project - + Active le projet précédent status bar tip Activates the previous project @@ -11860,53 +12086,53 @@ To make a script of it, ask your AI assistant: the button below copies the reque Import an element to resize - + Ajouter une ligne Add a line - + Ajouter une ellipse Add an ellipse - + Ajouter un polygone Add a polygon - + Ajouter du texte Add text - + Ajouter un arc de cercle Add an arc - + Ajouter une borne Add a terminal - + Annuler Undo - + Refaire Redo - + <br>En l'absence de borne, l'élément ne pourra être relié à d'autres éléments par l'intermédiaire de conducteurs. warning description <br>Without terminal, the element can not be connected to other elements via conductors. - + Aucune modification No modification @@ -11951,13 +12177,13 @@ To make a script of it, ask your AI assistant: the button below copies the reque Edit author information - + Parties toolbar title Parts - + Profondeur toolbar title Depth @@ -11973,12 +12199,12 @@ To make a script of it, ask your AI assistant: the button below copies the reque Edit element properties - + Ajouter un champ texte dynamique Add a dynamic text field - + Double-click pour terminer la forme, Click droit pour annuler le dernier point Double-click to finish the shape, Right click to cancel the last point @@ -12003,26 +12229,26 @@ To make a script of it, ask your AI assistant: the button below copies the reque Paste from... - + [Modifié] window title tag [Changed] - + [lecture seule] window title tag [Read only] - + Éditeur d'éléments status bar message Elements Editor - - + + %n partie(s) sélectionnée(s). %n selected part. @@ -12030,29 +12256,29 @@ To make a script of it, ask your AI assistant: the button below copies the reque - + Trop de primitives, liste non générée: %1 Too many primitives, list not generated: %1 - + Absence de borne warning title Missing terminal - + <br><b>Erreur</b> :<br>Les reports de folio doivent posséder une seul borne.<br><b>Solution</b> :<br>Verifier que l'élément ne possède qu'une seul borne <br><b>Error</b>:<br>Sheet references must have a single terminal.<br><b>Solution</b>:<br>Check that the element has only one terminal - + La vérification de cet élément a généré message box content The verification of this element generated - + %n erreur(s) errors @@ -12061,32 +12287,32 @@ To make a script of it, ask your AI assistant: the button below copies the reque - + et and - + Erreurs Errors - + Absence de borne Missing terminal - + Ajouter un texte d'élément non éditable dans les schémas Add non-editable element text in diagrams - + Ajouter un texte d'élément pouvant être édité dans les schémas Add element text that can be edited in diagrams - + %n avertissement(s) warnings @@ -12095,104 +12321,104 @@ To make a script of it, ask your AI assistant: the button below copies the reque - + <b>%1</b> : %2 warning title: warning description <b>%1</b> : %2 - + Le fichier %1 n'existe pas. message box content The file %1 does not exist. - + Afficher menu entry Display - - + + Impossible d'ouvrir le fichier %1. message box content Unable to open the file %1. - - + + Ce fichier n'est pas un document XML valide message box content This file is not a valid XML document - - + + Erreur toolbar title Error - - + + Édition en lecture seule message box title Read only edition - - + + Vous n'avez pas les privilèges nécessaires pour modifier cet élement. Il sera donc ouvert en lecture seule. message box content You are not allowed to modify this element. Thus it will be edited read-only. - - + + Erreur message box title Error - + Impossible d'écrire dans ce fichier message box content Unable to write to this file - + Impossible d'enregistrer l'élément message box content Unable to save the element - + Nombre de bornes incorrect Incorrect number of terminals - + <br><b>Erreur</b> :<br>Les définitions de conducteur ne peuvent posséder qu'une seule borne.<br><b>Solution</b> :<br>Vérifier que l'élément ne possède qu'une seule borne <br><b>Error</b>:<br>Conductor definitions can only have one terminal.<br><b>Solution</b>:<br>Verify that the element has only one terminal - + Noms de bornes en double Duplicate terminal names - + <br><b>Erreur</b> :<br>Plusieurs bornes portent le même nom : %1.<br><b>Solution</b> :<br>Donner un nom unique à chaque borne, par exemple N.1 et N.2. Les bornes concernées sont sélectionnées. <br><b>Error</b>:<br>Several terminals have the same name: %1.<br><b>Solution</b>:<br>Give each terminal a unique name, for example N.1 and N.2. The terminals concerned are selected. - + Bornes sans nom Terminals without a name - + <br>%n borne(s) sans nom. Sans noms de bornes uniques, la liste de câblage (qui relie quoi à quoi) ne peut pas désigner chaque borne, et ne peut donc pas servir à câbler l'armoire en atelier. <br>%n terminal without a name. Without unique terminal names, the wiring list (what connects to what) cannot name each terminal, so it cannot be used to wire the cabinet in the workshop. @@ -12200,9 +12426,8 @@ To make a script of it, ask your AI assistant: the button below copies the reque - - + @@ -12216,202 +12441,209 @@ To make a script of it, ask your AI assistant: the button below copies the reque - + - + - - - - - - + + + + + - - - + + + + + + Éditeur d'élément Element editors - + + Mettre l'élément à l'échelle... + Scale the element... + + + Afficher le cadre de fond Show the background frame - + Taille du cadre de fond... Background frame size... - + Taille du cadre de fond Background frame size - - + + px px - + Largeur Width - + Hauteur Height - + X: %1 Y: %2 X: %1 Y: %2 - + Exporter en SVG dialog title Export as SVG - + Image SVG (*.svg) filetypes allowed when exporting an element to SVG SVG image (*.svg) - + Échec de l'export Export failed - + Impossible d'écrire dans le fichier « %1 ». Unable to write to the file « %1 ». - + Avertissement Warning - + L'import d'un dxf volumineux peut prendre du temps veuillez patienter durant l'import... Importing a large dxf can take time please wait while importing... - + Importer un élément à redimensionner Import an element to resize - + Éléments QElectroTech (*.elmt) QElectroTech elements (*.elmt) - + Impossible d'ouvrir le fichier message box title Unable to open file - + Il semblerait que le fichier %1 que vous essayez d'ouvrir n'existe pas ou plus. It appears the %1 file which you are trying to open does not exist or does not exist anymore. - - - + + + Echec de l'enregistrement Registration failed - - - + + + L'enregistrement à échoué, les conditions requises ne sont pas valides The recording failed, the conditions are not valid - + Ouvrir un fichier dialog title Open a file - + Éléments QElectroTech (*.elmt);;Fichiers XML (*.xml);;Tous les fichiers (*) filetypes allowed when opening an element file QElectroTech elements (*.elmt);;XML files (*.xml);;All files (*) - + Recharger l'élément dialog title Reload element - + Avertissements Warnings - + Vous avez efffectué des modifications sur cet élément. Si vous le rechargez, ces modifications seront perdues. Voulez-vous vraiment recharger l'élément ? dialog content This element has been modified since last save. If you reload it, these changes will be lost. Do you really want to reload this element? - + Enregistrer sous dialog title Save as - + Éléments QElectroTech (*.elmt) filetypes allowed when saving an element file QElectroTech elements (*.elmt) - + Enregistrer l'élément en cours ? dialog title Save current element? - + Voulez-vous enregistrer l'élément %1 ? dialog content - %1 is an element name Do you wish to save the element %1? - - - - + + + + Élément inexistant. message box title Non-existent element. - - + + L'élément n'existe pas. message box content The element does not exist. - - + + Le chemin virtuel choisi ne correspond pas à un élément. message box content The chosen virtual path does not match an element. @@ -12432,7 +12664,7 @@ the conditions are not valid &Paste - + Ajouter un rectangle Add a rectangle @@ -12451,171 +12683,183 @@ the conditions are not valid Allows to specify various parameters for QElectroTech - + À &propos de QElectroTech A&bout QElectroTech - + Affiche des informations sur QElectroTech status bar tip Displays information about QElectroTech - + Manuel en ligne Online manual - + Chaine Youtube Youtube channel - - + + Télécharger une nouvelle version (dev) Download a new version (dev) - + Lance le navigateur par défaut vers le manuel en ligne de QElectroTech status bar tip Launches the default browser to the online manual QElectroTech - + Enregistrer la configuration sous... Save settings as... - + Enregistre les réglages de QElectroTech dans un fichier status bar tip Saves QElectroTech's settings to a file - + - - - - - - - - - + + + + + + + + + - + + Général General - + + &Personnaliser... + &Customize... + + + + Barres d'outils, barre de raccourcis, clavier et gestes de la souris, dans une seule fenêtre + status bar tip + Toolbars, shortcut bar, keyboard and mouse gestures, in one window + + + Charger une configuration... Load settings... - + Remplace les réglages de QElectroTech par ceux d'un fichier, puis ferme QElectroTech status bar tip Replaces QElectroTech's settings with those of a file, then closes QElectroTech - + Connecter un assistant IA... Connect an AI assistant... - + Affiche la configuration qui permet à un assistant IA d'utiliser QElectroTech status bar tip Shows the setup that lets an AI assistant use QElectroTech - + Lance le navigateur par défaut vers la chaine Youtube de QElectroTech status bar tip Launches the default browser on the Youtube channel of QElectroTech - - + + Lance le navigateur par défaut vers le dépot Nightly en ligne de QElectroTech status bar tip Launches the default browser to the online repository Nightly QElectroTech - + Soutenir le projet par un don Support the project with a donation - + Soutenir le projet QElectroTech par un don status bar tip Support the QElectroTech project with a donation - + À propos de &Qt About &Qt - + Affiche des informations sur la bibliothèque Qt status bar tip Displays information about Qt library - + Enregistrer un rapport de diagnostic... Save a diagnostic report... - + Génère un rapport avec les derniers messages de journalisation, pour l'inclure dans un rapport de bug status bar tip Generates a report containing the latest log entries, to be included in a bug report - + &Configuration window menu &Settings - + &Aide window menu &Help - + Sortir du &mode plein écran Leave F&ullScreen Mode - + Affiche QElectroTech en mode fenêtré status bar tip Displays QElectroTech in windowed mode - + Passer en &mode plein écran F&ullScreen Mode - + Affiche QElectroTech en mode plein écran status bar tip Displays QElectroTech in full screen mode - + Afficher menu entry Display @@ -12624,58 +12868,58 @@ the conditions are not valid QETProject - + Avertissement message box title Warning - + Projet « %1 : %2» displayed title for a ProjectView - %1 is the project title, -%2 is the project path Project « %1 : %2» - + Projet %1 displayed title for a title-less project - %1 is the file name Project %1 - + Projet sans titre displayed title for a project-less, file-less project Untitled project - + %1 [lecture seule] displayed title for a read-only project - %1 is a displayable title %1 [read-only] - + %1 [modifié] displayed title for a modified project - %1 is a displayable title %1 [modified] - + Renumber elements Renumber elements - + Renumber elements (%1) Renumber elements (%1) - + Système de contacts modifié Modified contact system - + Le nouvel élément définit des groupes de contacts esclaves. Les éléments esclaves existants ne seront pas automatiquement assignés. Vous devrez relier manuellement les esclaves et assigner les groupes de contacts. @@ -12686,13 +12930,13 @@ Existing slave elements will not be automatically assigned. You will need to lin Do you wish to continue? - + Une erreur s'est produite durant l'intégration du modèle. error message An error occurred during the template integration. - + Ce document semble avoir été enregistré avec une version %1 qui est ultérieure à votre version ! Vous utilisez actuellement QElectroTech en version %2 @@ -12701,7 +12945,7 @@ Vous utilisez actuellement QElectroTech en version %2 You are currently using QElectroTech in version %2 - + . Il est alors possible que l'ouverture de tout ou partie de ce document échoue. Que désirez vous faire ? @@ -12710,32 +12954,32 @@ Que désirez vous faire ? What do you wish to do ? - + Le projet que vous tentez d'ouvrir est partiellement compatible avec votre version %1 de QElectroTech. The project you are trying to open is partially compatible with your version %1 of QElectroTech. - + Afin de le rendre totalement compatible veuillez ouvrir ce même projet avec la version 0.8, ou 0.80 de QElectroTech et sauvegarder le projet et l'ouvrir à nouveau avec cette version. Que désirez vous faire ? In order to make it fully compatible please open this same project with version 0.8, or 0.80 of QElectroTech and save the project and open it again with this version. What do you wish to do ? - + Avertissement message box title Warning - + <p align="center"><b>Ouverture du projet en cours...</b><br/>Création des folios</p> <p align="center"><b>Opening the project ...</b><br/>Creation of sheets</p> - + <p align="center"><b>Ouverture du projet en cours...</b><br/>Mise en place des références croisées</p> <p align="center"><b>Opening the project ...</b><br/>Setting up cross references</p> @@ -13119,8 +13363,8 @@ What do you wish to do ? The text file containing the GNU/GPL license exists but could not be opened - however, you know it by heart, don't you? - - + + Avertissement : l'élément a été enregistré avec une version ultérieure de QElectroTech. Warning: the element has been saved with a more recent version of QElectroTech. @@ -13201,83 +13445,89 @@ What do you wish to do ? deletion - + déplacement undo caption move - + modification noms undo caption modify names - + amener au premier plan undo caption bring forward - + rapprocher undo caption raise - + éloigner undo caption lower - + envoyer au fond undo caption Send to back - + modification informations complementaires undo caption Modification complementary information - + redimensionnement %1 undo caption -- %1 is the resized primitive type name scale %1 - + redimensionnement de %1 primitives undo caption -- %1 always > 1 scale %1primitives - + Modifier les propriétées de l'élément Modify item properties - - + + Pivoter la selection undo caption Rotate the selection - + Miroir de sélection undo caption Mirror selection - + Retourner la sélection undo caption Flip selection + + + mise à l'échelle de l'élément + undo caption + scale the element + arc @@ -13524,7 +13774,7 @@ What do you wish to do ? Terminal - + couper des parties undo caption cut parts @@ -13711,7 +13961,7 @@ What do you wish to do ? - + Titre Title @@ -14014,7 +14264,7 @@ the translated name of this folder could not be read, so its folder name is disp - + Pivoter %1 Rotate %1 @@ -14197,43 +14447,43 @@ Do you want to replace it ? - - - + + + Type Type - - - + + + Adresse Address - - - + + + Commentaire Annotation - - - + + + Réf. croisée Cross-reference - - - + + + Fonction @@ -14570,22 +14820,22 @@ Do you want to replace it ? Creation of conductors - + To install the plugin qet_tb_generator<br>Visit :<br><a href='https://pypi.python.org/pypi/qet-tb-generator'>qet-tb-generator</a><br>Requires python 3.5 or above.<br><B><U> First install on Windows</B></U><br>1. Install, if required, python 3.5 or above<br> Visit :<br><a href='https://www.python.org/downloads/'>python.org</a><br>2. pip install qet_tb_generator<br><B><U> Update on Windows</B></U><br>python -m pip install --upgrade qet_tb_generator<br>>>user could launch in a terminal this script in this directory<br> C:\users\XXXX\AppData\Local\Programs\Python\Python36-32\Scripts <br> To install the plugin qet_tb_generator<br>Visit :<br><a href='https://pypi.python.org/pypi/qet-tb-generator'>qet-tb-generator</a><br>Requires python 3.5 or above.<br><B><U> First install on Windows</B></U><br>1. Install, if required, python 3.5 or above<br> Visit :<br><a href='https://www.python.org/downloads/'>python.org</a><br>2. pip install qet_tb_generator<br><B><U> Update on Windows</B></U><br>python -m pip install --upgrade qet_tb_generator<br>>>user could launch in a terminal this script in this directory<br> C:\users\XXXX\AppData\Local\Programs\Python\Python36-32\Scripts <br> - + To install the plugin qet_tb_generator<br>Visit :<br><a href='https://pypi.python.org/pypi/qet-tb-generator'>qet-tb-generator</a><br><B><U> First install on macOSX</B></U><br>1. Install, if required, python 3.11 bundle only, <a href='https://www.python.org/ftp/python/3.11.2/python-3.11.2-macos11.pkg'>python-3.11.2-macos11.pkg</a><br>2 Run Profile.command script<br>because program use hardcoded PATH for localise qet-tb-generator plugin <br> Visit :<br><a href='https://qelectrotech.org/forum/viewtopic.php?pid=5674#p5674'>howto</a><br>2. pip3 install qet_tb_generator<br><B><U> Update on macOSX</B></U><br> pip3 install --upgrade qet_tb_generator<br> To install the plugin qet_tb_generator<br>Visit :<br><a href='https://pypi.python.org/pypi/qet-tb-generator'>qet-tb-generator</a><br><B><U> First install on macOSX</B></U><br>1. Install, if required, python 3.11 bundle only, <a href='https://www.python.org/ftp/python/3.11.2/python-3.11.2-macos11.pkg'>python-3.11.2-macos11.pkg</a><br>2 Run Profile.command script<br>because program use hardcoded PATH for localise qet-tb-generator plugin <br> Visit :<br><a href='https://qelectrotech.org/forum/viewtopic.php?pid=5674#p5674'>howto</a><br>2. pip3 install qet_tb_generator<br><B><U> Update on macOSX</B></U><br> pip3 install --upgrade qet_tb_generator<br> - + To install the plugin qet_tb_generator<br>Visit :<br><a href='https://pypi.python.org/pypi/qet-tb-generator'>qet-tb-generator</a><br><br>Requires python 3.5 or above.<br><br><B><U> First install on Linux</B></U><br>1. check you have pip3 installed: pip3 --version<br>If not install with: sudo apt-get install python3-pip<br>2. Install the program: sudo pip3 install qet_tb_generator<br>3. Run the program: qet_tb_generator<br><br><B><U> Update on Linux</B></U><br>sudo pip3 install --upgrade qet_tb_generator<br> To install the plugin qet_tb_generator<br>Visit :<br><a href='https://pypi.python.org/pypi/qet-tb-generator'>qet-tb-generator</a><br><br>Requires python 3.5 or above.<br><br><B><U> First install on Linux</B></U><br>1. check you have pip3 installed: pip3 --version<br>If not install with: sudo apt-get install python3-pip<br>2. Install the program: sudo pip3 install qet_tb_generator<br>3. Run the program: qet_tb_generator<br><br><B><U> Update on Linux</B></U><br>sudo pip3 install --upgrade qet_tb_generator<br> - + Error launching qet_tb_generator plugin Error launching qet_tb_generator plugin @@ -14805,7 +15055,7 @@ Do you want to replace it ? Open an item - + Importer un fichier dxf Import a dxf file @@ -14817,8 +15067,8 @@ Do you want to replace it ? - - + + @@ -15001,8 +15251,8 @@ Please download it by following the link and unzip it in the installation folder - - + + Déplacer %1 Move %1 @@ -15147,88 +15397,88 @@ Please download it by following the link and unzip it in the installation folder - + Ajouter %1 insert %1 - + Modifier les propriétés du conducteur Edit the conductor properties - + Modifier un texte Edit a text - + Modifier la couleur d'un texte Change the color of a text - + Pivoter un texte Rotate a text - + Modifier le trait d'une forme Edit line of a form - + Modifier le remplissage d'une forme Edit filling a form - + Pivoter une forme Rotate a shape - - + + Modifier la forme d'%1 Change the shape of %1 - + Fermer/Ouvrir %1 Close/Open %1 - + Redimensionner une image Resize an image - + Pivoter une image Rotate an image - + Modifier un texte d'élément Edit element text - + Numéroter automatiquement un élément Automatically number an element - + Renuméroter les éléments (%1) Renumber elements (%1) - + Rechercher et remplacer Search and replace - + Script @@ -15290,10 +15540,30 @@ To enable it: Configure QElectroTech > General > Projects, or set the QET_ Unfreeze element name - + Folio Sheet + + + Grouper un ensemble de bornes + Group a set of terminals + + + + Dégrouper un ensemble de bornes + Ungroup a set of terminals + + + + Miroir horizontal + Horizontal mirror + + + + Miroir vertical + Vertical mirror + QTextOrientationWidget @@ -16336,6 +16606,45 @@ Create your own text using the following variables: %c: the column number + + ScaleElementDialog + + + Mettre l'élément à l'échelle + Scale the element + + + + Facteur : + Factor: + + + + Mettre aussi les textes à l'échelle + Also scale the texts + + + + %n borne(s) de cet élément ne sont pas sur la grille, et aucun facteur ne les y amène. + + %n terminal of this element is not on the grid, and no factor brings it there. + %n terminals of this element are not on the grid, and no factor brings them there. + + + + + %n borne(s) de cet élément ne sont pas sur la grille. Seuls les facteurs qui les y amènent sont proposés. + + %n terminal of this element is not on the grid. Only the factors that bring it there are offered. + %n terminals of this element are not on the grid. Only the factors that bring them there are offered. + + + + + Seuls les facteurs qui gardent les bornes sur la grille sont proposés. L'élément est mis à l'échelle autour de son point de saisie. + Only the factors that keep the terminals on the grid are offered. The element is scaled around its grab point. + + ScriptManagerDialog @@ -19507,7 +19816,7 @@ The other fields are not used. Terminal - + Cette borne a déjà %n conducteur(s), la limite du projet. Ajoutez une borne pour raccorder un conducteur de plus. wire refused by the wires-per-terminal limit @@ -19551,8 +19860,8 @@ The other fields are not used. - - + + T%1 T%1 @@ -19633,25 +19942,25 @@ The other fields are not used. Show/hide the label border - - + + Modifier la couleur du label Change the label colour - + Modifier l'étiquette du maître Edit the master label - - - + + + Modifier le nom de la borne Change the name of the terminal - + Modifier l'index de l'étiquette du maître Change the master label index @@ -20440,31 +20749,31 @@ The other fields are not used. TitleBlockPropertiesWidget - + Modèle par défaut Default template - + Éditer ce modèle menu entry Edit this template - + Dupliquer et éditer ce modèle menu entry Duplicate and edit this template - + Title block templates actions Title block templates actions - - + + Créer un Folio Numérotation Auto Create an auto sheet numbering @@ -21127,6 +21436,106 @@ associer le nom "volta" et la valeur "1745" remplacera %{vol Title blocks of project "%1" + + ToolbarCommandsConfigPage + + + Choisissez les commandes de chaque barre d'outils de l'éditeur de schémas. Glissez une commande de la liste de gauche vers la barre, ou double-cliquez dessus ; Suppr la retire. + Choose the commands of each toolbar of the diagram editor. Drag a command from the list on the left to the bar, or double-click it; Delete removes it. + + + + Nouvelle barre… + New bar… + + + + Renommer… + Rename… + + + + Supprimer la barre + Delete the bar + + + + Valeurs par défaut + Defaults + + + + Rechercher une commande + Search for a command + + + + Ajouter → + Add → + + + + Séparateur + Separator + + + + ← Retirer + ← Remove + + + + Monter + Move up + + + + Descendre + Move down + + + + Commandes disponibles + Available commands + + + + Dans la barre, dans l'ordre + In the bar, in order + + + + Barre d'outils : + Toolbar: + + + + Contenu des barres + configuration page title: what each toolbar holds + Toolbar contents + + + + Nouvelle barre d'outils + New toolbar + + + + + Nom de la barre d'outils : + Toolbar name: + + + + Renommer la barre d'outils + Rename the toolbar + + + + ─── Séparateur ─── + ─── Separator ─── + + ToolbarsConfigPage @@ -21639,27 +22048,27 @@ associer le nom "volta" et la valeur "1745" remplacera %{vol qdesigner_internal::RichTextEditorDialog - + Edit text Edit text - + Rich Text Rich Text - + Source Source - + &OK &OK - + &Cancel &Cancel @@ -21667,69 +22076,69 @@ associer le nom "volta" et la valeur "1745" remplacera %{vol qdesigner_internal::RichTextEditorToolBar - + Texte en gras Bold - - - + + + Éditeur de texte Text editor - + Texte en italique Italic - + Texte souligé Underline - + Left Align Left Align - + Center Center - + Right Align Right Align - + Justify Justify - + Superscript Superscript - + Subscript Subscript - + Insérer un lien Insert link - + Insert &Image Insert &Image - + Simplify Rich Text Simplify Rich Text diff --git a/sources/TerminalStrip/UndoCommand/groupterminalscommand.cpp b/sources/TerminalStrip/UndoCommand/groupterminalscommand.cpp index 0b674b9cf..0da26d103 100644 --- a/sources/TerminalStrip/UndoCommand/groupterminalscommand.cpp +++ b/sources/TerminalStrip/UndoCommand/groupterminalscommand.cpp @@ -34,7 +34,7 @@ GroupTerminalsCommand::GroupTerminalsCommand(TerminalStrip *strip, m_receiver(receiver_), m_to_group(to_group) { - setText("Grouper un ensemble de bornes"); + setText(QObject::tr("Grouper un ensemble de bornes")); } void GroupTerminalsCommand::undo() { @@ -56,7 +56,7 @@ UnGroupTerminalsCommand::UnGroupTerminalsCommand(TerminalStrip *strip, m_terminal_strip(strip) { setUp(to_ungroup); - setText("Dégrouper un ensemble de bornes"); + setText(QObject::tr("Dégrouper un ensemble de bornes")); } void UnGroupTerminalsCommand::undo() diff --git a/sources/editor/arceditor.cpp b/sources/editor/arceditor.cpp index 5f21353a6..76e3dfe2d 100644 --- a/sources/editor/arceditor.cpp +++ b/sources/editor/arceditor.cpp @@ -172,7 +172,7 @@ void ArcEditor::updateArcS() if (value != arc->property("startAngle")) { QPropertyUndoCommand *undo= new QPropertyUndoCommand(arc, "startAngle", arc->property("startAngle"), value); - undo->setText("Modifier l'angle de depart d'un arc"); + undo->setText(tr("Modifier l'angle de depart d'un arc")); undo->enableAnimation(); elementScene()->undoStack().push(undo); } @@ -197,7 +197,7 @@ void ArcEditor::updateArcA() if (value != arc->property("spanAngle")) { QPropertyUndoCommand *undo= new QPropertyUndoCommand(arc, "spanAngle", arc->property("spanAngle"), value); - undo->setText("Modifier l'angle d'un arc"); + undo->setText(tr("Modifier l'angle d'un arc")); undo->enableAnimation(); elementScene()->undoStack().push(undo); } @@ -240,7 +240,7 @@ void ArcEditor::updateRect() if (rect != part->property("rect")) { auto undo= new QPropertyUndoCommand(ellipse, "rect", ellipse->property("rect"), rect); - undo->setText("Modifier un arc"); + undo->setText(tr("Modifier un arc")); undo->enableAnimation(); elementScene()->undoStack().push(undo); } diff --git a/sources/editor/graphicspart/partplctable.cpp b/sources/editor/graphicspart/partplctable.cpp index 18f56d2b9..7faad6a9f 100644 --- a/sources/editor/graphicspart/partplctable.cpp +++ b/sources/editor/graphicspart/partplctable.cpp @@ -668,7 +668,7 @@ void PartPlcTable::handlerMouseReleaseEvent(QetGraphicsHandlerItem *qghi, QGraph Q_UNUSED(qghi) Q_UNUSED(event) - QUndoCommand *undo = new QUndoCommand("Modifier une table PLC"); + QUndoCommand *undo = new QUndoCommand(tr("Modifier une table PLC")); if (m_old_rect != m_rect) { QPropertyUndoCommand *u = new QPropertyUndoCommand(this, "rect", QVariant(m_old_rect.normalized()), QVariant(m_rect.normalized()), undo); u->setAnimated(true, false); diff --git a/sources/editor/graphicspart/partrectangle.cpp b/sources/editor/graphicspart/partrectangle.cpp index e1955b1b9..b9f74927a 100644 --- a/sources/editor/graphicspart/partrectangle.cpp +++ b/sources/editor/graphicspart/partrectangle.cpp @@ -516,7 +516,7 @@ void PartRectangle::handlerMouseReleaseEvent(QetGraphicsHandlerItem *qghi, QGrap m_modifie_radius_equaly = false; - QUndoCommand *undo = new QUndoCommand("Modifier un rectangle"); + QUndoCommand *undo = new QUndoCommand(tr("Modifier un rectangle")); if (m_old_rect != m_rect) { QPropertyUndoCommand *u = new QPropertyUndoCommand(this, "rect", QVariant(m_old_rect.normalized()), QVariant(m_rect.normalized()), undo); u->setAnimated(true, false); diff --git a/sources/editor/ui/ellipseeditor.cpp b/sources/editor/ui/ellipseeditor.cpp index d42090e12..6f37e9be7 100644 --- a/sources/editor/ui/ellipseeditor.cpp +++ b/sources/editor/ui/ellipseeditor.cpp @@ -149,7 +149,7 @@ void EllipseEditor::updateRect() if (rect != part->property("rect")) { auto undo= new QPropertyUndoCommand(ellipse, "rect", ellipse->property("rect"), rect); - undo->setText("Modifier une ellipse"); + undo->setText(tr("Modifier une ellipse")); undo->enableAnimation(); elementScene()->undoStack().push(undo); } diff --git a/sources/titleblock/integrationmovetemplateshandler.cpp b/sources/titleblock/integrationmovetemplateshandler.cpp index dd324466f..79bf4e6f8 100644 --- a/sources/titleblock/integrationmovetemplateshandler.cpp +++ b/sources/titleblock/integrationmovetemplateshandler.cpp @@ -82,7 +82,7 @@ QET::Action IntegrationMoveTitleBlockTemplatesHandler::templateAlreadyExists(con @param message Error message. */ QET::Action IntegrationMoveTitleBlockTemplatesHandler::errorWithATemplate(const TitleBlockTemplateLocation &tbt, const QString &message) { - QString error_message = QString("Une erreur s'est produite avec le modèle %1 : %2").arg(tbt.toString()).arg(message); + QString error_message = tr("Une erreur s'est produite avec le modèle %1 : %2").arg(tbt.toString()).arg(message); QET::QetMessageBox::critical( parent_widget_, tr("Erreur", "message box title"), From 1023b38f8e9c4289c8639cca67fe3f2e3448c9a9 Mon Sep 17 00:00:00 2001 From: Beat Hangartner Date: Thu, 8 Oct 2026 06:03:31 +0200 Subject: [PATCH 14/22] Sort elements and terminals by position with a strict weak ordering Two position comparisons handed to std::sort were not strict weak orderings, which std::sort requires; with the wrong kind of comparator the sort is undefined behaviour (libstdc++ can read past the range, MSVC debug builds assert "invalid comparator"). - comparPos(), used when renumbering the elements of a project, ended with "<=" on x and y, so two elements at the same position (pasted at the origin, placed by a script, stacked symbols) were each "before" the other. - The terminal numbering dialog compared positions with a 1 px tolerance ("within 1 px counts as aligned, then compare the other axis"), which is not transitive: terminals at x = 2, 1.1 and 0.2 give a < b, b < c and c < a. Move the comparisons into positionorder.h, a header-only helper: xThenY()/yThenX() with "<", and roundedXThenY()/roundedYThenX(), which round the positions to whole pixels first so that items a fraction of a pixel apart still count as aligned, as the tolerance meant to, while staying transitive. comparPos() keeps its folio and row-letter stages and calls xThenY() for the last one. No file-format change. Elements at distinct positions sort exactly as before; the terminal order changes only for terminals less than a pixel apart that straddle a half-pixel boundary. Tests: tst_positionorder checks each order on a grid of awkward positions by brute force (irreflexive, asymmetric, transitive, with a transitive equivalence), the three-terminal cycle, twenty items at one position, and that std::sort leaves the list sorted and intact. The helper is new, so the test cannot fail on master; the call sites are the two replacements in the diff. Co-Authored-By: Claude Fable 5.1 Signed-off-by: Beat Hangartner --- sources/positionorder.h | 69 +++++++++++ sources/qetgraphicsitem/element.cpp | 5 +- sources/ui/terminalnumberingdialog.cpp | 15 ++- tests/qttest/CMakeLists.txt | 7 ++ tests/qttest/tst_positionorder.cpp | 155 +++++++++++++++++++++++++ 5 files changed, 240 insertions(+), 11 deletions(-) create mode 100644 sources/positionorder.h create mode 100644 tests/qttest/tst_positionorder.cpp diff --git a/sources/positionorder.h b/sources/positionorder.h new file mode 100644 index 000000000..4d895f419 --- /dev/null +++ b/sources/positionorder.h @@ -0,0 +1,69 @@ +/* + Copyright 2006-2026 The QElectroTech Team + This file is part of QElectroTech. + + QElectroTech is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + QElectroTech is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with QElectroTech. If not, see . +*/ +#ifndef POSITIONORDER_H +#define POSITIONORDER_H + +#include +#include + +/** + The order of items by their position on a folio, for std::sort: left to + right then top to bottom, or top to bottom then left to right. Each + function is a strict weak ordering, which std::sort requires: two items + at the same position come out in either order, but never "both before + each other", and the order is transitive. A comparison with "<=", or + with a tolerance ("within 1 px counts as aligned"), is neither, and + std::sort may then read past the range or assert. +*/ +namespace PositionOrder +{ + /// a before b when a is left of b, or level with it and above it. + inline bool xThenY(const QPointF &a, const QPointF &b) + { + if (a.x() != b.x()) return a.x() < b.x(); + return a.y() < b.y(); + } + + /// a before b when a is above b, or level with it and left of it. + inline bool yThenX(const QPointF &a, const QPointF &b) + { + if (a.y() != b.y()) return a.y() < b.y(); + return a.x() < b.x(); + } + + /// The position rounded to whole pixels, so that items placed a + /// fraction of a pixel apart count as aligned. + inline QPointF rounded(const QPointF &p) + { + return QPointF(qRound(p.x()), qRound(p.y())); + } + + /// xThenY() on the positions rounded to whole pixels. + inline bool roundedXThenY(const QPointF &a, const QPointF &b) + { + return xThenY(rounded(a), rounded(b)); + } + + /// yThenX() on the positions rounded to whole pixels. + inline bool roundedYThenX(const QPointF &a, const QPointF &b) + { + return yThenX(rounded(a), rounded(b)); + } +} + +#endif // POSITIONORDER_H diff --git a/sources/qetgraphicsitem/element.cpp b/sources/qetgraphicsitem/element.cpp index 80804145e..54c328ca5 100644 --- a/sources/qetgraphicsitem/element.cpp +++ b/sources/qetgraphicsitem/element.cpp @@ -53,6 +53,7 @@ static const QString plcTerminalKeys[] = { QETInformation::ELMT_PLC_T4 }; #include "../qetxml.h" +#include "../positionorder.h" #include "../qetversion.h" #include "qgraphicsitemutility.h" #include @@ -1934,9 +1935,7 @@ bool comparPos(const Element *elmt1, const Element *elmt2) if (a != b) return apos().x() == elmt2->pos().x()) - return elmt1->y() <= elmt2->pos().y(); - return elmt1->pos().x() <= elmt2->pos().x(); + return PositionOrder::xThenY(elmt1->pos(), elmt2->pos()); } /** diff --git a/sources/ui/terminalnumberingdialog.cpp b/sources/ui/terminalnumberingdialog.cpp index fde1df6da..6e30d32cc 100644 --- a/sources/ui/terminalnumberingdialog.cpp +++ b/sources/ui/terminalnumberingdialog.cpp @@ -4,6 +4,7 @@ #include "../qetproject.h" #include "../diagram.h" #include "../qetgraphicsitem/element.h" +#include "../positionorder.h" #include "../undocommand/changeelementinformationcommand.h" #include "../qet.h" #include @@ -210,14 +211,12 @@ QUndoCommand* TerminalNumberingDialog::getUndoCommand(QETProject *project) const // Then sort by folio (page) index if (a.folioIndex != b.folioIndex) return a.folioIndex < b.folioIndex; - // Finally sort by coordinates (with a 1.0px tolerance to handle slight misalignments) - if (axisX) { - if (qAbs(a.x - b.x) > 1.0) return a.x < b.x; - return a.y < b.y; - } else { - if (qAbs(a.y - b.y) > 1.0) return a.y < b.y; - return a.x < b.x; - } + // Finally sort by coordinates, rounded to whole pixels so that slight + // misalignments count as aligned (a tolerance test is not transitive, + // which std::sort requires) + const QPointF pa(a.x, a.y), pb(b.x, b.y); + return axisX ? PositionOrder::roundedXThenY(pa, pb) + : PositionOrder::roundedYThenX(pa, pb); }); // 4. Generate new numbering and create the undo command macro diff --git a/tests/qttest/CMakeLists.txt b/tests/qttest/CMakeLists.txt index 7e10b46fa..53a6ab620 100644 --- a/tests/qttest/CMakeLists.txt +++ b/tests/qttest/CMakeLists.txt @@ -108,6 +108,13 @@ add_test(NAME tst_diagramsortkeys COMMAND tst_diagramsortkeys) target_include_directories(tst_diagramsortkeys PRIVATE ${QET_DIR}/sources) target_link_libraries(tst_diagramsortkeys PRIVATE Qt::Test) +# positionorder.h is header-only: the position comparisons behind element +# renumbering and terminal numbering, as strict weak orderings for std::sort. +add_executable(tst_positionorder tst_positionorder.cpp) +target_include_directories(tst_positionorder PRIVATE ${QET_DIR}/sources) +target_link_libraries(tst_positionorder PRIVATE Qt::Test Qt::Core) +add_test(NAME tst_positionorder COMMAND tst_positionorder) + # bordercelllabels.h is header-only too. add_executable(tst_bordercelllabels tst_bordercelllabels.cpp) add_test(NAME tst_bordercelllabels COMMAND tst_bordercelllabels) diff --git a/tests/qttest/tst_positionorder.cpp b/tests/qttest/tst_positionorder.cpp new file mode 100644 index 000000000..1ee9de8b1 --- /dev/null +++ b/tests/qttest/tst_positionorder.cpp @@ -0,0 +1,155 @@ +/* + Copyright 2006-2026 The QElectroTech Team + This file is part of QElectroTech. + + QElectroTech is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + QElectroTech is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with QElectroTech. If not, see . +*/ +#include "positionorder.h" + +#include +#include +#include + +/** + PositionOrder -- the position comparisons behind renumbering elements + (comparPos) and numbering terminals. std::sort needs a strict weak + ordering; the old comparisons used "<=" and a 1 px tolerance, which + are not one, so two elements at the same position (or three terminals + a fraction apart) were undefined behaviour. +*/ +class tst_positionorder : public QObject +{ + Q_OBJECT + + using Less = std::function; + + static QList> orders() + { + return {{QStringLiteral("xThenY"), PositionOrder::xThenY}, + {QStringLiteral("yThenX"), PositionOrder::yThenX}, + {QStringLiteral("roundedXThenY"), PositionOrder::roundedXThenY}, + {QStringLiteral("roundedYThenX"), PositionOrder::roundedYThenX}}; + } + +private slots: + // Nothing is before itself, and equal points are before each other + // in neither direction: what "<=" broke. + void equalPointsAreNotOrdered() + { + const QPointF p(100, 200), q(100, 200); + for (const auto &order : orders()) { + QVERIFY2(!order.second(p, p), qPrintable(order.first)); + QVERIFY2(!order.second(p, q), qPrintable(order.first)); + QVERIFY2(!order.second(q, p), qPrintable(order.first)); + } + } + + void leftToRightThenTopToBottom() + { + QVERIFY(PositionOrder::xThenY(QPointF(10, 500), QPointF(20, 0))); + QVERIFY(!PositionOrder::xThenY(QPointF(20, 0), QPointF(10, 500))); + QVERIFY(PositionOrder::xThenY(QPointF(10, 0), QPointF(10, 5))); + QVERIFY(!PositionOrder::xThenY(QPointF(10, 5), QPointF(10, 0))); + } + + void topToBottomThenLeftToRight() + { + QVERIFY(PositionOrder::yThenX(QPointF(500, 10), QPointF(0, 20))); + QVERIFY(!PositionOrder::yThenX(QPointF(0, 20), QPointF(500, 10))); + QVERIFY(PositionOrder::yThenX(QPointF(0, 10), QPointF(5, 10))); + QVERIFY(!PositionOrder::yThenX(QPointF(5, 10), QPointF(0, 10))); + } + + // Items a fraction of a pixel apart (placed with Ctrl, or after a + // rotation) count as aligned, and are then ordered on the other axis. + void roundedTreatsFractionsAsAligned() + { + QVERIFY(PositionOrder::roundedXThenY(QPointF(10.2, 0), QPointF(9.8, 5))); + QVERIFY(!PositionOrder::roundedXThenY(QPointF(9.8, 5), QPointF(10.2, 0))); + QVERIFY(PositionOrder::roundedYThenX(QPointF(0, 10.2), QPointF(5, 9.8))); + QVERIFY(!PositionOrder::roundedYThenX(QPointF(5, 9.8), QPointF(0, 10.2))); + } + + // The three terminals that broke the tolerance comparison: with + // "within 1 px counts as aligned", a < b (by y), b < c (by y) and + // c < a (by x), a cycle. Rounded, they are simply ordered by x. + void roundedIsTransitiveWhereToleranceWasNot() + { + const QPointF a(2, 0), b(1.1, 1), c(0.2, 2); + QVERIFY(PositionOrder::roundedXThenY(c, b)); + QVERIFY(PositionOrder::roundedXThenY(b, a)); + QVERIFY(PositionOrder::roundedXThenY(c, a)); + QVERIFY(!PositionOrder::roundedXThenY(a, c)); + } + + // Every order is a strict weak ordering on a grid of awkward points: + // irreflexive, asymmetric, transitive, and with transitive + // equivalence. Checked by brute force on the whole set. + void strictWeakOrdering_data() + { + QTest::addColumn("name"); + for (const auto &order : orders()) + QTest::newRow(qPrintable(order.first)) << order.first; + } + + void strictWeakOrdering() + { + QFETCH(QString, name); + Less less; + for (const auto &order : orders()) + if (order.first == name) less = order.second; + QVERIFY(less); + + QList points; + const QList values{-1, -0.6, -0.4, 0, 0.2, 0.5, 0.9, 1, 1.1, 2, 10.5, 61.3, 61.7}; + for (qreal x : values) + for (qreal y : values) + points << QPointF(x, y); + points << points.first() << QPointF(2, 0) << QPointF(1.1, 1) << QPointF(0.2, 2); + + auto equiv = [&](const QPointF &p, const QPointF &q) { return !less(p, q) && !less(q, p); }; + for (const QPointF &p : points) { + QVERIFY(!less(p, p)); + for (const QPointF &q : points) { + if (less(p, q)) QVERIFY(!less(q, p)); + for (const QPointF &r : points) { + if (less(p, q) && less(q, r)) QVERIFY2(less(p, r), "transitive"); + if (equiv(p, q) && equiv(q, r)) QVERIFY2(equiv(p, r), "equivalence transitive"); + } + } + } + + // And std::sort on it ends sorted, with the list intact. + QList sorted = points; + std::sort(sorted.begin(), sorted.end(), less); + QCOMPARE(sorted.size(), points.size()); + for (int i = 1; i < sorted.size(); ++i) + QVERIFY(!less(sorted.at(i), sorted.at(i - 1))); + } + + // Twenty items at one position, as pasting at the origin leaves + // them: a list std::sort could scan past the end of with "<=". + void manyEqualPositionsSort() + { + QList points(20, QPointF(0, 0)); + points << QPointF(-10, 0) << QPointF(10, 0); + std::sort(points.begin(), points.end(), PositionOrder::xThenY); + QCOMPARE(points.size(), 22); + QCOMPARE(points.first(), QPointF(-10, 0)); + QCOMPARE(points.last(), QPointF(10, 0)); + } +}; + +QTEST_GUILESS_MAIN(tst_positionorder) +#include "tst_positionorder.moc" From ede7bd99e1dabe48d0c43be913b5177e6f7a3b77 Mon Sep 17 00:00:00 2001 From: Beat Hangartner Date: Thu, 8 Oct 2026 06:04:35 +0200 Subject: [PATCH 15/22] Never use a folio grid step below 1 from the settings The folio grid steps, diagrameditor/Xgrid and Ygrid, are read from the settings in six places with a plain toInt() and used as they come. The preferences page cannot store anything below 1, but a hand-edited or damaged settings file can hold 0, a negative number or text: - Diagram::snapToGrid() divides by the step, so 0 is a SIGFPE on the first click that places a symbol; - Diagram::drawBackground() runs "while (g_x % xGrid)" and then loops "gx += xGrid", so 0 crashes every repaint and a negative step never ends; - the paste, duplicate and align paths divide by it or multiply with it. Add foliogrid.h, a header-only helper: FolioGrid::step() reads a settings entry and returns the built-in step (Diagram::xGrid, 10) when the entry is missing, not a number, below 1 or above what an int holds (QVariant::toInt() wraps such a value around). Every reader of the two keys goes through it; the settings page, which only writes the spin box values, is unchanged. No file-format change, and no change for any step the preferences page can produce. Tests: tst_foliogrid covers the helper: 1, 10, "7", int max are kept; missing, 0, -5, "ten", "", "nan", 99999999999 (as text and as a number) and int max + 1 fall back; 7.9 rounds to 8 as before; and the two settings keys through a QSettings scope of the test's own. The helper is new, so the test cannot fail on master; the six readers are the replacements in the diff. Co-Authored-By: Claude Fable 5.1 Signed-off-by: Beat Hangartner --- sources/diagram.cpp | 19 ++-- sources/diagramevent/diagrameventaddpaste.cpp | 13 +-- sources/diagramview.cpp | 7 +- sources/foliogrid.h | 54 ++++++++++ sources/undocommand/alignselectioncommand.cpp | 5 +- tests/qttest/CMakeLists.txt | 7 ++ tests/qttest/tst_foliogrid.cpp | 99 +++++++++++++++++++ 7 files changed, 178 insertions(+), 26 deletions(-) create mode 100644 sources/foliogrid.h create mode 100644 tests/qttest/tst_foliogrid.cpp diff --git a/sources/diagram.cpp b/sources/diagram.cpp index 978614106..75a9051ba 100644 --- a/sources/diagram.cpp +++ b/sources/diagram.cpp @@ -45,6 +45,7 @@ #include "diagramsortkeys.h" #include "itemgroups.h" #include "textgrid.h" +#include "foliogrid.h" #include #include #include @@ -339,10 +340,8 @@ void Diagram::drawBackground(QPainter *p, const QRectF &r) { p -> setBrush(Qt::NoBrush); - int xGrid = settings.value(QStringLiteral("diagrameditor/Xgrid"), - Diagram::xGrid).toInt(); - int yGrid = settings.value(QStringLiteral("diagrameditor/Ygrid"), - Diagram::yGrid).toInt(); + const int xGrid = FolioGrid::step(settings.value(FolioGrid::x_key), Diagram::xGrid); + const int yGrid = FolioGrid::step(settings.value(FolioGrid::y_key), Diagram::yGrid); qreal limit_x = rect.x() + rect.width(); qreal limit_y = rect.y() + rect.height(); @@ -2946,10 +2945,8 @@ DiagramPosition Diagram::convertPosition(const QPointF &pos) { QPointF Diagram::snapToGrid(const QPointF &p) { QSettings settings; - int xGrid = settings.value(QStringLiteral("diagrameditor/Xgrid"), - Diagram::xGrid).toInt(); - int yGrid = settings.value(QStringLiteral("diagrameditor/Ygrid"), - Diagram::yGrid).toInt(); + const int xGrid = FolioGrid::step(settings.value(FolioGrid::x_key), Diagram::xGrid); + const int yGrid = FolioGrid::step(settings.value(FolioGrid::y_key), Diagram::yGrid); //Return a point rounded to the nearest pixel if (QApplication::keyboardModifiers().testFlag(Qt::ControlModifier)) @@ -2981,10 +2978,8 @@ QPointF Diagram::snapToTextGrid(const QPointF &p) : settings.value(TextGrid::settings_key, 1).toReal(); return TextGrid::snap(p, - settings.value(QStringLiteral("diagrameditor/Xgrid"), - Diagram::xGrid).toInt(), - settings.value(QStringLiteral("diagrameditor/Ygrid"), - Diagram::yGrid).toInt(), + FolioGrid::step(settings.value(FolioGrid::x_key), Diagram::xGrid), + FolioGrid::step(settings.value(FolioGrid::y_key), Diagram::yGrid), divisor); } diff --git a/sources/diagramevent/diagrameventaddpaste.cpp b/sources/diagramevent/diagrameventaddpaste.cpp index 6b1491e52..aa7da7f7d 100644 --- a/sources/diagramevent/diagrameventaddpaste.cpp +++ b/sources/diagramevent/diagrameventaddpaste.cpp @@ -19,6 +19,7 @@ #include "../autoNum/ui/pastenumberingimport.h" #include "../diagram.h" +#include "../foliogrid.h" #include "../diagramcommands.h" #include "../qetapp.h" #include "../qetdiagrameditor.h" @@ -108,10 +109,8 @@ } const QPointF top_left = items_rect.topLeft(); QSettings settings; - const int xGrid = settings.value(QStringLiteral("diagrameditor/Xgrid"), - Diagram::xGrid).toInt(); - const int yGrid = settings.value(QStringLiteral("diagrameditor/Ygrid"), - Diagram::yGrid).toInt(); + const int xGrid = FolioGrid::step(settings.value(FolioGrid::x_key), Diagram::xGrid); + const int yGrid = FolioGrid::step(settings.value(FolioGrid::y_key), Diagram::yGrid); const auto snapGrid = [xGrid, yGrid](const QPointF &p) -> QPointF { return QPointF( qRound(p.x() / xGrid) * xGrid, @@ -287,10 +286,8 @@ void DiagramEventAddPaste::showHint() void DiagramEventAddPaste::moveTo(const QPointF &scene_pos) { QSettings settings; - const int xGrid = settings.value(QStringLiteral("diagrameditor/Xgrid"), - Diagram::xGrid).toInt(); - const int yGrid = settings.value(QStringLiteral("diagrameditor/Ygrid"), - Diagram::yGrid).toInt(); + const int xGrid = FolioGrid::step(settings.value(FolioGrid::x_key), Diagram::xGrid); + const int yGrid = FolioGrid::step(settings.value(FolioGrid::y_key), Diagram::yGrid); const auto snapGrid = [xGrid, yGrid](const QPointF &p) -> QPointF { return QPointF( diff --git a/sources/diagramview.cpp b/sources/diagramview.cpp index d842256a0..bb5772fcd 100644 --- a/sources/diagramview.cpp +++ b/sources/diagramview.cpp @@ -40,6 +40,7 @@ #include "utils/conductorcreator.h" #include "undocommand/addgraphicsobjectcommand.h" #include "diagram.h" +#include "foliogrid.h" #include "diagramcontexttoolbar.h" #include "diagramgestureoverlay.h" #include "gesturesettings.h" @@ -643,10 +644,8 @@ void DiagramView::duplicate(const QPoint &stepOffset) if (selection.isEmpty()) return; QSettings settings; - const int x_grid = settings.value(QStringLiteral("diagrameditor/Xgrid"), - Diagram::xGrid).toInt(); - const int y_grid = settings.value(QStringLiteral("diagrameditor/Ygrid"), - Diagram::yGrid).toInt(); + const int x_grid = FolioGrid::step(settings.value(FolioGrid::x_key), Diagram::xGrid); + const int y_grid = FolioGrid::step(settings.value(FolioGrid::y_key), Diagram::yGrid); const QPointF offset(stepOffset.x() * x_grid, stepOffset.y() * y_grid); // Mirrors copy(), but does not touch the system clipboard: Ctrl+D diff --git a/sources/foliogrid.h b/sources/foliogrid.h new file mode 100644 index 000000000..9fb3fe772 --- /dev/null +++ b/sources/foliogrid.h @@ -0,0 +1,54 @@ +/* + Copyright 2006-2026 The QElectroTech Team + This file is part of QElectroTech. + + QElectroTech is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + QElectroTech is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with QElectroTech. If not, see . +*/ +#ifndef FOLIOGRID_H +#define FOLIOGRID_H + +#include +#include +#include + +/** + The folio grid: the step, in pixels, that symbols snap to. Both steps + are kept in the settings; the preferences page only offers 1 and up, + but a hand-edited or damaged settings file can hold 0, a negative + number or text, and the code that divides by the step or loops over it + must never see such a value. +*/ +namespace FolioGrid +{ + /// QSettings keys holding the two steps. + inline const QString x_key{QStringLiteral("diagrameditor/Xgrid")}; + inline const QString y_key{QStringLiteral("diagrameditor/Ygrid")}; + + /** + @return the step held in @p value, a settings entry; or @p fallback, + the built-in step, when the entry is missing, not a number, less + than 1, or more than an int holds (QVariant::toInt() wraps such a + number around instead of failing). + */ + inline int step(const QVariant &value, int fallback) + { + bool ok = false; + const qlonglong s = value.toLongLong(&ok); + if (!ok || s < 1 || s > std::numeric_limits::max()) + return fallback; + return int(s); + } +} + +#endif // FOLIOGRID_H diff --git a/sources/undocommand/alignselectioncommand.cpp b/sources/undocommand/alignselectioncommand.cpp index f05267066..469358b1b 100644 --- a/sources/undocommand/alignselectioncommand.cpp +++ b/sources/undocommand/alignselectioncommand.cpp @@ -20,6 +20,7 @@ #include "../QPropertyUndoCommand/qpropertyundocommand.h" #include "../alignment.h" #include "../diagram.h" +#include "../foliogrid.h" #include "../diagramcontent.h" #include "../itemgroups.h" #include "../qetgraphicsitem/diagramimageitem.h" @@ -121,8 +122,8 @@ AlignSelectionCommand::AlignSelectionCommand(Diagram *diagram, Mode mode, QUndoC m_locked_count = dc.removeNonMovableItems(); QSettings settings; - const int x_grid = settings.value(QStringLiteral("diagrameditor/Xgrid"), Diagram::xGrid).toInt(); - const int y_grid = settings.value(QStringLiteral("diagrameditor/Ygrid"), Diagram::yGrid).toInt(); + const int x_grid = FolioGrid::step(settings.value(FolioGrid::x_key), Diagram::xGrid); + const int y_grid = FolioGrid::step(settings.value(FolioGrid::y_key), Diagram::yGrid); const qreal text_divisor = settings.value(TextGrid::settings_key, 1).toReal(); //Each kind goes where dragging it would have left it: symbols, diff --git a/tests/qttest/CMakeLists.txt b/tests/qttest/CMakeLists.txt index 7e10b46fa..9dd2becde 100644 --- a/tests/qttest/CMakeLists.txt +++ b/tests/qttest/CMakeLists.txt @@ -128,6 +128,13 @@ add_test(NAME tst_textgrid COMMAND tst_textgrid) target_include_directories(tst_textgrid PRIVATE ${QET_DIR}/sources) target_link_libraries(tst_textgrid PRIVATE Qt::Test) +# foliogrid.h is header-only: the folio grid step as read from the +# settings, never 0 or negative, so no reader can divide by it or loop on it. +add_executable(tst_foliogrid tst_foliogrid.cpp) +target_include_directories(tst_foliogrid PRIVATE ${QET_DIR}/sources) +target_link_libraries(tst_foliogrid PRIVATE Qt::Test Qt::Core) +add_test(NAME tst_foliogrid COMMAND tst_foliogrid) + # textlines.h is header-only: the lines of a text as they are laid out, # for the exports that write a text line by line. add_executable(tst_textlines tst_textlines.cpp) diff --git a/tests/qttest/tst_foliogrid.cpp b/tests/qttest/tst_foliogrid.cpp new file mode 100644 index 000000000..b4f7a0462 --- /dev/null +++ b/tests/qttest/tst_foliogrid.cpp @@ -0,0 +1,99 @@ +/* + Copyright 2006-2026 The QElectroTech Team + This file is part of QElectroTech. + + QElectroTech is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + QElectroTech is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with QElectroTech. If not, see . +*/ +#include "foliogrid.h" + +#include +#include + +/** + FolioGrid::step() -- the folio grid step as read from the settings. + Every reader of diagrameditor/Xgrid and Ygrid goes through it, so a + settings file holding 0 (a division by zero in Diagram::snapToGrid() + and an endless "% 0" in drawBackground()), a negative number (an + endless loop) or text can no longer reach the code that uses the step. +*/ +class tst_foliogrid : public QObject +{ + Q_OBJECT + +private slots: + void usableValuesAreKept_data() + { + QTest::addColumn("value"); + QTest::addColumn("expected"); + QTest::newRow("one") << QVariant(1) << 1; + QTest::newRow("default") << QVariant(10) << 10; + QTest::newRow("text number") << QVariant(QStringLiteral("7")) << 7; + QTest::newRow("large") << QVariant(100000) << 100000; + QTest::newRow("int max") << QVariant(2147483647) << 2147483647; + } + + void usableValuesAreKept() + { + QFETCH(QVariant, value); + QFETCH(int, expected); + QCOMPARE(FolioGrid::step(value, 10), expected); + } + + void unusableValuesFallBack_data() + { + QTest::addColumn("value"); + QTest::newRow("missing") << QVariant(); + QTest::newRow("zero") << QVariant(0); + QTest::newRow("negative") << QVariant(-5); + QTest::newRow("text") << QVariant(QStringLiteral("ten")); + QTest::newRow("empty") << QVariant(QString()); + QTest::newRow("nan") << QVariant(QStringLiteral("nan")); + QTest::newRow("too large") << QVariant(QStringLiteral("99999999999")); + QTest::newRow("too large number") << QVariant(qlonglong(99999999999)); + QTest::newRow("int max + 1") << QVariant(qlonglong(2147483648)); + } + + void unusableValuesFallBack() + { + QFETCH(QVariant, value); + QCOMPARE(FolioGrid::step(value, 10), 10); + QCOMPARE(FolioGrid::step(value, 20), 20); + } + + // A decimal in the file is rounded to a whole number, as the plain + // QVariant::toInt() read did before. + void decimalIsRoundedLikeBefore() + { + QCOMPARE(FolioGrid::step(QVariant(7.9), 10), 8); + QCOMPARE(FolioGrid::step(QVariant(0.4), 10), 10); + } + + // Through a real settings file, in a scope of this test's own. + void readsTheSettingsKeys() + { + QCoreApplication::setOrganizationName(QStringLiteral("QElectroTech-tst_foliogrid")); + QCoreApplication::setApplicationName(QStringLiteral("tst_foliogrid")); + QSettings settings; + settings.clear(); + QCOMPARE(FolioGrid::step(settings.value(FolioGrid::x_key), 10), 10); + settings.setValue(FolioGrid::x_key, 0); + settings.setValue(FolioGrid::y_key, 15); + QCOMPARE(FolioGrid::step(settings.value(FolioGrid::x_key), 10), 10); + QCOMPARE(FolioGrid::step(settings.value(FolioGrid::y_key), 10), 15); + settings.clear(); + } +}; + +QTEST_GUILESS_MAIN(tst_foliogrid) +#include "tst_foliogrid.moc" From a022d033388185230dfed62918d317f78bbb742c Mon Sep 17 00:00:00 2001 From: Laurent Trinques Date: Thu, 8 Oct 2026 09:42:43 +0200 Subject: [PATCH 16/22] Update QET64.nsi --- build-aux/windows/QET64.nsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build-aux/windows/QET64.nsi b/build-aux/windows/QET64.nsi index fe1522457..92c356958 100644 --- a/build-aux/windows/QET64.nsi +++ b/build-aux/windows/QET64.nsi @@ -34,7 +34,7 @@ ;-------------------------------- ; NSIS 3 requires SetCompressor BEFORE any Section or Function SetCompressor /FINAL /SOLID lzma - +Unicode true ;-------------------------------- ; Includes !include x64.nsh From 7c6a0411d4d089cc0887fbfbabbae8f176027a90 Mon Sep 17 00:00:00 2001 From: Laurent Trinques Date: Thu, 8 Oct 2026 10:29:20 +0200 Subject: [PATCH 17/22] CI: try to fix windows-build --- .github/workflows/windows-build.yml | 2 +- build-aux/windows/QET64.nsi | 2 +- build-aux/windows/lang_extra.nsh | 2 +- build-aux/windows/lang_extra_fr.nsh | 2 +- build-aux/windows/lang_extra_missing.nsh | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/windows-build.yml b/.github/workflows/windows-build.yml index bc0ff10e5..22d41c27c 100644 --- a/.github/workflows/windows-build.yml +++ b/.github/workflows/windows-build.yml @@ -117,7 +117,7 @@ jobs: -DQT_VERSION_MAJOR=6 \ -DBUILD_WITH_KF=ON \ -DBUILD_KF=OFF \ - -DPACKAGE_TESTS=ON \ + -DPACKAGE_TESTS=OFF \ -DCMAKE_POLICY_DEFAULT_CMP0077=NEW \ -DCMAKE_POLICY_VERSION_MINIMUM=3.5 \ -DQET_EXPORT_PROJECT_DB=ON \ diff --git a/build-aux/windows/QET64.nsi b/build-aux/windows/QET64.nsi index 92c356958..fc79b780a 100644 --- a/build-aux/windows/QET64.nsi +++ b/build-aux/windows/QET64.nsi @@ -1,4 +1,4 @@ -; this file is part of installer for QElectroTech +; this file is part of installer for QElectroTech ; Copyright (C)2015 QElectroTech Team ; ; This program is free software; you can redistribute it and/or diff --git a/build-aux/windows/lang_extra.nsh b/build-aux/windows/lang_extra.nsh index 2c6dcb45c..4c43cf55e 100644 --- a/build-aux/windows/lang_extra.nsh +++ b/build-aux/windows/lang_extra.nsh @@ -1,4 +1,4 @@ - LangString installed ${LANG_ENGLISH} "${SOFT_NAME} is already installed. $\n$\nClick `OK` to remove the previous version or `Cancel` to cancel this upgrade." + LangString installed ${LANG_ENGLISH} "${SOFT_NAME} is already installed. $\n$\nClick `OK` to remove the previous version or `Cancel` to cancel this upgrade." LangString wrongArch ${LANG_ENGLISH} "This distribution is for 64 bits computers only." LangString Elements ${LANG_ENGLISH} "Elements" LangString Electric ${LANG_ENGLISH} "Electric" diff --git a/build-aux/windows/lang_extra_fr.nsh b/build-aux/windows/lang_extra_fr.nsh index bcfd9988b..33bfc025d 100644 --- a/build-aux/windows/lang_extra_fr.nsh +++ b/build-aux/windows/lang_extra_fr.nsh @@ -1,4 +1,4 @@ - LangString wrongArch ${LANG_FRENCH} "Ce programme est pour Windows 64 bits seulement." + LangString wrongArch ${LANG_FRENCH} "Ce programme est pour Windows 64 bits seulement." LangString installed ${LANG_FRENCH} "${SOFT_NAME} est déja installé. $\n$\nCliquer sur `OK` pour désinstaller l'ancienne version `Annuler` pour annuler cet upgrade." LangString Elements ${LANG_FRENCH} "Eléments" LangString Electric ${LANG_FRENCH} "Electrique" diff --git a/build-aux/windows/lang_extra_missing.nsh b/build-aux/windows/lang_extra_missing.nsh index afae58e03..4f22629c2 100644 --- a/build-aux/windows/lang_extra_missing.nsh +++ b/build-aux/windows/lang_extra_missing.nsh @@ -1,4 +1,4 @@ -; Missing language translations for QElectroTech installer +; Missing language translations for QElectroTech installer ; Languages added: hu, ja, mn, nb, nl_BE, nl_NL, pt_BR, rs/sr, sk, sl, sv, tr, uk, zh ; ---------------------------------------------------------------- From 110a16348afa90e1919b34e22e44ff9f9ced5aa1 Mon Sep 17 00:00:00 2001 From: Levi Jetzer Date: Thu, 8 Oct 2026 14:24:07 +0200 Subject: [PATCH 18/22] Swap Ctrl/Alt arrow shortcuts in the diagram editor The element editor moves the selection in fine steps with Ctrl+arrow. The diagram editor used Alt+arrow for its fine movement and Ctrl+arrow for aligning a text group, so the same modifier did different things in the two editors. Swap the two so the diagram editor matches the element editor: - Ctrl+arrow: fine movement (unchanged step, still configurable via diagrameditor/key_fine_Xgrid and key_fine_Ygrid) - Alt+arrow: align the selected text group (Left/Up/Right) Only the modifier checks change, the behaviour of each action is untouched. --- sources/diagram.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sources/diagram.cpp b/sources/diagram.cpp index 75a9051ba..c337caf4a 100644 --- a/sources/diagram.cpp +++ b/sources/diagram.cpp @@ -641,7 +641,7 @@ void Diagram::keyPressEvent(QKeyEvent *event) return; } } - else if(event->modifiers() == Qt::AltModifier) + else if(event->modifiers() == Qt::ControlModifier) { QSettings settings; int xKeyGridFine = settings.value(QStringLiteral("diagrameditor/key_fine_Xgrid"), @@ -684,7 +684,7 @@ void Diagram::keyPressEvent(QKeyEvent *event) return; } } - else if(event->modifiers() == Qt::ControlModifier) + else if(event->modifiers() == Qt::AltModifier) { //Adjust the alignment of a texts group if(selectedItems().size() == 1 From aba7a3d8b50088941cb7e52a6d67ab924bcefc2b Mon Sep 17 00:00:00 2001 From: Levi Jetzer Date: Thu, 8 Oct 2026 15:00:13 +0200 Subject: [PATCH 19/22] Reapply "Feature: Terminal potential grouping" This reverts commit 1793dcb9a8f9e2686a4cd2ae15ab532234679434. --- sources/editor/graphicspart/partterminal.cpp | 7 +++++ sources/editor/graphicspart/partterminal.h | 5 ++++ sources/editor/ui/terminaleditor.cpp | 22 ++++++++++++++ sources/editor/ui/terminaleditor.h | 1 + sources/editor/ui/terminaleditor.ui | 22 +++++++++++--- sources/properties/terminaldata.cpp | 5 ++++ sources/properties/terminaldata.h | 12 ++++++++ sources/qetgraphicsitem/terminal.cpp | 30 ++++++++++++++++++-- sources/qetgraphicsitem/terminal.h | 1 + 9 files changed, 99 insertions(+), 6 deletions(-) diff --git a/sources/editor/graphicspart/partterminal.cpp b/sources/editor/graphicspart/partterminal.cpp index 168c311b0..3e72dcf9c 100644 --- a/sources/editor/graphicspart/partterminal.cpp +++ b/sources/editor/graphicspart/partterminal.cpp @@ -481,6 +481,13 @@ void PartTerminal::setMasterLabelIndex(int index) emit masterLabelIndexChanged(); } +void PartTerminal::setPotential(const QString &potential) +{ + if (d->m_potential == potential) return; + d->m_potential = potential; + emit potentialChanged(); +} + /** Updates the position of the second point according to the position and orientation of the terminal. diff --git a/sources/editor/graphicspart/partterminal.h b/sources/editor/graphicspart/partterminal.h index 949671758..06db66e81 100644 --- a/sources/editor/graphicspart/partterminal.h +++ b/sources/editor/graphicspart/partterminal.h @@ -44,6 +44,7 @@ class PartTerminal : public CustomElementGraphicPart Q_PROPERTY(QColor label_color READ labelColor WRITE setLabelColor) Q_PROPERTY(bool use_master_label READ useMasterLabel WRITE setUseMasterLabel) Q_PROPERTY(int master_label_index READ masterLabelIndex WRITE setMasterLabelIndex) + Q_PROPERTY(QString potential READ potential WRITE setPotential) public: // constructors, destructor @@ -56,6 +57,7 @@ class PartTerminal : public CustomElementGraphicPart void orientationChanged(); void nameChanged(); void terminalTypeChanged(); + void potentialChanged(); void showNameChanged(); void labelPosChanged(); void labelFontChanged(); @@ -140,6 +142,9 @@ class PartTerminal : public CustomElementGraphicPart int masterLabelIndex() const { return d->m_master_label_index; } void setMasterLabelIndex(int index); + QString potential() const { return d->m_potential; } + void setPotential(const QString &potential); + void setNewUuid(); //The terminal's own uuid, the one saved on : hides //CustomElementGraphicPart::uuid(), which a terminal never saves. diff --git a/sources/editor/ui/terminaleditor.cpp b/sources/editor/ui/terminaleditor.cpp index ce9b1ea06..b0532243c 100644 --- a/sources/editor/ui/terminaleditor.cpp +++ b/sources/editor/ui/terminaleditor.cpp @@ -84,6 +84,7 @@ void TerminalEditor::updateForm() ui->m_orientation_cb->setCurrentIndex(ui->m_orientation_cb->findData(m_part->property("orientation"))); ui->m_name_le->setText(m_part->terminalName()); ui->m_type_cb->setCurrentIndex(ui->m_type_cb->findData(m_part->terminalType())); + ui->m_potential_le->setText(m_part->potential()); ui->m_show_name_cb->setChecked(m_part->showName()); ui->m_label_x_dsb->setValue(m_part->labelPos().x()); @@ -263,6 +264,24 @@ void TerminalEditor::nameEdited() m_locked=false; } +void TerminalEditor::potentialEdited() +{ + if (m_locked) { + return; + } + + m_locked = true; + QString potential_(ui->m_potential_le->text()); + + if (m_part->potential() != potential_) + { + auto undo = new QPropertyUndoCommand(m_part, "potential", m_part->property("potential"), potential_); + undo->setText(tr("Modifier le potentiel d'une borne")); + undoStack().push(undo); + } + m_locked = false; +} + /** * @brief TerminalEditor::typeEdited */ @@ -458,6 +477,8 @@ void TerminalEditor::activeConnections(bool active) this, &TerminalEditor::labelAlignClicked); m_editor_connections << connect(ui->m_label_frame_cb, &QCheckBox::toggled, this, &TerminalEditor::labelFrameEdited); + m_editor_connections << connect(ui->m_potential_le, &QLineEdit::editingFinished, + this, &TerminalEditor::potentialEdited); m_editor_connections << connect(ui->m_use_master_label_cb, &QCheckBox::toggled, this, &TerminalEditor::useMasterLabelEdited); m_editor_connections << connect(ui->m_master_label_cb, QOverload::of(&QComboBox::activated), @@ -487,6 +508,7 @@ void TerminalEditor::activeChangeConnections(bool active) m_change_connections << connect(m_part, &PartTerminal::labelVAlignmentChanged, this, &TerminalEditor::updateForm); m_change_connections << connect(m_part, &PartTerminal::labelFrameChanged, this, &TerminalEditor::updateForm); m_change_connections << connect(m_part, &PartTerminal::labelColorChanged, this, &TerminalEditor::updateForm); + m_change_connections << connect(m_part, &PartTerminal::potentialChanged, this, &TerminalEditor::updateForm); m_change_connections << connect(m_part, &PartTerminal::useMasterLabelChanged, this, &TerminalEditor::updateForm); m_change_connections << connect(m_part, &PartTerminal::masterLabelIndexChanged, this, &TerminalEditor::updateForm); } else { diff --git a/sources/editor/ui/terminaleditor.h b/sources/editor/ui/terminaleditor.h index 7c15d9f2c..57f6ea5e6 100644 --- a/sources/editor/ui/terminaleditor.h +++ b/sources/editor/ui/terminaleditor.h @@ -58,6 +58,7 @@ class TerminalEditor : public ElementItemEditor void orientationEdited(); void nameEdited(); void typeEdited(); + void potentialEdited(); void showNameEdited(); void labelPosEdited(); void labelFontClicked(); diff --git a/sources/editor/ui/terminaleditor.ui b/sources/editor/ui/terminaleditor.ui index 6dc2388cb..33eb50047 100644 --- a/sources/editor/ui/terminaleditor.ui +++ b/sources/editor/ui/terminaleditor.ui @@ -48,7 +48,7 @@ - + @@ -61,7 +61,7 @@ - + Nom : @@ -78,7 +78,21 @@ - + + + + Potentiel: + + + + + + + Sans effet si "Isolation du potentiel" n'est pas cochée (toutes les bornes du bloc restent alors reliées). Si elle est cochée : les bornes partageant la même valeur restent reliées entre elles, les autres sont isolées. + + + + Nom de la borne @@ -214,7 +228,7 @@ - + Étiquette du maître diff --git a/sources/properties/terminaldata.cpp b/sources/properties/terminaldata.cpp index 1805ba3c9..f8a371107 100644 --- a/sources/properties/terminaldata.cpp +++ b/sources/properties/terminaldata.cpp @@ -129,6 +129,9 @@ QDomElement TerminalData::toXml(QDomDocument &xml_document) const xml_element.setAttribute("label_color", m_label_color.name()); } + if (!m_potential.isEmpty()) + xml_element.setAttribute("potential", m_potential); + // Save master label override settings if (m_use_master_label) { xml_element.setAttribute("use_master_label", "true"); @@ -207,6 +210,8 @@ bool TerminalData::fromXml (const QDomElement &xml_element) m_label_color = QColor(color_str); } + m_potential = xml_element.attribute("potential"); + // Read master label override settings m_use_master_label = (xml_element.attribute("use_master_label") == QLatin1String("true")); m_master_label_index = xml_element.attribute("master_label_index", "0").toInt(); diff --git a/sources/properties/terminaldata.h b/sources/properties/terminaldata.h index 9032e6b2c..7d269b4cd 100644 --- a/sources/properties/terminaldata.h +++ b/sources/properties/terminaldata.h @@ -103,6 +103,18 @@ class TerminalData : public PropertiesInterface */ QString m_name; + /** + @brief m_potential + An optional, symbol-author-chosen grouping identifier shared by + terminals that belong to the same physical terminal within + a multi-terminal block. When potential_isolating is enabled + on the parent element, terminals sharing a non-empty, + matching m_potential stay linked to each other; terminals + with different (or empty) values become isolated from each + other. Empty by default. + */ + QString m_potential; + /** @brief m_pos Position of the terminal. The second point is calculated diff --git a/sources/qetgraphicsitem/terminal.cpp b/sources/qetgraphicsitem/terminal.cpp index 67a19e400..ca1ec1211 100644 --- a/sources/qetgraphicsitem/terminal.cpp +++ b/sources/qetgraphicsitem/terminal.cpp @@ -1039,6 +1039,18 @@ TerminalData::Type Terminal::terminalType() const return d->m_type; } +/** + @brief Terminal::potential + @return this terminal's own potential-group identifier (@see + TerminalData::m_potential). + An author-chosen grouping used only + within a single multi-terminal element. +*/ +QString Terminal::potential() const +{ + return d->m_potential; +} + /** @brief Terminal::setUseMasterLabel Set whether this terminal uses a label from the master's contact group @@ -1089,8 +1101,22 @@ QList relatedPotentialTerminal ( { // English: Check if the user activated the potential isolation checkbox for this terminal if (QET::infoFlagIsTrue(terminal->parentElement()->elementInformations().value(QStringLiteral("potential_isolating")).toString())) { - // English: Potential is isolated. Return an empty list so it does not propagate to the other side. - return QList(); + // English: Potential is isolated -- but terminals sharing this + // terminal's own, non-empty potential-group identifier + // (@see TerminalData::m_potential, set per-terminal in the + // element editor) still belong to the same physical terminal + // and stay linked to each other. An empty/unset potential on + // every terminal reproduces the previous, fully-isolated + // behavior exactly, so existing elements are unaffected. + const QString this_potential = terminal->potential(); + QList same_potential; + if (!this_potential.isEmpty()) { + for (Terminal *t : terminal->parentElement()->terminals()) { + if (t != terminal && t->potential() == this_potential) + same_potential << t; + } + } + return same_potential; } QList terminals = terminal->parentElement()->terminals(); diff --git a/sources/qetgraphicsitem/terminal.h b/sources/qetgraphicsitem/terminal.h index 419f4cdec..832c61853 100644 --- a/sources/qetgraphicsitem/terminal.h +++ b/sources/qetgraphicsitem/terminal.h @@ -81,6 +81,7 @@ class Terminal : public QGraphicsObject QString name () const; QString baseName () const; TerminalData::Type terminalType() const; + QString potential() const; bool useMasterLabel() const { return d->m_use_master_label; } void setUseMasterLabel(bool use); int masterLabelIndex() const { return d->m_master_label_index; } From f9bdc73c2f56016eab42c9e0a14f8531e96c3a53 Mon Sep 17 00:00:00 2001 From: Levi Jetzer Date: Thu, 8 Oct 2026 15:29:05 +0200 Subject: [PATCH 20/22] Show all element information fields for terminals Terminal elements only offered eight information fields in the diagram editor (formula, label, comment, designation, manufacturer, manufacturer reference, machine manufacturer reference, supplier). That subset was chosen in faf4235be, before the size, quantity and auxiliary fields existed, so a terminal could not be given a width, height, depth or type. --- sources/qetinformation.cpp | 13 ------------- sources/qetinformation.h | 2 -- sources/ui/elementinfowidget.cpp | 11 ++--------- 3 files changed, 2 insertions(+), 24 deletions(-) diff --git a/sources/qetinformation.cpp b/sources/qetinformation.cpp index 52cb07983..45461d3aa 100644 --- a/sources/qetinformation.cpp +++ b/sources/qetinformation.cpp @@ -437,16 +437,3 @@ QStringList QETInformation::elementEditorElementInfoKeys() ELMT_UNITY_AUX4 }; return list; } - -QStringList QETInformation::terminalElementInfoKeys() -{ - QStringList list = { ELMT_FORMULA, - ELMT_LABEL, - ELMT_COMMENT, - ELMT_DESIGNATION, - ELMT_MANUFACTURER, - ELMT_MANUFACTURER_REF, - ELMT_MACHINE_MANUFACTURER_REF, - ELMT_SUPPLIER }; - return list; -} diff --git a/sources/qetinformation.h b/sources/qetinformation.h index b0ba1c0a4..26dfb78f2 100644 --- a/sources/qetinformation.h +++ b/sources/qetinformation.h @@ -184,8 +184,6 @@ namespace QETInformation State validate(QString &input, int &pos) const override; }; - QStringList terminalElementInfoKeys(); - QString infoToVar(const QString &info); QString translatedInfoKey(const QString &info); } diff --git a/sources/ui/elementinfowidget.cpp b/sources/ui/elementinfowidget.cpp index 9cbab800e..0dbd57f76 100644 --- a/sources/ui/elementinfowidget.cpp +++ b/sources/ui/elementinfowidget.cpp @@ -285,12 +285,7 @@ void ElementInfoWidget::disableLiveEdit() */ void ElementInfoWidget::buildInterface() { - QStringList keys; - if (m_element.data()->elementData().m_type == ElementData::Terminal) { - keys = QETInformation::terminalElementInfoKeys(); - } else { - keys = QETInformation::elementInfoKeys(); - } + QStringList keys = QETInformation::elementInfoKeys(); //"exclude_from_bom" is part of elementInfoKeys() because the project //database builds the element_info table from that list, but it is not @@ -354,9 +349,7 @@ void ElementInfoWidget::buildInterface() */ QStringList ElementInfoWidget::predefinedKeys() const { - QStringList keys = (m_element.data()->elementData().m_type == ElementData::Terminal) - ? QETInformation::terminalElementInfoKeys() - : QETInformation::elementInfoKeys(); + QStringList keys = QETInformation::elementInfoKeys(); keys << QETInformation::ELMT_FORMULA_ID << QStringLiteral("auto_num_locked") From 31ba717a94a1043dc78824d4a8a494b64e984c9c Mon Sep 17 00:00:00 2001 From: saschbe Date: Thu, 8 Oct 2026 15:39:03 +0200 Subject: [PATCH 21/22] Add smaller resize handle sizes --- .../qetgraphicshandleritem.cpp | 22 +- .../qetgraphicshandleritem.h | 5 +- sources/ui/diagrameditorhandlersizewidget.cpp | 43 ++-- sources/ui/diagrameditorhandlersizewidget.ui | 18 ++ tests/performance/handles/CMakeLists.txt | 13 + tests/performance/handles/main.cpp | 69 ++++++ tests/performance/handles/run.py | 57 +++++ tests/qttest/CMakeLists.txt | 15 ++ tests/qttest/handle_size_probe.cpp | 229 ++++++++++++++++++ tests/qttest/run_handle_size_probe.py | 60 +++++ tests/qttest/tst_handlersize.cpp | 53 ++++ tests/qttest/tst_textresizehandles.cpp | 3 +- 12 files changed, 561 insertions(+), 26 deletions(-) create mode 100644 tests/performance/handles/CMakeLists.txt create mode 100644 tests/performance/handles/main.cpp create mode 100644 tests/performance/handles/run.py create mode 100644 tests/qttest/handle_size_probe.cpp create mode 100644 tests/qttest/run_handle_size_probe.py create mode 100644 tests/qttest/tst_handlersize.cpp diff --git a/sources/QetGraphicsItemModeler/qetgraphicshandleritem.cpp b/sources/QetGraphicsItemModeler/qetgraphicshandleritem.cpp index ffd3dfeed..fa16eee57 100644 --- a/sources/QetGraphicsItemModeler/qetgraphicshandleritem.cpp +++ b/sources/QetGraphicsItemModeler/qetgraphicshandleritem.cpp @@ -34,10 +34,16 @@ QetGraphicsHandlerItem::QetGraphicsHandlerItem(qreal size) void QetGraphicsHandlerItem::setSize(qreal size) { + if (m_size_animation) { + m_size_animation->stop(); + m_size_animation->deleteLater(); + m_size_animation.clear(); + } prepareGeometryChange(); m_current_size = m_original_size = size; m_handler_rect.setRect(0-m_current_size/2, 0-m_current_size/2, m_current_size, m_current_size); m_br.setRect(-1-m_current_size/2, -1-m_current_size/2, m_current_size+2, m_current_size+2); + update(); } /** @@ -90,7 +96,12 @@ void QetGraphicsHandlerItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event) { Q_UNUSED(event); - auto animation_ = new QPropertyAnimation(this, "currentSize"); + if (m_size_animation) { + m_size_animation->stop(); + m_size_animation->deleteLater(); + } + auto animation_ = new QPropertyAnimation(this, "currentSize", this); + m_size_animation = animation_; animation_->setStartValue(m_original_size); animation_->setEndValue(m_original_size*1.5); animation_->setDuration(200); @@ -102,7 +113,12 @@ void QetGraphicsHandlerItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) { Q_UNUSED(event); - auto animation_ = new QPropertyAnimation(this, "currentSize"); + if (m_size_animation) { + m_size_animation->stop(); + m_size_animation->deleteLater(); + } + auto animation_ = new QPropertyAnimation(this, "currentSize", this); + m_size_animation = animation_; animation_->setStartValue(m_current_size); animation_->setEndValue(m_original_size); animation_->setDuration(200); @@ -126,7 +142,7 @@ void QetGraphicsHandlerItem::setCurrentSize(qreal size) */ QVector QetGraphicsHandlerItem::handlerForPoint( const QVector &points, - int size) + qreal size) { QVector list_; for (QPointF point : points) diff --git a/sources/QetGraphicsItemModeler/qetgraphicshandleritem.h b/sources/QetGraphicsItemModeler/qetgraphicshandleritem.h index f14fc8910..0853af35b 100644 --- a/sources/QetGraphicsItemModeler/qetgraphicshandleritem.h +++ b/sources/QetGraphicsItemModeler/qetgraphicshandleritem.h @@ -20,6 +20,8 @@ #include #include +#include +class QPropertyAnimation; /** @brief The QetGraphicsHandlerItem class @@ -69,10 +71,11 @@ class QetGraphicsHandlerItem : public QGraphicsObject qreal m_original_size; QColor m_color; QPen m_pen; + QPointer m_size_animation; public: static QVector handlerForPoint( - const QVector &points, int size = 10); + const QVector &points, qreal size = 10); }; #endif // QETGRAPHICSHANDLERITEM_H diff --git a/sources/ui/diagrameditorhandlersizewidget.cpp b/sources/ui/diagrameditorhandlersizewidget.cpp index 37a8f78e3..bb22cac90 100644 --- a/sources/ui/diagrameditorhandlersizewidget.cpp +++ b/sources/ui/diagrameditorhandlersizewidget.cpp @@ -22,24 +22,27 @@ #include "../projectview.h" #include "../diagramview.h" #include "../diagram.h" -#include "../../QetGraphicsItemModeler/qetgraphicshandleritem.h" +#include "../qetproject.h" +#include +#include "../QetGraphicsItemModeler/qetgraphicshandleritem.h" DiagramEditorHandlerSizeWidget::DiagramEditorHandlerSizeWidget(QWidget *parent) : QWidget(parent), ui(new Ui::DiagramEditorHandlerSizeWidget) { ui->setupUi(this); + const QSignalBlocker blocker(ui->comboBox); + const qreal sizes[] = {2.5, 5.0, 7.5, 10.0, 20.0, 30.0}; + for (int i = 0; i < ui->comboBox->count(); ++i) + ui->comboBox->setItemData(i, sizes[i]); + ui->comboBox->setCurrentIndex(3); // x1 remains the default. if (auto editor = QETApp::instance()->diagramEditorAncestorOf(this)) { - const auto size = editor->property("graphics_handler_size").toInt(); - - if (size == 10 || size < 10) - ui->comboBox->setCurrentIndex(0); - else if (size == 20) - ui->comboBox->setCurrentIndex(1); - else if (size == 30 || size > 30) - ui->comboBox->setCurrentIndex(2); + const auto size = editor->property("graphics_handler_size").toReal(); + const int index = ui->comboBox->findData(size); + if (index >= 0) + ui->comboBox->setCurrentIndex(index); } } @@ -50,20 +53,18 @@ DiagramEditorHandlerSizeWidget::~DiagramEditorHandlerSizeWidget() void DiagramEditorHandlerSizeWidget::on_comboBox_currentIndexChanged(int index) { + if (index < 0 || !ui->comboBox->itemData(index).isValid()) + return; + const qreal size = ui->comboBox->itemData(index).toReal(); if (auto editor_ = QETApp::instance()->diagramEditorAncestorOf(this)) { - editor_->setProperty("graphics_handler_size", (index+1) * 10); - if (auto project_view = editor_->currentProjectView()) { - if (auto diagram_view = project_view->currentDiagram()) { - if (auto diagram = diagram_view->diagram()) - { - for (const auto item : diagram->items()) - { - if (item->type() == QetGraphicsHandlerItem::Type) - { - auto handler = qgraphicsitem_cast(item); - handler->setSize((index+1) * 10); - } + editor_->setProperty("graphics_handler_size", size); + for (auto project_view : editor_->openedProjects()) { + for (auto diagram : project_view->project()->diagrams()) { + for (const auto item : diagram->items()) { + if (item->type() == QetGraphicsHandlerItem::Type) { + auto handler = qgraphicsitem_cast(item); + handler->setSize(size); } } } diff --git a/sources/ui/diagrameditorhandlersizewidget.ui b/sources/ui/diagrameditorhandlersizewidget.ui index 9d5a12c4d..956edb2bb 100644 --- a/sources/ui/diagrameditorhandlersizewidget.ui +++ b/sources/ui/diagrameditorhandlersizewidget.ui @@ -23,6 +23,24 @@ + + 3 + + + + x 0,25 + + + + + x 0,5 + + + + + x 0,75 + + x 1 diff --git a/tests/performance/handles/CMakeLists.txt b/tests/performance/handles/CMakeLists.txt new file mode 100644 index 000000000..298e26c36 --- /dev/null +++ b/tests/performance/handles/CMakeLists.txt @@ -0,0 +1,13 @@ +cmake_minimum_required(VERSION 3.16) +project(handle_refresh_probe LANGUAGES CXX) +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_AUTOMOC ON) +find_package(Qt6 REQUIRED COMPONENTS Widgets) +add_executable(handle_refresh_probe main.cpp + ${QET_SOURCE}/sources/QetGraphicsItemModeler/qetgraphicshandleritem.cpp + ${QET_SOURCE}/sources/QetGraphicsItemModeler/qetgraphicshandleritem.h) +target_include_directories(handle_refresh_probe PRIVATE ${QET_SOURCE}/sources) +target_link_libraries(handle_refresh_probe PRIVATE Qt6::Widgets) +if(WIN32) + target_link_libraries(handle_refresh_probe PRIVATE psapi) +endif() diff --git a/tests/performance/handles/main.cpp b/tests/performance/handles/main.cpp new file mode 100644 index 000000000..c58fe0972 --- /dev/null +++ b/tests/performance/handles/main.cpp @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +// Synthetic raster viewport workload, not a full editor latency benchmark. +#include +#include +#include +#include +#include +#include +#include +#ifdef Q_OS_WIN +#include +#include +#endif +#include "QetGraphicsItemModeler/qetgraphicshandleritem.h" + +static double cpuMilliseconds() { +#ifdef Q_OS_WIN + FILETIME created,exited,kernel,user; + if(GetProcessTimes(GetCurrentProcess(),&created,&exited,&kernel,&user)) { + ULARGE_INTEGER k,u; k.LowPart=kernel.dwLowDateTime;k.HighPart=kernel.dwHighDateTime; + u.LowPart=user.dwLowDateTime;u.HighPart=user.dwHighDateTime; + return double(k.QuadPart+u.QuadPart)/10000; + } + return 0; +#else + return double(std::clock())*1000/CLOCKS_PER_SEC; +#endif +} + +int main(int argc,char **argv) { + QApplication app(argc,argv); + const qreal size=QString::fromLocal8Bit(argv[1]).toDouble(); + const int count=QString::fromLocal8Bit(argv[2]).toInt(); + const QString operation=QString::fromLocal8Bit(argv[3]); + QGraphicsScene scene; scene.setSceneRect(-2000,-2000,4000,4000); + QList objects; + for(int i=0;isetPos((i%32)*36-576,(i/32)*28-224); objects<setParentItem(object); handle->setColor(Qt::darkGreen); + } + } + QGraphicsView view(&scene); view.resize(1280,800); view.setSceneRect(scene.sceneRect()); + view.show(); QApplication::processEvents(); + QImage image(1280,800,QImage::Format_ARGB32_Premultiplied); + auto frame=[&](int i) { + if(operation=="zoom") {view.resetTransform();view.scale(0.75+0.005*(i%60),0.75+0.005*(i%60));} + if(operation=="pan") view.centerOn((i%60)*2,0); + if(operation=="manipulate") for(auto *object:objects) { + object->setRotation(i%30); object->setRect(0,0,32+(i%8),24); object->moveBy(i%2?1:-1,0); + } + image.fill(Qt::white); QPainter painter(&image); view.render(&painter); + }; + for(int i=0;i<20;++i) frame(i); + std::puts("size,handles,operation,repeat,ms_per_frame,cpu_ms_per_frame,working_set_bytes"); + for(int repeat=0;repeat<7;++repeat) { + const auto cpu=cpuMilliseconds(); QElapsedTimer timer; timer.start(); + for(int i=0;i<120;++i) frame(i); + const double elapsed=timer.nsecsElapsed()/1e6/120; + const double cpuElapsed=(cpuMilliseconds()-cpu)/120; + unsigned long long memory=0; +#ifdef Q_OS_WIN + PROCESS_MEMORY_COUNTERS counters{}; counters.cb=sizeof(counters); + if(GetProcessMemoryInfo(GetCurrentProcess(),&counters,sizeof(counters))) memory=counters.WorkingSetSize; +#endif + std::printf("%.2f,%d,%s,%d,%.6f,%.6f,%llu\n",size,count,qPrintable(operation),repeat,elapsed,cpuElapsed,memory); + } +} diff --git a/tests/performance/handles/run.py b/tests/performance/handles/run.py new file mode 100644 index 000000000..d4a23cf0d --- /dev/null +++ b/tests/performance/handles/run.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python3 +"""Run identical Release component workloads; preserve samples and variability.""" +import argparse +import csv +import io +import os +import pathlib +import statistics +import subprocess + +p = argparse.ArgumentParser() +p.add_argument('--reference', required=True) +p.add_argument('--modified', required=True) +p.add_argument('--output', required=True) +a = p.parse_args() +env = os.environ.copy() +env['QT_QPA_PLATFORM'] = 'offscreen' +rows = [] +# Compare x1 first, then exercise every remaining size on the modified code. +for size in [10, 2.5, 5, 7.5, 20, 30]: + for count in [16, 2048]: + for operation in ['zoom', 'pan', 'manipulate']: + variants = [('reference', a.reference), ('modified', a.modified)] if size == 10 else [('modified', a.modified)] + for variant, binary in variants: + result = subprocess.run([binary, str(size), str(count), operation], env=env, + capture_output=True, text=True, check=True, timeout=120) + samples = list(csv.DictReader(io.StringIO(result.stdout))) + assert len(samples) == 7 + rows.extend(dict(variant=variant, **sample) for sample in samples) +output = pathlib.Path(a.output) +output.mkdir(parents=True, exist_ok=True) +with (output / 'samples.csv').open('w', newline='', encoding='utf-8') as stream: + writer = csv.DictWriter(stream, fieldnames=list(rows[0])) + writer.writeheader() + writer.writerows(rows) +groups = {} +for row in rows: + key = (row['variant'], row['size'], row['handles'], row['operation']) + groups.setdefault(key, []).append(row) +lines = ['# Release handle refresh measurements', '', + 'Synthetic QGraphicsView raster rendering at 1280×800, offscreen, on the same PC.', + 'Each sample comprises 120 frames; 20 warm-up frames precede seven samples.', + '16 or 2048 handles; same scenes and workload code for both builds.', + 'Manipulate changes position, rectangle size and rotation of all scene objects.', + 'This is not full-editor mouse latency, GPU frame presentation or human usability.', '', + '| Code | Factor | Handles | Workload | Mean ms/frame ± SD | Min–max | CPU ms/frame | Working set MiB |', + '|---|---:|---:|---|---:|---:|---:|---:|'] +for (variant, size, count, operation), samples in groups.items(): + wall = [float(s['ms_per_frame']) for s in samples] + cpu = [float(s['cpu_ms_per_frame']) for s in samples] + memory = [int(s['working_set_bytes']) / 1048576 for s in samples] + lines.append(f'| {variant} | {float(size)/10:g} | {count} | {operation} | ' + f'{statistics.mean(wall):.3f} ± {statistics.stdev(wall):.3f} | ' + f'{min(wall):.3f}–{max(wall):.3f} | {statistics.mean(cpu):.3f} | ' + f'{statistics.median(memory):.1f} |') +(output / 'measurements.md').write_text('\n'.join(lines)+'\n', encoding='utf-8') +print(f'{len(rows)} samples saved in {output}') diff --git a/tests/qttest/CMakeLists.txt b/tests/qttest/CMakeLists.txt index 7e10b46fa..d6aa7dab8 100644 --- a/tests/qttest/CMakeLists.txt +++ b/tests/qttest/CMakeLists.txt @@ -74,6 +74,13 @@ target_include_directories(tst_darkimagelayers PRIVATE ${QET_DIR}/sources) target_link_libraries(tst_darkimagelayers PRIVATE Qt::Test Qt::Widgets) find_package(Python3 QUIET COMPONENTS Interpreter) if(Python3_Interpreter_FOUND AND CMAKE_GENERATOR STREQUAL "Ninja") + add_test(NAME tst_handlersizeintegration + COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/run_handle_size_probe.py + --build ${CMAKE_BINARY_DIR} --binary $ + --source ${CMAKE_CURRENT_SOURCE_DIR}/handle_size_probe.cpp + --fixture ${CMAKE_CURRENT_SOURCE_DIR}/fixtures/unlinked_contact_label.qet) + set_tests_properties(tst_handlersizeintegration PROPERTIES TIMEOUT 300 RUN_SERIAL TRUE + ENVIRONMENT "QT_QPA_PLATFORM=offscreen") add_test(NAME tst_attachedplainpaste COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/run_attached_plain_paste_probe.py --build ${CMAKE_BINARY_DIR} --binary $ @@ -194,6 +201,14 @@ set_tests_properties(tst_textanchor PROPERTIES ENVIRONMENT "QT_QPA_PLATFORM=offs target_include_directories(tst_textanchor PRIVATE ${QET_DIR}/sources) target_link_libraries(tst_textanchor PRIVATE Qt::Test Qt::Widgets) +# Shared handle geometry and picking, including fractional sizes. +add_executable(tst_handlersize tst_handlersize.cpp + ${QET_DIR}/sources/QetGraphicsItemModeler/qetgraphicshandleritem.cpp) +add_test(NAME tst_handlersize COMMAND tst_handlersize) +set_tests_properties(tst_handlersize PROPERTIES ENVIRONMENT "QT_QPA_PLATFORM=offscreen") +target_include_directories(tst_handlersize PRIVATE ${QET_DIR}/sources) +target_link_libraries(tst_handlersize PRIVATE Qt::Test Qt::Widgets) + # TextResizeHandles: the corner handles that change the width of a text box, # on a plain QGraphicsTextItem with the "textWidth" property QET texts have. add_executable( diff --git a/tests/qttest/handle_size_probe.cpp b/tests/qttest/handle_size_probe.cpp new file mode 100644 index 000000000..f342fb737 --- /dev/null +++ b/tests/qttest/handle_size_probe.cpp @@ -0,0 +1,229 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "../../sources/qetapp.h" +#include "../../sources/qetdiagrameditor.h" +#include "../../sources/qetproject.h" +#include "../../sources/qetresult.h" +#include "../../sources/qetmessagebox.h" +#include "../../sources/projectview.h" +#include "../../sources/diagram.h" +#include "../../sources/utils/qetutils.h" +#include "../../sources/ui/diagrameditorhandlersizewidget.h" +#include "../../sources/QetGraphicsItemModeler/qetgraphicshandleritem.h" +#include "../../sources/qetgraphicsitem/independenttextitem.h" +#include "../../sources/qetgraphicsitem/dynamicelementtextitem.h" +#include "../../sources/qetgraphicsitem/diagramimageitem.h" +#include "../../sources/qetgraphicsitem/qetshapeitem.h" +#include "../../sources/editor/ui/qetelementeditor.h" +#include "../../sources/editor/elementscene.h" +#include "../../sources/editor/graphicspart/partrectangle.h" +#include "../../sources/editor/graphicspart/partdynamictextfield.h" +#include "../../sources/qetgraphicsitem/ViewItem/qetgraphicstableitem.h" +#include "../../sources/qetgraphicsitem/conductor.h" +static void check(bool value,const char *why){if(!value)throw std::runtime_error(why);} +static QString canonicalProjectXml(QDomDocument document) { + // Scene index updates can reorder equal-z conductors. Compare their + // complete serialized content in UUID order, rather than scene order. + const auto groups=document.elementsByTagName("conductors"); + for(int i=0;i wires; + for(auto wire=group.firstChildElement("conductor");!wire.isNull();wire=wire.nextSiblingElement("conductor"))wires<mapFromScene(point)); + event.setButtonDownScenePos(Qt::LeftButton,press?*press:point);scene->sendEvent(item,&event); +} +static QetGraphicsHandlerItem *bottomRightHandle(Diagram *scene) { + QetGraphicsHandlerItem *found=nullptr; + for(auto *item:scene->items())if(item->type()==QetGraphicsHandlerItem::Type&&item->isVisible()) { + auto *handle=qgraphicsitem_cast(item); + if(!found||handle->scenePos().x()+handle->scenePos().y()>found->scenePos().x()+found->scenePos().y())found=handle; + } + check(found,"mouse gesture handle present");return found; +} +static void drag(Diagram *scene,QGraphicsItem *item,const QPointF &end) { + const auto start=item->scenePos(); + mouse(scene,item,QEvent::GraphicsSceneMousePress,start); + mouse(scene,item,QEvent::GraphicsSceneMouseMove,end,&start); + mouse(scene,item,QEvent::GraphicsSceneMouseRelease,end,&start); +} +int main(int argc,char **argv) { + const QString fixture=QString::fromLocal8Bit(argv[1]); + const QString report=QString::fromLocal8Bit(argv[2]); + QTemporaryDir isolated; + QByteArray config="--config-dir="+isolated.path().toUtf8(); + QByteArray data="--data-dir="+isolated.path().toUtf8(); + QByteArray collection="--common-elements-dir="+isolated.path().toUtf8(); + char *args[]={argv[0],config.data(),data.data(),collection.data()};int count=4; + QApplication app(count,args); + std::freopen(report.toLocal8Bit().constData(),"w",stdout); + std::setbuf(stdout,nullptr); + QSettings::setDefaultFormat(QSettings::IniFormat); + QSettings::setPath(QSettings::IniFormat,QSettings::UserScope,isolated.path()); + QETProject::setBackupEnabled(false);QET::QetMessageBox::setNonInteractive(true); + try { + auto *qet=new QETApp; Q_UNUSED(qet); + auto editors=QETApp::diagramEditors();check(!editors.isEmpty(),"editor created"); + auto *editor=editors.first(); + auto *project=new QETProject(fixture);check(project->state()==QETProject::Ok,"fixture loaded"); + editor->addProjectView(new ProjectView(project)); + auto *scene=project->diagrams().first(); + auto widgets=editor->findChildren();check(!widgets.isEmpty(),"toolbar widget present"); + auto *combo=widgets.first()->findChild();check(combo&&combo->count()==6,"six choices"); + check(combo->currentIndex()==3&&editor->property("graphics_handler_size").toReal()==10,"default x1"); + auto *free=new IndependentTextItem;free->setPlainText("Mouse placement");scene->addItem(free);free->setSelected(true); + QPixmap pixmap(30,20);pixmap.fill(Qt::red);auto *image=new DiagramImageItem(pixmap);scene->addItem(image);image->setSelected(true); + auto *shape=new QetShapeItem({100,100},{150,140},QetShapeItem::Rectangle);scene->addItem(shape);shape->setSelected(true); + auto *attached=scene->elements().first()->dynamicTextItems().first();attached->setSelected(true); + auto *background=project->addNewDiagram(); + auto *backgroundHandle=new QetGraphicsHandlerItem; + background->addItem(backgroundHandle); + QApplication::processEvents(); + const QString xml=project->toXml().toString(); + const int undoCount=scene->undoStack().count();const int undoIndex=scene->undoStack().index(); + const bool dirty=project->projectWasModified(); + const qreal sizes[]={2.5,5,7.5,10,20,30}; + for(int i=0;i<6;++i) { + combo->setCurrentIndex(i);QApplication::processEvents(); + check(editor->property("graphics_handler_size").toReal()==sizes[i],"fractional editor property"); + check(QETUtils::graphicsHandlerSize(image)==sizes[i],"new handle size lookup"); + check(backgroundHandle->property("currentSize").toReal()==sizes[i],"inactive folio handles updated"); + int handles=0;for(auto *item:scene->items())if(item->type()==QetGraphicsHandlerItem::Type){ + ++handles;auto *handle=qgraphicsitem_cast(item); + check(handle->property("currentSize").toReal()==sizes[i],"existing handles updated immediately"); + } + check(handles>=8,"multiple selected object handles tested"); + image->setSelected(false);image->setSelected(true); + for(auto *item:scene->items())if(item->type()==QetGraphicsHandlerItem::Type) + check(qgraphicsitem_cast(item)->property("currentSize").toReal()==sizes[i],"recreated handles retain fractions"); + DiagramEditorHandlerSizeWidget recreated(editor); + check(recreated.findChild()->currentIndex()==i,"toolbar recreation preserves chosen size"); + check(project->toXml().toString()==xml,"handle size leaves project XML unchanged"); + check(scene->undoStack().count()==undoCount&&scene->undoStack().index()==undoIndex,"handle size leaves undo stack unchanged"); + check(project->projectWasModified()==dirty,"handle size leaves dirty state unchanged"); + } + for(int i=0;i<6;++i) { + combo->setCurrentIndex(i); + scene->clearSelection(); + auto *picture=new DiagramImageItem(pixmap);scene->addItem(picture);picture->setPos(400,400);picture->setSelected(true); + auto *handle=bottomRightHandle(scene); + check(handle->property("currentSize").toReal()==sizes[i],"image mouse handle size"); + drag(scene,handle,handle->scenePos()+QPointF(20,20)); + check(picture->scaleFactorX()!=1,"image resized by mouse events"); + const qreal changed=picture->scaleFactorX();scene->undoStack().undo(); + check(picture->scaleFactorX()==1,"image resize undo");scene->undoStack().redo(); + check(picture->scaleFactorX()==changed,"image resize redo");scene->undoStack().undo(); + const auto centre=picture->mapToScene(picture->imageRect().center()); + mouse(scene,picture,QEvent::GraphicsSceneMousePress,centre); + mouse(scene,picture,QEvent::GraphicsSceneMouseRelease,centre); + handle=bottomRightHandle(scene); + const auto pivot=picture->mapToScene(picture->pivot());QTransform turn;turn.rotate(30); + drag(scene,handle,pivot+turn.map(handle->scenePos()-pivot)); + check(qAbs(picture->rotationAngle())>1,"image rotated by mouse events"); + const qreal angle=picture->rotationAngle();scene->undoStack().undo(); + check(qAbs(picture->rotationAngle())<0.001,"image rotation undo");scene->undoStack().redo(); + check(qAbs(picture->rotationAngle()-angle)<0.001,"image rotation redo");scene->undoStack().undo(); + scene->undoStack().clear();delete picture; + auto *rectangle=new QetShapeItem({0,0},{50,40},QetShapeItem::Rectangle);scene->addItem(rectangle);rectangle->setPos(400,400);rectangle->setSelected(true); + const auto rect=rectangle->rect();handle=bottomRightHandle(scene); + drag(scene,handle,handle->scenePos()+QPointF(20,20));check(rectangle->rect()!=rect,"shape resized by mouse events"); + const auto resized=rectangle->rect();scene->undoStack().undo();check(rectangle->rect()==rect,"shape resize undo"); + scene->undoStack().redo();check(rectangle->rect()==resized,"shape resize redo");scene->undoStack().undo(); + for(int click=0;click<2;++click) { + const auto middle=rectangle->mapToScene(rect.center()); + mouse(scene,rectangle,QEvent::GraphicsSceneMousePress,middle);mouse(scene,rectangle,QEvent::GraphicsSceneMouseRelease,middle); + } + handle=bottomRightHandle(scene);const auto shapePivot=rectangle->mapToScene(rectangle->pivot()); + drag(scene,handle,shapePivot+turn.map(handle->scenePos()-shapePivot)); + check(qAbs(rectangle->rotation())>1,"shape rotated by mouse events"); + const qreal shapeAngle=rectangle->rotation();scene->undoStack().undo();check(qAbs(rectangle->rotation())<0.001,"shape rotation undo"); + scene->undoStack().redo();check(qAbs(rectangle->rotation()-shapeAngle)<0.001,"shape rotation redo");scene->undoStack().undo(); + scene->undoStack().clear(); + auto *companion=new DiagramImageItem(pixmap);scene->addItem(companion);companion->setPos(600,400);companion->setSelected(true); + rectangle->setSelected(true); + const auto rectanglePos=rectangle->pos();const auto companionPos=companion->pos(); + const auto start=companion->mapToScene(companion->imageRect().center());const auto end=start+QPointF(20,20); + mouse(scene,companion,QEvent::GraphicsSceneMousePress,start); + mouse(scene,companion,QEvent::GraphicsSceneMouseMove,end,&start); + mouse(scene,companion,QEvent::GraphicsSceneMouseRelease,end,&start); + check(companion->pos()==companionPos+QPointF(20,20)&&rectangle->pos()==rectanglePos+QPointF(20,20),"multiple objects moved by mouse events"); + scene->undoStack().undo();check(companion->pos()==companionPos&&rectangle->pos()==rectanglePos,"multiple object movement undo"); + scene->undoStack().redo();check(companion->pos()==companionPos+QPointF(20,20)&&rectangle->pos()==rectanglePos+QPointF(20,20),"multiple object movement redo"); + scene->undoStack().undo();scene->undoStack().clear();delete companion;delete rectangle; + } + std::puts("PASS: image and rectangle mouse resize/rotation, multiple object movement, and undo/redo at all six sizes"); + project->setFilePath(QString::fromLocal8Bit(argv[3])+"/handles.qet"); + check(project->write().isOk(),"save after handle size changes"); + QETProject reopened(project->filePath());check(reopened.state()==QETProject::Ok,"reopen after handle size changes"); + bool imageFound=false,textFound=false; + for(auto *item:reopened.diagrams().first()->items()) { + if(auto *loaded=qgraphicsitem_cast(item))imageFound|=loaded->pixmap().size()==pixmap.size(); + if(auto *loaded=qgraphicsitem_cast(item))textFound|=loaded->toPlainText()==free->toPlainText(); + } + check(imageFound&&textFound,"object content survives reopen"); + auto *elementEditor=new QETElementEditor;elementEditor->show(); + auto *elementScene=elementEditor->elementScene(); + auto *part=new PartRectangle(elementEditor);part->setRect({0,0,50,40});elementScene->addItems({part});part->setSelected(true); + QApplication::processEvents(); + auto checkElementHandles=[&] { + int count=0; + for(auto *item:elementScene->items())if(item->type()==QetGraphicsHandlerItem::Type&&item->isVisible()) { + ++count;check(qgraphicsitem_cast(item)->property("currentSize").toReal()==10,"element editor retains default handle size"); + } + check(count>=4,"element editor shared handles present"); + }; + for(int i=0;i<6;++i){combo->setCurrentIndex(i);checkElementHandles();check(part->rect()==QRectF(0,0,50,40),"element primitive geometry unchanged");} + elementScene->clearSelection(); + auto *field=new PartDynamicTextField(elementEditor);field->setPlainText("Element field");elementScene->addItems({field});field->setSelected(true); + QApplication::processEvents();checkElementHandles(); + std::puts("PASS: element editor rectangle and dynamic field keep their default shared handles"); + QStandardItemModel model(2,2);model.setData(model.index(0,0),"Table"); + auto *table=new QetGraphicsTableItem;table->setModel(&model);scene->addItem(table); + const auto tableSize=table->size(); + for(int i=0;i<6;++i) { + combo->setCurrentIndex(i); + QGraphicsSceneHoverEvent enter(QEvent::GraphicsSceneHoverEnter);scene->sendEvent(table,&enter); + check(bottomRightHandle(scene)->property("currentSize").toReal()==sizes[i],"table hover handle retains fraction"); + check(table->size()==tableSize,"table dimensions unchanged"); + QGraphicsSceneHoverEvent leave(QEvent::GraphicsSceneHoverLeave);scene->sendEvent(table,&leave); + } + delete table;std::puts("PASS: table hover handles retain all six sizes without changing the table"); + const auto wireFixture=QFileInfo(fixture).dir().absoluteFilePath("../../../examples/tremie_vibrante.qet"); + auto *wireProject=new QETProject(wireFixture);check(wireProject->state()==QETProject::Ok,"conductor fixture opens"); + editor->addProjectView(new ProjectView(wireProject)); + Diagram *wireScene=nullptr;for(auto *diagram:wireProject->diagrams())if(!diagram->conductors().isEmpty()){wireScene=diagram;break;} + check(wireScene,"conductor scene present");auto *wire=wireScene->conductors().first(); + wire->setSelected(true);QApplication::processEvents(); + const auto wireXml=canonicalProjectXml(wireProject->toXml()); + for(int i=0;i<6;++i) { + combo->setCurrentIndex(i);wire->setSelected(false);wire->setSelected(true); + int count=0;for(auto *item:wireScene->items())if(item->type()==QetGraphicsHandlerItem::Type) { + ++count;check(qgraphicsitem_cast(item)->property("currentSize").toReal()==sizes[i],"conductor handles retain fractions"); + } + check(count>0,"conductor handles present"); + const auto after=canonicalProjectXml(wireProject->toXml()); + check(after==wireXml,"conductor project content unchanged"); + } + std::puts("PASS: conductor handles retain all six sizes without changing their project"); + std::puts("PASS: six toolbar choices, default, fractions, existing/recreated handles, multi-selection, toolbar recreation, unchanged XML/undo/dirty state"); + }catch(const std::exception &error){std::printf("FAIL: %s\n",error.what());std::fflush(stdout);std::_Exit(1);} + std::fflush(stdout);std::_Exit(0); +} diff --git a/tests/qttest/run_handle_size_probe.py b/tests/qttest/run_handle_size_probe.py new file mode 100644 index 000000000..9b95cd5f7 --- /dev/null +++ b/tests/qttest/run_handle_size_probe.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python3 +"""Link the handle-size integration probe using an existing Ninja app build. + +Reuses app objects without duplicating the app or introducing a core-library +refactor. No application source or existing executable is replaced. The +generated manifest, probe binary, reports and export fixtures stay in build/. +""" +import argparse +import pathlib +import re +import shutil +import subprocess +import sys + +parser = argparse.ArgumentParser() +parser.add_argument('--build', required=True) +parser.add_argument('--binary', required=True) +parser.add_argument('--source', required=True) +parser.add_argument('--fixture', required=True) +args = parser.parse_args() +build = pathlib.Path(args.build).resolve() +binary = pathlib.Path(args.binary).resolve() +source = pathlib.Path(args.source).resolve() +fixture = pathlib.Path(args.fixture).resolve() +manifest = (build / 'build.ninja').read_text(encoding='utf-8') +match = re.search(r'^build (\S*?/sources/main\.cpp\.(?:obj|o)):', manifest, re.MULTILINE) +if not match: + sys.exit('Cannot find the application main object in the Ninja build.') +main_object = match.group(1) +probe_object = main_object.replace('main.cpp.', 'handle_size_probe.cpp.') +probe_binary = binary.with_name('handle_size_probe' + binary.suffix) +def escape(path): + return pathlib.Path(path).as_posix().replace('$', '$$').replace(':', '$:').replace(' ', '$ ') +main_source = source.parents[2] / 'sources' / 'main.cpp' +manifest = manifest.replace(main_object, probe_object) +manifest = manifest.replace(escape(main_source), escape(source)) +if binary.suffix: + manifest = manifest.replace(binary.name, probe_binary.name) +else: + old_target = escape(binary.name if binary.parent == build else binary) + new_target = escape(probe_binary.name if probe_binary.parent == build else probe_binary) + manifest = manifest.replace('build ' + old_target + ':', 'build ' + new_target + ':') + old_file = binary.name if binary.parent == build else binary.as_posix() + new_file = probe_binary.name if probe_binary.parent == build else probe_binary.as_posix() + manifest = re.sub(r'^ TARGET_FILE = ' + re.escape(old_file) + r'$', + ' TARGET_FILE = ' + new_file, manifest, flags=re.MULTILINE) +probe_manifest = build / 'handle-size-probe.ninja' +probe_manifest.write_text(manifest, encoding='utf-8') +ninja = shutil.which('ninja') +if not ninja: + sys.exit('Ninja is required for the integration probe.') +target = probe_binary.name if probe_binary.parent == build else str(probe_binary) +subprocess.run([ninja, '-C', str(build), '-f', probe_manifest.name, target], check=True) +output = build / 'handle-size' +output.mkdir(exist_ok=True) +report = output / 'results.txt' +result = subprocess.run([str(probe_binary), str(fixture), str(report), str(output)], timeout=90) +if report.exists(): + print(report.read_text(encoding='utf-8', errors='replace')) +sys.exit(result.returncode) diff --git a/tests/qttest/tst_handlersize.cpp b/tests/qttest/tst_handlersize.cpp new file mode 100644 index 000000000..e79fa63a2 --- /dev/null +++ b/tests/qttest/tst_handlersize.cpp @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +#include +#include +#include +#include +#include +#include "QetGraphicsItemModeler/qetgraphicshandleritem.h" + +class tst_handlersize : public QObject +{ + Q_OBJECT +private slots: + void sizeChangeCancelsOldHoverAnimation() { + QGraphicsScene scene; + auto *handle=new QetGraphicsHandlerItem(30);scene.addItem(handle); + QGraphicsSceneHoverEvent event(QEvent::GraphicsSceneHoverEnter); + scene.sendEvent(handle,&event); + handle->setSize(2.5); + QTest::qWait(250); + QCOMPARE(handle->property("currentSize").toReal(),qreal(2.5)); + } + void fractionalGeometryAndPicking() { + for (qreal size : {2.5, 5.0, 7.5, 10.0, 20.0, 30.0}) { + QGraphicsScene scene; + auto *object = scene.addRect(QRectF(0,0,100,60)); + object->setPos(80,40); object->setRotation(37); object->setSelected(true); + const QRectF geometry=object->rect(); const auto transform=object->sceneTransform(); + auto handles=QetGraphicsHandlerItem::handlerForPoint({QPointF(120,80)},size); + auto *handle=handles.first(); scene.addItem(handle); handle->setColor(Qt::darkGreen); + QCOMPARE(handle->property("currentSize").toReal(),size); + QCOMPARE(handle->boundingRect().width(),size+2); + const auto position=handle->pos(); + for (qreal next : {2.5,5.0,7.5,10.0,20.0,30.0}) { + handle->setSize(next); + QCOMPARE(handle->property("currentSize").toReal(),next); + QCOMPARE(handle->pos(),position); QVERIFY(handle->isVisible()); + QCOMPARE(object->rect(),geometry); QCOMPARE(object->sceneTransform(),transform); + for (qreal zoom : {0.25,1.0,4.0}) { + QGraphicsView view(&scene); view.scale(zoom,zoom); + const auto device=handle->deviceTransform(view.viewportTransform()); + QCOMPARE(device.mapRect(handle->boundingRect()).width(),next+2); + const QPointF centre=handle->scenePos(); + QVERIFY(scene.items(centre,Qt::IntersectsItemShape,Qt::DescendingOrder,view.viewportTransform()).contains(handle)); + const QPointF outside=centre+QPointF((next/2+2)/zoom,0); + QVERIFY(!scene.items(outside,Qt::IntersectsItemShape,Qt::DescendingOrder,view.viewportTransform()).contains(handle)); + } + } + handle->hide(); QVERIFY(!scene.items(position).contains(handle)); + } + } +}; +QTEST_MAIN(tst_handlersize) +#include "tst_handlersize.moc" diff --git a/tests/qttest/tst_textresizehandles.cpp b/tests/qttest/tst_textresizehandles.cpp index 99f4c4779..2bb82270b 100644 --- a/tests/qttest/tst_textresizehandles.cpp +++ b/tests/qttest/tst_textresizehandles.cpp @@ -176,6 +176,7 @@ private slots: // and reports the change once, on release. void dragKeepsTheOppositeCorner() { + for (qreal size : {2.5, 5.0, 7.5, 10.0, 20.0, 30.0}) for (int c = TextResize::TopLeft ; c <= TextResize::BottomLeft ; ++c) for (qreal angle : {0.0, 90.0, 37.0}) { QGraphicsScene scene; @@ -183,7 +184,7 @@ private slots: scene.addItem(text); text->setPos(100, 100); text->setRotation(angle); - auto *handles = new TextResizeHandles(text); + auto *handles = new TextResizeHandles(text, size); QSignalSpy finished(handles, &TextResizeHandles::resizeFinished); const Corner corner = Corner(c); From b71950206061f6d8439e825c77efcb473a8a4da3 Mon Sep 17 00:00:00 2001 From: Laurent Trinques Date: Thu, 8 Oct 2026 16:19:44 +0200 Subject: [PATCH 22/22] Terminal strip: natural sort for automatic ordering and terminal lists "Position automatique" sorted labels as plain strings, so XAUZ1:10 came before XAUZ1:2. Add QETUtils::naturalLessThan (digit runs compared by value, case insensitive; QCollator numeric mode is ignored by some Qt backends) and use it in SortTerminalStripCommand, FreeTerminalModel and the terminal strip tree dock. --- .../UndoCommand/sortterminalstripcommand.cpp | 49 +++---------- .../TerminalStrip/ui/freeterminalmodel.cpp | 2 +- .../ui/terminalstriptreedockwidget.cpp | 9 +-- sources/utils/qetutils.cpp | 71 +++++++++++++++++++ sources/utils/qetutils.h | 1 + 5 files changed, 88 insertions(+), 44 deletions(-) diff --git a/sources/TerminalStrip/UndoCommand/sortterminalstripcommand.cpp b/sources/TerminalStrip/UndoCommand/sortterminalstripcommand.cpp index 125e48507..7abf06699 100644 --- a/sources/TerminalStrip/UndoCommand/sortterminalstripcommand.cpp +++ b/sources/TerminalStrip/UndoCommand/sortterminalstripcommand.cpp @@ -19,6 +19,7 @@ #include "../terminalstrip.h" #include "../physicalterminal.h" #include "../realterminal.h" +#include "../../utils/qetutils.h" SortTerminalStripCommand::SortTerminalStripCommand(TerminalStrip *strip, QUndoCommand *parent) : QUndoCommand(parent), @@ -46,46 +47,16 @@ void SortTerminalStripCommand::redo() void SortTerminalStripCommand::sort() { - std::sort(m_new_order.begin(), m_new_order.end(), [](QSharedPointer arg1, QSharedPointer arg2) + auto label_of = [](const QSharedPointer &t) -> QString { - const QRegularExpression rx(QStringLiteral("^\\d+")); + return t->realTerminalCount() ? t->realTerminals().constLast()->label() + : QString(); + }; - QString str1; - QString str2; - int int1 =-1; - int int2 =-1; - - if (arg1->realTerminalCount()) - { - str1 = arg1->realTerminals().constLast()->label(); - - auto match = rx.match(str1); - if (match.hasMatch()) { - int1 = match.captured(0).toInt(); - } - } - - if (arg2->realTerminalCount()) - { - str2 = arg2->realTerminals().constLast()->label(); - - auto match = rx.match(str2); - if (match.hasMatch()) { - int2 = match.captured(0).toInt(); - } - } - - //Sort as numbers if both string - //start at least by a digit and - //the number of each string are different. - //Else sort as string - if (int1 >= 0 && - int2 >= 0 && - int1 != int2) { - return int1 &arg1, + const QSharedPointer &arg2) + { + return QETUtils::naturalLessThan(label_of(arg1), label_of(arg2)); }); } diff --git a/sources/TerminalStrip/ui/freeterminalmodel.cpp b/sources/TerminalStrip/ui/freeterminalmodel.cpp index 7bfe62674..02e5dfb2a 100644 --- a/sources/TerminalStrip/ui/freeterminalmodel.cpp +++ b/sources/TerminalStrip/ui/freeterminalmodel.cpp @@ -400,7 +400,7 @@ void FreeTerminalModel::fillTerminalVector() std::sort(free_terminal_vector.begin(), free_terminal_vector.end(), [](TerminalElement *a, TerminalElement *b) { - return QETUtils::sortBeginIntString(a->elementData().m_informations.value(QETInformation::ELMT_LABEL).toString(), + return QETUtils::naturalLessThan(a->elementData().m_informations.value(QETInformation::ELMT_LABEL).toString(), b->elementData().m_informations.value(QETInformation::ELMT_LABEL).toString()); }); diff --git a/sources/TerminalStrip/ui/terminalstriptreedockwidget.cpp b/sources/TerminalStrip/ui/terminalstriptreedockwidget.cpp index a4c3576a8..2278d1102 100644 --- a/sources/TerminalStrip/ui/terminalstriptreedockwidget.cpp +++ b/sources/TerminalStrip/ui/terminalstriptreedockwidget.cpp @@ -27,6 +27,7 @@ #include "../../qetgraphicsitem/terminalelement.h" #include "../terminalstrip.h" #include "../../qetinformation.h" +#include "../../utils/qetutils.h" #include "freeterminalmodel.h" #include @@ -257,7 +258,7 @@ void TerminalStripTreeDockWidget::buildTree() auto ts_vector = m_project->terminalStrip(); std::sort(ts_vector.begin(), ts_vector.end(), [](TerminalStrip *a, TerminalStrip *b) { - return a->name() < b->name(); + return QETUtils::naturalLessThan(a->name(), b->name()); }); for (const auto &ts : std::as_const(ts_vector)) { @@ -355,9 +356,9 @@ void TerminalStripTreeDockWidget::addFreeTerminal() //Sort the terminal element by label std::sort(vector_.begin(), vector_.end(), [](TerminalElement *a, TerminalElement *b) { - return a->elementData().m_informations.value(QETInformation::ELMT_LABEL).toString() - < - b->elementData().m_informations.value(QETInformation::ELMT_LABEL).toString(); + return QETUtils::naturalLessThan( + a->elementData().m_informations.value(QETInformation::ELMT_LABEL).toString(), + b->elementData().m_informations.value(QETInformation::ELMT_LABEL).toString()); }); auto free_terminal_item = ui->m_tree_view->topLevelItem(1); diff --git a/sources/utils/qetutils.cpp b/sources/utils/qetutils.cpp index da4f43126..e62723e1a 100644 --- a/sources/utils/qetutils.cpp +++ b/sources/utils/qetutils.cpp @@ -133,6 +133,77 @@ bool QETUtils::sortBeginIntString(const QString &str_a, const QString &str_b) } } +/** + * @brief QETUtils::naturalLessThan + * Natural order comparison, case insensitive : + * "2" < "10" and "XAUZ1:2" < "XAUZ1:10". + * Runs of digits are compared by value wherever they are in the string. + * Implemented by hand because QCollator numeric mode is not honored by + * every Qt backend (it is ignored without ICU). + * The result is a strict weak ordering, so it is safe to use with std::sort. + * @param str_a + * @param str_b + * @return true if str_a must be placed before str_b + */ +bool QETUtils::naturalLessThan(const QString &str_a, const QString &str_b) +{ + const int len_a = str_a.size(); + const int len_b = str_b.size(); + int i = 0; + int j = 0; + int zeros_diff = 0; //Tie breaker : "01" and "1" have the same value + + while (i < len_a && j < len_b) + { + const QChar ca = str_a.at(i); + const QChar cb = str_b.at(j); + + if (ca.isDigit() && cb.isDigit()) + { + int start_a = i; + int start_b = j; + while (i < len_a && str_a.at(i).isDigit()) { ++i; } + while (j < len_b && str_b.at(j).isDigit()) { ++j; } + + int sig_a = start_a; + int sig_b = start_b; + while (sig_a < i - 1 && str_a.at(sig_a) == QLatin1Char('0')) { ++sig_a; } + while (sig_b < j - 1 && str_b.at(sig_b) == QLatin1Char('0')) { ++sig_b; } + + const int digits_a = i - sig_a; + const int digits_b = j - sig_b; + if (digits_a != digits_b) { + return digits_a < digits_b; + } + + const int cmp = QStringView(str_a).mid(sig_a, digits_a) + .compare(QStringView(str_b).mid(sig_b, digits_b)); + if (cmp != 0) { + return cmp < 0; + } + + if (zeros_diff == 0) { + zeros_diff = (sig_a - start_a) - (sig_b - start_b); + } + } + else + { + const QChar la = ca.toCaseFolded(); + const QChar lb = cb.toCaseFolded(); + if (la != lb) { + return la < lb; + } + ++i; + ++j; + } + } + + if (i < len_a || j < len_b) { + return (len_a - i) < (len_b - j); //The shortest remaining part first + } + return zeros_diff > 0 ? false : zeros_diff < 0; //"1" before "01" +} + /** * @brief QETUtils::pixelSizedFont * Set the font size to pixelSize instead of pointSize (if needed). diff --git a/sources/utils/qetutils.h b/sources/utils/qetutils.h index 86fef778b..e5677dc73 100644 --- a/sources/utils/qetutils.h +++ b/sources/utils/qetutils.h @@ -59,6 +59,7 @@ namespace QETUtils }; bool sortBeginIntString(const QString &str_a, const QString &str_b); + bool naturalLessThan(const QString &str_a, const QString &str_b); template QVector> sharedVectorToWeak(const QVector> &vector)