diff --git a/kobrax_moonraker_bridge.py b/kobrax_moonraker_bridge.py index 0599e3c..cc95204 100644 --- a/kobrax_moonraker_bridge.py +++ b/kobrax_moonraker_bridge.py @@ -2475,7 +2475,7 @@ class KobraXBridge: ams_box_mapping = self._build_auto_ams_box_mapping() use_ams = len(ams_box_mapping) > 0 - auto_leveling = getattr(self._args, "auto_leveling", 1) + auto_leveling = int(body.get("auto_leveling", getattr(self._args, "auto_leveling", 1))) filename = gcode_file["filename"] file_path = gcode_file["path"] @@ -2927,7 +2927,7 @@ class KobraXBridge: use_ams = len(loaded) > 0 ams_box_mapping = self._build_auto_ams_box_mapping(loaded_slots=loaded) log.debug(f"AMS-Slots: {len(loaded)} gemappt (genutzte Paints: {used_paint_indices}) → {[i for i, _ in loaded]}") - auto_leveling = getattr(self._args, "auto_leveling", 1) + auto_leveling = int(body.get("auto_leveling", getattr(self._args, "auto_leveling", 1))) payload = { "taskid": "-1", "url": url, @@ -3055,7 +3055,7 @@ class KobraXBridge: ams_box_mapping = self._build_auto_ams_box_mapping() use_ams = len(ams_box_mapping) > 0 - auto_leveling = getattr(self._args, "auto_leveling", 1) + auto_leveling = int(body.get("auto_leveling", getattr(self._args, "auto_leveling", 1))) url = self._state.get("last_upload_url", "") filesize = self._state.get("last_upload_size", 0) md5 = self._state.get("last_upload_md5", "") @@ -3746,6 +3746,7 @@ class KobraXBridge: "camera_url": s["camera_url"], "fan_speed": s["fan_speed"], "print_speed_mode": s["print_speed_mode"], + "auto_leveling": getattr(self._args, "auto_leveling", 1), "web_upload_warning": getattr(self._args, "web_upload_warning", 1), "light_on": s["light_on"], "light_brightness": s["light_brightness"], @@ -3940,6 +3941,7 @@ class KobraXBridge: cfg.remove_option("bridge", "printer_name") self._args.file_ready_dialog = file_ready_dialog + self._args.auto_leveling = int(data.get("auto_leveling", getattr(self._args, "auto_leveling", 1))) incoming_presets = data.get("ace_dry_presets") if isinstance(data, dict) else None presets = self._sanitize_ace_dry_presets(incoming_presets if isinstance(incoming_presets, dict) else self._ace_dry_presets) diff --git a/web/themes/default/app.js b/web/themes/default/app.js index 9bfedb3..5c67f15 100644 --- a/web/themes/default/app.js +++ b/web/themes/default/app.js @@ -3,6 +3,7 @@ var S={nozzle_temp:0,nozzle_target:0,bed_temp:0,bed_target:0, print_state:'standby',filename:'',progress:0,print_duration:0,remain_time:0, curr_layer:0,total_layers:0,z_mm:0,printer_name:'Kobra X',firmware_version:'–', camera_url:'',fan_speed:0,print_speed_mode:2,light_on:false,light_brightness:80, + auto_leveling:1, ams_slots:[],filament_mode:'toolhead',ace_units:[],ace_dry_presets:null,ace_drying:{status:0,target_temp:0,duration:0,remain_time:0,humidity:null,current_temp:null,units:[]},web_upload_warning:1}; var tempHistory={n:[],b:[]}; var camOn=false; @@ -10,6 +11,8 @@ var camUserStopped=false; // user stopped camera manually — suppress auto-rest var _camPollInterval=null; // snapshot-polling interval for Android (no MJPEG support) var currentStep=1; var currentPanel='dashboard'; +var _printOptionsAutoLeveling=1; +var _printOptionsAutoLevelingSnapshot=1; var aceAutoRefillPrefs=(function(){ try{return JSON.parse(localStorage.getItem('aceAutoRefillPrefs')||'{}')||{};}catch(_){return {};} })(); @@ -260,6 +263,8 @@ function applyLang(){ setText('apd-cancel',T.apd_cancel); setText('apd-confirm',T.apd_confirm); setText('fd-slots-hint',T.fd_slots_hint); + setText('skip-cancel',T.skip_cancel); + setText('skip-confirm',T.skip_confirm); setText('fd-cancel',T.fd_cancel); setText('fd-print',T.fd_print); setText('store-panel-title','🗂 '+T.panel_browser_title); @@ -338,6 +343,8 @@ function applyLang(){ setText('lbl-default-slot',T.settings_default_slot); setText('opt-slot-auto',T.settings_slot_auto); setText('lbl-auto-leveling',T.settings_auto_leveling); + setText('fd-options-title',T.fd_options_title); + setText('lbl-fd-auto-leveling',T.print_auto_leveling); setText('lbl-camera-on-print',T.settings_camera_on_print); setText('lbl-file-ready-mode',T.settings_file_ready_mode); setText('opt-file-ready-banner',T.settings_file_ready_banner); @@ -388,7 +395,22 @@ function applyLang(){ var mi=document.getElementById('slot-edit-mat');if(mi)mi.setAttribute('placeholder',T.slot_edit_custom); setText('logdir-all',T.log_dir_all); setText('loglvl-all',T.log_dir_all); + setText('logdir-rx',T.log_dir_rx); + setText('logdir-tx',T.log_dir_tx); + setText('loglvl-err',T.log_lvl_err); + setText('loglvl-warn',T.log_lvl_warn); + setText('log-lbl-dir',T.log_dir_label); setText('log-lbl-level',T.log_lvl_label); + setText('log-lbl-topic',T.log_topic_label); + setText('log-topic-ams',T.log_topic_ams); + setText('log-topic-print',T.log_topic_print); + setText('log-topic-info',T.log_topic_info); + setText('log-topic-status',T.log_topic_status); + setText('btn-log-dl',T.log_download); + setText('btn-autoscroll',T.log_auto); + setText('btn-log-clear',T.log_clear); + var lf=document.getElementById('log-filter');if(lf)lf.setAttribute('placeholder',T.log_filter_placeholder); + var sb=document.getElementById('settings-btn');if(sb)sb.setAttribute('title',T.settings_title); setText('file-ready-btn',T.file_ready_btn); setText('file-slots-btn',T.file_slots_btn); setText('file-cancel-btn',T.file_cancel_btn); @@ -930,6 +952,7 @@ function openSettings(){ document.getElementById('s-mode-id').value=d.mode_id||''; document.getElementById('s-default-slot').value=d.default_ams_slot||'auto'; document.getElementById('s-auto-leveling').checked=(d.auto_leveling===undefined?true:!!d.auto_leveling); + S.auto_leveling=(d.auto_leveling===undefined?1:(d.auto_leveling?1:0)); var cop=document.getElementById('s-camera-on-print');if(cop)cop.checked=!!d.camera_on_print; var frm=document.getElementById('s-file-ready-mode');if(frm)frm.value=Number(d.file_ready_dialog)?'dialog':'banner'; var wuw=document.getElementById('s-web-upload-warning');if(wuw)wuw.checked=(d.web_upload_warning===undefined?true:!!d.web_upload_warning); @@ -1312,6 +1335,7 @@ function saveSettings(){ S.web_upload_warning=webUploadWarning; var fileReadyDialog=(document.getElementById('s-file-ready-mode')||{}).value==='dialog'?1:0; S.file_ready_dialog=fileReadyDialog; + S.auto_leveling=(document.getElementById('s-auto-leveling')||{}).checked?1:0; post('/api/settings',{ printer_name: document.getElementById('s-printer-name').value, printer_ip: document.getElementById('s-printer-ip').value, @@ -1659,9 +1683,13 @@ function aceDryDialogIsCustomPreset(key){ } function aceDryDialogSyncCustomButtonNames(){ + ['pla','pla_plus','petg','tpu','abs_asa','pa_pc'].forEach(function(k){ + var b=document.querySelector('.ace-dry-preset-btn[data-preset="'+k+'"]'); + if(b)b.textContent=tr('ace_dry_preset_'+k); + }); ['custom_1','custom_2','custom_3'].forEach(function(k){ var b=document.querySelector('.ace-dry-preset-btn[data-preset="'+k+'"]'); - if(b)b.textContent=(ACE_DRY_PRESETS[k]&&ACE_DRY_PRESETS[k].name)||('Custom '+k.slice(-1)); + if(b)b.textContent=(ACE_DRY_PRESETS[k]&&ACE_DRY_PRESETS[k].name)||(tr('ace_dry_preset_custom')+' '+k.slice(-1)); }); } @@ -1725,7 +1753,7 @@ function aceDryDialogInputsChanged(){ var i=document.getElementById('ace-dry-dialog-custom-name'); if(b&&i){ var t=(i.value||'').trim(); - b.textContent=t||((ACE_DRY_PRESETS[_aceDryDialogPresetKey]&&ACE_DRY_PRESETS[_aceDryDialogPresetKey].name)||('Custom '+_aceDryDialogPresetKey.slice(-1))); + b.textContent=t||((ACE_DRY_PRESETS[_aceDryDialogPresetKey]&&ACE_DRY_PRESETS[_aceDryDialogPresetKey].name)||(tr('ace_dry_preset_custom')+' '+_aceDryDialogPresetKey.slice(-1))); } } aceDryDialogUpdateSaveButton(); @@ -2215,6 +2243,8 @@ function openFilamentDialog(slots){ } }).catch(function(){}); } + _printOptionsAutoLeveling=(S.auto_leveling===undefined?1:(S.auto_leveling?1:0)); + syncPrintOptionsDialog(); // GCode-Kanäle: bevorzugt aus _gcodeFilaments, sonst aus belegten AMS-Slots ableiten var channels=_gcodeFilaments.length?_gcodeFilaments:_amsSlots.map(function(s,i){ @@ -2306,10 +2336,36 @@ function closeFilamentDialog(){ if(dlg)dlg.classList.remove('open'); } +function syncPrintOptionsDialog(){ + var autoLeveling=document.getElementById('fd-auto-leveling'); + if(autoLeveling)autoLeveling.checked=!!_printOptionsAutoLeveling; +} + +function openPrintOptionsDialog(){ + _printOptionsAutoLevelingSnapshot=_printOptionsAutoLeveling; + syncPrintOptionsDialog(); + var autoLeveling=document.getElementById('fd-auto-leveling'); + if(autoLeveling)autoLeveling.focus(); +} + +function closePrintOptionsDialog(restore){ + if(restore){ + _printOptionsAutoLeveling=_printOptionsAutoLevelingSnapshot; + syncPrintOptionsDialog(); + } +} + +function confirmPrintOptionsDialog(){ + _printOptionsAutoLeveling=(document.getElementById('fd-auto-leveling')||{}).checked?1:0; + _printOptionsAutoLevelingSnapshot=_printOptionsAutoLeveling; + closePrintOptionsDialog(false); +} + function confirmFilamentPrint(){ var selects=document.querySelectorAll('#fd-slots select'); var assignments=[]; var missingCompatible=0; + var autoLeveling=_printOptionsAutoLeveling; selects.forEach(function(sel){ var paintIdx=parseInt(sel.dataset.paint); var paintColor=sel.dataset.paintColor; @@ -2348,7 +2404,7 @@ function confirmFilamentPrint(){ // Banner-Modus: normaler print/start mit Slot-Override var btn=document.getElementById('file-ready-btn'); if(btn){btn.disabled=true;btn.textContent='…';} - post('/printer/print/start',{filename:S.file_ready,filament_assignments:assignments,excluded_objects:excludedObjects}) + post('/printer/print/start',{filename:S.file_ready,filament_assignments:assignments,excluded_objects:excludedObjects,auto_leveling:autoLeveling}) .then(function(r){return r.json();}) .then(function(){ document.getElementById('file-ready-banner').style.display='none'; @@ -2363,7 +2419,7 @@ function confirmFilamentPrint(){ fetch(_apiUrl('/kx/print'),{ method:'POST', headers:{'Content-Type':'application/json'}, - body:JSON.stringify({file_id:_storeFileId,filament_assignments:assignments,excluded_objects:excludedObjects}) + body:JSON.stringify({file_id:_storeFileId,filament_assignments:assignments,excluded_objects:excludedObjects,auto_leveling:autoLeveling}) }).then(function(r){return r.json()}).then(function(d){ if(d.result==='ok'){clog('Druckstart: '+_storeFilename,'msg-ok');showPanel('dashboard');} else{clog('Druckfehler: '+(d.error||'?'),'msg-err');} diff --git a/web/themes/default/index.html b/web/themes/default/index.html index 4679cff..154e53e 100644 --- a/web/themes/default/index.html +++ b/web/themes/default/index.html @@ -42,7 +42,7 @@ - + @@ -501,32 +501,32 @@