
- 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
212 lines
6.6 KiB
Python
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("")
|
|
|