|
- import bpy
- from mathutils import Vector, Euler
- from math import pi
- import json
- import os
- import pathlib
- import bmesh
-
- GROUP_NAME = "Shapes"
- GROUP_KIND = "objects"
-
- path_info = pathlib.Path(bpy.data.filepath).parent.joinpath("macrovision-directory.txt")
- config_path = pathlib.Path(open(path_info).read())
-
- json_path = config_path.joinpath("config.json")
- config = json.load(open(json_path.resolve(), encoding="utf-8"))
-
- parent_workdir = config["work-directory"]
- workdir = pathlib.Path(parent_workdir).joinpath(GROUP_NAME)
-
- c = bpy.data.objects["cam"]
- c.data.type = "ORTHO"
-
- bpy.data.scenes["Scene"].render.resolution_x = 1000
- bpy.data.scenes["Scene"].render.resolution_y = 1000
- bpy.data.scenes["Scene"].render.film_transparent = True
- bpy.data.scenes["Scene"].view_settings.view_transform = "Raw"
-
- bpy.data.worlds["World"].node_tree.nodes["Background"].inputs[1].default_value = 0
-
- objects = []
- for object in bpy.data.collections["Macrovision"].objects:
- if object.type == "MESH" or object.type == "CURVE":
- objects.append(object)
-
- all_data = {}
-
- all_data["name"] = GROUP_NAME
- all_data["kind"] = GROUP_KIND
- all_data["forms"] = []
-
- VOLUME = True
-
- os.makedirs(workdir, exist_ok=True)
-
- for selected in objects:
-
- for object in bpy.data.collections["Macrovision"].objects:
- object.hide_render = True
-
- selected.hide_render = False
-
- bpy.ops.object.transform_apply( location = False, rotation = True )
-
- data = {}
-
- data["name"] = selected.name
- data["views"] = []
-
- b = selected
-
- for angles in [[0, 1, 2, "Front"], [1, 1, 2, "Side"], [0, 0, 1, "Top"]]:
- local_bbox_center = 0.125 * sum((Vector(box) for box in b.bound_box), Vector())
- global_bbox_center = b.matrix_world @ local_bbox_center
- c.location = global_bbox_center
- c.data.ortho_scale = max(b.dimensions) * 1.1
- c.rotation_euler = Euler([angles[1] * pi / 2, 0, angles[0] * pi / 2])
- rot = c.rotation_euler.to_matrix()
- rot.invert()
- c.location = c.location + Vector([0, 0, 3]) @ rot
- data["views"].append({
- "name": angles[3],
- "height": b.dimensions[angles[2]]
- })
- if VOLUME and selected.type == "MESH":
- bm = bmesh.new()
- bm.from_mesh(selected.data)
- data["views"][-1]["volume"] = bm.calc_volume()
- #s.rotation_euler = c.rotation_euler
- filename = f"{b.name}-{angles[3]}.png"
- bpy.context.scene.render.filepath = workdir.joinpath(filename).resolve().__str__()
- bpy.ops.render.render(write_still = True)
-
- all_data["forms"].append(data)
-
- with open(workdir.joinpath("data.json"), "w") as file:
- json.dump(all_data, file)
|