#4532 : You can now store clipping planes to a json file and restore them

The file is stored along the ifc file
This commit is contained in:
Gorgious56
2024-04-17 11:52:00 +02:00
parent a748dda378
commit 6f8dcc637f
3 changed files with 65 additions and 1 deletions
@@ -25,6 +25,8 @@ classes = (
operator.AppendLibraryElement, operator.AppendLibraryElement,
operator.AppendLibraryElementByQuery, operator.AppendLibraryElementByQuery,
operator.AssignLibraryDeclaration, operator.AssignLibraryDeclaration,
operator.BIM_OT_load_clipping_planes,
operator.BIM_OT_save_clipping_planes,
operator.ChangeLibraryElement, operator.ChangeLibraryElement,
operator.CreateClippingPlane, operator.CreateClippingPlane,
operator.CreateProject, operator.CreateProject,
@@ -39,6 +39,8 @@ from blenderbim.bim.ifc import IfcStore
from blenderbim.bim.ui import IFCFileSelector from blenderbim.bim.ui import IFCFileSelector
from blenderbim.bim import import_ifc from blenderbim.bim import import_ifc
from blenderbim.bim import export_ifc from blenderbim.bim import export_ifc
from collections import defaultdict
import json
from math import radians from math import radians
from pathlib import Path from pathlib import Path
from mathutils import Vector, Matrix from mathutils import Vector, Matrix
@@ -1999,3 +2001,61 @@ class FlipClippingPlane(bpy.types.Operator):
obj.rotation_euler[0] += radians(180) obj.rotation_euler[0] += radians(180)
context.view_layer.update() context.view_layer.update()
return {"FINISHED"} return {"FINISHED"}
CLIPPING_PLANES_FILE_NAME = "ClippingPlanes.json" # TODO un-hardcode :=
class BIM_OT_save_clipping_planes(bpy.types.Operator):
bl_idname = "bim.save_clipping_planes"
bl_label = "Save Clipping Planes"
bl_description = "Save Clipping Planes to Disk"
bl_options = {"REGISTER", "UNDO"}
@classmethod
def poll(cls, context):
if IfcStore.path:
return context.scene.BIMProjectProperties.clipping_planes
cls.poll_message_set("Please Save The IFC File")
def execute(self, context):
clipping_planes_to_serialize = defaultdict(dict)
clipping_planes = context.scene.BIMProjectProperties.clipping_planes
for clipping_plane in clipping_planes:
obj = clipping_plane.obj
name = obj.name
clipping_planes_to_serialize[name]["location"] = obj.location[0:3]
clipping_planes_to_serialize[name]["rotation"] = obj.rotation_euler[0:3]
with open(Path(IfcStore.path).with_name(CLIPPING_PLANES_FILE_NAME), "w") as file:
json.dump(clipping_planes_to_serialize, file, indent=4)
return {"FINISHED"}
class BIM_OT_load_clipping_planes(bpy.types.Operator):
bl_idname = "bim.load_clipping_planes"
bl_label = "Load Clipping Planes"
bl_description = "Load Clipping Planes from Disk"
bl_options = {"REGISTER", "UNDO"}
@classmethod
def poll(cls, context):
if filepath := IfcStore.path:
if Path(filepath).with_name(CLIPPING_PLANES_FILE_NAME).exists():
return True
else:
cls.poll_message_set(f"No Clipping Planes File in Folder {filepath}")
else:
cls.poll_message_set("Please Save The IFC File")
def execute(self, context):
bpy.data.batch_remove(context.scene.BIMProjectProperties.clipping_planes_objs)
context.scene.BIMProjectProperties.clipping_planes.clear()
with open(Path(IfcStore.path).with_name(CLIPPING_PLANES_FILE_NAME), "r") as file:
clipping_planes_dict = json.load(file)
for name, values in clipping_planes_dict.items():
bpy.ops.bim.create_clipping_plane()
obj = context.scene.BIMProjectProperties.clipping_planes_objs[-1]
obj.name = name
obj.location = values["location"]
obj.rotation_euler = values["rotation"]
return {"FINISHED"}
+3 -1
View File
@@ -131,6 +131,8 @@ class BIM_PT_section_with_cappings(Panel):
box = layout.box() box = layout.box()
header = box.row(align=True) header = box.row(align=True)
header.label(text="Clipping Planes") header.label(text="Clipping Planes")
header.operator("bim.save_clipping_planes", text="", icon="EXPORT")
header.operator("bim.load_clipping_planes", text="", icon="IMPORT")
header.operator("bim.create_clipping_plane", text="", icon="ADD") header.operator("bim.create_clipping_plane", text="", icon="ADD")
box.template_list( box.template_list(
@@ -150,7 +152,7 @@ class BIM_PT_section_with_cappings(Panel):
class BIM_UL_clipping_plane(bpy.types.UIList): class BIM_UL_clipping_plane(bpy.types.UIList):
def draw_item(self, context, layout, data, item, icon, active_data, active_propname): def draw_item(self, context, layout, data, item, icon, active_data, active_propname):
if item: if item and item.obj:
obj = item.obj obj = item.obj
row = layout.row(align=True) row = layout.row(align=True)
row.prop(obj, "name", text="", emboss=False) row.prop(obj, "name", text="", emboss=False)