File indexing completed on 2024-04-28 11:20:38
0001 /* 0002 SPDX-FileCopyrightText: 2011 Matteo Agostinelli <agostinelli@gmail.com> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "qalculateextensions.h" 0008 0009 #include <libqalculate/Calculator.h> 0010 #include <libqalculate/ExpressionItem.h> 0011 #include <libqalculate/Variable.h> 0012 0013 #include <QStringList> 0014 0015 #define QALCULATE_EXT_CDTOR(name) Qalculate##name##Extension::Qalculate##name##Extension(QObject* parent) : name##Extension(parent) {} \ 0016 Qalculate##name##Extension::~Qalculate##name##Extension() {} 0017 0018 QALCULATE_EXT_CDTOR(History) 0019 QALCULATE_EXT_CDTOR(VariableManagement) 0020 QALCULATE_EXT_CDTOR(CAS) 0021 QALCULATE_EXT_CDTOR(Calculus) 0022 QALCULATE_EXT_CDTOR(LinearAlgebra) 0023 0024 QString QalculateHistoryExtension::lastResult() 0025 { 0026 return QLatin1String("ans"); 0027 } 0028 0029 QString QalculateVariableManagementExtension::addVariable(const QString& name, const QString& value) 0030 { 0031 return setValue(name,value); 0032 } 0033 0034 QString QalculateVariableManagementExtension::setValue(const QString& name, const QString& value) 0035 { 0036 return QString::fromLatin1("%1 := %2").arg(name).arg(value); 0037 } 0038 0039 QString QalculateVariableManagementExtension::removeVariable(const QString& name) 0040 { 0041 Q_UNUSED(name) 0042 //CALCULATOR->getVariable(name.toStdString())->setActive(false); 0043 return QString(); 0044 } 0045 0046 QString QalculateVariableManagementExtension::clearVariables() 0047 { 0048 //CALCULATOR->resetVariables(); 0049 return QString(); 0050 } 0051 0052 QString QalculateVariableManagementExtension::saveVariables(const QString& fileName) 0053 { 0054 QString escapedFileName = fileName; 0055 escapedFileName.replace(QLatin1Char(' '), QLatin1String("\\ ")); 0056 return QString::fromLatin1("saveVariables %1").arg(escapedFileName); 0057 } 0058 0059 QString QalculateVariableManagementExtension::loadVariables(const QString& fileName) 0060 { 0061 QString escapedFileName = fileName; 0062 escapedFileName.replace(QLatin1Char(' '), QLatin1String("\\ ")); 0063 return QString::fromLatin1("loadVariables %1").arg(escapedFileName); 0064 } 0065 0066 // Custom Plot Extension. This extension does not fit into the normal pattern, 0067 // because it inherits Cantor::Extension directly. 0068 // Also it does not do anything at all, because all the work is done by the 0069 // QalculatePlotAssistant 0070 QalculatePlotExtension::QalculatePlotExtension(QObject* parent) : 0071 Cantor::Extension(QLatin1String("QalculatePlotExtension"), parent) 0072 { 0073 } 0074 0075 QalculatePlotExtension::~QalculatePlotExtension() = default; 0076 0077 QString QalculateCASExtension::solve(const QStringList& equations, const QStringList& variables) 0078 { 0079 QString eqstr=QString::fromLatin1("[%1]").arg(equations.join(QLatin1String(","))); 0080 0081 QString variablestr=QString::fromLatin1("[%1]").arg(variables.join(QLatin1String(","))); 0082 0083 return QString::fromLatin1("multisolve(%1,%2)").arg(eqstr, variablestr); 0084 } 0085 0086 QString QalculateCASExtension::simplify(const QString& expression) 0087 { 0088 // There is (currently) no way to do this 0089 return QString::fromLatin1("").arg(expression); 0090 } 0091 0092 QString QalculateCASExtension::expand(const QString& expression) 0093 { 0094 // There is (currently) no way to do this 0095 return QString::fromLatin1("").arg(expression); 0096 } 0097 0098 QString QalculateCalculusExtension::limit(const QString& expression, const QString& variable, const QString& limit) 0099 { 0100 Q_UNUSED(expression) 0101 Q_UNUSED(variable) 0102 Q_UNUSED(limit) 0103 // There is no limit function in Qalculate (at least none I know of), 0104 // but fortunately this function seems not to be used anyway. 0105 return QLatin1String(""); 0106 //return QString("limit(%1, %2=%3);").arg(expression, variable, limit); 0107 } 0108 0109 QString QalculateCalculusExtension::differentiate(const QString& function,const QString& variable, int times) 0110 { 0111 return QString::fromLatin1("diff(%1, %2, %3)").arg(function, variable, QString::number(times)); 0112 } 0113 0114 QString QalculateCalculusExtension::integrate(const QString& function, const QString& variable) 0115 { 0116 return QString::fromLatin1("integrate(%1, %2)").arg(function, variable); 0117 } 0118 0119 QString QalculateCalculusExtension::integrate(const QString& function,const QString& variable, const QString& left, const QString& right) 0120 { 0121 return QString::fromLatin1("integrate(%1, %2, %3, %4)").arg(function, variable, left, right); 0122 } 0123 0124 //Commands to create Vectors/Matrices 0125 QString QalculateLinearAlgebraExtension::createVector(const QStringList& entries, VectorType type) 0126 { 0127 // Neither of these does create a normal vector, but a n-times-1 or 0128 // an 1-times-n matrix. 0129 if(type==Cantor::LinearAlgebraExtension::ColumnVector) { 0130 QString list=entries.join(QLatin1String("], [")); 0131 return QString::fromLatin1("[[%1]]").arg(list); 0132 } 0133 else { 0134 QString list=entries.join(QLatin1String(",")); 0135 return QString::fromLatin1("[[%1]]").arg(list); 0136 } 0137 } 0138 0139 QString QalculateLinearAlgebraExtension::createMatrix(const Matrix& matrix) 0140 { 0141 QString cmd=QLatin1String("["); 0142 foreach(const QStringList& row, matrix) 0143 { 0144 cmd+=QLatin1Char('['); 0145 foreach(const QString& entry, row) 0146 cmd+=entry+QLatin1Char(','); 0147 cmd.chop(1); 0148 cmd+=QLatin1String("],"); 0149 } 0150 cmd.chop(1); 0151 cmd+=QLatin1String("]"); 0152 0153 return cmd; 0154 } 0155 0156 QString QalculateLinearAlgebraExtension::identityMatrix(int size) 0157 { 0158 return QString::fromLatin1("identity(%1)").arg(size); 0159 } 0160 0161 //basic functions 0162 QString QalculateLinearAlgebraExtension::rank(const QString& matrix) 0163 { 0164 // This feature seems to be missing in Qalculate 0165 return QString::fromLatin1("").arg(matrix); 0166 } 0167 0168 QString QalculateLinearAlgebraExtension::invertMatrix(const QString& matrix) 0169 { 0170 return QString::fromLatin1("inverse(%1)").arg(matrix); 0171 } 0172 0173 QString QalculateLinearAlgebraExtension::charPoly(const QString& matrix) 0174 { 0175 return QString::fromLatin1("det(x*identity(%1)-%2)").arg(matrix, matrix); 0176 } 0177 0178 QString QalculateLinearAlgebraExtension::eigenVectors(const QString& matrix) 0179 { 0180 // No such function 0181 return QString::fromLatin1("").arg(matrix); 0182 } 0183 0184 QString QalculateLinearAlgebraExtension::eigenValues(const QString& matrix) 0185 { 0186 // No such function 0187 return QString::fromLatin1("").arg(matrix); 0188 }