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)25 ScilabExpression::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()32 void 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)69 void 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)90 void 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)100 void 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()116 void ScilabExpression::interrupt()
117 {
118     qDebug()<<"interruptinging command";
119     setStatus(Cantor::Expression::Interrupted);
120 }
121 
evalFinished()122 void 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)144 void ScilabExpression::setPlotPending(bool plot)
145 {
146     m_plotPending = plot;
147 }
148