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 "akimaperiodic.h"
17 #include "objectstore.h"
18 #include "ui_akimaperiodicconfig.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 ConfigWidgetAkimaPeriodicPlugin : public Kst::DataObjectConfigWidget, public Ui_AkimaPeriodicConfig {
29   public:
ConfigWidgetAkimaPeriodicPlugin(QSettings * cfg)30     ConfigWidgetAkimaPeriodicPlugin(QSettings* cfg) : DataObjectConfigWidget(cfg), Ui_AkimaPeriodicConfig() {
31       _store = 0;
32       setupUi(this);
33     }
34 
~ConfigWidgetAkimaPeriodicPlugin()35     ~ConfigWidgetAkimaPeriodicPlugin() {}
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 (AkimaPeriodicSource* source = static_cast<AkimaPeriodicSource*>(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 Periodic 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 Periodic 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 
AkimaPeriodicSource(Kst::ObjectStore * store)126 AkimaPeriodicSource::AkimaPeriodicSource(Kst::ObjectStore *store)
127 : Kst::BasicPlugin(store) {
128 }
129 
130 
~AkimaPeriodicSource()131 AkimaPeriodicSource::~AkimaPeriodicSource() {
132 }
133 
134 
_automaticDescriptiveName() const135 QString AkimaPeriodicSource::_automaticDescriptiveName() const {
136   return tr("Interpolation Akima Periodic Plugin Object");
137 }
138 
139 
change(Kst::DataObjectConfigWidget * configWidget)140 void AkimaPeriodicSource::change(Kst::DataObjectConfigWidget *configWidget) {
141   if (ConfigWidgetAkimaPeriodicPlugin* config = static_cast<ConfigWidgetAkimaPeriodicPlugin*>(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 AkimaPeriodicSource::setupOutputs() {
150   setOutputVector(VECTOR_OUT, "");
151 }
152 
153 
algorithm()154 bool AkimaPeriodicSource::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_periodic);
161 }
162 
163 
vectorX() const164 Kst::VectorPtr AkimaPeriodicSource::vectorX() const {
165   return _inputVectors[VECTOR_IN_X];
166 }
167 
168 
vectorY() const169 Kst::VectorPtr AkimaPeriodicSource::vectorY() const {
170   return _inputVectors[VECTOR_IN_Y];
171 }
172 
173 
vectorX1() const174 Kst::VectorPtr AkimaPeriodicSource::vectorX1() const {
175   return _inputVectors[VECTOR_IN_X1];
176 }
177 
178 
inputVectorList() const179 QStringList AkimaPeriodicSource::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 AkimaPeriodicSource::inputScalarList() const {
188   return QStringList( /*SCALAR_IN*/ );
189 }
190 
191 
inputStringList() const192 QStringList AkimaPeriodicSource::inputStringList() const {
193   return QStringList( /*STRING_IN*/ );
194 }
195 
196 
outputVectorList() const197 QStringList AkimaPeriodicSource::outputVectorList() const {
198   return QStringList(VECTOR_OUT);
199 }
200 
201 
outputScalarList() const202 QStringList AkimaPeriodicSource::outputScalarList() const {
203   return QStringList( /*SCALAR_OUT*/ );
204 }
205 
206 
outputStringList() const207 QStringList AkimaPeriodicSource::outputStringList() const {
208   return QStringList( /*STRING_OUT*/ );
209 }
210 
211 
saveProperties(QXmlStreamWriter & s)212 void AkimaPeriodicSource::saveProperties(QXmlStreamWriter &s) {
213   Q_UNUSED(s);
214 //   s.writeAttribute("value", _configValue);
215 }
216 
217 
pluginName() const218 QString AkimaPeriodicPlugin::pluginName() const { return tr("Interpolation Akima Periodic Spline"); }
pluginDescription() const219 QString AkimaPeriodicPlugin::pluginDescription() const { return tr("Generates a non-rounded periodic Akima interpolation for a set of data."); }
220 
221 
create(Kst::ObjectStore * store,Kst::DataObjectConfigWidget * configWidget,bool setupInputsOutputs) const222 Kst::DataObject *AkimaPeriodicPlugin::create(Kst::ObjectStore *store, Kst::DataObjectConfigWidget *configWidget, bool setupInputsOutputs) const {
223 
224   if (ConfigWidgetAkimaPeriodicPlugin* config = static_cast<ConfigWidgetAkimaPeriodicPlugin*>(configWidget)) {
225 
226     AkimaPeriodicSource* object = store->createObject<AkimaPeriodicSource>();
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 *AkimaPeriodicPlugin::configWidget(QSettings *settingsObject) const {
248   ConfigWidgetAkimaPeriodicPlugin *widget = new ConfigWidgetAkimaPeriodicPlugin(settingsObject);
249   return widget;
250 }
251 
252 #ifndef QT5
253 Q_EXPORT_PLUGIN2(kstplugin_ConvolvePlugin, AkimaPeriodicPlugin)
254 #endif
255 
256 // vim: ts=2 sw=2 et
257