osis-python 0.6.1__tar.gz → 0.6.2__tar.gz
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.
- {osis_python-0.6.1/src/osis_python.egg-info → osis_python-0.6.2}/PKG-INFO +1 -1
- {osis_python-0.6.1 → osis_python-0.6.2/src/osis_python.egg-info}/PKG-INFO +1 -1
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/__init__.py +1 -1
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/boundary/manager.py +193 -36
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/control/manager.py +178 -24
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/dynamic/manager.py +141 -24
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/element/manager.py +226 -37
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/geometry/manager.py +31 -6
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/live/manager.py +43 -18
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/load/manager.py +494 -351
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/material/manager.py +26 -7
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/project/manager.py +36 -20
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/property/manager.py +263 -84
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/section/manager.py +284 -41
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/settlement/manager.py +84 -27
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/stability/manager.py +42 -31
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/thickness/manager.py +36 -14
- {osis_python-0.6.1 → osis_python-0.6.2}/LICENSE +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/README.md +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/pyproject.toml +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/setup.cfg +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/osis_python.egg-info/SOURCES.txt +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/osis_python.egg-info/dependency_links.txt +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/osis_python.egg-info/requires.txt +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/osis_python.egg-info/top_level.txt +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/boundary/__init__.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/boundary/interface.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/control/__init__.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/control/control.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/control/io.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/control/nonlinear.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/core/__init__.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/core/all_func.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/core/apdl_sync.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/core/basic_manager.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/core/build.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/core/client.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/core/command.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/core/engine.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/core/exceptions.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/core/references.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/core/solver.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/core/sync_apdl_cli.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/display/__init__.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/display/interface.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/display/manager.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/dynamic/__init__.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/dynamic/load_to_mass.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/dynamic/modal.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/dynamic/seismic.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/element/__init__.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/element/interface.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/general/__init__.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/general/interface.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/geometry/__init__.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/geometry/interface.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/live/__init__.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/live/analysis.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/live/grade.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/live/lane.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/load/__init__.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/load/loadcase.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/load/static.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/load/tendon.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/material/__init__.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/material/interface.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/node/__init__.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/node/interface.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/node/manager.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/post/__init__.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/post/combine.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/post/design_check.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/post/display.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/post/manager.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/project/__init__.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/project/interface.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/property/__init__.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/property/component_thickness.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/property/coordinate.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/property/creep_shrink.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/property/damping.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/property/pu_curve.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/quick_building/__init__.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/quick_building/interface.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/result/__init__.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/result/check.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/result/env.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/result/loadcase.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/result/manager.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/result/result.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/section/__init__.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/section/common.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/section/composite.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/section/numeric.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/section/param.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/section/rebar.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/section/rib.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/section/steel.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/settlement/__init__.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/settlement/interface.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/stability/__init__.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/stability/buckling.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/stage/__init__.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/stage/define.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/stage/manager.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/stage/overall.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/thickness/__init__.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/thickness/interface.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/transfer/__init__.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/transfer/generator.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/transfer/matrix.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/transfer/out_to_python.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/transfer/parser.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/transfer/routes.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/transfer/split.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/tests/test_delete_occupied.py +0 -0
- {osis_python-0.6.1 → osis_python-0.6.2}/tests/test_project_manager.py +0 -0
|
@@ -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.6.
|
|
10
|
+
__version__ = "0.6.2"
|
|
11
11
|
__author__ = "CCCC Highway Consultant Co. Ltd." # 中交公路规划设计院 - 工程技术研究中心 - lzh - wjh - myf
|
|
12
12
|
|
|
13
13
|
from .core.engine import OSISEngine
|
|
@@ -497,14 +497,14 @@ class BoundaryGroupManager:
|
|
|
497
497
|
...
|
|
498
498
|
|
|
499
499
|
def _load(self) -> list[BoundaryGroup]:
|
|
500
|
-
|
|
500
|
+
'''从服务端加载所有边界组信息'''
|
|
501
501
|
resp = osis_client("GetAllBoundaryGroupInfo", {})
|
|
502
502
|
if not resp["success"]:
|
|
503
503
|
raise RuntimeError(resp["error"])
|
|
504
|
-
|
|
504
|
+
|
|
505
505
|
groups = [
|
|
506
|
-
BoundaryGroup._from_dict(d)
|
|
507
|
-
for d in resp.get("data", [])
|
|
506
|
+
BoundaryGroup._from_dict(d)
|
|
507
|
+
for d in resp.get("data", [])
|
|
508
508
|
if isinstance(d, dict) and "groupName" in d
|
|
509
509
|
]
|
|
510
510
|
return groups
|
|
@@ -512,31 +512,50 @@ class BoundaryGroupManager:
|
|
|
512
512
|
# ── 增删改 ────────────────────────────────
|
|
513
513
|
|
|
514
514
|
def create(self, name: str, op:Literal["c", "a", "s", "r", "aa", "ra", "m", "d"], *param) -> BoundaryGroup:
|
|
515
|
-
|
|
515
|
+
'''创建边界组并返回刷新后的对象
|
|
516
516
|
|
|
517
517
|
Args:
|
|
518
518
|
name: 边界组名称
|
|
519
|
-
op:
|
|
519
|
+
op: 操作类型
|
|
520
|
+
* c = 创建
|
|
521
|
+
* a = 添加
|
|
522
|
+
* s = 替换
|
|
523
|
+
* r = 移除
|
|
524
|
+
* aa = 添加全部
|
|
525
|
+
* ra = 移除全部
|
|
526
|
+
* m = 修改组名
|
|
527
|
+
* d = 删除
|
|
528
|
+
*param: 待操作的编号,支持格式:*,*to*;*by*(仅用于替换)。
|
|
529
|
+
例子:[2,3,5,"8to10"] ["2by3","5by6","8by10"] 重合的编号自动忽略
|
|
530
|
+
|
|
520
531
|
Returns:
|
|
521
|
-
|
|
522
|
-
|
|
532
|
+
BoundaryGroup: 创建(或刷新后的)边界组对象
|
|
533
|
+
'''
|
|
523
534
|
ok, err = osis_boundary_group(name, op, *param)
|
|
524
535
|
if not ok:
|
|
525
536
|
raise RuntimeError(f"创建边界组 {name} 失败: {err}")
|
|
526
537
|
return self.get(name)
|
|
527
538
|
|
|
528
539
|
def delete(self, name: str) -> None:
|
|
529
|
-
|
|
540
|
+
'''删除边界组
|
|
530
541
|
|
|
531
542
|
Args:
|
|
532
543
|
name: 边界组名称
|
|
533
|
-
|
|
544
|
+
|
|
545
|
+
Raises:
|
|
546
|
+
RuntimeError: 删除失败时抛出异常
|
|
547
|
+
'''
|
|
534
548
|
ok, err = osis_boundary_group(name, "d")
|
|
535
549
|
if not ok:
|
|
536
550
|
raise RuntimeError(f"删除边界组 {name} 失败: {err}")
|
|
537
551
|
|
|
538
552
|
def rename(self, old_name, new_name) -> None:
|
|
539
|
-
|
|
553
|
+
'''修改边界组名称
|
|
554
|
+
|
|
555
|
+
Args:
|
|
556
|
+
old_name: 原边界组名称
|
|
557
|
+
new_name: 新边界组名称
|
|
558
|
+
'''
|
|
540
559
|
ok, err = osis_boundary_group(old_name, "m", [new_name])
|
|
541
560
|
if not ok:
|
|
542
561
|
raise RuntimeError(f"修改边界组名 {old_name} -> {new_name} 失败: 失败: {err}")
|
|
@@ -575,15 +594,18 @@ class BoundaryGroupManager:
|
|
|
575
594
|
return boundary_groups
|
|
576
595
|
|
|
577
596
|
def all(self) -> list[BoundaryGroup]:
|
|
578
|
-
|
|
597
|
+
'''获取所有边界组'''
|
|
579
598
|
return self._load()
|
|
580
599
|
|
|
581
600
|
def count(self) -> int:
|
|
582
|
-
|
|
601
|
+
'''获取边界组总数'''
|
|
583
602
|
return len(self._load())
|
|
584
603
|
|
|
585
604
|
def clear(self) -> None:
|
|
586
|
-
|
|
605
|
+
'''清空所有边界组
|
|
606
|
+
|
|
607
|
+
逐个删除服务端的所有边界组;若任一边界组被占用则抛出异常。
|
|
608
|
+
'''
|
|
587
609
|
try:
|
|
588
610
|
[self.delete(bg.name) for bg in self.all()]
|
|
589
611
|
except Exception as e:
|
|
@@ -624,23 +646,30 @@ class BoundaryManager:
|
|
|
624
646
|
resp = osis_client("GetAllBoundaryInfo", {})
|
|
625
647
|
if not resp["success"]:
|
|
626
648
|
raise RuntimeError(f"{resp['error']}")
|
|
627
|
-
|
|
649
|
+
|
|
628
650
|
boundaries = [
|
|
629
|
-
Boundary._from_dict(d)
|
|
630
|
-
for d in resp.get("data", [])
|
|
651
|
+
Boundary._from_dict(d)
|
|
652
|
+
for d in resp.get("data", [])
|
|
631
653
|
if isinstance(d, dict) and "no" in d
|
|
632
654
|
]
|
|
633
655
|
return boundaries
|
|
634
656
|
|
|
635
657
|
def _next_no(self) -> int:
|
|
636
|
-
"""
|
|
658
|
+
"""返回下一个可用的边界编号(当前最大编号 + 1,空模型为 1)"""
|
|
637
659
|
boundaries = self._load()
|
|
638
660
|
if not boundaries:
|
|
639
661
|
return 1
|
|
640
662
|
return max(bd.no for bd in boundaries) + 1
|
|
641
663
|
|
|
642
664
|
def get_dependencies(self, no: int) -> dict[str, list]:
|
|
643
|
-
"""
|
|
665
|
+
"""查询边界被哪些对象引用(用于删除前检查占用情况)
|
|
666
|
+
|
|
667
|
+
Args:
|
|
668
|
+
no: 边界编号
|
|
669
|
+
|
|
670
|
+
Returns:
|
|
671
|
+
dict[str, list]: 依赖项字典,键为引用类型,值为引用编号列表
|
|
672
|
+
"""
|
|
644
673
|
return get_references("Boundary", no=no)
|
|
645
674
|
|
|
646
675
|
# ── 增删改 ────────────────────────────────
|
|
@@ -690,7 +719,28 @@ class BoundaryManager:
|
|
|
690
719
|
rz: bool = 1,
|
|
691
720
|
rw: bool = 1,
|
|
692
721
|
) -> GeneralBoundary:
|
|
693
|
-
|
|
722
|
+
'''创建一般支撑边界
|
|
723
|
+
|
|
724
|
+
在指定节点上约束 7 个自由度(UX/UY/UZ/RX/RY/RZ/RW),
|
|
725
|
+
可基于局部坐标系或全局坐标系。
|
|
726
|
+
|
|
727
|
+
Args:
|
|
728
|
+
no: 边界编号,None 时自动分配
|
|
729
|
+
coor: 局部坐标系编号,"" 代表缺省(使用全局坐标系)
|
|
730
|
+
x: UX 方向约束标志,0 = 释放,1 = 约束
|
|
731
|
+
y: UY 方向约束标志,0 = 释放,1 = 约束
|
|
732
|
+
z: UZ 方向约束标志,0 = 释放,1 = 约束
|
|
733
|
+
rx: RX 方向约束标志,0 = 释放,1 = 约束
|
|
734
|
+
ry: RY 方向约束标志,0 = 释放,1 = 约束
|
|
735
|
+
rz: RZ 方向约束标志,0 = 释放,1 = 约束
|
|
736
|
+
rw: RW(翘曲)方向约束标志,0 = 释放,1 = 约束
|
|
737
|
+
|
|
738
|
+
Returns:
|
|
739
|
+
GeneralBoundary 对象
|
|
740
|
+
|
|
741
|
+
Examples:
|
|
742
|
+
>>> boundary_manager.create_general(None, x=1, y=1, z=1)
|
|
743
|
+
'''
|
|
694
744
|
if no is None:
|
|
695
745
|
no = self._next_no()
|
|
696
746
|
ok, err = osis_boundary_general(no, "GENERAL", coor or "", x, y, z, rx, ry, rz, rw)
|
|
@@ -710,7 +760,28 @@ class BoundaryManager:
|
|
|
710
760
|
rz: bool = 1,
|
|
711
761
|
coincident: int | None = 1,
|
|
712
762
|
) -> MstSlvBoundary:
|
|
713
|
-
|
|
763
|
+
'''创建主从约束
|
|
764
|
+
|
|
765
|
+
将已分配本边界的从节点与指定的主节点在 6 个自由度上耦合,
|
|
766
|
+
常用于模拟桥梁支座、铰接等连接关系。
|
|
767
|
+
|
|
768
|
+
Args:
|
|
769
|
+
no: 边界编号,None 时自动分配
|
|
770
|
+
node: 主节点编号
|
|
771
|
+
dx: UX 方向耦合标志,0 = 释放,1 = 约束
|
|
772
|
+
dy: UY 方向耦合标志,0 = 释放,1 = 约束
|
|
773
|
+
dz: UZ 方向耦合标志,0 = 释放,1 = 约束
|
|
774
|
+
rx: RX 方向耦合标志,0 = 释放,1 = 约束
|
|
775
|
+
ry: RY 方向耦合标志,0 = 释放,1 = 约束
|
|
776
|
+
rz: RZ 方向耦合标志,0 = 释放,1 = 约束
|
|
777
|
+
coincident: 0 = 仅同位移约束;1 = 完全主从约束(含转动耦合),默认 1
|
|
778
|
+
|
|
779
|
+
Returns:
|
|
780
|
+
MstSlvBoundary 对象
|
|
781
|
+
|
|
782
|
+
Examples:
|
|
783
|
+
>>> boundary_manager.create_master_slave(None, node=10, coincident=1)
|
|
784
|
+
'''
|
|
714
785
|
if no is None:
|
|
715
786
|
no = self._next_no()
|
|
716
787
|
ok, err = osis_boundary_master_slave(no, "MSTSLV", node, dx, dy, dz, rx, ry, rz,coincident)
|
|
@@ -730,7 +801,52 @@ class BoundaryManager:
|
|
|
730
801
|
fxj: float,fyj: float,fzj: float,
|
|
731
802
|
mxj: float,myj: float,mzj: float,mbj: float,
|
|
732
803
|
) -> ReleaseBoundary:
|
|
733
|
-
|
|
804
|
+
'''创建释放梁端约束
|
|
805
|
+
|
|
806
|
+
在梁单元的 I 端和 J 端分别释放 7 个自由度(FX/FY/FZ/MX/MY/MZ/MB),
|
|
807
|
+
每个自由度通过 _state(0 = 完全释放,1 = 完全约束)和对应 _value(0-1 之间,
|
|
808
|
+
表示释放后残余约束能力的百分比)共同控制。
|
|
809
|
+
|
|
810
|
+
Args:
|
|
811
|
+
no: 边界编号,None 时自动分配
|
|
812
|
+
fxi_state: I 端 FX(轴力)状态,0 = 释放,1 = 约束
|
|
813
|
+
fyi_state: I 端 FY(剪力)状态,0 = 释放,1 = 约束
|
|
814
|
+
fzi_state: I 端 FZ(剪力)状态,0 = 释放,1 = 约束
|
|
815
|
+
mxi_state: I 端 MX(扭矩)状态,0 = 释放,1 = 约束
|
|
816
|
+
myi_state: I 端 MY(弯矩)状态,0 = 释放,1 = 约束
|
|
817
|
+
mzi_state: I 端 MZ(弯矩)状态,0 = 释放,1 = 约束
|
|
818
|
+
mbi_state: I 端 MB(双力矩)状态,0 = 释放,1 = 约束
|
|
819
|
+
fxi: I 端 FX 部分约束残余百分比(0-1)
|
|
820
|
+
fyi: I 端 FY 部分约束残余百分比(0-1)
|
|
821
|
+
fzi: I 端 FZ 部分约束残余百分比(0-1)
|
|
822
|
+
mxi: I 端 MX 部分约束残余百分比(0-1)
|
|
823
|
+
myi: I 端 MY 部分约束残余百分比(0-1)
|
|
824
|
+
mzi: I 端 MZ 部分约束残余百分比(0-1)
|
|
825
|
+
mbi: I 端 MB 部分约束残余百分比(0-1)
|
|
826
|
+
fxj_state: J 端 FX 状态,0 = 释放,1 = 约束
|
|
827
|
+
fyj_state: J 端 FY 状态,0 = 释放,1 = 约束
|
|
828
|
+
fzj_state: J 端 FZ 状态,0 = 释放,1 = 约束
|
|
829
|
+
mxj_state: J 端 MX 状态,0 = 释放,1 = 约束
|
|
830
|
+
myj_state: J 端 MY 状态,0 = 释放,1 = 约束
|
|
831
|
+
mzj_state: J 端 MZ 状态,0 = 释放,1 = 约束
|
|
832
|
+
mbj_state: J 端 MB 状态,0 = 释放,1 = 约束
|
|
833
|
+
fxj: J 端 FX 部分约束残余百分比(0-1)
|
|
834
|
+
fyj: J 端 FY 部分约束残余百分比(0-1)
|
|
835
|
+
fzj: J 端 FZ 部分约束残余百分比(0-1)
|
|
836
|
+
mxj: J 端 MX 部分约束残余百分比(0-1)
|
|
837
|
+
myj: J 端 MY 部分约束残余百分比(0-1)
|
|
838
|
+
mzj: J 端 MZ 部分约束残余百分比(0-1)
|
|
839
|
+
mbj: J 端 MB 部分约束残余百分比(0-1)
|
|
840
|
+
|
|
841
|
+
Returns:
|
|
842
|
+
ReleaseBoundary 对象
|
|
843
|
+
|
|
844
|
+
Examples:
|
|
845
|
+
>>> boundary_manager.create_release(None, 1,1,1,1,1,1,1,
|
|
846
|
+
... 1.0,1.0,1.0,1.0,1.0,1.0,1.0,
|
|
847
|
+
... 0,0,0,1,1,1,1,
|
|
848
|
+
... 0.0,0.0,0.0,1.0,1.0,1.0,1.0)
|
|
849
|
+
'''
|
|
734
850
|
if no is None:
|
|
735
851
|
no = self._next_no()
|
|
736
852
|
ok, err = osis_boundary_release(
|
|
@@ -761,7 +877,35 @@ class BoundaryManager:
|
|
|
761
877
|
rz: bool = 1,
|
|
762
878
|
drz: float | int = 1e16,
|
|
763
879
|
) -> ElstcSptBoundary:
|
|
764
|
-
|
|
880
|
+
'''创建节点弹性支承
|
|
881
|
+
|
|
882
|
+
在节点 6 个自由度上分别设置弹性约束或固定约束。
|
|
883
|
+
每个方向由一个标志位(0 = 弹性,1 = 固定)和对应的弹性刚度组成。
|
|
884
|
+
注:弹性支撑与一般边界固定的自由度相同,且弹性支撑其余自由度上约束为零时,
|
|
885
|
+
二者结果完全相同,不存在数值差异。
|
|
886
|
+
|
|
887
|
+
Args:
|
|
888
|
+
no: 边界编号,None 时自动分配
|
|
889
|
+
coor: 局部坐标系编号,"" 代表缺省
|
|
890
|
+
x: UX 方向,0 = 弹性,1 = 固定
|
|
891
|
+
dx: 坐标系 X 轴方向的弹性支承刚度
|
|
892
|
+
y: UY 方向,0 = 弹性,1 = 固定
|
|
893
|
+
dy: 坐标系 Y 轴方向的弹性支承刚度
|
|
894
|
+
z: UZ 方向,0 = 弹性,1 = 固定
|
|
895
|
+
dz: 坐标系 Z 轴方向的弹性支承刚度
|
|
896
|
+
rx: RX 方向,0 = 弹性,1 = 固定
|
|
897
|
+
drx: 绕坐标系 X 轴方向的转动弹性刚度
|
|
898
|
+
ry: RY 方向,0 = 弹性,1 = 固定
|
|
899
|
+
dry: 绕坐标系 Y 轴方向的转动弹性刚度
|
|
900
|
+
rz: RZ 方向,0 = 弹性,1 = 固定
|
|
901
|
+
drz: 绕坐标系 Z 轴方向的转动弹性刚度
|
|
902
|
+
|
|
903
|
+
Returns:
|
|
904
|
+
ElstcSptBoundary 对象
|
|
905
|
+
|
|
906
|
+
Examples:
|
|
907
|
+
>>> boundary_manager.create_elstcspt(None)
|
|
908
|
+
'''
|
|
765
909
|
if no is None:
|
|
766
910
|
no = self._next_no()
|
|
767
911
|
ok, err = osis_boundary_elstcspt(
|
|
@@ -831,7 +975,10 @@ class BoundaryManager:
|
|
|
831
975
|
no: int | None,
|
|
832
976
|
nNodeI: int,
|
|
833
977
|
) -> Boundary:
|
|
834
|
-
|
|
978
|
+
'''创建刚性连接
|
|
979
|
+
|
|
980
|
+
将主节点 nNodeI 与通过 assign 分配的从节点绑定为刚性区域,
|
|
981
|
+
刚性区域内所有节点的 6 个自由度保持完全一致。
|
|
835
982
|
|
|
836
983
|
Args:
|
|
837
984
|
no: 边界编号,None 时自动分配
|
|
@@ -841,8 +988,8 @@ class BoundaryManager:
|
|
|
841
988
|
Boundary 对象
|
|
842
989
|
|
|
843
990
|
Notes:
|
|
844
|
-
|
|
845
|
-
|
|
991
|
+
用于形成刚性区域的从节点号 nodeJ, nodeK, ..., nodeL 由 assign 方法定义。
|
|
992
|
+
'''
|
|
846
993
|
if no is None:
|
|
847
994
|
no = self._next_no()
|
|
848
995
|
ok, err = osis_boundary_rigid(no, "RIGID", nNodeI)
|
|
@@ -866,21 +1013,28 @@ class BoundaryManager:
|
|
|
866
1013
|
# ── 查询 ──────────────────────────────────
|
|
867
1014
|
|
|
868
1015
|
def get(self, no: int | list[int]) -> Boundary | list[Boundary | None] | None:
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
1016
|
+
'''根据编号获取单个或多个边界(O(k))
|
|
1017
|
+
|
|
1018
|
+
内部调用接口 GetBoundaryInfoByNos。
|
|
1019
|
+
|
|
1020
|
+
Args:
|
|
1021
|
+
no: 边界编号,支持单个 int 或编号列表
|
|
1022
|
+
|
|
1023
|
+
Returns:
|
|
1024
|
+
单个 Boundary 对象;如果传入列表则按顺序返回对象列表;
|
|
1025
|
+
不存在返回 None
|
|
1026
|
+
'''
|
|
873
1027
|
if isinstance(no, int):
|
|
874
1028
|
no = [no]
|
|
875
1029
|
elif not isinstance(no, list):
|
|
876
1030
|
raise TypeError(f"不支持的编号类型: {type(no)}")
|
|
877
|
-
|
|
1031
|
+
|
|
878
1032
|
resp = osis_client("GetBoundaryInfoByNos", {"no": no})
|
|
879
1033
|
if not resp['success']:
|
|
880
1034
|
raise RuntimeError(f"{resp['error']}")
|
|
881
|
-
|
|
1035
|
+
|
|
882
1036
|
boundaries = [Boundary._from_dict(d) if d else None for d in resp.get("data", [])]
|
|
883
|
-
|
|
1037
|
+
|
|
884
1038
|
if len(boundaries) == 0:
|
|
885
1039
|
return None
|
|
886
1040
|
elif len(boundaries) == 1:
|
|
@@ -888,15 +1042,18 @@ class BoundaryManager:
|
|
|
888
1042
|
return boundaries
|
|
889
1043
|
|
|
890
1044
|
def all(self) -> list[Boundary]:
|
|
891
|
-
|
|
1045
|
+
'''获取所有边界'''
|
|
892
1046
|
return self._load()
|
|
893
1047
|
|
|
894
1048
|
def count(self) -> int:
|
|
895
|
-
|
|
1049
|
+
'''获取边界总数'''
|
|
896
1050
|
return len(self._load())
|
|
897
1051
|
|
|
898
1052
|
def clear(self) -> None:
|
|
899
|
-
|
|
1053
|
+
'''清空所有边界
|
|
1054
|
+
|
|
1055
|
+
逐个删除服务端的所有边界;若任一边界被占用则抛出异常。
|
|
1056
|
+
'''
|
|
900
1057
|
try:
|
|
901
1058
|
[self.delete(b.no) for b in self.all()]
|
|
902
1059
|
except Exception as e:
|
|
@@ -67,26 +67,50 @@ class ControlManager:
|
|
|
67
67
|
|
|
68
68
|
|
|
69
69
|
def set_gravity_acceleration(self, g: float = 9.8066) -> None:
|
|
70
|
-
|
|
70
|
+
'''设置整体坐标系下三个方向的重力加速度分量
|
|
71
|
+
|
|
72
|
+
Args:
|
|
73
|
+
g (float): 重力加速度值,默认 9.8066 m/s²
|
|
74
|
+
|
|
75
|
+
Returns:
|
|
76
|
+
None
|
|
77
|
+
|
|
78
|
+
Raises:
|
|
79
|
+
RuntimeError: 设置失败时抛出异常
|
|
80
|
+
'''
|
|
71
81
|
ok, err = osis_acel(g)
|
|
72
82
|
if not ok:
|
|
73
83
|
raise RuntimeError(f"设置重力加速度失败: {err}")
|
|
74
84
|
|
|
75
85
|
def export_apdl(self, path: str | None = None) -> None:
|
|
76
|
-
|
|
86
|
+
'''导出当前前处理状态到 APDL .out 文件
|
|
87
|
+
|
|
88
|
+
Args:
|
|
89
|
+
path (str | None): 输出文件完整路径,可缺省;不传则使用程序当前路径
|
|
90
|
+
|
|
91
|
+
Returns:
|
|
92
|
+
None
|
|
93
|
+
|
|
94
|
+
Raises:
|
|
95
|
+
RuntimeError: 导出失败时抛出异常
|
|
96
|
+
'''
|
|
77
97
|
ok, err = osis_apdl(path)
|
|
78
98
|
if not ok:
|
|
79
99
|
raise RuntimeError(f"导出 APDL 文件失败: {err}")
|
|
80
100
|
|
|
81
101
|
def import_apdl(self, path: str | None = None) -> None:
|
|
82
|
-
|
|
102
|
+
'''读取 APDL .out / .sml 文件
|
|
83
103
|
|
|
84
104
|
Args:
|
|
85
|
-
path (str):
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
105
|
+
path (str): 完整文件名,可缺省。path 中如果不输入绝对路径的话,
|
|
106
|
+
默认使用程序执行文件所在的路径,例如 "D:\\\\Rbin\\\\X.sml"。
|
|
107
|
+
|
|
108
|
+
Returns:
|
|
109
|
+
None
|
|
110
|
+
|
|
111
|
+
Raises:
|
|
112
|
+
RuntimeError: 导入失败时抛出异常
|
|
113
|
+
'''
|
|
90
114
|
ok, err = osis_run(f"/input,{path}")
|
|
91
115
|
if not ok:
|
|
92
116
|
raise RuntimeError(f"导入 APDL 文件失败: {err}")
|
|
@@ -95,49 +119,129 @@ class ControlManager:
|
|
|
95
119
|
# ── 材料效应开关 ────────────────────────────
|
|
96
120
|
|
|
97
121
|
def set_calc_tendon(self, enabled: Literal[0,1] = 1) -> None:
|
|
98
|
-
|
|
122
|
+
'''设置是否计算预应力效应
|
|
123
|
+
|
|
124
|
+
Args:
|
|
125
|
+
enabled (int): 1=开,0=关
|
|
126
|
+
|
|
127
|
+
Returns:
|
|
128
|
+
None
|
|
129
|
+
|
|
130
|
+
Raises:
|
|
131
|
+
RuntimeError: 设置失败时抛出异常
|
|
132
|
+
'''
|
|
99
133
|
ok, err = osis_calc_tendon(enabled)
|
|
100
134
|
if not ok:
|
|
101
135
|
raise RuntimeError(f"设置预应力计算失败: {err}")
|
|
102
136
|
|
|
103
137
|
def set_calc_concurrent_force(self, enabled: Literal[0,1] = 1) -> None:
|
|
104
|
-
|
|
138
|
+
'''设置是否计算并发反力
|
|
139
|
+
|
|
140
|
+
Args:
|
|
141
|
+
enabled (int): 1=开,0=关
|
|
142
|
+
|
|
143
|
+
Returns:
|
|
144
|
+
None
|
|
145
|
+
|
|
146
|
+
Raises:
|
|
147
|
+
RuntimeError: 设置失败时抛出异常
|
|
148
|
+
'''
|
|
105
149
|
ok, err = osis_calc_con_force(enabled)
|
|
106
150
|
if not ok:
|
|
107
151
|
raise RuntimeError(f"设置并发反力计算失败: {err}")
|
|
108
152
|
|
|
109
153
|
def set_calc_shrink(self, enabled: Literal[0,1] = 1) -> None:
|
|
110
|
-
|
|
154
|
+
'''设置是否计算收缩
|
|
155
|
+
|
|
156
|
+
Args:
|
|
157
|
+
enabled (int): 1=开,0=关
|
|
158
|
+
|
|
159
|
+
Returns:
|
|
160
|
+
None
|
|
161
|
+
|
|
162
|
+
Raises:
|
|
163
|
+
RuntimeError: 设置失败时抛出异常
|
|
164
|
+
'''
|
|
111
165
|
ok, err = osis_calc_shrink(enabled)
|
|
112
166
|
if not ok:
|
|
113
167
|
raise RuntimeError(f"设置收缩计算失败: {err}")
|
|
114
168
|
|
|
115
169
|
def set_calc_creep(self, enabled: Literal[0,1] = 1) -> None:
|
|
116
|
-
|
|
170
|
+
'''设置是否计算徐变
|
|
171
|
+
|
|
172
|
+
Args:
|
|
173
|
+
enabled (int): 1=开,0=关
|
|
174
|
+
|
|
175
|
+
Returns:
|
|
176
|
+
None
|
|
177
|
+
|
|
178
|
+
Raises:
|
|
179
|
+
RuntimeError: 设置失败时抛出异常
|
|
180
|
+
'''
|
|
117
181
|
ok, err = osis_calc_creep(enabled)
|
|
118
182
|
if not ok:
|
|
119
183
|
raise RuntimeError(f"设置徐变计算失败: {err}")
|
|
120
184
|
|
|
121
185
|
def set_calc_shear(self, enabled: Literal[0,1] = 1) -> None:
|
|
122
|
-
|
|
186
|
+
'''设置是否计算剪切变形
|
|
187
|
+
|
|
188
|
+
Args:
|
|
189
|
+
enabled (int): 1=开,0=关
|
|
190
|
+
|
|
191
|
+
Returns:
|
|
192
|
+
None
|
|
193
|
+
|
|
194
|
+
Raises:
|
|
195
|
+
RuntimeError: 设置失败时抛出异常
|
|
196
|
+
'''
|
|
123
197
|
ok, err = osis_calc_shear(enabled)
|
|
124
198
|
if not ok:
|
|
125
199
|
raise RuntimeError(f"设置剪切计算失败: {err}")
|
|
126
200
|
|
|
127
201
|
def set_calc_relaxation(self, enabled: Literal[0,1] = 1) -> None:
|
|
128
|
-
|
|
202
|
+
'''设置是否计算钢束松弛
|
|
203
|
+
|
|
204
|
+
Args:
|
|
205
|
+
enabled (int): 1=开,0=关
|
|
206
|
+
|
|
207
|
+
Returns:
|
|
208
|
+
None
|
|
209
|
+
|
|
210
|
+
Raises:
|
|
211
|
+
RuntimeError: 设置失败时抛出异常
|
|
212
|
+
'''
|
|
129
213
|
ok, err = osis_calc_rlx(enabled)
|
|
130
214
|
if not ok:
|
|
131
215
|
raise RuntimeError(f"设置钢束松弛计算失败: {err}")
|
|
132
216
|
|
|
133
217
|
def set_mod_loc_coor(self, enabled: Literal[0,1] = 1) -> None:
|
|
134
|
-
|
|
218
|
+
'''设置是否修改变截面单元局部坐标轴以计算内力/应力
|
|
219
|
+
|
|
220
|
+
Args:
|
|
221
|
+
enabled (int): 1=开,0=关
|
|
222
|
+
|
|
223
|
+
Returns:
|
|
224
|
+
None
|
|
225
|
+
|
|
226
|
+
Raises:
|
|
227
|
+
RuntimeError: 设置失败时抛出异常
|
|
228
|
+
'''
|
|
135
229
|
ok, err = osis_mod_loc_coor(enabled)
|
|
136
230
|
if not ok:
|
|
137
231
|
raise RuntimeError(f"设置局部坐标轴修正失败: {err}")
|
|
138
232
|
|
|
139
233
|
def set_inc_tendon(self, enabled: Literal[0,1] = 1) -> None:
|
|
140
|
-
|
|
234
|
+
'''设置是否考虑钢束自重及钢束对截面几何特性的影响
|
|
235
|
+
|
|
236
|
+
Args:
|
|
237
|
+
enabled (int): 1=开,0=关
|
|
238
|
+
|
|
239
|
+
Returns:
|
|
240
|
+
None
|
|
241
|
+
|
|
242
|
+
Raises:
|
|
243
|
+
RuntimeError: 设置失败时抛出异常
|
|
244
|
+
'''
|
|
141
245
|
ok, err = osis_inc_tendon(enabled)
|
|
142
246
|
if not ok:
|
|
143
247
|
raise RuntimeError(f"设置钢束自重影响失败: {err}")
|
|
@@ -149,30 +253,67 @@ class ControlManager:
|
|
|
149
253
|
geom: Literal[0,1] = 0,
|
|
150
254
|
link: Literal[0,1] = 0,
|
|
151
255
|
) -> None:
|
|
152
|
-
|
|
256
|
+
'''设置非线性分析控制开关
|
|
153
257
|
|
|
154
258
|
Args:
|
|
155
|
-
geom:
|
|
156
|
-
link:
|
|
157
|
-
|
|
259
|
+
geom (int): 是否打开几何非线性(大位移大转角),1=开,0=关
|
|
260
|
+
link (int): 是否考虑非线性连接单元,1=考虑,0=不考虑
|
|
261
|
+
|
|
262
|
+
Returns:
|
|
263
|
+
None
|
|
264
|
+
|
|
265
|
+
Raises:
|
|
266
|
+
RuntimeError: 设置失败时抛出异常
|
|
267
|
+
'''
|
|
158
268
|
ok, err = osis_nl(1 if geom else 0, 1 if link else 0)
|
|
159
269
|
if not ok:
|
|
160
270
|
raise RuntimeError(f"设置非线性控制失败: {err}")
|
|
161
271
|
|
|
162
272
|
def set_line_search(self, enabled: Literal[0,1] = 1) -> None:
|
|
163
|
-
|
|
273
|
+
'''设置求解阶段的线性搜索开关
|
|
274
|
+
|
|
275
|
+
Args:
|
|
276
|
+
enabled (int): 1=开,0=关
|
|
277
|
+
|
|
278
|
+
Returns:
|
|
279
|
+
None
|
|
280
|
+
|
|
281
|
+
Raises:
|
|
282
|
+
RuntimeError: 设置失败时抛出异常
|
|
283
|
+
'''
|
|
164
284
|
ok, err = osis_ln_srch(enabled)
|
|
165
285
|
if not ok:
|
|
166
286
|
raise RuntimeError(f"设置线性搜索失败: {err}")
|
|
167
287
|
|
|
168
288
|
def set_auto_time_step(self, enabled: Literal[0,1] = 1) -> None:
|
|
169
|
-
|
|
289
|
+
'''设置是否启用自动计算时间荷载步
|
|
290
|
+
|
|
291
|
+
Args:
|
|
292
|
+
enabled (int): 1=开,0=关
|
|
293
|
+
|
|
294
|
+
Returns:
|
|
295
|
+
None
|
|
296
|
+
|
|
297
|
+
Raises:
|
|
298
|
+
RuntimeError: 设置失败时抛出异常
|
|
299
|
+
'''
|
|
170
300
|
ok, err = osis_auto_ts(enabled)
|
|
171
301
|
if not ok:
|
|
172
302
|
raise RuntimeError(f"设置自动时间步长失败: {err}")
|
|
173
303
|
|
|
174
304
|
def set_substitution_steps(self, ls: int, sbmx: int) -> None:
|
|
175
|
-
|
|
305
|
+
'''指定荷载步数与最大荷载子步数
|
|
306
|
+
|
|
307
|
+
Args:
|
|
308
|
+
ls (int): 荷载步数
|
|
309
|
+
sbmx (int): 最大荷载子步数
|
|
310
|
+
|
|
311
|
+
Returns:
|
|
312
|
+
None
|
|
313
|
+
|
|
314
|
+
Raises:
|
|
315
|
+
RuntimeError: 设置失败时抛出异常
|
|
316
|
+
'''
|
|
176
317
|
ok, err = osis_NSUBST(ls, sbmx)
|
|
177
318
|
if not ok:
|
|
178
319
|
raise RuntimeError(f"设置荷载步数失败: {err}")
|
|
@@ -180,7 +321,20 @@ class ControlManager:
|
|
|
180
321
|
# ── 模态分析 ────────────────────────────────
|
|
181
322
|
|
|
182
323
|
def set_modal_opt(self, num: int = 1) -> None:
|
|
183
|
-
|
|
324
|
+
'''定义模态分析所需计算的特征值最大数目
|
|
325
|
+
|
|
326
|
+
Args:
|
|
327
|
+
num (int): 需要计算的特征值最大数目,缺省值:1
|
|
328
|
+
|
|
329
|
+
Returns:
|
|
330
|
+
None
|
|
331
|
+
|
|
332
|
+
Raises:
|
|
333
|
+
RuntimeError: 设置失败时抛出异常
|
|
334
|
+
|
|
335
|
+
Examples:
|
|
336
|
+
>>> control_manager.set_modal_opt(5) # 设置计算前 5 阶模态
|
|
337
|
+
'''
|
|
184
338
|
ok, err = osis_mod_opt(num)
|
|
185
339
|
if not ok:
|
|
186
340
|
raise RuntimeError(f"设置模态分析参数失败: {err}")
|