Skip to content
Snippets Groups Projects

coord trafo at Frame level, with 1st application to AxesInDifferentUnits

Merged Wuttke, Joachim requested to merge i702f into main
20 files
+ 746
98
Compare changes
  • Side-by-side
  • Inline
Files
20
+ 48
1
@@ -13,16 +13,24 @@
@@ -13,16 +13,24 @@
// ************************************************************************************************
// ************************************************************************************************
#include "Base/Axis/Frame.h"
#include "Base/Axis/Frame.h"
 
#include "Base/Axis/FrameTrafo.h"
#include "Base/Axis/FrameUtil.h"
#include "Base/Axis/FrameUtil.h"
#include "Base/Axis/Scale.h"
#include "Base/Axis/Scale.h"
#include "Base/Util/Assert.h"
#include "Base/Util/Assert.h"
 
#include "Base/Util/StringUtil.h"
Frame::Frame(CloneableVector<const Scale> axes)
Frame::Frame(CloneableVector<const Scale> axes, CloneableVector<const FrameTrafo> trafos)
: m_axes(std::move(axes))
: m_axes(std::move(axes))
 
, m_trafos(std::move(trafos))
, m_size(FrameUtil::product_size(m_axes.reference()))
, m_size(FrameUtil::product_size(m_axes.reference()))
{
{
}
}
 
Frame::Frame(CloneableVector<const Scale> axes)
 
: Frame(axes, {})
 
{
 
}
 
Frame::Frame(const Scale* ax0)
Frame::Frame(const Scale* ax0)
: Frame(std::vector<const Scale*>{ax0})
: Frame(std::vector<const Scale*>{ax0})
{
{
@@ -42,6 +50,26 @@ Frame* Frame::clone() const
@@ -42,6 +50,26 @@ Frame* Frame::clone() const
return new Frame(*this);
return new Frame(*this);
}
}
 
void Frame::setAxes(CloneableVector<const Scale> axes)
 
{
 
std::swap(m_axes, axes);
 
m_size = FrameUtil::product_size(m_axes.reference());
 
}
 
 
void Frame::addTrafo(FrameTrafo* trafo)
 
{
 
m_trafos.emplace_back(trafo);
 
}
 
 
const FrameTrafo& Frame::findTrafo(const std::string& name) const
 
{
 
for (const FrameTrafo* trafo : m_trafos)
 
if (trafo->name == name)
 
return *trafo;
 
throw std::runtime_error("Requested unavailable trafo '" + name
 
+ "' ; available: " + Base::String::join(availableTrafos(), ", "));
 
}
 
size_t Frame::rank() const
size_t Frame::rank() const
{
{
return m_axes.size();
return m_axes.size();
@@ -140,6 +168,25 @@ bool Frame::hasSameSizes(const Frame& o) const
@@ -140,6 +168,25 @@ bool Frame::hasSameSizes(const Frame& o) const
return true;
return true;
}
}
 
std::vector<std::string> Frame::availableTrafos() const
 
{
 
std::vector<std::string> result;
 
for (const FrameTrafo* trafo : m_trafos)
 
result.push_back(trafo->name);
 
return result;
 
}
 
 
Frame* Frame::plottableFrame(const FrameTrafo& trafo) const
 
{
 
ASSERT(trafo.coords.size() == rank());
 
std::vector<const Scale*> outaxes;
 
for (size_t k = 0; k < rank(); ++k) {
 
Scale* s = new Scale(axis(k).plottableScale(trafo.coords[k], trafo.axTrafos[k]));
 
outaxes.emplace_back(s);
 
}
 
return new Frame(std::move(outaxes));
 
}
 
Frame* Frame::plottableFrame(std::vector<std::string> labels) const
Frame* Frame::plottableFrame(std::vector<std::string> labels) const
{
{
ASSERT(labels.size() == rank() || labels.size() == 0);
ASSERT(labels.size() == rank() || labels.size() == 0);
Loading