Code:
// OBSERVATORIES V0.001 2017 StephenG1CMZ
LOCAL LF:=CHAR(10);
LOCAL FS:=Notes("OBSERVATORIES.MPC");
//CUSTOMISE
LOCAL SHOWPROGRESS:=0;
LOCAL LINES;
LOCAL ZNAN;
LOCAL OBSCODE,OBSFULLNAME;
LOCAL OBSNUMI;
LOCAL OBSCODES:={},OBSFULLNAMES:={};
LOCAL OBSLNGS:={};
LOCAL OBSLATS:={};
LOCAL LINESPOS:={};
LOCAL NUM1,NUM2,NUM3,NUM3SIGN;
LOCAL LNGNUM;
LOCAL LATCOS,LATSIN,LAT;
IZWHITE(ST)
BEGIN
LOCAL WHITESP:=" ";
LOCAL POS:=1;
IF DIM(ST)==0 THEN
MSGBOX("EMPTY");
RETURN 1;
END;
WHILE INSTRING(WHITESP,MID(ST,POS,1)) AND POS≤DIM(ST) DO
POS:=POS+1;
END;
RETURN (POS>DIM(ST)); //1=WHITESPACE ELSE 0
END;
PARSE_OBS(ALINE)
BEGIN
OBSCODE:=MID(ALINE,1,4);
IF SHOWPROGRESS THEN
DRAWMENU(OBSCODE);
END;
//IF MID(OBSCODE,4)==" " THEN
//ELSE
// MSGBOX("BAD OBSCODE "+ASC(MID(OBSCODE,4)));
// RECT_P();
// END;
//PRINT(ALINE);
IF OBSCODE=="Code" THEN
//HEADR LINE
ELSE
ZNAN:=0;
NUM1:=(MID(ALINE,4,10));
IF IZWHITE(NUM1) THEN
//PRINT(".");
NUM1:="0";ZNAN:=1; //NAN
//DEBUG;
END;
LNGNUM:=EXPR(NUM1);
IF ZNAN THEN
LAT:=0;
ELSE
NUM2:=MID(ALINE,4+10,8);
NUM3SIGN:=MID(ALINE,4+10+8,1);
NUM3:=MID(ALINE,4+10+8+1,8);
//LATCOS:=ACOS(EXPR(NUM2));
LATCOS:=EXPR(NUM2);
//PRINT(LATCOS);DEBUG;
//PRINT(NUM3);
LATSIN:=(180/π)*ASIN(EXPR(NUM3));
//LAT:=(LATCOS+LATSIN)/2;
END;
IF NUM3SIGN=="-" THEN
LATSIN:=−LATSIN;
END;
//
LAT:=LATSIN;
OBSFULLNAME:=MID(ALINE,32-1);
//PRINT(MID(ALINE,1,4)+" "+OBSNAME);
OBSCODES(OBSNUMI):=OBSCODE;
OBSFULLNAMES(OBSNUMI):=OBSFULLNAME;
OBSLNGS(OBSNUMI):=LNGNUM;
OBSLATS(OBSNUMI):=LAT;
IF OBSCODE=="007 " AND 0 THEN
MSGBOX("48-50= "+→HMS(LAT));
END;
OBSNUMI:=OBSNUMI+1;
END;
END;
EXPORT READ_ALL_OBS(ST)
BEGIN
LOCAL LFOFFSET,CH;
LOCAL FRM,TOO;
LOCAL TMP;
LINESPOS:={0};
LINES:=1; OBSNUMI:=1;
IF SHOWPROGRESS OR 1 THEN
DRAWMENU("Loading");
END;
REPEAT
LFOFFSET:=INSTRING(MID(ST,LINESPOS(LINES)+1),LF);
IF LFOFFSET THEN
LINESPOS(LINES+1):=LINESPOS(LINES)+LFOFFSET;
CH:= MID(ST,LINESPOS(LINES+1),1);
IF CH==LF THEN
ELSE
MSGBOX("BAD LF"+CH);
END;
FRM:=LINESPOS(LINES)+1;
TOO:=LINESPOS(LINES+1);
PARSE_OBS(MID(ST,FRM,TOO-FRM));
IF MID(ST,FRM,1)=="Z" AND 0 THEN
PRINT("LINE"+LINES+"FRM"+FRM+"TO"+TOO);
PRINT("CODE: "+MID(ST,FRM,4));
PRINT(MID(ST,FRM,TOO-FRM));
END;
LINES:=LINES+1;
//WAIT;
END;
UNTIL LFOFFSET==0;
//DEBUG;
//FINAL LINE IF LAST LF MISSING
FRM:=LINESPOS(LINES)+1;
TOO:=SIZE(ST)-FRM;
PARSE_OBS(MID(ST,FRM,TOO));
//PRINT("SIZE "+SIZE(ST));
//PRINT("Lines: "+LINES);
END;
QUICKPLOT()
BEGIN
LOCAL II,XX,YY;
RECT_P();
//(NEEDS ":0-360=-180,180 ETC
//MSGBOX(SIZE(OBSFULLNAMES));
FOR II FROM 1 TO SIZE(OBSFULLNAMES) DO
XX:=OBSLNGS(II);
XX:=IFTE(XX>180,−(360-XX),XX);
XX:=(320/360)*OBSLNGS(II);
YY:=(240/180)*(OBSLATS(II)+90);
RECT_P(XX,YY,XX,YY,RGB(255,0,0),RGB(99,99,99));
END;
DRAWMENU("DONE");
END;
VERY_INFO()
BEGIN
WAIT;
PRINT("Found "+SIZE(OBSCODES)+" Observatories");
END;
PROGRAMR_INFO()
//USE FOR DISPLAY SIZING
BEGIN
LOCAL II,ML,LONGNAME;
PRINT("Longitudes:"+MIN(OBSLNGS)+".."+MAX(OBSLNGS));
PRINT("Latitudes: "+MIN(OBSLATS)+".."+MAX(OBSLATS));
ML:=0;
FOR II FROM 1 TO SIZE(OBSFULLNAMES) DO
IF DIM(OBSFULLNAMES(II))>ML THEN
ML:=DIM(OBSFULLNAMES(II));
LONGNAME:=OBSFULLNAMES(II);
END;
END;
PRINT("LONGFULLNAME "+ML);
PRINT(LONGNAME);
WAIT;
TEXTOUT_P(LONGNAME,0,200,3);//3 IS LARGEST FONT TO FIT NAME ON 1 LINE
END;
EXPORT OBS()
BEGIN
LOCAL TBEG;
PRINT();
//MSGBOX(IZWHITE(" B "));
TBEG:=TICKS;
READ_ALL_OBS(FS);
TBEG:=TICKS-TBEG;
PRINT((TBEG/1000)+" s");
VERY_INFO();
PROGRAMR_INFO();
//MSGBOX("DONE");
WAIT;
QUICKPLOT();
WAIT;
END;