From 5939a2fb19ac25da497d80ac17ba0c605f291ab5 Mon Sep 17 00:00:00 2001 From: Fen Dweller Date: Thu, 18 Nov 2021 13:44:14 -0500 Subject: [PATCH] Add LEGO --- media/attribution.js | 14 +++++ media/objects/LEGO/1x1-Angled.svg | 64 +++++++++++++++++++ media/objects/LEGO/1x1-Bottom.svg | 58 +++++++++++++++++ media/objects/LEGO/1x1-Front.svg | 58 +++++++++++++++++ media/objects/LEGO/1x1-Side.svg | 58 +++++++++++++++++ media/objects/LEGO/1x1-Top.svg | 58 +++++++++++++++++ media/objects/LEGO/1x2-Angled.svg | 70 +++++++++++++++++++++ media/objects/LEGO/1x2-Bottom.svg | 58 +++++++++++++++++ media/objects/LEGO/1x2-Front.svg | 64 +++++++++++++++++++ media/objects/LEGO/1x2-Side.svg | 58 +++++++++++++++++ media/objects/LEGO/1x2-Top.svg | 64 +++++++++++++++++++ media/objects/LEGO/2x2-Angled.svg | 76 +++++++++++++++++++++++ media/objects/LEGO/2x2-Bottom.svg | 70 +++++++++++++++++++++ media/objects/LEGO/2x2-Front.svg | 64 +++++++++++++++++++ media/objects/LEGO/2x2-Side.svg | 64 +++++++++++++++++++ media/objects/LEGO/2x2-Top.svg | 76 +++++++++++++++++++++++ media/objects/LEGO/2x4-Angled.svg | 88 ++++++++++++++++++++++++++ media/objects/LEGO/2x4-Bottom.svg | 94 ++++++++++++++++++++++++++++ media/objects/LEGO/2x4-Front.svg | 76 +++++++++++++++++++++++ media/objects/LEGO/2x4-Side.svg | 64 +++++++++++++++++++ media/objects/LEGO/2x4-Top.svg | 100 ++++++++++++++++++++++++++++++ presets/objects.js | 1 + scripts/blender-model.py | 23 ++++--- 23 files changed, 1412 insertions(+), 8 deletions(-) create mode 100644 media/objects/LEGO/1x1-Angled.svg create mode 100644 media/objects/LEGO/1x1-Bottom.svg create mode 100644 media/objects/LEGO/1x1-Front.svg create mode 100644 media/objects/LEGO/1x1-Side.svg create mode 100644 media/objects/LEGO/1x1-Top.svg create mode 100644 media/objects/LEGO/1x2-Angled.svg create mode 100644 media/objects/LEGO/1x2-Bottom.svg create mode 100644 media/objects/LEGO/1x2-Front.svg create mode 100644 media/objects/LEGO/1x2-Side.svg create mode 100644 media/objects/LEGO/1x2-Top.svg create mode 100644 media/objects/LEGO/2x2-Angled.svg create mode 100644 media/objects/LEGO/2x2-Bottom.svg create mode 100644 media/objects/LEGO/2x2-Front.svg create mode 100644 media/objects/LEGO/2x2-Side.svg create mode 100644 media/objects/LEGO/2x2-Top.svg create mode 100644 media/objects/LEGO/2x4-Angled.svg create mode 100644 media/objects/LEGO/2x4-Bottom.svg create mode 100644 media/objects/LEGO/2x4-Front.svg create mode 100644 media/objects/LEGO/2x4-Side.svg create mode 100644 media/objects/LEGO/2x4-Top.svg 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 @@ + + + + +Created by potrace 1.16, written by Peter Selinger 2001-2019 + + + image/svg+xml + + + + + + + + + + + + + + + + + + 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 @@ + + + + +Created by potrace 1.16, written by Peter Selinger 2001-2019 + + + image/svg+xml + + + + + + + + + + + + + + + + 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 @@ + + + + +Created by potrace 1.16, written by Peter Selinger 2001-2019 + + + image/svg+xml + + + + + + + + + + + + + + + + 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 @@ + + + + +Created by potrace 1.16, written by Peter Selinger 2001-2019 + + + image/svg+xml + + + + + + + + + + + + + + + + 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 @@ + + + + +Created by potrace 1.16, written by Peter Selinger 2001-2019 + + + image/svg+xml + + + + + + + + + + + + + + + + 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 @@ + + + + +Created by potrace 1.16, written by Peter Selinger 2001-2019 + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + +Created by potrace 1.16, written by Peter Selinger 2001-2019 + + + image/svg+xml + + + + + + + + + + + + + + + + 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 @@ + + + + +Created by potrace 1.16, written by Peter Selinger 2001-2019 + + + image/svg+xml + + + + + + + + + + + + + + + + + + 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 @@ + + + + +Created by potrace 1.16, written by Peter Selinger 2001-2019 + + + image/svg+xml + + + + + + + + + + + + + + + + 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 @@ + + + + +Created by potrace 1.16, written by Peter Selinger 2001-2019 + + + image/svg+xml + + + + + + + + + + + + + + + + + + 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 @@ + + + + +Created by potrace 1.16, written by Peter Selinger 2001-2019 + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + +Created by potrace 1.16, written by Peter Selinger 2001-2019 + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + +Created by potrace 1.16, written by Peter Selinger 2001-2019 + + + image/svg+xml + + + + + + + + + + + + + + + + + + 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 @@ + + + + +Created by potrace 1.16, written by Peter Selinger 2001-2019 + + + image/svg+xml + + + + + + + + + + + + + + + + + + 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 @@ + + + + +Created by potrace 1.16, written by Peter Selinger 2001-2019 + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + +Created by potrace 1.16, written by Peter Selinger 2001-2019 + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + +Created by potrace 1.16, written by Peter Selinger 2001-2019 + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + +Created by potrace 1.16, written by Peter Selinger 2001-2019 + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + +Created by potrace 1.16, written by Peter Selinger 2001-2019 + + + image/svg+xml + + + + + + + + + + + + + + + + + + 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 @@ + + + + +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 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]]