mirror of https://github.com/XEphem/XEphem.git
1784 lines
54 KiB
C
1784 lines
54 KiB
C
/* stuff for the eyepiece dialog */
|
||
|
||
#include <stdio.h>
|
||
#include <math.h>
|
||
#include <string.h>
|
||
#include <stdlib.h>
|
||
#include <unistd.h>
|
||
|
||
|
||
#include <Xm/Xm.h>
|
||
#include <Xm/Form.h>
|
||
#include <Xm/Label.h>
|
||
#include <Xm/RowColumn.h>
|
||
#include <Xm/Separator.h>
|
||
#include <Xm/Scale.h>
|
||
#include <Xm/SelectioB.h>
|
||
#include <Xm/ToggleB.h>
|
||
#include <Xm/PushB.h>
|
||
#include <Xm/TextF.h>
|
||
|
||
#include "xephem.h"
|
||
#include "lilxml.h"
|
||
|
||
/* a list of EyePieces */
|
||
static EyePiece *eyep; /* malloced list of eyepieces */
|
||
static int neyep; /* number of entries off eyep */
|
||
|
||
#define MXSCALE degrad(90) /* max angle to show */
|
||
#define LOSCALE degrad(1./60) /* rads/step at low end */
|
||
#define HISCALE degrad(10./60) /* rads/step at hi end */
|
||
#define CHSCALE degrad(10.) /* where they switch */
|
||
#define SCALEMAX ((int)(CHSCALE/LOSCALE + (MXSCALE-CHSCALE)/HISCALE))
|
||
|
||
/* favorites are managed in an array which is never shuffled. Entries are
|
||
* reassigned when needed from unused entries or the array is expanded.
|
||
* callbacks have the array index in their client param.
|
||
*/
|
||
#define MAXEPNM 60 /* maximum name for eyepiece (including \0) */
|
||
#define MAXEPNMD 21 /* maximum name displayed */
|
||
typedef struct {
|
||
int inuse; /* whether this entry is in use */
|
||
char name[MAXEPNM]; /* use's name */
|
||
double w, h; /* size, rads */
|
||
int isE; /* whether Elliptical or Rectangular */
|
||
int isS; /* whether Solid or Outline */
|
||
Widget row_w; /* widget with GUI controls for this entry */
|
||
Widget name_w; /* TF with name */
|
||
} FavEyeP;
|
||
static FavEyeP *favs; /* malloced array of favorite eyepieces */
|
||
static int nfavs; /* number of entries (regardless of inuse) */
|
||
static Widget favrc_w; /* RC for listing favorites */
|
||
static Widget saved_w; /* TF for name of file to save definitions */
|
||
static Widget savep_w; /* TF for name of file to save positions */
|
||
|
||
static char defeyepfn[] = "eyepieces.epd"; /* default defs file name */
|
||
static char eyep_suffix[] = ".epd"; /* def file name suffix */
|
||
static char defeyelfn[] = "eyepieces.epp"; /* default positions file name*/
|
||
static char eyel_suffix[] = ".epp"; /* positions file name suffix */
|
||
|
||
static Widget eyep_w; /* overall eyepiece dialog */
|
||
static Widget eyepws_w; /* eyepiece width scale */
|
||
static Widget eyephs_w; /* eyepiece height scale */
|
||
static Widget eyepwl_w; /* eyepiece width label */
|
||
static Widget eyepa_w; /* eyepiece rotation angle, scale */
|
||
static Widget eyepal_w; /* eyepiece rotation angle label */
|
||
static Widget eyephl_w; /* eyepiece height label */
|
||
static Widget eyer_w; /* eyepiece Round TB */
|
||
static Widget eyes_w; /* eyepiece Square TB */
|
||
static Widget eyef_w; /* eyepiece filled TB */
|
||
static Widget eyeb_w; /* eyepiece border TB */
|
||
static Widget telrad_w; /* telrad on/off TB */
|
||
static Widget delep_w; /* the delete all PB */
|
||
static Widget lock_w; /* lock scales TB */
|
||
static Widget sa1_w; /* sky angle L for formula 1 results */
|
||
static Widget sa2_w; /* sky angle L for formula 2 results */
|
||
static Widget fl_w; /* focal length TF */
|
||
static Widget fp_w; /* focal plane length TF */
|
||
static Widget afov_w; /* apparent eyepiece fov TF */
|
||
static Widget efl_w; /* eyepiece focal length TF */
|
||
static Widget mfl_w; /* mirror focal length TF */
|
||
|
||
static void se_create_eyep_w (void);
|
||
static void se_eyepsz (double *wp, double *hp, double *pp, int *rp, int *fp);
|
||
static void se_scale_fmt (Widget s_w, Widget l_w);
|
||
static void se_pascale_fmt (Widget s_w, Widget l_w);
|
||
static void se_telrad_cb (Widget w, XtPointer client, XtPointer call);
|
||
static void se_skyW_cb (Widget w, XtPointer client, XtPointer call);
|
||
static void se_skyH_cb (Widget w, XtPointer client, XtPointer call);
|
||
static void se_wscale_cb (Widget w, XtPointer client, XtPointer call);
|
||
static void se_hscale_cb (Widget w, XtPointer client, XtPointer call);
|
||
static void se_pscale_cb (Widget w, XtPointer client, XtPointer call);
|
||
static void se_delall_cb (Widget w, XtPointer client, XtPointer call);
|
||
static void se_close_cb (Widget w, XtPointer client, XtPointer call);
|
||
static void se_addfav_cb (Widget w, XtPointer client, XtPointer call);
|
||
static void se_saved_cb (Widget w, XtPointer client, XtPointer call);
|
||
static void se_loadd_cb (Widget w, XtPointer client, XtPointer call);
|
||
static void se_savep_cb (Widget w, XtPointer client, XtPointer call);
|
||
static void se_loadp_cb (Widget w, XtPointer client, XtPointer call);
|
||
static void se_delfav_cb (Widget w, XtPointer client, XtPointer call);
|
||
static void se_usefav_cb (Widget w, XtPointer client, XtPointer call);
|
||
static void se_help_cb (Widget w, XtPointer client, XtPointer call);
|
||
static void se_calc1_cb (Widget w, XtPointer client, XtPointer call);
|
||
static void se_calc1 (void);
|
||
static void se_calc2_cb (Widget w, XtPointer client, XtPointer call);
|
||
static void se_calc2 (void);
|
||
static void se_delall (void);
|
||
static EyePiece *se_addeyep (void);
|
||
static double se_getScale (Widget w);
|
||
static void se_setScale (Widget w, double a);
|
||
static double se_getPScale (Widget w);
|
||
static void se_addFavEyeP (FavEyeP *newfp);
|
||
static void se_loadEyep (char *fn);
|
||
static void se_saveFav (char *fn);
|
||
static void se_loadPos (char *fn);
|
||
static void se_savePos (char *fn);
|
||
|
||
/* telrad circle diameters, degrees */
|
||
static double telrad_sz[] = {.5, 2., 4.};
|
||
|
||
static char skyepcategory[] = "Sky View -- Eyepieces";
|
||
|
||
void
|
||
se_manage()
|
||
{
|
||
if (!eyep_w)
|
||
se_create_eyep_w();
|
||
XtManageChild (eyep_w);
|
||
}
|
||
|
||
void
|
||
se_unmanage()
|
||
{
|
||
if (eyep_w)
|
||
XtUnmanageChild (eyep_w);
|
||
}
|
||
|
||
/* called to put up or remove the watch cursor. */
|
||
void
|
||
se_cursor (c)
|
||
Cursor c;
|
||
{
|
||
Window win;
|
||
|
||
if (eyep_w && (win = XtWindow(eyep_w)) != 0) {
|
||
Display *dsp = XtDisplay(eyep_w);
|
||
if (c)
|
||
XDefineCursor (dsp, win, c);
|
||
else
|
||
XUndefineCursor (dsp, win);
|
||
}
|
||
}
|
||
|
||
/* add one eyepiece with the current definition for the given location */
|
||
void
|
||
se_add (int aamode, double azra, double altdec)
|
||
{
|
||
int telrad;
|
||
int nnew;
|
||
|
||
/* check for first time */
|
||
if (!eyep_w)
|
||
se_create_eyep_w();
|
||
|
||
/* add 1 or 3 if telrad */
|
||
telrad = XmToggleButtonGetState (telrad_w);
|
||
nnew = telrad ? 3 : 1;
|
||
|
||
/* fill in the details */
|
||
while (--nnew >= 0) {
|
||
EyePiece *new = se_addeyep();
|
||
new->azra = azra;
|
||
new->altdec = altdec;
|
||
new->aamode = aamode;
|
||
if (telrad) {
|
||
new->eyepw = degrad(telrad_sz[nnew]);
|
||
new->eyeph = degrad(telrad_sz[nnew]);
|
||
new->eyepa = 0;
|
||
new->round = 1;
|
||
new->solid = 0;
|
||
} else
|
||
se_eyepsz (&new->eyepw, &new->eyeph, &new->eyepa, &new->round, &new->solid);
|
||
}
|
||
|
||
/* at least one to delete now */
|
||
XtSetSensitive (delep_w, True);
|
||
}
|
||
|
||
/* return whether there are any eyepieces that cover the given location,
|
||
* aamode determining the interpretation of the coords.
|
||
*/
|
||
int
|
||
se_isOneHere (int aamode, double azra, double altdec)
|
||
{
|
||
double caltdec = cos(altdec);
|
||
double saltdec = sin(altdec);
|
||
int i;
|
||
|
||
for (i = 0; i < neyep; i++) {
|
||
EyePiece *ep = &eyep[i];
|
||
double L, l, csep, maxr;
|
||
|
||
if (aamode == ep->aamode) {
|
||
L = ep->azra;
|
||
l = ep->altdec;
|
||
} else {
|
||
sv_other (ep->altdec, ep->azra, ep->aamode, &l, &L);
|
||
}
|
||
|
||
solve_sphere (azra-L, PI/2-l, saltdec, caltdec, &csep, NULL);
|
||
maxr = (ep->eyepw < ep->eyeph ? ep->eyepw : ep->eyeph)/2;
|
||
if (acos(csep) < maxr)
|
||
return (1); /* yes, there is */
|
||
}
|
||
|
||
/* none found */
|
||
return (0);
|
||
}
|
||
|
||
/* delete eyepiece that most closely covers the given location.
|
||
* aamode determines how to interpret the coords.
|
||
*/
|
||
void
|
||
se_del (int aamode, double azra, double altdec)
|
||
{
|
||
double caltdec, saltdec;
|
||
double r, maxcsep;
|
||
EyePiece *ep, *endep, *minep;
|
||
|
||
/* scan for eyepiece closest to target position, leave in minep */
|
||
caltdec = cos(altdec);
|
||
saltdec = sin(altdec);
|
||
maxcsep = 0;
|
||
endep = &eyep[neyep];
|
||
minep = NULL;
|
||
for (ep = eyep; ep < endep; ep++) {
|
||
double L, l, csep;
|
||
|
||
if (aamode == ep->aamode) {
|
||
L = ep->azra;
|
||
l = ep->altdec;
|
||
} else {
|
||
sv_other (ep->altdec, ep->azra, ep->aamode, &l, &L);
|
||
}
|
||
|
||
solve_sphere (azra-L, PI/2-l, saltdec, caltdec, &csep, NULL);
|
||
if (csep > maxcsep) {
|
||
maxcsep = csep;
|
||
minep = ep;
|
||
}
|
||
}
|
||
if (!minep)
|
||
return;
|
||
|
||
/* if actually under eyepiece, remove it */
|
||
r = (minep->eyepw < minep->eyeph ? minep->eyepw : minep->eyeph)/2;
|
||
if (maxcsep > cos(r)) {
|
||
while (++minep < endep)
|
||
minep[-1] = minep[0];
|
||
|
||
/* drop count, but leave array.. likely grows again anyway */
|
||
neyep--;
|
||
|
||
/* may have no more left now! */
|
||
XtSetSensitive (delep_w, neyep);
|
||
}
|
||
}
|
||
|
||
|
||
/* return the list of current eyepieces, if interested, and the count.
|
||
*/
|
||
int
|
||
se_getlist (EyePiece **ep)
|
||
{
|
||
if (ep)
|
||
*ep = eyep;
|
||
if (delep_w)
|
||
XtSetSensitive (delep_w, neyep);
|
||
return (neyep);
|
||
}
|
||
|
||
/* fetch the current eyepiece size and rotation angle, all in rads,
|
||
* whether it is round, and whether it is filled from the dialog.
|
||
*/
|
||
static void
|
||
se_eyepsz(double *wp, double *hp, double *ap, int *rp, int *fp)
|
||
{
|
||
if (!eyep_w)
|
||
se_create_eyep_w();
|
||
|
||
*wp = se_getScale (eyepws_w);
|
||
*hp = se_getScale (eyephs_w);
|
||
*ap = se_getPScale (eyepa_w);
|
||
|
||
*rp = XmToggleButtonGetState (eyer_w);
|
||
*fp = XmToggleButtonGetState (eyef_w);
|
||
}
|
||
|
||
/* increase size of eyep[] by one and return pointer to new location */
|
||
static EyePiece *
|
||
se_addeyep ()
|
||
{
|
||
eyep = (EyePiece *) XtRealloc ((void*)eyep, (neyep+1)*sizeof(EyePiece));
|
||
return (&eyep[neyep++]);
|
||
}
|
||
|
||
/* create the eyepiece size dialog */
|
||
static void
|
||
se_create_eyep_w()
|
||
{
|
||
Widget w, sep_w;
|
||
Widget l_w, rb_w;
|
||
Widget pb_w, sfm_w;
|
||
Arg args[20];
|
||
char *s[1];
|
||
int n;
|
||
|
||
/* create form */
|
||
|
||
n = 0;
|
||
XtSetArg(args[n], XmNautoUnmanage, False); n++;
|
||
XtSetArg (args[n], XmNcolormap, xe_cm); n++;
|
||
XtSetArg (args[n], XmNverticalSpacing, 5); n++;
|
||
XtSetArg (args[n], XmNmarginHeight, 10); n++;
|
||
XtSetArg (args[n], XmNmarginWidth, 10); n++;
|
||
XtSetArg (args[n], XmNdefaultPosition, False); n++;
|
||
eyep_w = XmCreateFormDialog (svshell_w, "SkyEyep", args, n);
|
||
set_something (eyep_w, XmNcolormap, (XtArgVal)xe_cm);
|
||
XtAddCallback (eyep_w, XmNhelpCallback, se_help_cb, 0);
|
||
sr_reg (XtParent(eyep_w), "XEphem*SkyEyep.x", skyepcategory, 0);
|
||
sr_reg (XtParent(eyep_w), "XEphem*SkyEyep.y", skyepcategory, 0);
|
||
|
||
/* set some stuff in the parent DialogShell.
|
||
* setting XmNdialogTitle in the Form didn't work..
|
||
*/
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtitle, "xephem Eyepiece Setup"); n++;
|
||
XtSetValues (XtParent(eyep_w), args, n);
|
||
|
||
/* title label */
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
|
||
w = XmCreateLabel (eyep_w, "L", args, n);
|
||
set_xmstring (w, XmNlabelString, "Set next eyepiece size, angle, shape and style:");
|
||
XtManageChild (w);
|
||
|
||
/* w scale and its labels */
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, w); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
|
||
eyepwl_w = XmCreateLabel (eyep_w, "EyepWL", args, n);
|
||
XtManageChild (eyepwl_w);
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, w); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNleftPosition, 20); n++;
|
||
XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
|
||
XtSetArg (args[n], XmNorientation, XmHORIZONTAL); n++;
|
||
XtSetArg (args[n], XmNshowValue, False); n++;
|
||
XtSetArg (args[n], XmNscaleMultiple, 1); n++;
|
||
XtSetArg (args[n], XmNminimum, 1); n++;
|
||
XtSetArg (args[n], XmNmaximum, SCALEMAX); n++;
|
||
eyepws_w = XmCreateScale (eyep_w, "EyepW", args, n);
|
||
XtAddCallback (eyepws_w, XmNdragCallback, se_wscale_cb, 0);
|
||
XtAddCallback (eyepws_w, XmNvalueChangedCallback, se_wscale_cb, 0);
|
||
wtip (eyepws_w, "Slide to desired width of eyepiece, D:M");
|
||
sr_reg (eyepws_w, NULL, skyepcategory, 0);
|
||
se_scale_fmt (eyepws_w, eyepwl_w);
|
||
XtManageChild (eyepws_w);
|
||
|
||
/* h scale and its label */
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, eyepws_w); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
|
||
eyephl_w = XmCreateLabel (eyep_w, "EyepHL", args, n);
|
||
XtManageChild (eyephl_w);
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, eyepws_w); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNleftPosition, 20); n++;
|
||
XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
|
||
XtSetArg (args[n], XmNorientation, XmHORIZONTAL); n++;
|
||
XtSetArg (args[n], XmNshowValue, False); n++;
|
||
XtSetArg (args[n], XmNscaleMultiple, 1); n++;
|
||
XtSetArg (args[n], XmNminimum, 1); n++;
|
||
XtSetArg (args[n], XmNmaximum, SCALEMAX); n++;
|
||
eyephs_w = XmCreateScale (eyep_w, "EyepH", args, n);
|
||
XtAddCallback (eyephs_w, XmNdragCallback, se_hscale_cb, 0);
|
||
XtAddCallback (eyephs_w, XmNvalueChangedCallback, se_hscale_cb, 0);
|
||
wtip (eyephs_w, "Slide to desired height of eyepiece, D:M");
|
||
sr_reg (eyephs_w, NULL, skyepcategory, 0);
|
||
se_scale_fmt (eyephs_w, eyephl_w);
|
||
XtManageChild (eyephs_w);
|
||
|
||
/* angle scale and its label */
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, eyephs_w); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
|
||
eyepal_w = XmCreateLabel (eyep_w, "EyepPL", args, n);
|
||
XtManageChild (eyepal_w);
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, eyephs_w); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNleftPosition, 20); n++;
|
||
XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
|
||
XtSetArg (args[n], XmNorientation, XmHORIZONTAL); n++;
|
||
XtSetArg (args[n], XmNshowValue, False); n++;
|
||
XtSetArg (args[n], XmNscaleMultiple, 1); n++;
|
||
XtSetArg (args[n], XmNmaximum, 359); n++;
|
||
eyepa_w = XmCreateScale (eyep_w, "EyepA", args, n);
|
||
XtAddCallback (eyepa_w, XmNdragCallback, se_pscale_cb, 0);
|
||
XtAddCallback (eyepa_w, XmNvalueChangedCallback, se_pscale_cb, 0);
|
||
wtip (eyepa_w, "Rotation angle of eyepiece, from Z if Alt/Az else from NCP");
|
||
sr_reg (eyepa_w, NULL, skyepcategory, 0);
|
||
se_pascale_fmt (eyepa_w, eyepal_w);
|
||
XtManageChild (eyepa_w);
|
||
|
||
/* lock TB */
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, eyepa_w); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
|
||
lock_w = XmCreateToggleButton (eyep_w, "Lock", args, n);
|
||
set_xmstring (lock_w, XmNlabelString, "Lock W and H together");
|
||
wtip (lock_w, "When on, width and height scales move as one");
|
||
XtManageChild (lock_w);
|
||
sr_reg (lock_w, NULL, skyepcategory, 0);
|
||
|
||
/* telrad TB */
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, lock_w); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
|
||
telrad_w = XmCreateToggleButton (eyep_w, "Telrad", args, n);
|
||
XtAddCallback (telrad_w, XmNvalueChangedCallback, se_telrad_cb, NULL);
|
||
set_xmstring (telrad_w, XmNlabelString, "Telrad circles of 0.5, 2 and 4<> diameter");
|
||
wtip (telrad_w, "When on, next eyepiece will be 3 open circles matching the Telrad.");
|
||
XtManageChild (telrad_w);
|
||
sr_reg (telrad_w, NULL, skyepcategory, 0);
|
||
|
||
/* shape label */
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, telrad_w); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
|
||
l_w = XmCreateLabel (eyep_w, "S", args, n);
|
||
set_xmstring (l_w, XmNlabelString, "Shape:");
|
||
XtManageChild (l_w);
|
||
|
||
/* round or square Radio box */
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, telrad_w); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNleftWidget, l_w); n++;
|
||
XtSetArg (args[n], XmNleftOffset, 5); n++;
|
||
rb_w = XmCreateRadioBox (eyep_w, "RSRB", args, n);
|
||
XtManageChild (rb_w);
|
||
|
||
n = 0;
|
||
eyer_w = XmCreateToggleButton (rb_w, "Elliptical", args, n);
|
||
wtip (eyer_w, "When on, next eyepiece will be elliptical");
|
||
XtManageChild (eyer_w);
|
||
sr_reg (eyer_w, NULL, skyepcategory, 0);
|
||
|
||
n = 0;
|
||
eyes_w = XmCreateToggleButton (rb_w, "Rectangular", args, n);
|
||
wtip (eyes_w, "When on, next eyepiece will be rectangular");
|
||
XtManageChild (eyes_w);
|
||
|
||
/* "Elliptical" establishes truth setting */
|
||
XmToggleButtonSetState (eyes_w, !XmToggleButtonGetState(eyer_w), 0);
|
||
|
||
/* style label */
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, telrad_w); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNleftPosition, 50); n++;
|
||
l_w = XmCreateLabel (eyep_w, "St", args, n);
|
||
set_xmstring (l_w, XmNlabelString, "Style:");
|
||
XtManageChild (l_w);
|
||
|
||
/* style Radio box */
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, telrad_w); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNleftWidget, l_w); n++;
|
||
XtSetArg (args[n], XmNleftOffset, 5); n++;
|
||
rb_w = XmCreateRadioBox (eyep_w, "FBRB", args, n);
|
||
XtManageChild (rb_w);
|
||
|
||
n = 0;
|
||
eyef_w = XmCreateToggleButton (rb_w, "Solid", args, n);
|
||
wtip (eyef_w, "When on, next eyepiece will be solid");
|
||
XtManageChild (eyef_w);
|
||
sr_reg (eyef_w, NULL, skyepcategory, 0);
|
||
|
||
n = 0;
|
||
eyeb_w = XmCreateToggleButton (rb_w, "Outline", args, n);
|
||
wtip (eyeb_w, "When on, next eyepiece will be just a border");
|
||
XtManageChild (eyeb_w);
|
||
|
||
/* "Solid" establishes truth setting */
|
||
XmToggleButtonSetState (eyeb_w, !XmToggleButtonGetState(eyef_w), 0);
|
||
|
||
/* calculator */
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, rb_w); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
|
||
XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
|
||
XtSetArg (args[n], XmNseparatorType, XmDOUBLE_LINE); n++;
|
||
sep_w = XmCreateSeparator (eyep_w, "Sep", args, n);
|
||
XtManageChild (sep_w);
|
||
|
||
/* title */
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, sep_w); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
|
||
XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
|
||
l_w = XmCreateLabel (eyep_w, "EL", args, n);
|
||
set_xmstring(l_w,XmNlabelString,"Field-of-View Calculators");
|
||
XtManageChild (l_w);
|
||
|
||
/* formula # 1 */
|
||
|
||
/* labels */
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, l_w); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
|
||
XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNrightPosition, 28); n++;
|
||
w = XmCreateLabel (eyep_w, "EL", args, n);
|
||
set_xmstring (w, XmNlabelString, "Focal length\n(mm) m in");
|
||
XtManageChild (w);
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, l_w); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNleftPosition, 30); n++;
|
||
XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNrightPosition, 58); n++; /*first includes 10*/
|
||
w = XmCreateLabel (eyep_w, "EL", args, n);
|
||
set_xmstring (w, XmNlabelString, "F Plane Size\n(<28>m) mm in");
|
||
XtManageChild (w);
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, l_w); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNleftPosition, 60); n++;
|
||
XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNrightPosition, 88); n++;
|
||
w = XmCreateLabel (eyep_w, "EL", args, n);
|
||
set_xmstring (w, XmNlabelString, "Sky angle\nD:M:S");
|
||
XtManageChild (w);
|
||
|
||
/* TFs */
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, w); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
|
||
XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNrightPosition, 28); n++;
|
||
XtSetArg (args[n], XmNcolumns, 8); n++;
|
||
fl_w = XmCreateTextField (eyep_w, "FocalLength", args, n);
|
||
wtip (fl_w, "Enter effective focal length, specifying units of mm, m or inches");
|
||
sr_reg (fl_w, NULL, skyepcategory, 0);
|
||
XtManageChild (fl_w);
|
||
XtAddCallback (fl_w, XmNvalueChangedCallback, se_calc1_cb, NULL);
|
||
XtAddCallback (fl_w, XmNactivateCallback, se_calc1_cb, NULL);
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, w); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNleftPosition, 30); n++;
|
||
XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNrightPosition, 58); n++;
|
||
XtSetArg (args[n], XmNcolumns, 8); n++;
|
||
fp_w = XmCreateTextField (eyep_w, "FPlaneSize", args, n);
|
||
wtip (fp_w, "Enter size of object on focal plane, in microns, mm or inches");
|
||
sr_reg (fp_w, NULL, skyepcategory, 0);
|
||
XtManageChild (fp_w);
|
||
XtAddCallback (fp_w, XmNvalueChangedCallback, se_calc1_cb, NULL);
|
||
XtAddCallback (fp_w, XmNactivateCallback, se_calc1_cb, NULL);
|
||
|
||
/* formula #1 sky angle result label */
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, w); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNleftPosition, 60); n++;
|
||
XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNrightPosition, 88); n++;
|
||
sa1_w = XmCreateLabel (eyep_w, "SAL", args, n);
|
||
wtip (sa1_w, "Sky angle with given focal length and plane size");
|
||
set_xmstring (sa1_w, XmNlabelString, "xxx:xx:xx.x");
|
||
XtManageChild (sa1_w);
|
||
|
||
/* formula #1 set w and h */
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, l_w); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNleftPosition, 90); n++;
|
||
XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
|
||
w = XmCreateLabel (eyep_w, "Set", args, n);
|
||
XtManageChild (w);
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, w); n++;
|
||
XtSetArg (args[n], XmNtopOffset, 1); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNleftPosition, 90); n++;
|
||
XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
|
||
XtSetArg (args[n], XmNmarginHeight, 0); n++;
|
||
w = XmCreatePushButton (eyep_w, "W", args, n);
|
||
wtip (w, "Set eyepiece width scale to this Sky angle");
|
||
XtAddCallback (w, XmNactivateCallback, se_skyW_cb,(XtPointer)sa1_w);
|
||
XtManageChild (w);
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, w); n++;
|
||
XtSetArg (args[n], XmNtopOffset, 1); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNleftPosition, 90); n++;
|
||
XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
|
||
XtSetArg (args[n], XmNmarginHeight, 0); n++;
|
||
w = XmCreatePushButton (eyep_w, "H", args, n);
|
||
wtip (w, "Set eyepiece height scale to this Sky angle");
|
||
XtAddCallback (w, XmNactivateCallback, se_skyH_cb,(XtPointer)sa1_w);
|
||
XtManageChild (w);
|
||
|
||
/* formula #2 */
|
||
|
||
/* labels */
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, fp_w); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
|
||
XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNrightPosition, 19); n++;
|
||
l_w = XmCreateLabel (eyep_w, "EL", args, n);
|
||
set_xmstring (l_w, XmNlabelString, "Apparent\nFOV, <20>");
|
||
XtManageChild (l_w);
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, fp_w); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNleftPosition, 21); n++;
|
||
XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNrightPosition, 38); n++; /*first includes 10*/
|
||
w = XmCreateLabel (eyep_w, "EL", args, n);
|
||
set_xmstring (w, XmNlabelString, "Eyepiece\nFL, mm");
|
||
XtManageChild (w);
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, fp_w); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNleftPosition, 40); n++;
|
||
XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNrightPosition, 58); n++;
|
||
w = XmCreateLabel (eyep_w, "EL", args, n);
|
||
set_xmstring (w, XmNlabelString, "Mirror FL\n(mm) m in");
|
||
XtManageChild (w);
|
||
|
||
/* TFs */
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, l_w); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
|
||
XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNrightPosition, 19); n++;
|
||
XtSetArg (args[n], XmNcolumns, 8); n++;
|
||
afov_w = XmCreateTextField (eyep_w, "ApparentFOV", args, n);
|
||
wtip (afov_w,
|
||
"Enter apparent field of view through the eyepiece, in degrees");
|
||
sr_reg (afov_w, NULL, skyepcategory, 0);
|
||
XtManageChild (afov_w);
|
||
XtAddCallback (afov_w, XmNvalueChangedCallback, se_calc2_cb, NULL);
|
||
XtAddCallback (afov_w, XmNactivateCallback, se_calc2_cb, NULL);
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, l_w); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNleftPosition, 21); n++;
|
||
XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNrightPosition, 38); n++;
|
||
XtSetArg (args[n], XmNcolumns, 8); n++;
|
||
efl_w = XmCreateTextField (eyep_w, "EyepieceFL", args, n);
|
||
wtip (efl_w, "Enter focal length of eyepiece, in millimeters");
|
||
sr_reg (efl_w, NULL, skyepcategory, 0);
|
||
XtManageChild (efl_w);
|
||
XtAddCallback (efl_w, XmNvalueChangedCallback, se_calc2_cb, NULL);
|
||
XtAddCallback (efl_w, XmNactivateCallback, se_calc2_cb, NULL);
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, l_w); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNleftPosition, 40); n++;
|
||
XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNrightPosition, 58); n++;
|
||
XtSetArg (args[n], XmNcolumns, 8); n++;
|
||
mfl_w = XmCreateTextField (eyep_w, "MirrorFL", args, n);
|
||
wtip (mfl_w, "Enter focal length of primary mirror, in units of mm, m or inches");
|
||
sr_reg (mfl_w, NULL, skyepcategory, 0);
|
||
XtManageChild (mfl_w);
|
||
XtAddCallback (mfl_w, XmNvalueChangedCallback, se_calc2_cb, NULL);
|
||
XtAddCallback (mfl_w, XmNactivateCallback, se_calc2_cb, NULL);
|
||
|
||
/* formula #2 sky angle result label */
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, l_w); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNleftPosition, 60); n++;
|
||
XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNrightPosition, 88); n++;
|
||
sa2_w = XmCreateLabel (eyep_w, "SAL", args, n);
|
||
wtip (sa2_w, "Sky angle with given eyepiece and mirror");
|
||
set_xmstring (sa2_w, XmNlabelString, "xxx:xx:xx.x");
|
||
XtManageChild (sa2_w);
|
||
|
||
/* formula #2 set w and h */
|
||
|
||
n = 0;
|
||
XtSetArg (args[n],XmNbottomAttachment,XmATTACH_OPPOSITE_WIDGET);n++;
|
||
XtSetArg (args[n], XmNbottomWidget, l_w); n++;
|
||
XtSetArg (args[n], XmNbottomOffset, 0); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNleftPosition, 90); n++;
|
||
XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
|
||
XtSetArg (args[n], XmNmarginHeight, 0); n++;
|
||
w = XmCreatePushButton (eyep_w, "W", args, n);
|
||
wtip (w, "Set eyepiece width scale to this Sky angle");
|
||
XtAddCallback (w, XmNactivateCallback, se_skyW_cb,(XtPointer)sa2_w);
|
||
XtManageChild (w);
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, w); n++;
|
||
XtSetArg (args[n], XmNtopOffset, 1); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNleftPosition, 90); n++;
|
||
XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
|
||
XtSetArg (args[n], XmNmarginHeight, 0); n++;
|
||
w = XmCreatePushButton (eyep_w, "H", args, n);
|
||
wtip (w, "Set eyepiece height scale to this Sky angle");
|
||
XtAddCallback (w, XmNactivateCallback, se_skyH_cb,(XtPointer)sa2_w);
|
||
XtManageChild (w);
|
||
|
||
/* favorites */
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, mfl_w); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
|
||
XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
|
||
XtSetArg (args[n], XmNseparatorType, XmDOUBLE_LINE); n++;
|
||
sep_w = XmCreateSeparator (eyep_w, "Sep", args, n);
|
||
XtManageChild (sep_w);
|
||
|
||
/* title and "Add" */
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, sep_w); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
|
||
XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
|
||
l_w = XmCreateLabel (eyep_w, "EL", args, n);
|
||
set_xmstring (l_w, XmNlabelString, "Eyepieces Definitions");
|
||
XtManageChild (l_w);
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, l_w); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
|
||
pb_w = XmCreatePushButton (eyep_w, "Add current", args, n);
|
||
wtip (pb_w, "Add current settings to list of favorites");
|
||
XtAddCallback (pb_w, XmNactivateCallback, se_addfav_cb, NULL);
|
||
XtManageChild (pb_w);
|
||
|
||
/* all favorites in a RC, empty until favorites get defined */
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, pb_w); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
|
||
XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
|
||
favrc_w = XmCreateRowColumn (eyep_w, "EPRC", args, n);
|
||
XtManageChild (favrc_w);
|
||
|
||
/* load/save controls */
|
||
|
||
s[0] = eyep_suffix;
|
||
sfm_w = createFSM (eyep_w, s, 1, "auxil", se_loadd_cb);
|
||
wtip (sfm_w, "Select file of favorite eyepieces to load");
|
||
set_xmstring (sfm_w, XmNlabelString, "Load file: ");
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, favrc_w); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNleftPosition, 15); n++;
|
||
XtSetValues (sfm_w, args, n);
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, sfm_w); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNleftPosition, 15); n++;
|
||
pb_w = XmCreatePushButton (eyep_w, "ESPB", args, n);
|
||
set_xmstring (pb_w, XmNlabelString, "Save to:");
|
||
wtip (pb_w, "Save these Eyepieces definitions in the file named at right");
|
||
XtAddCallback (pb_w, XmNactivateCallback, se_saved_cb, NULL);
|
||
XtManageChild (pb_w);
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, sfm_w); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNleftWidget, pb_w); n++;
|
||
XtSetArg (args[n], XmNleftOffset, 10); n++;
|
||
XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNrightPosition, 85); n++;
|
||
saved_w = XmCreateTextField (eyep_w, "EyePDefFile", args, n);
|
||
XtAddCallback (saved_w, XmNactivateCallback, se_saved_cb, NULL);
|
||
sr_reg (saved_w, NULL, skyepcategory, 0);
|
||
defaultTextFN (saved_w, 0, defeyepfn, NULL);
|
||
wtip (saved_w, "File in which to save these Eyepiece definitions");
|
||
XtManageChild (saved_w);
|
||
|
||
/* eyepice locations */
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, saved_w); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
|
||
XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
|
||
XtSetArg (args[n], XmNseparatorType, XmDOUBLE_LINE); n++;
|
||
sep_w = XmCreateSeparator (eyep_w, "Sep", args, n);
|
||
XtManageChild (sep_w);
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, sep_w); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
|
||
XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
|
||
l_w = XmCreateLabel (eyep_w, "Pos", args, n);
|
||
set_xmstring (l_w, XmNlabelString, "Current Sky View Eyepieces");
|
||
XtManageChild (l_w);
|
||
|
||
s[0] = eyel_suffix;
|
||
sfm_w = createFSM (eyep_w, s, 1, "auxil", se_loadp_cb);
|
||
wtip (sfm_w, "Select existing eyepiece positions file to load");
|
||
set_xmstring (sfm_w, XmNlabelString, "Load file: ");
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, l_w); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNleftPosition, 15); n++;
|
||
XtSetValues (sfm_w, args, n);
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, sfm_w); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNleftPosition, 15); n++;
|
||
pb_w = XmCreatePushButton (eyep_w, "ELS", args, n);
|
||
set_xmstring (pb_w, XmNlabelString, "Save to:");
|
||
wtip (pb_w, "Save current eyepiece positions in file named at right");
|
||
XtAddCallback (pb_w, XmNactivateCallback, se_savep_cb, NULL);
|
||
XtManageChild (pb_w);
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, sfm_w); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNleftWidget, pb_w); n++;
|
||
XtSetArg (args[n], XmNleftOffset, 10); n++;
|
||
XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNrightPosition, 85); n++;
|
||
savep_w = XmCreateTextField (eyep_w, "EyePPosFile", args, n);
|
||
XtAddCallback (savep_w, XmNactivateCallback, se_savep_cb, NULL);
|
||
sr_reg (savep_w, NULL, skyepcategory, 0);
|
||
defaultTextFN (savep_w, 0, defeyelfn, NULL);
|
||
wtip (savep_w, "File in which to save current eyepiece positions");
|
||
XtManageChild (savep_w);
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, savep_w); n++;
|
||
XtSetArg (args[n], XmNtopOffset, 10); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNleftPosition, 20); n++;
|
||
XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNrightPosition, 80); n++;
|
||
delep_w = XmCreatePushButton (eyep_w, "DelE", args, n);
|
||
XtAddCallback (delep_w, XmNactivateCallback, se_delall_cb, NULL);
|
||
wtip (delep_w, "Delete all eyepieces now on Sky View");
|
||
set_xmstring (delep_w,XmNlabelString,"Delete all placed eyepieces");
|
||
XtSetSensitive (delep_w, False); /* works when there are some */
|
||
XtManageChild (delep_w);
|
||
|
||
/* separator */
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, delep_w); n++;
|
||
XtSetArg (args[n], XmNtopOffset, 10); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
|
||
XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
|
||
sep_w = XmCreateSeparator (eyep_w, "Sep", args, n);
|
||
XtManageChild (sep_w);
|
||
|
||
/* a close button */
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, sep_w); n++;
|
||
XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNleftPosition, 20); n++;
|
||
XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNrightPosition, 40); n++;
|
||
w = XmCreatePushButton (eyep_w, "Close", args, n);
|
||
XtAddCallback (w, XmNactivateCallback, se_close_cb, NULL);
|
||
wtip (w, "Close this dialog");
|
||
XtManageChild (w);
|
||
|
||
/* a help button */
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
|
||
XtSetArg (args[n], XmNtopWidget, sep_w); n++;
|
||
XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
|
||
XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNleftPosition, 60); n++;
|
||
XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
|
||
XtSetArg (args[n], XmNrightPosition, 80); n++;
|
||
w = XmCreatePushButton (eyep_w, "Help", args, n);
|
||
XtAddCallback (w, XmNactivateCallback, se_help_cb, NULL);
|
||
wtip (w, "More info about this dialog");
|
||
XtManageChild (w);
|
||
|
||
/* engage side effects if telrad on initially */
|
||
if (XmToggleButtonGetState(telrad_w)) {
|
||
XmToggleButtonSetState(telrad_w, False, True);
|
||
XmToggleButtonSetState(telrad_w, True, True);
|
||
}
|
||
|
||
/* calculate sky angles from default values */
|
||
se_calc1();
|
||
se_calc2();
|
||
|
||
/* load default favorites */
|
||
se_loadEyep(NULL);
|
||
se_loadPos(NULL);
|
||
}
|
||
|
||
/* read the given w or h scale and write it's value in the given label */
|
||
static void
|
||
se_scale_fmt (s_w, l_w)
|
||
Widget s_w, l_w;
|
||
{
|
||
char buf[64];
|
||
|
||
buf[0] = l_w == eyephl_w ? 'H' : 'W';
|
||
fs_sexa (buf+1, raddeg(se_getScale(s_w)), 3, 60);
|
||
set_xmstring (l_w, XmNlabelString, buf);
|
||
}
|
||
|
||
/* read the given pa scale and write it's value in the given label */
|
||
static void
|
||
se_pascale_fmt (s_w, l_w)
|
||
Widget s_w, l_w;
|
||
{
|
||
char buf[64];
|
||
|
||
sprintf (buf, "A %4.0f", raddeg(se_getPScale(s_w)));
|
||
set_xmstring (l_w, XmNlabelString, buf);
|
||
}
|
||
|
||
/* called when the telrad TB is activated */
|
||
static void
|
||
se_telrad_cb (w, client, call)
|
||
Widget w;
|
||
XtPointer client;
|
||
XtPointer call;
|
||
{
|
||
int set = XmToggleButtonGetState (w);
|
||
|
||
if (set) {
|
||
XtSetSensitive (eyef_w, False);
|
||
XtSetSensitive (eyeb_w, False);
|
||
XtSetSensitive (eyer_w, False);
|
||
XtSetSensitive (eyes_w, False);
|
||
XtSetSensitive (lock_w, False);
|
||
XtSetSensitive (eyephs_w, False);
|
||
XtSetSensitive (eyepws_w, False);
|
||
XtSetSensitive (eyepa_w, False);
|
||
} else {
|
||
XtSetSensitive (eyef_w, True);
|
||
XtSetSensitive (eyeb_w, True);
|
||
XtSetSensitive (eyer_w, True);
|
||
XtSetSensitive (eyes_w, True);
|
||
XtSetSensitive (lock_w, True);
|
||
XtSetSensitive (eyephs_w, True);
|
||
XtSetSensitive (eyepws_w, True);
|
||
XtSetSensitive (eyepa_w, True);
|
||
}
|
||
}
|
||
|
||
/* drag callback from the height scale */
|
||
static void
|
||
se_hscale_cb (w, client, call)
|
||
Widget w;
|
||
XtPointer client;
|
||
XtPointer call;
|
||
{
|
||
se_scale_fmt (eyephs_w, eyephl_w);
|
||
|
||
/* slave the w scale to the h scale */
|
||
if (XmToggleButtonGetState(lock_w)) {
|
||
se_setScale (eyepws_w, se_getScale (eyephs_w));
|
||
se_scale_fmt (eyepws_w, eyepwl_w);
|
||
XmToggleButtonSetState (telrad_w, False, True);
|
||
}
|
||
}
|
||
|
||
/* drag callback from the width scale */
|
||
static void
|
||
se_wscale_cb (w, client, call)
|
||
Widget w;
|
||
XtPointer client;
|
||
XtPointer call;
|
||
{
|
||
se_scale_fmt (eyepws_w, eyepwl_w);
|
||
|
||
/* slave the w scale to the h scale */
|
||
if (XmToggleButtonGetState(lock_w)) {
|
||
se_setScale (eyephs_w, se_getScale (eyepws_w));
|
||
se_scale_fmt (eyephs_w, eyephl_w);
|
||
XmToggleButtonSetState (telrad_w, False, True);
|
||
}
|
||
}
|
||
|
||
/* drag callback from the pa scale */
|
||
static void
|
||
se_pscale_cb (w, client, call)
|
||
Widget w;
|
||
XtPointer client;
|
||
XtPointer call;
|
||
{
|
||
se_pascale_fmt (eyepa_w, eyepal_w);
|
||
}
|
||
|
||
/* callback from the delete-all eyepieces control.
|
||
*/
|
||
/* ARGSUSED */
|
||
static void
|
||
se_delall_cb (w, client, call)
|
||
Widget w;
|
||
XtPointer client;
|
||
XtPointer call;
|
||
{
|
||
if (eyep) {
|
||
if (confirm()) {
|
||
char msg[128];
|
||
switch (neyep) {
|
||
case 0:
|
||
printf ("Bug! tried to delete %d eyepieces\n", neyep);
|
||
abort();
|
||
case 1:
|
||
sprintf (msg, "Delete the placed eyepiece?");
|
||
break;
|
||
case 2:
|
||
sprintf (msg, "Delete both placed eyepieces?");
|
||
break;
|
||
default:
|
||
sprintf (msg, "Delete all %d placed eyepieces?", neyep);
|
||
break;
|
||
}
|
||
query (eyep_w, msg, "Yes -- delete", "No -- cancel", NULL,
|
||
se_delall, NULL, NULL);
|
||
} else
|
||
se_delall();
|
||
}
|
||
}
|
||
|
||
/* delete memory for and display of all currently placed eyepieces.
|
||
*/
|
||
static void
|
||
se_delall()
|
||
{
|
||
XtFree ((void *)eyep);
|
||
eyep = NULL;
|
||
neyep = 0;
|
||
sv_all(mm_get_now());
|
||
XtSetSensitive (delep_w, False);
|
||
}
|
||
|
||
/* callback from the close PB.
|
||
*/
|
||
/* ARGSUSED */
|
||
static void
|
||
se_close_cb (w, client, call)
|
||
Widget w;
|
||
XtPointer client;
|
||
XtPointer call;
|
||
{
|
||
XtUnmanageChild (eyep_w);
|
||
}
|
||
|
||
/* called when the help button is hit in the eyepiece dialog */
|
||
/* ARGSUSED */
|
||
static void
|
||
se_help_cb (w, client, call)
|
||
Widget w;
|
||
XtPointer client;
|
||
XtPointer call;
|
||
{
|
||
static char *msg[] = {
|
||
"Define eyepiece shapes and sizes."
|
||
};
|
||
|
||
hlp_dialog ("SkyView_eyepieces", msg, sizeof(msg)/sizeof(msg[0]));
|
||
|
||
}
|
||
|
||
/* called to take the sky angle from the calculator and set width scale.
|
||
* client points to a label widget from which the angle is extracted.
|
||
*/
|
||
/* ARGSUSED */
|
||
static void
|
||
se_skyW_cb (w, client, call)
|
||
Widget w;
|
||
XtPointer client;
|
||
XtPointer call;
|
||
{
|
||
Widget angle_w = (Widget)client;
|
||
char *str;
|
||
double a;
|
||
|
||
get_xmstring (angle_w, XmNlabelString, &str);
|
||
f_scansexa (str, &a);
|
||
XtFree (str);
|
||
se_setScale (eyepws_w, degrad(a));
|
||
se_scale_fmt (eyepws_w, eyepwl_w);
|
||
if (XmToggleButtonGetState (lock_w)) {
|
||
se_setScale (eyephs_w, degrad(a));
|
||
se_scale_fmt (eyephs_w, eyephl_w);
|
||
}
|
||
}
|
||
|
||
/* called to take the sky angle from the calculator and set height scale.
|
||
* client points to a label widget from which the angle is extracted.
|
||
*/
|
||
/* ARGSUSED */
|
||
static void
|
||
se_skyH_cb (w, client, call)
|
||
Widget w;
|
||
XtPointer client;
|
||
XtPointer call;
|
||
{
|
||
Widget angle_w = (Widget)client;
|
||
char *str;
|
||
double a;
|
||
|
||
get_xmstring (angle_w, XmNlabelString, &str);
|
||
f_scansexa (str, &a);
|
||
XtFree (str);
|
||
se_setScale (eyephs_w, degrad(a));
|
||
se_scale_fmt (eyephs_w, eyephl_w);
|
||
if (XmToggleButtonGetState (lock_w)) {
|
||
se_setScale (eyepws_w, degrad(a));
|
||
se_scale_fmt (eyepws_w, eyepwl_w);
|
||
}
|
||
}
|
||
|
||
/* called when any of the factors in formula 1 change */
|
||
/* ARGSUSED */
|
||
static void
|
||
se_calc1_cb (w, client, call)
|
||
Widget w;
|
||
XtPointer client;
|
||
XtPointer call;
|
||
{
|
||
se_calc1();
|
||
}
|
||
|
||
static void
|
||
se_calc1()
|
||
{
|
||
char *tmp, *flstr, *fpstr, sastr[32];
|
||
double fl, fp, sa;
|
||
|
||
/* get focal length, convert to mm */
|
||
flstr = XmTextFieldGetString (fl_w);
|
||
fl = atof (flstr);
|
||
if (fl == 0) {
|
||
XtFree (flstr);
|
||
return;
|
||
}
|
||
if ((tmp = strchr (flstr, 'm')) && strrchr (flstr, 'm') == tmp)
|
||
fl *= 1e3; /* m to mm */
|
||
else if (strchr (flstr, '"') || strchr (flstr, 'i'))
|
||
fl *= 25.4; /* inches to mm */
|
||
/* else assume mm */
|
||
XtFree (flstr);
|
||
|
||
/* get focal plane length, convert to um */
|
||
fpstr = XmTextFieldGetString (fp_w);
|
||
fp = atof (fpstr);
|
||
if ((tmp = strchr (fpstr, 'm')) && strrchr(fpstr, 'm') != tmp)
|
||
fp *= 1e3; /* mm to um */
|
||
else if (strchr (fpstr, '"') || strchr (fpstr, 'i'))
|
||
fp *= 25.4e6; /* inches to um */
|
||
/* else assume um */
|
||
XtFree (fpstr);
|
||
|
||
/* compute and show sky angle */
|
||
sa = 206*fp/fl; /* arc seconds */
|
||
fs_sexa (sastr, sa/3600., 3, 36000);
|
||
set_xmstring (sa1_w, XmNlabelString, sastr);
|
||
}
|
||
|
||
/* called when any of the factors in formula 2 change */
|
||
/* ARGSUSED */
|
||
static void
|
||
se_calc2_cb (w, client, call)
|
||
Widget w;
|
||
XtPointer client;
|
||
XtPointer call;
|
||
{
|
||
se_calc2();
|
||
}
|
||
|
||
/* gather values and compute sky angle using formula 2 */
|
||
static void
|
||
se_calc2()
|
||
{
|
||
char *tmp, *mflstr, sastr[32];
|
||
double afov, efl, mfl, sa;
|
||
|
||
/* get apparent field of view, assume degrees */
|
||
tmp = XmTextFieldGetString (afov_w);
|
||
afov = atof (tmp);
|
||
XtFree (tmp);
|
||
|
||
/* get eyepiece focal length, assume mm */
|
||
tmp = XmTextFieldGetString (efl_w);
|
||
efl = atof (tmp);
|
||
XtFree (tmp);
|
||
if (efl <= 0)
|
||
return;
|
||
|
||
/* get focal length of primary, convert to mm */
|
||
mflstr = XmTextFieldGetString (mfl_w);
|
||
mfl = atof (mflstr);
|
||
if ((tmp = strchr (mflstr, 'm')) && strrchr(mflstr, 'm') == tmp)
|
||
mfl *= 1e3; /* m to mm */
|
||
else if (strchr (mflstr, '"') || strchr (mflstr, 'i'))
|
||
mfl *= 25.4; /* inches to mm */
|
||
/* else assume mm */
|
||
XtFree (mflstr);
|
||
|
||
/* compute and show sky angle */
|
||
sa = afov*efl/mfl;
|
||
fs_sexa (sastr, sa, 3, 36000);
|
||
set_xmstring (sa2_w, XmNlabelString, sastr);
|
||
}
|
||
|
||
/* read the given Scale widget and return it's current setting, in rads */
|
||
static double
|
||
se_getScale (w)
|
||
Widget w;
|
||
{
|
||
int v;
|
||
double a;
|
||
|
||
XmScaleGetValue (w, &v);
|
||
|
||
a = v*LOSCALE;
|
||
if (a > CHSCALE)
|
||
a = CHSCALE + (a - CHSCALE)/LOSCALE*HISCALE;
|
||
return (a);
|
||
}
|
||
|
||
/* set the given Scale widget to the given setting, in rads */
|
||
static void
|
||
se_setScale (w, a)
|
||
Widget w;
|
||
double a;
|
||
{
|
||
int v;
|
||
|
||
if (a > CHSCALE)
|
||
a = (a - CHSCALE)*LOSCALE/HISCALE + CHSCALE;
|
||
v = (int)(a/LOSCALE+.5);
|
||
if (v > SCALEMAX) {
|
||
xe_msg (1, "Sorry, scale only goes to %g", raddeg(MXSCALE));
|
||
} else {
|
||
if (v < 1)
|
||
v = 1;
|
||
XmScaleSetValue (w, v);
|
||
}
|
||
}
|
||
|
||
/* read the given pos angle widget and return it's current setting, in rads */
|
||
static double
|
||
se_getPScale (w)
|
||
Widget w;
|
||
{
|
||
int v;
|
||
|
||
XmScaleGetValue (w, &v);
|
||
return (degrad(v));
|
||
}
|
||
|
||
/* called to install "use" a FavEyeP.
|
||
* client is index into favs[]
|
||
*/
|
||
/* ARGSUSED */
|
||
static void
|
||
se_usefav_cb (w, client, call)
|
||
Widget w;
|
||
XtPointer client;
|
||
XtPointer call;
|
||
{
|
||
FavEyeP *fp = &favs[(long int)client];
|
||
|
||
se_setScale (eyepws_w, fp->w);
|
||
se_scale_fmt (eyepws_w, eyepwl_w);
|
||
se_setScale (eyephs_w, fp->h);
|
||
se_scale_fmt (eyephs_w, eyephl_w);
|
||
XmToggleButtonSetState (fp->isE ? eyer_w : eyes_w, True, True);
|
||
XmToggleButtonSetState (fp->isS ? eyef_w : eyeb_w, True, True);
|
||
XmToggleButtonSetState (telrad_w, False, True);
|
||
XmToggleButtonSetState (lock_w, False, True);
|
||
}
|
||
|
||
/* called to delete a FavEyeP.
|
||
* client is index into favs[]
|
||
*/
|
||
/* ARGSUSED */
|
||
static void
|
||
se_delfav_cb (w, client, call)
|
||
Widget w;
|
||
XtPointer client;
|
||
XtPointer call;
|
||
{
|
||
FavEyeP *fp = &favs[(long int)client];
|
||
XtDestroyWidget (fp->row_w);
|
||
fp->inuse = 0;
|
||
}
|
||
|
||
/* called to add a new FavEyeP */
|
||
/* ARGSUSED */
|
||
static void
|
||
se_addfav_cb (w, client, call)
|
||
Widget w;
|
||
XtPointer client;
|
||
XtPointer call;
|
||
{
|
||
FavEyeP newfav;
|
||
double aunused;
|
||
|
||
memset (&newfav, 0, sizeof(newfav));
|
||
se_eyepsz (&newfav.w, &newfav.h, &aunused, &newfav.isE, &newfav.isS);
|
||
sprintf (newfav.name, "My eyepiece #%d", nfavs+1);
|
||
se_addFavEyeP (&newfav);
|
||
}
|
||
|
||
/* callback to load eyepiece defintions from file.
|
||
* file name is label of this widget
|
||
*/
|
||
/* ARGSUSED */
|
||
static void
|
||
se_loadd_cb (w, client, call)
|
||
Widget w;
|
||
XtPointer client;
|
||
XtPointer call;
|
||
{
|
||
char *fn;
|
||
get_xmstring (w, XmNlabelString, &fn);
|
||
se_loadEyep(fn);
|
||
XtFree (fn);
|
||
}
|
||
|
||
/* callback to Save the current eyepiece definitions to file named in saved_w
|
||
* N.B. don't use call, this is used by TF and PB
|
||
*/
|
||
/* ARGSUSED */
|
||
static void
|
||
se_saved_cb (w, client, call)
|
||
Widget w;
|
||
XtPointer client;
|
||
XtPointer call;
|
||
{
|
||
char buf[1024], *fn;
|
||
char *txt;
|
||
|
||
/* get file name */
|
||
fn = txt = XmTextFieldGetString (saved_w);
|
||
if (!strstr (txt, eyep_suffix)) {
|
||
sprintf (fn = buf, "%s%s", txt, eyep_suffix);
|
||
XmTextFieldSetString (saved_w, fn);
|
||
}
|
||
|
||
/* save */
|
||
se_saveFav(fn);
|
||
|
||
/* clean up */
|
||
XtFree (txt);
|
||
}
|
||
|
||
/* callback to load eyepiece positions list from file.
|
||
* file name is label of this widget
|
||
*/
|
||
/* ARGSUSED */
|
||
static void
|
||
se_loadp_cb (w, client, call)
|
||
Widget w;
|
||
XtPointer client;
|
||
XtPointer call;
|
||
{
|
||
char *fn;
|
||
get_xmstring (w, XmNlabelString, &fn);
|
||
se_loadPos(fn);
|
||
XtFree (fn);
|
||
}
|
||
|
||
/* callback to Save the current eyepiece positions to file named in savep_w
|
||
* N.B. don't use call, this is used by TF and PB
|
||
*/
|
||
/* ARGSUSED */
|
||
static void
|
||
se_savep_cb (w, client, call)
|
||
Widget w;
|
||
XtPointer client;
|
||
XtPointer call;
|
||
{
|
||
char buf[1024], *fn;
|
||
char *txt;
|
||
|
||
/* get file name */
|
||
fn = txt = XmTextFieldGetString (savep_w);
|
||
if (!strstr (txt, eyel_suffix)) {
|
||
sprintf (fn = buf, "%s%s", txt, eyel_suffix);
|
||
XmTextFieldSetString (savep_w, fn);
|
||
}
|
||
|
||
/* save */
|
||
se_savePos(fn);
|
||
|
||
/* clean up */
|
||
XtFree (txt);
|
||
}
|
||
|
||
/* add (or reuse) a new (or unused) entry to favs[], create and show in favrc_w.
|
||
*/
|
||
static void
|
||
se_addFavEyeP (newfp)
|
||
FavEyeP *newfp;
|
||
{
|
||
char buf[32], wstr[32], hstr[32];
|
||
Widget w;
|
||
Arg args[20];
|
||
FavEyeP *fp;
|
||
int n, fn;
|
||
|
||
/* find/create a new entry */
|
||
for (fn = 0; fn < nfavs; fn++)
|
||
if (!favs[fn].inuse)
|
||
break;
|
||
if (fn == nfavs)
|
||
favs = (FavEyeP *) XtRealloc ((char *)favs,
|
||
(++nfavs)*sizeof(FavEyeP));
|
||
fp = &favs[fn];
|
||
|
||
/* start filling with new */
|
||
*fp = *newfp;
|
||
fp->inuse = 1;
|
||
|
||
/* add the widgets */
|
||
n = 0;
|
||
XtSetArg (args[n], XmNorientation, XmHORIZONTAL); n++;
|
||
XtSetArg (args[n], XmNspacing, 3); n++;
|
||
fp->row_w = XmCreateRowColumn (favrc_w, "EPF", args, n);
|
||
XtManageChild (fp->row_w);
|
||
|
||
n = 0;
|
||
w = XmCreatePushButton (fp->row_w, "Del", args, n);
|
||
XtAddCallback (w, XmNactivateCallback, se_delfav_cb, (XtPointer)(long int)fn);
|
||
wtip (w, "Delete this eyepiece from the list of favorites");
|
||
XtManageChild (w);
|
||
|
||
n = 0;
|
||
w = XmCreatePushButton (fp->row_w, "Use", args, n);
|
||
XtAddCallback (w, XmNactivateCallback, se_usefav_cb, (XtPointer)(long int)fn);
|
||
wtip (w, "Install this eyepiece in the `next' settings above.");
|
||
XtManageChild (w);
|
||
|
||
n = 0;
|
||
XtSetArg (args[n], XmNcolumns, MAXEPNMD); n++;
|
||
XtSetArg (args[n], XmNmaxLength, MAXEPNM-1); n++;
|
||
XtSetArg (args[n], XmNvalue, fp->name); n++;
|
||
w = XmCreateTextField (fp->row_w, "FTF", args, n);
|
||
wtip (w, "Type in a name for this eyepiece configuration");
|
||
XtManageChild (w);
|
||
fp->name_w = w;
|
||
|
||
n = 0;
|
||
w = XmCreateLabel (fp->row_w, "FL", args, n);
|
||
fs_sexa (wstr, raddeg(fp->w), 2, 60);
|
||
fs_sexa (hstr, raddeg(fp->h), 2, 60);
|
||
sprintf (buf, "%s %s %c %c", wstr, hstr,
|
||
fp->isE ? 'E' : 'R', fp->isS ? 'S' : 'O');
|
||
set_xmstring (w, XmNlabelString, buf);
|
||
wtip (w, "Coded definition for this eyepiece: W H Shape Style");
|
||
XtManageChild (w);
|
||
}
|
||
|
||
/* save the current (used) entries in favs[] to the given file */
|
||
static void
|
||
se_saveFav(char *fn)
|
||
{
|
||
FILE *fp;
|
||
int i;
|
||
|
||
/* create */
|
||
fp = fopend (fn, NULL, "w");
|
||
if (!fp)
|
||
return; /* already informed user */
|
||
|
||
/* write */
|
||
fprintf (fp, "<EyepieceDefinitions>\n");
|
||
for (i = 0; i < nfavs; i++) {
|
||
FavEyeP *fvp = &favs[i];
|
||
char *name;
|
||
|
||
if (!fvp->inuse)
|
||
continue;
|
||
name = XmTextFieldGetString (fvp->name_w);
|
||
fprintf (fp, " <eyepiece width='%g' height='%g' isElliptical='%d' isSolid='%d'>%s</eyepiece>\n",
|
||
raddeg(fvp->w), raddeg(fvp->h), fvp->isE, fvp->isS, name);
|
||
XtFree (name);
|
||
}
|
||
fprintf (fp, "</EyepieceDefinitions>\n");
|
||
|
||
/* finished */
|
||
fclose (fp);
|
||
|
||
if (confirm())
|
||
xe_msg (1, "Wrote %d definitions to %s", nfavs, fn);
|
||
}
|
||
|
||
/* read and replace the favorites list from the given file, or file named in
|
||
* saved_w if !fn
|
||
*/
|
||
static void
|
||
se_loadEyep(char *fn)
|
||
{
|
||
char msg[1024];
|
||
char buf[1024];
|
||
XMLEle *root, *ep;
|
||
FILE *fp;
|
||
LilXML *xp;
|
||
int i;
|
||
|
||
/* get file name */
|
||
if (!fn) {
|
||
char *txt = XmTextFieldGetString (saved_w);
|
||
if (!strstr (txt, eyep_suffix))
|
||
sprintf (buf, "%s%s", txt, eyep_suffix);
|
||
else
|
||
strcpy (buf, txt);
|
||
XtFree (txt);
|
||
fn = buf;
|
||
}
|
||
|
||
/* open */
|
||
fp = fopend (fn, "auxil", "r");
|
||
if (!fp)
|
||
return; /* already informed user */
|
||
|
||
/* read */
|
||
xp = newLilXML ();
|
||
root = readXMLFile (fp, xp, msg);
|
||
fclose (fp);
|
||
delLilXML (xp);
|
||
if (!root) {
|
||
xe_msg (1, "%s: %s", fn, msg[0] ? msg : "bad format");
|
||
return;
|
||
}
|
||
if (strcmp (tagXMLEle(root), "EyepieceDefinitions")) {
|
||
xe_msg (1, "%s: not an Eyepieces file", fn);
|
||
delXMLEle (root);
|
||
return;
|
||
}
|
||
|
||
/* clear the favs[] array */
|
||
for (i = 0; i < nfavs; i++)
|
||
if (favs[i].inuse)
|
||
XtDestroyWidget (favs[i].row_w);
|
||
XtFree ((char *)favs);
|
||
favs = NULL;
|
||
nfavs = 0;
|
||
|
||
/* build new */
|
||
for (ep = nextXMLEle(root,1); ep != NULL; ep = nextXMLEle(root,0)) {
|
||
FavEyeP newf;
|
||
|
||
if (strcmp (tagXMLEle(ep), "eyepiece"))
|
||
continue;
|
||
|
||
memset (&newf, 0, sizeof(newf));
|
||
strncpy (newf.name, pcdataXMLEle(ep), sizeof(newf.name)-1);
|
||
newf.isE = atoi(findXMLAttValu(ep,"isElliptical"));
|
||
newf.isS = atoi(findXMLAttValu(ep,"isSolid"));
|
||
newf.w = degrad(atof(findXMLAttValu(ep,"width")));
|
||
newf.h = degrad(atof(findXMLAttValu(ep,"height")));
|
||
se_addFavEyeP (&newf);
|
||
}
|
||
|
||
if (confirm())
|
||
xe_msg (1, "Read %d definitions from %s", nfavs, fn);
|
||
|
||
/* finished */
|
||
delXMLEle (root);
|
||
}
|
||
|
||
/* save eyep[] to the given file */
|
||
static void
|
||
se_savePos(char *fn)
|
||
{
|
||
FILE *fp;
|
||
int i;
|
||
|
||
/* create */
|
||
fp = fopend (fn, NULL, "w");
|
||
if (!fp)
|
||
return; /* already informed user */
|
||
|
||
/* write */
|
||
fprintf (fp, "<EyepiecePlacements>\n");
|
||
for (i = 0; i < neyep; i++) {
|
||
EyePiece *ep = &eyep[i];
|
||
|
||
fprintf (fp, " <placement altdec='%g' azra='%g' aamode='%d'",
|
||
ep->altdec, ep->azra, ep->aamode);
|
||
fprintf (fp, " width='%g' height='%g' angle='%g'",
|
||
ep->eyepw, ep->eyeph, ep->eyepa);
|
||
fprintf (fp, " isRound='%d' isSolid='%d' />\n",ep->round,ep->solid);
|
||
}
|
||
fprintf (fp, "</EyepiecePlacements>\n");
|
||
|
||
if (confirm())
|
||
xe_msg (1, "Wrote %d eyepiece placements to %s", neyep, fn);
|
||
|
||
/* finished */
|
||
fclose (fp);
|
||
}
|
||
|
||
/* read and replace the list of eyepiece positions from the given file, or
|
||
* file named in savep_w if !fn
|
||
*/
|
||
static void
|
||
se_loadPos(char *fn)
|
||
{
|
||
char msg[1024];
|
||
char buf[1024];
|
||
XMLEle *root, *ep;
|
||
FILE *fp;
|
||
LilXML *xp;
|
||
|
||
/* get file name */
|
||
if (!fn) {
|
||
char *txt = XmTextFieldGetString (savep_w);
|
||
if (!strstr (txt, eyel_suffix))
|
||
sprintf (buf, "%s%s", txt, eyel_suffix);
|
||
else
|
||
strcpy (buf, txt);
|
||
XtFree (txt);
|
||
fn = buf;
|
||
}
|
||
|
||
/* open */
|
||
fp = fopend (fn, "auxil", "r");
|
||
if (!fp)
|
||
return; /* already informed user */
|
||
|
||
/* read */
|
||
xp = newLilXML ();
|
||
root = readXMLFile (fp, xp, msg);
|
||
fclose (fp);
|
||
delLilXML (xp);
|
||
if (!root) {
|
||
xe_msg (1, "%s: %s", fn, msg[0] ? msg : "bad format");
|
||
return;
|
||
}
|
||
if (strcmp (tagXMLEle(root), "EyepiecePlacements")) {
|
||
xe_msg (1, "%s: not an Eyepiece Placements file", fn);
|
||
delXMLEle (root);
|
||
return;
|
||
}
|
||
|
||
/* clear the eyep[] array */
|
||
XtFree ((char *)eyep);
|
||
eyep = NULL;
|
||
neyep = 0;
|
||
|
||
/* build new list */
|
||
for (ep = nextXMLEle(root,1); ep != NULL; ep = nextXMLEle(root,0)) {
|
||
EyePiece *nep;
|
||
|
||
if (strcmp (tagXMLEle(ep), "placement"))
|
||
continue;
|
||
|
||
nep = se_addeyep ();
|
||
nep->altdec = atof(findXMLAttValu(ep,"altdec"));
|
||
nep->azra = atof(findXMLAttValu(ep,"azra"));
|
||
nep->aamode = atof(findXMLAttValu(ep,"aamode"));
|
||
nep->eyepw = atof(findXMLAttValu(ep,"width"));
|
||
nep->eyeph = atof(findXMLAttValu(ep,"height"));
|
||
nep->eyepa = atof(findXMLAttValu(ep,"angle"));
|
||
nep->round = atoi(findXMLAttValu(ep,"isRound"));
|
||
nep->solid = atoi(findXMLAttValu(ep,"isSolid"));
|
||
}
|
||
|
||
if (confirm())
|
||
xe_msg (1, "Read %d eyepiece placements from %s", neyep, fn);
|
||
|
||
/* finished */
|
||
delXMLEle (root);
|
||
|
||
/* draw */
|
||
sv_all (mm_get_now());
|
||
}
|
||
|
||
/* For RCS Only -- Do Not Edit */
|
||
static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: skyeyep.c,v $ $Date: 2011/05/16 02:32:23 $ $Revision: 1.32 $ $Name: $"};
|