everything but light

This commit is contained in:
IDONTSUDO 2024-10-13 21:52:55 +03:00
parent 139f012803
commit 1cc489fc72
17 changed files with 206 additions and 132 deletions

View file

@ -4,6 +4,7 @@ export enum StaticFilesProject {
parts = "/assets/parts.json",
scenes = "/scenes/",
behaviorTrees = "behavior_trees",
robots = 'robots'
}
export enum StaticFilesServer {

View file

@ -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<RobotModel> {
validationModel: RobotModel = new RobotModel();
call = async (model: RobotModel): ResponseBase => (
await new SearchManyDataBaseModelUseCase<IProjectModel>(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<IProjectModel>(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

View file

@ -18,3 +18,14 @@ export const useStore = <S extends LifeCycleStore>(storeConstructor: ClassConstr
}, []);
return store;
};
export const useStoreClass = <S extends LifeCycleStore>(storeClass: S) => {
const [store] = React.useState(storeClass);
const navigate = useNavigate();
React.useEffect(() => {
store?.init?.(navigate);
return () => {
store?.dispose?.();
};
}, []);
return store;
};

View file

@ -141,3 +141,5 @@ export class CoreHttpRepository extends HttpRepository {
}
getAllScenes = () => this._jsonRequest<SceneModel[]>(HttpMethod.GET, "/scenes");
}
["", "", ""].map((el) => el.toLowerCase()).map((el) => el != "");
["", "", ""].map((el) => el.toLowerCase()).filter((el) => el != "");

View file

@ -127,3 +127,16 @@ export abstract class FormState<V, E> extends UiErrorState<E> {
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 {}

View file

@ -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 (
<div

View file

@ -25,15 +25,12 @@ export const CoreInputNumber = (props: IInputProps) => {
setAppendInnerText(false);
}
}, [ref, value, isAppendInnerText, setAppendInnerText, props]);
React.useEffect(() => {
if (props.value) setValue(props.value);
}, [props.value]);
return (
<>
{/* <div style={{ position: "absolute" }}>
<div style={{ width: width, display: "flex", justifyContent: "flex-end" }}>
<Icon type="Plus" />
<Icon type="Minus" />
</div>
</div> */}
<div
style={Object.assign(
{

View file

@ -10,18 +10,18 @@ interface IToggleProps {
export const Toggle = (props: IToggleProps) => {
const [isOpen, setOpen] = useState(props.isOpen);
return (
<div style={{ border: "1px black solid" }}>
<div style={{ border: "1px black solid", height: "max-content",width:"100%" }}>
<div
style={{
display: "flex",
justifyContent: "space-between",
margin: 0,
padding:5,
padding: 5,
alignItems: "center",
}}
onClick={() => setOpen(!isOpen)}
>
<CoreText style={{ height: 33 }} text={props.name} type={CoreTextType.large} />
<CoreText text={props.name} type={CoreTextType.large} />
<Icon type="PlusCircle" style={{ width: 33 }} />
</div>
{isOpen ? props.child : <></>}

View file

@ -10,7 +10,7 @@ export class RobotDeviceFormStore extends FormState<SidViewModel, CoreError> {
makeAutoObservable(this);
}
viewModel: SidViewModel = SidViewModel.empty();
cameraDeviceHttpRepository: RobotDeviceFormHttpRepository = new RobotDeviceFormHttpRepository();
robotDeviceFormHttpRepository: RobotDeviceFormHttpRepository = new RobotDeviceFormHttpRepository();
errorHandingStrategy = (error: CoreError) => { }
init = async (navigate?: NavigateFunction | undefined) => {

View file

@ -10,7 +10,7 @@ export const CoordsForm = ({ store, update }: { store: FormState<any, any>; upda
<Toggle
name={"Координаты"}
child={
<div style={{margin:10}}>
<div >
<CoreText text="Позиция" type={CoreTextType.header} />
<CoreInput

View file

@ -7,69 +7,83 @@ import { CoreSelect } from "../../../../../core/ui/select/select";
import { CameraFormStore } from "./camera_store";
import { observer } from "mobx-react-lite";
import { CameraTypes } from "../../../../../core/model/camera_model";
import { useStoreClass } from "../../../../../core/helper/use_store";
import { CoordsForm } from "../../components/coords_form";
import { Toggle } from "../../../../../core/ui/toggle/toggle";
export const CameraForm = observer((props: IDefaultSceneManagerFormProps) => {
const [store] = React.useState(() => new CameraFormStore(props.store));
React.useEffect(() => {
store.init();
}, []);
return (
<div style={{ margin: 10, padding: 10, overflowY: "auto", height: "100%" }}>
<CoreText text="Камера" type={CoreTextType.header} />
<CoreInput value={store.viewModel.topic} label={"Топик"} onChange={(text) => store.updateForm({ topic: text })} />
<CoreInput value={store.viewModel.name} label={"Имя"} onChange={(text) => store.updateForm({ name: text })} />
<CoreInput
value={String(store.viewModel.updateRate)}
validation={(text) => Number().isValid(text)}
label={"Update Rate"}
onChange={(text) => store.updateForm({ updateRate: Number(text) })}
/>
<CoreInput
value={String(store.viewModel.height)}
validation={(text) => Number().isValid(text)}
label={"Height"}
onChange={(text) => store.updateForm({ height: Number(text) })}
/>
<CoreInput
value={String(store.viewModel.width)}
validation={(text) => Number().isValid(text)}
label={"Width"}
onChange={(text) => store.updateForm({ width: Number(text) })}
/>
<CoreInput
value={String(store.viewModel.fov)}
label={"Fov"}
validation={(text) => Number().isValid(text)}
onChange={(text) => (store.updateForm({ fov: Number(text) }), store.updateCameraScene())}
/>
<CoreInput
value={String(store.viewModel.far)}
label={"Far"}
validation={(text) => Number().isValid(text)}
onChange={(text) => (store.updateForm({ far: Number(text) }), store.updateCameraScene())}
/>
<CoreInput
value={String(store.viewModel.near)}
label={"Near"}
validation={(text) => Number().isValid(text)}
onChange={(text) => (store.updateForm({ near: Number(text) }), store.updateCameraScene())}
/>
<CoreSelect
items={Object.entries(CameraTypes).map(([_, v]) => v)}
value={store.viewModel.cameraType}
label={"Тип камеры"}
onChange={(text) => store.updateForm({ cameraType: text as CameraTypes })}
const store = useStoreClass(new CameraFormStore(props.store));
return (
<div style={{ overflowY: "auto", height: "100%" }}>
<Toggle
name={"Настройки камеры"}
isOpen={false}
child={
<>
<CoreInput
value={store.viewModel.topic}
label={"Топик"}
onChange={(text) => store.updateForm({ topic: text })}
/>
<CoreInput
value={store.viewModel.name}
label={"Имя"}
onChange={(text) => store.updateForm({ name: text })}
/>
<CoreInput
value={String(store.viewModel.updateRate)}
validation={(text) => Number().isValid(text)}
label={"Update Rate"}
onChange={(text) => store.updateForm({ updateRate: Number(text) })}
/>
<CoreInput
value={String(store.viewModel.height)}
validation={(text) => Number().isValid(text)}
label={"Height"}
onChange={(text) => store.updateForm({ height: Number(text) })}
/>
<CoreInput
value={String(store.viewModel.width)}
validation={(text) => Number().isValid(text)}
label={"Width"}
onChange={(text) => store.updateForm({ width: Number(text) })}
/>
<CoreInput
value={String(store.viewModel.fov)}
label={"Fov"}
validation={(text) => Number().isValid(text)}
onChange={(text) => (store.updateForm({ fov: Number(text) }), store.updateCameraScene())}
/>
<CoreInput
value={String(store.viewModel.far)}
label={"Far"}
validation={(text) => Number().isValid(text)}
onChange={(text) => (store.updateForm({ far: Number(text) }), store.updateCameraScene())}
/>
<CoreInput
value={String(store.viewModel.near)}
label={"Near"}
validation={(text) => Number().isValid(text)}
onChange={(text) => (store.updateForm({ near: Number(text) }), store.updateCameraScene())}
/>
<CoreSelect
items={Object.entries(CameraTypes).map(([_, v]) => v)}
value={store.viewModel.cameraType}
label={"Тип камеры"}
onChange={(text) => store.updateForm({ cameraType: text as CameraTypes })}
/>
</>
}
/>
<div style={{ height: 10 }} />
<CoordsForm store={store} update={() => store.updateCameraScene()} />
<div style={{ height: 10 }} />
{store.type !== "preview" ? (
<CoreButton text="Создать" style={{ width: 96 }} onClick={() => store.clickNewCamera()} />
) : null}
<div style={{ height: 50 }} />
</div>
);
});

View file

@ -36,6 +36,7 @@ export class CameraFormStore extends FormState<CameraModel, CoreError> {
.rFind<CameraModel>((el) => el.name.isEqual(this.sceneBuilderStore.selectedItemName ?? ""))
.fold(
(cameraModel) => {
console.log(200)
this.loadDependency(cameraModel);
this.type = "preview";
},

View file

@ -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 (
<div style={{ overflowY: "scroll", height: "100%" }}>
<div style={{ overflowY: "auto", height: "100%" }}>
{match(store.storeType)
.with(RobotStoreType.awaitMouseClick, () => (
<>
@ -59,37 +56,44 @@ export const RobotForm = observer((props: IDefaultSceneManagerFormProps) => {
))
.with(RobotStoreType.previewRobot, () => (
<>
<CoreText text="Управление соединениями" type={CoreTextType.small} />
{store.viewModel.jointPosition.map((el, i) => (
<div>
<CoreInputNumber
key={i}
step={0.1}
max={Number(el.limit.upper)}
min={Number(el.limit.lower)}
value={0}
onChange={(value) => (
store.updateForm({
jointPosition: store.viewModel.jointPosition.map((element, index) =>
index.isEqualR(i).fold(
() => {
element.angle = value;
return element;
},
() => element
)
),
}),
store.updateScene()
)}
label={el.name}
/>
</div>
))}
<div style={{ height: 40 }} />
<Toggle
name={"Управление соединениями"}
child={
<>
{store.viewModel.jointPosition.map((el, i) => (
<div>
<CoreInputNumber
key={i}
step={0.1}
max={Number(el.limit.upper)}
min={Number(el.limit.lower)}
value={el.angle}
onChange={(value) => (
store.updateForm({
jointPosition: store.viewModel.jointPosition.map((element, index) =>
index.isEqualR(i).fold(
() => {
element.angle = value;
return element;
},
() => element
)
),
}),
store.updateScene()
)}
label={el.name}
/>
</div>
))}
</>
}
isOpen={false}
/>
<div style={{ height: 10 }} />
<CoordsForm store={store} update={() => store.updateScene()} />
<div style={{ height: 40 }} />
</>
))
.otherwise(() => (

View file

@ -75,8 +75,8 @@ export class RobotFormStore extends FormState<RobotModel, CoreError> {
this.sceneBuilderStore.scene
.rFind<RobotModel>((el) => el.name.isEqual(this.sceneBuilderStore.selectedItemName ?? ""))
.fold(
(solidBodyModel) => {
this.loadDependency(solidBodyModel);
(robotModel) => {
this.loadDependency(robotModel);
this.storeType = RobotStoreType.previewRobot;
},
() =>

View file

@ -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 (
<div style={{ display: "flex", flexDirection: "column", alignItems: "center", overflow: "auto", height: "100%" }}>
<div style={{ display: "flex", flexDirection: "column", alignItems: "center", overflow: "auto", height: "100%",width:'100%' }}>
<>
{match(store.solidBodyStoreType)
.with(SolidBodyStoreType.previewSolid, () => (
<>
<CoreText text={"Твердое тело"} type={CoreTextType.header} />
<Toggle
name={"Настройки твердого тела"}
child={
<>
<CoreText text={"Тип твердого тела: " + store.viewModel.solidType} type={CoreTextType.header} />
</>
}
isOpen={false}
/>
<div style={{height:10}}/>
<CoordsForm store={store} update={store.updateBodySimulation} />
<CoreText text={"Тип твердого тела: " + store.viewModel.solidType} type={CoreTextType.header} />
</>
))
.with(SolidBodyStoreType.selectBody, () => (

View file

@ -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";

View file

@ -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";