From 50d0c4c12b9130b1abeaead9b42a2e9143f77408 Mon Sep 17 00:00:00 2001 From: IDONTSUDO Date: Tue, 25 Jun 2024 12:43:41 +0300 Subject: [PATCH] progress scene builder --- server/src/core/controllers/routes.ts | 2 + ...ssembler_assets_network_mapper_scenario.ts | 46 ++- .../domain/set_active_project_use_scenario.ts | 32 +- .../features/scene/scene_database_model.ts | 13 + .../src/features/scene/scene_presentation.ts | 13 + .../features/scene/scene_validation_model.ts | 7 + ui/public/index.html | 3 +- ui/src/core/extensions/extensions.ts | 4 +- ui/src/core/extensions/number.ts | 21 +- .../core/repository/core_three_repository.ts | 8 +- ui/src/core/repository/http_repository.ts | 2 +- ui/src/core/routers/routers.tsx | 26 +- ui/src/core/store/base_store.ts | 19 +- ui/src/core/ui/button/button.tsx | 2 + ui/src/core/ui/header/header.tsx | 8 +- ui/src/core/ui/icons/icons.tsx | 40 +++ ui/src/core/ui/pages/load_page.tsx | 2 +- ui/src/core/ui/pages/main_page.tsx | 3 +- ui/src/core/ui/pages/preview_page.tsx | 61 ++++ ui/src/core/ui/text/text.tsx | 14 + .../model/stick_objects_marking_store_mode.ts | 7 - .../model/sticky_helper.ts | 20 -- .../model/sticky_loader_mode.ts | 4 - .../stick_objects_marking_screen.tsx | 148 --------- .../stick_objects_marking_store.tsx | 120 ------- .../stick_objects_marking_three_repository.ts | 79 ----- .../data/project_http_repository.ts | 24 ++ .../all_projects/data/project_repository.ts | 16 - .../all_projects/model/project_model.ts | 6 +- .../presentation/all_projects_screen.tsx | 125 ++++--- .../presentation/all_projects_store.ts | 70 ++-- .../data/behavior_tree_builder_repository.ts | 1 - .../behavior_tree_builder_screen.tsx | 8 +- .../behavior_tree_builder_store.tsx | 6 +- .../presentation/ui/forms/forms.tsx | 11 +- .../create_project_repository.ts | 20 -- .../create_project/create_project_screen.tsx | 49 --- .../create_project/create_project_store.ts | 51 --- .../features/create_project/project_model.ts | 3 - .../dataset/dataset_http_repository.ts | 2 - ui/src/features/dataset/dataset_store.ts | 2 +- ui/src/features/details/details_screen.tsx | 11 +- .../pipeline_instance_repository.ts | 1 - .../pipeline_instance_screen.tsx | 25 -- .../pipeline_instance_store.ts | 9 - .../data/scene_http_repository.ts | 12 + .../scene_manager/data/scene_repository.ts | 19 -- .../scene_manager/model/scene_assets.ts | 15 +- .../scene_manager/model/scene_model.ts | 4 + .../scene_manager/model/scene_view_model.ts | 17 + .../presentation/forms/camera/camera_form.tsx | 46 +++ .../presentation/forms/robot/robot_form.tsx | 6 + .../forms/scene_manager_forms.tsx | 23 ++ .../forms/solid_body/solid_body_form.tsx | 5 + .../forms/solid_body/solid_body_store.tsx | 41 +++ .../forms/solid_body/solid_body_view_model.ts | 7 + .../presentation/scene_manager.tsx | 305 ++++++++++-------- .../presentation/scene_manager_store.ts | 105 ++++-- ui/src/features/skils/skills_screen.tsx | 10 +- ui/src/features/skils/skills_store.tsx | 12 +- .../features/socket_lister/socket_lister.tsx | 4 +- .../stick_objects_marking_screen.tsx | 133 -------- .../stick_objects_marking_store.tsx | 164 ---------- .../stick_objects_marking_three_repository.ts | 101 ------ 64 files changed, 858 insertions(+), 1315 deletions(-) create mode 100644 server/src/features/scene/scene_database_model.ts create mode 100644 server/src/features/scene/scene_presentation.ts create mode 100644 server/src/features/scene/scene_validation_model.ts create mode 100644 ui/src/core/ui/pages/preview_page.tsx delete mode 100644 ui/src/features/_stick_objects_marking/model/stick_objects_marking_store_mode.ts delete mode 100644 ui/src/features/_stick_objects_marking/model/sticky_helper.ts delete mode 100644 ui/src/features/_stick_objects_marking/model/sticky_loader_mode.ts delete mode 100644 ui/src/features/_stick_objects_marking/stick_objects_marking_screen.tsx delete mode 100644 ui/src/features/_stick_objects_marking/stick_objects_marking_store.tsx delete mode 100644 ui/src/features/_stick_objects_marking/stick_objects_marking_three_repository.ts create mode 100644 ui/src/features/all_projects/data/project_http_repository.ts delete mode 100644 ui/src/features/all_projects/data/project_repository.ts delete mode 100644 ui/src/features/create_project/create_project_repository.ts delete mode 100644 ui/src/features/create_project/create_project_screen.tsx delete mode 100644 ui/src/features/create_project/create_project_store.ts delete mode 100644 ui/src/features/create_project/project_model.ts delete mode 100644 ui/src/features/pipeline_instance_main_screen/pipeline_instance_repository.ts delete mode 100644 ui/src/features/pipeline_instance_main_screen/pipeline_instance_screen.tsx delete mode 100644 ui/src/features/pipeline_instance_main_screen/pipeline_instance_store.ts create mode 100644 ui/src/features/scene_manager/data/scene_http_repository.ts delete mode 100644 ui/src/features/scene_manager/data/scene_repository.ts create mode 100644 ui/src/features/scene_manager/model/scene_model.ts create mode 100644 ui/src/features/scene_manager/model/scene_view_model.ts create mode 100644 ui/src/features/scene_manager/presentation/forms/camera/camera_form.tsx create mode 100644 ui/src/features/scene_manager/presentation/forms/robot/robot_form.tsx create mode 100644 ui/src/features/scene_manager/presentation/forms/scene_manager_forms.tsx create mode 100644 ui/src/features/scene_manager/presentation/forms/solid_body/solid_body_form.tsx create mode 100644 ui/src/features/scene_manager/presentation/forms/solid_body/solid_body_store.tsx create mode 100644 ui/src/features/scene_manager/presentation/forms/solid_body/solid_body_view_model.ts delete mode 100644 ui/src/features/stick_objects_marking/stick_objects_marking_screen.tsx delete mode 100644 ui/src/features/stick_objects_marking/stick_objects_marking_store.tsx delete mode 100644 ui/src/features/stick_objects_marking/stick_objects_marking_three_repository.ts diff --git a/server/src/core/controllers/routes.ts b/server/src/core/controllers/routes.ts index 2c45147..035c4a9 100644 --- a/server/src/core/controllers/routes.ts +++ b/server/src/core/controllers/routes.ts @@ -4,6 +4,7 @@ import { WeightsPresentation } from "../../features/weights/weights_presentation import { ProjectsPresentation } from "../../features/projects/projects_presentation"; import { extensions } from "../extensions/extensions"; import { Routes } from "../interfaces/router"; +import { ScenePresentation } from "../../features/scene/scene_presentation"; extensions(); @@ -12,4 +13,5 @@ export const httpRoutes: Routes[] = [ new DatasetsPresentation(), new BehaviorTreesPresentation(), new WeightsPresentation(), + new ScenePresentation() ].map((el) => el.call()); diff --git a/server/src/features/projects/domain/robossembler_assets_network_mapper_scenario.ts b/server/src/features/projects/domain/robossembler_assets_network_mapper_scenario.ts index da755cc..8625e9b 100644 --- a/server/src/features/projects/domain/robossembler_assets_network_mapper_scenario.ts +++ b/server/src/features/projects/domain/robossembler_assets_network_mapper_scenario.ts @@ -9,25 +9,37 @@ export interface Parts { name: string; part_path: string; material_path: string; - stlUrl?: string; + stlUrl: string; + image: string; + glUrl: string; } + export class RobossemblerAssetsNetworkMapperScenario extends CallbackStrategyWithEmpty { - call = async (): ResponseBase => (await new SearchManyDataBaseModelUseCase(ProjectDBModel).call({ isActive: true }, 'is dont active projects')).map((projectModel) => { - const { rootDir } = projectModel[0]; - return new GetServerAddressUseCase().call().map(async (address) => - ( - await new ReadFileAndParseJsonUseCase().call( - rootDir + StaticFiles.parts - ) - ).map((model) => { + call = async (): ResponseBase => + ( + await new SearchManyDataBaseModelUseCase(ProjectDBModel).call( + { isActive: true }, + "is dont active projects" + ) + ).map((projectModel) => { + const { rootDir } = projectModel[0]; + return new GetServerAddressUseCase().call().map(async (serverAddress) => + (await new ReadFileAndParseJsonUseCase().call(rootDir + StaticFiles.parts)).map((model) => { + const assetAddress = + serverAddress + + "/" + + rootDir.match(new RegExp(/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gm))[0] + + "/assets/"; + model.map((el) => { + const assetLibsAddress = assetAddress + "libs/objects/" + el.name; - model.map((el) => { - el.stlUrl = address + '/' + rootDir.match(new RegExp(/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gm))[0] + '/assets/' + el.part_path - return el + el.stlUrl = `${assetAddress}${el.part_path}`; + el.glUrl = `${assetLibsAddress}.glb`; + el.image = `${assetLibsAddress}.png`; + return el; + }); + return Result.ok(model); }) - return Result.ok(model); - - }) - ); - }) + ); + }); } diff --git a/server/src/features/projects/domain/set_active_project_use_scenario.ts b/server/src/features/projects/domain/set_active_project_use_scenario.ts index 5cb5caa..e511259 100644 --- a/server/src/features/projects/domain/set_active_project_use_scenario.ts +++ b/server/src/features/projects/domain/set_active_project_use_scenario.ts @@ -7,22 +7,24 @@ import { ReadByIdDataBaseModelUseCase } from "../../../core/usecases/read_by_id_ import { UpdateDataBaseModelUseCase } from "../../../core/usecases/update_database_model_usecase"; import { MongoIdValidation } from "../../../core/validations/mongo_id_validation"; import { IProjectModel, ProjectDBModel } from "../models/project_model_database_model"; - + export class SetActiveProjectScenario extends CallbackStrategyWithIdQuery { idValidationExpression = new MongoIdValidation(); - call = async (id: string): ResponseBase => (await (await new ReadByIdDataBaseModelUseCase(ProjectDBModel).call(id)).map(async (model) => await ( - await new CreateFolderUseCase().call(model.rootDir) - ).map(async () => { - model.isActive = true; - return (await new UpdateDataBaseModelUseCase(ProjectDBModel).call(model)).map(async (el) => { - await ProjectDBModel.updateMany( - { _id: { $ne: el._id }, isActive: { $eq: true } }, - { isActive: false } - ); - await new SetLastActivePipelineToRealTimeServiceScenario().call(); - return Result.ok(`project ${id} is active`); - }); - }))) + call = async (id: string): ResponseBase => + await ( + await new ReadByIdDataBaseModelUseCase(ProjectDBModel).call(id) + ).map( + async (model) => + await ( + await new CreateFolderUseCase().call(model.rootDir) + ).map(async () => { + model.isActive = true; + return (await new UpdateDataBaseModelUseCase(ProjectDBModel).call(model)).map(async (el) => { + await ProjectDBModel.updateMany({ _id: { $ne: el._id }, isActive: { $eq: true } }, { isActive: false }); + await new SetLastActivePipelineToRealTimeServiceScenario().call(); + return Result.ok(`project ${id} is active`); + }); + }) + ); } - diff --git a/server/src/features/scene/scene_database_model.ts b/server/src/features/scene/scene_database_model.ts new file mode 100644 index 0000000..58f8d9c --- /dev/null +++ b/server/src/features/scene/scene_database_model.ts @@ -0,0 +1,13 @@ +import { Schema, model } from "mongoose"; +export interface IScene { + name: string; +} +export const SceneSchema = new Schema({ + name: { + type: String, + }, +}).plugin(require("mongoose-autopopulate")); + +export const schemaSceneName = "Scene"; + +export const SceneDBModel = model(schemaSceneName, SceneSchema); diff --git a/server/src/features/scene/scene_presentation.ts b/server/src/features/scene/scene_presentation.ts new file mode 100644 index 0000000..a071195 --- /dev/null +++ b/server/src/features/scene/scene_presentation.ts @@ -0,0 +1,13 @@ +import { CrudController } from "../../core/controllers/crud_controller"; +import { SceneDBModel } from "./scene_database_model"; +import { SceneValidationModel } from "./scene_validation_model"; + +export class ScenePresentation extends CrudController { + constructor() { + super({ + url: "scenes", + validationModel: SceneValidationModel, + databaseModel: SceneDBModel, + }); + } +} diff --git a/server/src/features/scene/scene_validation_model.ts b/server/src/features/scene/scene_validation_model.ts new file mode 100644 index 0000000..f32dff5 --- /dev/null +++ b/server/src/features/scene/scene_validation_model.ts @@ -0,0 +1,7 @@ +import { IsString } from "class-validator"; +import { IScene } from "./scene_database_model"; + +export class SceneValidationModel implements IScene { + @IsString() + public name: string; +} diff --git a/ui/public/index.html b/ui/public/index.html index 1407629..bc59c2b 100644 --- a/ui/public/index.html +++ b/ui/public/index.html @@ -14,7 +14,7 @@ -
+
\ No newline at end of file diff --git a/ui/src/core/extensions/extensions.ts b/ui/src/core/extensions/extensions.ts index 90a5bdd..b237062 100644 --- a/ui/src/core/extensions/extensions.ts +++ b/ui/src/core/extensions/extensions.ts @@ -32,6 +32,8 @@ declare global { randRange(min: number, max: number): number; isPositive(): boolean; isNegative(): boolean; + isEven(): boolean; + isOdd(): boolean; } interface String { @@ -42,7 +44,7 @@ declare global { isEqualMany(str: string[]): boolean; hasPattern(pattern: string): boolean; hasNoPattern(pattern: string): boolean; - divideByIndex(index: number): string[] + divideByIndex(index: number): string[]; } interface Map { diff --git a/ui/src/core/extensions/number.ts b/ui/src/core/extensions/number.ts index 0140086..19b8001 100644 --- a/ui/src/core/extensions/number.ts +++ b/ui/src/core/extensions/number.ts @@ -20,7 +20,7 @@ export const NumberExtensions = () => { return !isNaN(Number(str)); }; } - if (Number().randRange === undefined) { + if (Number().randRange === undefined) { Number.prototype.randRange = function (min, max) { return Math.random() * (max - min) + min; }; @@ -30,10 +30,19 @@ export const NumberExtensions = () => { return Math.sign(Number(this)) === 1; }; } - if(Number().isNegative === undefined){ - Number.prototype.isNegative = function (){ - return !this.isPositive() - } + if (Number().isNegative === undefined) { + Number.prototype.isNegative = function () { + return !this.isPositive(); + }; + } + if (Number().isEven === undefined) { + Number.prototype.isEven = function () { + return Number(this) % 2 === 0; + }; + } + if (Number().isOdd === undefined) { + Number.prototype.isOdd = function () { + return !this.isEven(); + }; } }; - \ No newline at end of file diff --git a/ui/src/core/repository/core_three_repository.ts b/ui/src/core/repository/core_three_repository.ts index 0ae0812..d42ebfd 100644 --- a/ui/src/core/repository/core_three_repository.ts +++ b/ui/src/core/repository/core_three_repository.ts @@ -94,7 +94,7 @@ export class CoreThreeRepository extends TypedEvent { alpha: true, }); const aspectCamera = this.htmlSceneWidth / this.htmlSceneHeight; - this.camera = new PerspectiveCamera(800, aspectCamera, 0.1, 10000); + this.camera = new PerspectiveCamera(100, aspectCamera, 0.1, 2000); this.camera.position.set(60, 20, 10); this.webGlRender = renderer; @@ -151,7 +151,7 @@ export class CoreThreeRepository extends TypedEvent { cube.position.copy(vector); } this.scene.add(cube); - // this.scene.children. + } deleteSceneItem(item: BaseSceneItemModel) { const updateScene = this.scene; @@ -159,7 +159,7 @@ export class CoreThreeRepository extends TypedEvent { } loadUrdf = (urlPath: string) => { this.urdfLoader.load( - urlPath, // The path to the URDF within the package OR absolute + urlPath, robot => { this.scene.add(robot) @@ -333,7 +333,7 @@ export class CoreThreeRepository extends TypedEvent { init() { this.light(); this.addListeners(); - const floor = new GridHelper(100, 100, 0x888888, 0x444444); + const floor = new GridHelper(1000, 100, 0x888888, 0x444444); floor.geometry.rotateX(Math.PI * 0.5) floor.userData = {}; floor.userData[UserData.cameraInitialization] = true; diff --git a/ui/src/core/repository/http_repository.ts b/ui/src/core/repository/http_repository.ts index ac98232..afbee9c 100644 --- a/ui/src/core/repository/http_repository.ts +++ b/ui/src/core/repository/http_repository.ts @@ -1,7 +1,7 @@ import { ClassConstructor, plainToInstance } from "class-transformer"; import { Result } from "../helper/result"; import { Parts } from "../../features/details/details_http_repository"; -import { UUID } from "../../features/all_projects/data/project_repository"; +import { UUID } from "../../features/all_projects/data/project_http_repository"; export enum HttpMethod { GET = "GET", diff --git a/ui/src/core/routers/routers.tsx b/ui/src/core/routers/routers.tsx index ae0af1b..286deba 100644 --- a/ui/src/core/routers/routers.tsx +++ b/ui/src/core/routers/routers.tsx @@ -1,21 +1,11 @@ import { createBrowserRouter } from "react-router-dom"; import { AllProjectScreen, AllProjectScreenPath } from "../../features/all_projects/presentation/all_projects_screen"; -import { - PipelineInstanceScreen, - PipelineInstanceScreenPath, -} from "../../features/pipeline_instance_main_screen/pipeline_instance_screen"; - -import { CreateProjectScreen, CreateProjectScreenPath } from "../../features/create_project/create_project_screen"; - import { SceneManger, SceneManagerPath } from "../../features/scene_manager/presentation/scene_manager"; import { BehaviorTreeBuilderPath, BehaviorTreeBuilderScreen, } from "../../features/behavior_tree_builder/presentation/behavior_tree_builder_screen"; -import { - StickObjectsMarkingScreen, - StickObjectsMarkingScreenPath, -} from "../../features/_stick_objects_marking/stick_objects_marking_screen"; + import { DataSetScreen, DatasetsScreenPath } from "../../features/dataset/dataset_screen"; import { AssemblesScreen, AssemblesScreenPath } from "../../features/assembles/assembles_screen"; import { SimulationScreen, SimulationScreenPath } from "../../features/simulations/simulations_screen"; @@ -31,15 +21,9 @@ export const router = createBrowserRouter([ element: , }, { - path: PipelineInstanceScreenPath + idURL, - element: , + path: SceneManagerPath + idURL, + element: , }, - - { - path: CreateProjectScreenPath, - element: , - }, - { path: SceneManagerPath, element: , @@ -52,10 +36,6 @@ export const router = createBrowserRouter([ path: BehaviorTreeBuilderPath + idURL, element: , }, - { - path: StickObjectsMarkingScreenPath, - element: , - }, { path: DatasetsScreenPath, element: , diff --git a/ui/src/core/store/base_store.ts b/ui/src/core/store/base_store.ts index 13792a1..8d8fa25 100644 --- a/ui/src/core/store/base_store.ts +++ b/ui/src/core/store/base_store.ts @@ -59,11 +59,24 @@ export class SimpleErrorState extends UiLoader { }; isError = false; } +export class ModalStore extends SimpleErrorState { + isModalOpen: boolean = false; + showModal = () => { + this.isModalOpen = true + }; + handleOk = () => { + this.isModalOpen = false + }; + + handleCancel = () => { + this.isModalOpen = false + }; +} export abstract class UiErrorState extends UiLoader { abstract errorHandingStrategy: (error: T) => void; abstract init(navigate?: NavigateFunction): Promise; - dispose() {} + dispose() { } errors: UiBaseError[] = []; } @@ -79,7 +92,7 @@ export abstract class DrawerState extends UiErrorState { }; }); } - edtDrawer(drawerName: string, status: boolean): void { + editDrawer(drawerName: string, status: boolean): void { this.titleDrawer = drawerName; this.drawers = this.drawers.map((el) => { if (el.name === drawerName) { @@ -89,7 +102,7 @@ export abstract class DrawerState extends UiErrorState { }); } } -export abstract class UiFormState extends DrawerState { +export abstract class UiDrawerFormState extends DrawerState { abstract viewModel: V; updateForm(value: Partial) { //@ts-ignore diff --git a/ui/src/core/ui/button/button.tsx b/ui/src/core/ui/button/button.tsx index bdb73c3..0cc747c 100644 --- a/ui/src/core/ui/button/button.tsx +++ b/ui/src/core/ui/button/button.tsx @@ -7,6 +7,7 @@ export interface IButtonProps extends IStyle { filled?: boolean; text?: string; onClick?: any; + textStyle?:React.CSSProperties } export function CoreButton(props: IButtonProps) { @@ -29,6 +30,7 @@ export function CoreButton(props: IButtonProps) { diff --git a/ui/src/core/ui/header/header.tsx b/ui/src/core/ui/header/header.tsx index a2810a0..fc788ba 100644 --- a/ui/src/core/ui/header/header.tsx +++ b/ui/src/core/ui/header/header.tsx @@ -10,7 +10,7 @@ const { Title } = Typography; export interface IHeader { largeText?: string; minText?: string; - path?: string; + click?: Function; needBackButton?: undefined | any; } @@ -78,17 +78,17 @@ export const Header: React.FunctionComponent = (props: IHeader) => { )} - {props.minText !== undefined ? ( + {/* {props.minText !== undefined ? ( ) : ( <> - )} + )} */} ); }; diff --git a/ui/src/core/ui/icons/icons.tsx b/ui/src/core/ui/icons/icons.tsx index 10102fc..75dfb8f 100644 --- a/ui/src/core/ui/icons/icons.tsx +++ b/ui/src/core/ui/icons/icons.tsx @@ -420,6 +420,46 @@ const getIconSvg = (type: string): Result => { ); + case "Play": + return Result.ok( + + + + ); + case "Scene": + return Result.ok( + + Svg Vector Icons : http://www.onlinewebfonts.com/icon + + + + + + + + + ); + case "Camera": + return Result.ok( + + + + ); case "Settings": return Result.ok( diff --git a/ui/src/core/ui/pages/load_page.tsx b/ui/src/core/ui/pages/load_page.tsx index 5903ad6..a1141c6 100644 --- a/ui/src/core/ui/pages/load_page.tsx +++ b/ui/src/core/ui/pages/load_page.tsx @@ -17,7 +17,7 @@ export const LoadPage: React.FunctionComponent = observer( return ( <>
{ { name: "Детали", path: DetailsScreenPath, icon: "Setting" }, { name: "Сборки", path: AssemblesScreenPath, icon: "Assembly" }, { name: "Датасеты", path: DatasetsScreenPath, icon: "Datasets" }, - { name: "Сцена", path: SceneManagerPath, icon: "Layers" }, + { name: "Сцена", path: SceneManagerPath, icon: "Scene" }, { name: "Навыки", path: SkillScreenPath, icon: "Layers" }, { name: "Поведение", path: BehaviorTreeBuilderPath, icon: "Rocket" }, { name: "Симуляция", path: SimulationScreenPath, icon: "Simulation" }, diff --git a/ui/src/core/ui/pages/preview_page.tsx b/ui/src/core/ui/pages/preview_page.tsx new file mode 100644 index 0000000..d3f765e --- /dev/null +++ b/ui/src/core/ui/pages/preview_page.tsx @@ -0,0 +1,61 @@ +import { IHeader } from "../header/header"; +import { CoreText, CoreTextType } from "../text/text"; +import { Spin } from "antd"; + +interface IPreviewPageProps extends IHeader { + isLoading: boolean; + isError: boolean; + children?: JSX.Element | JSX.Element[]; +} +export const PreviewPage = (props: IPreviewPageProps) => { + return ( +
+
+ + { + console.log(200); + if (props.click) props.click(); + }} + text={props.minText ?? ""} + type={CoreTextType.small} + style={{ color: "rgba(68, 142, 247, 1)", cursor: "pointer" }} + /> +
+
+
+ {props.isLoading ? ( +
+ +
+ ) : ( + props.children + )} +
+
+
+ ); +}; diff --git a/ui/src/core/ui/text/text.tsx b/ui/src/core/ui/text/text.tsx index 5ea6030..b5e4a80 100644 --- a/ui/src/core/ui/text/text.tsx +++ b/ui/src/core/ui/text/text.tsx @@ -6,12 +6,14 @@ export enum CoreTextType { medium = 'medium', large = 'large', small = 'small', + big = 'big' } export interface ITextProps extends IStyle { text: string; type: CoreTextType; color?: string; + onClick?: Function; } const getStyle = (type: CoreTextType, color: string | undefined) => { @@ -49,6 +51,15 @@ const getStyle = (type: CoreTextType, color: string | undefined) => { fontSizeAdjust: 16, } + if (type.isEqual(CoreTextType.big)) return { + color: color ?? "#1D1B20", + fontSize: 40, + fontFamily: "Roboto", + fontWeight: 500, + textOverflow: "ellipsis", + + fontSizeAdjust: 16, + } return { color: color ?? "rgba(73, 69, 79, 1)", fontSize: 12, @@ -64,6 +75,9 @@ const appendStyle = (type: CoreTextType, color: string | undefined, style: React export function CoreText(props: ITextProps) { return (
{ + if (props.onClick) props.onClick() + }} style={appendStyle(props.type, props.color, props.style)} > {props.text} diff --git a/ui/src/features/_stick_objects_marking/model/stick_objects_marking_store_mode.ts b/ui/src/features/_stick_objects_marking/model/stick_objects_marking_store_mode.ts deleted file mode 100644 index ef1699e..0000000 --- a/ui/src/features/_stick_objects_marking/model/stick_objects_marking_store_mode.ts +++ /dev/null @@ -1,7 +0,0 @@ -export enum StickObjectsMarkingStoreMode { - objectsToWhichItSticks = "objectsToWhichItSticks", - objectThatSticks = "objectThatSticks", - addPointsObjectsToWhichItSticks = "addPointsObjectsToWhichItSticks", - addPointsObjectThatSticks = "addPointsObjectThatSticks", - move = "move", -} diff --git a/ui/src/features/_stick_objects_marking/model/sticky_helper.ts b/ui/src/features/_stick_objects_marking/model/sticky_helper.ts deleted file mode 100644 index df82c3c..0000000 --- a/ui/src/features/_stick_objects_marking/model/sticky_helper.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Vector3 } from "three"; - -export class StickyHelper { - objectThatSticksName: string; - objectThatSticksNamePoints: Vector3[] = []; - objectsToWhichItSticksName: string; - objectsToWhichItSticksPoints: Vector3[] = []; - - constructor( - objectThatSticksName: string, - objectThatSticksNamePoints: Vector3[], - objectsToWhichItSticksName: string, - objectsToWhichItSticksPoints: Vector3[] - ) { - this.objectThatSticksName = objectThatSticksName; - this.objectThatSticksNamePoints = objectThatSticksNamePoints; - this.objectsToWhichItSticksName = objectsToWhichItSticksName; - this.objectsToWhichItSticksPoints = objectsToWhichItSticksPoints; - } -} diff --git a/ui/src/features/_stick_objects_marking/model/sticky_loader_mode.ts b/ui/src/features/_stick_objects_marking/model/sticky_loader_mode.ts deleted file mode 100644 index 3c21147..0000000 --- a/ui/src/features/_stick_objects_marking/model/sticky_loader_mode.ts +++ /dev/null @@ -1,4 +0,0 @@ -export enum StickyLoaderMode { - IN = "IN", - OUT = "OUT", -} diff --git a/ui/src/features/_stick_objects_marking/stick_objects_marking_screen.tsx b/ui/src/features/_stick_objects_marking/stick_objects_marking_screen.tsx deleted file mode 100644 index dc16830..0000000 --- a/ui/src/features/_stick_objects_marking/stick_objects_marking_screen.tsx +++ /dev/null @@ -1,148 +0,0 @@ -import * as React from "react"; -import { observer } from "mobx-react-lite"; -import { useParams } from "react-router-dom"; -import { Button } from "antd"; -import { StickObjectsMarkingStore } from "./stick_objects_marking_store"; -import { Vector3 } from "three"; -import { StickObjectsMarkingStoreMode } from "./model/stick_objects_marking_store_mode"; -import { StickyLoaderMode } from "./model/sticky_loader_mode"; - -export const StickObjectsMarking = "/stick/objects/marking"; -interface StickButtonsProps { - isVisible: boolean; - name: string; - groupMode: StickObjectsMarkingStoreMode; - storeMode: StickObjectsMarkingStoreMode; - storeModePoints: StickObjectsMarkingStoreMode; - setMode: Function; - setPointMode: Function; - points: Vector3[]; - body: string; -} - -export const StickButtons: React.FunctionComponent = observer((props) => { - return ( - <> - {props.isVisible ? ( - <> - {props.name} - - {props.points.map((el) => { - return ( - <> - {el.x} {el.y} {el.z} - - ); - })} - - ) : ( - - )} - - ); -}); -export const StickObjectsMarkingScreenPath = "/sticky/objects/mark"; -export const StickObjectsMarkingScreen = observer(() => { - const canvasRef = React.useRef(null); - const [store] = React.useState(() => new StickObjectsMarkingStore()); - const id = useParams().id as string; - - React.useEffect(() => { - store.init(); - store.loadScene(canvasRef.current!); - document.body.style.overflow = "hidden"; - return () => { - document.body.style.overflow = "scroll"; - store.dispose(); - }; - }, [id, store]); - - return ( -
- -
-
- {store.stickyObjects?.map((el) => { - return ( -
-
- - -
-
{el.name}
-
- ); - })} -
- {/*
- {Object.keys(store.points).map((el) => { - // @ts-expect-error - const v = store.points[el]; - return ( - <> -
- {el as string}:{v} -
- - ); - })} -
Marking objects for sticking
-
- store.setMode(StickObjectsMarkingStoreMode.objectThatSticks)} - groupMode={StickObjectsMarkingStoreMode.objectThatSticks} - name={store.objectThatSticksName} - storeModePoints={StickObjectsMarkingStoreMode.addPointsObjectThatSticks} - isVisible={store.objectThatSticksName !== undefined} - setPointMode={() => store.setMode(StickObjectsMarkingStoreMode.addPointsObjectThatSticks)} - points={store.objectThatSticksNamePoints} - body="objectThatSticksName" - /> - store.setMode(StickObjectsMarkingStoreMode.objectsToWhichItSticks)} - groupMode={StickObjectsMarkingStoreMode.objectsToWhichItSticks} - name={store.objectsToWhichItSticksName} - storeModePoints={StickObjectsMarkingStoreMode.addPointsObjectsToWhichItSticks} - isVisible={store.objectsToWhichItSticksName !== undefined} - setPointMode={() => store.setMode(StickObjectsMarkingStoreMode.addPointsObjectsToWhichItSticks)} - /> - - -
-
*/} -
-
- ); -}); diff --git a/ui/src/features/_stick_objects_marking/stick_objects_marking_store.tsx b/ui/src/features/_stick_objects_marking/stick_objects_marking_store.tsx deleted file mode 100644 index dc68b23..0000000 --- a/ui/src/features/_stick_objects_marking/stick_objects_marking_store.tsx +++ /dev/null @@ -1,120 +0,0 @@ -import makeAutoObservable from "mobx-store-inheritance"; -import { Box3, Vector2, Vector3 } from "three"; -import { UiErrorState } from "../../core/store/base_store"; -import { HttpError } from "../../core/repository/http_repository"; -import { UiBaseError } from "../../core/model/ui_base_error"; -import { RobossemblerFiles } from "../scene_manager/model/scene_assets"; -import { StickObjectsMarkingThreeRepository } from "./stick_objects_marking_three_repository"; -import { UserData } from "../../core/repository/core_three_repository"; -import { SceneHttpRepository } from "../scene_manager/data/scene_repository"; -import { Asset, RobossemblerAssets } from "../../core/model/robossembler_assets"; -import { StickObjectsMarkingStoreMode } from "./model/stick_objects_marking_store_mode"; -import { StickyHelper } from "./model/sticky_helper"; -import { StickyLoaderMode } from "./model/sticky_loader_mode"; - -export class StickObjectsMarkingStore extends UiErrorState { - mode: StickObjectsMarkingStoreMode; - stickObjectsMarkingThreeRepository: null | StickObjectsMarkingThreeRepository = null; - sceneHttpRepository: SceneHttpRepository; - objectThatSticksName: string; - objectThatSticksNamePoints: Vector3[] = []; - objectsToWhichItSticksName: string; - objectsToWhichItSticksPoints: Vector3[] = []; - sceneAssets?: RobossemblerAssets; - points = {}; - - get stickyObjects() { - return this.sceneAssets?.assets.filter((el) => el.actions.includes("Sticking")); - } - - constructor() { - super(); - makeAutoObservable(this); - this.points = {}; - this.mode = StickObjectsMarkingStoreMode.move; - this.sceneHttpRepository = new SceneHttpRepository(); - } - updatePoint = (key: string, value: any) => { - // @ts-expect-error - this.points[key] = value; - }; - onSaveSticky(): void {} - setMode(stickObjectsMarkingStoreMode: StickObjectsMarkingStoreMode): void { - this.mode = stickObjectsMarkingStoreMode; - } - - loaderWatcher() {} - - async init(): Promise { - this.mapOk("sceneAssets", this.sceneHttpRepository.getRobossemblerAssets()); - } - - errorHandingStrategy = (error: HttpError) => { - if (error.status === 404) { - this.errors.push(new UiBaseError(`${RobossemblerFiles.robossemblerAssets} not found to project`)); - } - }; - - async loadScene(canvasRef: HTMLCanvasElement) { - this.loadWebGl(canvasRef); - } - watcherSceneEditorObject() {} - loadWebGl(canvasRef: HTMLCanvasElement): void { - this.stickObjectsMarkingThreeRepository = new StickObjectsMarkingThreeRepository( - canvasRef as HTMLCanvasElement, - this.watcherSceneEditorObject, - this.updatePoint - ); - this.stickObjectsMarkingThreeRepository.stickyHelperLoader([ - new StickyHelper( - this.objectThatSticksName, - this.objectThatSticksNamePoints, - this.objectsToWhichItSticksName, - this.objectsToWhichItSticksPoints - ), - ]); - this.stickObjectsMarkingThreeRepository.render(); - window.addEventListener("click", (event) => this.clickLister(event)); - } - - clickLister(event: MouseEvent) { - const vector = new Vector2(); - vector.x = (event.clientX / window.innerWidth) * 2 - 1; - vector.y = -(event.clientY / window.innerHeight) * 2 + 1; - if (this.mode) { - if (this.mode === StickObjectsMarkingStoreMode.move) { - this.stickObjectsMarkingThreeRepository?.setRayCastAndGetFirstObject(vector).fold( - (success) => this.stickObjectsMarkingThreeRepository?.setTransformControlsAttach(success), - (_error) => this.stickObjectsMarkingThreeRepository?.disposeTransformControlsMode() - ); - } - this.stickObjectsMarkingThreeRepository?.setRayCast(vector).map((touch) => { - const objectMagnetism = touch.filter((el) => el.object.userData[UserData.objectForMagnetism] === true); - const BoundBoxVector = new Box3().setFromObject(objectMagnetism[0].object).getCenter(new Vector3()); - const centerRelativeVector = new Vector3().subVectors(BoundBoxVector, objectMagnetism[0].point); - if (objectMagnetism.isNotEmpty()) { - if (this.mode === StickObjectsMarkingStoreMode.objectsToWhichItSticks) { - this.objectsToWhichItSticksName = objectMagnetism[0].object.name; - } - if (this.mode === StickObjectsMarkingStoreMode.objectThatSticks) { - this.objectThatSticksName = objectMagnetism[0].object.name; - } - if (this.mode === StickObjectsMarkingStoreMode.addPointsObjectThatSticks) { - this.objectThatSticksNamePoints.push(centerRelativeVector); - } - if (this.mode === StickObjectsMarkingStoreMode.addPointsObjectsToWhichItSticks) { - this.objectsToWhichItSticksPoints.push(centerRelativeVector); - } - } - }); - } - } - loadAsset(asset: Asset, mode: StickyLoaderMode): void { - this.stickObjectsMarkingThreeRepository?.loadInstance(asset,() =>{ - - }); - } - dispose() { - window.removeEventListener("click", this.clickLister); - } -} diff --git a/ui/src/features/_stick_objects_marking/stick_objects_marking_three_repository.ts b/ui/src/features/_stick_objects_marking/stick_objects_marking_three_repository.ts deleted file mode 100644 index 67f3846..0000000 --- a/ui/src/features/_stick_objects_marking/stick_objects_marking_three_repository.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { Box3, BoxGeometry, Mesh, MeshBasicMaterial, Object3D, Vector3 } from "three"; -import { CoreThreeRepository } from "../../core/repository/core_three_repository"; -import { CoreVector3 } from "../../core/model/core_vector3"; -import { StickyHelper } from "./model/sticky_helper"; - -export class StickObjectsMarkingThreeRepository extends CoreThreeRepository { - stickyObjects: StickyHelper[]; - drawUiPoint: Function; - constructor(htmlCanvasRef: HTMLCanvasElement, watcherSceneEditorObject: Function, updatePoint: Function) { - super(htmlCanvasRef, watcherSceneEditorObject); - this.drawUiPoint = updatePoint; - this.sceneWatcher(); - } - - getStickyObject(name: string, pointNameHelper: string, index: number) { - const objectThatSticksNameMesh = this.scene.getObjectByName(name); - const pointName = objectThatSticksNameMesh!.name + ":point:" + index + pointNameHelper; - return this.scene.getObjectByName(pointName); - } - - mapperStickyObject(point: Vector3, index: number, name: string, pointNameHelper: string) { - const objectThatSticksNameMesh = this.scene.getObjectByName(name); - const pointName = objectThatSticksNameMesh!.name + ":point:" + index + pointNameHelper; - const sceneObject = this.scene.getObjectByName(pointName); - let pointMesh: Object3D; - if (sceneObject) { - pointMesh = sceneObject; - } else { - pointMesh = new Mesh(new BoxGeometry(1.1, 1.1, 1.1), new MeshBasicMaterial({ color: "#8BC34A" })); - } - pointMesh.position.copy(new Box3().setFromObject(objectThatSticksNameMesh!).getCenter(new Vector3()).add(point)); - pointMesh.name = pointName; - if (sceneObject === undefined) this.scene.add(pointMesh); - } - - stickyHelperLoader(stickyObjects: StickyHelper[]) { - this.stickyObjects = stickyObjects; - - stickyObjects.forEach((el) => { - el.objectThatSticksNamePoints.forEach((point, index) => - this.mapperStickyObject(point, index, el.objectThatSticksName, "objectThatSticksNamePoints") - ); - el.objectsToWhichItSticksPoints.forEach((point, index) => - this.mapperStickyObject(point, index, el.objectsToWhichItSticksName, "objectsToWhichItSticksPoints") - ); - }); - } - getCenter = (obj: Object3D) => new Box3().setFromObject(obj).getCenter(new Vector3()); - - sceneWatcher() { - this.transformControls.addEventListener("objectChange", (event) => { - //@ts-expect-error - const sceneActiveObject = event.target.object as Mesh; - - this.stickyObjects.forEach((stickyHelper) => { - if (sceneActiveObject.name === stickyHelper.objectThatSticksName) { - const objectsToWhichItSticksPointLocalVector = stickyHelper.objectsToWhichItSticksPoints[0]; - const globalVectorObjStickyName = this.scene.getObjectByName(stickyHelper.objectThatSticksName); - - const globalVectorObjToWhichSticks = this.scene.getObjectByName(stickyHelper.objectsToWhichItSticksName); - - const objectsToWhichItSticksNamePosition = new CoreVector3(globalVectorObjToWhichSticks!.position).add( - objectsToWhichItSticksPointLocalVector - ).vector; - - this.scene - .getObjectByName("cube2:point:0objectThatSticksNamePoints") - ?.position.copy(objectsToWhichItSticksNamePosition); - - globalVectorObjStickyName?.position.copy( - this.scene - .getObjectByName("cube2:point:0objectThatSticksNamePoints")! - .position.add(objectsToWhichItSticksPointLocalVector) - ); - } - }); - }); - } -} diff --git a/ui/src/features/all_projects/data/project_http_repository.ts b/ui/src/features/all_projects/data/project_http_repository.ts new file mode 100644 index 0000000..f3350f3 --- /dev/null +++ b/ui/src/features/all_projects/data/project_http_repository.ts @@ -0,0 +1,24 @@ +import { Result } from "../../../core/helper/result"; +import { HttpMethod, CoreHttpRepository } from "../../../core/repository/http_repository"; +import { IProjectModel } from "../model/project_model"; +export interface ICreateProjectViewModel { + description: string; +} +export interface UUID { + id: string; +} +export class ProjectHttpRepository extends CoreHttpRepository { + async getAllProject() { + return this._jsonRequest(HttpMethod.GET, "/projects"); + } + async saveProject(model: ICreateProjectViewModel): Promise> { + return await this._jsonRequest(HttpMethod.POST, "/projects", model); + } + async setProjectRootFile(file: File, projectId: string) { + return await this._formDataRequest(HttpMethod.POST, `/projects/upload?id=${projectId}`, file); + } + + async setActivePipeline(id: string) { + return this._jsonRequest(HttpMethod.POST, `/projects/set/active/project?id=${id}`); + } +} diff --git a/ui/src/features/all_projects/data/project_repository.ts b/ui/src/features/all_projects/data/project_repository.ts deleted file mode 100644 index 8d1f9b6..0000000 --- a/ui/src/features/all_projects/data/project_repository.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { HttpMethod, CoreHttpRepository } from "../../../core/repository/http_repository"; -import { IProjectModel } from "../model/project_model"; - -export interface UUID { - id: string; -} -export class ProjectRepository extends CoreHttpRepository { - async getAllProject() { - return this._jsonRequest(HttpMethod.GET, "/projects"); - } - - - async setActivePipeline(id: string) { - return this._jsonRequest(HttpMethod.POST, `/projects/set/active/project?id=${id}`); - } -} diff --git a/ui/src/features/all_projects/model/project_model.ts b/ui/src/features/all_projects/model/project_model.ts index 4d39434..4934d3e 100644 --- a/ui/src/features/all_projects/model/project_model.ts +++ b/ui/src/features/all_projects/model/project_model.ts @@ -1,4 +1,3 @@ -import { PipelineModel } from "../../create_project/create_project_repository"; export interface IProjectModel { _id?: string; @@ -6,3 +5,8 @@ export interface IProjectModel { description: string; isActive?: boolean; } +export interface IProjectView { + isActive: boolean; + description: string; + id: string; +} \ No newline at end of file diff --git a/ui/src/features/all_projects/presentation/all_projects_screen.tsx b/ui/src/features/all_projects/presentation/all_projects_screen.tsx index ec6f4fc..1e267eb 100644 --- a/ui/src/features/all_projects/presentation/all_projects_screen.tsx +++ b/ui/src/features/all_projects/presentation/all_projects_screen.tsx @@ -1,52 +1,103 @@ import * as React from "react"; import { AllProjectStore } from "./all_projects_store"; -import { ProjectRepository } from "../data/project_repository"; -import { LoadPage } from "../../../core/ui/pages/load_page"; import { observer } from "mobx-react-lite"; import { useNavigate } from "react-router-dom"; -import { Button } from "antd"; -import { PipelineInstanceScreenPath } from "../../pipeline_instance_main_screen/pipeline_instance_screen"; -import { CreateProjectScreenPath } from "../../create_project/create_project_screen"; +import { Modal, Upload } from "antd"; +import { PreviewPage } from "../../../core/ui/pages/preview_page"; +import { CoreText, CoreTextType } from "../../../core/ui/text/text"; +import { CoreButton } from "../../../core/ui/button/button"; +import { CoreInput } from "../../../core/ui/input/input"; +import { DetailsScreenPath } from "../../details/details_screen"; export const AllProjectScreenPath = "/"; export const AllProjectScreen: React.FunctionComponent = observer(() => { - const [store] = React.useState(() => new AllProjectStore(new ProjectRepository())); + const [store] = React.useState(() => new AllProjectStore()); const navigate = useNavigate(); React.useEffect(() => { store.init(); - }, [store]); + }, []); return ( - <> - - {store.projectsModels?.map((el) => { - return ( -
- {el.isActive ? ( - - ) : } -
{el.description}
-
- ); - })} -
- } - /> - + store.showModal()} + isError={false} + isLoading={store.isLoading} + children={ + <> + {store.projectsModels?.map((el) => { + return ( +
+ + {el.isActive ? ( + { + navigate(`${DetailsScreenPath}`); + }} + textStyle={{ color: "black",textAlign:'center' }} + style={{ marginRight: 10, backgroundColor: "white", width: 126 }} + /> + ) : ( + store.setActiveProject(el._id as string)} + style={{ marginRight: 10, width: 126 }} + filled={true} + /> + )} +
+ ); + })} + + + store.setDescriptionToNewProject(text)} /> +
+ { + store.file = e.file.originFileObj; + }} + > + + +
+
+ store.saveProject()} + style={{ marginRight: 10 }} + filled={true} + /> + store.handleCancel()} style={{ marginRight: 10 }} /> +
+ + + } + /> ); }); diff --git a/ui/src/features/all_projects/presentation/all_projects_store.ts b/ui/src/features/all_projects/presentation/all_projects_store.ts index 6207e75..d802e5d 100644 --- a/ui/src/features/all_projects/presentation/all_projects_store.ts +++ b/ui/src/features/all_projects/presentation/all_projects_store.ts @@ -1,13 +1,10 @@ import makeAutoObservable from "mobx-store-inheritance"; -import { ProjectRepository, UUID } from "../data/project_repository"; -import { IProjectModel } from "../model/project_model"; -import { SimpleErrorState } from "../../../core/store/base_store"; +import { ProjectHttpRepository, UUID } from "../data/project_http_repository"; +import { IProjectModel, IProjectView } from "../model/project_model"; +import { ModalStore } from "../../../core/store/base_store"; +import { message } from "antd"; -interface IProjectView { - isActive: boolean; - description: string; - id: string; -} + export class ProjectView { isActive: boolean; description: string; @@ -18,31 +15,64 @@ export class ProjectView { this.id = view.id; } } -export class AllProjectStore extends SimpleErrorState { - +export class AllProjectStore extends ModalStore { projectsModels?: IProjectModel[]; activeProjectId?: UUID; - repository: ProjectRepository; - constructor(repository: ProjectRepository) { + newProjectDescription: string = ""; + file?: File; + + projectHttpRepository: ProjectHttpRepository = new ProjectHttpRepository(); + constructor() { super(); - this.repository = repository; + makeAutoObservable(this); } async getProjects(): Promise { - await this.mapOk("projectsModels", this.repository.getAllProject()); + await this.mapOk("projectsModels", this.projectHttpRepository.getAllProject()); } async getActiveProjectId(): Promise { - await this.mapOk("activeProjectId", this.repository.getActiveProjectId()); + await this.mapOk("activeProjectId", this.projectHttpRepository.getActiveProjectId()); } setActiveProject = async (id: string) => { - await this.messageHttp(this.repository.setActivePipeline(id), { successMessage: "проект активирован", errorMessage: 'ошибка активации' }) - await this.mapOk("activeProjectId", this.repository.getActiveProjectId()); - await this.mapOk("projectsModels", this.repository.getAllProject()); - } + await this.messageHttp(this.projectHttpRepository.setActivePipeline(id), { + successMessage: "проект активирован", + errorMessage: "ошибка активации", + }); + await this.mapOk("activeProjectId", this.projectHttpRepository.getActiveProjectId()); + await this.mapOk("projectsModels", this.projectHttpRepository.getAllProject()); + }; async init() { await Promise.all([this.getProjects(), this.getActiveProjectId()]); this.projectsModels?.map((el) => (el._id === this.activeProjectId ? ((el.isActive = true), el) : el)); } + setDescriptionToNewProject = (value: string) => { + this.newProjectDescription = value; + }; + async saveProject(): Promise { + if (this.newProjectDescription.isEmpty()) { + message.error("Описание проекта не должно быть пустым"); + return; + } + if (this.file === undefined) { + message.error("загрузите файл"); + return; + } - + this.isLoading = true; + ( + await this.projectHttpRepository.saveProject({ + description: this.newProjectDescription, + }) + ).fold( + async (uuid) => { + this.newProjectDescription = ""; + await this.projectHttpRepository.setProjectRootFile(this.file as File, uuid.id); + this.isLoading = false; + this.init(); + }, + async (_) => { + this.isError = true; + } + ); + } } diff --git a/ui/src/features/behavior_tree_builder/data/behavior_tree_builder_repository.ts b/ui/src/features/behavior_tree_builder/data/behavior_tree_builder_repository.ts index 8cdef7a..31f4e32 100644 --- a/ui/src/features/behavior_tree_builder/data/behavior_tree_builder_repository.ts +++ b/ui/src/features/behavior_tree_builder/data/behavior_tree_builder_repository.ts @@ -1,7 +1,6 @@ import { Result } from "../../../core/helper/result"; import { Skills } from "../../../core/model/skill_model"; import { HttpError, HttpMethod, CoreHttpRepository } from "../../../core/repository/http_repository"; -import { UUID } from "../../all_projects/data/project_repository"; import { BehaviorTreeModel } from "../model/behavior_tree_model"; import { BehaviorTreeViewModel } from "../model/behavior_tree_view_model"; diff --git a/ui/src/features/behavior_tree_builder/presentation/behavior_tree_builder_screen.tsx b/ui/src/features/behavior_tree_builder/presentation/behavior_tree_builder_screen.tsx index 54ef37f..ca9c39e 100644 --- a/ui/src/features/behavior_tree_builder/presentation/behavior_tree_builder_screen.tsx +++ b/ui/src/features/behavior_tree_builder/presentation/behavior_tree_builder_screen.tsx @@ -86,7 +86,7 @@ export const BehaviorTreeBuilderScreen = observer(() => { />
))} - store.edtDrawer(DrawerState.newBehaviorTree, true)} /> + store.editDrawer(DrawerState.newBehaviorTree, true)} />
)) @@ -125,7 +125,7 @@ export const BehaviorTreeBuilderScreen = observer(() => { store.edtDrawer(DrawerState.newBehaviorTree, false)} + onClose={() => store.editDrawer(DrawerState.newBehaviorTree, false)} open={store.drawers.find((el) => el.name === DrawerState.newBehaviorTree)?.status} >
@@ -135,14 +135,14 @@ export const BehaviorTreeBuilderScreen = observer(() => {
store.createNewBehaviorTree()} />
- store.edtDrawer(DrawerState.newBehaviorTree, false)} /> + store.editDrawer(DrawerState.newBehaviorTree, false)} />
store.edtDrawer(DrawerState.editThreadBehaviorTree, false)} + onClose={() => store.editDrawer(DrawerState.editThreadBehaviorTree, false)} open={store.drawers.find((el) => el.name === DrawerState.editThreadBehaviorTree)?.status} >
diff --git a/ui/src/features/behavior_tree_builder/presentation/behavior_tree_builder_store.tsx b/ui/src/features/behavior_tree_builder/presentation/behavior_tree_builder_store.tsx index 9bef069..09b4b17 100644 --- a/ui/src/features/behavior_tree_builder/presentation/behavior_tree_builder_store.tsx +++ b/ui/src/features/behavior_tree_builder/presentation/behavior_tree_builder_store.tsx @@ -1,5 +1,5 @@ import makeAutoObservable from "mobx-store-inheritance"; -import { CoreError, UiFormState } from "../../../core/store/base_store"; +import { CoreError, UiDrawerFormState } from "../../../core/store/base_store"; import { BehaviorTreeBuilderModel, BtNodeView as BtNodeObserver, @@ -44,7 +44,7 @@ export enum StoreUIType { } -export class BehaviorTreeBuilderStore extends UiFormState { +export class BehaviorTreeBuilderStore extends UiDrawerFormState { type: StoreUIType = StoreUIType.ViewBehaviorTree; viewModel: BehaviorTreeViewModel = BehaviorTreeViewModel.empty(); behaviorTreeModel: BehaviorTreeModel = BehaviorTreeModel.empty(); @@ -254,7 +254,7 @@ export class BehaviorTreeBuilderStore extends UiFormState void): IForms[] => [ { name: Form.weights, component: }, { name: Form.robotName, component: }, { name: Form.cameraDeviceForm, component: }, - { name: Form.topic, component: } + { name: Form.topic, component: }, ]; diff --git a/ui/src/features/create_project/create_project_repository.ts b/ui/src/features/create_project/create_project_repository.ts deleted file mode 100644 index 260f4e7..0000000 --- a/ui/src/features/create_project/create_project_repository.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Result } from "../../core/helper/result"; -import { DatabaseModel } from "../../core/model/database_model"; -import { ITriggerModel } from "../../core/model/trigger_model"; -import { HttpMethod, CoreHttpRepository } from "../../core/repository/http_repository"; -import { UUID } from "../all_projects/data/project_repository"; -import { ICreateProjectViewModel } from "./project_model"; - -export interface PipelineModel extends DatabaseModel { - process: any; - trigger: ITriggerModel; -} - -export class CreateProjectRepository extends CoreHttpRepository { - async saveProject(model: ICreateProjectViewModel): Promise> { - return await this._jsonRequest(HttpMethod.POST, "/projects", model); - } - async setProjectRootFile(file: File, projectId: string) { - return await this._formDataRequest(HttpMethod.POST, `/projects/upload?id=${projectId}`, file); - } -} diff --git a/ui/src/features/create_project/create_project_screen.tsx b/ui/src/features/create_project/create_project_screen.tsx deleted file mode 100644 index ff07100..0000000 --- a/ui/src/features/create_project/create_project_screen.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import * as React from "react"; -import { LoadPage as MainPage } from "../../core/ui/pages/load_page"; -import { observer } from "mobx-react-lite"; -import { Col, Row, Input, Button, Upload } from "antd"; -import type { UploadProps } from "antd"; -import { CreateProjectStore } from "./create_project_store"; -import { CreateProjectRepository } from "./create_project_repository"; - -export const CreateProjectScreenPath = "/create_project"; -export const CreateProjectScreen: React.FunctionComponent = observer(() => { - const [store] = React.useState(() => new CreateProjectStore(new CreateProjectRepository())); - - React.useEffect(() => { - store.init(); - }, [store]); - return ( - <> - - - - - store.setDescriptionToNewProject(e.target.value)} - placeholder="project description" - /> - { - store.file = e.file.originFileObj; - }} - > - - - - - - - - } - /> - - ); -}); diff --git a/ui/src/features/create_project/create_project_store.ts b/ui/src/features/create_project/create_project_store.ts deleted file mode 100644 index 33d74ed..0000000 --- a/ui/src/features/create_project/create_project_store.ts +++ /dev/null @@ -1,51 +0,0 @@ -import makeAutoObservable from "mobx-store-inheritance"; -import { CreateProjectRepository } from "./create_project_repository"; -import { message } from "antd"; -import { SimpleErrorState } from "../../core/store/base_store"; - -export class CreateProjectStore extends SimpleErrorState { - repository: CreateProjectRepository; - - newProjectDescription: string = ""; - file?: File; - - constructor(repository: CreateProjectRepository) { - super(); - this.repository = repository; - makeAutoObservable(this); - } - async init() {} - - setDescriptionToNewProject(value: string): void { - this.newProjectDescription = value; - } - - async saveProject(): Promise { - if (this.newProjectDescription.isEmpty()) { - message.error("project description is not empty"); - return; - } - if (this.file === undefined) { - message.error("upload file"); - return; - } - - this.isLoading = true; - ( - await this.repository.saveProject({ - description: this.newProjectDescription, - }) - ).fold( - (uuid) => { - this.newProjectDescription = ""; - this.isLoading = false; - this.repository.setProjectRootFile(this.file as File, uuid.id); - }, - (_) => { - this.isError = true; - } - ); - - // - } -} diff --git a/ui/src/features/create_project/project_model.ts b/ui/src/features/create_project/project_model.ts deleted file mode 100644 index ee9c740..0000000 --- a/ui/src/features/create_project/project_model.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface ICreateProjectViewModel { - description: string; -} diff --git a/ui/src/features/dataset/dataset_http_repository.ts b/ui/src/features/dataset/dataset_http_repository.ts index f5743da..22c7575 100644 --- a/ui/src/features/dataset/dataset_http_repository.ts +++ b/ui/src/features/dataset/dataset_http_repository.ts @@ -1,7 +1,5 @@ import { Result } from "../../core/helper/result"; import { HttpError, HttpMethod, CoreHttpRepository } from "../../core/repository/http_repository"; -import { UUID } from "../all_projects/data/project_repository"; -import { Parts } from "../details/details_http_repository"; import { DataSetModel, Dataset, IDatasetModel, ProcessStatus } from "./dataset_model"; export class DataSetHttpRepository extends CoreHttpRepository { diff --git a/ui/src/features/dataset/dataset_store.ts b/ui/src/features/dataset/dataset_store.ts index 6632461..8980a49 100644 --- a/ui/src/features/dataset/dataset_store.ts +++ b/ui/src/features/dataset/dataset_store.ts @@ -4,7 +4,7 @@ import { Drawer, UiErrorState } from "../../core/store/base_store"; import { HttpError } from "../../core/repository/http_repository"; import { DataSetModel, IDatasetModel, ProcessStatus } from "./dataset_model"; import { message } from "antd"; -import { UUID } from "../all_projects/data/project_repository"; +import { UUID } from "../all_projects/data/project_http_repository"; import { SocketRepository, socketRepository } from "../../core/repository/socket_repository"; import { Parts } from "../details/details_http_repository"; diff --git a/ui/src/features/details/details_screen.tsx b/ui/src/features/details/details_screen.tsx index 99993ac..7fa6ff9 100644 --- a/ui/src/features/details/details_screen.tsx +++ b/ui/src/features/details/details_screen.tsx @@ -10,21 +10,18 @@ export const DetailsScreen = observer(() => { const [store] = React.useState(() => new DetailsStore()); React.useEffect(() => { store.loadScene(canvasRef.current!); - - }, []) + }, []); const canvasRef = React.useRef(null); return ( - } + bodyChildren={} panelChildren={ <> - {store.detailsViewModel.map((el) => ( -
store.selectedDetail(el.label)} style={{ margin: 5, cursor: "pointer" }}> + {store.detailsViewModel.map((el, i) => ( +
store.selectedDetail(el.label)} style={{ margin: 5, cursor: "pointer" }}>
{ - const [store] = React.useState(() => { - new PipelineInstanceStore(); - }); - React.useEffect(() => { - document.body.style.overflow = "hidden"; - return () => { - document.body.style.overflow = "scroll"; - }; - }, [store]); - const navigate = useNavigate(); - - return ( - <> - - - ); -}; diff --git a/ui/src/features/pipeline_instance_main_screen/pipeline_instance_store.ts b/ui/src/features/pipeline_instance_main_screen/pipeline_instance_store.ts deleted file mode 100644 index 7c9bb7f..0000000 --- a/ui/src/features/pipeline_instance_main_screen/pipeline_instance_store.ts +++ /dev/null @@ -1,9 +0,0 @@ -import makeAutoObservable from "mobx-store-inheritance"; -import { SimpleErrorState } from "../../core/store/base_store"; - -export class PipelineInstanceStore extends SimpleErrorState { - constructor() { - super(); - makeAutoObservable(this); - } -} diff --git a/ui/src/features/scene_manager/data/scene_http_repository.ts b/ui/src/features/scene_manager/data/scene_http_repository.ts new file mode 100644 index 0000000..1326bb2 --- /dev/null +++ b/ui/src/features/scene_manager/data/scene_http_repository.ts @@ -0,0 +1,12 @@ +import { Result } from "../../../core/helper/result"; +import { HttpMethod, CoreHttpRepository } from "../../../core/repository/http_repository"; +import { CoreError } from "../../../core/store/base_store"; +import { SceneModel } from "../model/scene_model"; +import { SceneViewModel } from "../model/scene_view_model"; + +export class SceneHttpRepository extends CoreHttpRepository { + getAllScenes = () => this._jsonRequest(HttpMethod.GET, "/scenes"); + + newScene = (sceneViewModel: SceneViewModel) => + this._jsonRequest(HttpMethod.POST, "/scenes", sceneViewModel) as unknown as Promise>; +} diff --git a/ui/src/features/scene_manager/data/scene_repository.ts b/ui/src/features/scene_manager/data/scene_repository.ts deleted file mode 100644 index cbc3880..0000000 --- a/ui/src/features/scene_manager/data/scene_repository.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Result } from "../../../core/helper/result"; -import { HttpMethod, CoreHttpRepository } from "../../../core/repository/http_repository"; -import { CoreError } from "../../../core/store/base_store"; -import { RobossemblerAssets } from "../../../core/model/robossembler_assets"; - -export class SceneHttpRepository extends CoreHttpRepository { - async getRobossemblerAssets() { - return this._jsonToClassInstanceRequest( - HttpMethod.GET, - "/robossembler_assets", - RobossemblerAssets - ) as unknown as Promise>; - } - async saveScene(robossemblerAssets: RobossemblerAssets) { - return this._jsonRequest(HttpMethod.POST, "/robossembler_assets", robossemblerAssets) as unknown as Promise< - Result - >; - } -} diff --git a/ui/src/features/scene_manager/model/scene_assets.ts b/ui/src/features/scene_manager/model/scene_assets.ts index 4e1e913..cc340e2 100644 --- a/ui/src/features/scene_manager/model/scene_assets.ts +++ b/ui/src/features/scene_manager/model/scene_assets.ts @@ -8,6 +8,7 @@ import { InstanceType, SceneSimpleObject, } from "../../../core/model/robossembler_assets"; +import { Result } from "../../../core/helper/result"; export enum RobossemblerFiles { robossemblerAssets = "robossembler_assets.json", @@ -137,19 +138,11 @@ export class CameraViewModel extends BaseSceneItemModel { }; } - validate(cameraLinksNames: string[]) { - if (cameraLinksNames.filter((el) => this.cameraLink === el).isNotEmpty()) { - return { cameraLink: "the name for the camera is not unique" }; - } + validate(): Result { if (this.cameraLink.isEmpty()) { - return { cameraLink: "is empty" }; - } - if (this.topicImage.isEmpty()) { - return { topicImage: "is empty" }; - } - if (this.topicCameraInfo.isEmpty()) { - return { topicCameraInfo: "is empty" }; + return Result.error("cameraLink is empty"); } + return Result.ok(this); } mapPerspectiveCamera(htmlSceneWidth: number, htmlSceneHeight: number) { diff --git a/ui/src/features/scene_manager/model/scene_model.ts b/ui/src/features/scene_manager/model/scene_model.ts new file mode 100644 index 0000000..a3e1776 --- /dev/null +++ b/ui/src/features/scene_manager/model/scene_model.ts @@ -0,0 +1,4 @@ +export interface SceneModel { + _id: string; + name: string; +} diff --git a/ui/src/features/scene_manager/model/scene_view_model.ts b/ui/src/features/scene_manager/model/scene_view_model.ts new file mode 100644 index 0000000..d2df7ab --- /dev/null +++ b/ui/src/features/scene_manager/model/scene_view_model.ts @@ -0,0 +1,17 @@ +import { Result } from "../../../core/helper/result"; + +export class SceneViewModel { + name: string; + constructor(name: string) { + this.name = name; + } + static empty() { + return new SceneViewModel(""); + } + valid = (): Result => { + if (this.name.isEmpty()) { + return Result.error("name is empty"); + } + return Result.ok(this); + }; +} diff --git a/ui/src/features/scene_manager/presentation/forms/camera/camera_form.tsx b/ui/src/features/scene_manager/presentation/forms/camera/camera_form.tsx new file mode 100644 index 0000000..3141552 --- /dev/null +++ b/ui/src/features/scene_manager/presentation/forms/camera/camera_form.tsx @@ -0,0 +1,46 @@ +import { NavigateFunction } from "react-router-dom"; +import { CoreError, FormState, UiDrawerFormState } from "../../../../../core/store/base_store"; +import { CoreButton } from "../../../../../core/ui/button/button"; +import { CameraViewModel } from "../../../model/scene_assets"; +import { IDefaultSceneManagerProps } from "../scene_manager_forms"; +import React from "react"; +import { CoreInput } from "../../../../../core/ui/input/input"; +import { CoreText, CoreTextType } from "../../../../../core/ui/text/text"; +import { message } from "antd"; + +class CameraFormStore extends FormState { + errorHandingStrategy = (error: CoreError) => {}; + init = async (navigate?: NavigateFunction | undefined) => {}; + viewModel: CameraViewModel = CameraViewModel.empty(); + constructor() { + super(); + } +} +export const CameraForm = (props: IDefaultSceneManagerProps) => { + const [store] = React.useState(() => new CameraFormStore()); + + React.useEffect(() => { + store.init(); + }, []); + return ( +
+ + store.updateForm({ cameraLink: text })} /> +
+ + store.viewModel.validate().fold( + (model) => { + props.store.addNewCamera(model); + }, + (error) => message.error(error) + ) + } + /> +
+ ); +}; + +// onClick={props.store.addNewCamera()} diff --git a/ui/src/features/scene_manager/presentation/forms/robot/robot_form.tsx b/ui/src/features/scene_manager/presentation/forms/robot/robot_form.tsx new file mode 100644 index 0000000..e52dfd0 --- /dev/null +++ b/ui/src/features/scene_manager/presentation/forms/robot/robot_form.tsx @@ -0,0 +1,6 @@ +import { IDefaultSceneManagerProps } from "../scene_manager_forms"; + + +export const RobotForm = (props: IDefaultSceneManagerProps) => { + return
ROBOT
; +}; diff --git a/ui/src/features/scene_manager/presentation/forms/scene_manager_forms.tsx b/ui/src/features/scene_manager/presentation/forms/scene_manager_forms.tsx new file mode 100644 index 0000000..07f30f9 --- /dev/null +++ b/ui/src/features/scene_manager/presentation/forms/scene_manager_forms.tsx @@ -0,0 +1,23 @@ +import { SceneMangerStore } from "../scene_manager_store"; +import { CameraForm } from "./camera/camera_form"; +import { RobotForm } from "./robot/robot_form"; +import { SolidBodyForm } from "./solid_body/solid_body_form"; + +export enum SceneManagerForms { + robot = "robot", + camera = "camera", + solidBody = "solidBody", +} +interface IForms { + name: string; + component: JSX.Element; +} +export interface IDefaultSceneManagerProps { + dependency: Object; + store: SceneMangerStore; +} +export const sceneManagerForms = (props: Object, store: SceneMangerStore): IForms[] => [ + { name: SceneManagerForms.camera, component: }, + { name: SceneManagerForms.robot, component: }, + { name: SceneManagerForms.solidBody, component: }, +]; diff --git a/ui/src/features/scene_manager/presentation/forms/solid_body/solid_body_form.tsx b/ui/src/features/scene_manager/presentation/forms/solid_body/solid_body_form.tsx new file mode 100644 index 0000000..523ddc9 --- /dev/null +++ b/ui/src/features/scene_manager/presentation/forms/solid_body/solid_body_form.tsx @@ -0,0 +1,5 @@ +import { IDefaultSceneManagerProps } from "../scene_manager_forms"; + +export const SolidBodyForm = (props:IDefaultSceneManagerProps) => { + return <>; +}; diff --git a/ui/src/features/scene_manager/presentation/forms/solid_body/solid_body_store.tsx b/ui/src/features/scene_manager/presentation/forms/solid_body/solid_body_store.tsx new file mode 100644 index 0000000..078a062 --- /dev/null +++ b/ui/src/features/scene_manager/presentation/forms/solid_body/solid_body_store.tsx @@ -0,0 +1,41 @@ +import makeAutoObservable from "mobx-store-inheritance"; +import { SolidBodyViewModel } from "./solid_body_view_model"; +import { FormState, CoreError } from "../../../../../core/store/base_store"; +import { CoreHttpRepository } from "../../../../../core/repository/http_repository"; +import { Parts } from "../../../../details/details_http_repository"; +import { Vector2 } from "three"; +export enum SolidBodyStoreType { + selectBody = "selectBody", + selectSpawnPositionType = "selectSpawnPositionType", + spawn2DVector = "spawn2DVector", +} +export enum SpawnPositionTypes { + BoundBox = "BoundBox", +} +export class SolidBodyStore extends FormState { + viewModel: SolidBodyViewModel = SolidBodyViewModel.empty(); + parts: Parts[] = []; + spawnPositionTypes = Object.keys(SpawnPositionTypes); + coreHttpRepository: CoreHttpRepository = new CoreHttpRepository(); + solidBodyStoreType: SolidBodyStoreType = SolidBodyStoreType.selectBody; + selectBody: Parts; + spawnType: string; + errorHandingStrategy = (error: CoreError) => {}; + constructor() { + super(); + makeAutoObservable(this); + } + vector2d?: Vector2; + init = async () => { + this.mapOk("parts", this.coreHttpRepository.getAssetsActiveProject()); + }; + selectSpawnType = (type: string) => { + this.spawnType = type; + this.solidBodyStoreType = SolidBodyStoreType.spawn2DVector; + }; + selectVector = () => {}; + clickSelectBody = (el: Parts) => { + this.selectBody = el; + this.solidBodyStoreType = SolidBodyStoreType.selectSpawnPositionType; + }; +} diff --git a/ui/src/features/scene_manager/presentation/forms/solid_body/solid_body_view_model.ts b/ui/src/features/scene_manager/presentation/forms/solid_body/solid_body_view_model.ts new file mode 100644 index 0000000..a1875f1 --- /dev/null +++ b/ui/src/features/scene_manager/presentation/forms/solid_body/solid_body_view_model.ts @@ -0,0 +1,7 @@ +export class SolidBodyViewModel { + name: string; + + static empty() { + return new SolidBodyViewModel(); + } + } \ No newline at end of file diff --git a/ui/src/features/scene_manager/presentation/scene_manager.tsx b/ui/src/features/scene_manager/presentation/scene_manager.tsx index 342917e..4de8eb8 100644 --- a/ui/src/features/scene_manager/presentation/scene_manager.tsx +++ b/ui/src/features/scene_manager/presentation/scene_manager.tsx @@ -1,8 +1,16 @@ import * as React from "react"; -import { SceneMangerStore } from "./scene_manager_store"; +import { DrawersSceneManager, SceneMangerStore, StoreMode } from "./scene_manager_store"; import { observer } from "mobx-react-lite"; -import { useParams } from "react-router-dom"; +import { useNavigate, useParams } from "react-router-dom"; import { MainPage } from "../../../core/ui/pages/main_page"; +import { CoreText, CoreTextType } from "../../../core/ui/text/text"; +import { Drawer } from "antd"; +import { CoreButton } from "../../../core/ui/button/button"; +import { CoreInput } from "../../../core/ui/input/input"; +import { DrawersDataset } from "../../dataset/dataset_store"; +import { Popover } from "antd"; +import { Icon } from "../../../core/ui/icons/icons"; +import { sceneManagerForms } from "./forms/scene_manager_forms"; export const SceneManagerPath = "/scene/manager/"; @@ -10,6 +18,8 @@ export const SceneManger = observer(() => { const canvasRef = React.useRef(null); const [store] = React.useState(() => new SceneMangerStore()); const id = useParams().id as string; + const navigate = useNavigate(); + store.initParam(id); React.useEffect(() => { store.init(); @@ -24,146 +34,171 @@ export const SceneManger = observer(() => { return ( - + panelChildren={ +
+
+
+ + + {store.popoverItems.map((el, i) => ( +
el.fn()}> + +
+ ))} +
+ } + > + + + + +
+
+
+ {store.sceneItems.map((el, index) => ( +
+ +
+ +
+ ))} +
+
+
- {/*
- {sceneIcons.map((el) => { - return ( -
{ - el.clickHandel(); - }} - > - {el.name} -
- ); - })} -
- {/*
Scene manager
- {store.isVisibleSaveButton ? ( - <> - - - ) : ( - <> - )} - {store.isLoading ? <>Loading... : <>} - {store.sceneMode === SceneMode.ADD_CAMERA ? ( -
- { - store.addNewCamera(model); - actions.setSubmitting(false); - actions.resetForm(); - }} - validate={(model) => { - return model.validate(store.getCameraLinkNames()); - }} - render={() => ( -
-
- - - - + > + {sceneManagerForms(store.activeFormDependency ?? {}, store).map((el) => { + if (el.name.isEqual(store.activeFormType ?? "")) { + return <>{el.component}; + } + return <>; + })} +
+
+ } + bodyChildren={ + <> + {store.storeMode.isEqual(StoreMode.sceneInstance) ? ( + <> + + + ) : ( +
+
+
+ + store.editDrawer(DrawersSceneManager.NewScene, true)} + type={CoreTextType.small} + color="rgba(68, 142, 247, 1)" + style={{ cursor: "pointer" }} + /> - Reset - Submit -
- - )} - /> -
- ) : ( - <> - )} - {store.sceneMode === SceneMode.MOVING || SceneMode.ROTATE ? ( - <> - {store.robossemblerAssets?.assets.map((el) => { - return ( -
-
- {el.name} - {store.isRenderedAsset(el.name) ? ( - <> - ) : ( - - )} -
-
- ); - })} - - ) : ( - <> - )} -
-
-
- {store.sceneModels.map((el) => { - return store.deleteSceneItem(el)} model={el} />; - })} -
- - {store.sceneMode === SceneMode.MAGNETISM_MARKING ? ( - <> -
-
completion of objects
- {store.objectMagnetism ? ( - <>{store.objectMagnetism} - ) : ( - - )} - {store.objectForMagnetism ? ( - <>{store.objectForMagnetism} - ) : ( - - )} + {store.scenes.map((el, i) => ( +
+ + { + navigate(`${SceneManagerPath}${el._id}`); + }} + textStyle={{ color: "black", textAlign: "center" }} + style={{ marginRight: 10, backgroundColor: "white", width: 126 }} + /> +
+ ))}
- - ) : ( - <> - )} */} - {/*
*/} +
+
+ +
+ store.editDrawer(DrawersSceneManager.NewScene, false)} + open={store.drawers.find((el) => el.name === DrawersSceneManager.NewScene)?.status} + > +
+ store.updateForm({ name: text })} + /> + +
+ store.createNewScene()} /> +
+ store.editDrawer(DrawersDataset.NewDataset, false)} /> +
+
+ +
+ )} } /> diff --git a/ui/src/features/scene_manager/presentation/scene_manager_store.ts b/ui/src/features/scene_manager/presentation/scene_manager_store.ts index 1424ef0..224d45e 100644 --- a/ui/src/features/scene_manager/presentation/scene_manager_store.ts +++ b/ui/src/features/scene_manager/presentation/scene_manager_store.ts @@ -2,17 +2,48 @@ import makeAutoObservable from "mobx-store-inheritance"; import { CoreThreeRepository } from "../../../core/repository/core_three_repository"; import { Object3D, Vector2 } from "three"; import { HttpError } from "../../../core/repository/http_repository"; -import { UiErrorState } from "../../../core/store/base_store"; +import { UiDrawerFormState } from "../../../core/store/base_store"; import { UiBaseError } from "../../../core/model/ui_base_error"; import { SceneMenu, SceneMode } from "../model/scene_view"; import { BaseSceneItemModel, CameraViewModel, RobossemblerFiles, StaticAssetItemModel } from "../model/scene_assets"; -import { SceneHttpRepository } from "../data/scene_repository"; +import { SceneHttpRepository } from "../data/scene_http_repository"; import { message } from "antd"; import { RobossemblerAssets } from "../../../core/model/robossembler_assets"; +import { SceneViewModel } from "../model/scene_view_model"; +import { SceneModel } from "../model/scene_model"; +import { SceneManagerForms } from "./forms/scene_manager_forms"; -export class SceneMangerStore extends UiErrorState { +export enum DrawersSceneManager { + NewScene = "Новая сцена", +} +export enum StoreMode { + sceneInstance = "sceneInstance", + allScenes = "allScenes", +} +interface IPopoverItem { + name: string; + fn: Function; +} +interface SceneItems { + fn: Function; + name: string; + icon: string; +} +export class SceneMangerStore extends UiDrawerFormState { + popoverItems: IPopoverItem[] = [ + { name: "Камера", fn: () => this.createNewForm(SceneManagerForms.camera, { store: this }) }, + { name: "Твердое тело", fn: () => this.createNewForm(SceneManagerForms.solidBody, { store: this }) }, + { name: "Робот", fn: () => this.createNewForm(SceneManagerForms.robot, { store: this }) }, + { name: "Точка", fn: () => {} }, + { name: "Траектория", fn: () => {} }, + { name: "Зона", fn: () => {} }, + ]; + activeFormType?: string; + activeFormDependency?: Object; + viewModel: SceneViewModel = SceneViewModel.empty(); sceneMode: SceneMode; sceneMenu: SceneMenu; + sceneItems: SceneItems[]; isVisibleSaveButton: boolean = false; coreThreeRepository: null | CoreThreeRepository = null; sceneHttpRepository: SceneHttpRepository; @@ -21,21 +52,31 @@ export class SceneMangerStore extends UiErrorState { robossemblerAssets?: RobossemblerAssets; objectForMagnetism: string; objectMagnetism: string; - + scenes: SceneModel[] = []; + storeMode: StoreMode; + canvasRef?: HTMLCanvasElement; constructor() { - super(); + super(DrawersSceneManager); makeAutoObservable(this); + this.sceneItems = []; this.sceneHttpRepository = new SceneHttpRepository(); this.sceneMode = SceneMode.EMPTY; this.sceneMenu = SceneMenu.empty(); } - - onTapSave(): void { - this.robossemblerAssets!.instances = []; - this.sceneModels.forEach((el) => this.robossemblerAssets?.instances.push(el.toInstance())); - this.httpHelper(this.sceneHttpRepository.saveScene(this.robossemblerAssets as RobossemblerAssets)); - this.isVisibleSaveButton = false; - } + createNewForm = (formType: SceneManagerForms, dependency: Object) => { + this.activeFormDependency = dependency; + this.activeFormType = formType; + }; + makeSolid = () => {}; + createNewScene = () => + this.viewModel.valid().fold( + async (s) => { + await this.sceneHttpRepository.newScene(s); + this.init(); + this.editDrawer(DrawersSceneManager.NewScene, false); + }, + async (e) => message.error(e) + ); deleteSceneItem(item: BaseSceneItemModel) { const itm = this.sceneModels.filter((el) => el.id === item.id); @@ -44,30 +85,30 @@ export class SceneMangerStore extends UiErrorState { this.visibleSaveButton(); } - visibleSaveButton() { + visibleSaveButton = () => { this.isVisibleSaveButton = true; - } + }; - addNewCamera(model: CameraViewModel) { + addNewCamera = (model: CameraViewModel) => { model.position = this.coreThreeRepository!.camera.position; model.quaternion = this.coreThreeRepository!.camera.quaternion; - this.sceneModels.push(model); + this.sceneItems.push({ name: model.cameraLink, icon: "Camera", fn: () => {} }); this.coreThreeRepository?.addSceneCamera(model); this.visibleSaveButton(); - } + }; - getCameraLinkNames(): string[] { + getCameraLinkNames = (): string[] => { return this.sceneModels.map((el) => { if (el instanceof CameraViewModel) { return el.cameraLink; } return ""; }); - } + }; - loaderWatcher() {} + loaderWatcher = () => {}; - loadSceneRobossemblerAsset(name: string) { + loadSceneRobossemblerAsset = (name: string) => { try { const assetPath = this.robossemblerAssets?.getAssetPath(name) as string; @@ -105,8 +146,15 @@ export class SceneMangerStore extends UiErrorState { sceneModeWatcher() {} - async init(): Promise {} - + init = async () => {}; + initParam = (id: string | undefined) => { + if (id) { + this.storeMode = StoreMode.sceneInstance; + } else { + this.storeMode = StoreMode.allScenes; + this.mapOk("scenes", this.sceneHttpRepository.getAllScenes()); + } + }; errorHandingStrategy = (error: HttpError) => { if (error.status === 404) { this.errors.push(new UiBaseError(`${RobossemblerFiles.robossemblerAssets} not found to project`)); @@ -114,11 +162,12 @@ export class SceneMangerStore extends UiErrorState { }; async loadScene(canvasRef: HTMLCanvasElement) { - this.loadWebGl(canvasRef); - await this.mapOk("robossemblerAssets", this.sceneHttpRepository.getRobossemblerAssets()); - if (this.robossemblerAssets) { - this.coreThreeRepository?.loadInstances(this.robossemblerAssets); - } + this.canvasRef = canvasRef; + if (this.storeMode.isEqual(StoreMode.sceneInstance)) this.loadWebGl(canvasRef); + // await this.mapOk("robossemblerAssets", this.sceneHttpRepository.getRobossemblerAssets()); + // if (this.robossemblerAssets) { + // this.coreThreeRepository?.loadInstances(this.robossemblerAssets); + // } } loadWebGl(canvasRef: HTMLCanvasElement): void { diff --git a/ui/src/features/skils/skills_screen.tsx b/ui/src/features/skils/skills_screen.tsx index 67d9d72..f679534 100644 --- a/ui/src/features/skils/skills_screen.tsx +++ b/ui/src/features/skils/skills_screen.tsx @@ -63,14 +63,14 @@ export const SkillScreen = observer(() => { onDelete={(id) => store.deleteSkill(id)} /> ))} - store.edtDrawer(DrawersSkill.NEW_SKILL, true)} /> + store.editDrawer(DrawersSkill.NEW_SKILL, true)} />
} /> store.edtDrawer(DrawersSkill.EDIT_SKILL, false)} + onClose={() => store.editDrawer(DrawersSkill.EDIT_SKILL, false)} open={store.drawers.find((el) => el.name === DrawersSkill.EDIT_SKILL)?.status} >
@@ -94,14 +94,14 @@ export const SkillScreen = observer(() => {
store.saveEdiSkill()} />
- store.edtDrawer(DrawersSkill.NEW_SKILL, false)} /> + store.editDrawer(DrawersSkill.NEW_SKILL, false)} />
store.edtDrawer(DrawersSkill.NEW_SKILL, false)} + onClose={() => store.editDrawer(DrawersSkill.NEW_SKILL, false)} open={store.drawers.find((el) => el.name === DrawersSkill.NEW_SKILL)?.status} >
@@ -142,7 +142,7 @@ export const SkillScreen = observer(() => {
store.saveSkill()} />
- store.edtDrawer(DrawersSkill.NEW_SKILL, false)} /> + store.editDrawer(DrawersSkill.NEW_SKILL, false)} />
diff --git a/ui/src/features/skils/skills_store.tsx b/ui/src/features/skils/skills_store.tsx index c079d55..30b1280 100644 --- a/ui/src/features/skils/skills_store.tsx +++ b/ui/src/features/skils/skills_store.tsx @@ -1,11 +1,11 @@ import makeAutoObservable from "mobx-store-inheritance"; import { NavigateFunction } from "react-router-dom"; import { HttpError } from "../../core/repository/http_repository"; -import { Drawer, UiFormState } from "../../core/store/base_store"; +import { Drawer, UiDrawerFormState } from "../../core/store/base_store"; import { ISkils, SkillsHttpRepository } from "./skills_http_repository"; import { IDatasetModel } from "../dataset/dataset_model"; import { message } from "antd"; -import { UUID } from "../all_projects/data/project_repository"; +import { UUID } from "../all_projects/data/project_http_repository"; import { SkillModel } from "./skill_model"; import { ProcessUpdate, SkillSocketRepository } from "./skill_socket_repository"; @@ -14,7 +14,7 @@ export enum DrawersSkill { EDIT_SKILL = "Редактировать навык", } -export class SkillStore extends UiFormState { +export class SkillStore extends UiDrawerFormState { skillsHttpRepository: SkillsHttpRepository; skillSocketRepository: SkillSocketRepository = new SkillSocketRepository(); skils?: ISkils[]; @@ -92,7 +92,7 @@ export class SkillStore extends UiFormState { ); } - edtDrawer(drawerName: DrawersSkill, status: boolean): void { + editDrawer(drawerName: DrawersSkill, status: boolean): void { this.titleDrawer = drawerName; this.drawers = this.drawers.map((el) => { if (el.name === drawerName) { @@ -108,13 +108,13 @@ export class SkillStore extends UiFormState { fromEditSkill(id: string): void { this.viewModel = SkillModel.fromISkill(this.getSkillById(id) as ISkils); - this.edtDrawer(DrawersSkill.EDIT_SKILL, true); + this.editDrawer(DrawersSkill.EDIT_SKILL, true); } saveEdiSkill = async () => { const skillOrigin = this.getSkillById(this.viewModel.id as string) as ISkils; skillOrigin.numberOfTrainedEpochs = this.viewModel.epoch; skillOrigin.isFinished = this.viewModel.isFinished ?? false; await this.skillsHttpRepository.editSkill(skillOrigin); - this.edtDrawer(DrawersSkill.EDIT_SKILL, false); + this.editDrawer(DrawersSkill.EDIT_SKILL, false); }; } diff --git a/ui/src/features/socket_lister/socket_lister.tsx b/ui/src/features/socket_lister/socket_lister.tsx index b461a7a..2855d23 100644 --- a/ui/src/features/socket_lister/socket_lister.tsx +++ b/ui/src/features/socket_lister/socket_lister.tsx @@ -11,7 +11,7 @@ export const SocketLister = observer((props: ISocketListerProps) => { socketListerStore.init(); }, []); return ( -
+ < > {/* {socketListerStore.socketHasDisconnect ? ( { @@ -30,6 +30,6 @@ export const SocketLister = observer((props: ISocketListerProps) => { )} */} {props.children} -
+ ); }); diff --git a/ui/src/features/stick_objects_marking/stick_objects_marking_screen.tsx b/ui/src/features/stick_objects_marking/stick_objects_marking_screen.tsx deleted file mode 100644 index 74d0056..0000000 --- a/ui/src/features/stick_objects_marking/stick_objects_marking_screen.tsx +++ /dev/null @@ -1,133 +0,0 @@ -import * as React from "react"; -import { observer } from "mobx-react-lite"; -import { useParams } from "react-router-dom"; -import { Button } from "antd"; -import { StickObjectsMarkingStore, StickObjectsMarkingStoreMode } from "./stick_objects_marking_store"; -import { Vector3 } from "three"; - -export const StickObjectsMarking = "/stick/objects/marking"; -interface StickButtonsProps { - isVisible: boolean; - name: string; - groupMode: StickObjectsMarkingStoreMode; - storeMode: StickObjectsMarkingStoreMode; - storeModePoints: StickObjectsMarkingStoreMode; - setMode: Function; - setPointMode: Function; - points: Vector3[]; - body: string; -} - -export const StickButtons: React.FunctionComponent = observer((props) => { - return ( - <> - {props.isVisible ? ( - <> - {props.name} - - {props.points.map((el) => { - return ( - <> - {el.x} {el.y} {el.z} - - ); - })} - - ) : ( - - )} - - ); -}); - -export const StickObjectsMarkingScreen = observer(() => { - const canvasRef = React.useRef(null); - const [store] = React.useState(() => new StickObjectsMarkingStore()); - const id = useParams().id as string; - - React.useEffect(() => { - store.init(); - store.loadScene(canvasRef.current!); - document.body.style.overflow = "hidden"; - return () => { - document.body.style.overflow = "scroll"; - store.dispose(); - }; - }, [id, store]); - - return ( -
- -
-
- {Object.keys(store.points).map((el) => { - // @ts-expect-error - const v = store.points[el]; - return ( - <> -
- {el as string}:{v} -
- - ); - })} -
Marking objects for sticking
-
- store.setMode(StickObjectsMarkingStoreMode.objectThatSticks)} - groupMode={StickObjectsMarkingStoreMode.objectThatSticks} - name={store.objectThatSticksName} - storeModePoints={StickObjectsMarkingStoreMode.addPointsObjectThatSticks} - isVisible={store.objectThatSticksName !== undefined} - setPointMode={() => store.setMode(StickObjectsMarkingStoreMode.addPointsObjectThatSticks)} - points={store.objectThatSticksNamePoints} - body="objectThatSticksName" - /> - store.setMode(StickObjectsMarkingStoreMode.objectsToWhichItSticks)} - groupMode={StickObjectsMarkingStoreMode.objectsToWhichItSticks} - name={store.objectsToWhichItSticksName} - storeModePoints={StickObjectsMarkingStoreMode.addPointsObjectsToWhichItSticks} - isVisible={store.objectsToWhichItSticksName !== undefined} - setPointMode={() => store.setMode(StickObjectsMarkingStoreMode.addPointsObjectsToWhichItSticks)} - /> - - -
-
-
-
- ); -}); diff --git a/ui/src/features/stick_objects_marking/stick_objects_marking_store.tsx b/ui/src/features/stick_objects_marking/stick_objects_marking_store.tsx deleted file mode 100644 index 644f9f1..0000000 --- a/ui/src/features/stick_objects_marking/stick_objects_marking_store.tsx +++ /dev/null @@ -1,164 +0,0 @@ -import makeAutoObservable from "mobx-store-inheritance"; -import { Box3, Vector2, Vector3 } from "three"; -import { UiErrorState } from "../../core/store/base_store"; -import { HttpError } from "../../core/repository/http_repository"; -import { UiBaseError } from "../../core/model/ui_base_error"; -import { RobossemblerFiles } from "../scene_manager/model/scene_assets"; -import { StickObjectsMarkingThreeRepository } from "./stick_objects_marking_three_repository"; -import { UserData } from "../../core/repository/core_three_repository"; -import { ObjectExtensionsIsKeyExists } from "../../core/extensions/object"; - -export enum StickObjectsMarkingStoreMode { - objectsToWhichItSticks = "objectsToWhichItSticks", - objectThatSticks = "objectThatSticks", - addPointsObjectsToWhichItSticks = "addPointsObjectsToWhichItSticks", - addPointsObjectThatSticks = "addPointsObjectThatSticks", - move = "move", -} - -export class StickyHelper { - objectThatSticksName: string; - objectThatSticksNamePoints: Vector3[] = []; - objectsToWhichItSticksName: string; - objectsToWhichItSticksPoints: Vector3[] = []; - - constructor( - objectThatSticksName: string, - objectThatSticksNamePoints: Vector3[], - objectsToWhichItSticksName: string, - objectsToWhichItSticksPoints: Vector3[] - ) { - this.objectThatSticksName = objectThatSticksName; - this.objectThatSticksNamePoints = objectThatSticksNamePoints; - this.objectsToWhichItSticksName = objectsToWhichItSticksName; - this.objectsToWhichItSticksPoints = objectsToWhichItSticksPoints; - } -} - -export class StickObjectsMarkingStore extends UiErrorState { - mode: StickObjectsMarkingStoreMode; - stickObjectsMarkingThreeRepository: null | StickObjectsMarkingThreeRepository = null; - objectThatSticksName: string; - objectThatSticksNamePoints: Vector3[] = []; - objectsToWhichItSticksName: string; - objectsToWhichItSticksPoints: Vector3[] = []; - points = {}; - constructor() { - super(); - makeAutoObservable(this); - this.points = {}; - this.mode = StickObjectsMarkingStoreMode.move; - this.loadStickyJSON( - '{"objectThatSticksName":"cube2","objectThatSticksNamePoints":[{"x":5,"y":-0.5419443937360455,"z":0.041458499858311626}],"objectsToWhichItSticksName":"cube1","objectsToWhichItSticksPoints":[{"x":-5,"y":-2.2134708060033113,"z":1.1937718220731925}]}' - ); - } - updatePoint = (key: string, value: any) => { - // @ts-expect-error - this.points[key] = value; - }; - onSaveSticky(): void { - window.prompt( - "Copy to clipboard: Ctrl+C, Enter", - JSON.stringify( - new StickyHelper( - this.objectThatSticksName, - this.objectThatSticksNamePoints, - this.objectsToWhichItSticksName, - this.objectsToWhichItSticksPoints - ) - ) - ); - } - setMode(stickObjectsMarkingStoreMode: StickObjectsMarkingStoreMode): void { - this.mode = stickObjectsMarkingStoreMode; - } - - loaderWatcher() {} - - async init(): Promise {} - - errorHandingStrategy = (error: HttpError) => { - if (error.status === 404) { - this.errors.push(new UiBaseError(`${RobossemblerFiles.robossemblerAssets} not found to project`)); - } - }; - - async loadScene(canvasRef: HTMLCanvasElement) { - this.loadWebGl(canvasRef); - } - watcherSceneEditorObject() {} - loadWebGl(canvasRef: HTMLCanvasElement): void { - this.stickObjectsMarkingThreeRepository = new StickObjectsMarkingThreeRepository( - canvasRef as HTMLCanvasElement, - this.watcherSceneEditorObject, - this.updatePoint - ); - this.stickObjectsMarkingThreeRepository.stickyHelperLoader([ - new StickyHelper( - this.objectThatSticksName, - this.objectThatSticksNamePoints, - this.objectsToWhichItSticksName, - this.objectsToWhichItSticksPoints - ), - ]); - this.stickObjectsMarkingThreeRepository.render(); - window.addEventListener("click", (event) => this.clickLister(event)); - } - - clickLister(event: MouseEvent) { - const vector = new Vector2(); - vector.x = (event.clientX / window.innerWidth) * 2 - 1; - vector.y = -(event.clientY / window.innerHeight) * 2 + 1; - if (this.mode) { - if (this.mode === StickObjectsMarkingStoreMode.move) { - this.stickObjectsMarkingThreeRepository?.setRayCastAndGetFirstObject(vector).fold( - (success) => this.stickObjectsMarkingThreeRepository?.setTransformControlsAttach(success), - (_error) => this.stickObjectsMarkingThreeRepository?.disposeTransformControlsMode() - ); - } - this.stickObjectsMarkingThreeRepository?.setRayCast(vector).map((touch) => { - const objectMagnetism = touch.filter((el) => el.object.userData[UserData.objectForMagnetism] === true); - const BoundBoxVector = new Box3().setFromObject(objectMagnetism[0].object).getCenter(new Vector3()); - const centerRelativeVector = new Vector3().subVectors(BoundBoxVector, objectMagnetism[0].point); - if (objectMagnetism.isNotEmpty()) { - if (this.mode === StickObjectsMarkingStoreMode.objectsToWhichItSticks) { - this.objectsToWhichItSticksName = objectMagnetism[0].object.name; - } - if (this.mode === StickObjectsMarkingStoreMode.objectThatSticks) { - this.objectThatSticksName = objectMagnetism[0].object.name; - } - if (this.mode === StickObjectsMarkingStoreMode.addPointsObjectThatSticks) { - this.objectThatSticksNamePoints.push(centerRelativeVector); - } - if (this.mode === StickObjectsMarkingStoreMode.addPointsObjectsToWhichItSticks) { - this.objectsToWhichItSticksPoints.push(centerRelativeVector); - } - } - }); - } - } - - dispose() { - window.removeEventListener("click", this.clickLister); - } - loadStickyJSON(value: string): void { - const object = JSON.parse(value) as Object; - if ( - ObjectExtensionsIsKeyExists(object, [ - "objectThatSticksName", - "objectThatSticksNamePoints", - "objectsToWhichItSticksName", - "objectsToWhichItSticksPoints", - ]) - ) { - // @ts-expect-error - this.objectThatSticksName = object["objectThatSticksName"]; - // @ts-expect-error - this.objectThatSticksNamePoints = object["objectThatSticksNamePoints"]; - // @ts-expect-error - this.objectsToWhichItSticksName = object["objectsToWhichItSticksName"]; - // @ts-expect-error - this.objectsToWhichItSticksPoints = object["objectsToWhichItSticksPoints"]; - } - } -} diff --git a/ui/src/features/stick_objects_marking/stick_objects_marking_three_repository.ts b/ui/src/features/stick_objects_marking/stick_objects_marking_three_repository.ts deleted file mode 100644 index b9f136d..0000000 --- a/ui/src/features/stick_objects_marking/stick_objects_marking_three_repository.ts +++ /dev/null @@ -1,101 +0,0 @@ -import { Box3, BoxGeometry, Mesh, MeshBasicMaterial, Object3D, Vector3 } from "three"; -import { CoreThreeRepository } from "../../core/repository/core_three_repository"; -import { StickyHelper } from "./stick_objects_marking_store"; -import { CoreVector3 } from "../../core/model/core_vector3"; - -export class StickObjectsMarkingThreeRepository extends CoreThreeRepository { - stickyObjects: StickyHelper[]; - drawUiPoint: Function; - constructor(htmlCanvasRef: HTMLCanvasElement, watcherSceneEditorObject: Function, updatePoint: Function) { - super(htmlCanvasRef, watcherSceneEditorObject); - this.drawUiPoint = updatePoint; - this.sceneWatcher(); - } - - getStickyObject(name: string, pointNameHelper: string, index: number) { - const objectThatSticksNameMesh = this.scene.getObjectByName(name); - const pointName = objectThatSticksNameMesh!.name + ":point:" + index + pointNameHelper; - return this.scene.getObjectByName(pointName); - } - - mapperStickyObject(point: Vector3, index: number, name: string, pointNameHelper: string) { - const objectThatSticksNameMesh = this.scene.getObjectByName(name); - const pointName = objectThatSticksNameMesh!.name + ":point:" + index + pointNameHelper; - const sceneObject = this.scene.getObjectByName(pointName); - let pointMesh: Object3D; - if (sceneObject) { - pointMesh = sceneObject; - } else { - pointMesh = new Mesh(new BoxGeometry(1.1, 1.1, 1.1), new MeshBasicMaterial({ color: "#8BC34A" })); - } - pointMesh.position.copy(new Box3().setFromObject(objectThatSticksNameMesh!).getCenter(new Vector3()).add(point)); - pointMesh.name = pointName; - if (sceneObject === undefined) this.scene.add(pointMesh); - } - - stickyHelperLoader(stickyObjects: StickyHelper[]) { - this.stickyObjects = stickyObjects; - - stickyObjects.forEach((el) => { - el.objectThatSticksNamePoints.forEach((point, index) => - this.mapperStickyObject(point, index, el.objectThatSticksName, "objectThatSticksNamePoints") - ); - el.objectsToWhichItSticksPoints.forEach((point, index) => - this.mapperStickyObject(point, index, el.objectsToWhichItSticksName, "objectsToWhichItSticksPoints") - ); - }); - } - getCenter(obj: Object3D) { - return new Box3().setFromObject(obj).getCenter(new Vector3()); - } - sceneWatcher() { - this.transformControls.addEventListener("objectChange", (event) => { - //@ts-expect-error - const sceneActiveObject = event.target.object as Mesh; - - this.stickyObjects.forEach((stickyHelper) => { - if (sceneActiveObject.name === stickyHelper.objectThatSticksName) { - //локальные векторы точек - const objectThatSticksNameLocalVector = stickyHelper.objectThatSticksNamePoints[0]; - const objectsToWhichItSticksPointLocalVector = stickyHelper.objectsToWhichItSticksPoints[0]; - - //глобальные векторы обьектов - const globalVectorObjStickyName = this.scene.getObjectByName(stickyHelper.objectThatSticksName); - - const globalVectorObjToWhichSticks = this.scene.getObjectByName(stickyHelper.objectsToWhichItSticksName); - - const objectsToWhichItSticksNamePosition = new CoreVector3(globalVectorObjToWhichSticks!.position).add( - objectsToWhichItSticksPointLocalVector - ).vector; - - this.scene - .getObjectByName("cube2:point:0objectThatSticksNamePoints") - ?.position.copy(objectsToWhichItSticksNamePosition); - - // this.scene.getObjectByName("cube2:point:0objectThatSticksNamePoints")?.position; - - globalVectorObjStickyName?.position.copy( - this.scene - .getObjectByName("cube2:point:0objectThatSticksNamePoints")! - .position.add(objectsToWhichItSticksPointLocalVector) - ); - - // console.log(this.scene.children.map((e) => console.log(e.name))); - // cube2:point:0objectThatSticksNamePoints - // cube1:point:0objectsToWhichItSticksPoints - - // this.makePoint(objectThatSticksNamePosition, "red", 1.1); - // this.makePoint(objectsToWhichItSticksNamePosition, "red", 1.1); - - // const movePosition = objectThatSticksNamePosition.sub(objectsToWhichItSticksNamePosition); - // const movePosition = new Vector3().subVectors( - // objectThatSticksNamePosition, - // objectsToWhichItSticksNamePosition - // ); - - // this.scene.getObjectByName(stickyHelper.objectsToWhichItSticksName)?.position.copy(movePosition); - } - }); - }); - } -}