EditionForme.py 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. #from __future__ import unicode_literals
  2. # -*- coding: utf-8 -*-
  3. from __future__ import division
  4. import os
  5. from PyQt4.QtCore import *
  6. from PyQt4.QtGui import *
  7. class VueEditionForme(QGraphicsScene):
  8. """vue graphique permettant d'afficher et de modifier la forme des creatures/decors"""
  9. def __init__(self, fenetre, formeCases="H", parent=None):
  10. super(VueEditionForme, self).__init__()
  11. self.fenetre = fenetre
  12. self.pixGraphique = None
  13. self.text = None
  14. self.largeurOriginale = 0
  15. self.hauteurOriginale = 0
  16. self.rotation = 0
  17. self.cases = {}
  18. self.formeCases = formeCases
  19. def creer(self):
  20. #cree les cases hexagonales
  21. for x in range(-5,6):
  22. for y in range(-5,6):
  23. if self.formeCases == "H":
  24. if 1 == (x % 2):
  25. y += 0.5
  26. c = CaseEditionForme(self)
  27. c.creer(x, y, self.formeCases)
  28. self.cases[(x,y)] = c
  29. self.fenetre.ui.vueForme.setScene(self)
  30. self.fenetre.ui.vueForme.centerOn(self.fenetre.ui.vueForme.mapFromScene(QPointF(60,60))) #centre la vue sur la case 0,0
  31. self.fenetre.ui.vueForme.scale(0.25, 0.25)
  32. def formeDef(self):
  33. """liste definissant la forme"""
  34. retour = []
  35. for coord in self.cases:
  36. if self.cases[coord].estSelectionnee and coord != (0,0):
  37. retour.append(coord)
  38. return retour
  39. def majForme(self, formeDef):
  40. """met a jour la forme sur le graphique"""
  41. if formeDef:
  42. for coord in formeDef:
  43. if coord in self.cases:
  44. self.cases[coord].estSelectionnee = True
  45. self.cases[coord].setBrush(QColor("red"))
  46. def majTexte(self, txt, taillePolice = 20, gras = False, dx = 0, dy = 0, rotation = 0):
  47. if len(txt) > 0:
  48. if not self.text:
  49. self.text = QGraphicsSimpleTextItem()
  50. self.addItem(self.text)
  51. self.text.setText(QString.fromUtf8("1."+txt))
  52. self.text.setPos(QPointF(dx-0.112*120, dy-0.275*120))
  53. police = QFont("Georgia", taillePolice)
  54. police.setBold(gras)
  55. self.text.setFont(police)
  56. self.text.setRotation(rotation)
  57. else:
  58. if self.text:
  59. self.removeItem(self.text)
  60. def majImage(self, img, kx = 10, ky = 10, dx = 0, dy = 0, rotation = 0, imgPivote = False, masqueAuto = False):
  61. if len(img) > 0:
  62. pix = QPixmap(QString.fromUtf8("img\\"+img))
  63. if not pix.isNull():
  64. if masqueAuto == True:
  65. pix.setMask(pix.createHeuristicMask())
  66. if not self.pixGraphique:
  67. self.pixGraphique = QGraphicsPixmapItem()
  68. self.addItem(self.pixGraphique)
  69. self.pixGraphique.setZValue(10)
  70. if pix.height() >= pix.width():
  71. pix = pix.scaledToHeight(120*0.9, Qt.SmoothTransformation)
  72. else:
  73. pix = pix.scaledToWidth(120*0.9, Qt.SmoothTransformation)
  74. self.largeurOriginale = pix.width()
  75. self.hauteurOriginale = pix.height()
  76. pix = pix.scaled((kx/10)*self.largeurOriginale, (ky/10)*self.hauteurOriginale, Qt.IgnoreAspectRatio, Qt.SmoothTransformation)
  77. deltaX = dx + 0.5*(120*1.1544 - self.largeurOriginale)
  78. deltaY = dy + 0.5*(120 - self.hauteurOriginale)
  79. self.pixGraphique.setPixmap(pix)
  80. self.pixGraphique.setPos(QPointF(deltaX, deltaY))
  81. self.pixGraphique.setRotation(rotation)
  82. else:
  83. if self.pixGraphique:
  84. self.removeItem(self.pixGraphique)
  85. def majSelection(self, coord):
  86. """met a jour l'affichage des cases selectionnees pour l'affichage de la forme"""
  87. if self.cases[coord].estSelectionnee == True:
  88. self.cases[coord].estSelectionnee = False
  89. valide = True
  90. for coordVerif in self.cases:
  91. #on parcourt les autres cases selectionnees
  92. if coordVerif != (0,0) and coordVerif != coord and self.cases[coordVerif].estSelectionnee == True:
  93. #on liste les cases connectees a cette case, de proche en proche
  94. connectees = [coordVerif]
  95. for coordVerif2 in connectees:
  96. for coordVoisin in self.cases[coordVerif2].voisins:
  97. if coordVoisin in self.cases and not coordVoisin in connectees:
  98. if self.cases[coordVoisin].estSelectionnee:
  99. connectees.append(coordVoisin)
  100. if not (0,0) in connectees:
  101. valide = False
  102. break
  103. if valide == True:
  104. self.cases[coord].setBrush(QColor("white"))
  105. else:
  106. self.cases[coord].estSelectionnee = True
  107. else:
  108. #on s'assure que la case est bien adjacente a une case selectionnee
  109. valide = False
  110. for coordVerif in self.cases[coord].voisins:
  111. if coordVerif in self.cases:
  112. if self.cases[coordVerif].estSelectionnee == True:
  113. valide = True
  114. break
  115. if valide:
  116. self.cases[coord].estSelectionnee = True
  117. self.cases[coord].setBrush(QColor("red"))
  118. class CaseEditionForme(QGraphicsPolygonItem):
  119. """case utilisee dans une VueEditionForme()"""
  120. def __init__(self, vueForme, parent=None):
  121. super(CaseEditionForme, self).__init__()
  122. self.vue = vueForme
  123. self.position = (0,0)
  124. self.estSelectionnee = False
  125. self.voisins = []
  126. #interactions graphiques
  127. self.setFlag(QGraphicsItem.ItemIsFocusable)
  128. self.setAcceptHoverEvents(True)
  129. #self.setAcceptDrops(True)
  130. def creer(self, x, y, formeCases="H"):
  131. """creation du polygone et enregistrement des donnees geometriques"""
  132. self.position = (x, y)
  133. polygone = QPolygonF()
  134. if self.vue.formeCases == "H":
  135. polygone << QPointF(((x*0.866)+0.2886)*120, y*120) \
  136. << QPointF(((x*0.866)+0.866)*120, y*120) \
  137. << QPointF(((x*0.866)+1.1547)*120, (y+0.5)*120) \
  138. << QPointF(((x*0.866)+0.866)*120, (y+1)*120) \
  139. << QPointF(((x*0.866)+0.2886)*120, (y+1)*120) \
  140. << QPointF( (x*0.866)*120, (y+0.5)*120)
  141. else:
  142. polygone << QPointF(x*120, y*120) \
  143. << QPointF((x+1)*120, y*120) \
  144. << QPointF((x+1)*120, (y+1)*120) \
  145. << QPointF(x*120, (y+1)*120)
  146. self.setPolygon(polygone)
  147. #enregistrement des cases voisines:
  148. if self.vue.formeCases == "H":
  149. self.voisins.append((x, y+1))
  150. self.voisins.append((x, y-1))
  151. self.voisins.append((x-1, y+0.5))
  152. self.voisins.append((x-1, y-0.5))
  153. self.voisins.append((x+1, y+0.5))
  154. self.voisins.append((x+1, y-0.5))
  155. else:
  156. self.voisins.append((x, y-1))
  157. self.voisins.append((x, y+1))
  158. self.voisins.append((x-1, y))
  159. self.voisins.append((x+1, y))
  160. #pour afficher les coordonnees des cases:
  161. #text = QGraphicsSimpleTextItem("{}-{}".format(x,y), parent=self)
  162. #police = QFont()
  163. #police.setPointSize(20)
  164. #text.setFont(police)
  165. #text.setPos(QPointF(((x*0.866)+0.2886)*120, y*120))
  166. #couleur de fond par defaut
  167. if self.position == (0, 0):
  168. self.setBrush(QColor("purple"))
  169. self.estSelectionnee = True
  170. else:
  171. self.setBrush(QColor("white"))
  172. #creation de l'objet graphique sur le plateau
  173. self.vue.addItem(self)
  174. def mousePressEvent(self, event):
  175. """evenement lors du clic souris"""
  176. super(CaseEditionForme, self).mousePressEvent(event)
  177. if event.button() == 1: #sur clic gauche
  178. if self.position != (0, 0):
  179. self.vue.majSelection(self.position)