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.
Files changed (117) hide show
  1. {osis_python-0.6.1/src/osis_python.egg-info → osis_python-0.6.2}/PKG-INFO +1 -1
  2. {osis_python-0.6.1 → osis_python-0.6.2/src/osis_python.egg-info}/PKG-INFO +1 -1
  3. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/__init__.py +1 -1
  4. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/boundary/manager.py +193 -36
  5. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/control/manager.py +178 -24
  6. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/dynamic/manager.py +141 -24
  7. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/element/manager.py +226 -37
  8. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/geometry/manager.py +31 -6
  9. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/live/manager.py +43 -18
  10. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/load/manager.py +494 -351
  11. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/material/manager.py +26 -7
  12. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/project/manager.py +36 -20
  13. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/property/manager.py +263 -84
  14. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/section/manager.py +284 -41
  15. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/settlement/manager.py +84 -27
  16. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/stability/manager.py +42 -31
  17. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/thickness/manager.py +36 -14
  18. {osis_python-0.6.1 → osis_python-0.6.2}/LICENSE +0 -0
  19. {osis_python-0.6.1 → osis_python-0.6.2}/README.md +0 -0
  20. {osis_python-0.6.1 → osis_python-0.6.2}/pyproject.toml +0 -0
  21. {osis_python-0.6.1 → osis_python-0.6.2}/setup.cfg +0 -0
  22. {osis_python-0.6.1 → osis_python-0.6.2}/src/osis_python.egg-info/SOURCES.txt +0 -0
  23. {osis_python-0.6.1 → osis_python-0.6.2}/src/osis_python.egg-info/dependency_links.txt +0 -0
  24. {osis_python-0.6.1 → osis_python-0.6.2}/src/osis_python.egg-info/requires.txt +0 -0
  25. {osis_python-0.6.1 → osis_python-0.6.2}/src/osis_python.egg-info/top_level.txt +0 -0
  26. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/boundary/__init__.py +0 -0
  27. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/boundary/interface.py +0 -0
  28. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/control/__init__.py +0 -0
  29. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/control/control.py +0 -0
  30. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/control/io.py +0 -0
  31. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/control/nonlinear.py +0 -0
  32. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/core/__init__.py +0 -0
  33. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/core/all_func.py +0 -0
  34. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/core/apdl_sync.py +0 -0
  35. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/core/basic_manager.py +0 -0
  36. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/core/build.py +0 -0
  37. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/core/client.py +0 -0
  38. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/core/command.py +0 -0
  39. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/core/engine.py +0 -0
  40. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/core/exceptions.py +0 -0
  41. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/core/references.py +0 -0
  42. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/core/solver.py +0 -0
  43. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/core/sync_apdl_cli.py +0 -0
  44. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/display/__init__.py +0 -0
  45. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/display/interface.py +0 -0
  46. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/display/manager.py +0 -0
  47. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/dynamic/__init__.py +0 -0
  48. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/dynamic/load_to_mass.py +0 -0
  49. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/dynamic/modal.py +0 -0
  50. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/dynamic/seismic.py +0 -0
  51. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/element/__init__.py +0 -0
  52. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/element/interface.py +0 -0
  53. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/general/__init__.py +0 -0
  54. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/general/interface.py +0 -0
  55. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/geometry/__init__.py +0 -0
  56. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/geometry/interface.py +0 -0
  57. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/live/__init__.py +0 -0
  58. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/live/analysis.py +0 -0
  59. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/live/grade.py +0 -0
  60. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/live/lane.py +0 -0
  61. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/load/__init__.py +0 -0
  62. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/load/loadcase.py +0 -0
  63. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/load/static.py +0 -0
  64. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/load/tendon.py +0 -0
  65. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/material/__init__.py +0 -0
  66. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/material/interface.py +0 -0
  67. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/node/__init__.py +0 -0
  68. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/node/interface.py +0 -0
  69. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/node/manager.py +0 -0
  70. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/post/__init__.py +0 -0
  71. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/post/combine.py +0 -0
  72. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/post/design_check.py +0 -0
  73. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/post/display.py +0 -0
  74. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/post/manager.py +0 -0
  75. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/project/__init__.py +0 -0
  76. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/project/interface.py +0 -0
  77. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/property/__init__.py +0 -0
  78. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/property/component_thickness.py +0 -0
  79. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/property/coordinate.py +0 -0
  80. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/property/creep_shrink.py +0 -0
  81. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/property/damping.py +0 -0
  82. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/property/pu_curve.py +0 -0
  83. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/quick_building/__init__.py +0 -0
  84. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/quick_building/interface.py +0 -0
  85. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/result/__init__.py +0 -0
  86. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/result/check.py +0 -0
  87. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/result/env.py +0 -0
  88. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/result/loadcase.py +0 -0
  89. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/result/manager.py +0 -0
  90. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/result/result.py +0 -0
  91. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/section/__init__.py +0 -0
  92. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/section/common.py +0 -0
  93. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/section/composite.py +0 -0
  94. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/section/numeric.py +0 -0
  95. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/section/param.py +0 -0
  96. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/section/rebar.py +0 -0
  97. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/section/rib.py +0 -0
  98. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/section/steel.py +0 -0
  99. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/settlement/__init__.py +0 -0
  100. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/settlement/interface.py +0 -0
  101. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/stability/__init__.py +0 -0
  102. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/stability/buckling.py +0 -0
  103. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/stage/__init__.py +0 -0
  104. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/stage/define.py +0 -0
  105. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/stage/manager.py +0 -0
  106. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/stage/overall.py +0 -0
  107. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/thickness/__init__.py +0 -0
  108. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/thickness/interface.py +0 -0
  109. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/transfer/__init__.py +0 -0
  110. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/transfer/generator.py +0 -0
  111. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/transfer/matrix.py +0 -0
  112. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/transfer/out_to_python.py +0 -0
  113. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/transfer/parser.py +0 -0
  114. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/transfer/routes.py +0 -0
  115. {osis_python-0.6.1 → osis_python-0.6.2}/src/pyosis/transfer/split.py +0 -0
  116. {osis_python-0.6.1 → osis_python-0.6.2}/tests/test_delete_occupied.py +0 -0
  117. {osis_python-0.6.1 → osis_python-0.6.2}/tests/test_project_manager.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: osis-python
3
- Version: 0.6.1
3
+ Version: 0.6.2
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,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: osis-python
3
- Version: 0.6.1
3
+ Version: 0.6.2
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
@@ -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.1"
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
- 创建的 BoundaryGroup 对象
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
- 用于形成刚性区域的节点号 nodeJ, nodeK, ..., nodeL 由 assign 方法定义
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
- """根据编号获取单个或多个边界 (O(k))
870
-
871
- 接口:GetBoundaryInfoByNos
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
- """设置重力加速度值,默认 9.8066 m/s²"""
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
- """导出前处理状态为 .out 文件"""
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
- """读取 .out / .sml 文件
102
+ '''读取 APDL .out / .sml 文件
83
103
 
84
104
  Args:
85
- path (str): 完整文件名
86
-
87
- Notes:
88
- path 中如果不输入绝对路径的话,默认使用程序执行文件所在的路径,比如“D:\\Rbin\\X.sml”。
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}")