summaryrefslogtreecommitdiffstats
path: root/tksao/frame/frcommand.C
diff options
context:
space:
mode:
authorWilliam Joye <wjoye@cfa.harvard.edu>2016-10-27 18:59:29 (GMT)
committerWilliam Joye <wjoye@cfa.harvard.edu>2016-10-27 18:59:29 (GMT)
commitd4d595fa7fb12903db9227d33d48b2b00120dbd1 (patch)
tree7d18365de0d6d1b29399b6a17c7eb01c2eb3ed49 /tksao/frame/frcommand.C
parent949f96e29bfe0bd8710d775ce220e597064e2589 (diff)
downloadblt-d4d595fa7fb12903db9227d33d48b2b00120dbd1.zip
blt-d4d595fa7fb12903db9227d33d48b2b00120dbd1.tar.gz
blt-d4d595fa7fb12903db9227d33d48b2b00120dbd1.tar.bz2
Initial commit
Diffstat (limited to 'tksao/frame/frcommand.C')
-rw-r--r--tksao/frame/frcommand.C499
1 files changed, 499 insertions, 0 deletions
diff --git a/tksao/frame/frcommand.C b/tksao/frame/frcommand.C
new file mode 100644
index 0000000..13002ba
--- /dev/null
+++ b/tksao/frame/frcommand.C
@@ -0,0 +1,499 @@
+// Copyright (C) 1999-2016
+// Smithsonian Astrophysical Observatory, Cambridge, MA, USA
+// For conditions of distribution and use, see copyright notice in "copyright"
+
+#include <fstream>
+#include "fdstream.hpp"
+
+#include <tk.h>
+
+#include "framebase.h"
+#include "fitsimage.h"
+#include "context.h"
+#include "marker.h"
+#include "outfile.h"
+#include "outchannel.h"
+#include "outsocket.h"
+
+void FrameBase::binToFitCmd()
+{
+ if (currentContext->fits) {
+ double bf = 1/calcZoom(currentContext->fits->getHistDim(),
+ Vector(options->width,options->height));
+
+ // round up to next power of 2
+ if (bf < 1)
+ currentContext->setBinToFactor(Vector(1,1));
+ else {
+ int p=1;
+ while (p<bf)
+ p*=2;
+ currentContext->setBinToFactor(Vector(p,p));
+ }
+ }
+
+ Matrix mm = currentContext->binCursor();
+ updateBin(mm);
+}
+
+void FrameBase::blockToFitCmd()
+{
+ if (currentContext->fits) {
+ double bf = 1/calcZoom(currentContext->fits->osize(),
+ Vector(options->width,options->height));
+
+ // round up to next power of 2
+ Vector vv;
+ if (bf < 1)
+ vv = currentContext->setBlockToFactor(Vector(1,1));
+ else {
+ int p=1;
+ while (p<bf)
+ p*=2;
+ vv = currentContext->setBlockToFactor(Vector(p,p));
+ }
+
+ currentContext->block();
+ currentContext->analysis();
+ updateBlock(vv);
+ }
+}
+
+void FrameBase::get3dBorderCmd()
+{
+ Tcl_AppendResult(interp, "1", NULL);
+}
+
+void FrameBase::get3dBorderColorCmd()
+{
+ Tcl_AppendResult(interp, "blue", NULL);
+}
+
+void FrameBase::get3dCompassCmd()
+{
+ Tcl_AppendResult(interp, "1", NULL);
+}
+
+void FrameBase::get3dCompassColorCmd()
+{
+ Tcl_AppendResult(interp, "green", NULL);
+}
+
+void FrameBase::get3dHighliteCmd()
+{
+ Tcl_AppendResult(interp, "1", NULL);
+}
+
+void FrameBase::get3dHighliteColorCmd()
+{
+ Tcl_AppendResult(interp, "cyan", NULL);
+}
+
+void FrameBase::get3dRenderMethodCmd()
+{
+ Tcl_AppendResult(interp, "mip", NULL);
+}
+
+void FrameBase::get3dScaleCmd()
+{
+ Tcl_AppendResult(interp, "1", NULL);
+}
+
+void FrameBase::get3dViewCmd()
+{
+ Tcl_AppendResult(interp, "0 0", NULL);
+}
+
+void FrameBase::get3dViewPointCmd()
+{
+ Tcl_AppendResult(interp, "0 0 0 0 0", NULL);
+}
+
+void FrameBase::get3dRenderBackgroundCmd()
+{
+ Tcl_AppendResult(interp, "none", NULL);
+}
+
+void FrameBase::getCursorCmd(Coord::InternalSystem sys)
+{
+ ostringstream str;
+ str << mapFromRef(cursor, sys) << ends;
+ Tcl_AppendResult(interp, str.str().c_str(), NULL);
+}
+
+void FrameBase::getCursorCmd(Coord::CoordSystem sys, Coord::SkyFrame sky,
+ Coord::SkyFormat format)
+{
+ if (currentContext->cfits)
+ printFromRef(currentContext->cfits, cursor, sys, sky, format);
+ else
+ Tcl_AppendResult(interp, "0 0", NULL);
+}
+
+void FrameBase::gridCmd(Coord::CoordSystem sys, Coord::SkyFrame sky,
+ Coord::SkyFormat format, Grid::GridType type,
+ const char* ops, const char* vars)
+{
+ if (grid)
+ delete grid;
+ grid = new Grid2d(this, sys, sky, format, type, ops, vars);
+
+ update(PIXMAP);
+}
+
+void FrameBase::iisCursorModeCmd(int state)
+{
+ if (state) {
+ // set iisLastCursor if first time thru
+ if (iisLastCursor[0] == 0 && iisLastCursor[1] == 0)
+ iisLastCursor = Vector(options->width,options->height)/2;
+
+ // and move to last cursor position
+ Vector rr = iisLastCursor * widgetToWindow;
+ warpTo(rr);
+ }
+}
+
+void FrameBase::iisGetCursorCmd()
+{
+ ostringstream str;
+ str << iisLastCursor << ends;
+ Tcl_AppendResult(interp, str.str().c_str(), NULL);
+}
+
+void FrameBase::iisGetFileNameCmd()
+{
+ FitsImage* ptr = currentContext->fits;
+ while (ptr && ptr->nextMosaic())
+ ptr = ptr->nextMosaic();
+
+ if (ptr)
+ Tcl_AppendResult(interp, ptr->iisGetFileName(), NULL);
+}
+
+void FrameBase::iisGetFileNameCmd(int which)
+{
+ FitsImage* ptr = currentContext->fits;
+ for (int i=0; i<(which-1); i++) {
+ if (ptr)
+ ptr = ptr->nextMosaic();
+ }
+
+ if (ptr)
+ Tcl_AppendResult(interp, ptr->iisGetFileName(), NULL);
+}
+
+void FrameBase::iisGetFileNameCmd(const Vector& vv)
+{
+ if (FitsImage* ptr = isInCFits(vv, Coord::CANVAS, NULL))
+ Tcl_AppendResult(interp, ptr->iisGetFileName(), NULL);
+}
+
+void FrameBase::iisMessageCmd(const char* ptr)
+{
+ if (!currentContext->cfits)
+ return;
+
+ // do we have something?
+ if (!(ptr && *ptr))
+ return;
+
+ // filename
+ // note: the file name is the second value passed
+ char fn[PATH_MAX];
+ string x(ptr);
+ istringstream str(x);
+ str >> fn >> fn;
+ currentContext->cfits->setFileName(fn);
+
+ // object name
+ // first go to end
+ char* sptr = (char*)ptr;
+ while (*sptr)
+ sptr++;
+ // now work backwards to last '-'
+ while (sptr != ptr) {
+ if (*sptr == '-')
+ break;
+ sptr--;
+ }
+ // is it good?
+ if (sptr != ptr) {
+ // go forward 2
+ sptr += 2;
+ currentContext->cfits->setObjectKeyword(sptr);
+ }
+}
+
+void FrameBase::iisSetCursorCmd(const Vector& v, Coord::InternalSystem sys)
+{
+ // assume canvas
+ if (!currentContext->cfits)
+ return;
+
+ iisLastCursor = v * canvasToWidget;
+
+ Vector rr = iisLastCursor * widgetToWindow;
+ warpTo(rr);
+}
+
+void FrameBase::iisSetCursorCmd(const Vector& v, Coord::CoordSystem sys)
+{
+ if (!currentContext->cfits)
+ return;
+
+ iisLastCursor = currentContext->cfits->mapToRef(v,sys) * refToWidget;
+
+ Vector rr = iisLastCursor * widgetToWindow;
+ warpTo(rr);
+}
+
+void FrameBase::iisSetFileNameCmd(const char* fn)
+{
+ FitsImage* ptr = currentContext->fits;
+ while (ptr && ptr->nextMosaic())
+ ptr = ptr->nextMosaic();
+
+ if (ptr)
+ ptr->iisSetFileName(fn);
+}
+
+void FrameBase::iisSetFileNameCmd(const char* fn, int which)
+{
+ FitsImage* ptr = currentContext->fits;
+ for (int i=0; i<(which-1); i++) {
+ if (ptr)
+ ptr = ptr->nextMosaic();
+ }
+
+ if (ptr)
+ ptr->iisSetFileName(fn);
+}
+
+void FrameBase::panCmd(const Vector& v1, const Vector& v2)
+{
+ Vector start = mapToRef(v1,Coord::CANVAS);
+ Vector stop = mapToRef(v2,Coord::CANVAS);
+ cursor -= stop - start;
+
+ setBinCursor();
+ update(MATRIX);
+}
+
+void FrameBase::panCmd(const Vector& vv)
+{
+ Vector uu = mapFromRef(cursor,Coord::CANVAS);
+ uu += vv;
+ cursor = mapToRef(uu,Coord::CANVAS);
+
+ setBinCursor();
+ update(MATRIX);
+}
+
+void FrameBase::panCmd(const Vector& vv, Coord::CoordSystem sys, Coord::SkyFrame sky)
+{
+ if (!currentContext->cfits)
+ return;
+
+ Vector uu = currentContext->cfits->mapFromRef(cursor, sys, sky);
+ uu += vv;
+ cursor = currentContext->cfits->mapToRef(uu, sys, sky);
+
+ setBinCursor();
+ update(MATRIX);
+}
+
+void FrameBase::panToCmd(const Vector& vv)
+{
+ cursor = mapToRef(vv,Coord::CANVAS);
+
+ setBinCursor();
+ update(MATRIX);
+}
+
+void FrameBase::panToCmd(const Vector& vv, Coord::CoordSystem sys, Coord::SkyFrame sky)
+{
+ if (!currentContext->cfits)
+ return;
+
+ cursor = currentContext->cfits->mapToRef(vv, sys, sky);
+
+ setBinCursor();
+ update(MATRIX);
+}
+
+void FrameBase::panBBoxCmd(const Vector& vv)
+{
+ if (!currentContext->cfits)
+ return;
+
+ // we want to round to nearest pixel center
+ Vector rr = vv * currentContext->cfits->pannerToData;
+ cursor = (rr.floor() + Vector(.5,.5)) * currentContext->cfits->dataToRef;
+
+ setBinCursor();
+ update(MATRIX);
+}
+
+void FrameBase::panEndCmd(const Vector& vv)
+{
+ // vv and panCursor are in Coord::CANVAS coords
+ // delete tmp pixmap
+ if (panPM)
+ Tk_FreePixmap(display, panPM);
+ panPM = 0;
+
+ // use matrix, not map() for 3d?
+ Vector start = panCursor * canvasToRef;
+ Vector stop = vv * canvasToRef;
+ cursor -= stop - start;
+
+ setBinCursor();
+ update(MATRIX);
+}
+
+void FrameBase::rotateBeginCmd()
+{
+ // save the current rotation
+ rotateRotation = rotation;
+
+ // Create src XImage
+ if (!(rotateSrcXM = XGetImage(display, pixmap, 0, 0,
+ options->width, options->height,
+ AllPlanes, ZPixmap))) {
+ internalError("Unable to Create Rotate XImage");
+ return;
+ }
+
+ // Create dest XImage
+ if (!(rotateDestXM = XGetImage(display, pixmap, 0, 0,
+ options->width, options->height,
+ AllPlanes, ZPixmap))) {
+ internalError("Unable to Create Rotate XImage");
+ return;
+ }
+
+ // Create dest Pixmap
+ rotatePM = Tk_GetPixmap(display, Tk_WindowId(tkwin),
+ options->width, options->height, depth);
+ if (!rotatePM) {
+ internalError("Unable to Create Rotate Motion Pixmap");
+ return;
+ }
+}
+
+void FrameBase::rotateMotionCmd(double angle)
+{
+ rotation = rotateRotation + angle;
+ rotateMotion();
+}
+
+void FrameBase::rotateEndCmd()
+{
+ // Clean up
+ if (rotateSrcXM)
+ XDestroyImage(rotateSrcXM);
+
+ if (rotateDestXM)
+ XDestroyImage(rotateDestXM);
+
+ if (rotatePM)
+ Tk_FreePixmap(display, rotatePM);
+
+ update(MATRIX);
+}
+
+void FrameBase::saveFitsResampleFileCmd(const char* fn)
+{
+ OutFitsFile str(fn);
+ saveFitsResample(str);
+}
+
+void FrameBase::saveFitsResampleChannelCmd(const char* ch)
+{
+ OutFitsChannel str(interp, ch);
+ saveFitsResample(str);
+}
+
+void FrameBase::saveFitsResampleSocketCmd(int ss)
+{
+ OutFitsSocket str(ss);
+ saveFitsResample(str);
+}
+
+void FrameBase::zoomAboutCmd(const Vector& zz, const Vector& vv)
+{
+ Vector az = ((Vector&)zz).abs();
+ zoom_[0] *= az[0];
+ zoom_[1] *= az[1];
+
+ cursor = mapToRef(vv,Coord::CANVAS);
+
+ setBinCursor();
+ update(MATRIX);
+}
+
+void FrameBase::zoomAboutCmd(const Vector& z, const Vector& vv,
+ Coord::CoordSystem sys, Coord::SkyFrame sky)
+{
+ Vector az = ((Vector&)z).abs();
+ zoom_[0] *= az[0];
+ zoom_[1] *= az[1];
+
+ if (currentContext->cfits) {
+ cursor = currentContext->cfits->mapToRef(vv, sys, sky);
+ setBinCursor();
+ }
+ update(MATRIX);
+}
+
+void FrameBase::zoomToAboutCmd(const Vector& z, const Vector& vv)
+{
+ zoom_ = ((Vector&)z).abs();
+
+ cursor = mapToRef(vv,Coord::CANVAS);
+
+ setBinCursor();
+ update(MATRIX);
+}
+
+void FrameBase::zoomToAboutCmd(const Vector& z, const Vector& vv,
+ Coord::CoordSystem sys, Coord::SkyFrame sky)
+{
+ zoom_ = ((Vector&)z).abs();
+
+ if (currentContext->cfits) {
+ cursor = currentContext->cfits->mapToRef(vv, sys, sky);
+ setBinCursor();
+ }
+ update(MATRIX);
+}
+
+void FrameBase::zoomToFitCmd(double ss)
+{
+ // will center image on center of pixel
+ // with even number pixels, it will be shifted
+
+ if (keyContext->fits) {
+ centerImage();
+
+ Vector tt = imageSize(keyContext->secMode());
+
+ // adjust image size to be odd (see above)
+ double dd; // dummy
+ if (!modf(tt[0]/2,&dd))
+ tt[0] +=1;
+ if (!modf(tt[1]/2,&dd))
+ tt[1] +=1;
+
+ double zz = calcZoom(tt,Vector(options->width,options->height)) * ss;
+ zoom_ = Vector(zz,zz);
+ update(MATRIX);
+ }
+}
+
+
+
+
+
+