Ressources pour datamatrix
- Encodage des DataMatrix
Les normes définissant les DataMatrix imposent un encodage. Le type d'encodage utilisé se déduit de la valeur décimale du CodeWord, voici un tableau synthèse et un exemple:
L'exemple encadré vous explique la démarche d'encodage d'un nombre décimal compris entre 0 et 99.
On veut placer le nombre 70 dans un code Word:
1: on encode d'abord le nombre en lui ajoutant 130: ainsi 70 devient 70+130 = 200.
2: on transcode ensuite 200 en binaire: 200 base 10 => 1100 1000 base2
3: On place le nombre binaire obtenu 1100 1000 dans le CodeWord choisi.
- Codage en python
- Dessiner une grille dans un canevas:
from tkinter import messagebox, Entry, Label, Button, Tk, END, Canvas
def dessine_matrice():
# récupérera le contenu des champs de saisies et dessine matrice
pass
# création d'un objet fenêtre
fen = Tk()
# fenêtre de 1000 pixels de large et 700 de haut
fen.geometry("1000x700")
# titre de la fenêtre
fen.title("Générateur de datamatrix")
# empêcher de redimensionner la fenêtre en largeur et hauteur
fen.resizable(width=False, height=False)
# création des champs de saisie positionnés avec grid
# ligne vide
lbl_espace0 = Label(fen, text=' ').grid(row=0, column=0)
# ligne champs texte code_word1
lbl_nombre1 = Label(fen, text=' code_word_1').grid(row=0, column=1)
# ligne vide
lbl_espace0 = Label(fen, text=' ').grid(row=0, column=2)
# ligne champs texte code_word2
lbl_nombre2 = Label(fen, text=' code_word_2').grid(row=0, column=3)
# ligne vide
lbl_espace0 = Label(fen, text=' ').grid(row=0, column=4)
# ligne champs texte code_word3
lbl_nombre3 = Label(fen, text=' code_word_3').grid(row=0, column=5)
# ligne vide
lbl_espace0 = Label(fen, text=' ').grid(row=0, column=6)
# Les zones de saisies
zone_de_saisie1 = Entry(fen, width=10)
zone_de_saisie1.grid(row=1, column=1)
zone_de_saisie2 = Entry(fen, width=10)
zone_de_saisie2.grid(row=1, column=3)
zone_de_saisie3 = Entry(fen, width=10)
zone_de_saisie3.grid(row=1, column=5)
lbl_trier = Label(fen, text=' ').grid(row=2, column=1)
# ajout du bouton Dessiner qui déclenche l'appel de la fonction dessine_matrice
mon_bouton_bulle = Button(fen, text='Dessiner',command= dessine_matrice)
mon_bouton_bulle.grid(row=3, column=1)
lbl_espace0 = Label(fen, text=' ').grid(row=4, column=0)
# canevas de 500 pixels par 500 pixels ( zone de dessin de la matrice)
c = Canvas(fen, width="500", height="500", bg='white')
# positionnement du canvas dans fenêtre
c.grid(row=5, column=1, rowspan=10, columnspan=10, sticky='NW')
# tour canevas
c.create_rectangle( 2, 2, 500, 500, width=1, fill='white')
# dessin de la grille
for x in range(10):
#traits verticaux noirs
c.create_line(x*50, 2, x*50,500, width=1, fill='black')
# carrés noirs de la première ligne
if x*100 < 500:
c.create_rectangle( x*100, 0, 50 + x*100 , 50, width=1, fill='black')
for y in range(10):
#traits horizontaux noirs
c.create_line( 2, y*50, 500, y*50, width=1, fill='black')
# carrés noirs de la dernière colonne
if y*100 < 450:
c.create_rectangle(450, y*100 + 50 , 500, y*100 + 100, width=1, fill='black')
# tour noir première colonne et dernière ligne
c.create_rectangle( 0, 0, 50, 500, width=1, fill='black')
c.create_rectangle( 0, 450, 500, 500, width=1, fill='black')
c.create_rectangle( 0, 450, 500, 500, width=1, fill='black')
# abonnement de la fenêtre aux messages de Windows
fen.mainloop()
- Récupérer les données dans les champs de saisie et calcul des codewords
try:
liste = []
# recuperation-conversion en nombre entier-ajout dans une liste
nombre1 = int(zone_de_saisie1.get())
liste.append(nombre1)
nombre2 = int(zone_de_saisie2.get())
liste.append(nombre2)
nombre3 = int(zone_de_saisie3.get())
liste.append(nombre3)
nombre4 = int(zone_de_saisie4.get())
liste.append(nombre4)
print("la liste vaut", liste)
except:
# effacement des champs si erreur de saisie
zone_de_saisie1.delete(0, END)
zone_de_saisie2.delete(0, END)
zone_de_saisie3.delete(0, END)
zone_de_saisie4.delete(0, END)
messagebox.showinfo("Information", "vous devez entrer des nombres entiers")
- Fonction Reed Salomon ( création des octets de vérification)
from tkinter import messagebox, Entry, Label, Button, Tk, END, Canvas
# liste des données saisies dans les champs
liste = []
# algorithme de reed Salomon pour codes erreurs
def reed_Salomon(liste_3_codewords):
# sequence A^i dans GF(256)
PP = 301
A = [0]*256;
A[0]=1;
for i in range(1,256):
A[i] = A[i-1] << 1
if A[i] > 255:
A[i] ^= PP
# table Multiplication : A^i * A^j = A^(i+j)
n=256
mul = [[0] * n for _ in range(n)]
for j in range(256):
for i in range(256):
mul[A[i]][A[j]] = A[(i+j) % 255]
#print(mul)
# coeffcient du polynome générateur
G = [1,62,111,15,48,228]
# degré du polynome de correction
d = len(G) -1
# 3 premiers codewords
#entree = [142, 164, 186]
#entree(x) = Q(x)*G(x) + R(x)
#fabrication de RX par division longue
R = liste_3_codewords.copy()
R.append(0)
R.append(0)
R.append(0)
#print(R)
for j in range(len(liste_3_codewords)):
q = R[0]
#print("q=", q)
for i in range(d):
R[i] = R[i+1] ^ mul[q][G[i+1]]
#print(R)
if j+d+1 < len(liste_3_codewords):
R[d] = liste_3_codewords[j+d+1]
else:
R[d] = 0
# R = Arrays.copyOf(R, d); // keep first d digits or R
R = R[:5]
return R
# fonction de récupération des champs et calcul des codewords
def ajout_liste():
try:
global c
nombre1 = int(zone_de_saisie1.get())
liste.append(nombre1)
nombre2 = int(zone_de_saisie2.get())
liste.append(nombre2)
nombre3 = int(zone_de_saisie3.get())
liste.append(nombre3)
# calcul des 3 codewords demandés
codeword1 = nombre1 + 130
codeword2 = nombre2 + 130
codeword3 = nombre3 + 130
liste_3_codewords = [codeword1,codeword2, codeword3]
print("les codewords demandés:", liste_3_codewords)
# calcul des 5 codewords de contrôle erreurs avec la fonction reed_Salomon(...)
liste_5_codewords = reed_Salomon(liste_3_codewords)
print("les codewords de correction d'erreur:", liste_5_codewords)
# dessin d'une case noire
c.create_rectangle( 150, 200, 100, 150, width=1, fill='black')
except:
zone_de_saisie1.delete(0, END)
zone_de_saisie2.delete(0, END)
zone_de_saisie3.delete(0, END)
zone_de_saisie4.delete(0, END)
messagebox.showinfo("Information", "vous devez entrer des nombres entiers")
# définition de la fenêtre
fen = Tk()
fen.geometry("1000x700")
fen.title("Générateur de datamatrix")
fen.resizable(width=False, height=False)
lbl_espace0 = Label(fen, text=' ').grid(row=0, column=0)
lbl_nombre1 = Label(fen, text=' code_word_1').grid(row=0, column=1)
lbl_espace0 = Label(fen, text=' ').grid(row=0, column=2)
lbl_nombre2 = Label(fen, text=' code_word_2').grid(row=0, column=3)
lbl_espace0 = Label(fen, text=' ').grid(row=0, column=4)
lbl_nombre3 = Label(fen, text=' code_word_3').grid(row=0, column=5)
zone_de_saisie1 = Entry(fen, width=10)
zone_de_saisie1.grid(row=1, column=1)
zone_de_saisie2 = Entry(fen, width=10)
zone_de_saisie2.grid(row=1, column=3)
zone_de_saisie3 = Entry(fen, width=10)
zone_de_saisie3.grid(row=1, column=5)
lbl_trier = Label(fen, text=' ').grid(row=2, column=1)
mon_bouton_bulle = Button(fen, text='Dessiner',command=ajout_liste)
mon_bouton_bulle.grid(row=3, column=1)
lbl_espace0 = Label(fen, text=' ').grid(row=4, column=0)
# canevas de 500 pixels par 500 pixels
c = Canvas(fen, width="500", height="500", bg='white')
# positionnement canvas dans fenêtre
c.grid(row=5, column=1, rowspan=10, columnspan=10, sticky='NW')
# tour canevas en noir
c.create_rectangle( 2, 2, 500, 500, width=1, fill='white')
# grille pour dessiner le datamatrix
for x in range(10):
# traits verticaux noirs
c.create_line(x*50, 2, x*50,500, width=1, fill='black')
# carrés noirs de la première ligne
if x*100 < 500:
c.create_rectangle( x*100, 0, 50 + x*100 , 50, width=1, fill='black')
for y in range(10):
# traits horizontaux noirs
c.create_line( 2, y*50, 500, y*50, width=1, fill='black')
# carrés noirs de la dernière colonne
if y*100 < 450:
c.create_rectangle(450, y*100 + 50 , 500, y*100 + 100, width=1, fill='black')
# tour noir première colonne et dernière ligne
c.create_rectangle( 0, 0, 50, 500, width=1, fill='black')
c.create_rectangle( 0, 450, 500, 500, width=1, fill='black')
c.create_rectangle( 0, 450, 500, 500, width=1, fill='black')
# affichage fenetre et prise en compte des messages Windows
fen.mainloop()
Créé avec HelpNDoc Personal Edition: Produire facilement des livres électroniques Kindle