diff --git a/src/serializers/SvgSerializer.cpp b/src/serializers/SvgSerializer.cpp index 4aec9ca1c4..2a5c18dc6e 100644 --- a/src/serializers/SvgSerializer.cpp +++ b/src/serializers/SvgSerializer.cpp @@ -1685,91 +1685,92 @@ void SvgSerializer::addTextAnnotations(const drawing_key& k) { gp_Trsf trsf; if (kernel.convert_placement(*pl, trsf)) { - auto v = trsf.TranslationPart(); - if (k.first) { - v.ChangeCoord(1) *= -1.; - trsf.SetTranslationPart(v); - } + auto v = gp_Pnt(trsf.TranslationPart()); - // @todo Inverted? auto z_local = gp::DZ().Transformed(trsf); auto view_dir = z_local.Dot(meta.pln_3d.Axis().Direction()); if ((!range || (v.Z() >= range->first && v.Z() < range->second)) && view_dir > 0.99) { - if (meta.pln_3d.Position().Direction().Dot(gp_Dir(trsf.HVectorialPart().Column(3))) > 0.99) { - auto svg_name = nameElement(ann); - path_object* po; - if (k.first) { - po = &start_path(meta.pln_3d, k.first, svg_name); - } - else { - po = &start_path(meta.pln_3d, k.second, svg_name); - } + gp_Trsf trsf_view; + trsf_view.SetTransformation(gp::XOY(), meta.pln_3d.Position()); + v.Transform(trsf_view); - if (object_type.size()) { - // postfix the object_type for CSS matching - boost::replace_all(svg_name, "class=\"IfcAnnotation\"", "class=\"IfcAnnotation " + object_type + "\""); - } - - boost::optional font_size; - std::vector tokens; - boost::split(tokens, name, boost::is_any_of("_")); - if (tokens.size() == 2) { - try { - font_size = boost::lexical_cast(tokens.back()); - } - catch (...) {} - } - - // @todo column or row? - double z_rotation = gp_Dir(trsf.HVectorialPart().Column(1)).AngleWithRef(gp_Dir(1., 0., 0.), gp_Dir(0., 0., 1.)); - z_rotation *= 180. / M_PI; - - util::string_buffer path; - // dominant-baseline="central" is not well supported in IE. - // so we add a 0.35 offset to the dy of the tspans - path.add(" "); - - std::vector labels{ desc }; - - for (auto lit = labels.begin(); lit != labels.end(); ++lit) { - const auto& l = *lit; - double dy = labels.begin() == lit - ? 0.0 // align bottom - : 1.0; // <- dy is relative to the previous text element, so - // always 1 for successive spans. - path.add("(dy)); - path.add("em\">"); - path.add(l); - path.add(""); - } - - path.add(""); - - po->second.push_back(path); + auto svg_name = nameElement(ann); + path_object* po; + if (k.first) { + po = &start_path(meta.pln_3d, k.first, svg_name); + } else { + po = &start_path(meta.pln_3d, k.second, svg_name); } + + if (object_type.size()) { + // postfix the object_type for CSS matching + boost::replace_all(svg_name, "class=\"IfcAnnotation\"", "class=\"IfcAnnotation " + object_type + "\""); + } + + boost::optional font_size; + std::vector tokens; + boost::split(tokens, name, boost::is_any_of("_")); + if (tokens.size() == 2) { + try { + font_size = boost::lexical_cast(tokens.back()); + } + catch (...) {} + } + + // @todo column or row? + double z_rotation = gp::DX().Transformed(trsf).AngleWithRef( + meta.pln_3d.Position().XDirection(), + meta.pln_3d.Position().Direction() + ); + z_rotation *= 180. / M_PI; + + auto y = -v.Y(); + + util::string_buffer path; + // dominant-baseline="central" is not well supported in IE. + // so we add a 0.35 offset to the dy of the tspans + path.add(" "); + + std::vector labels{ desc }; + + for (auto lit = labels.begin(); lit != labels.end(); ++lit) { + const auto& l = *lit; + double dy = labels.begin() == lit + ? 0.0 // align bottom + : 1.0; // <- dy is relative to the previous text element, so + // always 1 for successive spans. + path.add("(dy)); + path.add("em\">"); + path.add(l); + path.add(""); + } + + path.add(""); + + po->second.push_back(path); } } }