Repository navigation
Conversation
Quand GRBL renvoie une erreur (error:N ou ALARM) pendant l'envoi, l'envoi s'arrêtait mais GRBL exécutait encore les lignes déjà dans son buffer (déplacements, laser allumé). Le streamer arrête désormais la machine : feed hold (!), attente de l'arrêt complet (Hold:0 ou Idle, 3 s maxi), puis reset logiciel (0x18) qui vide le buffer et coupe le laser. Si l'arrêt complet n'est pas confirmé (ou après une ALARM), la position est considérée perdue : le statut « homing fait » est retiré, comme pour un RESET manuel. Valable pour l'envoi direct et la file d'attente. Tests : faux GRBL (erreur, arrêt non confirmé, ALARM, job normal) et position perdue côté interface. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
À la connexion, la réponse de « $$ » (déjà lue pour vérifier $32) est aussi utilisée pour $22. Si le homing est désactivé sur la machine ($22=0), GRBL refuserait le « $H » en tête de job (error:5) : « Inclure $H » et l'option homing de la matrice de test sont décochés, avec un message dans la console. Avec $22=1 ou un réglage inconnu, rien ne change (case cochée d'office). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
En plus d'être décochées, les cases « Inclure $H » et homing de la matrice de test sont grisées, avec une infobulle qui explique pourquoi : on ne peut plus les recocher par erreur. Elles redeviennent utilisables (sans être recochées) à la connexion d'une machine avec $22 non nul ; sans réponse à « $$ », rien ne change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Ajoute debug_log.py, activé par la variable d'environnement LASER_STUDIO_DEBUG=1 (sans elle, rien ne change) : - terminal (INFO) : étapes, erreurs et blocages ; - gravure_debug.log du dossier de données (DEBUG) : en plus, chaque ligne envoyée (TX) et chaque réponse de GRBL (RX). Journalise : - la file d'attente et « Envoyer au laser » : raison de chaque abandon, résumé de chaque job, lignes qui ne ressemblent pas à du G-Code ; - l'envoi (GCodeStreamerThread) : port, erreur GRBL avec la ligne fautive, alerte toutes les 5 s si GRBL ne répond plus, bilan de fin ; - le port USB : connexion et message d'accueil, commandes, commandes temps réel, déconnexion, changements d'état GRBL (Idle, Hold, Alarm...). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
estimate_job_time lisait le surbalayage dans un widget spin_overscan qui n'existe pas (le réglage s'appelle spin_overscan_dist) : le surbalayage valait toujours 0 et la durée annoncée était trop courte. Le surbalayage est maintenant compté comme à la génération du G-Code : désactivé, distance fixe ou pourcentage de la largeur de l'image.
Fix de sécurité, s'assurer que le laser est off en cas d'erreur
Feat/graveuse sans homming
Correction du point rouge qui suit la gravure
surbalayage enregistré dans le profil machine
debug: journal de la gravure (LASER_STUDIO_DEBUG)
ui: refonte de l'interface
Le dépôt n'avait pas de licence : le code était donc, juridiquement, « tous droits réservés », contributions comprises. Ajout du texte officiel de la GNU GPL v3 (gnu.org) dans LICENSE et d'une section Licence dans le README : GPL-3.0-or-later. La GPLv3 suit celle de PyQt6 (GPLv3 ou commerciale), embarqué dans l'exécutable PyInstaller ; les autres dépendances (numpy, Pillow, OpenCV, scikit-image, pyserial, pyqtgraph, numba) y sont compatibles.
…init__ En résolvant un conflit de fusion, l'initialisation de _hold_timeout, stopped_on_error et position_lost s'est retrouvée à la fin de _flush_sent_lines au lieu de __init__ : chaque émission des lignes envoyées remettait les deux drapeaux à False. Après une erreur GRBL, l'application n'annonçait plus l'arrêt sur erreur ni la position perdue (3 tests de test_stream_error_stop en échec).
Pendant l'envoi, les segments déjà exécutés par GRBL (lignes acquittées par « ok ») sont tracés en rouge sur l'aperçu, pour l'envoi direct comme pour la file d'attente.
Refonte du panneau jog et des commandes : déplacements avec des curseurs de pas et de vitesse, boutons regroupés pour prendre moins de place.
Comme pour les vecteurs importés, l'image est placée à 10 mm de l'origine quand l'origine est en bas à gauche : avec un décalage du job à 0, le surbalayage ne fait plus partir la tête en X négatif (refus avant envoi).
« Image chargée » et « Image insérée à sa taille d'origine » s'affichent dans la barre d'état au lieu de la console G-Code, qui ne contient ainsi plus que du G-Code.
Les lignes sans pixel à graver sont sautées, et chaque ligne n'est balayée (surbalayage compris) que de son premier à son dernier pixel gravé, en alternant le sens sur les lignes balayées. Les pixels gravés sont inchangés ; l'estimation rapide suit le même calcul. Médaille de 80 mm : 26 min 3 s → 19 min 43 s.
La console mélange le G-Code et les messages de l'application (« Connecté à … », « >>> Mode laser GRBL … »). En se connectant après la génération, ces lignes étaient envoyées à la fin du job : GRBL répondait error:1 et la gravure était annoncée interrompue. Seules les lignes que GRBL sait lire sont désormais envoyées. Le test d'arrêt sur erreur utilise G999 (refusé par GRBL) au lieu d'une ligne de texte, désormais filtrée.
docs: licence GPL-3.0-or-later
fix: arrêt sur erreur GRBL, initialisation du streamer remise dans __…
fix: l'estimation du temps de gravure ignorait le surbalayage
La fusion de feat/ui (lignes vides sautées) avec fix-time-calc (surbalayage compté) a gardé les deux calculs dans estimate_job_time : le second utilisait h_mm et lmm, qui n'existent plus, d'où un NameError dès qu'une image est chargée. Les deux sont réunis : surbalayage lu comme à la génération (désactivé, distance fixe ou pourcentage), ajouté à chaque ligne balayée, lignes vides exclues. Test ajouté pour ce cas combiné.
suppression du dégroupage d'un svg/dxf à l'import avec possibilité de dégrouper avec un clic droit
modification import svg dxf
mise a jour icone application windows
tracer ligne, rectangle, ellipse avec la souris dans la partie vectorielle
ajout partie vectorielle
fix theme claire windows
Correction couleur de certains boutons du theme sombre
ui_menus.py reçoit la barre de menus, la barre d'outils principale, le thème, la langue et l'état de la connexion (MenusMixin). Les dialogues À propos, Support et Buy me a coffee ont chacun leur fichier, sous forme de fonctions. Aucun changement de comportement.
refactor: sort les menus et les dialogues de ui_setup_mixin.py
Ajouts de 2 nouveaux thèmes pour LSP et stencil studio
Ce commit repartait de la version de ui_setup_mixin.py d'avant le déplacement vers ui_menus.py : sept méthodes existaient en double et, UiSetupMixin passant avant MenusMixin, ui_menus.py n'était plus exécuté. Reprend la version sans doublons et reporte ses ajouts dans ui_menus.py : synchronisation du thème avec Stencil Studio et menu des thèmes traduit.
init_ui devient un sommaire : chaque onglet, page ou panneau a sa méthode, dans le même ordre qu'avant. Aucun changement de comportement.
Sort de ui_setup_mixin.py les pages de réglages (une par fichier), l'onglet Image, l'aperçu 2D, les onglets Console et File d'attente, le panneau machine, la barre d'état et l'ancien mode SVG. Le fichier passe de 1466 à 570 lignes. Aucun changement de comportement. tests/ui_source.py lit tous les fichiers ui_* : les tests ne dépendent plus de l'emplacement du code ni de son formatage.
Réorganisation de l'interface en petits fichiers
Première étape de la réécriture de ui_about_dialog.py : la boîte de
dialogue devient une classe, et ses éléments ont chacun la leur. Cette
version existe à côté de l'ancienne, qui reste utilisée par le menu
Aide, pour comparer les deux écritures. Même affichage et même
fonctionnement (fenêtre modale ouverte par exec()).
Arborescence :
ui/
├── __init__.py
└── about/
├── __init__.py expose AboutDialog
├── dialog.py AboutDialog(QDialog)
├── banner_pixmap.py AboutBannerPixmap(QPixmap)
└── label.py AboutLabel(QLabel)
- AboutDialog : la fenêtre ; son __init__ ne fait qu'ajouter les
widgets (bannière, texte, bouton OK).
- AboutBannerPixmap : cherche la bannière (à côté de l'exécutable,
puis dans le bundle PyInstaller) et la réduit à la bonne taille ;
error_message() donne le texte à afficher si elle est introuvable
ou illisible.
- AboutLabel : nom, version et description de l'application.
Utilisation depuis le code principal (deuxième étape, dans
ui_menus.py) :
from ui.about import AboutDialog
action_about.triggered.connect(lambda: AboutDialog(self).exec())
Donner la fenêtre principale en parent (self) : la boîte s'ouvre
centrée sur elle et suit son écran. exec() bloque le reste de
l'application jusqu'au clic sur OK, comme l'ancienne fonction
show_about_dialog, qu'on pourra alors supprimer avec
ui_about_dialog.py.
Reprise de la branche 071126 sur le Dev actuel, rangée dans la nouvelle organisation des fichiers ui_* : - Édition vectorielle : outil de mesure, éclater un chemin, édition des nœuds, taille et ancrage des formes (vector_layers.py, vector_editing_mixin.py, barre d'outils dans ui_setup_mixin.py). - Thèmes dark / light / dusk / warm persistants : nom normalisé et enregistré immédiatement, réappliqué après la construction de la fenêtre ; apply_app_theme n'est plus dupliqué dans main.py (app_theme.py, main.py, ui_menus.py, Stencil Studio). - Interface compacte : barre vectorielle sur deux rangées, propriétés de la sélection sur une rangée. - Onglet « Graver une image » : offset X/Y avec la taille de l'image, originale et tramé côte à côte à largeur égale (ui_image_tab.py). - ARCHITECTURE.md : cartographie du code, mise à jour pour les fichiers ui_*. La branche 071126 repartait d'une ancienne copie de ui_setup_mixin.py : ses changements y sont reportés dans les bons fichiers, sans les doublons. La fenêtre construite est identique à celle de 071126. Tests : la lecture de la barre vectorielle et de l'offset suit la nouvelle disposition. test_each_row_is_narrow_enough_in_every_language échoue volontairement : la rangée 2 (13 boutons) demande environ 1300 px, les libellés seront tronqués sur un écran étroit. Co-authored-by: Antoine Le Morvan <antoine@le-morvan.com>
feat: boîte « À propos » réécrite en classes, dans ui/about/
feat(vector+ui): édition vectorielle, thèmes persistants, UI compacte
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.