mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-21 10:23:41 +00:00
Use building or site placement for SVG section height if file has no storeys
This commit is contained in:
@@ -26,6 +26,7 @@
|
|||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
#include <gp_Pln.hxx>
|
#include <gp_Pln.hxx>
|
||||||
|
#include <gp_Trsf.hxx>
|
||||||
#include <TopoDS.hxx>
|
#include <TopoDS.hxx>
|
||||||
#include <TopoDS_Edge.hxx>
|
#include <TopoDS_Edge.hxx>
|
||||||
#include <TopExp_Explorer.hxx>
|
#include <TopExp_Explorer.hxx>
|
||||||
@@ -209,7 +210,8 @@ void SvgSerializer::write(const IfcGeom::BRepElement<real_t>* o)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!storey) return;
|
// With a global section height, building storeys are not a requirement.
|
||||||
|
if (!storey && !section_height) return;
|
||||||
|
|
||||||
path_object& p = start_path(storey, nameElement(o));
|
path_object& p = start_path(storey, nameElement(o));
|
||||||
|
|
||||||
@@ -343,8 +345,52 @@ std::string SvgSerializer::nameElement(const IfcGeom::Element<real_t>* elem)
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::string SvgSerializer::nameElement(const IfcSchema::IfcProduct* elem) {
|
std::string SvgSerializer::nameElement(const IfcSchema::IfcProduct* elem) {
|
||||||
|
if (elem == 0) { return ""; }
|
||||||
std::ostringstream oss;
|
std::ostringstream oss;
|
||||||
const std::string type = elem->is(IfcSchema::Type::IfcBuildingStorey) ? "storey" : "product";
|
const std::string type = elem->is(IfcSchema::Type::IfcBuildingStorey) ? "storey" : "product";
|
||||||
oss << "id=\"product-" << IfcParse::IfcGlobalId(elem->GlobalId()).formatted() << "\"";
|
oss << "id=\"product-" << IfcParse::IfcGlobalId(elem->GlobalId()).formatted() << "\"";
|
||||||
return oss.str();
|
return oss.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SvgSerializer::setFile(IfcParse::IfcFile* f) {
|
||||||
|
file = f;
|
||||||
|
IfcSchema::IfcBuildingStorey::list::ptr storeys = f->entitiesByType<IfcSchema::IfcBuildingStorey>();
|
||||||
|
if (!storeys || storeys->size() == 0) {
|
||||||
|
|
||||||
|
IfcGeom::Kernel kernel;
|
||||||
|
|
||||||
|
IfcSchema::IfcProject::list::ptr projects = f->entitiesByType<IfcSchema::IfcProject>();
|
||||||
|
if (projects->size() == 1) {
|
||||||
|
IfcSchema::IfcProject* project = *projects->begin();
|
||||||
|
std::pair<std::string, double> length_unit = kernel.initializeUnits(project->UnitsInContext());
|
||||||
|
} else {
|
||||||
|
Logger::Error("No single project encountered, output might be invalid or missing");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<IfcSchema::Type::Enum> to_derive_from;
|
||||||
|
to_derive_from.push_back(IfcSchema::Type::IfcBuilding);
|
||||||
|
to_derive_from.push_back(IfcSchema::Type::IfcSite);
|
||||||
|
std::vector<IfcSchema::Type::Enum>::const_iterator it;
|
||||||
|
for (it = to_derive_from.begin(); it != to_derive_from.end(); ++it) {
|
||||||
|
IfcEntityList::ptr untyped = f->entitiesByType(*it);
|
||||||
|
if (untyped) {
|
||||||
|
IfcSchema::IfcProduct::list::ptr insts = untyped->as<IfcSchema::IfcProduct>();
|
||||||
|
IfcSchema::IfcProduct::list::it jt;
|
||||||
|
for (jt = insts->begin(); jt != insts->end(); ++jt) {
|
||||||
|
IfcSchema::IfcProduct* product = *jt;
|
||||||
|
if (product->hasObjectPlacement()) {
|
||||||
|
gp_Trsf trsf;
|
||||||
|
if (kernel.convert(product->ObjectPlacement(), trsf)) {
|
||||||
|
setSectionHeight(trsf.TranslationPart().Z() + 1.);
|
||||||
|
Logger::Warning("No building storeys encountered, used for reference:", product->entity);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Logger::Error("No building storeys encountered, output might be invalid or missing");
|
||||||
|
}
|
||||||
@@ -66,7 +66,7 @@ public:
|
|||||||
bool isTesselated() const { return false; }
|
bool isTesselated() const { return false; }
|
||||||
void finalize();
|
void finalize();
|
||||||
void setUnitNameAndMagnitude(const std::string& /*name*/, float /*magnitude*/) {}
|
void setUnitNameAndMagnitude(const std::string& /*name*/, float /*magnitude*/) {}
|
||||||
void setFile(IfcParse::IfcFile* f) { file = f; }
|
void setFile(IfcParse::IfcFile* f);
|
||||||
void setBoundingRectangle(double width, double height);
|
void setBoundingRectangle(double width, double height);
|
||||||
void setSectionHeight(double h) { section_height = h; }
|
void setSectionHeight(double h) { section_height = h; }
|
||||||
std::string nameElement(const IfcGeom::Element<real_t>* elem);
|
std::string nameElement(const IfcGeom::Element<real_t>* elem);
|
||||||
|
|||||||
Reference in New Issue
Block a user