Gambas France BETA


Pas de compte ? Incription

Recherche dans une Textarea

1
AuteurMessages
lapenduledargent#1 Posté le 27/9/2010 à 13:39:00
Bonjour,

J'avance dans mon programme de Gcode :D .

Grâce aux exemples sur les fichiers, je peux importer un dxf et il est converti en Gcode.
Je peux utiliser les commandes "enregistrer" ou "enregistrer sous" pour sauvegarder le programme.

A présent, je souhaiterais afficher le parcours d'outils en Gcode dans une"Drawarea".
Suite aux exemples de paint, je peux tracer une ligne, un rectangle...

Le Gcode pour le pilotage de machines cnc, est une succession de commandes avec les déplacement X, Y Z.
Par exemple : G1 F100 X 20.75 Y 56.75 Z -1
La liste des Gcodes est ici
http://linuxcnc.org/docs/html/gcode_fr.html

Donc, je dois rechercher dans un textarea si il trouve par exemple une ligne commençant par "G1"

1
PUBLIC SUB Button1_Click() contenu_textarea = TextArea1.Text IF contenu_textarea = "G40" THEN 'recherche du code G40 PRINT "oui" ELSE PRINT "non" ENDIF END


Ce code ne donne rien alors que la textarea contient bien G40 G21 G17

Faut-il parcourir le textarea au moyen d'une boucle :

1
WHILE NOT EOFWEND


Une idée, une astuce ?
Attention, j'ai plus pratiqué Gambas pendant plusieurs mois et je dois m'y remettre...

Bonne après-midi

Pierre
spheris#2 Posté le 27/9/2010 à 17:50:00
Perso j'utilise ca :
http://gambasdoc.org/help/lang/instr?fr

Et tu as plein de fonctions pour traiter les chaines de caractères dans GB.
ici :
http://gambasdoc.org/help/cat/string?fr
A+
;)
lapenduledargent#3 Posté le 27/9/2010 à 18:05:00
Bonsoir,

Merci pour le lien, j'ai donc trouvé ceci :
http://gambasdoc.org/help/lang/comp?fr

A ton avis, faut-il utiliser une boucle ?

J'essaie ce soir.

Pierre
Prokopy#4 Posté le 27/9/2010 à 19:13:00
Kinder PinguiSalut Pierre,

Alors non, tu ne dois ni utiliser "=" ni Comp(), car ces deux méthodes ne te permettent que de détecter si les chaînes sont égales, c'est-à-dire si elles contiennent exactement la même chose ! Utilise plutôt la méthode String.InStr() qui te permettra de connaître la position de ton instruction (la fonction renvoie -1 si la chaîne n'est pas trouvée).
Après, si tu veux effectuer une action pour chaque instruction trouvée dans ton textArea, alors oui passe par une boucle. Pour cela utilise le second paramètre de la fonction String.InStr() qui te permet de commencer la recherche à une position précise, et donc "d'avancer" dans ton texte :

1
DIM position AS INTEGER position = String.InStr(texte, "MotCle") WHILE position <> 0 'Insérer les instructions à effectuer ici position = String.InStr(texte, "MotCle", position + String.Len(pattern)) Wend


:)

Plus d'infos sur String.InStr() : http://gambasdoc.org/help/comp/gb/string/instr?fr&v3
La théorie, c'est quand on sait tout et que rien ne fonctionne.
La pratique, c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique, rien ne fonctionne et on ne sait pas pourquoi.
lapenduledargent#5 Posté le 27/9/2010 à 20:30:00
Bonsoir Prokopy,

Merci ça fonctionne :D

Finalement, j'ai pas utilisé de boucle mais un IF

1
IF InStr(contenu_textarea, "M4") ' PRINT "oui" ELSE PRINT "non" ENDIF


Bon, je continue la suite...

Bonne soirée à tous

Pierre
lapenduledargent#6 Posté le 29/9/2010 à 22:06:00
Bonsoir à tous,

Voilà ça fonctionne :cheers:

Un petit bout de code, vaut mieux qu'un long discourt ...

1
DIM PositionRecherche AS FloatNombre_chiffre = 5contenu_textarea = TextArea1.Text PositionRecherche = InStr(contenu_textarea, "X") IF PositionRecherche > 0X = (Mid$(contenu_textarea, PositionRecherche, Nombre_chiffre))PositionRecherche = InStr(contenu_textarea, "Y") ENDIF IF PositionRecherche > 0Y = Mid$(contenu_textarea, PositionRecherche, Nombre_chiffre) ENDIF 'PRINT X'PRINT Y


Mais le contenu de ma textarea est dans ce format :


1
%G40 G21 G17 G0 X 0 Y 0 Z 10G1 F100 X 100 Y 0 Z -10G1 F800 X 100 Y 50 Z -10G1 F800 X 0 Y 50 Z -10G1 F800 X 0 Y 0 Z -10G0 X0 Y0 Z 10M2 %


Je recherche maintenant une instruction pour parcourir ligne par ligne...

J'ai essayé avec WHILE NOT Eof(hFile) ou FOR EACH mais c'est pas un fichier.

Une idée pour parcourir ligne par ligne une textarea ?

Bonne nuit

Pierre
spheris#7 Posté le 30/9/2010 à 00:43:00
la textarea n'est qu'une seule et même suite de caracteres.
Il te suffit dedétecter le passage par le caractère Retour chariot et le tour est joué !
A+
;)
Prokopy#8 Posté le 30/9/2010 à 03:03:00
Kinder PinguiC'est ça. En fait ça reprend le code que je t'ai donné l'autre jour, mais tu remplaces MotCle par \n, qui est le caractère de nouvelle ligne :

1
DIM position AS INTEGER position = String.InStr(TextArea1.Text, "\n") WHILE position <> 0 'Insérer les instructions à effectuer ici position = String.InStr(TextArea1.Text, "\n", position + 1) Wend


Et normalement tu termines ta TextArea jusqu'au bout. :)
La théorie, c'est quand on sait tout et que rien ne fonctionne.
La pratique, c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique, rien ne fonctionne et on ne sait pas pourquoi.
lapenduledargent#9 Posté le 30/9/2010 à 17:22:00
Bonsoir à tous,

J'ai testé le code de Prokopy ;) mais sa recherche se fait uniquement sur la première ligne :

1
PUBLIC SUB Button1_Click()DIM position AS IntegerNombre_chiffre = 5 contenu_textarea = TextArea1.Text position = String.InStr(contenu_textarea, "\n") WHILE position <> 0 'Insérer les instructions à effectuer ici PositionRecherche = InStr(contenu_textarea, "X") IF PositionRecherche > 0 X = (Mid$(contenu_textarea, PositionRecherche, Nombre_chiffre)) PositionRecherche = InStr(contenu_textarea, "X") PRINT x ENDIF PositionRecherche = InStr(contenu_textarea, "Y") IF PositionRecherche > 0 Y = (Mid$(contenu_textarea, PositionRecherche, Nombre_chiffre)) PositionRecherche = InStr(contenu_textarea, "Y") PRINT Y ENDIF position = String.InStr(contenu_textarea, "\n", position + 1) WENDEND


Le résultat dans la console est :

1
X 100Y 150X 100Y 150X 100Y 150X 100Y 150


Pour un Gcode :

1
G1 F100 X 100 Y 150 Z -10G1 F800 X 200 Y 250 Z -10G1 F800 X 300 Y 350 Z -10G1 F800 X 400 Y 450 Z -10


Bref, le système de boucle proposé fonctionne (bon nombre de lignes) mais il ne lit que la première ligne.

Là, je bloque :suspect:

Peut-être une autre manière :
Ajouter un caractère (comme le programme de Sphéris GSV) à la fin de la ligne ?

Qu'en pensez-vous ?

Bonne soirée

Pierre
Prokopy#10 Posté le 30/9/2010 à 19:05:00
Kinder PinguiC'est parce que dans ton code, tu utilises la position dans la première ligne. Il faut prendre à partir de la position de la ligne actuelle. Essaie plutôt :

1
PUBLIC SUB Button1_Click()DIM position AS IntegerNombre_chiffre = 5 contenu_textarea = TextArea1.Text position = String.InStr(contenu_textarea, "\n") WHILE position <> 0 'Insérer les instructions à effectuer ici PositionRecherche = InStr(contenu_textarea, "X", position) IF PositionRecherche > 0 X = (Mid$(contenu_textarea, PositionRecherche, Nombre_chiffre)) PositionRecherche = InStr(contenu_textarea, "X", position) PRINT x ENDIF PositionRecherche = InStr(contenu_textarea, "Y", position) IF PositionRecherche > 0 Y = (Mid$(contenu_textarea, PositionRecherche, Nombre_chiffre)) PositionRecherche = InStr(contenu_textarea, "Y", position) PRINT Y ENDIF position = String.InStr(contenu_textarea, "\n", position + 1) WENDEND
La théorie, c'est quand on sait tout et que rien ne fonctionne.
La pratique, c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique, rien ne fonctionne et on ne sait pas pourquoi.
lapenduledargent#11 Posté le 30/9/2010 à 19:40:00
Ah super. Merci Prokopy

1
PositionRecherche = InStr(contenu_textarea, "Y", position)


Décidément, tu est très fort :cheers: . J'ai cherché une partie de l'après-midi...

Je suis me suis aperçu que tu étais l'auteur du tuto sur le site du zéro. Magnifique travail.

Vu que tes capacités et ta passion, je pense que pour tes études, tu n'auras pas longtemps à chercher ta voie .

Aller j'y retourne.
Étape suivante, afficher le Gcode dans une drawArea...

Bonne soirée

Pierre
Prokopy#12 Posté le 30/9/2010 à 20:59:00
Kinder PinguiMerci. Personnellement j'ai en effet déjà trouvé la voie, et même l'école. Cette année gambas m'aide vachement bien d'ailleurs. :)
Mais sinon, qu'est-ce que tu veux dire par "afficher le code dans une DrawArea" ?
La théorie, c'est quand on sait tout et que rien ne fonctionne.
La pratique, c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique, rien ne fonctionne et on ne sait pas pourquoi.
spheris#13 Posté le 30/9/2010 à 22:51:00
Tracer une vue du plan de la cn peut être...
lapenduledargent#14 Posté le 1/10/2010 à 10:29:00
Bonjour Prokopy, Spheris,

Tout fonctionne :D

A partir d'un Gcode, les draw.line sont affichées dans une DrawingArea.

Pour mieux comprendre mon projet, j'ai rouvert mon post d'il y a presqu'un an:
http://gambaslinux.forumactif.net/ton-projet-en-gambas-basic-f6/convertisseur-dxf-en-gcode-vendredi-24-juillet-2009-0758-par-pierre-t11.htm#2763

Tu y trouveras quelques explications complémentaires.

A bientôt et encore merci pour votre aide.

Pierre
1