void ScriptForm::accept() { m_script = textEdit->toPlainText(); QScriptEngine javaScriptParser; int errorLineNumber = 0; QString errorMessage; #if QT_VERSION >= 0x040500 QScriptSyntaxCheckResult syntaxResult = javaScriptParser.checkSyntax(m_script); if (syntaxResult.state() != QScriptSyntaxCheckResult::Valid) { errorLineNumber = syntaxResult.errorLineNumber(); errorMessage = syntaxResult.errorMessage(); if (errorMessage.isEmpty()) errorMessage = tr("Syntax Error"); } #else QScriptValue value(&javaScriptParser, 0); javaScriptParser.globalObject().setProperty("cellRow", value); javaScriptParser.globalObject().setProperty("cellColumn", value); javaScriptParser.globalObject().setProperty("cellValue", value); QScriptValue result = javaScriptParser.evaluate(m_script); if (javaScriptParser.hasUncaughtException()) { errorLineNumber = javaScriptParser .uncaughtExceptionLineNumber(); errorMessage = javaScriptParser.uncaughtException() .toString(); } #endif if (!errorMessage.isEmpty()) { AQP::warning(this, tr("Error"), tr("Invalid script on line %1:\n%2") .arg(errorLineNumber).arg(errorMessage)); QTextCursor cursor = textEdit->textCursor(); cursor.clearSelection(); cursor.movePosition(QTextCursor::Start); cursor.movePosition(QTextCursor::Down, QTextCursor::MoveAnchor, errorLineNumber - 1); cursor.select(QTextCursor::LineUnderCursor); textEdit->setTextCursor(cursor); } else QDialog::accept(); }
void Core::readyRead() { QTcpSocket *socket = (QTcpSocket *) sender(); sConStore conn = mCoreClients[socket]; //Плохо, если кусок будет слишком большой может и не влезть //но так проще. QByteArray raw = socket->readAll(); QJsonDocument doc = QJsonDocument::fromJson(raw); QJsonObject obj = doc.object(); QJsonObject retVal; if (obj["name"].toString() == "eval") { QString data = obj["data"].toString(); //Для вычисление используем qsript //чтоб не писать свой парсер мат строк QScriptEngine myEngine; bool historyReplaceFail = false; //Заменяем все H\d+ На значения из истории QRegExp rx("H(\\d+)"); int pos = 0; while ((pos = rx.indexIn(data)) != -1 && !historyReplaceFail) { if (conn->history.contains(rx.cap(1).toInt())) { QString value = conn->history.value(rx.cap(1).toInt()); data.replace(pos, rx.matchedLength(), value); pos += value.length(); } else historyReplaceFail = true; } QScriptSyntaxCheckResult res = myEngine.checkSyntax(data); if (historyReplaceFail) { error("History replace error "+data); retVal["name"] = "error"; retVal["text"] = "History replace error"; } else if (res.state() != QScriptSyntaxCheckResult::Valid) { error("error expression "+data); retVal["name"] = "error"; retVal["text"] = "Error string"; } else { QJsonArray jsonArray; QJsonObject eResult; QString result = myEngine.evaluate(data).toString(); int count = conn->addEvalResult(result); log(QString("Eval %1 result is %2").arg(data, result)); retVal["name"] = "eval_results"; eResult["num"] = count; eResult["result"] = result; jsonArray.append(eResult); retVal["results"] = jsonArray; } } else if (obj["name"].toString() == "get_history") { log("Get history request"); QJsonArray jsonArray; foreach (int num, conn->history.keys()) { QJsonObject result; result["num"] = num; result["result"] = conn->history[num]; jsonArray.append(result); } retVal["name"] = "eval_results"; retVal["results"] = jsonArray; }
int main( int argc, char ** argv ) { QApplication::setColorSpec( QApplication::CustomColor ); QApplication a( argc, argv ); a.setApplicationVersion( APP_VERSION ); QSplashScreen* splash = new QSplashScreen; splash->setPixmap( QPixmap(":/icons/tonatiuhsplash.png") ); splash->show(); Qt::Alignment topRight = Qt::AlignRight | Qt::AlignTop; splash->showMessage(QObject::tr("Loading libraries..."), topRight, Qt::black); QApplication::addLibraryPath( QApplication::applicationDirPath() + QDir::separator() + "marble" ); SoQt::init( (QWidget *) NULL ); //MFVec2::initClass(); UserMField::initClass(); UserSField::initClass(); TSceneKit::initClass(); TMaterial::initClass(); TDefaultMaterial::initClass(); TSeparatorKit::initClass(); TShape::initClass(); TCube::initClass(); TLightShape::initClass(); TShapeKit::initClass(); TAnalyzerKit::initClass(); TAnalyzerResultKit::initClass(); TAnalyzerParameter::initClass(); TAnalyzerResult::initClass(); TAnalyzerLevel::initClass(); TSquare::initClass(); TLightKit::initClass(); TSunShape::initClass(); TDefaultSunShape::initClass(); TTracker::initClass(); TTrackerForAiming::initClass(); TDefaultTracker::initClass(); TSceneTracker::initClass(); GraphicRootTracker::initClass(); TTransmissivity::initClass(); TDefaultTransmissivity::initClass(); splash->showMessage( QObject::tr("Setting up the main window..."), topRight, Qt::black ); QDir pluginsDirectory( qApp->applicationDirPath() ); pluginsDirectory.cd( "plugins" ); PluginManager pluginManager; pluginManager.LoadAvailablePlugins( pluginsDirectory ); int exit; if( argc > 1 ) { QString tonatiuhFile = argv[1]; QFileInfo fileInfo( tonatiuhFile ); if( fileInfo.completeSuffix() == QLatin1String( "tnhs") ) { QString fileName( argv[1] ); QFileInfo fileInfo( fileName ); QDir testDirectory( fileInfo.absolutePath() ); testDirectory.cd( "." ); QScriptEngine* interpreter = new QScriptEngine; qScriptRegisterSequenceMetaType<QVector<QVariant> >(interpreter); MainWindow* mw = new MainWindow( QLatin1String("") ); mw->SetPluginManager( &pluginManager ); QScriptValue tonatiuh = interpreter->newQObject( mw ); interpreter->globalObject().setProperty( "tonatiuh", tonatiuh ); QFile scriptFile( fileName ); if( !scriptFile.open( QIODevice::ReadOnly) ) { QString errorMessage = QString( "Cannot open file %1." ).arg( fileName ); std::cerr<<errorMessage.toStdString()<<std::endl; } QTextStream in( &scriptFile ); QString program = in.readAll(); scriptFile.close(); QScriptSyntaxCheckResult checkResult = interpreter->checkSyntax( program ); if( checkResult.state() != QScriptSyntaxCheckResult::Valid ) { QString errorMessage = QString( "Script Syntaxis Error.\n" "Line: %1. %2" ).arg( QString::number( checkResult.errorLineNumber() ), checkResult.errorMessage () ); std::cerr<<errorMessage.toStdString()<<std::endl; return -1; } QScriptValue result = interpreter->evaluate( program ); if( result.isError () ) { QScriptValue lineNumber = result.property( "lineNumber"); QString errorMessage = QString( "Script Execution Error.\nLine %1. %2" ).arg( QString::number( lineNumber.toNumber() ), result.toString() ); std::cerr<<errorMessage.toStdString()<<std::endl; return -1; } delete mw; delete interpreter; exit = 0; } else { MainWindow* mw = new MainWindow( tonatiuhFile ); mw->SetPluginManager( &pluginManager ); mw->show(); splash->finish( mw ); delete splash; exit = a.exec(); delete mw; } } else { MainWindow* mw = new MainWindow(""); mw->SetPluginManager( &pluginManager ); mw->show(); splash->finish( mw ); delete splash; exit = a.exec(); delete mw; } return exit; }
void ScriptParametersDialog::accept() { int rowCount = ui->parameterTable->rowCount(); QScriptEngine scriptEngine; mScript->removeAllParameters(); for(int row = 0; row < rowCount; ++row) { QWidget *widget = ui->parameterTable->cellWidget(row, 0); if(!widget) continue; QLineEdit *nameLineEdit = qobject_cast<QLineEdit *>(widget); widget = ui->parameterTable->cellWidget(row, 1); if(!widget) continue; if(nameLineEdit->text().isEmpty()) continue; QRegExp nameRegExp("[a-z_][a-z0-9_]*", Qt::CaseInsensitive); if(!nameRegExp.exactMatch(nameLineEdit->text())) { QMessageBox::warning(this, tr("Script parameter error"), tr("Incorrect parameter name \"%1\".") .arg(nameLineEdit->text())); nameLineEdit->setFocus(); return; } bool isCode = false; QString value; switch(mParameterTypes.at(row)) { case ActionTools::ScriptParameter::Text: { ActionTools::CodeLineEdit *valueWidget = qobject_cast<ActionTools::CodeLineEdit *>(widget); isCode = valueWidget->isCode(); value = valueWidget->text(); } break; case ActionTools::ScriptParameter::Number: { ActionTools::CodeSpinBox *valueWidget = qobject_cast<ActionTools::CodeSpinBox *>(widget); isCode = valueWidget->isCode(); value = valueWidget->text(); } break; case ActionTools::ScriptParameter::Window: { ActionTools::WindowEdit *valueWidget = qobject_cast<ActionTools::WindowEdit *>(widget); isCode = valueWidget->isCode(); value = valueWidget->text(); } break; case ActionTools::ScriptParameter::File: { ActionTools::FileEdit *valueWidget = qobject_cast<ActionTools::FileEdit *>(widget); isCode = valueWidget->isCode(); value = valueWidget->text(); } break; case ActionTools::ScriptParameter::Line: { ActionTools::LineComboBox *valueWidget = qobject_cast<ActionTools::LineComboBox *>(widget); isCode = valueWidget->isCode(); value = valueWidget->codeLineEdit()->text(); } break; } if(isCode) { QScriptSyntaxCheckResult result = scriptEngine.checkSyntax(value); if(result.state() != QScriptSyntaxCheckResult::Valid) { QMessageBox::warning(this, tr("Script parameter error"), tr("The script parameter named \"%1\" contains an error: \"%2\", please correct it.") .arg(nameLineEdit->text()) .arg(result.errorMessage())); widget->setFocus(); return; } } mScript->addParameter(ActionTools::ScriptParameter(nameLineEdit->text(), value, isCode, mParameterTypes.at(row))); } QDialog::accept(); }
void NewExperimentSettingsDialog::FormulaCheck() { if (ui->tFormulaInput->toPlainText()=="") { QMessageBox::about(this,"Ошибка", QString("<p><h3>Отсутствует формула</h3></p>")); return; } if (haswronWaribles) { QMessageBox::about(this,"Ошибка", QString("<p><h3>Введёная формула содержит неверные имена переменных</h3></p>")+ QString("<p><b> Описание ошибки: <i>Проверьте синтаксис или воспользуйтесь справкой</i></b></p>")+ QString("<p><b>Строка: 1")+ QString("; Столбец: ")+QString::number(wrongpos)+QString("</p>") + QString(this->EvaluateString.left(wrongpos-1)+"<font color=red>"+this->EvaluateString.at(wrongpos-1)+"</font>"+this->EvaluateString.right(this->EvaluateString.length()-wrongpos))); return; } if (!allowPsevdonamesForVaribles) { QVector<int> Xnumbers; for (int i=0;i<FactorNames.count();i++) { QString tmp= FactorNames.at(i); tmp=tmp.toLower().remove("x"); Xnumbers.append(tmp.toInt()); } qSort(Xnumbers); if (Xnumbers.at(0)!=1) { QMessageBox::about(this,"Ошибка",QString("<p><h3>Введёная формула содержит не все переменные</h3></p>")+ QString("<p><b> Описание ошибки: <i>Отсутствует переменная <font color=red>x1</font></i></b></p>")); return; } for (int i=0;i<Xnumbers.count()-1;i++) { if (Xnumbers.at(i+1)>data.FactNum) { QMessageBox::about(this,"Ошибка",QString("<p><h3>Введённая формула содержит переменные, отсутствующие в настройках плана эксперимента</h3></p>")+ QString("<p><b> Описание ошибки: <i>Отсутствует переменная <font color=red>x"+QString::number(Xnumbers.at(i)+1)+"</font></i></b></p>")); return; } if (Xnumbers.at(i)!=Xnumbers.at(i+1)-1) { QMessageBox::about(this,"Ошибка",QString("<p><h3>Введёная формула содержит не все переменные</h3></p>")+ QString("<p><b> Описание ошибки: <i>Отсутствует переменная <font color=red>x"+QString::number(Xnumbers.at(i)+1)+"</font></i></b></p>")); return; } }// int FactsInFormula=GetExpressionFactorNames(this->EvaluateString).count(); if (data.FactNum>FactsInFormula) { QMessageBox::about(this,"Ошибка",QString("<p><h3>Не все переменные присутствуют в функциональной зависимости</h3></p>")); return; } } QScriptEngine RunScript; QScriptSyntaxCheckResult ErrVal=RunScript.checkSyntax(this->EvaluateString); // Проверка синтаксиса введёной функции if (ErrVal.state()== QScriptSyntaxCheckResult::Valid) { // syntax correct // Проверка количества введёных факторов if (this->data.FactNum<2) { QMessageBox::about(this,"Ошибка",QString("<p><h3>Введёная формула содержит менее двух переменных</h3></p>")+ QString("<p><b> Описание ошибки: <i>Данная программа разработана для работы с формулами, содержащими более одной переменной</i></b></p>")); } else if (!RunScript.canEvaluate(this->EvaluateString)) { QMessageBox::about(this,"Ошибка",QString("<p><h3>Невозможно вычислить введёную формулу</h3></p>")+ QString("<p><b> Описание ошибки: <i>Проверьте синтаксис или воспользуйтесь справкой</i></b></p>")); } else if (saveFactValues()) { close(); } } else { // syntax not correct QString tmp_formula = this->EvaluateString; int ErrColum=0,ErrLine=0; if (ErrVal.errorColumnNumber()<1) ErrColum=1; else ErrColum= ErrVal.errorColumnNumber(); if (ErrVal.errorLineNumber()<1) ErrLine=0; else ErrLine=ErrVal.errorLineNumber(); QMessageBox::about(this,"Ошибка", QString("<p><h3>Введёная формула содержит ошибки</h3></p>")+ QString("<p><b> Описание ошибки: <i>"+tr(ErrVal.errorMessage().toLatin1())+"</i></b></p>")+ QString("<p><b>Строка: ")+QString::number(ErrLine)+ QString("; Столбец: ")+QString::number(ErrColum)+QString("</p>")+ QString(tmp_formula.left(ErrColum-1)+"<font color=red>"+tmp_formula.at(ErrColum-1)+"</font>"+tmp_formula.right(tmp_formula.length()-ErrColum))); } }