geosolver/workbench/commands.py
kwikrick 22e159a5ad Changes to GeometricSolver:
- Added RigidConstraint.
- Depricated some methods (get_result, get_constrainedness) and 
added some new methods (get_solution, get_cluster, get_status).

Removed old SelectionConstraint and renamed FunctionConstraint to SelectionConstraint

Depricated ClusterSolver2D
Small bugfixes in cluster ClusterSolver3D

Renamed solvergui directory to workbench

Renamed solvertest directory to test
2009-10-09 12:23:02 +00:00

212 lines
6.6 KiB
Python

from includes import *
from geosolver.matfunc import Vec
from LinearAlgebra import *
from camera import CameraType
from prototypeObjects import PrototypeManager
class Command:
""" Commands that are general to the whole scene can be subclassed from this class. """
def __init__(self):
""" initialize """
pass
def execute(self):
""" execute the command """
raise NotImplementedError(caller + ' must be implemented in subclass')
class UpdateTaskbarCommand(Command):
""" Update the taskbar whena mouse move event occurs in on of the many views/viewports. """
def __init__(self, glViewport, mainWindow):
Command.__init__(self)
self.mainWindow = mainWindow
self.glViewport = glViewport
def execute(self, mouseEvent):
""" Process the mouse move event and update the text in the taskbar
Parameters:
mouseEvent: new position of the mouse in 2D
"""
camera = self.glViewport.getCamera()
""" convert the 2D viewport coordinates into 3D projected on a Y-plane in 3D and
for the other viewports to the orthogonal plane. """
translation = Vec(camera.unprojectedCoordinatesOf([mouseEvent.x(), mouseEvent.y(), 1.0]))
if camera.getCameraType() == CameraType.PERSPECTIVE:
position = camera.getPositionOnYPlane(translation)
else:
position = translation
self.glViewport.mousePosition[0] = position[0]
if self.glViewport.viewportType == ViewportType.SIDE:
position[0] = 0.0
self.glViewport.mousePosition[1] = position[1]
if self.glViewport.viewportType == ViewportType.TOP:
position[1] = 0.0
self.glViewport.mousePosition[2] = position[2]
if self.glViewport.viewportType == ViewportType.FRONT:
position[2] = 0.0
""" Update the text of the statusbar """
translation[0] = "%.4f" % position[0]
translation[1] = "%.4f" % position[1]
translation[2] = "%.4f" % position[2]
text = QtCore.QString("x:%1, y:%2, z:%3").arg(position[0]).arg(position[1]).arg(position[2])
self.mainWindow.statusBar().showMessage(text)
class UpdateTextInTaskbarCommand(Command):
def __init__(self, prototypeManager, mainWindow):
Command.__init__(self)
self.mainWindow = mainWindow
self.prototypeManager = prototypeManager
def execute(self):
constraintInfo = ""
constraintInfo = self.prototypeManager.getConstraintInfoAsText()
print constraintInfo
self.mainWindow.statusSolveInfo.setText(constraintInfo)
class UpdateToolCommand(Command):
""" Update the tools which can be used in any of the viewports, the tool is set for the all
the viewports. """
def __init__(self, viewportManager):
Command.__init__(self)
self.viewportManager = viewportManager
def execute(self, tool):
""" Update a tool to a new tool
Parameters:
tool = new tool which the user has selected
"""
if self.viewportManager.displayViewport == DisplayViewport.ALL:
for viewport in self.viewportManager.viewportList:
viewport.glViewport.currentTool = tool
for action in viewport.editGroup.actions():
action.setChecked(False)
else:
self.viewportManager.viewport.glViewport.currentTool = tool
for action in self.viewportManager.viewport.editGroup.actions():
action.setChecked(False)
PrototypeManager().deselectObject()
self.viewportManager.updateViewports()
class UpdateActionCommand(Command):
""" If an action for one of the viewports is set, disable all the tools for all of the windows. """
def __init__(self, mainWindow):
Command.__init__(self)
self.mainWindow = mainWindow
def execute(self, glViewport):
actions = self.mainWindow.editGroup.actions()
for action in actions:
action.setChecked(False)
if self.mainWindow.viewportManager.displayViewport == DisplayViewport.ALL:
for viewport in self.mainWindow.viewportManager.viewportList:
viewport.glViewport.currentTool = None
else:
glViewport.currentTool = None
class SaveCommand(Command):
""" Save the file for all the objects in the scene. """
def __init__(self, mainWindow):
Command.__init__(self)
self.mainWindow = mainWindow
self.prototypeManager = PrototypeManager()
def execute(self, filename):
doc = QtXml.QDomDocument( "Geometric Constraints" )
root = doc.createElement( "Objects" )
doc.appendChild( root );
for prtObject in self.prototypeManager.prtObjects:
if not prtObject.ghost:
root.appendChild(prtObject.save(doc))
root.appendChild(self.prototypeManager.save(doc))
file = QtCore.QFile(filename)
if file.open(QtCore.QIODevice.WriteOnly):
ts = QtCore.QTextStream(file)
ts << doc.toString()
file.close()
class LoadCommand(Command):
""" Load the objects from a file. """
def __init__(self, mainWindow):
Command.__init__(self)
self.mainWindow = mainWindow
self.prototypeManager = PrototypeManager()
def execute(self, filename):
doc = QtXml.QDomDocument( "Geometric Constraints" )
file = QtCore.QFile(filename)
if not file.open(QtCore.QIODevice.ReadOnly):
raise StandardError, "File could not be opened"
return
""" Skip the first line, because we need the root of the objects not the document. """
file.readLine()
if not doc.setContent(file, False):
file.close()
raise StandardError, "Could not initialize the file"
return
file.close()
root = doc.documentElement()
if root.tagName() != "Objects":
raise StandardError, "Invalid document"
return
self.prototypeManager.load(root)
self.mainWindow.viewportManager.updateViewports()
class ImportCommand(Command):
""" Import the objects from a file into the scene. """
def __init__(self, mainWindow):
Command.__init__(self)
self.mainWindow = mainWindow
self.prototypeManager = PrototypeManager()
def execute(self, filename):
doc = QtXml.QDomDocument( "Geometric Constraints" )
file = QtCore.QFile(filename)
if not file.open(QtCore.QIODevice.ReadOnly):
raise StandardError, "File could not be opened"
return
""" Skip the first line, because we need the root of the objects not the document. """
file.readLine()
if not doc.setContent(file, False):
file.close()
raise StandardError, "Could not initialize the file"
return
file.close()
root = doc.documentElement()
if root.tagName() != "Objects":
raise StandardError, "Invalid document"
return
self.prototypeManager.importScene(root)
self.mainWindow.viewportManager.updateViewports()
class ClearSceneCommand(Command):
""" Clear the whole scene of all the objects. """
def __init__(self, mainWindow):
Command.__init__(self)
self.mainWindow = mainWindow
self.prototypeManager = PrototypeManager()
def execute(self):
self.prototypeManager.removeAllObjects()
self.mainWindow.viewportManager.resetScene()
self.mainWindow.viewportManager.updateViewports()
self.mainWindow.saveFileName = QtCore.QString("")