void WebPage::evalStepScript(const QString &script){ evalScript(m_jsLib); evalScript(m_script); if(!script.isEmpty()){ yINFO(QString::fromLocal8Bit("处理脚本:%1").arg(script).toLocal8Bit().data()); evalScript(script); } }
void Scripting::changeWorkingDirectory() { auto value = getSettingsValue(PYTHON_WORKING_DIRECTORY); if (value.isNull()) { return; } auto workingDir = value.toString(); if (workingDir.isEmpty()) { return; } evalScript("import os"); evalScript(QString("os.chdir('%1')").arg(workingDir)); }
bool Scripting::isPluginOpen(const QString &pluginName) { return ( isPluginImported(pluginName) && evalScript(QString("'%1' in %2").arg(SCRIPTING_INSTANCE_KEY).arg(getPluginInContainerStr(pluginName)), Py_eval_input).toBool() && evalScript(QString("%1 != None").arg(getInstanceInContainerStr(pluginName)), Py_eval_input).toBool() ); }
bool Scripting::isPluginImported(const QString &pluginName) { return ( evalScript(QString("'%1' in %2").arg(pluginName).arg(getContainerStr()), Py_eval_input).toBool() && evalScript(QString("'%1' in %2").arg(SCRIPTING_IMPORT_KEY).arg(getPluginInContainerStr(pluginName)), Py_eval_input).toBool() && evalScript(QString("%1 != None").arg(getImportInContainerStr(pluginName)), Py_eval_input).toBool() ); }
bool Scripting::importPlugin(const QString &pluginName, bool isQuiet) { auto actionStr = "import"; if (isPluginImported(pluginName)) { return true; } evalScript(QString("%1 = {}").arg(getPluginInContainerStr(pluginName))); evalScript(QString("import %1").arg(pluginName)); if (!evalScript(QString("'%1' in sys.modules").arg(pluginName), Py_eval_input).toBool()) { return pluginActionError(actionStr, pluginName, "import error", isQuiet); } evalScript(QString("%1 = %2; del %2").arg(getImportInContainerStr(pluginName)).arg(pluginName)); return true; }
void Scripting::addPythonPath(const QString &path) { if (_customPathDirs.contains(path)) { return; } _customPathDirs.append(path); evalScript(QString("sys.path.append('%1')").arg(path)); }
void Scripting::runFile(const QString &filename) { QFile pyFile(filename); pyFile.open(QIODevice::ReadOnly); QString s; QTextStream textStream(&pyFile); s.append(textStream.readAll()); pyFile.close(); evalScript(s, Py_file_input); }
bool Scripting::removePluginImport(const QString &pluginName, bool isQuiet) { auto actionStr = "remove import"; if (!isPluginImported(pluginName)) { return true; } evalScript(QString("%1 = None").arg(getImportInContainerStr(pluginName))); if (isPluginImported(pluginName)) { return pluginActionError(actionStr, pluginName, "still imported", isQuiet); } return true; }
bool Scripting::showPlugin(const QString &pluginName, bool isQuiet) { auto actionStr = "show"; auto instanceInContainer = getInstanceInContainerStr(pluginName); if (!isPluginOpen(pluginName)) { return pluginActionError(actionStr, pluginName, "not open", isQuiet); } if (!isPluginVisible(pluginName)) { evalScript(QString("%1.show()").arg(instanceInContainer)); if (!isPluginVisible(pluginName)) { return pluginActionError(actionStr, pluginName, "still not visible", isQuiet); } } if (!isPluginActive(pluginName)) { evalScript(QString("%1.activateWindow()").arg(instanceInContainer)); if (!isPluginActive(pluginName)) { return pluginActionError(actionStr, pluginName, "still not active", isQuiet); } } return true; }
bool Scripting::removePluginInstance(const QString &pluginName, bool isQuiet) { auto actionStr = "remove instance"; if (!isPluginOpen(pluginName)) { return true; } evalScript(QString("%1 = None").arg(getInstanceInContainerStr(pluginName))); if (isPluginOpen(pluginName)) { return pluginActionError(actionStr, pluginName, "still open", isQuiet); } return true; }
bool Scripting::closePlugin(const QString &pluginName, bool isQuiet) { auto actionStr = "close"; if (!isPluginOpen(pluginName)) { return true; } if (!evalScript(QString("%1.close()").arg(getInstanceInContainerStr(pluginName)), Py_eval_input).toBool()) { return pluginActionError(actionStr, pluginName, "close failed", isQuiet); } if (!removePluginInstance(pluginName, isQuiet)) { return pluginActionError(actionStr, pluginName, "instance not removed", isQuiet); } return true; }
bool Scripting::hidePlugin(const QString &pluginName, bool isQuiet) { auto actionStr = "hide"; if (!isPluginOpen(pluginName)) { return pluginActionError(actionStr, pluginName, "not open", isQuiet); } if (!isPluginVisible(pluginName)) { return true; } evalScript(QString("%1.hide()").arg(getInstanceInContainerStr(pluginName))); if (isPluginVisible(pluginName)) { return pluginActionError(actionStr, pluginName, "still visible", isQuiet); } return true; }
bool Scripting::instantiatePlugin(const QString &pluginName, bool isQuiet) { auto actionStr = "instanstiate"; if (!isPluginImported(pluginName)) { return pluginActionError(actionStr, pluginName, "not imported", isQuiet); } if (isPluginOpen(pluginName)) { return true; } evalScript(QString("%1.main_class()").arg(getImportInContainerStr(pluginName))); if (!isPluginOpen(pluginName)) { return pluginActionError(actionStr, pluginName, "still not open", isQuiet); } return true; }
bool Scripting::reloadPlugin(const QString &pluginName, bool isQuiet) { auto actionStr = "reload"; if (!closePlugin(pluginName, isQuiet)) { return pluginActionError(actionStr, pluginName, "close failed", isQuiet); } if (isPluginImported(pluginName)) { if (!evalScript(QString("reload(%1) != None").arg(getImportInContainerStr(pluginName)), Py_eval_input).toBool()) { return pluginActionError(actionStr, pluginName, "reload failed", isQuiet); } } if (!openPlugin(pluginName, isQuiet)) { return pluginActionError(actionStr, pluginName, "open failed", isQuiet); } return true; }
Scripting::Scripting() : _ctx{[](){ PythonQtInit(); return PythonQt::self()->getMainModule(); }()} { state->scripting = this; PythonQt::self()->registerClass(&EmitOnCtorDtor::staticMetaObject); evalScript("import sys"); evalScript("sys.argv = ['']"); // <- this is needed to import the ipython module from the site-package #ifdef Q_OS_OSX // as ipython does not export it's sys paths after the installation we refer to that site-package evalScript("sys.path.append('/Library/Python/2.7/site-packages')"); #endif PythonQt::self()->createModuleFromScript(SCRIPTING_KNOSSOS_MODULE); evalScript(QString("import %1").arg(SCRIPTING_KNOSSOS_MODULE)); evalScript(QString("%1.%2 = {}").arg(SCRIPTING_KNOSSOS_MODULE).arg(SCRIPTING_PLUGIN_CONTAINER)); addObject("signalRelay", state->signalRelay); addObject("knossos", &pythonProxy); addObject("scripting", this); addObject("segmentation", &segmentationProxy); addObject("skeleton", &skeletonProxy); addObject("knossos_global_viewer", state->viewer); addObject("knossos_global_mainwindow", state->viewer->window); addObject("knossos_global_skeletonizer", &Skeletonizer::singleton()); addObject("knossos_global_segmentation", &Segmentation::singleton()); addObject("knossos_global_loader", &Loader::Controller::singleton()); addVariable("GL_POINTS", GL_POINTS); addVariable("GL_LINES", GL_LINES); addVariable("GL_LINE_STRIP", GL_LINE_STRIP); addVariable("GL_LINE_LOOP", GL_LINE_LOOP); addVariable("GL_TRIANGLES", GL_TRIANGLES); addVariable("GL_TRIANGLES_STRIP", GL_TRIANGLE_STRIP); addVariable("GL_TRIANGLE_FAN", GL_TRIANGLE_FAN); addVariable("GL_QUADS", GL_QUADS); addVariable("GL_QUAD_STRIP", GL_QUAD_STRIP); addVariable("GL_POLYGON", GL_POLYGON); addWidgets(); auto makeDecorator = [](QObject * decorator, const char * typeName){ // PythonQt tries to reparent the decorators, we do their missing work of pushing it into their thread first // due to the QObject handling they also get deleted by PythonQt then decorator->moveToThread(PythonQt::self()->thread()); PythonQt::self()->addDecorators(decorator); PythonQt::self()->registerCPPClass(typeName, "", "internal"); }; makeDecorator(new CoordinateDecorator, "Coordinate"); makeDecorator(new FloatCoordinateDecorator, "floatCoordinate"); makeDecorator(new NodeListDecorator, "Node"); makeDecorator(new SegmentListDecorator, "Segment"); makeDecorator(new TreeListDecorator, "Tree"); createDefaultPluginDir(); addPythonPath(getPluginDir()); addPresetCustomPythonPaths(); #ifdef Q_OS_LINUX //in linux there’s an explicit symlink to a python 2 binary _ctx.evalFile(QString("sys.path.append('%1')").arg("./python2")); #else _ctx.evalFile(QString("sys.path.append('%1')").arg("./python")); #endif changeWorkingDirectory(); executeResourceStartup(); executeFromUserDirectory(); QObject::connect(&state->scripting->pythonProxy, &PythonProxy::viewport_snapshot, &state->viewer->window->widgetContainer.snapshotWidget, &SnapshotWidget::snapshotRequest); state->viewer->window->widgetContainer.pythonInterpreterWidget.startConsole(); }
bool Scripting::isPluginActive(const QString &pluginName) { return evalScript(QString("%1.isActiveWindow").arg(getInstanceInContainerStr(pluginName)), Py_eval_input).toBool(); }
bool Scripting::isPluginVisible(const QString &pluginName) { if (!isPluginOpen(pluginName)) { return false; } return evalScript(QString("%1.isVisible()").arg(getInstanceInContainerStr(pluginName)), Py_eval_input).toBool(); }
void Scripting::moveSymbolIntoKnossosModule(const QString& name) { evalScript(QString("%1.%2 = %2; del %2").arg(SCRIPTING_KNOSSOS_MODULE).arg(name)); }