QString MyLogWidget::formatLine(const QString& text) { QRegularExpression re("^(PID:) ([0-9]+), (time:) ([0-9.]+), (.*)"); QRegularExpressionMatch match = re.match(text); if (match.hasMatch()) { QString out = "<span style=\"color: grey;\">" + match.captured(1) + " <b>" + match.captured(2) + "</b></span>, " + "<span style=\"color: orange;\">" + match.captured(3) + " <b>" + match.captured(4) + "</b></span>, "; QRegularExpression reType("^(Debug|Warning|Critical|Error|NetRender|Gamepad)(.*)"); QRegularExpressionMatch matchType = reType.match(match.captured(5)); if (matchType.hasMatch()) { QString color = "black"; if(matchType.captured(1) == "Debug") color = "green"; else if(matchType.captured(1) == "Warning") color = "orange"; else if(matchType.captured(1) == "Critical") color = "red"; else if(matchType.captured(1) == "Error") color = "red"; else if(matchType.captured(1) == "NetRender") color = "darkblue"; else if(matchType.captured(1) == "Gamepad") color = "purple"; out += "<span style=\"color: " + color + ";\">" + matchType.captured(1) + "<b>" + matchType.captured(2) + "</b></span>"; } else { out += "<span style=\"color: black;\"><b>" + match.captured(5) + "</b></span>"; } return out; } else { return text; } }
QStringList QgsDelimitedTextProvider::readCsvtFieldTypes( QString filename, QString *message ) { // Look for a file with the same name as the data file, but an extra 't' or 'T' at the end QStringList types; QFileInfo csvtInfo( filename + 't' ); if ( ! csvtInfo.exists() ) csvtInfo.setFile( filename + 'T' ); if ( ! csvtInfo.exists() ) return types; QFile csvtFile( csvtInfo.filePath() ); if ( ! csvtFile.open( QIODevice::ReadOnly ) ) return types; // If anything goes wrong here, just ignore it, as the file // is not valid, so just ignore any exceptions. // For it to be valid, there must be just one non blank line at the beginning of the // file. QString strTypeList; try { QTextStream csvtStream( &csvtFile ); strTypeList = csvtStream.readLine(); if ( strTypeList.isEmpty() ) return types; QString extra = csvtStream.readLine(); while ( ! extra.isNull() ) { if ( ! extra.isEmpty() ) return types; extra = csvtStream.readLine(); } } catch ( ... ) { return types; } csvtFile.close(); // Is the type string valid? // This is a slightly generous regular expression in that it allows spaces and unquoted field types // not allowed in OGR CSVT files. Also doesn't care if int and string fields have strTypeList = strTypeList.toLower(); QRegExp reTypeList( "^(?:\\s*(\\\"?)(?:integer|real|double|long|longlong|int8|string|date|datetime|time)(?:\\(\\d+(?:\\.\\d+)?\\))?\\1\\s*(?:,|$))+" ); if ( ! reTypeList.exactMatch( strTypeList ) ) { // Looks like this was supposed to be a CSVT file, so report bad formatted string if ( message ) { *message = tr( "File type string in %1 is not correctly formatted" ).arg( csvtInfo.fileName() ); } return types; } // All good, so pull out the types from the string. Currently only returning integer, real, and string types QgsDebugMsg( QString( "Reading field types from %1" ).arg( csvtInfo.fileName() ) ); QgsDebugMsg( QString( "Field type string: %1" ).arg( strTypeList ) ); int pos = 0; QRegExp reType( "(integer|real|string|date|datetime|time)" ); while (( pos = reType.indexIn( strTypeList, pos ) ) != -1 ) { QgsDebugMsg( QString( "Found type: %1" ).arg( reType.cap( 1 ) ) ); types << reType.cap( 1 ); pos += reType.matchedLength(); } if ( message ) { // Would be a useful info message, but don't want dialog to pop up every time... // *message=tr("Reading field types from %1").arg(csvtInfo.fileName()); } return types; }
void cCommandLineInterface::ReadCLI (void) { bool checkParse = true; bool settingsSpecified = false; QTextStream out(stdout); // show input help only if(cliData.showInputHelp) { out << QObject::tr("Mandelbulber also accepts an arbitrary number of input files\n" "These files can be of type:\n" ".fract File - An ordinary fractal file\n" ".fractlist File - A queue file, all entries inside the queue file will be added to the current queue\n" "Folder - if the specified argument is a folder all .fract files inside the folder will be added to the queue\n"); out.flush(); exit(0); } // list parameters only if(cliData.listParameters) { QList<QString> listOfParameters = gPar->GetListOfParameters(); out << cHeadless::colorize("\nList of main parameters:\n", cHeadless::ansiYellow, cHeadless::noExplicitColor, true); out << "KEY=VALUE\n"; for(int i = 0; i < listOfParameters.size(); i++) { QString parameterName = listOfParameters.at(i); QString defaultValue = gPar->GetDefault<QString>(parameterName); out << parameterName + "=" + defaultValue + "\n"; } QList<QString> listOfFractalParameters = gParFractal->at(0).GetListOfParameters(); out << cHeadless::colorize(QObject::tr("\nList of fractal parameters:\n"), cHeadless::ansiYellow, cHeadless::noExplicitColor, true); for(int i = 0; i < listOfFractalParameters.size(); i++) { QString parameterName = listOfFractalParameters.at(i); QString defaultValue = gParFractal->at(0).GetDefault<QString>(parameterName); out << parameterName + "=" + defaultValue + "\n"; } out.flush(); exit(0); } // check netrender server / client if(cliData.server) { int port = gPar->Get<int>("netrender_server_local_port"); if(cliData.portText != "") { port = cliData.portText.toInt(&checkParse); if(!checkParse || port <= 0){ cErrorMessage::showMessage(QObject::tr("Specified server port is invalid\n"), cErrorMessage::errorMessage); parser.showHelp(cliErrorServerInvalidPort); } gPar->Set("netrender_server_local_port", port); } cliData.nogui = true; systemData.noGui = true; gNetRender->SetServer(gPar->Get<int>("netrender_server_local_port")); QElapsedTimer timer; timer.start(); if(systemData.noGui) { out << QObject::tr("NetRender - Waiting for clients\n"); out.flush(); } while(timer.elapsed() < 5000) { gApplication->processEvents(); } } else if(cliData.host != "") { int port = gPar->Get<int>("netrender_client_remote_port"); gPar->Set("netrender_client_remote_address", cliData.host); if(cliData.portText != "") { port = cliData.portText.toInt(&checkParse); if(!checkParse || port <= 0){ cErrorMessage::showMessage(QObject::tr("Specified client port is invalid\n"), cErrorMessage::errorMessage); parser.showHelp(cliErrorClientInvalidPort); } gPar->Set("netrender_client_remote_port", port); } cliData.nogui = true; systemData.noGui = true; cliTODO = modeNetrender; return; } if(cliData.queue) { cliTODO = modeQueue; settingsSpecified = true; cliData.nogui = true; systemData.noGui = true; try { gQueue = new cQueue(gMainInterface, systemData.dataDirectory + "queue.fractlist", systemData.dataDirectory + "queue", NULL); } catch(QString &ex) { cErrorMessage::showMessage(QObject::tr("Cannot init queue: ") + ex, cErrorMessage::errorMessage); parser.showHelp(cliErrorQueueInit); } } else { if(args.size() > 0){ // file specified -> load it if(args.size() == 1 && QFileInfo(args[0]).suffix() != QString("fractlist") && !QDir(args[0]).exists()) { QString filename = args[0]; if(!QFile::exists(filename)) { // try to find settings in default settings path filename = systemData.dataDirectory + "settings" + QDir::separator() + filename; } if(QFile::exists(filename)) { cSettings parSettings(cSettings::formatFullText); parSettings.LoadFromFile(filename); parSettings.Decode(gPar, gParFractal, gAnimFrames, gKeyframes); settingsSpecified = true; systemData.lastSettingsFile = filename; } else { cErrorMessage::showMessage(QObject::tr("Cannot load file!\n"), cErrorMessage::errorMessage); qCritical() << "\nSetting file " << filename << " not found\n"; parser.showHelp(cliErrorLoadSettingsFile); } } else { // queue render cliTODO = modeQueue; cliData.nogui = true; systemData.noGui = true; try { gQueue = new cQueue(gMainInterface, systemData.dataDirectory + "queue.fractlist", systemData.dataDirectory + "queue", NULL); } catch(QString &ex) { cErrorMessage::showMessage(QObject::tr("Cannot init queue: ") + ex, cErrorMessage::errorMessage); parser.showHelp(cliErrorQueueInit); } for(int i = 0; i < args.size(); i++) { QString filename = args[i]; if(QDir(args[i]).exists()) { // specified input is a folder, load all fractal files contained in this folder gQueue->AppendFolder(filename); settingsSpecified = true; } else if(QFileInfo(filename).suffix() == QString("fractlist")) { // specified input is a queue list file, append all entries to the current queue gQueue->AppendList(filename); settingsSpecified = true; } else { // specified input can only be an ordinary fract file, try to append to queuelist gQueue->Append(filename); settingsSpecified = true; } } } } } // overwriting parameters if(cliData.overrideParametersText != "") { QStringList overrideParameters = cliData.overrideParametersText.split("#", QString::SkipEmptyParts); for(int i = 0; i < overrideParameters.size(); i++) { int fractalIndex = -1; QRegularExpression reType("^fractal([0-9]+)_(.*)$"); QRegularExpressionMatch matchType = reType.match(overrideParameters[i]); if (matchType.hasMatch()) { fractalIndex = matchType.captured(1).toInt() - 1; overrideParameters[i] = matchType.captured(2); } QStringList overrideParameter = overrideParameters[i].split(QRegExp("\\=")); if(overrideParameter.size() == 2) { if(fractalIndex >= 0 && fractalIndex < NUMBER_OF_FRACTALS) { gParFractal->at(fractalIndex).Set(overrideParameter[0].trimmed(), overrideParameter[1].trimmed()); } else { gPar->Set(overrideParameter[0].trimmed(), overrideParameter[1].trimmed()); } } } } // specified resolution if(cliData.resolution != "") { QStringList resolutionParameters = cliData.resolution.split(QRegExp("x")); if(resolutionParameters.size() == 2) { int xRes = resolutionParameters[0].toInt(&checkParse); int yRes = resolutionParameters[1].toInt(&checkParse); if(!checkParse || xRes <= 0 || yRes <= 0){ cErrorMessage::showMessage(QObject::tr("Specified resolution not valid\n" "both dimensions need to be > 0"), cErrorMessage::errorMessage); parser.showHelp(cliErrorResolutionInvalid); } gPar->Set("image_width", xRes); gPar->Set("image_height", yRes); } else{ cErrorMessage::showMessage(QObject::tr("Specified resolution not valid\n" "resolution has to be in the form WIDTHxHEIGHT"), cErrorMessage::errorMessage); parser.showHelp(cliErrorResolutionInvalid); } } // specified frames per keyframe if(cliData.fpkText != "") { int fpk = cliData.fpkText.toInt(&checkParse); if(!checkParse || fpk <= 0){ cErrorMessage::showMessage(QObject::tr("Specified frames per key not valid\n" "need to be > 0"), cErrorMessage::errorMessage); parser.showHelp(cliErrorFPKInvalid); } gPar->Set("frames_per_keyframe", fpk); } // specified image file format if(cliData.imageFileFormat != "") { QStringList allowedImageFileFormat; allowedImageFileFormat << "jpg" << "png" << "png16" << "png16alpha" << "exr"; if(!allowedImageFileFormat.contains(cliData.imageFileFormat)){ cErrorMessage::showMessage(QObject::tr("Specified imageFileFormat is not valid\n" "allowed formats are: ") + allowedImageFileFormat.join(", "), cErrorMessage::errorMessage); parser.showHelp(cliErrorImageFileFormatInvalid); } } else { cliData.imageFileFormat = "jpg"; } //flight animation if(cliData.flight) { if(gAnimFrames->GetNumberOfFrames() > 0) { cliTODO = modeFlight; cliData.nogui = true; systemData.noGui = true; } else { cErrorMessage::showMessage(QObject::tr("There are no flight animation frames in specified settings file"), cErrorMessage::errorMessage); parser.showHelp(cliErrorFlightNoFrames); } } //keyframe animation if(cliData.keyframe) { if(cliTODO == modeFlight) { cErrorMessage::showMessage(QObject::tr("You cannot render keyframe animation at the same time as flight animation"), cErrorMessage::errorMessage); } else { if(gKeyframes->GetNumberOfFrames() > 0) { cliTODO = modeKeyframe; cliData.nogui = true; systemData.noGui = true; } else { cErrorMessage::showMessage(QObject::tr("There are no keyframes in specified settings file"), cErrorMessage::errorMessage); parser.showHelp(cliErrorKeyframeNoFrames); } } } // start frame of animation if (cliData.startFrameText != "") { int startFrame = cliData.startFrameText.toInt(&checkParse); if (cliTODO == modeFlight) { if (startFrame <= gAnimFrames->GetNumberOfFrames()) { gPar->Set("flight_first_to_render", startFrame); } else { cErrorMessage::showMessage(QObject::tr("Animation has only %1 frames").arg(gAnimFrames->GetNumberOfFrames()), cErrorMessage::errorMessage); parser.showHelp(cliErrorFlightStartFrameOutOfRange); } } if (cliTODO == modeKeyframe) { int numberOfFrames = (gKeyframes->GetNumberOfFrames() - 1) * gPar->Get<int>("frames_per_keyframe"); if (numberOfFrames < 0) numberOfFrames = 0; if (startFrame <= numberOfFrames) { gPar->Set("keyframe_first_to_render", startFrame); } else { cErrorMessage::showMessage(QObject::tr("Animation has only %1 frames").arg(numberOfFrames), cErrorMessage::errorMessage); parser.showHelp(cliErrorKeyframeStartFrameOutOfRange); } } } // end frame of animation if (cliData.endFrameText != "") { int endFrame = cliData.endFrameText.toInt(&checkParse); if (cliTODO == modeFlight) { if (endFrame <= gAnimFrames->GetNumberOfFrames()) { if (endFrame > gPar->Get<int>("flight_first_to_render")) { gPar->Set("flight_last_to_render", endFrame); } else { cErrorMessage::showMessage(QObject::tr("End frame has to be greater than start frame which is %1").arg(gPar->Get<int>("flight_first_to_render")), cErrorMessage::errorMessage); parser.showHelp(cliErrorFlightEndFrameSmallerStartFrame); } } else { cErrorMessage::showMessage(QObject::tr("Animation has only %1 frames").arg(gAnimFrames->GetNumberOfFrames()), cErrorMessage::errorMessage); parser.showHelp(cliErrorFlightEndFrameOutOfRange); } } if (cliTODO == modeKeyframe) { int numberOfFrames = (gKeyframes->GetNumberOfFrames() - 1) * gPar->Get<int>("frames_per_keyframe"); if (numberOfFrames < 0) numberOfFrames = 0; if (endFrame <= numberOfFrames) { if (endFrame > gPar->Get<int>("keyframe_first_to_render")) { gPar->Set("keyframe_last_to_render", endFrame); } else { cErrorMessage::showMessage(QObject::tr("End frame has to be greater than start frame which is %1").arg(gPar->Get<int>("keyframe_first_to_render")), cErrorMessage::errorMessage); parser.showHelp(cliErrorKeyframeEndFrameSmallerStartFrame); } } else { cErrorMessage::showMessage(QObject::tr("Animation has only %1 frames").arg(numberOfFrames), cErrorMessage::errorMessage); parser.showHelp(cliErrorKeyframeEndFrameOutOfRange); } } } //folder for animation frames if(cliData.outputText != "" && cliTODO == modeFlight) { gPar->Set("anim_flight_dir", cliData.outputText); } if(cliData.outputText != "" && cliTODO == modeKeyframe) { gPar->Set("anim_keyframe_dir", cliData.outputText); } if(!settingsSpecified && cliData.nogui && cliTODO != modeNetrender) { cErrorMessage::showMessage(QObject::tr("You have to specify a settings file, for this configuration!"), cErrorMessage::errorMessage); parser.showHelp(cliErrorSettingsFileNotSpecified); } if(cliData.nogui && cliTODO != modeKeyframe && cliTODO != modeFlight && cliTODO != modeQueue) { //creating output filename if it's not specified if(cliData.outputText == "") { cliData.outputText = gPar->Get<QString>("default_image_path") + QDir::separator(); cliData.outputText += QFileInfo(systemData.lastSettingsFile).completeBaseName(); } cliTODO = modeStill; return; } }