forked from neilsagarwal/boggart
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathut_IObject.py
More file actions
125 lines (96 loc) · 3.81 KB
/
Copy pathut_IObject.py
File metadata and controls
125 lines (96 loc) · 3.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
from ut_util_classes import ObjectState, log
from typing import List, Dict
from ut_IObjectModel import ObjectModel, ObjectModelGroup, IObjectModel
class IObject():
id_counter = 0
def __init__(self):
self.mObjectId = str(self.id_counter)
IObject.id_counter += 1
self.mState: ObjectState = ObjectState.UNDEFINED
def getState(self) -> ObjectState:
return self.mState
def setState(self, state: ObjectState) -> None:
self.mState = state
def setObjectId(self, objId: str):
self.mObjectId = objId
def getObjectId(self):
return str(self.mObjectId)
def __str__(self):
return f"Object[ID={self.mObjectId},STATE={self.getState()}, ID={id(self)}]"
def __repr__(self):
return f"Object[ID={self.mObjectId},STATE={self.getState()}, ID={id(self)}]"
class Object(IObject):
def __init__(self):
super().__init__()
self.mModel = ObjectModel(self)
def setState(self, state: ObjectState):
self.mState = state
def getIObjectModel(self):
return self.mModel
def getObjectModel(self):
return self.mModel
def split(self, modelList: List[ObjectModel]):
outSplittedModel: List[ObjectModel] = list()
maxPoints = 0
index = 0
for i, om in enumerate(modelList):
nbPoints = ObjectModel.getMatchingPointNumber(self.mModel, om)
log.debug(f"{om.getLastBoundingBox()}")
log.debug(f"nbpoints is {nbPoints}")
if nbPoints > maxPoints:
maxPoints = nbPoints
index = i
# find which new blob is most similar to old object
keep: ObjectModel = modelList[index]
for i in range(len(modelList)):
if i != index:
self.mModel.extractObjectModel(modelList[i]) # checked
modelList[i].updateInGroupBlobs()
outSplittedModel.append(modelList[i])
log.debug(f"{modelList[i].getBlobs().keys()}")
self.mModel.moveObjectModel(keep)
self.mModel.updateInGroupBlobs()
return keep, outSplittedModel
class ObjectGroup(IObject):
def __init__(self):
super().__init__()
self.mModel: ObjectModelGroup = ObjectModelGroup(self)
self.mObjectList: List[Object] = list()
self.mObjectToObjectModel: Dict[Object, IObjectModel] = dict()
self.mObjectModelToObject: Dict[IObjectModel, Object] = dict()
self.setState(ObjectState.OBJECTGROUP)
def getObjectModelGroup(self) -> ObjectModelGroup:
return self.mModel
def getIObjectModel(self):
return self.mModel
def getObjects(self) -> List[Object]:
return self.mObjectList
def clearObjectList(self):
self.mModel.clearObjectModel()
self.mObjectToObjectModel.clear()
self.mObjectModelToObject.clear()
self.mObjectList.clear()
def removeObject(self, o: Object):
if o in self.mObjectList:
self.mObjectList.remove(o)
del self.mObjectToObjectModel[o]
del self.mObjectModelToObject[o.getIObjectModel()]
def addObject(self, o: IObject):
if self == o:
return
if type(o) == ObjectGroup:
objectList: List[Object] = o.getObjects()
for oh in objectList:
self.addObject(oh)
objectList.clear()
elif type(o) == Object:
self.mObjectList.append(o)
o.setState(ObjectState.INGROUP)
self.mModel.addObjectModel(o.getObjectModel())
self.mObjectToObjectModel[o] = o.getObjectModel()
self.mObjectModelToObject[o.getObjectModel()] = o
name = [str(m.getObjectId()) for m in self.mObjectList]
name = ", ".join(name)
super().setObjectId(name)
else:
assert False