diff -r 000000000000 -r bb616224c02a kml/hh_http.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kml/hh_http.py Mon May 18 08:48:51 2020 +0200 @@ -0,0 +1,258 @@ +# coding=utf8 + +import sys +import os +import time +import cgi +import cgitb +import html +from kml import * +from kml import deb +from subprocess import Popen + +class Http(): + titles = {} + titles['general'] = """ +● vytvoří KML-stream z elementů LookAt pro GoogleEarth tak, aby vznikl pohyb kamery jako symetrický průlet kolem cílového bodu, na který kamera po celou dobu letu hledí +● cílový bod leží v počátku lokálních souřadnic letu +● křivka průletu je parabola y = abs(Y1 + x**exp) s počátkem v bodu průletu a je symetrická podle roviny y,z lokálních souřadnic +● zadávané souřadnice výchozího bodu a bodu průletu jsou lokální souřadnice (v metrech) vzhledem k cílovému bodu +● výchozí bod má souřadnice X0>=0, Y0, Z0>{minZ}; pro X0=0 se vytváří jen jediný LookAt (vlastně Placemark) +● bod průletu má souřadnice X1=0, Y1, Z1>{minZ} +● zadávaný exponent paraboly je exp>0; pro exp=1 přejde parabola do polopřímek +● pro Z0=Z1 probíhá let ve vodorovné rovině, pro Y0=Y1 ve svislé rovině rovnoběžné s osou x +● zadávané geodetické souřadnice cílového bodu (ve stupních) a azimut kamery na startu (sever=0) uchycují lokální soustavu do geodetických souřadnic, výška cílového bodu je vždy 0 nad terénem +● průběh rychlosti se může zadat jako nelineární se zpomalením v průletu s několika druhy průběhu +● přepínač "flyby" řídí vytvoření celého průletu nebo jen letu do největšího přiblížení (do bodu průletu) +● konfigurace letů a geo-souřadnice cílových bodů je možno pojmenovat a uložit ("store conf" resp. "store geo") a později vytáhnout do formuláře ("get conf" resp. "get geo") +""" + titles['name'] = 'jméno pro uložení aktuální konfigurace z obrazovky na server {server}' + titles['target'] = 'jméno pro uložení aktuálních geodetických souřadnic cílového bodu z obrazovky na server {server}' + titles['submitstored'] = 'vytvořit KML-stream z konfigurace uložené na serveru {server} pod zadaným jménem' + titles['submitconf'] = 'vytvořit KML-stream z konfigurace vyplněné ve formuláři na obrazovce' + titles['storeconf'] = 'uložit konfiguraci na server {server} pod jménem zadaným v položce name' + titles['getconf'] = 'vytáhnout konfiguraci uloženou na serveru {server} pod zadaným jménem' + titles['storegeo'] = 'uložit souřadnice cílového bodu na server {server} pod jménem zadaným v položce target' + titles['getgeo'] = 'vytáhnout souřadnice cílového bodu uložené na serveru {server} pod jménem zadaným v položce target' + titles['azimuth'] = 'geodetický azimut cílového bodu při pohledu z výchozího bodu x0,y0,z0' + titles['speedfact'] = 'koeficient konstantní složky rychlosti letu >0' + titles['slowfact'] = 'koeficient zpomalení v průletu >0' + titles['slowdown'] = 'průběh zpomalení v průletu' + titles['exponent'] = 'exponent (>0) průletové paraboly x = abs(Y1 + x**exp); pro exp=1 přejde parabola do polopřímek s počátkem v bodu průletu' + titles['flyby'] = 'přepínač průlet/nálet; nálet = let z výchozího bodu do maximálního přiblížení (bodu průletu)' + titles['steps'] = 'počet bodů KML-streamu < {stepsMax}' + titles['xyz0'] = 'lokální souřadnice X0>=0, Y0, Z0>{minZ} v metrech výchozího (krajního) bodu průletové paraboly x = abs(Y1 + x**exp); počátek lokálních souřadnic je v cílovém bodě' + titles['xyz1'] = 'lokální souřadnice X1=0, Y1, Z1>{minZ} bodu průletu kolem cílového bodu po parabole x = abs(Y1 + x**exp); počátek lokálních souřadnic je v cílovém bodě' + titles['lat'] = 'geodetická šířka cílového bodu ve stupních -90<š<90; cílový bod je zároveň počátkem lokálních souřadnic letové paraboly' + titles['long'] = 'geodetická délka cílového bodu ve stupních -180') + print('') + print('') + print('') + print('
'.format(html.escape(self.titles['general']))) + print('
Google Earth parabolic flyby') + print(' 
?
') + print('

') + + def htmltrail(self): + print('') + + def sendform(self, confirm=True): + c = self.c + # cgitb.enable() + # cgi.test() + self.htmlhead() + if(confirm): self.sendconfirm() + + if(c.flagged): + print('

FLAG

') + print('
') + print('' + .format(kaname=c.name.keyact, actualname=c.name.val)) + print('' + .format(katargname=c.targname.keyact, actualtargname=c.targname.val)) + print('' + .format(kaslowdown=c.slowdown.keyact, actualsldn=c.slowdown.val)) + + print('
') + print('' + .format(self.titles['getconf'])) + print('' + .format(self.titles['storeconf'])) + print('' + .format(html.escape(self.titles['submitstored']))) + print('

') + + print('') + print('' + .format(kla=c.lat.key, vla=c.lat.val, lat=self.titles['lat'], flag='' if c.lat.chk else 'flag')) + print('' + .format(klo=c.long.key, vlo=c.long.val, long=self.titles['long'], flag='' if c.long.chk else 'flag')) + print('
') + print('' + .format(self.titles['getgeo'])) + print('' + .format(self.titles['storegeo'])) + print('

') + + print('') + print('' + .format(kx0=c.x0.key, vx0=c.x0.val, xyz0=self.titles['xyz0'], flag='' if c.x0.chk else 'flag')) + print('' + .format(ky0=c.y0.key, vy0=c.y0.val, xyz0=self.titles['xyz0'], flag='' if c.y0.chk else 'flag')) + print('' + .format(kz0=c.z0.key, vz0=c.z0.val, xyz0=self.titles['xyz0'], flag='' if c.z0.chk else 'flag')) + print('') + print('') + print('' + .format(kh0=c.h0.key, vh0=c.h0.val, azimuth=self.titles['azimuth'], flag='' if c.h0.chk else 'flag')) + print('' + .format(ky1=c.y1.key, vy1=c.y1.val, xyz1=self.titles['xyz1'], flag='' if c.y1.chk else 'flag')) + print('' + .format(kz1=c.z1.key, vz1=c.z1.val, xyz1=self.titles['xyz1'], flag='' if c.z1.chk else 'flag')) + print('') + print('') + print('' + .format(kspeedfact=c.speedfact.key, speedfact=c.speedfact.val, tspeedfact=self.titles['speedfact'], flag='' if c.speedfact.chk else 'flag')) + print('' + .format(kslowdown=c.slowdown.key, slowdown='' if not c.slowdown.chk else SpeedAdjust.abrv[c.slowdown.val], + tslowdown=self.titles['slowdown'], flag='' if c.slowdown.chk else 'flag')) + print('' + .format(kslowdfact=c.slowdfact.key, slowdfact=c.slowdfact.val, tslowfact=self.titles['slowfact'], flag='' if c.slowdfact.chk else 'flag')) + print('') + print('') + print('' + .format(kex=c.exp.key, vex=c.exp.val, exponent=self.titles['exponent'], flag='' if c.exp.chk else 'flag')) + print('' + .format(kfl=c.flyby.key, vfl=(1 if c.flyby.val else 0), flyby=self.titles['flyby'])) + print('' + .format(kst=c.steps.key, vst=c.steps.val, steps=self.titles['steps'], flag='' if c.steps.chk else 'flag')) + print('') + print('
') + + print('' + .format(submitconf=self.titles['submitconf'])) + print('' + .format(storeconf=self.titles['storeconf'])) + print('') + for i in SpeedAdjust.keys: + print('
') + self.htmltrail() + + def sendconfirm(self): + print(""" + {}

+
+ Flyby KML is ready to be opened on Google Earth (GE):
+
+
+ + +
+

{conf}
{coor}
+

+ """.format(time.asctime(), self.c.dnldqual, conf=self.c.confcomm, coor=self.c.coorcomm)) + + def httpheader(self, fn): + print('Content-Type: application/vnd.google-earth.kml+xml') + print('Content-Disposition: attachment; filename="{}"'.format(fn)) + print() + + def sendfile(self, fn): + self.httpheader(fn) + sys.stdout.flush() + p = Popen(('cat', fn)) + p.wait() + sys.stdout.close()