Ejemplo n.º 1
0
void qSRA::loadProfile() const
{
	if (!m_app)
	{
		assert(false);
		return;
	}

	//persistent settings (default import path)
	QSettings settings;
	settings.beginGroup("qSRA");
	QString path = settings.value("importPath", ccFileUtils::defaultDocPath()).toString();

	ProfileImportDlg piDlg(m_app->getMainWindow());
	piDlg.setDefaultFilename(path);

	if (!piDlg.exec())
		return;

	QString filename = piDlg.getFilename();
	if (filename.isEmpty())
		return;
	
	//save current import path to persistent settings
	settings.setValue("importPath",QFileInfo(filename).absolutePath());

	//get the user defined global axis
	int axisDim = piDlg.getAxisDimension();
	assert(axisDim >= 0 && axisDim <= 2);

	//load profile as a (2D) polyline
	CCVector3 origin(0,0,0);
	ccPolyline* polyline = ProfileLoader::Load(filename, origin, m_app);
	if (!polyline)
	{
		if (m_app)
			m_app->dispToConsole(QString("Failed to load file '%1'!").arg(filename),ccMainAppInterface::ERR_CONSOLE_MESSAGE);
		return;
	}

	//DGM: the following works only because the axis is colinear with X, Y or Z!
	PointCoordinateType heightShift = 0;
	if (piDlg.absoluteHeightValues())
	{
		heightShift = -origin.u[axisDim];
	}
	
	//apply a visual transformation to see the polyline in the right place
	{
		ccGLMatrix trans;
		CCVector3 T = origin;
		T.u[axisDim] += heightShift;
		trans.setTranslation(T);
		float* mat = trans.data();
		switch (axisDim)
		{
		case 0: //X
			//invert X and Y
			mat[0] = 0;	mat[1] = 1;
			mat[4] = 1;	mat[5] = 0;
			break;
			//case 1: //Y
		case 2: //Z
			//invert Z and Y
			mat[5] = 0;	mat[6] = 1;
			mat[9] = 1;	mat[10] = 0;
			break;
		default:
			//nothing to do
			break;
		}
		polyline->set2DMode(false);
		polyline->setGLTransformation(trans);
	}

	//set meta-data
	DistanceMapGenerationTool::SetPoylineOrigin(polyline,origin);
	DistanceMapGenerationTool::SetPoylineRevolDim(polyline,axisDim);
	DistanceMapGenerationTool::SetPolylineHeightShift(polyline,heightShift);

	//default destination container
	ccHObject* defaultContainer = GetDefaultContainer(m_app);
	if (defaultContainer)
	{
		defaultContainer->addChild(polyline);
	}

	m_app->addToDB(polyline,true,false,true);

	m_app->dispToConsole(QString("[qSRA] File '%1' successfully loaded").arg(filename),ccMainAppInterface::STD_CONSOLE_MESSAGE);
}
Ejemplo n.º 2
0
Archivo: qSRA.cpp Proyecto: getov/trunk
void qSRA::loadProfile()
{
	assert(m_app);
	if (!m_app)
		return;

	//persistent settings (default import path)
	QSettings settings;
	settings.beginGroup("qSRA");
	QString path = settings.value("importPath",QApplication::applicationDirPath()).toString();

	ProfileImportDlg piDlg(m_app->getMainWindow());
	piDlg.setDefaultFilename(path);

	if (!piDlg.exec())
		return;

	QString filename = piDlg.getFilename();
	if (filename.isEmpty())
		return;
	
	//save current import path to persistent settings
	settings.setValue("importPath",QFileInfo(filename).absolutePath());

	//get the user defined global axis
	int axisDim = piDlg.getAxisDimension();
	//get whether heights are expressed relatively to 0 or to the input center
	bool ignoreAxisShift = piDlg.ignoreAxisShift();

	//load profile as a (2D) polyline
	ccPolyline* polyline = ProfileLoader::Load(filename,ignoreAxisShift,axisDim,m_app);

	if (polyline)
	{
		//apply a visual transformation to see the polyline in the right place!
		ccPointCloud* vertices = dynamic_cast<ccPointCloud*>(polyline->getAssociatedCloud());
		if (vertices)
		{
			const CCVector3d& O = vertices->getGlobalShift();

			ccGLMatrix trans;
			trans.setTranslation(CCVector3::fromArray(O.u));
			float* mat = trans.data();
			switch(axisDim)
			{
			case 0: //X
				//invert X and Y
				mat[0] = 0;	mat[1] = 1;
				mat[4] = 1;	mat[5] = 0;
				break;
				//case 1: //Y
			case 2: //Z
				//invert Z and Y
				mat[5] = 0;	mat[6] = 1;
				mat[9] = 1;	mat[10] = 0;
				break;
			default:
				//nothing to do
				break;
			}
			polyline->set2DMode(false);
			polyline->setGLTransformation(trans);
		}

		//add revolution axis as meta-data
		DistanceMapGenerationTool::SetPoylineAxis(polyline,axisDim);

		//default destination container
		ccHObject* defaultContainer = GetDefaultContainer(m_app);
		if (defaultContainer)
			defaultContainer->addChild(polyline);

		m_app->addToDB(polyline,true,false,true);

		m_app->dispToConsole(QString("[qSRA] File '%1' succesfully loaded").arg(filename),ccMainAppInterface::STD_CONSOLE_MESSAGE);
	}
	else
	{
		m_app->dispToConsole(QString("Failed to load file '%1'!").arg(filename),ccMainAppInterface::ERR_CONSOLE_MESSAGE);
	}
}