fix: viewer 3MF Bambu/generic, auto-liaison gcode.3mf->3mf, import gcode.3mf NC picker
Deploy via Portainer / deploy (push) Successful in 0s

This commit is contained in:
Jo
2026-07-07 09:44:32 +02:00
parent b6fc0565ee
commit d160686e0c
3 changed files with 178 additions and 29 deletions
+22 -3
View File
@@ -286,8 +286,9 @@ def parse_3mf(file_stream):
Retourne un dict avec :
- plates : liste de plaques [{index, weight_g, print_time_s, filaments:[{type,color,used_g}]}]
- fallback : {weight_g, hours, minutes} si slice_info absent
- warning : message si le fichier n'a pas été slicé
"""
result = {'plates': [], 'weight_g': None, 'hours': None, 'minutes': None}
result = {'plates': [], 'weight_g': None, 'hours': None, 'minutes': None, 'warning': None}
try:
with zipfile.ZipFile(file_stream) as z:
names = z.namelist()
@@ -368,6 +369,14 @@ def parse_3mf(file_stream):
pass
except Exception:
pass
# Si aucune donnée trouvée, ajouter un avertissement
if not result['plates'] and result['weight_g'] is None:
result['warning'] = (
"Aucune donnée de découpe dans ce fichier. "
"Dans Bambu Studio : slicez vos plateaux puis utilisez "
"Fichier → Exporter → Exporter le fichier découpé (pas Sauvegarder le projet). "
"Le fichier exporté contiendra poids, temps et consommation filament."
)
return result
def calc(weight_g, print_time_s, design_mult, gross_margin_pct, discount_pct,
@@ -1556,7 +1565,10 @@ def api_parse_3mf():
if not f.filename.lower().endswith('.3mf'):
return jsonify({'error': 'Format .3mf requis'}), 400
result = parse_3mf(f.stream)
result['filename'] = os.path.splitext(f.filename)[0]
# Nettoyer .gcode.3mf ou .3mf du nom
clean = re.sub(r'\.gcode\.3mf$', '', f.filename, flags=re.IGNORECASE)
clean = re.sub(r'\.3mf$', '', clean, flags=re.IGNORECASE)
result['filename'] = clean
# Si une seule plaque, pré-sélectionner automatiquement
if result['plates'] and len(result['plates']) == 1:
p = result['plates'][0]
@@ -1833,7 +1845,14 @@ def _parse_propfind(xml_bytes, base_url, username, current_path):
name = rel.split('/')[-1] or rel
# Filtrer : dossiers ou extensions 3D
ext = name.rsplit('.', 1)[-1].lower() if '.' in name else ''
# Gérer .gcode.3mf avant le split simple
name_lower = name.lower()
if name_lower.endswith('.gcode.3mf'):
ext = '3mf'
elif '.' in name:
ext = name.rsplit('.', 1)[-1].lower()
else:
ext = ''
if not is_dir and ext not in ('3mf', 'stl', 'step', 'stp', 'obj', 'gcode'):
continue