diff --git a/media/objects/Shapes/Cone-Front.svg b/media/objects/Shapes/Cone-Front.svg new file mode 100644 index 00000000..698d57cd --- /dev/null +++ b/media/objects/Shapes/Cone-Front.svg @@ -0,0 +1,52 @@ + + + + +Created by potrace 1.16, written by Peter Selinger 2001-2019 + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/media/objects/Shapes/Cone-Side.svg b/media/objects/Shapes/Cone-Side.svg new file mode 100644 index 00000000..698d57cd --- /dev/null +++ b/media/objects/Shapes/Cone-Side.svg @@ -0,0 +1,52 @@ + + + + +Created by potrace 1.16, written by Peter Selinger 2001-2019 + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/media/objects/Shapes/Cone-Top.svg b/media/objects/Shapes/Cone-Top.svg new file mode 100644 index 00000000..941e7215 --- /dev/null +++ b/media/objects/Shapes/Cone-Top.svg @@ -0,0 +1,52 @@ + + + + +Created by potrace 1.16, written by Peter Selinger 2001-2019 + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/media/objects/Shapes/Cube-Front.svg b/media/objects/Shapes/Cube-Front.svg new file mode 100644 index 00000000..4bc22942 --- /dev/null +++ b/media/objects/Shapes/Cube-Front.svg @@ -0,0 +1,52 @@ + + + + +Created by potrace 1.16, written by Peter Selinger 2001-2019 + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/media/objects/Shapes/Cube-Side.svg b/media/objects/Shapes/Cube-Side.svg new file mode 100644 index 00000000..e0f979dc --- /dev/null +++ b/media/objects/Shapes/Cube-Side.svg @@ -0,0 +1,52 @@ + + + + +Created by potrace 1.16, written by Peter Selinger 2001-2019 + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/media/objects/Shapes/Cube-Top.svg b/media/objects/Shapes/Cube-Top.svg new file mode 100644 index 00000000..e0f979dc --- /dev/null +++ b/media/objects/Shapes/Cube-Top.svg @@ -0,0 +1,52 @@ + + + + +Created by potrace 1.16, written by Peter Selinger 2001-2019 + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/media/objects/Shapes/Cylinder-Front.svg b/media/objects/Shapes/Cylinder-Front.svg new file mode 100644 index 00000000..d87e6932 --- /dev/null +++ b/media/objects/Shapes/Cylinder-Front.svg @@ -0,0 +1,52 @@ + + + + +Created by potrace 1.16, written by Peter Selinger 2001-2019 + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/media/objects/Shapes/Cylinder-Side.svg b/media/objects/Shapes/Cylinder-Side.svg new file mode 100644 index 00000000..d2843bf5 --- /dev/null +++ b/media/objects/Shapes/Cylinder-Side.svg @@ -0,0 +1,52 @@ + + + + +Created by potrace 1.16, written by Peter Selinger 2001-2019 + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/media/objects/Shapes/Cylinder-Top.svg b/media/objects/Shapes/Cylinder-Top.svg new file mode 100644 index 00000000..5a92b7ef --- /dev/null +++ b/media/objects/Shapes/Cylinder-Top.svg @@ -0,0 +1,52 @@ + + + + +Created by potrace 1.16, written by Peter Selinger 2001-2019 + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/media/objects/Shapes/Sphere-Front.svg b/media/objects/Shapes/Sphere-Front.svg new file mode 100644 index 00000000..ccae1423 --- /dev/null +++ b/media/objects/Shapes/Sphere-Front.svg @@ -0,0 +1,52 @@ + + + + +Created by potrace 1.16, written by Peter Selinger 2001-2019 + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/media/objects/Shapes/Sphere-Side.svg b/media/objects/Shapes/Sphere-Side.svg new file mode 100644 index 00000000..3872bcb8 --- /dev/null +++ b/media/objects/Shapes/Sphere-Side.svg @@ -0,0 +1,52 @@ + + + + +Created by potrace 1.16, written by Peter Selinger 2001-2019 + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/media/objects/Shapes/Sphere-Top.svg b/media/objects/Shapes/Sphere-Top.svg new file mode 100644 index 00000000..2b7bec51 --- /dev/null +++ b/media/objects/Shapes/Sphere-Top.svg @@ -0,0 +1,52 @@ + + + + +Created by potrace 1.16, written by Peter Selinger 2001-2019 + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/presets/objects.js b/presets/objects.js index 63beb9ef..48348307 100644 --- a/presets/objects.js +++ b/presets/objects.js @@ -169,6 +169,15 @@ function makeModel(data) { form: form.name } + if (view.volume) { + views[viewId].attributes["volume"] = { + name: "Volume", + power: 3, + type: "volume", + base: math.unit(view.volume, "m^3") + } + } + if (view.image) { views[viewId].image = view.image } else { @@ -856,6 +865,7 @@ function makeObjects() { results.push(makeModel({"name": "Condoms", "kind": "objects", "forms": [{"name": "Narrow", "views": [{"name": "Front", "height": 0.196}]}, {"name": "Standard", "views": [{"name": "Front", "height": 0.208}]}, {"name": "Large", "views": [{"name": "Front", "height": 0.221}]}, {"name": "XL", "views": [{"name": "Front", "height": 0.229}]}]})) /* ***Glassware*** */ results.push(makeModel({"name": "Glassware", "kind": "objects", "forms": [{"name": "Erlenmeyer 250mL", "views": [{"name": "Front", "height": 0.13200001418590546}, {"name": "Side", "height": 0.13200001418590546}, {"name": "Top", "height": 0.0820000022649765}]}, {"name": "Erlenmeyer 50mL", "views": [{"name": "Front", "height": 0.07800000160932541}, {"name": "Side", "height": 0.07800000160932541}, {"name": "Top", "height": 0.050999999046325684}]}, {"name": "Florence 250mL", "views": [{"name": "Front", "height": 0.1444360464811325}, {"name": "Side", "height": 0.1444360464811325}, {"name": "Top", "height": 0.08079908788204193}]}, {"name": "Watch Glass", "views": [{"name": "Front", "height": 0.012000001035630703}, {"name": "Side", "height": 0.012000001035630703}, {"name": "Top", "height": 0.1213480606675148}]}, {"name": "Petri Dish 60mm", "views": [{"name": "Front", "height": 0.012477035634219646}, {"name": "Side", "height": 0.012477035634219646}, {"name": "Top", "height": 0.06493081152439117}]}, {"name": "Petri Dish 100mm", "views": [{"name": "Front", "height": 0.014974183402955532}, {"name": "Side", "height": 0.014974183402955532}, {"name": "Top", "height": 0.10384059697389603}]}]})); + /* ***Shapes*** */ results.push(makeModel({"name": "Shapes", "kind": "objects", "forms": [{"name": "Cube", "views": [{"name": "Front", "height": 1.0, "volume": 0.9999999999999999}, {"name": "Side", "height": 1.0, "volume": 0.9999999999999999}, {"name": "Top", "height": 1.0, "volume": 0.9999999999999999}]}, {"name": "Sphere", "views": [{"name": "Front", "height": 1.0, "volume": 0.5242280941679499}, {"name": "Side", "height": 1.0, "volume": 0.5242280941679499}, {"name": "Top", "height": 0.9999998807907104, "volume": 0.5242280941679499}]}, {"name": "Cone", "views": [{"name": "Front", "height": 1.0, "volume": 0.26169426348501956}, {"name": "Side", "height": 1.0, "volume": 0.26169426348501956}, {"name": "Top", "height": 1.0, "volume": 0.26169426348501956}]}, {"name": "Cylinder", "views": [{"name": "Front", "height": 1.0, "volume": 0.7850827506448366}, {"name": "Side", "height": 1.0, "volume": 0.7850827506448366}, {"name": "Top", "height": 0.9999399781227112, "volume": 0.7850827506448366}]}]})); /* ***INSERT HERE*** */ return results; } diff --git a/scripts/blender-model.py b/scripts/blender-model.py index 9ad7902f..10e0854e 100644 --- a/scripts/blender-model.py +++ b/scripts/blender-model.py @@ -4,9 +4,10 @@ from math import pi import json import os import pathlib +import bmesh -GROUP_NAME = "Crackers" -GROUP_KIND = "food" +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()) @@ -29,7 +30,7 @@ bpy.data.worlds["World"].node_tree.nodes["Background"].inputs[1].default_value = objects = [] for object in bpy.data.collections["Macrovision"].objects: - if object.type == "MESH" or object.type == "CURVE" or object.type == "SURFACE": + if object.type == "MESH" or object.type == "CURVE": objects.append(object) all_data = {} @@ -38,6 +39,7 @@ all_data["name"] = GROUP_NAME all_data["kind"] = GROUP_KIND all_data["forms"] = [] +VOLUME = True os.makedirs(workdir, exist_ok=True) @@ -48,7 +50,7 @@ for selected in objects: selected.hide_render = False - bpy.ops.object.transform_apply( rotation = True ) + bpy.ops.object.transform_apply( location = False, rotation = True ) data = {} @@ -70,6 +72,10 @@ for selected in objects: "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__()