Сохраняемся

This commit is contained in:
2026-07-24 09:45:32 +03:00
parent 6cfc16e53c
commit 0614ea384a
14 changed files with 1592 additions and 142 deletions
+60 -9
View File
@@ -22,7 +22,10 @@ from dataset_generator import (
iter_generate_dataset,
list_dataset_runs,
load_dataset_run,
list_object_presets,
load_object_points_from_obj_text,
load_preset_object_points,
OBJECT_PRESETS,
load_scene_preview,
resolve_output_dir,
)
@@ -137,11 +140,18 @@ class DatasetLoadBody(BaseModel):
class MlePrepareBody(BaseModel):
seed: int = 42
sizeX: float = 40.0
sizeY: float = 60.0
sizeX: float | None = None
sizeY: float | None = None
resX: int = 80
resY: int = 120
outputDir: str = "mle_runs"
reliefScalePct: float = 20.0
auvX: float | None = None
auvY: float | None = None
auvHeadingDeg: float | None = None
surveyLength: float | None = None
auvDepth: float | None = None
swathAngleDeg: float | None = None
settings: dict[str, Any] | None = None
@@ -475,6 +485,11 @@ def generator_resolve_intersections(body: GeneratorResolveBody) -> dict[str, Any
raise HTTPException(status_code=400, detail=str(exc)) from exc
@app.get("/api/dataset/object-presets")
def dataset_object_presets() -> list[dict[str, Any]]:
return list_object_presets()
@app.post("/api/dataset/generate")
async def dataset_generate(
count: int = Form(5),
@@ -484,15 +499,36 @@ async def dataset_generate(
objectScaleIsMax: bool = Form(False),
beamCount: int = Form(45),
lengthCount: int | None = Form(None),
model: UploadFile = File(...),
absentPct: float = Form(30.0),
nearlyHiddenPct: float = Form(20.0),
partialPct: float = Form(40.0),
visiblePct: float = Form(40.0),
modelPreset: str | None = Form(None),
model: UploadFile | None = File(None),
) -> StreamingResponse:
filename = (model.filename or "").strip()
if not filename.lower().endswith(".obj"):
raise HTTPException(status_code=400, detail="Upload a .obj 3D model file.")
preset = (modelPreset or "").strip().lower()
filename = ((model.filename if model else None) or "").strip()
object_kind: str | None = None
object_points: list[list[float]] | None = None
try:
raw = await model.read()
text = raw.decode("utf-8", errors="ignore")
object_points = load_object_points_from_obj_text(text)
if preset:
if preset not in OBJECT_PRESETS:
known = ", ".join(sorted(OBJECT_PRESETS)) or "(none)"
raise ValueError(f"Unknown object preset '{preset}'. Known: {known}")
object_kind = preset
filename = str(OBJECT_PRESETS[preset]["filename"])
if preset != "pipe":
object_points, filename = load_preset_object_points(preset)
elif model is not None and filename:
if not filename.lower().endswith(".obj"):
raise ValueError("Upload a .obj 3D model file.")
raw = await model.read()
text = raw.decode("utf-8", errors="ignore")
object_points = load_object_points_from_obj_text(text)
else:
raise ValueError(
"Выберите предустановку объекта или загрузите файл модели .obj."
)
except ValueError as exc:
raise HTTPException(status_code=400, detail=str(exc)) from exc
@@ -504,10 +540,15 @@ async def dataset_generate(
output_dir=outputDir or "sonar_dataset",
object_points=object_points,
object_name=filename,
object_kind=object_kind,
object_scale=objectScale,
object_scale_is_max=objectScaleIsMax,
beam_count=beamCount,
length_count=lengthCount,
absent_pct=absentPct,
nearly_hidden_pct=nearlyHiddenPct,
partial_pct=partialPct,
visible_pct=visiblePct,
):
yield json.dumps(event, ensure_ascii=False) + "\n"
except ValueError as exc:
@@ -802,6 +843,14 @@ def mle_spa() -> FileResponse:
@app.post("/api/mle/prepare")
def mle_prepare(body: MlePrepareBody) -> dict[str, Any]:
try:
corridor = {
"auvX": body.auvX,
"auvY": body.auvY,
"headingDeg": body.auvHeadingDeg,
"surveyLength": body.surveyLength,
"auvDepth": body.auvDepth,
"swathAngleDeg": body.swathAngleDeg,
}
result = prepare_mle_scene(
seed=body.seed,
size_x=body.sizeX,
@@ -810,6 +859,8 @@ def mle_prepare(body: MlePrepareBody) -> dict[str, Any]:
res_y=body.resY,
output_dir=body.outputDir or "mle_runs",
settings=body.settings,
relief_scale_pct=body.reliefScalePct,
corridor=corridor,
)
if body.settings:
try: