From 1cc489fc72918e364c25525552826013087dbb7c Mon Sep 17 00:00:00 2001 From: IDONTSUDO Date: Sun, 13 Oct 2024 21:52:55 +0300 Subject: [PATCH] everything but light --- server/src/core/models/static_files.ts | 1 + .../scenes/domain/create_robot_scenario.ts | 48 +++++-- ui/src/core/helper/use_store.tsx | 11 ++ .../core/repository/core_http_repository.ts | 2 + ui/src/core/store/base_store.ts | 13 ++ ui/src/core/ui/input/input.tsx | 7 + ui/src/core/ui/inputNumber/input_number.tsx | 11 +- ui/src/core/ui/toggle/toggle.tsx | 6 +- .../robot_device_form_store.ts | 2 +- .../presentation/components/coords_form.tsx | 2 +- .../presentation/forms/camera/camera_form.tsx | 122 ++++++++++-------- .../forms/camera/camera_store.tsx | 1 + .../forms/robot_form/robot_form.tsx | 80 ++++++------ .../forms/robot_form/robot_form_store.ts | 4 +- .../forms/solid_body/solid_body_form.tsx | 21 ++- .../presentation/scene_builder_store.ts | 1 - .../presentation/scene_manager.tsx | 6 +- 17 files changed, 206 insertions(+), 132 deletions(-) diff --git a/server/src/core/models/static_files.ts b/server/src/core/models/static_files.ts index c0d0678..654fda3 100644 --- a/server/src/core/models/static_files.ts +++ b/server/src/core/models/static_files.ts @@ -4,6 +4,7 @@ export enum StaticFilesProject { parts = "/assets/parts.json", scenes = "/scenes/", behaviorTrees = "behavior_trees", + robots = 'robots' } export enum StaticFilesServer { diff --git a/server/src/features/scenes/domain/create_robot_scenario.ts b/server/src/features/scenes/domain/create_robot_scenario.ts index 6b084a1..57cb76c 100644 --- a/server/src/features/scenes/domain/create_robot_scenario.ts +++ b/server/src/features/scenes/domain/create_robot_scenario.ts @@ -1,25 +1,45 @@ import { CallbackStrategyWithValidationModel, ResponseBase } from "../../../core/controllers/http_controller"; import { Result } from "../../../core/helpers/result"; import { RobotModel } from "../model/robot_model"; -import { StaticFilesProject } from "../../../core/models/static_files"; import { GetServerAddressUseCase } from "../../../core/usecases/get_server_address_usecase"; import { SearchManyDataBaseModelUseCase } from "../../../core/usecases/search_many_database_model_usecase"; import { IProjectModel, ProjectDBModel } from "../../projects/models/project_model_database_model"; import { ExecProcessUseCase } from "../../../core/usecases/exec_process_usecase"; +import { StaticFilesProject } from "../../../core/models/static_files"; export class CreateRobotScenario extends CallbackStrategyWithValidationModel { validationModel: RobotModel = new RobotModel(); - call = async (model: RobotModel): ResponseBase => ( - await new SearchManyDataBaseModelUseCase(ProjectDBModel).call( - { isActive: true }, - "is dont active projects" - ) - ).map(async (projectModel) => { - const { rootDir } = projectModel[0]; - rootDir + '/robots/' - - return Result.ok([]) - }); - - + call = async (model: RobotModel): ResponseBase => + ( + await new SearchManyDataBaseModelUseCase(ProjectDBModel).call( + { isActive: true }, + "is dont active projects" + ) + ).map((projectModel) => { + const { rootDir } = projectModel[0]; + console.log( + `python3 $PYTHON_ROBOT_BUILDER --path ${ + projectModel[0].rootDir + "/" + StaticFilesProject.robots + "/" + } --name ${model.name} --nDOF ${model.nDof} --toolType ${model.toolType}` + ); + return new GetServerAddressUseCase().call().map(async (serverAddress) => + ( + await new ExecProcessUseCase().call( + rootDir, + `python3 $PYTHON_ROBOT_BUILDER --path ${ + projectModel[0].rootDir + "/" + StaticFilesProject.robots + "/" + } --name ${model.name} --nDOF ${model.nDof} --toolType ${model.toolType}`, + "" + ) + ).map((log) => + Result.ok({ + robotUrl: `${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] + }/${StaticFilesProject.robots}/${model.name}/robot.xml`, + }) + ) + ); + }); } + +// PYTHON_ROBOT_BUILDER diff --git a/ui/src/core/helper/use_store.tsx b/ui/src/core/helper/use_store.tsx index db52450..3f483d5 100644 --- a/ui/src/core/helper/use_store.tsx +++ b/ui/src/core/helper/use_store.tsx @@ -18,3 +18,14 @@ export const useStore = (storeConstructor: ClassConstr }, []); return store; }; +export const useStoreClass = (storeClass: S) => { + const [store] = React.useState(storeClass); + const navigate = useNavigate(); + React.useEffect(() => { + store?.init?.(navigate); + return () => { + store?.dispose?.(); + }; + }, []); + return store; +}; diff --git a/ui/src/core/repository/core_http_repository.ts b/ui/src/core/repository/core_http_repository.ts index 779ebef..d2569df 100644 --- a/ui/src/core/repository/core_http_repository.ts +++ b/ui/src/core/repository/core_http_repository.ts @@ -141,3 +141,5 @@ export class CoreHttpRepository extends HttpRepository { } getAllScenes = () => this._jsonRequest(HttpMethod.GET, "/scenes"); } +["", "", ""].map((el) => el.toLowerCase()).map((el) => el != ""); +["", "", ""].map((el) => el.toLowerCase()).filter((el) => el != ""); diff --git a/ui/src/core/store/base_store.ts b/ui/src/core/store/base_store.ts index ebd7e65..0885e36 100644 --- a/ui/src/core/store/base_store.ts +++ b/ui/src/core/store/base_store.ts @@ -127,3 +127,16 @@ export abstract class FormState extends UiErrorState { this.viewModel = plainToInstance(instance, viewModel); }; } +abstract class Foo { + abstract init?(): void; +} +interface Foo1 { + init?(param1: number | undefined): void; +} +class Bar implements Foo1 {} +export interface LifeCycleStore { + init?(navigate?: NavigateFunction | undefined): void; + dispose?(): void; +} + +class VVV implements LifeCycleStore {} diff --git a/ui/src/core/ui/input/input.tsx b/ui/src/core/ui/input/input.tsx index 3969f20..a577cff 100644 --- a/ui/src/core/ui/input/input.tsx +++ b/ui/src/core/ui/input/input.tsx @@ -28,6 +28,13 @@ export const CoreInput = (props: IInputProps) => { setAppendInnerText(false); } }, [ref, value, isAppendInnerText, setAppendInnerText, props]); + React.useEffect(() => { + if (ref.current && props.value) { + ref.current.innerText = value; + setValue(props.value); + console.log(props.value); + } + }, [props.value]); const isSmall = props.type !== undefined && props.type.isEqual(CoreInputType.small); return (
{ setAppendInnerText(false); } }, [ref, value, isAppendInnerText, setAppendInnerText, props]); - + React.useEffect(() => { + if (props.value) setValue(props.value); + }, [props.value]); return ( <> - {/*
-
- - -
-
*/} +
{ const [isOpen, setOpen] = useState(props.isOpen); return ( -
+
setOpen(!isOpen)} > - +
{isOpen ? props.child : <>} diff --git a/ui/src/features/behavior_tree_builder/presentation/ui/forms/robot_device_form/robot_device_form_store.ts b/ui/src/features/behavior_tree_builder/presentation/ui/forms/robot_device_form/robot_device_form_store.ts index a1ea481..05e2e65 100644 --- a/ui/src/features/behavior_tree_builder/presentation/ui/forms/robot_device_form/robot_device_form_store.ts +++ b/ui/src/features/behavior_tree_builder/presentation/ui/forms/robot_device_form/robot_device_form_store.ts @@ -10,7 +10,7 @@ export class RobotDeviceFormStore extends FormState { makeAutoObservable(this); } viewModel: SidViewModel = SidViewModel.empty(); - cameraDeviceHttpRepository: RobotDeviceFormHttpRepository = new RobotDeviceFormHttpRepository(); + robotDeviceFormHttpRepository: RobotDeviceFormHttpRepository = new RobotDeviceFormHttpRepository(); errorHandingStrategy = (error: CoreError) => { } init = async (navigate?: NavigateFunction | undefined) => { diff --git a/ui/src/features/scene_builder/presentation/components/coords_form.tsx b/ui/src/features/scene_builder/presentation/components/coords_form.tsx index 13d6f78..b5de8d2 100644 --- a/ui/src/features/scene_builder/presentation/components/coords_form.tsx +++ b/ui/src/features/scene_builder/presentation/components/coords_form.tsx @@ -10,7 +10,7 @@ export const CoordsForm = ({ store, update }: { store: FormState; upda +
{ - const [store] = React.useState(() => new CameraFormStore(props.store)); - - React.useEffect(() => { - store.init(); - }, []); - return ( -
- - store.updateForm({ topic: text })} /> - store.updateForm({ name: text })} /> - Number().isValid(text)} - label={"Update Rate"} - onChange={(text) => store.updateForm({ updateRate: Number(text) })} - /> - Number().isValid(text)} - label={"Height"} - onChange={(text) => store.updateForm({ height: Number(text) })} - /> - Number().isValid(text)} - label={"Width"} - onChange={(text) => store.updateForm({ width: Number(text) })} - /> - Number().isValid(text)} - onChange={(text) => (store.updateForm({ fov: Number(text) }), store.updateCameraScene())} - /> - Number().isValid(text)} - onChange={(text) => (store.updateForm({ far: Number(text) }), store.updateCameraScene())} - /> - Number().isValid(text)} - onChange={(text) => (store.updateForm({ near: Number(text) }), store.updateCameraScene())} - /> - - v)} - value={store.viewModel.cameraType} - label={"Тип камеры"} - onChange={(text) => store.updateForm({ cameraType: text as CameraTypes })} + const store = useStoreClass(new CameraFormStore(props.store)); + return ( +
+ + + store.updateForm({ topic: text })} + /> + store.updateForm({ name: text })} + /> + Number().isValid(text)} + label={"Update Rate"} + onChange={(text) => store.updateForm({ updateRate: Number(text) })} + /> + Number().isValid(text)} + label={"Height"} + onChange={(text) => store.updateForm({ height: Number(text) })} + /> + Number().isValid(text)} + label={"Width"} + onChange={(text) => store.updateForm({ width: Number(text) })} + /> + Number().isValid(text)} + onChange={(text) => (store.updateForm({ fov: Number(text) }), store.updateCameraScene())} + /> + Number().isValid(text)} + onChange={(text) => (store.updateForm({ far: Number(text) }), store.updateCameraScene())} + /> + Number().isValid(text)} + onChange={(text) => (store.updateForm({ near: Number(text) }), store.updateCameraScene())} + /> + v)} + value={store.viewModel.cameraType} + label={"Тип камеры"} + onChange={(text) => store.updateForm({ cameraType: text as CameraTypes })} + /> + + } />
+ store.updateCameraScene()} /> +
{store.type !== "preview" ? ( store.clickNewCamera()} /> ) : null}
- -
); }); diff --git a/ui/src/features/scene_builder/presentation/forms/camera/camera_store.tsx b/ui/src/features/scene_builder/presentation/forms/camera/camera_store.tsx index 643fc3c..2c7d09d 100644 --- a/ui/src/features/scene_builder/presentation/forms/camera/camera_store.tsx +++ b/ui/src/features/scene_builder/presentation/forms/camera/camera_store.tsx @@ -36,6 +36,7 @@ export class CameraFormStore extends FormState { .rFind((el) => el.name.isEqual(this.sceneBuilderStore.selectedItemName ?? "")) .fold( (cameraModel) => { + console.log(200) this.loadDependency(cameraModel); this.type = "preview"; }, diff --git a/ui/src/features/scene_builder/presentation/forms/robot_form/robot_form.tsx b/ui/src/features/scene_builder/presentation/forms/robot_form/robot_form.tsx index b700967..15e8649 100644 --- a/ui/src/features/scene_builder/presentation/forms/robot_form/robot_form.tsx +++ b/ui/src/features/scene_builder/presentation/forms/robot_form/robot_form.tsx @@ -7,21 +7,18 @@ import { CoreInputNumber } from "../../../../../core/ui/inputNumber/input_number import { CoreInput, CoreInputType } from "../../../../../core/ui/input/input"; import { match } from "ts-pattern"; import { CoreSelect } from "../../../../../core/ui/select/select"; -import { ToolTypes } from "../../../../../core/model/robot_model"; +import { RobotModel, ToolTypes } from "../../../../../core/model/robot_model"; import { CoreButton } from "../../../../../core/ui/button/button"; import { SpawnPositionTypesForm } from "../../components/spawn_position_types"; import { CoordsForm } from "../../components/coords_form"; +import { useStoreClass } from "../../../../../core/helper/use_store"; +import { Toggle } from "../../../../../core/ui/toggle/toggle"; export const RobotForm = observer((props: IDefaultSceneManagerFormProps) => { - const [store] = React.useState(() => new RobotFormStore(props.store)); - React.useEffect(() => { - store.init(); - return () => { - store.dispose(); - }; - }, []); + const store = useStoreClass(new RobotFormStore(props.store)); + return ( -
+
{match(store.storeType) .with(RobotStoreType.awaitMouseClick, () => ( <> @@ -59,37 +56,44 @@ export const RobotForm = observer((props: IDefaultSceneManagerFormProps) => { )) .with(RobotStoreType.previewRobot, () => ( <> - - {store.viewModel.jointPosition.map((el, i) => ( -
- ( - store.updateForm({ - jointPosition: store.viewModel.jointPosition.map((element, index) => - index.isEqualR(i).fold( - () => { - element.angle = value; - return element; - }, - () => element - ) - ), - }), - store.updateScene() - )} - label={el.name} - /> -
- ))} -
+ + {store.viewModel.jointPosition.map((el, i) => ( +
+ ( + store.updateForm({ + jointPosition: store.viewModel.jointPosition.map((element, index) => + index.isEqualR(i).fold( + () => { + element.angle = value; + return element; + }, + () => element + ) + ), + }), + store.updateScene() + )} + label={el.name} + /> +
+ ))} + + } + isOpen={false} + /> + +
store.updateScene()} />
- )) .otherwise(() => ( diff --git a/ui/src/features/scene_builder/presentation/forms/robot_form/robot_form_store.ts b/ui/src/features/scene_builder/presentation/forms/robot_form/robot_form_store.ts index 78b8088..ba6302f 100644 --- a/ui/src/features/scene_builder/presentation/forms/robot_form/robot_form_store.ts +++ b/ui/src/features/scene_builder/presentation/forms/robot_form/robot_form_store.ts @@ -75,8 +75,8 @@ export class RobotFormStore extends FormState { this.sceneBuilderStore.scene .rFind((el) => el.name.isEqual(this.sceneBuilderStore.selectedItemName ?? "")) .fold( - (solidBodyModel) => { - this.loadDependency(solidBodyModel); + (robotModel) => { + this.loadDependency(robotModel); this.storeType = RobotStoreType.previewRobot; }, () => diff --git a/ui/src/features/scene_builder/presentation/forms/solid_body/solid_body_form.tsx b/ui/src/features/scene_builder/presentation/forms/solid_body/solid_body_form.tsx index 753abd1..ca78182 100644 --- a/ui/src/features/scene_builder/presentation/forms/solid_body/solid_body_form.tsx +++ b/ui/src/features/scene_builder/presentation/forms/solid_body/solid_body_form.tsx @@ -8,22 +8,29 @@ import { match } from "ts-pattern"; import { SpawnPositionTypesForm } from "../../components/spawn_position_types"; import { CoreInput } from "../../../../../core/ui/input/input"; import { CoordsForm } from "../../components/coords_form"; +import { useStoreClass } from "../../../../../core/helper/use_store"; +import { Toggle } from "../../../../../core/ui/toggle/toggle"; export const SolidBodyForm = observer((props: IDefaultSceneManagerFormProps) => { - const [store] = React.useState(() => new SolidBodyStore(props.store)); - React.useEffect(() => { - store.init(); - }, []); + const store = useStoreClass(new SolidBodyStore(props.store)); return ( -
+
<> {match(store.solidBodyStoreType) .with(SolidBodyStoreType.previewSolid, () => ( <> - + + + + } + isOpen={false} + /> +
- )) .with(SolidBodyStoreType.selectBody, () => ( diff --git a/ui/src/features/scene_builder/presentation/scene_builder_store.ts b/ui/src/features/scene_builder/presentation/scene_builder_store.ts index 4143d42..cd02929 100644 --- a/ui/src/features/scene_builder/presentation/scene_builder_store.ts +++ b/ui/src/features/scene_builder/presentation/scene_builder_store.ts @@ -1,4 +1,3 @@ -import { message } from "antd"; import makeAutoObservable from "mobx-store-inheritance"; import { Vector2, Vector3, Object3D } from "three"; import { CameraModel } from "../../../core/model/camera_model"; diff --git a/ui/src/features/scene_manager/presentation/scene_manager.tsx b/ui/src/features/scene_manager/presentation/scene_manager.tsx index b2d20b8..94fdd5b 100644 --- a/ui/src/features/scene_manager/presentation/scene_manager.tsx +++ b/ui/src/features/scene_manager/presentation/scene_manager.tsx @@ -1,16 +1,14 @@ import * as React from "react"; import { DrawersSceneManager, SceneMangerStore } from "./scene_manager_store"; import { observer } from "mobx-react-lite"; -import { Drawer, Popover } from "antd"; -import { useNavigate, useParams } from "react-router-dom"; +import { Drawer } from "antd"; +import { useNavigate } from "react-router-dom"; import { MainPage } from "../../../core/ui/pages/main_page"; import { CoreText, CoreTextType } from "../../../core/ui/text/text"; import { CoreButton } from "../../../core/ui/button/button"; import { CoreInput } from "../../../core/ui/input/input"; import { DrawersDataset } from "../../dataset/dataset_store"; import { Icon } from "../../../core/ui/icons/icons"; -import { sceneManagerForms } from "../../scene_builder/presentation/forms/scene_manager_forms"; -import { SceneMode } from "../model/scene_view"; import { useStore } from "../../../core/helper/use_store"; import { SceneBuilderScreenPath } from "../../scene_builder/presentation/scene_builder_screen";