Beispiel #1
0
void qSRA::projectCloudDistsInGrid() const
{
	if (!m_app)
	{
		assert(false);
		return;
	}

	const ccHObject::Container& selectedEntities = m_app->getSelectedEntities();
	size_t selectCount = selectedEntities.size();
	if (selectCount != 1 && selectCount != 2)
	{
		assert(false);
		return;
	}

	//retrieve input cloud and polyline
	ccPointCloud* cloud = 0;
	ccPolyline* polyline = 0;
	bool tempPolyline = false;
	{
		for (size_t i=0; i<selectCount; ++i)
		{
			if (selectedEntities[i]->isA(CC_TYPES::POINT_CLOUD))
			{
				cloud = static_cast<ccPointCloud*>(selectedEntities[i]);
			}
			else if (selectedEntities[i]->isA(CC_TYPES::POLY_LINE))
			{
				polyline = static_cast<ccPolyline*>(selectedEntities[i]);
			}
			else if (!polyline && selectedEntities[i]->isKindOf(CC_TYPES::CONE))
			{
				//special case: we can deduce the polyline from the cone/cylinder parameters
				ccCone* cone = static_cast<ccCone*>(selectedEntities[i]);
				polyline = GetConeProfile(cone);
				if (!polyline)
				{
					//the conversion failed?!
					return;
				}
				tempPolyline = true;
			}
		}
	}

	if (cloud && polyline)
	{
		doProjectCloudDistsInGrid(cloud,polyline);
	}

	if (polyline && tempPolyline)
	{
		delete polyline;
		polyline = 0;
	}
}
Beispiel #2
0
void qSRA::computeCloud2ProfileRadialDist()
{
	if (m_selectedEntities.size() != 2)
		return;

	//retrieve input cloud and polyline
	ccPointCloud* cloud = 0;
	ccPolyline* polyline = 0;
	{
		for (unsigned i=0; i<2; ++i)
		{
			if (m_selectedEntities[i]->isA(CC_TYPES::POINT_CLOUD))
				cloud = static_cast<ccPointCloud*>(m_selectedEntities[i]);
			else if (m_selectedEntities[i]->isA(CC_TYPES::POLY_LINE))
				polyline = static_cast<ccPolyline*>(m_selectedEntities[i]);
		}
	}

	if (!cloud || !polyline)
	{
		m_app->dispToConsole(QString("Select exactly one cloud and one polyline!"),ccMainAppInterface::ERR_CONSOLE_MESSAGE);
		return;
	}
	assert(cloud && polyline);

	if (DistanceMapGenerationTool::ComputeRadialDist(cloud, polyline, false, m_app))
	{
		cloud->prepareDisplayForRefresh();
		m_app->updateUI();
		m_app->refreshAll();

		//automatically ask the user if he wants to generate a 2D map
		if (QMessageBox::question(m_app->getMainWindow(),"Generate map","Do you want to generate a 2D map?",QMessageBox::Yes,QMessageBox::No) == QMessageBox::Yes)
		{
			doProjectCloudDistsInGrid(cloud,polyline);
		}
	}
	else
	{
		if (m_app)
			m_app->dispToConsole("An error ocurred while computing radial distances!",ccMainAppInterface::WRN_CONSOLE_MESSAGE);
	}
}
Beispiel #3
0
void qSRA::projectCloudDistsInGrid()
{
	size_t selectCount = m_selectedEntities.size();
	if (selectCount != 1 && selectCount != 2)
		return;

	//retrieve input cloud and polyline
	ccPointCloud* cloud = 0;
	ccPolyline* polyline = 0;
	{
		for (size_t i=0; i<selectCount; ++i)
		{
			if (m_selectedEntities[i]->isA(CC_TYPES::POINT_CLOUD))
				cloud = static_cast<ccPointCloud*>(m_selectedEntities[i]);
			else if (m_selectedEntities[i]->isA(CC_TYPES::POLY_LINE))
				polyline = static_cast<ccPolyline*>(m_selectedEntities[i]);
		}
	}

	if (!cloud || !polyline)
		return;

	doProjectCloudDistsInGrid(cloud,polyline);
}
Beispiel #4
0
void qSRA::computeCloud2ProfileRadialDist() const
{
	if (!m_app)
	{
		assert(false);
		return;
	}

	const ccHObject::Container& selectedEntities = m_app->getSelectedEntities();
	if (selectedEntities.size() != 2)
	{
		assert(false);
		return;
	}

	//retrieve input cloud and polyline
	ccPointCloud* cloud = 0;
	ccPolyline* polyline = 0;
	bool tempPolyline = false;
	{
		for (unsigned i=0; i<2; ++i)
		{
			if (selectedEntities[i]->isA(CC_TYPES::POINT_CLOUD))
			{
				cloud = static_cast<ccPointCloud*>(selectedEntities[i]);
			}
			else if (selectedEntities[i]->isA(CC_TYPES::POLY_LINE))
			{
				polyline = static_cast<ccPolyline*>(selectedEntities[i]);
			}
			else if (!polyline && selectedEntities[i]->isKindOf(CC_TYPES::CONE))
			{
				//special case: we can deduce the polyline from the cone/cylinder parameters
				ccCone* cone = static_cast<ccCone*>(selectedEntities[i]);
				polyline = GetConeProfile(cone);
				if (!polyline)
				{
					//the conversion failed?!
					return;
				}
				tempPolyline = true;

#ifdef _DEBUG
				//test: apply a visual transformation to see the polyline in the right place
				{
					polyline->set2DMode(false);
					polyline->setWidth(2);
					polyline->setColor(ccColor::green);
					polyline->showColors(true);
					cone->setVisible(false);
					cone->addChild(polyline);
					m_app->addToDB(polyline);
					tempPolyline = false;
				}
#endif
			}
		}
	}

	if (cloud && polyline)
	{
		if (doComputeRadialDists(cloud, polyline))
		{
			//automatically ask the user if he wants to generate a 2D map
			if (QMessageBox::question(	m_app ? m_app->getMainWindow() : 0,
										"Generate map",
										"Do you want to generate a 2D deviation map?",
										QMessageBox::Yes,
										QMessageBox::No) == QMessageBox::Yes)
			{
				doProjectCloudDistsInGrid(cloud,polyline);
			}
		}
	}
	else
	{
		if (m_app)
			m_app->dispToConsole(QString("Select exactly one cloud and one Surface of Revolution (polyline/profile, cone or cylinder)"),ccMainAppInterface::ERR_CONSOLE_MESSAGE);
	}

	if (polyline && tempPolyline)
	{
		delete polyline;
		polyline = 0;
	}
}