Cleanup: quiet float argument to in type warning
[blender-addons.git] / render_povray / ui_core.py
blob0dd3c0efce9384834bc29dd602f34ecd68d92bff
1 # SPDX-License-Identifier: GPL-2.0-or-later
3 """User interface imports and preferences for the addon."""
5 # import addon_utils
6 # from time import sleep
7 import bpy
8 import os
10 from bpy.app.handlers import persistent
11 from pathlib import Path
13 # from bpy.utils import register_class, unregister_class
14 # from bpy.types import (
15 # Operator,
16 # Menu,
17 # UIList,
18 # Panel,
19 # Brush,
20 # Material,
21 # Light,
22 # World,
23 # ParticleSettings,
24 # FreestyleLineStyle,
25 # )
27 # from bl_operators.presets import AddPresetBase
29 from . import (
30 render_gui,
31 scenography_gui,
32 model_gui,
33 shading_gui,
34 texturing_gui,
35 nodes, # for POV specific nodes
36 scripting_gui,
37 update_files,
41 # ------------ POV-Centric WORKSPACE ------------ #
42 @persistent
43 def pov_centric_moray_like_workspace(dummy):
44 """Set up a POV centric Workspace if addon was activated and saved as default renderer.
46 This would bring a ’_RestrictData’ error because UI needs to be fully loaded before
47 workspace changes so registering this function in bpy.app.handlers is needed.
48 By default handlers are freed when loading new files, but here we want the handler
49 to stay running across multiple files as part of this add-on. That is why the
50 bpy.app.handlers.persistent decorator is used (@persistent) above.
51 """
52 # Scripting workspace may have been altered from factory though, so should
53 # we put all within a Try... Except AttributeErrors ? Any better solution ?
54 # Should it simply not run when opening existing file? be a preferences operator to create
55 # Moray like workspace
58 # -----------------------------------UTF-8---------------------------------- #
59 # Check and fix all strings in current .blend file to be valid UTF-8 Unicode
60 # sometimes needed for old, 2.4x / 2.6x area files
61 try:
62 bpy.ops.wm.blend_strings_utf8_validate()
63 except BaseException as e:
64 print(e.__doc__)
65 print("An exception occurred: {}".format(e))
66 pass
67 # --------------------------------Workspaces------------------------------- #
69 # If this file is not the default do nothing so as to not mess up project dependant workspaces
70 if bpy.data.filepath:
71 return
73 available_workspaces = bpy.data.workspaces
75 if all(tabs in available_workspaces for tabs in ["POV-Mo", "POV-Ed"]):
76 print(
77 "\nPOV-Mo and POV-Ed tabs respectively provide GUI and TEXT\n"
78 "oriented POV workspaces akin to Moray and POVWIN"
80 return
81 if "POV-Ed" not in available_workspaces:
82 print(
83 "\nTo use POV centric workspaces you can set POV render option\n"
84 "and save it with File > Defaults > Save Startup File menu"
86 try:
87 if all(
88 othertabs not in available_workspaces
89 for othertabs in ["Geometry Nodes", "POV-Ed"]
91 bpy.ops.workspace.append_activate(
92 idname="Geometry Nodes",
93 filepath=os.path.join(bpy.utils.user_resource("CONFIG"), "startup.blend"),
95 except BaseException as e:
96 print(e.__doc__)
97 print("An exception occurred: {}".format(e))
98 try:
99 # Last resort: try to import from the blender templates
100 for p in Path(next(bpy.utils.app_template_paths())).rglob("startup.blend"):
101 bpy.ops.workspace.append_activate(idname="Geometry Nodes", filepath=str(p))
102 except BaseException as e:
103 print(e.__doc__)
104 print("An exception occurred: {}".format(e))
105 # Giving up as prerequisites can't be found
106 print(
107 "\nFactory Geometry Nodes workspace needed for POV text centric"
108 "\nworkspace to activate when POV is set as default renderer"
110 finally:
111 # Create POVWIN like editor (text oriented editing)
112 if (
113 "POV-Ed" not in available_workspaces
114 and "Geometry Nodes" in available_workspaces
116 wsp = available_workspaces.get("Geometry Nodes")
117 context = bpy.context
118 if context.scene.render.engine == "POVRAY_RENDER" and wsp is not None:
119 bpy.ops.workspace.duplicate({"workspace": wsp})
120 available_workspaces["Geometry Nodes.001"].name = "POV-Ed"
121 # May be already done, but explicitly make this workspace the active one
122 context.window.workspace = available_workspaces["POV-Ed"]
123 pov_screen = available_workspaces["POV-Ed"].screens[0]
124 pov_workspace = pov_screen.areas
125 pov_window = context.window
126 # override = bpy.context.copy() # crashes
127 override = {}
128 properties_area = pov_workspace[0]
129 nodes_to_3dview_area = pov_workspace[1]
130 view3d_to_text_area = pov_workspace[2]
131 spreadsheet_to_console_area = pov_workspace[3]
133 try:
134 nodes_to_3dview_area.ui_type = "VIEW_3D"
135 override["window"] = pov_window
136 override["screen"] = bpy.context.screen
137 override["area"] = nodes_to_3dview_area
138 override["region"] = nodes_to_3dview_area.regions[-1]
139 bpy.ops.screen.space_type_set_or_cycle(
140 override, "INVOKE_DEFAULT", space_type="VIEW_3D"
142 space = nodes_to_3dview_area.spaces.active
143 space.region_3d.view_perspective = "CAMERA"
145 override["window"] = pov_window
146 override["screen"] = bpy.context.screen
147 override["area"] = view3d_to_text_area
148 override["region"] = view3d_to_text_area.regions[-1]
149 override["scene"] = bpy.context.scene
150 override["space_data"] = view3d_to_text_area.spaces.active
151 bpy.ops.screen.space_type_set_or_cycle(
152 override, "INVOKE_DEFAULT", space_type="TEXT_EDITOR"
154 view3d_to_text_area.spaces.active.show_region_ui = True
156 spreadsheet_to_console_area.ui_type = "CONSOLE"
157 override["window"] = pov_window
158 override["screen"] = bpy.context.screen
159 override["area"] = spreadsheet_to_console_area
160 override["region"] = spreadsheet_to_console_area.regions[-1]
161 bpy.ops.screen.space_type_set_or_cycle(
162 override, "INVOKE_DEFAULT", space_type="CONSOLE"
164 space = properties_area.spaces.active
165 space.context = "RENDER"
166 bpy.ops.workspace.reorder_to_front(
167 {"workspace": available_workspaces["POV-Ed"]}
169 except AttributeError:
170 # In case necessary area types lack in existing blend files
171 pass
172 if "POV-Mo" not in available_workspaces:
173 try:
174 if all(tab not in available_workspaces for tab in ["Rendering", "POV-Mo"]):
175 bpy.ops.workspace.append_activate(
176 idname="Rendering",
177 filepath=os.path.join(bpy.utils.user_resource("CONFIG"), "startup.blend"),
179 except BaseException as e:
180 print(e.__doc__)
181 print("An exception occurred: {}".format(e))
182 try:
183 # Last resort: try to import from the blender templates
184 for p in Path(next(bpy.utils.app_template_paths())).rglob("startup.blend"):
185 bpy.ops.workspace.append_activate(idname="Rendering", filepath=str(p))
186 except BaseException as e:
187 print(e.__doc__)
188 print("An exception occurred: {}".format(e))
189 # Giving up
190 print(
191 "\nFactory 'Rendering' workspace needed for POV GUI centric"
192 "\nworkspace to activate when POV is set as default renderer"
194 finally:
195 # Create Moray like workspace (GUI oriented editing)
196 if "POV-Mo" not in available_workspaces and "Rendering" in available_workspaces:
197 wsp1 = available_workspaces.get("Rendering")
198 context = bpy.context
199 if context.scene.render.engine == "POVRAY_RENDER" and wsp1 is not None:
200 bpy.ops.workspace.duplicate({"workspace": wsp1})
201 available_workspaces["Rendering.001"].name = "POV-Mo"
202 # Already done it would seem, but explicitly make this workspace the active one
203 context.window.workspace = available_workspaces["POV-Mo"]
204 pov_screen = available_workspaces["POV-Mo"].screens[0]
205 pov_workspace = pov_screen.areas
206 pov_window = context.window
207 # override = bpy.context.copy() # crashes
208 override = {}
209 properties_area = pov_workspace[0]
210 image_editor_to_view3d_area = pov_workspace[2]
212 try:
213 image_editor_to_view3d_area.ui_type = "VIEW_3D"
214 override["window"] = pov_window
215 override["screen"] = bpy.context.screen
216 override["area"] = image_editor_to_view3d_area
217 override["region"] = image_editor_to_view3d_area.regions[-1]
218 bpy.ops.screen.space_type_set_or_cycle(
219 override, "INVOKE_DEFAULT", space_type="VIEW_3D"
221 space = (
222 image_editor_to_view3d_area.spaces.active
223 ) # Uncomment For non quad view
224 space.region_3d.view_perspective = (
225 "CAMERA" # Uncomment For non quad view
227 space.show_region_toolbar = True
228 # bpy.ops.view3d.camera_to_view(override) # Uncomment For non quad view ?
229 for num, reg in enumerate(image_editor_to_view3d_area.regions):
230 if reg.type != "view3d":
231 override["region"] = image_editor_to_view3d_area.regions[num]
232 bpy.ops.screen.region_quadview(override) # Comment out for non quad
233 propspace = properties_area.spaces.active
234 propspace.context = "MATERIAL"
235 bpy.ops.workspace.reorder_to_front(
236 {"workspace": available_workspaces["POV-Mo"]}
238 except (AttributeError, TypeError):
239 # In case necessary types lack in existing blend files
240 pass
241 # available_workspaces.update()
244 # class TextureTypePanel(TextureButtonsPanel):
246 # @classmethod
247 # def poll(cls, context):
248 # tex = context.texture
249 # engine = context.scene.render.engine
250 # return tex and ((tex.type == cls.tex_type and not tex.use_nodes) and (engine in cls.COMPAT_ENGINES))
253 def register():
254 update_files.register()
255 render_gui.register()
256 scenography_gui.register()
257 model_gui.register()
258 shading_gui.register()
259 texturing_gui.register()
260 nodes.register()
261 scripting_gui.register()
263 if pov_centric_moray_like_workspace not in bpy.app.handlers.load_post:
264 bpy.app.handlers.load_post.append(pov_centric_moray_like_workspace)
267 def unregister():
268 if pov_centric_moray_like_workspace in bpy.app.handlers.load_post:
269 bpy.app.handlers.load_post.remove(pov_centric_moray_like_workspace)
271 scripting_gui.unregister()
272 nodes.unregister()
273 texturing_gui.unregister()
274 shading_gui.unregister()
275 model_gui.unregister()
276 scenography_gui.unregister()
277 render_gui.unregister()
278 update_files.unregister()