From 3743663bbfbd6b45b57358664e174059a61a0283 Mon Sep 17 00:00:00 2001 From: Fen Dweller Date: Sun, 31 Oct 2021 19:23:33 -0400 Subject: [PATCH] Update Amanda and add some lab glassware This also updates the model-processing script to automatically insert the model data into the appropriate source file. --- media/attribution.js | 16 +- media/characters/amanda/back.svg | 426 +++++++++ media/characters/amanda/front.svg | 863 ++++++++++++++++-- .../Glassware/Erlenmeyer 250mL-Front.svg | 52 ++ .../Glassware/Erlenmeyer 250mL-Side.svg | 52 ++ .../Glassware/Erlenmeyer 250mL-Top.svg | 64 ++ .../Glassware/Erlenmeyer 50mL-Front.svg | 52 ++ .../Glassware/Erlenmeyer 50mL-Side.svg | 52 ++ .../objects/Glassware/Erlenmeyer 50mL-Top.svg | 64 ++ .../Glassware/Florence 250mL-Front.svg | 52 ++ .../objects/Glassware/Florence 250mL-Side.svg | 52 ++ .../objects/Glassware/Florence 250mL-Top.svg | 64 ++ .../Glassware/Petri Dish 100mm-Front.svg | 52 ++ .../Glassware/Petri Dish 100mm-Side.svg | 52 ++ .../Glassware/Petri Dish 100mm-Top.svg | 58 ++ .../Glassware/Petri Dish 60mm-Front.svg | 52 ++ .../Glassware/Petri Dish 60mm-Side.svg | 52 ++ .../objects/Glassware/Petri Dish 60mm-Top.svg | 58 ++ media/objects/Glassware/Watch Glass-Front.svg | 52 ++ media/objects/Glassware/Watch Glass-Side.svg | 52 ++ media/objects/Glassware/Watch Glass-Top.svg | 52 ++ presets/characters.js | 18 +- presets/objects.js | 3 + scripts/blender-model.py | 6 +- scripts/process-model.py | 23 +- 25 files changed, 2250 insertions(+), 89 deletions(-) create mode 100644 media/characters/amanda/back.svg create mode 100644 media/objects/Glassware/Erlenmeyer 250mL-Front.svg create mode 100644 media/objects/Glassware/Erlenmeyer 250mL-Side.svg create mode 100644 media/objects/Glassware/Erlenmeyer 250mL-Top.svg create mode 100644 media/objects/Glassware/Erlenmeyer 50mL-Front.svg create mode 100644 media/objects/Glassware/Erlenmeyer 50mL-Side.svg create mode 100644 media/objects/Glassware/Erlenmeyer 50mL-Top.svg create mode 100644 media/objects/Glassware/Florence 250mL-Front.svg create mode 100644 media/objects/Glassware/Florence 250mL-Side.svg create mode 100644 media/objects/Glassware/Florence 250mL-Top.svg create mode 100644 media/objects/Glassware/Petri Dish 100mm-Front.svg create mode 100644 media/objects/Glassware/Petri Dish 100mm-Side.svg create mode 100644 media/objects/Glassware/Petri Dish 100mm-Top.svg create mode 100644 media/objects/Glassware/Petri Dish 60mm-Front.svg create mode 100644 media/objects/Glassware/Petri Dish 60mm-Side.svg create mode 100644 media/objects/Glassware/Petri Dish 60mm-Top.svg create mode 100644 media/objects/Glassware/Watch Glass-Front.svg create mode 100644 media/objects/Glassware/Watch Glass-Side.svg create mode 100644 media/objects/Glassware/Watch Glass-Top.svg diff --git a/media/attribution.js b/media/attribution.js index efa7a6dd..d8f289d0 100644 --- a/media/attribution.js +++ b/media/attribution.js @@ -1567,10 +1567,11 @@ const attributionData = { { prefix: "./media/characters/amanda/", files: [ - { name: "front.svg", source: "https://www.furaffinity.net/view/33462160/" } + { name: "front.svg", source: "https://www.furaffinity.net/view/39646317/" }, + { name: "back.svg", source: "https://www.furaffinity.net/view/39646317/" }, ], authors: [ - "spunky" + "jerberjer" ], owners: [ "matty-the-mouse" @@ -19024,6 +19025,13 @@ const attributionData = { "davilion" ] }, + { + prefix: "./media/objects/Glassware/", + all: null, + authors: [ + "chemicalcrux" + ] + }, { prefix: "./media/objects/Condoms/", all: "https://pasante.com/products/a4-shape-size-guide-pack-of-5", @@ -19902,10 +19910,6 @@ const attributionData = { "name": "spaceweasel2306", "url": "https://www.furaffinity.net/user/spaceweasel2306/" }, - "spunky": { - "name": "Spunky", - "url": "https://www.furaffinity.net/user/spunky" - }, "spyropurple": { "name": "spyropurple", "url": "https://www.furaffinity.net/user/spyropurple/" diff --git a/media/characters/amanda/back.svg b/media/characters/amanda/back.svg new file mode 100644 index 00000000..a68587c1 --- /dev/null +++ b/media/characters/amanda/back.svg @@ -0,0 +1,426 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/media/characters/amanda/front.svg b/media/characters/amanda/front.svg index 5e62551d..9bb6d856 100644 --- a/media/characters/amanda/front.svg +++ b/media/characters/amanda/front.svg @@ -1,79 +1,794 @@ - + + width="843.667" height="964.558" viewBox="0 0 843.667 964.558" style="enable-background:new 0 0 843.667 964.558;" xml:space="preserve"> + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/media/objects/Glassware/Erlenmeyer 250mL-Front.svg b/media/objects/Glassware/Erlenmeyer 250mL-Front.svg new file mode 100644 index 00000000..943c1aff --- /dev/null +++ b/media/objects/Glassware/Erlenmeyer 250mL-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/Glassware/Erlenmeyer 250mL-Side.svg b/media/objects/Glassware/Erlenmeyer 250mL-Side.svg new file mode 100644 index 00000000..943c1aff --- /dev/null +++ b/media/objects/Glassware/Erlenmeyer 250mL-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/Glassware/Erlenmeyer 250mL-Top.svg b/media/objects/Glassware/Erlenmeyer 250mL-Top.svg new file mode 100644 index 00000000..23be2fc0 --- /dev/null +++ b/media/objects/Glassware/Erlenmeyer 250mL-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/Glassware/Erlenmeyer 50mL-Front.svg b/media/objects/Glassware/Erlenmeyer 50mL-Front.svg new file mode 100644 index 00000000..8d3e8be7 --- /dev/null +++ b/media/objects/Glassware/Erlenmeyer 50mL-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/Glassware/Erlenmeyer 50mL-Side.svg b/media/objects/Glassware/Erlenmeyer 50mL-Side.svg new file mode 100644 index 00000000..8d3e8be7 --- /dev/null +++ b/media/objects/Glassware/Erlenmeyer 50mL-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/Glassware/Erlenmeyer 50mL-Top.svg b/media/objects/Glassware/Erlenmeyer 50mL-Top.svg new file mode 100644 index 00000000..5b78a151 --- /dev/null +++ b/media/objects/Glassware/Erlenmeyer 50mL-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/Glassware/Florence 250mL-Front.svg b/media/objects/Glassware/Florence 250mL-Front.svg new file mode 100644 index 00000000..a94f433e --- /dev/null +++ b/media/objects/Glassware/Florence 250mL-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/Glassware/Florence 250mL-Side.svg b/media/objects/Glassware/Florence 250mL-Side.svg new file mode 100644 index 00000000..8fbd7ecc --- /dev/null +++ b/media/objects/Glassware/Florence 250mL-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/Glassware/Florence 250mL-Top.svg b/media/objects/Glassware/Florence 250mL-Top.svg new file mode 100644 index 00000000..0b503919 --- /dev/null +++ b/media/objects/Glassware/Florence 250mL-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/Glassware/Petri Dish 100mm-Front.svg b/media/objects/Glassware/Petri Dish 100mm-Front.svg new file mode 100644 index 00000000..19243846 --- /dev/null +++ b/media/objects/Glassware/Petri Dish 100mm-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/Glassware/Petri Dish 100mm-Side.svg b/media/objects/Glassware/Petri Dish 100mm-Side.svg new file mode 100644 index 00000000..99db8b98 --- /dev/null +++ b/media/objects/Glassware/Petri Dish 100mm-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/Glassware/Petri Dish 100mm-Top.svg b/media/objects/Glassware/Petri Dish 100mm-Top.svg new file mode 100644 index 00000000..c657a655 --- /dev/null +++ b/media/objects/Glassware/Petri Dish 100mm-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/Glassware/Petri Dish 60mm-Front.svg b/media/objects/Glassware/Petri Dish 60mm-Front.svg new file mode 100644 index 00000000..15c3c249 --- /dev/null +++ b/media/objects/Glassware/Petri Dish 60mm-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/Glassware/Petri Dish 60mm-Side.svg b/media/objects/Glassware/Petri Dish 60mm-Side.svg new file mode 100644 index 00000000..15c3c249 --- /dev/null +++ b/media/objects/Glassware/Petri Dish 60mm-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/Glassware/Petri Dish 60mm-Top.svg b/media/objects/Glassware/Petri Dish 60mm-Top.svg new file mode 100644 index 00000000..457bd8fb --- /dev/null +++ b/media/objects/Glassware/Petri Dish 60mm-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/Glassware/Watch Glass-Front.svg b/media/objects/Glassware/Watch Glass-Front.svg new file mode 100644 index 00000000..5af875bf --- /dev/null +++ b/media/objects/Glassware/Watch Glass-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/Glassware/Watch Glass-Side.svg b/media/objects/Glassware/Watch Glass-Side.svg new file mode 100644 index 00000000..5af875bf --- /dev/null +++ b/media/objects/Glassware/Watch Glass-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/Glassware/Watch Glass-Top.svg b/media/objects/Glassware/Watch Glass-Top.svg new file mode 100644 index 00000000..941e7215 --- /dev/null +++ b/media/objects/Glassware/Watch Glass-Top.svg @@ -0,0 +1,52 @@ + + + + +Created by potrace 1.16, written by Peter Selinger 2001-2019 + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/presets/characters.js b/presets/characters.js index 170c432f..84e29a76 100644 --- a/presets/characters.js +++ b/presets/characters.js @@ -7686,13 +7686,23 @@ characterMakers.push(() => makeCharacter( { name: "Amanda", species: ["mouse"], tags: ["anthro"] }, { front: { - height: math.unit(6, "feet"), - weight: math.unit(140, "lbs"), + height: math.unit(5, "inches"), name: "Front", image: { - source: "./media/characters/amanda/front.svg" + source: "./media/characters/amanda/front.svg", + extra: 926/791, + bottom: 38/964 } - } + }, + back: { + height: math.unit(5, "inches"), + name: "Back", + image: { + source: "./media/characters/amanda/back.svg", + extra: 909/805, + bottom: 43/952 + } + }, }, [ { diff --git a/presets/objects.js b/presets/objects.js index 12202b1b..63beb9ef 100644 --- a/presets/objects.js +++ b/presets/objects.js @@ -854,5 +854,8 @@ function makeObjects() { results.push(makeModel({"name": "Dice", "kind": "objects", "forms": [{"name": "D6 Dotted", "views": [{"name": "Front", "height": 0.01415012776851654}, {"name": "Side", "height": 0.01415012776851654}, {"name": "Top", "height": 0.01415012776851654}]}, {"name": "D4", "views": [{"name": "Front", "height": 0.01699800044298172}, {"name": "Side", "height": 0.01699800044298172}, {"name": "Top", "height": 0.017878876999020576}]}, {"name": "D8", "views": [{"name": "Front", "height": 0.013862096704542637}, {"name": "Side", "height": 0.013862096704542637}, {"name": "Top", "height": 0.01808309182524681}]}, {"name": "D10", "views": [{"name": "Front", "height": 0.015351179987192154}, {"name": "Side", "height": 0.015351179987192154}, {"name": "Top", "height": 0.016876159235835075}]}, {"name": "D10 Percentile", "views": [{"name": "Front", "height": 0.015358946286141872}, {"name": "Side", "height": 0.015358946286141872}, {"name": "Top", "height": 0.016862813383340836}]}, {"name": "D12", "views": [{"name": "Front", "height": 0.017607660964131355}, {"name": "Side", "height": 0.017607660964131355}, {"name": "Top", "height": 0.02110980451107025}]}, {"name": "D20", "views": [{"name": "Front", "height": 0.01964765228331089}, {"name": "Side", "height": 0.01964765228331089}, {"name": "Top", "height": 0.023235414177179337}]}, {"name": "D6 Numbered", "views": [{"name": "Front", "height": 0.014152487739920616}, {"name": "Side", "height": 0.014152487739920616}, {"name": "Top", "height": 0.014152484014630318}]}]})) results.push(makeModel({"name": "Kitchenware", "kind": "objects", "forms": [{"name": "Fork", "views": [{"name": "Front", "height": 0.2818719744682312}, {"name": "Side", "height": 0.2818719744682312}, {"name": "Top", "height": 0.016759976744651794}]}, {"name": "Knife", "views": [{"name": "Front", "height": 0.3395436704158783}, {"name": "Side", "height": 0.3395436704158783}, {"name": "Top", "height": 0.010758467018604279}]}, {"name": "Spoon", "views": [{"name": "Front", "height": 0.2750821113586426}, {"name": "Side", "height": 0.2750821113586426}, {"name": "Top", "height": 0.019756551831960678}]}, {"name": "Wine Bottle", "views": [{"name": "Front", "height": 0.5660512447357178}, {"name": "Side", "height": 0.5660512447357178}, {"name": "Top", "height": 0.15603119134902954}]}, {"name": "Wooden Spoon", "views": [{"name": "Front", "height": 0.6168732643127441}, {"name": "Side", "height": 0.6168732643127441}, {"name": "Top", "height": 0.0339566171169281}]}, {"name": "Cutting Board", "views": [{"name": "Front", "height": 0.021497011184692383}, {"name": "Side", "height": 0.021497011184692383}, {"name": "Top", "height": 0.7172588109970093}]}, {"name": "Plate", "views": [{"name": "Front", "height": 0.05160319805145264}, {"name": "Side", "height": 0.05160319805145264}, {"name": "Top", "height": 0.40615978837013245}]}, {"name": "Bowl", "views": [{"name": "Front", "height": 0.1036841869354248}, {"name": "Side", "height": 0.1036841869354248}, {"name": "Top", "height": 0.24168895184993744}]}, {"name": "Coffee Cup", "views": [{"name": "Front", "height": 0.12534868717193604}, {"name": "Side", "height": 0.12534868717193604}, {"name": "Top", "height": 0.11728732287883759}]}, {"name": "Tea Cup", "views": [{"name": "Front", "height": 0.08793330192565918}, {"name": "Side", "height": 0.08793330192565918}, {"name": "Top", "height": 0.10884171724319458}]}]})) 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}]}]})); + /* ***INSERT HERE*** */ return results; } diff --git a/scripts/blender-model.py b/scripts/blender-model.py index 13913b9f..45a4bd77 100644 --- a/scripts/blender-model.py +++ b/scripts/blender-model.py @@ -5,7 +5,7 @@ import json import os import pathlib -GROUP_NAME = "Test" +GROUP_NAME = "Glassware" GROUP_KIND = "objects" path_info = pathlib.Path(bpy.data.filepath).parent.joinpath("macrovision-directory.txt") @@ -26,10 +26,10 @@ bpy.data.scenes["Scene"].render.film_transparent = True bpy.data.scenes["Scene"].view_settings.view_transform = "Raw" bpy.data.worlds["World"].node_tree.nodes["Background"].inputs[1].default_value = 0 -a + objects = [] for object in bpy.data.collections["Macrovision"].objects: - if object.type == "MESH": + if object.type == "MESH" or object.type == "CURVE": objects.append(object) all_data = {} diff --git a/scripts/process-model.py b/scripts/process-model.py index 5c6071a3..1a4491df 100644 --- a/scripts/process-model.py +++ b/scripts/process-model.py @@ -60,7 +60,7 @@ for data in all_data["forms"]: print(result) if os.path.exists(result) and os.path.getmtime(input) < os.path.getmtime(result): print("Skipping ", input) - # continue + continue input_base = sourcedir.joinpath(name + "-" + view_name + "-base.bmp") input_highlight = sourcedir.joinpath(name + "-" + view_name + "-highlight.bmp") @@ -79,4 +79,23 @@ for data in all_data["forms"]: subprocess.run([POTRACE, input_vivid, "-b", "svg", "-C", "#333333", "-o", output_vivid], shell=True) combine(output_base, output_highlight, output_vivid, result) # os.unlink(input_base) - # os.unlink(input_highlight) \ No newline at end of file + # os.unlink(input_highlight) + +# now we add the data + +file_path = macrodir.joinpath("presets").joinpath(category + ".js") + +with open(file_path, "r", encoding="utf-8") as file: + lines = file.readlines() + +found = False +with open(file_path, "w", encoding="utf-8") as file: + for line in lines: + if f"/* ***{group_name}*** */" in line: + found = True + file.write(f" /* ***{group_name}*** */ results.push(makeModel({json.dumps(all_data)}));\n") + elif "/* ***INSERT HERE*** */" in line and not found: + file.write(f" /* ***{group_name}*** */ results.push(makeModel({json.dumps(all_data)}));\n") + file.write(line) + else: + file.write(line)