1 /* 2 SPDX-License-Identifier: GPL-2.0-or-later 3 SPDX-FileCopyrightText: 2011 Filipe Saraiva <filipe@kde.org> 4 */ 5 6 #include "scilabexpression.h" 7 8 #include <config-cantorlib.h> 9 10 #include "textresult.h" 11 #include "imageresult.h" 12 #include "helpresult.h" 13 14 #include <QDebug> 15 #include <QDir> 16 #include <QFile> 17 18 #include <KIconLoader> 19 20 #include "settings.h" 21 #include "defaultvariablemodel.h" 22 23 using ScilabPlotResult = Cantor::ImageResult; 24 ScilabExpression(Cantor::Session * session,bool internal)25ScilabExpression::ScilabExpression( Cantor::Session* session, bool internal ) : Cantor::Expression(session, internal), 26 m_finished(false), 27 m_plotPending(false) 28 { 29 qDebug() << "ScilabExpression constructor"; 30 } 31 evaluate()32void ScilabExpression::evaluate() 33 { 34 if((ScilabSettings::integratePlots()) && (command().contains(QLatin1String("plot")))){ 35 36 qDebug() << "Preparing export figures property"; 37 38 QString exportCommand; 39 40 QStringList commandList = command().split(QLatin1String("\n")); 41 42 for(int count = 0; count < commandList.size(); count++){ 43 44 if(commandList.at(count).toLocal8Bit().contains("plot")){ 45 46 exportCommand = QString::fromLatin1("\nxs2png(gcf(), 'cantor-export-scilab-figure-%1.png');\ndelete(gcf());").arg(qrand()); 47 48 commandList[count].append(exportCommand); 49 50 exportCommand.clear(); 51 } 52 53 qDebug() << "Command " << count << ": " << commandList.at(count).toLocal8Bit().constData(); 54 } 55 56 QString newCommand = commandList.join(QLatin1String("\n")); 57 newCommand.prepend(QLatin1String("clf();\n")); 58 newCommand.append(QLatin1String("\n")); 59 60 this->setCommand(newCommand); 61 62 qDebug() << "New Command " << command(); 63 64 } 65 66 session()->enqueueExpression(this); 67 } 68 parseOutput(QString output)69void ScilabExpression::parseOutput(QString output) 70 { 71 qDebug() << "output: " << output; 72 const QStringList lines = output.split(QLatin1String("\n")); 73 bool isPrefixLines = true; 74 for (const QString& line : lines) 75 { 76 if (isPrefixLines && line.isEmpty()) 77 continue; 78 79 m_output += line + QLatin1String("\n"); 80 isPrefixLines = false; 81 } 82 83 if (!m_output.simplified().isEmpty()) 84 setResult(new Cantor::TextResult(m_output)); 85 86 evalFinished(); 87 setStatus(Cantor::Expression::Done); 88 } 89 parseError(QString error)90void ScilabExpression::parseError(QString error) 91 { 92 qDebug() << "error" << error; 93 94 setErrorMessage(error); 95 96 evalFinished(); 97 setStatus(Cantor::Expression::Error); 98 } 99 parsePlotFile(QString filename)100void ScilabExpression::parsePlotFile(QString filename) 101 { 102 qDebug() << "parsePlotFile"; 103 104 qDebug() << "ScilabExpression::parsePlotFile: " << filename; 105 106 setResult(new ScilabPlotResult(QUrl::fromLocalFile(filename))); 107 108 setPlotPending(false); 109 110 if (m_finished){ 111 qDebug() << "ScilabExpression::parsePlotFile: done"; 112 setStatus(Done); 113 } 114 } 115 interrupt()116void ScilabExpression::interrupt() 117 { 118 qDebug()<<"interruptinging command"; 119 setStatus(Cantor::Expression::Interrupted); 120 } 121 evalFinished()122void ScilabExpression::evalFinished() 123 { 124 qDebug()<<"evaluation finished"; 125 126 foreach (const QString& line, m_output.simplified().split(QLatin1Char('\n'), QString::SkipEmptyParts)){ 127 if (m_output.contains(QLatin1Char('='))){ 128 129 qDebug() << line; 130 131 QStringList parts = line.split(QLatin1Char('=')); 132 133 if (parts.size() >= 2){ 134 Cantor::DefaultVariableModel* model = dynamic_cast<Cantor::DefaultVariableModel*>(session()->variableModel()); 135 136 if (model){ 137 model->addVariable(parts.first().trimmed(), parts.last().trimmed()); 138 } 139 } 140 } 141 } 142 } 143 setPlotPending(bool plot)144void ScilabExpression::setPlotPending(bool plot) 145 { 146 m_plotPending = plot; 147 } 148