diff --git a/.vscode/PythonImportHelper-v2-Completion.json b/.vscode/PythonImportHelper-v2-Completion.json index 0853380..f0c3668 100644 --- a/.vscode/PythonImportHelper-v2-Completion.json +++ b/.vscode/PythonImportHelper-v2-Completion.json @@ -1,39 +1,4 @@ [ - { - "label": "annotations", - "importPath": "__future__", - "description": "__future__", - "isExtraImport": true, - "detail": "__future__", - "documentation": {} - }, - { - "label": "os", - "kind": 6, - "isExtraImport": true, - "importPath": "os", - "description": "os", - "detail": "os", - "documentation": {} - }, - { - "label": "site", - "kind": 6, - "isExtraImport": true, - "importPath": "site", - "description": "site", - "detail": "site", - "documentation": {} - }, - { - "label": "sys", - "kind": 6, - "isExtraImport": true, - "importPath": "sys", - "description": "sys", - "detail": "sys", - "documentation": {} - }, { "label": "json", "kind": 6, @@ -132,6 +97,15 @@ "detail": "gyp.common", "documentation": {} }, + { + "label": "os", + "kind": 6, + "isExtraImport": true, + "importPath": "os", + "description": "os", + "detail": "os", + "documentation": {} + }, { "label": "posixpath", "kind": 6, @@ -275,6 +249,15 @@ "detail": "code", "documentation": {} }, + { + "label": "sys", + "kind": 6, + "isExtraImport": true, + "importPath": "sys", + "description": "sys", + "detail": "sys", + "documentation": {} + }, { "label": "hashlib", "kind": 6, @@ -1534,6 +1517,78 @@ "detail": "time", "documentation": {} }, + { + "label": "migrations", + "importPath": "django.db", + "description": "django.db", + "isExtraImport": true, + "detail": "django.db", + "documentation": {} + }, + { + "label": "models", + "importPath": "django.db", + "description": "django.db", + "isExtraImport": true, + "detail": "django.db", + "documentation": {} + }, + { + "label": "migrations", + "importPath": "django.db", + "description": "django.db", + "isExtraImport": true, + "detail": "django.db", + "documentation": {} + }, + { + "label": "models", + "importPath": "django.db", + "description": "django.db", + "isExtraImport": true, + "detail": "django.db", + "documentation": {} + }, + { + "label": "migrations", + "importPath": "django.db", + "description": "django.db", + "isExtraImport": true, + "detail": "django.db", + "documentation": {} + }, + { + "label": "models", + "importPath": "django.db", + "description": "django.db", + "isExtraImport": true, + "detail": "django.db", + "documentation": {} + }, + { + "label": "migrations", + "importPath": "django.db", + "description": "django.db", + "isExtraImport": true, + "detail": "django.db", + "documentation": {} + }, + { + "label": "models", + "importPath": "django.db", + "description": "django.db", + "isExtraImport": true, + "detail": "django.db", + "documentation": {} + }, + { + "label": "models", + "importPath": "django.db", + "description": "django.db", + "isExtraImport": true, + "detail": "django.db", + "documentation": {} + }, { "label": "admin", "importPath": "django.contrib", @@ -1558,14 +1613,6 @@ "detail": "django.apps", "documentation": {} }, - { - "label": "models", - "importPath": "django.db", - "description": "django.db", - "isExtraImport": true, - "detail": "django.db", - "documentation": {} - }, { "label": "routers", "importPath": "rest_framework", @@ -1745,87 +1792,6 @@ "detail": "django.core.wsgi", "documentation": {} }, - { - "label": "bin_dir", - "kind": 5, - "importPath": ".venv.bin.activate_this", - "description": ".venv.bin.activate_this", - "peekOfCode": "bin_dir = os.path.dirname(abs_file)\nbase = bin_dir[: -len(\"bin\") - 1] # strip away the bin part from the __file__, plus the path separator\n# prepend bin to PATH (this file is inside the bin directory)\nos.environ[\"PATH\"] = os.pathsep.join([bin_dir, *os.environ.get(\"PATH\", \"\").split(os.pathsep)])\nos.environ[\"VIRTUAL_ENV\"] = base # virtual env is right above bin directory\nos.environ[\"VIRTUAL_ENV_PROMPT\"] = \"interactive-table-py3.10\" or os.path.basename(base) # noqa: SIM222\n# add the virtual environments libraries to the host python import mechanism\nprev_length = len(sys.path)\nfor lib in \"../lib/python3.10/site-packages\".split(os.pathsep):\n path = os.path.realpath(os.path.join(bin_dir, lib))", - "detail": ".venv.bin.activate_this", - "documentation": {} - }, - { - "label": "base", - "kind": 5, - "importPath": ".venv.bin.activate_this", - "description": ".venv.bin.activate_this", - "peekOfCode": "base = bin_dir[: -len(\"bin\") - 1] # strip away the bin part from the __file__, plus the path separator\n# prepend bin to PATH (this file is inside the bin directory)\nos.environ[\"PATH\"] = os.pathsep.join([bin_dir, *os.environ.get(\"PATH\", \"\").split(os.pathsep)])\nos.environ[\"VIRTUAL_ENV\"] = base # virtual env is right above bin directory\nos.environ[\"VIRTUAL_ENV_PROMPT\"] = \"interactive-table-py3.10\" or os.path.basename(base) # noqa: SIM222\n# add the virtual environments libraries to the host python import mechanism\nprev_length = len(sys.path)\nfor lib in \"../lib/python3.10/site-packages\".split(os.pathsep):\n path = os.path.realpath(os.path.join(bin_dir, lib))\n site.addsitedir(path.decode(\"utf-8\") if \"\" else path)", - "detail": ".venv.bin.activate_this", - "documentation": {} - }, - { - "label": "os.environ[\"PATH\"]", - "kind": 5, - "importPath": ".venv.bin.activate_this", - "description": ".venv.bin.activate_this", - "peekOfCode": "os.environ[\"PATH\"] = os.pathsep.join([bin_dir, *os.environ.get(\"PATH\", \"\").split(os.pathsep)])\nos.environ[\"VIRTUAL_ENV\"] = base # virtual env is right above bin directory\nos.environ[\"VIRTUAL_ENV_PROMPT\"] = \"interactive-table-py3.10\" or os.path.basename(base) # noqa: SIM222\n# add the virtual environments libraries to the host python import mechanism\nprev_length = len(sys.path)\nfor lib in \"../lib/python3.10/site-packages\".split(os.pathsep):\n path = os.path.realpath(os.path.join(bin_dir, lib))\n site.addsitedir(path.decode(\"utf-8\") if \"\" else path)\nsys.path[:] = sys.path[prev_length:] + sys.path[0:prev_length]\nsys.real_prefix = sys.prefix", - "detail": ".venv.bin.activate_this", - "documentation": {} - }, - { - "label": "os.environ[\"VIRTUAL_ENV\"]", - "kind": 5, - "importPath": ".venv.bin.activate_this", - "description": ".venv.bin.activate_this", - "peekOfCode": "os.environ[\"VIRTUAL_ENV\"] = base # virtual env is right above bin directory\nos.environ[\"VIRTUAL_ENV_PROMPT\"] = \"interactive-table-py3.10\" or os.path.basename(base) # noqa: SIM222\n# add the virtual environments libraries to the host python import mechanism\nprev_length = len(sys.path)\nfor lib in \"../lib/python3.10/site-packages\".split(os.pathsep):\n path = os.path.realpath(os.path.join(bin_dir, lib))\n site.addsitedir(path.decode(\"utf-8\") if \"\" else path)\nsys.path[:] = sys.path[prev_length:] + sys.path[0:prev_length]\nsys.real_prefix = sys.prefix\nsys.prefix = base", - "detail": ".venv.bin.activate_this", - "documentation": {} - }, - { - "label": "os.environ[\"VIRTUAL_ENV_PROMPT\"]", - "kind": 5, - "importPath": ".venv.bin.activate_this", - "description": ".venv.bin.activate_this", - "peekOfCode": "os.environ[\"VIRTUAL_ENV_PROMPT\"] = \"interactive-table-py3.10\" or os.path.basename(base) # noqa: SIM222\n# add the virtual environments libraries to the host python import mechanism\nprev_length = len(sys.path)\nfor lib in \"../lib/python3.10/site-packages\".split(os.pathsep):\n path = os.path.realpath(os.path.join(bin_dir, lib))\n site.addsitedir(path.decode(\"utf-8\") if \"\" else path)\nsys.path[:] = sys.path[prev_length:] + sys.path[0:prev_length]\nsys.real_prefix = sys.prefix\nsys.prefix = base", - "detail": ".venv.bin.activate_this", - "documentation": {} - }, - { - "label": "prev_length", - "kind": 5, - "importPath": ".venv.bin.activate_this", - "description": ".venv.bin.activate_this", - "peekOfCode": "prev_length = len(sys.path)\nfor lib in \"../lib/python3.10/site-packages\".split(os.pathsep):\n path = os.path.realpath(os.path.join(bin_dir, lib))\n site.addsitedir(path.decode(\"utf-8\") if \"\" else path)\nsys.path[:] = sys.path[prev_length:] + sys.path[0:prev_length]\nsys.real_prefix = sys.prefix\nsys.prefix = base", - "detail": ".venv.bin.activate_this", - "documentation": {} - }, - { - "label": "sys.path[:]", - "kind": 5, - "importPath": ".venv.bin.activate_this", - "description": ".venv.bin.activate_this", - "peekOfCode": "sys.path[:] = sys.path[prev_length:] + sys.path[0:prev_length]\nsys.real_prefix = sys.prefix\nsys.prefix = base", - "detail": ".venv.bin.activate_this", - "documentation": {} - }, - { - "label": "sys.real_prefix", - "kind": 5, - "importPath": ".venv.bin.activate_this", - "description": ".venv.bin.activate_this", - "peekOfCode": "sys.real_prefix = sys.prefix\nsys.prefix = base", - "detail": ".venv.bin.activate_this", - "documentation": {} - }, - { - "label": "sys.prefix", - "kind": 5, - "importPath": ".venv.bin.activate_this", - "description": ".venv.bin.activate_this", - "peekOfCode": "sys.prefix = base", - "detail": ".venv.bin.activate_this", - "documentation": {} - }, { "label": "_Known", "kind": 6, @@ -8315,6 +8281,42 @@ "detail": "admin_front.node_modules.node-gyp.gyp.test_gyp", "documentation": {} }, + { + "label": "Migration", + "kind": 6, + "importPath": "back.api.migrations.0001_initial", + "description": "back.api.migrations.0001_initial", + "peekOfCode": "class Migration(migrations.Migration):\n initial = True\n dependencies = [\n ]\n operations = [\n migrations.CreateModel(\n name='Floorplan',\n fields=[\n ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),\n ('title', models.CharField(max_length=200)),", + "detail": "back.api.migrations.0001_initial", + "documentation": {} + }, + { + "label": "Migration", + "kind": 6, + "importPath": "back.api.migrations.0002_floorplan_d_border_floorplan_d_size_floorplan_paths", + "description": "back.api.migrations.0002_floorplan_d_border_floorplan_d_size_floorplan_paths", + "peekOfCode": "class Migration(migrations.Migration):\n dependencies = [\n ('api', '0001_initial'),\n ]\n operations = [\n migrations.AddField(\n model_name='floorplan',\n name='d_border',\n field=models.IntegerField(default=1),\n preserve_default=False,", + "detail": "back.api.migrations.0002_floorplan_d_border_floorplan_d_size_floorplan_paths", + "documentation": {} + }, + { + "label": "Migration", + "kind": 6, + "importPath": "back.api.migrations.0003_alter_floorplan_paths", + "description": "back.api.migrations.0003_alter_floorplan_paths", + "peekOfCode": "class Migration(migrations.Migration):\n dependencies = [\n ('api', '0002_floorplan_d_border_floorplan_d_size_floorplan_paths'),\n ]\n operations = [\n migrations.AlterField(\n model_name='floorplan',\n name='paths',\n field=models.TextField(),\n ),", + "detail": "back.api.migrations.0003_alter_floorplan_paths", + "documentation": {} + }, + { + "label": "Migration", + "kind": 6, + "importPath": "back.api.migrations.0004_alter_floorplan_d_border_alter_floorplan_d_size", + "description": "back.api.migrations.0004_alter_floorplan_d_border_alter_floorplan_d_size", + "peekOfCode": "class Migration(migrations.Migration):\n dependencies = [\n ('api', '0003_alter_floorplan_paths'),\n ]\n operations = [\n migrations.AlterField(\n model_name='floorplan',\n name='d_border',\n field=models.IntegerField(blank=True, null=True),\n ),", + "detail": "back.api.migrations.0004_alter_floorplan_d_border_alter_floorplan_d_size", + "documentation": {} + }, { "label": "ApiConfig", "kind": 6, @@ -8428,7 +8430,7 @@ "kind": 6, "importPath": "back.api.views", "description": "back.api.views", - "peekOfCode": "class FloorplanView(APIView):\n parser_classes = (MultiPartParser,)\n def post(self, request):\n try:\n file = request.FILES[\"demo\"]\n logger.info(file.__dict__)\n res = parse_image(read_image(file.read()))\n serializer = FloorplanSerializer(\n data={\n \"title\": file.name,", + "peekOfCode": "class FloorplanView(APIView):\n parser_classes = (\n MultiPartParser,\n JSONParser,\n )\n def post(self, request):\n try:\n file = request.FILES[\"demo\"]\n logger.info(file.__dict__)\n res = parse_image(read_image(file.read()))", "detail": "back.api.views", "documentation": {} }, diff --git a/admin_front/components/FloorplanSvg.vue b/admin_front/components/FloorplanSvg.vue index d18ef3a..dd764de 100644 --- a/admin_front/components/FloorplanSvg.vue +++ b/admin_front/components/FloorplanSvg.vue @@ -5,14 +5,20 @@ import * as d3 from "d3"; const point_array = useState('point_array', () => undefined) const chunk_size = useState('chunk_size', () => 8) const threshold = useState('threshold', () => 20) +const grid_redraw = useState('grid_redraw', () => false) +const active_point = useState<{ x: number, y: number } | undefined>('active_point', () => undefined) +const target_points = useState<{ x: number, y: number, type: string }[]>('target_points', () => []) const paths_array = ref<{ path: string, unwalkable: boolean, x: number, y: number }[]>() - const props = defineProps(['cw', 'ch']) - const d3svg = ref() +const setActivePoint = (item: { x: number, y: number }) => { + active_point.value = { x: item.x, y: item.y } +} + const sampling_data = () => { + grid_redraw.value = true const points = point_array.value const chunk = chunk_size.value if (!points) return @@ -28,6 +34,7 @@ const sampling_data = () => { return el.filter(e => e > 0).length > threshold.value ? 1 : 0 }) }); + const res: any[] = [] prepared_array.forEach((line, indexY) => { line.forEach((point, indexX) => { @@ -48,33 +55,46 @@ const sampling_data = () => { // svg.selectAll("path").remove(); const path_elements = svg.selectAll("path") - paths_array.value.forEach((element, i) => { - if (!d3.select(path_elements.nodes()[i]).empty()) { - console.log(`update ${i}`) - d3.select(path_elements.nodes()[i]) - .transition() - .duration(300) - .attr('d', element.path) - .attr('class', element.unwalkable ? 'unwalkable' : 'walkable') + paths_array.value.forEach(async (element, i) => { + let _class = ''; + if (element.unwalkable) { + _class += ' unwalkable' } else { - console.log(`add ${i}`) + _class += ' walkable' + } + if (target_points.value.find(el => el.x == element.x && el.y === element.y)) { + _class += ' active' + } + const clickFunk = () => setActivePoint({ x: element.x, y: element.y }) + if (path_elements.nodes()[i]) { + // console.log(`update ${i}`) + d3.select(path_elements.nodes()[i]) + // .transition() + // .duration(300) + .attr('d', element.path) + .attr('class', _class) + .on('click', clickFunk) + } else { + // console.log(`add${i}`) svg.append("path") .attr('d', element.path) - .attr('class', element.unwalkable ? 'unwalkable' : 'walkable') + .attr('class', _class) + .on('click', clickFunk) } }); console.timeEnd('redraw D3') + grid_redraw.value = false } watch(point_array, () => { - console.log('point_array') sampling_data() -}) +}, { deep: true }) +watch(target_points, () => { + sampling_data() +}, { deep: true }) watch(chunk_size, () => { - console.log('chunk size') sampling_data() }) watch(threshold, () => { - console.log('threshold') sampling_data() }) onMounted(() => { @@ -83,15 +103,6 @@ onMounted(() => { @@ -102,10 +113,6 @@ svg path { stroke: rgba(70, 70, 0, 0.1); } -svg path:hover { - fill: red -} - svg path.unwalkable { fill: rgba(70, 70, 0, 0.5); } @@ -114,11 +121,16 @@ svg path.endPoint { fill: blue; } -svg path.startPoint { +svg path.active { fill: lawngreen; } -svg path.pathPoint { - fill: gold; +svg path.active { + /* fill: gold; */ +} + + +svg path:hover { + fill: rgba(255, 0, 0, 0.5); } \ No newline at end of file diff --git a/admin_front/pages/plan/index.vue b/admin_front/pages/plan/index.vue index f5518c7..d1373ec 100644 --- a/admin_front/pages/plan/index.vue +++ b/admin_front/pages/plan/index.vue @@ -1,12 +1,14 @@