diff --git a/src/Mod/Ship/shipHydrostatics/TaskPanel.py b/src/Mod/Ship/shipHydrostatics/TaskPanel.py index 54b5c7623..b5398690e 100644 --- a/src/Mod/Ship/shipHydrostatics/TaskPanel.py +++ b/src/Mod/Ship/shipHydrostatics/TaskPanel.py @@ -1,229 +1,229 @@ -#*************************************************************************** -#* * -#* Copyright (c) 2011, 2012 * -#* Jose Luis Cercos Pita * -#* * -#* This program is free software; you can redistribute it and/or modify * -#* it under the terms of the GNU Lesser General Public License (LGPL) * -#* as published by the Free Software Foundation; either version 2 of * -#* the License, or (at your option) any later version. * -#* for detail see the LICENCE text file. * -#* * -#* This program 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 Library General Public License for more details. * -#* * -#* You should have received a copy of the GNU Library General Public * -#* License along with this program; if not, write to the Free Software * -#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * -#* USA * -#* * -#*************************************************************************** - -import math -# FreeCAD modules -import FreeCAD as App -import FreeCADGui as Gui -# Qt library -from PyQt4 import QtGui,QtCore -# Module -import Plot -import Instance -from shipUtils import Paths, Translator -import Tools - -class TaskPanel: - def __init__(self): - self.ui = Paths.modulePath() + "/shipHydrostatics/TaskPanel.ui" - self.ship = None - - def accept(self): - if not self.ship: - return False - self.save() - draft = self.form.minDraft.value() - drafts = [draft] - dDraft = (self.form.maxDraft.value() - self.form.minDraft.value())/(self.form.nDraft.value()-1) - for i in range(1,self.form.nDraft.value()): - draft = draft + dDraft - drafts.append(draft) - Plot.Plot(self.ship, self.form.trim.value(), drafts) - return True - - def reject(self): - return True - - def clicked(self, index): - pass - - def open(self): - pass - - def needsFullSpace(self): - return True - - def isAllowedAlterSelection(self): - return False - - def isAllowedAlterView(self): - return True - - def isAllowedAlterDocument(self): - return False - - def helpRequested(self): - pass - - def setupUi(self): - mw = self.getMainWindow() - form = mw.findChild(QtGui.QWidget, "TaskPanel") - form.trim = form.findChild(QtGui.QDoubleSpinBox, "Trim") - form.minDraft = form.findChild(QtGui.QDoubleSpinBox, "MinDraft") - form.maxDraft = form.findChild(QtGui.QDoubleSpinBox, "MaxDraft") - form.nDraft = form.findChild(QtGui.QSpinBox, "NDraft") - self.form = form - # Initial values - if self.initValues(): - return True - self.retranslateUi() - # Connect Signals and Slots - QtCore.QObject.connect(form.trim, QtCore.SIGNAL("valueChanged(double)"), self.onData) - QtCore.QObject.connect(form.minDraft, QtCore.SIGNAL("valueChanged(double)"), self.onData) - QtCore.QObject.connect(form.maxDraft, QtCore.SIGNAL("valueChanged(double)"), self.onData) - - def getMainWindow(self): - "returns the main window" - # using QtGui.qApp.activeWindow() isn't very reliable because if another - # widget than the mainwindow is active (e.g. a dialog) the wrong widget is - # returned - toplevel = QtGui.qApp.topLevelWidgets() - for i in toplevel: - if i.metaObject().className() == "Gui::MainWindow": - return i - raise Exception("No main window found") - - def initValues(self): - """ Set initial values for fields - """ - # Get objects - selObjs = Gui.Selection.getSelection() - if not selObjs: - msg = Translator.translate("Ship instance must be selected (no object selected)\n") - App.Console.PrintError(msg) - return True - for i in range(0,len(selObjs)): - obj = selObjs[i] - # Test if is a ship instance - props = obj.PropertiesList - try: - props.index("IsShip") - except ValueError: - continue - if obj.IsShip: - # Test if another ship already selected - if self.ship: - msg = Translator.translate("More than one ship selected (extra ship will be neglected)\n") - App.Console.PrintWarning(msg) - break - self.ship = obj - # Test if any valid ship was selected - if not self.ship: - msg = Translator.translate("Ship instance must be selected (no valid ship found at selected objects)\n") - App.Console.PrintError(msg) - return True - # Get bounds - bbox = self.ship.Shape.BoundBox - # Set trim - flag = True - try: - props.index("HydrostaticsTrim") - except ValueError: - flag = False - if flag: - self.form.trim.setValue(self.ship.HydrostaticsTrim) - # Set drafts - self.form.maxDraft.setValue(1.1*self.ship.Draft) - self.form.minDraft.setValue(0.9*self.ship.Draft) - # Try to use saved values - props = self.ship.PropertiesList - flag = True - try: - props.index("HydrostaticsMinDraft") - except ValueError: - flag = False - if flag: - self.form.minDraft.setValue(self.ship.HydrostaticsMinDraft) - flag = True - try: - props.index("HydrostaticsMaxDraft") - except ValueError: - flag = False - if flag: - self.form.maxDraft.setValue(self.ship.HydrostaticsMaxDraft) - self.form.maxDraft.setMaximum(bbox.ZMax) - self.form.minDraft.setMinimum(bbox.ZMin) - self.form.maxDraft.setMinimum(self.form.minDraft.value()) - self.form.minDraft.setMaximum(self.form.maxDraft.value()) - flag = True - try: - props.index("HydrostaticsNDraft") - except ValueError: - flag = False - if flag: - self.form.nDraft.setValue(self.ship.HydrostaticsNDraft) - # Update GUI - msg = Translator.translate("Ready to work\n") - App.Console.PrintMessage(msg) - return False - - def retranslateUi(self): - """ Set user interface locale strings. - """ - self.form.setWindowTitle(Translator.translate("Plot hydrostatics")) - self.form.findChild(QtGui.QLabel, "TrimLabel").setText(Translator.translate("Trim")) - self.form.findChild(QtGui.QLabel, "MinDraftLabel").setText(Translator.translate("Minimum draft")) - self.form.findChild(QtGui.QLabel, "MaxDraftLabel").setText(Translator.translate("Maximum draft")) - self.form.findChild(QtGui.QLabel, "NDraftLabel").setText(Translator.translate("Number of points")) - - def onData(self, value): - """ Method called when input data is changed. - @param value Changed value. - """ - if not self.ship: - return - self.form.maxDraft.setMinimum(self.form.minDraft.value()) - self.form.minDraft.setMaximum(self.form.maxDraft.value()) - - def save(self): - """ Saves data into ship instance. - """ - props = self.ship.PropertiesList - try: - props.index("HydrostaticsTrim") - except ValueError: - self.ship.addProperty("App::PropertyFloat","HydrostaticsTrim","Ship", str(Translator.translate("Hydrostatics trim selected [m]"))) - self.ship.HydrostaticsTrim = self.form.trim.value() - try: - props.index("HydrostaticsMinDraft") - except ValueError: - self.ship.addProperty("App::PropertyFloat","HydrostaticsMinDraft","Ship", str(Translator.translate("Hydrostatics minimum draft selected [m]"))) - self.ship.HydrostaticsMinDraft = self.form.minDraft.value() - try: - props.index("HydrostaticsMaxDraft") - except ValueError: - self.ship.addProperty("App::PropertyFloat","HydrostaticsMaxDraft","Ship", str(Translator.translate("Hydrostatics maximum draft selected [m]"))) - self.ship.HydrostaticsMaxDraft = self.form.maxDraft.value() - try: - props.index("HydrostaticsNDraft") - except ValueError: - self.ship.addProperty("App::PropertyInteger","HydrostaticsNDraft","Ship", str(Translator.translate("Hydrostatics number of points selected [m]"))) - self.ship.HydrostaticsNDraft = self.form.nDraft.value() - -def createTask(): - panel = TaskPanel() - Gui.Control.showDialog(panel) - if panel.setupUi(): - Gui.Control.closeDialog(panel) - return None - return panel +#*************************************************************************** +#* * +#* Copyright (c) 2011, 2012 * +#* Jose Luis Cercos Pita * +#* * +#* This program is free software; you can redistribute it and/or modify * +#* it under the terms of the GNU Lesser General Public License (LGPL) * +#* as published by the Free Software Foundation; either version 2 of * +#* the License, or (at your option) any later version. * +#* for detail see the LICENCE text file. * +#* * +#* This program 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 Library General Public License for more details. * +#* * +#* You should have received a copy of the GNU Library General Public * +#* License along with this program; if not, write to the Free Software * +#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * +#* USA * +#* * +#*************************************************************************** + +import math +# FreeCAD modules +import FreeCAD as App +import FreeCADGui as Gui +# Qt library +from PyQt4 import QtGui,QtCore +# Module +import Plot +import Instance +from shipUtils import Paths, Translator +import Tools + +class TaskPanel: + def __init__(self): + self.ui = Paths.modulePath() + "/shipHydrostatics/TaskPanel.ui" + self.ship = None + + def accept(self): + if not self.ship: + return False + self.save() + draft = self.form.minDraft.value() + drafts = [draft] + dDraft = (self.form.maxDraft.value() - self.form.minDraft.value())/(self.form.nDraft.value()-1) + for i in range(1,self.form.nDraft.value()): + draft = draft + dDraft + drafts.append(draft) + Plot.Plot(self.ship, self.form.trim.value(), drafts) + return True + + def reject(self): + return True + + def clicked(self, index): + pass + + def open(self): + pass + + def needsFullSpace(self): + return True + + def isAllowedAlterSelection(self): + return False + + def isAllowedAlterView(self): + return True + + def isAllowedAlterDocument(self): + return False + + def helpRequested(self): + pass + + def setupUi(self): + mw = self.getMainWindow() + form = mw.findChild(QtGui.QWidget, "TaskPanel") + form.trim = form.findChild(QtGui.QDoubleSpinBox, "Trim") + form.minDraft = form.findChild(QtGui.QDoubleSpinBox, "MinDraft") + form.maxDraft = form.findChild(QtGui.QDoubleSpinBox, "MaxDraft") + form.nDraft = form.findChild(QtGui.QSpinBox, "NDraft") + self.form = form + # Initial values + if self.initValues(): + return True + self.retranslateUi() + # Connect Signals and Slots + QtCore.QObject.connect(form.trim, QtCore.SIGNAL("valueChanged(double)"), self.onData) + QtCore.QObject.connect(form.minDraft, QtCore.SIGNAL("valueChanged(double)"), self.onData) + QtCore.QObject.connect(form.maxDraft, QtCore.SIGNAL("valueChanged(double)"), self.onData) + + def getMainWindow(self): + "returns the main window" + # using QtGui.qApp.activeWindow() isn't very reliable because if another + # widget than the mainwindow is active (e.g. a dialog) the wrong widget is + # returned + toplevel = QtGui.qApp.topLevelWidgets() + for i in toplevel: + if i.metaObject().className() == "Gui::MainWindow": + return i + raise Exception("No main window found") + + def initValues(self): + """ Set initial values for fields + """ + # Get objects + selObjs = Gui.Selection.getSelection() + if not selObjs: + msg = Translator.translate("Ship instance must be selected (no object selected)\n") + App.Console.PrintError(msg) + return True + for i in range(0,len(selObjs)): + obj = selObjs[i] + # Test if is a ship instance + props = obj.PropertiesList + try: + props.index("IsShip") + except ValueError: + continue + if obj.IsShip: + # Test if another ship already selected + if self.ship: + msg = Translator.translate("More than one ship selected (extra ship will be neglected)\n") + App.Console.PrintWarning(msg) + break + self.ship = obj + # Test if any valid ship was selected + if not self.ship: + msg = Translator.translate("Ship instance must be selected (no valid ship found at selected objects)\n") + App.Console.PrintError(msg) + return True + # Get bounds + bbox = self.ship.Shape.BoundBox + # Set trim + flag = True + try: + props.index("HydrostaticsTrim") + except ValueError: + flag = False + if flag: + self.form.trim.setValue(self.ship.HydrostaticsTrim) + # Set drafts + self.form.maxDraft.setValue(1.1*self.ship.Draft) + self.form.minDraft.setValue(0.9*self.ship.Draft) + # Try to use saved values + props = self.ship.PropertiesList + flag = True + try: + props.index("HydrostaticsMinDraft") + except ValueError: + flag = False + if flag: + self.form.minDraft.setValue(self.ship.HydrostaticsMinDraft) + flag = True + try: + props.index("HydrostaticsMaxDraft") + except ValueError: + flag = False + if flag: + self.form.maxDraft.setValue(self.ship.HydrostaticsMaxDraft) + self.form.maxDraft.setMaximum(bbox.ZMax) + self.form.minDraft.setMinimum(bbox.ZMin) + self.form.maxDraft.setMinimum(self.form.minDraft.value()) + self.form.minDraft.setMaximum(self.form.maxDraft.value()) + flag = True + try: + props.index("HydrostaticsNDraft") + except ValueError: + flag = False + if flag: + self.form.nDraft.setValue(self.ship.HydrostaticsNDraft) + # Update GUI + msg = Translator.translate("Ready to work\n") + App.Console.PrintMessage(msg) + return False + + def retranslateUi(self): + """ Set user interface locale strings. + """ + self.form.setWindowTitle(Translator.translate("Plot hydrostatics")) + self.form.findChild(QtGui.QLabel, "TrimLabel").setText(Translator.translate("Trim")) + self.form.findChild(QtGui.QLabel, "MinDraftLabel").setText(Translator.translate("Minimum draft")) + self.form.findChild(QtGui.QLabel, "MaxDraftLabel").setText(Translator.translate("Maximum draft")) + self.form.findChild(QtGui.QLabel, "NDraftLabel").setText(Translator.translate("Number of points")) + + def onData(self, value): + """ Method called when input data is changed. + @param value Changed value. + """ + if not self.ship: + return + self.form.maxDraft.setMinimum(self.form.minDraft.value()) + self.form.minDraft.setMaximum(self.form.maxDraft.value()) + + def save(self): + """ Saves data into ship instance. + """ + props = self.ship.PropertiesList + try: + props.index("HydrostaticsTrim") + except ValueError: + self.ship.addProperty("App::PropertyFloat","HydrostaticsTrim","Ship", str(Translator.translate("Hydrostatics trim selected [m]"))) + self.ship.HydrostaticsTrim = self.form.trim.value() + try: + props.index("HydrostaticsMinDraft") + except ValueError: + self.ship.addProperty("App::PropertyFloat","HydrostaticsMinDraft","Ship", str(Translator.translate("Hydrostatics minimum draft selected [m]"))) + self.ship.HydrostaticsMinDraft = self.form.minDraft.value() + try: + props.index("HydrostaticsMaxDraft") + except ValueError: + self.ship.addProperty("App::PropertyFloat","HydrostaticsMaxDraft","Ship", str(Translator.translate("Hydrostatics maximum draft selected [m]"))) + self.ship.HydrostaticsMaxDraft = self.form.maxDraft.value() + try: + props.index("HydrostaticsNDraft") + except ValueError: + self.ship.addProperty("App::PropertyInteger","HydrostaticsNDraft","Ship", str(Translator.translate("Hydrostatics number of points selected [m]"))) + self.ship.HydrostaticsNDraft = self.form.nDraft.value() + +def createTask(): + panel = TaskPanel() + Gui.Control.showDialog(panel) + if panel.setupUi(): + Gui.Control.closeDialog(panel) + return None + return panel diff --git a/src/Mod/Ship/shipOutlineDraw/Plot.py b/src/Mod/Ship/shipOutlineDraw/Plot.py index 004ab9b40..7715540da 100644 --- a/src/Mod/Ship/shipOutlineDraw/Plot.py +++ b/src/Mod/Ship/shipOutlineDraw/Plot.py @@ -51,7 +51,7 @@ def Plot(scale, sections, shape): x0 = xMid - 0.5*xTot y0 = 297.0 - yMid - 0.5*yTot # 297 = A3_width # Get border - edges = self.getEdges([shape]) + edges = getEdges([shape]) border = edges[0] for i in range(0,len(edges)): border = border.oldFuse(edges[i]) # Only group objects, don't try to build more complex entities @@ -95,7 +95,7 @@ def Plot(scale, sections, shape): FreeCAD.ActiveDocument.recompute() return obj -def getEdges(self, objs=None): +def getEdges(objs=None): """ Returns object edges (list of them) @param objs Object to get the faces, none if selected object may used. diff --git a/src/Mod/Ship/shipOutlineDraw/TaskPanel.py b/src/Mod/Ship/shipOutlineDraw/TaskPanel.py index c49abcd0d..393e11ea8 100644 --- a/src/Mod/Ship/shipOutlineDraw/TaskPanel.py +++ b/src/Mod/Ship/shipOutlineDraw/TaskPanel.py @@ -1,348 +1,348 @@ -#*************************************************************************** -#* * -#* Copyright (c) 2011, 2012 * -#* Jose Luis Cercos Pita * -#* * -#* This program is free software; you can redistribute it and/or modify * -#* it under the terms of the GNU Lesser General Public License (LGPL) * -#* as published by the Free Software Foundation; either version 2 of * -#* the License, or (at your option) any later version. * -#* for detail see the LICENCE text file. * -#* * -#* This program 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 Library General Public License for more details. * -#* * -#* You should have received a copy of the GNU Library General Public * -#* License along with this program; if not, write to the Free Software * -#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * -#* USA * -#* * -#*************************************************************************** - -# FreeCAD modules -import FreeCAD as App -import FreeCADGui as Gui -# Qt library -from PyQt4 import QtGui,QtCore -# Module -import Preview, Plot -import Instance -from shipUtils import Paths, Translator - -class TaskPanel: - def __init__(self): - self.ui = Paths.modulePath() + "/shipOutlineDraw/TaskPanel.ui" - self.ship = None - self.skip = False - self.LSections = [] - self.BSections = [] - self.TSections = [] - self.obj = None - self.preview = Preview.Preview() - - def accept(self): - self.saveSections() - self.obj = Plot.Plot(self.form.scale.value(), self.obj.Shape, self.ship.Shape) - self.preview.clean() - self.obj.Label = 'OutlineDraw' - return True - - def reject(self): - self.preview.clean() - return True - - def clicked(self, index): - pass - - def open(self): - pass - - def needsFullSpace(self): - return True - - def isAllowedAlterSelection(self): - return False - - def isAllowedAlterView(self): - return True - - def isAllowedAlterDocument(self): - return False - - def helpRequested(self): - pass - - def setupUi(self): - mw = self.getMainWindow() - form = mw.findChild(QtGui.QWidget, "TaskPanel") - form.sections = form.findChild(QtGui.QTableWidget, "Sections") - try: - form.sections.setInputMethodHints(QtCore.Qt.ImhFormattedNumbersOnly) - except: - msg = Translator.translate("QtCore.Qt.ImhFormattedNumbersOnly not supported, will not used.\n") - App.Console.PrintWarning(msg) - form.sectionType = form.findChild(QtGui.QComboBox, "SectionType") - form.deleteButton = form.findChild(QtGui.QPushButton, "DeleteButton") - form.nSections = form.findChild(QtGui.QSpinBox, "NSections") - form.createButton = form.findChild(QtGui.QPushButton, "CreateButton") - form.scale = form.findChild(QtGui.QSpinBox, "Scale") - self.form = form - # Initial values - if self.initValues(): - return True - self.retranslateUi() - self.obj = self.preview.update(self.ship.Length, self.ship.Beam, self.ship.Draft, self.LSections,self.BSections,self.TSections, self.ship.Shape) - # Connect Signals and Slots - QtCore.QObject.connect(form.sectionType,QtCore.SIGNAL("activated(QString)"),self.onSectionType) - QtCore.QObject.connect(form.sections,QtCore.SIGNAL("cellChanged(int,int)"),self.onTableItem); - QtCore.QObject.connect(form.deleteButton,QtCore.SIGNAL("pressed()"),self.onDeleteButton) - QtCore.QObject.connect(form.createButton,QtCore.SIGNAL("pressed()"),self.onCreateButton) - - def getMainWindow(self): - "returns the main window" - # using QtGui.qApp.activeWindow() isn't very reliable because if another - # widget than the mainwindow is active (e.g. a dialog) the wrong widget is - # returned - toplevel = QtGui.qApp.topLevelWidgets() - for i in toplevel: - if i.metaObject().className() == "Gui::MainWindow": - return i - raise Exception("No main window found") - - def initValues(self): - """ Set initial values for fields - """ - # Get selected objects - selObjs = Gui.Selection.getSelection() - if not selObjs: - msg = Translator.translate("Ship instance must be selected (no object selected)\n") - App.Console.PrintError(msg) - return True - for i in range(0,len(selObjs)): - obj = selObjs[i] - # Test if is a ship instance - props = obj.PropertiesList - try: - props.index("IsShip") - except ValueError: - continue - if obj.IsShip: - # Test if another ship already selected - if self.ship: - msg = Translator.translate("More than one ship selected (extra ship will be neglected)\n") - App.Console.PrintWarning(msg) - break - self.ship = obj - # Test if any valid ship was selected - if not self.ship: - msg = Translator.translate("Ship instance must be selected (no valid ship found at selected objects)\n") - App.Console.PrintError(msg) - return True - # Load sections (if exist) - self.loadSections() - msg = Translator.translate("Ready to work\n") - App.Console.PrintMessage(msg) - return False - - def retranslateUi(self): - """ Set user interface locale strings. - """ - self.form.setWindowTitle(Translator.translate("Outline draw")) - self.form.findChild(QtGui.QGroupBox, "AutoCreateBox").setTitle(Translator.translate("Auto create")) - self.form.findChild(QtGui.QGroupBox, "ScaleBox").setTitle(Translator.translate("Scale")) - self.form.findChild(QtGui.QPushButton, "DeleteButton").setText(Translator.translate("Delete all sections")) - self.form.findChild(QtGui.QPushButton, "CreateButton").setText(Translator.translate("Create sections")) - self.form.findChild(QtGui.QComboBox, "SectionType").setItemText(0, Translator.translate("Transversal")) - self.form.findChild(QtGui.QComboBox, "SectionType").setItemText(1, Translator.translate("Longitudinal")) - self.form.findChild(QtGui.QComboBox, "SectionType").setItemText(2, Translator.translate("Water lines")) - - def onSectionType(self): - """ Function called when the section type is changed. - """ - # Search section type - ID = self.form.sectionType.currentIndex() - self.setSectionType(ID) - - def setSectionType(self, ID): - """ Function that set the type section related table. - @param ID Id of the section to set: \n - 0 = Transversal sections \n - 1 = Longitudinal sections \n - 2 = Water lines - """ - SectionList = [] - if ID == 0: - SectionList = self.LSections[:] - elif ID == 1: - SectionList = self.BSections[:] - elif ID == 2: - SectionList = self.TSections[:] - nRow = len(SectionList) - self.form.sections.clearContents() - self.form.sections.setRowCount(nRow+1) - if not nRow: - self.obj = self.preview.update(self.ship.Length, self.ship.Beam, self.ship.Draft, self.LSections,self.BSections,self.TSections, self.ship.Shape) - return - self.skip = True # Avoid recursive call to OnItem - for i in range(0,nRow): - if i == nRow-1: - self.skip = False - string = '%f' % (SectionList[i]) - item = QtGui.QTableWidgetItem(string) - self.form.sections.setItem(i,0,item) - - def onTableItem(self, row, column): - """ Function called when an item of table is changed. - @param row Changed item row - @param column Changed item column - """ - if self.skip: - return - # Ensure that exist one empty item at least - nRow = self.form.sections.rowCount() - item = self.form.sections.item(nRow-1,0) - if item : - if(item.text() != ''): - self.form.sections.setRowCount(nRow+1) - # Ensure that new item is a number - ID = self.form.sectionType.currentIndex() - if ID == 0: - SectionList = self.LSections[:] - elif ID == 1: - SectionList = self.BSections[:] - elif ID == 2: - SectionList = self.TSections[:] - item = self.form.sections.item(row,column) - (number,flag) = item.text().toFloat() - if not flag: - if len(SectionList) > nRow-1: - number = SectionList[nRow-1] - else: - number = 0.0 - string = '%f' % (number) - item.setText(string) - # Regenerate the list - SectionList = [] - for i in range(0,nRow): - item = self.form.sections.item(i,0) - if item: - (number,flag) = item.text().toFloat() - SectionList.append(number) - # Paste it into the class list - ID = self.form.sectionType.currentIndex() - if ID == 0: - self.LSections = SectionList[:] - elif ID == 1: - self.BSections = SectionList[:] - elif ID == 2: - self.TSections = SectionList[:] - self.obj = self.preview.update(self.ship.Length, self.ship.Beam, self.ship.Draft, self.LSections,self.BSections,self.TSections, self.ship.Shape) - - def onDeleteButton(self): - """ Function called when the delete button is pressed. - All sections mustt be erased - """ - self.form.sections.clearContents() - self.form.sections.setRowCount(1) - # Clear active list - ID = self.form.sectionType.currentIndex() - if ID == 0: - self.LSections = [] - elif ID == 1: - self.BSections = [] - elif ID == 2: - self.TSections = [] - self.setSectionType(ID) - - def onCreateButton(self): - """ Function called when create button is pressed. - Several sections must be added to list - """ - # Recolect data - nSections = self.form.nSections.value() - SectionList = [] - L = 0.0 - ID = self.form.sectionType.currentIndex() - if ID == 0: - L = self.ship.Length - d = L / (nSections-1) # Distance between sections - start = - L/2.0 # Ship must have 0.0 at coordinates origin - elif ID == 1: - L = -0.5*self.ship.Beam # Ship must be in y<0.0 - d = L / (nSections+1.0) # Distance between sections - start = d - elif ID == 2: - L = self.ship.Draft - d = L / (nSections) # Distance between sections - start = d - # Calculate sections - for i in range(0,nSections): - sec = i*d + start - SectionList.append(sec) - # Paste into class table - if ID == 0: - self.LSections = SectionList[:] - elif ID == 1: - self.BSections = SectionList[:] - elif ID == 2: - self.TSections = SectionList[:] - # Print the table - self.setSectionType(ID) - - def loadSections(self): - """ Loads from ship object previously selected sections. - """ - # Load sections - props = self.ship.PropertiesList - flag=True - try: - props.index("LSections") - except ValueError: - flag=False - if flag: - self.LSections = self.ship.LSections[:] - self.BSections = self.ship.BSections[:] - self.TSections = self.ship.TSections[:] - # Load scale too - flag=True - try: - props.index("PlotScale") - except ValueError: - flag=False - if flag: - self.form.scale.setValue(self.ship.PlotScale) - # Set UI - self.setSectionType(self.form.sectionType.currentIndex()) - - def saveSections(self): - """ Save selected sections into ship object. - """ - # Test if previous section have been created - props = self.ship.PropertiesList - try: - props.index("LSections") - except ValueError: - # Create new sections list - self.ship.addProperty("App::PropertyFloatList","LSections","Ship", str(Translator.translate("Transversal sections position [m]"))).LSections=[] - self.ship.addProperty("App::PropertyFloatList","BSections","Ship", str(Translator.translate("Longitudinal sections position [m]"))).BSections=[] - self.ship.addProperty("App::PropertyFloatList","TSections","Ship", str(Translator.translate("Water lines position [m]"))).TSections=[] - # Save sections - self.ship.LSections = self.LSections[:] - self.ship.BSections = self.BSections[:] - self.ship.TSections = self.TSections[:] - # Save also scale - try: - props.index("PlotScale") - except ValueError: - self.ship.addProperty("App::PropertyInteger","PlotScale","Ship", str(Translator.translate("Plot scale (1:scale format)"))).PlotScale=250 - self.ship.PlotScale = self.form.scale.value() - -def createTask(): - panel = TaskPanel() - Gui.Control.showDialog(panel) - if panel.setupUi(): - Gui.Control.closeDialog(panel) - return None - return panel +#*************************************************************************** +#* * +#* Copyright (c) 2011, 2012 * +#* Jose Luis Cercos Pita * +#* * +#* This program is free software; you can redistribute it and/or modify * +#* it under the terms of the GNU Lesser General Public License (LGPL) * +#* as published by the Free Software Foundation; either version 2 of * +#* the License, or (at your option) any later version. * +#* for detail see the LICENCE text file. * +#* * +#* This program 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 Library General Public License for more details. * +#* * +#* You should have received a copy of the GNU Library General Public * +#* License along with this program; if not, write to the Free Software * +#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * +#* USA * +#* * +#*************************************************************************** + +# FreeCAD modules +import FreeCAD as App +import FreeCADGui as Gui +# Qt library +from PyQt4 import QtGui,QtCore +# Module +import Preview, Plot +import Instance +from shipUtils import Paths, Translator + +class TaskPanel: + def __init__(self): + self.ui = Paths.modulePath() + "/shipOutlineDraw/TaskPanel.ui" + self.ship = None + self.skip = False + self.LSections = [] + self.BSections = [] + self.TSections = [] + self.obj = None + self.preview = Preview.Preview() + + def accept(self): + self.saveSections() + self.obj = Plot.Plot(self.form.scale.value(), self.obj.Shape, self.ship.Shape) + self.preview.clean() + self.obj.Label = 'OutlineDraw' + return True + + def reject(self): + self.preview.clean() + return True + + def clicked(self, index): + pass + + def open(self): + pass + + def needsFullSpace(self): + return True + + def isAllowedAlterSelection(self): + return False + + def isAllowedAlterView(self): + return True + + def isAllowedAlterDocument(self): + return False + + def helpRequested(self): + pass + + def setupUi(self): + mw = self.getMainWindow() + form = mw.findChild(QtGui.QWidget, "TaskPanel") + form.sections = form.findChild(QtGui.QTableWidget, "Sections") + try: + form.sections.setInputMethodHints(QtCore.Qt.ImhFormattedNumbersOnly) + except: + msg = Translator.translate("QtCore.Qt.ImhFormattedNumbersOnly not supported, will not used.\n") + App.Console.PrintWarning(msg) + form.sectionType = form.findChild(QtGui.QComboBox, "SectionType") + form.deleteButton = form.findChild(QtGui.QPushButton, "DeleteButton") + form.nSections = form.findChild(QtGui.QSpinBox, "NSections") + form.createButton = form.findChild(QtGui.QPushButton, "CreateButton") + form.scale = form.findChild(QtGui.QSpinBox, "Scale") + self.form = form + # Initial values + if self.initValues(): + return True + self.retranslateUi() + self.obj = self.preview.update(self.ship.Length, self.ship.Beam, self.ship.Draft, self.LSections,self.BSections,self.TSections, self.ship.Shape) + # Connect Signals and Slots + QtCore.QObject.connect(form.sectionType,QtCore.SIGNAL("activated(QString)"),self.onSectionType) + QtCore.QObject.connect(form.sections,QtCore.SIGNAL("cellChanged(int,int)"),self.onTableItem); + QtCore.QObject.connect(form.deleteButton,QtCore.SIGNAL("pressed()"),self.onDeleteButton) + QtCore.QObject.connect(form.createButton,QtCore.SIGNAL("pressed()"),self.onCreateButton) + + def getMainWindow(self): + "returns the main window" + # using QtGui.qApp.activeWindow() isn't very reliable because if another + # widget than the mainwindow is active (e.g. a dialog) the wrong widget is + # returned + toplevel = QtGui.qApp.topLevelWidgets() + for i in toplevel: + if i.metaObject().className() == "Gui::MainWindow": + return i + raise Exception("No main window found") + + def initValues(self): + """ Set initial values for fields + """ + # Get selected objects + selObjs = Gui.Selection.getSelection() + if not selObjs: + msg = Translator.translate("Ship instance must be selected (no object selected)\n") + App.Console.PrintError(msg) + return True + for i in range(0,len(selObjs)): + obj = selObjs[i] + # Test if is a ship instance + props = obj.PropertiesList + try: + props.index("IsShip") + except ValueError: + continue + if obj.IsShip: + # Test if another ship already selected + if self.ship: + msg = Translator.translate("More than one ship selected (extra ship will be neglected)\n") + App.Console.PrintWarning(msg) + break + self.ship = obj + # Test if any valid ship was selected + if not self.ship: + msg = Translator.translate("Ship instance must be selected (no valid ship found at selected objects)\n") + App.Console.PrintError(msg) + return True + # Load sections (if exist) + self.loadSections() + msg = Translator.translate("Ready to work\n") + App.Console.PrintMessage(msg) + return False + + def retranslateUi(self): + """ Set user interface locale strings. + """ + self.form.setWindowTitle(Translator.translate("Outline draw")) + self.form.findChild(QtGui.QGroupBox, "AutoCreateBox").setTitle(Translator.translate("Auto create")) + self.form.findChild(QtGui.QGroupBox, "ScaleBox").setTitle(Translator.translate("Scale")) + self.form.findChild(QtGui.QPushButton, "DeleteButton").setText(Translator.translate("Delete all sections")) + self.form.findChild(QtGui.QPushButton, "CreateButton").setText(Translator.translate("Create sections")) + self.form.findChild(QtGui.QComboBox, "SectionType").setItemText(0, Translator.translate("Transversal")) + self.form.findChild(QtGui.QComboBox, "SectionType").setItemText(1, Translator.translate("Longitudinal")) + self.form.findChild(QtGui.QComboBox, "SectionType").setItemText(2, Translator.translate("Water lines")) + + def onSectionType(self): + """ Function called when the section type is changed. + """ + # Search section type + ID = self.form.sectionType.currentIndex() + self.setSectionType(ID) + + def setSectionType(self, ID): + """ Function that set the type section related table. + @param ID Id of the section to set: \n + 0 = Transversal sections \n + 1 = Longitudinal sections \n + 2 = Water lines + """ + SectionList = [] + if ID == 0: + SectionList = self.LSections[:] + elif ID == 1: + SectionList = self.BSections[:] + elif ID == 2: + SectionList = self.TSections[:] + nRow = len(SectionList) + self.form.sections.clearContents() + self.form.sections.setRowCount(nRow+1) + if not nRow: + self.obj = self.preview.update(self.ship.Length, self.ship.Beam, self.ship.Draft, self.LSections,self.BSections,self.TSections, self.ship.Shape) + return + self.skip = True # Avoid recursive call to OnItem + for i in range(0,nRow): + if i == nRow-1: + self.skip = False + string = '%f' % (SectionList[i]) + item = QtGui.QTableWidgetItem(string) + self.form.sections.setItem(i,0,item) + + def onTableItem(self, row, column): + """ Function called when an item of table is changed. + @param row Changed item row + @param column Changed item column + """ + if self.skip: + return + # Ensure that exist one empty item at least + nRow = self.form.sections.rowCount() + item = self.form.sections.item(nRow-1,0) + if item : + if(item.text() != ''): + self.form.sections.setRowCount(nRow+1) + # Ensure that new item is a number + ID = self.form.sectionType.currentIndex() + if ID == 0: + SectionList = self.LSections[:] + elif ID == 1: + SectionList = self.BSections[:] + elif ID == 2: + SectionList = self.TSections[:] + item = self.form.sections.item(row,column) + (number,flag) = item.text().toFloat() + if not flag: + if len(SectionList) > nRow-1: + number = SectionList[nRow-1] + else: + number = 0.0 + string = '%f' % (number) + item.setText(string) + # Regenerate the list + SectionList = [] + for i in range(0,nRow): + item = self.form.sections.item(i,0) + if item: + (number,flag) = item.text().toFloat() + SectionList.append(number) + # Paste it into the class list + ID = self.form.sectionType.currentIndex() + if ID == 0: + self.LSections = SectionList[:] + elif ID == 1: + self.BSections = SectionList[:] + elif ID == 2: + self.TSections = SectionList[:] + self.obj = self.preview.update(self.ship.Length, self.ship.Beam, self.ship.Draft, self.LSections,self.BSections,self.TSections, self.ship.Shape) + + def onDeleteButton(self): + """ Function called when the delete button is pressed. + All sections mustt be erased + """ + self.form.sections.clearContents() + self.form.sections.setRowCount(1) + # Clear active list + ID = self.form.sectionType.currentIndex() + if ID == 0: + self.LSections = [] + elif ID == 1: + self.BSections = [] + elif ID == 2: + self.TSections = [] + self.setSectionType(ID) + + def onCreateButton(self): + """ Function called when create button is pressed. + Several sections must be added to list + """ + # Recolect data + nSections = self.form.nSections.value() + SectionList = [] + L = 0.0 + ID = self.form.sectionType.currentIndex() + if ID == 0: + L = self.ship.Length + d = L / (nSections-1) # Distance between sections + start = - L/2.0 # Ship must have 0.0 at coordinates origin + elif ID == 1: + L = -0.5*self.ship.Beam # Ship must be in y<0.0 + d = L / (nSections+1.0) # Distance between sections + start = d + elif ID == 2: + L = self.ship.Draft + d = L / (nSections) # Distance between sections + start = d + # Calculate sections + for i in range(0,nSections): + sec = i*d + start + SectionList.append(sec) + # Paste into class table + if ID == 0: + self.LSections = SectionList[:] + elif ID == 1: + self.BSections = SectionList[:] + elif ID == 2: + self.TSections = SectionList[:] + # Print the table + self.setSectionType(ID) + + def loadSections(self): + """ Loads from ship object previously selected sections. + """ + # Load sections + props = self.ship.PropertiesList + flag=True + try: + props.index("LSections") + except ValueError: + flag=False + if flag: + self.LSections = self.ship.LSections[:] + self.BSections = self.ship.BSections[:] + self.TSections = self.ship.TSections[:] + # Load scale too + flag=True + try: + props.index("PlotScale") + except ValueError: + flag=False + if flag: + self.form.scale.setValue(self.ship.PlotScale) + # Set UI + self.setSectionType(self.form.sectionType.currentIndex()) + + def saveSections(self): + """ Save selected sections into ship object. + """ + # Test if previous section have been created + props = self.ship.PropertiesList + try: + props.index("LSections") + except ValueError: + # Create new sections list + self.ship.addProperty("App::PropertyFloatList","LSections","Ship", str(Translator.translate("Transversal sections position [m]"))).LSections=[] + self.ship.addProperty("App::PropertyFloatList","BSections","Ship", str(Translator.translate("Longitudinal sections position [m]"))).BSections=[] + self.ship.addProperty("App::PropertyFloatList","TSections","Ship", str(Translator.translate("Water lines position [m]"))).TSections=[] + # Save sections + self.ship.LSections = self.LSections[:] + self.ship.BSections = self.BSections[:] + self.ship.TSections = self.TSections[:] + # Save also scale + try: + props.index("PlotScale") + except ValueError: + self.ship.addProperty("App::PropertyInteger","PlotScale","Ship", str(Translator.translate("Plot scale (1:scale format)"))).PlotScale=250 + self.ship.PlotScale = self.form.scale.value() + +def createTask(): + panel = TaskPanel() + Gui.Control.showDialog(panel) + if panel.setupUi(): + Gui.Control.closeDialog(panel) + return None + return panel