diff --git a/src/serializers/SvgSerializer.cpp b/src/serializers/SvgSerializer.cpp index 511eb53150..903f7fa24b 100644 --- a/src/serializers/SvgSerializer.cpp +++ b/src/serializers/SvgSerializer.cpp @@ -581,7 +581,7 @@ namespace { } std::string SvgSerializer::nameElement(const IfcGeom::Element* elem) { - return nameElement_({ {"id", object_id(elem)}, {"class", elem->type()} }); + return nameElement_({ {"id", object_id(elem)}, {"class", elem->type()}, {"data-name", elem->name()} }); } std::string SvgSerializer::nameElement(const IfcUtil::IfcBaseEntity* elem) { @@ -589,6 +589,10 @@ std::string SvgSerializer::nameElement(const IfcUtil::IfcBaseEntity* elem) { const std::string& entity = elem->declaration().name(); const std::string type = elem->declaration().is("IfcBuildingStorey") ? "storey" : "product"; + std::string ifc_name; + if (!elem->get("Name")->isNull()) { + ifc_name = *elem->get("Name"); + } const std::string name = (settings().get(SerializerSettings::USE_ELEMENT_GUIDS) @@ -597,7 +601,7 @@ std::string SvgSerializer::nameElement(const IfcUtil::IfcBaseEntity* elem) { ? static_cast(*elem->get("Name")) : IfcParse::IfcGlobalId(*elem->get("GlobalId")).formatted()); - return nameElement_({ {"id", type + "-" + name}, {"class", entity} }); + return nameElement_({ {"id", type + "-" + name}, {"class", entity}, {"data-name", ifc_name} }); } void SvgSerializer::setFile(IfcParse::IfcFile* f) { diff --git a/src/serializers/SvgSerializer.h b/src/serializers/SvgSerializer.h index 770da52479..2697748328 100644 --- a/src/serializers/SvgSerializer.h +++ b/src/serializers/SvgSerializer.h @@ -31,6 +31,33 @@ #include #include +struct storey_sorter { + bool operator()(IfcUtil::IfcBaseEntity* a, IfcUtil::IfcBaseEntity* b) const { + const bool a_is_storey = a->declaration().is("IfcBuildingStorey"); + const bool b_is_storey = b->declaration().is("IfcBuildingStorey"); + if (a_is_storey && b_is_storey) { + boost::optional a_elev, b_elev; + try { + a_elev = static_cast(*a->get("Elevation")); + b_elev = static_cast(*b->get("Elevation")); + } catch (...) {}; + if (a_elev && b_elev) { + return std::less()(*a_elev, *b_elev); + } + + boost::optional a_name, b_name; + try { + a_name = static_cast(*a->get("Name")); + b_name = static_cast(*b->get("Name")); + } catch (...) {}; + if (a_name && b_name) { + return std::less()(*a_name, *b_name); + } + } + return std::less()(a, b); + } +}; + class SvgSerializer : public GeometrySerializer { public: typedef std::pair > path_object; @@ -39,7 +66,7 @@ protected: double xmin, ymin, xmax, ymax, width, height; boost::optional section_height; bool rescale, print_space_names_, print_space_areas_; - std::multimap paths; + std::multimap paths; std::vector< boost::shared_ptr > xcoords; std::vector< boost::shared_ptr > ycoords; std::vector< boost::shared_ptr > radii;