Files
blender-portable-repo/scripts/addons/RetopoFlow/addon_common/common/metaclasses.py
T
2026-03-17 14:30:01 -06:00

77 lines
2.4 KiB
Python

'''
Copyright (C) 2023 Taylor University, CG Cookie
Created by Dr. Jon Denning and Spring 2015 COS 424 class
Some code copied from CG Cookie Retopoflow project
https://github.com/CGCookie/retopoflow
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
'''
from abc import ABCMeta, abstractmethod
'''
RegisterRFClasses handles self registering classes to simplify creating new tools, cursors, etc.
With self registration, the new entities only need to by imported in, and they automatically
show up as an available entity.
'''
class SingletonClass(type):
'''
from https://stackoverflow.com/questions/6760685/creating-a-singleton-in-python
''' # noqa
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
supercls = super(SingletonClass, cls)
cls._instances[cls] = supercls.__call__(*args, *kwargs)
return cls._instances[cls]
# def __getattr__(cls, name):
# return cls._instances[cls].__getattr__(name)
class RegisterClass(type):
'''
# from http://python-3-patterns-idioms-test.readthedocs.io/en/latest/Metaprogramming.html#example-self-registration-of-subclasses
''' # noqa
def __init__(cls, name, bases, nmspc):
super(RegisterClass, cls).__init__(name, bases, nmspc)
if not hasattr(cls, 'registry'):
cls.registry = set()
cls.registry.add(cls)
cls.registry -= set(bases) # Remove base classes
# Metamethods, called on class objects:
def __iter__(cls):
return iter(cls.registry)
def __str__(cls):
if cls in cls.registry:
return cls.__name__
return cls.__name__ + ": " + ", ".join([sc.__name__ for sc in cls])
def __len__(cls):
return len(cls.registry)
class SingletonRegisterClass(SingletonClass, RegisterClass):
pass