461 changes: 461 additions & 0 deletions src/datasources/bis/bisdatasource.cpp

Large diffs are not rendered by default.

116 changes: 116 additions & 0 deletions src/datasources/bis/bisdatasource.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
/***************************************************************************
* *
* copyright : (C) 2007 The University of Toronto *
* netterfield@astro.utoronto.ca *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/


#ifndef BISSOURCE_H
#define BISSOURCE_H

#include <datasource.h>
#include <dataplugin.h>

#include "bis.h"

class DataInterfaceBISMatrix;

class BISSource : public Kst::DataSource {
Q_OBJECT

public:
BISSource(Kst::ObjectStore *store, QSettings *cfg, const QString& filename, const QString& type, const QDomElement& e);

~BISSource();

friend class DataInterfaceBISMatrix;

bool init();
virtual void reset();

Kst::Object::UpdateType internalDataSourceUpdate();


QString fileType() const;

void save(QXmlStreamWriter &streamWriter);

class Config;

virtual bool hasImageStream() { return true;}

private:
mutable Config *_config;

DataInterfaceBISMatrix* im;

QHash<QString, int> _matrixHash;

BISfile *_bisfile;

int _nframes;

BISimage _bisImage;
};


class BISSourcePlugin : public QObject, public Kst::DataSourcePluginInterface {
Q_OBJECT
Q_INTERFACES(Kst::DataSourcePluginInterface)
Q_PLUGIN_METADATA(IID "com.kst.DataSourcePluginInterface/2.0")
public:
virtual ~BISSourcePlugin() {}

virtual QString pluginName() const;
virtual QString pluginDescription() const;

virtual bool hasConfigWidget() const { return false; }

virtual Kst::DataSource *create(Kst::ObjectStore *store,
QSettings *cfg,
const QString &filename,
const QString &type,
const QDomElement &element) const;

virtual QStringList matrixList(QSettings *cfg,
const QString& filename,
const QString& type,
QString *typeSuggestion,
bool *complete) const;

virtual QStringList fieldList(QSettings *cfg,
const QString& filename,
const QString& type,
QString *typeSuggestion,
bool *complete) const;

virtual QStringList scalarList(QSettings *cfg,
const QString& filename,
const QString& type,
QString *typeSuggestion,
bool *complete) const;

virtual QStringList stringList(QSettings *cfg,
const QString& filename,
const QString& type,
QString *typeSuggestion,
bool *complete) const;

virtual int understands(QSettings *cfg, const QString& filename) const;

virtual bool supportsTime(QSettings *cfg, const QString& filename) const;

virtual QStringList provides() const;

virtual Kst::DataSourceConfigWidget *configWidget(QSettings *cfg, const QString& filename) const;
};


#endif
// vim: ts=2 sw=2 et
12 changes: 12 additions & 0 deletions src/datasources/bis/bisdatasource.pro
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
TOPOUT_REL=../../..
include($$PWD/$$TOPOUT_REL/kst.pri)
include($$PWD/../../../datasourceplugin.pri)

TARGET = $$kstlib(kst2data_sampledatasource)
INCLUDEPATH += $$OUTPUT_DIR/src/datasources/sampledatasource/tmp

SOURCES += \
sampledatasource.cpp

HEADERS += \
sampledatasource.h
8 changes: 8 additions & 0 deletions src/datasources/bis/kstdata_bissource.desktop
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
[Desktop Entry]
Type=Service
ServiceTypes=Kst Data Source
X-KDE-ModuleType=Plugin
X-KDE-Library=bissource
X-Kst-Plugin-Author=C. Barth Netterfield
Name=Bit Image Stream Reader
Comment[x-test]=xxBIT Image Stream Reader.xx
45 changes: 45 additions & 0 deletions src/datasources/bis/moc_bisdatasource.cxx_parameters
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
-I/usr/include/qt4
-I/usr/include/qt4/QtGui
-I/usr/include/qt4/QtCore
-I/home/cbn/programs/kst
-I/usr/include/qt4/QtDesigner
-I/usr/include/qt4/QtDeclarative
-I/usr/include/qt4/QtScriptTools
-I/usr/include/qt4/QtDBus
-I/usr/include/qt4/QtDesigner
-I/usr/include/qt4/QtXml
-I/usr/include/qt4/QtSql
-I/usr/include/qt4/QtOpenGL
-I/usr/include/qt4/QtNetwork
-I/usr/include/qt4/phonon
-I/usr/include/qt4/QtXmlPatterns
-I/usr/include/qt4/QtWebKit
-I/usr/include/qt4/QtHelp
-I/usr/include/qt4/QtUiTools
-I/usr/include/qt4/QtTest
-I/usr/include/qt4/QtScript
-I/usr/include/qt4/QtSvg
-I/usr/include/qt4/Qt3Support
-I/usr/include/qt4/QtGui
-I/usr/include/qt4/QtCore
-I/usr/share/qt4/mkspecs/default
-I/usr/include/qt4
-I/usr/include/qt4/QtCore
-I/home/cbn/programs/kst/src/datasources
-I/home/cbn/programs/kst/cmake/src/datasources
-I/home/cbn/programs/kst/src/libkst
-I/home/cbn/programs/kst/src/libkst
-I/home/cbn/programs/kst/src/libkstmath
-I/home/cbn/programs/kst/src/libkstmath
-I/home/cbn/programs/kst/src/widgets
-I/home/cbn/programs/kst/src/widgets
-I/usr/local/include
-I/usr/local/include/..
-DKST_HAVE_REVISION_H
-DQT_GUI_LIB
-DQT_CORE_LIB
-DKST_USE_KST_ATOF
-nw
-o
/home/cbn/programs/kst/src/datasources/bis/moc_bisdatasource.cxx
/home/cbn/programs/kst/src/datasources/bis/bisdatasource.h
2 changes: 2 additions & 0 deletions src/datasources/bis/test.bis
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
BS

9 changes: 5 additions & 4 deletions src/datasources/dirfilesource/dirfilesource.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ class DataInterfaceDirFileScalar : public DataSource::DataInterface<DataScalar>
bool isValid(const QString& field) const { return dir._scalarList.contains( field ); }

// T specific: not used for scalars
const DataScalar::DataInfo dataInfo(const QString&) const { return DataScalar::DataInfo(); }
const DataScalar::DataInfo dataInfo(const QString&, int frame = 0) const { Q_UNUSED(frame) return DataScalar::DataInfo(); }
void setDataInfo(const QString&, const DataScalar::DataInfo&) {}

// meta data
Expand Down Expand Up @@ -96,7 +96,7 @@ class DataInterfaceDirFileString : public DataSource::DataInterface<DataString>
bool isValid(const QString& field) const { return dir._stringList.contains( field ); }

// T specific: not used for Strings
const DataString::DataInfo dataInfo(const QString&) const { return DataString::DataInfo(); }
const DataString::DataInfo dataInfo(const QString&, int frame=0) const { Q_UNUSED(frame) return DataString::DataInfo(); }
void setDataInfo(const QString&, const DataString::DataInfo&) {}

// meta data
Expand Down Expand Up @@ -131,7 +131,7 @@ class DataInterfaceDirFileVector : public DataSource::DataInterface<DataVector>
bool isValid(const QString& field) const { return dir._fieldList.contains( field ); }

// T specific
const DataVector::DataInfo dataInfo(const QString&) const;
const DataVector::DataInfo dataInfo(const QString&, int frame = 0) const;
void setDataInfo(const QString&, const DataVector::DataInfo&) {}

// meta data
Expand All @@ -144,8 +144,9 @@ class DataInterfaceDirFileVector : public DataSource::DataInterface<DataVector>



const DataVector::DataInfo DataInterfaceDirFileVector::dataInfo(const QString &field) const
const DataVector::DataInfo DataInterfaceDirFileVector::dataInfo(const QString &field, int frame) const
{
Q_UNUSED(frame)
if (!dir._fieldList.contains(field))
return DataVector::DataInfo();

Expand Down
10 changes: 5 additions & 5 deletions src/datasources/fitsimage/fitsimage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ class DataInterfaceFitsImageString : public DataSource::DataInterface<DataString
bool isValid(const QString&) const;

// T specific
const DataString::DataInfo dataInfo(const QString&) const { return DataString::DataInfo(); }
const DataString::DataInfo dataInfo(const QString&, int frame=0) const { Q_UNUSED(frame) return DataString::DataInfo(); }
void setDataInfo(const QString&, const DataString::DataInfo&) {}

// meta data
Expand Down Expand Up @@ -117,7 +117,7 @@ class DataInterfaceFitsImageMatrix : public DataSource::DataInterface<DataMatrix
bool isValid(const QString&) const;

// T specific
const DataMatrix::DataInfo dataInfo(const QString&) const;
const DataMatrix::DataInfo dataInfo(const QString&, int frame=0) const;
void setDataInfo(const QString&, const DataMatrix::DataInfo&) {}

// meta data
Expand Down Expand Up @@ -168,8 +168,9 @@ void DataInterfaceFitsImageMatrix::init()
}
}

const DataMatrix::DataInfo DataInterfaceFitsImageMatrix::dataInfo(const QString& matrix) const
const DataMatrix::DataInfo DataInterfaceFitsImageMatrix::dataInfo(const QString& matrix, int frame) const
{
Q_UNUSED(frame)
long n_axes[3];
int status = 0;
int type;
Expand All @@ -187,7 +188,6 @@ const DataMatrix::DataInfo DataInterfaceFitsImageMatrix::dataInfo(const QString&
}

DataMatrix::DataInfo info;
info.samplesPerFrame = 1;
info.xSize = n_axes[0];
info.ySize = n_axes[1];

Expand Down Expand Up @@ -456,7 +456,7 @@ Kst::Object::UpdateType FitsImageSource::internalDataSourceUpdate() {


bool FitsImageSource::isEmpty() const {
return im->dataInfo(DefaultMatrixName).xSize < 1;
return im->dataInfo(DefaultMatrixName,0).xSize < 1;
}


Expand Down
1 change: 0 additions & 1 deletion src/datasources/matlab/matlab.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -272,7 +272,6 @@ const DataMatrix::DataInfo DataInterfaceMatlabMatrix::dataInfo(const QString& ma
}

DataMatrix::DataInfo info;
info.samplesPerFrame = 1;
info.xSize = matvar->dims[0];
info.ySize = matvar->dims[1];

Expand Down
15 changes: 8 additions & 7 deletions src/datasources/netcdf/netcdfsource.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ class DataInterfaceNetCdfScalar : public DataSource::DataInterface<DataScalar>
bool isValid(const QString&) const;

// T specific
const DataScalar::DataInfo dataInfo(const QString&) const { return DataScalar::DataInfo(); }
const DataScalar::DataInfo dataInfo(const QString&, int frame = 0) const { Q_UNUSED(frame) return DataScalar::DataInfo(); }
void setDataInfo(const QString&, const DataScalar::DataInfo&) {}

// meta data
Expand Down Expand Up @@ -97,7 +97,7 @@ class DataInterfaceNetCdfString : public DataSource::DataInterface<DataString>
bool isValid(const QString&) const;

// T specific
const DataString::DataInfo dataInfo(const QString&) const { return DataString::DataInfo(); }
const DataString::DataInfo dataInfo(const QString&, int frame=0) const { Q_UNUSED(frame) return DataString::DataInfo(); }
void setDataInfo(const QString&, const DataString::DataInfo&) {}

// meta data
Expand Down Expand Up @@ -149,7 +149,7 @@ class DataInterfaceNetCdfVector : public DataSource::DataInterface<DataVector>
bool isValid(const QString&) const;

// T specific
const DataVector::DataInfo dataInfo(const QString&) const;
const DataVector::DataInfo dataInfo(const QString&, int frame=0) const;
void setDataInfo(const QString&, const DataVector::DataInfo&) {}

// meta data
Expand All @@ -162,8 +162,9 @@ class DataInterfaceNetCdfVector : public DataSource::DataInterface<DataVector>
};


const DataVector::DataInfo DataInterfaceNetCdfVector::dataInfo(const QString &field) const
const DataVector::DataInfo DataInterfaceNetCdfVector::dataInfo(const QString &field, int frame) const
{
Q_UNUSED(frame)
if (!netcdf._fieldList.contains(field))
return DataVector::DataInfo();

Expand Down Expand Up @@ -249,7 +250,7 @@ class DataInterfaceNetCdfMatrix : public DataSource::DataInterface<DataMatrix>
bool isValid(const QString&) const;

// T specific
const DataMatrix::DataInfo dataInfo (const QString&) const;
const DataMatrix::DataInfo dataInfo (const QString&, int frame) const;
void setDataInfo(const QString&, const DataMatrix::DataInfo&) {}

// meta data
Expand All @@ -262,8 +263,9 @@ class DataInterfaceNetCdfMatrix : public DataSource::DataInterface<DataMatrix>
};


const DataMatrix::DataInfo DataInterfaceNetCdfMatrix::dataInfo(const QString& matrix) const
const DataMatrix::DataInfo DataInterfaceNetCdfMatrix::dataInfo(const QString& matrix, int frame) const
{
Q_UNUSED(frame)
if (!netcdf._matrixList.contains( matrix ) ) {
return DataMatrix::DataInfo();
}
Expand All @@ -279,7 +281,6 @@ const DataMatrix::DataInfo DataInterfaceNetCdfMatrix::dataInfo(const QString& ma
}

DataMatrix::DataInfo info;
info.samplesPerFrame = 1;
// TODO is this right?
info.xSize = var->get_dim(0)->size();
info.ySize = var->get_dim(1)->size();
Expand Down
11 changes: 6 additions & 5 deletions src/datasources/qimagesource/qimagesource.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ class DataInterfaceQImageVector : public DataSource::DataInterface<DataVector>
bool isValid(const QString&) const;

// T specific
const DataVector::DataInfo dataInfo(const QString&) const;
const DataVector::DataInfo dataInfo(const QString&, int frame=0) const;
void setDataInfo(const QString&, const DataVector::DataInfo&) {}

// meta data
Expand Down Expand Up @@ -97,8 +97,9 @@ void DataInterfaceQImageVector::init()
}


const DataVector::DataInfo DataInterfaceQImageVector::dataInfo(const QString &field) const
const DataVector::DataInfo DataInterfaceQImageVector::dataInfo(const QString &field, int frame) const
{
Q_UNUSED(frame)
if (!_vectorList.contains(field))
return DataVector::DataInfo();

Expand Down Expand Up @@ -179,7 +180,7 @@ class DataInterfaceQImageMatrix : public DataSource::DataInterface<DataMatrix>
bool isValid(const QString&) const;

// T specific
const DataMatrix::DataInfo dataInfo(const QString&) const;
const DataMatrix::DataInfo dataInfo(const QString&, int frame=0) const;
void setDataInfo(const QString&, const DataMatrix::DataInfo&) {}

// meta data
Expand Down Expand Up @@ -210,14 +211,14 @@ void DataInterfaceQImageMatrix::init()



const DataMatrix::DataInfo DataInterfaceQImageMatrix::dataInfo(const QString& matrix) const
const DataMatrix::DataInfo DataInterfaceQImageMatrix::dataInfo(const QString& matrix, int frame) const
{
Q_UNUSED(frame)
if ( !_image || _image->isNull() || !_matrixList.contains( matrix ) ) {
return DataMatrix::DataInfo();
}

DataMatrix::DataInfo info;
info.samplesPerFrame = 1;
info.xSize = _image->width();
info.ySize = _image->height();

Expand Down
5 changes: 3 additions & 2 deletions src/datasources/sourcelist/sourcelist.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ class DataInterfaceSourceListVector : public DataSource::DataInterface<DataVecto
bool isValid(const QString& field) const { return sourcelist._fieldList.contains( field ); }

// T specific
const DataVector::DataInfo dataInfo(const QString&) const;
const DataVector::DataInfo dataInfo(const QString&, int frame = 0) const;
void setDataInfo(const QString&, const DataVector::DataInfo&) {}

// meta data
Expand All @@ -58,8 +58,9 @@ class DataInterfaceSourceListVector : public DataSource::DataInterface<DataVecto
};


const DataVector::DataInfo DataInterfaceSourceListVector::dataInfo(const QString &field) const
const DataVector::DataInfo DataInterfaceSourceListVector::dataInfo(const QString &field, int frame) const
{
Q_UNUSED(frame)
if (!sourcelist._fieldList.contains(field))
return DataVector::DataInfo();

Expand Down
80 changes: 47 additions & 33 deletions src/libkst/datamatrix.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,11 +38,11 @@ const QString DataMatrix::staticTypeTag = "datamatrix";


DataMatrix::DataInfo::DataInfo() :
samplesPerFrame(-1),
xSize(-1),
ySize(-1),
invertXHint(false),
invertYHint(false)
invertYHint(false),
frameCount(-1)
{
}

Expand Down Expand Up @@ -73,6 +73,7 @@ void DataMatrix::save(QXmlStreamWriter &xml) {
xml.writeAttribute("doave", QVariant(_doAve).toString());
xml.writeAttribute("doskip", QVariant(_doSkip).toString());
xml.writeAttribute("skip", QString::number(_skip));
xml.writeAttribute("frame", QString::number(_frame));
xml.writeAttribute("xmin", QString::number(minX()));
xml.writeAttribute("ymin", QString::number(minY()));
xml.writeAttribute("xstep", QString::number(xStepSize()));
Expand All @@ -94,21 +95,23 @@ ScriptInterface* DataMatrix::createScriptInterface() {
void DataMatrix::change(DataSourcePtr file, const QString &field,
int xStart, int yStart,
int xNumSteps, int yNumSteps,
bool doAve, bool doSkip, int skip, double minX, double minY,
bool doAve, bool doSkip, int skip, int frame,
double minX, double minY,
double stepX, double stepY) {
KstWriteLocker l(this);

commonConstructor(file, field, xStart, yStart, xNumSteps, yNumSteps, doAve, doSkip, skip, minX, minY, stepX, stepY);
commonConstructor(file, field, xStart, yStart, xNumSteps, yNumSteps, doAve, doSkip, skip, frame, minX, minY, stepX, stepY);
}


void DataMatrix::changeFrames(int xStart, int yStart,
int xNumSteps, int yNumSteps,
bool doAve, bool doSkip, int skip, double minX, double minY,
bool doAve, bool doSkip, int skip, int frame,
double minX, double minY,
double stepX, double stepY) {
KstWriteLocker l(this);

commonConstructor(dataSource(), _field, xStart, yStart, xNumSteps, yNumSteps, doAve, doSkip, skip, minX, minY, stepX, stepY);
commonConstructor(dataSource(), _field, xStart, yStart, xNumSteps, yNumSteps, doAve, doSkip, skip, frame, minX, minY, stepX, stepY);
}


Expand Down Expand Up @@ -208,7 +211,7 @@ bool DataMatrix::checkValidity(const DataSourcePtr& ds) const {
}


void DataMatrix::doUpdateSkip(int realXStart, int realYStart) {
void DataMatrix::doUpdateSkip(int realXStart, int realYStart, int frame) {

// since we are skipping, we don't need all the pixels
// also, samples per frame is always 1 with skipping
Expand All @@ -233,7 +236,7 @@ void DataMatrix::doUpdateSkip(int realXStart, int realYStart) {
// try to use the datasource's read with skip function - it will automatically
// enlarge each pixel to correct for the skipping
matData.z=_z;
_NS = readMatrix(&matData, _field, realXStart, realYStart, _nX, _nY, _skip);
_NS = readMatrix(&matData, _field, realXStart, realYStart, _nX, _nY, _skip, frame);

// -9999 means the skipping function is not supported by datasource
if (_NS != -9999) {
Expand All @@ -248,8 +251,8 @@ void DataMatrix::doUpdateSkip(int realXStart, int realYStart) {
// the skipping function is not supported by datasource; we need to manually skip
if (_doAve) {
// boxcar filtering is not supported by datasources currently; need to manually average
if (_aveReadBufferSize < _samplesPerFrameCache*_skip*_samplesPerFrameCache*_skip) {
_aveReadBufferSize = _samplesPerFrameCache*_skip*_samplesPerFrameCache*_skip;
if (_aveReadBufferSize < _skip*_skip) {
_aveReadBufferSize = _skip*_skip;
if (!kstrealloc(_aveReadBuffer, _aveReadBufferSize*sizeof(double))) {
qCritical() << "Matrix resize failed";
}
Expand All @@ -260,11 +263,10 @@ void DataMatrix::doUpdateSkip(int realXStart, int realYStart) {
double* zPos = _z;
for (int i = 0; i < _nX; i++) {
for (int j = 0; j < _nY; j++) {
// read one buffer size in
readMatrix(&matData, _field, realXStart + _skip*i, realYStart + _skip*j, _skip, _skip, -1);
readMatrix(&matData, _field, realXStart + _skip*i, realYStart + _skip*j, _skip, _skip, -1, frame);
// take average of the buffer
double bufferAverage = 0;
for (int k = 0; k < _samplesPerFrameCache*_skip*_samplesPerFrameCache*_skip; k++) {
for (int k = 0; k < _skip*_skip; k++) {
bufferAverage += _aveReadBuffer[k];
}
bufferAverage = bufferAverage / _aveReadBufferSize;
Expand All @@ -275,8 +277,8 @@ void DataMatrix::doUpdateSkip(int realXStart, int realYStart) {
if (first) {
_minX = matData.xMin;
_minY = matData.yMin;
_stepX = matData.xStepSize * _skip * _samplesPerFrameCache;
_stepY = matData.yStepSize * _skip * _samplesPerFrameCache;
_stepX = matData.xStepSize * _skip;
_stepY = matData.yStepSize * _skip;
first = false;
}
}
Expand All @@ -288,14 +290,14 @@ void DataMatrix::doUpdateSkip(int realXStart, int realYStart) {
for (int i = 0; i < _nX; i++) {
for (int j = 0; j < _nY; j++) {
// read one sample
int samples = readMatrix(&matData, _field, realXStart + _skip*i, realYStart + _skip*j, -1, -1, -1);
int samples = readMatrix(&matData, _field, realXStart + _skip*i, realYStart + _skip*j, -1, -1, -1, frame);
matData.z += samples;
_NS += samples;
if (first) {
_minX = matData.xMin;
_minY = matData.yMin;
_stepX = matData.xStepSize * _skip * _samplesPerFrameCache;
_stepY = matData.yStepSize * _skip * _samplesPerFrameCache;
_stepX = matData.xStepSize * _skip;
_stepY = matData.yStepSize * _skip;
first = false;
}
}
Expand All @@ -304,10 +306,10 @@ void DataMatrix::doUpdateSkip(int realXStart, int realYStart) {
}


void DataMatrix::doUpdateNoSkip(int realXStart, int realYStart) {
void DataMatrix::doUpdateNoSkip(int realXStart, int realYStart, int frame) {

// resize _z if necessary
int requiredSize = _nX*_nY*_samplesPerFrameCache*_samplesPerFrameCache;
int requiredSize = _nX*_nY;
if (requiredSize != _zSize) {
bool resizeOK = resizeZ(requiredSize);
if (!resizeOK) {
Expand All @@ -320,7 +322,7 @@ void DataMatrix::doUpdateNoSkip(int realXStart, int realYStart) {
MatrixData matData;
matData.z=_z;

_NS = readMatrix(&matData, _field, realXStart, realYStart, _nX, _nY, -1);
_NS = readMatrix(&matData, _field, realXStart, realYStart, _nX, _nY, -1, frame);

// set the recommended translate and scaling
_minX = matData.xMin;
Expand Down Expand Up @@ -451,17 +453,25 @@ void DataMatrix::internalUpdate() {
}

// see if we can turn off skipping (only check if skipping enabled)
if (_doSkip && _samplesPerFrameCache == 1 && _skip < 2) {
if (_doSkip && _skip < 2) {
_doSkip = false;
}

// first get the real start and end range
int realXStart;
int realYStart;

const DataInfo info = dataSource()->matrix().dataInfo(_field);
const DataInfo info = dataSource()->matrix().dataInfo(_field, _frame);
int xSize = info.xSize;
int ySize = info.ySize;
int fc = info.frameCount;
int frame;

if (_frame<0) {
frame = fc;
} else {
frame = _frame;
}

_invertXHint = info.invertXHint;
_invertYHint = info.invertYHint;
Expand Down Expand Up @@ -519,9 +529,9 @@ void DataMatrix::internalUpdate() {

// do the reading; skip or non-skip version
if (_doSkip) {
doUpdateSkip(realXStart, realYStart);
doUpdateSkip(realXStart, realYStart, frame);
} else {
doUpdateNoSkip(realXStart, realYStart);
doUpdateNoSkip(realXStart, realYStart, frame);
}

// remember these as the last updated range
Expand Down Expand Up @@ -556,7 +566,7 @@ PrimitivePtr DataMatrix::makeDuplicate() const {
DataMatrixPtr matrix = store()->createObject<DataMatrix>();

matrix->writeLock();
matrix->change(dataSource(), _field, _reqXStart, _reqYStart, _reqNX, _reqNY, _doAve, _doSkip, _skip, _minX, _minY, _stepX, _stepY);
matrix->change(dataSource(), _field, _reqXStart, _reqYStart, _reqNX, _reqNY, _doAve, _doSkip, _skip, _frame, _minX, _minY, _stepX, _stepY);
if (descriptiveNameIsManual()) {
matrix->setDescriptiveName(descriptiveName());
}
Expand All @@ -569,7 +579,7 @@ PrimitivePtr DataMatrix::makeDuplicate() const {

void DataMatrix::commonConstructor(DataSourcePtr in_file, const QString &field,
int reqXStart, int reqYStart, int reqNX, int reqNY,
bool doAve, bool doSkip, int skip, double minX, double minY,
bool doAve, bool doSkip, int skip, int frame, double minX, double minY,
double stepX, double stepY) {
_reqXStart = reqXStart;
_reqYStart = reqYStart;
Expand All @@ -580,6 +590,7 @@ void DataMatrix::commonConstructor(DataSourcePtr in_file, const QString &field,
_doAve = doAve;
_doSkip = doSkip;
_skip = skip;
_frame = frame;
_minX = minX;
_minY = minY;
_stepX = stepX;
Expand All @@ -593,8 +604,7 @@ void DataMatrix::commonConstructor(DataSourcePtr in_file, const QString &field,
if (!dataSource()) {
Debug::self()->log(tr("Data file for matrix %1 was not opened.").arg(Name()), Debug::Warning);
} else {
const DataInfo info = dataSource()->matrix().dataInfo(_field);
_samplesPerFrameCache = info.samplesPerFrame;
const DataInfo info = dataSource()->matrix().dataInfo(_field, _frame);
_invertXHint = info.invertXHint;
_invertYHint = info.invertYHint;
}
Expand All @@ -618,8 +628,7 @@ void DataMatrix::reset() { // must be called with a lock
Q_ASSERT(myLockStatus() == KstRWLock::WRITELOCKED);

if (dataSource()) {
const DataInfo info = dataSource()->matrix().dataInfo(_field);
_samplesPerFrameCache = info.samplesPerFrame;
const DataInfo info = dataSource()->matrix().dataInfo(_field, _frame);
_invertXHint = info.invertXHint;
_invertYHint = info.invertYHint;
}
Expand All @@ -646,6 +655,11 @@ int DataMatrix::skip() const {
}


bool DataMatrix::hasStream() {
return dataSource()->hasImageStream();
}


void DataMatrix::changeFile(DataSourcePtr in_file) {
Q_ASSERT(myLockStatus() == KstRWLock::WRITELOCKED);

Expand Down Expand Up @@ -690,9 +704,9 @@ QString DataMatrix::propertyString() const {
}


int DataMatrix::readMatrix(MatrixData* data, const QString& matrix, int xStart, int yStart, int xNumSteps, int yNumSteps, int skip)
int DataMatrix::readMatrix(MatrixData* data, const QString& matrix, int xStart, int yStart, int xNumSteps, int yNumSteps, int skip, int frame)
{
ReadInfo p = { data, xStart, yStart, xNumSteps, yNumSteps, skip};
ReadInfo p = { data, xStart, yStart, xNumSteps, yNumSteps, skip, frame};
return dataSource()->matrix().read(matrix, p);
}

Expand Down
30 changes: 18 additions & 12 deletions src/libkst/datamatrix.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,10 @@ class KSTCORE_EXPORT DataMatrix : public Matrix, public DataPrimitive
public:

/** Read the specified sub-range of the matrix, flat-packed in z in row-major order
xStart - starting x *frame*
yStart - starting y *frame*
xNumSteps - number of *frames* to read in x direction; -1 to read 1 *sample* from xStart
yNumSteps - number of *frames* to read in y direction; -1 to read 1 *sample* from yStart
xStart - starting x column
yStart - starting y row
xNumSteps - number of columns to read in x direction;
yNumSteps - number of rows to read in y direction;
Will skip according to the parameter, but it may not be implemented. If return value is -9999,
use the non-skip version instead.
The suggested scaling and translation is returned in xMin, yMin, xStepSize, and yStepSize
Expand All @@ -53,18 +53,19 @@ class KSTCORE_EXPORT DataMatrix : public Matrix, public DataPrimitive
int xNumSteps;
int yNumSteps;
int skip;
int frame; // only used for image streams
};


struct KSTCORE_EXPORT DataInfo
{
DataInfo();

int samplesPerFrame;
int xSize;
int ySize;
bool invertXHint;
bool invertYHint;
int frameCount; // only used for image streams
};


Expand All @@ -79,11 +80,11 @@ class KSTCORE_EXPORT DataMatrix : public Matrix, public DataPrimitive
void change(DataSourcePtr file, const QString &field,
int xStart, int yStart,
int xNumSteps, int yNumSteps,
bool doAve, bool doSkip, int skip,
bool doAve, bool doSkip, int skip, int frame,
double minX, double minY, double stepX, double stepY);
void changeFrames(int xStart, int yStart,
int xNumSteps, int yNumSteps,
bool doAve, bool doSkip, int skip,
bool doAve, bool doSkip, int skip, int frame,
double minX, double minY, double stepX, double stepY);

// return properties of DataMatrix
Expand All @@ -101,6 +102,11 @@ class KSTCORE_EXPORT DataMatrix : public Matrix, public DataPrimitive
bool doAverage() const;
int skip() const;

// for image streams
int frame() const {return _frame;}
void setFrame(int f) {_frame = f;}
bool hasStream();

// labels for this matrix
virtual QString label() const;

Expand Down Expand Up @@ -142,11 +148,11 @@ class KSTCORE_EXPORT DataMatrix : public Matrix, public DataPrimitive
private:
void commonConstructor(DataSourcePtr file, const QString &field,
int reqXStart, int reqYStart, int reqNX, int reqNY,
bool doAve, bool doSkip, int skip,
bool doAve, bool doSkip, int skip, int frame,
double minX, double minY, double stepX, double stepY);

void doUpdateSkip(int realXStart, int realYStart);
void doUpdateNoSkip(int realXStart, int realYStart);
void doUpdateSkip(int realXStart, int realYStart, int frame);
void doUpdateNoSkip(int realXStart, int realYStart, int frame);

virtual void _resetFieldScalars();
virtual void _resetFieldStrings();
Expand All @@ -169,9 +175,9 @@ class KSTCORE_EXPORT DataMatrix : public Matrix, public DataPrimitive
bool _doAve : 1;
bool _doSkip : 1;
int _skip;
int _samplesPerFrameCache; // cache the samples per frame of the field in datasource
int _frame;

int readMatrix(MatrixData* data, const QString& matrix, int xStart, int yStart, int xNumSteps, int yNumSteps, int skip);
int readMatrix(MatrixData* data, const QString& matrix, int xStart, int yStart, int xNumSteps, int yNumSteps, int skip, int frame);

QHash<QString, ScalarPtr> _fieldScalars;
QHash<QString, StringPtr> _fieldStrings;
Expand Down
13 changes: 13 additions & 0 deletions src/libkst/dataprimitive.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,13 +71,26 @@ class KSTCORE_EXPORT DataPrimitive

virtual bool checkValidity(const DataSourcePtr& ds) const = 0;

/** Return field used for generalized lookup */
QString startUnits() {return _startUnits;}
void setStartUnits(const QString &field) {_startUnits = field;}
QString rangeUnits() {return _rangeUnits;}
void setRangeUnits(const QString &field) {_rangeUnits = field;}


protected:
DataPrimitive(Primitive* primitive);

private:
DataPrimitive();
struct Private;
Private& d;

/** generalized index field - empty if we are using frames. */
QString _startUnits;
QString _rangeUnits;


};

}
Expand Down
2 changes: 1 addition & 1 deletion src/libkst/datasource.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ struct NotSupportedImp : public DataSource::DataInterface<T>
bool isValid(const QString&) const { return false; }

// T specific
const typename T::DataInfo dataInfo(const QString&) const { return typename T::DataInfo(); }
const typename T::DataInfo dataInfo(const QString&, int frame=0) const { Q_UNUSED(frame) return typename T::DataInfo(); }
void setDataInfo(const QString&, const typename T::DataInfo&) {}

// meta data
Expand Down
8 changes: 5 additions & 3 deletions src/libkst/datasource.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ class KSTCORE_EXPORT DataSource : public Object
virtual bool isValid(const QString& name) const = 0;

// T specific
virtual const typename T::DataInfo dataInfo(const QString& name) const = 0;
virtual const typename T::DataInfo dataInfo(const QString& name, int frame=0) const = 0;
virtual void setDataInfo(const QString& name, const typename T::DataInfo&) = 0;

// meta data
Expand Down Expand Up @@ -187,8 +187,6 @@ class KSTCORE_EXPORT DataSource : public Object
/************************************************************/
/* File/data specific */
/************************************************************/


virtual bool isValid() const; // generally you don't need to change this

virtual QString fileName() const;
Expand All @@ -197,6 +195,10 @@ class KSTCORE_EXPORT DataSource : public Object

QMap<QString, QString> fileMetas() const;

/** return true if the data source contains an indexable list of
* matrices */
virtual bool hasImageStream() { return false;}

/** Returns the file type or an error message in a static string
The string is stored in a separate static variable, so changes
to this are ignored. It is updated each time the fn is called */
Expand Down
10 changes: 0 additions & 10 deletions src/libkst/datavector.h
Original file line number Diff line number Diff line change
Expand Up @@ -96,12 +96,6 @@ class KSTCORE_EXPORT DataVector : public Vector, public DataPrimitive
bool doAve() const;
int skip() const;

/** Return field used for generalized lookup */
QString startUnits() {return _startUnits;}
void setStartUnits(const QString &field) {_startUnits = field;}
QString rangeUnits() {return _rangeUnits;}
void setRangeUnits(const QString &field) {_rangeUnits = field;}

/** Reload the contents of the vector */
void reload(); //si

Expand Down Expand Up @@ -182,10 +176,6 @@ class KSTCORE_EXPORT DataVector : public Vector, public DataPrimitive
/** Requested Starting Frame */
int ReqF0;

/** generalized index field - empty if we are using frames. */
QString _startUnits;
QString _rangeUnits;

/** Number of Samples allocated to the vector */
int _numSamples;

Expand Down
4 changes: 3 additions & 1 deletion src/libkst/matrixfactory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,7 @@ PrimitivePtr DataMatrixFactory::generatePrimitive(ObjectStore *store, QXmlStream
bool doAve=false, doSkip=false;
int requestedXStart=0, requestedYStart=0, requestedXCount=-1, requestedYCount=-1, skip=0;
double minX=0, minY=0, stepX=1, stepY=1;
int frame;
QString provider, file, field;

while (!xml.atEnd()) {
Expand All @@ -196,6 +197,7 @@ PrimitivePtr DataMatrixFactory::generatePrimitive(ObjectStore *store, QXmlStream
doAve = attrs.value("doave").toString() == "true" ? true : false;
doSkip = attrs.value("doskip").toString() == "true" ? true : false;
skip = attrs.value("skip").toString().toInt();
frame = attrs.value("frame").toString().toInt();
minX = attrs.value("xmin").toString().toDouble();
minY = attrs.value("ymin").toString().toDouble();
stepX = attrs.value("xstep").toString().toDouble();
Expand Down Expand Up @@ -230,7 +232,7 @@ PrimitivePtr DataMatrixFactory::generatePrimitive(ObjectStore *store, QXmlStream
}

DataMatrixPtr matrix = store->createObject<DataMatrix>();
matrix->change(dataSource, field, requestedXStart, requestedYStart, requestedXCount, requestedYCount, doAve, doSkip, skip, minX, minY, stepX, stepY);
matrix->change(dataSource, field, requestedXStart, requestedYStart, requestedXCount, requestedYCount, doAve, doSkip, skip, frame, minX, minY, stepX, stepY);
matrix->setDescriptiveName(descriptiveName);

matrix->writeLock();
Expand Down
2 changes: 1 addition & 1 deletion src/libkst/matrixscriptinterface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ QString DataMatrixSI::change(QString& command) {
vars.at(4).toInt(), // num x steps
vars.at(5).toInt(), // num y steps

false, false, 0,
false, false, 0, 0, // FIXME: image streams!

vars.at(6).toDouble(), // min x
vars.at(7).toDouble(), // min y
Expand Down
24 changes: 24 additions & 0 deletions src/libkst/objectstore.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
#include "datastring.h"
#include "datascalar.h"
#include "datamatrix.h"
#include "vscalar.h"

// NAMEDEBUG: 0 for no debug, 1 for some debug, 2 for more debug, 3 for all debug
#define NAMEDEBUG 0
Expand Down Expand Up @@ -209,5 +210,28 @@ bool ObjectStore::deleteUnsetUsedFlags() {
return some_deleted;
}

const PrimitiveList ObjectStore::getFramePrimitives() const {
PrimitiveList primitives;
DataVectorList data_vectors = getObjects<DataVector>();
VScalarList vscalars = getObjects<VScalar>();
DataMatrixList data_matrixes = getObjects<DataMatrix>();


foreach (DataVectorPtr dv, data_vectors) {
primitives.append(dv);
}
foreach (VScalarPtr vs, vscalars) {
primitives.append(vs);
}
foreach (DataMatrixPtr dm, data_matrixes) {
if (dm->hasStream()) {
primitives.append(dm);
}
}

return primitives;
}


}
// vim: ts=2 sw=2 et
2 changes: 2 additions & 0 deletions src/libkst/objectstore.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@ class KSTCORE_EXPORT ObjectStore
** T must inherit from Kst::Object */
template<class T> const ObjectList<T> getObjects() const;

const PrimitiveList getFramePrimitives() const;

/** get just the data sources */
DataSourceList dataSourceList() const;

Expand Down
1 change: 1 addition & 0 deletions src/libkst/vscalar.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ class KSTCORE_EXPORT VScalar : public Scalar {
/** change the properties of a VScalar */
void change(DataSourcePtr file, const QString &field, int f0);
void changeFile(DataSourcePtr file);
void changeFrame(int in_f0) {_f0 = in_f0;}

/** return the name of the file */
QString filename() const;
Expand Down
51 changes: 45 additions & 6 deletions src/libkstapp/changedatasampledialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@

#include "datacollection.h"
#include "datavector.h"
#include "datamatrix.h"
#include "vscalar.h"
#include "objectstore.h"
#include "document.h"
#include "mainwindow.h"
Expand Down Expand Up @@ -173,7 +175,7 @@ void ChangeDataSampleDialog::modified() {

void ChangeDataSampleDialog::updateCurveListDialog() {

DataVectorList dataVectors = _store->getObjects<DataVector>();
PrimitiveList dataVectors = _store->getFramePrimitives();
_vectorList->blockSignals(true);

_vectorList->clearSelection();
Expand Down Expand Up @@ -341,20 +343,39 @@ void ChangeDataSampleDialog::apply() {
range_units = _dataRange->_rangeUnits->currentText();

for (int i = 0; i < selectedItems.size(); ++i) {
QString filename;
DataSourcePtr datasource;
bool valid = false;
bool use_custom_start_index = false;
bool use_custom_range_index = false;
if (DataVectorPtr vector = kst_cast<DataVector>(_store->retrieveObject(selectedItems.at(i)->text()))) {
QString filename = vector->filename();
filename = vector->filename();
datasource = vector->dataSource();
valid = true;
use_custom_range_index = custom_range_index;
use_custom_start_index = custom_start_index;
} else if (DataMatrixPtr matrix = kst_cast<DataMatrix>(_store->retrieveObject(selectedItems.at(i)->text()))) {
filename = matrix->filename();
datasource = matrix->dataSource();
valid = true;
} else if (VScalarPtr vscalar = kst_cast<VScalar>(_store->retrieveObject(selectedItems.at(i)->text()))) {
filename = vscalar->filename();
datasource = vscalar->dataSource();
valid = true;
}
if (valid) {
if (!f0_map.contains(filename)) {
int f0;
int r;
if (custom_start_index) {
f0 = vector->dataSource()->indexToFrame(_dataRange->start(), start_units);
if (use_custom_start_index) {
f0 = datasource->indexToFrame(_dataRange->start(), start_units);
} else if (_dataRange->countFromEnd()) {
f0 = -1;
} else {
f0 = _dataRange->start();
}
if (custom_range_index) {
r = _dataRange->range()*vector->dataSource()->framePerIndex(range_units);
if (use_custom_range_index) {
r = _dataRange->range()*datasource->framePerIndex(range_units);
} else if (_dataRange->readToEnd()) {
r = -1;
} else {
Expand All @@ -380,6 +401,24 @@ void ChangeDataSampleDialog::apply() {
vector->setRangeUnits(start_units);
vector->registerChange();
vector->unlock();
} else if (DataMatrixPtr matrix = kst_cast<DataMatrix>(_store->retrieveObject(selectedItems.at(i)->text()))) {
matrix->writeLock();
int from = f0_map.value(matrix->filename());
int range = r_map.value(matrix->filename());
matrix->setFrame(from+range-1);
matrix->setStartUnits(start_units);
matrix->setRangeUnits(start_units);
matrix->registerChange();
matrix->unlock();
} else if (VScalarPtr vscalar = kst_cast<VScalar>(_store->retrieveObject(selectedItems.at(i)->text()))) {
vscalar->writeLock();
int from = f0_map.value(vscalar->filename());
int range = r_map.value(vscalar->filename());
vscalar->changeFrame(from+range-1);
//vscalar->setStartUnits(start_units);
//vscalar->setRangeUnits(start_units);
vscalar->registerChange();
vscalar->unlock();
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/libkstapp/commandlineparser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -641,7 +641,7 @@ bool CommandLineParser::processCommandLine(bool *ok) {
DataMatrixPtr dm = _document->objectStore()->createObject<DataMatrix>();

dm->writeLock();
dm->change(ds, field, 0, 0, -1, -1, _doAve, _skip>0, _skip, 0.0, 0.0, 1.0, 1.0);
dm->change(ds, field, 0, 0, -1, -1, _doAve, _skip>0, _skip, _startFrame, 0.0, 0.0, 1.0, 1.0);

dm->registerChange();
dm->unlock();
Expand Down
87 changes: 51 additions & 36 deletions src/libkstapp/matrixdialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -78,35 +78,6 @@ MatrixTab::MatrixTab(ObjectStore *store, QWidget *parent)
connect(_gradientX, SIGNAL(clicked()), this, SIGNAL(modified()));
connect(_gradientY, SIGNAL(clicked()), this, SIGNAL(modified()));

_connect->setVisible(false);

QLabel* siHack=new QLabel(this);
siHack->hide();
siHack->setProperty("si","Read 1 sample per");
siHack->setObjectName("siHack");
siHack->setBuddy(_skip);

textLabel7->setProperty("si","X step si&ze:");
textLabel5_2_2->setProperty("si","&X minimum:");
textLabel6->setProperty("si","&Y minimum:");
textLabel7_2->setProperty("si","Y ste&p size:");
_gradientX->setProperty("si","X-axis");
_gradientY->setProperty("si","Y-axis");
textLabel6_2->setProperty("si","Z at minimum:");
textLabel8->setProperty("si","X steps:");
textLabel8_2->setProperty("si","Y steps:");
textLabel7_3->setProperty("si","Z at maximum:");
textLabel3->setProperty("si","Y s&tarting frame:");
textLabel2_2->setProperty("si","X n&umber of frames:");
textLabel3_2->setProperty("si","Y nu&mber of frames:");
textLabel2->setProperty("si","X &starting frame:");
_doAverage->setProperty("si","Boxcar &filter first");
_doSkip->setProperty("si","Read &1 sample per");
_readFromSource->setProperty("si","Read from data source");
_generateGradient->setProperty("si","Generate gradient");
TextLabel6->setProperty("si","F&ield or column:");
_connect->setProperty("si","&Connect");
_configure->setProperty("si","Co&nfigure...");
}


Expand Down Expand Up @@ -144,10 +115,10 @@ void MatrixTab::yNumStepsReadToEndClicked() {

void MatrixTab::updateEnables() {
_dataSourceGroup->setEnabled(_readFromSource->isChecked());
_dataRangeGroup->setEnabled(_readFromSource->isChecked());
_partialMatrixGroup->setEnabled(_readFromSource->isChecked());
_gradientGroup->setEnabled(_generateGradient->isChecked());

if (_dataRangeGroup->isEnabled()) {
if (_partialMatrixGroup->isEnabled()) {
_skip->setEnabled(_doSkip->isChecked());
_doAverage->setEnabled(_doSkip->isChecked());
xStartCountFromEndClicked();
Expand All @@ -167,9 +138,13 @@ void MatrixTab::hideGeneratedOptions() {
void MatrixTab::hideDataOptions() {
_sourceGroup->setVisible(false);
_dataSourceGroup->setVisible(false);
_dataRangeGroup->setVisible(false);
_partialMatrixGroup->setVisible(false);
}

void MatrixTab::hideUnused() {
_partialMatrixGroup->setVisible(false);
_scalingGroup->setVisible(false);
}

DataSourcePtr MatrixTab::dataSource() const {
return _dataSource;
Expand Down Expand Up @@ -373,6 +348,30 @@ void MatrixTab::setSkip(int skip) {
}


int MatrixTab::frame() const {
if (_lastFrame->isChecked()) {
return (-1);
} else {
return _frame->value();
}
}


bool MatrixTab::frameDirty() const {
return (!_frame->text().isEmpty());
}


void MatrixTab::setFrame(int frame) {
if (frame<0) {
_lastFrame->setChecked(true);
} else {
_lastFrame->setChecked(false);
_frame ->setValue(frame);
}
}


double MatrixTab::gradientZAtMin() const {
return _gradientZAtMin->text().toDouble();
}
Expand Down Expand Up @@ -517,7 +516,7 @@ void MatrixTab::readFromSourceChanged() {
setMatrixMode(GeneratedMatrix);

_dataSourceGroup->setEnabled(_readFromSource->isChecked());
_dataRangeGroup->setEnabled(_readFromSource->isChecked());
_partialMatrixGroup->setEnabled(_readFromSource->isChecked());
_gradientGroup->setEnabled(!_readFromSource->isChecked());
emit sourceChanged();
}
Expand Down Expand Up @@ -547,6 +546,11 @@ void MatrixTab::sourceValid(QString filename, int requestID) {
_field->setEditable(!_dataSource->matrix().isListComplete() && !_dataSource->matrix().list().empty());
_configure->setEnabled(_dataSource->hasConfigWidget());

bool hasImageStream = _dataSource->hasImageStream();
_frame->setVisible(hasImageStream);
_frameLabel->setVisible(hasImageStream);
_lastFrame->setVisible(hasImageStream);

_dataSource->unlock();

validating = false;
Expand Down Expand Up @@ -644,6 +648,9 @@ MatrixDialog::~MatrixDialog() {


void MatrixDialog::configureTab(ObjectPtr matrix) {

_matrixTab->hideUnused();

if (!matrix) {
_matrixTab->setMatrixMode(MatrixTab::DataMatrix);
_matrixTab->setFile(dialogDefaults().value("matrix/datasource",_matrixTab->file()).toString());
Expand All @@ -658,6 +665,8 @@ void MatrixDialog::configureTab(ObjectPtr matrix) {
_matrixTab->setXStart(dialogDefaults().value("matrix/reqXStart",0).toInt());
_matrixTab->setYStart(dialogDefaults().value("matrix/reqYStart",0).toInt());

_matrixTab->setFrame(dialogDefaults().value("matrix/frame",-1).toInt());

#ifdef NO_GENERATED_OPTIONS
_matrixTab->hideGeneratedOptions();
#endif
Expand All @@ -683,6 +692,7 @@ void MatrixDialog::configureTab(ObjectPtr matrix) {
_matrixTab->setSkip(dataMatrix->skip());
_matrixTab->setDoSkip(dataMatrix->doSkip());
_matrixTab->setDoAverage(dataMatrix->doAverage());
_matrixTab->setFrame(dataMatrix->frame());
_matrixTab->hideGeneratedOptions();
if (_editMultipleWidget) {
DataMatrixList objects = _document->objectStore()->getObjects<DataMatrix>();
Expand Down Expand Up @@ -787,6 +797,7 @@ ObjectPtr MatrixDialog::createNewDataMatrix() {
const double minY = _matrixTab->minY();
const double stepX = _matrixTab->stepX();
const double stepY = _matrixTab->stepY();
const int frame = _matrixTab->frame();

// qDebug() << "Creating new data matrix ===>"
// << "\n\tfileName:" << dataSource->fileName()
Expand All @@ -808,7 +819,7 @@ ObjectPtr MatrixDialog::createNewDataMatrix() {
matrix->change(dataSource, field,
xStart, yStart,
xNumSteps, yNumSteps, doAverage,
doSkip, skip, minX, minY, stepX, stepY);
doSkip, skip, frame, minX, minY, stepX, stepY);

if (DataDialog::tagStringAuto()) {
matrix->setDescriptiveName(QString());
Expand Down Expand Up @@ -903,8 +914,10 @@ ObjectPtr MatrixDialog::editExistingDataObject() const {
bool doSkip = _matrixTab->doSkipDirty() ? _matrixTab->doSkip() : matrix->doSkip();
bool doAve = _matrixTab->doAverageDirty() ? _matrixTab->doAverage() : matrix->doAverage();

int frame = _matrixTab->frame();

matrix->writeLock();
matrix->changeFrames(xStart, yStart, xNumSteps, yNumSteps, doAve, doSkip, skip, minX, minY, stepX, stepY);
matrix->changeFrames(xStart, yStart, xNumSteps, yNumSteps, doAve, doSkip, skip, frame, minX, minY, stepX, stepY);
matrix->registerChange();
matrix->unlock();
}
Expand All @@ -928,9 +941,11 @@ ObjectPtr MatrixDialog::editExistingDataObject() const {
const double minY = _matrixTab->minY();
const double stepX = _matrixTab->stepX();
const double stepY = _matrixTab->stepY();
const int frame = _matrixTab->frame();


dataMatrix->writeLock();
dataMatrix->change(dataSource, field, xStart, yStart, xNumSteps, yNumSteps, doAverage, doSkip, skip, minX, minY, stepX, stepY);
dataMatrix->change(dataSource, field, xStart, yStart, xNumSteps, yNumSteps, doAverage, doSkip, skip, frame, minX, minY, stepX, stepY);
dataMatrix->registerChange();
dataMatrix->unlock();
setDataMatrixDefaults(dataMatrix);
Expand Down
8 changes: 7 additions & 1 deletion src/libkstapp/matrixdialog.h
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,10 @@ class MatrixTab : public DataTab, Ui::MatrixTab {
bool skipDirty() const;
void setSkip(int skip);

int frame() const;
bool frameDirty() const;
void setFrame(int frame);

bool xStartCountFromEnd() const;
bool xStartCountFromEndDirty() const;
void setXStartCountFromEnd(bool xStartCountFromEnd);
Expand All @@ -132,7 +136,9 @@ class MatrixTab : public DataTab, Ui::MatrixTab {
void setYReadToEnd(bool yReadToEnd);

void hideGeneratedOptions();
void hideDataOptions();
void hideDataOptions();
void hideUnused();

void enableSingleEditOptions(bool enabled);
void clearTabValues();

Expand Down
182 changes: 136 additions & 46 deletions src/libkstapp/matrixtab.ui
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,16 @@
</rect>
</property>
<layout class="QGridLayout">
<property name="margin">
<property name="leftMargin">
<number>9</number>
</property>
<property name="topMargin">
<number>9</number>
</property>
<property name="rightMargin">
<number>9</number>
</property>
<property name="bottomMargin">
<number>9</number>
</property>
<property name="spacing">
Expand All @@ -20,7 +29,7 @@
<item row="4" column="0">
<widget class="QGroupBox" name="_scalingGroup">
<property name="enabled">
<bool>true</bool>
<bool>false</bool>
</property>
<property name="title">
<string>Scaling and Translation</string>
Expand Down Expand Up @@ -152,7 +161,16 @@
</item>
<item row="0" column="3" rowspan="2">
<layout class="QVBoxLayout">
<property name="margin">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
Expand Down Expand Up @@ -214,7 +232,7 @@
<number>0</number>
</property>
<item row="0" column="0">
<layout class="QGridLayout">
<layout class="QGridLayout" name="QGridLayout1">
<item row="0" column="0">
<widget class="QLabel" name="textLabel5">
<property name="text">
Expand Down Expand Up @@ -261,7 +279,7 @@
</layout>
</item>
<item row="1" column="0">
<layout class="QGridLayout">
<layout class="QGridLayout" name="QGridLayout2">
<item row="1" column="1">
<widget class="QSpinBox" name="_nX">
<property name="minimum">
Expand Down Expand Up @@ -357,9 +375,12 @@
</widget>
</item>
<item row="2" column="0">
<widget class="QGroupBox" name="_dataRangeGroup">
<widget class="QGroupBox" name="_partialMatrixGroup">
<property name="enabled">
<bool>false</bool>
</property>
<property name="title">
<string>Data Range</string>
<string>Partial Matrix</string>
</property>
<layout class="QGridLayout">
<property name="topMargin">
Expand All @@ -369,7 +390,7 @@
<number>0</number>
</property>
<item row="0" column="0">
<layout class="QGridLayout">
<layout class="QGridLayout" name="QGridLayout3">
<item row="3" column="2">
<widget class="QLabel" name="textLabel4_4">
<property name="sizePolicy">
Expand Down Expand Up @@ -635,7 +656,7 @@
</layout>
</item>
<item row="1" column="0">
<layout class="QGridLayout">
<layout class="QGridLayout" name="QGridLayout4">
<item row="0" column="1">
<widget class="QSpinBox" name="_skip">
<property name="enabled">
Expand Down Expand Up @@ -676,6 +697,9 @@
</item>
<item row="0" column="0">
<widget class="QGroupBox" name="_sourceGroup">
<property name="enabled">
<bool>false</bool>
</property>
<property name="title">
<string comment="the source of the item">Source</string>
</property>
Expand Down Expand Up @@ -733,17 +757,17 @@
<property name="title">
<string>Data Source Parameters</string>
</property>
<layout class="QGridLayout">
<property name="topMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item row="1" column="0">
<widget class="QLabel" name="TextLabel6">
<layout class="QGridLayout" name="gridLayout5">
<item row="0" column="0">
<widget class="QLabel" name="TextLabel4_3">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>F&amp;ield or column:</string>
<string>File name:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
Expand All @@ -752,17 +776,23 @@
<bool>false</bool>
</property>
<property name="buddy">
<cstring>_field</cstring>
<cstring>_fileName</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<item row="0" column="1" colspan="2">
<widget class="Kst::DataSourceSelector" name="_fileName" native="true"/>
</item>
<item row="0" column="0">
<widget class="QLabel" name="TextLabel4_3">
<item row="1" column="0">
<widget class="QLabel" name="TextLabel6">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>File name:</string>
<string>F&amp;ield or column:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
Expand All @@ -771,11 +801,11 @@
<bool>false</bool>
</property>
<property name="buddy">
<cstring>_fileName</cstring>
<cstring>_field</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
<item row="1" column="1" colspan="2">
<widget class="Kst::ComboBox" name="_field">
<property name="enabled">
<bool>false</bool>
Expand All @@ -788,34 +818,63 @@
</property>
</widget>
</item>
<item row="2" column="0" colspan="2">
<layout class="QHBoxLayout">
<property name="margin">
<item row="2" column="0">
<widget class="QLabel" name="_frameLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Frame:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QSpinBox" name="_frame">
<property name="maximum">
<number>10000000</number>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QCheckBox" name="_lastFrame">
<property name="text">
<string>Last Frame</string>
</property>
</widget>
</item>
<item row="3" column="0" colspan="3">
<layout class="QHBoxLayout" name="hboxLayout1">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<spacer>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Expanding</enum>
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>181</width>
<height>21</height>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="_connect">
<property name="text">
<string>&amp;Connect</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="_configure">
<property name="enabled">
Expand Down Expand Up @@ -850,8 +909,6 @@
<tabstop>_readFromSource</tabstop>
<tabstop>_generateGradient</tabstop>
<tabstop>_field</tabstop>
<tabstop>_connect</tabstop>
<tabstop>_configure</tabstop>
<tabstop>_xStart</tabstop>
<tabstop>_xStartCountFromEnd</tabstop>
<tabstop>_yStart</tabstop>
Expand All @@ -875,5 +932,38 @@
<tabstop>_yStep</tabstop>
</tabstops>
<resources/>
<connections/>
<connections>
<connection>
<sender>_lastFrame</sender>
<signal>toggled(bool)</signal>
<receiver>_frame</receiver>
<slot>setDisabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>359</x>
<y>195</y>
</hint>
<hint type="destinationlabel">
<x>234</x>
<y>204</y>
</hint>
</hints>
</connection>
<connection>
<sender>_lastFrame</sender>
<signal>toggled(bool)</signal>
<receiver>_frameLabel</receiver>
<slot>setDisabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>408</x>
<y>203</y>
</hint>
<hint type="destinationlabel">
<x>96</x>
<y>197</y>
</hint>
</hints>
</connection>
</connections>
</ui>
2 changes: 2 additions & 0 deletions src/widgets/dialogdefaults.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ void setDataMatrixDefaults(DataMatrixPtr M) {
dialogDefaults().setValue("matrix/yNumSteps",M->yNumSteps());
dialogDefaults().setValue("matrix/reqXStart",M->reqXStart());
dialogDefaults().setValue("matrix/reqYStart",M->reqYStart());

dialogDefaults().setValue("matrix/frame",M->frame());
}

void setHistogramDefaults(HistogramPtr H) {
Expand Down