1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224
|
# -*- coding: utf-8 -*-
# ####################################################################
# Copyright (C) 2005-2009 by the FIFE team
# http://www.fifengine.de
# This file is part of FIFE.
#
# FIFE is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the
# Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
# ####################################################################
""" a tool for FIFEdit to edit camera attributes. It does not
currently support multiple cameras.
"""
from fife import fife
from fife.extensions import pychan
import fife.extensions.pychan.widgets as widgets
from fife.extensions.pychan.tools import callbackWithArguments as cbwa
from fife.extensions.fife_timer import Timer
import scripts
import scripts.plugin as plugin
from scripts.events import *
from scripts.gui.action import Action
import os
try:
import xml.etree.cElementTree as ET
except:
import xml.etree.ElementTree as ET
import math
class CameraEdit(plugin.Plugin):
def __init__(self):
self._enabled = False
# Camera instance
self._camera = None
# Editor instance
self._editor = None
# Toolbar button to display Camera Editor
self._action_show = None
# GUI
self._container = None
self._ok_button = None
self._cancel_button = None
def enable(self):
""" plugin method """
if self._enabled is True:
return
self._editor = scripts.editor.getEditor()
#self._camera = self._editor.getActiveMapView().getCamera()
self._action_show = Action(u"Camera Editor", checkable=True)
scripts.gui.action.activated.connect(self.toggle, sender=self._action_show)
self._editor._tools_menu.addAction(self._action_show)
self._createGui()
self._enabled = True
def disable(self):
""" plugin method """
if self._enabled is False:
return
self._container.setDocked(False)
self._container.hide()
self._editor._tools_menu.removeAction(self._action_show)
self._enabled = False
def isEnabled(self):
""" plugin method """
return self._enabled;
def getName(self):
""" plugin method """
return "Camera Editor"
def toggle(self):
""" Toggles the cameratool visible / invisible and sets
dock status
"""
if self._container.isVisible() or self._container.isDocked():
self._container.setDocked(False)
self._container.hide()
self._action_show.setChecked(False)
else:
self._container.show()
self.loadSettings()
self._action_show.setChecked(True)
self._adjustPosition()
def saveSettings(self):
engine = self._editor.getEngine()
id = self._container.collectData('idBox')
if id == '':
print 'Please enter a camera id.'
return
try:
map = engine.getModel().getMap(str(self._container.collectData('mapBox')))
except fife.Exception:
print 'Cannot find the specified map id.'
return
try:
layer = map.getLayer(str(self._container.collectData('layerBox')))
except fife.Exception:
print 'Cannot find the specified layer id.'
return
try:
vals = self._container.collectData('viewBox').split(',')
if len(vals) != 4:
raise ValueError
viewport = fife.Rect(*[int(c) for c in vals])
except ValueError:
print 'Please enter 4 comma (,) delimited values for viewport x,y,width,height.'
return
try:
refh = int(self._container.collectData('refhBox'))
refw = int(self._container.collectData('refwBox'))
except ValueError:
print 'Please enter positive integer values for reference width and height.'
return
try:
rot = int(self._container.collectData('rotBox'))
tilt = int(self._container.collectData('tiltBox'))
except ValueError:
print 'Please enter positive integer values for rotation and tilt.'
return
self._camera = self._editor.getActiveMapView().getCamera()
self._camera.setId(str(id))
self._camera.getLocation().setLayer(layer)
self._camera.setViewPort(viewport)
self._camera.setCellImageDimensions(refw, refh)
self._camera.setRotation(rot)
self._camera.setTilt(tilt)
self.toggle()
def loadSettings(self):
if self._editor.getActiveMapView() is None:
return
else:
self._camera = self._editor.getActiveMapView().getCamera()
map = self._editor.getActiveMapView().getMap().getId()
self._container.findChild(name="mapBox").text = unicode(str(map))
layer = self._camera.getLocation().getLayer().getId()
self._container.findChild(name="layerBox").text = unicode(layer)
vp = self._camera.getViewPort()
viewport_str = unicode(str(vp.x) + "," + str(vp.y) + "," + str(vp.w) + "," + str(vp.h))
self._container.findChild(name="viewBox").text = viewport_str
ref = self._camera.getCellImageDimensions()
refw_str = unicode(str(ref.x))
refh_str = unicode(str(ref.y))
self._container.findChild(name="refhBox").text = refh_str
self._container.findChild(name="refwBox").text = refw_str
self._container.findChild(name="idBox").text = unicode(str(self._camera.getId()))
self._container.findChild(name="rotBox").text = unicode(str(int(self._camera.getRotation())))
self._container.findChild(name="tiltBox").text = unicode(str(int(self._camera.getTilt())))
def _createGui(self):
""" Create the basic gui container """
self._container = pychan.loadXML('gui/cameradialog.xml')
self._ok_button = self._container.findChild(name="okButton")
self._cancel_button = self._container.findChild(name="cancelButton")
self._ok_button.capture(self.saveSettings)
self._ok_button.capture(cbwa(self._editor.getStatusBar().showTooltip, unicode("Save changes to the camera")), 'mouseEntered')
self._ok_button.capture(self._editor.getStatusBar().hideTooltip, 'mouseExited')
self._cancel_button.capture(self.toggle)
self._cancel_button.capture(cbwa(self._editor.getStatusBar().showTooltip, unicode("Discard any changes to the camera")), 'mouseEntered')
self._cancel_button.capture(self._editor.getStatusBar().hideTooltip, 'mouseExited')
def _adjustPosition(self):
""" Adjusts the position of the container - we don't want to
let the window appear at the center of the screen.
(new default position: left, beneath the tools window)
"""
self._container.position = (50, 200)
|