Example #1
0
    def __init__(self, dir):
        """Constructor."""

        self.directory = dir

        # setup user interface
        self.widget = QtGui.QWidget()
        self.ui = Ui_ProfilesDXF()
        self.ui.setupUi(self.widget)

#        # inputs
#        self.points = {}
#        self.nodReach = {}
#        self.nodProfiles = {}
#        self.proProfiles = {}
#
#        # results
#        self.reachStation = {}
#        self.profileStation={}
#        self.proArranged = {}
#       
#        self.pointsNormalized = {}
#        self.segmentStation = []
#
#    def setDir(self, directory):
#        self.directory = directory
#        

        self.settings = {}
        self.settings["Frame"] = True
        self.settings["Band"] = True
        self.settings["ProfileName"] = "Cross section "
        self.settings["ReachStation"] = "km "
        self.settings["ScaleFactor"] = "Scale = "
        self.settings["ReferenceLevel"] = "RL = "
        self.settings["BandTitleStationing"] = "Station [m]"
        self.settings["BandTitleElevation"] = "Elevation [m]"
        self.settings["DecimalPlaces"] = 2
        self.settings["doubleSpinBoxOffsetX"] = 75.0
        self.settings["doubleSpinBoxOffsetZ"] = 2.5
        self.settings["doubleSpinBoxBandHeight"] = 15.0
        self.settings["doubleSpinBoxTextSizeBandTitle"] = 4.0
        self.settings["doubleSpinBoxTextSizeBand"] = 1.5
        self.settings["doubleSpinBoxMarkerSize"] = 1.5
        self.settings["doubleSpinBoxCleanValues"] = 0.0
        
# module ProfilesDXF

        self.callbackOpenProfilesFile = functools.partial(uih.getOpenFileName, "Open Profiles File", "Line Sets (*.i2s *.i3s)", self.ui.lineEditInputProfiles, self.directory, self.widget)
        QtCore.QObject.connect(self.ui.pushButtonInputProfiles, QtCore.SIGNAL(_fromUtf8("clicked()")), self.callbackOpenProfilesFile)
        
        self.callbackOpenReachFile = functools.partial(uih.getOpenFileName, "Open Reach File", "Line Sets (*.i2s *.i3s)", self.ui.lineEditInputReach, self.directory, self.widget)
        QtCore.QObject.connect(self.ui.pushButtonInputReach, QtCore.SIGNAL(_fromUtf8("clicked()")), self.callbackOpenReachFile)

        self.callbackOpenBottomFile = functools.partial(uih.getOpenFileName, "Open T3S-file", "2D T3 Scalar Mesh (ASCII SingleFrame) (*.t3s)", self.ui.lineEditInputBottom, self.directory, self.widget)
        QtCore.QObject.connect(self.ui.pushButtonInputBottom, QtCore.SIGNAL(_fromUtf8("clicked()")), self.callbackOpenBottomFile)

        QtCore.QObject.connect(self.ui.pushButtonAdd, QtCore.SIGNAL(_fromUtf8("clicked()")), self.add)
        QtCore.QObject.connect(self.ui.pushButtonDelete, QtCore.SIGNAL(_fromUtf8("clicked()")), self.delete)
        QtCore.QObject.connect(self.ui.pushButtonColour, QtCore.SIGNAL(_fromUtf8("clicked()")), self.setColour)
        QtCore.QObject.connect(self.ui.pushButtonInputWaterSurface, QtCore.SIGNAL(_fromUtf8("clicked()")), self.getFileName)
        
        self.ui.tableWidget.setColumnWidth(0, 400)
        header = self.ui.tableWidget.horizontalHeader()
        header.setStretchLastSection(True)

        self.callbackProfiles = functools.partial(uih.setEnabled, self.ui.checkBoxOutputProfiles, self.ui.pushButtonOutputProfiles, self.ui.lineEditOutputProfiles)
        QtCore.QObject.connect(self.ui.checkBoxOutputProfiles, QtCore.SIGNAL("clicked()"), self.callbackProfiles)
        
        self.callbackPlan = functools.partial(uih.setEnabled, self.ui.checkBoxOutputPlan, self.ui.pushButtonOutputPlan, self.ui.lineEditOutputPlan)
        QtCore.QObject.connect(self.ui.checkBoxOutputPlan, QtCore.SIGNAL("clicked()"), self.callbackPlan)
        
        self.callbackSaveProfiles = functools.partial(uih.getSaveFileName, "Save DXF-file As", "Drawing Interchange File (*.dxf)", self.ui.lineEditOutputProfiles, self.directory, self.widget)
        QtCore.QObject.connect(self.ui.pushButtonOutputProfiles, QtCore.SIGNAL(_fromUtf8("clicked()")), self.callbackSaveProfiles)
        
        self.callbackSavePlan = functools.partial(uih.getSaveFileName, "Save DXF-file As", "Drawing Interchange File (*.dxf)", self.ui.lineEditOutputPlan, self.directory, self.widget)
        QtCore.QObject.connect(self.ui.pushButtonOutputPlan, QtCore.SIGNAL(_fromUtf8("clicked()")), self.callbackSavePlan)
        
        defaults = ["Template A", "Template B", "Template C"]
        self.ui.comboBoxDefault.addItems(defaults)        
        QtCore.QObject.connect(self.ui.pushButtonDefault, QtCore.SIGNAL(_fromUtf8("clicked()")), self.setDefault)
        
        QtCore.QObject.connect(self.ui.pushButtonProfileSettings, QtCore.SIGNAL("clicked()"), self.setSettings)
        
        QtCore.QObject.connect(self.ui.pushButtonCreate, QtCore.SIGNAL("clicked()"), self.create)
Example #2
0
class WrapProfilesDXF():
    """Wrapper for module ProfilesDXF"""

    def __init__(self, dir):
        """Constructor."""

        self.directory = dir

        # setup user interface
        self.widget = QtGui.QWidget()
        self.ui = Ui_ProfilesDXF()
        self.ui.setupUi(self.widget)

#        # inputs
#        self.points = {}
#        self.nodReach = {}
#        self.nodProfiles = {}
#        self.proProfiles = {}
#
#        # results
#        self.reachStation = {}
#        self.profileStation={}
#        self.proArranged = {}
#       
#        self.pointsNormalized = {}
#        self.segmentStation = []
#
#    def setDir(self, directory):
#        self.directory = directory
#        

        self.settings = {}
        self.settings["Frame"] = True
        self.settings["Band"] = True
        self.settings["ProfileName"] = "Cross section "
        self.settings["ReachStation"] = "km "
        self.settings["ScaleFactor"] = "Scale = "
        self.settings["ReferenceLevel"] = "RL = "
        self.settings["BandTitleStationing"] = "Station [m]"
        self.settings["BandTitleElevation"] = "Elevation [m]"
        self.settings["DecimalPlaces"] = 2
        self.settings["doubleSpinBoxOffsetX"] = 75.0
        self.settings["doubleSpinBoxOffsetZ"] = 2.5
        self.settings["doubleSpinBoxBandHeight"] = 15.0
        self.settings["doubleSpinBoxTextSizeBandTitle"] = 4.0
        self.settings["doubleSpinBoxTextSizeBand"] = 1.5
        self.settings["doubleSpinBoxMarkerSize"] = 1.5
        self.settings["doubleSpinBoxCleanValues"] = 0.0
        
# module ProfilesDXF

        self.callbackOpenProfilesFile = functools.partial(uih.getOpenFileName, "Open Profiles File", "Line Sets (*.i2s *.i3s)", self.ui.lineEditInputProfiles, self.directory, self.widget)
        QtCore.QObject.connect(self.ui.pushButtonInputProfiles, QtCore.SIGNAL(_fromUtf8("clicked()")), self.callbackOpenProfilesFile)
        
        self.callbackOpenReachFile = functools.partial(uih.getOpenFileName, "Open Reach File", "Line Sets (*.i2s *.i3s)", self.ui.lineEditInputReach, self.directory, self.widget)
        QtCore.QObject.connect(self.ui.pushButtonInputReach, QtCore.SIGNAL(_fromUtf8("clicked()")), self.callbackOpenReachFile)

        self.callbackOpenBottomFile = functools.partial(uih.getOpenFileName, "Open T3S-file", "2D T3 Scalar Mesh (ASCII SingleFrame) (*.t3s)", self.ui.lineEditInputBottom, self.directory, self.widget)
        QtCore.QObject.connect(self.ui.pushButtonInputBottom, QtCore.SIGNAL(_fromUtf8("clicked()")), self.callbackOpenBottomFile)

        QtCore.QObject.connect(self.ui.pushButtonAdd, QtCore.SIGNAL(_fromUtf8("clicked()")), self.add)
        QtCore.QObject.connect(self.ui.pushButtonDelete, QtCore.SIGNAL(_fromUtf8("clicked()")), self.delete)
        QtCore.QObject.connect(self.ui.pushButtonColour, QtCore.SIGNAL(_fromUtf8("clicked()")), self.setColour)
        QtCore.QObject.connect(self.ui.pushButtonInputWaterSurface, QtCore.SIGNAL(_fromUtf8("clicked()")), self.getFileName)
        
        self.ui.tableWidget.setColumnWidth(0, 400)
        header = self.ui.tableWidget.horizontalHeader()
        header.setStretchLastSection(True)

        self.callbackProfiles = functools.partial(uih.setEnabled, self.ui.checkBoxOutputProfiles, self.ui.pushButtonOutputProfiles, self.ui.lineEditOutputProfiles)
        QtCore.QObject.connect(self.ui.checkBoxOutputProfiles, QtCore.SIGNAL("clicked()"), self.callbackProfiles)
        
        self.callbackPlan = functools.partial(uih.setEnabled, self.ui.checkBoxOutputPlan, self.ui.pushButtonOutputPlan, self.ui.lineEditOutputPlan)
        QtCore.QObject.connect(self.ui.checkBoxOutputPlan, QtCore.SIGNAL("clicked()"), self.callbackPlan)
        
        self.callbackSaveProfiles = functools.partial(uih.getSaveFileName, "Save DXF-file As", "Drawing Interchange File (*.dxf)", self.ui.lineEditOutputProfiles, self.directory, self.widget)
        QtCore.QObject.connect(self.ui.pushButtonOutputProfiles, QtCore.SIGNAL(_fromUtf8("clicked()")), self.callbackSaveProfiles)
        
        self.callbackSavePlan = functools.partial(uih.getSaveFileName, "Save DXF-file As", "Drawing Interchange File (*.dxf)", self.ui.lineEditOutputPlan, self.directory, self.widget)
        QtCore.QObject.connect(self.ui.pushButtonOutputPlan, QtCore.SIGNAL(_fromUtf8("clicked()")), self.callbackSavePlan)
        
        defaults = ["Template A", "Template B", "Template C"]
        self.ui.comboBoxDefault.addItems(defaults)        
        QtCore.QObject.connect(self.ui.pushButtonDefault, QtCore.SIGNAL(_fromUtf8("clicked()")), self.setDefault)
        
        QtCore.QObject.connect(self.ui.pushButtonProfileSettings, QtCore.SIGNAL("clicked()"), self.setSettings)
        
        QtCore.QObject.connect(self.ui.pushButtonCreate, QtCore.SIGNAL("clicked()"), self.create)

    def setDir(self, directory):
        self.directory = copy.copy(directory)
    
    def applyDefaults(self, dataSets, colHexRGB):

        nLevels = len(dataSets)-1

        self.ui.tableWidget.setRowCount(nLevels)

        for row in range(nLevels):
            item1 = QtGui.QTableWidgetItem()
            item1.setText(self.directory + str(dataSets[row]))
            self.ui.tableWidget.setItem(row, 0, item1)
            
            item2 = QtGui.QTableWidgetItem()
            item2.setText(str(dataSets[row]))
            self.ui.tableWidget.setItem(row, 1, item2)

            col = colors.hex2color(colHexRGB[row])
            colPy = QColor(int(col[0]*255),int(col[1]*255),int(col[2]*255))
            item3 = QtGui.QTableWidgetItem()
            item3.setBackground(colPy)
            item3.setFlags(QtCore.Qt.ItemIsEnabled)
            item3.setText(str(colPy.red()) + ", " + str(colPy.green()) + ", " + str(colPy.blue()))
            self.ui.tableWidget.setItem(row, 2, item3)
            
    def setDefault(self):
        
        def RGB2HEX(RGB):
            
            HEX = []
            for i in range(len(RGB)):
                col = Colour(str(RGB[i]).split(","))
                col.create()
                HEX.append(col.getHexRGB())
                
            return HEX

        ans = QMessageBox.question(self.widget, "Module XYZ2Profiles", "Do you want do set default settings?", 1, 2)

        if ans != 1:
            return
        else:
            template = self.ui.comboBoxDefault.currentIndex()

            # Template A
            if template == 0:

                dataSets = ["HQ30 IST", "HQ30 ZUK", "HQ100 IST", "HQ100 ZUK", "HQ300 IST", "HQ300 ZUK"]
                col_RGB = ["190,232,255","116,179,255","55,141,255","18,107,238","0,77,168","232,190,255"]
                col_HEX = RGB2HEX(col_RGB)

                self.applyDefaults(dataSets, col_HEX)

                self.settings = {}
                self.settings["Frame"] = True
                self.settings["Band"] = True
                self.settings["ProfileName"] = "Profil Nr. "
                self.settings["ReachStation"] = "km "
                self.settings["ScaleFactor"] = "Massstab = "
                self.settings["ReferenceLevel"] = "VE = "
                self.settings["BandTitleStationing"] = "Stationierung [m]"
                self.settings["BandTitleElevation"] = "Gelaendehoehe [m]"
                self.settings["DecimalPlaces"] = 2
                self.settings["doubleSpinBoxOffsetX"] = 75.0
                self.settings["doubleSpinBoxOffsetZ"] = 2.5
                self.settings["doubleSpinBoxBandHeight"] = 15.0
                self.settings["doubleSpinBoxTextSizeBandTitle"] = 4.0
                self.settings["doubleSpinBoxTextSizeBand"] = 1.5
                self.settings["doubleSpinBoxMarkerSize"] = 1.5
                self.settings["doubleSpinBoxCleanValues"] = 0.0

            # Template B
            if template == 1:

                dataSets = ["HQ30", "HQ100"]
                col_RGB = ["190,232,255","116,179,255"]
                col_HEX = RGB2HEX(col_RGB)

                self.applyDefaults(dataSets, col_HEX)

                self.settings["Frame"] = True
                self.settings["Band"] = True
                self.settings["ProfileName"] = "Cross section "
                self.settings["ReachStation"] = "km "
                self.settings["ScaleFactor"] = "Scale = "
                self.settings["ReferenceLevel"] = "RL = "
                self.settings["BandTitleStationing"] = "Station [m]"
                self.settings["BandTitleElevation"] = "Elevation [m]"
                self.settings["DecimalPlaces"] = 2
                self.settings["doubleSpinBoxOffsetX"] = 75.0
                self.settings["doubleSpinBoxOffsetZ"] = 2.5
                self.settings["doubleSpinBoxBandHeight"] = 15.0
                self.settings["doubleSpinBoxTextSizeBandTitle"] = 4.0
                self.settings["doubleSpinBoxTextSizeBand"] = 1.5
                self.settings["doubleSpinBoxMarkerSize"] = 1.5
                self.settings["doubleSpinBoxCleanValues"] = 0.0

    def getCrossSections(self, mesh):

        crossSections = dict((key, np.array([])) for key in self.proArranged)

        for pID in self.proArranged:
            
            nodes = []
            for nID in range(len(self.proArranged[pID])):
                node = self.nodProfiles[self.proArranged[pID][nID]]
                nodes.append(node)

            crossSection = LineString(nodes)

            intersection = mesh.intersection(crossSection)

            values = []
            for p in range(len(intersection)):
                intersection_ = intersection[p]

                if intersection_.geom_type == "Point":
                    inters = crossSection.project(intersection_)
                    values.append([intersection_.x, intersection_.y, intersection_.z, inters])
                elif intersection_.geom_type == "LineString":
                    for i in range(len(intersection_.coords)):
                        pt = Point(intersection_.coords[i])
                        inters = crossSection.project(pt)             
                        values.append([pt.x, pt.y, pt.z, inters])

            arr = np.array(values)
            arr = arr[arr[:,3].argsort()]
            arr.reshape((arr.size/4,4))

            x = arr[:,0]
            y = arr[:,1]
            z = arr[:,2]
            d = arr[:,3]

            crossSections[pID] = [x,y,z,d]

        return crossSections
    
    def setSettings(self):

        settings = WrapProfileSettings(self.settings)
        settings.setSettings()
    
        if settings.exec_():
            self.settings = settings.getSettings()

    def create(self):
    
        info = "Input data:\n"

        try:
            self.nodProfiles, self.proProfiles = fh.readI2S(self.ui.lineEditInputProfiles.text())
            info += " - Profiles:\t\t\t{0}\n".format(len(self.proProfiles))
        except:
            QMessageBox.critical(self.widget, "Error", "Not able to load profiles file!\nCheck filename or content!")
            return
        try:
            self.nodReach = fh.readI2S(self.ui.lineEditInputReach.text())[0]
            info += " - Reach nodes:\t\t{0}\n".format(len(self.nodReach))
        except:
            QMessageBox.critical(self.widget, "Error", "Not able to load reach file!\nCheck filename or content!")
            return
        try:
            rows = self.ui.tableWidget.rowCount()
            for row in range(rows):
                self.ui.tableWidget.item(row, 0).text()
                self.ui.tableWidget.item(row, 1).text()
                str(self.ui.tableWidget.item(row, 2).text()).split(",")[2]
            info += " - Water surface results:\t{0}\n".format(rows)
        except:
            QMessageBox.critical(self.widget, "Error", "Check filename, surface name and colour!")
            return            
                
        self.proArranged, self.reachStation, self.profileStation, direction = po.determineFlowDirection(self.nodReach, self.nodProfiles, self.proProfiles)

        info += "\nFlow direction:\n"
        for pID_Arranged in direction:
            info += ' - Profile {0}:\t{1}\n'.format(pID_Arranged, direction[pID_Arranged])


        # create bottom cross sections
        try:
            bottom = fh.readT3StoShapely(self.ui.lineEditInputBottom.text())
            bottomCrossSections = self.getCrossSections(bottom)
        except:
            QMessageBox.critical(self.widget, "Error", "Not able to interpolate bottom profile!")
            return
        
        
        # create water surface cross sections
        try:        
            rows = self.ui.tableWidget.rowCount()
            wsCrossSections = {}
            colRGB = {}
            if rows > 0:
                for row in range(rows):
                    filename = self.ui.tableWidget.item(row, 0).text()
                    name = self.ui.tableWidget.item(row, 1).text()
                    watersurface = fh.readT3StoShapely(filename)
                    wsCrossSections[name] = self.getCrossSections(watersurface)
                    col = Colour(str(self.ui.tableWidget.item(row, 2).text()).split(","))
                    col.create()
                    colRGB[name] = col.getRGB()
        except:
            QMessageBox.critical(self.widget, "Error", "Not able to interpolate water surface profiles!")
            return
        
        scale = self.ui.spinBoxScale.value()
        superelevation = self.ui.doubleSpinBoxSuperelevation.value()
        
        info += "\nOutput data:\n"
        
        if self.ui.checkBoxOutputProfiles.isChecked():             
            try:        
                cs = ProfileWriter(self.ui.lineEditOutputProfiles.text(),\
                    bottomCrossSections,
                    self.reachStation,
                    self.profileStation,
                    scale,
                    superelevation,
                    self.settings,
                    self.ui.lineEditInputReachName.text())

                cs.drawBottom()
                cs.drawWaterSurface(wsCrossSections, colRGB)
                cs.saveDXF()

                info += " - DXF file written to {0}.\n".format(self.ui.lineEditOutputProfiles.text())
            except:
                info += " - ERROR: Not able to write profiles!\n"

        QMessageBox.information(self.widget, "Module ProfilesDXF", info)     

    def add(self):
        row = self.ui.tableWidget.currentRow()
        item = QtGui.QTableWidgetItem()
        item.setFlags(QtCore.Qt.ItemIsEnabled)
        if row == -1:
            row = 0
        self.ui.tableWidget.insertRow(row)
        self.ui.tableWidget.setItem(row, 2, item)

    def delete(self):
        row = self.ui.tableWidget.currentRow()
        self.ui.tableWidget.removeRow(row)
        
    def setColour(self):
        row = self.ui.tableWidget.currentRow()
        item1 = self.ui.tableWidget.item(row, 2)
        initCol = item1.backgroundColor()
        coldia = QtGui.QColorDialog()
        col = coldia.getColor(initCol)
        if col.isValid():
            item = QtGui.QTableWidgetItem()
            item.setBackground(col)
            item.setFlags(QtCore.Qt.ItemIsEnabled)
            item.setText(str(col.red()) + ", " + str(col.green()) + ", " + str(col.blue()))
            self.ui.tableWidget.setItem(row, 2, item)
        else:
            return     
        
    def getFileName(self):
        row = self.ui.tableWidget.currentRow()
        filetype = ("2D T3 Scalar Mesh (ASCII SingleFrame) (*.t3s)")
        filename = QFileDialog.getOpenFileName(self.widget, "Open T3S-file", self.directory, filetype)

        if filename != "":
            item = QtGui.QTableWidgetItem()
            item.setText(filename)
            self.ui.tableWidget.setItem(row, 0, item)
        
    def initialize(self):
        
        import os
        abs_path = os.path.abspath('.')
        dir = os.path.join(abs_path, 'examples/').replace('\\', '/')
  
        ###   ~   module ProfilesDXF   ~   ###
        
        self.ui.lineEditInputProfiles.setText(dir + "example_15/profiles.i2s")
        self.ui.lineEditInputReach.setText(dir + "example_15/reach.i2s")
        self.ui.lineEditInputBottom.setText(dir + "example_15/BOTTOM_Case_A.t3s")
        self.ui.lineEditInputReachName.setText("Donau")

        self.ui.tableWidget.setRowCount(0)
        self.add()
        self.add()
        
        item1 = QtGui.QTableWidgetItem()
        item1.setText(self.directory + "C:/ChEsher/examples/example_15/FREE SURFACE_S161_Case_A.t3s")
        self.ui.tableWidget.setItem(0, 0, item1)
        
        item2 = QtGui.QTableWidgetItem()
        item2.setText("HQ100 Case A")
        self.ui.tableWidget.setItem(0, 1, item2)

        item3 = QtGui.QTableWidgetItem()
        item3.setText(self.directory + "C:/ChEsher/examples/example_15/FREE SURFACE_S161_Case_B.t3s")
        self.ui.tableWidget.setItem(1, 0, item3)

        item4 = QtGui.QTableWidgetItem()
        item4.setText("HQ100 Case B")
        self.ui.tableWidget.setItem(1, 1, item4)

        initCol = item2.backgroundColor()
        initCol.setRed(255)
        initCol.setGreen(0)
        initCol.setBlue(127)
        item5 = QtGui.QTableWidgetItem()
        item5.setBackground(initCol)
        item5.setFlags(QtCore.Qt.ItemIsEnabled)
        item5.setText(str(initCol.red()) + ", " + str(initCol.green()) + ", " + str(initCol.blue()))
        self.ui.tableWidget.setItem(0, 2, item5)

        initCol = item4.backgroundColor()
        initCol.setRed(29)
        initCol.setGreen(29)
        initCol.setBlue(255)
        item6 = QtGui.QTableWidgetItem()
        item6.setBackground(initCol)
        item6.setFlags(QtCore.Qt.ItemIsEnabled)
        item6.setText(str(initCol.red()) + ", " + str(initCol.green()) + ", " + str(initCol.blue()))
        self.ui.tableWidget.setItem(1, 2, item6)
        
        uih.setEnabledInitialize(self.ui.checkBoxOutputProfiles, self.ui.pushButtonOutputProfiles, self.ui.lineEditOutputProfiles)
        self.ui.lineEditOutputProfiles.setText(self.directory + "C:/ChEsher/examples/example_15/output/profiles.dxf")