bx-865-apps #1
|
@ -176,6 +176,22 @@
|
||||||
"detail": "django.db",
|
"detail": "django.db",
|
||||||
"documentation": {}
|
"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",
|
"label": "models",
|
||||||
"importPath": "django.db",
|
"importPath": "django.db",
|
||||||
|
@ -1012,7 +1028,7 @@
|
||||||
"kind": 5,
|
"kind": 5,
|
||||||
"importPath": "back.back.urls",
|
"importPath": "back.back.urls",
|
||||||
"description": "back.back.urls",
|
"description": "back.back.urls",
|
||||||
"peekOfCode": "router = routers.DefaultRouter()\nrouter.register(r'api/front_img', frontimg_views.ImageViewSet)\nrouter.register(r'api/obj/element', object_views.Element3DViewSet)\nrouter.register(r'api/obj/clickable', object_views.ClickableAreaViewSet)\nurlpatterns = [\n path('', include(router.urls)),\n path(\"admin/\", admin.site.urls),\n path(\"api/products\", csrf_exempt(views.Products.as_view())),\n path(\"api/floorplan/\", csrf_exempt(views.FloorplanView.as_view())),\n path(\"api/floorplan/<str:id>\", csrf_exempt(views.FloorplanView.as_view())),",
|
"peekOfCode": "router = routers.DefaultRouter()\nrouter.register(r'api/front_img', frontimg_views.ImageViewSet)\nrouter.register(r'api/obj/scene', object_views.Scene3DViewSet)\nrouter.register(r'api/obj/element', object_views.Element3DViewSet)\nrouter.register(r'api/obj/clickable', object_views.ClickableAreaViewSet)\nurlpatterns = [\n path('', include(router.urls)),\n path(\"admin/\", admin.site.urls),\n path(\"api/products\", csrf_exempt(views.Products.as_view())),\n path(\"api/floorplan/\", csrf_exempt(views.FloorplanView.as_view())),",
|
||||||
"detail": "back.back.urls",
|
"detail": "back.back.urls",
|
||||||
"documentation": {}
|
"documentation": {}
|
||||||
},
|
},
|
||||||
|
@ -1169,6 +1185,15 @@
|
||||||
"detail": "back.object.migrations.0008_alter_clickablearea_target",
|
"detail": "back.object.migrations.0008_alter_clickablearea_target",
|
||||||
"documentation": {}
|
"documentation": {}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"label": "Migration",
|
||||||
|
"kind": 6,
|
||||||
|
"importPath": "back.object.migrations.0009_alter_clickablearea_description_and_more",
|
||||||
|
"description": "back.object.migrations.0009_alter_clickablearea_description_and_more",
|
||||||
|
"peekOfCode": "class Migration(migrations.Migration):\n dependencies = [\n ('object', '0008_alter_clickablearea_target'),\n ]\n operations = [\n migrations.AlterField(\n model_name='clickablearea',\n name='description',\n field=models.TextField(verbose_name='описание'),\n ),",
|
||||||
|
"detail": "back.object.migrations.0009_alter_clickablearea_description_and_more",
|
||||||
|
"documentation": {}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"label": "ObjectConfig",
|
"label": "ObjectConfig",
|
||||||
"kind": 6,
|
"kind": 6,
|
||||||
|
@ -1187,12 +1212,21 @@
|
||||||
"detail": "back.object.models",
|
"detail": "back.object.models",
|
||||||
"documentation": {}
|
"documentation": {}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"label": "Scene3D",
|
||||||
|
"kind": 6,
|
||||||
|
"importPath": "back.object.models",
|
||||||
|
"description": "back.object.models",
|
||||||
|
"peekOfCode": "class Scene3D(models.Model):\n name = models.CharField(\n max_length=120,\n )\n elements = models.ManyToManyField(Element3D)\nclass ClickableArea(models.Model):\n name = models.CharField(\"название\", max_length=255)\n description = models.TextField(\"описание\")\n object_name = models.CharField(\"название объекта\", max_length=255)\n target = models.ForeignKey(",
|
||||||
|
"detail": "back.object.models",
|
||||||
|
"documentation": {}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"label": "ClickableArea",
|
"label": "ClickableArea",
|
||||||
"kind": 6,
|
"kind": 6,
|
||||||
"importPath": "back.object.models",
|
"importPath": "back.object.models",
|
||||||
"description": "back.object.models",
|
"description": "back.object.models",
|
||||||
"peekOfCode": "class ClickableArea(models.Model):\n name = models.CharField(max_length=255)\n description = models.TextField()\n object_name = models.CharField(max_length=255)\n target = models.ForeignKey(\n Element3D,\n on_delete=models.PROTECT,\n related_name=\"clickable_areas\",\n blank=True,\n null=True,",
|
"peekOfCode": "class ClickableArea(models.Model):\n name = models.CharField(\"название\", max_length=255)\n description = models.TextField(\"описание\")\n object_name = models.CharField(\"название объекта\", max_length=255)\n target = models.ForeignKey(\n Element3D,\n on_delete=models.PROTECT,\n related_name=\"clickable_areas\",\n blank=True,\n null=True,",
|
||||||
"detail": "back.object.models",
|
"detail": "back.object.models",
|
||||||
"documentation": {}
|
"documentation": {}
|
||||||
},
|
},
|
||||||
|
@ -1219,7 +1253,16 @@
|
||||||
"kind": 6,
|
"kind": 6,
|
||||||
"importPath": "back.object.serializers",
|
"importPath": "back.object.serializers",
|
||||||
"description": "back.object.serializers",
|
"description": "back.object.serializers",
|
||||||
"peekOfCode": "class Element3DSerializer(serializers.ModelSerializer):\n model_file = serializers.ImageField(use_url=False)\n class Meta:\n model = Element3D\n fields = \"__all__\"\nclass ClickableAreaSerializer(serializers.ModelSerializer):\n class Meta:\n model = ClickableArea\n fields = \"__all__\"",
|
"peekOfCode": "class Element3DSerializer(serializers.ModelSerializer):\n model_file = serializers.ImageField(use_url=False)\n class Meta:\n model = Element3D\n fields = \"__all__\"\nclass Scene3DSerializer(serializers.ModelSerializer):\n class Meta:\n model = Scene3D\n fields = \"__all__\"\n depth = 2",
|
||||||
|
"detail": "back.object.serializers",
|
||||||
|
"documentation": {}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Scene3DSerializer",
|
||||||
|
"kind": 6,
|
||||||
|
"importPath": "back.object.serializers",
|
||||||
|
"description": "back.object.serializers",
|
||||||
|
"peekOfCode": "class Scene3DSerializer(serializers.ModelSerializer):\n class Meta:\n model = Scene3D\n fields = \"__all__\"\n depth = 2\nclass ClickableAreaSerializer(serializers.ModelSerializer):\n class Meta:\n model = ClickableArea\n fields = \"__all__\"",
|
||||||
"detail": "back.object.serializers",
|
"detail": "back.object.serializers",
|
||||||
"documentation": {}
|
"documentation": {}
|
||||||
},
|
},
|
||||||
|
@ -1237,7 +1280,7 @@
|
||||||
"kind": 6,
|
"kind": 6,
|
||||||
"importPath": "back.object.views",
|
"importPath": "back.object.views",
|
||||||
"description": "back.object.views",
|
"description": "back.object.views",
|
||||||
"peekOfCode": "class NumberInFilter(django_filters.BaseInFilter, django_filters.NumberFilter):\n pass\nclass ClickableAreaViewSet(viewsets.ModelViewSet):\n queryset = ClickableArea.objects.all()\n serializer_class = ClickableAreaSerializer\n filterset_fields = (\n \"source\",\n \"object_name\",\n )\nclass Element3DFilter(django_filters.rest_framework.FilterSet):",
|
"peekOfCode": "class NumberInFilter(django_filters.BaseInFilter, django_filters.NumberFilter):\n pass\nclass ClickableAreaViewSet(viewsets.ModelViewSet):\n queryset = ClickableArea.objects.all()\n serializer_class = ClickableAreaSerializer\n filterset_fields = (\n \"source\",\n \"object_name\",\n )\nclass Scene3DViewSet(viewsets.ModelViewSet):",
|
||||||
"detail": "back.object.views",
|
"detail": "back.object.views",
|
||||||
"documentation": {}
|
"documentation": {}
|
||||||
},
|
},
|
||||||
|
@ -1246,7 +1289,16 @@
|
||||||
"kind": 6,
|
"kind": 6,
|
||||||
"importPath": "back.object.views",
|
"importPath": "back.object.views",
|
||||||
"description": "back.object.views",
|
"description": "back.object.views",
|
||||||
"peekOfCode": "class ClickableAreaViewSet(viewsets.ModelViewSet):\n queryset = ClickableArea.objects.all()\n serializer_class = ClickableAreaSerializer\n filterset_fields = (\n \"source\",\n \"object_name\",\n )\nclass Element3DFilter(django_filters.rest_framework.FilterSet):\n parent = NumberInFilter(\n field_name=\"parent\",",
|
"peekOfCode": "class ClickableAreaViewSet(viewsets.ModelViewSet):\n queryset = ClickableArea.objects.all()\n serializer_class = ClickableAreaSerializer\n filterset_fields = (\n \"source\",\n \"object_name\",\n )\nclass Scene3DViewSet(viewsets.ModelViewSet):\n queryset = Scene3D.objects.all()\n serializer_class = Scene3DSerializer",
|
||||||
|
"detail": "back.object.views",
|
||||||
|
"documentation": {}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Scene3DViewSet",
|
||||||
|
"kind": 6,
|
||||||
|
"importPath": "back.object.views",
|
||||||
|
"description": "back.object.views",
|
||||||
|
"peekOfCode": "class Scene3DViewSet(viewsets.ModelViewSet):\n queryset = Scene3D.objects.all()\n serializer_class = Scene3DSerializer\n filterset_fields = (\n \"name\",\n )\nclass Element3DFilter(django_filters.rest_framework.FilterSet):\n parent = NumberInFilter(\n field_name=\"parent\",\n lookup_expr=\"in\",",
|
||||||
"detail": "back.object.views",
|
"detail": "back.object.views",
|
||||||
"documentation": {}
|
"documentation": {}
|
||||||
},
|
},
|
||||||
|
|
|
@ -26,6 +26,7 @@ from object import views as object_views
|
||||||
|
|
||||||
router = routers.DefaultRouter()
|
router = routers.DefaultRouter()
|
||||||
router.register(r'api/front_img', frontimg_views.ImageViewSet)
|
router.register(r'api/front_img', frontimg_views.ImageViewSet)
|
||||||
|
router.register(r'api/obj/scene', object_views.Scene3DViewSet)
|
||||||
router.register(r'api/obj/element', object_views.Element3DViewSet)
|
router.register(r'api/obj/element', object_views.Element3DViewSet)
|
||||||
router.register(r'api/obj/clickable', object_views.ClickableAreaViewSet)
|
router.register(r'api/obj/clickable', object_views.ClickableAreaViewSet)
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from .models import Element3D, ClickableArea
|
from .models import ClickableArea, Element3D, Scene3D
|
||||||
|
|
||||||
|
admin.site.register(Scene3D)
|
||||||
admin.site.register(Element3D)
|
admin.site.register(Element3D)
|
||||||
admin.site.register(ClickableArea)
|
admin.site.register(ClickableArea)
|
|
@ -28,6 +28,13 @@ class Element3D(models.Model):
|
||||||
return self.name
|
return self.name
|
||||||
|
|
||||||
|
|
||||||
|
class Scene3D(models.Model):
|
||||||
|
name = models.CharField(
|
||||||
|
max_length=120,
|
||||||
|
)
|
||||||
|
elements = models.ManyToManyField(Element3D)
|
||||||
|
|
||||||
|
|
||||||
class ClickableArea(models.Model):
|
class ClickableArea(models.Model):
|
||||||
name = models.CharField("название", max_length=255)
|
name = models.CharField("название", max_length=255)
|
||||||
description = models.TextField("описание")
|
description = models.TextField("описание")
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
from .models import Element3D, ClickableArea
|
from .models import Scene3D, Element3D, ClickableArea
|
||||||
|
|
||||||
|
|
||||||
class Element3DSerializer(serializers.ModelSerializer):
|
class Element3DSerializer(serializers.ModelSerializer):
|
||||||
|
@ -8,6 +8,12 @@ class Element3DSerializer(serializers.ModelSerializer):
|
||||||
model = Element3D
|
model = Element3D
|
||||||
fields = "__all__"
|
fields = "__all__"
|
||||||
|
|
||||||
|
class Scene3DSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = Scene3D
|
||||||
|
fields = "__all__"
|
||||||
|
depth = 2
|
||||||
|
|
||||||
class ClickableAreaSerializer(serializers.ModelSerializer):
|
class ClickableAreaSerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = ClickableArea
|
model = ClickableArea
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
from rest_framework import viewsets
|
from rest_framework import viewsets
|
||||||
import django_filters
|
import django_filters
|
||||||
|
|
||||||
from .models import ClickableArea, Element3D
|
from .models import ClickableArea, Element3D, Scene3D
|
||||||
from .serializers import ClickableAreaSerializer, Element3DSerializer
|
from .serializers import ClickableAreaSerializer, Element3DSerializer, Scene3DSerializer
|
||||||
|
|
||||||
|
|
||||||
class NumberInFilter(django_filters.BaseInFilter, django_filters.NumberFilter):
|
class NumberInFilter(django_filters.BaseInFilter, django_filters.NumberFilter):
|
||||||
|
@ -17,7 +17,13 @@ class ClickableAreaViewSet(viewsets.ModelViewSet):
|
||||||
"object_name",
|
"object_name",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
class Scene3DViewSet(viewsets.ModelViewSet):
|
||||||
|
queryset = Scene3D.objects.all()
|
||||||
|
serializer_class = Scene3DSerializer
|
||||||
|
filterset_fields = (
|
||||||
|
"name",
|
||||||
|
)
|
||||||
|
|
||||||
class Element3DFilter(django_filters.rest_framework.FilterSet):
|
class Element3DFilter(django_filters.rest_framework.FilterSet):
|
||||||
parent = NumberInFilter(
|
parent = NumberInFilter(
|
||||||
field_name="parent",
|
field_name="parent",
|
||||||
|
|
|
@ -24,17 +24,14 @@ function shadows_and_pos(scene: any) {
|
||||||
const models = ref<model3DType[]>([])
|
const models = ref<model3DType[]>([])
|
||||||
const clickable = ref<clickableAreaType[]>([])
|
const clickable = ref<clickableAreaType[]>([])
|
||||||
const clickable_objects = ref<any[]>([])
|
const clickable_objects = ref<any[]>([])
|
||||||
const { controls, raycaster, camera, scene, renderer } = useTresContext()
|
const { controls, raycaster, camera, scene } = useTresContext()
|
||||||
const { seekByName } = useSeek()
|
const { seekByName } = useSeek()
|
||||||
const sidebar = usePromoSidebar()
|
const sidebar = usePromoSidebar()
|
||||||
|
|
||||||
const loadModels = async () => {
|
const loadModels = async () => {
|
||||||
const res = await fetch(`${SERVER_URL}/api/obj/element/${props.source}`)
|
const res = await fetch(`${SERVER_URL}/api/obj/scene/${props.source}`)
|
||||||
const raw_data = await res.json() as element3DType[] | element3DType
|
const raw_data = await res.json() as scene3D
|
||||||
let data = raw_data as element3DType[]
|
const data = raw_data.elements
|
||||||
if (props.source.endsWith('/')) {
|
|
||||||
data = [raw_data] as element3DType[]
|
|
||||||
}
|
|
||||||
if (!controls.value) return
|
if (!controls.value) return
|
||||||
const c = (controls.value as any)
|
const c = (controls.value as any)
|
||||||
const distance = {
|
const distance = {
|
||||||
|
|
|
@ -36,9 +36,9 @@ const point_light = reactive({
|
||||||
})
|
})
|
||||||
|
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
const source = ref(route.params.target ? (route.params.target.toString() + '/') : '?parent__isnull=True')
|
const source = ref(route.params.target ? (route.params.target.toString() + '/') : '1/')
|
||||||
watch(() => route.params.target, () => {
|
watch(() => route.params.target, () => {
|
||||||
let t = '?parent__isnull=True'
|
let t = '1'
|
||||||
if (route.params.target) t = route.params.target.toString() + '/'
|
if (route.params.target) t = route.params.target.toString() + '/'
|
||||||
if (source.value !== t) {
|
if (source.value !== t) {
|
||||||
source.value = t
|
source.value = t
|
||||||
|
|
|
@ -9,7 +9,11 @@ interface ProductInfo {
|
||||||
image3?: string
|
image3?: string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface scene3D {
|
||||||
|
id: number,
|
||||||
|
name: string,
|
||||||
|
elements: element3DType[]
|
||||||
|
}
|
||||||
interface element3DType {
|
interface element3DType {
|
||||||
id: number
|
id: number
|
||||||
model_file: string
|
model_file: string
|
||||||
|
|
Loading…
Reference in New Issue