212 lines
6.6 KiB
Python
212 lines
6.6 KiB
Python
from includes import *
|
|
from geosolver.matfunc import Vec
|
|
from numpy.linalg 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("")
|
|
|