manimgeo.components.multiple.adapter 源代码
from __future__ import annotations
from pydantic import Field
from typing import cast
from ..base import GeometryAdapter
from .args import *
[文档]
class MultipleAdapter(GeometryAdapter[MultipleConstructArgs]):
geometry_objects: List[BaseGeometry] = Field(default_factory=list, description="计算多个几何对象", init=False)
def __call__(self):
"""
多几何对象具体计算
具体的参数更新是由下游的几何对象负责
"""
match self.construct_type:
case "Multiple":
args = cast(MultipleArgs, self.args)
self.geometry_objects = args.geometry_objects
case "FilteredMultiple":
args = cast(FilteredMultipleArgs, self.args)
self.geometry_objects = [obj for obj, keep in zip(args.geometry_objects, args.filter_func(args.geometry_objects)) if keep]
case "FilteredMultipleMono":
args = cast(FilteredMultipleMonoArgs, self.args)
self.geometry_objects = [obj for obj in args.geometry_objects if args.filter_func(obj)]
case "Union":
args = cast(UnionArgs, self.args)
self.geometry_objects = []
for multiple in args.multiples:
self.geometry_objects.extend(multiple.geometry_objects)
self.geometry_objects = list(set(self.geometry_objects))
case "Intersection":
args = cast(IntersectionArgs, self.args)
if not args.multiples:
self.geometry_objects = []
else:
# 取第一个 Multiple 的几何对象作为初始集合
intersection_set = set(args.multiples[0].geometry_objects)
for multiple in args.multiples[1:]:
intersection_set.intersection_update(multiple.geometry_objects)
self.geometry_objects = list(intersection_set)
case _:
raise NotImplementedError(f"不支持的构造方式: {self.construct_type}")