less copy protection, more size visualization
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 

87 行
2.6 KiB

  1. import bpy
  2. from mathutils import Vector, Euler
  3. from math import pi
  4. import json
  5. import os
  6. import pathlib
  7. import bmesh
  8. GROUP_NAME = "Shapes"
  9. GROUP_KIND = "objects"
  10. path_info = pathlib.Path(bpy.data.filepath).parent.joinpath("macrovision-directory.txt")
  11. config_path = pathlib.Path(open(path_info).read())
  12. json_path = config_path.joinpath("config.json")
  13. config = json.load(open(json_path.resolve(), encoding="utf-8"))
  14. parent_workdir = config["work-directory"]
  15. workdir = pathlib.Path(parent_workdir).joinpath(GROUP_NAME)
  16. c = bpy.data.objects["cam"]
  17. c.data.type = "ORTHO"
  18. bpy.data.scenes["Scene"].render.resolution_x = 1000
  19. bpy.data.scenes["Scene"].render.resolution_y = 1000
  20. bpy.data.scenes["Scene"].render.film_transparent = True
  21. bpy.data.scenes["Scene"].view_settings.view_transform = "Raw"
  22. bpy.data.worlds["World"].node_tree.nodes["Background"].inputs[1].default_value = 0
  23. objects = []
  24. for object in bpy.data.collections["Macrovision"].objects:
  25. if object.type == "MESH" or object.type == "CURVE":
  26. objects.append(object)
  27. all_data = {}
  28. all_data["name"] = GROUP_NAME
  29. all_data["kind"] = GROUP_KIND
  30. all_data["forms"] = []
  31. VOLUME = True
  32. os.makedirs(workdir, exist_ok=True)
  33. for selected in objects:
  34. for object in bpy.data.collections["Macrovision"].objects:
  35. object.hide_render = True
  36. selected.hide_render = False
  37. bpy.ops.object.transform_apply( location = False, rotation = True )
  38. data = {}
  39. data["name"] = selected.name
  40. data["views"] = []
  41. b = selected
  42. for angles in [[0, 1, 2, "Front"], [1, 1, 2, "Side"], [0, 0, 1, "Top"]]:
  43. local_bbox_center = 0.125 * sum((Vector(box) for box in b.bound_box), Vector())
  44. global_bbox_center = b.matrix_world @ local_bbox_center
  45. c.location = global_bbox_center
  46. c.data.ortho_scale = max(b.dimensions) * 1.1
  47. c.rotation_euler = Euler([angles[1] * pi / 2, 0, angles[0] * pi / 2])
  48. rot = c.rotation_euler.to_matrix()
  49. rot.invert()
  50. c.location = c.location + Vector([0, 0, 3]) @ rot
  51. data["views"].append({
  52. "name": angles[3],
  53. "height": b.dimensions[angles[2]]
  54. })
  55. if VOLUME and selected.type == "MESH":
  56. bm = bmesh.new()
  57. bm.from_mesh(selected.data)
  58. data["views"][-1]["volume"] = bm.calc_volume()
  59. #s.rotation_euler = c.rotation_euler
  60. filename = f"{b.name}-{angles[3]}.png"
  61. bpy.context.scene.render.filepath = workdir.joinpath(filename).resolve().__str__()
  62. bpy.ops.render.render(write_still = True)
  63. all_data["forms"].append(data)
  64. with open(workdir.joinpath("data.json"), "w") as file:
  65. json.dump(all_data, file)