diff --git a/src/bonsai/bonsai/bim/data/icons/add.png b/src/bonsai/bonsai/bim/data/icons/add.png
deleted file mode 100644
index b16b90a2a8..0000000000
Binary files a/src/bonsai/bonsai/bim/data/icons/add.png and /dev/null differ
diff --git a/src/bonsai/bonsai/bim/data/icons/add_type.png b/src/bonsai/bonsai/bim/data/icons/add_type.png
deleted file mode 100644
index a303cb0067..0000000000
Binary files a/src/bonsai/bonsai/bim/data/icons/add_type.png and /dev/null differ
diff --git a/src/bonsai/bonsai/bim/data/icons/add_void.png b/src/bonsai/bonsai/bim/data/icons/add_void.png
deleted file mode 100644
index 06e6b6859c..0000000000
Binary files a/src/bonsai/bonsai/bim/data/icons/add_void.png and /dev/null differ
diff --git a/src/bonsai/bonsai/bim/data/icons/assign.png b/src/bonsai/bonsai/bim/data/icons/assign.png
deleted file mode 100644
index 7195dc0b03..0000000000
Binary files a/src/bonsai/bonsai/bim/data/icons/assign.png and /dev/null differ
diff --git a/src/bonsai/bonsai/bim/data/icons/butt.png b/src/bonsai/bonsai/bim/data/icons/butt.png
deleted file mode 100644
index 3d3531175e..0000000000
Binary files a/src/bonsai/bonsai/bim/data/icons/butt.png and /dev/null differ
diff --git a/src/bonsai/bonsai/bim/data/icons/centerline.png b/src/bonsai/bonsai/bim/data/icons/centerline.png
deleted file mode 100644
index b75f93fff8..0000000000
Binary files a/src/bonsai/bonsai/bim/data/icons/centerline.png and /dev/null differ
diff --git a/src/bonsai/bonsai/bim/data/icons/decomposition.png b/src/bonsai/bonsai/bim/data/icons/decomposition.png
deleted file mode 100644
index b63af19882..0000000000
Binary files a/src/bonsai/bonsai/bim/data/icons/decomposition.png and /dev/null differ
diff --git a/src/bonsai/bonsai/bim/data/icons/dm_IFC.png b/src/bonsai/bonsai/bim/data/icons/dm_IFC.png
new file mode 100644
index 0000000000..d2b6e399b3
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/dm_IFC.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/dm_add.png b/src/bonsai/bonsai/bim/data/icons/dm_add.png
new file mode 100644
index 0000000000..c6c89c7d15
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/dm_add.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/dm_add_type.png b/src/bonsai/bonsai/bim/data/icons/dm_add_type.png
new file mode 100644
index 0000000000..899154bf95
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/dm_add_type.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/dm_add_void.png b/src/bonsai/bonsai/bim/data/icons/dm_add_void.png
new file mode 100644
index 0000000000..9add3ea24e
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/dm_add_void.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/dm_assign.png b/src/bonsai/bonsai/bim/data/icons/dm_assign.png
new file mode 100644
index 0000000000..cdf007a958
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/dm_assign.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/dm_butt.png b/src/bonsai/bonsai/bim/data/icons/dm_butt.png
new file mode 100644
index 0000000000..615187620f
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/dm_butt.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/dm_centerline.png b/src/bonsai/bonsai/bim/data/icons/dm_centerline.png
new file mode 100644
index 0000000000..9f52ff4985
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/dm_centerline.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/dm_centreline.png b/src/bonsai/bonsai/bim/data/icons/dm_centreline.png
new file mode 100644
index 0000000000..9f52ff4985
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/dm_centreline.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/dm_decomposition.png b/src/bonsai/bonsai/bim/data/icons/dm_decomposition.png
new file mode 100644
index 0000000000..68fbb5ff6c
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/dm_decomposition.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/dm_edit_axis.png b/src/bonsai/bonsai/bim/data/icons/dm_edit_axis.png
new file mode 100644
index 0000000000..e804527460
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/dm_edit_axis.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/dm_edit_profile.png b/src/bonsai/bonsai/bim/data/icons/dm_edit_profile.png
new file mode 100644
index 0000000000..458cae080c
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/dm_edit_profile.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/dm_extend.png b/src/bonsai/bonsai/bim/data/icons/dm_extend.png
new file mode 100644
index 0000000000..7374945a28
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/dm_extend.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/dm_exterior.png b/src/bonsai/bonsai/bim/data/icons/dm_exterior.png
new file mode 100644
index 0000000000..19533f7ce9
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/dm_exterior.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/dm_flip.png b/src/bonsai/bonsai/bim/data/icons/dm_flip.png
new file mode 100644
index 0000000000..4a108ee2fb
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/dm_flip.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/dm_interior.png b/src/bonsai/bonsai/bim/data/icons/dm_interior.png
new file mode 100644
index 0000000000..2771aecafb
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/dm_interior.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/dm_merge.png b/src/bonsai/bonsai/bim/data/icons/dm_merge.png
new file mode 100644
index 0000000000..1d78bd36a0
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/dm_merge.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/dm_mirror.png b/src/bonsai/bonsai/bim/data/icons/dm_mirror.png
new file mode 100644
index 0000000000..fb894b5898
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/dm_mirror.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/dm_mitre.png b/src/bonsai/bonsai/bim/data/icons/dm_mitre.png
new file mode 100644
index 0000000000..552906a992
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/dm_mitre.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/dm_perform_quantity_take-off.png b/src/bonsai/bonsai/bim/data/icons/dm_perform_quantity_take-off.png
new file mode 100644
index 0000000000..7b538234c7
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/dm_perform_quantity_take-off.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/dm_refresh.png b/src/bonsai/bonsai/bim/data/icons/dm_refresh.png
new file mode 100644
index 0000000000..44cedbb086
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/dm_refresh.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/dm_regen.png b/src/bonsai/bonsai/bim/data/icons/dm_regen.png
new file mode 100644
index 0000000000..79276cb2a7
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/dm_regen.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/dm_rotate_90.png b/src/bonsai/bonsai/bim/data/icons/dm_rotate_90.png
new file mode 100644
index 0000000000..32c2e2fbdf
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/dm_rotate_90.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/dm_split.png b/src/bonsai/bonsai/bim/data/icons/dm_split.png
new file mode 100644
index 0000000000..e33e105c70
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/dm_split.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/dm_unassign.png b/src/bonsai/bonsai/bim/data/icons/dm_unassign.png
new file mode 100644
index 0000000000..f2148e4949
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/dm_unassign.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/dm_unjoin_walls.png b/src/bonsai/bonsai/bim/data/icons/dm_unjoin_walls.png
new file mode 100644
index 0000000000..cb6f0f3f1f
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/dm_unjoin_walls.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/dm_void.png b/src/bonsai/bonsai/bim/data/icons/dm_void.png
new file mode 100644
index 0000000000..145bcfa38e
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/dm_void.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/edit_axis.png b/src/bonsai/bonsai/bim/data/icons/edit_axis.png
deleted file mode 100644
index c3a8cfe528..0000000000
Binary files a/src/bonsai/bonsai/bim/data/icons/edit_axis.png and /dev/null differ
diff --git a/src/bonsai/bonsai/bim/data/icons/edit_profile.png b/src/bonsai/bonsai/bim/data/icons/edit_profile.png
deleted file mode 100644
index 9c78530791..0000000000
Binary files a/src/bonsai/bonsai/bim/data/icons/edit_profile.png and /dev/null differ
diff --git a/src/bonsai/bonsai/bim/data/icons/extend.png b/src/bonsai/bonsai/bim/data/icons/extend.png
deleted file mode 100644
index c0500a9ed9..0000000000
Binary files a/src/bonsai/bonsai/bim/data/icons/extend.png and /dev/null differ
diff --git a/src/bonsai/bonsai/bim/data/icons/exterior.png b/src/bonsai/bonsai/bim/data/icons/exterior.png
deleted file mode 100644
index dcec153621..0000000000
Binary files a/src/bonsai/bonsai/bim/data/icons/exterior.png and /dev/null differ
diff --git a/src/bonsai/bonsai/bim/data/icons/flip.png b/src/bonsai/bonsai/bim/data/icons/flip.png
deleted file mode 100644
index a59a7e46ba..0000000000
Binary files a/src/bonsai/bonsai/bim/data/icons/flip.png and /dev/null differ
diff --git a/src/bonsai/bonsai/bim/data/icons/interior.png b/src/bonsai/bonsai/bim/data/icons/interior.png
deleted file mode 100644
index 2dc043eeae..0000000000
Binary files a/src/bonsai/bonsai/bim/data/icons/interior.png and /dev/null differ
diff --git a/src/bonsai/bonsai/bim/data/icons/lm_add.png b/src/bonsai/bonsai/bim/data/icons/lm_add.png
new file mode 100644
index 0000000000..8031b0577c
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/lm_add.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/lm_add_type.png b/src/bonsai/bonsai/bim/data/icons/lm_add_type.png
new file mode 100644
index 0000000000..4fb18f4f39
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/lm_add_type.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/lm_add_void.png b/src/bonsai/bonsai/bim/data/icons/lm_add_void.png
new file mode 100644
index 0000000000..90fba89728
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/lm_add_void.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/lm_assign.png b/src/bonsai/bonsai/bim/data/icons/lm_assign.png
new file mode 100644
index 0000000000..13593cc58b
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/lm_assign.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/lm_butt.png b/src/bonsai/bonsai/bim/data/icons/lm_butt.png
new file mode 100644
index 0000000000..73f33be177
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/lm_butt.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/lm_centerline.png b/src/bonsai/bonsai/bim/data/icons/lm_centerline.png
new file mode 100644
index 0000000000..c49427f1ee
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/lm_centerline.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/lm_centreline.png b/src/bonsai/bonsai/bim/data/icons/lm_centreline.png
new file mode 100644
index 0000000000..718f41601c
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/lm_centreline.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/lm_decomposition.png b/src/bonsai/bonsai/bim/data/icons/lm_decomposition.png
new file mode 100644
index 0000000000..a54ae7ae05
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/lm_decomposition.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/lm_edit_axis.png b/src/bonsai/bonsai/bim/data/icons/lm_edit_axis.png
new file mode 100644
index 0000000000..536f15cd89
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/lm_edit_axis.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/lm_edit_profile.png b/src/bonsai/bonsai/bim/data/icons/lm_edit_profile.png
new file mode 100644
index 0000000000..16af577eec
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/lm_edit_profile.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/lm_extend.png b/src/bonsai/bonsai/bim/data/icons/lm_extend.png
new file mode 100644
index 0000000000..afefb0e6b9
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/lm_extend.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/lm_exterior.png b/src/bonsai/bonsai/bim/data/icons/lm_exterior.png
new file mode 100644
index 0000000000..e0ef805a04
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/lm_exterior.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/lm_flip.png b/src/bonsai/bonsai/bim/data/icons/lm_flip.png
new file mode 100644
index 0000000000..cb5df2c97b
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/lm_flip.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/lm_ifc.png b/src/bonsai/bonsai/bim/data/icons/lm_ifc.png
new file mode 100644
index 0000000000..d4b0f9ce0c
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/lm_ifc.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/lm_interior.png b/src/bonsai/bonsai/bim/data/icons/lm_interior.png
new file mode 100644
index 0000000000..b9bf1c76a3
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/lm_interior.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/lm_merge.png b/src/bonsai/bonsai/bim/data/icons/lm_merge.png
new file mode 100644
index 0000000000..0f707f1db9
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/lm_merge.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/lm_mirror.png b/src/bonsai/bonsai/bim/data/icons/lm_mirror.png
new file mode 100644
index 0000000000..0a81d97d3f
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/lm_mirror.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/lm_mitre.png b/src/bonsai/bonsai/bim/data/icons/lm_mitre.png
new file mode 100644
index 0000000000..b58f8d3f85
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/lm_mitre.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/lm_perform_quantity_take-off.png b/src/bonsai/bonsai/bim/data/icons/lm_perform_quantity_take-off.png
new file mode 100644
index 0000000000..c9a3ae8ed3
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/lm_perform_quantity_take-off.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/lm_refresh.png b/src/bonsai/bonsai/bim/data/icons/lm_refresh.png
new file mode 100644
index 0000000000..d19a113b61
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/lm_refresh.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/lm_regen.png b/src/bonsai/bonsai/bim/data/icons/lm_regen.png
new file mode 100644
index 0000000000..3605ddc43e
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/lm_regen.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/lm_rotate_90.png b/src/bonsai/bonsai/bim/data/icons/lm_rotate_90.png
new file mode 100644
index 0000000000..9c9dd1161e
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/lm_rotate_90.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/lm_split.png b/src/bonsai/bonsai/bim/data/icons/lm_split.png
new file mode 100644
index 0000000000..d3709d08ee
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/lm_split.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/lm_unassign.png b/src/bonsai/bonsai/bim/data/icons/lm_unassign.png
new file mode 100644
index 0000000000..953ffb9799
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/lm_unassign.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/lm_unjoin_walls.png b/src/bonsai/bonsai/bim/data/icons/lm_unjoin_walls.png
new file mode 100644
index 0000000000..a67f0daa54
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/lm_unjoin_walls.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/lm_void.png b/src/bonsai/bonsai/bim/data/icons/lm_void.png
new file mode 100644
index 0000000000..68016af132
Binary files /dev/null and b/src/bonsai/bonsai/bim/data/icons/lm_void.png differ
diff --git a/src/bonsai/bonsai/bim/data/icons/merge.png b/src/bonsai/bonsai/bim/data/icons/merge.png
deleted file mode 100644
index 93adf4dc7d..0000000000
Binary files a/src/bonsai/bonsai/bim/data/icons/merge.png and /dev/null differ
diff --git a/src/bonsai/bonsai/bim/data/icons/mirror.png b/src/bonsai/bonsai/bim/data/icons/mirror.png
deleted file mode 100644
index 229802d7a5..0000000000
Binary files a/src/bonsai/bonsai/bim/data/icons/mirror.png and /dev/null differ
diff --git a/src/bonsai/bonsai/bim/data/icons/mitre.png b/src/bonsai/bonsai/bim/data/icons/mitre.png
deleted file mode 100644
index 3b1ecbfbf5..0000000000
Binary files a/src/bonsai/bonsai/bim/data/icons/mitre.png and /dev/null differ
diff --git a/src/bonsai/bonsai/bim/data/icons/perform_quantity_take-off.png b/src/bonsai/bonsai/bim/data/icons/perform_quantity_take-off.png
deleted file mode 100644
index 1f0e258bb2..0000000000
Binary files a/src/bonsai/bonsai/bim/data/icons/perform_quantity_take-off.png and /dev/null differ
diff --git a/src/bonsai/bonsai/bim/data/icons/regen.png b/src/bonsai/bonsai/bim/data/icons/regen.png
deleted file mode 100644
index 6b29ea3e51..0000000000
Binary files a/src/bonsai/bonsai/bim/data/icons/regen.png and /dev/null differ
diff --git a/src/bonsai/bonsai/bim/data/icons/rotate_90.png b/src/bonsai/bonsai/bim/data/icons/rotate_90.png
deleted file mode 100644
index 5733b85f83..0000000000
Binary files a/src/bonsai/bonsai/bim/data/icons/rotate_90.png and /dev/null differ
diff --git a/src/bonsai/bonsai/bim/data/icons/split.png b/src/bonsai/bonsai/bim/data/icons/split.png
deleted file mode 100644
index 45d789e45c..0000000000
Binary files a/src/bonsai/bonsai/bim/data/icons/split.png and /dev/null differ
diff --git a/src/bonsai/bonsai/bim/data/icons/unassign.png b/src/bonsai/bonsai/bim/data/icons/unassign.png
deleted file mode 100644
index 0359ca3824..0000000000
Binary files a/src/bonsai/bonsai/bim/data/icons/unassign.png and /dev/null differ
diff --git a/src/bonsai/bonsai/bim/data/icons/unjoin_walls.png b/src/bonsai/bonsai/bim/data/icons/unjoin_walls.png
deleted file mode 100644
index 16f3272c8f..0000000000
Binary files a/src/bonsai/bonsai/bim/data/icons/unjoin_walls.png and /dev/null differ
diff --git a/src/bonsai/bonsai/bim/data/icons/void.png b/src/bonsai/bonsai/bim/data/icons/void.png
deleted file mode 100644
index 366fa9eb9d..0000000000
Binary files a/src/bonsai/bonsai/bim/data/icons/void.png and /dev/null differ
diff --git a/src/bonsai/bonsai/bim/module/model/__init__.py b/src/bonsai/bonsai/bim/module/model/__init__.py
index ca91b7aacc..a5e4566c81 100644
--- a/src/bonsai/bonsai/bim/module/model/__init__.py
+++ b/src/bonsai/bonsai/bim/module/model/__init__.py
@@ -231,6 +231,7 @@ def unregister():
bpy.utils.unregister_tool(workspace.CableCarrierTool)
bpy.utils.unregister_tool(workspace.CableTool)
bpy.utils.unregister_tool(workspace.BimTool)
+
del bpy.types.Scene.BIMModelProperties
del bpy.types.Object.BIMArrayProperties
del bpy.types.Object.BIMStairProperties
@@ -239,7 +240,9 @@ def unregister():
del bpy.types.Object.BIMDoorProperties
del bpy.types.Object.BIMRailingProperties
del bpy.types.Object.BIMRoofProperties
+
bpy.app.handlers.load_post.remove(handler.load_post)
bpy.types.VIEW3D_MT_mesh_add.remove(ui.add_mesh_object_menu)
bpy.types.VIEW3D_MT_add.remove(ui.add_menu)
+
workspace.unload_custom_icons()
\ No newline at end of file
diff --git a/src/bonsai/bonsai/bim/module/model/workspace.py b/src/bonsai/bonsai/bim/module/model/workspace.py
index 4f97d07f89..b74141b62c 100644
--- a/src/bonsai/bonsai/bim/module/model/workspace.py
+++ b/src/bonsai/bonsai/bim/module/model/workspace.py
@@ -29,16 +29,36 @@ from bonsai.bim.module.model.data import AuthoringData
from bonsai.bim.module.system.data import PortData
from bonsai.bim.module.model.prop import get_ifc_class
-custom_icon_previews = None
+
+def check_display_mode():
+ global display_mode
+ try:
+ theme = bpy.context.preferences.themes['Default']
+ text_color = theme.user_interface.wcol_menu_item.text
+ background_color = theme.user_interface.wcol_menu_item.outline
+ print(f"text_color = {text_color}")
+ print(f"background_color = {background_color}")
+ if sum(text_color) < 2.6:
+ display_mode = "lm"
+ else:
+ display_mode = "dm"
+ except:
+ display_mode = "dm"
def load_custom_icons():
global custom_icon_previews
+ if display_mode is None:
+ check_display_mode()
+
icons_dir = os.path.join(os.path.dirname(__file__), "..", "..", "data", "icons")
custom_icon_previews = bpy.utils.previews.new()
+
+ prefix = f"{display_mode}_"
+
for entry in os.scandir(icons_dir):
- if entry.name.endswith(".png"):
- name = os.path.splitext(entry.name)[0]
+ if entry.name.endswith(".png") and entry.name.startswith(prefix):
+ name = os.path.splitext(entry.name)[0].replace(prefix, "", 1)
custom_icon_previews.load(name.upper(), entry.path, "IMAGE")
@@ -240,13 +260,6 @@ class CableTool(BimTool):
BimToolUI.draw(context, layout, ifc_element_type=cls.ifc_element_type)
-MODIFIERS = {
- "A": ("EVENT_ALT", "OPTION" if sys.platform == "Darwin" else "ALT"),
- "C": ("EVENT_CTRL", "CTRL"),
- "S": ("EVENT_SHIFT", "⇧"),
-}
-
-
def add_layout_hotkey_operator(layout, text, hotkey, description, ui_context=""):
modifier, key = hotkey.split("_")
@@ -816,7 +829,7 @@ class BimToolUI:
row = cls.layout.row(align=True)
if AuthoringData.data["relating_type_id"]:
prop_with_search(row, cls.props, "relating_type_id", text="")
- row.operator("bim.add_constr_type_instance", text=text, icon_value=custom_icon_previews["ADD"].icon_id)
+ row.operator("bim.add_constr_type_instance", text=text, icon_value=custom_icon_previews[f"ADD"].icon_id)
else:
row.label(text="No Construction Type", icon="FILE_3D")
@@ -1168,6 +1181,13 @@ class Hotkey(bpy.types.Operator, tool.Ifc.Operator):
else:
bpy.ops.bim.show_openings()
+custom_icon_previews = None
+display_mode = None
LIST_OF_TOOLS = [cls.bl_idname for cls in (BimTool.__subclasses__() + [BimTool])]
TOOLS_TO_CLASSES_MAP = {cls.bl_idname: cls.ifc_element_type for cls in BimTool.__subclasses__()}
+MODIFIERS = {
+ "A": ("EVENT_ALT", "OPTION" if sys.platform == "Darwin" else "ALT"),
+ "C": ("EVENT_CTRL", "CTRL"),
+ "S": ("EVENT_SHIFT", "⇧"),
+}
\ No newline at end of file
diff --git a/src/bonsai/scripts/bonsai_icons.svg b/src/bonsai/scripts/bonsai_icons.svg
new file mode 100644
index 0000000000..75f412a65b
--- /dev/null
+++ b/src/bonsai/scripts/bonsai_icons.svg
@@ -0,0 +1,1122 @@
+
+
+
+
diff --git a/src/bonsai/scripts/generate_png_icons.py b/src/bonsai/scripts/generate_png_icons.py
new file mode 100644
index 0000000000..e2b268ac79
--- /dev/null
+++ b/src/bonsai/scripts/generate_png_icons.py
@@ -0,0 +1,108 @@
+# the SVG_FILE should be the file that contains all the icons (each icon should be in a unique layer group, and colored for dark mode)
+# the EXPORT_FOLDER is where the png files get exported to
+# the script will export dark mode version and modify colors for a light mode verion
+# requires inkscape to run
+# to run on mac: python3 generate_png_icons.py
+
+import os
+import subprocess
+import xml.etree.ElementTree as ET
+import re
+
+SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
+SVG_FILE = os.path.join(SCRIPT_DIR, 'bonsai_icons.svg')
+EXPORT_FOLDER = os.path.join(SCRIPT_DIR, '..', 'bonsai', 'bim', 'data', 'icons')
+
+overwrite_all = False
+skip_all = False
+
+def dark_to_light(svg_content):
+ svg_content = re.sub(r'#ffffff', '#434343', svg_content, flags=re.IGNORECASE) # white to drak grey
+
+ svg_content = re.sub(r'#00d27b', '#009d5c', svg_content, flags=re.IGNORECASE) # make green darker
+ svg_content = re.sub(r'#009a5f', '#00663f', svg_content, flags=re.IGNORECASE) # make dark green darker
+ svg_content = re.sub(r'#75ffaf', '#3dff8f', svg_content, flags=re.IGNORECASE) # make light green darker
+
+ svg_content = re.sub(r'#cce3ff', '#3391ff', svg_content, flags=re.IGNORECASE) # make blue darker
+ svg_content = re.sub(r'#4c9fff', '#005fcc', svg_content, flags=re.IGNORECASE) # make dark blue darker
+ svg_content = re.sub(r'#c9e0ff', '#80b8ff', svg_content, flags=re.IGNORECASE) # make light blue darker
+
+ return svg_content
+
+def prompt_overwrite(file_path, png_name):
+ global overwrite_all, skip_all
+
+ if skip_all and os.path.exists(file_path):
+ return 'n'
+
+ if overwrite_all:
+ return 'y'
+
+ if os.path.exists(file_path):
+ while True:
+ response = input(f"File '{png_name}' already exists.\nOverwrite? (Enter = yes, s = skip, y = yes all, n = no all): ").strip().lower()
+ if response in {'', 'y', 'n', 's'}:
+ if response == 'y':
+ overwrite_all = True
+ elif response == 'n':
+ skip_all = True
+ return response
+ else:
+ print("Invalid option. Please enter Enter, y, n, or s.")
+ return ''
+
+def export_svg_group(group_content, group_label, mode, output_folder):
+ temp_svg_file = os.path.join(output_folder, f'{group_label}_{mode}.svg')
+ svg_content = f""""""
+
+ with open(temp_svg_file, 'w') as file:
+ file.write(svg_content)
+
+ png_name = f'{mode}_{group_label}.png'
+ output_png_file = os.path.join(output_folder, png_name)
+
+ user_choice = prompt_overwrite(output_png_file, png_name)
+
+ if user_choice in {'y', ''}:
+ subprocess.run(['inkscape', temp_svg_file, '--export-type=png', '--export-filename=' + output_png_file])
+ print(f'\033[32mExported PNG file: {output_png_file}\033[0m')
+
+
+ elif user_choice == 'n':
+ print(f"Skipping {png_name}")
+
+ elif user_choice == 's':
+ print(f'Skipped exporting {output_png_file}.')
+
+ os.remove(temp_svg_file)
+
+
+
+def export_svg_groups_to_png(svg_file, output_folder):
+ tree = ET.parse(svg_file)
+ root = tree.getroot()
+ ns = {'svg': 'http://www.w3.org/2000/svg'}
+
+ for group in root.findall('.//svg:g', ns):
+ group_label = group.get('{http://www.inkscape.org/namespaces/inkscape}label')
+ if not group_label:
+ continue
+
+ style = group.get('style', '')
+ if 'display:none' in style:
+ style = style.replace('display:none', 'display:inline')
+ elif 'display' not in style:
+ style += ';display:inline'
+ group.set('style', style)
+
+ group_content = ET.tostring(group, encoding='unicode', method='xml')
+ export_svg_group(group_content, group_label, 'dm', output_folder)
+ light_mode_svg = dark_to_light(group_content)
+ export_svg_group(light_mode_svg, group_label, 'lm', output_folder)
+
+if __name__ == "__main__":
+ os.makedirs(EXPORT_FOLDER, exist_ok=True)
+ export_svg_groups_to_png(SVG_FILE, EXPORT_FOLDER)