mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-21 13:43:40 +00:00
Add simple section cut results caching
This commit is contained in:
@@ -51,7 +51,9 @@ class IfcCutter:
|
|||||||
self.unit = None
|
self.unit = None
|
||||||
self.resolved_pixels = set()
|
self.resolved_pixels = set()
|
||||||
self.should_get_background = False
|
self.should_get_background = False
|
||||||
self.pickle_file = 'shapes.pickle'
|
self.shapes_pickle_file = 'shapes.pickle'
|
||||||
|
self.cut_pickle_file = 'cut.pickle'
|
||||||
|
self.should_recut = True
|
||||||
self.diagram_name = None
|
self.diagram_name = None
|
||||||
self.background_image = None
|
self.background_image = None
|
||||||
self.section_box = {
|
self.section_box = {
|
||||||
@@ -121,10 +123,13 @@ class IfcCutter:
|
|||||||
break
|
break
|
||||||
|
|
||||||
def get_product_shapes(self):
|
def get_product_shapes(self):
|
||||||
|
if os.path.isfile(self.cut_pickle_file):
|
||||||
|
return
|
||||||
|
|
||||||
shape_map = {}
|
shape_map = {}
|
||||||
|
|
||||||
if os.path.isfile(self.pickle_file):
|
if os.path.isfile(self.shapes_pickle_file):
|
||||||
with open(self.pickle_file, 'rb') as shape_file:
|
with open(self.shapes_pickle_file, 'rb') as shape_file:
|
||||||
shape_map = pickle.load(shape_file)
|
shape_map = pickle.load(shape_file)
|
||||||
|
|
||||||
settings = ifcopenshell.geom.settings()
|
settings = ifcopenshell.geom.settings()
|
||||||
@@ -148,8 +153,8 @@ class IfcCutter:
|
|||||||
except:
|
except:
|
||||||
print('Failed to create shape for {}'.format(product))
|
print('Failed to create shape for {}'.format(product))
|
||||||
|
|
||||||
if not os.path.isfile(self.pickle_file):
|
if not os.path.isfile(self.shapes_pickle_file):
|
||||||
with open(self.pickle_file, 'wb') as shape_file:
|
with open(self.shapes_pickle_file, 'wb') as shape_file:
|
||||||
pickle.dump(shape_map, shape_file, protocol=pickle.HIGHEST_PROTOCOL)
|
pickle.dump(shape_map, shape_file, protocol=pickle.HIGHEST_PROTOCOL)
|
||||||
|
|
||||||
def sort_background_elements(self, reverse=None):
|
def sort_background_elements(self, reverse=None):
|
||||||
@@ -477,6 +482,11 @@ class IfcCutter:
|
|||||||
return edges
|
return edges
|
||||||
|
|
||||||
def get_cut_polygons(self):
|
def get_cut_polygons(self):
|
||||||
|
if os.path.isfile(self.cut_pickle_file):
|
||||||
|
with open(self.cut_pickle_file, 'rb') as pickle_file:
|
||||||
|
self.cut_polygons = pickle.load(pickle_file)
|
||||||
|
return
|
||||||
|
|
||||||
total_product_shapes = len(self.product_shapes)
|
total_product_shapes = len(self.product_shapes)
|
||||||
n = 0
|
n = 0
|
||||||
for product, shape in self.product_shapes:
|
for product, shape in self.product_shapes:
|
||||||
@@ -497,11 +507,20 @@ class IfcCutter:
|
|||||||
wire = topods.Wire(wire_shape)
|
wire = topods.Wire(wire_shape)
|
||||||
face = OCC.BRepBuilderAPI.BRepBuilderAPI_MakeFace(wire).Face()
|
face = OCC.BRepBuilderAPI.BRepBuilderAPI_MakeFace(wire).Face()
|
||||||
|
|
||||||
|
points = []
|
||||||
|
exp = OCC.BRepTools.BRepTools_WireExplorer(wire)
|
||||||
|
while exp.More():
|
||||||
|
point = OCC.BRep.BRep_Tool.Pnt(exp.CurrentVertex())
|
||||||
|
points.append((point.X(), -point.Y()))
|
||||||
|
exp.Next()
|
||||||
self.cut_polygons.append({
|
self.cut_polygons.append({
|
||||||
'raw': product,
|
'global_id': product.GlobalId,
|
||||||
'geometry': wire,
|
'points': points
|
||||||
'geometry_face': face
|
})
|
||||||
})
|
|
||||||
|
if not os.path.isfile(self.cut_pickle_file):
|
||||||
|
with open(self.cut_pickle_file, 'wb') as pickle_file:
|
||||||
|
pickle.dump(self.cut_polygons, pickle_file, protocol=pickle.HIGHEST_PROTOCOL)
|
||||||
|
|
||||||
def connect_edges_into_wires(self, unconnected_edges):
|
def connect_edges_into_wires(self, unconnected_edges):
|
||||||
edges = OCC.TopTools.TopTools_HSequenceOfShape()
|
edges = OCC.TopTools.TopTools_HSequenceOfShape()
|
||||||
@@ -694,15 +713,20 @@ class SvgWriter():
|
|||||||
self.svg.add(self.svg.line(start=points[0], end=points[1], class_=' '.join(classes)))
|
self.svg.add(self.svg.line(start=points[0], end=points[1], class_=' '.join(classes)))
|
||||||
|
|
||||||
def draw_polygon(self, polygon, position):
|
def draw_polygon(self, polygon, position):
|
||||||
classes = self.get_classes(polygon['raw'], position)
|
classes = self.get_classes(self.get_ifc_element(polygon['global_id']), position)
|
||||||
exp = OCC.BRepTools.BRepTools_WireExplorer(polygon['geometry'])
|
points = [(p[0] * self.scale, p[1] * self.scale) for p in polygon['points']]
|
||||||
points = []
|
|
||||||
while exp.More():
|
|
||||||
point = OCC.BRep.BRep_Tool.Pnt(exp.CurrentVertex())
|
|
||||||
points.append((point.X() * self.scale, -point.Y() * self.scale))
|
|
||||||
exp.Next()
|
|
||||||
self.svg.add(self.svg.polygon(points=points, class_=' '.join(classes)))
|
self.svg.add(self.svg.polygon(points=points, class_=' '.join(classes)))
|
||||||
|
|
||||||
|
def get_ifc_element(self, global_id):
|
||||||
|
# TODO: make this less bad
|
||||||
|
element = None
|
||||||
|
for ifc_file in self.ifc_cutter.ifc_files:
|
||||||
|
try:
|
||||||
|
element = ifc_file.by_id(global_id)
|
||||||
|
return element
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
def get_classes(self, element, position):
|
def get_classes(self, element, position):
|
||||||
classes = [position, element.is_a()]
|
classes = [position, element.is_a()]
|
||||||
for association in element.HasAssociations:
|
for association in element.HasAssociations:
|
||||||
|
|||||||
@@ -802,7 +802,9 @@ class CutSection(bpy.types.Operator):
|
|||||||
'shape': None,
|
'shape': None,
|
||||||
'face': None
|
'face': None
|
||||||
}
|
}
|
||||||
ifc_cutter.pickle_file = os.path.join(ifc_cutter.data_dir, 'shapes.pickle')
|
ifc_cutter.shapes_pickle_file = os.path.join(ifc_cutter.data_dir, 'shapes.pickle')
|
||||||
|
ifc_cutter.cut_pickle_file = os.path.join(ifc_cutter.data_dir, 'cut.pickle')
|
||||||
|
ifc_cutter.should_recut = bpy.context.scene.DocProperties.should_recut
|
||||||
svg_writer = cut_ifc.SvgWriter(ifc_cutter)
|
svg_writer = cut_ifc.SvgWriter(ifc_cutter)
|
||||||
numerator, denominator = bpy.context.scene.DocProperties.diagram_scale.split(':')
|
numerator, denominator = bpy.context.scene.DocProperties.diagram_scale.split(':')
|
||||||
svg_writer.scale = float(numerator) / float(denominator)
|
svg_writer.scale = float(numerator) / float(denominator)
|
||||||
|
|||||||
@@ -194,6 +194,7 @@ class Subcontext(PropertyGroup):
|
|||||||
|
|
||||||
class DocProperties(PropertyGroup):
|
class DocProperties(PropertyGroup):
|
||||||
diagram_scale: EnumProperty(items=getDiagramScales, name='Diagram Scale')
|
diagram_scale: EnumProperty(items=getDiagramScales, name='Diagram Scale')
|
||||||
|
should_recut: BoolProperty(name="Should Recut", default=True)
|
||||||
|
|
||||||
|
|
||||||
class BIMProperties(PropertyGroup):
|
class BIMProperties(PropertyGroup):
|
||||||
|
|||||||
@@ -193,6 +193,9 @@ class BIM_PT_documentation(Panel):
|
|||||||
layout = self.layout
|
layout = self.layout
|
||||||
props = bpy.context.scene.DocProperties
|
props = bpy.context.scene.DocProperties
|
||||||
|
|
||||||
|
row = layout.row()
|
||||||
|
row.prop(props, 'should_recut')
|
||||||
|
|
||||||
row = layout.row(align=True)
|
row = layout.row(align=True)
|
||||||
row.prop(props, 'diagram_scale', text='')
|
row.prop(props, 'diagram_scale', text='')
|
||||||
row.operator('bim.cut_section')
|
row.operator('bim.cut_section')
|
||||||
|
|||||||
Reference in New Issue
Block a user