svgmapviewer-tools-floors 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/LICENSE +15 -0
  2. package/inkscape/extensions/Attic/fix_guides.inx +17 -0
  3. package/inkscape/extensions/Attic/fix_guides.py +30 -0
  4. package/inkscape/extensions/Attic/fix_symbol_links.inx +17 -0
  5. package/inkscape/extensions/Attic/fix_symbol_links.py +71 -0
  6. package/inkscape/extensions/Attic/flatten_style.inx +17 -0
  7. package/inkscape/extensions/Attic/flatten_style.py +31 -0
  8. package/inkscape/extensions/Attic/load_markers.inx +17 -0
  9. package/inkscape/extensions/Attic/load_markers.py +117 -0
  10. package/inkscape/extensions/Attic/load_patterns.inx +17 -0
  11. package/inkscape/extensions/Attic/load_patterns.py +116 -0
  12. package/inkscape/extensions/Attic/load_symbols.inx +17 -0
  13. package/inkscape/extensions/Attic/load_symbols.py +164 -0
  14. package/inkscape/extensions/Attic/renumber_tree.inx +24 -0
  15. package/inkscape/extensions/Attic/renumber_tree.py +39 -0
  16. package/inkscape/extensions/Attic/repeat_path.inx +17 -0
  17. package/inkscape/extensions/Attic/repeat_path.py +58 -0
  18. package/inkscape/extensions/Attic/resolve_facility_links.inx +19 -0
  19. package/inkscape/extensions/Attic/resolve_facility_links.py +16 -0
  20. package/inkscape/extensions/Attic/sort_symbols.inx +17 -0
  21. package/inkscape/extensions/Attic/sort_symbols.py +48 -0
  22. package/inkscape/extensions/Attic/symbol_load.inx +17 -0
  23. package/inkscape/extensions/Attic/symbol_load.py +99 -0
  24. package/inkscape/extensions/Attic/tidy_tree.inx +22 -0
  25. package/inkscape/extensions/Attic/tidy_tree.py +178 -0
  26. package/inkscape/extensions/Attic/use_shop.inx +22 -0
  27. package/inkscape/extensions/Attic/use_shop.py +26 -0
  28. package/inkscape/extensions/README.md +34 -0
  29. package/inkscape/extensions/daijimaps/__init__.py +72 -0
  30. package/inkscape/extensions/daijimaps/address_tree.py +231 -0
  31. package/inkscape/extensions/daijimaps/common.py +49 -0
  32. package/inkscape/extensions/daijimaps/generate_addresses.py +41 -0
  33. package/inkscape/extensions/daijimaps/guards.py +47 -0
  34. package/inkscape/extensions/daijimaps/map_layer.py +47 -0
  35. package/inkscape/extensions/daijimaps/name.py +167 -0
  36. package/inkscape/extensions/daijimaps/renumber.py +38 -0
  37. package/inkscape/extensions/daijimaps/resolve_labels.py +65 -0
  38. package/inkscape/extensions/daijimaps/resolve_names.py +170 -0
  39. package/inkscape/extensions/daijimaps/save_addresses.py +274 -0
  40. package/inkscape/extensions/daijimaps/types.py +128 -0
  41. package/inkscape/extensions/daijimaps/visit_parents.py +37 -0
  42. package/inkscape/extensions/extract_labels.py +79 -0
  43. package/inkscape/extensions/fixup_floor_svg.py +28 -0
  44. package/inkscape/extensions/fixup_texts.inx +15 -0
  45. package/inkscape/extensions/fixup_texts.py +110 -0
  46. package/inkscape/extensions/fixup_tree.inx +15 -0
  47. package/inkscape/extensions/fixup_tree.py +17 -0
  48. package/inkscape/extensions/flatten_transform.inx +17 -0
  49. package/inkscape/extensions/flatten_transform.py +63 -0
  50. package/inkscape/extensions/import_labels.inx +20 -0
  51. package/inkscape/extensions/import_labels.py +52 -0
  52. package/inkscape/extensions/import_shops.inx +20 -0
  53. package/inkscape/extensions/import_shops.py +47 -0
  54. package/inkscape/extensions/install.sh +14 -0
  55. package/inkscape/extensions/load_shops.inx +20 -0
  56. package/inkscape/extensions/load_shops.py +86 -0
  57. package/inkscape/extensions/renumber_group.inx +15 -0
  58. package/inkscape/extensions/renumber_group.py +17 -0
  59. package/inkscape/extensions/resolve_labels.inx +20 -0
  60. package/inkscape/extensions/resolve_labels.py +142 -0
  61. package/inkscape/extensions/resolve_shops.inx +20 -0
  62. package/inkscape/extensions/resolve_shops.py +73 -0
  63. package/inkscape/extensions/unresolve_labels.inx +20 -0
  64. package/inkscape/extensions/unresolve_labels.py +53 -0
  65. package/inkscape/extensions/unresolve_shops.inx +20 -0
  66. package/inkscape/extensions/unresolve_shops.py +56 -0
  67. package/inkscape/templates/floors.svg +665 -0
  68. package/map-extract-floors.js +821 -0
  69. package/package.json +19 -0
  70. package/pyproject.toml +20 -0
  71. package/scripts/inkex-inkscape +14 -0
  72. package/scripts/inkex-python +14 -0
  73. package/scripts/inkex-setup +6 -0
  74. package/scripts/labels.sh +18 -0
  75. package/scripts/regen.py +77 -0
  76. package/scripts/regen.sh +24 -0
@@ -0,0 +1,142 @@
1
+ #!/usr/bin/env python3
2
+ # coding=utf-8
3
+
4
+ import inkex
5
+ import inkex.command
6
+
7
+ import daijimaps
8
+ import daijimaps.resolve_labels
9
+
10
+
11
+ PX_PER_MM = 3.779527559
12
+
13
+
14
+ class ResolveLabels(daijimaps.resolve_labels.ResolveLabels):
15
+ _bounding_boxes: dict[str, inkex.BoundingBox] = {}
16
+
17
+ def _exec_query_all(self) -> str:
18
+ return inkex.command.call(
19
+ "inkscape",
20
+ "--query-all",
21
+ self.document_path(),
22
+ )
23
+
24
+ def _load_bounding_boxes(self) -> None:
25
+ self._bounding_boxes = {}
26
+ query_all_result = self._exec_query_all()
27
+ # self.msg(f"query_all_result: {query_all_result}")
28
+ for line in query_all_result.splitlines():
29
+ if len(line) == 0:
30
+ continue
31
+ try:
32
+ (id, x, y, width, height) = line.split(",")
33
+ bb = inkex.BoundingBox.new_xywh(
34
+ float(x), float(y), float(width), float(height)
35
+ )
36
+ self._bounding_boxes[id] = bb
37
+ except Exception as e:
38
+ self.msg(f"failed to parse --query-all result: {line}: {e}")
39
+
40
+ def _move_resolved_name(
41
+ self,
42
+ names_group: inkex.Group,
43
+ unresolved_names_group: inkex.Group,
44
+ astr: str,
45
+ name: str,
46
+ ) -> None:
47
+ label = f"{name} @ {astr}"
48
+ ((x, y), _bb, _href) = self._addresses[astr]
49
+ daijimaps.move_name(unresolved_names_group, names_group, name, label, x, y)
50
+
51
+ def _move_resolved_names(
52
+ self, names_group: inkex.Group, unresolved_names_group: inkex.Group
53
+ ) -> None:
54
+ self.msg(f"drawing result {self._tmp_resolved_names}")
55
+ for name, astrs in self._tmp_resolved_names.items():
56
+ for astr in astrs:
57
+ self._move_resolved_name(
58
+ names_group, unresolved_names_group, astr, name
59
+ )
60
+ self._sort_children(names_group)
61
+
62
+ def _process_addresses(self, node) -> None:
63
+ self.msg("=== resolve: start")
64
+
65
+ self._load_bounding_boxes()
66
+ # self.msg(f"_bounding_boxes: {self._bounding_boxes}")
67
+
68
+ names_group = self._prepare_names_group(node)
69
+ if names_group is None:
70
+ self.msg("(Names) group does not exist!")
71
+ return
72
+
73
+ unresolved_labels_group = self._prepare_unresolved_labels_group(node)
74
+ if unresolved_labels_group is None:
75
+ self.msg("(Unresolved Labels) group does not exist!")
76
+ return
77
+
78
+ labels_group = self._prepare_labels_group(node)
79
+ if labels_group is None:
80
+ self.msg("(Labels) group does not exist!")
81
+ return
82
+
83
+ # self.msg(f"_unresolved_labels: {self._unresolved_labels}")
84
+
85
+ for name, text_element in self._unresolved_labels.items():
86
+ addresses = self._resolved_names.get(name)
87
+ if addresses is None:
88
+ self.msg(f"_unresolved_labels: {name} {text_element}: no resolved name")
89
+ continue
90
+ bb = self._bounding_boxes.get(text_element.get_id())
91
+ if bb is None:
92
+ self.msg(f"_unresolved_labels: {name} {text_element}: no bounding box")
93
+ continue
94
+ c = bb.center
95
+ if c is None:
96
+ self.msg(f"_unresolved_labels: {name} {text_element}: no center")
97
+ continue
98
+ # XXX TODO Support multiple addresses for a name
99
+ (address, xy) = addresses[0]
100
+ if address is None:
101
+ self.msg(f"_unresolved_labels: {name} {text_element}: no address")
102
+ continue
103
+ (x, y) = xy
104
+ dcx = - c.x / PX_PER_MM # XXX unit
105
+ dcy = - c.y / PX_PER_MM # XXX unit
106
+ self.msg(f"_unresolved_labels: {name}@{xy} -> {c} ({x + dcx}, {y + dcy})")
107
+ t = text_element.transform
108
+ t2 = (
109
+ #t.add_translate(dcx, dcy).add_translate(x, y)
110
+ #if t is not None
111
+ #else
112
+ inkex.Transform(f"translate({x},{y}) translate({dcx},{dcy})")
113
+ )
114
+ text_element.transform = t2
115
+ text_element.set("data-x", str(x))
116
+ text_element.set("data-y", str(y))
117
+
118
+ text_element.label = f"{name} @ {address}"
119
+
120
+ parent = text_element.getparent()
121
+ if parent is not None:
122
+ parent.remove(text_element)
123
+ labels_group.append(text_element)
124
+
125
+ # resolve labels!
126
+ self._resolve_labels()
127
+
128
+ # self._move_resolved_names(names_group, unresolved_names_group)
129
+
130
+ # self._read_resolved_names(names_group)
131
+ # self._save_resolved_names()
132
+ # self._read_unresolved_names(unresolved_names_group)
133
+ # self._save_unresolved_names()
134
+
135
+ # self._save_floors_addresses()
136
+ # self._save_floors_names()
137
+
138
+ self.msg("=== resolve: end")
139
+
140
+
141
+ if __name__ == "__main__":
142
+ ResolveLabels().run()
@@ -0,0 +1,20 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <inkscape-extension xmlns="http://www.inkscape.org/namespace/inkscape/extension">
3
+ <name>Address: Resolve: Resolve shops</name>
4
+ <id>daijimaps.resolve_shops</id>
5
+ <label>Address: Resolve: Resolve shop names to addresses.</label>
6
+ <param name="tab" type="notebook">
7
+ <page name="Options" gui-text="Options">
8
+ <param name="floor" type="string" gui-text="Target floor (regular expression)">.</param>
9
+ </page>
10
+ </param>
11
+ <effect needs-live-preview="false">
12
+ <object-type>all</object-type>
13
+ <effects-menu>
14
+ <submenu name="Daiji Maps"/>
15
+ </effects-menu>
16
+ </effect>
17
+ <script>
18
+ <command location="inx" interpreter="python">resolve_shops.py</command>
19
+ </script>
20
+ </inkscape-extension>
@@ -0,0 +1,73 @@
1
+ #!/usr/bin/env python3
2
+ # coding=utf-8
3
+
4
+ import inkex
5
+
6
+ import daijimaps
7
+
8
+
9
+ class ResolveShops(daijimaps.ResolveNames):
10
+ def _move_resolved_name(
11
+ self,
12
+ names_group: inkex.Group,
13
+ unresolved_names_group: inkex.Group,
14
+ astr: str,
15
+ name: str,
16
+ ) -> None:
17
+ label = f"{name} @ {astr}"
18
+ ((x, y), _bb, _href) = self._addresses[astr]
19
+ daijimaps.move_name(unresolved_names_group, names_group, name, label, x, y)
20
+
21
+ def _move_resolved_names(
22
+ self, names_group: inkex.Group, unresolved_names_group: inkex.Group
23
+ ) -> None:
24
+ self.msg(f"drawing result {self._tmp_resolved_names}")
25
+ for name, astrs in self._tmp_resolved_names.items():
26
+ for astr in astrs:
27
+ self._move_resolved_name(
28
+ names_group, unresolved_names_group, astr, name
29
+ )
30
+ self._sort_children(names_group)
31
+
32
+ def _process_addresses(self, node) -> None:
33
+ self.msg("=== resolve: start")
34
+
35
+ names_group = self._prepare_names_group(node)
36
+ unresolved_names_group = self._prepare_unresolved_names_group(node)
37
+
38
+ if names_group is None:
39
+ self.msg("(Names) group does not exist!")
40
+ return
41
+ if unresolved_names_group is None:
42
+ self.msg("(Unresolved Names) group does not exist!")
43
+ return
44
+
45
+ # resolve names!
46
+ self._resolve_names()
47
+
48
+ self._move_resolved_names(names_group, unresolved_names_group)
49
+
50
+ self._read_resolved_names(names_group)
51
+ self._save_resolved_names()
52
+ self._read_unresolved_names(unresolved_names_group)
53
+ self._save_unresolved_names()
54
+
55
+ self._save_floors_addresses()
56
+ self._save_floors_names()
57
+
58
+ self.msg("=== resolve: end")
59
+
60
+ # XXX
61
+ def _post_layers(self) -> None:
62
+ if self.options.floor != ".":
63
+ # avoid incomplete links
64
+ self.msg("=== resolve facility links: skip")
65
+ return
66
+ self.msg("=== resolve facility links: start")
67
+ self._collect_links()
68
+ self._save_links()
69
+ self.msg("=== resolve facility links: end")
70
+
71
+
72
+ if __name__ == "__main__":
73
+ ResolveShops().run()
@@ -0,0 +1,20 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <inkscape-extension xmlns="http://www.inkscape.org/namespace/inkscape/extension">
3
+ <name>Address: Resolve: Un-resolve labels</name>
4
+ <id>daijimaps.unresolve_labels</id>
5
+ <label>Address: Resolve: Un-resolve shop labels to addresses.</label>
6
+ <param name="tab" type="notebook">
7
+ <page name="Options" gui-text="Options">
8
+ <param name="floor" type="string" gui-text="Target floor (regular expression)">.</param>
9
+ </page>
10
+ </param>
11
+ <effect needs-live-preview="false">
12
+ <object-type>all</object-type>
13
+ <effects-menu>
14
+ <submenu name="Daiji Maps"/>
15
+ </effects-menu>
16
+ </effect>
17
+ <script>
18
+ <command location="inx" interpreter="python">unresolve_labels.py</command>
19
+ </script>
20
+ </inkscape-extension>
@@ -0,0 +1,53 @@
1
+ #!/usr/bin/env python3
2
+ # coding=utf-8
3
+
4
+ import inkex
5
+
6
+ import daijimaps.name
7
+ import daijimaps.resolve_labels
8
+
9
+
10
+ class UnresolveLabels(daijimaps.resolve_labels.ResolveLabels):
11
+ def _move_resolved_label(
12
+ self,
13
+ labels_group: inkex.Group,
14
+ unresolved_labels_group: inkex.Group,
15
+ new_name: str,
16
+ t: inkex.TextElement,
17
+ ) -> None:
18
+ old_name = t.label
19
+ daijimaps.name.move_label(
20
+ labels_group, unresolved_labels_group, old_name, new_name
21
+ )
22
+
23
+ def _move_resolved_labels(
24
+ self, labels_group: inkex.Group, unresolved_labels_group: inkex.Group
25
+ ) -> None:
26
+ for name, t in self._resolved_labels.items():
27
+ self.msg(f"moving label: {name}")
28
+ self._move_resolved_label(labels_group, unresolved_labels_group, name, t)
29
+ self._sort_children(unresolved_labels_group)
30
+
31
+ def _process_addresses(self, node: inkex.Group) -> None:
32
+ self.msg("=== unresolve: start")
33
+
34
+ unresolved_labels_group = self._prepare_unresolved_labels_group(node)
35
+ labels_group = self._prepare_labels_group(node)
36
+
37
+ if labels_group is None:
38
+ self.msg("(Labels) group does not exist!")
39
+ return
40
+ if unresolved_labels_group is None:
41
+ self.msg("(Unresolved Labels) group does not exist!")
42
+ return
43
+
44
+ self._move_resolved_labels(labels_group, unresolved_labels_group)
45
+
46
+ # self._read_unresolved_labels(unresolved_labels_group)
47
+ # self._read_resolved_labels(labels_group)
48
+
49
+ self.msg("=== unresolve: end")
50
+
51
+
52
+ if __name__ == "__main__":
53
+ UnresolveLabels().run()
@@ -0,0 +1,20 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <inkscape-extension xmlns="http://www.inkscape.org/namespace/inkscape/extension">
3
+ <name>Address: Resolve: Un-resolve shops</name>
4
+ <id>daijimaps.unresolve_shops</id>
5
+ <label>Address: Resolve: Un-resolve shop names to addresses.</label>
6
+ <param name="tab" type="notebook">
7
+ <page name="Options" gui-text="Options">
8
+ <param name="floor" type="string" gui-text="Target floor (regular expression)">.</param>
9
+ </page>
10
+ </param>
11
+ <effect needs-live-preview="false">
12
+ <object-type>all</object-type>
13
+ <effects-menu>
14
+ <submenu name="Daiji Maps"/>
15
+ </effects-menu>
16
+ </effect>
17
+ <script>
18
+ <command location="inx" interpreter="python">unresolve_shops.py</command>
19
+ </script>
20
+ </inkscape-extension>
@@ -0,0 +1,56 @@
1
+ #!/usr/bin/env python3
2
+ # coding=utf-8
3
+
4
+ import inkex
5
+
6
+ import daijimaps
7
+
8
+
9
+ class UnresolveShops(daijimaps.ResolveNames):
10
+ def _move_unresolved_name(
11
+ self,
12
+ names_group: inkex.Group,
13
+ unresolved_names_group: inkex.Group,
14
+ name: str,
15
+ address: daijimaps.AddressString | None,
16
+ x: float,
17
+ y: float,
18
+ ) -> None:
19
+ label = name if address is None else f"{name} @ {address}"
20
+ daijimaps.move_name(names_group, unresolved_names_group, label, name, x, y)
21
+
22
+ def _move_unresolved_names(
23
+ self, names_group: inkex.Group, unresolved_names_group: inkex.Group
24
+ ) -> None:
25
+ for name, addresses in self._resolved_names.items():
26
+ for address, (x, y) in addresses:
27
+ self._move_unresolved_name(
28
+ names_group, unresolved_names_group, name, address, x, y
29
+ )
30
+ self._sort_children(unresolved_names_group)
31
+
32
+ def _process_addresses(self, node: inkex.Group) -> None:
33
+ self.msg("=== unresolve: start")
34
+
35
+ names_group = self._prepare_names_group(node)
36
+ unresolved_names_group = self._prepare_unresolved_names_group(node)
37
+
38
+ if names_group is None:
39
+ self.msg("(Names) group does not exist!")
40
+ return
41
+ if unresolved_names_group is None:
42
+ self.msg("(Unresolved Names) group does not exist!")
43
+ return
44
+
45
+ self._move_unresolved_names(names_group, unresolved_names_group)
46
+
47
+ self._read_resolved_names(names_group)
48
+ self._save_resolved_names()
49
+ self._read_unresolved_names(unresolved_names_group)
50
+ self._save_unresolved_names()
51
+
52
+ self.msg("=== unresolve: end")
53
+
54
+
55
+ if __name__ == "__main__":
56
+ UnresolveShops().run()