in utils/house3d.py [0:0]
def set_target_object(self, obj, room):
object_tp = room['id'] + '_' + obj['id'] + '_' + obj['fine_class'].lower(
)
# Caching
if object_tp in self.env.house.connMapDict:
self.env.house.connMap, self.env.house.connectedCoors, self.env.house.inroomDist, self.env.house.maxConnDist = self.env.house.connMapDict[
object_tp]
return True # object changed!
elif os.path.exists(
os.path.join(
self.target_obj_conn_map_dir,
self.env.house.house['id'] + '_' + object_tp + '.npy')):
self.env.house.connMap = np.load(
os.path.join(
self.target_obj_conn_map_dir,
self.env.house.house['id'] + '_' + object_tp + '.npy'))
if self.env.house.connMap.shape[0] == self.env.house.n_row+1:
self.env.house.connectedCoors, self.env.house.inroomDist, self.env.house.maxConnDist = None, None, None
return True
self.env.house.connMap = connMap = np.ones(
(self.env.house.n_row + 1, self.env.house.n_row + 1),
dtype=np.int32) * -1
self.env.house.inroomDist = inroomDist = np.ones(
(self.env.house.n_row + 1, self.env.house.n_row + 1),
dtype=np.float32) * -1
dirs = [[0, 1], [1, 0], [-1, 0], [0, -1]]
que = []
flag_find_open_components = True
_ox1, _, _oy1 = obj['bbox']['min']
_ox2, _, _oy2 = obj['bbox']['max']
ocx, ocy = (_ox1 + _ox2) / 2, (_oy1 + _oy2) / 2
ox1, oy1, ox2, oy2 = self.env.house.rescale(_ox1, _oy1, _ox2, _oy2)
for _ in range(2):
_x1, _, _y1 = room['bbox']['min']
_x2, _, _y2 = room['bbox']['max']
cx, cy = (_x1 + _x2) / 2, (_y1 + _y2) / 2
x1, y1, x2, y2 = self.env.house.rescale(_x1, _y1, _x2, _y2)
curr_components = self.env.house._find_components(
x1,
y1,
x2,
y2,
dirs=dirs,
return_open=flag_find_open_components
) # find all the open components
if len(curr_components) == 0:
print('No space found! =(')
raise ValueError('no space')
if isinstance(curr_components[0],
list): # join all the coors in the open components
curr_major_coors = list(itertools.chain(*curr_components))
else:
curr_major_coors = curr_components
min_dist_to_center, min_dist_to_edge = 1e50, 1e50
for x, y in curr_major_coors:
###
# Compute minimum dist to edge here
if x in range(ox1, ox2):
dx = 0
elif x < ox1:
dx = ox1 - x
else:
dx = x - ox2
if y in range(oy1, oy2):
dy = 0
elif y < oy1:
dy = oy1 - y
else:
dy = y - oy2
assert dx >= 0 and dy >= 0
if dx != 0 or dy != 0:
dd = np.sqrt(dx**2 + dy**2)
elif dx == 0:
dd = dy
else:
dd = dx
if dd < min_dist_to_edge:
min_dist_to_edge = int(np.ceil(dd))
###
tx, ty = self.env.house.to_coor(x, y)
tdist = np.sqrt((tx - ocx)**2 + (ty - ocy)**2)
if tdist < min_dist_to_center:
min_dist_to_center = tdist
inroomDist[x, y] = tdist
margin = min_dist_to_edge + 1
for x, y in curr_major_coors:
inroomDist[x, y] -= min_dist_to_center
for x, y in curr_major_coors:
if x in range(ox1 - margin, ox2 + margin) and y in range(
oy1 - margin, oy2 + margin):
connMap[x, y] = 0
que.append((x, y))
if len(que) > 0: break
if flag_find_open_components:
flag_find_open_components = False
else:
break
raise ValueError
ptr = 0
self.env.house.maxConnDist = 1
while ptr < len(que):
x, y = que[ptr]
cur_dist = connMap[x, y]
ptr += 1
for dx, dy in dirs:
tx, ty = x + dx, y + dy
if self.env.house.inside(tx, ty) and self.env.house.canMove(
tx, ty) and not self.env.house.isConnect(tx, ty):
que.append((tx, ty))
connMap[tx, ty] = cur_dist + 1
if cur_dist + 1 > self.env.house.maxConnDist:
self.env.house.maxConnDist = cur_dist + 1
self.env.house.connMapDict[object_tp] = (connMap, que, inroomDist,
self.env.house.maxConnDist)
np.save(
os.path.join(
self.target_obj_conn_map_dir,
self.env.house.house['id'] + '_' + object_tp + '.npy'),
connMap)
self.connectedCoors = que
print(' >>>> ConnMap Cached!')
return True # room changed!