diff --git a/media/attribution.js b/media/attribution.js
index 952c19b0..77852dfb 100644
--- a/media/attribution.js
+++ b/media/attribution.js
@@ -19779,6 +19779,16 @@ const attributionData = {
"bad-dragon"
]
},
+ {
+ prefix: "./media/objects/LEGO/",
+ all: "https://bricks.stackexchange.com/questions/288/what-are-the-dimensions-of-a-lego-brick",
+ authors: [
+ "chemicalcrux"
+ ],
+ owners: [
+ "lego"
+ ]
+ },
{
prefix: "./media/real-buildings/",
all: "https://wiki.openstreetmap.org/wiki/Blender",
@@ -26362,6 +26372,10 @@ const attributionData = {
"name": "Bacinger",
"url": "https://github.com/bacinger/"
},
+ "lego": {
+ "name": "LEGO",
+ "url": "https://www.lego.com/"
+ },
}
}
diff --git a/media/objects/LEGO/1x1-Angled.svg b/media/objects/LEGO/1x1-Angled.svg
new file mode 100644
index 00000000..ffacee63
--- /dev/null
+++ b/media/objects/LEGO/1x1-Angled.svg
@@ -0,0 +1,64 @@
+
+
diff --git a/media/objects/LEGO/1x1-Bottom.svg b/media/objects/LEGO/1x1-Bottom.svg
new file mode 100644
index 00000000..cff053cb
--- /dev/null
+++ b/media/objects/LEGO/1x1-Bottom.svg
@@ -0,0 +1,58 @@
+
+
diff --git a/media/objects/LEGO/1x1-Front.svg b/media/objects/LEGO/1x1-Front.svg
new file mode 100644
index 00000000..6f7125e8
--- /dev/null
+++ b/media/objects/LEGO/1x1-Front.svg
@@ -0,0 +1,58 @@
+
+
diff --git a/media/objects/LEGO/1x1-Side.svg b/media/objects/LEGO/1x1-Side.svg
new file mode 100644
index 00000000..1658a6a0
--- /dev/null
+++ b/media/objects/LEGO/1x1-Side.svg
@@ -0,0 +1,58 @@
+
+
diff --git a/media/objects/LEGO/1x1-Top.svg b/media/objects/LEGO/1x1-Top.svg
new file mode 100644
index 00000000..e174cf7c
--- /dev/null
+++ b/media/objects/LEGO/1x1-Top.svg
@@ -0,0 +1,58 @@
+
+
diff --git a/media/objects/LEGO/1x2-Angled.svg b/media/objects/LEGO/1x2-Angled.svg
new file mode 100644
index 00000000..eb9d3051
--- /dev/null
+++ b/media/objects/LEGO/1x2-Angled.svg
@@ -0,0 +1,70 @@
+
+
diff --git a/media/objects/LEGO/1x2-Bottom.svg b/media/objects/LEGO/1x2-Bottom.svg
new file mode 100644
index 00000000..52ab38f4
--- /dev/null
+++ b/media/objects/LEGO/1x2-Bottom.svg
@@ -0,0 +1,58 @@
+
+
diff --git a/media/objects/LEGO/1x2-Front.svg b/media/objects/LEGO/1x2-Front.svg
new file mode 100644
index 00000000..756d4acb
--- /dev/null
+++ b/media/objects/LEGO/1x2-Front.svg
@@ -0,0 +1,64 @@
+
+
diff --git a/media/objects/LEGO/1x2-Side.svg b/media/objects/LEGO/1x2-Side.svg
new file mode 100644
index 00000000..2ddfd1e9
--- /dev/null
+++ b/media/objects/LEGO/1x2-Side.svg
@@ -0,0 +1,58 @@
+
+
diff --git a/media/objects/LEGO/1x2-Top.svg b/media/objects/LEGO/1x2-Top.svg
new file mode 100644
index 00000000..8172f3e5
--- /dev/null
+++ b/media/objects/LEGO/1x2-Top.svg
@@ -0,0 +1,64 @@
+
+
diff --git a/media/objects/LEGO/2x2-Angled.svg b/media/objects/LEGO/2x2-Angled.svg
new file mode 100644
index 00000000..4b9c3d47
--- /dev/null
+++ b/media/objects/LEGO/2x2-Angled.svg
@@ -0,0 +1,76 @@
+
+
diff --git a/media/objects/LEGO/2x2-Bottom.svg b/media/objects/LEGO/2x2-Bottom.svg
new file mode 100644
index 00000000..e4c00169
--- /dev/null
+++ b/media/objects/LEGO/2x2-Bottom.svg
@@ -0,0 +1,70 @@
+
+
diff --git a/media/objects/LEGO/2x2-Front.svg b/media/objects/LEGO/2x2-Front.svg
new file mode 100644
index 00000000..3ff57c0f
--- /dev/null
+++ b/media/objects/LEGO/2x2-Front.svg
@@ -0,0 +1,64 @@
+
+
diff --git a/media/objects/LEGO/2x2-Side.svg b/media/objects/LEGO/2x2-Side.svg
new file mode 100644
index 00000000..3ff57c0f
--- /dev/null
+++ b/media/objects/LEGO/2x2-Side.svg
@@ -0,0 +1,64 @@
+
+
diff --git a/media/objects/LEGO/2x2-Top.svg b/media/objects/LEGO/2x2-Top.svg
new file mode 100644
index 00000000..559a0975
--- /dev/null
+++ b/media/objects/LEGO/2x2-Top.svg
@@ -0,0 +1,76 @@
+
+
diff --git a/media/objects/LEGO/2x4-Angled.svg b/media/objects/LEGO/2x4-Angled.svg
new file mode 100644
index 00000000..3e96061a
--- /dev/null
+++ b/media/objects/LEGO/2x4-Angled.svg
@@ -0,0 +1,88 @@
+
+
diff --git a/media/objects/LEGO/2x4-Bottom.svg b/media/objects/LEGO/2x4-Bottom.svg
new file mode 100644
index 00000000..8544b4f4
--- /dev/null
+++ b/media/objects/LEGO/2x4-Bottom.svg
@@ -0,0 +1,94 @@
+
+
diff --git a/media/objects/LEGO/2x4-Front.svg b/media/objects/LEGO/2x4-Front.svg
new file mode 100644
index 00000000..c59db57f
--- /dev/null
+++ b/media/objects/LEGO/2x4-Front.svg
@@ -0,0 +1,76 @@
+
+
diff --git a/media/objects/LEGO/2x4-Side.svg b/media/objects/LEGO/2x4-Side.svg
new file mode 100644
index 00000000..f826e5f8
--- /dev/null
+++ b/media/objects/LEGO/2x4-Side.svg
@@ -0,0 +1,64 @@
+
+
diff --git a/media/objects/LEGO/2x4-Top.svg b/media/objects/LEGO/2x4-Top.svg
new file mode 100644
index 00000000..e5949956
--- /dev/null
+++ b/media/objects/LEGO/2x4-Top.svg
@@ -0,0 +1,100 @@
+
+
diff --git a/presets/objects.js b/presets/objects.js
index 8729b970..0f2d6746 100644
--- a/presets/objects.js
+++ b/presets/objects.js
@@ -903,6 +903,7 @@ function makeObjects() {
/* ***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}]}]}));
/* ***PO Boxes*** */ results.push(makeModel({"name": "PO Boxes", "kind": "objects", "forms": [{"name": "XS", "views": [{"name": "Front", "height": 0.07620000094175339, "volume": 0.003988201638571948}, {"name": "Side", "height": 0.07620000094175339, "volume": 0.003988201638571948}, {"name": "Top", "height": 0.3746500015258789, "volume": 0.003988201638571948}]}, {"name": "S", "views": [{"name": "Front", "height": 0.12700000405311584, "volume": 0.006647002860937575}, {"name": "Side", "height": 0.12700000405311584, "volume": 0.006647002860937575}, {"name": "Top", "height": 0.3746500015258789, "volume": 0.006647002860937575}]}, {"name": "M", "views": [{"name": "Front", "height": 0.1396999955177307, "volume": 0.014623405358175506}, {"name": "Side", "height": 0.1396999955177307, "volume": 0.014623405358175506}, {"name": "Top", "height": 0.3746500015258789, "volume": 0.014623405358175506}]}, {"name": "L", "views": [{"name": "Front", "height": 0.2793999910354614, "volume": 0.02924681071635101}, {"name": "Side", "height": 0.2793999910354614, "volume": 0.02924681071635101}, {"name": "Top", "height": 0.3746500015258789, "volume": 0.02924681071635101}]}, {"name": "XL", "views": [{"name": "Front", "height": 0.30480000376701355, "volume": 0.06526148383352366}, {"name": "Side", "height": 0.30480000376701355, "volume": 0.06526148383352366}, {"name": "Top", "height": 0.3746500015258789, "volume": 0.06526148383352366}]}]}));
/* ***Sex Toys*** */ results.push(makeModel({"name": "Sex Toys", "kind": "objects", "forms": [{"name": "Chance", "views": [{"name": "Front", "height": 0.44450023770332336, "volume": 0.0024940192673095084}, {"name": "Side", "height": 0.44450023770332336, "volume": 0.0024940192673095084}, {"name": "Top", "height": 0.18736252188682556, "volume": 0.0024940192673095084}]}, {"name": "Fenrir", "views": [{"name": "Front", "height": 0.32130947709083557, "volume": 0.0014611460855557515}, {"name": "Side", "height": 0.32130947709083557, "volume": 0.0014611460855557515}, {"name": "Top", "height": 0.11701348423957825, "volume": 0.0014611460855557515}]}]}));
+ /* ***LEGO*** */ results.push(makeModel({"name": "LEGO", "kind": "objects", "forms": [{"name": "1x1", "views": [{"name": "Front", "height": 0.01119999960064888, "volume": 3.3640754098503267e-07}, {"name": "Angled", "height": 0.01119999960064888, "volume": 3.3640754098503267e-07}, {"name": "Side", "height": 0.01119999960064888, "volume": 3.3640754098503267e-07}, {"name": "Top", "height": 0.00800000037997961, "volume": 3.3640754098503267e-07}, {"name": "Bottom", "height": 0.00800000037997961, "volume": 3.3640754098503267e-07}]}, {"name": "1x2", "views": [{"name": "Front", "height": 0.011200000531971455, "volume": 5.669391684500056e-07}, {"name": "Angled", "height": 0.011200000531971455, "volume": 5.669391684500056e-07}, {"name": "Side", "height": 0.011200000531971455, "volume": 5.669391684500056e-07}, {"name": "Top", "height": 0.00800000037997961, "volume": 5.669391684500056e-07}, {"name": "Bottom", "height": 0.00800000037997961, "volume": 5.669391684500056e-07}]}, {"name": "2x2", "views": [{"name": "Front", "height": 0.01119999960064888, "volume": 1.0245981619502385e-06}, {"name": "Angled", "height": 0.01119999960064888, "volume": 1.0245981619502385e-06}, {"name": "Side", "height": 0.01119999960064888, "volume": 1.0245981619502385e-06}, {"name": "Top", "height": 0.01600000075995922, "volume": 1.0245981619502385e-06}, {"name": "Bottom", "height": 0.01600000075995922, "volume": 1.0245981619502385e-06}]}, {"name": "2x4", "views": [{"name": "Front", "height": 0.011200000531971455, "volume": 1.939916458324457e-06}, {"name": "Angled", "height": 0.011200000531971455, "volume": 1.939916458324457e-06}, {"name": "Side", "height": 0.011200000531971455, "volume": 1.939916458324457e-06}, {"name": "Top", "height": 0.01600000075995922, "volume": 1.939916458324457e-06}, {"name": "Bottom", "height": 0.01600000075995922, "volume": 1.939916458324457e-06}]}]}));
/* ***INSERT HERE*** */
return results;
}
diff --git a/scripts/blender-model.py b/scripts/blender-model.py
index 10e0854e..03fa7a71 100644
--- a/scripts/blender-model.py
+++ b/scripts/blender-model.py
@@ -1,12 +1,12 @@
import bpy
from mathutils import Vector, Euler
-from math import pi
+from math import pi, sqrt
import json
import os
import pathlib
import bmesh
-GROUP_NAME = "Shapes"
+GROUP_NAME = "LEGO"
GROUP_KIND = "objects"
path_info = pathlib.Path(bpy.data.filepath).parent.joinpath("macrovision-directory.txt")
@@ -44,13 +44,15 @@ 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 )
+
+ bpy.ops.object.select_all(action='DESELECT')
+ selected.select_set(True)
+ bpy.ops.object.transform_apply( location = False, rotation = True, scale = True )
data = {}
@@ -59,15 +61,20 @@ for selected in objects:
b = selected
- for angles in [[0, 1, 2, "Front"], [1, 1, 2, "Side"], [0, 0, 1, "Top"]]:
+ for angles in [[0, 1, 2, "Front"], [0.5, 1, 2, "Angled"], [1, 1, 2, "Side"], [0, 0, 1, "Top"], [0, 2, 1, "Bottom"]]:
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
+ largest = max(b.dimensions)
+ c.data.ortho_scale = largest * 1.2
+ if angles[0] % 1 != 0:
+ c.data.ortho_scale *= sqrt(2)
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
+ c.location = c.location + Vector([0, 0, largest * 2]) @ rot
+ c.data.clip_start = largest / 4
+ c.data.clip_end = largest * 4
data["views"].append({
"name": angles[3],
"height": b.dimensions[angles[2]]