osis-python 0.2.2__py3-none-any.whl → 0.2.3__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.

Potentially problematic release.


This version of osis-python might be problematic. Click here for more details.

@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: osis-python
3
- Version: 0.2.2
3
+ Version: 0.2.3
4
4
  Summary: A Python client library for Osis APDL
5
5
  Author-email: "CCCC Highway Consultant Co. Ltd." <support@osisbim.com>
6
6
  License-Expression: MIT
@@ -1,7 +1,8 @@
1
- osis_python-0.2.2.dist-info/licenses/LICENSE,sha256=T4mkSYliXdU9mYe-NfHkqg6GPhzoYaIQO_a630UzpS4,1088
2
- pyosis/__init__.py,sha256=rZZtLzKLmcHBi8gBnB-9AWMI6yAFktFrY-9xCqAvtWU,465
3
- pyosis/boundary/__init__.py,sha256=u9tcY7x__3N7layYVl-JBI3HT9AwBmyGwWO_5beyldc,65
1
+ osis_python-0.2.3.dist-info/licenses/LICENSE,sha256=T4mkSYliXdU9mYe-NfHkqg6GPhzoYaIQO_a630UzpS4,1088
2
+ pyosis/__init__.py,sha256=KZHiGGJbXqBX6Uo6cIgzNMBXKXYw7EWrCnF5FTleRWw,465
3
+ pyosis/boundary/__init__.py,sha256=W5LfF-jugWa-YI8pnfELZaz0pXLa-D8TiGnBn12HGGQ,102
4
4
  pyosis/boundary/interface.py,sha256=tsmP1LVlMhVpHpozlMXHYooN82kSzGoHXMRQLcJ1f8o,7568
5
+ pyosis/boundary/manager.py,sha256=nKIUlW58QSNnbii62Ygfddu1kuHPBzOgY90u3hjgZPI,11174
5
6
  pyosis/common/__init__.py,sha256=Gl-g0qs3Ks_r19bLEZ1bpBmZ0HvooXYcGvQlvbPf-6U,47
6
7
  pyosis/common/interface.py,sha256=vjYwNjbIaqa29BhpqzQxSTjjtfndNo4VtDntINrzEoA,4303
7
8
  pyosis/common/project.py,sha256=2KaaOXAh4FFGSWUpmvvGIMWlfXh9wk2jxd0mrcXIckg,1520
@@ -9,16 +10,17 @@ pyosis/control/__init__.py,sha256=dyvge-GgUpT3BeDwm_Lss1xqNlxAQdt63WJ7QcuZ_O4,24
9
10
  pyosis/control/interface.py,sha256=GrqBDNwrH5dUMA9E5b19w2Ucjw5oK9JgRe-4RJkL2Q0,3574
10
11
  pyosis/core/PyInterface.pyi,sha256=HrWq9eMtaVoQg7qDh55Z3XagTNNbceA0KBK7x38G11w,6142
11
12
  pyosis/core/__init__.py,sha256=ohE6BQddjdaSlM16lvphPmoNmQRaxZyjbhXqwwvN8eU,377
12
- pyosis/core/all_func.py,sha256=jeO4w3Gyrc6XGeQfhjIEOOL0p41PdBTKy3uT33vjurY,390
13
+ pyosis/core/all_func.py,sha256=iz80RPeYZDaHhtz1Vsi98lJKknJX5ib6hXLLoy72J0Q,392
13
14
  pyosis/core/client.py,sha256=Q7j2SjkhDTVDzgf-rL4f58r5GSWToy-iND6UbFYKixw,1807
14
15
  pyosis/core/command.py,sha256=uwFQwRD70EG22QeDkxymZfspGyIfsB_9UU1n8cLJOGQ,9893
15
- pyosis/element/__init__.py,sha256=dyvge-GgUpT3BeDwm_Lss1xqNlxAQdt63WJ7QcuZ_O4,24
16
+ pyosis/element/__init__.py,sha256=jdPeXY3tVXXnId_iMFjAk1jX6booBKKdfW3V-da8CZQ,61
16
17
  pyosis/element/interface.py,sha256=l4dkBPcbvh-2ReJt0UAvS3wFljshDuFD7SazTeFqivk,10605
18
+ pyosis/element/manager.py,sha256=SXQFI1bjEk8hwri2ZUhZt7klbO4I0xHzlBDg6kXsXKQ,12792
17
19
  pyosis/general/__init__.py,sha256=dyvge-GgUpT3BeDwm_Lss1xqNlxAQdt63WJ7QcuZ_O4,24
18
20
  pyosis/general/interface.py,sha256=GJctYJ6xzSImOsRMmSGHOPFYnN81__5NFWaKgwzCsV4,522
19
21
  pyosis/geometry/__init__.py,sha256=dyvge-GgUpT3BeDwm_Lss1xqNlxAQdt63WJ7QcuZ_O4,24
20
22
  pyosis/geometry/interface.py,sha256=Dim9rqkpU0DOkNFR1vNiVrPoqzbn-kXwiTY5UrR5ZWE,4481
21
- pyosis/io/__init__.py,sha256=KKJfGxxyrhbE7b1uvUaqM9Q1tNoqzV-6g4Hjex-pVr4,263
23
+ pyosis/io/__init__.py,sha256=hMEvhaR8sCpe-ooe7BM4vfjkBye6s0nYSMmE71ZX-_A,289
22
24
  pyosis/io/boundary_info.py,sha256=kKsWBbI-77-jMoNSBzx2ZzkvOYwvoanpi2IHs2kPmr8,6722
23
25
  pyosis/io/coordinate.py,sha256=1XksDH5X93Yyp4J1xsDmCSTU_wXo1mSvXZCP89PyOBI,2412
24
26
  pyosis/io/element_info.py,sha256=sT9HN9Ham5tN-dSxVV_gpP29SOtCD2gBHiJzm6_Wnmg,12440
@@ -28,23 +30,25 @@ pyosis/io/node_info.py,sha256=c3BINnbCn_p5Lu1MOXTL1DUYXeh_L9fHAs9Y1fYXIWg,5082
28
30
  pyosis/io/prestressed_info.py,sha256=pUGrcvE_4tL8c1dJna54aIanynRzO2ZNPh4FYFB1kg0,5081
29
31
  pyosis/io/response.py,sha256=ArdqltNm6Usa-C2VzpY8BGoATAyBTDozIG8_tjaXWAA,3176
30
32
  pyosis/io/section_info.py,sha256=A1TmBEtnIfnQQnZEAHSZFRvhQVB8GK0NSuLex671F-o,4625
31
- pyosis/live/__init__.py,sha256=O76lVxVAVbf6EQjl20PzEFFOGSpp-KERwNabyCO-x_A,64
33
+ pyosis/io/stage_info.py,sha256=uZGnwp1ktUjdUuk4WO0RHrlYig-kZ0ku0OHj96g_qbM,5608
34
+ pyosis/live/__init__.py,sha256=in3lF6GUhdGb0pfMGe7yMH1MPrDIap4_NEaY-WKrgBw,180
32
35
  pyosis/live/analysis.py,sha256=ih42Z4Zrf17QcfHXKDsL0BNX11PeXZpodi-AYoxKGpg,5464
33
36
  pyosis/live/grade.py,sha256=hjxUf9RBxVFuSs9J6Y0_A2g5TqJGqozdEg0_QuFZKiA,3223
34
37
  pyosis/live/lane.py,sha256=rxQayG7WMjr_sKYG1VC4jY1EaXvqnPKo5i_iLmdWpLU,5455
35
- pyosis/load/__init__.py,sha256=TIUD6x-Up01x2oS6VQgI7mpzZJQfNpGq4VCy-hYI1nw,67
36
- pyosis/load/loadcase.py,sha256=ikagLswD4j07XFE0k6HBkJSWFybYQLdH6GmnWIZjZdw,1601
38
+ pyosis/live/manager.py,sha256=9aPNBz1dSw3tyRnJJ56oqnV-PDbYj6drfTU45Qu4ksA,21928
39
+ pyosis/load/__init__.py,sha256=S0snvGGU1gEaXUr2WjIGZzhH6kdw3JmMRDgPg9LK_9w,101
40
+ pyosis/load/loadcase.py,sha256=sCh21loarLG8b91k-pH4kaRqS8hHRiUfACFQz79jS4o,1605
41
+ pyosis/load/manager.py,sha256=HMjtxIRg3HIsKzwKfT6OhullqA8zYqIHPucZbhXrZEU,12776
37
42
  pyosis/load/static.py,sha256=kOp2kAK5W5YBUlhYGYfJ9AqPsYK74QPX-olfFAiOVGc,14024
38
43
  pyosis/load/tendon.py,sha256=5fAj8gYwRpx_hUPB9wfxwU1SF2D7uEWzCkMrnS0bPfU,11503
39
- pyosis/material/__init__.py,sha256=dyvge-GgUpT3BeDwm_Lss1xqNlxAQdt63WJ7QcuZ_O4,24
44
+ pyosis/material/__init__.py,sha256=60tzhc7hlxLuosldviEXYojkFNYo9JLKfjaii4IJD8E,62
40
45
  pyosis/material/interface.py,sha256=83yFn-RoqLBEiYCYmbnXoMO0Gwd0u6MkWvicgFDmWh4,5699
41
- pyosis/node/__init__.py,sha256=dyvge-GgUpT3BeDwm_Lss1xqNlxAQdt63WJ7QcuZ_O4,24
46
+ pyosis/material/manager.py,sha256=oRmnIvMiLSomPglW12RtqcSCaBbSuDbHPW_msywVGTg,11748
47
+ pyosis/node/__init__.py,sha256=PjOZyMsVJvGx4fgHrMXgb2H3nKma51JYzbUqDgNqJa4,58
42
48
  pyosis/node/interface.py,sha256=bl4B0VlFRzx3KZibOW4OXJj2FEG3SeqIFpSR_SyLzyM,1216
43
- pyosis/post/__init__.py,sha256=upmhnnRsQnSiNXDAP0Rt5D34ilwcAo-XwZCYuC0qtuc,63
44
- pyosis/post/check.py,sha256=Zjf318K4Bi6da30e3hu7yDN0VZ0aWzPy0GoNhvQ3Twg,4824
45
- pyosis/post/env.py,sha256=CCYxmHelcEHr2KGEh6ipMau6eaIf32QPGJwW9S8uKQQ,1344
46
- pyosis/post/loadcase.py,sha256=l-5hMslFhcL0FPyQ_We_FEPzAhQtbvs_HgYy4U19zEs,2272
47
- pyosis/post/result.py,sha256=wuXRARTf5v3j4ykAgYeZUupjihYqyxkv5-Qpf0Plxww,1189
49
+ pyosis/node/manager.py,sha256=SMAVnGjZiTWr27e6ymIXFag9fyZvfmpjQCY7IgDPMvI,8218
50
+ pyosis/post/__init__.py,sha256=e4EwA9h0a-ixruk4tG6fqtBztII52Bfa0FEbaXYZ5lM,22
51
+ pyosis/post/combine.py,sha256=ydQkQkHxg5JISjJO_TbqaZNGgw0vTE-XKKnYGqvd98M,2363
48
52
  pyosis/property/__init__.py,sha256=SV8FEEDZIx4f2m0o7c-zyvgtT78yAdeOBjuGViSCOrA,100
49
53
  pyosis/property/comp_thickness.py,sha256=q1qYou8XOmAtqAk7a79f4Lc8ztF3Ea6kI5Vg0LTH624,602
50
54
  pyosis/property/coordinate.py,sha256=AEID5uzyh9AYbUHbDk41f3aZ8EGrFfCNEPuvY-eCyD4,2335
@@ -53,19 +57,26 @@ pyosis/property/damping.py,sha256=bZiFVWBub2iTgVzDqIj29YxUOoUX3dUVfDYCRTMpLiM,78
53
57
  pyosis/property/pu_curve.py,sha256=qjw-84H3QAAnSuOuF9KxSVysPW1M56zSj_vZhf7DePU,1528
54
58
  pyosis/quick_building/__init__.py,sha256=dyvge-GgUpT3BeDwm_Lss1xqNlxAQdt63WJ7QcuZ_O4,24
55
59
  pyosis/quick_building/interface.py,sha256=xdQrORabxmnlhi537pspFokQBaXSmnZMIxA_kxSo_cE,13951
56
- pyosis/section/__init__.py,sha256=9_hvbJTITryZ30-rw18VCiY5Gjeav7PRdh32Ti6YDiw,126
57
- pyosis/section/common.py,sha256=DPEV2NZ9ZvqY6As9EIDJX6EnuoHs49MXgEcTxN-ba7U,26572
60
+ pyosis/result/__init__.py,sha256=upmhnnRsQnSiNXDAP0Rt5D34ilwcAo-XwZCYuC0qtuc,63
61
+ pyosis/result/check.py,sha256=Zjf318K4Bi6da30e3hu7yDN0VZ0aWzPy0GoNhvQ3Twg,4824
62
+ pyosis/result/env.py,sha256=2DjTOSaRxD0Nl4DR_ESD_Hu5yiDSlRZNw0vNHgoVKIs,1346
63
+ pyosis/result/loadcase.py,sha256=l-5hMslFhcL0FPyQ_We_FEPzAhQtbvs_HgYy4U19zEs,2272
64
+ pyosis/result/result.py,sha256=wuXRARTf5v3j4ykAgYeZUupjihYqyxkv5-Qpf0Plxww,1189
65
+ pyosis/section/__init__.py,sha256=j0C_UWCSr6CaH7IYOTPuxdyuGuHsjsn0bUunDZWfDVc,163
66
+ pyosis/section/common.py,sha256=9cnI5JdHfC6W-OvxAr4nJ2kAZaF3aDDl1luMFHQP8Bg,26572
67
+ pyosis/section/manager.py,sha256=6BHqprlUt3ILmYF71h7Lv9SVI01ieA9Lmh08VKsN1Bc,38436
58
68
  pyosis/section/numeric.py,sha256=yx32nS9BE8WPVMUWLKv3FVW0BfrhtaQ6qUTSVqKhX6o,1501
59
69
  pyosis/section/param.py,sha256=2lxP1IVhQTvBFgIVhv8yFj0w7WFfplsx2D3sMIPJPe8,3534
60
70
  pyosis/section/rebar.py,sha256=_pYRw0KDlKOYt13oyfiu2jT87AbFQ5qe62NVVLyGCkw,7293
61
71
  pyosis/section/rib.py,sha256=lSHUr70XFNk3wd_OADHRpAadzsKQc40RntiEmZdmSvU,7524
62
72
  pyosis/section/steel.py,sha256=Kd0SNEsSZuG65jb7ZDTD3TMa466aT9Pd2EVIn4Ia_RQ,14939
63
- pyosis/stage/__init__.py,sha256=93rysY_8Mf6V5PH2ih0goRcCOfAKy9oJTH0EbS2psKk,45
73
+ pyosis/stage/__init__.py,sha256=eFc-d3v6SyL3St55hJeD5SoFFYZfYDAGs2lPgHMdcwc,80
64
74
  pyosis/stage/define.py,sha256=6CJEYU3e5sEfL9ZuTKQnAeiZKl99io86rEYNIyMZrhQ,3955
75
+ pyosis/stage/manager.py,sha256=MtgBUMakMGHGZ5XMIrTGpyQAO7gx-2iF9e8TpmLryZI,11430
65
76
  pyosis/stage/overall.py,sha256=eUenFLvdO5PRlMjk0ZqeoHE1aSWqNyZqI-dh9nTDIw0,2157
66
77
  pyosis/thickness/__init__.py,sha256=dyvge-GgUpT3BeDwm_Lss1xqNlxAQdt63WJ7QcuZ_O4,24
67
78
  pyosis/thickness/interface.py,sha256=l9EYI45_RwHSEnNmn1ctoiu_q8Q2zkrH7QOiN0D26Dk,1314
68
- osis_python-0.2.2.dist-info/METADATA,sha256=dmQCgGpHj5Z1_4MpZGwWKzPtUZI_1OqZQQmnehRtuY8,3447
69
- osis_python-0.2.2.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
70
- osis_python-0.2.2.dist-info/top_level.txt,sha256=6VDNySkQKwipRXcN8ayKVci4vAXi4oPyWLqFhNVcIfM,7
71
- osis_python-0.2.2.dist-info/RECORD,,
79
+ osis_python-0.2.3.dist-info/METADATA,sha256=0V2syG-IhY0GgpsokQXjAzP535_SIJK9ASlvlmcUZ5Q,3447
80
+ osis_python-0.2.3.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
81
+ osis_python-0.2.3.dist-info/top_level.txt,sha256=6VDNySkQKwipRXcN8ayKVci4vAXi4oPyWLqFhNVcIfM,7
82
+ osis_python-0.2.3.dist-info/RECORD,,
pyosis/__init__.py CHANGED
@@ -7,7 +7,7 @@ A library for extending OSIS functionality.
7
7
  A library that allows users to use CAE with great flexibility.
8
8
  """
9
9
 
10
- __version__ = "0.2.2"
10
+ __version__ = "0.2.3"
11
11
  __author__ = "CCCC Highway Consultant Co. Ltd." # 中交公路规划设计院 - 工程技术研究中心 - lzh - wjh - myf
12
12
 
13
13
  # from .core import engine
@@ -3,5 +3,5 @@ pyosis.boundary 的 Docstring
3
3
 
4
4
  '''
5
5
 
6
-
7
- from .interface import *
6
+ from .interface import *
7
+ from .manager import boundary_manager
@@ -0,0 +1,342 @@
1
+ """边界管理器 - 统一管理边界的增删改查
2
+
3
+ 设计理念:
4
+ - 隐藏 HTTP 接口细节,提供原生 Python 风格 API
5
+ - 返回数据类对象而非 HTTP 元组
6
+ - 内部维护边界列表,通过 get 等方法查询,不暴露 HTTP 接口细节
7
+
8
+ 支持的边界类型:GENERAL(一般边界)、MSTSLV(主从约束)、RELEASE(释放梁端约束)、
9
+ ELSTCSPT(弹性支承)
10
+ """
11
+
12
+ from __future__ import annotations
13
+
14
+ from dataclasses import dataclass
15
+
16
+ from ..core.client import osis_client
17
+ from .interface import (
18
+ osis_boundary_general,
19
+ osis_boundary_elstcspt,
20
+ osis_boundary_master_slave,
21
+ osis_boundary_release,
22
+ osis_boundary_dle,
23
+ )
24
+
25
+
26
+ # ──────────────────────────────────────────────
27
+ # 数据类
28
+ # ──────────────────────────────────────────────
29
+
30
+
31
+ @dataclass(frozen=True)
32
+ class Boundary:
33
+ """边界对象
34
+
35
+ 由 BoundaryManager 内部创建,用户不应直接实例化。
36
+ """
37
+
38
+ no: int
39
+ name: str = ""
40
+ boundary_type: str = "" # "General", "MstSlv", "Release", "ElstcSpt", "GeneralElstcSpt"
41
+ entity_vec: list[int] | None = None
42
+ is_occupied: bool = False
43
+
44
+ @classmethod
45
+ def _from_dict(cls, d: dict) -> Boundary:
46
+ """从接口 dict 构造 Boundary 对象(内部使用)"""
47
+ type_names = {
48
+ 1: "General",
49
+ 2: "MstSlv",
50
+ 3: "Rigid",
51
+ 4: "Release",
52
+ 5: "ElstcSpt",
53
+ 6: "GeneralElstcSpt",
54
+ }
55
+ return cls(
56
+ no=d.get("no", 0),
57
+ name=d.get("name", ""),
58
+ boundary_type=type_names.get(d.get("type", 0), "Unknown"),
59
+ entity_vec=d.get("entityVec", []),
60
+ is_occupied=d.get("isOccupied", False),
61
+ )
62
+
63
+
64
+ # ──────────────────────────────────────────────
65
+ # 管理类
66
+ # ──────────────────────────────────────────────
67
+
68
+
69
+ class BoundaryManager:
70
+ """边界管理器
71
+
72
+ 统一管理边界的创建、删除和查询。
73
+
74
+ 用法:
75
+ >>> from pyosis.boundary import boundary_manager
76
+ >>> boundary_manager.create_general(1, bX=1, bY=1, bZ=1, bRX=0, bRY=0, bRZ=0) # 创建一般边界
77
+ >>> boundary_manager.create_elstcspt(2, DX=1e10, DY=1e10, DZ=1e10) # 创建弹性支承
78
+ >>> boundary_manager.create_master_slave(3, nNode=1, bX=1, bY=1, bZ=1) # 创建主从约束
79
+ >>> bd = boundary_manager.get(1) # 按编号查询
80
+ >>> all_bds = boundary_manager.all() # 获取全部边界
81
+ >>> boundary_manager.delete(1) # 删除边界
82
+ """
83
+
84
+ def __init__(self) -> None:
85
+ self._boundaries: list[Boundary] = []
86
+ self._bd_map: dict[int, Boundary] = {} # 按编号索引:O(1) 查询
87
+ self._loaded: bool = False
88
+
89
+ # ── 数据加载 ──────────────────────────────
90
+
91
+ def _load(self) -> None:
92
+ """从服务端加载所有边界信息(延迟加载,带缓存)"""
93
+ if self._loaded:
94
+ return
95
+ resp = osis_client("GetAllBoundaryInfo", {})
96
+ if isinstance(resp, tuple):
97
+ raise RuntimeError(f"加载边界信息失败: {resp[1]}")
98
+ self._boundaries = [
99
+ Boundary._from_dict(d) for d in resp.get("data", []) if isinstance(d, dict) and "no" in d
100
+ ]
101
+
102
+ # 构建索引:编号 -> 边界对象 (O(1) 查询)
103
+ self._bd_map = {bd.no: bd for bd in self._boundaries}
104
+
105
+ self._loaded = True
106
+
107
+ def refresh(self) -> None:
108
+ """强制刷新缓存(模型变更后自动调用,也可手动调用)"""
109
+ self._boundaries = []
110
+ self._bd_map = {}
111
+ self._loaded = False
112
+ self._load()
113
+
114
+ # ── 增删改 ────────────────────────────────
115
+
116
+ def create_general(
117
+ self,
118
+ no: int,
119
+ nCoor: int = None,
120
+ bX: bool = 1,
121
+ bY: bool = 1,
122
+ bZ: bool = 1,
123
+ bRX: bool = 1,
124
+ bRY: bool = 1,
125
+ bRZ: bool = 1,
126
+ bRW: bool = 1,
127
+ ) -> None:
128
+ """创建一般边界
129
+
130
+ Args:
131
+ no: 边界编号
132
+ nCoor: 局部坐标系编号,"" 代表缺省
133
+ bX: UX方向,0=释放,1=约束
134
+ bY: UY方向,0=释放,1=约束
135
+ bZ: UZ方向,0=释放,1=约束
136
+ bRX: RX方向,0=释放,1=约束
137
+ bRY: RY方向,0=释放,1=约束
138
+ bRZ: RZ方向,0=释放,1=约束
139
+ bRW: RW方向,0=释放,1=约束
140
+
141
+ Raises:
142
+ RuntimeError: 创建失败时抛出异常
143
+ """
144
+ if nCoor is None:
145
+ nCoor = ""
146
+ ok, err = osis_boundary_general(no, "GENERAL", nCoor, bX, bY, bZ, bRX, bRY, bRZ, bRW)
147
+ if not ok:
148
+ raise RuntimeError(f"创建一般边界 {no} 失败: {err}")
149
+ self._loaded = False
150
+
151
+ def create_elstcspt(
152
+ self,
153
+ no: int,
154
+ nCoor: int = None,
155
+ bX: bool = 1,
156
+ DX: float = 1e13,
157
+ bY: bool = 1,
158
+ DY: float = 1e13,
159
+ bZ: bool = 1,
160
+ DZ: float = 1e13,
161
+ bRX: bool = 1,
162
+ RX: float = 1e16,
163
+ bRY: bool = 1,
164
+ RY: float = 1e16,
165
+ bRZ: bool = 1,
166
+ RZ: float = 1e16,
167
+ ) -> None:
168
+ """创建弹簧单元弹性支承
169
+
170
+ Args:
171
+ no: 边界编号
172
+ nCoor: 局部坐标系编号,固定使用""缺省
173
+ bX: UX方向,0=弹性,1=固定
174
+ DX: 坐标系X轴方向的弹性支承刚度
175
+ bY: UY方向,0=弹性,1=固定
176
+ DY: 坐标系Y轴方向的弹性支承刚度
177
+ bZ: UZ方向,0=弹性,1=固定
178
+ DZ: 坐标系Z轴方向的弹性支承刚度
179
+ bRX: RX方向,0=弹性,1=固定
180
+ RX: 绕坐标系X轴方向的转动弹性刚度
181
+ bRY: RY方向,0=弹性,1=固定
182
+ RY: 绕坐标系Y轴方向的转动弹性刚度
183
+ bRZ: RZ方向,0=弹性,1=固定
184
+ RZ: 绕坐标系Z轴方向的转动弹性刚度
185
+
186
+ Raises:
187
+ RuntimeError: 创建失败时抛出异常
188
+ """
189
+ if nCoor is None:
190
+ nCoor = ""
191
+ ok, err = osis_boundary_elstcspt(
192
+ no, "ELSTCSPT", nCoor, bX, DX, bY, DY, bZ, DZ, bRX, RX, bRY, RY, bRZ, RZ
193
+ )
194
+ if not ok:
195
+ raise RuntimeError(f"创建弹性支承 {no} 失败: {err}")
196
+ self._loaded = False
197
+
198
+ def create_master_slave(
199
+ self,
200
+ no: int,
201
+ nNode: int,
202
+ bX: bool = 1,
203
+ bY: bool = 1,
204
+ bZ: bool = 1,
205
+ bRX: bool = 1,
206
+ bRY: bool = 1,
207
+ bRZ: bool = 1,
208
+ ) -> None:
209
+ """创建主从约束
210
+
211
+ Args:
212
+ no: 边界编号
213
+ nNode: 主节点编号
214
+ bX: UX方向,0=释放,1=约束
215
+ bY: UY方向,0=释放,1=约束
216
+ bZ: UZ方向,0=释放,1=约束
217
+ bRX: RX方向,0=释放,1=约束
218
+ bRY: RY方向,0=释放,1=约束
219
+ bRZ: RZ方向,0=释放,1=约束
220
+
221
+ Raises:
222
+ RuntimeError: 创建失败时抛出异常
223
+ """
224
+ ok, err = osis_boundary_master_slave(no, "MSTSLV", nNode, bX, bY, bZ, bRX, bRY, bRZ)
225
+ if not ok:
226
+ raise RuntimeError(f"创建主从约束 {no} 失败: {err}")
227
+ self._loaded = False
228
+
229
+ def create_release(
230
+ self,
231
+ no: int,
232
+ Fxi_state: bool,
233
+ Fyi_state: bool,
234
+ Fzi_state: bool,
235
+ Mxi_state: bool,
236
+ Myi_state: bool,
237
+ Mzi_state: bool,
238
+ Mbi_state: bool,
239
+ Fxi: float,
240
+ Fyi: float,
241
+ Fzi: float,
242
+ Mxi: float,
243
+ Myi: float,
244
+ Mzi: float,
245
+ Mbi: float,
246
+ Fxj_state: bool,
247
+ Fyj_state: bool,
248
+ Fzj_state: bool,
249
+ Mxj_state: bool,
250
+ Myj_state: bool,
251
+ Mzj_state: bool,
252
+ Mbj_state: bool,
253
+ Fxj: float,
254
+ Fyj: float,
255
+ Fzj: float,
256
+ Mxj: float,
257
+ Myj: float,
258
+ Mzj: float,
259
+ Mbj: float,
260
+ ) -> None:
261
+ """创建释放梁端约束
262
+
263
+ Args:
264
+ no: 边界编号
265
+ Fxi_state等: 端部约束状态,0=释放,1=约束
266
+ Fxi等: 约束值,0-1之间,表示释放后残余的约束能力的百分比
267
+
268
+ Raises:
269
+ RuntimeError: 创建失败时抛出异常
270
+ """
271
+ ok, err = osis_boundary_release(
272
+ no, "RELEASE",
273
+ Fxi_state, Fyi_state, Fzi_state, Mxi_state, Myi_state, Mzi_state, Mbi_state,
274
+ Fxi, Fyi, Fzi, Mxi, Myi, Mzi, Mbi,
275
+ Fxj_state, Fyj_state, Fzj_state, Mxj_state, Myj_state, Mzj_state, Mbj_state,
276
+ Fxj, Fyj, Fzj, Mxj, Myj, Mzj, Mbj,
277
+ )
278
+ if not ok:
279
+ raise RuntimeError(f"创建释放梁端约束 {no} 失败: {err}")
280
+ self._loaded = False
281
+
282
+ def delete(self, no: int) -> None:
283
+ """删除边界
284
+
285
+ Args:
286
+ no: 边界编号
287
+
288
+ Raises:
289
+ RuntimeError: 删除失败时抛出异常
290
+ """
291
+ ok, err = osis_boundary_dle(no)
292
+ if not ok:
293
+ raise RuntimeError(f"删除边界 {no} 失败: {err}")
294
+ self._loaded = False
295
+
296
+ # ── 查询 ──────────────────────────────────
297
+
298
+ def get(self, no: int | list[int]) -> Boundary | list[Boundary | None]:
299
+ """根据编号获取单个或多个边界 (O(k))
300
+
301
+ Args:
302
+ no: 边界编号
303
+
304
+ Returns:
305
+ Boundary 对象或数组;边界不存在返回 None
306
+ """
307
+ self._load()
308
+ if isinstance(no, int):
309
+ return self._bd_map.get(no)
310
+ elif isinstance(no, list):
311
+ return [self._bd_map.get(n) for n in no]
312
+ else:
313
+ raise TypeError(f"不支持的编号类型: {type(no)}")
314
+
315
+ def all(self) -> list[Boundary]:
316
+ """获取所有边界
317
+
318
+ Returns:
319
+ 全部边界列表
320
+ """
321
+ self._load()
322
+ return list(self._boundaries)
323
+
324
+ def count(self) -> int:
325
+ """获取边界总数
326
+
327
+ Returns:
328
+ 边界数量
329
+ """
330
+ self._load()
331
+ return len(self._boundaries)
332
+
333
+ def __repr__(self) -> str:
334
+ self._load()
335
+ return f"BoundaryManager(count={len(self._boundaries)})"
336
+
337
+
338
+ # ──────────────────────────────────────────────
339
+ # 全局单例
340
+ # ──────────────────────────────────────────────
341
+
342
+ boundary_manager = BoundaryManager()
pyosis/core/all_func.py CHANGED
@@ -7,7 +7,7 @@ from ..live import *
7
7
  from ..load import *
8
8
  from ..material import *
9
9
  from ..node import *
10
- from ..post import *
10
+ from ..result import *
11
11
  from ..property import *
12
12
  from ..general import *
13
13
  from ..section import *
@@ -1 +1,2 @@
1
- from .interface import *
1
+ from .interface import *
2
+ from .manager import element_manager