From a19b41c65026020286810d4d53b57ad40bc6d96a Mon Sep 17 00:00:00 2001 From: QIDI TECH <893239786@qq.com> Date: Wed, 26 Feb 2025 20:25:18 +0800 Subject: [PATCH] fix some bug --- BuildLinux.sh | 23 ++- DockerBuild.sh | 2 +- DockerEntrypoint.sh | 81 ++++++++++ DockerRun.sh | 16 +- Dockerfile | 69 +++++++-- qdt/i18n/de/QIDIStudio_de.po | 8 +- resources/i18n/de/QIDIStudio.mo | Bin 392799 -> 392793 bytes src/.vscode/settings.json | 104 +++++++++++++ src/CMakeLists.txt | 4 + src/QIDIStudio.cpp | 237 ++++++++++++++++++++++++++---- src/libslic3r/Format/qds_3mf.cpp | 2 +- src/slic3r/GUI/GUI_App.cpp | 10 +- src/slic3r/GUI/MainFrame.cpp | 10 +- src/slic3r/GUI/Plater.cpp | 10 +- src/slic3r/GUI/SelectMachine.cpp | 2 +- src/slic3r/GUI/WebViewDialog.cpp | 8 +- src/slic3r/Utils/NetworkAgent.cpp | 4 +- 17 files changed, 511 insertions(+), 79 deletions(-) create mode 100644 DockerEntrypoint.sh create mode 100644 src/.vscode/settings.json diff --git a/BuildLinux.sh b/BuildLinux.sh index 0860905..59e7d3c 100644 --- a/BuildLinux.sh +++ b/BuildLinux.sh @@ -84,17 +84,26 @@ fi DISTRIBUTION=$(awk -F= '/^ID=/ {print $2}' /etc/os-release) VERSION=$(awk -F= '/^VERSION_ID=/ {print $2}' /etc/os-release) -# treat ubuntu as debian -if [ "${DISTRIBUTION}" == "ubuntu" ] -then - DISTRIBUTION="debian" -fi -if [ ! -f ./linux.d/${DISTRIBUTION} ] +# OSLIKE is a space-delineated list of similar distributions +OSLIKE=$(awk -F= '/^ID_LIKE=/ {print $2}' /etc/os-release | tr -d '"') + +# Iterate over a list of candidate distribution targets, first match is used +for CANDIDATE in ${DISTRIBUTION} ${OSLIKE}; do + if [ -f ./linux.d/${CANDIDATE} ] + then + TARGET_DISTRO="${CANDIDATE}" + break + fi +done + +if [ -z ${TARGET_DISTRO} ] then echo "Your distribution does not appear to be currently supported by these build scripts" exit 1 fi -source ./linux.d/${DISTRIBUTION} + +echo "OS distribution is '${DISTRIBUTION}'. Using package dependencies for '${TARGET_DISTRO}'." +source ./linux.d/${TARGET_DISTRO} echo "FOUND_GTK3=${FOUND_GTK3}" if [[ -z "${FOUND_GTK3_DEV}" ]] diff --git a/DockerBuild.sh b/DockerBuild.sh index d44dcb6..3c98eda 100644 --- a/DockerBuild.sh +++ b/DockerBuild.sh @@ -9,7 +9,7 @@ set -x # the simplicity of a single Docker image and a one-time compilation # seems better. docker build -t qidistudio \ - --build-arg USER=$USER \ + --build-arg USER=${USER:-root} \ --build-arg UID=$(id -u) \ --build-arg GID=$(id -g) \ $PROJECT_ROOT diff --git a/DockerEntrypoint.sh b/DockerEntrypoint.sh new file mode 100644 index 0000000..738489a --- /dev/null +++ b/DockerEntrypoint.sh @@ -0,0 +1,81 @@ +#!/bin/bash + +# Entrypoint script to create an out-of-the-box experience for QIDIStudio. +# Perform some initial setup if none was done previously. +# It is not necessary if you know what you are doing. Feel free to go +# to the Dockerfile and switch the entrypoint to the QIDIStudio binary. + +# Check if the current effective user is root + +if [ "$EUID" -eq 0 ]; then + echo "No User specified at build time." + if [ -z "$RUN_USER" ] || [ -z "$RUN_UID" ] || [ -z "$RUN_GID" ] || [ "$RUN_UID" -eq 0 ]; then + echo "At least one of RUN_USER, RUN_UID, or RUN_GID is unset. Or 'root' was requested." + echo "Running as root" + + if [ "$HOME" != "/root" ]; then + if [ ! -d "/root" ]; then + mkdir /root + chown root:root /root + chmod 700 /root + fi + fi + + export HOME="/root" + EXEC_USER="root" + else + echo "Setting up a new user" + + # Check if there is a already a valid user entry for the passed UID, if not create one + if [ -z "$(getent passwd "$RUN_UID" | cut -d: -f1)" ]; then + #GID=$(id -g) + echo "User specified at runtime. Performing setup." + groupadd -g "$RUN_GID" "$RUN_USER" + useradd -u "$RUN_UID" -g "$RUN_GID" -d "/home/$RUN_USER" "$RUN_USER" + usermod -aG sudo "$RUN_USER" + passwd -d "$RUN_USER" + + #This will take forever to run, so we will just chown the build folder which contains the binaries + #chown -R "$RUN_UID":"$RUN_GID" /QIDIStudio + chown "$RUN_UID":"$RUN_GID" /QIDIStudio + chown -R "$RUN_UID":"$RUN_GID" /QIDIStudio/build + + + export HOME="/home/$RUN_USER" + EXEC_USER="$RUN_USER" + fi + fi +else + echo "User specified at build time." + CURRENT_USER=$(id -un) + if [ -n "$RUN_USER" ] && [ -n "$RUN_UID" ] && [ -n "$RUN_GID" ] && [ "$RUN_UID" -ne "$EUID" ]; then + echo "New User config passed at Runtime. Setting up." + if [ -z "$(getent passwd "$RUN_UID" | cut -d: -f1)" ]; then + sudo groupadd -g "$RUN_UID" "$RUN_USER" + sudo useradd -u "$RUN_UID" -g "$RUN_GID" -d "/home/$RUN_USER" "$RUN_USER" + sudo usermod -aG sudo "$RUN_USER" + passwd -d "$RUN_USER" + + #sudo chown -R "$RUN_UID":"$RUN_GID" /QIDIStudio + chown "$RUN_UID":"$RUN_GID" /QIDIStudio + chown -R "$RUN_UID":"$RUN_GID" /QIDIStudio/build + + export HOME="/home/$RUN_USER" + EXEC_USER="$RUN_USER" + fi + else + echo "Using Build time user." + EXEC_USER="$CURRENT_USER" + #It should've been set in Dockerfile, but just in case, uncomment this it there is problem + #export HOME="/home/$USER" + fi +fi + +# make sure ~/.config folder exists so QIDI Studio will start +if [ ! -d "$HOME/.config" ]; then + mkdir -p "$HOME/.config" +fi + +# Using su $USER -c will retain all the important ENV args when qidi Studio starts in a different shell +# Continue with QIDI Studio using correct user, passing all arguments +exec su "$EXEC_USER" -c "/QIDIStudio/build/package/bin/qidi-studio $*" diff --git a/DockerRun.sh b/DockerRun.sh index aa10e6d..6ed871f 100644 --- a/DockerRun.sh +++ b/DockerRun.sh @@ -5,15 +5,24 @@ set -x # -h $HOSTNAME \ # If there's problems with the X display, try this # -v /tmp/.X11-unix:/tmp/.X11-unix \ +# or +# -v $HOME/.Xauthority:/root/.Xauthority \ +# You also need to run "xhost +" on your host system +# QIDI Studio also require the parent directory for the configuration directory to be present to start +# to prevent your local machines's QIDI studio config passed to docker container when you map your home directory, add: +# -v :SHOME/.config/QIDIStudio +set -x docker run \ `# Use the hosts networking. Printer wifi and also dbus communication` \ --net=host \ `# Some X installs will not have permissions to talk to sockets for shared memory` \ --ipc host \ - `# Run as your workstations username to keep permissions the same` \ - -u $USER \ `# Bind mount your home directory into the container for loading/saving files` \ - -v $HOME:/home/$USER \ + -v $HOME:$HOME \ + `# Pass some X Auth file to allow x11 to connect to your host x instance` \ + -v $HOME/.Xauthority:/tmp/.Xauthority \ + -v /tmp/.X11-unix:/tmp/.X11-unix \ + -e XAUTHORITY=/tmp/.Xauthority \ `# Pass the X display number to the container` \ -e DISPLAY=$DISPLAY \ `# It seems that libGL and dbus things need privileged mode` \ @@ -24,4 +33,3 @@ docker run \ --rm \ `# Pass all parameters from this script to the qidi ENTRYPOINT binary` \ qidistudio $* - diff --git a/Dockerfile b/Dockerfile index 3649c75..9c8d9c1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,4 @@ -FROM docker.io/ubuntu:22.04 -LABEL maintainer "DeftDawg " +FROM docker.io/ubuntu:24.10 # Disable interactive package configuration RUN apt-get update && \ @@ -14,6 +13,7 @@ RUN apt-get update && apt-get install -y \ build-essential \ cmake \ curl \ + xvfb \ eglexternalplatform-dev \ extra-cmake-modules \ file \ @@ -39,7 +39,6 @@ RUN apt-get update && apt-get install -y \ libssl-dev \ libudev-dev \ libwayland-dev \ - libwebkit2gtk-4.0-dev \ libxkbcommon-dev \ locales \ locales-all \ @@ -47,6 +46,7 @@ RUN apt-get update && apt-get install -y \ pkgconf \ sudo \ wayland-protocols \ + libwebkit2gtk-4.1-dev \ wget # Change your locale here if you want. See the output @@ -58,14 +58,52 @@ RUN locale-gen $LC_ALL # the CA cert path on every startup ENV SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt -COPY ./ QIDIStudio +COPY ./ /QIDIStudio -WORKDIR QIDIStudio +RUN chmod +x /QIDIStudio/DockerEntrypoint.sh -# These can run together, but we run them seperate for podman caching -# Update System dependencies +WORKDIR /QIDIStudio + +# Ubuntu 24 Docker Image now come with default standard user "ubuntu" +# It might conflict with your mapped user, remove if user ubuntu exist +RUN if id "ubuntu" >/dev/null 2>&1; then userdel -r ubuntu; fi + + +# Use bash as the shell + +# Set ARG values +# If user was passed from build it will create a user same +# as your workstation. Else it will use /root + +# Setting ARG at build time is convienient for testing purposes +# otherwise the same commands will be executed at runtime + +ARG USER=root +ARG UID=0 +ARG GID=0 +RUN if [ "$UID" != "0" ]; then \ + groupadd -g $GID $USER && \ + useradd -u $UID -g $GID -m -d /home/$USER $USER && \ + mkdir -p /home/$USER && \ + chown -R $UID:$GID /QIDIStudio && \ + usermod -aG sudo $USER && \ + passwd -d "$USER"; \ + else \ + mkdir -p /root/.config; \ + fi + +# Allow password-less sudo for ALL users +RUN echo "ALL ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/999-passwordless +RUN chmod 440 /etc/sudoers.d/999-passwordless + +# Update System dependencies(Run before user switch) RUN ./BuildLinux.sh -u +# Run as the mapped user (or root by default) +USER $USER + + +# These can run together, but we run them seperate for podman caching # Build dependencies in ./deps RUN ./BuildLinux.sh -d @@ -73,7 +111,7 @@ RUN ./BuildLinux.sh -d RUN ./BuildLinux.sh -s # Build AppImage -ENV container podman +ENV container=podman RUN ./BuildLinux.sh -i # It's easier to run QIDI Studio as the same username, @@ -82,13 +120,14 @@ RUN ./BuildLinux.sh -i # to keep permissions the same. Just in case, defaults # are root. SHELL ["/bin/bash", "-l", "-c"] -ARG USER=root -ARG UID=0 -ARG GID=0 -RUN [[ "$UID" != "0" ]] \ - && groupadd -f -g $GID $USER \ - && useradd -u $UID -g $GID $USER + +# Point FFMPEG Library search to the binary built upon QIDIStudio build time +ENV LD_LIBRARY_PATH=/QIDIStudio/build/package/bin # Using an entrypoint instead of CMD because the binary # accepts several command line arguments. -ENTRYPOINT ["/QIDIStudio/build/package/bin/qidi-studio"] +# entrypoint script will pass all arguments to QIDI-studio +# after the script finishes + +#ENTRYPOINT ["/QIDIStudio/build/package/bin/QIDI-studio"] +ENTRYPOINT ["/QIDIStudio/DockerEntrypoint.sh"] diff --git a/qdt/i18n/de/QIDIStudio_de.po b/qdt/i18n/de/QIDIStudio_de.po index 2d683da..0bed024 100644 --- a/qdt/i18n/de/QIDIStudio_de.po +++ b/qdt/i18n/de/QIDIStudio_de.po @@ -6814,16 +6814,16 @@ msgstr "Beschäftigt" msgid "QIDI Cool Plate" msgstr "QIDI Cool Plate" -msgid "Bamabu Engineering Plate" +msgid "QIDI Engineering Plate" msgstr "QIDI Engineering Plate" -msgid "Bamabu Smooth PEI Plate" +msgid "QIDI Smooth PEI Plate" msgstr "QIDI Smooth PEI Plate" msgid "High temperature Plate" msgstr "High temperature Plate" -msgid "Bamabu Textured PEI Plate" +msgid "QIDI Textured PEI Plate" msgstr "QIDI Textured PEI Plate" msgid "QIDI Cool Plate SuperTack" @@ -14784,7 +14784,7 @@ msgstr "" #~ msgid "Backup interval" #~ msgstr "Sicherungsintervall" -#~ msgid "Bamabu High Temperature Plate" +#~ msgid "QIDI High Temperature Plate" #~ msgstr "QIDI High Temperature Plate" #~ msgid "" diff --git a/resources/i18n/de/QIDIStudio.mo b/resources/i18n/de/QIDIStudio.mo index 04fad1ebfd103c5db05bac3109309681b43f0ca1..31b2540a5daf747cdc17db59b1b9b7b7381b8860 100644 GIT binary patch delta 66902 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
ddeP~$E-CSez|B{ z$rD5ggRx!2{LN^-4-6ZJ^e97c&Wzz=Z&)m9%Zcv{8+SY~Hu)Vh-_skL8SBV*&v- z5-ePrQP3%pf3%8EIHa%%>fo4NMZ=98hNQ1uz) zbxj8hYSEqzHS_5aD-9&DD9A~|D88Q2(In2j}-xa;W8VeX$;ynifD zed7pJliGI^U<>0z7`&oi%Dfun8fT>SFktU|q3mK?@-08t=@w&LGz{)T_MP=oV>4T1jH|Cx_jXWJHuCBuX|opSc<6 z2HT9Gb}5s+{_&id+{>6wN|m!nSc4?_88;@>Tg*m~DO_4%Q<4ykSY;5(+Ke+|zm3)z z+p)HkC)S~WO{3u~{QR(+PQ140E8!~{idGx84^FGkWuy)Ifiiy@6CA5 zlnDdqM#rQBe%Yx}a>?uO?+h$Zh0y&Nwt}%R^M@DhF1#VqD-L5K`u{7jyv_Zc0aY#& zEen+$BXK-3bj5B0oJELBxJSV?4s++wHy~6L!b@gq73inZ9^(H2`%~V%RFtH@-MBQe zBh*V=wi4#8_bnMa?O@4)sAHmfhG{;sJjeSUBniAl0{9ZKDsD4v=%%TU}kM$x$#C&PY_wM)YI4f&qg8X7V;B|LsqM_I>l2LDmiDhiMsz_>HU zP0(*8U{Z7)BP<{_Iu~>M>}JTPwl_&aXHfEz!{Df>yv=1CtW1Z0fd@ zHxqRkc#B9SSxSD)3s6Zi!mP7)m#Ah8HVp{-j<(UehA{3tc6F06m)x+$G{kiv<9_J% z*R{^tN_kOP`Wkltor$!u zB#2M#6_{*K{b@1&%htY|`C2GN`i^AlEgEyk0>3mYfsE_ zR^K1ry!vh`Z!4uO@aWihqkLJ&Tldw~Ncd_#fgt!R8`ur`@!5%$LRf z1anQ%*T$#1^^t!@{K{i{o7(=N|AV%GHU1(`ExWNL;eMyX+cMCZ&^c*q-#};F+#}Cd za&A3e$?tetZ=Q*f0=@IP`BjhGsY{oh?SiY9sSsSfWAmP^y^p*3t@AdY7%9QXDc$|H zPU#+LUb2zBCPv!YYhvW1EsbB%_mOKQtWlwKh2UEM*L%|Y$a}qE6C))aS>r?Gtu;Ql H;>7rW+F}T_ delta 66913 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 cli_errors = { {CLI_FILAMENT_UNPRINTABLE_ON_FIRST_LAYER, "Found some filament unprintable at first layer on current Plate. Please make sure the 3mf file can be successfully sliced with the same Plate type in the latest QIDI Studio."} }; +typedef struct _object_info{ + int id{0}; + std::string name; + size_t triangle_count{0}; + float bbox_x; + float bbox_y; + float bbox_z; + float bbox_width; + float bbox_depth; + float bbox_height; +}object_info_t; + +typedef struct _filament_info{ + int id{0}; + std::string filament_id; + float total_used_g {0.f}; + float main_used_g {0.f}; +}filament_info_t; + typedef struct _sliced_plate_info{ int plate_id{0}; size_t sliced_time {0}; @@ -159,6 +178,14 @@ typedef struct _sliced_plate_info{ size_t generate_support_material_time {0}; size_t triangle_count{0}; std::string warning_message; + + float total_predication{0.f}; + float main_predication{0.f}; + int filament_change_times {0}; + int layer_filament_change {0}; + + std::vector objects; + std::vector filaments; }sliced_plate_info_t; typedef struct _sliced_info { @@ -170,6 +197,7 @@ typedef struct _sliced_info { size_t export_time; std::vector upward_machines; std::vector downward_machines; + std::vector upward_compatibility_taint; }sliced_info_t; std::vector g_slicing_warnings; @@ -422,6 +450,8 @@ void record_exit_reson(std::string outputdir, int code, int plate_id, std::strin j["downward_compatible_machine"] = sliced_info.downward_machines; if (sliced_info.upward_machines.size() > 0) j["upward_compatible_machine"] = sliced_info.upward_machines; + if (sliced_info.upward_compatibility_taint.size() > 0) + j["upward_compatibility_taint"] = sliced_info.upward_compatibility_taint; j["plate_index"] = plate_id; j["return_code"] = code; j["error_string"] = error_message; @@ -430,16 +460,64 @@ void record_exit_reson(std::string outputdir, int code, int plate_id, std::strin for (size_t index = 0; index < sliced_info.sliced_plates.size(); index++) { json plate_json; - plate_json["id"] = sliced_info.sliced_plates[index].plate_id; - plate_json["sliced_time"] = sliced_info.sliced_plates[index].sliced_time; - plate_json["sliced_time_with_cache"] = sliced_info.sliced_plates[index].sliced_time_with_cache; - //1.9.5 - plate_json["make_perimeters_time"] = sliced_info.sliced_plates[index].make_perimeters_time; - plate_json["infill_time"] = sliced_info.sliced_plates[index].infill_time; - plate_json["generate_support_material_time"] = sliced_info.sliced_plates[index].generate_support_material_time; - plate_json["triangle_count"] = sliced_info.sliced_plates[index].triangle_count; - plate_json["warning_message"] = sliced_info.sliced_plates[index].warning_message; - j["sliced_plates"].push_back(plate_json); + sliced_plate_info_t& sliced_plate_info = sliced_info.sliced_plates[index]; + plate_json["id"] = sliced_plate_info.plate_id; + plate_json["sliced_time"] = sliced_plate_info.sliced_time; + plate_json["sliced_time_with_cache"] = sliced_plate_info.sliced_time_with_cache; + plate_json["make_perimeters_time"] = sliced_plate_info.make_perimeters_time; + plate_json["infill_time"] = sliced_plate_info.infill_time; + plate_json["generate_support_material_time"] = sliced_plate_info.generate_support_material_time; + plate_json["triangle_count"] = sliced_plate_info.triangle_count; + plate_json["warning_message"] = sliced_plate_info.warning_message; + + plate_json["total_predication"] = sliced_plate_info.total_predication; + plate_json["main_predication"] = sliced_plate_info.main_predication; + plate_json["filament_change_times"] = sliced_plate_info.filament_change_times; + plate_json["layer_filament_change"] = sliced_plate_info.layer_filament_change; + + //object info + if (!sliced_plate_info.objects.empty()) + { + for (size_t j = 0; j < sliced_plate_info.objects.size(); j++) + { + json object_json; + object_info_t& object = sliced_plate_info.objects[j]; + + object_json["id"] = object.id; + object_json["name"] = object.name; + object_json["triangle_count"] = object.triangle_count; + + json bbox_json; + bbox_json["x"] = object.bbox_x; + bbox_json["y"] = object.bbox_y; + bbox_json["z"] = object.bbox_z; + bbox_json["width"] = object.bbox_width; + bbox_json["depth"] = object.bbox_depth; + bbox_json["height"] = object.bbox_height; + object_json["bbox"] = bbox_json; + + plate_json["objects"].push_back(std::move(object_json)); + } + } + + //filament info + if (!sliced_plate_info.filaments.empty()) + { + for (size_t j = 0; j < sliced_plate_info.filaments.size(); j++) + { + json filament_json; + filament_info_t& filament = sliced_plate_info.filaments[j]; + + filament_json["id"] = filament.id; + filament_json["filament_id"] = filament.filament_id; + filament_json["total_used_g"] = filament.total_used_g; + filament_json["main_used_g"] = filament.main_used_g; + + plate_json["filaments"].push_back(std::move(filament_json)); + } + } + + j["sliced_plates"].push_back(std::move(plate_json)); } for (auto& iter: key_values) j[iter.first] = iter.second; @@ -1244,19 +1322,27 @@ int CLI::run(int argc, char **argv) /*BOOST_LOG_TRIVIAL(info) << "begin to setup params, argc=" << argc << std::endl; for (int index=0; index < argc; index++) BOOST_LOG_TRIVIAL(info) << "index="<< index <<", arg is "<< argv[index] <setup(debug_argc, debug_argv))*/ if (!this->setup(argc, argv)) @@ -3601,6 +3687,7 @@ int CLI::run(int argc, char **argv) } } + bool has_sequence_plates = false; int downward_check_size = downward_check_printers.size(); if (downward_check_size > 0) { @@ -3609,16 +3696,18 @@ int CLI::run(int argc, char **argv) int failed_count = 0; for (int index = 0; index < plate_count; index ++) { - if (failed_count == downward_check_size) { - BOOST_LOG_TRIVIAL(info) << boost::format("downward_check: all failed, size %1%")%downward_check_size; - break; - } Slic3r::GUI::PartPlate* cur_plate = (Slic3r::GUI::PartPlate *)partplate_list.get_plate(index); Vec3d size = plate_obj_size_infos[index].obj_bbox.size(); //1.9.7.52 bool is_sequence = false; get_print_sequence(cur_plate, m_print_config, is_sequence); + has_sequence_plates |= is_sequence; + + if (failed_count == downward_check_size) { + BOOST_LOG_TRIVIAL(info) << boost::format("downward_check: all failed, size %1%")%downward_check_size; + break; + } for (int index2 = 0; index2 < downward_check_size; index2 ++) { @@ -3698,6 +3787,18 @@ int CLI::run(int argc, char **argv) } } } + else if (downward_check) { + int plate_count = partplate_list.get_plate_count(); + for (int index = 0; index < plate_count; index ++) + { + Slic3r::GUI::PartPlate* cur_plate = (Slic3r::GUI::PartPlate *)partplate_list.get_plate(index); + bool is_sequence = false; + get_print_sequence(cur_plate, m_print_config, is_sequence); + has_sequence_plates |= is_sequence; + } + } + if (has_sequence_plates) + sliced_info.upward_compatibility_taint.push_back("PrintSequenceByObject"); // Loop through transform options. bool user_center_specified = false; @@ -5603,6 +5704,92 @@ int CLI::run(int argc, char **argv) sliced_plate_info.infill_time = slice_time[TIME_INFILL]; sliced_plate_info.generate_support_material_time = slice_time[TIME_GENERATE_SUPPORT]; + //get predication and filament change + PrintEstimatedStatistics& print_estimated_stat = gcode_result->print_statistics; + const PrintEstimatedStatistics::Mode& time_mode = print_estimated_stat.modes[static_cast(PrintEstimatedStatistics::ETimeMode::Normal)]; + auto it_wipe = std::find_if(time_mode.roles_times.begin(), time_mode.roles_times.end(), [](const std::pair& item) { return ExtrusionRole::erWipeTower == item.first; }); + sliced_plate_info.total_predication = time_mode.time; + sliced_plate_info.main_predication = time_mode.time - time_mode.prepare_time; + sliced_plate_info.filament_change_times = print_estimated_stat.total_filamentchanges; + if (it_wipe != time_mode.roles_times.end()) { + //filament changes time will be included in prime tower time later + //ConfigOptionFloat* machine_load_filament_time_opt = m_print_config.option("machine_load_filament_time"); + //ConfigOptionFloat* machine_unload_filament_time_opt = m_print_config.option("machine_unload_filament_time"); + sliced_plate_info.main_predication -= it_wipe->second; + //sliced_plate_info.main_predication -= sliced_plate_info.filament_change_times * (machine_load_filament_time_opt->value + machine_unload_filament_time_opt->value); + } + auto it_flush = std::find_if(time_mode.roles_times.begin(), time_mode.roles_times.end(), [](const std::pair& item) { return ExtrusionRole::erFlush == item.first; }); + if (it_flush != time_mode.roles_times.end()) { + sliced_plate_info.main_predication -= it_flush->second; + } + bool has_tool_change = false; + auto custom_gcodes_iter = model.plates_custom_gcodes.find(index); + if (custom_gcodes_iter != model.plates_custom_gcodes.end()) + { + CustomGCode::Info custom_gcodes = custom_gcodes_iter->second; + for (const Item& custom_gcode : custom_gcodes.gcodes) + if (custom_gcode.type == CustomGCode::ToolChange) { + has_tool_change = true; + break; + } + } + if (has_tool_change) + sliced_plate_info.layer_filament_change = print_estimated_stat.total_filamentchanges; + + //filaments + auto* filament_ids = dynamic_cast(m_print_config.option("filament_ids")); + std::vector filament_diameters = gcode_result->filament_diameters; + std::vector filament_densities = gcode_result->filament_densities; + + for (auto& iter : print_estimated_stat.total_volumes_per_extruder) + { + filament_info_t filament_info; + + filament_info.id = iter.first + 1; + filament_info.total_used_g = iter.second; + + if (filament_ids && (filament_info.id <= filament_ids->values.size())) + filament_info.filament_id = filament_ids->values[iter.first]; + else + filament_info.filament_id = "unknown"; + + auto main_iter = print_estimated_stat.model_volumes_per_extruder.find(iter.first); + if (main_iter != print_estimated_stat.model_volumes_per_extruder.end()) + filament_info.main_used_g = main_iter->second; + + auto support_iter = print_estimated_stat.support_volumes_per_extruder.find(iter.first); + if (support_iter != print_estimated_stat.support_volumes_per_extruder.end()) + filament_info.main_used_g += support_iter->second; + + double koef = 0.001; + //filament_info.main_used_m = koef * filament_info.main_used_m / (PI * sqr(0.5 * filament_diameters[filament_info.id])); + filament_info.main_used_g = koef * filament_info.main_used_g * filament_densities[iter.first]; + filament_info.total_used_g = koef * filament_info.total_used_g * filament_densities[iter.first]; + + sliced_plate_info.filaments.push_back(std::move(filament_info)); + } + + //objects + ModelObjectPtrs plate_objects = part_plate->get_objects_on_this_plate(); + for (ModelObject* object : plate_objects) + { + object_info_t object_info; + object_info.id = object->id().id; + object_info.name = object->name; + object_info.triangle_count = object->facets_count(); + + BoundingBoxf3 bbox_f = object->bounding_box(); + object_info.bbox_x = bbox_f.min.x(); + object_info.bbox_y = bbox_f.min.y(); + object_info.bbox_z = bbox_f.min.z(); + object_info.bbox_width = bbox_f.max.x() - object_info.bbox_x; + object_info.bbox_depth = bbox_f.max.y() - object_info.bbox_y; + object_info.bbox_height = bbox_f.max.z() - object_info.bbox_z; + + sliced_plate_info.objects.push_back(std::move(object_info)); + } + + if (max_slicing_time_per_plate != 0) { long long time_cost = end_time - start_time; //1.9.5 @@ -6687,8 +6874,8 @@ std::string CLI::output_filepath(const ModelObject &object, unsigned int index, // use --outputdir when available file_name = object.name.empty()?object.input_file:object.name; file_name = "obj_"+std::to_string(index)+"_"+file_name; - size_t pos = file_name.find_last_of(ext), ext_pos = file_name.size() - 1; - if (pos != ext_pos) + size_t pos = file_name.rfind(ext), ext_pos = file_name.size() - ext.size(); + if ((pos == std::string::npos) || (pos != ext_pos)) file_name += ext; BOOST_LOG_TRIVIAL(trace) << __FUNCTION__ << ": dir = "<< path_dir<<", file_name="<SetCornerRadius(0); // p->append_button(send_to_multi_app_btn); @@ -4031,15 +4031,15 @@ bool MainFrame::check_qdt_farm_client_installed() { #ifdef WIN32 HKEY hKey; - LONG result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Bambulab\\Bambu Farm Manager Client"), 0, KEY_READ, &hKey); - LONG result_backup = RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("HKEY_CLASSES_ROOT\\bambu-farm-client\\shell\\open\\command"), 0, KEY_READ, &hKey); + LONG result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\QIDITech\\QIDI Farm Manager Client"), 0, KEY_READ, &hKey); + LONG result_backup = RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("HKEY_CLASSES_ROOT\\qidi-farm-client\\shell\\open\\command"), 0, KEY_READ, &hKey); if (result == ERROR_SUCCESS || result_backup == ERROR_SUCCESS) { - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "Bambu Farm Manager Client found."; + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "QIDI Farm Manager Client found."; RegCloseKey(hKey); return true; } else { - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "Bambu Farm Manager Client Not found."; + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "QIDI Farm Manager Client Not found."; return false; } diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 9432c5f..e3e86d0 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -7599,8 +7599,8 @@ void Plater::priv::on_action_send_to_multi_app(SimpleEvent &) #ifdef WIN32 HKEY hKey; - LONG result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Bambulab\\Bambu Farm Manager Client"), 0, KEY_READ, &hKey); - LONG result_backup = RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("HKEY_CLASSES_ROOT\\bambu-farm-client\\shell\\open\\command"), 0, KEY_READ, &hKey); + LONG result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\QIDITech\\QIDI Farm Manager Client"), 0, KEY_READ, &hKey); + LONG result_backup = RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("HKEY_CLASSES_ROOT\\bqidi-farm-client\\shell\\open\\command"), 0, KEY_READ, &hKey); if (result == ERROR_SUCCESS || result_backup == ERROR_SUCCESS) { RegCloseKey(hKey); @@ -7624,14 +7624,14 @@ void Plater::priv::on_action_send_to_multi_app(SimpleEvent &) wxString filepath = wxString::FromUTF8(data._3mf_path.string()); filepath.Replace("\\", "/"); std::string filePath = "?version=v1.6.0&path=" + filepath.ToStdString() + "&name=" + filename.utf8_string(); - wxString url = "bambu-farm-client://upload-file" + Http::url_encode(filePath); + wxString url = "qidi-farm-client://upload-file" + Http::url_encode(filePath); if (!wxLaunchDefaultBrowser(url)) { - GUI::MessageDialog msgdialog(nullptr, _L("Failed to start Bambu Farm Manager Client."), "", wxAPPLY | wxOK); + GUI::MessageDialog msgdialog(nullptr, _L("Failed to start QIDI Farm Manager Client."), "", wxAPPLY | wxOK); msgdialog.ShowModal(); } } else { - GUI::MessageDialog msgdialog(nullptr, _L("No Bambu Farm Manager Client found."), "", wxAPPLY | wxOK); + GUI::MessageDialog msgdialog(nullptr, _L("No QIDI Farm Manager Client found."), "", wxAPPLY | wxOK); msgdialog.ShowModal(); } #endif // WIN32 diff --git a/src/slic3r/GUI/SelectMachine.cpp b/src/slic3r/GUI/SelectMachine.cpp index 8d98d24..a7cba67 100644 --- a/src/slic3r/GUI/SelectMachine.cpp +++ b/src/slic3r/GUI/SelectMachine.cpp @@ -904,7 +904,7 @@ static wxString MACHINE_BED_TYPE_STRING[BED_TYPE_COUNT] = { _L("QIDI Cool Plate"), _L("QIDI Engineering Plate"), _L("QIDI Smooth PEI Plate") + "/" + _L("High temperature Plate"), - _L("Bamabu Textured PEI Plate"), + _L("QIDI Textured PEI Plate"), _L("QIDI Cool Plate SuperTack") }; diff --git a/src/slic3r/GUI/WebViewDialog.cpp b/src/slic3r/GUI/WebViewDialog.cpp index cf0b482..f4bef52 100644 --- a/src/slic3r/GUI/WebViewDialog.cpp +++ b/src/slic3r/GUI/WebViewDialog.cpp @@ -812,9 +812,9 @@ void WebViewPanel::SetMakerlabUrl(std::string url) { auto host = wxGetApp().get_model_http_url(wxGetApp().app_config->get_country_code()); std::string LabUrl; if (url == "") - LabUrl = (boost::format("%1%makerlab?from=bambustudio") % host).str(); + LabUrl = (boost::format("%1%makerlab?from=qidistudio") % host).str(); else - LabUrl = (boost::format("%1%%2%?from=bambustudio") % host % url).str(); + LabUrl = (boost::format("%1%%2%?from=qidistudio") % host % url).str(); m_MakerLab_LastUrl = LabUrl; } @@ -1740,9 +1740,9 @@ void WebViewPanel::SwitchWebContent(std::string modelname, int refresh) std::string strRegion = wxGetApp().app_config->get_country_code(); wxString MakerSupplyUrl; if (strRegion == "CN") - MakerSupplyUrl = "https://bambulab.tmall.com/category-1761686934.htm?from=bambustudio"; + MakerSupplyUrl = "https://qiditech.tmall.com/category-1761686934.htm?from=qidistudio"; else - MakerSupplyUrl = "https://store.bambulab.com/collections/makers-supply?from=bambustudio"; + MakerSupplyUrl = "https://store.qiditech.com/collections/makers-supply?from=qidistudio"; wxLaunchDefaultBrowser(MakerSupplyUrl); } diff --git a/src/slic3r/Utils/NetworkAgent.cpp b/src/slic3r/Utils/NetworkAgent.cpp index fe7c4a9..3e2134a 100644 --- a/src/slic3r/Utils/NetworkAgent.cpp +++ b/src/slic3r/Utils/NetworkAgent.cpp @@ -276,8 +276,8 @@ int NetworkAgent::initialize_network_module(bool using_backup) connect_printer_ptr = reinterpret_cast(get_network_function("qidi_network_connect_printer")); disconnect_printer_ptr = reinterpret_cast(get_network_function("qidi_network_disconnect_printer")); send_message_to_printer_ptr = reinterpret_cast(get_network_function("qidi_network_send_message_to_printer")); - check_cert_ptr = reinterpret_cast(get_network_function("bambu_network_update_cert")); - install_device_cert_ptr = reinterpret_cast(get_network_function("bambu_network_install_device_cert")); + check_cert_ptr = reinterpret_cast(get_network_function("qidi_network_update_cert")); + install_device_cert_ptr = reinterpret_cast(get_network_function("qidi_network_install_device_cert")); start_discovery_ptr = reinterpret_cast(get_network_function("qidi_network_start_discovery")); change_user_ptr = reinterpret_cast(get_network_function("qidi_network_change_user")); is_user_login_ptr = reinterpret_cast(get_network_function("qidi_network_is_user_login"));