def __init__(self): Tk.__init__(self) # Liste des formes crees self.map = {} self.mapGroupe = {} self.nbFormes = 0 self.PeutDessiner = FALSE self.tabpoints = [None] * 2 self.i = 0 self.j = 0 self.GroupeActif = -1 # Fenetre self.root = self self.root.title("Formes") formes = [dessinerRectangle, dessinerEllipse, dessinerSegment, dessinerPolygone] self.fabrique = Fabrique() for forme in formes: self.fabrique.ajouter_forme(forme) # Barre d'outils toolbar = Frame(self.root) toolbar.pack(expand=YES, fill=X, side=TOP) propriete = Frame(self.root) propriete.pack(expand=YES, fill=X, side=RIGHT) self.color_name = "white" rows = [] cols = [] self.forme_active = None self.idForme = None self.zoom = 0 # Labels a droite ln = Label(propriete, text="Nom") ln.grid(row=0, column=0, sticky=NSEW) self.Valeur_entry_nom = StringVar() self.entry_droite_name = Entry(propriete, textvariable=self.Valeur_entry_nom) self.entry_droite_name.grid(row=0, column=1, sticky=NSEW) lc = Label(propriete, text="Couleur de la forme") lc.grid(row=1, column=0, sticky=NSEW) self.label_droite_couleur = Label(propriete) self.label_droite_couleur.grid(row=1, column=1, sticky=NSEW) lp1 = Label(propriete, text="Point1 (X,Y)") lp1.grid(row=2, column=0, sticky=NSEW) self.Valeur_entry_point1 = StringVar() self.entry_droite_point1 = Entry(propriete, textvariable=self.Valeur_entry_point1) self.entry_droite_point1.grid(row=2, column=1, sticky=NSEW) lp2 = Label(propriete, text="Point2 (X,Y)") lp2.grid(row=3, column=0, sticky=NSEW) self.Valeur_entry_point2 = StringVar() self.entry_droite_point2 = Entry(propriete, textvariable=self.Valeur_entry_point2) self.entry_droite_point2.grid(row=3, column=1, sticky=NSEW) lhauteur = Label(propriete, text="Hauteur") lhauteur.grid(row=4, column=0, sticky=NSEW) self.Valeur_entry_hauteur = StringVar() self.entry_droite_hauteur = Entry(propriete, textvariable=self.Valeur_entry_hauteur) self.entry_droite_hauteur.grid(row=4, column=1, sticky=NSEW) llargeur = Label(propriete, text="Largeur") llargeur.grid(row=5, column=0, sticky=NSEW) self.Valeur_entry_largeur = StringVar() self.entry_droite_largeur = Entry(propriete, textvariable=self.Valeur_entry_largeur) self.entry_droite_largeur.grid(row=5, column=1, sticky=NSEW) lz = Label(propriete, text="Zoom") lz.grid(row=6, column=0, sticky=NSEW) self.Valeur_entry_zoom = StringVar() self.Valeur_entry_zoom.set(self.zoom.__str__()) self.entry_droite_zoom = Entry(propriete, textvariable=self.Valeur_entry_zoom) self.entry_droite_zoom.grid(row=6, column=1, sticky=NSEW) lg = Label(propriete, text="Groupe") lg.grid(row=7, column=0, sticky=NSEW) self.Valeur_groupe = StringVar() self.listeGroupes = [""] self.comboBoxGroupe = Combobox( propriete, textvariable=self.Valeur_groupe, values=self.listeGroupes, state="readonly" ) self.comboBoxGroupe.grid(row=7, column=1, sticky=NSEW) self.comboBoxGroupe.bind("<<ComboboxSelected>>", self.onChangeCombobox) self.comboBoxGroupe.current(0) lga = Label(propriete, text="Groupe actif : ") lga.grid(row=8, column=0, sticky=NSEW) self.Valeur_labelgroupeactif = StringVar() lgroupeactif = Label( propriete, textvariable=self.Valeur_labelgroupeactif ) # valeur definie par Valeur_groupeactif lgroupeactif.grid(row=8, column=1, sticky=NSEW) cols.append(self.comboBoxGroupe) cols.append(self.entry_droite_name) cols.append(self.label_droite_couleur) cols.append(self.entry_droite_point1) cols.append(self.entry_droite_point2) rows.append(cols) # Boutons du haut self.bouton = [None] * 6 self.photos = [None] * 6 self.photos[0] = PhotoImage(file="images/cercle.png") self.bouton[0] = Button( toolbar, image=self.photos[0], command=lambda new_forme=Ellipses( "Ellipse ", Point(0, 0), Point(0, 0), self.color_name ): self.clic_btn_creation(new_forme), ) self.bouton[0].pack(side=LEFT) self.photos[1] = PhotoImage(file="images/rectangle.png") self.bouton[1] = Button( toolbar, image=self.photos[1], command=lambda new_forme=Rectangles( "Rectangle ", Point(0, 0), Point(0, 0), self.color_name ): self.clic_btn_creation(new_forme), ) self.bouton[1].pack(side=LEFT) self.photos[2] = PhotoImage(file="images/segment.png") self.bouton[2] = Button( toolbar, image=self.photos[2], command=lambda new_forme=Segments( "Segment ", Point(0, 0), Point(0, 0), self.color_name ): self.clic_btn_creation(new_forme), ) self.bouton[2].pack(side=LEFT) self.photos[3] = PhotoImage(file="images/triangle.png") self.bouton[3] = Button( toolbar, image=self.photos[3], command=lambda new_forme=Polygones( "Triangle ", Point(0, 0), Point(0, 0), self.color_name, 3, self.tabpoints ): self.clic_btn_creation(new_forme), ) self.bouton[3].pack(side=LEFT) self.photos[4] = PhotoImage(file="images/polygone.png") self.bouton[4] = Button(toolbar, image=self.photos[4]) self.bouton[4].pack(side=LEFT) self.bouton[4].bind("<ButtonPress-1>", lambda event, arg=toolbar: self.DefNombrePointsPolygone(event, arg)) self.photos[5] = PhotoImage(file="images/groupe.png") self.bouton[5] = Button(toolbar, image=self.photos[5], command=self.clic_btn_groupe) self.bouton[5].pack(side=LEFT) # Canvas self.cv = Canvas(width=640, height=480, bg="black") # self.colorList = ["blue", "red", "green", "white", "yellow", "magenta", "orange"] # Gestion des clics self.mouse_pressed = False self.cv.bind("<ButtonPress-1>", self.onMouseClic) self.cv.bind("<ButtonRelease-1>", self.onMouseUp) self.cv.bind("<Button1-Motion>", self.onMouseMove) self.cv.bind("<ButtonPress-3>", self.onClicZoom) self.cv.bind("<Button3-Motion>", self.onZoomMove) self.cv.bind("<Button-2>", self.onMouseMolette) self.root.bind("<Control-g>", self.selectionGroupe) self.root.bind("<Control-Up>", self.selectionSuperGroupe) # Entry self.entry_droite_name.bind("<Return>", self.modifByEdit) self.entry_droite_point1.bind("<Return>", self.modifByEdit) self.entry_droite_point2.bind("<Return>", self.modifByEdit) self.label_droite_couleur.bind("<ButtonPress-1>", self.changerCouleur) self.root.bind("<Delete>", self.supprimerForme) self.cv.pack()
class App(Tk): def __init__(self): Tk.__init__(self) # Liste des formes crees self.map = {} self.mapGroupe = {} self.nbFormes = 0 self.PeutDessiner = FALSE self.tabpoints = [None] * 2 self.i = 0 self.j = 0 self.GroupeActif = -1 # Fenetre self.root = self self.root.title("Formes") formes = [dessinerRectangle, dessinerEllipse, dessinerSegment, dessinerPolygone] self.fabrique = Fabrique() for forme in formes: self.fabrique.ajouter_forme(forme) # Barre d'outils toolbar = Frame(self.root) toolbar.pack(expand=YES, fill=X, side=TOP) propriete = Frame(self.root) propriete.pack(expand=YES, fill=X, side=RIGHT) self.color_name = "white" rows = [] cols = [] self.forme_active = None self.idForme = None self.zoom = 0 # Labels a droite ln = Label(propriete, text="Nom") ln.grid(row=0, column=0, sticky=NSEW) self.Valeur_entry_nom = StringVar() self.entry_droite_name = Entry(propriete, textvariable=self.Valeur_entry_nom) self.entry_droite_name.grid(row=0, column=1, sticky=NSEW) lc = Label(propriete, text="Couleur de la forme") lc.grid(row=1, column=0, sticky=NSEW) self.label_droite_couleur = Label(propriete) self.label_droite_couleur.grid(row=1, column=1, sticky=NSEW) lp1 = Label(propriete, text="Point1 (X,Y)") lp1.grid(row=2, column=0, sticky=NSEW) self.Valeur_entry_point1 = StringVar() self.entry_droite_point1 = Entry(propriete, textvariable=self.Valeur_entry_point1) self.entry_droite_point1.grid(row=2, column=1, sticky=NSEW) lp2 = Label(propriete, text="Point2 (X,Y)") lp2.grid(row=3, column=0, sticky=NSEW) self.Valeur_entry_point2 = StringVar() self.entry_droite_point2 = Entry(propriete, textvariable=self.Valeur_entry_point2) self.entry_droite_point2.grid(row=3, column=1, sticky=NSEW) lhauteur = Label(propriete, text="Hauteur") lhauteur.grid(row=4, column=0, sticky=NSEW) self.Valeur_entry_hauteur = StringVar() self.entry_droite_hauteur = Entry(propriete, textvariable=self.Valeur_entry_hauteur) self.entry_droite_hauteur.grid(row=4, column=1, sticky=NSEW) llargeur = Label(propriete, text="Largeur") llargeur.grid(row=5, column=0, sticky=NSEW) self.Valeur_entry_largeur = StringVar() self.entry_droite_largeur = Entry(propriete, textvariable=self.Valeur_entry_largeur) self.entry_droite_largeur.grid(row=5, column=1, sticky=NSEW) lz = Label(propriete, text="Zoom") lz.grid(row=6, column=0, sticky=NSEW) self.Valeur_entry_zoom = StringVar() self.Valeur_entry_zoom.set(self.zoom.__str__()) self.entry_droite_zoom = Entry(propriete, textvariable=self.Valeur_entry_zoom) self.entry_droite_zoom.grid(row=6, column=1, sticky=NSEW) lg = Label(propriete, text="Groupe") lg.grid(row=7, column=0, sticky=NSEW) self.Valeur_groupe = StringVar() self.listeGroupes = [""] self.comboBoxGroupe = Combobox( propriete, textvariable=self.Valeur_groupe, values=self.listeGroupes, state="readonly" ) self.comboBoxGroupe.grid(row=7, column=1, sticky=NSEW) self.comboBoxGroupe.bind("<<ComboboxSelected>>", self.onChangeCombobox) self.comboBoxGroupe.current(0) lga = Label(propriete, text="Groupe actif : ") lga.grid(row=8, column=0, sticky=NSEW) self.Valeur_labelgroupeactif = StringVar() lgroupeactif = Label( propriete, textvariable=self.Valeur_labelgroupeactif ) # valeur definie par Valeur_groupeactif lgroupeactif.grid(row=8, column=1, sticky=NSEW) cols.append(self.comboBoxGroupe) cols.append(self.entry_droite_name) cols.append(self.label_droite_couleur) cols.append(self.entry_droite_point1) cols.append(self.entry_droite_point2) rows.append(cols) # Boutons du haut self.bouton = [None] * 6 self.photos = [None] * 6 self.photos[0] = PhotoImage(file="images/cercle.png") self.bouton[0] = Button( toolbar, image=self.photos[0], command=lambda new_forme=Ellipses( "Ellipse ", Point(0, 0), Point(0, 0), self.color_name ): self.clic_btn_creation(new_forme), ) self.bouton[0].pack(side=LEFT) self.photos[1] = PhotoImage(file="images/rectangle.png") self.bouton[1] = Button( toolbar, image=self.photos[1], command=lambda new_forme=Rectangles( "Rectangle ", Point(0, 0), Point(0, 0), self.color_name ): self.clic_btn_creation(new_forme), ) self.bouton[1].pack(side=LEFT) self.photos[2] = PhotoImage(file="images/segment.png") self.bouton[2] = Button( toolbar, image=self.photos[2], command=lambda new_forme=Segments( "Segment ", Point(0, 0), Point(0, 0), self.color_name ): self.clic_btn_creation(new_forme), ) self.bouton[2].pack(side=LEFT) self.photos[3] = PhotoImage(file="images/triangle.png") self.bouton[3] = Button( toolbar, image=self.photos[3], command=lambda new_forme=Polygones( "Triangle ", Point(0, 0), Point(0, 0), self.color_name, 3, self.tabpoints ): self.clic_btn_creation(new_forme), ) self.bouton[3].pack(side=LEFT) self.photos[4] = PhotoImage(file="images/polygone.png") self.bouton[4] = Button(toolbar, image=self.photos[4]) self.bouton[4].pack(side=LEFT) self.bouton[4].bind("<ButtonPress-1>", lambda event, arg=toolbar: self.DefNombrePointsPolygone(event, arg)) self.photos[5] = PhotoImage(file="images/groupe.png") self.bouton[5] = Button(toolbar, image=self.photos[5], command=self.clic_btn_groupe) self.bouton[5].pack(side=LEFT) # Canvas self.cv = Canvas(width=640, height=480, bg="black") # self.colorList = ["blue", "red", "green", "white", "yellow", "magenta", "orange"] # Gestion des clics self.mouse_pressed = False self.cv.bind("<ButtonPress-1>", self.onMouseClic) self.cv.bind("<ButtonRelease-1>", self.onMouseUp) self.cv.bind("<Button1-Motion>", self.onMouseMove) self.cv.bind("<ButtonPress-3>", self.onClicZoom) self.cv.bind("<Button3-Motion>", self.onZoomMove) self.cv.bind("<Button-2>", self.onMouseMolette) self.root.bind("<Control-g>", self.selectionGroupe) self.root.bind("<Control-Up>", self.selectionSuperGroupe) # Entry self.entry_droite_name.bind("<Return>", self.modifByEdit) self.entry_droite_point1.bind("<Return>", self.modifByEdit) self.entry_droite_point2.bind("<Return>", self.modifByEdit) self.label_droite_couleur.bind("<ButtonPress-1>", self.changerCouleur) self.root.bind("<Delete>", self.supprimerForme) self.cv.pack() def DefNombrePointsPolygone(self, event, toolbar): self.data = IntVar() self.entry_nbpts_poly = Entry(toolbar, textvariable=self.data) self.entry_nbpts_poly.pack(side=RIGHT) self.labelnb = Label(toolbar, text="Nombre de points: ") self.labelnb.pack(side=RIGHT) self.entry_nbpts_poly.bind("<Return>", self.NewPoly) def NewPoly(self, event): self.tabpoints = [None] * (2 * (self.data.get() - 2)) new_forme = Polygones("Polygone ", Point(0, 0), Point(0, 0), self.color_name, self.data.get(), self.tabpoints) self.entry_nbpts_poly.destroy() self.labelnb.destroy() self.clic_btn_creation(new_forme) def changerCouleur(self, event): color = colorchooser.askcolor() self.color_name = color[1] self.label_droite_couleur.configure(background=self.color_name) if self.forme_active is not None: if self.GroupeActif != -1: # =========================================================== # #On colore tout le groupe actif # =========================================================== print("==================ColorationDuGroupe=" + self.GroupeActif.__str__() + "===========") print("MAP GROUPE = " + self.mapGroupe.__str__()) copie = deepcopy(self.forme_active) for id in self.mapGroupe[self.GroupeActif].listeforme: # MAJ des objets self.map[id]._set_couleur(self.color_name) # Maj du Canvas self.regenererForme(id) else: self.forme_active._set_couleur(self.color_name) self.regenererForme() print("Changement de couleur entry_droite_name : ", self.color_name) def onMouseMolette(self, event): self.coordPoint = Point(event.x, event.y) if self.i == self.forme_active._get_nbpoints() - 1: self.tabpoints[len(self.tabpoints) - 2] = self.coordPoint.x self.tabpoints[len(self.tabpoints) - 1] = self.coordPoint.y print(self.tabpoints) self.forme_active.maj( Point(self.coordpoint1.x, self.coordpoint1.y), Point(self.coordpoint2.x, self.coordpoint2.y), self.forme_active._get_nbpoints(), self.tabpoints, ) self.forme_active.write() self.idForme = self.fabrique.fabriquer_forme(self.forme_active, self.cv) self.map[self.idForme] = self.forme_active self.majEntry() self.i = 0 self.j = 0 self.tabpoints = [None] * 2 else: if self.i == 0: self.coordpoint1 = self.coordPoint if self.i == 1: self.coordpoint2 = self.coordPoint if self.i > 1: self.tabpoints[self.j] = self.coordPoint.x self.tabpoints[self.j + 1] = self.coordPoint.y self.j = self.j + 2 self.i = self.i + 1 def supprimerForme(self, event): items = self.cv.find_withtag("current") # Si on selectionne une forme if len(items): if self.map[self.idForme]._groupe != -1: self.mapGroupe[self.map[self.idForme]._groupe]._supprimer_forme(self.idForme) del self.map[self.idForme] self.cv.delete(self.root, self.idForme) self.idForme = None self.majEntry() self.root.update() def regenererForme(self, id=None): if id is not None: # id en parametre self.cv.delete(self.root, id) self.map[id].write() newIdForme = self.fabrique.fabriquer_forme(self.map[id], self.cv) self.map[newIdForme] = deepcopy(self.map[id]) # MAJ map del self.map[id] print("regeneration" + id.__str__()) self.map[newIdForme]._set_nom(self.entry_droite_name.get()) # MAJ mapGroupe del self.mapGroupe[self.GroupeActif].listeforme[id] self.mapGroupe[self.GroupeActif].listeforme[newIdForme] = 1 self.root.update() else: # id pas defini self.cv.delete(self.root, self.idForme) self.forme_active.write() newIdForme = self.fabrique.fabriquer_forme(self.forme_active, self.cv) self.map[newIdForme] = deepcopy(self.map[self.idForme]) # MAJ map del self.map[self.idForme] print("regeneration" + self.idForme.__str__()) self.idForme = newIdForme self.map[self.idForme]._set_nom(self.entry_droite_name.get()) self.forme_active = self.map[self.idForme] self.root.update() def modifByEdit(self, event): # active les ENTRY si une forme est selectionne if self.forme_active._get_nom() != "": self.forme_active._set_couleur(self.color_name) pos = self.entry_droite_point1.get().find(",") difference = [ self.forme_active._get_point1()._get_x() - (int(self.entry_droite_point1.get()[0:pos])), self.forme_active._get_point1()._get_y() - int(self.entry_droite_point1.get()[pos + 1 : len(self.entry_droite_point1.get())]), ] self.forme_active._set_point1( Point( int(self.entry_droite_point1.get()[0:pos]), int(self.entry_droite_point1.get()[pos + 1 : len(self.entry_droite_point1.get())]), ) ) self.forme_active._set_point2( Point( self.forme_active._get_point2()._get_x() - difference[0], self.forme_active._get_point2()._get_y() - difference[1], ) ) self.x1, self.y1 = self.entry_droite_point1.get(), self.entry_droite_point2.get() self.regenererForme() self.majEntry() print("modif") def majEntry(self): if self.idForme is not None and self.GroupeActif == -1: # FORME SIMPLE print("=========majEntry=========") print("IDFORME :" + self.idForme.__str__()) print("MAP: " + self.map.__str__()) print("FORMEACTIVE: " + self.forme_active._get_nom()) # nom self.Valeur_entry_nom.set(self.map[self.idForme]._get_nom()) # couleur self.label_droite_couleur.configure(background=self.map[self.idForme]._get_couleur()) # point1 self.Valeur_entry_point1.set( self.map[self.idForme]._get_point1()._get_x().__str__() + "," + self.map[self.idForme]._get_point1()._get_y().__str__() ) # point2 self.Valeur_entry_point2.set( self.map[self.idForme]._get_point2()._get_x().__str__() + "," + self.map[self.idForme]._get_point2()._get_y().__str__() ) # hauteur self.Valeur_entry_hauteur.set(self.map[self.idForme]._get_hauteur().__str__()) # largeur self.Valeur_entry_largeur.set(self.map[self.idForme]._get_largeur().__str__()) # liste deroulante if self.map[self.idForme]._groupe != -1: self.comboBoxGroupe.current(self.map[self.idForme]._groupe) else: self.comboBoxGroupe.current(0) elif self.GroupeActif != -1: print("GROUPE ACTIF") self.Valeur_entry_nom.set(self.mapGroupe[self.GroupeActif]._get_nom()) # couleur self.label_droite_couleur.configure(background=self.map[self.idForme]._get_couleur()) # point1 self.Valeur_entry_point1.set( self.map[self.idForme]._get_point1()._get_x().__str__() + "," + self.map[self.idForme]._get_point1()._get_y().__str__() ) # point2 self.Valeur_entry_point2.set( self.map[self.idForme]._get_point2()._get_x().__str__() + "," + self.map[self.idForme]._get_point2()._get_y().__str__() ) # hauteur self.Valeur_entry_hauteur.set(self.map[self.idForme]._get_hauteur().__str__()) # largeur self.Valeur_entry_largeur.set(self.map[self.idForme]._get_largeur().__str__()) # liste deroulante if self.mapGroupe[self.map[self.idForme]._groupe]._groupe != -1: self.comboBoxGroupe.current(self.mapGroupe[self.map[self.idForme]._groupe]._groupe) else: self.comboBoxGroupe.current(0) else: print("AUCUNE SELECTION") self.Valeur_entry_nom.set("") self.label_droite_couleur.configure(background="") self.Valeur_entry_point1.set("") self.Valeur_entry_point2.set("") self.Valeur_entry_hauteur.set("") self.Valeur_entry_largeur.set("") self.comboBoxGroupe.current(0) # zoom if self.zoom > 0: self.Valeur_entry_zoom.set("+" + self.zoom.__str__()) else: self.Valeur_entry_zoom.set(self.zoom.__str__()) # groupe actif ou pas if self.GroupeActif == -1: self.Valeur_labelgroupeactif.set("Aucun") else: self.Valeur_labelgroupeactif.set(self.mapGroupe[self.GroupeActif]._get_nom()) def onMouseClic(self, event): items = self.cv.find_withtag("current") self.ClicGauche_depart = Point(event.x, event.y) if len(items): print("selection forme") self.idForme = items[0] self.forme_active = self.map[self.idForme] # dessiner le contour de selection print("MAP: " + self.map.__str__()) print("ID: " + self.idForme.__str__()) print("NOM: " + self.forme_active._get_nom()) self.majEntry() else: try: print("dessinDown") if self.PeutDessiner: # id de la forme sur le canvas self.forme_active.maj(Point(event.x, event.y), Point(event.x, event.y)) self.forme_active.write() self.idForme = self.fabrique.fabriquer_forme(self.forme_active, self.cv) self.map[self.idForme] = self.forme_active else: # Deselection de tout self.GroupeActif = -1 self.majEntry() except: pass # ne rien faire quand aucune action est selectionnee (clic dans le vide) # self.root.update() def onMouseUp(self, event): if self.PeutDessiner: self.PeutDessiner = FALSE print("lache") # bouge la souris + clic gauche def onMouseMove(self, event): self.ClicGauche_fin = Point(event.x, event.y) print("DEPART: " + self.ClicGauche_depart._get_x().__str__() + ", " + self.ClicGauche_depart._get_y().__str__()) print("FIN: " + self.ClicGauche_fin._get_x().__str__() + ", " + self.ClicGauche_fin._get_y().__str__()) # Recupere la forme selectionnee items = self.cv.find_withtag("current") # Si on selectionne une forme if len(items): # Vecteur de deplacement X = 0 ou Y = 1 x_vecteur, y_vecteur = ( self.ClicGauche_fin.x - self.ClicGauche_depart.x, self.ClicGauche_fin.y - self.ClicGauche_depart.y, ) # difference entre anciennes et nouvelles coordonees (donc calcul du vecteur) print(self.cv.winfo_width().__str__()) # Gestion dans le cadre du canvas if (((self.map[self.idForme])._get_point1()._get_x() + x_vecteur) >= 0) and ( ((self.map[self.idForme])._get_point2()._get_x() + x_vecteur) <= self.cv.winfo_width() and (((self.map[self.idForme])._get_point1()._get_y() + y_vecteur) >= 0) and (((self.map[self.idForme])._get_point2()._get_y() + y_vecteur) <= self.cv.winfo_height()) ): print("entre a " + ((self.map[self.idForme])._get_point1()._get_x() + x_vecteur).__str__()) # ---------------- # TRANSLATION # ---------------- if self.GroupeActif != -1: # ===== GROUPE ========= On bouge tout le groupe de la forme active print("BOUGE le groupe de " + x_vecteur.__str__() + " , " + y_vecteur.__str__()) print("==================BougeTouteFormeDuGroupe=" + self.GroupeActif.__str__() + "===========") # On bouge tout le groupe de la forme en mouvement dans onMouseMove # if(self.GroupeActif is not None): print("MAP GROUPE = " + self.mapGroupe.__str__()) print("TRANSLATION GROUPE") # TRANSLATION du groupe self.mapGroupe[self.GroupeActif].translation(x_vecteur, y_vecteur) for id in self.mapGroupe[self.GroupeActif].listeforme: # Maj du Canvas self.cv.move(id, x_vecteur, y_vecteur) # TRANSLATION des autres lies for g in self.mapGroupe: # pour chaque groupe de la mapGroupe if self.GroupeActif == self.mapGroupe[g]._groupe: # si le groupe est lie a l'actuel self.mapGroupe[g].translation(x_vecteur, y_vecteur) for id in self.mapGroupe[g].listeforme: # Maj du Canvas self.cv.move(id, x_vecteur, y_vecteur) else: # On bouge que la forme elle-meme # MAJ Canvas self.cv.move(self.idForme, x_vecteur, y_vecteur) print("MAPmoove: " + self.map.__str__()) print("IDmoove: " + self.idForme.__str__()) print("NOMmoove: " + self.forme_active._get_nom()) print("VECTEURmoove: (" + x_vecteur.__str__() + "," + y_vecteur.__str__() + ")") print("EVENTmoove: (" + event.x.__str__() + "," + event.y.__str__() + ")") # MAJ OBJET self.map[self.idForme].translation(x_vecteur, y_vecteur) self.ClicGauche_depart = self.ClicGauche_fin self.majEntry() else: print("entre PAS a " + ((self.map[self.idForme])._get_point1()._get_x() - x_vecteur).__str__()) else: print("dessinMove") # modifie le dessin try: if self.PeutDessiner: print("NOMdown:" + self.forme_active._get_nom()) self.cv.delete(self.idForme) # supprime l'ancienne forme du canvas del self.map[self.idForme] # supprime l'ancinne forme de la map self.forme_active._set_point2(Point(event.x, event.y)) # MAJ forme active self.forme_active.maj(self.forme_active._get_point1(), self.forme_active._get_point2()) self.forme_active.write() self.idForme = self.fabrique.fabriquer_forme(self.forme_active, self.cv) self.map[self.idForme] = self.forme_active self.majEntry() except: pass # ne rien faire quand aucune action est selectionnee (clic dans le vide) def onClicZoom(self, event): print("Clic Droit " + event.x.__str__() + " ; " + event.y.__str__()) print("MAP: " + self.map.__str__()) self.ClicDroit_depart = Point(event.x, event.y) def onZoomMove(self, event): if self.idForme is not None: # -------------------------------- # ZOOM que par deplacement vertical # --------------------------------- if True: print( "===============Bouge clic2 Droit=================" + event.x.__str__() + " ; " + event.y.__str__() ) # recupere l'endroit actuel de la souris self.ClicDroit_fin = Point(event.x, event.y) # difference entre anciennes et nouvelles coordonees (donc calcul du vecteur) y_vecteur = self.ClicDroit_fin.y - self.ClicDroit_depart.y action = None # Zoom ou dezoom if y_vecteur < 0: action = False if y_vecteur > 0: action = True coef = 1.1 # 10% print("VECTEUR=" + y_vecteur.__str__()) print("zoom=" + self.zoom.__str__()) self.zoom = self.zoom + y_vecteur if action is not None: print("MAP AVANT: " + self.map.__str__()) i = self.idForme self.cv.delete(i) # supprime l'ancienne forme du canvas print("i=" + i.__str__()) self.forme_active = self.map[i] # copie intermediaire (forme_active a associer au CANVAS ) # ----------Deplace selon l'endroit du clic pour pouvoir choisir son endroit du zoom # Difference entre l'endroit du clic et le milieu de la forme # DistanceX = self.ClicDroit_fin._get_x() - self.forme_active._get_milieu()._get_x() # DistanceY = self.ClicDroit_fin._get_y() - self.forme_active._get_milieu()._get_y() # ------------------------------------------- # Action de zoom/dezoom sur une forme/groupe # ------------------------------------------- # MAJ des objets if self.GroupeActif != -1: # --------------- # GROUPE # --------------- print("ZOOM GROUPE") # ZOOM du groupe self.mapGroupe[self.GroupeActif].zoom(action, coef) # ZOOM des autres lies for g in self.mapGroupe: # pour chaque groupe de la mapGroupe if self.GroupeActif == self.mapGroupe[g]._groupe: # si le groupe est lie a l'actuel self.mapGroupe[g].zoom(action, coef) # MISE A JOUR DU GROUPE PARCOURU for index in self.mapGroupe[g].listeforme: self.cv.delete(index) # VISUEL:Dessine toutes les formes du groupe x = self.fabrique.fabriquer_forme(self.mapGroupe[g].listeforme[index], self.cv) # DONNEES self.map[x] = self.map[index] # MAJ de la mapGroupe car les id de map ont change mais pas ceux de mapgroupe self.majMapGroupe(index, x) # Suppression de l'ancienne forme del self.map[index] # Conserve la Forme selectionnee if index == self.idForme: self.idForme = x # MISE A JOUR DU GROUPE ACTUEL for index in self.mapGroupe[self.GroupeActif].listeforme: self.cv.delete(index) # VISUEL:Dessine toutes les formes du groupe x = self.fabrique.fabriquer_forme( self.mapGroupe[self.GroupeActif].listeforme[index], self.cv ) # DONNEES self.map[x] = self.map[index] # MAJ de la mapGroupe car les id de map ont change mais pas ceux de mapgroupe self.majMapGroupe(index, x) # Suppression de l'ancienne forme del self.map[index] # Conserve la Forme selectionnee if index == self.idForme: self.idForme = x else: # --------------- # FORME # --------------- self.forme_active.zoom(action, coef) # self.forme_active.translation( DistanceX - DistanceX * coef, DistanceY - DistanceY * coef)#Deplace selon le coef # Suppression de l'ancienne forme del self.map[i] # VISUEL: Dessine la forme active self.idForme = self.fabrique.fabriquer_forme(self.forme_active, self.cv) self.map[self.idForme] = self.forme_active r = self.idForme # MAJ de la mapGroupe car les id de map ont change mais pas ceux de mapgroupe self.majMapGroupe(i, r) if i == self.idForme: # Forme selectionnee self.idForme = r print("MAP APRES: " + self.map.__str__()) print("MAPGRP APRES: " + self.mapGroupe.__str__()) # self.idForme = r self.ClicDroit_depart = self.ClicDroit_fin self.majEntry() def clic_btn_creation(self, forme): self.PeutDessiner = TRUE print(forme) self.nbFormes = self.nbFormes + 1 type(forme).numero += 1 self.forme_active = deepcopy(forme) self.forme_active._set_nom(self.forme_active._get_nom() + type(forme).numero.__str__()) # self.forme_active._set_nom("Forme " + self.nbFormes.__str__()) print(Rectangles.numero.__str__()) print(type(forme).numero.__str__()) def clic_btn_groupe(self): rows = [] cols = [] self.fenetreGroupe = Toplevel() self.fenetreGroupe.resizable(False, False) self.fenetreGroupe.title("Nouvelle fenetre") labelGroupe = Label(self.fenetreGroupe, text="Entrez le nom du groupe") labelGroupe.grid(row=0, column=0, sticky=NSEW) entryGroupe = Entry(self.fenetreGroupe, justify="left") entryGroupe.grid(row=1, column=0, sticky=NSEW) entryGroupe.focus_set() # donne le focus a l'ouverture boutonGroupe = Button( self.fenetreGroupe, text="Creer le groupe", command=lambda: self.creerGroupe(entryGroupe.get()) ) boutonGroupe.grid(row=2, column=0) cols.append(entryGroupe) cols.append(boutonGroupe) rows.append(cols) def creerGroupe(self, groupe): self.fenetreGroupe.withdraw() self.listeGroupes.append(groupe) self.comboBoxGroupe.configure(values=self.listeGroupes) self.mapGroupe[len(self.listeGroupes) - 1] = FormesComposees( groupe, {} ) # listeforme de mapGroupe est un dictionnaire vide def onChangeCombobox(self, lol): if self.GroupeActif == -1: if self.comboBoxGroupe.current() != 0: # si un groupe selectionne dans la box print("allocation") if self.map[self.idForme]._groupe != -1: # si la forme a deja un groupe on la change de groupe self.mapGroupe[self.map[self.idForme]._groupe]._supprimer_forme(self.idForme) self.map[self.idForme]._groupe = -1 self.mapGroupe[self.comboBoxGroupe.current()]._ajouter_forme(self.idForme, self.map[self.idForme]) self.map[self.idForme]._groupe = self.comboBoxGroupe.current() print("MAPGROUPE= " + self.mapGroupe.__str__()) else: # si aucun groupe selectionne dans la box print("desallocation") if self.map[self.idForme]._groupe != -1: # on retire la forme du groupe self.mapGroupe[self.map[self.idForme]._groupe]._supprimer_forme(self.idForme) self.map[self.idForme]._groupe = -1 else: # Changement a tout un groupe if self.comboBoxGroupe.current() != 0: # Selection d'un groupe print("SUPERallocation") self.mapGroupe[ self.GroupeActif ]._groupe = self.comboBoxGroupe.current() # sous groupe du groupe selectionne # self.mapGroupe[self.comboBoxGroupe.current()]._ajouter_forme(self.GroupeActif, self.mapGroupe[self.GroupeActif]) #ajoute le groupe actif au groupe choisi else: # Desallocation d'un superGroupe print("SUPERdesalocation") self.mapGroupe[self.GroupeActif]._groupe = -1 def selectionGroupe(self, event): # appele par CtrlG # print("==================SelectionneTouteFormeDuGroupe============") if self.GroupeActif == -1: # Selection car aucun selectionne print("===Selection GROUPE car aucun selectionne") self.GroupeActif = self.map[self.idForme]._groupe else: print("===Deselection GROUPE") self.GroupeActif = -1 # deselectionne self.majEntry() def selectionSuperGroupe(self, event): if self.GroupeActif != -1 and self.mapGroupe[self.GroupeActif]._groupe != -1: print("===Selectionne superGROUPE car deja un selectionne et en plus forme appartient a un groupe") self.GroupeActif = self.mapGroupe[self.GroupeActif]._groupe self.majEntry() def majMapGroupe(self, idoriginal, nouvelid): # =========================================================== # MAJ de la mapGroupe car les id de map changent lors d'un dessin mais pas ceux de mapgroupe # =========================================================== for g in self.mapGroupe: # pour chaque groupe de la mapGroupe if any(idoriginal == val for val in self.mapGroupe[g].listeforme): # si la forme fait partie du groupe self.mapGroupe[g]._supprimer_forme(idoriginal) # supprime l'ancienne forme self.mapGroupe[g]._ajouter_forme(nouvelid, self.map[nouvelid])