Skip to content

Commit

Permalink
smaller bugfixes
Browse files Browse the repository at this point in the history
  • Loading branch information
EasyIsrael committed Feb 1, 2019
1 parent b954509 commit 9a6a9b3
Show file tree
Hide file tree
Showing 7 changed files with 91 additions and 72 deletions.
14 changes: 14 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4031,3 +4031,17 @@ build/lib/poitagger/poimodel.py
build/lib/poitagger/poiview.py
build/lib/poitagger/poimodel.py
build/lib/poitagger/poiview.py
poitagger/test/language/lang/de_de.qm
poitagger/test/language/lang/de_de.ts
poitagger/test/language/lang/en_us.qm
poitagger/test/language/lang/en_us.ts
poitagger/test/language/lang/es_es.qm
poitagger/test/language/lang/es_es.ts
poitagger/test/language/lang/tr_tr.qm
poitagger/test/language/lang/tr_tr.ts
poitagger/test/language/language.py
poitagger/test/language/language.qrc
poitagger/test/language/mainwindow.ui
poitagger/test/language/Makefile
poitagger/test/language/resources.py
poitagger/test/language/ui_mainwindow.py
3 changes: 2 additions & 1 deletion poitagger/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,8 @@ def connections(self):
self.flight.poisChanged.connect(lambda: self.pois.model.loadMeta(self.flight.p))
self.img.sigOrientation.connect(self.flight.setOrientation)
self.flight.pois.connect(self.treemain.reloadPoiFiles)

self.flight.sigEmpty.connect(self.geomain.view.clear)

# self.flight.pois.connect(lambda pois: self.pois.load(pois, self.flight.path))
self.flight.pois.connect(self.geomain.view.loadpois)

Expand Down
10 changes: 5 additions & 5 deletions poitagger/conf.ini
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
[PATHS]
rootdir=D:/WILDRETTER-DATEN
last=D:/WILDRETTER-DATEN/2018_KonstantinFuchs_DJI_XT2/19Nov.2018
last=D:/WILDRETTER-DATEN/2017_DLR/2017-04-05_14-56_Hausen
lastimgid=10
lastimgname=05220627_0046.ARA

[GUI]
size=@Size(1920 1053)
pos=@Point(-9 -1089)
size=@Size(1920 1047)
pos=@Point(1911 -9)
CalibDockVisible=true
DebugDockVisible=false
WorkflowDockVisible=false
Expand All @@ -25,8 +25,8 @@ ViewControlDockFocus=true
DEMDockFocus=false
ConsoleDockFocus=false
PoisDockFocus=true
GeoViewDockFocus=true
PixeltempDockFocus=false
GeoViewDockFocus=false
PixeltempDockFocus=true
InfoDockFocus=false
VerzeichnisDockFocus=true
FMInfoDockVisible=true
Expand Down
94 changes: 43 additions & 51 deletions poitagger/flightjson.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ def dictToParam(k,v,**kwargs):
# return {"name": str(k), 'type': "group", 'children': v}

if not isinstance(v,(MutableMapping,MutableSequence,tuple)):
return {"name": str(k), 'type': types.get(str(type(v)),"str"), 'readonly':True, 'decimals':9, 'value': v }
return {"name": str(k), 'type': types.get(str(type(v)),"str"), 'readonly':False, 'decimals':9, 'value': v }
else:
return {"name": str(k), 'type': "group", 'children': v}

Expand Down Expand Up @@ -104,10 +104,19 @@ def setMeta(self,fm):
self.flight.progress.connect(self.progressBar)
self.flight.ifm.progress.connect(self.progressBar)
self.flight.sigError.connect(self.errorMsg)
self.flight.sigEmpty.connect(self.createMsg)


def errorMsg(self,text):
QtGui.QMessageBox.critical(self, "Speichern von poitagger.json fehlgeschlagen!",text)

def createMsg(self):
reply = QtGui.QMessageBox.question(self, "Flightmeta-Datei anlegen?","Dieser Ordner enthält noch keine Flightmeta-Datei (.poitagger.json). Zur Georeferenzierung ist dies nötig.",)
if reply == QtGui.QMessageBox.Yes:
self.flight.loadAndSave()
else:
self.flight.start()

def progressBar(self,val):
if val == 0:
self.progressDialog.show()
Expand Down Expand Up @@ -159,8 +168,12 @@ class Flight(QtCore.QObject): #QThread
changed = QtCore.pyqtSignal()
loadfinished = QtCore.pyqtSignal()
sigError = QtCore.pyqtSignal(str)
sigEmpty = QtCore.pyqtSignal()
sigClear = QtCore.pyqtSignal()

progress = QtCore.pyqtSignal(int)
path = None

def __init__(self, filename= ".poitagger.json"):
super().__init__()
self.filename= filename
Expand All @@ -177,6 +190,9 @@ def __init__(self, filename= ".poitagger.json"):
self.p.child("uavpath").sigValueChanged.connect(self.prepareUavPath)
self.p.child("pois").sigTreeStateChanged.connect(self.__loadPoisList)
self.p.child("pois").sigTreeStateChanged.connect(lambda: self.poisChanged.emit())
self.save_after_loading = False
self.loadfinished.connect(self.savehandler)

def prepareGeneral(self,generalparam):
if generalparam.children()== [] : return
self.general.emit(generalparam)
Expand Down Expand Up @@ -238,7 +254,6 @@ def setOrientation(self,val):
def enableImport(self,toggle):
self.import_enabled = toggle


def setFromImport(self,value):
self.task = "restoreParameter"
#print(value)
Expand All @@ -253,54 +268,44 @@ def setFromImport(self,value):


def start(self): #run

#t0 = time.time()

self.progress.emit(0)
#print("A")
#QtTest.QTest.qWait(300)
#print ("jetzt")
if self.task == "restoreParameter":
self.p.child("general").restoreState(self.meta["children"]["general"])
#self.progress.emit(20)
# print("general")
self.p.child("pois").restoreState(self.meta["children"]["pois"])
self.progress.emit(40)
# print("pois")
self.p.child("uavpath").restoreState(self.meta["children"]["uavpath"])
self.progress.emit(60)
# print("uavpath")
self.p.child("calibration").restoreState(self.meta["children"]["calibration"])
#self.p.restoreState(self.meta)
self.progress.emit(80)
#print("calibration")
self.p.child("images").restoreState(self.meta["children"]["images"])

#progress.emit(50)

# elif self.task == "loadJson":
# try:
# with open(os.path.join(self.path,self.filename), 'r') as stream:
# self.p.restoreState(json.load(stream))#,Loader=yamlordereddictloader.Loader))
# except:
# logging.error("Flightmeta load", exc_info=True)
else:
#print("TASK",self.task)
self.p.child("general").clearChildren()
self.p.child("pois").clearChildren()
#self.p.child("images").clearChildren()
self.p.child("uavpath").clearChildren()
self.p.child("calibration").clearChildren()
#t1 = time.time()
#print("FLIGHT start",t1-t0)
self.progress.emit(100)
self.loadfinished.emit()
#if self.task=="loadEmpty":
# print("loadEmpty")
# self.sigClear.emit()

def loadAndSave(self):
#print("loadANdSave")
self.enableImport(True)
self.save_after_loading=True
self.load()
self.enableImport(False)

def savehandler(self):
#print("nowSave",self.save_after_loading)
if self.save_after_loading:
self.save()
self.save_after_loading = False

def load(self,path=None,filename=None):
#self.sigStart.emit()
self.progress.emit(0)

# print ("LOAD")
# self.save()

if path:
self.path = path
Expand All @@ -322,14 +327,23 @@ def load(self,path=None,filename=None):
# logging.warning("Loading flightmeta failed")

def _loadEmpty(self):
hasimages = False
for file in os.listdir(self.path):
if os.path.splitext(file)[1].lower() in image.SUPPORTED_EXTENSIONS:
hasimages=True
self.task = "loadEmpty"
if hasimages:
self.sigEmpty.emit()
return
self.start()

def _loadJson(self):
self.task = "loadJson"
self.start()

def save(self):
if self.path == None: return
if self.task == "loadEmpty": return
try:
ppath = str(self.p.child("general").child("path").value())
text = "Der Pfad aus .poitagger.json stimmt nicht mit dem Speicherort überein.\n .poitagger.json: {0}, Speicherort: {1}".format(ppath,self.path)
Expand Down Expand Up @@ -375,7 +389,6 @@ def load(self,path=None,loadJson=False):
self.path = path
self.loadJson=loadJson
self.start()


def _loadImagesHeader(self):
self.ImgHdr = []
Expand Down Expand Up @@ -436,7 +449,6 @@ def _generalParams(self):
logging.error("FM _generalParams failed",exc_info=True)
return {"bounding":self._getBounding(self.ImgHdr),"path":self.path,"images": {"width":width,"height":height,"bitdepth":bitdepth,"orientation":orientation}}


def _getBounding(self,ImgHdr):
Lat, Lon = [],[]
for i in ImgHdr:
Expand Down Expand Up @@ -469,12 +481,8 @@ def _loadCalibration(self):
if v.count(v[0])==len(v): bore[k] = v[0]
else: bore[k] = np.bincount(v).argmax() #achtung rundet ab!


self.calibration = {"geometric":geom,"radiometric":radi,"boresight":bore}

# print (self.calibration)



def _importPois(self, poisxmlfile = "pois.xml"):
xslt_root = etree.XML('''\
Expand All @@ -500,7 +508,6 @@ def _importPois(self, poisxmlfile = "pois.xml"):
transform = etree.XSLT(xslt_root)
doc = etree.parse(poisxmlfile)
result_tree = transform(doc)
#print (str(result_tree)[23:-3]+"]")
try:
pois = json.loads(str(result_tree)[23:-3]+"]")
except:
Expand Down Expand Up @@ -535,10 +542,7 @@ def _importPois(self, poisxmlfile = "pois.xml"):
return out

def run(self):
#self.progressBar()
#t0 = time.time()
if self.loadJson:
#elif self.task == "loadJson":
try:
with open(self.path, 'r') as stream:
self.Meta = json.load(stream)#,Loader=yamlordereddictloader.Loader))
Expand All @@ -548,32 +552,20 @@ def run(self):
self.pois = {"name":"pois","type":"group", "expanded":True, "children":[]}
self. images = []
self.calibration = {}
#self.progress.emit(10)
self.ImgHdr = self._loadImagesHeader()
#t1 = time.time()
#print("LoadImages",t1-t0)
self.progress.emit(60)
self._loadCalibration()
#t2 = time.time()
#print("CAL",t2-t1)
self.progress.emit(70)
self._createUavPath()
self.progress.emit(80)
#t3 = time.time()
#print("UAVPATH",t3-t2)
self.general = self._generalParams()
self.progress.emit(90)

#t4 = time.time()
#print("generalParams",t4-t3)
m = {"general": self.general, "pois":self.pois, "calibration": self.calibration, "images": self.images, "uavpath": self.uavpath}
self.Meta.update(m)
poispath = os.path.join(self.path, "pois.xml")
if os.path.exists(poispath):
self.pois = self._importPois(poispath)
self.Meta["pois"] = self.pois
#t5 = time.time()
#print("POIS",t5-t4)
self.progress.emit(100)
self.Meta = nested.Nested(self.Meta,dictToParam).data

Expand Down
12 changes: 8 additions & 4 deletions poitagger/geoview.py
Original file line number Diff line number Diff line change
Expand Up @@ -153,11 +153,14 @@ def disableJS(self):
def setMarker(self,lat,lng):
#print("geoview: setMarker")
self.page.runJavaScript('var marker = new mapboxgl.Marker().setLngLat([{}, {}]).addTo(map);'.format(lng,lat))

def clear(self):
geojson = {"type": "Feature", "geometry": {"type": "LineString","coordinates": []}}
self.page.runJavaScript('map.getSource("uavpath").setData({});'.format(geojson))
#print("geoview: clear")
self.page.runJavaScript('map.removeLayer("uavpath");map.removeSource("uavpath");') #console.log(map.getSource("uav"))
self.page.runJavaScript('map.removeLayer("pois");map.removeSource("pois");') #console.log(map.getSource("uav"))
self.page.runJavaScript('marker.remove();')
#self.page.runJavaScript('map.removeLayer("uavpath");map.removeSource("uavpath");') #console.log(map.getSource("uav"))
#self.page.runJavaScript('map.removeLayer("pois");map.removeSource("pois");') #console.log(map.getSource("uav"))
#self.page.runJavaScript('marker.remove();')

def loadpois(self,pois):
if not self.jsloaded: return
Expand Down Expand Up @@ -207,7 +210,8 @@ def panMap(self, lat, lng):
def setUavPath(self,uavpath):
if not self.jsloaded: return
P = np.array(uavpath)
if len(P)==0: return
if len(P)==0:
return
try:
bound = [[P.T[0].min(),P.T[1].min()],[P.T[0].max(),P.T[1].max()]]
self.fitBounds(bound)
Expand Down
26 changes: 16 additions & 10 deletions poitagger/image.py
Original file line number Diff line number Diff line change
Expand Up @@ -591,7 +591,7 @@ def __init__(self,imgpath=None,bitsPerPixel=np.uint16,onlyheader=False):
if imgpath is not None:
self.load(imgpath,onlyheader=onlyheader)

def load(self,imgpath,headersize = 512 ,resolution = (640,512),bitsPerPixel = np.uint16,onlyheader=False):
def load(self,imgpath,headersize = 512 ,resolution = (640,512),bitsPerPixel = np.uint16,onlyheader=False,old=True):
self.header = {"camera":{},"uav":{},"image":{},"file":{},"gps":{},"rawimage":{},
"calibration":{"geometric":{},"radiometric":{},"boresight":{}},"exif":{},"rawimage":{},
"thumbnail":{}, }
Expand All @@ -601,7 +601,7 @@ def load(self,imgpath,headersize = 512 ,resolution = (640,512),bitsPerPixel = np
try:
with open(imgpath, 'rb') as fileobj:
self.read_header(fileobj,headersize)
self.get_meta()
self.get_meta(old)
if not onlyheader:
self.read_body(fileobj,BITDEPTH[self.header["image"]["bitdepth"]],
self.header["image"]["width"],self.header["image"]["height"])
Expand Down Expand Up @@ -678,7 +678,7 @@ def read_header(self, fileobj, size):
except:
logging.error("read header failed", exc_info=True)

def get_meta(self):
def get_meta(self,old=True):
self.exif = self.rawheader
self.xmp = ""

Expand All @@ -687,10 +687,16 @@ def get_meta(self):
self.header["image"]["height"] = self.rawheader["bitmap"]["height"]
self.header["image"]["bitdepth"] = self.rawheader["bitmap"]["bitperpixel"]

self.header["camera"]["roll"] = self.rawheader["falcon"]["cam_angle_roll"]/10.0**2
self.header["camera"]["yaw"] = self.rawheader["falcon"]["angle_yaw"]/10.0**2
#self.rawheader["falcon"]["cam_angle_yaw"]/10.0**2
self.header["camera"]["pitch"] = self.rawheader["falcon"]["cam_angle_pitch"]/10.0**2
if old:
self.header["camera"]["roll"] = - self.rawheader["falcon"]["cam_angle_roll"]/10.0**2
self.header["camera"]["yaw"] = self.rawheader["falcon"]["angle_yaw"]/10.0**2
#self.rawheader["falcon"]["cam_angle_yaw"]/10.0**2
self.header["camera"]["pitch"] = - self.rawheader["falcon"]["cam_angle_pitch"]/10.0**2
else:
self.header["camera"]["roll"] = self.rawheader["falcon"]["cam_angle_roll"]/10.0**2
self.header["camera"]["yaw"] = self.rawheader["falcon"]["angle_yaw"]/10.0**2
#self.rawheader["falcon"]["cam_angle_yaw"]/10.0**2
self.header["camera"]["pitch"] = self.rawheader["falcon"]["cam_angle_pitch"]/10.0**2
self.header["camera"]["euler_order"] = "ZXY"

self.header["camera"]["model"] = str(self.rawheader["camera"]["partnum"].strip(b"\x00"))
Expand Down Expand Up @@ -766,9 +772,9 @@ def get_meta(self):
self.header["calibration"]["changed_flags"] = self.rawheader["dlr"]["changed_flags"]
self.header["calibration"]["error_flags"] = self.rawheader["dlr"]["error_flags"]
self.header["calibration"]["flags"] = self.rawheader["dlr"]["flags"]
self.header["calibration"]["boresight"]["cam_pitch_offset"] = self.rawheader["dlr"]["cam_pitch_offset"]/10.0**3
self.header["calibration"]["boresight"]["cam_roll_offset"] = self.rawheader["dlr"]["cam_roll_offset"]/10.0**3
self.header["calibration"]["boresight"]["cam_yaw_offset"] = self.rawheader["dlr"]["cam_yaw_offset"]/10.0**3
self.header["calibration"]["boresight"]["cam_pitch"] = self.rawheader["dlr"]["cam_pitch_offset"]/10.0**3
self.header["calibration"]["boresight"]["cam_roll"] = self.rawheader["dlr"]["cam_roll_offset"]/10.0**3
self.header["calibration"]["boresight"]["cam_yaw"] = self.rawheader["dlr"]["cam_yaw_offset"]/10.0**3
self.header["calibration"]["boresight"]["cam_euler_order"] = "ZYX"
self.header["calibration"]["boresight"]["timestamp"] = self.rawheader["dlr"]["boresight_calib_timestamp"]
self.header["calibration"]["radiometric"]["B"] = self.rawheader["dlr"]["radiometric_B"]/10.0**2
Expand Down
4 changes: 3 additions & 1 deletion poitagger/poiview.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,8 +92,10 @@ def addPoi(self,value):
self.t.setCurrentItem(currentItem)
self.t.editItem(currentItem,0)

def jumpTo(self):
def jumpTo(self): #jump in the treeview to the image that is currently selected
logging.warning("image jumpTo")
cur = self.t.currentItem()
logging.warning(cur.param.opts)
if cur== None: return
if cur.param.opts.get("paramtyp")=="view":
self.sigJumpTo.emit(cur.param.name())
Expand Down

0 comments on commit 9a6a9b3

Please sign in to comment.