File indexing completed on 2024-11-10 09:25:34
0001 /************************************************************************************* 0002 * Copyright (C) 2012 by Aleix Pol <aleixpol@kde.org> * 0003 * * 0004 * This program is free software; you can redistribute it and/or * 0005 * modify it under the terms of the GNU General Public License * 0006 * as published by the Free Software Foundation; either version 2 * 0007 * of the License, or (at your option) any later version. * 0008 * * 0009 * This program is distributed in the hope that it will be useful, * 0010 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 0011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 0012 * GNU General Public License for more details. * 0013 * * 0014 * You should have received a copy of the GNU General Public License * 0015 * along with this program; if not, write to the Free Software * 0016 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA * 0017 *************************************************************************************/ 0018 0019 #include "plotsfactory.h" 0020 #include <analitzaplot/functiongraph.h> 0021 #include "private/functiongraphfactory.h" 0022 #include <analitza/analyzer.h> 0023 #include <analitza/variables.h> 0024 #include <QStringList> 0025 #include <QCoreApplication> 0026 0027 using namespace Analitza; 0028 0029 Q_GLOBAL_STATIC(PlotsFactory, factoryInstance) 0030 0031 PlotsFactory::PlotsFactory() 0032 : m_vars(new Variables) 0033 {} 0034 0035 PlotsFactory::~PlotsFactory() 0036 { 0037 } 0038 0039 PlotsFactory* PlotsFactory::self() 0040 { 0041 return factoryInstance; 0042 } 0043 0044 PlotBuilder PlotsFactory::requestPlot(const Analitza::Expression& testexp, Dimension dim, const QSharedPointer<Variables> &vars) const 0045 { 0046 QStringList errs; 0047 0048 if(!testexp.isCorrect() || testexp.toString().isEmpty()) { 0049 errs << QCoreApplication::tr("The expression is not correct"); 0050 PlotBuilder b; 0051 b.m_errors = errs; 0052 return b; 0053 } 0054 0055 Analitza::Expression exp(testexp); 0056 if(exp.isDeclaration()) 0057 exp = exp.declarationValue(); 0058 0059 if(exp.isEquation()) 0060 exp = exp.equationToFunction(); 0061 0062 Analitza::Analyzer a(vars ? vars : m_vars); 0063 a.setExpression(exp); 0064 a.setExpression(a.dependenciesToLambda()); 0065 0066 QString id; 0067 if(a.isCorrect()) { 0068 QString expectedid = FunctionGraphFactory::self()->trait(a.expression(), a.type(), dim); 0069 if(FunctionGraphFactory::self()->contains(expectedid)) { 0070 id = expectedid; 0071 } else if (!expectedid.isEmpty()) 0072 errs << QCoreApplication::tr("Function type '%1' not recognized").arg(expectedid); 0073 else 0074 errs << QCoreApplication::tr("Function '%1' not recognized").arg(a.expression().toString()); 0075 } else { 0076 errs << a.errors(); 0077 } 0078 0079 Q_ASSERT(!errs.isEmpty() || !id.isEmpty()); 0080 0081 PlotBuilder b; 0082 b.m_errors = errs; 0083 b.m_id = id; 0084 b.m_expression = a.expression(); 0085 b.m_display = testexp.toString(); 0086 b.m_vars = vars; 0087 return b; 0088 } 0089 0090 QStringList PlotsFactory::examples(Dimensions s) const 0091 { 0092 QStringList examples; 0093 if(s & Dim1D) examples += FunctionGraphFactory::self()->examples(Dim1D); 0094 if(s & Dim2D) examples += FunctionGraphFactory::self()->examples(Dim2D); 0095 if(s & Dim3D) examples += FunctionGraphFactory::self()->examples(Dim3D); 0096 return examples; 0097 } 0098 0099 //------------------------------------------ PlotBuilder 0100 0101 PlotBuilder::PlotBuilder() 0102 : m_vars(nullptr) 0103 {} 0104 0105 bool PlotBuilder::canDraw() const 0106 { 0107 return m_errors.isEmpty() && !m_id.isEmpty(); 0108 } 0109 0110 FunctionGraph* PlotBuilder::create(const QColor& color, const QString& name) const 0111 { 0112 FunctionGraph* it = FunctionGraphFactory::self()->buildItem(m_id, m_expression, m_vars); 0113 it->setColor(color); 0114 it->setName(name); 0115 it->setDisplay(m_display); 0116 return it; 0117 } 0118 0119 Analitza::Expression PlotBuilder::expression() const 0120 { 0121 return m_expression; 0122 } 0123 0124 QString PlotBuilder::display() const 0125 { 0126 return m_display; 0127 }