stbkit 0.1.0a9.dev1__py3-none-any.whl

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 (125) hide show
  1. stbkit/__main__.py +10 -0
  2. stbkit/api/__init__.py +48 -0
  3. stbkit/api/experimental/__init__.py +19 -0
  4. stbkit/api/experimental/repository/__init__.py +30 -0
  5. stbkit/api/py.typed +0 -0
  6. stbkit/api/stb_latest.py +7 -0
  7. stbkit/api/stb_v2_0_2.py +11 -0
  8. stbkit/api/stb_v2_1_1.py +9 -0
  9. stbkit/cli/__init__.py +17 -0
  10. stbkit/cli/_internal/cli_main.py +114 -0
  11. stbkit/cli/_internal/common.py +126 -0
  12. stbkit/cli/_internal/constants_exit_code.py +59 -0
  13. stbkit/cli/_internal/converter.py +693 -0
  14. stbkit/cli/_internal/diff.py +213 -0
  15. stbkit/cli/_internal/entry_points.py +25 -0
  16. stbkit/cli/_internal/global_parent.py +70 -0
  17. stbkit/cli/_internal/show_versions.py +36 -0
  18. stbkit/cli/_internal/validate.py +310 -0
  19. stbkit/cli/commands/convert.py +16 -0
  20. stbkit/cli/commands/diff.py +16 -0
  21. stbkit/cli/commands/validate.py +16 -0
  22. stbkit/cli/py.typed +0 -0
  23. stbkit/tools/__init__.py +12 -0
  24. stbkit/tools/_internal/__init__.py +5 -0
  25. stbkit/tools/_internal/constants.py +21 -0
  26. stbkit/tools/_internal/data_model/building_geometry.py +1208 -0
  27. stbkit/tools/_internal/data_model/building_geometry_web.py +106 -0
  28. stbkit/tools/_internal/data_model/element_data.py +93 -0
  29. stbkit/tools/_internal/data_model/ifc_data/entity_data.py +67 -0
  30. stbkit/tools/_internal/data_model/ifc_data/entity_names.py +32 -0
  31. stbkit/tools/_internal/data_model/shape_data.py +1089 -0
  32. stbkit/tools/_internal/diff/__init__.py +5 -0
  33. stbkit/tools/_internal/diff/common.py +50 -0
  34. stbkit/tools/_internal/diff/diff_xml.py +796 -0
  35. stbkit/tools/_internal/matrix.py +51 -0
  36. stbkit/tools/_internal/optional_dependencies/__init__.py +5 -0
  37. stbkit/tools/_internal/optional_dependencies/ifc_common.py +28 -0
  38. stbkit/tools/_internal/optional_dependencies/ifc_exporter/ifc_entity_exporter.py +473 -0
  39. stbkit/tools/_internal/optional_dependencies/ifc_exporter/ifc_profile_exporter.py +267 -0
  40. stbkit/tools/_internal/optional_dependencies/ifc_exporter/ifc_representation_exporter.py +178 -0
  41. stbkit/tools/_internal/optional_dependencies/ifc_pipeline.py +133 -0
  42. stbkit/tools/_internal/optional_dependencies/ifc_to_building_geometry.py +64 -0
  43. stbkit/tools/_internal/stb_io.py +116 -0
  44. stbkit/tools/_internal/stb_repair/_common.py +24 -0
  45. stbkit/tools/_internal/stb_repair/_stb_repair.py +197 -0
  46. stbkit/tools/_internal/stb_repair/_stb_v2_0_2_repair.py +53 -0
  47. stbkit/tools/_internal/stb_repair/_stb_v2_1_0_repair.py +109 -0
  48. stbkit/tools/_internal/stb_repair/_stb_v2_1_1_repair.py +109 -0
  49. stbkit/tools/_internal/studio_report.py +49 -0
  50. stbkit/tools/_internal/utils/atomic_writer.py +57 -0
  51. stbkit/tools/_internal/utils/float_rounding.py +49 -0
  52. stbkit/tools/_internal/utils/girder_utils.py +91 -0
  53. stbkit/tools/_internal/utils/guid_utils.py +30 -0
  54. stbkit/tools/_internal/utils/mesh_utils.py +1305 -0
  55. stbkit/tools/_internal/utils/node_utils.py +50 -0
  56. stbkit/tools/_internal/utils/unit_utils.py +23 -0
  57. stbkit/tools/_internal/vectors.py +222 -0
  58. stbkit/tools/converters/__init__.py +39 -0
  59. stbkit/tools/converters/_internal/__init__.py +5 -0
  60. stbkit/tools/converters/_internal/building_geometry_to_ply_text.py +32 -0
  61. stbkit/tools/converters/_internal/coord_converter.py +151 -0
  62. stbkit/tools/converters/_internal/element_data_to_building_geometry.py +549 -0
  63. stbkit/tools/converters/_internal/ifc_to_ply_text.py +21 -0
  64. stbkit/tools/converters/_internal/name_converter.py +23 -0
  65. stbkit/tools/converters/_internal/pipeline/__init__.py +5 -0
  66. stbkit/tools/converters/_internal/pipeline/data.py +188 -0
  67. stbkit/tools/converters/_internal/pipeline/execution.py +569 -0
  68. stbkit/tools/converters/_internal/pipeline/ply_pipeline.py +52 -0
  69. stbkit/tools/converters/_internal/pipeline/stb_pipeline.py +226 -0
  70. stbkit/tools/converters/_internal/pipeline/stb_pipeline_latest.py +39 -0
  71. stbkit/tools/converters/_internal/pipeline/step.py +139 -0
  72. stbkit/tools/converters/_internal/stb_latest_to_element_data/__init__.py +17 -0
  73. stbkit/tools/converters/_internal/stb_latest_to_element_data/_stb_latest_to_element_data.py +186 -0
  74. stbkit/tools/converters/_internal/stb_latest_to_element_data/member/member_footing.py +49 -0
  75. stbkit/tools/converters/_internal/stb_latest_to_element_data/member/member_line.py +533 -0
  76. stbkit/tools/converters/_internal/stb_latest_to_element_data/member/member_pile.py +100 -0
  77. stbkit/tools/converters/_internal/stb_latest_to_element_data/member/member_plane.py +103 -0
  78. stbkit/tools/converters/_internal/stb_latest_to_element_data/open.py +70 -0
  79. stbkit/tools/converters/_internal/stb_latest_to_element_data/section/sec.py +214 -0
  80. stbkit/tools/converters/_internal/stb_latest_to_element_data/section/sec_beam_rc.py +67 -0
  81. stbkit/tools/converters/_internal/stb_latest_to_element_data/section/sec_beam_s.py +97 -0
  82. stbkit/tools/converters/_internal/stb_latest_to_element_data/section/sec_beam_src.py +28 -0
  83. stbkit/tools/converters/_internal/stb_latest_to_element_data/section/sec_brace_s.py +49 -0
  84. stbkit/tools/converters/_internal/stb_latest_to_element_data/section/sec_column_cft.py +217 -0
  85. stbkit/tools/converters/_internal/stb_latest_to_element_data/section/sec_column_rc.py +41 -0
  86. stbkit/tools/converters/_internal/stb_latest_to_element_data/section/sec_column_s.py +127 -0
  87. stbkit/tools/converters/_internal/stb_latest_to_element_data/section/sec_column_src.py +173 -0
  88. stbkit/tools/converters/_internal/stb_latest_to_element_data/section/sec_foundation.py +225 -0
  89. stbkit/tools/converters/_internal/stb_latest_to_element_data/section/sec_parapet_rc.py +53 -0
  90. stbkit/tools/converters/_internal/stb_latest_to_element_data/section/sec_pile_rc.py +106 -0
  91. stbkit/tools/converters/_internal/stb_latest_to_element_data/section/sec_pile_s.py +100 -0
  92. stbkit/tools/converters/_internal/stb_latest_to_element_data/section/sec_steel.py +432 -0
  93. stbkit/tools/converters/_internal/stb_to_building_geometry.py +44 -0
  94. stbkit/tools/converters/_internal/stb_to_ifc_data/__init__.py +5 -0
  95. stbkit/tools/converters/_internal/stb_to_ifc_data/_stb_to_ifc_data.py +59 -0
  96. stbkit/tools/converters/_internal/stb_to_ifc_data/convert_option.py +22 -0
  97. stbkit/tools/converters/_internal/stb_to_ply_text.py +22 -0
  98. stbkit/tools/py.typed +0 -0
  99. stbkit/tools/upgrade/__init__.py +13 -0
  100. stbkit/tools/upgrade/_internal/__init__.py +5 -0
  101. stbkit/tools/upgrade/_internal/common.py +205 -0
  102. stbkit/tools/upgrade/_internal/upgrade.py +228 -0
  103. stbkit/tools/upgrade/_internal/v2_0_2_to_v2_1_0/__init__.py +60 -0
  104. stbkit/tools/upgrade/_internal/v2_0_2_to_v2_1_0/hook_funcs/hook_common.py +62 -0
  105. stbkit/tools/upgrade/_internal/v2_0_2_to_v2_1_0/hook_funcs/hook_joint_beam_shape_h.py +44 -0
  106. stbkit/tools/upgrade/_internal/v2_0_2_to_v2_1_0/hook_funcs/hook_sec_pile_rc.py +101 -0
  107. stbkit/tools/upgrade/_internal/v2_0_2_to_v2_1_0/hook_funcs/hook_sec_pile_s.py +78 -0
  108. stbkit/tools/upgrade/_internal/v2_0_2_to_v2_1_0/hook_funcs/hook_sec_slab_deck.py +56 -0
  109. stbkit/tools/upgrade/_internal/v2_0_2_to_v2_1_0/hook_funcs/hook_sec_slab_rc.py +128 -0
  110. stbkit/tools/upgrade/_internal/v2_0_2_to_v2_1_0/hook_funcs/post_girder.py +126 -0
  111. stbkit/tools/upgrade/_internal/v2_0_2_to_v2_1_0/hook_funcs/post_open.py +110 -0
  112. stbkit/tools/upgrade/_internal/v2_0_2_to_v2_1_0/hook_funcs/post_sec_beam_rc.py +227 -0
  113. stbkit/tools/upgrade/_internal/v2_0_2_to_v2_1_0/hook_funcs/post_sec_beam_s.py +1153 -0
  114. stbkit/tools/upgrade/_internal/v2_0_2_to_v2_1_0/hooks.py +22 -0
  115. stbkit/tools/upgrade/_internal/v2_0_2_to_v2_1_0/post.py +42 -0
  116. stbkit/tools/upgrade/_internal/v2_0_2_to_v2_1_0/tables.py +99 -0
  117. stbkit/tools/upgrade/_internal/v2_1_0_to_v2_1_1/__init__.py +58 -0
  118. stbkit/tools/upgrade/_internal/v2_1_0_to_v2_1_1/hooks.py +32 -0
  119. stbkit/tools/upgrade/_internal/v2_1_0_to_v2_1_1/tables.py +56 -0
  120. stbkit-0.1.0a9.dev1.dist-info/METADATA +196 -0
  121. stbkit-0.1.0a9.dev1.dist-info/RECORD +125 -0
  122. stbkit-0.1.0a9.dev1.dist-info/WHEEL +5 -0
  123. stbkit-0.1.0a9.dev1.dist-info/entry_points.txt +2 -0
  124. stbkit-0.1.0a9.dev1.dist-info/licenses/LICENSE +373 -0
  125. stbkit-0.1.0a9.dev1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,205 @@
1
+ # Copyright 2025-2026 TAISEI CORPORATION
2
+ # SPDX-License-Identifier: MPL-2.0
3
+ # This Source Code Form is subject to the terms of the Mozilla Public
4
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
5
+ # file, You can obtain one at https://mozilla.org/MPL/2.0/.
6
+
7
+ from collections.abc import Mapping
8
+ from types import ModuleType
9
+ from typing import Any, Protocol
10
+
11
+ from stbkit.core._internal.name_converter import (
12
+ xml_element_name_to_key,
13
+ xml_element_name_to_python_class_name,
14
+ )
15
+ from stbkit.core.data_model.common import (
16
+ StBridgeElement,
17
+ StBridgeRoot,
18
+ _StBridgeExtensionElement,
19
+ )
20
+ from stbkit.core.stb_reporting import Code, Phase, Reporter
21
+
22
+
23
+ class ElementHook(Protocol):
24
+ """変換が終わった後に呼ばれる後処理"""
25
+
26
+ def __call__(
27
+ self, before: StBridgeElement, after: StBridgeElement, *, reporter: Reporter
28
+ ) -> None: ...
29
+
30
+
31
+ def _clone_extension_element(element: StBridgeElement) -> _StBridgeExtensionElement:
32
+ clone = _StBridgeExtensionElement(element._xml_name())
33
+ _copy_extension(element, clone)
34
+ return clone
35
+
36
+
37
+ def _copy_extension(source: StBridgeElement, new_element: StBridgeElement) -> None:
38
+ extension = source._extension
39
+ if extension is None:
40
+ return
41
+ if extension._attributes:
42
+ for name, value in extension._attributes.items():
43
+ new_element._ensure_extension._set_attribute(name, value)
44
+ if extension._children:
45
+ for child in extension._children:
46
+ new_element._ensure_extension._set_child(_clone_extension_element(child))
47
+
48
+
49
+ def _resolve_renamed_child_attr_name(
50
+ element: StBridgeElement,
51
+ attr_name: str,
52
+ class_name_table: dict[str, str],
53
+ ) -> str | None:
54
+ if not element._is_child(attr_name):
55
+ return None
56
+ source_child_xml_name: str = element._xml_name(attr_name)
57
+ target_child_xml_name: str | None = class_name_table.get(source_child_xml_name)
58
+ if target_child_xml_name is None:
59
+ return None
60
+
61
+ source_child_key: str = xml_element_name_to_key(source_child_xml_name)
62
+ if attr_name == source_child_key:
63
+ return xml_element_name_to_key(target_child_xml_name)
64
+ return None
65
+
66
+
67
+ def convert_element(
68
+ element: StBridgeElement,
69
+ module_to: ModuleType,
70
+ *,
71
+ ignore_field: dict[str, list[str]] | None = None,
72
+ class_name_table: dict[str, str] | None = None,
73
+ attr_name_table: dict[str, dict[str, str]] | None = None,
74
+ hooks: Mapping[str, ElementHook] | None = None,
75
+ post: ElementHook | None = None,
76
+ reporter: Reporter,
77
+ ) -> StBridgeElement | None:
78
+ """要素を変換後バージョンのモジュールの同等クラスへ複製する。
79
+
80
+ 変換後のバージョンに対応するクラスが無い場合はNoneを返す。
81
+ """
82
+ if ignore_field is None:
83
+ ignore_field = {}
84
+ old_class_name: str = element.__class__.__name__
85
+ old_element_name: str = element._xml_name()
86
+ new_class_name: str = old_class_name
87
+ if class_name_table and old_element_name in class_name_table:
88
+ new_class_name = xml_element_name_to_python_class_name(
89
+ class_name_table[old_element_name]
90
+ )
91
+ NewClass: type[StBridgeElement] | None = getattr(module_to, new_class_name, None)
92
+ if NewClass is None:
93
+ reporter.warning(
94
+ message=(
95
+ f"変換後のバージョンにクラス[{new_class_name}]がないためスキップします"
96
+ ),
97
+ code=Code.NOT_IMPLEMENTED,
98
+ phase=Phase.UPGRADE,
99
+ stb_element=element,
100
+ )
101
+ return None
102
+ new_element: StBridgeElement = NewClass()
103
+ for key in element._fields:
104
+ attr_name: str = key
105
+ if attr_name.startswith("_"):
106
+ continue
107
+ new_attr_name: str = attr_name
108
+ if attr_name in ignore_field.get(old_element_name, []):
109
+ continue
110
+ if (
111
+ attr_name_table
112
+ and old_element_name in attr_name_table
113
+ and attr_name in attr_name_table[old_element_name]
114
+ ):
115
+ new_attr_name = attr_name_table[old_element_name][attr_name]
116
+ elif class_name_table:
117
+ auto_renamed_attr_name = _resolve_renamed_child_attr_name(
118
+ element,
119
+ attr_name,
120
+ class_name_table,
121
+ )
122
+ if auto_renamed_attr_name is not None:
123
+ new_attr_name = auto_renamed_attr_name
124
+ value: Any = getattr(element, f"_{attr_name}")
125
+ if not hasattr(new_element, f"_{new_attr_name}"):
126
+ if value is not None:
127
+ reporter.warning(
128
+ message=(f"変換後のバージョンに属性[{new_attr_name}]がありません"),
129
+ code=Code.NOT_IMPLEMENTED,
130
+ phase=Phase.UPGRADE,
131
+ stb_element=element,
132
+ attr_name=attr_name,
133
+ )
134
+ continue
135
+ else:
136
+ continue
137
+ elif element._is_child(attr_name) and new_element._is_child(new_attr_name):
138
+ source_is_children: bool = element._is_children(attr_name)
139
+ target_is_children: bool = new_element._is_children(new_attr_name)
140
+ if source_is_children and target_is_children:
141
+ new_items: list[StBridgeElement] = []
142
+ for item in getattr(element, attr_name):
143
+ new_item: StBridgeElement | None = convert_element(
144
+ item,
145
+ module_to,
146
+ ignore_field=ignore_field,
147
+ class_name_table=class_name_table,
148
+ attr_name_table=attr_name_table,
149
+ hooks=hooks,
150
+ reporter=reporter,
151
+ )
152
+ if new_item is not None:
153
+ new_items.append(new_item)
154
+ setattr(new_element, new_attr_name, new_items)
155
+ elif not source_is_children and not target_is_children:
156
+ if value:
157
+ new_child: StBridgeElement | None = convert_element(
158
+ value,
159
+ module_to,
160
+ ignore_field=ignore_field,
161
+ class_name_table=class_name_table,
162
+ attr_name_table=attr_name_table,
163
+ hooks=hooks,
164
+ reporter=reporter,
165
+ )
166
+ if new_child is not None:
167
+ setattr(new_element, new_attr_name, new_child)
168
+ elif not source_is_children and target_is_children:
169
+ if value:
170
+ new_child = convert_element(
171
+ value,
172
+ module_to,
173
+ ignore_field=ignore_field,
174
+ class_name_table=class_name_table,
175
+ attr_name_table=attr_name_table,
176
+ hooks=hooks,
177
+ reporter=reporter,
178
+ )
179
+ if new_child is not None:
180
+ setattr(new_element, new_attr_name, [new_child])
181
+ else:
182
+ reporter.warning(
183
+ message=("子要素の最大回数が異なります"),
184
+ code=Code.SCHEMA_VERSION_MISMATCH,
185
+ phase=Phase.UPGRADE,
186
+ stb_element=element,
187
+ attr_name=attr_name,
188
+ )
189
+ else:
190
+ if value is not None:
191
+ new_element._set_attribute_by_any(new_attr_name, value)
192
+ _copy_extension(element, new_element)
193
+ if hooks is not None:
194
+ hook: ElementHook | None = hooks.get(old_element_name)
195
+ if hook is not None:
196
+ hook(element, new_element, reporter=reporter)
197
+ if post is not None:
198
+ post(
199
+ element,
200
+ new_element,
201
+ reporter=reporter,
202
+ )
203
+ if isinstance(new_element, StBridgeRoot):
204
+ new_element._set_version(reporter=reporter, phase=Phase.UPGRADE)
205
+ return new_element
@@ -0,0 +1,228 @@
1
+ # Copyright 2025-2026 TAISEI CORPORATION
2
+ # SPDX-License-Identifier: MPL-2.0
3
+ # This Source Code Form is subject to the terms of the Mozilla Public
4
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
5
+ # file, You can obtain one at https://mozilla.org/MPL/2.0/.
6
+
7
+ from logging import Logger
8
+ from typing import TYPE_CHECKING, Literal, overload
9
+
10
+ from stbkit.core.data_model import (
11
+ stb_v2_0_0,
12
+ stb_v2_0_1,
13
+ stb_v2_0_2,
14
+ stb_v2_1_0,
15
+ stb_v2_1_1,
16
+ )
17
+ from stbkit.core.data_model.common import StBridgeRoot
18
+ from stbkit.core.stb_exceptions import UnsupportedStbVersionError
19
+ from stbkit.core.stb_reporting import Code, Phase, Reporter, get_reporter
20
+ from stbkit.core.validation._internal.validator import _validate
21
+
22
+ from .common import convert_element
23
+ from .v2_0_2_to_v2_1_0 import upgrade_v2_0_2_to_v2_1_0
24
+ from .v2_1_0_to_v2_1_1 import upgrade_v2_1_0_to_v2_1_1
25
+
26
+ if TYPE_CHECKING:
27
+ from stbkit.api import stb_latest
28
+
29
+ __all__ = ["upgrade_v2_0_2_to_v2_1_0", "upgrade_v2_1_0_to_v2_1_1"]
30
+
31
+
32
+ def upgrade_v2_0_0_to_v2_0_1(
33
+ stb: stb_v2_0_0.StBridge,
34
+ *,
35
+ reporter: Reporter,
36
+ ) -> stb_v2_0_1.StBridge:
37
+ reporter.info(
38
+ "---v2.0.0->v2.0.1変換処理開始---",
39
+ code=Code.PROGRESS_INFO,
40
+ phase=Phase.UPGRADE,
41
+ )
42
+ new_stb = convert_element(
43
+ stb,
44
+ stb_v2_0_1,
45
+ reporter=reporter,
46
+ )
47
+ if isinstance(new_stb, stb_v2_0_1.StBridge):
48
+ new_stb.version = stb_v2_0_1.VERSION
49
+ reporter.info(
50
+ "---v2.0.0->v2.0.1変換処理完了---",
51
+ code=Code.PROGRESS_INFO,
52
+ phase=Phase.UPGRADE,
53
+ )
54
+ reporter.info(
55
+ "---v2.0.1バリデーション開始---",
56
+ code=Code.PROGRESS_INFO,
57
+ phase=Phase.UPGRADE,
58
+ )
59
+ _validate(reporter=reporter, stb=new_stb)
60
+ reporter.info(
61
+ "---v2.0.1バリデーション完了---",
62
+ code=Code.PROGRESS_INFO,
63
+ phase=Phase.UPGRADE,
64
+ )
65
+ return new_stb
66
+ else:
67
+ raise TypeError("ST-Bridgeのバージョン変換に失敗しました")
68
+
69
+
70
+ def upgrade_v2_0_1_to_v2_0_2(
71
+ stb: stb_v2_0_1.StBridge,
72
+ *,
73
+ reporter: Reporter,
74
+ ) -> stb_v2_0_2.StBridge:
75
+ reporter.info(
76
+ "---v2.0.1->v2.0.2変換処理開始---",
77
+ code=Code.PROGRESS_INFO,
78
+ phase=Phase.UPGRADE,
79
+ )
80
+ new_stb = convert_element(
81
+ stb,
82
+ stb_v2_0_2,
83
+ reporter=reporter,
84
+ )
85
+ if isinstance(new_stb, stb_v2_0_2.StBridge):
86
+ new_stb.version = stb_v2_0_2.VERSION
87
+ reporter.info(
88
+ "---v2.0.1->v2.0.2変換処理完了---",
89
+ code=Code.PROGRESS_INFO,
90
+ phase=Phase.UPGRADE,
91
+ )
92
+ reporter.info(
93
+ "---v2.0.2バリデーション開始---",
94
+ code=Code.PROGRESS_INFO,
95
+ phase=Phase.UPGRADE,
96
+ )
97
+ _validate(reporter=reporter, stb=new_stb)
98
+ reporter.info(
99
+ "---v2.0.2バリデーション完了---",
100
+ code=Code.PROGRESS_INFO,
101
+ phase=Phase.UPGRADE,
102
+ )
103
+ return new_stb
104
+ else:
105
+ raise TypeError("ST-Bridgeのバージョン変換に失敗しました")
106
+
107
+
108
+ def upgrade_to_v2_0_1(stb: StBridgeRoot, *, reporter: Reporter) -> stb_v2_0_1.StBridge:
109
+ if isinstance(stb, stb_v2_0_1.StBridge):
110
+ return stb
111
+ elif isinstance(stb, stb_v2_0_0.StBridge):
112
+ return upgrade_v2_0_0_to_v2_0_1(stb, reporter=reporter)
113
+ else:
114
+ raise NotImplementedError()
115
+
116
+
117
+ def upgrade_to_v2_0_2(stb: StBridgeRoot, *, reporter: Reporter) -> stb_v2_0_2.StBridge:
118
+ if isinstance(stb, stb_v2_0_2.StBridge):
119
+ return stb
120
+ elif isinstance(stb, stb_v2_0_1.StBridge):
121
+ return upgrade_v2_0_1_to_v2_0_2(stb, reporter=reporter)
122
+ else:
123
+ raise NotImplementedError()
124
+
125
+
126
+ def upgrade_to_v2_1_0(stb: StBridgeRoot, *, reporter: Reporter) -> stb_v2_1_0.StBridge:
127
+ if isinstance(stb, stb_v2_1_0.StBridge):
128
+ return stb
129
+ elif not isinstance(stb, stb_v2_0_2.StBridge):
130
+ stb = upgrade_to_v2_0_2(stb, reporter=reporter)
131
+ return upgrade_v2_0_2_to_v2_1_0(stb, reporter=reporter)
132
+
133
+
134
+ def upgrade_to_v2_1_1(stb: StBridgeRoot, *, reporter: Reporter) -> stb_v2_1_1.StBridge:
135
+ if isinstance(stb, stb_v2_1_1.StBridge):
136
+ return stb
137
+ elif not isinstance(stb, stb_v2_1_0.StBridge):
138
+ stb = upgrade_to_v2_1_0(stb, reporter=reporter)
139
+ return upgrade_v2_1_0_to_v2_1_1(stb, reporter=reporter)
140
+
141
+
142
+ @overload
143
+ def upgrade_to(
144
+ stb: StBridgeRoot,
145
+ to_version: Literal["2.0.1"],
146
+ *,
147
+ logger: Logger | None = None,
148
+ reporter: Reporter | None = None,
149
+ ) -> stb_v2_0_1.StBridge: ...
150
+ @overload
151
+ def upgrade_to(
152
+ stb: StBridgeRoot,
153
+ to_version: Literal["2.0.2"],
154
+ *,
155
+ logger: Logger | None = None,
156
+ reporter: Reporter | None = None,
157
+ ) -> stb_v2_0_2.StBridge: ...
158
+ @overload
159
+ def upgrade_to(
160
+ stb: StBridgeRoot,
161
+ to_version: Literal["2.1.0"],
162
+ *,
163
+ logger: Logger | None = None,
164
+ reporter: Reporter | None = None,
165
+ ) -> stb_v2_1_0.StBridge: ...
166
+ @overload
167
+ def upgrade_to(
168
+ stb: StBridgeRoot,
169
+ to_version: Literal["2.1.1", "latest"],
170
+ *,
171
+ logger: Logger | None = None,
172
+ reporter: Reporter | None = None,
173
+ ) -> stb_v2_1_1.StBridge: ...
174
+ def upgrade_to(
175
+ stb: StBridgeRoot,
176
+ to_version: Literal["2.0.1", "2.0.2", "2.1.0", "2.1.1", "latest"] = "latest",
177
+ *,
178
+ logger: Logger | None = None,
179
+ reporter: Reporter | None = None,
180
+ ) -> StBridgeRoot:
181
+ """指定したバージョンにST-Bridgeを変換する"""
182
+ reporter = get_reporter(logger=logger, reporter=reporter)
183
+ if to_version == "latest":
184
+ return upgrade_to_latest(stb, reporter=reporter)
185
+ match to_version:
186
+ case "2.0.1":
187
+ return upgrade_to_v2_0_1(stb, reporter=reporter)
188
+ case "2.0.2":
189
+ return upgrade_to_v2_0_2(stb, reporter=reporter)
190
+ case "2.1.0":
191
+ return upgrade_to_v2_1_0(stb, reporter=reporter)
192
+ case "2.1.1":
193
+ return upgrade_to_v2_1_1(stb, reporter=reporter)
194
+ case _:
195
+ raise UnsupportedStbVersionError(version=to_version)
196
+
197
+
198
+ def upgrade_to_latest(
199
+ stb: StBridgeRoot,
200
+ *,
201
+ logger: Logger | None = None,
202
+ reporter: Reporter | None = None,
203
+ ) -> "stb_latest.StBridge":
204
+ """ST-Bridgeモデルをstbkitが対応する最新版へ変換します。
205
+
206
+ 既に最新版の場合は、変換せず同じインスタンスをそのまま返します。
207
+ 変換後のモデルはバリデーションを行い、結果をreporterへ記録します。
208
+
209
+ 変換が実装されていない要素や属性があっても例外にせず、reporterへ記録して変換を続けます。
210
+
211
+ Args:
212
+ stb: 変換元のST-Bridgeのルート要素。
213
+ logger: 出力先Logger
214
+ reporter: 出力先Reporter。
215
+
216
+ Returns:
217
+ stb_latest.StBridge: 最新版のST-Bridgeのルート要素。
218
+
219
+ Raises:
220
+ UnsupportedStbVersionError: 対応していないバージョンのモデルを渡した場合。
221
+ TypeError: バージョン変換に失敗した場合。
222
+
223
+ Examples:
224
+ >>> import stbkit.api
225
+ >>> stb = stbkit.api.upgrade_stb(stbkit.api.load("model_v2_0_1.stb"))
226
+ """
227
+ reporter = get_reporter(logger, reporter)
228
+ return upgrade_to_v2_1_1(stb, reporter=reporter)
@@ -0,0 +1,60 @@
1
+ # Copyright 2025-2026 TAISEI CORPORATION
2
+ # SPDX-License-Identifier: MPL-2.0
3
+ # This Source Code Form is subject to the terms of the Mozilla Public
4
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
5
+ # file, You can obtain one at https://mozilla.org/MPL/2.0/.
6
+
7
+ from stbkit.core.data_model import (
8
+ stb_v2_0_2,
9
+ stb_v2_1_0,
10
+ )
11
+ from stbkit.core.stb_reporting import Code, Phase, Reporter
12
+ from stbkit.core.validation._internal.validator import _validate
13
+
14
+ from .. import common
15
+ from . import tables
16
+ from .hooks import HOOKS
17
+ from .post import post_conversion
18
+
19
+
20
+ def upgrade_v2_0_2_to_v2_1_0(
21
+ stb: stb_v2_0_2.StBridge,
22
+ *,
23
+ reporter: Reporter,
24
+ ) -> stb_v2_1_0.StBridge:
25
+ reporter.info(
26
+ "---v2.0.2->v2.1.0変換処理開始---",
27
+ code=Code.PROGRESS_INFO,
28
+ phase=Phase.UPGRADE,
29
+ )
30
+ new_stb = common.convert_element(
31
+ stb,
32
+ stb_v2_1_0,
33
+ ignore_field=tables.ignore_field,
34
+ class_name_table=tables.class_name_table,
35
+ attr_name_table=tables.attr_name_table,
36
+ hooks=HOOKS,
37
+ post=post_conversion,
38
+ reporter=reporter,
39
+ )
40
+
41
+ if isinstance(new_stb, stb_v2_1_0.StBridge):
42
+ reporter.info(
43
+ "---v2.0.2->v2.1.0変換処理完了---",
44
+ code=Code.PROGRESS_INFO,
45
+ phase=Phase.UPGRADE,
46
+ )
47
+ reporter.info(
48
+ "---v2.1.0バリデーション開始---",
49
+ code=Code.PROGRESS_INFO,
50
+ phase=Phase.UPGRADE,
51
+ )
52
+ _validate(reporter=reporter, stb=new_stb)
53
+ reporter.info(
54
+ "---v2.1.0バリデーション完了---",
55
+ code=Code.PROGRESS_INFO,
56
+ phase=Phase.UPGRADE,
57
+ )
58
+ return new_stb
59
+ else:
60
+ raise TypeError("ST-Bridgeのバージョン変換に失敗しました")
@@ -0,0 +1,62 @@
1
+ # Copyright 2025-2026 TAISEI CORPORATION
2
+ # SPDX-License-Identifier: MPL-2.0
3
+ # This Source Code Form is subject to the terms of the Mozilla Public
4
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
5
+ # file, You can obtain one at https://mozilla.org/MPL/2.0/.
6
+
7
+ from stbkit.core.data_model import stb_v2_0_2, stb_v2_1_0
8
+ from stbkit.core.data_model.common import StBridgeElement
9
+ from stbkit.core.stb_exceptions import NoneAccessError
10
+ from stbkit.core.stb_reporting import Reporter
11
+
12
+
13
+ def column_rc_rebar_position_apply_to_stb_apply_column(
14
+ v202: stb_v2_0_2.StbColumnRcRebarPositionApply,
15
+ ) -> stb_v2_1_0.StbApplyRcColumn:
16
+ v210: stb_v2_1_0.StbApplyRcColumn = stb_v2_1_0.StbApplyRcColumn()
17
+ v210.depth_cover_start_x_or_none = v202.depth_cover_or_none
18
+ v210.depth_cover_start_y_or_none = v202.depth_cover_or_none
19
+ v210.depth_cover_end_x_or_none = v202.depth_cover_or_none
20
+ v210.depth_cover_end_y_or_none = v202.depth_cover_or_none
21
+ v210.interval_or_none = v202.interval_or_none
22
+ v210.center_start_x_or_none = v202.center_or_none
23
+ v210.center_start_y_or_none = v202.center_or_none
24
+ v210.center_end_x_or_none = v202.center_or_none
25
+ v210.center_end_y_or_none = v202.center_or_none
26
+ v210.center_interval_or_none = v202.length_to_center_or_none
27
+ # set_defaultは無視
28
+ return v210
29
+
30
+
31
+ def post_common(v202: stb_v2_0_2.StBridge, v210: stb_v2_1_0.StBridge) -> None:
32
+ """TODO:作成中。要対応"""
33
+ try:
34
+ v202_c_r_r_p_a = (
35
+ v202.stb_common.stb_apply_conditions_list.stb_column_rc_rebar_position_apply
36
+ )
37
+ except NoneAccessError:
38
+ return
39
+ v210_a_c_l_r: stb_v2_1_0.StbApplyConditionListRc = (
40
+ v210.ensure.stb_common()
41
+ .ensure.stb_apply_conditions_list()
42
+ .ensure.stb_apply_condition_list_rc()
43
+ )
44
+ v210_a_c_l_r.stb_apply_rc_column = (
45
+ column_rc_rebar_position_apply_to_stb_apply_column(v202_c_r_r_p_a)
46
+ )
47
+
48
+
49
+ def hook_apply_conditions_list(
50
+ before: StBridgeElement, after: StBridgeElement, *, reporter: Reporter
51
+ ) -> None:
52
+ if not isinstance(before, stb_v2_0_2.StbApplyConditionsList) or not isinstance(
53
+ after, stb_v2_1_0.StbApplyConditionsList
54
+ ):
55
+ return
56
+ try:
57
+ v202_apply = before.stb_column_rc_rebar_position_apply
58
+ except NoneAccessError:
59
+ return
60
+ after.ensure.stb_apply_condition_list_rc().stb_apply_rc_column = (
61
+ column_rc_rebar_position_apply_to_stb_apply_column(v202_apply)
62
+ )
@@ -0,0 +1,44 @@
1
+ # Copyright 2026 TAISEI CORPORATION
2
+ # SPDX-License-Identifier: MPL-2.0
3
+ # This Source Code Form is subject to the terms of the Mozilla Public
4
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
5
+ # file, You can obtain one at https://mozilla.org/MPL/2.0/.
6
+
7
+ from stbkit.core.data_model import stb_v2_0_2, stb_v2_1_0
8
+ from stbkit.core.data_model.common import StBridgeElement
9
+ from stbkit.core.stb_reporting import Reporter
10
+
11
+
12
+ def joint_beam_shape_h(
13
+ before: StBridgeElement, after: StBridgeElement, *, reporter: Reporter
14
+ ) -> None:
15
+ if not isinstance(before, stb_v2_0_2.StbJointBeamShapeH) or not isinstance(
16
+ after, stb_v2_1_0.StbJointBeamShapeH
17
+ ):
18
+ return
19
+ frange_202: stb_v2_0_2.StbJointShapeHFlange | None = (
20
+ before.stb_joint_shape_h_flange_or_none
21
+ )
22
+ if frange_202:
23
+ nf: int | None = frange_202.nf_or_none
24
+ mf: int | None = frange_202.mf_or_none
25
+ frange_210: stb_v2_1_0.StbJointShapeHFlange = (
26
+ after.ensure.stb_joint_shape_h_flange()
27
+ )
28
+ if nf is not None and mf is not None:
29
+ for i in range(1, nf + 1):
30
+ frange_bolt: stb_v2_1_0.StbJointShapeHFlangeBolt = (
31
+ stb_v2_1_0.StbJointShapeHFlangeBolt(id_order=i, mf=mf)
32
+ )
33
+ frange_210.stb_joint_shape_h_flange_bolt.append(frange_bolt)
34
+ web_202: stb_v2_0_2.StbJointShapeHWeb | None = before.stb_joint_shape_h_web_or_none
35
+ if web_202:
36
+ nw: int | None = web_202.nw_or_none
37
+ mw: int | None = web_202.mw_or_none
38
+ web_210: stb_v2_1_0.StbJointShapeHWeb = after.ensure.stb_joint_shape_h_web()
39
+ if nw is not None and mw is not None:
40
+ for i in range(1, nw + 1):
41
+ web_bolt: stb_v2_1_0.StbJointShapeHWebBolt = (
42
+ stb_v2_1_0.StbJointShapeHWebBolt(id_order=i, mw=mw)
43
+ )
44
+ web_210.stb_joint_shape_h_web_bolt.append(web_bolt)