Spaces:
Running
on
Zero
Running
on
Zero
Commit
·
9d4ae64
1
Parent(s):
c417fc7
added load json button
Browse files
app.py
CHANGED
@@ -1,3 +1,4 @@
|
|
|
|
1 |
import string
|
2 |
import uuid
|
3 |
import os
|
@@ -360,6 +361,52 @@ def create_empty_error_outputs(log_message=""):
|
|
360 |
gr.update(visible=False, interactive=False), # ### ZIP: download_zip
|
361 |
)
|
362 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
363 |
|
364 |
# --- Gradio UI Definition ---
|
365 |
with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
@@ -381,12 +428,15 @@ with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
|
381 |
)
|
382 |
gr.Markdown(
|
383 |
'Hint: If you have an AMS 3d printer try giving it your entire filament library and then set "pruning_max_colors" under "Autoforge Parameters" in the second tab to your number of AMS slots.'
|
384 |
-
'Autoforge will automatically select the best matching colors for your image.'
|
385 |
)
|
386 |
with gr.Row():
|
387 |
load_csv_button = gr.UploadButton(
|
388 |
"Load Filaments CSV", file_types=[".csv"]
|
389 |
)
|
|
|
|
|
|
|
390 |
save_csv_button = gr.Button("Save Current Filaments to CSV")
|
391 |
filament_table = gr.DataFrame(
|
392 |
value=ensure_required_cols(
|
@@ -570,6 +620,11 @@ with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
|
570 |
inputs=[load_csv_button],
|
571 |
outputs=[filament_table],
|
572 |
)
|
|
|
|
|
|
|
|
|
|
|
573 |
save_csv_button.click(
|
574 |
save_filaments_to_file_for_download,
|
575 |
inputs=[filament_df_state],
|
|
|
1 |
+
import json
|
2 |
import string
|
3 |
import uuid
|
4 |
import os
|
|
|
361 |
gr.update(visible=False, interactive=False), # ### ZIP: download_zip
|
362 |
)
|
363 |
|
364 |
+
def load_filaments_from_json_upload(file_obj):
|
365 |
+
"""
|
366 |
+
Called when the user picks a .json file.
|
367 |
+
Accepts both the plain Hueforge export and the wrapped
|
368 |
+
{"Filaments": [...]} variant.
|
369 |
+
"""
|
370 |
+
# Fall back to whatever is already in the state when nothing selected
|
371 |
+
if file_obj is None:
|
372 |
+
current_script_df = filament_df_state.value
|
373 |
+
if current_script_df is not None and not current_script_df.empty:
|
374 |
+
return current_script_df.rename(
|
375 |
+
columns={" Name": "Name", " TD": "TD", " Color": "Color (Hex)"}
|
376 |
+
)
|
377 |
+
return initial_df.copy().rename(
|
378 |
+
columns={" Name": "Name", " TD": "TD", " Color": "Color (Hex)"}
|
379 |
+
)
|
380 |
+
|
381 |
+
try:
|
382 |
+
with open(file_obj.name, "r", encoding="utf-8") as f:
|
383 |
+
data = json.load(f)
|
384 |
+
|
385 |
+
# Hueforge sometimes nests the list under the “Filaments” key
|
386 |
+
if isinstance(data, dict) and "Filaments" in data:
|
387 |
+
data = data["Filaments"]
|
388 |
+
|
389 |
+
df_loaded = pd.DataFrame(data)
|
390 |
+
df_loaded = ensure_required_cols(df_loaded, in_display_space=False)
|
391 |
+
|
392 |
+
expected_cols = ["Brand", " Name", " TD", " Color"]
|
393 |
+
if not all(col in df_loaded.columns for col in expected_cols):
|
394 |
+
gr.Error(
|
395 |
+
f"JSON must contain keys/columns: {', '.join(expected_cols)}. "
|
396 |
+
f"Found: {df_loaded.columns.tolist()}"
|
397 |
+
)
|
398 |
+
return filament_table.value # keep the table unchanged
|
399 |
+
|
400 |
+
filament_df_state.value = df_loaded.copy()
|
401 |
+
|
402 |
+
return df_loaded.rename(
|
403 |
+
columns={" Name": "Name", " TD": "TD", " Color": "Color (Hex)"}
|
404 |
+
)
|
405 |
+
|
406 |
+
except Exception as e:
|
407 |
+
gr.Error(f"Error loading JSON: {e}")
|
408 |
+
return filament_table.value # keep current table on failure
|
409 |
+
|
410 |
|
411 |
# --- Gradio UI Definition ---
|
412 |
with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
|
|
428 |
)
|
429 |
gr.Markdown(
|
430 |
'Hint: If you have an AMS 3d printer try giving it your entire filament library and then set "pruning_max_colors" under "Autoforge Parameters" in the second tab to your number of AMS slots.'
|
431 |
+
' Autoforge will automatically select the best matching colors for your image.'
|
432 |
)
|
433 |
with gr.Row():
|
434 |
load_csv_button = gr.UploadButton(
|
435 |
"Load Filaments CSV", file_types=[".csv"]
|
436 |
)
|
437 |
+
load_json_button = gr.UploadButton( # NEW
|
438 |
+
"Load Filaments JSON", file_types=[".json"]
|
439 |
+
)
|
440 |
save_csv_button = gr.Button("Save Current Filaments to CSV")
|
441 |
filament_table = gr.DataFrame(
|
442 |
value=ensure_required_cols(
|
|
|
620 |
inputs=[load_csv_button],
|
621 |
outputs=[filament_table],
|
622 |
)
|
623 |
+
load_json_button.upload(
|
624 |
+
load_filaments_from_json_upload,
|
625 |
+
inputs=[load_json_button],
|
626 |
+
outputs=[filament_table],
|
627 |
+
)
|
628 |
save_csv_button.click(
|
629 |
save_filaments_to_file_for_download,
|
630 |
inputs=[filament_df_state],
|