manimgeo.components.base.base_argsmodel 源代码
from __future__ import annotations
from .base_pydantic import BaseModelN
from pydantic import Field
from typing import List, TypeVar, TYPE_CHECKING
if TYPE_CHECKING:
from .base_geometry import BaseGeometry
# 适配器的泛型参数模型
[文档]
class ArgsModelBase(BaseModelN):
"""适配器参数模型基类"""
construct_type: str = Field(description="适配器计算方法类型")
def _get_deps(self) -> List[BaseGeometry]:
"""
获取参数模型声明的依赖几何对象列表
例如,参数模型有可能包含多个 `BaseGeometry` 对象:
```python
class SomeConstruct(BaseModelN):
construct_type: Literal["PPPO"] = "PPPO"
start: Point
center: Point
end: Point
other: List[BaseGeometry]
```
默认情况下,该方法会遍历适配器的所有字段,检查是否为
- `BaseGeometry` 或其子类实例
- `List`,并包含 `BaseGeometry` 实例,
并返回这些对象。如果需要实现更复杂的依赖关系提取逻辑,子类需要重写此方法以返回其依赖的几何对象
"""
# 再次导入,避免在文件头循环依赖
from .base_geometry import BaseGeometry
dep_objects: List[BaseGeometry] = []
for field_name, field_info in self.__class__.model_fields.items():
field_value = getattr(self, field_name)
# 基本几何对象
if isinstance(field_value, BaseGeometry):
dep_objects.append(field_value)
# 列表类型依赖
elif isinstance(field_value, List):
for item in field_value:
if isinstance(item, BaseGeometry):
dep_objects.append(item)
return dep_objects
_ArgsModelT = TypeVar('_ArgsModelT', bound=ArgsModelBase)