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 @@
+
+
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 @@
+
+
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 @@
+
+
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 @@
+
+
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 @@
+
+
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 @@
+
+
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 @@
+
+
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 @@
+
+
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 @@
+
+
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 @@
+
+
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 @@
+
+
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 @@
+
+
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__()