1 /***************************************************************************
2 * *
3 * copyright : (C) 2007 The University of Toronto *
4 * netterfield@astro.utoronto.ca *
5 * copyright : (C) 2005 University of British Columbia *
6 * dscott@phas.ubc.ca *
7 * *
8 * This program is free software; you can redistribute it and/or modify *
9 * it under the terms of the GNU General Public License as published by *
10 * the Free Software Foundation; either version 2 of the License, or *
11 * (at your option) any later version. *
12 * *
13 ***************************************************************************/
14
15
16 #include "akima.h"
17 #include "objectstore.h"
18 #include "ui_akimaconfig.h"
19
20 #include <gsl/gsl_spline.h>
21 #include "../interpolations.h"
22
23 static const QString& VECTOR_IN_X = "Vector X In";
24 static const QString& VECTOR_IN_Y = "Vector Y In";
25 static const QString& VECTOR_IN_X1 = "Vector X' In";
26 static const QString& VECTOR_OUT = "Y Interpolated";
27
28 class ConfigWidgetAkimaPlugin : public Kst::DataObjectConfigWidget, public Ui_AkimaConfig {
29 public:
ConfigWidgetAkimaPlugin(QSettings * cfg)30 ConfigWidgetAkimaPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_AkimaConfig() {
31 _store = 0;
32 setupUi(this);
33 }
34
~ConfigWidgetAkimaPlugin()35 ~ConfigWidgetAkimaPlugin() {}
36
setObjectStore(Kst::ObjectStore * store)37 void setObjectStore(Kst::ObjectStore* store) {
38 _store = store;
39 _vectorX->setObjectStore(store);
40 _vectorY->setObjectStore(store);
41 _vectorX1->setObjectStore(store);
42 }
43
setupSlots(QWidget * dialog)44 void setupSlots(QWidget* dialog) {
45 if (dialog) {
46 connect(_vectorX, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified()));
47 connect(_vectorY, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified()));
48 connect(_vectorX1, SIGNAL(selectionChanged(QString)), dialog, SIGNAL(modified()));
49 }
50 }
51
selectedVectorX()52 Kst::VectorPtr selectedVectorX() { return _vectorX->selectedVector(); };
setSelectedVectorX(Kst::VectorPtr vector)53 void setSelectedVectorX(Kst::VectorPtr vector) { return _vectorX->setSelectedVector(vector); };
54
selectedVectorY()55 Kst::VectorPtr selectedVectorY() { return _vectorY->selectedVector(); };
setSelectedVectorY(Kst::VectorPtr vector)56 void setSelectedVectorY(Kst::VectorPtr vector) { return _vectorY->setSelectedVector(vector); };
57
selectedVectorX1()58 Kst::VectorPtr selectedVectorX1() { return _vectorX1->selectedVector(); };
setSelectedVectorX1(Kst::VectorPtr vector)59 void setSelectedVectorX1(Kst::VectorPtr vector) { return _vectorX1->setSelectedVector(vector); };
60
setupFromObject(Kst::Object * dataObject)61 virtual void setupFromObject(Kst::Object* dataObject) {
62 if (AkimaSource* source = static_cast<AkimaSource*>(dataObject)) {
63 setSelectedVectorX(source->vectorX());
64 setSelectedVectorY(source->vectorY());
65 setSelectedVectorX1(source->vectorX1());
66 }
67 }
68
configurePropertiesFromXml(Kst::ObjectStore * store,QXmlStreamAttributes & attrs)69 virtual bool configurePropertiesFromXml(Kst::ObjectStore *store, QXmlStreamAttributes& attrs) {
70 Q_UNUSED(store);
71 Q_UNUSED(attrs);
72
73 bool validTag = true;
74
75 // QStringRef av;
76 // av = attrs.value("value");
77 // if (!av.isNull()) {
78 // _configValue = QVariant(av.toString()).toBool();
79 // }
80
81 return validTag;
82 }
83
84 public slots:
save()85 virtual void save() {
86 if (_cfg) {
87 _cfg->beginGroup("Interpolation Akima DataObject Plugin");
88 _cfg->setValue("Input Vector X", _vectorX->selectedVector()->Name());
89 _cfg->setValue("Input Vector Y", _vectorY->selectedVector()->Name());
90 _cfg->setValue("Input Vector X1", _vectorX1->selectedVector()->Name());
91 _cfg->endGroup();
92 }
93 }
94
load()95 virtual void load() {
96 if (_cfg && _store) {
97 _cfg->beginGroup("Interpolation Akima DataObject Plugin");
98 QString vectorName = _cfg->value("Input Vector X").toString();
99 Kst::Object* object = _store->retrieveObject(vectorName);
100 Kst::Vector* vector = static_cast<Kst::Vector*>(object);
101 if (vector) {
102 setSelectedVectorX(vector);
103 }
104 vectorName = _cfg->value("Input Vector Y").toString();
105 object = _store->retrieveObject(vectorName);
106 Kst::Vector* vector2 = static_cast<Kst::Vector*>(object);
107 if (vector2) {
108 setSelectedVectorY(vector2);
109 }
110 vectorName = _cfg->value("Input Vector X'").toString();
111 object = _store->retrieveObject(vectorName);
112 Kst::Vector* vectorX1 = static_cast<Kst::Vector*>(object);
113 if (vectorX1) {
114 setSelectedVectorX1(vectorX1);
115 }
116 _cfg->endGroup();
117 }
118 }
119
120 private:
121 Kst::ObjectStore *_store;
122
123 };
124
125
AkimaSource(Kst::ObjectStore * store)126 AkimaSource::AkimaSource(Kst::ObjectStore *store)
127 : Kst::BasicPlugin(store) {
128 }
129
130
~AkimaSource()131 AkimaSource::~AkimaSource() {
132 }
133
134
_automaticDescriptiveName() const135 QString AkimaSource::_automaticDescriptiveName() const {
136 return tr("Interpolation Akima Plugin Object");
137 }
138
139
change(Kst::DataObjectConfigWidget * configWidget)140 void AkimaSource::change(Kst::DataObjectConfigWidget *configWidget) {
141 if (ConfigWidgetAkimaPlugin* config = static_cast<ConfigWidgetAkimaPlugin*>(configWidget)) {
142 setInputVector(VECTOR_IN_X, config->selectedVectorX());
143 setInputVector(VECTOR_IN_Y, config->selectedVectorY());
144 setInputVector(VECTOR_IN_X1, config->selectedVectorX1());
145 }
146 }
147
148
setupOutputs()149 void AkimaSource::setupOutputs() {
150 setOutputVector(VECTOR_OUT, "");
151 }
152
153
algorithm()154 bool AkimaSource::algorithm() {
155 Kst::VectorPtr inputVectorX = _inputVectors[VECTOR_IN_X];
156 Kst::VectorPtr inputVectorY = _inputVectors[VECTOR_IN_Y];
157 Kst::VectorPtr inputVectorX1 = _inputVectors[VECTOR_IN_X1];
158 Kst::VectorPtr outputVector = _outputVectors[VECTOR_OUT];
159
160 return interpolate( inputVectorX, inputVectorY, inputVectorX1, outputVector, gsl_interp_akima);
161 }
162
163
vectorX() const164 Kst::VectorPtr AkimaSource::vectorX() const {
165 return _inputVectors[VECTOR_IN_X];
166 }
167
168
vectorY() const169 Kst::VectorPtr AkimaSource::vectorY() const {
170 return _inputVectors[VECTOR_IN_Y];
171 }
172
173
vectorX1() const174 Kst::VectorPtr AkimaSource::vectorX1() const {
175 return _inputVectors[VECTOR_IN_X1];
176 }
177
178
inputVectorList() const179 QStringList AkimaSource::inputVectorList() const {
180 QStringList vectors(VECTOR_IN_X);
181 vectors += VECTOR_IN_Y;
182 vectors += VECTOR_IN_X1;
183 return vectors;
184 }
185
186
inputScalarList() const187 QStringList AkimaSource::inputScalarList() const {
188 return QStringList( /*SCALAR_IN*/ );
189 }
190
191
inputStringList() const192 QStringList AkimaSource::inputStringList() const {
193 return QStringList( /*STRING_IN*/ );
194 }
195
196
outputVectorList() const197 QStringList AkimaSource::outputVectorList() const {
198 return QStringList(VECTOR_OUT);
199 }
200
201
outputScalarList() const202 QStringList AkimaSource::outputScalarList() const {
203 return QStringList( /*SCALAR_OUT*/ );
204 }
205
206
outputStringList() const207 QStringList AkimaSource::outputStringList() const {
208 return QStringList( /*STRING_OUT*/ );
209 }
210
211
saveProperties(QXmlStreamWriter & s)212 void AkimaSource::saveProperties(QXmlStreamWriter &s) {
213 Q_UNUSED(s);
214 // s.writeAttribute("value", _configValue);
215 }
216
217
pluginName() const218 QString AkimaPlugin::pluginName() const { return tr("Interpolation Akima Spline"); }
pluginDescription() const219 QString AkimaPlugin::pluginDescription() const { return tr("Generates a non-rounded Akima interpolation for a set of data."); }
220
221
create(Kst::ObjectStore * store,Kst::DataObjectConfigWidget * configWidget,bool setupInputsOutputs) const222 Kst::DataObject *AkimaPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const {
223
224 if (ConfigWidgetAkimaPlugin* config = static_cast<ConfigWidgetAkimaPlugin*>(configWidget)) {
225
226 AkimaSource* object = store->createObject<AkimaSource>();
227
228 if (setupInputsOutputs) {
229 object->setupOutputs();
230 object->setInputVector(VECTOR_IN_X, config->selectedVectorX());
231 object->setInputVector(VECTOR_IN_Y, config->selectedVectorY());
232 object->setInputVector(VECTOR_IN_X1, config->selectedVectorX1());
233 }
234
235 object->setPluginName(pluginName());
236
237 object->writeLock();
238 object->registerChange();
239 object->unlock();
240
241 return object;
242 }
243 return 0;
244 }
245
246
configWidget(QSettings * settingsObject) const247 Kst::DataObjectConfigWidget *AkimaPlugin::configWidget(QSettings *settingsObject) const {
248 ConfigWidgetAkimaPlugin *widget = new ConfigWidgetAkimaPlugin(settingsObject);
249 return widget;
250 }
251
252 #ifndef QT5
253 Q_EXPORT_PLUGIN2(kstplugin_ConvolvePlugin, AkimaPlugin)
254 #endif
255
256 // vim: ts=2 sw=2 et
257