Source code for SurveyingCalculation.traverse_dialog

from traverse_calc import Ui_TraverseCalcDialog
from surveying_util import *
from calculation import Calculation
from resultlog import *

class TraverseDialog(QDialog):
    """
[docs] Class for traverse calculation dialog """ def __init__(self, log): super(TraverseDialog, self).__init__() self.ui = Ui_TraverseCalcDialog() self.ui.setupUi(self) self.log = log # event handlers self.ui.ClosedRadio.toggled.connect(self.radioClicked) self.ui.LinkRadio.toggled.connect(self.radioClicked) self.ui.OpenRadio.toggled.connect(self.radioClicked) self.ui.StartPointComboBox.currentIndexChanged.connect(self.startpointComboChanged) self.ui.AddButton.clicked.connect(self.onAddButton) self.ui.RemoveButton.clicked.connect(self.onRemoveButton) self.ui.UpButton.clicked.connect(self.onUpButton) self.ui.DownButton.clicked.connect(self.onDownButton) self.ui.CalcButton.clicked.connect(self.onCalcButton) self.ui.ResetButton.clicked.connect(self.onResetButton) self.ui.CloseButton.clicked.connect(self.onCloseButton) self.ui.TargetList.setSortingEnabled(True) def showEvent(self, event): """
[docs] Reset dialog when receives a show event. """ self.reset() def reset(self): """
[docs] Reset dialog to initial state """ # reset radio buttons self.ui.buttonGroup.setExclusive(False) self.ui.ClosedRadio.setChecked(False) self.ui.LinkRadio.setChecked(False) self.ui.OpenRadio.setChecked(False) self.ui.buttonGroup.setExclusive(True) # disable widgets self.ui.StartPointComboBox.setEnabled(False) self.ui.EndPointComboBox.setEnabled(False) # clear widgets self.ui.StartPointComboBox.clear() self.ui.EndPointComboBox.clear() self.ui.TargetList.clear() self.ui.OrderList.clear() self.ui.ResultTextBrowser.clear() def fillStartEndPointsCombos(self): """
[docs] Change start and end point combo when an other traversing type selected. """ # get selected stations oldStartPoint = self.ui.StartPointComboBox.itemData( self.ui.StartPointComboBox.currentIndex() ) oldEndPoint = self.ui.EndPointComboBox.itemData( self.ui.EndPointComboBox.currentIndex() ) # clear combos self.ui.StartPointComboBox.clear() self.ui.EndPointComboBox.clear() self.ui.StartPointComboBox.setEnabled(False) self.ui.EndPointComboBox.setEnabled(False) #get combobox models combomodel1 = self.ui.StartPointComboBox.model() combomodel2 = self.ui.EndPointComboBox.model() #get stations known_stations = get_stations(True,False) oriented_stations = get_stations(True,True) # fill StartPointComboBox and EndPointComboBox start_points = [] end_points = [] if oriented_stations is not None and self.ui.ClosedRadio.isChecked(): for stn in oriented_stations: start_points.append( [u"%s (%s:%s)"% (stn[0],stn[1],stn[2]), stn] ) end_points.append( [u"%s (%s:%s)"% (stn[0],stn[1],stn[2]), stn] ) self.ui.StartPointComboBox.setEnabled(True) elif known_stations is not None and self.ui.LinkRadio.isChecked(): for stn in known_stations: start_points.append( [u"%s (%s:%s)"% (stn[0],stn[1],stn[2]), stn] ) end_points.append( [u"%s (%s:%s)"% (stn[0],stn[1],stn[2]), stn] ) self.ui.StartPointComboBox.setEnabled(True) self.ui.EndPointComboBox.setEnabled(True) elif oriented_stations is not None and self.ui.OpenRadio.isChecked(): for stn in oriented_stations: start_points.append( [u"%s (%s:%s)"% (stn[0],stn[1],stn[2]), stn] ) self.ui.StartPointComboBox.setEnabled(True) self.ui.EndPointComboBox.setEnabled(True) known_points = get_known() if start_points is not None: for startpoint in start_points: item = QStandardItem(startpoint[0]) item.setData(startpoint[1],Qt.UserRole) if known_points is not None and startpoint[1][0] in known_points: itemfont = item.font() itemfont.setWeight(QFont.Bold) item.setFont(itemfont) combomodel1.appendRow( item ) if end_points is not None: for endpoint in end_points: item = QStandardItem(endpoint[0]) item.setData(endpoint[1],Qt.UserRole) if known_points is not None and endpoint[1][0] in known_points: itemfont = item.font() itemfont.setWeight(QFont.Bold) item.setFont(itemfont) combomodel2.appendRow( item ) # select previously selected start/end point if present in the list self.ui.StartPointComboBox.setCurrentIndex( self.ui.StartPointComboBox.findData(oldStartPoint) ) self.ui.EndPointComboBox.setCurrentIndex( self.ui.EndPointComboBox.findData(oldEndPoint) ) # in case of closed traverse ens point must be the same as start point if self.ui.ClosedRadio.isChecked(): self.ui.EndPointComboBox.setCurrentIndex(self.ui.StartPointComboBox.currentIndex()) def fillTargetList(self): """
[docs] Change Target List when an other calculation type selected. """ self.ui.TargetList.clear() self.ui.OrderList.clear() # get target points targets = get_stations(False,False) # fill target list widget known_list = get_known() if targets is not None: for target in targets: item = QListWidgetItem(u"%s (%s:%s)"% (target[0],target[1],target[2]) ) item.setData(Qt.UserRole,target) if known_list is not None and target[0] in known_list: itemfont = item.font() itemfont.setWeight(QFont.Bold) item.setFont(itemfont) self.ui.TargetList.addItem( item ) def fillOpenTraverseEndPoints(self): """
[docs] Change End Points combo with target points observed from the last point selected in Order List if open traverse is chosen. """ oldEndPoint = self.ui.EndPointComboBox.itemData( self.ui.EndPointComboBox.currentIndex() ) # clear combos self.ui.EndPointComboBox.clear() self.ui.EndPointComboBox.setEnabled(True) #get last angle point from order list if self.ui.OrderList.count() == 0: return lastp = self.ui.OrderList.item( self.ui.OrderList.count()-1 ).data(Qt.UserRole) targets = get_targets(lastp[0], lastp[1], lastp[2]) # fill end point combo combomodel = self.ui.EndPointComboBox.model() known_list = get_known() for target in targets: item = QStandardItem(u"%s (id:%s)"% (target[0],target[2])) item.setData(target,Qt.UserRole) if known_list is not None and target[0] in known_list: itemfont = item.font() itemfont.setWeight(QFont.Bold) item.setFont(itemfont) combomodel.appendRow( item ) self.ui.EndPointComboBox.setCurrentIndex( self.ui.EndPointComboBox.findData(oldEndPoint) ) def radioClicked(self): """
[docs] Change dialog controls when an other calculation type selected. """ self.fillStartEndPointsCombos() self.fillTargetList() def startpointComboChanged(self): if self.ui.ClosedRadio.isChecked():
self.ui.EndPointComboBox.setCurrentIndex(self.ui.StartPointComboBox.currentIndex()) if self.ui.OpenRadio.isChecked(): self.fillOpenTraverseEndPoints() def onAddButton(self): """
[docs] Add selected target point to used points list. """ self.ui.OrderList.addItem( self.ui.TargetList.takeItem( self.ui.TargetList.currentRow() ) ) if self.ui.OpenRadio.isChecked(): self.fillOpenTraverseEndPoints() def onRemoveButton(self): """
[docs] Remove selected used point and add to target points list. """ self.ui.TargetList.addItem( self.ui.OrderList.takeItem( self.ui.OrderList.currentRow() ) ) if self.ui.OpenRadio.isChecked(): self.fillOpenTraverseEndPoints() def onUpButton(self): """
[docs] Add selected target point to used points list. """ cur = self.ui.OrderList.currentRow() if cur>0: self.ui.OrderList.insertItem( cur-1, self.ui.OrderList.takeItem( cur ) ) self.ui.OrderList.setCurrentRow(cur-1) if self.ui.OpenRadio.isChecked(): self.fillOpenTraverseEndPoints() def onDownButton(self): """
[docs] Add selected target point to used points list. """ cur = self.ui.OrderList.currentRow() if cur<self.ui.OrderList.count()-1: self.ui.OrderList.insertItem( cur+1, self.ui.OrderList.takeItem( cur ) ) self.ui.OrderList.setCurrentRow(cur+1) if self.ui.OpenRadio.isChecked(): self.fillOpenTraverseEndPoints() def onCalcButton(self): """
[docs] Start a traverse calculation when the Calculate button pushed. """ if self.ui.buttonGroup.checkedId() == -1: QMessageBox.warning(self,u"Warning",u"Select the type of traverse line!") return # get the selected stations startpoint = self.ui.StartPointComboBox.itemData( self.ui.StartPointComboBox.currentIndex() ) if startpoint is None: QMessageBox.warning(self,u"Warning",u"Select start point!") self.ui.StartPointComboBox.setFocus() return endpoint = self.ui.EndPointComboBox.itemData( self.ui.EndPointComboBox.currentIndex() ) if endpoint is None: QMessageBox.warning(self,u"Warning",u"Select end point!") self.ui.EndPointComboBox.setFocus() return if self.ui.OrderList.count()==0: QMessageBox.warning(self,u"Warning",u"Add points to angle point list!") self.ui.OrderList.setFocus() return # fill stations list stations = [startpoint] for i in range(self.ui.OrderList.count()): station = self.ui.OrderList.item(i).data(Qt.UserRole) if i==0 and station == startpoint: continue if i==self.ui.OrderList.count()-1 and station == endpoint: continue stations.append(station) if not self.ui.OpenRadio.isChecked(): stations.append(endpoint) # add stations and observations to trav_obs trav_obs = [] for i in range(len(stations)): st = get_station(stations[i][0], stations[i][1], stations[i][2]) targets = get_targets(stations[i][0], stations[i][1], stations[i][2]) obs1 = None obs2 = None for target in targets: if i>0 and target[0]==stations[i-1][0]: if obs1 is None: obs1 = get_target(target[0],target[1],target[2]) if not self.ui.OpenRadio.isChecked() and (obs2 is not None or i==len(stations)-1): break elif i<len(stations)-1 and target[0]==stations[i+1][0]: if obs2 is None: obs2 = get_target(target[0],target[1],target[2]) if obs1 is not None or i==0: break elif self.ui.OpenRadio.isChecked() and i==len(stations)-1 and target[0]==endpoint[0]: if obs2 is None: obs2 = get_target(target[0],target[1],target[2]) if obs1 is not None: break trav_obs.append([st,obs1,obs2]) # Open Traverse: end point can be selected from end point list if self.ui.OpenRadio.isChecked(): trav_obs.append([Station( Point(endpoint[0]), \ PolarObservation(endpoint[0], 'station') ),None,None]) # if end point is a known point -> question known_list = get_known() if known_list is not None and endpoint[0] in known_list: reply = QMessageBox.question(self,u"Question", \ u"End point has coordinates.\nAre you sure you want to calculate an open traverse?", \ QMessageBox.Yes, QMessageBox.No) if reply == QMessageBox.No: return if self.ui.OpenRadio.isChecked(): plist = Calculation.traverse(trav_obs,True) else: plist = Calculation.traverse(trav_obs,False) if plist is not None: for pt in plist: tp = ScPoint(pt.id) tp.set_coord(pt) tp.store_coord(2) traversing_type = self.ui.buttonGroup.checkedButton().text() self.ui.ResultTextBrowser.append(u"\nTraversing - %s" % traversing_type) self.ui.ResultTextBrowser.append(" bearing bw dist") self.ui.ResultTextBrowser.append("Point angle distance (dE) (dN) dE dN") self.ui.ResultTextBrowser.append(" correction fw dist corrections Easting Northing") self.log.write() self.log.write_log(u"Traversing - %s" % traversing_type) self.log.write(" bearing bw dist") self.log.write("Point angle distance (dE) (dN) dE dN") self.log.write(" correction fw dist corrections Easting Northing") self.ui.ResultTextBrowser.append(ResultLog.resultlog_message) self.log.write(ResultLog.resultlog_message) else: QMessageBox.warning(self,u"Warning",u"Traverse line cannot be calculated!") self.ui.ResultTextBrowser.append(ResultLog.resultlog_message) self.log.write(ResultLog.resultlog_message) def onResetButton(self): """
[docs] Reset dialog when the Reset button pushed. """ self.reset() def onCloseButton(self): """
[docs] Close the dialog when the Close button pushed. """ self.accept()