Spaces:
Runtime error
Runtime error
Zai
commited on
Commit
·
c2ea21f
1
Parent(s):
b4ef065
tada
Browse filesThis view is limited to 50 files because it contains too many changes.
See raw diff
- House/__init__.py +0 -0
- House/__pycache__/__init__.cpython-311.pyc +0 -0
- House/__pycache__/__init__.cpython-37.pyc +0 -0
- House/__pycache__/settings.cpython-311.pyc +0 -0
- House/__pycache__/settings.cpython-37.pyc +0 -0
- House/__pycache__/urls.cpython-311.pyc +0 -0
- House/__pycache__/urls.cpython-37.pyc +0 -0
- House/__pycache__/wsgi.cpython-37.pyc +0 -0
- House/asgi.py +16 -0
- House/settings.py +127 -0
- House/urls.py +37 -0
- House/wsgi.py +16 -0
- Houseweb/__init__.py +0 -0
- Houseweb/__pycache__/__init__.cpython-311.pyc +0 -0
- Houseweb/__pycache__/__init__.cpython-37.pyc +0 -0
- Houseweb/__pycache__/create.cpython-37.pyc +0 -0
- Houseweb/__pycache__/floorplan2.cpython-37.pyc +0 -0
- Houseweb/__pycache__/network.cpython-37.pyc +0 -0
- Houseweb/__pycache__/utils.cpython-37.pyc +0 -0
- Houseweb/__pycache__/utils1.cpython-37.pyc +0 -0
- Houseweb/__pycache__/views.cpython-311.pyc +0 -0
- Houseweb/__pycache__/views.cpython-37.pyc +0 -0
- Houseweb/admin.py +3 -0
- Houseweb/apps.py +5 -0
- Houseweb/migrations/__init__.py +0 -0
- Houseweb/models.py +3 -0
- Houseweb/tests.py +3 -0
- Houseweb/views.py +757 -0
- Img/data.mat.png +0 -0
- Img/data_test_converted.png +0 -0
- Img/data_train_converted.png +0 -0
- Img/interface.jpg +0 -0
- Img/paper.png +0 -0
- align_fp/align_adjacent_room3.m +121 -0
- align_fp/align_fp.m +108 -0
- align_fp/align_neighbor.m +53 -0
- align_fp/align_with_boundary.m +29 -0
- align_fp/find_close_seg.m +74 -0
- align_fp/find_room_order.m +29 -0
- align_fp/get_entrance_space.m +14 -0
- align_fp/get_room_boundary.m +25 -0
- align_fp/regularize_fp.m +111 -0
- align_fp/shrink_box.m +61 -0
- db.sqlite3 +0 -0
- manage.py +21 -0
- model/__pycache__/_floorplan2.cpython-37.pyc +0 -0
- model/__pycache__/add_archs.cpython-37.pyc +0 -0
- model/__pycache__/box_utils.cpython-37.pyc +0 -0
- model/__pycache__/crn.cpython-37.pyc +0 -0
- model/__pycache__/floorplan.cpython-311.pyc +0 -0
House/__init__.py
ADDED
File without changes
|
House/__pycache__/__init__.cpython-311.pyc
ADDED
Binary file (191 Bytes). View file
|
|
House/__pycache__/__init__.cpython-37.pyc
ADDED
Binary file (157 Bytes). View file
|
|
House/__pycache__/settings.cpython-311.pyc
ADDED
Binary file (3.1 kB). View file
|
|
House/__pycache__/settings.cpython-37.pyc
ADDED
Binary file (2.38 kB). View file
|
|
House/__pycache__/urls.cpython-311.pyc
ADDED
Binary file (1.92 kB). View file
|
|
House/__pycache__/urls.cpython-37.pyc
ADDED
Binary file (1.4 kB). View file
|
|
House/__pycache__/wsgi.cpython-37.pyc
ADDED
Binary file (536 Bytes). View file
|
|
House/asgi.py
ADDED
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""
|
2 |
+
ASGI config for House project.
|
3 |
+
|
4 |
+
It exposes the ASGI callable as a module-level variable named ``application``.
|
5 |
+
|
6 |
+
For more information on this file, see
|
7 |
+
https://docs.djangoproject.com/en/3.0/howto/deployment/asgi/
|
8 |
+
"""
|
9 |
+
|
10 |
+
import os
|
11 |
+
|
12 |
+
from django.core.asgi import get_asgi_application
|
13 |
+
|
14 |
+
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'House.settings')
|
15 |
+
|
16 |
+
application = get_asgi_application()
|
House/settings.py
ADDED
@@ -0,0 +1,127 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""
|
2 |
+
Django settings for House project.
|
3 |
+
|
4 |
+
Generated by 'django-admin startproject' using Django 3.0.2.
|
5 |
+
|
6 |
+
For more information on this file, see
|
7 |
+
https://docs.djangoproject.com/en/3.0/topics/settings/
|
8 |
+
|
9 |
+
For the full list of settings and their values, see
|
10 |
+
https://docs.djangoproject.com/en/3.0/ref/settings/
|
11 |
+
"""
|
12 |
+
|
13 |
+
import os
|
14 |
+
|
15 |
+
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
|
16 |
+
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
17 |
+
|
18 |
+
|
19 |
+
# Quick-start development settings - unsuitable for production
|
20 |
+
# See https://docs.djangoproject.com/en/3.0/howto/deployment/checklist/
|
21 |
+
|
22 |
+
# SECURITY WARNING: keep the secret key used in production secret!
|
23 |
+
SECRET_KEY = 'y&ol628+upm0r&=8pilr@u_w_0ji!1afp!st*y#ympn3u@!3s%'
|
24 |
+
|
25 |
+
# SECURITY WARNING: don't run with debug turned on in production!
|
26 |
+
DEBUG = True
|
27 |
+
|
28 |
+
ALLOWED_HOSTS = []
|
29 |
+
|
30 |
+
|
31 |
+
# Application definition
|
32 |
+
|
33 |
+
INSTALLED_APPS = [
|
34 |
+
'django.contrib.admin',
|
35 |
+
'django.contrib.auth',
|
36 |
+
'django.contrib.contenttypes',
|
37 |
+
'django.contrib.sessions',
|
38 |
+
'django.contrib.messages',
|
39 |
+
'django.contrib.staticfiles',
|
40 |
+
]
|
41 |
+
|
42 |
+
MIDDLEWARE = [
|
43 |
+
'django.middleware.security.SecurityMiddleware',
|
44 |
+
'django.contrib.sessions.middleware.SessionMiddleware',
|
45 |
+
'django.middleware.common.CommonMiddleware',
|
46 |
+
'django.middleware.csrf.CsrfViewMiddleware',
|
47 |
+
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
48 |
+
'django.contrib.messages.middleware.MessageMiddleware',
|
49 |
+
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
50 |
+
]
|
51 |
+
|
52 |
+
ROOT_URLCONF = 'House.urls'
|
53 |
+
|
54 |
+
TEMPLATES = [
|
55 |
+
{
|
56 |
+
'BACKEND': 'django.template.backends.django.DjangoTemplates',
|
57 |
+
'DIRS': [os.path.join(BASE_DIR, 'templates')]
|
58 |
+
,
|
59 |
+
'APP_DIRS': True,
|
60 |
+
'OPTIONS': {
|
61 |
+
'context_processors': [
|
62 |
+
'django.template.context_processors.debug',
|
63 |
+
'django.template.context_processors.request',
|
64 |
+
'django.contrib.auth.context_processors.auth',
|
65 |
+
'django.contrib.messages.context_processors.messages',
|
66 |
+
],
|
67 |
+
},
|
68 |
+
},
|
69 |
+
]
|
70 |
+
|
71 |
+
WSGI_APPLICATION = 'House.wsgi.application'
|
72 |
+
|
73 |
+
|
74 |
+
# Database
|
75 |
+
# https://docs.djangoproject.com/en/3.0/ref/settings/#databases
|
76 |
+
|
77 |
+
DATABASES = {
|
78 |
+
'default': {
|
79 |
+
'ENGINE': 'django.db.backends.sqlite3',
|
80 |
+
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
|
81 |
+
}
|
82 |
+
}
|
83 |
+
|
84 |
+
|
85 |
+
# Password validation
|
86 |
+
# https://docs.djangoproject.com/en/3.0/ref/settings/#auth-password-validators
|
87 |
+
|
88 |
+
AUTH_PASSWORD_VALIDATORS = [
|
89 |
+
{
|
90 |
+
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
|
91 |
+
},
|
92 |
+
{
|
93 |
+
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
|
94 |
+
},
|
95 |
+
{
|
96 |
+
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
|
97 |
+
},
|
98 |
+
{
|
99 |
+
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
|
100 |
+
},
|
101 |
+
]
|
102 |
+
|
103 |
+
|
104 |
+
# Internationalization
|
105 |
+
# https://docs.djangoproject.com/en/3.0/topics/i18n/
|
106 |
+
|
107 |
+
LANGUAGE_CODE = 'en-us'
|
108 |
+
|
109 |
+
TIME_ZONE = 'UTC'
|
110 |
+
|
111 |
+
USE_I18N = True
|
112 |
+
|
113 |
+
USE_L10N = True
|
114 |
+
|
115 |
+
USE_TZ = True
|
116 |
+
|
117 |
+
|
118 |
+
# Static files (CSS, JavaScript, Images)
|
119 |
+
# https://docs.djangoproject.com/en/3.0/howto/static-files/
|
120 |
+
|
121 |
+
STATIC_URL = '/static/'
|
122 |
+
HERE = os.path.dirname(os.path.abspath(__file__))
|
123 |
+
HERE = os.path.join(HERE, '../')
|
124 |
+
STATICFILES_DIRS = (
|
125 |
+
os.path.join(HERE, 'static/'),
|
126 |
+
)
|
127 |
+
ALLOWED_HOSTS = ['*']
|
House/urls.py
ADDED
@@ -0,0 +1,37 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""House URL Configuration
|
2 |
+
|
3 |
+
The `urlpatterns` list routes URLs to views. For more information please see:
|
4 |
+
https://docs.djangoproject.com/en/3.0/topics/http/urls/
|
5 |
+
Examples:
|
6 |
+
Function views
|
7 |
+
1. Add an import: from my_app import views
|
8 |
+
2. Add a URL to urlpatterns: path('', views.home, name='home')
|
9 |
+
Class-based views
|
10 |
+
1. Add an import: from other_app.views import Home
|
11 |
+
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
|
12 |
+
Including another URLconf
|
13 |
+
1. Import the include() function: from django.urls import include, path
|
14 |
+
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
|
15 |
+
"""
|
16 |
+
from django.contrib import admin
|
17 |
+
from django.urls import path
|
18 |
+
|
19 |
+
from Houseweb import views
|
20 |
+
|
21 |
+
urlpatterns = [
|
22 |
+
# path('admin/', admin.site.urls),
|
23 |
+
path('index/LoadTestBoundary', views.LoadTestBoundary),
|
24 |
+
path('index/NumSearch/', views.NumSearch),
|
25 |
+
path(r'index/LoadTrainHouse/', views.LoadTrainHouse),
|
26 |
+
path(r'index/TransGraph/', views.TransGraph),
|
27 |
+
path(r'index/TransGraph_net/', views.TransGraph_net),
|
28 |
+
path(r'index/Init/', views.Init),
|
29 |
+
path(r'index/AdjustGraph/', views.AdjustGraph),
|
30 |
+
path(r'index/GraphSearch/', views.GraphSearch),
|
31 |
+
path(r'index/RelBox/', views.RelBox),
|
32 |
+
path(r'index/Save_Editbox/', views.Save_Editbox),
|
33 |
+
|
34 |
+
path('home', views.home),
|
35 |
+
|
36 |
+
|
37 |
+
]
|
House/wsgi.py
ADDED
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""
|
2 |
+
WSGI config for House project.
|
3 |
+
|
4 |
+
It exposes the WSGI callable as a module-level variable named ``application``.
|
5 |
+
|
6 |
+
For more information on this file, see
|
7 |
+
https://docs.djangoproject.com/en/3.0/howto/deployment/wsgi/
|
8 |
+
"""
|
9 |
+
|
10 |
+
import os
|
11 |
+
|
12 |
+
from django.core.wsgi import get_wsgi_application
|
13 |
+
|
14 |
+
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'House.settings')
|
15 |
+
|
16 |
+
application = get_wsgi_application()
|
Houseweb/__init__.py
ADDED
File without changes
|
Houseweb/__pycache__/__init__.cpython-311.pyc
ADDED
Binary file (194 Bytes). View file
|
|
Houseweb/__pycache__/__init__.cpython-37.pyc
ADDED
Binary file (160 Bytes). View file
|
|
Houseweb/__pycache__/create.cpython-37.pyc
ADDED
Binary file (3.27 kB). View file
|
|
Houseweb/__pycache__/floorplan2.cpython-37.pyc
ADDED
Binary file (19.5 kB). View file
|
|
Houseweb/__pycache__/network.cpython-37.pyc
ADDED
Binary file (3.89 kB). View file
|
|
Houseweb/__pycache__/utils.cpython-37.pyc
ADDED
Binary file (9.39 kB). View file
|
|
Houseweb/__pycache__/utils1.cpython-37.pyc
ADDED
Binary file (7.52 kB). View file
|
|
Houseweb/__pycache__/views.cpython-311.pyc
ADDED
Binary file (54.4 kB). View file
|
|
Houseweb/__pycache__/views.cpython-37.pyc
ADDED
Binary file (23.6 kB). View file
|
|
Houseweb/admin.py
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
from django.contrib import admin
|
2 |
+
|
3 |
+
# Register your models here.
|
Houseweb/apps.py
ADDED
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from django.apps import AppConfig
|
2 |
+
|
3 |
+
|
4 |
+
class HousewebConfig(AppConfig):
|
5 |
+
name = 'Houseweb'
|
Houseweb/migrations/__init__.py
ADDED
File without changes
|
Houseweb/models.py
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
from django.db import models
|
2 |
+
|
3 |
+
# Create your models here.
|
Houseweb/tests.py
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
from django.test import TestCase
|
2 |
+
|
3 |
+
# Create your tests here.
|
Houseweb/views.py
ADDED
@@ -0,0 +1,757 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from django.shortcuts import render
|
2 |
+
from django.http import HttpResponse, JsonResponse
|
3 |
+
import json
|
4 |
+
import model.test as mltest
|
5 |
+
import model.utils as mdul
|
6 |
+
from model.floorplan import *
|
7 |
+
import retrieval.retrieval as rt
|
8 |
+
import time
|
9 |
+
import pickle
|
10 |
+
import scipy.io as sio
|
11 |
+
import numpy as np
|
12 |
+
from model.decorate import *
|
13 |
+
import math
|
14 |
+
import pandas as pd
|
15 |
+
import matlab.engine
|
16 |
+
|
17 |
+
global test_data, test_data_topk, testNameList, trainNameList
|
18 |
+
global train_data, trainNameList, trainTF, train_data_eNum, train_data_rNum
|
19 |
+
global engview, model
|
20 |
+
global tf_train, centroids, clusters
|
21 |
+
|
22 |
+
|
23 |
+
def home(request):
|
24 |
+
return render(request, "home.html", )
|
25 |
+
|
26 |
+
|
27 |
+
def Init(request):
|
28 |
+
start = time.clock()
|
29 |
+
getTestData()
|
30 |
+
getTrainData()
|
31 |
+
loadMatlabEng()
|
32 |
+
loadModel()
|
33 |
+
loadRetrieval()
|
34 |
+
end = time.clock()
|
35 |
+
print('Init(model+test+train+engine+retrieval) time: %s Seconds' % (end - start))
|
36 |
+
|
37 |
+
return HttpResponse(None)
|
38 |
+
|
39 |
+
|
40 |
+
def loadMatlabEng():
|
41 |
+
startengview = time.clock()
|
42 |
+
global engview
|
43 |
+
engview = matlab.engine.start_matlab()
|
44 |
+
engview.addpath(r'./align_fp/', nargout=0)
|
45 |
+
endengview = time.clock()
|
46 |
+
print(' matlab.engineview time: %s Seconds' % (endengview - startengview))
|
47 |
+
|
48 |
+
|
49 |
+
def loadRetrieval():
|
50 |
+
global tf_train, centroids, clusters
|
51 |
+
t1 = time.clock()
|
52 |
+
tf_train = np.load('./retrieval/tf_train.npy')
|
53 |
+
centroids = np.load('./retrieval/centroids_train.npy')
|
54 |
+
clusters = np.load('./retrieval/clusters_train.npy')
|
55 |
+
t2 = time.clock()
|
56 |
+
print('load tf/centroids/clusters', t2 - t1)
|
57 |
+
|
58 |
+
|
59 |
+
def getTestData():
|
60 |
+
start = time.clock()
|
61 |
+
global test_data, testNameList, trainNameList
|
62 |
+
|
63 |
+
test_data = pickle.load(open('./static/Data/data_test_converted.pkl', 'rb'))
|
64 |
+
test_data, testNameList, trainNameList = test_data['data'], list(test_data['testNameList']), list(
|
65 |
+
test_data['trainNameList'])
|
66 |
+
end = time.clock()
|
67 |
+
print('getTestData time: %s Seconds' % (end - start))
|
68 |
+
|
69 |
+
|
70 |
+
def getTrainData():
|
71 |
+
start = time.clock()
|
72 |
+
global train_data, trainNameList, trainTF, train_data_eNum, train_data_rNum
|
73 |
+
|
74 |
+
train_data = pickle.load(open('./static/Data/data_train_converted.pkl', 'rb'))
|
75 |
+
train_data, trainNameList, trainTF = train_data['data'], list(train_data['nameList']), list(train_data['trainTF'])
|
76 |
+
|
77 |
+
train_data_eNum = pickle.load(open('./static/Data/data_train_eNum.pkl', 'rb'))
|
78 |
+
train_data_eNum = train_data_eNum['eNum']
|
79 |
+
train_data_rNum = np.load('./static/Data/rNum_train.npy')
|
80 |
+
|
81 |
+
end = time.clock()
|
82 |
+
print('getTrainData time: %s Seconds' % (end - start))
|
83 |
+
|
84 |
+
|
85 |
+
def loadModel():
|
86 |
+
global model, train_data, trainNameList
|
87 |
+
start = time.clock()
|
88 |
+
model = mltest.load_model()
|
89 |
+
end = time.clock()
|
90 |
+
print('loadModel time: %s Seconds' % (end - start))
|
91 |
+
start = time.clock()
|
92 |
+
test = train_data[trainNameList.index("75119")]
|
93 |
+
mltest.test(model, FloorPlan(test, train=True))
|
94 |
+
end = time.clock()
|
95 |
+
print('test Model time: %s Seconds' % (end - start))
|
96 |
+
|
97 |
+
|
98 |
+
def LoadTestBoundary(request):
|
99 |
+
start = time.clock()
|
100 |
+
testName = request.GET.get('testName').split(".")[0]
|
101 |
+
test_index = testNameList.index(testName)
|
102 |
+
data = test_data[test_index]
|
103 |
+
data_js = {}
|
104 |
+
data_js["door"] = str(data.boundary[0][0]) + "," + str(data.boundary[0][1]) + "," + str(
|
105 |
+
data.boundary[1][0]) + "," + str(data.boundary[1][1])
|
106 |
+
ex = ""
|
107 |
+
for i in range(len(data.boundary)):
|
108 |
+
ex = ex + str(data.boundary[i][0]) + "," + str(data.boundary[i][1]) + " "
|
109 |
+
data_js['exterior'] = ex
|
110 |
+
end = time.clock()
|
111 |
+
print('LoadTestBoundary time: %s Seconds' % (end - start))
|
112 |
+
return HttpResponse(json.dumps(data_js), content_type="application/json")
|
113 |
+
|
114 |
+
|
115 |
+
def get_filter_func(mask, acc, num):
|
116 |
+
filters = [
|
117 |
+
None if not mask else (
|
118 |
+
np.equal if acc[i] else np.greater_equal
|
119 |
+
)
|
120 |
+
for i in range(len(mask))
|
121 |
+
]
|
122 |
+
|
123 |
+
def filter_func(data):
|
124 |
+
for i in range(len(filters)):
|
125 |
+
if (filters[i] is not None) and (not filters[i](data[i], num[i])): return False
|
126 |
+
return True
|
127 |
+
|
128 |
+
return filter_func
|
129 |
+
|
130 |
+
|
131 |
+
def filter_graph(graph_):
|
132 |
+
filters = graph_
|
133 |
+
|
134 |
+
def filter_graphfunc(data):
|
135 |
+
sub = data - filters
|
136 |
+
return ((sub >= 0).all())
|
137 |
+
|
138 |
+
return filter_graphfunc
|
139 |
+
|
140 |
+
|
141 |
+
def NumSearch(request):
|
142 |
+
start = time.clock()
|
143 |
+
data_new = json.loads(request.GET.get("userInfo"))
|
144 |
+
testName = data_new[0].split(".")[0]
|
145 |
+
test_index = testNameList.index(testName)
|
146 |
+
topkList = []
|
147 |
+
topkList.clear()
|
148 |
+
data = test_data[test_index]
|
149 |
+
|
150 |
+
|
151 |
+
multi_clusters=False
|
152 |
+
test_data_topk = rt.retrieval(data, 1000,multi_clusters)
|
153 |
+
|
154 |
+
if len(data_new) > 1:
|
155 |
+
roomactarr = data_new[1]
|
156 |
+
roomexaarr = data_new[2]
|
157 |
+
roomnumarr = [int(x) for x in data_new[3]]
|
158 |
+
|
159 |
+
test_num = train_data_rNum[test_data_topk]
|
160 |
+
filter_func = get_filter_func(roomactarr, roomexaarr, roomnumarr)
|
161 |
+
indices = np.where(list(map(filter_func, test_num)))
|
162 |
+
indices = list(indices)
|
163 |
+
if len(indices[0]) < 20:
|
164 |
+
topk = len(indices[0])
|
165 |
+
else:
|
166 |
+
topk = 20
|
167 |
+
topkList.clear()
|
168 |
+
for i in range(topk):
|
169 |
+
topkList.append(str(trainNameList[int(test_data_topk[indices[0][i]])]) + ".png")
|
170 |
+
end = time.clock()
|
171 |
+
print('NumberSearch time: %s Seconds' % (end - start))
|
172 |
+
return HttpResponse(json.dumps(topkList), content_type="application/json")
|
173 |
+
|
174 |
+
|
175 |
+
def FindTraindata(trainname):
|
176 |
+
start = time.clock()
|
177 |
+
train_index = trainNameList.index(trainname)
|
178 |
+
data = train_data[train_index]
|
179 |
+
data_js = {}
|
180 |
+
data_js["hsname"] = trainname
|
181 |
+
|
182 |
+
data_js["door"] = str(data.boundary[0][0]) + "," + str(data.boundary[0][1]) + "," + str(
|
183 |
+
data.boundary[1][0]) + "," + str(data.boundary[1][1])
|
184 |
+
print("testboundary", data_js["door"])
|
185 |
+
ex = ""
|
186 |
+
for i in range(len(data.boundary)):
|
187 |
+
ex = ex + str(data.boundary[i][0]) + "," + str(data.boundary[i][1]) + " "
|
188 |
+
data_js['exterior'] = ex
|
189 |
+
|
190 |
+
data_js["hsedge"] = [[int(u), int(v)] for u, v in data.edge[:, [0, 1]]]
|
191 |
+
|
192 |
+
hsbox = [[[float(x1), float(y1), float(x2), float(y2)], [mdul.room_label[cate][1]]] for
|
193 |
+
x1, y1, x2, y2, cate in data.box[:]]
|
194 |
+
external = np.asarray(data.boundary)
|
195 |
+
xmin, xmax = np.min(external[:, 0]), np.max(external[:, 0])
|
196 |
+
ymin, ymax = np.min(external[:, 1]), np.max(external[:, 1])
|
197 |
+
|
198 |
+
area_ = (ymax - ymin) * (xmax - xmin)
|
199 |
+
|
200 |
+
data_js["rmsize"] = [
|
201 |
+
[[20 * math.sqrt((float(x2) - float(x1)) * (float(y2) - float(y1)) / float(area_))], [mdul.room_label[cate][1]]]
|
202 |
+
for
|
203 |
+
x1, y1, x2, y2, cate in data.box[:]]
|
204 |
+
|
205 |
+
|
206 |
+
box_order = data.order
|
207 |
+
data_js["hsbox"] = []
|
208 |
+
for i in range(len(box_order)):
|
209 |
+
data_js["hsbox"].append(hsbox[int(float(box_order[i])) - 1])
|
210 |
+
|
211 |
+
data_js["rmpos"] = [[int(cate), str(mdul.room_label[cate][1]), float((x1 + x2) / 2), float((y1 + y2) / 2)] for
|
212 |
+
x1, y1, x2, y2, cate in data.box[:]]
|
213 |
+
end = time.clock()
|
214 |
+
print('find train data time: %s Seconds' % (end - start))
|
215 |
+
return data_js
|
216 |
+
|
217 |
+
|
218 |
+
def LoadTrainHouse(request):
|
219 |
+
trainname = request.GET.get("roomID").split(".")[0]
|
220 |
+
data_js = FindTraindata(trainname)
|
221 |
+
return HttpResponse(json.dumps(data_js), content_type="application/json")
|
222 |
+
|
223 |
+
|
224 |
+
'''
|
225 |
+
transfer the graph of the training data into the graph of the test data
|
226 |
+
'''
|
227 |
+
|
228 |
+
|
229 |
+
def TransGraph(request):
|
230 |
+
start = time.clock()
|
231 |
+
userInfo = request.GET.get("userInfo")
|
232 |
+
testname = userInfo.split(',')[0]
|
233 |
+
trainname = request.GET.get("roomID")
|
234 |
+
mlresult = mltest.get_userinfo(testname, trainname)
|
235 |
+
|
236 |
+
fp_end = mlresult
|
237 |
+
|
238 |
+
sio.savemat("./static/" + userInfo.split(',')[0].split('.')[0] + ".mat", {"data": fp_end.data})
|
239 |
+
|
240 |
+
data_js = {}
|
241 |
+
# fp_end hsedge
|
242 |
+
data_js["hsedge"] = (fp_end.get_triples(tensor=False)[:, [0, 2, 1]]).astype(np.float).tolist()
|
243 |
+
|
244 |
+
# fp_rmsize
|
245 |
+
external = np.asarray(fp_end.data.boundary)
|
246 |
+
xmin, xmax = np.min(external[:, 0]), np.max(external[:, 0])
|
247 |
+
ymin, ymax = np.min(external[:, 1]), np.max(external[:, 1])
|
248 |
+
area_ = (ymax - ymin) * (xmax - xmin)
|
249 |
+
data_js["rmsize"] = [
|
250 |
+
[[20 * math.sqrt((float(x2) - float(x1)) * (float(y2) - float(y1)) / float(area_))], [mdul.room_label[cate][1]]]
|
251 |
+
for
|
252 |
+
x1, y1, x2, y2, cate in fp_end.data.box[:]]
|
253 |
+
# fp_end rmpos
|
254 |
+
|
255 |
+
rooms = fp_end.get_rooms(tensor=False)
|
256 |
+
|
257 |
+
|
258 |
+
center = [[(x1 + x2) / 2, (y1 + y2) / 2] for x1, y1, x2, y2 in fp_end.data.box[:, :4]]
|
259 |
+
|
260 |
+
# boxes_pred
|
261 |
+
data_js["rmpos"] = []
|
262 |
+
for k in range(len(center)):
|
263 |
+
node = float(rooms[k]), mdul.room_label[int(rooms[k])][1], center[k][0], center[k][1], float(k)
|
264 |
+
data_js["rmpos"].append(node)
|
265 |
+
|
266 |
+
test_index = testNameList.index(testname.split(".")[0])
|
267 |
+
data = test_data[test_index]
|
268 |
+
ex = ""
|
269 |
+
for i in range(len(data.boundary)):
|
270 |
+
ex = ex + str(data.boundary[i][0]) + "," + str(data.boundary[i][1]) + " "
|
271 |
+
data_js['exterior'] = ex
|
272 |
+
data_js["door"] = str(data.boundary[0][0]) + "," + str(data.boundary[0][1]) + "," + str(
|
273 |
+
data.boundary[1][0]) + "," + str(data.boundary[1][1])
|
274 |
+
end = time.clock()
|
275 |
+
print('TransGraph time: %s Seconds' % (end - start))
|
276 |
+
return HttpResponse(json.dumps(data_js), content_type="application/json")
|
277 |
+
|
278 |
+
|
279 |
+
def AdjustGraph(request):
|
280 |
+
start = time.clock()
|
281 |
+
# newNode index-typename-cx-cy
|
282 |
+
# oldNode index-typename-cx-cy
|
283 |
+
# newEdge u-v
|
284 |
+
NewGraph = json.loads(request.GET.get("NewGraph"))
|
285 |
+
testname = request.GET.get("userRoomID")
|
286 |
+
trainname = request.GET.get("adptRoomID")
|
287 |
+
s = time.clock()
|
288 |
+
mlresult = mltest.get_userinfo_adjust(testname, trainname, NewGraph)
|
289 |
+
e = time.clock()
|
290 |
+
print('get_userinfo_adjust: %s Seconds' % (e - s))
|
291 |
+
fp_end = mlresult[0]
|
292 |
+
global boxes_pred
|
293 |
+
boxes_pred = mlresult[1]
|
294 |
+
|
295 |
+
data_js = {}
|
296 |
+
data_js["hsedge"] = (fp_end.get_triples(tensor=False)[:, [0, 2, 1]]).astype(np.float).tolist()
|
297 |
+
|
298 |
+
rooms = fp_end.get_rooms(tensor=False)
|
299 |
+
center = [[(x1 + x2) / 2, (y1 + y2) / 2] for x1, y1, x2, y2 in fp_end.data.box[:, :4]]
|
300 |
+
|
301 |
+
box_order = mlresult[2]
|
302 |
+
'''
|
303 |
+
handle the information of the room boxes
|
304 |
+
boxes_pred: the prediction from net
|
305 |
+
box_order: The order in which boxes are drawn
|
306 |
+
|
307 |
+
'''
|
308 |
+
room = []
|
309 |
+
for o in range(len(box_order)):
|
310 |
+
room.append(float((rooms[int(float(box_order[o][0])) - 1])))
|
311 |
+
boxes_end = []
|
312 |
+
for i in range(len(box_order)):
|
313 |
+
tmp = []
|
314 |
+
for j in range(4):
|
315 |
+
tmp.append(float(boxes_pred[int(float(box_order[i][0])) - 1][j]))
|
316 |
+
boxes_end.append(tmp)
|
317 |
+
|
318 |
+
data_js['roomret'] = []
|
319 |
+
for k in range(len(room)):
|
320 |
+
data = boxes_end[k], [mdul.room_label[int(room[k])][1]], box_order[k][0] - 1
|
321 |
+
data_js['roomret'].append(data)
|
322 |
+
|
323 |
+
# change the box size
|
324 |
+
global relbox
|
325 |
+
relbox = data_js['roomret']
|
326 |
+
global reledge
|
327 |
+
reledge = data_js["hsedge"]
|
328 |
+
|
329 |
+
test_index = testNameList.index(testname.split(".")[0])
|
330 |
+
data = test_data[test_index]
|
331 |
+
ex = ""
|
332 |
+
for i in range(len(data.boundary)):
|
333 |
+
ex = ex + str(data.boundary[i][0]) + "," + str(data.boundary[i][1]) + " "
|
334 |
+
data_js['exterior'] = ex
|
335 |
+
data_js["door"] = str(data.boundary[0][0]) + "," + str(data.boundary[0][1]) + "," + str(
|
336 |
+
data.boundary[1][0]) + "," + str(data.boundary[1][1])
|
337 |
+
|
338 |
+
external = np.asarray(data.boundary)
|
339 |
+
xmin, xmax = np.min(external[:, 0]), np.max(external[:, 0])
|
340 |
+
ymin, ymax = np.min(external[:, 1]), np.max(external[:, 1])
|
341 |
+
area_ = (ymax - ymin) * (xmax - xmin)
|
342 |
+
data_js['rmsize'] = []
|
343 |
+
for i in range(len(data_js['roomret'])):
|
344 |
+
rmsize = 20 * math.sqrt((float(data_js['roomret'][i][0][2]) - float(data_js['roomret'][i][0][0])) * (
|
345 |
+
float(data_js['roomret'][i][0][3]) - float(data_js['roomret'][i][0][1])) / float(area_)), \
|
346 |
+
data_js["roomret"][i][1][0]
|
347 |
+
data_js["rmsize"].append(rmsize)
|
348 |
+
|
349 |
+
data_js["rmpos"] = []
|
350 |
+
|
351 |
+
newGraph = NewGraph[0]
|
352 |
+
for i in range(len(data_js['roomret'])):
|
353 |
+
for k in range(len(newGraph)):
|
354 |
+
if (data_js['roomret'][i][1][0] == newGraph[k][1]):
|
355 |
+
x_center = int((data_js['roomret'][i][0][0] + data_js['roomret'][i][0][2]) / 2)
|
356 |
+
y_center = int((data_js['roomret'][i][0][1] + data_js['roomret'][i][0][3]) / 2)
|
357 |
+
x_graph = newGraph[k][2]
|
358 |
+
y_graph = newGraph[k][3]
|
359 |
+
if ((int(x_graph - 30) < x_center < int(x_graph + 30))):
|
360 |
+
node = float(rooms[k]), newGraph[k][1], x_center, y_center, float(
|
361 |
+
newGraph[k][0])
|
362 |
+
data_js["rmpos"].append(node)
|
363 |
+
newGraph.pop(k)
|
364 |
+
break
|
365 |
+
if ((int(y_graph - 30) < y_center < int(y_graph + 30))):
|
366 |
+
node = float(rooms[k]), newGraph[k][1], x_center, y_center, float(
|
367 |
+
newGraph[k][0])
|
368 |
+
data_js["rmpos"].append(node)
|
369 |
+
newGraph.pop(k)
|
370 |
+
|
371 |
+
break
|
372 |
+
|
373 |
+
fp_end.data = add_dw_fp(fp_end.data)
|
374 |
+
data_js["indoor"] = []
|
375 |
+
|
376 |
+
boundary = data.boundary
|
377 |
+
|
378 |
+
isNew = boundary[:, 3]
|
379 |
+
frontDoor = boundary[[0, 1]]
|
380 |
+
frontDoor = frontDoor[:, [0, 1]]
|
381 |
+
frontsum = frontDoor.sum(axis=1).tolist()
|
382 |
+
idx = frontsum.index(min(frontsum))
|
383 |
+
wallThickness = 3
|
384 |
+
if idx == 1:
|
385 |
+
frontDoor = frontDoor[[1, 0], :]
|
386 |
+
orient = boundary[0][2]
|
387 |
+
if orient == 0 or orient == 2:
|
388 |
+
frontDoor[0][0] = frontDoor[0][0] + wallThickness / 4
|
389 |
+
frontDoor[1][0] = frontDoor[1][0] - wallThickness / 4
|
390 |
+
if orient == 1 or orient == 3:
|
391 |
+
frontDoor[0][1] = frontDoor[0][1] + wallThickness / 4
|
392 |
+
frontDoor[1][1] = frontDoor[1][1] - wallThickness / 4
|
393 |
+
|
394 |
+
|
395 |
+
data_js["windows"] = []
|
396 |
+
for indx, x, y, w, h, r in fp_end.data.windows:
|
397 |
+
if w != 0:
|
398 |
+
tmp = [x + 2, y - 2, w - 2, 4]
|
399 |
+
data_js["windows"].append(tmp)
|
400 |
+
if h != 0:
|
401 |
+
tmp = [x - 2, y, 4, h]
|
402 |
+
data_js["windows"].append(tmp)
|
403 |
+
data_js["windowsline"] = []
|
404 |
+
for indx, x, y, w, h, r in fp_end.data.windows:
|
405 |
+
if w != 0:
|
406 |
+
tmp = [x + 2, y, w + x, y]
|
407 |
+
data_js["windowsline"].append(tmp)
|
408 |
+
if h != 0:
|
409 |
+
tmp = [x, y, x, h + y]
|
410 |
+
data_js["windowsline"].append(tmp)
|
411 |
+
|
412 |
+
sio.savemat("./static/" + testname.split(',')[0].split('.')[0] + ".mat", {"data": fp_end.data})
|
413 |
+
|
414 |
+
end = time.clock()
|
415 |
+
print('AdjustGraph time: %s Seconds' % (end - start))
|
416 |
+
return HttpResponse(json.dumps(data_js), content_type="application/json")
|
417 |
+
|
418 |
+
|
419 |
+
def RelBox(request):
|
420 |
+
id = request.GET.get("selectRect")
|
421 |
+
print(id)
|
422 |
+
global relbox
|
423 |
+
global reledge
|
424 |
+
rdirgroup=get_dir(id,relbox,reledge)
|
425 |
+
return HttpResponse(json.dumps(rdirgroup), content_type="application/json")
|
426 |
+
|
427 |
+
def get_dir(id,relbox,reledge):
|
428 |
+
rel = []
|
429 |
+
selectindex = int(id.split("_")[1])
|
430 |
+
select = np.zeros(4).astype(int)
|
431 |
+
for i in range(len(relbox)):
|
432 |
+
a = math.ceil(relbox[i][0][0]), math.ceil(relbox[i][0][1]), math.ceil(relbox[i][0][2]), math.ceil(
|
433 |
+
relbox[i][0][3]), int(relbox[i][2])
|
434 |
+
rel.append(a)
|
435 |
+
if (selectindex == int(relbox[i][2])):
|
436 |
+
# select:x1,x0,y0,y1.relbox:x0,y0,x1,y1
|
437 |
+
select[0] = math.ceil(relbox[i][0][2])
|
438 |
+
select[1] = math.ceil(relbox[i][0][0])
|
439 |
+
select[2] = math.ceil(relbox[i][0][1])
|
440 |
+
select[3] = math.ceil(relbox[i][0][3])
|
441 |
+
rel = np.array(rel)
|
442 |
+
df = pd.DataFrame({'x0': rel[:, 0], 'y0': rel[:, 1], 'x1': rel[:, 2], 'y1': rel[:, 3], 'rindex': rel[:, 4]})
|
443 |
+
group_label = [(0, 'x1', "right"),
|
444 |
+
(1, 'x0', "left"),
|
445 |
+
(2, 'y0', "top"),
|
446 |
+
(3, 'y1', "down")]
|
447 |
+
dfgroup = []
|
448 |
+
for i in range(len(group_label)):
|
449 |
+
dfgroup.append(df.groupby(group_label[i][1], as_index=True).get_group(name=select[i]))
|
450 |
+
rdirgroup = []
|
451 |
+
for i in range(len(dfgroup)):
|
452 |
+
dir = dfgroup[i]
|
453 |
+
rdir = []
|
454 |
+
for k in range(len(dir)):
|
455 |
+
idx = (dir.loc[dir['rindex'] == (dir.iloc[[k]].values)[0][4]].index.values)[0]
|
456 |
+
rdir.append(relbox[idx][1][0].__str__() + "_" + (dir.iloc[[k]].values)[0][4].__str__())
|
457 |
+
rdirgroup.append(rdir)
|
458 |
+
reledge = np.array(reledge)
|
459 |
+
data1 = reledge[np.where((reledge[:, [0]] == selectindex))[0]]
|
460 |
+
data2 = reledge[np.where((reledge[:, [1]] == selectindex))[0]]
|
461 |
+
reledge1 = np.vstack((data1, data2))
|
462 |
+
return rdirgroup
|
463 |
+
def Save_Editbox(request):
|
464 |
+
global indxlist,boxes_pred
|
465 |
+
NewGraph = json.loads(request.GET.get("NewGraph"))
|
466 |
+
NewLay = json.loads(request.GET.get("NewLay"))
|
467 |
+
userRoomID = request.GET.get("userRoomID")
|
468 |
+
adptRoomID = request.GET.get("adptRoomID")
|
469 |
+
|
470 |
+
NewLay=np.array(NewLay)
|
471 |
+
NewLay=NewLay[np.argsort(NewLay[:, 1])][:,2:]
|
472 |
+
NewLay=NewLay.astype(float).tolist()
|
473 |
+
|
474 |
+
test_index = testNameList.index(userRoomID.split(".")[0])
|
475 |
+
test_ = test_data[test_index]
|
476 |
+
|
477 |
+
Boundary = test_.boundary
|
478 |
+
boundary=[[float(x),float(y),float(z),float(k)] for x,y,z,k in list(Boundary)]
|
479 |
+
test_fp =FloorPlan(test_)
|
480 |
+
|
481 |
+
train_index = trainNameList.index(adptRoomID.split(".")[0])
|
482 |
+
train_ =train_data[train_index]
|
483 |
+
train_fp =FloorPlan(train_,train=True)
|
484 |
+
fp_end = test_fp.adapt_graph(train_fp)
|
485 |
+
fp_end.adjust_graph()
|
486 |
+
newNode = NewGraph[0]
|
487 |
+
newEdge = NewGraph[1]
|
488 |
+
oldNode = NewGraph[2]
|
489 |
+
temp = []
|
490 |
+
for newindx, newrmname, newx, newy,scalesize in newNode:
|
491 |
+
for type, oldrmname, oldx, oldy, oldindx in oldNode:
|
492 |
+
if (int(newindx) == oldindx):
|
493 |
+
tmp=int(newindx), (newx - oldx), ( newy- oldy),float(scalesize)
|
494 |
+
temp.append(tmp)
|
495 |
+
newbox=[]
|
496 |
+
if mltest.adjust==True:
|
497 |
+
oldbox = []
|
498 |
+
for i in range(len(boxes_pred)):
|
499 |
+
indxtmp=[boxes_pred[i][0],boxes_pred[i][1],boxes_pred[i][2],boxes_pred[i][3],boxes_pred[i][0]]
|
500 |
+
oldbox.append(indxtmp)
|
501 |
+
if mltest.adjust==False:
|
502 |
+
indxlist=[]
|
503 |
+
oldbox=fp_end.data.box.tolist()
|
504 |
+
for i in range(len(oldbox)):
|
505 |
+
indxlist.append([oldbox[i][4]])
|
506 |
+
indxlist=np.array(indxlist)
|
507 |
+
adjust=True
|
508 |
+
oldbox=fp_end.data.box.tolist()
|
509 |
+
X=0
|
510 |
+
Y=0
|
511 |
+
for i in range(len(oldbox)):
|
512 |
+
X= X+(oldbox[i][2]-oldbox[i][0])
|
513 |
+
Y= Y+(oldbox[i][3]-oldbox[i][1])
|
514 |
+
x_ave=(X/len(oldbox))/2
|
515 |
+
y_ave=(Y/len(oldbox))/2
|
516 |
+
|
517 |
+
index_mapping = {}
|
518 |
+
# The room that already exists
|
519 |
+
# Move: Just by the distance
|
520 |
+
for newindx, tempx, tempy,scalesize in temp:
|
521 |
+
index_mapping[newindx] = len(newbox)
|
522 |
+
tmpbox=[]
|
523 |
+
scalesize = int(scalesize)
|
524 |
+
if scalesize<1:
|
525 |
+
scale = math.sqrt(scalesize)
|
526 |
+
scalex = (oldbox[newindx][2] - oldbox[newindx][0]) * (1 - scale) / 2
|
527 |
+
scaley = (oldbox[newindx][3] - oldbox[newindx][1]) * (1 - scale) / 2
|
528 |
+
tmpbox = [(oldbox[newindx][0] + tempx) + scalex, (oldbox[newindx][1] + tempy)+scaley,
|
529 |
+
(oldbox[newindx][2] + tempx) - scalex, (oldbox[newindx][3] + tempy) - scaley, oldbox[newindx][4]]
|
530 |
+
if scalesize == 1:
|
531 |
+
tmpbox = [(oldbox[newindx][0] + tempx) , (oldbox[newindx][1] + tempy) ,(oldbox[newindx][2] + tempx), (oldbox[newindx][3] + tempy), oldbox[newindx][4]]
|
532 |
+
|
533 |
+
if scalesize>1:
|
534 |
+
scale=math.sqrt(scalesize)
|
535 |
+
scalex = (oldbox[newindx][2] - oldbox[newindx][0]) * ( scale-1) / 2
|
536 |
+
scaley = (oldbox[newindx][3] - oldbox[newindx][1]) * (scale-1) / 2
|
537 |
+
tmpbox = [(oldbox[newindx][0] + tempx) - scalex, (oldbox[newindx][1] + tempy) - scaley,
|
538 |
+
(oldbox[newindx][2] + tempx) + scalex, (oldbox[newindx][3] + tempy) + scaley, oldbox[newindx][4]]
|
539 |
+
|
540 |
+
newbox.append(tmpbox)
|
541 |
+
|
542 |
+
# The room just added
|
543 |
+
# Move: The room node with the average size of the existing room
|
544 |
+
for newindx, newrmname, newx, newy,scalesize in newNode:
|
545 |
+
if int(newindx)>(len(oldbox)-1):
|
546 |
+
scalesize=int(scalesize)
|
547 |
+
index_mapping[int(newindx)] = (len(newbox))
|
548 |
+
tmpbox=[]
|
549 |
+
if scalesize < 1:
|
550 |
+
scale = math.sqrt(scalesize)
|
551 |
+
scalex = x_ave * (1 - scale) / 2
|
552 |
+
scaley = y_ave* (1 - scale) / 2
|
553 |
+
tmpbox = [(newx-x_ave) +scalex,(newy-y_ave) +scaley,(newx+x_ave)-scalex,(newy+y_ave)-scaley,vocab['object_name_to_idx'][newrmname]]
|
554 |
+
|
555 |
+
if scalesize == 1:
|
556 |
+
tmpbox = [(newx - x_ave), (newy - y_ave), (newx + x_ave), (newy + y_ave),vocab['object_name_to_idx'][newrmname]]
|
557 |
+
if scalesize > 1:
|
558 |
+
scale = math.sqrt(scalesize)
|
559 |
+
scalex = x_ave * (scale - 1) / 2
|
560 |
+
scaley = y_ave * (scale - 1) / 2
|
561 |
+
tmpbox = [(newx-x_ave) - scalex, (newy-y_ave) - scaley,(newx+x_ave) + scalex, (newy+y_ave) + scaley,vocab['object_name_to_idx'][newrmname]]
|
562 |
+
# tmpboxin = [(newx-x_ave) ,(newy-y_ave) ,(newx+x_ave) ,(newy+y_ave) ,vocab['object_name_to_idx'][newrmname]]
|
563 |
+
# print(tmpboxin)
|
564 |
+
# print(tmpbox)
|
565 |
+
# print(scalesize)
|
566 |
+
newbox.append(tmpbox)
|
567 |
+
|
568 |
+
fp_end.data.box=np.array(newbox)
|
569 |
+
|
570 |
+
adjust_Edge=[]
|
571 |
+
for u, v in newEdge:
|
572 |
+
tmp=[index_mapping[int(u)],index_mapping[int(v)], 0]
|
573 |
+
adjust_Edge.append(tmp)
|
574 |
+
fp_end.data.edge=np.array(adjust_Edge)
|
575 |
+
rType = fp_end.get_rooms(tensor=False)
|
576 |
+
|
577 |
+
rEdge = fp_end.get_triples(tensor=False)[:, [0, 2, 1]]
|
578 |
+
Edge = [[float(u), float(v), float(type2)] for u, v, type2 in rEdge]
|
579 |
+
Box=NewLay
|
580 |
+
boundary_mat = matlab.double(boundary)
|
581 |
+
rType_mat = matlab.double(rType.tolist())
|
582 |
+
Edge_mat = matlab.double(Edge)
|
583 |
+
Box_mat=matlab.double(Box)
|
584 |
+
fp_end.data.boundary =np.array(boundary)
|
585 |
+
fp_end.data.rType =np.array(rType).astype(int)
|
586 |
+
fp_end.data.refineBox=np.array(Box)
|
587 |
+
fp_end.data.rEdge=np.array(Edge)
|
588 |
+
|
589 |
+
box_refine = engview.align_fp(boundary_mat, Box_mat, rType_mat,Edge_mat ,18,False, nargout=3)
|
590 |
+
box_out=box_refine[0]
|
591 |
+
box_order=box_refine[1]
|
592 |
+
rBoundary=box_refine[2]
|
593 |
+
fp_end.data.newBox = np.array(box_out)
|
594 |
+
fp_end.data.order = np.array(box_order)
|
595 |
+
fp_end.data.rBoundary = [np.array(rb) for rb in rBoundary]
|
596 |
+
fp_end.data = add_dw_fp(fp_end.data)
|
597 |
+
sio.savemat("./static/" + userRoomID + ".mat", {"data": fp_end.data})
|
598 |
+
flag=1
|
599 |
+
return HttpResponse(json.dumps(flag), content_type="application/json")
|
600 |
+
|
601 |
+
|
602 |
+
def TransGraph_net(request):
|
603 |
+
userInfo = request.GET.get("userInfo")
|
604 |
+
testname = userInfo.split(',')[0]
|
605 |
+
trainname = request.GET.get("roomID")
|
606 |
+
mlresult = mltest.get_userinfo_net(testname, trainname)
|
607 |
+
|
608 |
+
fp_end = mlresult[0]
|
609 |
+
boxes_pred = mlresult[1]
|
610 |
+
|
611 |
+
data_js = {}
|
612 |
+
# fp_end hsedge
|
613 |
+
data_js["hsedge"] = (fp_end.get_triples(tensor=False)[:, [0, 2, 1]]).astype(np.float).tolist()
|
614 |
+
|
615 |
+
# fp_end rmpos
|
616 |
+
rooms = fp_end.get_rooms(tensor=False)
|
617 |
+
room = rooms
|
618 |
+
center = [[(x1 + x2) / 2, (y1 + y2) / 2] for x1, y1, x2, y2 in fp_end.data.box[:, :4]]
|
619 |
+
|
620 |
+
|
621 |
+
|
622 |
+
# boxes_pred
|
623 |
+
data_js["rmpos"] = []
|
624 |
+
for k in range(len(center)):
|
625 |
+
node = float(room[k]), mdul.room_label[int(room[k])][1], center[k][0], center[k][1]
|
626 |
+
data_js["rmpos"].append(node)
|
627 |
+
boxes_end = boxes_pred.tolist()
|
628 |
+
data_js['roomret'] = []
|
629 |
+
for k in range(len(room)):
|
630 |
+
data = boxes_end[k], [mdul.room_label[int(room[k])][1]]
|
631 |
+
data_js['roomret'].append(data)
|
632 |
+
|
633 |
+
test_index = testNameList.index(testname.split(".")[0])
|
634 |
+
data = test_data[test_index]
|
635 |
+
ex = ""
|
636 |
+
for i in range(len(data.boundary)):
|
637 |
+
ex = ex + str(data.boundary[i][0]) + "," + str(data.boundary[i][1]) + " "
|
638 |
+
data_js['exterior'] = ex
|
639 |
+
x0, x1 = np.min(data.boundary[:, 0]), np.max(data.boundary[:, 0])
|
640 |
+
y0, y1 = np.min(data.boundary[:, 1]), np.max(data.boundary[:, 1])
|
641 |
+
data_js['bbxarea'] = float((x1 - x0) * (y1 - y0))
|
642 |
+
return HttpResponse(json.dumps(data_js), content_type="application/json")
|
643 |
+
|
644 |
+
|
645 |
+
def GraphSearch(request):
|
646 |
+
s=time.clock()
|
647 |
+
# Graph
|
648 |
+
Searchtype = ["BedRoom", "Bathroom", "Kitchen", "Balcony", "Storage"]
|
649 |
+
BedRoomlist = ["MasterRoom", "SecondRoom", "GuestRoom", "ChildRoom", "StudyRoom"]
|
650 |
+
NewGraph = json.loads(request.GET.get("NewGraph"))
|
651 |
+
|
652 |
+
testname = request.GET.get("userRoomID")
|
653 |
+
newNode = NewGraph[0]
|
654 |
+
newEdge = NewGraph[1]
|
655 |
+
r_Num = np.zeros((1, 14)).tolist()
|
656 |
+
r_Mask = np.zeros((1, 14)).tolist()
|
657 |
+
r_Acc = np.zeros((1, 14)).tolist()
|
658 |
+
r_Num[0][0] = 1
|
659 |
+
r_Mask[0][0] = 1
|
660 |
+
r_Acc[0][0] = 1
|
661 |
+
|
662 |
+
for indx, rmname, x, y, scalesize in newNode:
|
663 |
+
r_Num[0][mdul.vocab['object_name_to_idx'][rmname]] = r_Num[0][mdul.vocab['object_name_to_idx'][rmname]] + 1
|
664 |
+
r_Mask[0][mdul.vocab['object_name_to_idx'][rmname]] = 1
|
665 |
+
if rmname in BedRoomlist:
|
666 |
+
r_Num[0][13] = r_Num[0][13] + 1
|
667 |
+
r_Mask[0][13] = 1
|
668 |
+
|
669 |
+
test_index = testNameList.index(testname.split(".")[0])
|
670 |
+
topkList = []
|
671 |
+
topkList.clear()
|
672 |
+
data = test_data[test_index]
|
673 |
+
|
674 |
+
Numrooms = json.loads(request.GET.get("Numrooms"))
|
675 |
+
|
676 |
+
|
677 |
+
roomactarr = Numrooms[0]
|
678 |
+
roomexaarr = Numrooms[1]
|
679 |
+
roomnumarr = [int(x) for x in Numrooms[2]]
|
680 |
+
test_data_topk=np.arange(0,74995)
|
681 |
+
|
682 |
+
if np.sum(roomactarr) != 1 or np.sum(roomexaarr) != 1 or np.sum(roomnumarr) != 1:
|
683 |
+
test_num = train_data_rNum[test_data_topk]
|
684 |
+
# Number filter
|
685 |
+
|
686 |
+
filter_func = get_filter_func(roomactarr, roomexaarr, roomnumarr)
|
687 |
+
indices = np.where(list(map(filter_func, test_num)))
|
688 |
+
# print("np.where(list(map(fil", test_num)
|
689 |
+
indices = list(indices)
|
690 |
+
test_data_topk = test_data_topk[indices[0]]
|
691 |
+
|
692 |
+
test_num = train_data_eNum[test_data_topk]
|
693 |
+
# Graph filter
|
694 |
+
|
695 |
+
edgematrix = np.zeros((5, 5))
|
696 |
+
for indx1, indx2 in newEdge:
|
697 |
+
tmp1 = ""
|
698 |
+
tmp2 = ""
|
699 |
+
for indx, rmname, x, y, scalesize in newNode:
|
700 |
+
if indx1 == indx:
|
701 |
+
if rmname in BedRoomlist:
|
702 |
+
tmp1 = "BedRoom"
|
703 |
+
else:
|
704 |
+
tmp1 = rmname
|
705 |
+
for indx, rmname, x, y, scalesize in newNode:
|
706 |
+
if indx2 == indx:
|
707 |
+
if rmname in BedRoomlist:
|
708 |
+
tmp2 = "BedRoom"
|
709 |
+
else:
|
710 |
+
tmp2 = rmname
|
711 |
+
if tmp1 != "" and tmp2 != "":
|
712 |
+
edgematrix[Searchtype.index(tmp1)][Searchtype.index(tmp2)] = edgematrix[Searchtype.index(tmp1)][
|
713 |
+
Searchtype.index(tmp2)] + 1
|
714 |
+
edgematrix[Searchtype.index(tmp2)][Searchtype.index(tmp1)] = edgematrix[Searchtype.index(tmp2)][
|
715 |
+
Searchtype.index(tmp1)] + 1
|
716 |
+
edge = edgematrix.reshape((1, 25))
|
717 |
+
filter_graphfunc = filter_graph(edge)
|
718 |
+
# rNum_list
|
719 |
+
eNumData = []
|
720 |
+
|
721 |
+
indices = np.where(list(map(filter_graphfunc, test_num)))
|
722 |
+
|
723 |
+
indices = list(indices)
|
724 |
+
tf_trainsub=tf_train[test_data_topk[indices[0]]]
|
725 |
+
re_data = train_data[test_data_topk[indices[0]]]
|
726 |
+
test_data_tftopk=retrieve_bf(tf_trainsub, data, k=20)
|
727 |
+
re_data=re_data[test_data_tftopk]
|
728 |
+
if len(re_data) < 20:
|
729 |
+
topk = len(re_data)
|
730 |
+
else:
|
731 |
+
topk = 20
|
732 |
+
topkList = []
|
733 |
+
for i in range(topk):
|
734 |
+
topkList.append(str(re_data[i].name) + ".png")
|
735 |
+
|
736 |
+
e=time.clock()
|
737 |
+
print('Graph Search time: %s Seconds' % (e - s))
|
738 |
+
|
739 |
+
print("topkList", topkList)
|
740 |
+
return HttpResponse(json.dumps(topkList), content_type="application/json")
|
741 |
+
|
742 |
+
|
743 |
+
def retrieve_bf(tf_trainsub, datum, k=20):
|
744 |
+
# compute tf for the data boundary
|
745 |
+
x, y = rt.compute_tf(datum.boundary)
|
746 |
+
y_sampled = rt.sample_tf(x, y, 1000)
|
747 |
+
dist = np.linalg.norm(y_sampled - tf_trainsub, axis=1)
|
748 |
+
if k > np.log2(len(tf_trainsub)):
|
749 |
+
index = np.argsort(dist)[:k]
|
750 |
+
else:
|
751 |
+
index = np.argpartition(dist, k)[:k]
|
752 |
+
index = index[np.argsort(dist[index])]
|
753 |
+
return index
|
754 |
+
|
755 |
+
|
756 |
+
if __name__ == "__main__":
|
757 |
+
pass
|
Img/data.mat.png
ADDED
![]() |
Img/data_test_converted.png
ADDED
![]() |
Img/data_train_converted.png
ADDED
![]() |
Img/interface.jpg
ADDED
![]() |
Img/paper.png
ADDED
![]() |
align_fp/align_adjacent_room3.m
ADDED
@@ -0,0 +1,121 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
function [newBox, constraint] = align_adjacent_room3(box, tempBox, updated, type, threshold)
|
2 |
+
% position of box1 relative to box2
|
3 |
+
% 0 left-above
|
4 |
+
% 1 left-below
|
5 |
+
% 2 left-of
|
6 |
+
% 3 above
|
7 |
+
% 4 inside
|
8 |
+
% 5 surrounding
|
9 |
+
% 6 below
|
10 |
+
% 7 right-of
|
11 |
+
% 8 right-above
|
12 |
+
% 9 right-below
|
13 |
+
|
14 |
+
|
15 |
+
newBox = box;
|
16 |
+
constraint = zeros(4, 2);
|
17 |
+
idx = 1;
|
18 |
+
|
19 |
+
if type == 0
|
20 |
+
alignV(true);
|
21 |
+
alignH(true);
|
22 |
+
elseif type == 1
|
23 |
+
alignV(true);
|
24 |
+
alignH(false);
|
25 |
+
elseif type == 2
|
26 |
+
align([2,1], [1,3], threshold);
|
27 |
+
align([2,2], [1,2], threshold/2);
|
28 |
+
align([2,4], [1,4], threshold/2);
|
29 |
+
elseif type == 3
|
30 |
+
align([2,2], [1,4], threshold);
|
31 |
+
align([2,1], [1,1], threshold/2);
|
32 |
+
align([2,3], [1,3], threshold/2);
|
33 |
+
elseif type == 4
|
34 |
+
align([2,1], [1,1], true);
|
35 |
+
align([2,2], [1,2], true);
|
36 |
+
align([2,3], [1,3], true);
|
37 |
+
align([2,4], [1,4], true);
|
38 |
+
elseif type == 5
|
39 |
+
align([1,1], [2,1], true);
|
40 |
+
align([1,2], [2,2], true);
|
41 |
+
align([1,3], [2,3], true);
|
42 |
+
align([1,4], [2,4], true);
|
43 |
+
elseif type == 6
|
44 |
+
align([2,4], [1,2], threshold);
|
45 |
+
align([2,1], [1,1], threshold/2);
|
46 |
+
align([2,3], [1,3], threshold/2);
|
47 |
+
elseif type == 7
|
48 |
+
align([2,3], [1,1], threshold);
|
49 |
+
align([2,2], [1,2], threshold/2);
|
50 |
+
align([2,4], [1,4], threshold/2);
|
51 |
+
elseif type == 8
|
52 |
+
alignV(false);
|
53 |
+
alignH(true);
|
54 |
+
elseif type == 9
|
55 |
+
alignV(false);
|
56 |
+
alignH(false);
|
57 |
+
end
|
58 |
+
|
59 |
+
constraint = constraint(1:idx-1, :);
|
60 |
+
|
61 |
+
function alignV(isLeft)
|
62 |
+
if isLeft
|
63 |
+
idx1 = 1;
|
64 |
+
idx2 = 3;
|
65 |
+
else
|
66 |
+
idx1 = 3;
|
67 |
+
idx2 = 1;
|
68 |
+
end
|
69 |
+
|
70 |
+
if abs(tempBox(2,idx1) - tempBox(1,idx2)) <= abs(tempBox(2,idx2) - tempBox(1,idx2))
|
71 |
+
align([2,idx1], [1,idx2], threshold/2)
|
72 |
+
else
|
73 |
+
align([2,idx2], [1,idx2], threshold/2)
|
74 |
+
end
|
75 |
+
end
|
76 |
+
|
77 |
+
function alignH(isAbove)
|
78 |
+
if isAbove
|
79 |
+
idx1 = 2;
|
80 |
+
idx2 = 4;
|
81 |
+
else
|
82 |
+
idx1 = 4;
|
83 |
+
idx2 = 2;
|
84 |
+
end
|
85 |
+
|
86 |
+
if abs(tempBox(2,idx1) - tempBox(1,idx2)) <= abs(tempBox(2,idx2) - tempBox(1,idx2))
|
87 |
+
align([2,idx1], [1,idx2], threshold/2)
|
88 |
+
else
|
89 |
+
align([2,idx2], [1,idx2], threshold/2)
|
90 |
+
end
|
91 |
+
end
|
92 |
+
|
93 |
+
function align(idx1, idx2, threshold, attach)
|
94 |
+
if nargin < 4
|
95 |
+
attach = false;
|
96 |
+
end
|
97 |
+
if abs(tempBox(idx1(1),idx1(2))- tempBox(idx2(1), idx2(2))) <= threshold
|
98 |
+
if updated(idx1(1), idx1(2)) && ~updated(idx2(1), idx2(2))
|
99 |
+
newBox(idx2(1), idx2(2)) = newBox(idx1(1),idx1(2));
|
100 |
+
elseif updated(idx2(1), idx2(2)) && ~updated(idx1(1), idx1(2))
|
101 |
+
newBox(idx1(1), idx1(2)) = newBox(idx2(1),idx2(2));
|
102 |
+
elseif ~updated(idx1(1), idx1(2)) && ~updated(idx2(1), idx2(2))
|
103 |
+
if attach
|
104 |
+
newBox(idx2(1), idx2(2)) = newBox(idx1(1),idx1(2));
|
105 |
+
else
|
106 |
+
y = (newBox(idx1(1),idx1(2)) + newBox(idx2(1), idx2(2)))/2;
|
107 |
+
newBox(idx1(1),idx1(2)) = y;
|
108 |
+
newBox(idx2(1), idx2(2)) = y;
|
109 |
+
end
|
110 |
+
end
|
111 |
+
|
112 |
+
if idx1(1) == 1
|
113 |
+
constraint(idx, :) = [idx1(2) idx2(2)];
|
114 |
+
else
|
115 |
+
constraint(idx, :) = [idx2(2) idx1(2)];
|
116 |
+
end
|
117 |
+
idx = idx + 1;
|
118 |
+
end
|
119 |
+
end
|
120 |
+
|
121 |
+
end
|
align_fp/align_fp.m
ADDED
@@ -0,0 +1,108 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
function [newBox, order, rBoundary] = align_fp(boundary, rBox, rType, rEdge, fp, threshold, drawResult)
|
2 |
+
% align the neighboring rooms first and then align with the boundary
|
3 |
+
|
4 |
+
if nargin < 7
|
5 |
+
drawResult =false;
|
6 |
+
end
|
7 |
+
|
8 |
+
% pre-processing:
|
9 |
+
% move the edge relation w.r.t. living room to the end
|
10 |
+
livingIdx = find(rType==0);
|
11 |
+
idx = rEdge(:,1) == livingIdx-1 | rEdge(:,2) == livingIdx-1;
|
12 |
+
% a = rEdge(~idx, :);
|
13 |
+
% b = rEdge(idx, :);
|
14 |
+
% rEdge = [a; b];
|
15 |
+
rEdge = rEdge(~idx, :);
|
16 |
+
entranceBox = get_entrance_space(boundary(1:2, 1:2), boundary(1,3), threshold);
|
17 |
+
|
18 |
+
if drawResult
|
19 |
+
clf
|
20 |
+
subplot(2,2,1)
|
21 |
+
plot_fp(rBox, boundary, rType, entranceBox);
|
22 |
+
title('original');
|
23 |
+
end
|
24 |
+
|
25 |
+
%% option #1: use greedy method: align with boundary first and then neighbor
|
26 |
+
% 1. align with boundary after the neighbors have been aligned
|
27 |
+
[~, newBox, updated] = align_with_boundary(rBox, boundary, threshold, rType);
|
28 |
+
|
29 |
+
if drawResult
|
30 |
+
subplot(2,2,2)
|
31 |
+
plot_fp(newBox, boundary, rType, entranceBox);
|
32 |
+
title('Align with boundary');
|
33 |
+
end
|
34 |
+
|
35 |
+
|
36 |
+
% 2. for each adjacent pair of room,
|
37 |
+
[~, newBox, ~] = align_neighbor(newBox, rEdge, updated, threshold+6);
|
38 |
+
if drawResult
|
39 |
+
subplot(2,2,3)
|
40 |
+
plot_fp(newBox, boundary, rType, entranceBox);
|
41 |
+
title('Align with neighbors');
|
42 |
+
end
|
43 |
+
|
44 |
+
% 3. regularize fp, include crop using boundary, gap filling
|
45 |
+
[newBox, order] = regularize_fp(newBox, boundary, rType);
|
46 |
+
|
47 |
+
% 4. generate the room polygons
|
48 |
+
[newBox, rBoundary] = get_room_boundary(newBox, boundary, order);
|
49 |
+
|
50 |
+
if drawResult
|
51 |
+
subplot(2,2,4)
|
52 |
+
plot_fp(newBox(order,:), boundary, rType(order), entranceBox);
|
53 |
+
title('Regularize fp');
|
54 |
+
end
|
55 |
+
|
56 |
+
% %% option #2: use optimization to align neighbors, and then align the boundary
|
57 |
+
% % 1. get the constraint from the adjacent rooms, and optimize
|
58 |
+
% %[constraint1, ~, ~] = align_with_boundary(rBox, boundary, threshold, rNode);
|
59 |
+
% [constraint2, ~, ~] = align_neighbor(rBox, rEdge, [], threshold+2);
|
60 |
+
% newBox = optimize_fp(rBox, [], constraint2);
|
61 |
+
% if drawResult
|
62 |
+
% subplot(3,4,6)
|
63 |
+
% plot_fp(newBox, boundary, rNode, entranceBox);
|
64 |
+
% title('Optimize the neighboring');
|
65 |
+
% end
|
66 |
+
%
|
67 |
+
% % 2. align with boundary after the neighbors have been aligned
|
68 |
+
% [constraint1, newBox2, ~] = align_with_boundary(newBox, boundary, threshold, rNode);
|
69 |
+
% if drawResult
|
70 |
+
% subplot(3,4,7)
|
71 |
+
% plot_fp(newBox2, boundary, rNode, entranceBox);
|
72 |
+
% title('Align with boundary w/o optimization');
|
73 |
+
% end
|
74 |
+
%
|
75 |
+
% % 3. regularize fp, include crop using boundary, gap filling
|
76 |
+
% [newBox2, order] = regularize_fp(newBox2, boundary, rNode);
|
77 |
+
% if drawResult
|
78 |
+
% subplot(3,4,8)
|
79 |
+
% plot_fp(newBox2(order,:), boundary, rNode(order,:), entranceBox);
|
80 |
+
% title('Regularize fp');
|
81 |
+
% end
|
82 |
+
%
|
83 |
+
%
|
84 |
+
%
|
85 |
+
% newBox = optimize_fp(newBox, constraint1, constraint2);
|
86 |
+
% if drawResult
|
87 |
+
% subplot(3,4,11)
|
88 |
+
% plot_fp(newBox, boundary, rNode, entranceBox);
|
89 |
+
% title('Align with boundary with optimization');
|
90 |
+
% end
|
91 |
+
%
|
92 |
+
% % 3. regularize fp, include crop using boundary, gap filling
|
93 |
+
% [newBox, order] = regularize_fp(newBox, boundary, rNode);
|
94 |
+
% if drawResult
|
95 |
+
% subplot(3,4,12)
|
96 |
+
% plot_fp(newBox(order,:), boundary, rNode(order,:), entranceBox);
|
97 |
+
% title('Regularize fp');
|
98 |
+
% if ~isempty(figName)
|
99 |
+
% saveas(gcf, figName);
|
100 |
+
% end
|
101 |
+
% end
|
102 |
+
%
|
103 |
+
|
104 |
+
|
105 |
+
|
106 |
+
%%
|
107 |
+
end
|
108 |
+
|
align_fp/align_neighbor.m
ADDED
@@ -0,0 +1,53 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
function [constraint, box, updated] = align_neighbor(box, rEdge, updated, threshold)
|
2 |
+
|
3 |
+
if isempty(updated)
|
4 |
+
updated = false(size(box));
|
5 |
+
end
|
6 |
+
|
7 |
+
tempBox = box;
|
8 |
+
constraint = zeros(size(rEdge, 1)*3, 2);
|
9 |
+
iBegin = 1;
|
10 |
+
checked = false(size(rEdge, 1), 1);
|
11 |
+
updatedCount = get_updated_count(updated, rEdge);
|
12 |
+
for i = 1:size(rEdge, 1)
|
13 |
+
I = find(~checked);
|
14 |
+
[~, t] = maxk(updatedCount(I), 1);
|
15 |
+
checked(I(t)) = true;
|
16 |
+
idx = rEdge(I(t),1:2)+1;
|
17 |
+
[b, c] = align_adjacent_room3(box(idx, :), tempBox(idx, :), updated(idx,:), rEdge(I(t),3), threshold);
|
18 |
+
for j = 1:length(idx)
|
19 |
+
|
20 |
+
updated(idx(j), c(:,j)) = true;
|
21 |
+
|
22 |
+
c(:, j) = (c(:,j)-1)*size(box,1) + double(idx(j));
|
23 |
+
|
24 |
+
if b(j, 1) == b(j, 3)
|
25 |
+
b(j, [1 3]) = box(idx(j), [1 3]);
|
26 |
+
updated(idx(j), c(:,j)) = false;
|
27 |
+
end
|
28 |
+
if b(j, 2) == b(j, 4)
|
29 |
+
b(j, [2 4]) = box(idx(j), [2 4]);
|
30 |
+
updated(idx(j), c(:,j)) = false;
|
31 |
+
end
|
32 |
+
|
33 |
+
end
|
34 |
+
box(idx, :) = b;
|
35 |
+
|
36 |
+
|
37 |
+
cNum = size(c, 1);
|
38 |
+
|
39 |
+
constraint(iBegin:iBegin+cNum-1, :) = c;
|
40 |
+
iBegin = iBegin+cNum;
|
41 |
+
|
42 |
+
updatedCount = get_updated_count(updated, rEdge);
|
43 |
+
end
|
44 |
+
constraint = constraint(1:iBegin-1, :);
|
45 |
+
|
46 |
+
function updatedCount = get_updated_count(updated, rEdge)
|
47 |
+
updatedCount = zeros(size(rEdge, 1), 1);
|
48 |
+
for k = 1:size(rEdge, 1)
|
49 |
+
index = rEdge(k,1:2)+1;
|
50 |
+
updatedCount(k) = sum(sum(updated(index,:)));
|
51 |
+
end
|
52 |
+
end
|
53 |
+
end
|
align_fp/align_with_boundary.m
ADDED
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
function [constraint, box, updated] = align_with_boundary(box, boundary, threshold, rType)
|
2 |
+
tempBox = box;
|
3 |
+
updated = false(size(box));
|
4 |
+
closedSeg = zeros(size(box));
|
5 |
+
distSeg = zeros(size(box));
|
6 |
+
for i = 1:length(box)
|
7 |
+
[closedSeg(i,:), distSeg(i,:)] = find_close_seg(box(i,:), boundary);
|
8 |
+
end
|
9 |
+
|
10 |
+
|
11 |
+
box(distSeg <= threshold) = closedSeg(distSeg <= threshold);
|
12 |
+
updated(distSeg <= threshold) = true;
|
13 |
+
idx = find(distSeg <= threshold);
|
14 |
+
constraint = [idx closedSeg(idx)];
|
15 |
+
|
16 |
+
|
17 |
+
% check if any room box blocks the door
|
18 |
+
entranceBox = get_entrance_space(boundary(1:2, 1:2), boundary(1,3), threshold);
|
19 |
+
entrancePoly = polyshape(entranceBox([1 1 3 3]), entranceBox([2 4 4 2]));
|
20 |
+
for i = 1:length(box)
|
21 |
+
if rType(i) ~= 10 && rType(i) ~= 0
|
22 |
+
roomPoly = polyshape(box(i, [1 1 3 3]), box(i, [2 4 4 2]));
|
23 |
+
if overlaps(entrancePoly, roomPoly)
|
24 |
+
box(i,:) = shrink_box(roomPoly, entrancePoly, boundary(1,3));
|
25 |
+
updated(i, box(i,:)==tempBox(i,:)) = false;
|
26 |
+
updated(i, box(i,:)~=tempBox(i,:)) = true;
|
27 |
+
end
|
28 |
+
end
|
29 |
+
end
|
align_fp/find_close_seg.m
ADDED
@@ -0,0 +1,74 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
function [closedSeg, distSeg, idx] = find_close_seg(box, boundary)
|
2 |
+
|
3 |
+
% need to carefully select the closed wall seg for each box
|
4 |
+
% cannot introduce a hole inside the boundary
|
5 |
+
|
6 |
+
isNew = boundary(:,4);
|
7 |
+
boundary = double(boundary(~isNew, :));
|
8 |
+
|
9 |
+
% get the ordered horizontal and vertical segments on the boundary
|
10 |
+
bSeg = [boundary(:, 1:2), boundary([2:end 1], 1:2), boundary(:,3)];
|
11 |
+
vSeg = bSeg(mod(boundary(:,3), 2)==1, :);
|
12 |
+
vSeg(vSeg(:,5)==3, [2 4]) = vSeg(vSeg(:,5)==3, [4 2]);
|
13 |
+
[~, I] = sort(vSeg(:,1));
|
14 |
+
vSeg = vSeg(I,:);
|
15 |
+
|
16 |
+
hSeg = bSeg(mod(boundary(:,3), 2)==0, :);
|
17 |
+
hSeg(hSeg(:,5)==2, [1 3]) = hSeg(hSeg(:,5)==2, [3 1]);
|
18 |
+
[~, I] = sort(hSeg(:,2));
|
19 |
+
hSeg = hSeg(I,:);
|
20 |
+
|
21 |
+
closedSeg = ones(1,4)*256;
|
22 |
+
distSeg = ones(1,4)*256;
|
23 |
+
idx = zeros(1, 4);
|
24 |
+
|
25 |
+
% check vertial seg
|
26 |
+
for i = 1:size(vSeg,1)
|
27 |
+
seg = vSeg(i, :);
|
28 |
+
vdist = 0;
|
29 |
+
if seg(4) <= box(2)
|
30 |
+
vdist = box(2) - seg(4);
|
31 |
+
elseif seg(2) >= box(4)
|
32 |
+
vdist = seg(2) - box(4);
|
33 |
+
end
|
34 |
+
|
35 |
+
hdist = box([1 3]) - seg(1);
|
36 |
+
dist1 = norm(double([hdist(1), vdist]));
|
37 |
+
dist3 = norm(double([hdist(2), vdist]));
|
38 |
+
|
39 |
+
if dist1 < distSeg(1) && dist1 <= dist3 && hdist(1) > 0
|
40 |
+
distSeg(1) = dist1;
|
41 |
+
idx(1) = i;
|
42 |
+
closedSeg(1) = seg(1);
|
43 |
+
elseif dist3 < distSeg(3) && hdist(2) < 0
|
44 |
+
distSeg(3) = dist3;
|
45 |
+
idx(3) = i;
|
46 |
+
closedSeg(3) = seg(3);
|
47 |
+
end
|
48 |
+
end
|
49 |
+
|
50 |
+
% check horizontal seg
|
51 |
+
for i = 1:size(hSeg,1)
|
52 |
+
|
53 |
+
seg = hSeg(i, :);
|
54 |
+
hdist = 0;
|
55 |
+
if seg(3) <= box(1)
|
56 |
+
hdist = box(1) - seg(3);
|
57 |
+
elseif seg(1) >= box(3)
|
58 |
+
hdist = seg(1) - box(3);
|
59 |
+
end
|
60 |
+
|
61 |
+
vdist = box([2 4]) - seg(2);
|
62 |
+
dist2 = norm(double([vdist(1), hdist]));
|
63 |
+
dist4 = norm(double([vdist(2), hdist]));
|
64 |
+
|
65 |
+
if dist2 <= dist4 && dist2 < distSeg(2) && vdist(1) > 0
|
66 |
+
distSeg(2) = dist2;
|
67 |
+
idx(2) = i;
|
68 |
+
closedSeg(2) = seg(2);
|
69 |
+
elseif dist4 < distSeg(4) && vdist(2) < 0
|
70 |
+
distSeg(4) = dist4;
|
71 |
+
idx(4) = i;
|
72 |
+
closedSeg(4) = seg(4);
|
73 |
+
end
|
74 |
+
end
|
align_fp/find_room_order.m
ADDED
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
function order = find_room_order(M)
|
2 |
+
|
3 |
+
n = size(M,1);
|
4 |
+
G = digraph(M);
|
5 |
+
name = cell(n,1);
|
6 |
+
for i = 1:n
|
7 |
+
name{i} = num2str(i);
|
8 |
+
end
|
9 |
+
G.Nodes.Name = name;
|
10 |
+
|
11 |
+
order = zeros(n, 1);
|
12 |
+
i = 1;
|
13 |
+
while i <= n
|
14 |
+
D = indegree(G);
|
15 |
+
c = find(D==0);
|
16 |
+
if isempty(c)
|
17 |
+
idx = find(D==1);
|
18 |
+
c = setdiff(idx, order);
|
19 |
+
order(i) = str2double(G.Nodes.Name{c(1)});
|
20 |
+
G = rmnode(G, c(1));
|
21 |
+
i = i+1;
|
22 |
+
else
|
23 |
+
for j = 1:length(c)
|
24 |
+
order(i+j-1) = str2double(G.Nodes.Name{c(j)});
|
25 |
+
end
|
26 |
+
G = rmnode(G, c);
|
27 |
+
i = i + length(c);
|
28 |
+
end
|
29 |
+
end
|
align_fp/get_entrance_space.m
ADDED
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
|
2 |
+
function doorBox = get_entrance_space(doorSeg, doorOri, threshold)
|
3 |
+
|
4 |
+
doorBox = [doorSeg(1,:) doorSeg(2,:)];
|
5 |
+
if doorOri == 0
|
6 |
+
doorBox(4) = doorBox(4) + threshold;
|
7 |
+
elseif doorOri == 1
|
8 |
+
doorBox(1) = doorBox(1) - threshold;
|
9 |
+
elseif doorOri == 2
|
10 |
+
doorBox(2) = doorBox(2) - threshold;
|
11 |
+
elseif doorOri == 3
|
12 |
+
doorBox(3) = doorBox(3) + threshold;
|
13 |
+
end
|
14 |
+
|
align_fp/get_room_boundary.m
ADDED
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
function [newBox, rBoundary] = get_room_boundary(box, boundary, order)
|
2 |
+
|
3 |
+
isNew = boundary(:,4);
|
4 |
+
polyBoundary = polyshape(boundary(~isNew,1), boundary(~isNew,2));
|
5 |
+
|
6 |
+
poly = cell(size(box,1), 1);
|
7 |
+
for i = 1:size(box,1)
|
8 |
+
poly{i} = polyshape(box(i, [1 1 3 3]), box(i, [2 4 4 2]));
|
9 |
+
end
|
10 |
+
|
11 |
+
newBox = box;
|
12 |
+
rBoundary = cell(size(box,1), 1);
|
13 |
+
for i = 1:size(box,1)
|
14 |
+
idx = order(i);
|
15 |
+
|
16 |
+
rPoly = intersect(polyBoundary, poly{idx});
|
17 |
+
for j = i+1:size(box,1)
|
18 |
+
rPoly = subtract(rPoly, poly{order(j)});
|
19 |
+
end
|
20 |
+
rBoundary{idx} = rPoly.Vertices;
|
21 |
+
[xLimit, yLimit]= boundingbox(rPoly);
|
22 |
+
if ~isempty(xLimit)
|
23 |
+
newBox(idx,:) = [xLimit(1) yLimit(1) xLimit(2), yLimit(2)];
|
24 |
+
end
|
25 |
+
end
|
align_fp/regularize_fp.m
ADDED
@@ -0,0 +1,111 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
function [box, order] = regularize_fp(box, boundary, rType)
|
2 |
+
|
3 |
+
% 1. use the boundary to crop each room box
|
4 |
+
isNew = boundary(:,4);
|
5 |
+
polyBoundary = polyshape(boundary(~isNew,1), boundary(~isNew,2));
|
6 |
+
for i = 1:size(box, 1)
|
7 |
+
polyRoom = polyshape(box(i, [1 1 3 3]), box(i, [2 4 4 2]));
|
8 |
+
[xLimit, yLimit] = boundingbox(intersect(polyBoundary,polyRoom));
|
9 |
+
if isempty(xLimit)
|
10 |
+
disp('One room outside the building!');
|
11 |
+
else
|
12 |
+
box(i,:) = [xLimit(1) yLimit(1) xLimit(2), yLimit(2)];
|
13 |
+
end
|
14 |
+
end
|
15 |
+
|
16 |
+
|
17 |
+
% 2. check if there is any overlapped region to determine the layer of boxes
|
18 |
+
orderM = false(size(box,1), size(box,1));
|
19 |
+
for i = 1:size(box,1)
|
20 |
+
polyRoom1 = polyshape(box(i, [1 1 3 3]), box(i, [2 4 4 2]));
|
21 |
+
area1 = area(polyRoom1);
|
22 |
+
for j = i+1:size(box,1)
|
23 |
+
polyRoom2 = polyshape(box(j, [1 1 3 3]), box(j, [2 4 4 2]));
|
24 |
+
area2 = area(polyRoom2);
|
25 |
+
inter = intersect(polyRoom1, polyRoom2);
|
26 |
+
if inter.NumRegions >= 1
|
27 |
+
if area1 <= area2 % may need to add the FP into consideration
|
28 |
+
orderM(i,j) = true;
|
29 |
+
else
|
30 |
+
orderM(j,i) = true;
|
31 |
+
end
|
32 |
+
end
|
33 |
+
end
|
34 |
+
end
|
35 |
+
order = 1:size(box,1);
|
36 |
+
if any(orderM(:))
|
37 |
+
order = find_room_order(orderM);
|
38 |
+
end
|
39 |
+
order = order(end:-1:1);
|
40 |
+
|
41 |
+
% 3. check if there are more than one uncovered regions inside the building
|
42 |
+
livingIdx = find(rType==0);
|
43 |
+
for i = 1:size(box, 1)
|
44 |
+
if i ~= livingIdx
|
45 |
+
if box(i,1)==box(i,3) || box(i,2)==box(i,4)
|
46 |
+
disp('Empty box!!!');
|
47 |
+
else
|
48 |
+
polyRoom = polyshape(box(i, [1 1 3 3]), box(i, [2 4 4 2]));
|
49 |
+
polyBoundary = subtract(polyBoundary,polyRoom);
|
50 |
+
end
|
51 |
+
|
52 |
+
end
|
53 |
+
end
|
54 |
+
livingPoly = polyshape(box(livingIdx, [1 1 3 3]), box(livingIdx, [2 4 4 2]));
|
55 |
+
|
56 |
+
gap = polyBoundary;
|
57 |
+
if gap.NumRegions == 1
|
58 |
+
[xLimit, yLimit] = boundingbox(gap);
|
59 |
+
box(livingIdx,:) = [xLimit(1) yLimit(1) xLimit(2), yLimit(2)];
|
60 |
+
else
|
61 |
+
rIdx = find(isnan(gap.Vertices(:,1)));
|
62 |
+
rIdx = [rIdx; size(gap.Vertices,1)+1];
|
63 |
+
|
64 |
+
% for each region, check if it intersects with the living room,
|
65 |
+
% otherwise get the room label and find the room that should cover
|
66 |
+
% the region
|
67 |
+
|
68 |
+
region = cell(length(rIdx), 1);
|
69 |
+
overlapArea = zeros(length(rIdx), 1);
|
70 |
+
closeRoomIdx = zeros(length(rIdx), 1);
|
71 |
+
idx = 1;
|
72 |
+
for k = 1:length(rIdx)
|
73 |
+
regionV = gap.Vertices(idx:rIdx(k)-1, :);
|
74 |
+
idx = rIdx(k) + 1;
|
75 |
+
region{k} = polyshape(regionV);
|
76 |
+
|
77 |
+
if overlaps(region{k}, livingPoly)
|
78 |
+
iter = intersect(region{k}, livingPoly);
|
79 |
+
overlapArea(k) = area(iter);
|
80 |
+
end
|
81 |
+
|
82 |
+
[x, y] = centroid(region{k});
|
83 |
+
center = [x, y];
|
84 |
+
|
85 |
+
dist = 256;
|
86 |
+
bIdx = 0;
|
87 |
+
for i = 1:size(box, 1)
|
88 |
+
b = box(i, :);
|
89 |
+
bCenter = double([(b(:,1)+b(:,3))/2, (b(:,2)+b(:,4))/2]);
|
90 |
+
d = norm(bCenter-center);
|
91 |
+
if d<dist
|
92 |
+
dist = d;
|
93 |
+
bIdx = i;
|
94 |
+
end
|
95 |
+
end
|
96 |
+
closeRoomIdx(k) = bIdx;
|
97 |
+
end
|
98 |
+
|
99 |
+
[~, lIdx] = max(overlapArea);
|
100 |
+
for k = 1:length(closeRoomIdx)
|
101 |
+
if k == lIdx
|
102 |
+
[xLimit, yLimit] = boundingbox(region{k});
|
103 |
+
box(livingIdx,:) = [xLimit(1) yLimit(1) xLimit(2), yLimit(2)];
|
104 |
+
else
|
105 |
+
room = polyshape(box(closeRoomIdx(k), [1 1 3 3]), box(closeRoomIdx(k), [2 4 4 2]));
|
106 |
+
[xLimit, yLimit] = boundingbox(union(room, region{k}));
|
107 |
+
box(closeRoomIdx(k),:) = [xLimit(1) yLimit(1) xLimit(2), yLimit(2)];
|
108 |
+
end
|
109 |
+
end
|
110 |
+
end
|
111 |
+
|
align_fp/shrink_box.m
ADDED
@@ -0,0 +1,61 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
function box = shrink_box(roomPoly, entrancePoly, doorOrient)
|
2 |
+
|
3 |
+
[PG, shapeId, ~] = subtract(roomPoly, entrancePoly);
|
4 |
+
idx1 = find(shapeId==1);
|
5 |
+
d = idx1(2:end) - idx1(1:end-1);
|
6 |
+
i = find(d~=1);
|
7 |
+
if ~isempty(i)
|
8 |
+
idx1 = idx1([i+1:end 1:i]);
|
9 |
+
end
|
10 |
+
|
11 |
+
idx2 = find(shapeId~=1);
|
12 |
+
d = idx2(2:end) - idx2(1:end-1);
|
13 |
+
i = find(d~=1);
|
14 |
+
if ~isempty(i)
|
15 |
+
idx2 = idx2([i+1:end 1:i]);
|
16 |
+
end
|
17 |
+
|
18 |
+
remainPoint = length(idx1);
|
19 |
+
if remainPoint == 2
|
20 |
+
box = [min(PG.Vertices) max(PG.Vertices)];
|
21 |
+
elseif remainPoint == 3
|
22 |
+
assert(length(idx2) == 3);
|
23 |
+
pointSet1 = PG.Vertices([idx1(1:2); idx2(2)], :);
|
24 |
+
pointSet2 = PG.Vertices([idx1(2:3); idx2(2)], :);
|
25 |
+
if mod(doorOrient, 2) == 0 % door grow vertically
|
26 |
+
if pointSet1(1,1) == pointSet1(2,1)
|
27 |
+
box = [min(pointSet1) max(pointSet1)];
|
28 |
+
else
|
29 |
+
box = [min(pointSet2) max(pointSet2)];
|
30 |
+
end
|
31 |
+
else
|
32 |
+
if pointSet1(1,2) == pointSet1(2,2)
|
33 |
+
box = [min(pointSet1) max(pointSet1)];
|
34 |
+
else
|
35 |
+
box = [min(pointSet2) max(pointSet2)];
|
36 |
+
end
|
37 |
+
end
|
38 |
+
elseif remainPoint == 4
|
39 |
+
% elseif remainPoint == 4 && length(idx2) == 4
|
40 |
+
% pointSet = PG.Vertices([idx1(2:3); idx2(2:3)], :);
|
41 |
+
% box = [min(pointSet) max(pointSet)];
|
42 |
+
% elseif remainPoint == 4 % door inside the box
|
43 |
+
[x1, y1] = centroid(roomPoly);
|
44 |
+
[x2, y2] = centroid(entrancePoly);
|
45 |
+
box = [min(roomPoly.Vertices) max(roomPoly.Vertices)];
|
46 |
+
if mod(doorOrient, 2) == 0 % door grow vertically
|
47 |
+
if x1 < x2
|
48 |
+
box(3) = min(entrancePoly.Vertices(:,1));
|
49 |
+
else
|
50 |
+
box(1) = max(entrancePoly.Vertices(:,1));
|
51 |
+
end
|
52 |
+
else
|
53 |
+
if y1 < y2
|
54 |
+
box(4) = min(entrancePoly.Vertices(:,2));
|
55 |
+
else
|
56 |
+
box(2) = max(entrancePoly.Vertices(:,2));
|
57 |
+
end
|
58 |
+
end
|
59 |
+
else
|
60 |
+
disp(['There are other cases with point number = ', num2str(length(shapeId))]);
|
61 |
+
end
|
db.sqlite3
ADDED
File without changes
|
manage.py
ADDED
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/usr/bin/env python
|
2 |
+
"""Django's command-line utility for administrative tasks."""
|
3 |
+
import os
|
4 |
+
import sys
|
5 |
+
|
6 |
+
|
7 |
+
def main():
|
8 |
+
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'House.settings')
|
9 |
+
try:
|
10 |
+
from django.core.management import execute_from_command_line
|
11 |
+
except ImportError as exc:
|
12 |
+
raise ImportError(
|
13 |
+
"Couldn't import Django. Are you sure it's installed and "
|
14 |
+
"available on your PYTHONPATH environment variable? Did you "
|
15 |
+
"forget to activate a virtual environment?"
|
16 |
+
) from exc
|
17 |
+
execute_from_command_line(sys.argv)
|
18 |
+
|
19 |
+
|
20 |
+
if __name__ == '__main__':
|
21 |
+
main()
|
model/__pycache__/_floorplan2.cpython-37.pyc
ADDED
Binary file (2.67 kB). View file
|
|
model/__pycache__/add_archs.cpython-37.pyc
ADDED
Binary file (13.3 kB). View file
|
|
model/__pycache__/box_utils.cpython-37.pyc
ADDED
Binary file (4.07 kB). View file
|
|
model/__pycache__/crn.cpython-37.pyc
ADDED
Binary file (3.06 kB). View file
|
|
model/__pycache__/floorplan.cpython-311.pyc
ADDED
Binary file (17.6 kB). View file
|
|