MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow), m_scene(new QGraphicsScene), m_turtleGraphics(new TurtleCanvasGraphicsItem), m_cmds(m_turtleGraphics), m_prefsDialog(new PreferencesDialog(this)), m_aboutDialog(new AboutDialog(this)), m_canvasSaveOptionsDialog(new CanvasSaveOptionsDialog(this)), m_settings("settings.ini") { ui->setupUi(this); m_scene->addItem(m_turtleGraphics); ui->graphicsView->setScene(m_scene); ui->graphicsView->centerOn(0.0, 0.0); // Add the graphics view actions QAction* centerAction = new QAction("&Center View", NULL); QAction* clearAction = new QAction("C&lear Canvas", NULL); ui->graphicsView->addAction(centerAction); ui->graphicsView->addAction(clearAction); connect(centerAction, SIGNAL(triggered()), this, SLOT(centerGraphicsScene())); connect(clearAction, SIGNAL(triggered()), this, SLOT(clearCanvas())); ui->graphicsView->setContextMenuPolicy(Qt::ActionsContextMenu); ui->errorMessagesTextEdit->setTextColor(Qt::red); // These buttons are only enabled while a script is running. ui->haltButton->setEnabled(false); ui->pauseButton->setEnabled(false); ui->resumeButton->setEnabled(false); // Messages dock is hidden by default. ui->messagesDockWidget->hide(); connect(m_turtleGraphics, SIGNAL(canvasResized()), this, SLOT(resizeGraphicsScene())); connect(ui->runButton, SIGNAL(clicked()), this, SLOT(runScript())); connect(ui->haltButton, SIGNAL(clicked()), this, SLOT(haltScript())); connect(ui->pauseButton, SIGNAL(clicked()), this, SLOT(pauseScript())); connect(ui->resumeButton, SIGNAL(clicked()), this, SLOT(resumeScript())); connect(ui->action_Open_Script, SIGNAL(triggered()), this, SLOT(loadScript())); connect(ui->action_Save_Script, SIGNAL(triggered()), this, SLOT(saveScript())); connect(ui->action_Save_Canvas, SIGNAL(triggered()), this, SLOT(saveCanvas())); connect(ui->action_Preferences, SIGNAL(triggered()), m_prefsDialog, SLOT(show())); connect(ui->action_About, SIGNAL(triggered()), m_aboutDialog, SLOT(show())); connect(ui->action_Errors, SIGNAL(triggered(bool)), this, SLOT(showErrors())); connect(ui->action_Script_Output, SIGNAL(triggered(bool)), this, SLOT(showScriptOutputs())); connect(m_prefsDialog, SIGNAL(rejected()), this, SLOT(loadPreferences())); connect(m_prefsDialog, SIGNAL(accepted()), this, SLOT(applyPreferences())); connect(m_prefsDialog, SIGNAL(accepted()), this, SLOT(savePreferences())); connect(&m_cmds, SIGNAL(scriptError(QString)), this, SLOT(showScriptError(QString)), Qt::QueuedConnection); connect(&m_cmds, SIGNAL(scriptMessageReceived()), this, SLOT(showScriptOutput()), Qt::QueuedConnection); loadPreferences(); applyPreferences(); m_cmds.start(); m_cmds.setRequirePaths(""); for (const QString& path : m_settings.requirePaths()) { m_cmds.addRequirePath(path); } for (const QString& filename : m_settings.startupScripts()) { m_cmds.runScriptFile(filename); } // Don't connect this until all the startup scripts have run // to prevent the error messages box from being cleared by successful scripts. connect(&m_cmds, SIGNAL(scriptFinished(bool)), this, SLOT(scriptFinished(bool)), Qt::QueuedConnection); }
bool startDialog::compileScript(const char *scriptFile, const char *editorWorkingPath) { ndxml_root xmlScript; ndxml_initroot(&xmlScript); if (-1 == ndxml_load_ex(scriptFile, &xmlScript, apoEditorSetting::getInstant()->m_encodeName.c_str())) { return false; } const char*inFile = scriptFile; const char *outFile = getScriptSetting(&xmlScript, "out_file"); if (!outFile){ nd_logerror("compile %s error !!!\nMaybe file is destroyed\n", scriptFile); return false; } //get out file absolute path std::string curPath = nd_getcwd(); char outFilePath[ND_FILE_PATH_SIZE]; if (!nd_getpath(scriptFile, outFilePath, sizeof(outFilePath))) { nd_logerror("get out file path error 1\n"); return false; } if (-1 == nd_chdir(outFilePath)) { nd_logerror("get script file-path error 2\n"); return false; } if (!nd_absolute_filename(outFile, outFilePath, sizeof(outFilePath))) { nd_logerror("get out file path error 3\n"); nd_chdir(curPath.c_str()); return false; } nd_chdir(curPath.c_str()); outFile = outFilePath; // ---end get out file absolute path int outEncode = getScriptExpEncodeType(&xmlScript); bool withDebug = getScriptExpDebugInfo(&xmlScript); //std::string outPath = outFile; ndxml_destroy(&xmlScript); //outFile = outPath.c_str(); int orderType = ND_L_ENDIAN; const char *orderName = apoEditorSetting::getInstant()->getValueFromSetting("bin_data_byte_order"); if (orderName) { orderType = atoi(orderName); } LogicCompiler &lgcompile= *LogicCompiler::get_Instant(); if (!lgcompile.compileXml(inFile, outFile, outEncode, withDebug, orderType)) { const char *pFunc = lgcompile.m_cur_function.c_str(); const char *pStep = lgcompile.m_cur_step.c_str(); char func_name[256]; char step_name[256]; if (outEncode == E_SRC_CODE_GBK) { pFunc = nd_gbk_to_utf8(pFunc, func_name, sizeof(func_name)); pStep = nd_gbk_to_utf8(pStep, step_name, sizeof(step_name)); } nd_logerror("compile error file %s, function %s, step %s , stepindex %d\n", lgcompile.m_cur_file.c_str(), pFunc, pStep, lgcompile.m_cur_node_index); return false; } nd_logmsg("!!!!!!!!!!COMPILE %s success !!!!!!!!!!!\n begining run script...\n", scriptFile); ClientMsgHandler::ApoConnectScriptOwner apoOwner; LogicEngineRoot *scriptRoot = LogicEngineRoot::get_Instant(); nd_assert(scriptRoot); scriptRoot->setOutPutEncode(E_SRC_CODE_UTF_8); scriptRoot->setPrint(ND_LOG_WRAPPER_PRINT(startDialog), NULL); scriptRoot->getGlobalParser().setSimulate(true); //scriptRoot->getGlobalParser().setOwner(&apoOwner); if (0 != scriptRoot->LoadScript(outFile, &scriptRoot->getGlobalParser())){ WriteLog("load script error n"); LogicEngineRoot::destroy_Instant(); return false; } WriteLog("start run script...\n"); scriptRoot->setDftScriptModule(scriptRoot->getMainModuleName()); if (0 != scriptRoot->test()){ WriteLog("run script error\n"); const char *curErrNode = scriptRoot->getGlobalParser().getLastErrorNode(); if (curErrNode && *curErrNode) { showScriptError(scriptFile, curErrNode,editorWorkingPath); } LogicEngineRoot::destroy_Instant(); return false; } LogicEngineRoot::destroy_Instant(); nd_logmsg("!!!!!!!!!!!!!!!!!!!SCRIPT %s SUCCESS!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n",scriptFile); return true; }