WIP annotations
This commit is contained in:
parent
9c54b2f8d7
commit
232903c0ff
4 changed files with 178 additions and 80 deletions
|
@ -12,6 +12,9 @@ import svgwrite
|
||||||
import tempfile
|
import tempfile
|
||||||
import io
|
import io
|
||||||
import logging
|
import logging
|
||||||
|
from anytree import NodeMixin, RenderTree
|
||||||
|
from anytree.exporter import JsonExporter
|
||||||
|
from anytree.importer import JsonImporter, DictImporter
|
||||||
|
|
||||||
logger = logging.getLogger('svganim.strokes')
|
logger = logging.getLogger('svganim.strokes')
|
||||||
|
|
||||||
|
@ -232,7 +235,7 @@ class AnimationSlice:
|
||||||
strokes = self.getStrokeSlices(frame_in, frame_out, t_in)
|
strokes = self.getStrokeSlices(frame_in, frame_out, t_in)
|
||||||
# TODO shift t of points with t_in
|
# TODO shift t of points with t_in
|
||||||
viewboxes = self.getViewboxesSlice(t_in, t_out)
|
viewboxes = self.getViewboxesSlice(t_in, t_out)
|
||||||
|
|
||||||
audio = self.audio.getSlice(t_in, t_out) if self.audio else None
|
audio = self.audio.getSlice(t_in, t_out) if self.audio else None
|
||||||
return AnimationSlice([self.id[0], t_in, t_out], strokes, viewboxes, t_in, t_out, audio)
|
return AnimationSlice([self.id[0], t_in, t_out], strokes, viewboxes, t_in, t_out, audio)
|
||||||
|
|
||||||
|
@ -693,3 +696,31 @@ def strokes2D(strokes):
|
||||||
d += f"{rel_stroke[0]},{rel_stroke[1]} "
|
d += f"{rel_stroke[0]},{rel_stroke[1]} "
|
||||||
last_stroke = stroke
|
last_stroke = stroke
|
||||||
return d
|
return d
|
||||||
|
|
||||||
|
class Tag(NodeMixin):
|
||||||
|
def __init__(self, id, name = None, description = "", color = "black", parent=None, children=None):
|
||||||
|
self.id = id
|
||||||
|
self.name = self.id if name is None else name
|
||||||
|
self.color = color
|
||||||
|
self.description = description
|
||||||
|
self.parent = parent
|
||||||
|
if children:
|
||||||
|
self.children = children
|
||||||
|
|
||||||
|
|
||||||
|
class TagTree(NodeMixin):
|
||||||
|
def __init__(self, parent=None, children=None):
|
||||||
|
self.parent = parent
|
||||||
|
if children:
|
||||||
|
self.children = children
|
||||||
|
|
||||||
|
my0 = Tag('root')
|
||||||
|
my1 = Tag('my1', 1, 0, parent=my0)
|
||||||
|
my2 = Tag('my2', 0, 2, parent=my0)
|
||||||
|
|
||||||
|
print(RenderTree(my0))
|
||||||
|
tree = JsonExporter(indent=2).export(my0)
|
||||||
|
print(tree)
|
||||||
|
print(RenderTree(JsonImporter(DictImporter(Tag)).import_(tree)))
|
||||||
|
with open('www/tags.json', 'r') as fp:
|
||||||
|
print(RenderTree(JsonImporter(DictImporter(Tag)).read(fp)))
|
||||||
|
|
|
@ -1,81 +1,116 @@
|
||||||
{
|
{
|
||||||
"human-machine": {
|
"id": "root",
|
||||||
"fullname": "Human/machine Entanglements (Appearance/disappearance)",
|
"children": [
|
||||||
"color": "orange",
|
{
|
||||||
"sub": {
|
"id": "human-machine",
|
||||||
"vision": {
|
"name": "Human/machine Entanglements (Appearance/disappearance)",
|
||||||
"fullname": "Vision",
|
"color": "orange",
|
||||||
"color": "orange"
|
"children": [
|
||||||
},
|
{
|
||||||
"sound": {},
|
"id": "vision",
|
||||||
"behaviour": {},
|
"name": "Vision",
|
||||||
"other-senses": {
|
"color": "orange"
|
||||||
"fullname": "Other senses"
|
},
|
||||||
}
|
{
|
||||||
|
"id": "sound"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "behaviour"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "other-senses",
|
||||||
|
"name": "Other senses"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "tensions",
|
||||||
|
"name": "Tensions, contestations & problems",
|
||||||
|
"description": "Which problems are identified?, when do they become problems?",
|
||||||
|
"color": "gray"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "security",
|
||||||
|
"color": "blue",
|
||||||
|
"name": "Security & types of data",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"id": "definitions",
|
||||||
|
"description": "e.g. domain knowledge"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "input",
|
||||||
|
"description": "e.g. fake data"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "actants",
|
||||||
|
"name": "Actants in relation",
|
||||||
|
"color": "pink",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"id": "algorithm"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "technologies"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "frt"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "cameras",
|
||||||
|
"name": "CCTV & camera's"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "entities",
|
||||||
|
"name": "Entities: people, institutions etc."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "positioning",
|
||||||
|
"name": "Positioning",
|
||||||
|
"description": "the positioning of a field/person/oneself in relation to others"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "inside-outside"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "public-private"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "consequences",
|
||||||
|
"color": "green",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"id": "effects"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "future-imaginaries"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "speculations",
|
||||||
|
"description": "what is & what will/can be done."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "innovations"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "hesitation",
|
||||||
|
"name": "Hesitations & corrections",
|
||||||
|
"color": "yellow"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "skip",
|
||||||
|
"color": "black"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "todo",
|
||||||
|
"name": "to do / interesting",
|
||||||
|
"color": "red"
|
||||||
}
|
}
|
||||||
},
|
]
|
||||||
"tensions": {
|
|
||||||
"fullname": "Tensions, contestations & problems",
|
|
||||||
"description" : "Which problems are identified?, when do they become problems?",
|
|
||||||
"color": "gray"
|
|
||||||
},
|
|
||||||
"security": {
|
|
||||||
"color": "blue",
|
|
||||||
"fullname": "Security & types of data",
|
|
||||||
"sub": {
|
|
||||||
"definitions": {
|
|
||||||
"description": "e.g. domain knowledge"
|
|
||||||
},
|
|
||||||
"input": {
|
|
||||||
"description": "e.g. fake data"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"actants":{
|
|
||||||
"fullname": "Actants in relation",
|
|
||||||
"color": "pink",
|
|
||||||
"sub":{
|
|
||||||
"algorithm": {},
|
|
||||||
"technologies": {},
|
|
||||||
"frt": {},
|
|
||||||
"cameras": {
|
|
||||||
"fullname": "CCTV & camera's"
|
|
||||||
},
|
|
||||||
"entities":{
|
|
||||||
"fullname": "Entities: people, institutions etc."
|
|
||||||
},
|
|
||||||
"positioning":{
|
|
||||||
"fullname": "Positioning",
|
|
||||||
"description": "the positioning of a field/person/oneself in relation to others"
|
|
||||||
},
|
|
||||||
"inside-outside":{},
|
|
||||||
"public-private":{}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"consequences":{
|
|
||||||
"color": "green",
|
|
||||||
"sub":{
|
|
||||||
"effects":{},
|
|
||||||
"future-imaginaries":{},
|
|
||||||
"speculations": {
|
|
||||||
"description": "what is & what will/can be done."
|
|
||||||
},
|
|
||||||
"innovations": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
"hesitation":{
|
|
||||||
"fullname": "Hesitations & corrections",
|
|
||||||
"color": "yellow"
|
|
||||||
},
|
|
||||||
|
|
||||||
"skip":{
|
|
||||||
"color": "black"
|
|
||||||
},
|
|
||||||
|
|
||||||
"todo":{
|
|
||||||
"fullname": "to do / interesting",
|
|
||||||
"color": "red"
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
33
poetry.lock
generated
33
poetry.lock
generated
|
@ -1,3 +1,18 @@
|
||||||
|
[[package]]
|
||||||
|
name = "anytree"
|
||||||
|
version = "2.8.0"
|
||||||
|
description = "Powerful and Lightweight Python Tree Data Structure.."
|
||||||
|
category = "main"
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
six = ">=1.9.0"
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
dev = ["check-manifest"]
|
||||||
|
test = ["coverage"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "coloredlogs"
|
name = "coloredlogs"
|
||||||
version = "15.0.1"
|
version = "15.0.1"
|
||||||
|
@ -39,6 +54,14 @@ category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = "*"
|
python-versions = "*"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "six"
|
||||||
|
version = "1.16.0"
|
||||||
|
description = "Python 2 and 3 compatibility utilities"
|
||||||
|
category = "main"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "svgwrite"
|
name = "svgwrite"
|
||||||
version = "1.4.2"
|
version = "1.4.2"
|
||||||
|
@ -58,9 +81,13 @@ python-versions = ">= 3.5"
|
||||||
[metadata]
|
[metadata]
|
||||||
lock-version = "1.1"
|
lock-version = "1.1"
|
||||||
python-versions = "^3.9"
|
python-versions = "^3.9"
|
||||||
content-hash = "b989d535550aaf74b32cd9d2ff48ab7ed8d7d3fd5f0386bc2d6385d65adbf438"
|
content-hash = "1ad87cd5b37157a20ee2ec8f23d84b0275ca9f3aa3218c98eb18859d43aa5080"
|
||||||
|
|
||||||
[metadata.files]
|
[metadata.files]
|
||||||
|
anytree = [
|
||||||
|
{file = "anytree-2.8.0-py2.py3-none-any.whl", hash = "sha256:14c55ac77492b11532395049a03b773d14c7e30b22aa012e337b1e983de31521"},
|
||||||
|
{file = "anytree-2.8.0.tar.gz", hash = "sha256:3f0f93f355a91bc3e6245319bf4c1d50e3416cc7a35cc1133c1ff38306bbccab"},
|
||||||
|
]
|
||||||
coloredlogs = [
|
coloredlogs = [
|
||||||
{file = "coloredlogs-15.0.1-py2.py3-none-any.whl", hash = "sha256:612ee75c546f53e92e70049c9dbfcc18c935a2b9a53b66085ce9ef6a6e5c0934"},
|
{file = "coloredlogs-15.0.1-py2.py3-none-any.whl", hash = "sha256:612ee75c546f53e92e70049c9dbfcc18c935a2b9a53b66085ce9ef6a6e5c0934"},
|
||||||
{file = "coloredlogs-15.0.1.tar.gz", hash = "sha256:7c991aa71a4577af2f82600d8f8f3a89f936baeaf9b50a9c197da014e5bf16b0"},
|
{file = "coloredlogs-15.0.1.tar.gz", hash = "sha256:7c991aa71a4577af2f82600d8f8f3a89f936baeaf9b50a9c197da014e5bf16b0"},
|
||||||
|
@ -77,6 +104,10 @@ pyreadline3 = [
|
||||||
{file = "pyreadline3-3.4.1-py3-none-any.whl", hash = "sha256:b0efb6516fd4fb07b45949053826a62fa4cb353db5be2bbb4a7aa1fdd1e345fb"},
|
{file = "pyreadline3-3.4.1-py3-none-any.whl", hash = "sha256:b0efb6516fd4fb07b45949053826a62fa4cb353db5be2bbb4a7aa1fdd1e345fb"},
|
||||||
{file = "pyreadline3-3.4.1.tar.gz", hash = "sha256:6f3d1f7b8a31ba32b73917cefc1f28cc660562f39aea8646d30bd6eff21f7bae"},
|
{file = "pyreadline3-3.4.1.tar.gz", hash = "sha256:6f3d1f7b8a31ba32b73917cefc1f28cc660562f39aea8646d30bd6eff21f7bae"},
|
||||||
]
|
]
|
||||||
|
six = [
|
||||||
|
{file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
|
||||||
|
{file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
|
||||||
|
]
|
||||||
svgwrite = [
|
svgwrite = [
|
||||||
{file = "svgwrite-1.4.2-py3-none-any.whl", hash = "sha256:ca63d76396d1f6f099a2b2d8cf1419e1c1de8deece9a2b7f4da0632067d71d43"},
|
{file = "svgwrite-1.4.2-py3-none-any.whl", hash = "sha256:ca63d76396d1f6f099a2b2d8cf1419e1c1de8deece9a2b7f4da0632067d71d43"},
|
||||||
{file = "svgwrite-1.4.2.zip", hash = "sha256:d304a929f197d31647c287c10eee0f64378058e1c83a9df83433a5980864e59f"},
|
{file = "svgwrite-1.4.2.zip", hash = "sha256:d304a929f197d31647c287c10eee0f64378058e1c83a9df83433a5980864e59f"},
|
||||||
|
|
|
@ -10,6 +10,7 @@ tornado = "^6.1"
|
||||||
coloredlogs = "^15.0.1"
|
coloredlogs = "^15.0.1"
|
||||||
pydub = "^0.25.1"
|
pydub = "^0.25.1"
|
||||||
svgwrite = "^1.4.1"
|
svgwrite = "^1.4.1"
|
||||||
|
anytree = "^2.8.0"
|
||||||
|
|
||||||
[tool.poetry.dev-dependencies]
|
[tool.poetry.dev-dependencies]
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue