feat: AMS filament drying control (#14637)
## What this does Ports the AMS filament drying control feature from BambuStudio. Most work was done by Claude Code with deepseek-v4-pro. Thanks Bambu & CC & DeepSeek :P Allows users to start, monitor, and stop AMS-based filament drying directly from the OrcaSlicer UI for N3F (AMS 2 Pro) and N3S (AMS HT) AMS units. Mostly from https://github.com/bambulab/BambuStudio/commit/c8f70c6ca76e53775aa021a197fe9ec972db709e Part of #12091 ## Screenshots <img width="500" alt="image" src="https://github.com/user-attachments/assets/24f579cb-c67c-4d6e-bf77-c31e018f2f70" /> <img width="500" alt="image" src="https://github.com/user-attachments/assets/74f628aa-6f5f-4150-b2e9-082e4ffc3527" /> <img width="500" alt="image" src="https://github.com/user-attachments/assets/d2f26412-a054-4085-9236-5074a030b001" /> <img width="500" alt="image" src="https://github.com/user-attachments/assets/7beef770-8fbc-4375-b244-e0de44b8db2f" /> ## Changes - **Data model:** Added drying status enums (`DryStatus`, `DrySubStatus`, `CannotDryReason`, etc.), `DrySettings` struct, `DevFilamentDryingPreset` struct to `DevAms`/`DevFilaSystem` - **Promoted `DevAmsType`** to a global enum (`EXT_SPOOL=0, AMS=1, AMS_LITE=2, N3F=3, N3S=4`), renamed `DUMMY` → `EXT_SPOOL` - **JSON parsing:** Extended `DevFilaSystemParser` to parse drying status fields from printer status messages - **Commands:** Added `CtrlAmsStartDryingHour()` and `CtrlAmsStopDrying()` sending `"ams_filament_drying"` JSON via MQTT - **Backend utility:** New `DevUtilBackend` class with `GetFilamentDryingPreset()` for reading filament drying config keys - **UI dialog:** New `AMSDryControl` dialog with three pages (status/control, guide, progress) matching BambuStudio behavior - **Integration:** Wired AMS humidity indicator click to open the drying dialog for N3F/N3S AMS types - **Assets:** 12 new drying-related images from BambuStudio - **Firmware parsing:** Added `is_support_remote_dry` flag parsed from `fun2` bit 5 ## Constraints - N3F/N3S only — standard AMS and AMS Lite continue to use the existing humidity popup - Backward compatible — existing `command_ams_drying_stop()` preserved <!-- > A guide for users on how to download the artifacts from this PR. --> [How to Download Pull Requests Artifacts for Testing](https://www.orcaslicer.com/wiki/how_to_download_pr_artifacts)
@@ -287,4 +287,6 @@ src/slic3r/GUI/DownloaderFileGet.cpp
|
||||
src/slic3r/GUI/FileArchiveDialog.cpp
|
||||
src/slic3r/GUI/PrinterCloudAuthDialog.cpp
|
||||
src/slic3r/GUI/PrinterWebViewHandler.cpp
|
||||
src/slic3r/GUI/AMSDryControl.cpp
|
||||
src/slic3r/GUI/AMSDryControl.hpp
|
||||
src/libslic3r/PresetBundle.cpp
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<circle cx="12" cy="12" r="9.35422" fill="#E14747" stroke="#E14747" stroke-width="1.29157"/>
|
||||
<rect x="11" y="6" width="2" height="9" rx="1" fill="white"/>
|
||||
<rect x="11" y="16" width="2" height="2" rx="1" fill="white"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 321 B |
@@ -0,0 +1,4 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M1.80005 12.3C1.80005 6.83238 6.23243 2.4 11.7 2.4C17.1677 2.4 21.6 6.83238 21.6 12.3C21.6 17.7676 17.1677 22.2 11.7 22.2C6.23243 22.2 1.80005 17.7676 1.80005 12.3Z" fill="#009688"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M17.7742 8.66235C18.0746 8.9415 18.0918 9.41131 17.8126 9.7117L12.2128 15.7376C11.5275 16.4751 10.36 16.4751 9.67461 15.7376L6.82482 12.6709C6.54567 12.3706 6.56289 11.9007 6.86328 11.6216C7.16367 11.3424 7.63348 11.3597 7.91263 11.66L10.7624 14.7267C10.8603 14.832 11.0271 14.832 11.125 14.7267L16.7248 8.70081C17.004 8.40042 17.4738 8.3832 17.7742 8.66235Z" fill="white"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 759 B |
|
After Width: | Height: | Size: 103 KiB |
@@ -0,0 +1,3 @@
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M8.3125 0.7125V2.6125C8.3125 3.00734 7.99484 3.325 7.6 3.325C7.20516 3.325 6.8875 3.00734 6.8875 2.6125V0.7125C6.8875 0.317656 7.20516 0 7.6 0C7.99484 0 8.3125 0.317656 8.3125 0.7125ZM12.9734 3.23297L11.6286 4.57781C11.3495 4.85687 10.8983 4.85687 10.6222 4.57781C10.3461 4.29875 10.3431 3.8475 10.6222 3.57141L11.967 2.22656C12.2461 1.9475 12.6973 1.9475 12.9734 2.22656C13.2495 2.50562 13.2525 2.95688 12.9734 3.23297ZM3.23297 2.22656L4.57781 3.57141C4.85687 3.85047 4.85687 4.30172 4.57781 4.57781C4.29875 4.85391 3.8475 4.85687 3.57141 4.57781L2.22656 3.23297C1.9475 2.95391 1.9475 2.50266 2.22656 2.22656C2.50562 1.95047 2.95688 1.9475 3.23297 2.22656ZM0.7125 6.8875H2.6125C3.00734 6.8875 3.325 7.20516 3.325 7.6C3.325 7.99484 3.00734 8.3125 2.6125 8.3125H0.7125C0.317656 8.3125 0 7.99484 0 7.6C0 7.20516 0.317656 6.8875 0.7125 6.8875ZM12.5875 6.8875H14.4875C14.8823 6.8875 15.2 7.20516 15.2 7.6C15.2 7.99484 14.8823 8.3125 14.4875 8.3125H12.5875C12.1927 8.3125 11.875 7.99484 11.875 7.6C11.875 7.20516 12.1927 6.8875 12.5875 6.8875ZM4.57781 11.6316L3.23297 12.9734C2.95391 13.2525 2.50266 13.2525 2.22656 12.9734C1.95047 12.6944 1.9475 12.2431 2.22656 11.967L3.57141 10.6222C3.85047 10.3431 4.30172 10.3431 4.57781 10.6222C4.85391 10.9012 4.85687 11.3525 4.57781 11.6286V11.6316ZM11.6316 10.6252L12.9734 11.967C13.2525 12.2461 13.2525 12.6973 12.9734 12.9734C12.6944 13.2495 12.2431 13.2525 11.967 12.9734L10.6222 11.6286C10.3431 11.3495 10.3431 10.8983 10.6222 10.6222C10.9012 10.3461 11.3525 10.3431 11.6286 10.6222L11.6316 10.6252ZM8.3125 12.5875V14.4875C8.3125 14.8823 7.99484 15.2 7.6 15.2C7.20516 15.2 6.8875 14.8823 6.8875 14.4875V12.5875C6.8875 12.1927 7.20516 11.875 7.6 11.875C7.99484 11.875 8.3125 12.1927 8.3125 12.5875ZM9.5 7.6C9.5 7.09609 9.29982 6.61282 8.9435 6.2565C8.58718 5.90018 8.10391 5.7 7.6 5.7C7.09609 5.7 6.61282 5.90018 6.2565 6.2565C5.90018 6.61282 5.7 7.09609 5.7 7.6C5.7 8.10391 5.90018 8.58718 6.2565 8.9435C6.61282 9.29982 7.09609 9.5 7.6 9.5C8.10391 9.5 8.58718 9.29982 8.9435 8.9435C9.29982 8.58718 9.5 8.10391 9.5 7.6ZM4.275 7.6C4.275 6.71815 4.62531 5.87243 5.24887 5.24887C5.87243 4.62531 6.71815 4.275 7.6 4.275C8.48184 4.275 9.32757 4.62531 9.95113 5.24887C10.5747 5.87243 10.925 6.71815 10.925 7.6C10.925 8.48184 10.5747 9.32757 9.95113 9.95113C9.32757 10.5747 8.48184 10.925 7.6 10.925C6.71815 10.925 5.87243 10.5747 5.24887 9.95113C4.62531 9.32757 4.275 8.48184 4.275 7.6Z" fill="#F09A17"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 7.1 KiB |
|
After Width: | Height: | Size: 11 KiB |
@@ -42,8 +42,8 @@
|
||||
"filament_z_hop_types": [
|
||||
"Normal Lift"
|
||||
],
|
||||
"filament_scarf_seam_type": [
|
||||
"none"
|
||||
"filament_dev_drying_cooling_temperature": [
|
||||
"70"
|
||||
],
|
||||
"impact_strength_z": [
|
||||
"3.4"
|
||||
|
||||
@@ -32,6 +32,9 @@
|
||||
"filament_vendor": [
|
||||
"Bambu Lab"
|
||||
],
|
||||
"filament_dev_drying_cooling_temperature": [
|
||||
"95"
|
||||
],
|
||||
"hot_plate_temp": [
|
||||
"100"
|
||||
],
|
||||
|
||||
@@ -33,6 +33,9 @@
|
||||
"full_fan_speed_layer": [
|
||||
"2"
|
||||
],
|
||||
"filament_dev_chamber_drying_time": [
|
||||
"16"
|
||||
],
|
||||
"impact_strength_z": [
|
||||
"13.3"
|
||||
],
|
||||
|
||||
@@ -45,6 +45,27 @@
|
||||
"filament_adhesiveness_category": [
|
||||
"800"
|
||||
],
|
||||
"filament_dev_chamber_drying_bed_temperature": [
|
||||
"90"
|
||||
],
|
||||
"filament_dev_ams_drying_ams_limitations": [
|
||||
"1"
|
||||
],
|
||||
"filament_dev_ams_drying_heat_distortion_temperature": [
|
||||
"165"
|
||||
],
|
||||
"filament_dev_drying_cooling_temperature": [
|
||||
"150"
|
||||
],
|
||||
"filament_dev_ams_drying_temperature": [
|
||||
"65",
|
||||
"80",
|
||||
"65",
|
||||
"80"
|
||||
],
|
||||
"filament_dev_drying_softening_temperature": [
|
||||
"150"
|
||||
],
|
||||
"hot_plate_temp": [
|
||||
"100"
|
||||
],
|
||||
|
||||
@@ -24,6 +24,24 @@
|
||||
"filament_adhesiveness_category": [
|
||||
"703"
|
||||
],
|
||||
"filament_dev_chamber_drying_time": [
|
||||
"16"
|
||||
],
|
||||
"filament_dev_ams_drying_heat_distortion_temperature": [
|
||||
"90"
|
||||
],
|
||||
"filament_dev_drying_cooling_temperature": [
|
||||
"75"
|
||||
],
|
||||
"filament_dev_ams_drying_temperature": [
|
||||
"65",
|
||||
"80",
|
||||
"65",
|
||||
"80"
|
||||
],
|
||||
"filament_dev_drying_softening_temperature": [
|
||||
"85"
|
||||
],
|
||||
"nozzle_temperature": [
|
||||
"280"
|
||||
],
|
||||
|
||||
@@ -24,11 +24,20 @@
|
||||
"filament_vendor": [
|
||||
"Bambu Lab"
|
||||
],
|
||||
"filament_scarf_seam_type": [
|
||||
"none"
|
||||
],
|
||||
"filament_adhesiveness_category": [
|
||||
"702"
|
||||
],
|
||||
"filament_dev_ams_drying_temperature": [
|
||||
"60",
|
||||
"60",
|
||||
"50",
|
||||
"50"
|
||||
],
|
||||
"filament_dev_ams_drying_heat_distortion_temperature": [
|
||||
"50"
|
||||
],
|
||||
"filament_dev_drying_softening_temperature": [
|
||||
"55"
|
||||
],
|
||||
"slow_down_layer_time": [
|
||||
"8"
|
||||
|
||||
@@ -27,14 +27,26 @@
|
||||
"filament_max_volumetric_speed": [
|
||||
"6"
|
||||
],
|
||||
"filament_scarf_seam_type": [
|
||||
"none"
|
||||
],
|
||||
"filament_vendor": [
|
||||
"Bambu Lab"
|
||||
],
|
||||
"filament_adhesiveness_category": [
|
||||
"705"
|
||||
],
|
||||
"filament_dev_chamber_drying_bed_temperature": [
|
||||
"80"
|
||||
],
|
||||
"filament_dev_ams_drying_temperature": [
|
||||
"60",
|
||||
"60",
|
||||
"50",
|
||||
"50"
|
||||
],
|
||||
"filament_dev_ams_drying_heat_distortion_temperature": [
|
||||
"50"
|
||||
],
|
||||
"filament_dev_drying_softening_temperature": [
|
||||
"55"
|
||||
],
|
||||
"hot_plate_temp": [
|
||||
"60"
|
||||
|
||||
@@ -21,11 +21,26 @@
|
||||
"filament_vendor": [
|
||||
"Bambu Lab"
|
||||
],
|
||||
"filament_scarf_seam_type": [
|
||||
"none"
|
||||
],
|
||||
"filament_adhesiveness_category": [
|
||||
"701"
|
||||
],
|
||||
"filament_dev_chamber_drying_time": [
|
||||
"16"
|
||||
],
|
||||
"filament_dev_ams_drying_heat_distortion_temperature": [
|
||||
"90"
|
||||
],
|
||||
"filament_dev_drying_cooling_temperature": [
|
||||
"75"
|
||||
],
|
||||
"filament_dev_ams_drying_temperature": [
|
||||
"65",
|
||||
"80",
|
||||
"65",
|
||||
"80"
|
||||
],
|
||||
"filament_dev_drying_softening_temperature": [
|
||||
"85"
|
||||
],
|
||||
"nozzle_temperature": [
|
||||
"280"
|
||||
|
||||
@@ -27,11 +27,14 @@
|
||||
"filament_vendor": [
|
||||
"Bambu Lab"
|
||||
],
|
||||
"filament_scarf_seam_type": [
|
||||
"none"
|
||||
],
|
||||
"filament_adhesiveness_category": [
|
||||
"706"
|
||||
],
|
||||
"filament_dev_ams_drying_time": [
|
||||
"12",
|
||||
"4",
|
||||
"12",
|
||||
"4"
|
||||
],
|
||||
"nozzle_temperature_range_high": [
|
||||
"270"
|
||||
|
||||
@@ -21,6 +21,21 @@
|
||||
"filament_max_volumetric_speed": [
|
||||
"12"
|
||||
],
|
||||
"filament_dev_ams_drying_temperature": [
|
||||
"65",
|
||||
"80",
|
||||
"65",
|
||||
"80"
|
||||
],
|
||||
"filament_dev_ams_drying_heat_distortion_temperature": [
|
||||
"90"
|
||||
],
|
||||
"filament_dev_drying_cooling_temperature": [
|
||||
"65"
|
||||
],
|
||||
"filament_dev_drying_softening_temperature": [
|
||||
"85"
|
||||
],
|
||||
"nozzle_temperature": [
|
||||
"260"
|
||||
],
|
||||
|
||||
@@ -38,6 +38,34 @@
|
||||
"filament_max_volumetric_speed": [
|
||||
"6"
|
||||
],
|
||||
"filament_dev_chamber_drying_bed_temperature": [
|
||||
"80"
|
||||
],
|
||||
"filament_dev_ams_drying_time": [
|
||||
"12",
|
||||
"12",
|
||||
"12",
|
||||
"12"
|
||||
],
|
||||
"filament_dev_ams_drying_ams_limitations": [
|
||||
"1",
|
||||
"0"
|
||||
],
|
||||
"filament_dev_ams_drying_heat_distortion_temperature": [
|
||||
"75"
|
||||
],
|
||||
"filament_dev_drying_cooling_temperature": [
|
||||
"55"
|
||||
],
|
||||
"filament_dev_ams_drying_temperature": [
|
||||
"65",
|
||||
"65",
|
||||
"55",
|
||||
"55"
|
||||
],
|
||||
"filament_dev_drying_softening_temperature": [
|
||||
"60"
|
||||
],
|
||||
"hot_plate_temp": [
|
||||
"70"
|
||||
],
|
||||
|
||||
@@ -4,5 +4,26 @@
|
||||
"inherits": "fdm_filament_pps",
|
||||
"from": "system",
|
||||
"filament_id": "GFT97",
|
||||
"instantiation": "false"
|
||||
"instantiation": "false",
|
||||
"filament_dev_chamber_drying_bed_temperature": [
|
||||
"90"
|
||||
],
|
||||
"filament_dev_ams_drying_ams_limitations": [
|
||||
"1"
|
||||
],
|
||||
"filament_dev_ams_drying_heat_distortion_temperature": [
|
||||
"90"
|
||||
],
|
||||
"filament_dev_drying_cooling_temperature": [
|
||||
"80"
|
||||
],
|
||||
"filament_dev_ams_drying_temperature": [
|
||||
"65",
|
||||
"80",
|
||||
"65",
|
||||
"80"
|
||||
],
|
||||
"filament_dev_drying_softening_temperature": [
|
||||
"85"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -41,6 +41,30 @@
|
||||
"filament_vendor": [
|
||||
"Polymaker"
|
||||
],
|
||||
"filament_adhesiveness_category": [
|
||||
"800"
|
||||
],
|
||||
"filament_dev_chamber_drying_bed_temperature": [
|
||||
"90"
|
||||
],
|
||||
"filament_dev_ams_drying_ams_limitations": [
|
||||
"1"
|
||||
],
|
||||
"filament_dev_ams_drying_heat_distortion_temperature": [
|
||||
"165"
|
||||
],
|
||||
"filament_dev_drying_cooling_temperature": [
|
||||
"150"
|
||||
],
|
||||
"filament_dev_ams_drying_temperature": [
|
||||
"65",
|
||||
"80",
|
||||
"65",
|
||||
"80"
|
||||
],
|
||||
"filament_dev_drying_softening_temperature": [
|
||||
"150"
|
||||
],
|
||||
"hot_plate_temp": [
|
||||
"70"
|
||||
],
|
||||
@@ -83,9 +107,6 @@
|
||||
"textured_plate_temp_initial_layer": [
|
||||
"70"
|
||||
],
|
||||
"filament_adhesiveness_category": [
|
||||
"800"
|
||||
],
|
||||
"filament_start_gcode": [
|
||||
"; filament start gcode\n{if (bed_temperature[current_extruder] >80)||(bed_temperature_initial_layer[current_extruder] >80)}M106 P3 S255\n{elsif (bed_temperature[current_extruder] >60)||(bed_temperature_initial_layer[current_extruder] >60)}M106 P3 S180\n{endif}\n\n{if activate_air_filtration[current_extruder] && support_air_filtration}\nM106 P3 S{during_print_exhaust_fan_speed_num[current_extruder]} \n{endif}"
|
||||
]
|
||||
|
||||
@@ -43,6 +43,27 @@
|
||||
"filament_adhesiveness_category": [
|
||||
"200"
|
||||
],
|
||||
"filament_dev_ams_drying_time": [
|
||||
"12",
|
||||
"8.0",
|
||||
"12",
|
||||
"8.0"
|
||||
],
|
||||
"filament_dev_ams_drying_heat_distortion_temperature": [
|
||||
"90"
|
||||
],
|
||||
"filament_dev_drying_cooling_temperature": [
|
||||
"75"
|
||||
],
|
||||
"filament_dev_ams_drying_temperature": [
|
||||
"65",
|
||||
"80",
|
||||
"65",
|
||||
"75"
|
||||
],
|
||||
"filament_dev_drying_softening_temperature": [
|
||||
"80"
|
||||
],
|
||||
"hot_plate_temp": [
|
||||
"90"
|
||||
],
|
||||
|
||||
@@ -43,6 +43,27 @@
|
||||
"filament_adhesiveness_category": [
|
||||
"200"
|
||||
],
|
||||
"filament_dev_ams_drying_time": [
|
||||
"12",
|
||||
"8.0",
|
||||
"12",
|
||||
"8.0"
|
||||
],
|
||||
"filament_dev_ams_drying_heat_distortion_temperature": [
|
||||
"100"
|
||||
],
|
||||
"filament_dev_drying_cooling_temperature": [
|
||||
"85"
|
||||
],
|
||||
"filament_dev_ams_drying_temperature": [
|
||||
"65",
|
||||
"80",
|
||||
"65",
|
||||
"80"
|
||||
],
|
||||
"filament_dev_drying_softening_temperature": [
|
||||
"85"
|
||||
],
|
||||
"hot_plate_temp": [
|
||||
"90"
|
||||
],
|
||||
|
||||
@@ -43,6 +43,34 @@
|
||||
"filament_type": [
|
||||
"BVOH"
|
||||
],
|
||||
"filament_dev_chamber_drying_bed_temperature": [
|
||||
"80"
|
||||
],
|
||||
"filament_dev_ams_drying_time": [
|
||||
"12",
|
||||
"12",
|
||||
"12",
|
||||
"12"
|
||||
],
|
||||
"filament_dev_ams_drying_ams_limitations": [
|
||||
"1",
|
||||
"0"
|
||||
],
|
||||
"filament_dev_ams_drying_heat_distortion_temperature": [
|
||||
"65"
|
||||
],
|
||||
"filament_dev_drying_cooling_temperature": [
|
||||
"40"
|
||||
],
|
||||
"filament_dev_ams_drying_temperature": [
|
||||
"60",
|
||||
"60",
|
||||
"45",
|
||||
"45"
|
||||
],
|
||||
"filament_dev_drying_softening_temperature": [
|
||||
"50"
|
||||
],
|
||||
"hot_plate_temp": [
|
||||
"55"
|
||||
],
|
||||
|
||||
@@ -7,6 +7,34 @@
|
||||
"filament_type": [
|
||||
"EVA"
|
||||
],
|
||||
"filament_dev_chamber_drying_bed_temperature": [
|
||||
"70"
|
||||
],
|
||||
"filament_dev_ams_drying_time": [
|
||||
"12",
|
||||
"12",
|
||||
"12",
|
||||
"12"
|
||||
],
|
||||
"filament_dev_ams_drying_ams_limitations": [
|
||||
"1",
|
||||
"0"
|
||||
],
|
||||
"filament_dev_ams_drying_heat_distortion_temperature": [
|
||||
"45"
|
||||
],
|
||||
"filament_dev_drying_cooling_temperature": [
|
||||
"40"
|
||||
],
|
||||
"filament_dev_ams_drying_temperature": [
|
||||
"45",
|
||||
"45",
|
||||
"45",
|
||||
"45"
|
||||
],
|
||||
"filament_dev_drying_softening_temperature": [
|
||||
"50"
|
||||
],
|
||||
"supertack_plate_temp": [
|
||||
"0"
|
||||
],
|
||||
|
||||
@@ -4,9 +4,6 @@
|
||||
"inherits": "fdm_filament_common",
|
||||
"from": "system",
|
||||
"instantiation": "false",
|
||||
"additional_cooling_fan_speed": [
|
||||
"0"
|
||||
],
|
||||
"cool_plate_temp": [
|
||||
"0"
|
||||
],
|
||||
@@ -42,6 +39,27 @@
|
||||
],
|
||||
"filament_adhesiveness_category": [
|
||||
"798"
|
||||
],
|
||||
"filament_dev_ams_drying_time": [
|
||||
"12",
|
||||
"12",
|
||||
"12",
|
||||
"12"
|
||||
],
|
||||
"filament_dev_ams_drying_heat_distortion_temperature": [
|
||||
"90"
|
||||
],
|
||||
"filament_dev_drying_cooling_temperature": [
|
||||
"75"
|
||||
],
|
||||
"filament_dev_ams_drying_temperature": [
|
||||
"65",
|
||||
"80",
|
||||
"65",
|
||||
"75"
|
||||
],
|
||||
"filament_dev_drying_softening_temperature": [
|
||||
"80"
|
||||
],
|
||||
"hot_plate_temp": [
|
||||
"90"
|
||||
|
||||
@@ -43,6 +43,30 @@
|
||||
"filament_adhesiveness_category": [
|
||||
"400"
|
||||
],
|
||||
"filament_dev_ams_drying_time": [
|
||||
"12",
|
||||
"12",
|
||||
"12",
|
||||
"12"
|
||||
],
|
||||
"filament_dev_chamber_drying_time": [
|
||||
"18"
|
||||
],
|
||||
"filament_dev_ams_drying_heat_distortion_temperature": [
|
||||
"165"
|
||||
],
|
||||
"filament_dev_drying_cooling_temperature": [
|
||||
"150"
|
||||
],
|
||||
"filament_dev_ams_drying_temperature": [
|
||||
"65",
|
||||
"85",
|
||||
"65",
|
||||
"85"
|
||||
],
|
||||
"filament_dev_drying_softening_temperature": [
|
||||
"150"
|
||||
],
|
||||
"hot_plate_temp": [
|
||||
"100"
|
||||
],
|
||||
|
||||
@@ -40,6 +40,27 @@
|
||||
"filament_adhesiveness_category": [
|
||||
"500"
|
||||
],
|
||||
"filament_dev_ams_drying_time": [
|
||||
"12",
|
||||
"8.0",
|
||||
"12",
|
||||
"8.0"
|
||||
],
|
||||
"filament_dev_ams_drying_heat_distortion_temperature": [
|
||||
"105"
|
||||
],
|
||||
"filament_dev_drying_cooling_temperature": [
|
||||
"90"
|
||||
],
|
||||
"filament_dev_ams_drying_temperature": [
|
||||
"65",
|
||||
"80",
|
||||
"65",
|
||||
"80"
|
||||
],
|
||||
"filament_dev_drying_softening_temperature": [
|
||||
"90"
|
||||
],
|
||||
"hot_plate_temp": [
|
||||
"110"
|
||||
],
|
||||
|
||||
@@ -28,6 +28,37 @@
|
||||
"filament_type": [
|
||||
"PCTG"
|
||||
],
|
||||
"filament_dev_chamber_drying_bed_temperature": [
|
||||
"80"
|
||||
],
|
||||
"filament_dev_ams_drying_time": [
|
||||
"12",
|
||||
"12",
|
||||
"12",
|
||||
"12"
|
||||
],
|
||||
"filament_dev_ams_drying_ams_limitations": [
|
||||
"1",
|
||||
"0"
|
||||
],
|
||||
"filament_dev_chamber_drying_time": [
|
||||
"12"
|
||||
],
|
||||
"filament_dev_ams_drying_heat_distortion_temperature": [
|
||||
"75"
|
||||
],
|
||||
"filament_dev_drying_cooling_temperature": [
|
||||
"55"
|
||||
],
|
||||
"filament_dev_ams_drying_temperature": [
|
||||
"65",
|
||||
"65",
|
||||
"55",
|
||||
"55"
|
||||
],
|
||||
"filament_dev_drying_softening_temperature": [
|
||||
"60"
|
||||
],
|
||||
"hot_plate_temp": [
|
||||
"80"
|
||||
],
|
||||
|
||||
@@ -40,6 +40,31 @@
|
||||
"filament_type": [
|
||||
"PE"
|
||||
],
|
||||
"filament_dev_chamber_drying_bed_temperature": [
|
||||
"70"
|
||||
],
|
||||
"filament_dev_ams_drying_time": [
|
||||
"12",
|
||||
"12",
|
||||
"12",
|
||||
"12"
|
||||
],
|
||||
"filament_dev_ams_drying_ams_limitations": [
|
||||
"1",
|
||||
"0"
|
||||
],
|
||||
"filament_dev_drying_cooling_temperature": [
|
||||
"50"
|
||||
],
|
||||
"filament_dev_ams_drying_temperature": [
|
||||
"45",
|
||||
"45",
|
||||
"45",
|
||||
"45"
|
||||
],
|
||||
"filament_dev_drying_softening_temperature": [
|
||||
"50"
|
||||
],
|
||||
"hot_plate_temp": [
|
||||
"55"
|
||||
],
|
||||
|
||||
@@ -31,6 +31,34 @@
|
||||
"filament_adhesiveness_category": [
|
||||
"300"
|
||||
],
|
||||
"filament_dev_chamber_drying_bed_temperature": [
|
||||
"80"
|
||||
],
|
||||
"filament_dev_ams_drying_time": [
|
||||
"12",
|
||||
"12",
|
||||
"12",
|
||||
"12"
|
||||
],
|
||||
"filament_dev_ams_drying_ams_limitations": [
|
||||
"1",
|
||||
"0"
|
||||
],
|
||||
"filament_dev_ams_drying_heat_distortion_temperature": [
|
||||
"75"
|
||||
],
|
||||
"filament_dev_drying_cooling_temperature": [
|
||||
"55"
|
||||
],
|
||||
"filament_dev_ams_drying_temperature": [
|
||||
"65",
|
||||
"65",
|
||||
"55",
|
||||
"55"
|
||||
],
|
||||
"filament_dev_drying_softening_temperature": [
|
||||
"60"
|
||||
],
|
||||
"hot_plate_temp": [
|
||||
"80"
|
||||
],
|
||||
|
||||
@@ -40,6 +40,31 @@
|
||||
"filament_type": [
|
||||
"PHA"
|
||||
],
|
||||
"filament_dev_chamber_drying_bed_temperature": [
|
||||
"70"
|
||||
],
|
||||
"filament_dev_ams_drying_time": [
|
||||
"12",
|
||||
"12",
|
||||
"12",
|
||||
"12"
|
||||
],
|
||||
"filament_dev_ams_drying_ams_limitations": [
|
||||
"1",
|
||||
"0"
|
||||
],
|
||||
"filament_dev_drying_cooling_temperature": [
|
||||
"45"
|
||||
],
|
||||
"filament_dev_ams_drying_temperature": [
|
||||
"45",
|
||||
"45",
|
||||
"45",
|
||||
"45"
|
||||
],
|
||||
"filament_dev_drying_softening_temperature": [
|
||||
"50"
|
||||
],
|
||||
"hot_plate_temp": [
|
||||
"55"
|
||||
],
|
||||
|
||||
@@ -37,14 +37,39 @@
|
||||
"filament_max_volumetric_speed": [
|
||||
"12"
|
||||
],
|
||||
"filament_scarf_seam_type": [
|
||||
"none"
|
||||
],
|
||||
"filament_scarf_gap": [
|
||||
"15%"
|
||||
],
|
||||
"filament_adhesiveness_category": [
|
||||
"100"
|
||||
],
|
||||
"filament_dev_chamber_drying_bed_temperature": [
|
||||
"70"
|
||||
],
|
||||
"filament_dev_ams_drying_time": [
|
||||
"12",
|
||||
"12",
|
||||
"12",
|
||||
"12"
|
||||
],
|
||||
"filament_dev_ams_drying_ams_limitations": [
|
||||
"1",
|
||||
"0"
|
||||
],
|
||||
"filament_dev_ams_drying_heat_distortion_temperature": [
|
||||
"45"
|
||||
],
|
||||
"filament_dev_drying_cooling_temperature": [
|
||||
"45"
|
||||
],
|
||||
"filament_dev_ams_drying_temperature": [
|
||||
"45",
|
||||
"45",
|
||||
"45",
|
||||
"45"
|
||||
],
|
||||
"filament_dev_drying_softening_temperature": [
|
||||
"50"
|
||||
],
|
||||
"hot_plate_temp": [
|
||||
"55"
|
||||
|
||||
@@ -43,6 +43,34 @@
|
||||
"filament_adhesiveness_category": [
|
||||
"902"
|
||||
],
|
||||
"filament_dev_chamber_drying_bed_temperature": [
|
||||
"70"
|
||||
],
|
||||
"filament_dev_ams_drying_time": [
|
||||
"12",
|
||||
"12",
|
||||
"12",
|
||||
"12"
|
||||
],
|
||||
"filament_dev_ams_drying_ams_limitations": [
|
||||
"1",
|
||||
"0"
|
||||
],
|
||||
"filament_dev_ams_drying_heat_distortion_temperature": [
|
||||
"60"
|
||||
],
|
||||
"filament_dev_drying_cooling_temperature": [
|
||||
"50"
|
||||
],
|
||||
"filament_dev_ams_drying_temperature": [
|
||||
"60",
|
||||
"60",
|
||||
"50",
|
||||
"50"
|
||||
],
|
||||
"filament_dev_drying_softening_temperature": [
|
||||
"55"
|
||||
],
|
||||
"hot_plate_temp": [
|
||||
"55"
|
||||
],
|
||||
|
||||
@@ -46,6 +46,34 @@
|
||||
"filament_vendor": [
|
||||
"Bambu Lab"
|
||||
],
|
||||
"filament_dev_chamber_drying_bed_temperature": [
|
||||
"100"
|
||||
],
|
||||
"filament_dev_ams_drying_time": [
|
||||
"12",
|
||||
"12",
|
||||
"12",
|
||||
"12"
|
||||
],
|
||||
"filament_dev_ams_drying_ams_limitations": [],
|
||||
"filament_dev_chamber_drying_time": [
|
||||
"18"
|
||||
],
|
||||
"filament_dev_ams_drying_heat_distortion_temperature": [
|
||||
"165"
|
||||
],
|
||||
"filament_dev_drying_cooling_temperature": [
|
||||
"150"
|
||||
],
|
||||
"filament_dev_ams_drying_temperature": [
|
||||
"65",
|
||||
"85",
|
||||
"65",
|
||||
"85"
|
||||
],
|
||||
"filament_dev_drying_softening_temperature": [
|
||||
"150"
|
||||
],
|
||||
"hot_plate_temp": [
|
||||
"100"
|
||||
],
|
||||
|
||||
@@ -43,6 +43,31 @@
|
||||
"filament_adhesiveness_category": [
|
||||
"801"
|
||||
],
|
||||
"filament_dev_chamber_drying_bed_temperature": [
|
||||
"100"
|
||||
],
|
||||
"filament_dev_ams_drying_time": [
|
||||
"12",
|
||||
"12",
|
||||
"12",
|
||||
"12"
|
||||
],
|
||||
"filament_dev_ams_drying_ams_limitations": [],
|
||||
"filament_dev_ams_drying_heat_distortion_temperature": [
|
||||
"165"
|
||||
],
|
||||
"filament_dev_drying_cooling_temperature": [
|
||||
"150"
|
||||
],
|
||||
"filament_dev_ams_drying_temperature": [
|
||||
"65",
|
||||
"85",
|
||||
"65",
|
||||
"85"
|
||||
],
|
||||
"filament_dev_drying_softening_temperature": [
|
||||
"150"
|
||||
],
|
||||
"hot_plate_temp": [
|
||||
"110"
|
||||
],
|
||||
|
||||
@@ -49,6 +49,27 @@
|
||||
"filament_adhesiveness_category": [
|
||||
"704"
|
||||
],
|
||||
"filament_dev_ams_drying_time": [
|
||||
"12",
|
||||
"18",
|
||||
"12",
|
||||
"18"
|
||||
],
|
||||
"filament_dev_ams_drying_heat_distortion_temperature": [
|
||||
"75"
|
||||
],
|
||||
"filament_dev_drying_cooling_temperature": [
|
||||
"40"
|
||||
],
|
||||
"filament_dev_ams_drying_temperature": [
|
||||
"65",
|
||||
"85",
|
||||
"65",
|
||||
"70"
|
||||
],
|
||||
"filament_dev_drying_softening_temperature": [
|
||||
"75"
|
||||
],
|
||||
"hot_plate_temp": [
|
||||
"55"
|
||||
],
|
||||
|
||||
@@ -46,6 +46,30 @@
|
||||
"filament_adhesiveness_category": [
|
||||
"600"
|
||||
],
|
||||
"filament_dev_ams_drying_time": [
|
||||
"12",
|
||||
"18",
|
||||
"12",
|
||||
"18"
|
||||
],
|
||||
"filament_dev_chamber_drying_time": [
|
||||
"16"
|
||||
],
|
||||
"filament_dev_ams_drying_heat_distortion_temperature": [
|
||||
"45"
|
||||
],
|
||||
"filament_dev_drying_cooling_temperature": [
|
||||
"40"
|
||||
],
|
||||
"filament_dev_ams_drying_temperature": [
|
||||
"65",
|
||||
"75",
|
||||
"45",
|
||||
"45"
|
||||
],
|
||||
"filament_dev_drying_softening_temperature": [
|
||||
"50"
|
||||
],
|
||||
"hot_plate_temp": [
|
||||
"35"
|
||||
],
|
||||
|
||||
@@ -470,6 +470,8 @@ void Preset::normalize(DynamicPrintConfig &config)
|
||||
continue;
|
||||
if (filament_options_with_variant.find(key) != filament_options_with_variant.end())
|
||||
continue;
|
||||
if (filament_dev_options.find(key) != filament_dev_options.end())
|
||||
continue;
|
||||
auto *opt = config.option(key, false);
|
||||
/*assert(opt != nullptr);
|
||||
assert(opt->is_vector());*/
|
||||
@@ -1371,7 +1373,11 @@ static std::vector<std::string> s_Preset_filament_options {/*"filament_colour",
|
||||
"filament_pre_cooling_temperature", "filament_pre_cooling_temperature_nc",
|
||||
"filament_preheat_temperature_delta", "filament_retract_length_nc",
|
||||
"filament_change_length_nc", "filament_prime_volume_nc",
|
||||
"long_retractions_when_ec", "retraction_distances_when_ec"
|
||||
"long_retractions_when_ec", "retraction_distances_when_ec",
|
||||
//ams chamber
|
||||
"filament_dev_ams_drying_ams_limitations", "filament_dev_ams_drying_temperature", "filament_dev_ams_drying_time", "filament_dev_ams_drying_heat_distortion_temperature",
|
||||
"filament_dev_chamber_drying_bed_temperature", "filament_dev_chamber_drying_time",
|
||||
"filament_dev_drying_softening_temperature", "filament_dev_drying_cooling_temperature"
|
||||
};
|
||||
|
||||
static std::vector<std::string> s_Preset_machine_limits_options {
|
||||
@@ -3812,6 +3818,26 @@ void PresetCollection::set_custom_preset_alias(Preset &preset)
|
||||
set_printer_hold_alias(preset.alias, preset);
|
||||
}
|
||||
|
||||
std::string PresetCollection::get_preset_alias(Preset &preset, bool force)
|
||||
{
|
||||
if (!preset.alias.empty())
|
||||
return preset.alias;
|
||||
else
|
||||
set_custom_preset_alias(preset);
|
||||
|
||||
if (!preset.alias.empty() || !force)
|
||||
return preset.alias;
|
||||
|
||||
std::string alias_name;
|
||||
std::string preset_name = preset.name;
|
||||
size_t end_pos = preset_name.find_first_of("@");
|
||||
if (end_pos != std::string::npos) {
|
||||
alias_name = preset_name.substr(0, end_pos);
|
||||
boost::trim_right(alias_name);
|
||||
}
|
||||
return alias_name;
|
||||
}
|
||||
|
||||
void PresetCollection::set_printer_hold_alias(const std::string &alias, Preset &preset, bool remove)
|
||||
{
|
||||
auto compatible_printers = dynamic_cast<ConfigOptionStrings *>(preset.config.option("compatible_printers"));
|
||||
|
||||
@@ -805,6 +805,9 @@ public:
|
||||
std::string path_from_name(const std::string &new_name, bool detach = false) const;
|
||||
std::string path_for_preset(const Preset & preset) const;
|
||||
|
||||
// Get the alias of a preset, setting it if it's empty
|
||||
std::string get_preset_alias(Preset &preset, bool force = false);
|
||||
|
||||
size_t num_default_presets() { return m_num_default_presets; }
|
||||
|
||||
protected:
|
||||
|
||||
@@ -7797,6 +7797,30 @@ void PrintConfigDef::init_fff_params()
|
||||
def->min = 0;
|
||||
def->set_default_value(new ConfigOptionPercent(85));
|
||||
|
||||
def = this->add("filament_dev_ams_drying_ams_limitations", coStrings);
|
||||
def->set_default_value(new ConfigOptionStrings{""});
|
||||
|
||||
def = this->add("filament_dev_ams_drying_temperature", coFloats);
|
||||
def->set_default_value(new ConfigOptionFloats{0});
|
||||
|
||||
def = this->add("filament_dev_ams_drying_time", coFloats);
|
||||
def->set_default_value(new ConfigOptionFloats{0});
|
||||
|
||||
def = this->add("filament_dev_ams_drying_heat_distortion_temperature", coFloats);
|
||||
def->set_default_value(new ConfigOptionFloats{0});
|
||||
|
||||
def = this->add("filament_dev_chamber_drying_bed_temperature", coFloats);
|
||||
def->set_default_value(new ConfigOptionFloats{0});
|
||||
|
||||
def = this->add("filament_dev_chamber_drying_time", coFloats);
|
||||
def->set_default_value(new ConfigOptionFloats{0});
|
||||
|
||||
def = this->add("filament_dev_drying_softening_temperature", coFloats);
|
||||
def->set_default_value(new ConfigOptionFloats{0});
|
||||
|
||||
def = this->add("filament_dev_drying_cooling_temperature", coFloats);
|
||||
def->set_default_value(new ConfigOptionFloats{0});
|
||||
|
||||
// Declare retract values for filament profile, overriding the printer's extruder profile.
|
||||
for (auto& opt_key : filament_extruder_override_keys) {
|
||||
const std::string filament_prefix = "filament_";
|
||||
@@ -9232,6 +9256,17 @@ std::set<std::string> printer_options_with_variant_2 = {
|
||||
|
||||
std::set<std::string> empty_options;
|
||||
|
||||
std::set<std::string> filament_dev_options = {
|
||||
"filament_dev_ams_drying_ams_limitations",
|
||||
"filament_dev_ams_drying_temperature",
|
||||
"filament_dev_ams_drying_time",
|
||||
"filament_dev_ams_drying_heat_distortion_temperature",
|
||||
"filament_dev_chamber_drying_bed_temperature",
|
||||
"filament_dev_chamber_drying_time",
|
||||
"filament_dev_drying_softening_temperature",
|
||||
"filament_dev_drying_cooling_temperature"
|
||||
};
|
||||
|
||||
DynamicPrintConfig DynamicPrintConfig::full_print_config()
|
||||
{
|
||||
return DynamicPrintConfig((const PrintRegionConfig&)FullPrintConfig::defaults());
|
||||
|
||||
@@ -840,6 +840,8 @@ extern std::set<std::string> printer_options_with_variant_1;
|
||||
extern std::set<std::string> printer_options_with_variant_2;
|
||||
extern std::set<std::string> empty_options;
|
||||
|
||||
extern std::set<std::string> filament_dev_options;
|
||||
|
||||
extern void update_static_print_config_from_dynamic(ConfigBase& config, const DynamicPrintConfig& dest_config, std::vector<int> variant_index, std::set<std::string>& key_set1, int stride = 1);
|
||||
extern void compute_filament_override_value(const std::string& opt_key, const ConfigOption *opt_old_machine, const ConfigOption *opt_new_machine, const ConfigOption *opt_new_filament, const DynamicPrintConfig& new_full_config,
|
||||
t_config_option_keys& diff_keys, DynamicPrintConfig& filament_overrides, std::vector<int>& f_map_indices);
|
||||
@@ -1678,6 +1680,16 @@ PRINT_CONFIG_CLASS_DEFINE(
|
||||
// Printer flag: whether the printer offers the fast-purge mode selector.
|
||||
// Default false; no shipping profile sets it, so the fast-purge UI stays hidden.
|
||||
((ConfigOptionBool, support_fast_purge_mode))
|
||||
|
||||
//ams chamber
|
||||
((ConfigOptionStrings, filament_dev_ams_drying_ams_limitations))
|
||||
((ConfigOptionFloats, filament_dev_ams_drying_temperature))
|
||||
((ConfigOptionFloats, filament_dev_ams_drying_time))
|
||||
((ConfigOptionFloats, filament_dev_ams_drying_heat_distortion_temperature))
|
||||
((ConfigOptionFloats, filament_dev_chamber_drying_bed_temperature))
|
||||
((ConfigOptionFloats, filament_dev_chamber_drying_time))
|
||||
((ConfigOptionFloats, filament_dev_drying_softening_temperature))
|
||||
((ConfigOptionFloats, filament_dev_drying_cooling_temperature))
|
||||
)
|
||||
|
||||
// This object is mapped to Perl as Slic3r::Config::Print.
|
||||
|
||||
@@ -28,6 +28,8 @@ set(SLIC3R_GUI_SOURCES
|
||||
GUI/AMSMaterialsSetting.hpp
|
||||
GUI/AMSSetting.cpp
|
||||
GUI/AMSSetting.hpp
|
||||
GUI/AMSDryControl.cpp
|
||||
GUI/AMSDryControl.hpp
|
||||
GUI/AmsWidgets.cpp
|
||||
GUI/AmsWidgets.hpp
|
||||
GUI/Auxiliary.cpp
|
||||
|
||||
@@ -0,0 +1,253 @@
|
||||
#pragma once
|
||||
#include "GUI_ObjectLayers.hpp"
|
||||
#include "slic3r/GUI/Widgets/AMSItem.hpp"
|
||||
#include "slic3r/GUI/Widgets/Label.hpp"
|
||||
#include "slic3r/GUI/Widgets/PopupWindow.hpp"
|
||||
|
||||
#include "slic3r/GUI/wxExtensions.hpp"
|
||||
#include "slic3r/GUI/DeviceCore/DevFilaSystem.h"
|
||||
#include "slic3r/GUI/I18N.hpp"
|
||||
|
||||
#include <chrono>
|
||||
#include <optional>
|
||||
|
||||
|
||||
//Previous defintions
|
||||
class wxGrid;
|
||||
|
||||
namespace Slic3r {
|
||||
|
||||
namespace GUI {
|
||||
|
||||
|
||||
enum class DryCtrState {
|
||||
IDLE,
|
||||
DRY_WHEN_PRINT,
|
||||
UNKNOWN
|
||||
};
|
||||
|
||||
enum class DryCtrDev {
|
||||
N3S,
|
||||
N3F,
|
||||
UNKNOWN
|
||||
};
|
||||
|
||||
struct DryingPreset {
|
||||
DryCtrState state;
|
||||
DryCtrDev dev;
|
||||
int dry_temp;
|
||||
int dry_time;
|
||||
};
|
||||
|
||||
class FilamentItemPanel : public wxPanel
|
||||
{
|
||||
public:
|
||||
FilamentItemPanel(wxWindow* parent, const wxString& text, const std::string& icon_name = "",
|
||||
wxWindowID id = wxID_ANY);
|
||||
|
||||
void SetText(const wxString& text);
|
||||
void SetIcon(const std::string& icon_name);
|
||||
void msw_rescale();
|
||||
|
||||
private:
|
||||
void OnPaint(wxPaintEvent& event);
|
||||
void OnSize(wxSizeEvent& event);
|
||||
|
||||
Label* m_text_label;
|
||||
wxStaticBitmap* m_icon_bitmap;
|
||||
int m_target_size;
|
||||
std::string m_icon_name;
|
||||
ScalableBitmap m_icon;
|
||||
};
|
||||
|
||||
class AMSFilamentPanel : public wxPanel
|
||||
{
|
||||
wxBoxSizer* m_filament_sizer;
|
||||
Label* m_ams_name_label;
|
||||
int m_border_radius;
|
||||
wxPanel* m_filament_container{nullptr};
|
||||
std::vector<FilamentItemPanel*> m_filament_items;
|
||||
|
||||
public:
|
||||
AMSFilamentPanel(wxWindow* parent, const wxString& ams_name, wxWindowID id = wxID_ANY);
|
||||
|
||||
void AddFilamentItem(const wxString& text, const std::string& icon_name);
|
||||
void AddFilamentItem(FilamentItemPanel* panel);
|
||||
void SetAmsName(const wxString& ams_name);
|
||||
void Clear();
|
||||
void msw_rescale();
|
||||
private:
|
||||
void OnPaint(wxPaintEvent& event);
|
||||
};
|
||||
|
||||
|
||||
class AMSDryCtrWin : public DPIDialog
|
||||
{
|
||||
public:
|
||||
AMSDryCtrWin(wxWindow *parent);
|
||||
~AMSDryCtrWin();
|
||||
|
||||
void msw_rescale();
|
||||
void update(std::shared_ptr<DevFilaSystem> fila_system, MachineObject* obj);
|
||||
void set_ams_id(const std::string& ams_id);
|
||||
|
||||
protected:
|
||||
void on_dpi_changed(const wxRect &suggested_rect) override;
|
||||
|
||||
private:
|
||||
wxSimplebook* m_main_simplebook{nullptr};
|
||||
wxPanel* m_original_page{nullptr};
|
||||
|
||||
wxWindow* m_amswin{nullptr};
|
||||
wxBoxSizer* m_sizer_ams_items{nullptr};
|
||||
wxScrolledWindow* m_panel_prv_left {nullptr};
|
||||
wxScrolledWindow* m_panel_prv_right{nullptr};
|
||||
wxBoxSizer* m_sizer_prv_left{nullptr};
|
||||
wxBoxSizer* m_sizer_prv_right{nullptr};
|
||||
|
||||
// left panel related members
|
||||
ScalableBitmap m_humidity_image;
|
||||
wxStaticBitmap* m_humidity_img{nullptr};
|
||||
Label* m_image_description{nullptr};
|
||||
wxStaticBitmap* m_image_description_icon{nullptr};
|
||||
ScalableBitmap m_description_icon_bitmap;
|
||||
|
||||
Label* m_humidity_data_label = nullptr;
|
||||
Label* m_temperature_data_label = nullptr;
|
||||
Label* m_time_data_label = nullptr;
|
||||
wxBoxSizer* m_time_descrition_container = nullptr;
|
||||
|
||||
// right panel related members
|
||||
wxBoxSizer* m_normal_state_sizer{nullptr};
|
||||
wxBoxSizer* m_cannot_dry_sizer{nullptr};
|
||||
wxBoxSizer* m_dry_error_sizer{nullptr};
|
||||
Label* m_cannot_dry_description_label = nullptr;
|
||||
|
||||
// right panel normal state
|
||||
ComboBox* m_trays_combo;
|
||||
std::vector<FilamentBaseInfo> m_tray_ids;
|
||||
wxTextCtrl* m_temperature_input;
|
||||
wxTextCtrl* m_time_input;
|
||||
Label* m_normal_description;
|
||||
Button* m_start_button{nullptr};
|
||||
Button* m_next_button{nullptr};
|
||||
Button* m_stop_button{nullptr};
|
||||
Button* m_back_button{nullptr};
|
||||
Button* m_unload_button{nullptr};
|
||||
|
||||
// guide page description
|
||||
Label* m_guide_title_label{nullptr};
|
||||
Label* m_guide_description_label{nullptr};
|
||||
|
||||
wxCheckBox* m_rotate_spool_toggle{nullptr};
|
||||
|
||||
wxPanel* m_progress_page;
|
||||
ProgressBar* m_progress_gauge;
|
||||
wxTimer* m_progress_timer;
|
||||
|
||||
std::optional<std::chrono::steady_clock::time_point> m_stop_button_restore_deadline;
|
||||
std::optional<std::chrono::steady_clock::time_point> m_unload_button_restore_deadline;
|
||||
|
||||
Label* m_progress_title;
|
||||
int m_progress_value;
|
||||
int m_progress_message_index;
|
||||
std::vector<wxString> m_progress_text = {
|
||||
_L("Starting: Checking adapter connection"),
|
||||
_L("Starting: Checking filament status"),
|
||||
_L("Starting: Checking drying presets"),
|
||||
_L("Starting: Checking filament location"),
|
||||
_L("Starting: Checking air intake"),
|
||||
_L("Starting: Checking air vent")
|
||||
};
|
||||
|
||||
// Guide page
|
||||
wxPanel* m_guide_page{nullptr};
|
||||
AMSFilamentPanel* m_ams_filament_panel{nullptr};
|
||||
std::map<std::string, FilamentItemPanel*> m_filament_items;
|
||||
wxStaticBitmap* m_image_placeholder{nullptr};
|
||||
ScalableBitmap m_guide_image;
|
||||
|
||||
|
||||
bool m_is_ams_changed = false;
|
||||
std::weak_ptr<DevFilaSystem> m_fila_system;
|
||||
struct {
|
||||
std::string m_ams_id;
|
||||
DevAmsType m_model = DevAmsType::EXT_SPOOL;
|
||||
DevAms::DryStatus m_dry_status = DevAms::DryStatus::Off;
|
||||
DevAms::DrySubStatus m_dry_sub_status = DevAms::DrySubStatus::Off;
|
||||
int m_humidity_percent;
|
||||
int m_temperature;
|
||||
int m_left_dry_time;
|
||||
float m_recommand_dry_temp;
|
||||
} m_ams_info;
|
||||
|
||||
struct {
|
||||
std::unordered_map<std::string, std::string> m_filament_names;
|
||||
std::unordered_map<std::string, std::string> m_filament_type;
|
||||
std::unordered_map<std::string, int> m_dry_temp;
|
||||
std::unordered_map<std::string, int> m_dry_time;
|
||||
} m_dry_setting;
|
||||
|
||||
struct {
|
||||
bool m_is_printing = false;
|
||||
} m_printer_status;
|
||||
|
||||
private:
|
||||
void create();
|
||||
wxBoxSizer* create_guide_page_sizer(wxPanel* parent);
|
||||
wxBoxSizer* create_main_content_section(wxPanel* parent);
|
||||
wxBoxSizer* create_guide_info_filament(wxPanel* parent);
|
||||
wxBoxSizer* create_guide_info_section(wxPanel* parent);
|
||||
wxBoxSizer* create_guide_right_section(wxPanel* parent);
|
||||
wxBoxSizer* create_main_page_sizer(wxPanel* parent);
|
||||
wxBoxSizer* create_left_panel(wxPanel* parent);
|
||||
wxBoxSizer* create_humidity_status_section(wxPanel* parent);
|
||||
wxBoxSizer* create_description_item(wxPanel* parent, const wxString& title, Label*& dataLabel);
|
||||
wxBoxSizer* create_status_descriptions_section(wxPanel* parent);
|
||||
|
||||
wxBoxSizer* create_right_panel(wxPanel* parent);
|
||||
wxBoxSizer* create_normal_state_panel(wxPanel* parent);
|
||||
wxBoxSizer* create_cannot_dry_panel(wxPanel* parent);
|
||||
wxBoxSizer* create_drying_error_panel(wxPanel* parent);
|
||||
Button* create_button(wxPanel* parent, const wxString& title,
|
||||
const wxColour& background_color, const wxColour& border_color, const wxColour& text_color);
|
||||
|
||||
wxBoxSizer* create_progress_page_sizer(wxPanel* parent);
|
||||
void OnProgressTimer(wxTimerEvent& event);
|
||||
void OnClose(wxCloseEvent& event);
|
||||
void OnShow(wxShowEvent& event);
|
||||
|
||||
void OnFilamentSelectionChanged(wxCommandEvent& event);
|
||||
|
||||
|
||||
wxScrolledWindow* create_preview_scrolled_window(wxWindow* parent);
|
||||
|
||||
bool check_values_changed(DevAms* dev_ams);
|
||||
int update_image(DevAmsType type, DevAms::DryStatus status, DevAms::DrySubStatus sub_status, int humidity_percent);
|
||||
void update_img_description(DevAms::DryStatus status, DevAms::DrySubStatus sub_status);
|
||||
void update_normal_description(DevAms* dev_ams);
|
||||
int update_state(DevAms* dev_ams);
|
||||
int update_dryness_status(DevAms* dev_ams);
|
||||
int update_ams_change(DevAms* dev_ams);
|
||||
int update_filament_list(DevAms* dev_ams, MachineObject* obj);
|
||||
void update_filament_guide_info(DevAms* dev_ams);
|
||||
void update_normal_state(DevAms* dev_ams);
|
||||
void update_printer_state(MachineObject* obj);
|
||||
|
||||
std::shared_ptr<DevFilaSystem> get_fila_system() const;
|
||||
void start_sending_drying_command();
|
||||
void restore_stop_button_if_deadline_passed();
|
||||
void restore_unload_button_if_deadline_passed();
|
||||
void update_button_size(Button* button);
|
||||
|
||||
bool is_dry_status_changed(DevAms* dev_ams);
|
||||
bool is_dry_ctr_idle(DevAms* dev_ams);
|
||||
bool is_ams_changed(DevAms* dev_ams);
|
||||
bool is_dry_ctr_idle();
|
||||
bool is_tray_changed(DevAms* dev_ams);
|
||||
bool is_dry_ctr_err(DevAms* dev_ams);
|
||||
|
||||
};
|
||||
|
||||
} // GUI
|
||||
} // Slic3r
|
||||
@@ -41,6 +41,16 @@ enum AmsStatusMain
|
||||
AMS_STATUS_MAIN_UNKNOWN = 0xFF,
|
||||
};
|
||||
|
||||
enum DevAmsType : int
|
||||
{
|
||||
EXT_SPOOL = 0, // EXT
|
||||
AMS = 1, // AMS1
|
||||
AMS_LITE = 2, // AMS-Lite
|
||||
N3F = 3, // N3F, AMS 2PRO
|
||||
N3S = 4, // N3S, AMS HT
|
||||
AMS_LITE_MIXED = 5, // AMS-Lite for N9
|
||||
};
|
||||
|
||||
// Device-numbered filament-change step codes. Newer firmware reports the exact change-step
|
||||
// sequence through the AMS (ams.cfs), keyed by these codes, instead of the client hardcoding
|
||||
// steps per model. Distinct from the legacy GUI-side Slic3r::GUI::FilamentStep enum.
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
#include "slic3r/GUI/I18N.hpp"
|
||||
|
||||
#include "DevUtil.h"
|
||||
#include "DevUtilBackend.h"
|
||||
|
||||
using namespace nlohmann;
|
||||
|
||||
@@ -99,6 +100,11 @@ std::string DevAmsTray::get_filament_type()
|
||||
return m_fila_type;
|
||||
}
|
||||
|
||||
std::optional<Slic3r::DevFilamentDryingPreset> DevAmsTray::get_ams_drying_preset() const
|
||||
{
|
||||
return DevUtilBackend::GetFilamentDryingPreset(setting_id);
|
||||
}
|
||||
|
||||
|
||||
DevAms::DevAms(const std::string& ams_id, int extruder_id, AmsType type)
|
||||
{
|
||||
@@ -112,7 +118,7 @@ DevAms::DevAms(const std::string& ams_id, int nozzle_id, int type)
|
||||
m_ams_id = ams_id;
|
||||
m_ext_id = nozzle_id;
|
||||
m_ams_type = (AmsType)type;
|
||||
assert(DUMMY < type && m_ams_type <= AMS_LITE_MIXED);
|
||||
assert(EXT_SPOOL < type && m_ams_type <= AMS_LITE_MIXED);
|
||||
}
|
||||
|
||||
DevAms::~DevAms()
|
||||
@@ -193,6 +199,27 @@ DevAmsTray* DevAms::GetTray(const std::string& tray_id) const
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
bool DevAms::IsSupportRemoteDry(const MachineObject* obj) const
|
||||
{
|
||||
if (obj && obj->is_support_remote_dry) {
|
||||
return SupportDrying();
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool DevAms::AmsIsDrying()
|
||||
{
|
||||
if (!GetDryStatus().has_value()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return GetDryStatus().value() == DevAms::DryStatus::Checking
|
||||
|| GetDryStatus().value() == DevAms::DryStatus::Drying
|
||||
|| GetDryStatus().value() == DevAms::DryStatus::Error
|
||||
|| GetDryStatus().value() == DevAms::DryStatus::CannotStopHeatOutofControl;
|
||||
}
|
||||
|
||||
DevFilaSystem::~DevFilaSystem()
|
||||
{
|
||||
for (auto it = amsList.begin(); it != amsList.end(); it++)
|
||||
@@ -515,9 +542,18 @@ void DevFilaSystemParser::ParseV1_0(const json& jj, MachineObject* obj, DevFilaS
|
||||
;
|
||||
}
|
||||
|
||||
if (it->contains("dry_time") && (*it)["dry_time"].is_number())
|
||||
|
||||
if (it->contains("temp"))
|
||||
{
|
||||
curr_ams->m_left_dry_time = (*it)["dry_time"].get<int>();
|
||||
std::string temp = (*it)["temp"].get<std::string>();
|
||||
try
|
||||
{
|
||||
curr_ams->m_current_temperature = DevUtil::string_to_float(temp);
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
curr_ams->m_current_temperature = INVALID_AMS_TEMPERATURE;
|
||||
}
|
||||
}
|
||||
|
||||
if (it->contains("humidity"))
|
||||
@@ -546,17 +582,32 @@ void DevFilaSystemParser::ParseV1_0(const json& jj, MachineObject* obj, DevFilaS
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (it->contains("temp"))
|
||||
if (it->contains("dry_time") && (*it)["dry_time"].is_number())
|
||||
{
|
||||
std::string temp = (*it)["temp"].get<std::string>();
|
||||
try
|
||||
{
|
||||
curr_ams->m_current_temperature = DevUtil::string_to_float(temp);
|
||||
curr_ams->m_left_dry_time = (*it)["dry_time"].get<int>();
|
||||
}
|
||||
|
||||
// Drying status — only parse if printer supports remote drying
|
||||
if (obj->is_support_remote_dry) {
|
||||
if (it->contains("info")) {
|
||||
const std::string& info = (*it)["info"].get<std::string>();
|
||||
curr_ams->m_dry_status = (DevAms::DryStatus)DevUtil::get_flag_bits(info, 4, 4);
|
||||
curr_ams->m_dry_fan1_status = (DevAms::DryFanStatus)DevUtil::get_flag_bits(info, 18, 2);
|
||||
curr_ams->m_dry_fan2_status = (DevAms::DryFanStatus)DevUtil::get_flag_bits(info, 20, 2);
|
||||
curr_ams->m_dry_sub_status = (DevAms::DrySubStatus)DevUtil::get_flag_bits(info, 22, 2);
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
curr_ams->m_current_temperature = INVALID_AMS_TEMPERATURE;
|
||||
|
||||
if (it->contains("dry_setting")) {
|
||||
const auto& j_dry_settings = (*it)["dry_setting"];
|
||||
DevAms::DrySettings dry_settings;
|
||||
DevJsonValParser::ParseVal(j_dry_settings, "dry_filament", dry_settings.dry_filament);
|
||||
DevJsonValParser::ParseVal(j_dry_settings, "dry_temperature", dry_settings.dry_temp);
|
||||
DevJsonValParser::ParseVal(j_dry_settings, "dry_duration", dry_settings.dry_hour);
|
||||
curr_ams->m_dry_settings = dry_settings;
|
||||
}
|
||||
|
||||
if (it->contains("dry_sf_reason")) {
|
||||
curr_ams->m_dry_cannot_reasons = DevJsonValParser::GetVal<std::vector<DevAms::CannotDryReason>>((*it), "dry_sf_reason");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -12,6 +12,9 @@
|
||||
#include <vector>
|
||||
#include <optional>
|
||||
#include <memory>
|
||||
#include <unordered_map>
|
||||
#include <unordered_set>
|
||||
#include <vector>
|
||||
#include <wx/string.h>
|
||||
#include <wx/colour.h>
|
||||
|
||||
@@ -20,6 +23,7 @@
|
||||
namespace Slic3r
|
||||
{
|
||||
class MachineObject;
|
||||
struct DevFilamentDryingPreset;
|
||||
|
||||
/**
|
||||
* DevAmsTray - Represents a single filament tray/slot in an AMS unit or virtual tray.
|
||||
@@ -106,6 +110,8 @@ public:
|
||||
|
||||
// static
|
||||
static wxColour decode_color(const std::string& color);
|
||||
|
||||
std::optional<DevFilamentDryingPreset> get_ams_drying_preset() const;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -133,14 +139,67 @@ class DevAms
|
||||
{
|
||||
friend class DevFilaSystemParser;
|
||||
public:
|
||||
enum AmsType : int
|
||||
using AmsType = DevAmsType;
|
||||
static constexpr AmsType EXT_SPOOL = DevAmsType::EXT_SPOOL;
|
||||
static constexpr AmsType AMS = DevAmsType::AMS;
|
||||
static constexpr AmsType AMS_LITE = DevAmsType::AMS_LITE;
|
||||
static constexpr AmsType N3F = DevAmsType::N3F;
|
||||
static constexpr AmsType N3S = DevAmsType::N3S;
|
||||
static constexpr AmsType AMS_LITE_MIXED = DevAmsType::AMS_LITE_MIXED;
|
||||
|
||||
public:
|
||||
|
||||
enum class DryCtrlMode : int
|
||||
{
|
||||
DUMMY = 0,
|
||||
AMS = 1, // AMS
|
||||
AMS_LITE = 2, // AMS-Lite
|
||||
N3F = 3, // N3F
|
||||
N3S = 4, // N3S
|
||||
AMS_LITE_MIXED = 5, // AMS-Lite mixed (A2L / N9). Presents as AMS_LITE to generic callers; see GetAmsType()/IsAmsLiteMixed().
|
||||
Off = 0,
|
||||
OnTime = 1,
|
||||
OnHumidity = 2,
|
||||
};
|
||||
|
||||
enum class DryStatus : char
|
||||
{
|
||||
Off = 0,
|
||||
Checking = 1,
|
||||
Drying = 2,
|
||||
Cooling = 3,
|
||||
Stopping = 4,
|
||||
Error = 5,
|
||||
CannotStopHeatOutofControl = 6,
|
||||
PrdTesting = 7,
|
||||
};
|
||||
|
||||
enum class DrySubStatus
|
||||
{
|
||||
Off = 0,
|
||||
Heating = 1,
|
||||
Dehumidify = 2,
|
||||
};
|
||||
|
||||
enum class DryFanStatus : char
|
||||
{
|
||||
Off = 0,
|
||||
On = 1,
|
||||
};
|
||||
|
||||
enum class CannotDryReason : int
|
||||
{
|
||||
TaskOccupied = 0,
|
||||
InsufficientPower = 1,
|
||||
AmsBusy = 2,
|
||||
ConsumableAtAmsOutlet = 3,
|
||||
InitiatingAmsDrying = 4,
|
||||
NotSupportedIn2dMode = 5,
|
||||
DryingInProgress = 6,
|
||||
Upgrading = 7,
|
||||
InsufficientPowerNeedPluginPower = 8,
|
||||
FilamentAtAmsOutletManualUnload = 10,
|
||||
};
|
||||
|
||||
struct DrySettings
|
||||
{
|
||||
std::string dry_filament;
|
||||
int dry_temp = -1; // -1 means invalid
|
||||
int dry_hour = -1; // -1 means invalid, hours
|
||||
};
|
||||
|
||||
public:
|
||||
@@ -193,11 +252,20 @@ public:
|
||||
int GetHumidityLevel() const { return m_humidity_level; }
|
||||
int GetHumidityPercent() const { return m_humidity_percent; }
|
||||
|
||||
// Only N3F/N3S dry. Written explicitly (not `> AMS_LITE`) so the new AMS_LITE_MIXED (N9) is
|
||||
// excluded; identical to the old expression for every pre-existing type.
|
||||
bool SupportDrying() const { return (m_ams_type == N3F) || (m_ams_type == N3S); }
|
||||
bool SupportDrying() const { return m_ams_type == DevAmsType::N3F || m_ams_type == DevAmsType::N3S; }
|
||||
int GetLeftDryTime() const { return m_left_dry_time; }
|
||||
|
||||
// remote drying control
|
||||
bool IsSupportRemoteDry(const MachineObject* obj) const;
|
||||
std::optional<DryStatus> GetDryStatus() const { return m_dry_status; };
|
||||
std::optional<DrySubStatus> GetDrySubStatus() const { return m_dry_sub_status; }
|
||||
std::optional<DryFanStatus> GetFan1Status() const { return m_dry_fan1_status; }
|
||||
std::optional<DryFanStatus> GetFan2Status() const { return m_dry_fan2_status; }
|
||||
std::optional<std::vector<CannotDryReason>> GetCannotDryReason() const { return m_dry_cannot_reasons; }
|
||||
std::optional<DrySettings> GetDrySettings() const { return m_dry_settings; };
|
||||
|
||||
bool AmsIsDrying();
|
||||
|
||||
private:
|
||||
AmsType m_ams_type = AmsType::AMS;
|
||||
std::string m_ams_id;
|
||||
@@ -218,6 +286,14 @@ private:
|
||||
int m_humidity_level = 5; // AmsType::AMS
|
||||
int m_humidity_percent = -1; // N3F N3S, the percentage, -1 means invalid. eg. 100 means 100%
|
||||
int m_left_dry_time = 0;
|
||||
|
||||
// see is_support_remote_dry
|
||||
std::optional<DryStatus> m_dry_status;
|
||||
std::optional<DrySubStatus> m_dry_sub_status;
|
||||
std::optional<DryFanStatus> m_dry_fan1_status;
|
||||
std::optional<DryFanStatus> m_dry_fan2_status;
|
||||
std::optional<std::vector<CannotDryReason>> m_dry_cannot_reasons;
|
||||
std::optional<DrySettings> m_dry_settings;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -299,7 +375,11 @@ public:
|
||||
public:
|
||||
// ctrls
|
||||
int CtrlAmsReset() const;
|
||||
|
||||
|
||||
// crtl
|
||||
int CtrlAmsStartDryingHour(int ams_id, std::string filament_type, int tag_temp, int tag_duration_hour, bool rotate_tray, int cooling_temp, bool close_power_conflict = false) const;
|
||||
int CtrlAmsStopDrying(int ams_id) const;
|
||||
|
||||
public:
|
||||
static bool IsBBL_Filament(std::string tag_uid);
|
||||
|
||||
@@ -337,4 +417,18 @@ public:
|
||||
static void ParseV1_0(const json& print_json, MachineObject* obj, DevFilaSystem* system, bool key_field_only);
|
||||
};
|
||||
|
||||
struct DevFilamentDryingPreset
|
||||
{
|
||||
std::string filament_id;
|
||||
|
||||
std::unordered_set<DevAmsType> ams_limitations; // only use ams types in the set
|
||||
std::unordered_map<DevAmsType, float> filament_dev_ams_drying_time_on_idle; // hour
|
||||
std::unordered_map<DevAmsType, float> filament_dev_ams_drying_temperature_on_idle;
|
||||
std::unordered_map<DevAmsType, float> filament_dev_ams_drying_time_on_print; // hour
|
||||
std::unordered_map<DevAmsType, float> filament_dev_ams_drying_temperature_on_print;
|
||||
float filament_dev_drying_cooling_temperature = 0.0f;
|
||||
float filament_dev_drying_softening_temperature = 0.0f;
|
||||
float filament_dev_ams_drying_heat_distortion_temperature = 0.0f;
|
||||
};
|
||||
|
||||
}// namespace Slic3r
|
||||
@@ -16,4 +16,44 @@ int DevFilaSystem::CtrlAmsReset() const
|
||||
return m_owner->publish_json(jj_command);
|
||||
}
|
||||
|
||||
int DevFilaSystem::CtrlAmsStartDryingHour(int ams_id,
|
||||
std::string filament_type,
|
||||
int tag_temp,
|
||||
int tag_duration_hour,
|
||||
bool rotate_tray,
|
||||
int cooling_temp,
|
||||
bool close_power_conflict) const
|
||||
{
|
||||
json jj_command;
|
||||
jj_command["print"]["command"] = "ams_filament_drying";
|
||||
jj_command["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++);
|
||||
jj_command["print"]["ams_id"] = ams_id;
|
||||
jj_command["print"]["mode"] = static_cast<int>(DevAms::DryCtrlMode::OnTime);
|
||||
jj_command["print"]["filament"] = filament_type;
|
||||
jj_command["print"]["temp"] = tag_temp;
|
||||
jj_command["print"]["duration"] = tag_duration_hour;
|
||||
jj_command["print"]["humidity"] = 0;
|
||||
jj_command["print"]["rotate_tray"] = rotate_tray;
|
||||
jj_command["print"]["cooling_temp"] = cooling_temp;
|
||||
jj_command["print"]["close_power_conflict"] = close_power_conflict;
|
||||
return m_owner->publish_json(jj_command);
|
||||
}
|
||||
|
||||
int DevFilaSystem::CtrlAmsStopDrying(int ams_id) const
|
||||
{
|
||||
json jj_command;
|
||||
jj_command["print"]["command"] = "ams_filament_drying";
|
||||
jj_command["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++);
|
||||
jj_command["print"]["ams_id"] = ams_id;
|
||||
jj_command["print"]["mode"] = static_cast<int>(DevAms::DryCtrlMode::Off);
|
||||
jj_command["print"]["filament"] = "";
|
||||
jj_command["print"]["temp"] = 0;
|
||||
jj_command["print"]["duration"] = 0;
|
||||
jj_command["print"]["humidity"] = 0;
|
||||
jj_command["print"]["rotate_tray"] = false;
|
||||
jj_command["print"]["cooling_temp"] = 0;
|
||||
jj_command["print"]["close_power_conflict"] = false;
|
||||
return m_owner->publish_json(jj_command);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -199,7 +199,7 @@ namespace Slic3r
|
||||
}
|
||||
}
|
||||
FilamentInfo info;
|
||||
_parse_tray_info(atoi(tray.id.c_str()), 0, DevAms::DUMMY, tray, info);
|
||||
_parse_tray_info(atoi(tray.id.c_str()), 0, DevAms::EXT_SPOOL, tray, info);
|
||||
tray_filaments.emplace(std::make_pair(info.tray_id, info));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,11 @@
|
||||
#include "DevUtilBackend.h"
|
||||
|
||||
#include "slic3r/GUI/BackgroundSlicingProcess.hpp"
|
||||
|
||||
#include "slic3r/GUI/Plater.hpp"
|
||||
#include "slic3r/GUI/GUI_App.hpp"
|
||||
|
||||
#include <boost/log/trivial.hpp>
|
||||
|
||||
namespace Slic3r
|
||||
{
|
||||
@@ -15,4 +19,68 @@ std::shared_ptr<MultiNozzleUtils::NozzleGroupResultBase> DevUtilBackend::GetNozz
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
static std::unordered_map<std::string, DevAmsType> s_ams_type_map = {
|
||||
{"0", DevAmsType::N3F},
|
||||
{"1", DevAmsType::N3S},
|
||||
};
|
||||
|
||||
std::optional<Slic3r::DevFilamentDryingPreset> DevUtilBackend::GetFilamentDryingPreset(const std::string& fila_id)
|
||||
{
|
||||
if (fila_id.empty() || !GUI::wxGetApp().preset_bundle) {
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
for (auto iter = GUI::wxGetApp().preset_bundle->filaments.begin(); iter != GUI::wxGetApp().preset_bundle->filaments.end(); ++iter) {
|
||||
const Preset& filament_preset = *iter;
|
||||
const auto& config = filament_preset.config;
|
||||
if (filament_preset.filament_id == fila_id) {
|
||||
DevFilamentDryingPreset info;
|
||||
info.filament_id = fila_id;
|
||||
try {
|
||||
if (config.has("filament_dev_ams_drying_ams_limitations")) {
|
||||
std::vector<std::string> types = config.option<ConfigOptionStrings>("filament_dev_ams_drying_ams_limitations")->values;
|
||||
for (auto type : types) {
|
||||
if (s_ams_type_map.count(type) == 0) {
|
||||
continue;
|
||||
}
|
||||
info.ams_limitations.insert(s_ams_type_map[type]);
|
||||
}
|
||||
}
|
||||
|
||||
if (config.has("filament_dev_ams_drying_temperature")) {
|
||||
info.filament_dev_ams_drying_temperature_on_idle[DevAmsType::N3F] = config.option<ConfigOptionFloats>("filament_dev_ams_drying_temperature")->get_at(0);
|
||||
info.filament_dev_ams_drying_temperature_on_idle[DevAmsType::N3S] = config.option<ConfigOptionFloats>("filament_dev_ams_drying_temperature")->get_at(1);
|
||||
info.filament_dev_ams_drying_temperature_on_print[DevAmsType::N3F] = config.option<ConfigOptionFloats>("filament_dev_ams_drying_temperature")->get_at(2);
|
||||
info.filament_dev_ams_drying_temperature_on_print[DevAmsType::N3S] = config.option<ConfigOptionFloats>("filament_dev_ams_drying_temperature")->get_at(3);
|
||||
}
|
||||
|
||||
if (config.has("filament_dev_ams_drying_time")) {
|
||||
info.filament_dev_ams_drying_time_on_idle[DevAmsType::N3F] = config.option<ConfigOptionFloats>("filament_dev_ams_drying_time")->get_at(0);
|
||||
info.filament_dev_ams_drying_time_on_idle[DevAmsType::N3S] = config.option<ConfigOptionFloats>("filament_dev_ams_drying_time")->get_at(1);
|
||||
info.filament_dev_ams_drying_time_on_print[DevAmsType::N3F] = config.option<ConfigOptionFloats>("filament_dev_ams_drying_time")->get_at(2);
|
||||
info.filament_dev_ams_drying_time_on_print[DevAmsType::N3S] = config.option<ConfigOptionFloats>("filament_dev_ams_drying_time")->get_at(3);
|
||||
}
|
||||
|
||||
if (config.has("filament_dev_drying_softening_temperature")) {
|
||||
info.filament_dev_drying_softening_temperature = config.option<ConfigOptionFloats>("filament_dev_drying_softening_temperature")->get_at(0);
|
||||
}
|
||||
|
||||
if (config.has("filament_dev_ams_drying_heat_distortion_temperature")) {
|
||||
info.filament_dev_ams_drying_heat_distortion_temperature = config.option<ConfigOptionFloats>("filament_dev_ams_drying_heat_distortion_temperature")->get_at(0);
|
||||
}
|
||||
|
||||
if (config.has("filament_dev_drying_cooling_temperature")) {
|
||||
info.filament_dev_drying_cooling_temperature = config.option<ConfigOptionFloats>("filament_dev_drying_cooling_temperature")->get_at(0);
|
||||
}
|
||||
|
||||
return info;
|
||||
} catch (const std::exception& e) {
|
||||
BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << " exception: " << e.what();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
}; // namespace Slic3r
|
||||
|
||||
@@ -1,18 +1,15 @@
|
||||
/**
|
||||
* @file DevUtilBackend.h
|
||||
* @brief Static helpers bridging the backend (slicer/preset) to the device GUI.
|
||||
*
|
||||
* Scope (H2C nozzle rack): exposes only GetNozzleGroupResult — the accessor the print-dispatch
|
||||
* nozzle-mapping V1 request and result-resolve helpers read. Related helpers (per-nozzle info
|
||||
* collection via the ExtruderNozzleInfos/NozzleDef type pair, and the drying-preset lookup) are
|
||||
* not implemented here and left to the consuming code.
|
||||
* @brief Provides common static utility methods for backend (preset/slicing).
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#include "DevDefs.h"
|
||||
#include "DevFilaSystem.h"
|
||||
|
||||
#include "libslic3r/MultiNozzleUtils.hpp"
|
||||
|
||||
#include <memory>
|
||||
#include <optional>
|
||||
#include <string>
|
||||
|
||||
namespace Slic3r
|
||||
{
|
||||
@@ -23,10 +20,15 @@ class DevUtilBackend
|
||||
public:
|
||||
DevUtilBackend() = delete;
|
||||
|
||||
public:
|
||||
|
||||
// for rack: the slicer's per-filament -> logical-nozzle grouping for the current plate, read off
|
||||
// the post-slice GCodeProcessorResult (plater->background_process().get_current_gcode_result()).
|
||||
// Returns nullptr when there is no plater / no current result.
|
||||
static std::shared_ptr<MultiNozzleUtils::NozzleGroupResultBase> GetNozzleGroupResult(Slic3r::GUI::Plater* plater);
|
||||
|
||||
// for filament preset
|
||||
static std::optional<DevFilamentDryingPreset> GetFilamentDryingPreset(const std::string& fila_id);
|
||||
};
|
||||
|
||||
}; // namespace Slic3r
|
||||
|
||||
@@ -568,7 +568,7 @@ MachineObject::MachineObject(DeviceManager* manager, NetworkAgent* agent, std::s
|
||||
m_extder_system = new DevExtderSystem(this);
|
||||
m_extension_tool = DevExtensionTool::Create(this);
|
||||
m_nozzle_system = new DevNozzleSystem(this);
|
||||
m_fila_system = new DevFilaSystem(this);
|
||||
m_fila_system = std::make_shared<DevFilaSystem>(this);
|
||||
m_fila_switch = new DevFilaSwitch(this);
|
||||
m_hms_system = new DevHMS(this);
|
||||
m_config = new DevConfig(this);
|
||||
@@ -617,8 +617,6 @@ MachineObject::~MachineObject()
|
||||
delete m_ctrl;
|
||||
m_ctrl = nullptr;
|
||||
|
||||
delete m_fila_system;
|
||||
m_fila_system = nullptr;
|
||||
|
||||
delete m_fila_switch;
|
||||
m_fila_switch = nullptr;
|
||||
@@ -3770,7 +3768,7 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_
|
||||
update_printer_preset_name();
|
||||
update_filament_list();
|
||||
if (jj.contains("ams")) {
|
||||
DevFilaSystemParser::ParseV1_0(jj, this, m_fila_system, key_field_only);
|
||||
DevFilaSystemParser::ParseV1_0(jj, this, m_fila_system.get(), key_field_only);
|
||||
}
|
||||
|
||||
/* vitrual tray*/
|
||||
@@ -5095,6 +5093,7 @@ void MachineObject::parse_new_info(json print)
|
||||
// fun2 may have infinite length, use get_flag_bits_no_border
|
||||
if (!fun2.empty()) {
|
||||
is_support_print_with_emmc = get_flag_bits_no_border(fun2, 0) == 1;
|
||||
is_support_remote_dry = (get_flag_bits_no_border(fun2, 5) == 1);
|
||||
is_support_check_track_switch_match_slice_printer = get_flag_bits_no_border(fun2, 19) == 1;
|
||||
}
|
||||
|
||||
|
||||
@@ -117,7 +117,7 @@ private:
|
||||
std::shared_ptr<DevExtensionTool> m_extension_tool;
|
||||
DevExtderSystem* m_extder_system;
|
||||
DevNozzleSystem* m_nozzle_system;
|
||||
DevFilaSystem* m_fila_system;
|
||||
std::shared_ptr<DevFilaSystem> m_fila_system;
|
||||
DevFilaSwitch* m_fila_switch;
|
||||
DevFan* m_fan;
|
||||
DevBed * m_bed;
|
||||
@@ -342,7 +342,7 @@ public:
|
||||
std::shared_ptr<DevNozzleMappingCtrl> get_nozzle_mapping_result() const { return m_nozzle_mapping_ptr; }
|
||||
void clear_auto_nozzle_mapping();// defined in DevMappingNozzle.cpp
|
||||
|
||||
DevFilaSystem* GetFilaSystem() const { return m_fila_system;}
|
||||
std::shared_ptr<DevFilaSystem> GetFilaSystem() const { return m_fila_system;}
|
||||
DevFilaSwitch* GetFilaSwitch() const { return m_fila_switch;}
|
||||
bool HasAms() const;
|
||||
|
||||
@@ -635,6 +635,7 @@ public:
|
||||
|
||||
// fun2
|
||||
bool is_support_print_with_emmc{false};
|
||||
bool is_support_remote_dry = false;
|
||||
bool is_support_check_track_switch_match_slice_printer{false};
|
||||
|
||||
bool installed_upgrade_kit{false};
|
||||
|
||||
@@ -521,6 +521,14 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater)
|
||||
//m_change_filament_times_sizer->Add(m_img_change_filament_times, 0, wxTOP, FromDIP(2));
|
||||
m_change_filament_times_sizer->Add(m_txt_change_filament_times, 0, wxTOP, 0);
|
||||
|
||||
m_warn_when_drying_sizer = new wxBoxSizer(wxHORIZONTAL);
|
||||
m_txt_warn_when_drying = new Label(m_scroll_area, wxEmptyString);
|
||||
m_txt_warn_when_drying->SetFont(::Label::Body_13);
|
||||
m_txt_warn_when_drying->SetForegroundColour(wxColour("#F09A17"));
|
||||
m_txt_warn_when_drying->SetBackgroundColour(*wxWHITE);
|
||||
m_txt_warn_when_drying->SetLabel(_L("To ensure print quality, the drying temperature will be lowered during printing."));
|
||||
m_warn_when_drying_sizer->Add(m_txt_warn_when_drying, 0, wxTOP, FromDIP(2));
|
||||
|
||||
/*Advanced Options*/
|
||||
wxBoxSizer* sizer_split_options = new wxBoxSizer(wxHORIZONTAL);
|
||||
auto m_split_options_line = new wxPanel(m_scroll_area, wxID_ANY);
|
||||
@@ -735,6 +743,8 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater)
|
||||
m_scroll_sizer->Add(m_change_filament_times_sizer, 0,wxLEFT|wxRIGHT, FromDIP(15));
|
||||
// m_scroll_sizer->Add(m_link_edit_nozzle, 0, wxLEFT|wxRIGHT, FromDIP(15));
|
||||
m_scroll_sizer->Add(suggestion_sizer, 0, wxLEFT|wxRIGHT|wxEXPAND, FromDIP(15));
|
||||
m_scroll_sizer->Add(0, 0, 0, wxTOP, FromDIP(10));
|
||||
m_scroll_sizer->Add(m_warn_when_drying_sizer, 0, wxLEFT|wxRIGHT, FromDIP(15));
|
||||
m_scroll_sizer->Add(sizer_split_options, 1, wxEXPAND|wxLEFT|wxRIGHT, FromDIP(15));
|
||||
m_scroll_sizer->Add(0, 0, 0, wxTOP, FromDIP(10));
|
||||
m_scroll_sizer->Add(m_options_other, 0, wxEXPAND|wxLEFT|wxRIGHT, FromDIP(15));
|
||||
@@ -1734,6 +1744,47 @@ bool SelectMachineDialog::CheckErrorSyncNozzleMappingResultV0(MachineObject* obj
|
||||
return true;
|
||||
}
|
||||
|
||||
bool SelectMachineDialog::is_ams_drying(MachineObject* obj)
|
||||
{
|
||||
const auto& ams_list = obj->GetFilaSystem()->GetAmsList();
|
||||
for (auto ams = ams_list.begin(); ams != ams_list.end(); ams++) {
|
||||
if (ams->second->AmsIsDrying()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool SelectMachineDialog::is_selected_ams_drying(MachineObject* obj)
|
||||
{
|
||||
if (!obj) return false;
|
||||
|
||||
// If a UI material is selected, only when that material is mapped to an AMS
|
||||
// and that AMS is currently drying.
|
||||
for (const auto &kv : m_materialList) {
|
||||
Material *mat = kv.second;
|
||||
if (!mat || !mat->item) continue;
|
||||
if (!mat->item->m_selected) continue;
|
||||
|
||||
// find mapping entry for this material id
|
||||
for (const FilamentInfo &f : m_ams_mapping_result) {
|
||||
if (f.id != mat->id) continue;
|
||||
|
||||
if (f.ams_id.empty()) return false;
|
||||
|
||||
auto fila_system = obj->GetFilaSystem();
|
||||
if (!fila_system) return false;
|
||||
DevAms* dev_ams = fila_system->GetAmsById(f.ams_id);
|
||||
return (dev_ams && dev_ams->AmsIsDrying());
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void SelectMachineDialog::prepare(int print_plate_idx)
|
||||
{
|
||||
m_print_plate_idx = print_plate_idx;
|
||||
@@ -3888,6 +3939,16 @@ void SelectMachineDialog::update_show_status(MachineObject* obj_)
|
||||
m_check_ext_change_assist->Enable(false);
|
||||
}
|
||||
|
||||
{
|
||||
const bool show_warn_when_drying = is_selected_ams_drying(obj_);
|
||||
const bool is_currently_shown = (m_txt_warn_when_drying != nullptr) ? m_txt_warn_when_drying->IsShown() : false;
|
||||
if (is_currently_shown != show_warn_when_drying) {
|
||||
m_warn_when_drying_sizer->Show(show_warn_when_drying);
|
||||
Layout();
|
||||
Fit();
|
||||
}
|
||||
}
|
||||
|
||||
/*reading done*/
|
||||
if (wxGetApp().app_config) {
|
||||
if (obj_->upgrade_force_upgrade) {
|
||||
@@ -4404,6 +4465,7 @@ void SelectMachineDialog::set_default()
|
||||
m_mapping_sugs_sizer->Show(false);
|
||||
m_change_filament_times_sizer->Show(false);
|
||||
m_txt_change_filament_times->Show(false);
|
||||
m_warn_when_drying_sizer->Show(false);
|
||||
|
||||
// rset status bar
|
||||
m_status_bar->reset();
|
||||
@@ -4513,6 +4575,10 @@ void SelectMachineDialog::reset_and_sync_ams_list()
|
||||
m_filaments_map = wxGetApp().plater()->get_partplate_list().get_curr_plate()->get_real_filament_maps(project_config);
|
||||
}
|
||||
|
||||
bool selected_any = false;
|
||||
MaterialItem *first_enabled = nullptr;
|
||||
int first_enabled_id = -1;
|
||||
|
||||
for (auto i = 0; i < extruders.size(); i++) {
|
||||
auto extruder = extruders[i] - 1;
|
||||
auto colour = wxGetApp().preset_bundle->project_config.opt_string("filament_colour", (unsigned int) extruder);
|
||||
@@ -4542,7 +4608,20 @@ void SelectMachineDialog::reset_and_sync_ams_list()
|
||||
item = new MaterialItem(m_filament_panel, colour_rgb, _L(display_materials[extruder]));
|
||||
m_sizer_ams_mapping->Add(item, 0, wxALL, FromDIP(5));
|
||||
}
|
||||
|
||||
if (!item) continue;
|
||||
|
||||
item->SetToolTip(m_ams_tooltip);
|
||||
|
||||
if (!selected_any && extruder == m_current_filament_id && item->m_enable) {
|
||||
item->on_selected();
|
||||
selected_any = true;
|
||||
}
|
||||
if (!first_enabled && item->m_enable) {
|
||||
first_enabled = item;
|
||||
first_enabled_id = extruder;
|
||||
}
|
||||
|
||||
item->Bind(wxEVT_LEFT_UP, [this, item, materials, extruder](wxMouseEvent &e) {});
|
||||
item->Bind(wxEVT_LEFT_DOWN, [this, item, materials, extruder](wxMouseEvent &e) {
|
||||
if (!item->m_enable) {return;}
|
||||
@@ -4621,6 +4700,11 @@ void SelectMachineDialog::reset_and_sync_ams_list()
|
||||
}
|
||||
}
|
||||
|
||||
if (!selected_any && first_enabled) {
|
||||
m_current_filament_id = first_enabled_id;
|
||||
first_enabled->on_selected();
|
||||
}
|
||||
|
||||
if (use_double_extruder)
|
||||
{
|
||||
m_filament_left_panel->Show();
|
||||
@@ -5031,6 +5115,10 @@ void SelectMachineDialog::set_default_from_sdcard()
|
||||
m_materialList.clear();
|
||||
m_filaments.clear();
|
||||
|
||||
bool selected_any = false;
|
||||
MaterialItem *first_enabled = nullptr;
|
||||
int first_enabled_id = -1;
|
||||
|
||||
for (auto i = 0; i < m_required_data_plate_data_list[m_print_plate_idx]->slice_filaments_info.size(); i++) {
|
||||
FilamentInfo fo = m_required_data_plate_data_list[m_print_plate_idx]->slice_filaments_info[i];
|
||||
|
||||
@@ -5053,6 +5141,17 @@ void SelectMachineDialog::set_default_from_sdcard()
|
||||
m_sizer_ams_mapping->Add(item, 0, wxALL, FromDIP(5));
|
||||
}
|
||||
|
||||
if (!item) continue;
|
||||
|
||||
if (!selected_any && fo.id == m_current_filament_id && item->m_enable) {
|
||||
item->on_selected();
|
||||
selected_any = true;
|
||||
}
|
||||
if (!first_enabled && item->m_enable) {
|
||||
first_enabled = item;
|
||||
first_enabled_id = fo.id;
|
||||
}
|
||||
|
||||
item->Bind(wxEVT_LEFT_UP, [this, item, materials](wxMouseEvent& e) {});
|
||||
item->Bind(wxEVT_LEFT_DOWN, [this, obj_, item, materials, diameters_count, fo](wxMouseEvent& e) {
|
||||
if (!item->m_enable) {return;}
|
||||
@@ -5129,6 +5228,11 @@ void SelectMachineDialog::set_default_from_sdcard()
|
||||
wxSize screenSize = wxGetDisplaySize();
|
||||
auto dialogSize = this->GetSize();
|
||||
|
||||
if (!selected_any && first_enabled) {
|
||||
m_current_filament_id = first_enabled_id;
|
||||
first_enabled->on_selected();
|
||||
}
|
||||
|
||||
reset_ams_material();
|
||||
|
||||
// basic info
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
|
||||
#include "boost/bimap/bimap.hpp"
|
||||
#include "AmsMappingPopup.hpp"
|
||||
#include "GUI_ObjectLayers.hpp"
|
||||
#include "ReleaseNote.hpp"
|
||||
#include "GUI_Utils.hpp"
|
||||
#include "wxExtensions.hpp"
|
||||
@@ -354,6 +355,7 @@ protected:
|
||||
wxBoxSizer* m_sizer_autorefill{ nullptr };
|
||||
wxBoxSizer* m_mapping_sugs_sizer{ nullptr };
|
||||
wxBoxSizer* m_change_filament_times_sizer{ nullptr };
|
||||
wxBoxSizer* m_warn_when_drying_sizer{ nullptr };
|
||||
Button* m_button_ensure{ nullptr };
|
||||
wxStaticBitmap * m_rename_button{nullptr};
|
||||
wxStaticBitmap* m_staticbitmap{ nullptr };
|
||||
@@ -387,6 +389,8 @@ protected:
|
||||
CheckBox* m_check_ext_change_assist{ nullptr };
|
||||
Label* m_label_ext_change_assist{ nullptr };
|
||||
|
||||
Label* m_txt_warn_when_drying{ nullptr };
|
||||
|
||||
PrinterInfoBox* m_printer_box { nullptr};
|
||||
PrinterMsgPanel * m_text_printer_msg{nullptr};
|
||||
Label* m_text_printer_msg_tips{ nullptr };
|
||||
@@ -542,6 +546,9 @@ public:
|
||||
bool CheckErrorDynamicSwitchNozzle(MachineObject* obj_);
|
||||
void on_flow_cali_option_changed();
|
||||
|
||||
bool is_ams_drying(MachineObject* obj);
|
||||
bool is_selected_ams_drying(MachineObject* obj);
|
||||
|
||||
PrintFromType get_print_type() {return m_print_type;};
|
||||
wxString format_steel_name(NozzleType type);
|
||||
PrintDialogStatus get_status() { return m_print_status; }
|
||||
|
||||
@@ -3392,6 +3392,7 @@ void StatusPanel::update_ams(MachineObject *obj)
|
||||
|
||||
// must select a current can
|
||||
m_ams_control->UpdateAms(obj->get_printer_series_str(), obj->printer_type, ams_info, ext_info, *obj->GetExtderSystem(), obj->get_dev_id(), false);
|
||||
m_ams_control->UpdateAmsDryControl(obj);
|
||||
|
||||
last_tray_exist_bits = obj->tray_exist_bits;
|
||||
last_ams_exist_bits = obj->ams_exist_bits;
|
||||
|
||||
@@ -31,6 +31,7 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons
|
||||
, m_Humidity_tip_popup(AmsHumidityTipPopup(this))
|
||||
, m_percent_humidity_dry_popup(new uiAmsPercentHumidityDryPopup(this))
|
||||
, m_ams_introduce_popup(AmsIntroducePopup(this))
|
||||
, m_ams_dry_ctr_win(new AMSDryCtrWin(this))
|
||||
{
|
||||
Slic3r::DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager();
|
||||
if (dev) {
|
||||
@@ -252,6 +253,12 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons
|
||||
uiAmsHumidityInfo *info = (uiAmsHumidityInfo *) evt.GetClientData();
|
||||
if (info)
|
||||
{
|
||||
Slic3r::DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager();
|
||||
MachineObject *obj = nullptr;
|
||||
if (dev) {
|
||||
obj = dev->get_selected_machine();
|
||||
}
|
||||
|
||||
if (info->ams_type == AMSModel::GENERIC_AMS)
|
||||
{
|
||||
wxPoint img_pos = ClientToScreen(wxPoint(0, 0));
|
||||
@@ -261,9 +268,14 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons
|
||||
int humidity_value = info->humidity_display_idx;
|
||||
if (humidity_value > 0 && humidity_value <= 5) { m_Humidity_tip_popup.set_humidity_level(humidity_value); }
|
||||
m_Humidity_tip_popup.Popup();
|
||||
}
|
||||
else
|
||||
{
|
||||
} else if (obj && obj->is_support_remote_dry && (info->ams_type == AMSModel::N3F_AMS || info->ams_type == AMSModel::N3S_AMS)){
|
||||
m_ams_dry_ctr_win->set_ams_id(info->ams_id);
|
||||
|
||||
wxPoint img_pos = ClientToScreen(wxPoint(0, 0));
|
||||
wxPoint popup_pos(img_pos.x - m_ams_dry_ctr_win->GetSize().GetWidth() + FromDIP(150), img_pos.y - FromDIP(80));
|
||||
m_ams_dry_ctr_win->Move(popup_pos);
|
||||
m_ams_dry_ctr_win->ShowModal();
|
||||
} else {
|
||||
m_percent_humidity_dry_popup->Update(info);
|
||||
|
||||
wxPoint img_pos = ClientToScreen(wxPoint(0, 0));
|
||||
@@ -283,7 +295,12 @@ void AMSControl::on_retry()
|
||||
post_event(wxCommandEvent(EVT_AMS_RETRY));
|
||||
}
|
||||
|
||||
AMSControl::~AMSControl() {}
|
||||
AMSControl::~AMSControl()
|
||||
{
|
||||
if (m_ams_dry_ctr_win) {
|
||||
delete m_ams_dry_ctr_win;
|
||||
}
|
||||
}
|
||||
|
||||
std::string AMSControl::GetCurentAms() {
|
||||
return m_current_ams;
|
||||
@@ -501,6 +518,10 @@ void AMSControl::msw_rescale()
|
||||
m_percent_humidity_dry_popup->msw_rescale();
|
||||
}
|
||||
|
||||
if (m_ams_dry_ctr_win) {
|
||||
m_ams_dry_ctr_win->msw_rescale();
|
||||
}
|
||||
|
||||
m_Humidity_tip_popup.msw_rescale();
|
||||
|
||||
Layout();
|
||||
@@ -824,6 +845,27 @@ void AMSControl::show_vams_kn_value(bool show)
|
||||
//m_vams_lib->show_kn_value(show);
|
||||
}
|
||||
|
||||
void AMSControl::UpdateAmsDryControl(MachineObject* obj)
|
||||
{
|
||||
if (!m_ams_dry_ctr_win->IsShown()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!obj || !obj->GetFilaSystem()) {
|
||||
m_ams_dry_ctr_win->Close();
|
||||
return;
|
||||
}
|
||||
|
||||
std::weak_ptr<DevFilaSystem> weak_fila_system = obj->GetFilaSystem();
|
||||
|
||||
if (auto locaked_fila_system = weak_fila_system.lock()) {
|
||||
m_ams_dry_ctr_win->update(locaked_fila_system, obj);
|
||||
} else {
|
||||
m_ams_dry_ctr_win->Close();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<AMSinfo> AMSControl::GenerateSimulateData() {
|
||||
auto caninfo0_0 = Caninfo{ "0", (""), *wxRED, AMSCanType::AMS_CAN_TYPE_VIRTUAL };
|
||||
auto caninfo0_1 = Caninfo{ "1", (""), *wxGREEN, AMSCanType::AMS_CAN_TYPE_VIRTUAL };
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
#include <tuple>
|
||||
|
||||
#include "slic3r/GUI/DeviceCore/DevExtruderSystem.h"
|
||||
#include "slic3r/GUI/AMSDryControl.hpp"
|
||||
|
||||
|
||||
namespace Slic3r { namespace GUI {
|
||||
@@ -127,6 +128,7 @@ protected:
|
||||
|
||||
AmsHumidityTipPopup m_Humidity_tip_popup;
|
||||
uiAmsPercentHumidityDryPopup* m_percent_humidity_dry_popup;
|
||||
AMSDryCtrWin* m_ams_dry_ctr_win;
|
||||
|
||||
std::string m_last_ams_id = "";
|
||||
std::string m_last_tray_id = "";
|
||||
@@ -170,6 +172,7 @@ public:
|
||||
void CreateAmsDoubleNozzle(const std::string &series_name, const std::string& printer_type);
|
||||
void CreateAmsSingleNozzle(const std::string &series_name, const std::string &printer_type);
|
||||
void ClearAms();
|
||||
void UpdateAmsDryControl(MachineObject* obj);
|
||||
void UpdateAms(const std::string &series_name,
|
||||
const std::string &printer_type,
|
||||
std::vector<AMSinfo> ams_info,
|
||||
|
||||
@@ -536,7 +536,7 @@ void MoonrakerPrinterAgent::build_ams_payload(int ams_count, int max_lane_index,
|
||||
print_json["ams"] = ams_json;
|
||||
|
||||
// Call the parser to populate DevFilaSystem
|
||||
DevFilaSystemParser::ParseV1_0(print_json, obj, obj->GetFilaSystem(), false);
|
||||
DevFilaSystemParser::ParseV1_0(print_json, obj, obj->GetFilaSystem().get(), false);
|
||||
BOOST_LOG_TRIVIAL(info) << "MoonrakerPrinterAgent::build_ams_payload: Parsed " << trays.size() << " trays";
|
||||
|
||||
// Set printer_type so update_sync_status() can match it against the preset's printer type.
|
||||
|
||||