示例#1
0
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();
}
示例#2
0
文件: core.cpp 项目: ice2heart/calc
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;
	}
示例#3
0
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)));
    }

}