diff options
Diffstat (limited to 'tksao/frame/composite.C')
-rw-r--r-- | tksao/frame/composite.C | 317 |
1 files changed, 317 insertions, 0 deletions
diff --git a/tksao/frame/composite.C b/tksao/frame/composite.C new file mode 100644 index 0000000..b5e5a6c --- /dev/null +++ b/tksao/frame/composite.C @@ -0,0 +1,317 @@ +// Copyright (C) 1999-2016 +// Smithsonian Astrophysical Observatory, Cambridge, MA, USA +// For conditions of distribution and use, see copyright notice in "copyright" + +#include <tk.h> + +#include "composite.h" +#include "fitsimage.h" + +Composite::Composite(const Composite& a) : Marker(a) +{ + members = a.members; + global = a.global; +} + +Composite::Composite(Base* p, const Vector& ctr, + double ang, int gl, + const char* clr, int* dsh, + int wth, const char* fnt, const char* txt, + unsigned short prop, const char* cmt, + const List<Tag>& tg, const List<CallBack>& cb) + : Marker(p, ctr, ang, clr, dsh, wth, fnt, txt, prop, cmt, tg, cb) +{ + strcpy(type_, "composite"); + + global = gl; + + handle = new Vector[4]; + numHandle = 4; + + updateBBox(); +} + +void Composite::x11(Drawable drawable, Coord::InternalSystem sys, + int tt, RenderMode mode, HandleMode hh) +{ + if (properties & HIDDEN) + return; + + if (hh==HANDLES) + renderXHandles(drawable); + if (tt) + renderXText(drawable, sys, mode); + + Marker* mk=members.head(); + while (mk) { + Marker* m = mk->dup(); + m->setComposite(fwdMatrix(), angle); + if (global) + m->setComposite(colorName, lineWidth, highlited); + m->x11(drawable, sys, tt, mode, hh); + delete m; + mk=mk->next(); + } +} + +void Composite::ps(int mode, int tt) +{ + if (tt) + renderPSText(mode); + + Marker* mk=members.head(); + while (mk) { + Marker* m = mk->dup(); + m->setComposite(fwdMatrix(), angle); + if (global) + m->setComposite(colorName, lineWidth, highlited); + m->ps(mode,tt); + delete m; + mk=mk->next(); + } +} + +#ifdef MAC_OSX_TK +void Composite::macosx(int tt) +{ + if (tt) + renderMACOSXText(); + + Marker* mk=members.head(); + while (mk) { + Marker* m = mk->dup(); + m->setComposite(fwdMatrix(), angle); + if (global) + m->setComposite(colorName, lineWidth, highlited); + m->macosx(tt); + delete m; + mk=mk->next(); + } +} +#endif + +#ifdef __WIN32 +void Composite::win32(int tt) +{ + if (tt) + renderWIN32Text(); + + Marker* mk=members.head(); + while (mk) { + Marker* m = mk->dup(); + m->setComposite(fwdMatrix(), angle); + if (global) + m->setComposite(colorName, lineWidth, highlited); + m->win32(tt); + delete m; + mk=mk->next(); + } +} +#endif + +// Support + +void Composite::updateHandles() +{ + BBox bb(center * bckMatrix()); + Marker* mk=members.head(); + while (mk) { + Marker* m = mk->dup(); + m->setComposite(fwdMatrix(), angle); + for(int ii=0; ii<m->getNumHandle(); ii++) + bb.bound(bckMap(m->getHandle(ii),Coord::CANVAS)); + delete m; + mk=mk->next(); + } + bb.expand(3); // a little more room around the edges + + handle[0] = fwdMap(bb.ll,Coord::CANVAS); + handle[1] = fwdMap(bb.lr(),Coord::CANVAS); + handle[2] = fwdMap(bb.ur,Coord::CANVAS); + handle[3] = fwdMap(bb.ul(),Coord::CANVAS); +} + +void Composite::updateCoords(const Matrix& mx) +{ + Marker* mk=members.head(); + while (mk) { + Vector cc = center; + mk->setComposite(fwdMatrix(), angle); + mk->updateCoords(mx); + center = cc*mx; + mk->setComposite(bckMatrix(), -angle); + center = cc; + mk=mk->next(); + } + + Marker::updateCoords(mx); +} + +int Composite::isIn(const Vector& v) +{ + if (!bbox.isIn(v)) + return 0; + + Marker* mk=members.head(); + while (mk) { + Marker* m = mk->dup(); + m->setComposite(fwdMatrix(), angle); + if (m->isIn(v)) { + delete m; + return 1; + } + delete m; + + mk=mk->next(); + } + + return 0; +} + +void Composite::append(Marker* m) +{ + m->setComposite(bckMatrix(), -angle); + members.append(m); +} + +Marker* Composite::extract() +{ + Marker* mk=members.head(); + if (mk) { + members.extractNext(mk); + mk->setComposite(fwdMatrix(), angle); + } + return mk; +} + +// list + +void Composite::list(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, + Coord::SkyFormat format, int conj, int strip) +{ + if (!strip) { + FitsImage* ptr = parent->findFits(sys,center); + listPre(str, sys, sky, ptr, strip, 1); + + switch (sys) { + case Coord::IMAGE: + case Coord::PHYSICAL: + case Coord::DETECTOR: + case Coord::AMPLIFIER: + { + Vector vv = ptr->mapFromRef(center,sys); + str << type_ << '(' << setprecision(8) << vv<< ',' + << radToDeg(parent->mapAngleFromRef(angle,sys)) << ')'; + } + break; + default: + if (ptr->hasWCSCel(sys)) { + switch (format) { + case Coord::DEGREES: + { + Vector vv = ptr->mapFromRef(center,sys,sky); + str << type_ << '(' << setprecision(8) << vv << ',' + << radToDeg(parent->mapAngleFromRef(angle,sys,sky)) << ')'; + } + break; + case Coord::SEXAGESIMAL: + listRADEC(ptr,center,sys,sky,format); + str << type_ << '(' << ra << ',' << dec << ',' + << radToDeg(parent->mapAngleFromRef(angle,sys,sky)) << ')'; + break; + } + } + else { + Vector vv = ptr->mapFromRef(center,sys); + str << type_ << '(' << setprecision(8) << vv << ',' + << radToDeg(parent->mapAngleFromRef(angle,sys)) << ')'; + } + } + + str << " ||"; + str << " composite=" << global; + listProperties(str, 0); + } + + Marker* mk=members.head(); + while (mk) { + Marker* m = mk->dup(); + mk=mk->next(); + + m->setComposite(fwdMatrix(), angle); + m->list(str, sys, sky, format, (mk?1:0), strip); + delete m; + } +} + +void Composite::listCiao(ostream& str, Coord::CoordSystem sys, int strip) +{ + Marker* mk=members.head(); + while (mk) { + Marker* m = mk->dup(); + mk=mk->next(); + + m->setComposite(fwdMatrix(), angle); + m->listCiao(str, sys, strip); + delete m; + } +} + +void Composite::listPros(ostream& str, Coord::CoordSystem sys, + Coord::SkyFrame sky, Coord::SkyFormat format, + int strip) +{ + Marker* mk=members.head(); + while (mk) { + Marker* m = mk->dup(); + m->setComposite(fwdMatrix(), angle); + m->listPros(str, sys, sky, format, strip); + delete m; + + mk=mk->next(); + } +} + +void Composite::listSAOtng(ostream& str, Coord::CoordSystem sys, + Coord::SkyFrame sky, Coord::SkyFormat format, + int strip) +{ + Marker* mk=members.head(); + while (mk) { + Marker* m = mk->dup(); + m->setComposite(fwdMatrix(), angle); + m->listSAOtng(str, sys, sky, format, strip); + delete m; + + mk=mk->next(); + } +} + +void Composite::listSAOimage(ostream& str, int strip) +{ + Marker* mk=members.head(); + while (mk) { + Marker* m = mk->dup(); + m->setComposite(fwdMatrix(), angle); + m->listSAOimage(str, strip); + delete m; + + mk=mk->next(); + } +} + +void Composite::listXY(ostream& str, Coord::CoordSystem sys, + Coord::SkyFrame sky, Coord::SkyFormat format, + int strip) +{ + Marker* mk=members.head(); + while (mk) { + Marker* m = mk->dup(); + m->setComposite(fwdMatrix(), angle); + m->listXY(str, sys, sky, format, strip); + delete m; + + mk=mk->next(); + } +} + |