continusly promoting Decorator.
This commit is contained in:
		| @ -0,0 +1,41 @@ | ||||
| import sqlite3 | ||||
| import DecoratorData | ||||
|  | ||||
| class BlocksFactory(object): | ||||
|     def __init__(self, db: sqlite3.Connection, graph: int): | ||||
|         # assign members | ||||
|         self.m_GraphCKID: int = graph | ||||
|         self.m_Db: sqlite3.Connection = db | ||||
|         self.__Cursor: sqlite3.Cursor = db.cursor() | ||||
|  | ||||
|         self.m_BBDict: dict[int, DecoratorData.BBTreeNode] = {} | ||||
|         self.m_OperDict: dict[int, DecoratorData.OperTreeNode] = {} | ||||
|         self.__AllBB: set[int] = set() | ||||
|         self.__AllOper: set[int] = set() | ||||
|  | ||||
|         self.m_PassiveOperLayer: DecoratorData.TreeLayout = DecoratorData.TreeLayout() | ||||
|         self.m_ActiveBBLayer: DecoratorData.TreeLayout = DecoratorData.TreeLayout() | ||||
|         self.m_PassiveBBLayer: DecoratorData.TreeLayout = DecoratorData.TreeLayout() | ||||
|  | ||||
|         # fill data first | ||||
|         self.__FillDataFromDb() | ||||
|  | ||||
|     def __GetOneFromSet(self, vals: set[int]) -> int: | ||||
|         return next(iter(vals)) | ||||
|  | ||||
|     def __FillDataFromDb(self): | ||||
|         self.__Cursor.execute('SELECT * FROM [script_behavior] WHERE parent == ?', (self.m_GraphCKID, )) | ||||
|         for sqldata in self.__Cursor.fetchall(): | ||||
|             payload: DecoratorData.BBDataPayload = DecoratorData.BBDataPayload(sqldata) | ||||
|             self.m_BBDict[payload.m_CKID] = DecoratorData.BBTreeNode(payload) | ||||
|             self.__AllBB.add(payload.m_CKID) | ||||
|  | ||||
|         self.__Cursor.execute('SELECT * FROM [script_pOper] WHERE parent == ?', (self.m_GraphCKID, )) | ||||
|         for sqldata in self.__Cursor.fetchall(): | ||||
|             payload: DecoratorData.OperDataPayload = DecoratorData.OperDataPayload(sqldata) | ||||
|             self.m_OperDict[payload.m_CKID] = DecoratorData.OperTreeNode(payload) | ||||
|             self.__AllOper.add(payload.m_CKID) | ||||
|  | ||||
|     def __BuildBB(self, tree: DecoratorData.TreeLayout, start_io: tuple[int]): | ||||
|         pass | ||||
|  | ||||
|  | ||||
| @ -1,9 +1,26 @@ | ||||
| import typing, collections, sqlite3 | ||||
|  | ||||
| class Vector(object): | ||||
|     def __init__(self): | ||||
|         self.X: float = 0.0 | ||||
|         self.Y: float = 0.0 | ||||
|     def __init__(self, x: float, y: float): | ||||
|         self.X: float = x | ||||
|         self.Y: float = y | ||||
|  | ||||
|     @property | ||||
|     def LenLeavesDir(self): | ||||
|         return self.X | ||||
|     @LenLeavesDir.setter | ||||
|     def LenLeavesDir(self, v): | ||||
|         self.X = v | ||||
|     @property | ||||
|     def LenRootsDir(self): | ||||
|         return self.Y | ||||
|     @LenRootsDir.setter | ||||
|     def LenRootsDir(self, v): | ||||
|         self.Y = v | ||||
|  | ||||
|     def __add__(self, other): | ||||
|         if not isinstance(other, Vector): return NotImplemented | ||||
|         return Vector(self.X + other.X, self.Y + other.Y) | ||||
| @ -36,6 +53,12 @@ class Vector(object): | ||||
|         if not isinstance(other, Vector): return NotImplemented | ||||
|         return (self.X != other.X or self.Y != other.Y) | ||||
|  | ||||
| class Margin(object): | ||||
|     def __init__(self): | ||||
|         self.m_TopSize: Vector = Vector() | ||||
|         self.m_BodySize: Vector = Vector() | ||||
|         self.m_BottomSize: Vector = Vector() | ||||
|  | ||||
| class ICanComputeSize(object): | ||||
|     ''' | ||||
|     This class is served for TreeLayout class. | ||||
| @ -47,27 +70,51 @@ class ICanComputeSize(object): | ||||
|     The reason is that the vertical and horizonal direction between BB and Oper is opposited.  | ||||
|     So we use Leaves and Root to give theme an uniformed concept. | ||||
|     ''' | ||||
|     def GetLeavesDirLength() -> float: | ||||
|     def GetPos() -> Vector: | ||||
|         ''' | ||||
|         Get the length of the direction where leaves grow up. | ||||
|         Get current node's start position. | ||||
|         ''' | ||||
|         raise NotImplementedError() | ||||
|     def GetRootDirLength() -> float: | ||||
|     def GetSize() -> Vector: | ||||
|         ''' | ||||
|         Get the length of the direction where the tree planted. | ||||
|          | ||||
|         Get current node's size. | ||||
|         ''' | ||||
|         raise NotImplementedError() | ||||
|     def ComputeSize() -> Vector: | ||||
|         ''' | ||||
|         Get current node's start position | ||||
|         ''' | ||||
|         raise NotImplementedError() | ||||
|  | ||||
| TNode = typing.TypeVar('TNode') | ||||
| TNode = typing.TypeVar('TNode', bound=ICanComputeSize) | ||||
|  | ||||
| class TreeLayoutLayer(typing.Generic[TNode]): | ||||
|     def __init__(self, ref_layer: int, start_pos_of_ref_layer: int): | ||||
|         self.m_Container: collections.deque[TNode] = collections.deque() | ||||
|         self.m_RefLayer: int = ref_layer | ||||
|         self.m_RefLayerIndex: int = start_pos_of_ref_layer | ||||
|  | ||||
| class TreeLayout(typing.Generic[TNode]): | ||||
|     pass | ||||
|     NO_REFERENCE_LAYER: int = -1 | ||||
|  | ||||
|     def __init__(self): | ||||
|         self.m_Layers: collections.deque[TreeLayoutLayer[TNode]] = collections.deque() | ||||
|         self.__CurrentLayer: TreeLayoutLayer[TNode] = None | ||||
|  | ||||
|     def NewLayer(self, ref_layer: int, start_pos_of_ref_layer: int): | ||||
|         self.__CurrentLayer = TreeLayoutLayer(ref_layer, start_pos_of_ref_layer) | ||||
|         self.m_Layers.append(self.__CurrentLayer) | ||||
|  | ||||
|     def NewItem(self, node: TNode): | ||||
|         if self.__CurrentLayer is None: raise Exception("No layer to append data!") | ||||
|         self.__CurrentLayer.m_Container.append(node) | ||||
|  | ||||
| SqlTableProto_Behavior = collections.namedtuple('Behavior', 'thisobj, name, type, proto_name, proto_guid, flags, priority, version, pin_count, parent') | ||||
|  | ||||
| class BBDataPayload(object): | ||||
|     SqlTableProto = collections.namedtuple('Behavior', 'thisobj, name, type, proto_name, proto_guid, flags, priority, version, pin_count, parent') | ||||
|  | ||||
|     def __init__(self, sql_data: tuple): | ||||
|         v = SqlTableProto_Behavior._make(sql_data) | ||||
|         v = BBDataPayload.SqlTableProto._make(sql_data) | ||||
|  | ||||
|         self.m_CKID: int = v.thisobj | ||||
|         self.m_Name: str = v.name | ||||
| @ -86,17 +133,27 @@ class BBDataPayload(object): | ||||
|         self.m_bInCount: int = int(div_pin_count[3]) | ||||
|         self.m_bOutCount: int = int(div_pin_count[4]) | ||||
|  | ||||
| class OperDataPayload(object): | ||||
|     SqlTableProto = collections.namedtuple('Oper', 'thisobj, name, op_guid, parent') | ||||
|  | ||||
|     def __init__(self, sql_data: tuple): | ||||
|         v = OperDataPayload.SqlTableProto._make(sql_data) | ||||
|         self.m_CKID: int = v.thisobj | ||||
|         self.m_Name: str = v.name | ||||
|         self.m_OpGuid: str = v.op_guid | ||||
|         self.m_Parent: int = v.parent | ||||
|  | ||||
| class OperTreeNode(ICanComputeSize): | ||||
|     def __init__(self): | ||||
|         pass | ||||
|     def __init__(self, payload: OperDataPayload): | ||||
|         self.m_Payload: OperDataPayload = payload | ||||
|  | ||||
| class BBTreeNode(ICanComputeSize): | ||||
|     def __init__(self): | ||||
|     def __init__(self, payload: BBDataPayload): | ||||
|         self.m_UpperOper: TreeLayout[OperTreeNode] = TreeLayout() | ||||
|         self.m_LowerOper: TreeLayout[OperTreeNode] = TreeLayout() | ||||
|         self.m_Upperval: collections.deque = collections.deque() | ||||
|         self.m_LowerVal: collections.deque = collections.deque() | ||||
|         self.m_Payload: BBDataPayload = None | ||||
|         self.m_Payload: BBDataPayload = payload | ||||
|  | ||||
|  | ||||
| class GraphWork(ICanComputeSize): | ||||
|  | ||||
		Reference in New Issue
	
	Block a user