diff --git a/.vscode/settings.json b/.vscode/settings.json index fc737fc..fc4aa24 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,6 @@ { - "cSpell.words": ["Ведите"] + "cSpell.words": [ + "Ведите", + "typedataset" + ] } diff --git a/server/src/features/datasets/domain/exec_process_scenario.ts b/server/src/features/datasets/domain/exec_process_scenario.ts index 41d375a..3742a5e 100644 --- a/server/src/features/datasets/domain/exec_process_scenario.ts +++ b/server/src/features/datasets/domain/exec_process_scenario.ts @@ -6,15 +6,15 @@ import { MongoIdValidation } from "../../../core/validations/mongo_id_validation import { DatasetDBModel } from "../models/dataset_database_model"; import { IDatasetModel } from "../models/dataset_validation_model"; import { ProcessWatcherAndDatabaseUpdateService } from "./create_dataset_scenario"; - + export class ExecDatasetProcessScenario extends CallbackStrategyWithIdQuery { idValidationExpression = new MongoIdValidation(); call = async (id: string): ResponseBase => { return (await new ReadByIdDataBaseModelUseCase(DatasetDBModel).call(id)).map(async (model) => { return (await new IsHaveActiveProcessUseCase().call()).map(async () => { - await DatasetDBModel.findById(id).updateOne({processStatus:"RUN"}) - return new ExecProcessUseCase().call( + await DatasetDBModel.findById(id).updateOne({ processStatus: "RUN" }); + return new ExecProcessUseCase().call( `${model.project.rootDir}/`, `python3 $PYTHON_BLENDER_PROC --path '${model.project.rootDir}/${model.name}/'`, id, diff --git a/ui/src/core/ui/form_builder/form_builder.tsx b/ui/src/core/ui/form_builder/form_builder.tsx index e890363..cc34abe 100644 --- a/ui/src/core/ui/form_builder/form_builder.tsx +++ b/ui/src/core/ui/form_builder/form_builder.tsx @@ -1,5 +1,5 @@ import * as React from "react"; -import { InputBuilderViewModel, InputType } from "./form_view_model"; +import { FormViewModel, InputBuilderViewModel, InputType } from "./form_view_model"; import { observer } from "mobx-react-lite"; import { FormBuilderStore } from "./form_builder_store"; import { FormBuilderValidationModel } from "../../../features/dataset/dataset_model"; @@ -9,8 +9,7 @@ import { Icon } from "../icons/icons"; import { CoreText, CoreTextType } from "../text/text"; export interface IFormBuilder { - context: string; - result: string; + formBuilder: FormBuilderValidationModel; onChange: (change: FormBuilderValidationModel) => void; } @@ -18,11 +17,19 @@ export const FormBuilder = observer((props: IFormBuilder) => { const [store] = React.useState(() => new FormBuilderStore()); React.useEffect(() => { - store.init(props.context, props.result); + store.init(props.formBuilder.context, props.formBuilder.result); + if (props.formBuilder.form.isNotEmpty()) { + store.formViewModel = new FormViewModel( + props.formBuilder.form.map((el) => InputBuilderViewModel.fromJSON(el)), + props.formBuilder.context, + props.formBuilder.result + ); + console.log(props.formBuilder.form.map((el) => InputBuilderViewModel.fromJSON(el))); + } store.changerForm.on((event) => { if (event) props.onChange(event); }); - }, [store, props]); + }, []); return (
@@ -105,7 +112,7 @@ export const FormBuilder = observer((props: IFormBuilder) => { : undefined } error="только числа" - value={subSubArrayItem.defaultValue} + value={subSubArrayItem.totalValue ?? subSubArrayItem.defaultValue} label={subSubArrayItem.name} />
@@ -131,7 +138,7 @@ export const FormBuilder = observer((props: IFormBuilder) => { onChange={(e) => { store.changeTotalValue(element.id, e); }} - value={element.defaultValue} + value={element.totalValue ?? element.defaultValue} error="только числа" label={element.name} style={{ margin: 20 }} diff --git a/ui/src/core/ui/form_builder/form_builder_store.ts b/ui/src/core/ui/form_builder/form_builder_store.ts index a7e3605..d43e774 100644 --- a/ui/src/core/ui/form_builder/form_builder_store.ts +++ b/ui/src/core/ui/form_builder/form_builder_store.ts @@ -40,7 +40,7 @@ export class FormBuilderStore { } }); - console.log(this.formViewModel?.fromFormBuilderValidationModel()); + this.changerForm.emit(this.formViewModel?.fromFormBuilderValidationModel()); } } @@ -72,10 +72,6 @@ export class FormBuilderStore { this.changerForm.emit(this.formViewModel?.fromFormBuilderValidationModel()); } - saveForm(): void { - console.log(this.formViewModel?.toResult()); - } - open = (id: string) => { if (this.formViewModel) this.formViewModel.inputs = this.formViewModel?.inputs.map((el) => { diff --git a/ui/src/core/ui/form_builder/form_view_model.ts b/ui/src/core/ui/form_builder/form_view_model.ts index 94f1be5..aac335f 100644 --- a/ui/src/core/ui/form_builder/form_view_model.ts +++ b/ui/src/core/ui/form_builder/form_view_model.ts @@ -19,15 +19,33 @@ export class InputBuilderViewModel { public values: string[] | undefined | InputBuilderViewModel[] = undefined, public totalValue: any | undefined = undefined, public isOpen: boolean = false, - public subType: string | undefined = undefined + public subType: string | undefined = undefined, + id: string | undefined = undefined ) { - this.id = uuidv4(); + this.id = id ?? uuidv4(); } static fromJSON(json: any) { - return new InputBuilderViewModel(json.name, json.type, json.defaultValue, json.values, json.isOpen, json.id); + try { + const value = JSON.parse(json); + return new InputBuilderViewModel( + value.name, + value.type, + value.defaultValue, + value.values, + value.totalValue, + value.isOpen, + value.subType, + value.id + ); + } catch (error) { + console.log("InputBuilderViewModel.fromJSON(): " + json); + throw new Error("InputBuilderViewModel.fromJSON"); + } } public toJson(): string { try { + console.log(this.id); + console.log(this.totalValue); return JSON.stringify(this); } catch (error) { console.log("InputBuilderViewModel.toJson(): " + this.id); @@ -54,8 +72,13 @@ export class FormViewModel { this.inputs = inputs; makeAutoObservable(this); } - public json(){ - return JSON.parse(this.toResult().replaceAll("\n", "").replaceAll("\\", "").replaceAll("/", "")) + public json() { + const result = this.toResult(); + try { + return JSON.parse(result).replaceAll("\n", "").replaceAll("\\", "").replaceAll("/", ""); + } catch (error) { + console.log(result); + } } public fromFormBuilderValidationModel() { return new FormBuilderValidationModel( @@ -66,7 +89,7 @@ export class FormViewModel { ); } public toResult(): string { - let result = this.result; + let result = ""; this.inputs.forEach((element) => { let inputResult = element.totalValue ?? element.defaultValue; @@ -81,25 +104,26 @@ export class FormViewModel { inputResult = "[]"; } else { inputResult = []; - // @ts-ignore - element.totalValue.forEach((el) => { - const objectUnion = {}; - if (el instanceof Array) - el.forEach((subElement) => { - let subResult = subElement.totalValue ?? subElement.defaultValue; - if (element.type.isEqualMany([InputType.STRING, InputType.ENUM])) { - subResult = `"${String(subResult)}"`; - } - if (element.type.isEqual(InputType.NUMBER)) { - subResult = Number(subResult); - } - // @ts-ignore - objectUnion[subElement.name] = subResult; - }); - if (Object.keys(objectUnion).length !== 0) { - inputResult.push(objectUnion); - } - }); + if (element.totalValue instanceof Array) { + element.totalValue.forEach((el) => { + const objectUnion = {}; + if (el instanceof Array) + el.forEach((subElement) => { + let subResult = subElement.totalValue ?? subElement.defaultValue; + if (element.type.isEqualMany([InputType.STRING, InputType.ENUM])) { + subResult = `"${String(subResult)}"`; + } + if (element.type.isEqual(InputType.NUMBER)) { + subResult = Number(subResult); + } + // @ts-ignore + objectUnion[subElement.name] = subResult; + }); + if (Object.keys(objectUnion).length !== 0) { + inputResult.push(objectUnion); + } + }); + } } } if (inputResult instanceof Array) inputResult = JSON.stringify(inputResult); diff --git a/ui/src/features/dataset/dataset_model.ts b/ui/src/features/dataset/dataset_model.ts index 8b0e6c0..4210e23 100644 --- a/ui/src/features/dataset/dataset_model.ts +++ b/ui/src/features/dataset/dataset_model.ts @@ -15,7 +15,7 @@ export interface IDatasetModel { processStatus: ProcessStatus; projectId: string; name: string; - formBuilder: FormBuilder; + formBuilder: FormBuilderValidationModel; unixTime: number; datasetType: string; local_path: string; @@ -28,13 +28,7 @@ export interface Dataset { local_path: string; dataSetObjects: string[]; unixDate: number; - formBuilder: FormBuilder; -} - -export interface FormBuilder { - result: string; - context: string; - form: InputBuilderViewModel[]; + formBuilder: FormBuilderValidationModel; } export interface Assets { @@ -68,10 +62,16 @@ export class DataSetModel { name: string; formBuilder: FormBuilderValidationModel = FormBuilderValidationModel.empty(); project?: string; - processStatus?:string - isNew:boolean; - _id?:string; - constructor(dataSetObjects: string[], datasetType = datasetTypes[0], datasetName: string, isNew = true, id:string | undefined = undefined) { + processStatus?: string; + isNew: boolean; + _id?: string; + constructor( + dataSetObjects: string[], + datasetType = datasetTypes[0], + datasetName: string, + isNew = true, + id: string | undefined = undefined + ) { this.dataSetObjects = dataSetObjects; this.datasetType = datasetType; this.name = datasetName; @@ -85,16 +85,12 @@ export class DataSetModel { } isValid(): Result { - if (this.project === undefined) { return Result.error("project is unknow"); } if (this.dataSetObjects.isEmpty()) { return Result.error("Не выделены детали"); } - if (this.datasetType.isEmpty()) { - return Result.error("Навык датасета не выбран"); - } if (this.name.isEmpty()) { return Result.error("ВВедите имя датасета"); } @@ -102,35 +98,37 @@ export class DataSetModel { } static fromIDatasetModel(model: IDatasetModel) { - return new DataSetModel(model.dataSetObjects, model.datasetType, model.name, false, model._id); + const dataSetModel = new DataSetModel(model.dataSetObjects, model.datasetType, model.name, false, model._id); + dataSetModel.formBuilder = model.formBuilder; + return dataSetModel; } } export const datasetTypes = ["Object Detection - YOLOv8", "Pose Estimation - DOPE"]; export const datasetFormMockResult = `{ - "typedataset": \${typedataset:Enum:ObjectDetection}, - "models_randomization":{ - "loc_range_low": [\${LOC_RANGE_LOW_1:number:-1}, \${LOC_RANGE_LOW_2:number:-1},/\${LOC_RANGE_LOW_3:number:0}], - "loc_range_high": [\${LOC_RANGE_HIGH_1:number:1}, \${LOC_RANGE_HIGH_2:number:1},/\${LOC_RANGE_HIGH_3:number:2}] - }, - "scene":{ - "objects": \${OBJECTS_SCENE:Array:[]}, - "lights": \${LIGHTS:Array:[]} - }, - "camera_position":{ - "center_shell": [\${CENTER_SHELL_1:number:0}, \${CENTER_SHELL_2:number:0}, \${CENTER_SHELL_3:number:0}], - "radius_range": [\${RADIUS_RANGE_1:number:1}, \${RADIUS_RANGE_2:number:1.4}], - "elevation_range": [\${ELEVATION_RANGE_1:number:10}, \${ELEVATION_RANGE_2:number:90}] - }, - "generation":{ - "n_cam_pose": \${N_CAM_POSE:number:5}, - "n_sample_on_pose": \${N_SAMPLE_ON_POSE:number:3}, - "n_series": \${N_SERIES:number:100}, - "image_format": \${image_format:Enum:jpg}, - "image_size_wh": [\${IMAGE_SIZE_WH_1:number:640}, \${IMAGE_SIZE_WH_2:number:480}] - } + "typedataset": \${typedataset:Enum:ObjectDetection}, + "models_randomization":{ + "loc_range_low": [\${LOC_RANGE_LOW_1:number:-1}, \${LOC_RANGE_LOW_2:number:-1},/\${LOC_RANGE_LOW_3:number:0}], + "loc_range_high": [\${LOC_RANGE_HIGH_1:number:1}, \${LOC_RANGE_HIGH_2:number:1},/\${LOC_RANGE_HIGH_3:number:2}] + }, + "scene":{ + "objects": \${OBJECTS_SCENE:Array:[]}, + "lights": \${LIGHTS:Array:[]} + }, + "camera_position":{ + "center_shell": [\${CENTER_SHELL_1:number:0}, \${CENTER_SHELL_2:number:0}, \${CENTER_SHELL_3:number:0}], + "radius_range": [\${RADIUS_RANGE_1:number:1}, \${RADIUS_RANGE_2:number:1.4}], + "elevation_range": [\${ELEVATION_RANGE_1:number:10}, \${ELEVATION_RANGE_2:number:90}] + }, + "generation":{ + "n_cam_pose": \${N_CAM_POSE:number:5}, + "n_sample_on_pose": \${N_SAMPLE_ON_POSE:number:3}, + "n_series": \${N_SERIES:number:100}, + "image_format": \${image_format:Enum:jpg}, + "image_size_wh": [\${IMAGE_SIZE_WH_1:number:640}, \${IMAGE_SIZE_WH_2:number:480}] } +} `; export const datasetFormMockContext = ` diff --git a/ui/src/features/dataset/dataset_screen.tsx b/ui/src/features/dataset/dataset_screen.tsx index 719007c..69dbe4f 100644 --- a/ui/src/features/dataset/dataset_screen.tsx +++ b/ui/src/features/dataset/dataset_screen.tsx @@ -45,8 +45,8 @@ export const DataSetScreen: React.FunctionComponent = observer(() => { objects={el.dataSetObjects} unixDate={el.unixTime} processStatus={el.processStatus} - neuralNetworkAction={el.datasetType.split(" - ").at(0)} - neuralNetworkName={el.datasetType.split(" - ").at(1)} + neuralNetworkAction={el.datasetType} + neuralNetworkName={el.name} id={el._id} onClickButton={(id: string) => store.runProcess(id)} onDelete={(id: string) => store.deleteDataset(id)} @@ -67,8 +67,7 @@ export const DataSetScreen: React.FunctionComponent = observer(() => { open={store.drawers.find((el) => el.name === DrawersDataset.FormBuilderDrawer)?.status ?? false} > { store.dataSetModel.formBuilder = el; }} @@ -94,26 +93,7 @@ export const DataSetScreen: React.FunctionComponent = observer(() => { >
store.setNewDatasetName(e)} /> -
- - {datasetTypes.map((el) => { - return ( -
store.setSkillSelected(el)} - style={{ - backgroundColor: store.skillIsSelected(el) ? "rgb(103 80 164)" : "rgba(254, 247, 255, 1)", - borderRadius: 25, - color: store.skillIsSelected(el) ? "white" : "", - margin: 10, - padding: 10, - cursor: "pointer", - }} - > - {el} -
- ); - })} -
+
store.editDrawer(DrawersDataset.FormBuilderDrawer, true)} diff --git a/ui/src/features/socket_lister/socket_lister_store.ts b/ui/src/features/socket_lister/socket_lister_store.ts index 956c571..0b7d24c 100644 --- a/ui/src/features/socket_lister/socket_lister_store.ts +++ b/ui/src/features/socket_lister/socket_lister_store.ts @@ -1,9 +1,10 @@ import { makeAutoObservable } from "mobx"; import { SocketRepository, socketRepository } from "../../core/repository/socket_repository"; +import { setTimeout } from "timers/promises"; class SocketListerStore { repository: SocketRepository; - socketHasDisconnect = false; + socketHasDisconnect = true; constructor(repository: SocketRepository) { this.repository = repository;