{"record":{"id":"232259782e774e55","repo":"3b1b/manim","slug":"all-submobjects-must-be-of-type-pmobject","errorCode":null,"errorMessage":"All submobjects must be of type PMobject","messagePattern":"All submobjects must be of type PMobject","errorType":"exception","errorClass":"Exception","httpStatus":null,"severity":"error","filePath":"manimlib/mobject/types/point_cloud_mobject.py","lineNumber":104,"sourceCode":"            sm.data.array for sm in self.get_family()\n        ]))\n        return self\n\n    def point_from_proportion(self, alpha: float) -> np.ndarray:\n        index = alpha * (self.get_num_points() - 1)\n        return self.get_points()[int(index)]\n\n    def pointwise_become_partial(self, pmobject: PMobject, a: float, b: float) -> Self:\n        lower_index = int(a * pmobject.get_num_points())\n        upper_index = int(b * pmobject.get_num_points())\n        self.set_data(pmobject.data[lower_index:upper_index])\n        return self\n\n\nclass PGroup(PMobject):\n    def __init__(self, *pmobs: PMobject, **kwargs):\n        if not all([isinstance(m, PMobject) for m in pmobs]):\n            raise Exception(\"All submobjects must be of type PMobject\")\n        super().__init__(**kwargs)\n        self.add(*pmobs)\n","sourceCodeStart":86,"sourceCodeEnd":107,"githubUrl":"https://github.com/3b1b/manim/blob/dee01804d47b9f94402d71472674710dcac125b8/manimlib/mobject/types/point_cloud_mobject.py#L86-L107","documentation":"Raised by PGroup.__init__ (point_cloud_mobject.py:104) when any of the positional arguments passed to PGroup is not an instance of PMobject. PGroup is the point-cloud analogue of VGroup and enforces that all its children share the PMobject data model (points + rgba arrays).","triggerScenarios":"PGroup(Dot(), Points()) raises because Dot is a VMobject, not a PMobject; PGroup(VGroup()) and PGroup(Mobject()) also raise. Only point-cloud mobjects such as Points / PMobject subclasses are accepted.","commonSituations":"Assuming the familiar VGroup API accepts anything and writing PGroup(Dot(...)); migrating scenes between vectorized and point-cloud styles while reusing container code.","solutions":["Use Points(...)/other PMobject instances inside PGroup instead of VMobjects like Dot or Circle","If you actually wanted a group of dots, use VGroup(Dot(...)) (vectorized) rather than PGroup","Validate with isinstance(m, PMobject) on each element before constructing"],"exampleFix":"# before\npg = PGroup(Dot(), Dot())  # Dot is a VMobject -> raises\n\n# after\npg = PGroup(Points([[-1, 0, 0], [1, 0, 0]]))","handlingStrategy":"type-guard","validationCode":"assert all(isinstance(m, PMobject) for m in pmobs), 'PGroup needs PMobjects only'\npg = PGroup(*pmobs)","typeGuard":"from manimlib.mobject.types.point_cloud_mobject import PMobject\n\ndef is_pmobject(m) -> bool:\n    return isinstance(m, PMobject)","tryCatchPattern":null,"preventionTips":["Use VGroup for vectorized dots; reserve PGroup for Points/PMobject subclasses","Check isinstance(m, PMobject) on dynamically-built element lists","Remember Dot/Circle are VMobjects and never valid inside PGroup"],"tags":["manim","pgroup","type-check","point-cloud"],"backgroundTag":null,"analyzedSha":"dee01804d47b9f94402d71472674710dcac125b8","analyzedAt":"2026-08-14T19:53:44.241Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}