from surveying_util import *
from gama_interface import *
# debugging
from PyQt4.QtCore import pyqtRemoveInputHook
import pdb
class NetworkDialog(QDialog):
"""
[docs] Class for network calculation dialog
"""
def __init__(self):
"""
Initialize dialog data and event handlers
"""
super(NetworkDialog, self).__init__()
self.ui = Ui_NetworkCalcDialog()
self.ui.setupUi(self)
self.points = []
self.fix = []
self.adj = []
# event handling
self.ui.CloseButton.clicked.connect(self.onCloseButton)
self.ui.ResetButton.clicked.connect(self.onResetButton)
self.ui.AddFixButton.clicked.connect(self.onAddFixButton)
self.ui.AddAdjButton.clicked.connect(self.onAddAdjButton)
self.ui.RemoveFixButton.clicked.connect(self.onRemoveFixButton)
self.ui.RemoveAdjButton.clicked.connect(self.onRemoveAdjButton)
self.ui.CalcButton.clicked.connect(self.onCalcButton)
def showEvent(self, event):
"""
[docs] Reset dialog to initial state
"""
self.points = get_measured()
self.fix = []
self.adj = []
# clear lists
self.ui.PointsList.clear()
self.ui.FixList.clear()
self.ui.AdjustedList.clear()
self.ui.ResultTextBrowser.clear()
if self.points is not None:
for p in self.points:
self.ui.PointsList.addItem(p[0])
def onCloseButton(self):
"""
[docs] Reset dialog to initial state after Reset button pressed
"""
self.reset()
def onAddFixButton(self):
"""
[docs] Move selected points to fix point list
"""
selected = self.ui.PointsList.selectedItems()
for item in selected:
i = self.ui.PointsList.row(item)
if self.points[i][1]:
self.ui.FixList.addItem(self.ui.PointsList.takeItem(i))
self.fix.append(self.points[i])
del self.points[i]
#i = self.ui.PointsList.currentRow()
#if i < 0:
# return
#if self.points[i][1]:
# # has coordinates
# item = self.ui.PointsList.takeItem(i)
# self.ui.FixList.addItem(item)
# self.fix.append(self.points[i])
# del self.points[i]
def onAddAdjButton(self):
"""
[docs] Move selected points to adjusted list
"""
selected = self.ui.PointsList.selectedItems()
for item in selected:
i = self.ui.PointsList.row(item)
self.ui.AdjustedList.addItem(self.ui.PointsList.takeItem(i))
self.adj.append(self.points[i])
del self.points[i]
#i = self.ui.PointsList.currentRow()
#if i < 0:
# return
#item = self.ui.PointsList.takeItem(i)
#self.ui.AdjustedList.addItem(item)
#self.adj.append(self.points[i])
#del self.points[i]
def onRemoveFixButton(self):
"""
[docs] Move back selected points from fixed list
"""
selected = self.ui.FixList.selectedItems()
for item in selected:
i = self.ui.FixList.row(item)
self.ui.PointsList.addItem(self.ui.FixList.takeItem(i))
self.points.append(self.fix[i])
del self.fix[i]
#i = self.ui.FixList.currentRow()
#if i < 0:
# return
#item = self.ui.FixList.takeItem(i)
#self.ui.PointsList.addItem(item)
#self.points.append(self.fix[i])
#del self.fix[i]
def onRemoveAdjButton(self):
"""
[docs] Move back selected points from adjusted list
"""
selected = self.ui.AdjustedList.selectedItems()
for item in selected:
i = self.ui.AdjustedList.row(item)
self.ui.PointsList.addItem(self.ui.AdjustedList.takeItem(i))
self.points.append(self.adj[i])
del self.adj[i]
#i = self.ui.AdjustedList.currentRow()
#if i < 0:
# return
#item = self.ui.AdjustedList.takeItem(i)
#self.ui.PointsList.addItem(item)
#self.points.append(self.adj[i])
#del self.adj[i]
def onCalcButton(self):
"""
[docs] Collect observations and adjust network
"""
if len(self.adj):
dimension = int(self.ui.DimensionComboBox.currentText())
conf = float(self.ui.ConfidenceComboBox.currentText())
stda = float(self.ui.AngleDevComboBox.currentText())
stdd = float(self.ui.DistDevMMComboBox.currentText())
stdd1 = float(self.ui.DistDevMMKMComboBox.currentText())
g = GamaInterface(dimension, conf, stda, stdd, stdd1)
# add points to adjustment
fix_names = []
adj_names = []
for fp in self.fix:
p = get_coord(fp[0])
g.add_point(p, 'FIX')
fix_names.append(fp[0])
for fp in self.adj:
p = get_coord(fp[0])
if p is None:
p = Point(fp[0])
g.add_point(p, 'ADJ')
adj_names.append(fp[0])
# add observations to adjustment
fb_list = get_fblist()
if fb_list is None:
return None
for fb in fb_list:
lay = get_layer_by_name(fb)
if lay is None:
continue
st = None
n_ori = 0 # number of orientation directions
n_adj = 0 # number of adjusted targets
for feat in lay.getFeatures():
pid = feat['point_id']
if feat['station'] == 'station':
if st is not None:
if (n_ori + n_adj == 0) or \
(st in fix_names and n_adj == 0):
# no adjusted point on known station, remove it
g.remove_last_observation(True)
st = None
n_ori = 0 # number of orientation directions
n_adj = 0 # number of adjusted targets
if pid in fix_names or pid in adj_names:
st = pid
o = PolarObservation(pid, feat['station'])
o.th = feat['th'] if type(feat['th']) is float else None
o.pc = feat['pc'] if type(feat['pc']) is str else None
g.add_observation(o)
# TODO empty station? without observation
else:
if st is not None and (pid in fix_names or pid in adj_names):
if dimension in [2, 3] and (type(feat['hz']) is float or \
type(feat['v']) is float and type(feat['sd']) is float) or \
dimension == 1 and type(feat['v']) is float and \
type(feat['sd']):
o = PolarObservation(pid, None)
o.hz = Angle(feat['hz'], 'GON') if type(feat['hz']) is float else None
o.v = Angle(feat['v'], 'GON') if type(feat['v']) is float else None
if type(feat['sd']) is float and \
(st in adj_names or pid in adj_names):
# add distance if one end is unknown
o.d = Distance(feat['sd'], 'SD')
o.th = feat['th'] if type(feat['th']) is float else None
o.pc = feat['pc'] if type(feat['pc']) is str else None
if o.hz is not None or o.d is not None:
# direction or distance given
g.add_observation(o)
if pid in fix_names:
n_ori += 1
if pid in adj_names:
n_adj += 1
t = g.adjust()
if t is None:
# adjustment failed
self.ui.ResultTextBrowser.append('gama-local not installed or other runtime error')
else:
self.ui.ResultTextBrowser.append(t)