less copy protection, more size visualization
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 

94 líneas
2.9 KiB

  1. import bpy
  2. from mathutils import Vector, Euler
  3. from math import pi, sqrt
  4. import json
  5. import os
  6. import pathlib
  7. import bmesh
  8. GROUP_NAME = "Bricks"
  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.select_all(action='DESELECT')
  38. selected.select_set(True)
  39. bpy.ops.object.transform_apply( location = False, rotation = True, scale = True )
  40. data = {}
  41. data["name"] = selected.name
  42. data["views"] = []
  43. b = selected
  44. for angles in [[0, 1, 2, "Front"], [0.5, 1, 2, "Angled"], [1, 1, 2, "Side"], [0, 0, 1, "Top"]]:
  45. local_bbox_center = 0.125 * sum((Vector(box) for box in b.bound_box), Vector())
  46. global_bbox_center = b.matrix_world @ local_bbox_center
  47. c.location = global_bbox_center
  48. largest = max(b.dimensions)
  49. c.data.ortho_scale = largest * 1.2
  50. if angles[0] % 1 != 0:
  51. c.data.ortho_scale *= sqrt(2)
  52. c.rotation_euler = Euler([angles[1] * pi / 2, 0, angles[0] * pi / 2])
  53. rot = c.rotation_euler.to_matrix()
  54. rot.invert()
  55. c.location = c.location + Vector([0, 0, largest * 2]) @ rot
  56. c.data.clip_start = largest / 4
  57. c.data.clip_end = largest * 4
  58. data["views"].append({
  59. "name": angles[3],
  60. "height": b.dimensions[angles[2]]
  61. })
  62. if VOLUME and selected.type == "MESH":
  63. bm = bmesh.new()
  64. bm.from_mesh(selected.data)
  65. data["views"][-1]["volume"] = bm.calc_volume()
  66. #s.rotation_euler = c.rotation_euler
  67. filename = f"{b.name}-{angles[3]}.png"
  68. bpy.context.scene.render.filepath = workdir.joinpath(filename).resolve().__str__()
  69. bpy.ops.render.render(write_still = True)
  70. all_data["forms"].append(data)
  71. with open(workdir.joinpath("data.json"), "w") as file:
  72. json.dump(all_data, file)