Пример #1
0
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;
	}
}