mirror of https://github.com/XEphem/XEphem.git
710 lines
19 KiB
C
710 lines
19 KiB
C
/* implement the manual sky coords conversion tool */
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <ctype.h>
|
|
#include <math.h>
|
|
#include <string.h>
|
|
#include <time.h>
|
|
#include <unistd.h>
|
|
|
|
#include <Xm/Xm.h>
|
|
#include <Xm/Form.h>
|
|
#include <Xm/Label.h>
|
|
#include <Xm/PushB.h>
|
|
#include <Xm/RowColumn.h>
|
|
#include <Xm/TextF.h>
|
|
|
|
#include "xephem.h"
|
|
|
|
static void cc_create (void);
|
|
static void cc_point_cb (Widget w, XtPointer client, XtPointer call);
|
|
static void cc_getsky_cb (Widget w, XtPointer client, XtPointer call);
|
|
static void cc_eyep_cb (Widget w, XtPointer client, XtPointer call);
|
|
static void cc_canonFormat_cb (Widget w, XtPointer client, XtPointer call);
|
|
static void cc_vchg_cb (Widget w, XtPointer client, XtPointer call);
|
|
static void cc_help_cb (Widget w, XtPointer client, XtPointer call);
|
|
static void cc_close_cb (Widget w, XtPointer client, XtPointer call);
|
|
static void cc_popdown_cb (Widget w, XtPointer client, XtPointer call);
|
|
static void cc_newval (Widget w);
|
|
static void canonAll (void);
|
|
static void canonFmt (char buf[], double v, int h);
|
|
static void reFormat (Widget w, int h);
|
|
|
|
static Widget ccshell_w; /* main shell */
|
|
static Widget ccalt_w; /* TF */
|
|
static Widget ccaz_w; /* TF */
|
|
static Widget ccra_w; /* TF */
|
|
static Widget ccdec_w; /* TF */
|
|
static Widget ccglat_w; /* TF */
|
|
static Widget ccglng_w; /* TF */
|
|
static Widget cceclat_w; /* TF */
|
|
static Widget cceclng_w; /* TF */
|
|
static Widget ccdt_w; /* time stamp label */
|
|
static Widget ccral_w; /* RA epoch label */
|
|
static Widget cclra_w; /* TF, epoch local to this window */
|
|
static Widget ccldec_w; /* TF, RA local to this window */
|
|
static Widget ccle_w; /* TF, Dec local to this window */
|
|
static Widget lastchg_w; /* which ever TF was last edited */
|
|
|
|
static int block_vchg; /* set to block valueChanged callback */
|
|
|
|
static char cccategory[] = "Coordinate converter"; /* Save category */
|
|
|
|
/* bring up the Manual dialog */
|
|
void
|
|
cc_manage (void)
|
|
{
|
|
if (!ccshell_w) {
|
|
cc_create();
|
|
cc_newval (ccra_w);
|
|
cc_canonFormat_cb (NULL, NULL, NULL);
|
|
}
|
|
|
|
XtPopup (ccshell_w, XtGrabNone);
|
|
set_something (ccshell_w, XmNiconic, (XtArgVal)False);
|
|
}
|
|
|
|
/* new main Now: hold ra/dec and update alt/az */
|
|
void
|
|
cc_update (np, how_much)
|
|
Now *np;
|
|
int how_much;
|
|
{
|
|
if (!isUp(ccshell_w))
|
|
return;
|
|
|
|
cc_newval (lastchg_w);
|
|
}
|
|
|
|
/* called to put up or remove the watch cursor. */
|
|
void
|
|
cc_cursor (c)
|
|
Cursor c;
|
|
{
|
|
Window win;
|
|
|
|
if (ccshell_w && (win = XtWindow(ccshell_w)) != 0) {
|
|
Display *dsp = XtDisplay(ccshell_w);
|
|
if (c)
|
|
XDefineCursor (dsp, win, c);
|
|
else
|
|
XUndefineCursor (dsp, win);
|
|
}
|
|
}
|
|
|
|
/* create the Manual entry dialog */
|
|
static void
|
|
cc_create (void)
|
|
{
|
|
typedef struct {
|
|
char *label; /* label */
|
|
char *def; /* default value */
|
|
Widget *wp; /* TF widget */
|
|
char *tip; /* widget tip */
|
|
} CCMField;
|
|
static CCMField ccfields[] = {
|
|
{"RA @ ", " 00:00:00.00", &cclra_w,
|
|
"RA, hours @ Equinox at left"},
|
|
{"Declination:", " 00:00:00.00", &ccldec_w,
|
|
"Dec, degrees @ Equinox at left"},
|
|
{"RA @ XXXXXX", " 00:00:00.00", &ccra_w,
|
|
"RA, hours @ Equinox in Main"},
|
|
{"Declination:", " 00:00:00.00", &ccdec_w,
|
|
"Dec, degrees @ Equinox in Main"},
|
|
{"Altitude:", " 00:00:00.00", &ccalt_w,
|
|
"Altitude, degrees"},
|
|
{"Azimuth:", " 00:00:00.00", &ccaz_w,
|
|
"Azimuth, degrees E of N"},
|
|
{"Galactic lat:", " 00:00:00.00", &ccglat_w,
|
|
"Galactic latitude, degrees"},
|
|
{"Galactic lng:", " 00:00:00.00", &ccglng_w,
|
|
"Galactic longitude, degrees"},
|
|
{"Ecliptic lat:", " 00:00:00.00", &cceclat_w,
|
|
"Ecliptic latitude, degrees"},
|
|
{"Ecliptic lng:", " 00:00:00.00", &cceclng_w,
|
|
"Ecliptic longitude, degrees"},
|
|
};
|
|
Widget w;
|
|
Widget cc_w, rc_w;
|
|
Arg args[20];
|
|
int i;
|
|
int n;
|
|
|
|
n = 0;
|
|
XtSetArg (args[n], XmNallowShellResize, True); n++;
|
|
XtSetArg (args[n], XmNcolormap, xe_cm); n++;
|
|
XtSetArg (args[n], XmNtitle, "xephem Coordinate converter"); n++;
|
|
XtSetArg (args[n], XmNiconName, "Coords"); n++;
|
|
XtSetArg (args[n], XmNdeleteResponse, XmUNMAP); n++;
|
|
ccshell_w = XtCreatePopupShell ("CoordsConv", topLevelShellWidgetClass,
|
|
toplevel_w, args, n);
|
|
setup_icon (ccshell_w);
|
|
set_something (ccshell_w, XmNcolormap, (XtArgVal)xe_cm);
|
|
XtAddCallback (ccshell_w, XmNpopdownCallback, cc_popdown_cb, 0);
|
|
sr_reg (ccshell_w, "XEphem*CoordsConv.x", cccategory, 0);
|
|
sr_reg (ccshell_w, "XEphem*CoordsConv.y", cccategory, 0);
|
|
|
|
n = 0;
|
|
XtSetArg (args[n], XmNmarginHeight, 10); n++;
|
|
XtSetArg (args[n], XmNmarginWidth, 20); n++;
|
|
XtSetArg (args[n], XmNverticalSpacing, 10); n++;
|
|
XtSetArg (args[n], XmNfractionBase, 67); n++;
|
|
cc_w = XmCreateForm (ccshell_w, "CCForm", args, n);
|
|
XtAddCallback (cc_w, XmNhelpCallback, cc_help_cb, 0);
|
|
XtManageChild (cc_w);
|
|
|
|
/* main table in a RC */
|
|
n = 0;
|
|
XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
|
|
XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
|
|
XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
|
|
XtSetArg (args[n], XmNspacing, 8); n++;
|
|
XtSetArg (args[n], XmNpacking, XmPACK_COLUMN); n++;
|
|
XtSetArg (args[n], XmNorientation, XmHORIZONTAL); n++;
|
|
XtSetArg (args[n], XmNnumColumns, (XtNumber(ccfields)+1)/2); n++;
|
|
XtSetArg (args[n], XmNisAligned, False); n++;
|
|
rc_w = XmCreateRowColumn (cc_w, "CCMRC", args, n);
|
|
XtManageChild (rc_w);
|
|
|
|
/* add the field entries */
|
|
for (i = 0; i < XtNumber(ccfields); i++) {
|
|
CCMField *ccp = &ccfields[i];
|
|
|
|
if (ccp->wp == &cclra_w) {
|
|
/* special case for local epoch */
|
|
Widget hrc_w;
|
|
|
|
n = 0;
|
|
XtSetArg (args[n], XmNorientation, XmHORIZONTAL); n++;
|
|
XtSetArg (args[n], XmNmarginHeight, 0); n++;
|
|
hrc_w = XmCreateRowColumn (rc_w, "CHRC", args, n);
|
|
XtManageChild (hrc_w);
|
|
|
|
n = 0;
|
|
w = XmCreateLabel (hrc_w, "EL", args, n);
|
|
set_xmstring (w, XmNlabelString, ccp->label);
|
|
XtManageChild (w);
|
|
|
|
n = 0;
|
|
XtSetArg (args[n], XmNcolumns, 6); n++;
|
|
ccle_w = XmCreateTextField (hrc_w, "Equinox", args, n);
|
|
wtip (ccle_w,"Precession year or EOD for apparent");
|
|
XtAddCallback (ccle_w, XmNactivateCallback, cc_vchg_cb, 0);
|
|
sr_reg (ccle_w, NULL, cccategory, 1);
|
|
XtManageChild (ccle_w);
|
|
|
|
n = 0;
|
|
w = XmCreateLabel (hrc_w, "CCC", args, n);
|
|
set_xmstring (w, XmNlabelString, ":");
|
|
XtManageChild (w);
|
|
|
|
} else {
|
|
n = 0;
|
|
XtSetArg (args[n], XmNalignment, XmALIGNMENT_END); n++;
|
|
w = XmCreateLabel (rc_w, "CCM", args, n);
|
|
set_xmstring (w, XmNlabelString, ccp->label);
|
|
XtManageChild (w);
|
|
}
|
|
|
|
/* grab RA label so we can show epoch */
|
|
if (ccp->wp == &ccra_w)
|
|
ccral_w = w;
|
|
|
|
n = 0;
|
|
XtSetArg (args[n], XmNcolumns, 13); n++;
|
|
XtSetArg (args[n], XmNvalue, ccp->def); n++;
|
|
w = XmCreateTextField (rc_w, "CCTF", args, n);
|
|
XtAddCallback (w, XmNvalueChangedCallback, cc_vchg_cb, 0);
|
|
XtAddCallback (w, XmNfocusCallback, cc_vchg_cb, 0);
|
|
XtAddCallback (w, XmNactivateCallback, cc_canonFormat_cb, 0);
|
|
wtip (w, ccp->tip);
|
|
XtManageChild (w);
|
|
*(ccp->wp) = w;
|
|
}
|
|
|
|
/* time stamp */
|
|
|
|
n = 0;
|
|
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
|
XtSetArg (args[n], XmNtopWidget, rc_w); n++;
|
|
XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
|
|
XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
|
|
XtSetArg (args[n], XmNalignment, XmALIGNMENT_CENTER); n++;
|
|
ccdt_w = XmCreateLabel (cc_w, "DT", args, n);
|
|
wtip (ccdt_w, "Date and Time for which Alt/Az are computed");
|
|
XtManageChild (ccdt_w);
|
|
|
|
/* controls across bottom */
|
|
|
|
n = 0;
|
|
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
|
XtSetArg (args[n], XmNtopWidget, ccdt_w); n++;
|
|
XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
|
|
XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
|
|
XtSetArg (args[n], XmNleftPosition, 1); n++;
|
|
XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
|
|
XtSetArg (args[n], XmNrightPosition, 11); n++;
|
|
w = XmCreatePushButton (cc_w, "Close", args, n);
|
|
wtip (w, "Close this window");
|
|
XtAddCallback (w, XmNactivateCallback, cc_close_cb, 0);
|
|
XtManageChild (w);
|
|
|
|
n = 0;
|
|
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
|
XtSetArg (args[n], XmNtopWidget, ccdt_w); n++;
|
|
XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
|
|
XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
|
|
XtSetArg (args[n], XmNleftPosition, 12); n++;
|
|
XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
|
|
XtSetArg (args[n], XmNrightPosition, 22); n++;
|
|
w = XmCreatePushButton (cc_w, "Sky Point", args, n);
|
|
wtip (w, "Center the Sky View at these coordinates");
|
|
XtManageChild (w);
|
|
XtAddCallback (w, XmNactivateCallback, cc_point_cb, 0);
|
|
|
|
n = 0;
|
|
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
|
XtSetArg (args[n], XmNtopWidget, ccdt_w); n++;
|
|
XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
|
|
XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
|
|
XtSetArg (args[n], XmNleftPosition, 23); n++;
|
|
XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
|
|
XtSetArg (args[n], XmNrightPosition, 33); n++;
|
|
w = XmCreatePushButton (cc_w, "Eyepiece", args, n);
|
|
wtip (w, "Place an eyepiece at these coordinates on the Sky View");
|
|
XtManageChild (w);
|
|
XtAddCallback (w, XmNactivateCallback, cc_eyep_cb, 0);
|
|
|
|
n = 0;
|
|
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
|
XtSetArg (args[n], XmNtopWidget, ccdt_w); n++;
|
|
XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
|
|
XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
|
|
XtSetArg (args[n], XmNleftPosition, 34); n++;
|
|
XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
|
|
XtSetArg (args[n], XmNrightPosition, 44); n++;
|
|
w = XmCreatePushButton (cc_w, "Get Sky", args, n);
|
|
wtip (w, "Load coordinates of Sky View center");
|
|
XtAddCallback (w, XmNactivateCallback, cc_getsky_cb, 0);
|
|
XtManageChild (w);
|
|
|
|
n = 0;
|
|
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
|
XtSetArg (args[n], XmNtopWidget, ccdt_w); n++;
|
|
XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
|
|
XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
|
|
XtSetArg (args[n], XmNleftPosition, 45); n++;
|
|
XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
|
|
XtSetArg (args[n], XmNrightPosition, 55); n++;
|
|
w = XmCreatePushButton (cc_w, "Canonize", args, n);
|
|
wtip (w, "Reformat all fields in a consistent manner");
|
|
XtAddCallback (w, XmNactivateCallback, cc_canonFormat_cb, 0);
|
|
XtManageChild (w);
|
|
|
|
n = 0;
|
|
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
|
XtSetArg (args[n], XmNtopWidget, ccdt_w); n++;
|
|
XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
|
|
XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
|
|
XtSetArg (args[n], XmNleftPosition, 56); n++;
|
|
XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
|
|
XtSetArg (args[n], XmNrightPosition, 66); n++;
|
|
w = XmCreatePushButton (cc_w, "Help", args, n);
|
|
wtip (w, "More information about this window");
|
|
XtAddCallback (w, XmNactivateCallback, cc_help_cb, 0);
|
|
XtManageChild (w);
|
|
}
|
|
|
|
/* callback to Point sky at current coords */
|
|
static void
|
|
cc_point_cb (Widget w, XtPointer client, XtPointer call)
|
|
{
|
|
Now *np = mm_get_now();
|
|
double e = epoch == EOD ? mjd : epoch;
|
|
double ra, dec;
|
|
char *p;
|
|
Obj o;
|
|
|
|
p = XmTextFieldGetString(ccra_w);
|
|
f_scansexa (p, &ra);
|
|
XtFree(p);
|
|
ra = hrrad(ra);
|
|
|
|
p = XmTextFieldGetString(ccdec_w);
|
|
f_scansexa (p, &dec);
|
|
XtFree(p);
|
|
dec = degrad(dec);
|
|
|
|
if (epoch == EOD)
|
|
ap_as (np, mjd, &ra, &dec);
|
|
|
|
memset (&o, 0, sizeof(o));
|
|
strcpy (o.o_name, "Anonymous");
|
|
o.o_type = FIXED;
|
|
o.f_RA = (float)ra;
|
|
o.f_dec = (float)dec;
|
|
o.f_epoch = (float)e;
|
|
|
|
obj_cir (np, &o);
|
|
sv_point (&o);
|
|
}
|
|
|
|
/* how each field is formatted, depends on Hours or Degrees */
|
|
static void
|
|
canonFmt (buf, v, h)
|
|
char buf[];
|
|
double v;
|
|
int h;
|
|
{
|
|
if (h)
|
|
fs_sexa (buf, v, 4, 360000);
|
|
else {
|
|
fs_sexa (buf, v, 4, 36000);
|
|
strcat (buf, " ");
|
|
}
|
|
}
|
|
|
|
/* callback to load from current Sky View center */
|
|
static void
|
|
cc_getsky_cb (Widget w, XtPointer client, XtPointer call)
|
|
{
|
|
double fov, alt, az, ra, dec;
|
|
char buf[32];
|
|
int aa;
|
|
|
|
sv_getcenter (&aa, &fov, &alt, &az, &ra, &dec);
|
|
|
|
if (aa) {
|
|
/* user is driving via alt/az */
|
|
canonFmt (buf, raddeg(alt), 0);
|
|
XmTextFieldSetString (ccalt_w, buf);
|
|
canonFmt (buf, raddeg(az), 0);
|
|
XmTextFieldSetString (ccaz_w, buf);
|
|
cc_newval (ccaz_w);
|
|
} else {
|
|
/* user is driving via RA/Dec */
|
|
canonFmt (buf, radhr(ra), 1);
|
|
XmTextFieldSetString (ccra_w, buf);
|
|
canonFmt (buf, raddeg(dec), 0);
|
|
XmTextFieldSetString (ccdec_w, buf);
|
|
cc_newval (ccdec_w);
|
|
}
|
|
}
|
|
|
|
/* redisplay TF's sexagesimal value prettied up */
|
|
static void
|
|
reFormat (w, h)
|
|
Widget w;
|
|
int h;
|
|
{
|
|
char buf[32], *p;
|
|
double x;
|
|
|
|
p = XmTextFieldGetString (w);
|
|
f_scansexa (p, &x);
|
|
XtFree(p);
|
|
canonFmt (buf, x, h);
|
|
XmTextFieldSetString (w, buf);
|
|
}
|
|
|
|
/* tidy up each coordinate display */
|
|
static void
|
|
canonAll (void)
|
|
{
|
|
block_vchg++;
|
|
reFormat (ccalt_w, 0);
|
|
reFormat (ccaz_w, 0);
|
|
reFormat (cclra_w, 1);
|
|
reFormat (ccldec_w, 0);
|
|
reFormat (ccra_w, 1);
|
|
reFormat (ccdec_w, 0);
|
|
reFormat (ccglat_w, 0);
|
|
reFormat (ccglng_w, 0);
|
|
reFormat (cceclat_w, 0);
|
|
reFormat (cceclng_w, 0);
|
|
block_vchg--;
|
|
}
|
|
|
|
/* called to place an eyepiece at these coords on the sky view */
|
|
static void
|
|
cc_eyep_cb (Widget w, XtPointer client, XtPointer call)
|
|
{
|
|
Now *np = mm_get_now();
|
|
double fov, ra, dec, alt, az;
|
|
int aamode;
|
|
char *p;
|
|
|
|
/* only if skyview up */
|
|
if (!svshell_w) {
|
|
xe_msg (1, "Can not place eyepiece until Sky View window is up");
|
|
return;
|
|
}
|
|
|
|
/* get sky mode */
|
|
sv_getcenter (&aamode, &fov, &alt, &az, &ra, &dec);
|
|
|
|
/* define new eyepiece */
|
|
if (aamode) {
|
|
|
|
p = XmTextFieldGetString(ccalt_w);
|
|
f_scansexa (p, &alt);
|
|
XtFree(p);
|
|
alt = degrad(alt);
|
|
|
|
p = XmTextFieldGetString(ccaz_w);
|
|
f_scansexa (p, &az);
|
|
XtFree(p);
|
|
az = degrad(az);
|
|
|
|
se_add (aamode, az, alt);
|
|
|
|
} else {
|
|
|
|
p = XmTextFieldGetString(ccra_w);
|
|
f_scansexa (p, &ra);
|
|
XtFree(p);
|
|
ra = hrrad(ra);
|
|
|
|
p = XmTextFieldGetString(ccdec_w);
|
|
f_scansexa (p, &dec);
|
|
XtFree(p);
|
|
dec = degrad(dec);
|
|
|
|
if (epoch == EOD)
|
|
ap_as (np, mjd, &ra, &dec);
|
|
|
|
se_add (aamode, ra, dec);
|
|
|
|
}
|
|
|
|
/* display on skyview */
|
|
sv_all (np);
|
|
}
|
|
|
|
/* called from either the Reformat PB or Enter from any TF */
|
|
static void
|
|
cc_canonFormat_cb (Widget w, XtPointer client, XtPointer call)
|
|
{
|
|
canonAll();
|
|
}
|
|
|
|
static void
|
|
cc_close_cb (Widget w, XtPointer client, XtPointer call)
|
|
{
|
|
/* let popdown do all the work */
|
|
XtPopdown (ccshell_w);
|
|
}
|
|
|
|
static void
|
|
cc_popdown_cb (Widget w, XtPointer client, XtPointer call)
|
|
{
|
|
}
|
|
|
|
/* called when any character changes or focus is received
|
|
* N.B. do not use call, used by different callbacks.
|
|
*/
|
|
static void
|
|
cc_vchg_cb (Widget w, XtPointer client, XtPointer call)
|
|
{
|
|
cc_newval (w);
|
|
}
|
|
|
|
/* callback from the overall Help button.
|
|
*/
|
|
/* ARGSUSED */
|
|
static void
|
|
cc_help_cb (Widget w, XtPointer client, XtPointer call)
|
|
{
|
|
static char *msg[] = { "Type in any field and the others are updated",};
|
|
|
|
hlp_dialog ("Coord_conv", msg, sizeof(msg)/sizeof(msg[0]));
|
|
}
|
|
|
|
/* called to compute new values when the given TF widget changes.
|
|
* remember in lastchg_w which widget was used to freeze it for next update.
|
|
*/
|
|
static void
|
|
cc_newval (w)
|
|
Widget w;
|
|
{
|
|
Now *np = mm_get_now();
|
|
double e = (epoch == EOD) ? mjd : epoch;
|
|
char buf[32], *p;
|
|
double ra, dec, lst;
|
|
|
|
/* avoid recursion */
|
|
if (block_vchg)
|
|
return;
|
|
block_vchg++;
|
|
|
|
/* save */
|
|
lastchg_w = w;
|
|
|
|
/* current time and eq epoch */
|
|
timestamp (np, ccdt_w);
|
|
if (epoch == EOD)
|
|
(void) strcpy (buf, "RA @ EOD:");
|
|
else {
|
|
double tmp;
|
|
mjd_year (epoch, &tmp);
|
|
sprintf (buf, "RA @ %.1f:", tmp);
|
|
}
|
|
set_xmstring (ccral_w, XmNlabelString, buf);
|
|
|
|
/* handy stuff */
|
|
now_lst (np, &lst);
|
|
lst = hrrad(lst);
|
|
|
|
/* find astrometric ra/dec @ e from whatever changed */
|
|
if (w == ccalt_w || w == ccaz_w) {
|
|
double alt, az, ha;
|
|
|
|
p = XmTextFieldGetString(ccalt_w);
|
|
f_scansexa (p, &alt);
|
|
XtFree(p);
|
|
alt = degrad(alt);
|
|
p = XmTextFieldGetString(ccaz_w);
|
|
f_scansexa (p, &az);
|
|
XtFree(p);
|
|
az = degrad(az);
|
|
|
|
unrefract (pressure, temp, alt, &alt);
|
|
aa_hadec (lat, alt, az, &ha, &dec);
|
|
ra = lst - ha;
|
|
range (&ra, 2*PI);
|
|
ap_as (np, e, &ra, &dec);
|
|
|
|
} else if (w == ccglat_w || w == ccglng_w) {
|
|
double glat, glng;
|
|
|
|
p = XmTextFieldGetString(ccglat_w);
|
|
f_scansexa (p, &glat);
|
|
XtFree(p);
|
|
glat = degrad(glat);
|
|
p = XmTextFieldGetString(ccglng_w);
|
|
f_scansexa (p, &glng);
|
|
XtFree(p);
|
|
glng = degrad(glng);
|
|
|
|
gal_eq (e, glat, glng, &ra, &dec);
|
|
|
|
} else if (w == cceclat_w || w == cceclng_w) {
|
|
double eclat, eclng;
|
|
|
|
p = XmTextFieldGetString(cceclat_w);
|
|
f_scansexa (p, &eclat);
|
|
XtFree(p);
|
|
eclat = degrad(eclat);
|
|
p = XmTextFieldGetString(cceclng_w);
|
|
f_scansexa (p, &eclng);
|
|
XtFree(p);
|
|
eclng = degrad(eclng);
|
|
|
|
ecl_eq (e, eclat, eclng, &ra, &dec);
|
|
if (epoch == EOD)
|
|
ap_as (np, e, &ra, &dec);
|
|
|
|
} else if (w == ccra_w || w == ccdec_w) {
|
|
p = XmTextFieldGetString(ccra_w);
|
|
f_scansexa (p, &ra);
|
|
XtFree(p);
|
|
ra = hrrad(ra);
|
|
p = XmTextFieldGetString(ccdec_w);
|
|
f_scansexa (p, &dec);
|
|
XtFree(p);
|
|
dec = degrad(dec);
|
|
if (epoch == EOD)
|
|
ap_as (np, e, &ra, &dec);
|
|
|
|
} else if (w == cclra_w || w == ccldec_w || w == ccle_w) {
|
|
p = XmTextFieldGetString(cclra_w);
|
|
f_scansexa (p, &ra);
|
|
XtFree(p);
|
|
ra = hrrad(ra);
|
|
p = XmTextFieldGetString(ccldec_w);
|
|
f_scansexa (p, &dec);
|
|
XtFree(p);
|
|
dec = degrad(dec);
|
|
p = XmTextFieldGetString(ccle_w);
|
|
if (strchr(p,'o') || strchr(p,'O')) {
|
|
ap_as (np, e, &ra, &dec);
|
|
} else {
|
|
double le;
|
|
year_mjd (atof(p), &le);
|
|
precess (le, e, &ra, &dec);
|
|
}
|
|
XtFree(p);
|
|
|
|
} else {
|
|
printf ("Bogus coords conv widget\n");
|
|
abort();
|
|
}
|
|
|
|
/* find all others from ra/dec that were not set */
|
|
if (w != ccalt_w && w != ccaz_w) {
|
|
double apra = ra, apdec = dec; /* require apparent */
|
|
double alt, az, ha;
|
|
|
|
as_ap (np, e, &apra, &apdec);
|
|
ha = lst - apra;
|
|
hadec_aa (lat, ha, apdec, &alt, &az);
|
|
refract (pressure, temp, alt, &alt);
|
|
canonFmt (buf, raddeg(alt), 0);
|
|
XmTextFieldSetString (ccalt_w, buf);
|
|
canonFmt (buf, raddeg(az), 0);
|
|
XmTextFieldSetString (ccaz_w, buf);
|
|
}
|
|
if (w != ccglat_w && w != ccglng_w) {
|
|
double glat, glng;
|
|
|
|
eq_gal (e, ra, dec, &glat, &glng);
|
|
canonFmt (buf, raddeg(glat), 0);
|
|
XmTextFieldSetString (ccglat_w, buf);
|
|
canonFmt (buf, raddeg(glng), 0);
|
|
XmTextFieldSetString (ccglng_w, buf);
|
|
}
|
|
if (w != cceclat_w && w != cceclng_w) {
|
|
double eclat, eclng;
|
|
double era = ra, edec = dec; /* want current epoch setting */
|
|
|
|
if (epoch == EOD)
|
|
as_ap (np, e, &era, &edec);
|
|
eq_ecl (e, era, edec, &eclat, &eclng);
|
|
canonFmt (buf, raddeg(eclat), 0);
|
|
XmTextFieldSetString (cceclat_w, buf);
|
|
canonFmt (buf, raddeg(eclng), 0);
|
|
XmTextFieldSetString (cceclng_w, buf);
|
|
}
|
|
if (w != ccra_w && w != ccdec_w) {
|
|
double era = ra, edec = dec; /* want current epoch setting */
|
|
|
|
if (epoch == EOD)
|
|
as_ap (np, e, &era, &edec);
|
|
canonFmt (buf, radhr(era), 1);
|
|
XmTextFieldSetString (ccra_w, buf);
|
|
canonFmt (buf, raddeg(edec), 0);
|
|
XmTextFieldSetString (ccdec_w, buf);
|
|
}
|
|
if (w != cclra_w && w != ccldec_w && w != ccle_w) {
|
|
double lra = ra, ldec = dec;
|
|
|
|
p = XmTextFieldGetString(ccle_w);
|
|
if (strchr(p,'o') || strchr(p,'O')) {
|
|
as_ap (np, e, &lra, &ldec);
|
|
} else {
|
|
double le;
|
|
year_mjd (atof(p), &le);
|
|
precess (e, le, &lra, &ldec);
|
|
}
|
|
XtFree(p);
|
|
canonFmt (buf, radhr(lra), 1);
|
|
XmTextFieldSetString (cclra_w, buf);
|
|
canonFmt (buf, raddeg(ldec), 0);
|
|
XmTextFieldSetString (ccldec_w, buf);
|
|
}
|
|
|
|
block_vchg--;
|
|
}
|
|
|