geosolver/workbench/main.py
kwikrick 38c71c882b Simplified output of GeometricSolver.get_cluster.
New decompositionView (replacing compositionView) in workbench
2009-11-16 20:01:47 +00:00

340 lines
16 KiB
Python

import preferencesDlg, decompositionView
from includes import *
from viewportManager import *
from prototypeObjects import PrototypeManager
from tools import *
from panel import *
from solutionView import *
from parameters import Settings
from geosolver import randomproblem
from ui_randomProblemDialog import Ui_randomProblemDialog
class Ui_MainWindow(QtGui.QMainWindow):
# Ui_MainWindow: creation of the main window with al its content
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.setWindowTitle(self.tr("Geometric Constraint Solver"))
self.activatedTool = None
self.settings = Settings()
self.saveFileName = QtCore.QString("")
self.createViewportManager()
self.createDecompositionView()
self.createSolutionView()
self.createActions()
self.createTriggers()
self.createPanel()
self.createMenus()
self.createStatusBar()
self.createToolbar()
self.resize(QtCore.QSize(QtCore.QRect(0,0,800,600).size()).expandedTo(self.minimumSizeHint()))
def createActions(self):
# the actions which the user can select from the menu
self.actionNew = QtGui.QAction(self.tr("&New"), self)
self.actionNew.setShortcut(self.tr("Ctrl+N"))
self.actionOpen = QtGui.QAction(self.tr("&Open"), self)
self.actionOpen.setShortcut(self.tr("Ctrl+O"))
self.actionSave = QtGui.QAction(self.tr("&Save"), self)
self.actionSave.setShortcut(self.tr("Ctrl+S"))
self.actionSave_As = QtGui.QAction(self.tr("Save &As .."), self)
self.actionSave_As.setShortcut(self.tr("Ctrl+A"))
self.actionImport = QtGui.QAction(self.tr("&Import"), self)
self.actionImport.setShortcut(self.tr("Ctrl+I"))
self.actionClose = QtGui.QAction(self.tr("&Close"), self)
self.actionClose.setShortcut(self.tr("Ctrl+C"))
self.actionQuit = QtGui.QAction(self.tr("E&xit"), self)
self.actionQuit.setShortcut(self.tr("Ctrl+X"))
# Rick 20090522
self.actionGenerate = QtGui.QAction(self.tr("&Generate"), self)
self.actionGenerate.setShortcut(self.tr("Ctrl+G"))
self.editGroup = QtGui.QActionGroup(self)
self.editGroup.setExclusive(True)
self.actionSelect = QtGui.QAction(self.tr("Select"), self)
self.actionSelect.setCheckable(True)
self.actionPlacePoint = QtGui.QAction(self.tr("Point"), self)
self.actionPlacePoint.setCheckable(True)
self.actionMove = QtGui.QAction(self.tr("Move"), self)
self.actionMove.setCheckable(True)
self.actionConnect = QtGui.QAction(self.tr("Connect"), self)
self.actionConnect.setCheckable(True)
self.actionDistanceConstraint = QtGui.QAction(self.tr("Distance"), self)
self.actionDistanceConstraint.setCheckable(True)
self.actionDistance = QtGui.QAction(self.tr("Line"), self)
self.actionDistance.setCheckable(True)
self.actionAngleConstraint = QtGui.QAction(self.tr("Angle"), self)
self.actionAngleConstraint.setCheckable(True)
self.actionFixedConstraint = QtGui.QAction(self.tr("Fixed"), self)
self.actionFixedConstraint.setCheckable(True)
self.actionMinMaxView = QtGui.QAction(self.tr("MM"), self)
self.actionSolve = QtGui.QAction(self.tr("Solve"), self)
self.actionClusters = QtGui.QAction(self.tr("Clusters"), self)
self.editGroup.addAction(self.actionSelect)
self.editGroup.addAction(self.actionPlacePoint)
self.editGroup.addAction(self.actionMove)
self.editGroup.addAction(self.actionConnect)
self.editGroup.addAction(self.actionDistanceConstraint)
self.editGroup.addAction(self.actionAngleConstraint)
self.editGroup.addAction(self.actionDistance)
self.editGroup.addAction(self.actionFixedConstraint)
self.actionCompositionView = QtGui.QAction(self.tr("Composition View"), self)
self.actionSolutionView = QtGui.QAction(self.tr("Solution View"), self)
self.actionPreferences = QtGui.QAction(self.tr("Preferences"), self)
def createTriggers(self):
# menu actions
QtCore.QObject.connect(self.actionNew,QtCore.SIGNAL("triggered()"),self.new)
QtCore.QObject.connect(self.actionQuit,QtCore.SIGNAL("triggered()"),self.close)
QtCore.QObject.connect(self.actionSave,QtCore.SIGNAL("triggered()"),self.save)
QtCore.QObject.connect(self.actionSave_As,QtCore.SIGNAL("triggered()"),self.saveAs)
QtCore.QObject.connect(self.actionImport,QtCore.SIGNAL("triggered()"),self.importFile)
QtCore.QObject.connect(self.actionOpen,QtCore.SIGNAL("triggered()"),self.load)
QtCore.QObject.connect(self.actionCompositionView,QtCore.SIGNAL("triggered()"), self.showCompositionView)
QtCore.QObject.connect(self.actionSolutionView,QtCore.SIGNAL("triggered()"), self.showSolutionView)
QtCore.QObject.connect(self.actionPreferences,QtCore.SIGNAL("triggered()"), self.showPreferencesDlg)
QtCore.QObject.connect(self.actionSelect,QtCore.SIGNAL("changed()"), self.selectTriggered)
QtCore.QObject.connect(self.actionPlacePoint,QtCore.SIGNAL("changed()"), self.placePointTriggered)
QtCore.QObject.connect(self.actionMove,QtCore.SIGNAL("changed()"), self.moveTriggered)
QtCore.QObject.connect(self.actionConnect,QtCore.SIGNAL("changed()"), self.connectTriggered)
QtCore.QObject.connect(self.actionDistanceConstraint,QtCore.SIGNAL("changed()"), self.distanceConstraintTriggered)
QtCore.QObject.connect(self.actionMinMaxView,QtCore.SIGNAL("triggered()"), self.viewportManager.minmaxView)
QtCore.QObject.connect(self.actionSolve,QtCore.SIGNAL("triggered()"), PrototypeManager().solve)
QtCore.QObject.connect(self.actionSolve,QtCore.SIGNAL("triggered()"), self.compositionView.createDecomposition)
QtCore.QObject.connect(self.actionSolve,QtCore.SIGNAL("triggered()"), self.solutionView.createSolution)
QtCore.QObject.connect(self.actionSolve,QtCore.SIGNAL("triggered()"), self.viewportManager.updateSolution)
QtCore.QObject.connect(self.actionSolve,QtCore.SIGNAL("triggered()"), self.viewportManager.updateDecomposition)
QtCore.QObject.connect(self.actionSolve,QtCore.SIGNAL("triggered()"), self.viewportManager.updateViewports)
QtCore.QObject.connect(self.actionSolve,QtCore.SIGNAL("triggered()"), self.updateConstraintInfo)
QtCore.QObject.connect(self.actionClusters,QtCore.SIGNAL("triggered()"), self.showClusters)
QtCore.QObject.connect(self.actionDistance,QtCore.SIGNAL("changed()"), self.placeDistanceTriggered)
QtCore.QObject.connect(self.actionAngleConstraint,QtCore.SIGNAL("changed()"), self.placeAngleConstraintTriggered)
QtCore.QObject.connect(self.actionFixedConstraint,QtCore.SIGNAL("changed()"), self.placeFixedConstraintTriggered)
# Rick 20090522
QtCore.QObject.connect(self.actionGenerate,QtCore.SIGNAL("triggered()"),self.generateRandom)
def createMenus(self):
# connect the defined actions with menu items
self.menuFile = self.menuBar().addMenu(self.tr("&File"))
self.menuFile.addAction(self.actionNew)
self.menuFile.addAction(self.actionOpen)
self.menuFile.addSeparator()
self.menuFile.addAction(self.actionSave)
self.menuFile.addAction(self.actionSave_As)
self.menuFile.addAction(self.actionImport)
self.menuFile.addAction(self.actionGenerate)
self.menuFile.addSeparator()
self.menuFile.addAction(self.actionClose)
self.menuFile.addSeparator()
self.menuFile.addAction(self.actionQuit)
self.menuView = self.menuBar().addMenu(self.tr("&View"))
self.menuView.addAction(self.actionCompositionView)
self.menuView.addAction(self.actionSolutionView)
self.menuWindow = self.menuBar().addMenu(self.tr("&Window"))
self.menuWindow.addAction(self.dock.toggleViewAction())
self.menuWindow.addSeparator()
self.menuWindow.addAction(self.actionPreferences)
self.menuHelp = self.menuBar().addMenu(self.tr("&Help"))
def createStatusBar(self):
# set the statusbar
self.statusbar = QtGui.QStatusBar(self)
self.statusbar.setObjectName("statusbar")
self.statusSolveInfo = QtGui.QLabel("")
self.statusbar.addPermanentWidget(self.statusSolveInfo)
self.setStatusBar(self.statusbar)
def createToolbar(self):
self.toolbar = QtGui.QToolBar("edit actions", self)
self.toolbar.addAction(self.actionSelect)
self.toolbar.addAction(self.actionPlacePoint)
self.toolbar.addAction(self.actionMove)
self.toolbar.addAction(self.actionConnect)
self.toolbar.addAction(self.actionDistanceConstraint)
self.toolbar.addAction(self.actionAngleConstraint)
self.toolbar.addAction(self.actionDistance)
self.toolbar.addAction(self.actionFixedConstraint)
self.toolbar.addAction(self.actionMinMaxView)
self.toolbar.addAction(self.actionSolve)
self.toolbar.addAction(self.actionClusters)
self.toolbar.insertSeparator(self.actionMinMaxView)
self.toolbar.insertSeparator(self.actionSolve)
self.addToolBar(QtCore.Qt.TopToolBarArea, self.toolbar)
def createViewportManager(self):
self.viewportManager = ViewportManager(self)
self.viewportManager.showViewport(DisplayViewport.ALL, None)
self.updateTool = UpdateToolCommand(self.viewportManager)
def createPanel(self):
self.dock = QtGui.QDockWidget(self.tr("Prototypes"), self)
self.maxWidth = self.dock.maximumWidth()
self.dock.setMaximumWidth(240)
self.dock.setAllowedAreas(QtCore.Qt.LeftDockWidgetArea | QtCore.Qt.RightDockWidgetArea)
self.infoPanel = Panel(self, self.dock)
self.dock.setWidget(self.infoPanel)
self.addDockWidget(QtCore.Qt.RightDockWidgetArea, self.dock)
def createDecompositionView(self):
self.compositionView = DecompositionView(None, self.viewportManager, ViewportType.DECOMPOSITION ,PrototypeManager())
def createSolutionView(self):
self.solutionView = SolutionView(self, self.viewportManager, ViewportType.SOLUTION ,PrototypeManager())
#self.viewPanelSplitter.setSizes([400, 200])
def updateWindow(self):
self.viewportManager.updateViewports()
def showCompositionView(self):
self.compositionView.show()
def showSolutionView(self):
self.solutionView.show()
def updateConstraintInfo(self):
self.infoPanel.reset()
updateTaskbarCommand = UpdateTextInTaskbarCommand(PrototypeManager(), self)
updateTaskbarCommand.execute()
def showClusters(self):
prtManager = PrototypeManager()
prtManager.showClusters()
self.viewportManager.updateViewports()
def showPreferencesDlg(self):
self.preferencesDlg = preferencesDlg.PreferencesDlg(self.viewportManager)
self.preferencesDlg.exec_()
def selectTriggered(self):
if self.actionSelect.isChecked():
self.updateTool.execute(SelectTool())
def placePointTriggered(self):
if self.actionPlacePoint.isChecked():
self.updateTool.execute(PlacePointTool())
def distanceConstraintTriggered(self):
if self.actionDistanceConstraint.isChecked():
self.updateTool.execute(PlaceDistanceConstraintTool())
def moveTriggered(self):
if self.actionMove.isChecked():
self.updateTool.execute(MoveTool())
def connectTriggered(self):
if self.actionConnect.isChecked():
self.updateTool.execute(ConnectTool())
def placeDistanceTriggered(self):
if self.actionDistance.isChecked():
self.updateTool.execute(PlaceDistanceTool())
def placeFixedConstraintTriggered(self):
if self.actionFixedConstraint.isChecked():
self.updateTool.execute(PlaceFixedConstraintTool())
def placeAngleConstraintTriggered(self):
if self.actionAngleConstraint.isChecked():
self.updateTool.execute(PlaceAngleConstraintTool())
def new(self):
result = QtGui.QMessageBox.warning(self, self.tr("New Scene"), self.tr("The scene may have been modified.\n" "Do you want to save your changes?"), \
QtGui.QMessageBox.Yes | QtGui.QMessageBox.No | QtGui.QMessageBox.Cancel, QtGui.QMessageBox.Yes)
if result == QtGui.QMessageBox.Yes:
self.save()
elif result == QtGui.QMessageBox.Cancel:
return
self.newCommand = ClearSceneCommand(self)
self.newCommand.execute()
self.setWindowTitle(self.tr("Geometric Constraint Solver"))
def load(self):
result = QtGui.QMessageBox.warning(self, self.tr("Scene Changes"), self.tr("The scene may have been modified.\n" "Do you want to save your changes?"), \
QtGui.QMessageBox.Yes | QtGui.QMessageBox.No | QtGui.QMessageBox.Cancel, QtGui.QMessageBox.Yes)
if result == QtGui.QMessageBox.Yes:
self.save()
elif result == QtGui.QMessageBox.Cancel:
return
filename = QtGui.QFileDialog.getOpenFileName(self, self.tr("Open File"), "", self.tr("GCS Files (*.gcs)"))
if not filename.isEmpty():
self.newCommand = ClearSceneCommand(self)
self.newCommand.execute()
self.saveFileName = filename
self.loadCommand = LoadCommand(self)
self.loadCommand.execute(self.saveFileName)
nameForTitle = QtCore.QString(self.saveFileName)
title = nameForTitle.remove(0, nameForTitle.lastIndexOf("/")+1)
self.setWindowTitle("- " + title + self.tr(" - Geometric Constraint Solver"))
def save(self):
if self.saveFileName.isEmpty():
self.saveAs()
else:
self.saveCommand = SaveCommand(self)
self.saveCommand.execute(self.saveFileName)
nameForTitle = QtCore.QString(self.saveFileName)
title = nameForTitle.remove(0, nameForTitle.lastIndexOf("/")+1)
self.setWindowTitle("- " + title + self.tr(" - Geometric Constraint Solver"))
def saveAs(self):
saveDialog = QtGui.QFileDialog()
saveDialog.setDefaultSuffix(".gcs")
filename = saveDialog.getSaveFileName(self, self.tr("Save As.."), "", self.tr("GCS Files (*.gcs)"))
if not filename.isEmpty():
if not filename.endsWith(saveDialog.defaultSuffix()):
filename.append(saveDialog.defaultSuffix())
self.saveFileName = filename
self.save()
def importFile(self):
filename = QtGui.QFileDialog.getOpenFileName(self, self.tr("Import File"), "", self.tr("GCS Files (*.gcs)"))
if not filename.isEmpty():
self.importCommand = ImportCommand(self)
self.importCommand.execute(filename)
# Rick 20090522
def generateRandom(self):
## first do as if File->New was selected
self.new()
## then show randomProblemDialog
#ui = Ui_randomProblemDialog()
#dialog = QtDialog()
## create random problem
(numpoints, ratio, size, rounding) = (10, 0.0, 100.0, 0.0)
problem = randomproblem.random_triangular_problem_3D(numpoints, size, rounding, ratio)
prototypeManager = PrototypeManager()
prototypeManager.setProblem(problem)
self.viewportManager.updateViewports()
## set window title
#title = "Untitled"
#self.setWindowTitle(title + self.tr(" - Geometric Constraint Solver"))
def tr(self, string):
return QtGui.QApplication.translate("Ui_MainWindow", string, None, QtGui.QApplication.UnicodeUTF8)
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
MainWindow = Ui_MainWindow()
MainWindow.show()
sys.exit(app.exec_())