Сохраняемся
This commit is contained in:
+60
-9
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user