// geometry_sets contains the geometric points the boundary conditions will be
// set on, geo_name is the name the geometry can be accessed with, out_fname is
// the base file name the gli and bc as well as the gml file will be written to.
void writeBCsAndGeometry(GeoLib::GEOObjects& geometry_sets,
                         std::string& geo_name, std::string const& out_fname,
                         std::string const& bc_type, bool write_gml)
{
	if (write_gml) {
		INFO("write points to \"%s.gml\".", geo_name.c_str());
		FileIO::writeGeometryToFile(geo_name, geometry_sets, out_fname+".gml");
	}
	FileIO::writeGeometryToFile(geo_name, geometry_sets, out_fname+".gli");

	bool liquid_flow(false);
	if (bc_type == "LIQUID_FLOW")
		liquid_flow = true;


	GeoLib::PointVec const* pnt_vec_objs(geometry_sets.getPointVecObj(geo_name));
	std::vector<GeoLib::Point*> const& pnts(*(pnt_vec_objs->getVector()));
	std::ofstream bc_out (out_fname+".bc");
	for (std::size_t k(0); k<pnts.size(); k++) {
		std::string const& pnt_name(pnt_vec_objs->getItemNameByID(k));
		if (!pnt_name.empty()) {
			if (liquid_flow)
				writeLiquidFlowPointBC(bc_out, pnt_name);
			else
				writeGroundwaterFlowPointBC(bc_out, pnt_name, (*pnts[k])[2]);
		}
	}
	bc_out << "#STOP\n";
	bc_out.close();
}
Beispiel #2
0
int main (int argc, char* argv[])
{
	if (argc == 1)
	{
		std::cout << "Usage: " << argv[0] << " gml-file" << std::endl;
		std::cout << "\tgives you the name of all polylines in the file" << std::endl;
		std::cout << "Usage: " << argv[0] << " gml-file polyline-to-convert" << std::endl;
		std::cout << "\tcreates for the given polyline points boundary conditions" <<
		std::endl;
		return -1;
	}
	GeoLib::GEOObjects* geo_objs (new GeoLib::GEOObjects);
	std::string schema_name(
	        "/home/fischeth/workspace/OGS-FirstFloor/sources/FileIO/OpenGeoSysGLI.xsd");
	ProjectData* project_data (new ProjectData);
	project_data->setGEOObjects (geo_objs);
	FileIO::XmlGmlInterface xml(project_data, schema_name);
	std::string fname (argv[1]);
	xml.readFile(QString::fromStdString (fname));

	std::vector<std::string> geo_names;
	geo_objs->getGeometryNames (geo_names);
	if (geo_names.empty ())
	{
		std::cout << "no geometries found" << std::endl;
		return -1;
	}
	const GeoLib::PolylineVec* ply_vec (geo_objs->getPolylineVecObj(geo_names[0]));
	if (!ply_vec)
	{
		std::cout << "could not found polylines" << std::endl;
		delete project_data;
		return -1;
	}
	const size_t n_ply (ply_vec->size());

	std::vector<size_t> ply_pnt_ids;
	for (size_t k(0); k < n_ply; k++)
	{
		std::string ply_name;
		if (ply_vec->getNameOfElementByID(k, ply_name))
		{
			if (argc == 2)
				std::cout << "polyline " << k << ": " << ply_name << std::endl;
			else if (ply_name.find (argv[2]) != std::string::npos)
			{
				std::cout << "found polyline " << ply_name << std::endl;
				GeoLib::Polyline const* ply (ply_vec->getElementByName(ply_name));
				const size_t n_ply_pnts (ply->getNumberOfPoints());
				for (size_t j(0); j < n_ply_pnts; j++)
					ply_pnt_ids.push_back (ply->getPointID(j));
			}
		}
	}

	if (argc == 2)
		return 0;

	std::vector<GeoLib::Point*> const* geo_pnts (geo_objs->getPointVec(geo_names[0]));
	// write gli file and bc file
	std::ofstream gli_out ("TB.gli");
	std::ofstream bc_out ("TB.bc");
	bc_out << "// file generated by " << argv[0] << std::endl;
	if (gli_out && bc_out)
	{
		gli_out << "#POINTS" << std::endl;
		for (size_t k(0); k < ply_pnt_ids.size(); k++)
		{
			gli_out << k << " " << *((*geo_pnts)[ply_pnt_ids[k]]) << " $NAME PLYPNT" <<
			argv[2] << k << std::endl;
			// boundary condition
			bc_out << "#BOUNDARY_CONDITION" << std::endl;
			bc_out << "\t$PCS_TYPE" << std::endl << "\t\tGROUNDWATER_FLOW" << std::endl;
			bc_out << "\t$PRIMARY_VARIABLE" << std::endl << "\t\tHEAD" << std::endl;
			bc_out << "\t$GEO_TYPE" << std::endl << "\t\tPOINT PLYPNT" << argv[2] <<
			k << std::endl;
			bc_out << "\t$DIS_TYPE" << std::endl << "\t\tCONSTANT " <<
			(*((*geo_pnts)[ply_pnt_ids[k]]))[2] << std::endl;
		}
		gli_out << "#STOP" << std::endl;
		bc_out << "#STOP" << std::endl;
		gli_out.close ();
		bc_out.close ();
	}

	delete project_data;
}
Beispiel #3
0
int main (int argc, char* argv[])
{
	if (argc == 1)
	{
		std::cout << "Usage: " << argv[0] << " gml-file" << std::endl;
		return -1;
	}
	GeoLib::GEOObjects* geo_objs (new GeoLib::GEOObjects);
	ProjectData* project_data (new ProjectData);
	project_data->setGEOObjects (geo_objs);
	std::string schema_name(
	        "/home/fischeth/workspace/OGS-FirstFloor/sources/FileIO/OpenGeoSysGLI.xsd");
	FileIO::XmlGmlInterface xml(project_data, schema_name);
	std::string fname (argv[1]);
	xml.readFile(QString::fromStdString (fname));

	std::vector<std::string> geo_names;
	geo_objs->getGeometryNames (geo_names);
	if (geo_names.empty ())
	{
		std::cout << "no geometries found" << std::endl;
		return -1;
	}
	const GeoLib::SurfaceVec* sfc_vec (geo_objs->getSurfaceVecObj(geo_names[0]));
	if (!sfc_vec)
	{
		std::cout << "could not found surfaces" << std::endl;
		delete project_data;
		return -1;
	}
	const size_t n_sfc (sfc_vec->size());

	std::vector<size_t> sfc_pnt_ids;
	for (size_t k(0); k < n_sfc; k++)
	{
		std::string sfc_name;
		if (sfc_vec->getNameOfElementByID(k, sfc_name))
			if (sfc_name.find ("Terrain") != std::string::npos)
			{
				std::cout << k << ": " << sfc_name << std::endl;
				GeoLib::Surface const* sfc (sfc_vec->getElementByName(sfc_name));
				const size_t n_triangles (sfc->getNTriangles());
				for (size_t j(0); j < n_triangles; j++)
				{
					GeoLib::Triangle const* tri ((*sfc)[j]);
					for (size_t i(0); i < 3; i++)
						sfc_pnt_ids.push_back ((*tri)[i]);
				}
			}
	}

	// make entries unique
	std::cout << "make points unique ... " << std::flush;
	std::sort (sfc_pnt_ids.begin(), sfc_pnt_ids.end());
	std::vector<size_t>::iterator it (sfc_pnt_ids.begin());
	while (it != sfc_pnt_ids.end())
	{
		std::vector<size_t>::iterator next (it);
		next++;
		if (next != sfc_pnt_ids.end())
		{
			if (*it == *next)
				it = sfc_pnt_ids.erase (it);
			else
				it++;
		}
		else
			it++;
	}
	std::cout << "done" << std::endl;

	std::vector<GeoLib::Point*> const* geo_pnts (geo_objs->getPointVec(geo_names[0]));
	// write gli file and bc file
	std::ofstream gli_out ("TB.gli");
	std::ofstream bc_out ("TB.bc");
	bc_out << "// file generated by " << argv[0] << "\n";
	if (gli_out && bc_out)
	{
		gli_out << "#POINTS" << "\n";
		for (size_t k(0); k < sfc_pnt_ids.size(); k++)
		{
			gli_out << k << " " << *((*geo_pnts)[sfc_pnt_ids[k]]) << " $NAME " << k <<
			"\n";
			// boundary condition
			bc_out << "#BOUNDARY_CONDITION" << "\n";
			bc_out << "\t$PCS_TYPE" << "\n" << "\t\tGROUNDWATER_FLOW" << "\n";
			bc_out << "\t$PRIMARY_VARIABLE" << "\n" << "\t\tHEAD" << "\n";
			bc_out << "\t$GEO_TYPE" << "\n" << "\t\tPOINT " << k << "\n";
			bc_out << "\t$DIS_TYPE" << "\n" << "\t\tCONSTANT " <<
			(*((*geo_pnts)[sfc_pnt_ids[k]]))[2] << "\n";
		}
		gli_out << "#STOP" << "\n";
		bc_out << "#STOP" << "\n";
		gli_out.close ();
		bc_out.close ();
	}

	delete project_data;
}