diff --git a/src/ifcgeom/ConversionSettings.h b/src/ifcgeom/ConversionSettings.h index 1a80ed4d32..46fb6b5f1d 100644 --- a/src/ifcgeom/ConversionSettings.h +++ b/src/ifcgeom/ConversionSettings.h @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -521,6 +522,11 @@ namespace ifcopenshell { static constexpr const char* name = "std::vector"; }; + template <> + struct readable_name> { + static constexpr const char* name = "std::vector"; + }; + template <> struct readable_name { static constexpr const char* name = "IteratorOutputOptions"; @@ -545,7 +551,9 @@ namespace ifcopenshell { template class SettingsContainer { public: - typedef std::variant, std::set, std::vector, IteratorOutputOptions, FunctionStepMethod, OutputDimensionalityTypes, TriangulationMethod> value_variant_t; + typedef std::variant, std::set, + std::vector, std::vector, IteratorOutputOptions, FunctionStepMethod, + OutputDimensionalityTypes, TriangulationMethod> value_variant_t; private: settings_t settings; diff --git a/src/ifcwrap/IfcGeomWrapper.i b/src/ifcwrap/IfcGeomWrapper.i index 0badfec930..ad1ff23490 100644 --- a/src/ifcwrap/IfcGeomWrapper.i +++ b/src/ifcwrap/IfcGeomWrapper.i @@ -515,12 +515,16 @@ assign_matrix_access(revolve); void set_(const std::string& name, const std::set& val) { return $self->set(name, val); } - void set_(const std::string& name, const std::set& val) { - return $self->set(name, val); - } - void set_(const std::string& name, const std::vector& val) { - return $self->set(name, val); - } + void set_(const std::string& name, const std::vector& val) { + return $self->set(name, val); + } + void set_(const std::string& name, const std::vector& val) { + // Python sequences cannot distinguish std::vector from std::set. + if ($self->get_type(name) == "std::set") { + return $self->set(name, std::set(val.begin(), val.end())); + } + return $self->set(name, val); + } ifcopenshell::geometry::Settings::value_variant_t get_(const std::string& name) { return $self->get(name); } diff --git a/src/ifcwrap/utils/type_conversion.i b/src/ifcwrap/utils/type_conversion.i index 5efe0bea2d..1769e5dd42 100644 --- a/src/ifcwrap/utils/type_conversion.i +++ b/src/ifcwrap/utils/type_conversion.i @@ -286,7 +286,7 @@ } else if constexpr (std::is_same_v>, std::set>) { std::vector vs(t.begin(), t.end()); return pythonize_vector(vs); - } else if constexpr (std::is_same_v>, std::vector>) { + } else if constexpr (is_std_vector_v>>) { return pythonize_vector(t); } else { return pythonize(t);