diff --git a/src/Mod/Sketcher/App/PythonConverter.cpp b/src/Mod/Sketcher/App/PythonConverter.cpp index 7c7dbdae19..f5795615fe 100644 --- a/src/Mod/Sketcher/App/PythonConverter.cpp +++ b/src/Mod/Sketcher/App/PythonConverter.cpp @@ -195,6 +195,29 @@ std::string PythonConverter::convert(const std::string& doc, return constraintlist; } +template +std::string makeSplineInfoArrayString(const std::vector& rInfoVec) +{ + std::stringstream stream; + if constexpr (std::is_same_v) { + for (const auto& rInfo : rInfoVec) { + stream << "App.Vector(" << rInfo.x << ", " << rInfo.y << "), "; + } + } + else { + for (const auto& rInfo : rInfoVec) { + stream << rInfo << ", "; + } + } + + std::string res = stream.str(); + // remove last comma and add brackets + int index = res.rfind(','); + res.resize(index); + return fmt::format("[{}]", res); + ; +} + PythonConverter::SingleGeometry PythonConverter::process(const Part::Geometry* geo) { static std::map> @@ -307,23 +330,17 @@ PythonConverter::SingleGeometry PythonConverter::process(const Part::Geometry* g [](const Part::Geometry* geo) { auto bSpline = static_cast(geo); - std::stringstream stream; - std::vector poles = bSpline->getPoles(); - for (auto& pole : poles) { - stream << "App.Vector(" << pole.x << "," << pole.y << "),"; - } - std::string controlpoints = stream.str(); - // remove last comma and add brackets - int index = controlpoints.rfind(','); - controlpoints.resize(index); - controlpoints.insert(0, 1, '['); - controlpoints.append(1, ']'); + std::string controlpoints = makeSplineInfoArrayString(bSpline->getPoles()); + std::string mults = makeSplineInfoArrayString(bSpline->getMultiplicities()); + std::string knots = makeSplineInfoArrayString(bSpline->getKnots()); + std::string weights = makeSplineInfoArrayString(bSpline->getWeights()); SingleGeometry sg; - sg.creation = boost::str( - boost::format("Part.BSplineCurve (%s, None, None, %s, %d, None, False)") - % controlpoints.c_str() % (bSpline->isPeriodic() ? "True" : "False") - % bSpline->getDegree()); + sg.creation = + boost::str(boost::format("Part.BSplineCurve(%s, %s, %s, %s, %d, %s, False)") + % controlpoints.c_str() % mults.c_str() % knots.c_str() + % (bSpline->isPeriodic() ? "True" : "False") % bSpline->getDegree() + % weights.c_str()); sg.construction = Sketcher::GeometryFacade::getConstruction(geo); return sg; }},