Skip to content
This repository was archived by the owner on Nov 24, 2024. It is now read-only.

Commit 37e4f98

Browse files
committed
Implement fully undo/redo with checks
While these actions are short in the backend--taking about 0.01 seconds to run--the Blender UI lags a lot leading to 2-3 second pauses because of the "refresh_brick_viewer" function being slow. This should be investigated.
1 parent 2ce32c6 commit 37e4f98

5 files changed

Lines changed: 40 additions & 5 deletions

File tree

src/blenderbim/blenderbim/bim/module/brick/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
operator.RewindBrickClass,
3434
operator.ViewBrickClass,
3535
operator.ViewBrickItem,
36+
operator.UndoBrick,
37+
operator.RedoBrick,
3638
operator.SerializeBrick,
3739
prop.Brick,
3840
prop.BIMBrickProperties,

src/blenderbim/blenderbim/bim/module/brick/operator.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,20 @@ def _execute(self, context):
190190
brick_uri=props.bricks[props.active_brick_index].uri,
191191
)
192192

193+
class UndoBrick(bpy.types.Operator, Operator):
194+
bl_idname = "bim.undo_brick"
195+
bl_label = "Undo Brick"
196+
197+
def _execute(self, context):
198+
core.undo_brick(tool.Brick)
199+
200+
class RedoBrick(bpy.types.Operator, Operator):
201+
bl_idname = "bim.redo_brick"
202+
bl_label = "Redo Brick"
203+
204+
def _execute(self, context):
205+
core.redo_brick(tool.Brick)
206+
193207
class SerializeBrick(bpy.types.Operator, Operator):
194208
bl_idname = "bim.serialize_brick"
195209
bl_label = "Serialize Brick"

src/blenderbim/blenderbim/bim/module/brick/ui.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@ def draw(self, context):
5858
row.operator("bim.add_brick_feed", text="", icon="PLUGIN")
5959
row.operator("bim.remove_brick", text="", icon="X")
6060

61+
row = self.layout.row(align=True)
62+
row.operator("bim.undo_brick", icon="LOOP_BACK")
63+
row.operator("bim.redo_brick", icon="LOOP_FORWARDS")
64+
6165
row = self.layout.row(align=True)
6266
row.operator("bim.serialize_brick")
6367

src/blenderbim/blenderbim/core/brick.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,5 +110,13 @@ def remove_brick(ifc, brick, library=None, brick_uri=None):
110110
brick.remove_brick(brick_uri)
111111
brick.run_refresh_brick_viewer()
112112

113+
def undo_brick(brick):
114+
brick.undo_brick()
115+
brick.run_refresh_brick_viewer()
116+
117+
def redo_brick(brick):
118+
brick.redo_brick()
119+
brick.run_refresh_brick_viewer()
120+
113121
def serialize_brick(brick, file_name="BlenderBIMSerializeTest.ttl"):
114122
brick.serialize_brick(file_name)

src/blenderbim/blenderbim/tool/brick.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -282,9 +282,10 @@ def pop_brick_breadcrumb(cls):
282282

283283
@classmethod
284284
def remove_brick(cls, brick_uri):
285-
with BrickStore.graph.new_changeset("PROJECT") as cs:
286-
for triple in BrickStore.graph.triples((URIRef(brick_uri), None, None)):
287-
cs.remove(triple)
285+
if(BrickStore.graph.triples((URIRef(brick_uri), None, None))):
286+
with BrickStore.graph.new_changeset("PROJECT") as cs:
287+
for triple in BrickStore.graph.triples((URIRef(brick_uri), None, None)):
288+
cs.remove(triple)
288289

289290
@classmethod
290291
def run_assign_brick_reference(cls, element=None, library=None, brick_uri=None):
@@ -312,11 +313,17 @@ def set_active_brick_class(cls, brick_class):
312313

313314
@classmethod
314315
def undo_brick(cls):
315-
BrickStore.graph.undo()
316+
if(len(BrickStore.graph.versions()) > 1):
317+
BrickStore.graph.undo()
316318

317319
@classmethod
318320
def redo_brick(cls):
319-
BrickStore.graph.redo()
321+
with BrickStore.graph.conn() as conn:
322+
redo_record = conn.execute(
323+
"SELECT * from redos " "ORDER BY timestamp ASC LIMIT 1"
324+
).fetchone()
325+
if redo_record is not None:
326+
BrickStore.graph.redo()
320327

321328
@classmethod
322329
def serialize_brick(cls, file_name):

0 commit comments

Comments
 (0)