Skip to content

081126 - #40

Closed
Jgood3d wants to merge 69 commits into
mainfrom
081126
Closed

Jgood3d wants to merge 69 commits into
mainfrom
081126

Conversation

@Jgood3d

@Jgood3d Jgood3d commented Nov 8, 2026

Copy link
Copy Markdown
Owner

No description provided.

Antoine Le Morvan and others added 30 commits November 2, 2026 17:31
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
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é.
Jgood3d and others added 28 commits November 5, 2026 00:34
suppression du dégroupage d'un svg/dxf à l'import avec possibilité de dégrouper avec un clic droit
mise a jour icone application windows
tracer ligne, rectangle, ellipse avec la souris dans la partie vectorielle
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
@Jgood3d Jgood3d closed this Nov 8, 2026
@Jgood3d
Jgood3d deleted the 081126 branch November 8, 2026 12:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants