IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Gestion du G Code en Python [Python 3.X]


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2017
    Messages : 6
    Par défaut Gestion du G Code en Python
    Bonjour à tous !

    Je suis actuellement entrain de développer un outil permettant de lire une fichier en g-code (code pour les machines à commande numérique) et à partir de ce fichier je trace grâce à turtle la trajectoire en 2D de l'outil (pas d'axe Z donc).

    Le problème est le suivant : dans mon programme mes fonctions G sont définies comme ca : G00(X,Y), alors que le code G doit se lire comme G00 X... Y...

    Comment faire pour lire la ligne G00 X Y et réussir à rentrer le X et le Y dans la fonction ?

    Le code peut être trouvé ici (juste une ébauche pour l'instant) : https://github.com/freenox/GCode-Pyton

    Toute aide est la bienvenue !

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 715
    Par défaut
    Salut,

    Citation Envoyé par Freenox Voir le message
    Comment faire pour lire la ligne G00 X Y et réussir à rentrer le X et le Y dans la fonction ?
    "G00 X Y" est à priori une chaîne de caractères.
    Si on veut "interpréter" çà, il faut lire "G00" puis récupérer des informations associées disant le nombre de paramètres attendus, on lit X, on lit Y en vérifiant qu'ils sont correctement écrits.
    A ce stade, on a "G00", X, Y...
    On peut donc appeler la fonction associée/correspondant à "G00".

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2017
    Messages : 6
    Par défaut
    Merci pour la réponse Wiz !

    Citation Envoyé par wiztricks Voir le message
    Salut,
    A ce stade, on a "G00", X, Y...
    On peut donc appeler la fonction associée/correspondant à "G00".
    - W
    Ca je sais, le problème c'est le eval ensuite... en gros voilà ce que j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    doc = []
    file = open("gcode.txt","r")
    for line in file:
        doc.append(line.strip('\n'))
     
    for i in range(len(doc)):
        func = doc[i][0:3]
        X = int(doc[i][5:9])
        Y = int(doc[i][10:14])
    mais à présent je veux évaluer func(X,Y) et je n'arrive pas à créer un str valable qui puisse être lu...une astuce pour concatener ?

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2017
    Messages : 6
    Par défaut
    C'est bon j'ai trouvé la solution, il faut en fait garder le X et Y en str :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    doc = []
    file = open("gcode.txt","r")
    for line in file:
        doc.append(line.strip('\n'))
     
    for i in range(len(doc)):
        func = doc[i][0:3]
        X = doc[i][5:9]
        Y = doc[i][10:14]
        eval(func + "(" + X + "," + Y + ")")

  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 060
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 060
    Par défaut
    Le problème va être d'analyser les différentes commandes de votre fichier, et comme ils ne sont pas sous la même forme, ça risque de tomber à l'eau cette manière de faire. En gros il faudrait que chaque ligne soit analyser en prenant un pattern général qui fonctionnerait pour chacunes de vos lignes. Les expressions régulières font cela. Le résultat final pourrait être

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    commande: G00
    parametres: 300,300
     
    commande: G01
    parametres: 150,35
     
    commande: G04
    parametres: 1
     
    commande: G01
    parametres: 250,35
     
    commande: G00
    parametres: 56,75
     
    commande: G28
    parametres: 
     
    commande: G02
    parametres: 34,43,R=3
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    commande: G00
    parametres: ['300', '300']
     
    commande: G01
    parametres: ['150', '35']
     
    commande: G04
    parametres: ['1']
     
    commande: G01
    parametres: ['250', '35']
     
    commande: G00
    parametres: ['56', '75']
     
    commande: G28
    parametres: ['']
     
    commande: G02
    parametres: ['34', '43', 'R=3']

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2017
    Messages : 6
    Par défaut
    Je suis d'accord Fred, le plus compliqué va être de bien gérer les paramètres... Je fais voir comment faire ca, mais merci pour le tuyau !

  7. #7
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 060
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 060
    Par défaut
    J'avais fais ça en 5 minutes tout à l'heure, je te le met, même si je sais que la partie expression régulière reste difficile, celle-ci n'est pas très complexe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    import re
     
    def parse_commande(commande):
        PATTERN = "(G\d{2})(.*)"
        res = re.match(PATTERN, commande)
        if res:
            commande, parametres = res.group(1), res.group(2).strip('()')
            return commande, parametres
     
    s = """
    G00(300,300)
    G01(150,35)
    G04(1)
    G01(250,35)
    G00(56,75)
    G28()
    G02(34,43,R=3)
    """
     
    for line in s.split('\n'):
        res = parse_commande(line)
        if res:
            c, p = res
            print("commande: {}\nparametres: {}\n".format(c, p.split(',')))

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2017
    Messages : 6
    Par défaut
    Merci Fred !

    Juste après ta première réponse j'ai fait ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for i in range(len(doc)):
        func = doc[i][0:3]
        X = re.findall(r'X(\w+)',doc[i])[0]
        Y = re.findall(r'Y(\w+)',doc[i])[0]
    ca marche bien, mais loin d'être optimisé. Il faudrait que je définisse avec mes fonction les patterns auxquels elles obéissent...

    En tout cas merci pour ton bout de code, je vais voir ca !

  9. #9
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 060
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 060
    Par défaut
    Je ne sais pas pourquoi ça fonctionne, mais l'essentiel est que se soit le cas...

    Par contre en prenant en compte vos indications de départ, il est possible de reformater la chaîne afin de la rendre utilisable pour récupérer les infos.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    def formater(chaine):
        s = chaine[:]
        pattern = {
                    '(': ' ',
                    ')': ''
                  }           
        for p in pattern:
            s = s.replace(p, pattern[p])
        return s
     
    s = """
    G00(300,300)
    G01(150,35)
    G04(1)
    G01(250,35)
    G00(56,75)
    G28()
    G02(34,43,R=3)
    """
     
    for line in s.split('\n'):
        res = formater(line)
        if res:
            print(res.split())

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2017
    Messages : 6
    Par défaut
    Pardon, je pense qu'on s'est mal compris ! Ca marche en fait parce que je ne met plus mes entrées sous la forme G00(X,Y), je les mets sous forme G00 X125 Y75, donc mon code va juste chercher la chaine de caractère qui succède au caractère précisé (X ou Y).

  11. #11
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 060
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 060
    Par défaut
    Si j'avais bien compris, seulement tu avais omis de m'annoncer un changement dans ton fichier de données.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 19
    Dernier message: 28/09/2010, 18h30
  2. Réponses: 0
    Dernier message: 02/07/2009, 15h38
  3. Que choisir pour une application de "gestion d'une todo liste" ? Python ou Java ?
    Par Yoshidu62 dans le forum Langages de programmation
    Réponses: 3
    Dernier message: 10/08/2007, 09h03
  4. [Glade]Exporter le code en Python avec Glade
    Par Sebmox dans le forum GTK+ avec Python
    Réponses: 2
    Dernier message: 06/08/2006, 00h02
  5. enregistrer/lancer un code source python
    Par laulau69 dans le forum Général Python
    Réponses: 7
    Dernier message: 21/01/2006, 10h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo