diff --git a/src/ifcgeom/kernels/opencascade/IfcGeomFunctions.cpp b/src/ifcgeom/kernels/opencascade/IfcGeomFunctions.cpp index 6d06c33fa9..e5af3d0a94 100644 --- a/src/ifcgeom/kernels/opencascade/IfcGeomFunctions.cpp +++ b/src/ifcgeom/kernels/opencascade/IfcGeomFunctions.cpp @@ -2115,8 +2115,8 @@ bool IfcGeom::Kernel::apply_folded_layerset(const ConversionResults& items, cons for (ConversionResults::const_iterator it = items.begin(); it != items.end(); ++it) { TopoDS_Shape a,b; if (split_solid_by_shell(*(OpenCascadeShape*)it->Shape(), shells.First(), a, b)) { - result.push_back(ConversionResult(it->ItemId(), it->Placement()->clone(), new OpenCascadeShape(b), styles[0] ? styles[0] : &it->Style())); - result.push_back(ConversionResult(it->ItemId(), it->Placement()->clone(), new OpenCascadeShape(a), styles[1] ? styles[1] : &it->Style())); + result.push_back(ConversionResult(it->ItemId(), it->Placement() ? it->Placement()->clone() : nullptr, new OpenCascadeShape(b), styles[0] ? styles[0] : &it->Style())); + result.push_back(ConversionResult(it->ItemId(), it->Placement() ? it->Placement()->clone() : nullptr, new OpenCascadeShape(a), styles[1] ? styles[1] : &it->Style())); } else { continue; } @@ -2135,7 +2135,7 @@ bool IfcGeom::Kernel::apply_folded_layerset(const ConversionResults& items, cons std::vector slices; if (split(*this, *(OpenCascadeShape*)it->Shape(), shells, getValue(GV_PRECISION), slices) && slices.size() == styles.size()) { for (size_t i = 0; i < slices.size(); ++i) { - result.push_back(ConversionResult(it->ItemId(), it->Placement()->clone(), new OpenCascadeShape(slices[i]), styles[i] ? styles[i] : &it->Style())); + result.push_back(ConversionResult(it->ItemId(), it->Placement() ? it->Placement()->clone() : nullptr, new OpenCascadeShape(slices[i]), styles[i] ? styles[i] : &it->Style())); } } else { return false; @@ -2158,8 +2158,8 @@ bool IfcGeom::Kernel::apply_layerset(const ConversionResults& items, const std:: for (ConversionResults::const_iterator it = items.begin(); it != items.end(); ++it) { TopoDS_Shape a,b; if (split_solid_by_surface(*(OpenCascadeShape*)it->Shape(), surfaces[1], a, b)) { - result.push_back(ConversionResult(it->ItemId(), it->Placement()->clone(), new OpenCascadeShape(b), styles[0] ? styles[0] : &it->Style())); - result.push_back(ConversionResult(it->ItemId(), it->Placement()->clone(), new OpenCascadeShape(a), styles[1] ? styles[1] : &it->Style())); + result.push_back(ConversionResult(it->ItemId(), it->Placement() ? it->Placement()->clone() : nullptr, new OpenCascadeShape(b), styles[0] ? styles[0] : &it->Style())); + result.push_back(ConversionResult(it->ItemId(), it->Placement() ? it->Placement()->clone() : nullptr, new OpenCascadeShape(a), styles[1] ? styles[1] : &it->Style())); } else { continue; } @@ -2219,7 +2219,7 @@ bool IfcGeom::Kernel::apply_layerset(const ConversionResults& items, const std:: std::vector slices; if (split(*this, *(OpenCascadeShape*)it->Shape(), operands, getValue(GV_PRECISION), slices) && slices.size() == styles.size()) { for (size_t i = 0; i < slices.size(); ++i) { - result.push_back(ConversionResult(it->ItemId(), it->Placement()->clone(), new OpenCascadeShape(slices[i]), styles[i] ? styles[i] : &it->Style())); + result.push_back(ConversionResult(it->ItemId(), it->Placement() ? it->Placement()->clone() : nullptr, new OpenCascadeShape(slices[i]), styles[i] ? styles[i] : &it->Style())); } } else { return false; diff --git a/src/ifcgeom/schema_agnostic/ConversionResult.h b/src/ifcgeom/schema_agnostic/ConversionResult.h index b7b9301e2e..6ae7319fe0 100644 --- a/src/ifcgeom/schema_agnostic/ConversionResult.h +++ b/src/ifcgeom/schema_agnostic/ConversionResult.h @@ -60,9 +60,9 @@ namespace IfcGeom { const SurfaceStyle* style; public: ConversionResult(int id, const ConversionResultPlacement* placement, const ConversionResultShape* shape, const SurfaceStyle* style) - : id(id), placement(placement->clone()), shape(shape->clone()), style(style) {} + : id(id), placement(placement ? placement->clone() : nullptr), shape(shape->clone()), style(style) {} ConversionResult(int id, const ConversionResultPlacement* placement, const ConversionResultShape* shape) - : id(id), placement(placement->clone()), shape(shape->clone()), style(0) {} + : id(id), placement(placement ? placement->clone() : nullptr), shape(shape->clone()), style(0) {} ConversionResult(int id, const ConversionResultShape* shape, const SurfaceStyle* style) : id(id), placement(0), shape(shape->clone()), style(style) {} ConversionResult(int id, const ConversionResultShape* shape) diff --git a/src/ifcgeomserver/IfcGeomServer.cpp b/src/ifcgeomserver/IfcGeomServer.cpp index dd98e0548f..35cfacebd0 100644 --- a/src/ifcgeomserver/IfcGeomServer.cpp +++ b/src/ifcgeomserver/IfcGeomServer.cpp @@ -578,6 +578,7 @@ public: total_volume = (volume_count + surface_count / 2) * (vsize * vsize * vsize); } delete surface; + put_json(TOTAL_SHAPE_VOLUME, total_volume); put_json(TOTAL_SHAPE_VOLUME_VOXELS, total_volume); } #endif diff --git a/src/ifcopenshell-python/ifcopenshell/geom/client.py b/src/ifcopenshell-python/ifcopenshell/geom/client.py index 6e1cc0d645..a740980b12 100644 --- a/src/ifcopenshell-python/ifcopenshell/geom/client.py +++ b/src/ifcopenshell-python/ifcopenshell/geom/client.py @@ -40,6 +40,9 @@ class message_headers(object): DEFLECTION = LOG + 1 SETTING = DEFLECTION + 1 +CALCULATE_QUANTITIES = numpy.int32((1 << 4)) +APPLY_LAYERSETS = numpy.int32((1 << 13)) + def cast(data, dtype, n=None): arr = numpy.frombuffer(data, dtype=dtype) if n is None: return arr[0] @@ -144,7 +147,8 @@ def process(geomserver_exe, ifc_filename): # @todo: no need to read the entire file in memory s = open(ifc_filename, "rb").read() - write(message_headers.SETTING, [numpy.int32((1 << 4)), numpy.int32(1)]) + write(message_headers.SETTING, [CALCULATE_QUANTITIES, numpy.int32(1)]) + write(message_headers.SETTING, [APPLY_LAYERSETS, numpy.int32(1)]) write(message_headers.IFC_MODEL, [numpy.int32(len(s)), s, b"\x00" * ((4 - (len(s) % 4)) % 4)]) while True: