| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- #from __future__ import unicode_literals
- # -*- coding: utf-8 -*-
- from __future__ import division
- import os
- from PyQt4.QtCore import *
- from PyQt4.QtGui import *
- class VueEditionForme(QGraphicsScene):
- """vue graphique permettant d'afficher et de modifier la forme des creatures/decors"""
- def __init__(self, fenetre, formeCases="H", parent=None):
- super(VueEditionForme, self).__init__()
- self.fenetre = fenetre
- self.pixGraphique = None
- self.text = None
- self.largeurOriginale = 0
- self.hauteurOriginale = 0
- self.rotation = 0
- self.cases = {}
- self.formeCases = formeCases
- def creer(self):
- #cree les cases hexagonales
- for x in range(-5,6):
- for y in range(-5,6):
- if self.formeCases == "H":
- if 1 == (x % 2):
- y += 0.5
- c = CaseEditionForme(self)
- c.creer(x, y, self.formeCases)
- self.cases[(x,y)] = c
-
- self.fenetre.ui.vueForme.setScene(self)
- self.fenetre.ui.vueForme.centerOn(self.fenetre.ui.vueForme.mapFromScene(QPointF(60,60))) #centre la vue sur la case 0,0
- self.fenetre.ui.vueForme.scale(0.25, 0.25)
-
- def formeDef(self):
- """liste definissant la forme"""
- retour = []
- for coord in self.cases:
- if self.cases[coord].estSelectionnee and coord != (0,0):
- retour.append(coord)
- return retour
- def majForme(self, formeDef):
- """met a jour la forme sur le graphique"""
- if formeDef:
- for coord in formeDef:
- if coord in self.cases:
- self.cases[coord].estSelectionnee = True
- self.cases[coord].setBrush(QColor("red"))
- def majTexte(self, txt, taillePolice = 20, gras = False, dx = 0, dy = 0, rotation = 0):
- if len(txt) > 0:
- if not self.text:
- self.text = QGraphicsSimpleTextItem()
- self.addItem(self.text)
- self.text.setText(QString.fromUtf8("1."+txt))
- self.text.setPos(QPointF(dx-0.112*120, dy-0.275*120))
- police = QFont("Georgia", taillePolice)
- police.setBold(gras)
- self.text.setFont(police)
- self.text.setRotation(rotation)
- else:
- if self.text:
- self.removeItem(self.text)
- def majImage(self, img, kx = 10, ky = 10, dx = 0, dy = 0, rotation = 0, imgPivote = False, masqueAuto = False):
- if len(img) > 0:
- pix = QPixmap(QString.fromUtf8("img\\"+img))
- if not pix.isNull():
- if masqueAuto == True:
- pix.setMask(pix.createHeuristicMask())
- if not self.pixGraphique:
- self.pixGraphique = QGraphicsPixmapItem()
- self.addItem(self.pixGraphique)
- self.pixGraphique.setZValue(10)
- if pix.height() >= pix.width():
- pix = pix.scaledToHeight(120*0.9, Qt.SmoothTransformation)
- else:
- pix = pix.scaledToWidth(120*0.9, Qt.SmoothTransformation)
- self.largeurOriginale = pix.width()
- self.hauteurOriginale = pix.height()
- pix = pix.scaled((kx/10)*self.largeurOriginale, (ky/10)*self.hauteurOriginale, Qt.IgnoreAspectRatio, Qt.SmoothTransformation)
- deltaX = dx + 0.5*(120*1.1544 - self.largeurOriginale)
- deltaY = dy + 0.5*(120 - self.hauteurOriginale)
-
- self.pixGraphique.setPixmap(pix)
- self.pixGraphique.setPos(QPointF(deltaX, deltaY))
- self.pixGraphique.setRotation(rotation)
- else:
- if self.pixGraphique:
- self.removeItem(self.pixGraphique)
- def majSelection(self, coord):
- """met a jour l'affichage des cases selectionnees pour l'affichage de la forme"""
- if self.cases[coord].estSelectionnee == True:
- self.cases[coord].estSelectionnee = False
- valide = True
- for coordVerif in self.cases:
- #on parcourt les autres cases selectionnees
- if coordVerif != (0,0) and coordVerif != coord and self.cases[coordVerif].estSelectionnee == True:
- #on liste les cases connectees a cette case, de proche en proche
- connectees = [coordVerif]
- for coordVerif2 in connectees:
- for coordVoisin in self.cases[coordVerif2].voisins:
- if coordVoisin in self.cases and not coordVoisin in connectees:
- if self.cases[coordVoisin].estSelectionnee:
- connectees.append(coordVoisin)
- if not (0,0) in connectees:
- valide = False
- break
- if valide == True:
- self.cases[coord].setBrush(QColor("white"))
- else:
- self.cases[coord].estSelectionnee = True
- else:
- #on s'assure que la case est bien adjacente a une case selectionnee
- valide = False
- for coordVerif in self.cases[coord].voisins:
- if coordVerif in self.cases:
- if self.cases[coordVerif].estSelectionnee == True:
- valide = True
- break
- if valide:
- self.cases[coord].estSelectionnee = True
- self.cases[coord].setBrush(QColor("red"))
- class CaseEditionForme(QGraphicsPolygonItem):
- """case utilisee dans une VueEditionForme()"""
- def __init__(self, vueForme, parent=None):
- super(CaseEditionForme, self).__init__()
- self.vue = vueForme
- self.position = (0,0)
- self.estSelectionnee = False
- self.voisins = []
-
- #interactions graphiques
- self.setFlag(QGraphicsItem.ItemIsFocusable)
- self.setAcceptHoverEvents(True)
- #self.setAcceptDrops(True)
- def creer(self, x, y, formeCases="H"):
- """creation du polygone et enregistrement des donnees geometriques"""
- self.position = (x, y)
- polygone = QPolygonF()
- if self.vue.formeCases == "H":
- polygone << QPointF(((x*0.866)+0.2886)*120, y*120) \
- << QPointF(((x*0.866)+0.866)*120, y*120) \
- << QPointF(((x*0.866)+1.1547)*120, (y+0.5)*120) \
- << QPointF(((x*0.866)+0.866)*120, (y+1)*120) \
- << QPointF(((x*0.866)+0.2886)*120, (y+1)*120) \
- << QPointF( (x*0.866)*120, (y+0.5)*120)
- else:
- polygone << QPointF(x*120, y*120) \
- << QPointF((x+1)*120, y*120) \
- << QPointF((x+1)*120, (y+1)*120) \
- << QPointF(x*120, (y+1)*120)
- self.setPolygon(polygone)
- #enregistrement des cases voisines:
- if self.vue.formeCases == "H":
- self.voisins.append((x, y+1))
- self.voisins.append((x, y-1))
- self.voisins.append((x-1, y+0.5))
- self.voisins.append((x-1, y-0.5))
- self.voisins.append((x+1, y+0.5))
- self.voisins.append((x+1, y-0.5))
- else:
- self.voisins.append((x, y-1))
- self.voisins.append((x, y+1))
- self.voisins.append((x-1, y))
- self.voisins.append((x+1, y))
- #pour afficher les coordonnees des cases:
- #text = QGraphicsSimpleTextItem("{}-{}".format(x,y), parent=self)
- #police = QFont()
- #police.setPointSize(20)
- #text.setFont(police)
- #text.setPos(QPointF(((x*0.866)+0.2886)*120, y*120))
- #couleur de fond par defaut
- if self.position == (0, 0):
- self.setBrush(QColor("purple"))
- self.estSelectionnee = True
- else:
- self.setBrush(QColor("white"))
- #creation de l'objet graphique sur le plateau
- self.vue.addItem(self)
- def mousePressEvent(self, event):
- """evenement lors du clic souris"""
- super(CaseEditionForme, self).mousePressEvent(event)
- if event.button() == 1: #sur clic gauche
- if self.position != (0, 0):
- self.vue.majSelection(self.position)
|