00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 import wx
00017 from objects.logic.common.globalStrings import globalStrings
00018
00019
00020
00021
00022
00023
00024 class figureAxesWrapper():
00025
00026
00027
00028 def __init__(self, ax):
00029 self.axes = ax
00030
00031
00032 self.currentXAxis = None
00033 self.currentYAxis = None
00034
00035
00036 self.fullXAxis = None
00037 self.fullYAxis = None
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047 def getZoomFactor(self):
00048 return abs(self.currentYAxis[1] - self.currentYAxis[0])
00049
00050
00051
00052
00053
00054
00055
00056
00057 def getLonLatFromMouseXY(self, mouseX, mouseY, main_map):
00058 mouseMapX, mouseMapY = self.axes.transData.inverse_xy_tup( (mouseX,mouseY) )
00059 mouseMapX, mouseMapY = self.axes.transData.inverse_xy_tup( (mouseX,mouseY) )
00060
00061
00062
00063
00064 lon, lat = main_map(mouseMapX, mouseMapY, True)
00065
00066 return lon, lat
00067
00068
00069
00070
00071
00072
00073 def getAxesXYFromMouseXY(self, mouseX, mouseY):
00074 axesX, axesY = self.axes.transData.inverse_xy_tup( (mouseX,mouseY) )
00075
00076
00077 return axesX, axesY
00078
00079
00080
00081
00082 def setCurrentXYLim(self, xlim, ylim):
00083 self.currentXAxis = xlim
00084 self.currentYAxis = ylim
00085
00086 self.axes.set_xlim(xlim)
00087 self.axes.set_ylim(ylim)
00088
00089
00090
00091
00092
00093 def setFullXYLim(self, xlim, ylim):
00094 self.fullXAxis = xlim
00095 self.fullYAxis = ylim
00096
00097
00098
00099 def computeFullXYLim(self):
00100 self.fullXAxis = self.axes.get_xlim()
00101 self.fullYAxis = self.axes.get_ylim()
00102
00103
00104
00105 def getCurrentXYLim(self):
00106 return self.currentXAxis, self.currentYAxis
00107
00108
00109
00110
00111
00112
00113 def adjustAxisToCanavas(self, newCanavasSize):
00114
00115 x1, y1 = self.axes.transData.xy_tup( (self.currentXAxis[0], self.currentYAxis[0]) )
00116 x2, y2 = self.axes.transData.xy_tup( (self.currentXAxis[1], self.currentYAxis[1]) )
00117
00118
00119
00120 frm = wx.Point()
00121 to = wx.Point()
00122
00123 frm.x=x1;frm.y=y1;to.x=x2;to.y=y2
00124
00125
00126 self.freeZoomChangeAspect(frm, to, newCanavasSize, False)
00127
00128
00129
00130
00131
00132
00133
00134 def freeZoom(self, frm, to):
00135
00136 if (frm.x > to.x):
00137 normStartX, normEndX = to.x, frm.x
00138 else:
00139 normStartX, normEndX = frm.x, to.x
00140
00141 if (frm.y > to.y):
00142 normStartY, normEndY = to.y, frm.y
00143 else:
00144 normStartY, normEndY = frm.y, to.y
00145
00146 startX, startY = self.axes.transData.inverse_xy_tup( (normStartX, normStartY) )
00147 endX, endY = self.axes.transData.inverse_xy_tup( (normEndX, normEndY) )
00148
00149
00150
00151 self.setCurrentXYLim((startX, endX),(startY, endY))
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162 def freeZoomChangeAspect(self, frm, to, canavas, validateSelectionSize=True):
00163
00164
00165 if (frm.x > to.x):
00166 normStartX, normEndX = to.x, frm.x
00167 else:
00168 normStartX, normEndX = frm.x, to.x
00169
00170 if (frm.y > to.y):
00171 normStartY, normEndY = to.y, frm.y
00172 else:
00173 normStartY, normEndY = frm.y, to.y
00174
00175
00176
00177 propX, propY = canavas
00178
00179
00180 if propY == 0: return
00181 if normEndY - normStartY == 0: return
00182
00183 canavasAspectRatio = float(propX)/float(propY)
00184 marquisAspectRatio = float(abs(normEndX - normStartX)) / float(abs(normEndY - normStartY))
00185
00186
00187
00188
00189 if validateSelectionSize == True:
00190 if marquisAspectRatio > 5 or marquisAspectRatio < 0.2:
00191 return
00192
00193 if canavasAspectRatio == 0: return
00194
00195
00196 if (canavasAspectRatio > 1):
00197 newWidth = abs(normEndY - normStartY) * canavasAspectRatio
00198
00199
00200 deltaWidth = (newWidth / 2) - (abs(normEndX - normStartX) / 2)
00201
00202
00203 normStartX = normStartX - deltaWidth
00204 normEndX = normEndX + deltaWidth
00205
00206 else:
00207 newHeight = abs(normEndX - normStartX) / canavasAspectRatio
00208
00209
00210 deltaHeight = (newHeight / 2) - (abs(normEndY - normStartY) / 2)
00211
00212
00213 normStartY = normStartY - deltaHeight
00214 normEndY = normEndY + deltaHeight
00215
00216
00217 tStartX, tStartY = self.axes.transData.inverse_xy_tup( (normStartX, normStartY) )
00218 tEndX, tEndY = self.axes.transData.inverse_xy_tup( (normEndX, normEndY) )
00219
00220
00221
00222
00223
00224 if tStartX < self.fullXAxis[0]:startX = self.fullXAxis[0]
00225 else:startX = tStartX
00226
00227 if tEndX > self.fullXAxis[1]:endX = self.fullXAxis[1]
00228 else:endX = tEndX
00229
00230 if tStartY < self.fullYAxis[0]:startY = self.fullYAxis[0]
00231 else:startY = tStartY
00232
00233 if tEndY > self.fullYAxis[1]:endY = self.fullYAxis[1]
00234 else:endY = tEndY
00235
00236
00237 self.setCurrentXYLim((startX, endX),(startY, endY))
00238
00239
00240
00241
00242 def zoomIn(self, canavas):
00243 xLim, yLim = self.getCurrentXYLim()
00244
00245 xLen = abs(xLim[1] - xLim[0])
00246 yLen = abs(yLim[1] - yLim[0])
00247
00248
00249 xDelta = (xLen * 0.2) / 2
00250 yDelta = (yLen * 0.2) / 2
00251
00252 self.setCurrentXYLim((xLim[0] + xDelta, xLim[1] - xDelta),(yLim[0] + yDelta, yLim[1] - yDelta))
00253 self.adjustAxisToCanavas(canavas)
00254
00255
00256
00257
00258
00259
00260 def zoomOut(self, canavas):
00261
00262
00263
00264
00265 xLim, yLim = self.getCurrentXYLim()
00266
00267 xLen = abs(xLim[1] - xLim[0])
00268 yLen = abs(yLim[1] - yLim[0])
00269
00270
00271 xDelta = (xLen * 0.2) / 2
00272 yDelta = (yLen * 0.2) / 2
00273
00274
00275 canExpandLeft = (xLim[0] - xDelta) >= self.fullXAxis[0]
00276 canExpandRight = (xLim[1] + xDelta) <= self.fullXAxis[1]
00277 canExpandBottom = (yLim[0] - yDelta) >= self.fullYAxis[0]
00278 canExpandTop = (yLim[1] + yDelta) <= self.fullYAxis[1]
00279
00280 xMin, xMax, yMin, yMax = 0, 0, 0, 0
00281
00282 if canExpandLeft and canExpandRight:
00283 xMin = xLim[0] - xDelta
00284 xMax = xLim[1] + xDelta
00285
00286 elif not canExpandLeft and not canExpandRight:
00287 xMin = self.fullXAxis[0]
00288 xMax = self.fullXAxis[1]
00289
00290 elif not canExpandLeft and canExpandRight:
00291 extraSpace = abs(xLim[0] - xDelta)
00292 xMin = self.fullXAxis[0]
00293 xMax = xLim[1] + xDelta + extraSpace
00294 if xMax > self.fullXAxis[1]: xMax = self.fullXAxis[1]
00295
00296 else:
00297 extraSpace = abs(self.fullXAxis[1] - (xLim[1] + xDelta))
00298 xMin = xLim[0] - xDelta - extraSpace
00299 if xMin < self.fullXAxis[0]: xMin = self.fullXAxis[0]
00300 xMax = self.fullXAxis[1]
00301
00302
00303 if canExpandBottom and canExpandTop:
00304 yMin = yLim[0] - yDelta
00305 yMax = yLim[1] + yDelta
00306
00307 elif not canExpandBottom and not canExpandTop:
00308 yMin = self.fullYAxis[0]
00309 yMax = self.fullYAxis[1]
00310
00311 elif not canExpandBottom and canExpandTop:
00312 extraSpace = abs(yLim[0] - yDelta)
00313 yMin = self.fullYAxis[0]
00314 yMax = yLim[1] + yDelta + extraSpace
00315 if yMax > self.fullYAxis[1]: yMax = self.fullYAxis[1]
00316
00317 else:
00318 extraSpace = abs(self.fullYAxis[1] - (yLim[1] + yDelta))
00319 yMin = yLim[0] - yDelta - extraSpace
00320 if yMin < self.fullYAxis[0]: yMin = self.fullYAxis[0]
00321 yMax = self.fullYAxis[1]
00322
00323
00324
00325
00326 self.setCurrentXYLim((xMin, xMax), (yMin, yMax))
00327 self.adjustAxisToCanavas(canavas)
00328
00329
00330
00331
00332
00333 def resetZoom(self):
00334 self.axes.set_xlim(self.fullXAxis)
00335 self.axes.set_ylim(self.fullYAxis)
00336
00337 self.currentXAxis = tuple(self.fullXAxis)
00338 self.currentYAxis = tuple(self.fullYAxis)
00339
00340
00341
00342 def resetCurrentZoom(self):
00343 self.axes.set_xlim(self.currentXAxis)
00344 self.axes.set_ylim(self.currentYAxis)
00345
00346
00347
00348
00349
00350 def pan(self, frm, to):
00351
00352 if frm is None or to is None: return
00353
00354 startX, startY = self.axes.transData.inverse_xy_tup( (frm.x, frm.y) )
00355 endX, endY = self.axes.transData.inverse_xy_tup( (to.x, to.y) )
00356
00357
00358
00359 dx = endX - startX
00360 dy = endY - startY
00361
00362 panXmin = self.currentXAxis[0] - dx
00363 panXmax = self.currentXAxis[1] - dx
00364
00365 panYmin = self.currentYAxis[0] + dy
00366 panYmax = self.currentYAxis[1] + dy
00367
00368
00369 if panXmin < self.fullXAxis[0] or panXmax > self.fullXAxis[1]:
00370 if (panXmin < self.fullXAxis[0]):
00371 panXmin = self.fullXAxis[0]
00372 panXmax = self.currentXAxis[1] + (panXmin - self.currentXAxis[0])
00373 else:
00374 panXmax = self.fullXAxis[1]
00375 panXmin = self.currentXAxis[0] + (panXmax - self.currentXAxis[1])
00376
00377 if panYmin < self.fullYAxis[0] or panYmax > self.fullYAxis[1]:
00378 if (panYmin < self.fullYAxis[0]):
00379 panYmin = self.fullYAxis[0]
00380 panYmax = self.currentYAxis[1] + (panYmin - self.currentYAxis[0])
00381 else:
00382 panYmax = self.fullYAxis[1]
00383 panYmin = self.currentYAxis[0] + (panYmax - self.currentYAxis[1])
00384
00385
00386 self.axes.set_xlim((panXmin, panXmax))
00387 self.axes.set_ylim((panYmin, panYmax))
00388
00389 self.currentXAxis = tuple((panXmin, panXmax))
00390 self.currentYAxis = tuple((panYmin, panYmax))
00391
00392
00393
00394