Fixes for placement cloning that affected layersets

This commit is contained in:
Thomas Krijnen
2019-09-22 14:01:35 +02:00
parent 7f5d733ed8
commit a10e852a35
4 changed files with 14 additions and 9 deletions
@@ -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<TopoDS_Shape> 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<TopoDS_Shape> 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;
@@ -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)
+1
View File
@@ -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
@@ -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: