mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-19 14:41:25 +00:00
Allow passing buffer to serializers that support it
This commit is contained in:
@@ -282,6 +282,7 @@ public:
|
|||||||
|
|
||||||
stream_or_filename(const std::string& fn)
|
stream_or_filename(const std::string& fn)
|
||||||
: ofs_(new std::ofstream(ifcopenshell::path::from_utf8(fn).c_str()))
|
: ofs_(new std::ofstream(ifcopenshell::path::from_utf8(fn).c_str()))
|
||||||
|
, filename_(fn)
|
||||||
, stream(*ofs_)
|
, stream(*ofs_)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
|||||||
@@ -616,6 +616,8 @@ def make_shape_function(fn):
|
|||||||
|
|
||||||
|
|
||||||
class _serializer_factory:
|
class _serializer_factory:
|
||||||
|
_stream_serializers = {"obj", "svg", "ttl"}
|
||||||
|
|
||||||
def __init__(self, name: str, extension: str):
|
def __init__(self, name: str, extension: str):
|
||||||
self.name = name
|
self.name = name
|
||||||
self.extension = extension
|
self.extension = extension
|
||||||
@@ -637,13 +639,27 @@ class _serializer_factory:
|
|||||||
+ (obj_signature if self.name == "obj" else "")
|
+ (obj_signature if self.name == "obj" else "")
|
||||||
)
|
)
|
||||||
|
|
||||||
output_filename = self._path(output_filename)
|
if self._is_buffer(output_filename) or self._is_buffer(output_temp_filename):
|
||||||
output_temp_filename = self._path(output_temp_filename)
|
if self.name not in self._stream_serializers:
|
||||||
|
raise TypeError(f"serializers.{self.name}() requires a filesystem path")
|
||||||
|
output_filename = self._buffer(output_filename)
|
||||||
|
output_temp_filename = self._buffer(output_temp_filename)
|
||||||
|
else:
|
||||||
|
output_filename = self._path(output_filename)
|
||||||
|
output_temp_filename = self._path(output_temp_filename)
|
||||||
|
|
||||||
return ifcopenshell_wrapper.create_geometry_serializer(
|
return ifcopenshell_wrapper.create_geometry_serializer(
|
||||||
self.extension, output_filename, output_temp_filename, geometry_settings, serializer_settings
|
self.extension, output_filename, output_temp_filename, geometry_settings, serializer_settings
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def _is_buffer(self, value: Any) -> bool:
|
||||||
|
return isinstance(value, ifcopenshell_wrapper.buffer)
|
||||||
|
|
||||||
|
def _buffer(self, value: Union[str, PathLike[str], ifcopenshell_wrapper.buffer]) -> ifcopenshell_wrapper.buffer:
|
||||||
|
if self._is_buffer(value):
|
||||||
|
return value
|
||||||
|
return ifcopenshell_wrapper.buffer(self._path(value))
|
||||||
|
|
||||||
def _path(self, value: Union[str, PathLike[str]]) -> str:
|
def _path(self, value: Union[str, PathLike[str]]) -> str:
|
||||||
try:
|
try:
|
||||||
path = fspath(value)
|
path = fspath(value)
|
||||||
|
|||||||
@@ -286,12 +286,45 @@ public:
|
|||||||
serializer_settings
|
serializer_settings
|
||||||
};
|
};
|
||||||
|
|
||||||
|
initialize_serializer(extension, context);
|
||||||
|
}
|
||||||
|
|
||||||
|
PythonPluginGeometrySerializer(
|
||||||
|
const std::string& extension,
|
||||||
|
const stream_or_filename& output_filename,
|
||||||
|
const stream_or_filename& output_temp_filename,
|
||||||
|
ifcopenshell::geometry::Settings& geometry_settings,
|
||||||
|
const ifcopenshell::geometry::SerializerSettings& serializer_settings
|
||||||
|
)
|
||||||
|
: GeometrySerializer(geometry_settings, serializer_settings)
|
||||||
|
{
|
||||||
|
const auto output_filename_string = output_filename.filename().value_or("");
|
||||||
|
const auto output_temp_filename_string = output_temp_filename.filename().value_or(output_filename_string);
|
||||||
|
ifcopenshell::serializers::geometry_serializer_context context{
|
||||||
|
output_filename_string,
|
||||||
|
output_temp_filename_string,
|
||||||
|
geometry_settings,
|
||||||
|
serializer_settings,
|
||||||
|
&output_filename,
|
||||||
|
&output_temp_filename
|
||||||
|
};
|
||||||
|
|
||||||
|
initialize_serializer(extension, context);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
void initialize_serializer(
|
||||||
|
const std::string& extension,
|
||||||
|
ifcopenshell::serializers::geometry_serializer_context& context
|
||||||
|
) {
|
||||||
auto& registry = ifcopenshell::serializers::geometry_serializer_registry_instance();
|
auto& registry = ifcopenshell::serializers::geometry_serializer_registry_instance();
|
||||||
registry.configure(extension, context);
|
registry.configure(extension, context);
|
||||||
geometry_settings_ = context.geometry_settings;
|
geometry_settings_ = context.geometry_settings;
|
||||||
serializer_ = registry.create(extension, context);
|
serializer_ = registry.create(extension, context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
bool ready() override {
|
bool ready() override {
|
||||||
return serializer_->ready();
|
return serializer_->ready();
|
||||||
}
|
}
|
||||||
@@ -659,6 +692,22 @@ struct ShapeRTTI : public boost::static_visitor<PyObject*>
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GeometrySerializer* create_geometry_serializer(
|
||||||
|
const std::string& extension,
|
||||||
|
const stream_or_filename& output_filename,
|
||||||
|
const stream_or_filename& output_temp_filename,
|
||||||
|
ifcopenshell::geometry::Settings& geometry_settings,
|
||||||
|
const ifcopenshell::geometry::SerializerSettings& serializer_settings
|
||||||
|
) {
|
||||||
|
return new PythonPluginGeometrySerializer(
|
||||||
|
extension,
|
||||||
|
output_filename,
|
||||||
|
output_temp_filename,
|
||||||
|
geometry_settings,
|
||||||
|
serializer_settings
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
IfcGeom::Iterator* construct_iterator(const std::string& geometry_library, ifcopenshell::geometry::Settings settings, ifcopenshell::file* file, int num_threads) {
|
IfcGeom::Iterator* construct_iterator(const std::string& geometry_library, ifcopenshell::geometry::Settings settings, ifcopenshell::file* file, int num_threads) {
|
||||||
return new IfcGeom::Iterator(ifcopenshell::geometry::kernels::construct(file, geometry_library, settings), settings, file, num_threads);
|
return new IfcGeom::Iterator(ifcopenshell::geometry::kernels::construct(file, geometry_library, settings), settings, file, num_threads);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,6 +50,16 @@ plugin::metadata plugin_metadata() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
boost::shared_ptr<GeometrySerializer> create_serializer(const geometry_serializer_context& context) {
|
boost::shared_ptr<GeometrySerializer> create_serializer(const geometry_serializer_context& context) {
|
||||||
|
if (context.output_temp_stream || context.output_stream) {
|
||||||
|
stream_or_filename obj_filename = context.output_temp_stream
|
||||||
|
? *context.output_temp_stream
|
||||||
|
: stream_or_filename(context.output_temp_filename);
|
||||||
|
stream_or_filename mtl_filename = context.output_stream
|
||||||
|
? *context.output_stream
|
||||||
|
: stream_or_filename(obj_mtl_filename(context.output_filename));
|
||||||
|
return boost::make_shared<WaveFrontOBJSerializer>(
|
||||||
|
obj_filename, mtl_filename, context.geometry_settings, context.serializer_settings);
|
||||||
|
}
|
||||||
return boost::make_shared<WaveFrontOBJSerializer>(context.output_temp_filename, obj_mtl_filename(context.output_filename), context.geometry_settings, context.serializer_settings);
|
return boost::make_shared<WaveFrontOBJSerializer>(context.output_temp_filename, obj_mtl_filename(context.output_filename), context.geometry_settings, context.serializer_settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -54,6 +54,8 @@ struct SERIALIZERS_API geometry_serializer_context {
|
|||||||
std::string output_temp_filename;
|
std::string output_temp_filename;
|
||||||
ifcopenshell::geometry::Settings& geometry_settings;
|
ifcopenshell::geometry::Settings& geometry_settings;
|
||||||
const ifcopenshell::geometry::SerializerSettings& serializer_settings;
|
const ifcopenshell::geometry::SerializerSettings& serializer_settings;
|
||||||
|
const stream_or_filename* output_stream = nullptr;
|
||||||
|
const stream_or_filename* output_temp_stream = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
class SERIALIZERS_API geometry_serializer_registry {
|
class SERIALIZERS_API geometry_serializer_registry {
|
||||||
|
|||||||
@@ -38,6 +38,10 @@ plugin::metadata plugin_metadata() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
boost::shared_ptr<GeometrySerializer> create_serializer(const geometry_serializer_context& context) {
|
boost::shared_ptr<GeometrySerializer> create_serializer(const geometry_serializer_context& context) {
|
||||||
|
if (context.output_temp_stream) {
|
||||||
|
return boost::make_shared<SvgSerializer>(
|
||||||
|
*context.output_temp_stream, context.geometry_settings, context.serializer_settings);
|
||||||
|
}
|
||||||
return boost::make_shared<SvgSerializer>(context.output_temp_filename, context.geometry_settings, context.serializer_settings);
|
return boost::make_shared<SvgSerializer>(context.output_temp_filename, context.geometry_settings, context.serializer_settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -36,6 +36,10 @@ plugin::metadata plugin_metadata() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
boost::shared_ptr<GeometrySerializer> create_serializer(const geometry_serializer_context& context) {
|
boost::shared_ptr<GeometrySerializer> create_serializer(const geometry_serializer_context& context) {
|
||||||
|
if (context.output_temp_stream) {
|
||||||
|
return boost::make_shared<TtlWktSerializer>(
|
||||||
|
*context.output_temp_stream, context.geometry_settings, context.serializer_settings);
|
||||||
|
}
|
||||||
return boost::make_shared<TtlWktSerializer>(context.output_temp_filename, context.geometry_settings, context.serializer_settings);
|
return boost::make_shared<TtlWktSerializer>(context.output_temp_filename, context.geometry_settings, context.serializer_settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user