fix: viewer 3MF Bambu/generic, auto-liaison gcode.3mf->3mf, import gcode.3mf NC picker
Deploy via Portainer / deploy (push) Successful in 0s
Deploy via Portainer / deploy (push) Successful in 0s
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user