bx-865-apps #1
|
@ -40,7 +40,13 @@ const sampling_data = () => {
|
||||||
})
|
})
|
||||||
paths_array.value = res
|
paths_array.value = res
|
||||||
}
|
}
|
||||||
watch(point_array, (newStatus) => {
|
watch(point_array, () => {
|
||||||
|
sampling_data()
|
||||||
|
})
|
||||||
|
watch(chunk_size, () => {
|
||||||
|
sampling_data()
|
||||||
|
})
|
||||||
|
watch(threshold, () => {
|
||||||
sampling_data()
|
sampling_data()
|
||||||
})
|
})
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
|
@ -61,7 +67,8 @@ onMounted(() => {
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
svg path {
|
svg path {
|
||||||
fill: transparent
|
fill: transparent;
|
||||||
|
stroke: rgba(70, 70, 0, 0.1);
|
||||||
}
|
}
|
||||||
|
|
||||||
svg path:hover {
|
svg path:hover {
|
||||||
|
|
|
@ -6,14 +6,10 @@ import { chunks } from '~/helpers';
|
||||||
const config = useRuntimeConfig()
|
const config = useRuntimeConfig()
|
||||||
const point_array = useState('point_array', () => [[]])
|
const point_array = useState('point_array', () => [[]])
|
||||||
const chunk_size = useState('chunk_size', () => 8)
|
const chunk_size = useState('chunk_size', () => 8)
|
||||||
const threshold = useState('chunk_size', () => 20)
|
const threshold = useState('threshold', () => 20)
|
||||||
|
|
||||||
const paths_array = ref<{ path: string, unwalkable: boolean, x: number, y: number }[]>()
|
|
||||||
const loading = ref<boolean>(false)
|
const loading = ref<boolean>(false)
|
||||||
|
|
||||||
const canvasElement: Ref<HTMLCanvasElement | undefined> = ref();
|
|
||||||
const context: Ref<CanvasRenderingContext2D | undefined> = ref();
|
|
||||||
|
|
||||||
const grid = ref<Grid>()
|
const grid = ref<Grid>()
|
||||||
const startPoint = ref<number[]>()
|
const startPoint = ref<number[]>()
|
||||||
const endPoint = ref<number[]>()
|
const endPoint = ref<number[]>()
|
||||||
|
@ -26,16 +22,17 @@ const files = ref([])
|
||||||
const cw = 1920
|
const cw = 1920
|
||||||
const ch = 800
|
const ch = 800
|
||||||
|
|
||||||
const nextFrame = () => new Promise(resolve => requestAnimationFrame(resolve));
|
const title = ref()
|
||||||
|
|
||||||
const beforeUpload = () => {
|
const dataToState = (data: any) => {
|
||||||
loading.value = true
|
point_array.value = data.np_field
|
||||||
|
title.value = data.title
|
||||||
}
|
}
|
||||||
|
|
||||||
const onUpload = (event: FileUploadUploadEvent) => {
|
const onUpload = (event: FileUploadUploadEvent) => {
|
||||||
try {
|
try {
|
||||||
const data = JSON.parse(event.xhr.response)
|
const data = JSON.parse(event.xhr.response)
|
||||||
point_array.value = data.response.np_field
|
dataToState(data.response)
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log(error)
|
console.log(error)
|
||||||
}
|
}
|
||||||
|
@ -45,12 +42,13 @@ const selectFileEvent = async () => {
|
||||||
try {
|
try {
|
||||||
const res = await fetch(`${config.public.apiBase}/api/floorplan/${selectFile.value}`)
|
const res = await fetch(`${config.public.apiBase}/api/floorplan/${selectFile.value}`)
|
||||||
const data = await res.json()
|
const data = await res.json()
|
||||||
point_array.value = data.np_field
|
dataToState(data)
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log(error)
|
console.log(error)
|
||||||
}
|
}
|
||||||
loadingFile.value = false
|
loadingFile.value = false
|
||||||
}
|
}
|
||||||
|
|
||||||
const loadFiles = async () => {
|
const loadFiles = async () => {
|
||||||
try {
|
try {
|
||||||
loadingFile.value = true
|
loadingFile.value = true
|
||||||
|
@ -63,17 +61,17 @@ const loadFiles = async () => {
|
||||||
loadingFile.value = false
|
loadingFile.value = false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const openBlocks = ref<string[]>([])
|
||||||
|
const isBlockOpen = (name: string) => {
|
||||||
|
return openBlocks.value.includes(name)
|
||||||
|
}
|
||||||
const toggleBlock = (name: string) => {
|
const toggleBlock = (name: string) => {
|
||||||
if (openBlocks.value.includes(name)) {
|
if (isBlockOpen(name)) {
|
||||||
openBlocks.value.splice(openBlocks.value.indexOf(name), 1)
|
openBlocks.value.splice(openBlocks.value.indexOf(name), 1)
|
||||||
} else {
|
} else {
|
||||||
openBlocks.value.push(name)
|
openBlocks.value.push(name)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const isBlockOpen = (name: string) => {
|
|
||||||
return openBlocks.value.includes(name)
|
|
||||||
}
|
|
||||||
const openBlocks = ref<string[]>([])
|
|
||||||
|
|
||||||
const fileBtnClick = async () => {
|
const fileBtnClick = async () => {
|
||||||
if (isBlockOpen('upload_file')) {
|
if (isBlockOpen('upload_file')) {
|
||||||
|
@ -81,6 +79,21 @@ const fileBtnClick = async () => {
|
||||||
}
|
}
|
||||||
toggleBlock('upload_file')
|
toggleBlock('upload_file')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const updateValues = async () => {
|
||||||
|
const res = await fetch(`${config.public.apiBase}/api/floorplan/${selectFile.value}`, {
|
||||||
|
method: 'PATCH',
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
title: title.value,
|
||||||
|
d_size: chunk_size.value,
|
||||||
|
d_border: threshold.value,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
const data = await res.json()
|
||||||
|
}
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
await loadFiles()
|
await loadFiles()
|
||||||
})
|
})
|
||||||
|
@ -104,12 +117,27 @@ onMounted(async () => {
|
||||||
</Panel>
|
</Panel>
|
||||||
<Panel header="Загрузка файла" v-if="isBlockOpen('upload_file')">
|
<Panel header="Загрузка файла" v-if="isBlockOpen('upload_file')">
|
||||||
<FileUpload mode="basic" name="demo" :url="`${config.public.apiBase}/api/floorplan/`" accept="image/*"
|
<FileUpload mode="basic" name="demo" :url="`${config.public.apiBase}/api/floorplan/`" accept="image/*"
|
||||||
:maxFileSize="10000000" @upload="onUpload" @before-upload="beforeUpload" :auto="true"
|
:maxFileSize="10000000" @upload="onUpload" :auto="true" chooseLabel="Выберите файл"
|
||||||
chooseLabel="Выберите файл" :disabled="loading" />
|
:disabled="loading" />
|
||||||
</Panel>
|
</Panel>
|
||||||
|
|
||||||
<Panel header="Данные для работы">
|
<Panel header="Данные для работы">
|
||||||
|
<div class="flex align-middle items-end gap-2">
|
||||||
|
<div class="flex flex-col">
|
||||||
|
<label for="title">Название</label>
|
||||||
|
<InputText id="title" type="text" v-model="title" />
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-col">
|
||||||
|
<label for="chunk">Значение дискретизации</label>
|
||||||
|
<InputNumber id="chunk" type="text" showButtons :min="0" :max="50" v-model="chunk_size" />
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-col">
|
||||||
|
<label for="threshold">Пороговое значение</label>
|
||||||
|
<InputNumber id="threshold" type="text" showButtons :min="0" :max="chunk_size * chunk_size"
|
||||||
|
v-model="threshold" />
|
||||||
|
</div>
|
||||||
|
<Button @click="updateValues">Сохранить данные</Button>
|
||||||
|
</div>
|
||||||
</Panel>
|
</Panel>
|
||||||
|
|
||||||
<Panel :header="loading ? `Идет отрисовка` : `Обработанный план здания`">
|
<Panel :header="loading ? `Идет отрисовка` : `Обработанный план здания`">
|
||||||
|
|
|
@ -78,3 +78,20 @@ class FloorplanView(APIView):
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(e)
|
logger.error(e)
|
||||||
raise e
|
raise e
|
||||||
|
|
||||||
|
def patch(self, request, id):
|
||||||
|
try:
|
||||||
|
if id is not None:
|
||||||
|
item = Floorplan.objects.get(id=id)
|
||||||
|
serializer = FloorplanSerializer(item, data=request.data, partial=True)
|
||||||
|
data = serializer.data
|
||||||
|
if serializer.is_valid():
|
||||||
|
serializer.save()
|
||||||
|
return JsonResponse(status=201)
|
||||||
|
else:
|
||||||
|
logger.info(serializer.errors)
|
||||||
|
else:
|
||||||
|
return JsonResponse("No item", status=400)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(e)
|
||||||
|
raise e
|
||||||
|
|
Loading…
Reference in New Issue