mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-10-03 21:38:12 +00:00
Fixes for placement cloning that affected layersets
This commit is contained in:
@@ -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) {
|
for (ConversionResults::const_iterator it = items.begin(); it != items.end(); ++it) {
|
||||||
TopoDS_Shape a,b;
|
TopoDS_Shape a,b;
|
||||||
if (split_solid_by_shell(*(OpenCascadeShape*)it->Shape(), shells.First(), 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() ? it->Placement()->clone() : nullptr, 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(a), styles[1] ? styles[1] : &it->Style()));
|
||||||
} else {
|
} else {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -2135,7 +2135,7 @@ bool IfcGeom::Kernel::apply_folded_layerset(const ConversionResults& items, cons
|
|||||||
std::vector<TopoDS_Shape> slices;
|
std::vector<TopoDS_Shape> slices;
|
||||||
if (split(*this, *(OpenCascadeShape*)it->Shape(), shells, getValue(GV_PRECISION), slices) && slices.size() == styles.size()) {
|
if (split(*this, *(OpenCascadeShape*)it->Shape(), shells, getValue(GV_PRECISION), slices) && slices.size() == styles.size()) {
|
||||||
for (size_t i = 0; i < slices.size(); ++i) {
|
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 {
|
} else {
|
||||||
return false;
|
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) {
|
for (ConversionResults::const_iterator it = items.begin(); it != items.end(); ++it) {
|
||||||
TopoDS_Shape a,b;
|
TopoDS_Shape a,b;
|
||||||
if (split_solid_by_surface(*(OpenCascadeShape*)it->Shape(), surfaces[1], 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() ? it->Placement()->clone() : nullptr, 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(a), styles[1] ? styles[1] : &it->Style()));
|
||||||
} else {
|
} else {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -2219,7 +2219,7 @@ bool IfcGeom::Kernel::apply_layerset(const ConversionResults& items, const std::
|
|||||||
std::vector<TopoDS_Shape> slices;
|
std::vector<TopoDS_Shape> slices;
|
||||||
if (split(*this, *(OpenCascadeShape*)it->Shape(), operands, getValue(GV_PRECISION), slices) && slices.size() == styles.size()) {
|
if (split(*this, *(OpenCascadeShape*)it->Shape(), operands, getValue(GV_PRECISION), slices) && slices.size() == styles.size()) {
|
||||||
for (size_t i = 0; i < slices.size(); ++i) {
|
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 {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -60,9 +60,9 @@ namespace IfcGeom {
|
|||||||
const SurfaceStyle* style;
|
const SurfaceStyle* style;
|
||||||
public:
|
public:
|
||||||
ConversionResult(int id, const ConversionResultPlacement* placement, const ConversionResultShape* shape, const SurfaceStyle* style)
|
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)
|
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)
|
ConversionResult(int id, const ConversionResultShape* shape, const SurfaceStyle* style)
|
||||||
: id(id), placement(0), shape(shape->clone()), style(style) {}
|
: id(id), placement(0), shape(shape->clone()), style(style) {}
|
||||||
ConversionResult(int id, const ConversionResultShape* shape)
|
ConversionResult(int id, const ConversionResultShape* shape)
|
||||||
|
|||||||
@@ -578,6 +578,7 @@ public:
|
|||||||
total_volume = (volume_count + surface_count / 2) * (vsize * vsize * vsize);
|
total_volume = (volume_count + surface_count / 2) * (vsize * vsize * vsize);
|
||||||
}
|
}
|
||||||
delete surface;
|
delete surface;
|
||||||
|
put_json(TOTAL_SHAPE_VOLUME, total_volume);
|
||||||
put_json(TOTAL_SHAPE_VOLUME_VOXELS, total_volume);
|
put_json(TOTAL_SHAPE_VOLUME_VOXELS, total_volume);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -40,6 +40,9 @@ class message_headers(object):
|
|||||||
DEFLECTION = LOG + 1
|
DEFLECTION = LOG + 1
|
||||||
SETTING = DEFLECTION + 1
|
SETTING = DEFLECTION + 1
|
||||||
|
|
||||||
|
CALCULATE_QUANTITIES = numpy.int32((1 << 4))
|
||||||
|
APPLY_LAYERSETS = numpy.int32((1 << 13))
|
||||||
|
|
||||||
def cast(data, dtype, n=None):
|
def cast(data, dtype, n=None):
|
||||||
arr = numpy.frombuffer(data, dtype=dtype)
|
arr = numpy.frombuffer(data, dtype=dtype)
|
||||||
if n is None: return arr[0]
|
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
|
# @todo: no need to read the entire file in memory
|
||||||
s = open(ifc_filename, "rb").read()
|
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)])
|
write(message_headers.IFC_MODEL, [numpy.int32(len(s)), s, b"\x00" * ((4 - (len(s) % 4)) % 4)])
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
|
|||||||
Reference in New Issue
Block a user