diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 4e841c04bb..cc0f856acb 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,2 +1,2 @@ -ARG BASE_IMAGE -FROM ${BASE_IMAGE} +ARG BASE_IMAGE +FROM ${BASE_IMAGE} \ No newline at end of file diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 07d6a4b0d0..80e48691ea 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,14 +1,14 @@ { "name": "OrcaSlicer", "build": { - "dockerfile": "Dockerfile", - "args": { - "PLATFORM": "linux/amd64", - "BASE_IMAGE": "mcr.microsoft.com/devcontainers/cpp:ubuntu-20.04" - }, - "options": ["--platform=linux/amd64"] + "dockerfile": "Dockerfile", + "args": { + "PLATFORM": "linux/amd64", + "BASE_IMAGE": "mcr.microsoft.com/devcontainers/cpp:ubuntu-22.04" + }, + "options": ["--platform=linux/amd64"] }, - "runArgs": ["--env-file", "/tmp/devcontainer.env"], + "runArgs": ["--env-file", "/tmp/devcontainer.env", "--platform=linux/amd64"], "features": { "ghcr.io/devcontainers/features/desktop-lite:1": { "password": "orca" @@ -16,7 +16,7 @@ }, "customizations": { "vscode": { - "settings": { + "settings": { "cmake.configureArgs": [ "-DSLIC3R_GTK=3", "-DBBL_RELEASE_TO_PUBLIC=1", diff --git a/.github/workflows/build_all.yml b/.github/workflows/build_all.yml index c0a35f66bf..fcdfad099b 100644 --- a/.github/workflows/build_all.yml +++ b/.github/workflows/build_all.yml @@ -13,6 +13,7 @@ on: - 'localization/**' - 'resources/**' - ".github/workflows/build_*.yml" + - 'flatpak/**' pull_request: branches: @@ -27,6 +28,7 @@ on: - 'BuildLinux.sh' - 'build_release_vs2022.bat' - 'build_release_macos.sh' + - 'flatpak/**' workflow_dispatch: # allows for manual dispatch inputs: @@ -47,11 +49,10 @@ jobs: fail-fast: false matrix: include: - - os: ubuntu-20.04 - - os: ubuntu-24.04 + # Deprecate appimage + # - os: ubuntu-20.04 + # - os: ubuntu-24.04 - os: windows-latest - - os: macos-14 - arch: x86_64 - os: macos-14 arch: arm64 uses: ./.github/workflows/build_check_cache.yml diff --git a/.github/workflows/build_check_cache.yml b/.github/workflows/build_check_cache.yml index f71cc9b281..ddac07545e 100644 --- a/.github/workflows/build_check_cache.yml +++ b/.github/workflows/build_check_cache.yml @@ -30,13 +30,12 @@ jobs: - name: set outputs id: set_outputs env: - underscore-arch: ${{ inputs.os == 'macos-14' && '_' || ''}}${{ inputs.os == 'macos-14' && inputs.arch || '' }} # if is macos, make a string that does "_{arch}", else output nothing - dash-arch: ${{ inputs.os == 'macos-14' && '-' || ''}}${{ inputs.os == 'macos-14' && inputs.arch || '' }} # if is macos, make a string that does "-{arch}", else output nothing - dep-folder-name: ${{ (inputs.os == 'windows-latest' || inputs.os == 'macos-14') && 'OrcaSlicer_dep' || 'destdir' }} + # todo: this is mad! refactor other build scripts to use same name + dep-folder-name: ${{ inputs.os == 'windows-latest' && '/OrcaSlicer_dep' || inputs.os == 'macos-14' && '' || inputs.os != 'macos-14' && '/destdir' || '' }} output-cmd: ${{ inputs.os == 'windows-latest' && '$env:GITHUB_OUTPUT' || '"$GITHUB_OUTPUT"'}} run: | - echo cache-key=${{ inputs.os }}${{ env.dash-arch }}-cache-orcaslicer_deps-build-${{ hashFiles('deps/**') }} >> ${{ env.output-cmd }} - echo cache-path=${{ github.workspace }}/deps/build${{ env.underscore-arch }}/${{ env.dep-folder-name }}${{ env.underscore-arch }} >> ${{ env.output-cmd }} + echo cache-key=${{ inputs.os }}-cache-orcaslicer_deps-build-${{ hashFiles('deps/**') }} >> ${{ env.output-cmd }} + echo cache-path=${{ github.workspace }}/deps/build${{ env.dep-folder-name }} >> ${{ env.output-cmd }} - name: load cache id: cache_deps diff --git a/.github/workflows/build_deps.yml b/.github/workflows/build_deps.yml index 163cbca23c..b9dd05f647 100644 --- a/.github/workflows/build_deps.yml +++ b/.github/workflows/build_deps.yml @@ -74,12 +74,14 @@ jobs: if: inputs.os == 'macos-14' working-directory: ${{ github.workspace }} run: | - brew install automake texinfo ninja libtool + brew install automake texinfo libtool brew list - mkdir -p ${{ github.workspace }}/deps/build_${{ inputs.arch }} - mkdir -p ${{ github.workspace }}/deps/build_${{ inputs.arch }}/OrcaSlicer_dep_${{ inputs.arch }} brew uninstall --ignore-dependencies zstd - ./build_release_macos.sh -dpx -a ${{ inputs.arch }} -t 10.15 -1 + ./build_release_macos.sh -dx -a universal -t 10.15 -1 + for arch in arm64 x86_64; do + (cd "${{ github.workspace }}/deps/build/${arch}" && \ + find . -mindepth 1 -maxdepth 1 ! -name 'OrcaSlicer_dep' -exec rm -rf {} +) + done brew install zstd @@ -111,12 +113,12 @@ jobs: # Upload Artifacts - - name: Upload Mac ${{ inputs.arch }} artifacts - if: inputs.os == 'macos-14' - uses: actions/upload-artifact@v4 - with: - name: OrcaSlicer_dep_mac_${{ inputs.arch }}_${{ env.date }} - path: ${{ github.workspace }}/deps/build_${{ inputs.arch }}/OrcaSlicer_dep*.tar.gz + # - name: Upload Mac ${{ inputs.arch }} artifacts + # if: inputs.os == 'macos-14' + # uses: actions/upload-artifact@v4 + # with: + # name: OrcaSlicer_dep_mac_${{ env.date }} + # path: ${{ github.workspace }}/deps/build/OrcaSlicer_dep*.tar.gz - name: Upload Windows artifacts if: inputs.os == 'windows-latest' diff --git a/.github/workflows/build_orca.yml b/.github/workflows/build_orca.yml index fc99a751ac..68f6553e0a 100644 --- a/.github/workflows/build_orca.yml +++ b/.github/workflows/build_orca.yml @@ -81,10 +81,9 @@ jobs: - name: Install tools mac if: inputs.os == 'macos-14' run: | - brew install ninja libtool + brew install libtool brew list - mkdir -p ${{ github.workspace }}/deps/build_${{inputs.arch}} - mkdir -p ${{ github.workspace }}/deps/build_${{inputs.arch}}/OrcaSlicer_dep_${{inputs.arch}} + mkdir -p ${{ github.workspace }}/deps/build - name: Free disk space if: inputs.os == 'macos-14' @@ -98,7 +97,7 @@ jobs: if: inputs.os == 'macos-14' working-directory: ${{ github.workspace }} run: | - ./build_release_macos.sh -s -n -x -a ${{inputs.arch}} -t 10.15 -1 + ./build_release_macos.sh -s -n -x -a universal -t 10.15 -1 # Thanks to RaySajuuk, it's working now - name: Sign app and notary @@ -119,27 +118,27 @@ jobs: security import $CERTIFICATE_PATH -P $P12_PASSWORD -A -t cert -f pkcs12 -k $KEYCHAIN_PATH security list-keychain -d user -s $KEYCHAIN_PATH security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k $P12_PASSWORD $KEYCHAIN_PATH - codesign --deep --force --verbose --options runtime --timestamp --entitlements ${{ github.workspace }}/scripts/disable_validation.entitlements --sign "$CERTIFICATE_ID" ${{ github.workspace }}/build_${{inputs.arch}}/OrcaSlicer/OrcaSlicer.app - ln -s /Applications ${{ github.workspace }}/build_${{inputs.arch}}/OrcaSlicer/Applications - hdiutil create -volname "OrcaSlicer" -srcfolder ${{ github.workspace }}/build_${{inputs.arch}}/OrcaSlicer -ov -format UDZO OrcaSlicer_Mac_${{inputs.arch}}_${{ env.ver }}.dmg - codesign --deep --force --verbose --options runtime --timestamp --entitlements ${{ github.workspace }}/scripts/disable_validation.entitlements --sign "$CERTIFICATE_ID" OrcaSlicer_Mac_${{inputs.arch}}_${{ env.ver }}.dmg + codesign --deep --force --verbose --options runtime --timestamp --entitlements ${{ github.workspace }}/scripts/disable_validation.entitlements --sign "$CERTIFICATE_ID" ${{ github.workspace }}/build/universal/OrcaSlicer/OrcaSlicer.app + ln -s /Applications ${{ github.workspace }}/build/universal/OrcaSlicer/Applications + hdiutil create -volname "OrcaSlicer" -srcfolder ${{ github.workspace }}/build/universal/OrcaSlicer -ov -format UDZO OrcaSlicer_Mac_universal_${{ env.ver }}.dmg + codesign --deep --force --verbose --options runtime --timestamp --entitlements ${{ github.workspace }}/scripts/disable_validation.entitlements --sign "$CERTIFICATE_ID" OrcaSlicer_Mac_universal_${{ env.ver }}.dmg xcrun notarytool store-credentials "notarytool-profile" --apple-id "${{ secrets.APPLE_DEV_ACCOUNT }}" --team-id "${{ secrets.TEAM_ID }}" --password "${{ secrets.APP_PWD }}" - xcrun notarytool submit "OrcaSlicer_Mac_${{inputs.arch}}_${{ env.ver }}.dmg" --keychain-profile "notarytool-profile" --wait - xcrun stapler staple OrcaSlicer_Mac_${{inputs.arch}}_${{ env.ver }}.dmg + xcrun notarytool submit "OrcaSlicer_Mac_universal_${{ env.ver }}.dmg" --keychain-profile "notarytool-profile" --wait + xcrun stapler staple OrcaSlicer_Mac_universal_${{ env.ver }}.dmg - name: Create DMG without notary if: github.ref != 'refs/heads/main' && inputs.os == 'macos-14' working-directory: ${{ github.workspace }} run: | - ln -s /Applications ${{ github.workspace }}/build_${{inputs.arch}}/OrcaSlicer/Applications - hdiutil create -volname "OrcaSlicer" -srcfolder ${{ github.workspace }}/build_${{inputs.arch}}/OrcaSlicer -ov -format UDZO OrcaSlicer_Mac_${{inputs.arch}}_${{ env.ver }}.dmg + ln -s /Applications ${{ github.workspace }}/build/universal/OrcaSlicer/Applications + hdiutil create -volname "OrcaSlicer" -srcfolder ${{ github.workspace }}/build/universal/OrcaSlicer -ov -format UDZO OrcaSlicer_Mac_universal_${{ env.ver }}.dmg - name: Upload artifacts mac if: inputs.os == 'macos-14' uses: actions/upload-artifact@v4 with: - name: OrcaSlicer_Mac_${{inputs.arch}}_${{ env.ver }} - path: ${{ github.workspace }}/OrcaSlicer_Mac_${{inputs.arch}}_${{ env.ver }}.dmg + name: OrcaSlicer_Mac_universal_${{ env.ver }} + path: ${{ github.workspace }}/OrcaSlicer_Mac_universal_${{ env.ver }}.dmg - name: Deploy Mac release if: github.ref == 'refs/heads/main' && inputs.os == 'macos-14' @@ -147,8 +146,8 @@ jobs: with: upload_url: https://uploads.github.com/repos/SoftFever/OrcaSlicer/releases/137995723/assets{?name,label} release_id: 137995723 - asset_path: ${{ github.workspace }}/OrcaSlicer_Mac_${{inputs.arch}}_${{ env.ver }}.dmg - asset_name: OrcaSlicer_Mac_${{inputs.arch}}_${{ env.ver }}.dmg + asset_path: ${{ github.workspace }}/OrcaSlicer_Mac_universal_${{ env.ver }}.dmg + asset_name: OrcaSlicer_Mac_universal_${{ env.ver }}.dmg asset_content_type: application/octet-stream max_releases: 1 # optional, if there are more releases than this matching the asset_name, the oldest ones are going to be deleted diff --git a/BuildLinux.sh b/BuildLinux.sh index 0f4210b419..382bdac733 100755 --- a/BuildLinux.sh +++ b/BuildLinux.sh @@ -12,21 +12,24 @@ function check_available_memory_and_disk() { MIN_DISK_KB=$((10 * 1024 * 1024)) if [ ${FREE_MEM_GB} -le ${MIN_MEM_GB} ]; then - echo -e "\nERROR: Orca Slicer Builder requires at least ${MIN_MEM_GB}G of 'available' mem (systen has only ${FREE_MEM_GB}G available)" + echo -e "\nERROR: Orca Slicer Builder requires at least ${MIN_MEM_GB}G of 'available' mem (system has only ${FREE_MEM_GB}G available)" echo && free -h && echo + echo "Invoke with -r to skip ram and disk checks." exit 2 fi if [[ ${FREE_DISK_KB} -le ${MIN_DISK_KB} ]]; then - echo -e "\nERROR: Orca Slicer Builder requires at least $(echo ${MIN_DISK_KB} |awk '{ printf "%.1fG\n", $1/1024/1024; }') (systen has only $(echo ${FREE_DISK_KB} | awk '{ printf "%.1fG\n", $1/1024/1024; }') disk free)" + echo -e "\nERROR: Orca Slicer Builder requires at least $(echo ${MIN_DISK_KB} |awk '{ printf "%.1fG\n", $1/1024/1024; }') (system has only $(echo ${FREE_DISK_KB} | awk '{ printf "%.1fG\n", $1/1024/1024; }') disk free)" echo && df -h . && echo + echo "Invoke with -r to skip ram and disk checks." exit 1 fi } function usage() { - echo "Usage: ./BuildLinux.sh [-1][-b][-c][-d][-i][-r][-s][-u]" + echo "Usage: ./BuildLinux.sh [-1][-b][-c][-d][-i][-r][-s][-u] [-j N]" echo " -1: limit builds to 1 core (where possible)" + echo " -j N: limit builds to N cores (where possible)" echo " -b: build in debug mode" echo " -c: force a clean build" echo " -d: build deps (optional)" @@ -40,11 +43,14 @@ function usage() { } unset name -while getopts ":1bcdghirsu" opt; do +while getopts ":1j:bcdghirsu" opt; do case ${opt} in 1 ) export CMAKE_BUILD_PARALLEL_LEVEL=1 ;; + j ) + export CMAKE_BUILD_PARALLEL_LEVEL=$OPTARG + ;; b ) BUILD_DEBUG="1" ;; @@ -61,8 +67,8 @@ while getopts ":1bcdghirsu" opt; do BUILD_IMAGE="1" ;; r ) - SKIP_RAM_CHECK="1" - ;; + SKIP_RAM_CHECK="1" + ;; s ) BUILD_ORCA="1" ;; @@ -163,7 +169,7 @@ then else BUILD_ARGS="${BUILD_ARGS} -DBBL_RELEASE_TO_PUBLIC=1 -DBBL_INTERNAL_TESTING=0" fi - echo -e "cmake -S . -B build -G Ninja -DCMAKE_PREFIX_PATH="${PWD}/deps/build/destdir/usr/local" -DSLIC3R_STATIC=1 ${BUILD_ARGS}" + echo -e "cmake -S . -B build -G Ninja -DCMAKE_PREFIX_PATH="${PWD}/deps/build/destdir/usr/local" -DSLIC3R_STATIC=1 -DORCA_TOOLS=ON ${BUILD_ARGS}" cmake -S . -B build -G Ninja \ -DCMAKE_PREFIX_PATH="${PWD}/deps/build/destdir/usr/local" \ -DSLIC3R_STATIC=1 \ diff --git a/CMakeLists.txt b/CMakeLists.txt index ac1af19e33..eb51485e48 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -182,7 +182,7 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON) if(NOT WIN32) # Add DEBUG flags to debug builds. - add_compile_options("$<$:-DDEBUG>") + add_compile_definitions("$,DEBUG,NDEBUG>") endif() # To be able to link libslic3r with the Perl XS module. @@ -430,7 +430,7 @@ endif() # set(Boost_COMPILER "-mgw81") # boost::process was introduced first in version 1.64.0, # boost::beast::detail::base64 was introduced first in version 1.66.0 -find_package(Boost 1.66 REQUIRED COMPONENTS system filesystem thread log log_setup locale regex chrono atomic date_time iostreams program_options) +find_package(Boost 1.83.0 REQUIRED COMPONENTS system filesystem thread log log_setup locale regex chrono atomic date_time iostreams program_options nowide) add_library(boost_libs INTERFACE) add_library(boost_headeronly INTERFACE) diff --git a/README.md b/README.md index bed40f3b23..cd1803ebcc 100644 --- a/README.md +++ b/README.md @@ -97,7 +97,9 @@ Explore the latest developments in Orca Slicer with our nightly builds. Feedback - Mac 64-bit - Tools needed: Xcode, Cmake, git, gettext, libtool, automake, autoconf, texinfo - You can install most of them by running `brew install cmake gettext libtool automake autoconf texinfo` + - If you haven't since upgrading Xcode, start Xcode and install macOS build support. - run `build_release_macos.sh` + - open `build_arm64/OrcaSlicer/OrcaSlicer.app` - To build and debug in Xcode: - run `Xcode.app` - open ``build_`arch`/OrcaSlicer.Xcodeproj`` @@ -119,7 +121,7 @@ Explore the latest developments in Orca Slicer with our nightly builds. Feedback - Ubuntu - Dependencies **Will be auto installed with the shell script**: `libmspack-dev libgstreamerd-3-dev libsecret-1-dev libwebkit2gtk-4.0-dev libosmesa6-dev libssl-dev libcurl4-openssl-dev eglexternalplatform-dev libudev-dev libdbus-1-dev extra-cmake-modules libgtk2.0-dev libglew-dev libudev-dev libdbus-1-dev cmake git texinfo` - run 'sudo ./BuildLinux.sh -u' - - run './BuildLinux.sh -dsir' + - run './BuildLinux.sh -dsi' # Note: If you're running Klipper, it's recommended to add the following configuration to your `printer.cfg` file. diff --git a/build_release_macos.sh b/build_release_macos.sh index 59cd616c76..95d06833f9 100755 --- a/build_release_macos.sh +++ b/build_release_macos.sh @@ -3,7 +3,7 @@ set -e set -o pipefail -while getopts ":dpa:snt:xbc:hu" opt; do +while getopts ":dpa:snt:xbc:h" opt; do case "${opt}" in d ) export BUILD_TARGET="deps" @@ -37,19 +37,15 @@ while getopts ":dpa:snt:xbc:hu" opt; do 1 ) export CMAKE_BUILD_PARALLEL_LEVEL=1 ;; - u ) - export BUILD_UNIVERSAL="1" - ;; h ) echo "Usage: ./build_release_macos.sh [-d]" echo " -d: Build deps only" - echo " -a: Set ARCHITECTURE (arm64 or x86_64)" + echo " -a: Set ARCHITECTURE (arm64 or x86_64 or universal)" echo " -s: Build slicer only" echo " -n: Nightly build" echo " -t: Specify minimum version of the target platform, default is 11.3" echo " -x: Use Ninja CMake generator, default is Xcode" echo " -b: Build without reconfiguring CMake" echo " -c: Set CMake build configuration, default is Release" - echo " -u: Build universal binary (both arm64 and x86_64)" echo " -1: Use single job for building" exit 0 ;; @@ -61,16 +57,8 @@ done # Set defaults if [ -z "$ARCH" ]; then - if [ "1." == "$BUILD_UNIVERSAL". ]; then - ARCH="universal" - else ARCH="$(uname -m)" - fi - export ARCH -fi - -if [ "1." == "$BUILD_UNIVERSAL". ]; then - echo "Universal build enabled - will create a combined arm64/x86_64 binary" + export ARCH fi if [ -z "$BUILD_CONFIG" ]; then @@ -119,10 +107,10 @@ echo # fi PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -PROJECT_BUILD_DIR="$PROJECT_DIR/build_$ARCH" +PROJECT_BUILD_DIR="$PROJECT_DIR/build/$ARCH" DEPS_DIR="$PROJECT_DIR/deps" -DEPS_BUILD_DIR="$DEPS_DIR/build_$ARCH" -DEPS="$DEPS_BUILD_DIR/OrcaSlicer_dep_$ARCH" +DEPS_BUILD_DIR="$DEPS_DIR/build/$ARCH" +DEPS="$DEPS_BUILD_DIR/OrcaSlicer_deps" # Fix for Multi-config generators if [ "$SLICER_CMAKE_GENERATOR" == "Xcode" ]; then @@ -132,133 +120,133 @@ else fi function build_deps() { - echo "Building deps..." - ( - set -x - mkdir -p "$DEPS" - cd "$DEPS_BUILD_DIR" - if [ "1." != "$BUILD_ONLY". ]; then - cmake .. \ - -G "${DEPS_CMAKE_GENERATOR}" \ - -DDESTDIR="$DEPS" \ - -DOPENSSL_ARCH="darwin64-${ARCH}-cc" \ - -DCMAKE_BUILD_TYPE="$BUILD_CONFIG" \ - -DCMAKE_OSX_ARCHITECTURES:STRING="${ARCH}" \ - -DCMAKE_OSX_DEPLOYMENT_TARGET="${OSX_DEPLOYMENT_TARGET}" + # iterate over two architectures: x86_64 and arm64 + for _ARCH in x86_64 arm64; do + # if ARCH is universal or equal to _ARCH + if [ "$ARCH" == "universal" ] || [ "$ARCH" == "$_ARCH" ]; then + + PROJECT_BUILD_DIR="$PROJECT_DIR/build/$_ARCH" + DEPS_BUILD_DIR="$DEPS_DIR/build/$_ARCH" + DEPS="$DEPS_BUILD_DIR/OrcaSlicer_dep" + + echo "Building deps..." + ( + set -x + mkdir -p "$DEPS" + cd "$DEPS_BUILD_DIR" + if [ "1." != "$BUILD_ONLY". ]; then + cmake "${DEPS_DIR}" \ + -G "${DEPS_CMAKE_GENERATOR}" \ + -DDESTDIR="$DEPS" \ + -DOPENSSL_ARCH="darwin64-${_ARCH}-cc" \ + -DCMAKE_BUILD_TYPE="$BUILD_CONFIG" \ + -DCMAKE_OSX_ARCHITECTURES:STRING="${_ARCH}" \ + -DCMAKE_OSX_DEPLOYMENT_TARGET="${OSX_DEPLOYMENT_TARGET}" + fi + cmake --build . --config "$BUILD_CONFIG" --target deps + ) fi - cmake --build . --config "$BUILD_CONFIG" --target deps - ) + done } function pack_deps() { echo "Packing deps..." ( set -x - mkdir -p "$DEPS" - cd "$DEPS_BUILD_DIR" - tar -zcvf "OrcaSlicer_dep_mac_${ARCH}_$(date +"%Y%m%d").tar.gz" "OrcaSlicer_dep_$ARCH" + cd "$DEPS_DIR" + tar -zcvf "OrcaSlicer_dep_mac_${ARCH}_$(date +"%Y%m%d").tar.gz" "build" ) } function build_slicer() { - echo "Building slicer..." - ( - set -x - mkdir -p "$PROJECT_BUILD_DIR" - cd "$PROJECT_BUILD_DIR" - if [ "1." != "$BUILD_ONLY". ]; then - cmake .. \ - -G "${SLICER_CMAKE_GENERATOR}" \ - -DBBL_RELEASE_TO_PUBLIC=1 \ - -DCMAKE_PREFIX_PATH="$DEPS/usr/local" \ - -DCMAKE_INSTALL_PREFIX="$PWD/OrcaSlicer" \ - -DCMAKE_BUILD_TYPE="$BUILD_CONFIG" \ - -DCMAKE_MACOSX_RPATH=ON \ - -DCMAKE_INSTALL_RPATH="${DEPS}/usr/local" \ - -DCMAKE_MACOSX_BUNDLE=ON \ - -DCMAKE_OSX_ARCHITECTURES="${ARCH}" \ - -DCMAKE_OSX_DEPLOYMENT_TARGET="${OSX_DEPLOYMENT_TARGET}" - fi - cmake --build . --config "$BUILD_CONFIG" --target "$SLICER_BUILD_TARGET" - ) + # iterate over two architectures: x86_64 and arm64 + for _ARCH in x86_64 arm64; do + # if ARCH is universal or equal to _ARCH + if [ "$ARCH" == "universal" ] || [ "$ARCH" == "$_ARCH" ]; then - echo "Verify localization with gettext..." - ( - cd "$PROJECT_DIR" - ./run_gettext.sh - ) + PROJECT_BUILD_DIR="$PROJECT_DIR/build/$_ARCH" + DEPS_BUILD_DIR="$DEPS_DIR/build/$_ARCH" + DEPS="$DEPS_BUILD_DIR/OrcaSlicer_dep" - echo "Fix macOS app package..." - ( - cd "$PROJECT_BUILD_DIR" - mkdir -p OrcaSlicer - cd OrcaSlicer - # remove previously built app - rm -rf ./OrcaSlicer.app - # fully copy newly built app - cp -pR "../src$BUILD_DIR_CONFIG_SUBDIR/OrcaSlicer.app" ./OrcaSlicer.app - # fix resources - resources_path=$(readlink ./OrcaSlicer.app/Contents/Resources) - rm ./OrcaSlicer.app/Contents/Resources - cp -R "$resources_path" ./OrcaSlicer.app/Contents/Resources - # delete .DS_Store file - find ./OrcaSlicer.app/ -name '.DS_Store' -delete - ) + echo "Building slicer for $_ARCH..." + ( + set -x + mkdir -p "$PROJECT_BUILD_DIR" + cd "$PROJECT_BUILD_DIR" + if [ "1." != "$BUILD_ONLY". ]; then + cmake "${PROJECT_DIR}" \ + -G "${SLICER_CMAKE_GENERATOR}" \ + -DBBL_RELEASE_TO_PUBLIC=1 \ + -DCMAKE_PREFIX_PATH="$DEPS/usr/local" \ + -DCMAKE_INSTALL_PREFIX="$PWD/OrcaSlicer" \ + -DCMAKE_BUILD_TYPE="$BUILD_CONFIG" \ + -DCMAKE_MACOSX_RPATH=ON \ + -DCMAKE_INSTALL_RPATH="${DEPS}/usr/local" \ + -DCMAKE_MACOSX_BUNDLE=ON \ + -DCMAKE_OSX_ARCHITECTURES="${_ARCH}" \ + -DCMAKE_OSX_DEPLOYMENT_TARGET="${OSX_DEPLOYMENT_TARGET}" + fi + cmake --build . --config "$BUILD_CONFIG" --target "$SLICER_BUILD_TARGET" + ) - # extract version - # export ver=$(grep '^#define SoftFever_VERSION' ../src/libslic3r/libslic3r_version.h | cut -d ' ' -f3) - # ver="_V${ver//\"}" - # echo $PWD - # if [ "1." != "$NIGHTLY_BUILD". ]; - # then - # ver=${ver}_dev - # fi + echo "Verify localization with gettext..." + ( + cd "$PROJECT_DIR" + ./run_gettext.sh + ) - # zip -FSr OrcaSlicer${ver}_Mac_${ARCH}.zip OrcaSlicer.app + echo "Fix macOS app package..." + ( + cd "$PROJECT_BUILD_DIR" + mkdir -p OrcaSlicer + cd OrcaSlicer + # remove previously built app + rm -rf ./OrcaSlicer.app + # fully copy newly built app + cp -pR "../src$BUILD_DIR_CONFIG_SUBDIR/OrcaSlicer.app" ./OrcaSlicer.app + # fix resources + resources_path=$(readlink ./OrcaSlicer.app/Contents/Resources) + rm ./OrcaSlicer.app/Contents/Resources + cp -R "$resources_path" ./OrcaSlicer.app/Contents/Resources + # delete .DS_Store file + find ./OrcaSlicer.app/ -name '.DS_Store' -delete + ) + + # extract version + # export ver=$(grep '^#define SoftFever_VERSION' ../src/libslic3r/libslic3r_version.h | cut -d ' ' -f3) + # ver="_V${ver//\"}" + # echo $PWD + # if [ "1." != "$NIGHTLY_BUILD". ]; + # then + # ver=${ver}_dev + # fi + + # zip -FSr OrcaSlicer${ver}_Mac_${_ARCH}.zip OrcaSlicer.app + + fi + done } function build_universal() { echo "Building universal binary..." - # Save current ARCH - ORIGINAL_ARCH="$ARCH" - - # Build x86_64 - ARCH="x86_64" - PROJECT_BUILD_DIR="$PROJECT_DIR/build_$ARCH" - DEPS_BUILD_DIR="$DEPS_DIR/build_$ARCH" - DEPS="$DEPS_BUILD_DIR/OrcaSlicer_dep_$ARCH" - build_deps - build_slicer - - # Build arm64 - ARCH="arm64" - PROJECT_BUILD_DIR="$PROJECT_DIR/build_$ARCH" - DEPS_BUILD_DIR="$DEPS_DIR/build_$ARCH" - DEPS="$DEPS_BUILD_DIR/OrcaSlicer_dep_$ARCH" - build_deps - build_slicer - - # Restore original ARCH - ARCH="$ORIGINAL_ARCH" - PROJECT_BUILD_DIR="$PROJECT_DIR/build_$ARCH" - DEPS_BUILD_DIR="$DEPS_DIR/build_$ARCH" - DEPS="$DEPS_BUILD_DIR/OrcaSlicer_dep_$ARCH" + + PROJECT_BUILD_DIR="$PROJECT_DIR/build/$ARCH" # Create universal binary echo "Creating universal binary..." - PROJECT_BUILD_DIR="$PROJECT_DIR/build_Universal" + # PROJECT_BUILD_DIR="$PROJECT_DIR/build_Universal" mkdir -p "$PROJECT_BUILD_DIR/OrcaSlicer" - UNIVERSAL_APP="$PROJECT_BUILD_DIR/OrcaSlicer/Universal_OrcaSlicer.app" + UNIVERSAL_APP="$PROJECT_BUILD_DIR/OrcaSlicer/OrcaSlicer.app" rm -rf "$UNIVERSAL_APP" - cp -R "$PROJECT_DIR/build_x86_64/OrcaSlicer/OrcaSlicer.app" "$UNIVERSAL_APP" + cp -R "$PROJECT_DIR/build/arm64/OrcaSlicer/OrcaSlicer.app" "$UNIVERSAL_APP" # Get the binary path inside the .app bundle BINARY_PATH="Contents/MacOS/OrcaSlicer" # Create universal binary using lipo lipo -create \ - "$PROJECT_DIR/build_x86_64/OrcaSlicer/OrcaSlicer.app/$BINARY_PATH" \ - "$PROJECT_DIR/build_arm64/OrcaSlicer/OrcaSlicer.app/$BINARY_PATH" \ + "$PROJECT_DIR/build/x86_64/OrcaSlicer/OrcaSlicer.app/$BINARY_PATH" \ + "$PROJECT_DIR/build/arm64/OrcaSlicer/OrcaSlicer.app/$BINARY_PATH" \ -output "$UNIVERSAL_APP/$BINARY_PATH" echo "Universal binary created at $UNIVERSAL_APP" @@ -266,22 +254,14 @@ function build_universal() { case "${BUILD_TARGET}" in all) - if [ "1." == "$BUILD_UNIVERSAL". ]; then - build_universal - else - build_deps - build_slicer - fi + build_deps + build_slicer ;; deps) build_deps ;; slicer) - if [ "1." == "$BUILD_UNIVERSAL". ]; then - build_universal - else - build_slicer - fi + build_slicer ;; *) echo "Unknown target: $BUILD_TARGET. Available targets: deps, slicer, all." @@ -289,6 +269,10 @@ case "${BUILD_TARGET}" in ;; esac +if [ "$ARCH" = "universal" ] && [ "$BUILD_TARGET" != "deps" ]; then + build_universal +fi + if [ "1." == "$PACK_DEPS". ]; then pack_deps fi diff --git a/deps/CMakeLists.txt b/deps/CMakeLists.txt index b43bfa153f..b24ee20e26 100644 --- a/deps/CMakeLists.txt +++ b/deps/CMakeLists.txt @@ -45,7 +45,7 @@ if (NPROC EQUAL 0) endif () set(DESTDIR "${CMAKE_CURRENT_BINARY_DIR}/destdir" CACHE PATH "Destination directory") -set(DEP_DOWNLOAD_DIR ${CMAKE_CURRENT_BINARY_DIR}/../DL_CACHE CACHE PATH "Path for downloaded source packages.") +set(DEP_DOWNLOAD_DIR ${CMAKE_CURRENT_SOURCE_DIR}/DL_CACHE CACHE PATH "Path for downloaded source packages.") set(FLATPAK FALSE CACHE BOOL "Toggles various build settings for flatpak, like /usr/local in DESTDIR or not building wxwidgets") if (NOT FLATPAK) set(DESTDIR "${DESTDIR}/usr/local/") diff --git a/flatpak/entrypoint b/flatpak/entrypoint index 38fd86f451..0c8e163fdc 100644 --- a/flatpak/entrypoint +++ b/flatpak/entrypoint @@ -6,4 +6,11 @@ grep -q org.freedesktop.Platform.GL.nvidia /.flatpak-info && export WEBKIT_DISAB # Work-around https://github.com/bambulab/BambuStudio/issues/3440 export LC_ALL=C.UTF-8 -exec /app/bin/orca-slicer "$@" +if XDG_CONFIG_HOME=$HOME/.config /app/bin/uses-dark-theme.py; then + export GTK_THEME='Adwaita:dark' + export ORCA_SLICER_DARK_THEME='true' + echo "Message: $(date +%T): INFO: using dark theme variant" +fi + +exec /app/bin/orca-slicer "$@" & +$(/app/bin/set-dark-theme-variant.py) & diff --git a/flatpak/io.github.softfever.OrcaSlicer.yml b/flatpak/io.github.softfever.OrcaSlicer.yml index b3ca946e38..ae29d671de 100755 --- a/flatpak/io.github.softfever.OrcaSlicer.yml +++ b/flatpak/io.github.softfever.OrcaSlicer.yml @@ -19,8 +19,34 @@ finish-args: - --talk-name=io.github.softfever.OrcaSlicer.InstanceCheck.* - --system-talk-name=org.freedesktop.UDisks2 - --env=SPNAV_SOCKET=/run/spnav.sock + # set dark theme + - --env=ORCA_SLICER_DARK_THEME=false modules: + # xprop, xlib is needed to manipulate the X11 window and set _GTK_THEME_VARIANT dark on X11 + # and paint the window dark when ORCA_SLICER_DARK_THEME is true + # see: entrypoint & set-dark-theme-variant.py (originated from Pursa Slicer flatpak which originated from spotify client flatpak) + - name: xprop + sources: + - type: archive + url: https://xorg.freedesktop.org/archive/individual/app/xprop-1.2.5.tar.gz + sha256: b7bf6b6be6cf23e7966a153fc84d5901c14f01ee952fbd9d930aa48e2385d670 + - name: python-setuptools_scm + buildsystem: simple + build-commands: + - pip3 install --no-deps --no-build-isolation --verbose --prefix=${FLATPAK_DEST} . + sources: + - type: archive + url: https://files.pythonhosted.org/packages/57/38/930b1241372a9f266a7df2b184fb9d4f497c2cef2e016b014f82f541fe7c/setuptools_scm-6.0.1.tar.gz + sha256: d1925a69cb07e9b29416a275b9fadb009a23c148ace905b2fb220649a6c18e92 + - name: python-xlib + buildsystem: simple + build-commands: + - pip3 install --no-deps --no-build-isolation --verbose --prefix=${FLATPAK_DEST} . + sources: + - type: archive + url: https://files.pythonhosted.org/packages/86/f5/8c0653e5bb54e0cbdfe27bf32d41f27bc4e12faa8742778c17f2a71be2c0/python-xlib-0.33.tar.gz + sha256: 55af7906a2c75ce6cb280a584776080602444f75815a7aff4d287bb2d7018b32 # JPEG codec for the liveview - name: gst-plugins-good @@ -299,6 +325,8 @@ modules: desktop-file-edit --set-key=Exec --set-value="entrypoint %U" /app/share/applications/${FLATPAK_ID}.desktop install -Dm755 entrypoint /app/bin install -Dm755 umount /app/bin + install set-dark-theme-variant.py /app/bin + install uses-dark-theme.py /app/bin sources: # - @@ -316,6 +344,14 @@ modules: - type: file path: io.github.softfever.OrcaSlicer.metainfo.xml + # script to set dark theme variant + - type: file + path: set-dark-theme-variant.py + + # script to detect if host uses dark theme + - type: file + path: uses-dark-theme.py + # start-up script - type: file path: entrypoint diff --git a/flatpak/set-dark-theme-variant.py b/flatpak/set-dark-theme-variant.py new file mode 100644 index 0000000000..2f05be0fe5 --- /dev/null +++ b/flatpak/set-dark-theme-variant.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python3 + +import Xlib +import Xlib.display +import time +import subprocess +import os +import sys + + +disp = Xlib.display.Display() +root = disp.screen().root + +NET_CLIENT_LIST = disp.intern_atom('_NET_CLIENT_LIST') + + +def set_theme_variant_by_window_id(id, variant): + # Use subprocess to call + # xprop and set the variant from id. + try: + s = subprocess.call(['xprop', '-f', '_GTK_THEME_VARIANT', '8u', '-set', '_GTK_THEME_VARIANT', variant, '-id', str(id)], + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + if s == 0: + return True + return False + except Exception as ex: + return False + + +def set_theme_variant_from_win_id_collection(win_id_collection, variant): + # Loop though all of the collected + # window ids and set theme variant + for win_id in win_id_collection: + set_theme_variant_by_window_id(win_id, variant) + + +def collection_win_id_from_wm_class_name(win_class_name): + + collect = [] + + # Loop though all of the windows + # and collect id's those that match + # win_class: prusa-slicer + for win_id in root.get_full_property(NET_CLIENT_LIST, Xlib.X.AnyPropertyType).value: + try: + win = disp.create_resource_object('window', win_id) + if not win.get_wm_transient_for(): + win_class = win.get_wm_class() + if win_id and win_class_name in win_class: + collect.append( + win_id) if win_id not in collect else collect + except Xlib.error.BadWindow: + pass + + return collect + + +if __name__ == '__main__': + + if os.environ.get('ORCA_SLICER_DARK_THEME', 'false') != 'true': + sys.exit(0) + + # Listen for X Property Change events. + root.change_attributes(event_mask=Xlib.X.PropertyChangeMask) + # the class name of the slicer window + win_class_name = 'orcaslicer' + # the variant to set + variant = 'dark' + + start = time.time() + + while True: + # collect all of the window ids + collect = collection_win_id_from_wm_class_name(win_class_name) + # give Orca Slicer window 2 secs to + # collect the wanted window ids + # set the theme variant and exit + if time.time() - start <= 2: + # disp.next_event() blocks if no events are + # queued. In combination with while True + # it creates a very simple event loop. + disp.next_event() + set_theme_variant_from_win_id_collection(collect, variant) + else: + break diff --git a/flatpak/uses-dark-theme.py b/flatpak/uses-dark-theme.py new file mode 100644 index 0000000000..4d7ebbc87a --- /dev/null +++ b/flatpak/uses-dark-theme.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python3 + +import os +import sys +import gi +gi.require_version("Gtk", "3.0") +from gi.repository import Gtk as gtk + + +if __name__ == '__main__': + forced = os.environ.get('ORCA_SLICER_DARK_THEME', 'false') == 'true' + settings = gtk.Settings.get_default() + prefer_dark = settings.get_property('gtk-application-prefer-dark-theme') + + if not forced and not prefer_dark: + sys.exit(1) + else: + sys.exit(0) diff --git a/localization/i18n/OrcaSlicer.pot b/localization/i18n/OrcaSlicer.pot index 156df7eca1..8f665dc04b 100644 --- a/localization/i18n/OrcaSlicer.pot +++ b/localization/i18n/OrcaSlicer.pot @@ -3453,8 +3453,8 @@ msgstr "" #, possible-c-format, possible-boost-format msgid "" -"Recommended nozzle temperature of this filament type is [%d, %d] degree " -"centigrade" +"The recommended nozzle temperature for this filament type is [%d, %d] " +"degrees Celsius." msgstr "" msgid "" diff --git a/localization/i18n/ca/OrcaSlicer_ca.po b/localization/i18n/ca/OrcaSlicer_ca.po index 396f3eb28d..e288bd7d56 100644 --- a/localization/i18n/ca/OrcaSlicer_ca.po +++ b/localization/i18n/ca/OrcaSlicer_ca.po @@ -3691,11 +3691,11 @@ msgstr "" #, c-format, boost-format msgid "" -"Recommended nozzle temperature of this filament type is [%d, %d] degree " -"centigrade" +"The recommended nozzle temperature for this filament type is [%d, %d] " +"degrees Celsius." msgstr "" "La temperatura recomanada del broquet d'aquest tipus de filament és de [%d, " -"%d] graus centígrads" +"%d] graus Celsius." msgid "" "Too small max volumetric speed.\n" diff --git a/localization/i18n/cs/OrcaSlicer_cs.po b/localization/i18n/cs/OrcaSlicer_cs.po index 8e0332584f..8f863368b0 100644 --- a/localization/i18n/cs/OrcaSlicer_cs.po +++ b/localization/i18n/cs/OrcaSlicer_cs.po @@ -3618,8 +3618,8 @@ msgstr "" #, c-format, boost-format msgid "" -"Recommended nozzle temperature of this filament type is [%d, %d] degree " -"centigrade" +"The recommended nozzle temperature for this filament type is [%d, %d] " +"degrees Celsius." msgstr "" "Doporučená teplota trysky pro tento typ filamentu je [%d, %d]stupňů Celsia" @@ -18139,7 +18139,7 @@ msgstr "" #, c-format, boost-format #~ msgid "" #~ "Bed temperature of other layer is lower than bed temperature of initial " -#~ "layer for more than %d degree centigrade.\n" +#~ "layer for more than %d degrees Celsius.\n" #~ "This may cause model broken free from build plate during printing" #~ msgstr "" #~ "Teplota podložky ostatních vrstev je nižší než teplota podložky první " diff --git a/localization/i18n/de/OrcaSlicer_de.po b/localization/i18n/de/OrcaSlicer_de.po index 8b882ca4cb..ebb6ca3432 100644 --- a/localization/i18n/de/OrcaSlicer_de.po +++ b/localization/i18n/de/OrcaSlicer_de.po @@ -209,8 +209,9 @@ msgstr "Gizmo-Skalieren" msgid "Error: Please close all toolbar menus first" msgstr "Fehler: Bitte schließen sie zuerst alle Werkzeugleistenmenüs" +#. inches msgid "in" -msgstr "in" +msgstr "" msgid "mm" msgstr "mm" @@ -3732,10 +3733,10 @@ msgstr "" #, c-format, boost-format msgid "" -"Recommended nozzle temperature of this filament type is [%d, %d] degree " -"centigrade" +"The recommended nozzle temperature for this filament type is [%d, %d] " +"degrees Celsius." msgstr "" -"Die empfohlene Düsentemperatur für diesen Filamenttyp beträgt [%d, %d] °C" +"Die empfohlene Düsentemperatur für diesen Filamenttyp beträgt [%d, %d] °C." msgid "" "Too small max volumetric speed.\n" @@ -20600,7 +20601,7 @@ msgstr "" #, c-format, boost-format #~ msgid "" #~ "Bed temperature of other layer is lower than bed temperature of initial " -#~ "layer for more than %d degree centigrade.\n" +#~ "layer for more than %d degrees Celsius.\n" #~ "This may cause model broken free from build plate during printing" #~ msgstr "" #~ "Die Betttemperatur der anderen Schicht ist um mehr als %d Grad Celsius " diff --git a/localization/i18n/en/OrcaSlicer_en.po b/localization/i18n/en/OrcaSlicer_en.po index 61d29f5d8e..6c3aa395e2 100644 --- a/localization/i18n/en/OrcaSlicer_en.po +++ b/localization/i18n/en/OrcaSlicer_en.po @@ -1436,6 +1436,8 @@ msgid "" "OrcaSlicer will terminate because of running out of memory.It may be a bug. " "It will be appreciated if you report the issue to our team." msgstr "" +"OrcaSlicer will terminate because of running out of memory. It may be a bug. " +"It will be appreciated if you report the issue to our team." msgid "Fatal error" msgstr "Fatal error" @@ -3079,7 +3081,7 @@ msgid "" "spools." msgstr "" "The AMS will automatically read the information of inserted filament on " -"start-up. It will take about 1 minute.The reading process will rotate the " +"start-up. It will take about 1 minute. The reading process will rotate the " "filament spools." msgid "" @@ -3583,11 +3585,9 @@ msgstr "" #, c-format, boost-format msgid "" -"Recommended nozzle temperature of this filament type is [%d, %d] degree " -"centigrade" -msgstr "" "The recommended nozzle temperature for this filament type is [%d, %d] " -"degrees centigrade" +"degrees Celsius." +msgstr "" msgid "" "Too small max volumetric speed.\n" @@ -3603,7 +3603,7 @@ msgid "" "safe temperature for the material is %d" msgstr "" "Current chamber temperature is higher than the material's safe temperature; " -"this may result in material softening and nozzle clogs.The maximum safe " +"this may result in material softening and nozzle clogs. The maximum safe " "temperature for the material is %d" msgid "" @@ -3913,7 +3913,7 @@ msgid "" "Damp PVA will become flexible and get stuck inside AMS,please take care to " "dry it before use." msgstr "" -"Damp PVA will become flexible and get stuck inside AMS,please take care to " +"Damp PVA will become flexible and get stuck inside AMS, please take care to " "dry it before use." msgid "" @@ -5192,6 +5192,8 @@ msgid "" "The .gcode.3mf file contains no G-code data.Please slice it with Orca Slicer " "and export a new .gcode.3mf file." msgstr "" +"The .gcode.3mf file contains no G-code data. Please slice it with Orca Slicer " +"and export a new .gcode.3mf file." #, c-format, boost-format msgid "File '%s' was lost! Please download it again." @@ -7580,7 +7582,7 @@ msgid "" "height limits ,this may cause printing quality issues." msgstr "" "Layer height exceeds the limit in Printer Settings -> Extruder -> Layer " -"height limits ,this may cause printing quality issues." +"height limits, this may cause printing quality issues." msgid "Adjust to the set range automatically? \n" msgstr "Adjust to the set range automatically? \n" @@ -10327,7 +10329,7 @@ msgid "" "Speed of exhaust fan during printing.This speed will overwrite the speed in " "filament custom gcode" msgstr "" -"Speed of exhaust fan during printing.This speed will override the speed in " +"Speed of exhaust fan during printing. This speed will override the speed in " "filament custom g-code" msgid "Speed of exhaust fan after printing completes" @@ -12398,6 +12400,8 @@ msgid "" "Maximum area of a hole in the base of the model before it's filled by " "conical material.A value of 0 will fill all the holes in the model base." msgstr "" +"Maximum area of a hole in the base of the model before it's filled by " +"conical material. A value of 0 will fill all the holes in the model base." msgid "mm²" msgstr "mm²" @@ -12562,7 +12566,7 @@ msgid "" "problems." msgstr "" "Experimental feature: Retracting and cutting off the filament at a longer " -"distance during changes to minimize purge.While this reduces flush " +"distance during changes to minimize purge. While this reduces flush " "significantly, it may also raise the risk of nozzle clogs or other printing " "problems." @@ -12890,8 +12894,8 @@ msgid "" "this parameter is 80%" msgstr "" "The wipe speed is determined by the speed setting specified in this " -"configuration.If the value is expressed as a percentage (e.g. 80%), it will " -"be calculated based on the travel speed setting above.The default value for " +"configuration. If the value is expressed as a percentage (e.g. 80%), it will " +"be calculated based on the travel speed setting above. The default value for " "this parameter is 80%" msgid "Skirt distance" @@ -12980,6 +12984,13 @@ msgid "" "Final number of loops is not taling into account whli arranging or " "validating objects distance. Increase loop number in such case." msgstr "" +"Minimum filament extrusion length in mm when printing the skirt. Zero means " +"this feature is disabled.\n" +"\n" +"Using a non zero value is useful if the printer is set up to print without a " +"prime line.\n" +"Final number of loops is not taking into account while arranging or " +"validating objects distance. Increase loop number in such case." msgid "" "The printing speed in exported gcode will be slowed down, when the estimated " @@ -13443,7 +13454,7 @@ msgid "" "when the prime tower is enabled." msgstr "" "Support layer uses layer height independent with object layer. This is to " -"support customizing z-gap and save print time.This option will be invalid " +"support customizing z-gap and save print time. This option will be invalid " "when the prime tower is enabled." msgid "Threshold angle" @@ -13845,6 +13856,9 @@ msgid "" "setups.This is only used when 'Ooze prevention' is active in Print Settings. " "Set to 0 to disable." msgstr "" +"Nozzle temperature when the tool is currently not used in multi-tool " +"setups. This is only used when 'Ooze prevention' is active in Print Settings. " +"Set to 0 to disable." msgid "X-Y hole compensation" msgstr "X-Y hole compensation" @@ -13926,6 +13940,10 @@ msgid "" "Wipe tower is only compatible with relative mode. It is recommended on most " "printers. Default is checked" msgstr "" +"Relative extrusion is recommended when using \"label_objects\" option. Some " +"extruders work better with this option unchecked (absolute extrusion mode). " +"Wipe tower is only compatible with relative mode. It is recommended on most " +"printers. Default is checked" msgid "" "Classic wall generator produces walls with constant extrusion width and for " @@ -17169,7 +17187,7 @@ msgstr "" #~ "Higher chamber temperature can help suppress or reduce warping and " #~ "potentially lead to higher interlayer bonding strength for high " #~ "temperature materials like ABS, ASA, PC, PA and so on. At the same time, " -#~ "the air filtration of ABS and ASA will get worse.While for PLA, PETG, " +#~ "the air filtration of ABS and ASA will get worse. While for PLA, PETG, " #~ "TPU, PVA and other low temperature materials, the actual chamber " #~ "temperature should not be high to avoid clogs, so 0 (turned off) is " #~ "highly recommended." @@ -17657,11 +17675,11 @@ msgstr "" #, c-format, boost-format #~ msgid "" #~ "Bed temperature of other layer is lower than bed temperature of initial " -#~ "layer for more than %d degree centigrade.\n" +#~ "layer for more than %d degrees Celsius.\n" #~ "This may cause model broken free from build plate during printing" #~ msgstr "" #~ "The bed temperature of other layers is lower than the bed temperature of " -#~ "the first layer by more than %d degrees centigrade.\n" +#~ "the first layer by more than %d degrees Celsius.\n" #~ "This may cause models to break free from the build plate during printing." #~ msgid "" diff --git a/localization/i18n/es/OrcaSlicer_es.po b/localization/i18n/es/OrcaSlicer_es.po index 7f33b41404..3c10b1fef7 100644 --- a/localization/i18n/es/OrcaSlicer_es.po +++ b/localization/i18n/es/OrcaSlicer_es.po @@ -3722,11 +3722,11 @@ msgstr "" #, c-format, boost-format msgid "" -"Recommended nozzle temperature of this filament type is [%d, %d] degree " -"centigrade" +"The recommended nozzle temperature for this filament type is [%d, %d] " +"degrees Celsius." msgstr "" "La temperatura recomendada de la boquilla para este tipo de filamento es de " -"[%d, %d] grados centígrados" +"[%d, %d] grados Celsius." msgid "" "Too small max volumetric speed.\n" @@ -20194,7 +20194,7 @@ msgstr "" #, c-format, boost-format #~ msgid "" #~ "Bed temperature of other layer is lower than bed temperature of initial " -#~ "layer for more than %d degree centigrade.\n" +#~ "layer for more than %d degrees Celsius.\n" #~ "This may cause model broken free from build plate during printing" #~ msgstr "" #~ "La temperatura del lecho de la otra capa es inferior a la temperatura del " diff --git a/localization/i18n/fr/OrcaSlicer_fr.po b/localization/i18n/fr/OrcaSlicer_fr.po index 021efd24b4..c309fca9d2 100644 --- a/localization/i18n/fr/OrcaSlicer_fr.po +++ b/localization/i18n/fr/OrcaSlicer_fr.po @@ -15,7 +15,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n==0 || n==1) ? 0 : 1;\n" -"X-Generator: Poedit 3.5\n" +"X-Generator: Poedit 3.6\n" msgid "Supports Painting" msgstr "Peindre les supports" @@ -212,8 +212,9 @@ msgstr "Gizmo-Redimensionner" msgid "Error: Please close all toolbar menus first" msgstr "Erreur : Veuillez d'abord fermer tous les menus de la barre d'outils" +#. inches msgid "in" -msgstr "dans" +msgstr "" msgid "mm" msgstr "mm" @@ -3731,11 +3732,11 @@ msgstr "" #, c-format, boost-format msgid "" -"Recommended nozzle temperature of this filament type is [%d, %d] degree " -"centigrade" +"The recommended nozzle temperature for this filament type is [%d, %d] " +"degrees Celsius." msgstr "" "La température de buse recommandée pour ce type de filament est de [%d, %d] " -"degrés centigrades" +"degrés Celsius." msgid "" "Too small max volumetric speed.\n" @@ -3823,10 +3824,10 @@ msgid "" "YES - Keep Prime Tower\n" "NO - Keep Adaptive Layer Height and Independent Support Layer Height" msgstr "" -"La tour de purge ne fonctionne pas lorsque la hauteur de couche adaptative " +"La tour d’amorçage ne fonctionne pas lorsque la hauteur de couche adaptative " "ou la hauteur de couche de support indépendante est activée. \n" "Que souhaitez-vous conserver ? \n" -"OUI - Conserver la tour de purge \n" +"OUI - Conserver la tour d’amorçage \n" "NON - Conserver la hauteur de la couche adaptative et la hauteur de la " "couche de support indépendante" @@ -3836,10 +3837,10 @@ msgid "" "YES - Keep Prime Tower\n" "NO - Keep Adaptive Layer Height" msgstr "" -"La tour de purge ne fonctionne pas lorsque la hauteur de couche adaptative " +"La tour d’amorçage ne fonctionne pas lorsque la hauteur de couche adaptative " "est activée. \n" "Que souhaitez-vous conserver ? \n" -"OUI - Conserver la tour de purge \n" +"OUI - Conserver la tour d’amorçage \n" "NON - Conserver la hauteur de la couche adaptative" msgid "" @@ -3848,7 +3849,7 @@ msgid "" "YES - Keep Prime Tower\n" "NO - Keep Independent Support Layer Height" msgstr "" -"La tour de purge ne fonctionne pas lorsque la hauteur de la couche de " +"La tour d’amorçage ne fonctionne pas lorsque la hauteur de la couche de " "support indépendante est activée.\n" "Que souhaitez-vous conserver ?\n" "OUI - Garder la tour de purge\n" @@ -4943,7 +4944,7 @@ msgid "" "top/bottom/side views" msgstr "" "Passage automatique de la vue en plan à la vue en perspective lorsque l’on " -"passe d’une vue de haut en bas ou de côté à une vue orthographique." +"passe d’une vue de haut en bas ou de côté à une vue orthographique" msgid "Show &G-code Window" msgstr "Afficher la fenêtre du &G-code" @@ -5892,8 +5893,8 @@ msgstr[1] "%1$d L'objets sont mis en couleur." #, c-format, boost-format msgid "%1$d object was loaded as a part of cut object." msgid_plural "%1$d objects were loaded as parts of cut object" -msgstr[0] "%1$d objet a été chargé en tant que partie de l’objet coupé" -msgstr[1] "%1$d objets ont été chargés en tant que partie de l’objet coupé" +msgstr[0] "%1$d objet a été chargé en tant que partie de l’objet coupé." +msgstr[1] "%1$d objets ont été chargés en tant que partie de l’objet coupé." msgid "ERROR" msgstr "ERREUR" @@ -6775,7 +6776,7 @@ msgstr "" "La plaque% d : %s n'est pas suggéré pour l'utilisation du filament " "d'impression %s(%s). Si vous souhaitez toujours effectuer ce travail " "d'impression, veuillez régler la température du plateau de ce filament sur " -"un nombre différent de zéro" +"un nombre différent de zéro." msgid "Switching the language requires application restart.\n" msgstr "Le changement de langue nécessite le redémarrage de l'application.\n" @@ -7864,16 +7865,16 @@ msgid "" "Prime tower is required for smooth timelapse. There may be flaws on the " "model without prime tower. Are you sure you want to disable prime tower?" msgstr "" -"Une tour de purge est requise pour le mode Timeplase fluide. Il peut y avoir " -"des défauts sur le modèle sans tour de purge. Êtes-vous sûr de vouloir la " -"désactiver ?" +"Une tour d’amorçage est requise pour le mode Timeplase fluide. Il peut y " +"avoir des défauts sur le modèle sans tour de purge. Êtes-vous sûr de vouloir " +"la désactiver ?" msgid "" "Prime tower is required for smooth timelapse. There may be flaws on the " "model without prime tower. Do you want to enable prime tower?" msgstr "" -"Une tour de purge est requise pour un mode timelapse fluide. Il peut y avoir " -"des défauts sur le modèle sans tour de purge. Voulez-vous activer la " +"Une tour d’amorçage est requise pour un mode timelapse fluide. Il peut y " +"avoir des défauts sur le modèle sans tour de purge. Voulez-vous activer la " "désactiver?" msgid "Still print by object?" @@ -8124,7 +8125,7 @@ msgid "Multimaterial" msgstr "Multi-matériaux" msgid "Prime tower" -msgstr "Tour de purge" +msgstr "Tour d’amorçage" msgid "Filament for Features" msgstr "Filament pour les caractéristiques" @@ -9724,7 +9725,7 @@ msgstr "" "de l'impression." msgid "Prime Tower" -msgstr "Tour de purge" +msgstr "Tour d’amorçage" msgid " is too close to others, and collisions may be caused.\n" msgstr "" @@ -9827,57 +9828,57 @@ msgid "" "The prime tower is currently only supported for the Marlin, RepRap/Sprinter, " "RepRapFirmware and Repetier G-code flavors." msgstr "" -"La tour principale n’est actuellement prise en charge que pour les versions " +"La tour d’amorçage n’est actuellement prise en charge que pour les versions " "Marlin, RepRap/Sprinter, RepRapFirmware et Repetier G-code." msgid "The prime tower is not supported in \"By object\" print." msgstr "" -"La tour de purge n'est pas prise en charge dans l'impression \"Par objet\"." +"La tour d’amorçage n'est pas prise en charge dans l'impression \"Par objet\"." msgid "" "The prime tower is not supported when adaptive layer height is on. It " "requires that all objects have the same layer height." msgstr "" -"La tour de purge n'est pas prise en charge lorsque la hauteur de couche " +"La tour d’amorçage n'est pas prise en charge lorsque la hauteur de couche " "adaptative est activée. Cela nécessite que tous les objets aient la même " "hauteur de couche." msgid "The prime tower requires \"support gap\" to be multiple of layer height" msgstr "" -"La tour de purge nécessite que \"l'écart de support\" soit un multiple de la " -"hauteur de la couche" +"La tour d’amorçage nécessite que \"l'écart de support\" soit un multiple de " +"la hauteur de la couche" msgid "The prime tower requires that all objects have the same layer heights" msgstr "" -"La tour de purge nécessite que tous les objets aient la même hauteur de " +"La tour d’amorçage nécessite que tous les objets aient la même hauteur de " "couche" msgid "" "The prime tower requires that all objects are printed over the same number " "of raft layers" msgstr "" -"La tour de purge nécessite que tous les objets soient imprimés sur le même " +"La tour d’amorçage nécessite que tous les objets soient imprimés sur le même " "nombre de couche de radeau" msgid "" "The prime tower is only supported for multiple objects if they are printed " "with the same support_top_z_distance" msgstr "" -"La tour de purge n’est prise en charge pour plusieurs objets que s’ils sont " -"imprimés avec la même valeur de support_top_z_distance." +"La tour d’amorçage n’est prise en charge pour plusieurs objets que s’ils " +"sont imprimés avec la même valeur de support_top_z_distance." msgid "" "The prime tower requires that all objects are sliced with the same layer " "heights." msgstr "" -"La tour de purge nécessite que tous les objets soient découpés avec la même " -"hauteur de couche." +"La tour d’amorçage nécessite que tous les objets soient découpés avec la " +"même hauteur de couche." msgid "" "The prime tower is only supported if all objects have the same variable " "layer height" msgstr "" -"La tour de purge n'est prise en charge que si tous les objets ont la même " +"La tour d’amorçage n'est prise en charge que si tous les objets ont la même " "hauteur de couche variable" msgid "" @@ -9906,8 +9907,8 @@ msgstr "" msgid "" "The prime tower requires that support has the same layer height with object." msgstr "" -"La tour de purge nécessite que le support ait la même hauteur de couche avec " -"l'objet." +"La tour d’amorçage nécessite que le support ait la même hauteur de couche " +"avec l'objet." msgid "" "Organic support tree tip diameter must not be smaller than support material " @@ -14546,7 +14547,7 @@ msgstr "" "une vidéo timelapse une fois l'impression terminée. Si le mode lisse est " "sélectionné, l'extrudeur se déplace vers la goulotte d'évacuation à chaque " "couche imprimée, puis prend un cliché. Étant donné que le filament fondu " -"peut s'échapper de la buse pendant la prise de vue, une tour de purge est " +"peut s'échapper de la buse pendant la prise de vue, une tour d’amorçage est " "requise en mode lisse pour essuyer la buse." msgid "Traditional" @@ -14623,10 +14624,10 @@ msgstr "" "PAUSE pour déclencher l’action de changement manuel de filament." msgid "Purge in prime tower" -msgstr "Purge dans la tour de purge" +msgstr "Purge dans la tour d’amorçage" msgid "Purge remaining filament into prime tower" -msgstr "Purger le filament restant dans la tour de purge" +msgstr "Purger le filament restant dans la tour d’amorçage" msgid "Enable filament ramming" msgstr "Activer le pilonnage du filament" @@ -14952,8 +14953,8 @@ msgid "" msgstr "" "La couche de support utilise la hauteur de la couche indépendamment de la " "couche objet. Cela permet de personnaliser l’écart de Z et de gagner du " -"temps d'impression. Cette option ne sera pas valide lorsque la tour de purge " -"sera activée." +"temps d'impression. Cette option ne sera pas valide lorsque la tour " +"d’amorçage sera activée." msgid "Threshold angle" msgstr "Angle de seuil" @@ -15305,13 +15306,13 @@ msgstr "" "purge multiplié par les volumes de purge dans le tableau." msgid "Prime volume" -msgstr "Premier volume" +msgstr "Volume d’amorçage" msgid "The volume of material to prime extruder on tower." msgstr "Le volume de matériau pour amorcer l'extrudeur sur la tour." msgid "Width of prime tower" -msgstr "Largeur de la tour de purge" +msgstr "Largeur de la tour d’amorçage" msgid "Wipe tower rotation angle" msgstr "Angle de rotation de la tour d’essuyage" @@ -15405,7 +15406,7 @@ msgstr "" "matériaux de remplissage des objets. Cela peut réduire la quantité de " "déchets et le temps d'impression. Si les parois sont imprimées avec un " "filament transparent, le remplissage de couleurs mélangées sera visible. " -"Cela ne prendra effet que si la tour de purge est activée." +"Cela ne prendra effet que si la tour d’amorçage est activée." msgid "" "Purging after filament change will be done inside objects' support. This may " @@ -15414,7 +15415,7 @@ msgid "" msgstr "" "La purge après le changement de filament se fera à l'intérieur du support " "des objets. Cela peut réduire la quantité de déchets et le temps " -"d'impression. Cela ne prendra effet que si une tour de purge est activée." +"d'impression. Cela ne prendra effet que si une tour d’amorçage est activée." msgid "" "This object will be used to purge the nozzle after a filament change to save " @@ -15424,7 +15425,7 @@ msgstr "" "Cet objet sera utilisé pour purger la buse après un changement de filament " "afin d'économiser du filament et de réduire le temps d'impression. Les " "couleurs des objets seront mélangées en conséquence. Cela ne prendra effet " -"que si la tour de purge est activée." +"que si la tour d’amorçage est activée." msgid "Maximal bridging distance" msgstr "Distance de pont maximale" @@ -20773,7 +20774,7 @@ msgstr "" #, c-format, boost-format #~ msgid "" #~ "Bed temperature of other layer is lower than bed temperature of initial " -#~ "layer for more than %d degree centigrade.\n" +#~ "layer for more than %d degrees Celsius.\n" #~ "This may cause model broken free from build plate during printing" #~ msgstr "" #~ "La température du plateau des autres couches est inférieure à la " diff --git a/localization/i18n/hu/OrcaSlicer_hu.po b/localization/i18n/hu/OrcaSlicer_hu.po index d708309afa..35e7a365d2 100644 --- a/localization/i18n/hu/OrcaSlicer_hu.po +++ b/localization/i18n/hu/OrcaSlicer_hu.po @@ -3620,8 +3620,8 @@ msgstr "" #, c-format, boost-format msgid "" -"Recommended nozzle temperature of this filament type is [%d, %d] degree " -"centigrade" +"The recommended nozzle temperature for this filament type is [%d, %d] " +"degrees Celsius." msgstr "" "Az ajánlott fúvóka hőmérséklet ehhez a filament típushoz [%d, %d] Celsius-fok" @@ -17907,7 +17907,7 @@ msgstr "" #, c-format, boost-format #~ msgid "" #~ "Bed temperature of other layer is lower than bed temperature of initial " -#~ "layer for more than %d degree centigrade.\n" +#~ "layer for more than %d degrees Celsius.\n" #~ "This may cause model broken free from build plate during printing" #~ msgstr "" #~ "A többi réteg asztalhőmérséklete több mint %d Celsius-fokkal alacsonyabb, " diff --git a/localization/i18n/it/OrcaSlicer_it.po b/localization/i18n/it/OrcaSlicer_it.po index 6805e14f9b..0ae825c9ec 100644 --- a/localization/i18n/it/OrcaSlicer_it.po +++ b/localization/i18n/it/OrcaSlicer_it.po @@ -2780,31 +2780,31 @@ msgstr "Invia configurazione di stampa" #, c-format, boost-format msgid "Successfully sent. Will automatically jump to the device page in %ss" msgstr "" -"Inviato con successo. Passerà automaticamente alla pagina del dispositivo in " -"%s" +"Inviato con successo. Passaggio automatico alla pagina del dispositivo in %s " +"s" #, c-format, boost-format msgid "Successfully sent. Will automatically jump to the next page in %ss" msgstr "" -"Inviato con successo. Passerà automaticamente alla pagina successiva in %ss" +"Inviato con successo. Passaggio automatico alla pagina successiva in %s s" msgid "An SD card needs to be inserted before printing via LAN." -msgstr "" -"È necessario inserire una scheda microSD prima di stampare tramite LAN." +msgstr "È necessario inserire una scheda SD prima di stampare tramite LAN." msgid "Sending gcode file over LAN" msgstr "Invio file G-code tramite LAN" msgid "Sending gcode file to sdcard" -msgstr "Invia file G-code a scheda microSD" +msgstr "Invio file G-code a scheda SD" #, c-format, boost-format msgid "Successfully sent. Close current page in %s s" -msgstr "Inviato con successo. Chiudi la pagina corrente in %s s" +msgstr "Inviato con successo. Chiusura della pagina corrente in %s s" msgid "An SD card needs to be inserted before sending to printer." msgstr "" -"È necessario inserire una scheda microSD prima di inviarla alla stampante." +"È necessario inserire una scheda SD prima di inviare il G-code alla " +"stampante." msgid "Importing SLA archive" msgstr "Importa archivio SLA" @@ -3390,7 +3390,7 @@ msgid "" "Error message: %1%.\n" "Source file %2%." msgstr "" -"Impossibile salvare il file del G-code.\n" +"Impossibile salvare il file G-code.\n" "Messaggio di errore: %1%.\n" "File sorgente %2%." @@ -3725,11 +3725,11 @@ msgstr "" #, c-format, boost-format msgid "" -"Recommended nozzle temperature of this filament type is [%d, %d] degree " -"centigrade" +"The recommended nozzle temperature for this filament type is [%d, %d] " +"degrees Celsius." msgstr "" "La temperatura dell'ugello consigliata per questo filamento è [%d, %d] gradi " -"centigradi" +"Celsius." msgid "" "Too small max volumetric speed.\n" @@ -3740,9 +3740,9 @@ msgstr "" #, c-format, boost-format msgid "" -"Current chamber temperature is higher than the material's safe " -"temperature,it may result in material softening and clogging.The maximum " -"safe temperature for the material is %d" +"Current chamber temperature is higher than the material's safe temperature," +"it may result in material softening and clogging.The maximum safe " +"temperature for the material is %d" msgstr "" "L'attuale temperatura della camera è superiore alla temperatura di sicurezza " "del materiale. Potrebbe causare l'ammorbidimento e l'intasamento del " @@ -5225,7 +5225,7 @@ msgid "Video Stopped." msgstr "Video Interrotto." msgid "LAN Connection Failed (Failed to start liveview)" -msgstr "Connessione LAN non riuscita (impossibile avviare video in diretta)" +msgstr "Connessione LAN non riuscita (impossibile avviare il video in diretta)" msgid "" "Virtual Camera Tools is required for this task!\n" @@ -7626,14 +7626,15 @@ msgstr "" msgid "An SD card needs to be inserted before send to printer SD card." msgstr "" -"È necessario inserire una scheda SD prima di inviare la stampa alla scheda " +"È necessario inserire una scheda SD prima di inviare il G-code alla scheda " "SD della stampante." msgid "The printer is required to be in the same LAN as Orca Slicer." msgstr "La stampante deve essere sulla stessa LAN di OrcaSlicer." msgid "The printer does not support sending to printer SD card." -msgstr "La stampante non supporta l'invio alla scheda SD della stampante." +msgstr "" +"La stampante non supporta l'invio del G-code alla scheda SD della stampante." msgid "Slice ok." msgstr "Elaborazione completa." @@ -12363,8 +12364,8 @@ msgid "mm/s² or %" msgstr "mm/s o %" msgid "" -"Acceleration of sparse infill. If the value is expressed as a percentage " -"(e.g. 100%), it will be calculated based on the default acceleration." +"Acceleration of sparse infill. If the value is expressed as a percentage (e." +"g. 100%), it will be calculated based on the default acceleration." msgstr "" "Accelerazione del riempimento sparso. Se il valore è espresso in percentuale " "(ad esempio 100%), verrà calcolato in base all'accelerazione predefinita." @@ -12913,8 +12914,8 @@ msgid "" "descriptive text. If you print from SD card, the additional weight of the " "file could make your firmware slow down." msgstr "" -"Abilita questa opzione per ottenere un file G-code commentato, con un testo " -"descrittivo per ciascuna riga. Se si stampa dalla scheda SD, il peso " +"Abilita questa opzione per ottenere un file G-code con commenti, cioè con un " +"testo descrittivo per ciascuna riga. Se si stampa dalla scheda SD, il peso " "aggiuntivo del file potrebbe rallentare il firmware." msgid "Infill combination" @@ -15372,9 +15373,9 @@ msgid "Idle temperature" msgstr "Temperatura di inattività" msgid "" -"Nozzle temperature when the tool is currently not used in multi-tool " -"setups.This is only used when 'Ooze prevention' is active in Print Settings. " -"Set to 0 to disable." +"Nozzle temperature when the tool is currently not used in multi-tool setups." +"This is only used when 'Ooze prevention' is active in Print Settings. Set to " +"0 to disable." msgstr "" "Temperatura dell'ugello quando l'estrusore non è attualmente utilizzato in " "configurazioni multitestina. Viene utilizzato solo quando 'Prevenzione " @@ -15898,11 +15899,11 @@ msgid "Debug level" msgstr "Livello di debug" msgid "" -"Sets debug logging level. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, " -"5:trace\n" +"Sets debug logging level. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" +"trace\n" msgstr "" -"Imposta livello di debug. 0:fatale, 1:errore, 2:avviso, 3:info, 4:debug, " -"5:traccia\n" +"Imposta livello di debug. 0:fatale, 1:errore, 2:avviso, 3:info, 4:debug, 5:" +"traccia\n" msgid "Enable timelapse for print" msgstr "Abilita timelapse per la stampa" @@ -16359,8 +16360,8 @@ msgstr "Supporto: generazione punti di contatto" msgid "" "Unknown file format. Input file must have .stl, .obj, .amf(.xml) extension." msgstr "" -"Formato file sconosciuto: il file di input deve avere " -"un'estensione .stl, .obj o .amf(.xml)." +"Formato file sconosciuto: il file di input deve avere un'estensione .stl, ." +"obj o .amf(.xml)." msgid "Loading of a model file failed." msgstr "Caricamento file del modello non riuscito." @@ -16370,8 +16371,8 @@ msgstr "Impossibile leggere il file fornito perché è vuoto" msgid "Unknown file format. Input file must have .3mf or .zip.amf extension." msgstr "" -"Formato file sconosciuto: il file di input deve avere un'estensione .3mf " -"o .zip.amf." +"Formato file sconosciuto: il file di input deve avere un'estensione .3mf o ." +"zip.amf." msgid "Canceled" msgstr "Annullato" @@ -19248,10 +19249,9 @@ msgstr "" #~ "\n" #~ "\n" #~ "Per impostazione predefinita, i piccoli bridge interni vengono filtrati e " -#~ "il riempimento solido interno viene stampato direttamente sul " -#~ "riempimento.Questo metodo funziona bene nella maggior parte dei casi, " -#~ "velocizzando la stampa senza compromettere troppo la qualità della " -#~ "superficie superiore.\n" +#~ "il riempimento solido interno viene stampato direttamente sul riempimento." +#~ "Questo metodo funziona bene nella maggior parte dei casi, velocizzando la " +#~ "stampa senza compromettere troppo la qualità della superficie superiore.\n" #~ "\n" #~ "Tuttavia, in modelli fortemente inclinati o curvi, soprattutto se si " #~ "utilizza una densità di riempimento troppo bassa, potrebbe comportare " @@ -19875,10 +19875,10 @@ msgstr "" #~ "RHEL 7 puoi trovare quelle istruzioni sul wiki." #~ msgid "" -#~ "Relative extrusion is recommended when using \"label_objects\" " -#~ "option.Some extruders work better with this option unchecked (absolute " -#~ "extrusion mode). Wipe tower is only compatible with relative mode. It is " -#~ "always enabled on BambuLab printers. Default is checked" +#~ "Relative extrusion is recommended when using \"label_objects\" option." +#~ "Some extruders work better with this option unchecked (absolute extrusion " +#~ "mode). Wipe tower is only compatible with relative mode. It is always " +#~ "enabled on BambuLab printers. Default is checked" #~ msgstr "" #~ "L'estrusione relativa è consigliata quando si utilizza l'opzione " #~ "\"label_objects\". Alcuni estrusori funzionano meglio con questa opzione " @@ -20244,11 +20244,11 @@ msgstr "" #, c-format, boost-format #~ msgid "" #~ "Bed temperature of other layer is lower than bed temperature of initial " -#~ "layer for more than %d degree centigrade.\n" +#~ "layer for more than %d degrees Celsius.\n" #~ "This may cause model broken free from build plate during printing" #~ msgstr "" #~ "The bed temperature of other layers is lower than the bed temperature of " -#~ "the first layer by more than %d degrees centigrade.\n" +#~ "the first layer by more than %d degrees Celsius.\n" #~ "This may cause models to break free from the build plate during printing." #~ msgid "" diff --git a/localization/i18n/ja/OrcaSlicer_ja.po b/localization/i18n/ja/OrcaSlicer_ja.po index 432d9ca490..3d68f5408a 100644 --- a/localization/i18n/ja/OrcaSlicer_ja.po +++ b/localization/i18n/ja/OrcaSlicer_ja.po @@ -3579,8 +3579,8 @@ msgstr "" #, c-format, boost-format msgid "" -"Recommended nozzle temperature of this filament type is [%d, %d] degree " -"centigrade" +"The recommended nozzle temperature for this filament type is [%d, %d] " +"degrees Celsius." msgstr "このフィラメントで推奨ノズル温度は %d ~ %d ℃です。" msgid "" @@ -17653,7 +17653,7 @@ msgstr "" #, c-format, boost-format #~ msgid "" #~ "Bed temperature of other layer is lower than bed temperature of initial " -#~ "layer for more than %d degree centigrade.\n" +#~ "layer for more than %d degrees Celsius.\n" #~ "This may cause model broken free from build plate during printing" #~ msgstr "" #~ "ベッド温度が1層目温度より %d ℃以上低いです。造形中プレートより離脱する可能" diff --git a/localization/i18n/ko/OrcaSlicer_ko.po b/localization/i18n/ko/OrcaSlicer_ko.po index b65062afc2..5e500534b5 100644 --- a/localization/i18n/ko/OrcaSlicer_ko.po +++ b/localization/i18n/ko/OrcaSlicer_ko.po @@ -3594,8 +3594,8 @@ msgstr "" #, c-format, boost-format msgid "" -"Recommended nozzle temperature of this filament type is [%d, %d] degree " -"centigrade" +"The recommended nozzle temperature for this filament type is [%d, %d] " +"degrees Celsius." msgstr "이 필라멘트 유형의 권장 노즐 온도는 [%d, %d]°C입니다" msgid "" @@ -19244,7 +19244,7 @@ msgstr "" #, c-format, boost-format #~ msgid "" #~ "Bed temperature of other layer is lower than bed temperature of initial " -#~ "layer for more than %d degree centigrade.\n" +#~ "layer for more than %d degrees Celsius.\n" #~ "This may cause model broken free from build plate during printing" #~ msgstr "" #~ "다른 레이어의 베드 온도가 초기 레이어의 베드 온도보다 %d°C 이상 낮습니" diff --git a/localization/i18n/nl/OrcaSlicer_nl.po b/localization/i18n/nl/OrcaSlicer_nl.po index 0e0f7d5215..f81ff9df85 100644 --- a/localization/i18n/nl/OrcaSlicer_nl.po +++ b/localization/i18n/nl/OrcaSlicer_nl.po @@ -3657,11 +3657,11 @@ msgstr "" #, c-format, boost-format msgid "" -"Recommended nozzle temperature of this filament type is [%d, %d] degree " -"centigrade" +"The recommended nozzle temperature for this filament type is [%d, %d] " +"degrees Celsius." msgstr "" "De aanbevolen mondstuk temperatuur voor dit type filament is [%d, %d] graden " -"Celsius" +"Celsius." msgid "" "Too small max volumetric speed.\n" @@ -18231,10 +18231,10 @@ msgstr "" #, c-format, boost-format #~ msgid "" #~ "Bed temperature of other layer is lower than bed temperature of initial " -#~ "layer for more than %d degree centigrade.\n" +#~ "layer for more than %d degrees Celsius.\n" #~ "This may cause model broken free from build plate during printing" #~ msgstr "" -#~ "De printbed temperatuur voor de overige lagen is %d graden celcius lager " +#~ "De printbed temperatuur voor de overige lagen is %d graden Celcius lager " #~ "dan de temperatuur voor de eerste laag.\n" #~ "Hierdoor kan de print loskomen van het printbed gedurende de printtaak" diff --git a/localization/i18n/pl/OrcaSlicer_pl.po b/localization/i18n/pl/OrcaSlicer_pl.po index 53146b7cc2..3c472a6ccb 100644 --- a/localization/i18n/pl/OrcaSlicer_pl.po +++ b/localization/i18n/pl/OrcaSlicer_pl.po @@ -1189,7 +1189,7 @@ msgid "" "Also disables 'reload from disk' option." msgstr "" "Nie zapisuj lokalnej ścieżki do pliku 3MF.\n" -"Uniemożliwia również opcję „przeładuj z dysku”." +"Uniemożliwia również opcję \"przeładuj z dysku\"." #. TRN: An menu option to convert the SVG into an unmodifiable model part. msgid "Bake" @@ -1206,7 +1206,7 @@ msgid "Save SVG file" msgstr "Zapisz plik SVG" msgid "Save as '.svg' file" -msgstr "Zapisz jako plik „.svg”" +msgstr "Zapisz jako plik \".svg\"" msgid "Size in emboss direction." msgstr "Rozmiar w kierunku wytłaczania." @@ -1248,7 +1248,7 @@ msgstr "Odbij poziomo" #. TRN: This is the name of the action that shows in undo/redo stack (changing part type from SVG to something else). msgid "Change SVG Type" -msgstr "Zmień rodzaj SVG" +msgstr "Zmień typ SVG" #. TRN - Input label. Be short as possible msgid "Mirror" @@ -1263,7 +1263,7 @@ msgstr "Plik nie istnieje (%1%)." #, boost-format msgid "Filename has to end with \".svg\" but you selected %1%" -msgstr "Nazwa pliku musi kończyć się na „.svg”, ale wybrałeś %1%" +msgstr "Nazwa pliku musi kończyć się na \".svg\", ale wybrałeś %1%" #, boost-format msgid "Nano SVG parser can't load from file (%1%)." @@ -1528,10 +1528,10 @@ msgstr "" "Czy kontynuować?" msgid "Remember my choice" -msgstr "Zapamiętanie decyzji" +msgstr "Zapamiętaj moją decyzję" msgid "Loading configuration" -msgstr "Wczytywanie konfiguracji" +msgstr "Ładowanie konfiguracji" #, c-format, boost-format msgid "Click to download new version in default browser: %s" @@ -1838,7 +1838,7 @@ msgid "Add settings" msgstr "Dodaj ustawienia" msgid "Change type" -msgstr "Zmień rodzaj" +msgstr "Zmień typ" msgid "Set as an individual object" msgstr "Ustaw jako osobny obiekt" @@ -2333,22 +2333,22 @@ msgid "Infill density(%)" msgstr "Gęstość wypełnienia (%)" msgid "Auto Brim" -msgstr "Automatyczne obrzeże" +msgstr "Automatyczny brim" msgid "Mouse ear" msgstr "Ucho myszy" msgid "Outer brim only" -msgstr "Tylko zewnętrzne obrzeże" +msgstr "Tylko zewnętrzny brim" msgid "Inner brim only" -msgstr "Tylko wewnętrzne obrzeże" +msgstr "Tylko wewnętrzny brim" msgid "Outer and inner brim" -msgstr "Zewnętrzne i wewnętrzne obrzeże" +msgstr "Zewnętrzny i wewnętrzny brim" msgid "No-brim" -msgstr "Bez obrzeża" +msgstr "Bez brimu" msgid "Outer wall speed" msgstr "Prędkość zewnętrznej ściany" @@ -2357,7 +2357,7 @@ msgid "Plate" msgstr "Płyta" msgid "Brim" -msgstr "Obrzeże (brim)" +msgstr "Brim" msgid "Object/Part Setting" msgstr "Ustawienia obiektu/części" @@ -2576,8 +2576,8 @@ msgid "" "Choose an AMS slot then press \"Load\" or \"Unload\" button to automatically " "load or unload filaments." msgstr "" -"Wybierz gniazdo AMS, a następnie naciśnij przycisk „Ładuj” lub " -"„Rozładuj” ,aby automatycznie załadować lub wyładować filamenty." +"Wybierz gniazdo AMS, a następnie naciśnij przycisk „Ładuj” lub „Rozładuj”, " +"aby automatycznie załadować lub wyładować filamenty." msgid "Edit" msgstr "Edytuj" @@ -2861,13 +2861,13 @@ msgid "About %s" msgstr "O %s" msgid "OrcaSlicer is based on BambuStudio, PrusaSlicer, and SuperSlicer." -msgstr "OrcaSlicer jest oparty o BambuStudio, PrusaSlicer i SuperSlicer." +msgstr "OrcaSlicer jest oparty na BambuStudio, PrusaSlicer i SuperSlicer." msgid "BambuStudio is originally based on PrusaSlicer by PrusaResearch." -msgstr "BambuStudio jest oparty o PrusaSlicer od PrusaResearch." +msgstr "BambuStudio jest oparty na PrusaSlicer od PrusaResearch." msgid "PrusaSlicer is originally based on Slic3r by Alessandro Ranellucci." -msgstr "PrusaSlicer początkowo oparty o Slic3r od Alessandro Ranellucci." +msgstr "PrusaSlicer początkowo oparty na Slic3r od Alessandro Ranellucci." msgid "" "Slic3r was created by Alessandro Ranellucci with the help of many other " @@ -2970,7 +2970,7 @@ msgid "Nozzle Diameter" msgstr "Średnica dyszy" msgid "Bed Type" -msgstr "Rodzaj płyty" +msgstr "Typ płyty" msgid "Nozzle temperature" msgstr "Temperatura dyszy" @@ -3541,7 +3541,7 @@ msgid "Bed Leveling" msgstr "Poziomowanie stołu" msgid "Timelapse" -msgstr "Film poklatkowy" +msgstr "Timelapse" msgid "Flow Dynamic Calibration" msgstr "Kalibracja dynamiki przepływu" @@ -3688,8 +3688,8 @@ msgstr "" #, c-format, boost-format msgid "" -"Recommended nozzle temperature of this filament type is [%d, %d] degree " -"centigrade" +"The recommended nozzle temperature for this filament type is [%d, %d] " +"degrees Celsius." msgstr "" "Zalecana temperatura dyszy dla tego typu filamentu wynosi [%d, %d] stopni " "Celsjusza" @@ -3703,9 +3703,9 @@ msgstr "" #, c-format, boost-format msgid "" -"Current chamber temperature is higher than the material's safe " -"temperature,it may result in material softening and clogging.The maximum " -"safe temperature for the material is %d" +"Current chamber temperature is higher than the material's safe temperature," +"it may result in material softening and clogging.The maximum safe " +"temperature for the material is %d" msgstr "" "Obecna temperatura komory jest wyższa niż bezpieczna temperatura dla " "filamentu, co może prowadzić do jego mięknięcia i zatykania. Maksymalna " @@ -3757,7 +3757,7 @@ msgid "" "\n" "The value will be reset to 0." msgstr "" -"Zbyt duża kompensacja efektu „stopy słonia” nie jest wskazana.\n" +"Zbyt duża kompensacja efektu \"stopy słonia\" nie jest wskazana.\n" "Jeśli rzeczywiście występuje poważny efekt stopy słonia, proszę sprawdzić " "inne ustawienia.\n" "Na przykład, czy temperatura stołu jest zbyt wysoka.\n" @@ -3832,10 +3832,10 @@ msgid "" msgstr "" "Tryb Wazy działa tylko wtedy gdy liczba pętli ściany wynosi 1, wyłączone są " "podpory, liczba warstw górnej powłoki wynosi 0, gęstość wypełnienia wynosi " -"0, a rodzaj filmu poklatkowego ustalony jest na tradycyjny." +"0, a rodzaj timelapse ustalony jest na tradycyjny." msgid " But machines with I3 structure will not generate timelapse videos." -msgstr " Jednak maszyny z budową I3 nie będą generować filmów poklatkowych." +msgstr " Jednak maszyny z budową I3 nie będą generować filmów timelapse." msgid "" "Change these settings automatically? \n" @@ -3940,16 +3940,16 @@ msgid "Motor noise showoff" msgstr "Prezentacja hałasu silnika" msgid "Nozzle filament covered detected pause" -msgstr "Wstrzymanie z powodu pokrycia dyszy filamentem" +msgstr "Wstrzymanio z powodu pokrycia dyszy filamentem" msgid "Cutter error pause" -msgstr "Wstrzymanie z powodu błędu noża" +msgstr "Wstrzymanio z powodu błędu noża" msgid "First layer error pause" -msgstr "Wstrzymanie z powodu błędu pierwszej warstwy" +msgstr "Wstrzymanio z powodu błędu pierwszej warstwy" msgid "Nozzle clog pause" -msgstr "Wstrzymanie z powodu zatkanej dyszy" +msgstr "Wstrzymano z powodu zatkania dyszy" msgid "Unknown" msgstr "Nieznany" @@ -4067,7 +4067,7 @@ msgid "Read Only" msgstr "Tylko do odczytu" msgid "Read Write" -msgstr "Odczyt/zapis" +msgstr "Odczyt/Zapis" msgid "Slicing State" msgstr "Stan cięcia" @@ -4351,7 +4351,7 @@ msgid "Adaptive" msgstr "Adaptacyjne" msgid "Quality / Speed" -msgstr "Jakość / prędkość" +msgstr "Jakość / Prędkość" msgid "Smooth" msgstr "Wygładź" @@ -4587,7 +4587,7 @@ msgid "Custom camera source" msgstr "Zewnętrzna kamera IP" msgid "Show \"Live Video\" guide page." -msgstr "Pokaż stronę z przewodnikiem „Transmisja na żywo”." +msgstr "Pokaż stronę z przewodnikiem \"Transmisja na żywo\"." msgid "720p" msgstr "720p" @@ -4605,7 +4605,7 @@ msgid "" "You can find it in \"Settings > Network > Connection code\"\n" "on the printer, as shown in the figure:" msgstr "" -"Możesz znaleźć go w sekcji „Ustawienia > Sieć > Kod połączenia”\n" +"Możesz znaleźć go w sekcji \"Ustawienia > Sieć > Kod połączenia\"\n" "na drukarce, jak pokazano na rysunku:" msgid "Invalid input." @@ -5244,7 +5244,7 @@ msgid "Show all files, recent first." msgstr "Pokaż wszystkie pliki, najnowsze na początku." msgid "Switch to timelapse files." -msgstr "Przełącz na pliki filmów poklatkowych." +msgstr "Przełącz na pliki filmów timelapse." msgid "Video" msgstr "Wideo" @@ -6058,7 +6058,7 @@ msgid "Connection" msgstr "Połączenie" msgid "Bed type" -msgstr "Rodzaj płyty" +msgstr "Typ płyty" msgid "Flushing volumes" msgstr "Objętość płukania" @@ -6166,8 +6166,8 @@ msgid "" "Enabling traditional timelapse photography may cause surface imperfections. " "It is recommended to change to smooth mode." msgstr "" -"Włączenie tradycyjnego filmów poklatkowych może powodować niedoskonałości " -"powierzchni. Zaleca się zmianę trybu na płynny." +"Włączenie tradycyjnego timelapsu może powodować niedoskonałości powierzchni. " +"Zaleca się zmianę trybu na płynny." msgid "Expand sidebar" msgstr "Rozwiń pasek boczny" @@ -6769,7 +6769,7 @@ msgid "Login Region" msgstr "Region logowania" msgid "Stealth Mode" -msgstr "Tryb ukrycia" +msgstr "Tryb niewidoczny" msgid "" "This stops the transmission of data to Bambu's cloud services. Users who " @@ -6935,7 +6935,7 @@ msgid "Clear my choice on the unsaved presets." msgstr "Wyczyść wybory w niezapisanych profilach." msgid "Associate files to OrcaSlicer" -msgstr "Skojarzenia plików" +msgstr "Skojarzenia plików z OrcaSlicer" msgid "Associate .3mf files to OrcaSlicer" msgstr "Skojarzenie plików .3mf" @@ -6956,7 +6956,7 @@ msgid "If enabled, sets OrcaSlicer as default application to open .step files" msgstr "Ustala OrcaSlicer jako domyślny program do otwierania plików .step" msgid "Associate web links to OrcaSlicer" -msgstr "Powiązania odnośników" +msgstr "Powiązania odnośników z OrcaSlicer" msgid "Associate URLs to OrcaSlicer" msgstr "Powiąż URL z OrcaSlicer" @@ -7444,7 +7444,7 @@ msgstr "" "programie (%s)." msgid "An SD card needs to be inserted to record timelapse." -msgstr "Aby nagrywać filmy poklatkowe, należy włożyć kartę SD." +msgstr "Aby nagrywać timelapse, należy włożyć kartę SD." msgid "" "Cannot send the print job to a printer whose firmware is required to get " @@ -7463,14 +7463,14 @@ msgid "" "When enable spiral vase mode, machines with I3 structure will not generate " "timelapse videos." msgstr "" -"Po włączeniu trybu „spiralna waza”, maszyny o strukturze I3 nie będą " -"generować filmów poklatkowych." +"Po włączeniu trybu wazy, maszyny o strukturze I3 nie będą generować filmów " +"timelapse." msgid "" "Timelapse is not supported because Print sequence is set to \"By object\"." msgstr "" -"Film poklatkowy nie jest obsługiwany, ponieważ sekwencja druku jest " -"ustawiona na „Obiekt po obiekcie”." +"Timelapse nie jest obsługiwany, ponieważ sekwencja druku jest ustawiona na " +"„Obiekt po obiekcie”." msgid "Errors" msgstr "Błędy" @@ -7737,15 +7737,15 @@ msgid "" "Prime tower is required for smooth timelapse. There may be flaws on the " "model without prime tower. Are you sure you want to disable prime tower?" msgstr "" -"Wieża czyszcząca jest wymagana dla płynnego filmu poklatkowego. Możliwe są " -"wady na modelu bez wieży czyszczącej. Czy na pewno wyłączyć wieżę czyszczącą?" +"Wieża czyszcząca jest wymagana dla płynnego timelapse. Możliwe są wady na " +"modelu bez wieży czyszczącej. Czy na pewno wyłączyć wieżę czyszczącą?" msgid "" "Prime tower is required for smooth timelapse. There may be flaws on the " "model without prime tower. Do you want to enable prime tower?" msgstr "" -"Wieża czyszcząca jest wymagana dla płynnego filmu poklatkowego. Możliwe są " -"wady na modelu bez wieży czyszczącej. Czy włączyć wieżę czyszczącą?" +"Wieża czyszcząca jest wymagana dla płynnego timelapse. Możliwe są wady na " +"modelu bez wieży czyszczącej. Czy włączyć wieżę czyszczącą?" msgid "Still print by object?" msgstr "Czy nadal drukować według obiektu?" @@ -7835,10 +7835,10 @@ msgid "" "by right-click the empty position of build plate and choose \"Add " "Primitive\"->\"Timelapse Wipe Tower\"." msgstr "" -"Podczas nagrywania filmu poklatkowego bez głowicy drukującej zaleca się " -"dodanie „Film poklatkowy - Wieża czyszcząca” \n" +"Podczas nagrywania timelapse bez głowicy drukującej zaleca się dodanie " +"„Timelapse - Wieża czyszcząca” \n" "przez kliknięcie prawym przyciskiem myszy na pustym miejscu płyty i wybranie " -"„Dodaj Prymityw”->„Film poklatkowy - Wieża czyszcząca”." +"„Dodaj Prymityw”->„Timelapse - Wieża czyszcząca”." msgid "" "A copy of the current system preset will be created, which will be detached " @@ -8329,10 +8329,9 @@ msgid "" "Shall I disable it in order to enable Firmware Retraction?" msgstr "" "Opcja wycierania dyszy nie jest dostępna podczas korzystania z trybu " -"cofnięcia zaszytego w firmware. \n" +"retrakcji zaszytego w firmware. \n" "\n" -"Czy wyłączyć ją, aby umożliwić włączenie cofnięcia filamentu za pomocą " -"firmware?" +"Czy wyłączyć ją, aby umożliwić włączenie retrakcji za pomocą firmware?" msgid "Firmware Retraction" msgstr "Retrakcja realizowana przez firmware" @@ -9579,8 +9578,8 @@ msgid "" "Smooth mode of timelapse is not supported when \"by object\" sequence is " "enabled." msgstr "" -"Tryb „Wygładzony” filmu poklatkowego nie jest wspierany, gdy włączona jest " -"sekwencja „według obiektu”." +"Tryb „Wygładzony” timelapse nie jest obsługiwany, gdy włączona jest " +"sekwencja druku „według obiektu”." msgid "" "Please select \"By object\" print sequence to print multiple objects in " @@ -9847,7 +9846,7 @@ msgstr "" "używanych filamentów jest zbyt zróżnicowany." msgid "Generating skirt & brim" -msgstr "Generowanie Skirtu i Brimu" +msgstr "Generowanie skirtu i brimu" msgid "Exporting G-code" msgstr "Eksportowanie G-code" @@ -9884,17 +9883,17 @@ msgid "Bed custom model" msgstr "Niestandardowy model stołu" msgid "Elephant foot compensation" -msgstr "Kompensacja „stopy słonia”" +msgstr "Kompensacja \"stopy słonia\"" msgid "" "Shrink the initial layer on build plate to compensate for elephant foot " "effect" msgstr "" "Zmniejszenie pierwszej warstwy w płaszczyźnie XY o określoną wartość, aby " -"skompensować efekt „stopy słonia”" +"skompensować efekt \"stopy słonia\"" msgid "Elephant foot compensation layers" -msgstr "Warstwy kompensacji „stopy słonia”" +msgstr "Warstwy kompensacji \"stopy słonia\"" msgid "" "The number of layers on which the elephant foot compensation will be active. " @@ -9902,7 +9901,7 @@ msgid "" "the next layers will be linearly shrunk less, up to the layer indicated by " "this value." msgstr "" -"Liczba warstw, na które będzie rozciągać się kompensacja „stopy słonia”. " +"Liczba warstw, na które będzie rozciągać się kompensacja \"stopy słonia\". " "Pierwsza warstwa zostanie zmniejszona o wartość kompensacji „stopy słonia”, " "a następne warstwy będą zmniejszane liniowo, aż do warstwy wskazanej przez " "tę wartość." @@ -9955,8 +9954,8 @@ msgstr "" "Orca Slicer może przesyłać pliki G-code na hosta drukarki. To pole powinno " "zawierać nazwę hosta, adres IP lub URL hosta drukarki. Host drukowania za " "HAProxy z włączoną autoryzacją podstawową można uzyskać, wpisując nazwę " -"użytkownika i hasło w URL w następującym formacie: https://" -"username:password@your-octopi-address/" +"użytkownika i hasło w URL w następującym formacie: https://username:" +"password@your-octopi-address/" msgid "Device UI" msgstr "UI urządzenia" @@ -10717,19 +10716,19 @@ msgstr "" "będzie obliczana na podstawie prędkości mostu. Wartość domyślna wynosi 150%." msgid "Brim width" -msgstr "Szerokość obrzeża" +msgstr "Szerokość brimu" msgid "Distance from model to the outermost brim line" -msgstr "Odległość od modelu do najbardziej zewnętrznej linii Brimu" +msgstr "Odległość od modelu do najbardziej zewnętrznej linii brimu" msgid "Brim type" -msgstr "Typ obrzeża" +msgstr "Rodzaj brimu" msgid "" "This controls the generation of the brim at outer and/or inner side of " "models. Auto means the brim width is analyzed and calculated automatically." msgstr "" -"To kontroluje generowanie Brimu na zewnętrznej i/lub wewnętrznej stronie " +"To kontroluje generowanie brimu na zewnętrznej i/lub wewnętrznej stronie " "modeli. Auto oznacza, że szerokość Brimu jest analizowana i obliczana " "automatycznie." @@ -10737,36 +10736,36 @@ msgid "Painted" msgstr "Malowane" msgid "Brim-object gap" -msgstr "Odstęp obrzeża od obiektu" +msgstr "Odstęp brimu od obiektu" msgid "" "A gap between innermost brim line and object can make brim be removed more " "easily" msgstr "" -"Szczelina między najbardziej wewnętrzną linią Brimu a obiektem może ułatwić " -"usunięcie Brimu" +"Szczelina między najbardziej wewnętrzną linią brimu a obiektem może ułatwić " +"usunięcie brimu" msgid "Brim ears" -msgstr "Uszy obrzeża" +msgstr "Uszy brim" msgid "Only draw brim over the sharp edges of the model." -msgstr "Rysuj Brim tylko na ostrych krawędziach modelu." +msgstr "Rysuj brim tylko na ostrych krawędziach modelu." msgid "Brim ear max angle" -msgstr "Maksymalny kąt uszu Brimu" +msgstr "Maksymalny kąt dla ucha brim" msgid "" "Maximum angle to let a brim ear appear. \n" "If set to 0, no brim will be created. \n" "If set to ~180, brim will be created on everything but straight sections." msgstr "" -"Maksymalny kąt, przy którym pojawia się ucho Brimu.\n" +"Maksymalny kąt, przy którym pojawia się ucho brimu.\n" "Jeśli ustawione na 0, Brim nie zostanie utworzony.\n" "Jeśli ustawione na ~180, Brim zostanie utworzony wszędzie, oprócz prostych " "sekcji." msgid "Brim ear detection radius" -msgstr "Promień wykrywania uszu Brimu" +msgstr "Promień wykrywania ucha brim" msgid "" "The geometry will be decimated before detecting sharp angles. This parameter " @@ -10967,6 +10966,39 @@ msgid "" "4. Apply to all - generates second bridge layers for both internal and " "external-facing bridges\n" msgstr "" +"Ta opcja umożliwia tworzenie dodatkowej warstwy mostu nad mostami " +"wewnętrznymi i/lub zewnętrznymi.\n" +"\n" +"Dodatkowa warstwa poprawia wygląd i wytrzymałość mostów, co z kolei zwiększa " +"jakość druku kolejnych warstw wypełnienia. Jest to szczególnie przydatne w " +"przypadku szybkich drukarek, gdzie prędkości drukowania mostów i wypełnienia " +"mogą się znacznie różnić. Dodatkowa warstwa zmniejsza również ryzyko " +"powstawania defektu w postaci wybrzuszenia na górnych powierzchniach oraz " +"ogranicza ryzyko odklejania się mostów zewnętrznych od perymetrów.\n" +"\n" +"Zaleca się ustawienie co najmniej opcji „Dla mostów zewnętrznych”,chyba że " +"występują specyficzne problemy z modelem.\n" +"\n" +"Opcje:\n" +"\n" +"Wyłączone – dodatkowa warstwa nie jest generowana. Jest to domyślne " +"ustawienie zapewniające kompatybilność.\n" +"\n" +"Dla mostów zewnętrznych – dodatkowa warstwa jest dodawana tylko do mostów " +"zewnętrznych. Należy pamiętać, że małe mosty, które są krótsze lub węższe " +"niż ustawiona liczba perymetrów, zostaną pominięte, ponieważ druga warstwa " +"nie przyniesie korzyści. Druga warstwa będzie ekstrudowana równolegle do " +"pierwszej, aby zwiększyć wytrzymałość.\n" +"\n" +"Dla mostów wewnętrznych – dodatkowa warstwa jest dodawana tylko do mostów " +"wewnętrznych znajdujących się nad rzadkim wypełnieniem. Warto pamiętać, że " +"mosty wewnętrzne są uwzględniane w całkowitej liczbie górnych warstw modelu. " +"Druga warstwa będzie ekstrudowana maksymalnie prostopadle do pierwszej. " +"Jeśli w odizolowanym obszarze warstwy występują mosty o różnych kątach, jako " +"orientacja zostanie wybrany kąt ostatniego obszaru.\n" +"\n" +"Dla wszystkich mostów – dodatkowa warstwa jest generowana zarówno dla mostów " +"wewnętrznych, jak i zewnętrznych.\n" msgid "Disabled" msgstr "Wyłączony" @@ -11012,6 +11044,34 @@ msgid "" "overhang. This option is useful for heavily slanted top surface models; " "however, in most cases, it creates too many unnecessary bridges." msgstr "" +"Ta opcja może pomóc zmniejszyć efekt wybrzuszenia na górnych powierzchniach " +"w mocno nachylonych lub zakrzywionych modelach.\n" +"\n" +"Domyślnie małe mosty wewnętrzne są filtrowane, a wewnętrzne wypełnienie " +"pełne drukowane jest bezpośrednio nad rzadkim wypełnieniem. Działa to dobrze " +"w większości przypadków, przyspieszając drukowanie bez dużych kompromisów w " +"jakości górnej powierzchni. Jednak w przypadku mocno nachylonych powierzchni " +"lub zakrzywionych modeli, szczególnie przy niskiej gęstości wypełnienia, " +"może to prowadzić do wyginania się niepodpartego wypełnienia pełnego, co " +"skutkuje wybrzuszeniem.\n" +"\n" +"Włączenie ograniczonego filtrowania lub braku filtrowania spowoduje " +"drukowanie mostów wewnętrznych nad niepodpartym wypełnieniem pełnym. " +"Poniższe opcje kontrolują czułość filtrowania, czyli decydują o tym, gdzie " +"będą tworzone mosty wewnętrzne.\n" +"\n" +"Filtrowanie – włącza tę opcję. Jest to domyślne zachowanie, które działa " +"dobrze w większości przypadków.\n" +"\n" +"Ograniczone filtrowanie – tworzy mosty wewnętrzne na mocno nachylonych " +"powierzchniach, unikając tworzenia niepotrzebnych mostów wewnętrznych. " +"Działa to dobrze w przypadku trudnych modeli.\n" +"\n" +"\n" +"Brak filtrowania – tworzy mosty wewnętrzne nad każdym potencjalnym " +"wewnętrznym występem. Ta opcja jest przydatna w przypadku modeli o mocno " +"nachylonych górnych powierzchniach, ale w większości przypadków tworzy zbyt " +"wiele zbędnych mostów." msgid "Filter" msgstr "Filtr" @@ -12014,7 +12074,7 @@ msgid "Tri-hexagon" msgstr "Trójkątne" msgid "Gyroid" -msgstr "Żyroid" +msgstr "Gyroidalny" msgid "Honeycomb" msgstr "Plaster miodu" @@ -12151,8 +12211,8 @@ msgid "mm/s² or %" msgstr "mm/s² lub %" msgid "" -"Acceleration of sparse infill. If the value is expressed as a percentage " -"(e.g. 100%), it will be calculated based on the default acceleration." +"Acceleration of sparse infill. If the value is expressed as a percentage (e." +"g. 100%), it will be calculated based on the default acceleration." msgstr "" "Przyspieszenie na rzadkim wypełnieniu. Jeśli wartość jest wyrażona w " "procentach (np. 100%), będzie obliczana na podstawie domyślnego " @@ -12331,7 +12391,7 @@ msgid "All walls" msgstr "Wszystkie ściany" msgid "Fuzzy skin thickness" -msgstr "Grubość rozmycia powłoki" +msgstr "Grubość skóry fuzzy" msgid "" "The width within which to jitter. It's advised to be below outer wall line " @@ -12341,7 +12401,7 @@ msgstr "" "poniżej szerokości linii zewnętrznej ściany." msgid "Fuzzy skin point distance" -msgstr "Odstęp między punktami rozmycia powłoki" +msgstr "Odstęp między punktami skóry fuzzy" msgid "" "The average distance between the random points introduced on each line " @@ -12351,13 +12411,13 @@ msgstr "" "linii" msgid "Apply fuzzy skin to first layer" -msgstr "Rozmycie powłoki na pierwszej warstwie" +msgstr "Skóra fuzzy na pierwszej warstwie" msgid "Whether to apply fuzzy skin on the first layer" -msgstr "Określa czy zastosować rozmycie powłoki od pierwszej warstwy" +msgstr "Określa czy zastosować skórę fuzzy od pierwszej warstwy" msgid "Fuzzy skin noise type" -msgstr "Rodzaj szumu rozmycia powłoki" +msgstr "Rodzaj szumu skóry fuzzy" msgid "" "Noise type to use for fuzzy skin generation.\n" @@ -12369,13 +12429,13 @@ msgid "" "Voronoi: Divides the surface into voronoi cells, and displaces each one by a " "random amount. Creates a patchwork texture." msgstr "" -"Określa rodzaj szumu używanego do generowania rozmycia powłoki.\n" +"Określa rodzaj szumu używanego do generowania skóry fuzzy.\n" "Klasyczny: klasyczny, jednolity, losowy szum.\n" "Perlin: szum Perlina, który zapewnia bardziej spójną teksturę.\n" "Billow: podobny do szumu Perlina, ale bardziej toporny.\n" "Pofałdowany multifraktal: szum falisty z ostrymi, postrzępionymi elementami. " "Tworzy tekstury przypominające marmur.\n" -"Woronoj: dzieli powierzchnię na komórki Woronoja i przesuwa każdą z nich o " +"Voronoi: dzieli powierzchnię na komórki Woronoja i przesuwa każdą z nich o " "losową wartość. Tworzy teksturę patchworkową." msgid "Classic" @@ -12391,10 +12451,10 @@ msgid "Ridged Multifractal" msgstr "Pofałdowany multifraktal" msgid "Voronoi" -msgstr "Woronoj" +msgstr "Voronoi" msgid "Fuzzy skin feature size" -msgstr "Rozmiar cechy rozmycia powłoki" +msgstr "Rozmiar cechy skóry fuzzy" msgid "" "The base size of the coherent noise features, in mm. Higher values will " @@ -12404,7 +12464,7 @@ msgstr "" "wyniku większe cechy." msgid "Fuzzy Skin Noise Octaves" -msgstr "Liczba oktaw szumu rozmycia powłoki" +msgstr "Liczba oktaw szumu skóry fuzzy" msgid "" "The number of octaves of coherent noise to use. Higher values increase the " @@ -12414,7 +12474,7 @@ msgstr "" "zwiększają szczegółowość szumu, ale również zwiększają czas obliczeń." msgid "Fuzzy skin noise persistence" -msgstr "Trwałość szumu rozmycia powłoki" +msgstr "Trwałość szumu skóry fuzzy" msgid "" "The decay rate for higher octaves of the coherent noise. Lower values will " @@ -13552,22 +13612,22 @@ msgstr "" "wartość" msgid "Retract amount before wipe" -msgstr "Długość cofnięcia filamentu przed wytarciem dyszy" +msgstr "Długość retrakcji przed wytarciem dyszy" msgid "" "The length of fast retraction before wipe, relative to retraction length" msgstr "" -"Długość szybkiego cofnięcia filamentu przed wytarciem dyszy, w stosunku do " -"długości cofnięcia." +"Długość szybkiej retrakcji przed wytarciem dyszy, w stosunku do długości " +"retrakcji." msgid "Retract when change layer" -msgstr "Wytarcie dyszy przy zmianie warstwy" +msgstr "Retrakcja przy zmianie warstwy" msgid "Force a retraction when changes layer" -msgstr "Wymuś cofnięcie filamentu przy zmianie warstwy" +msgstr "Wymuś retrakcje przy zmianie warstwy" msgid "Retract on top layer" -msgstr "Cofnięcie filamentu na górnej warstwie" +msgstr "Retrakcja na górnej warstwie" msgid "" "Force a retraction on top layer. Disabling could prevent clog on very slow " @@ -13578,7 +13638,7 @@ msgstr "" "drukowaniu skomplikowanych i wolnych wzorów, takich jak krzywa Hilberta." msgid "Retraction Length" -msgstr "Długość cofnięcia filamentu" +msgstr "Długość retrakcji" msgid "" "Some amount of material in extruder is pulled back to avoid ooze during long " @@ -13728,7 +13788,7 @@ msgstr "" "taką dodatkową ilość filamentu." msgid "Retraction Speed" -msgstr "Prędkość wycofania filamentu" +msgstr "Prędkość retrakcji" msgid "Speed of retractions" msgstr "Prędkość cofnięcia filamentu" @@ -13741,7 +13801,7 @@ msgid "" "retraction" msgstr "" "Prędkość ponownego załadowania filamentu do extrudera. Zero oznacza tę samą " -"prędkość co wycofania." +"prędkość co retrakcja." msgid "Use firmware retraction" msgstr "Użyj retrakcji sterowanej przez firmware." @@ -13992,27 +14052,27 @@ msgstr "" "wartość dla tego parametru to 80%" msgid "Skirt distance" -msgstr "Odstęp Skirtu od obiektu" +msgstr "Odstęp skirtu od obiektu" msgid "Distance from skirt to brim or object" -msgstr "Odległość Skirtu do obrzeża albo do obiektu" +msgstr "Odległość skirtu do brumu albo do obiektu" msgid "Skirt start point" -msgstr "Punkt początkowy Skirtu" +msgstr "Punkt początkowy skirtu" msgid "" "Angle from the object center to skirt start point. Zero is the most right " "position, counter clockwise is positive angle." msgstr "" -"Kąt między środkiem obiektu a punktem początkowym Skirtu. Zero to pozycja " -"najbardziej po prawej stronie, a w kieruneku przeciwnym do ruchu wskazówek " +"Kąt między środkiem obiektu a punktem początkowym skirtu. Zero to pozycja " +"najbardziej po prawej stronie, a w kierunku przeciwnym do ruchu wskazówek " "zegara to kąt dodatni." msgid "Skirt height" -msgstr "Wysokość Skirtu" +msgstr "Wysokość skirt" msgid "How many layers of skirt. Usually only one layer" -msgstr "Ile warstw Skirtu. Zwykle tylko jedna warstwa" +msgstr "Ile warstw skirtu. Zwykle tylko jedna warstwa" msgid "Single loop draft shield" msgstr "Pojedyncza pętla Draft shield" @@ -14056,7 +14116,7 @@ msgid "Enabled" msgstr "Włączony" msgid "Skirt type" -msgstr "Rodzaj Skirtu" +msgstr "Rodzaj skirtu" msgid "" "Combined - single skirt for all objects, Per object - individual object " @@ -14072,21 +14132,21 @@ msgid "Per object" msgstr "Dla obiektu" msgid "Skirt loops" -msgstr "Ilość pętli Skirtu" +msgstr "Liczba pętli skirt" msgid "Number of loops for the skirt. Zero means disabling skirt" -msgstr "To jest liczba pętli Skirtu. Zero oznacza, wyłączone tej funkcji" +msgstr "To jest liczba pętli skirt. Zero oznacza, wyłączone tej funkcji" msgid "Skirt speed" -msgstr "Prędkość Skirtu" +msgstr "Prędkość skirtu" msgid "Speed of skirt, in mm/s. Zero means use default layer extrusion speed." msgstr "" -"Prędkość Skirtu, w mm/s. Zero oznacza użycie domyślnej prędkości ekstruzji " -"warstwy." +"Prędkość dla skirtu, w mm/s. Zero oznacza użycie domyślnej prędkości " +"ekstruzji warstwy." msgid "Skirt minimum extrusion length" -msgstr "Minimalna długość ekstruzji Skirtu" +msgstr "Minimalna długość ekstruzji skirtu" msgid "" "Minimum filament extrusion length in mm when printing the skirt. Zero means " @@ -14704,20 +14764,20 @@ msgstr "" "pierwszej, zostanie automatycznie obliczona " msgid "Auto brim width" -msgstr "Automatyczna szerokość Brimu" +msgstr "Automatyczna szerokość brimu" msgid "" "Enabling this option means the width of the brim for tree support will be " "automatically calculated" msgstr "" -"Włączenie tej opcji oznacza, że szerokość Brimu dla podpory drzewo będzie " +"Włączenie tej opcji oznacza, że szerokość brimu dla podpory drzewo będzie " "automatycznie obliczana" msgid "Tree support brim width" -msgstr "Szerokość Brimu dla podpory drzewa" +msgstr "Szerokość brimu dla podpory drzewa" msgid "Distance from tree branch to the outermost brim line" -msgstr "Odległość od gałęzi drzewa do najbardziej zewnętrznej linii Brimu" +msgstr "Odległość od gałęzi drzewa do najbardziej zewnętrznej linii brimu" msgid "Tip Diameter" msgstr "Średnica końcówki" @@ -14901,13 +14961,13 @@ msgid "Speed of travel which is faster and without extrusion" msgstr "Prędkość przemieszczania, która jest szybsza i bez ekstruzji" msgid "Wipe while retracting" -msgstr "Czyszczenie przy cofnięciu" +msgstr "Wycieranie przy retrakcji" msgid "" "Move nozzle along the last extrusion path when retracting to clean leaked " "material on nozzle. This can minimize blob when print new part after travel" msgstr "" -"Przesuń dyszę wzdłuż ostatniej ścieżki ekstruzji podczas cofania, aby " +"Przesuń dyszę wzdłuż ostatniej ścieżki ekstruzji podczas retrakcji, aby " "oczyścić wyciekły filament na dyszy. Może to zminimalizować wystąpienie " "grudek podczas drukowania nowej części po przejeździe" @@ -14926,7 +14986,7 @@ msgid "" "any excess retraction before the wipe, else it will be performed after." msgstr "" "Opisz, jak długo dysza będzie się przesuwać wzdłuż ostatniej ścieżki podczas " -"cofania. \n" +"retrakcji. \n" "\n" "W zależności od tego, jak długo trwa operacja czyszczenia oraz jak szybkie i " "długie są ustawienia cofania extrudera/filamentu, może być potrzebny ruch " @@ -15105,9 +15165,9 @@ msgid "Idle temperature" msgstr "Temperatura w bezczynności" msgid "" -"Nozzle temperature when the tool is currently not used in multi-tool " -"setups.This is only used when 'Ooze prevention' is active in Print Settings. " -"Set to 0 to disable." +"Nozzle temperature when the tool is currently not used in multi-tool setups." +"This is only used when 'Ooze prevention' is active in Print Settings. Set to " +"0 to disable." msgstr "" "Temperatura dyszy, gdy narzędzie nie jest aktualnie używane w konfiguracjach " "wielonarzędziowych. Jest to używane tylko wtedy, gdy „Zapobieganie " @@ -15620,17 +15680,17 @@ msgid "Debug level" msgstr "Poziom debugowania" msgid "" -"Sets debug logging level. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, " -"5:trace\n" +"Sets debug logging level. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" +"trace\n" msgstr "" -"Ustawia poziom logowania debugowania. 0:fatal, 1:error, 2:warning, 3:info, " -"4:debug, 5:trace\n" +"Ustawia poziom logowania debugowania. 0:fatal, 1:error, 2:warning, 3:info, 4:" +"debug, 5:trace\n" msgid "Enable timelapse for print" -msgstr "Włącz timelaps dla druku" +msgstr "Włącz timelapse dla druku" msgid "If enabled, this slicing will be considered using timelapse" -msgstr "" +msgstr "Jeśli włączone, to cięcie będzie uwzględniać tryb timelapse." msgid "Load custom gcode" msgstr "Załaduj własny gcode" @@ -15673,6 +15733,8 @@ msgstr "Pomiń zmodyfikowany G-code w 3mf" msgid "Skip the modified gcodes in 3mf from Printer or filament Presets" msgstr "" +"Pomiń zmodyfikowane pliki gcode w 3MF z profilem ustawień drukarki lub " +"filamentu" msgid "MakerLab name" msgstr "Nazwa MakerLab" @@ -16069,8 +16131,8 @@ msgstr "Podpory: tworzenie miejsc kontaktowych" msgid "" "Unknown file format. Input file must have .stl, .obj, .amf(.xml) extension." msgstr "" -"Nieznany format pliku. Plik wejściowy musi mieć " -"rozszerzenie .stl, .obj, .amf(.xml)." +"Nieznany format pliku. Plik wejściowy musi mieć rozszerzenie .stl, .obj, ." +"amf(.xml)." msgid "Loading of a model file failed." msgstr "Nie udało się wczytać pliku modelu." @@ -16080,8 +16142,8 @@ msgstr "Dostarczony plik nie mógł być odczytany, ponieważ jest pusty" msgid "Unknown file format. Input file must have .3mf or .zip.amf extension." msgstr "" -"Nieznany format pliku. Plik wejściowy musi mieć rozszerzenie .3mf " -"lub .zip.amf." +"Nieznany format pliku. Plik wejściowy musi mieć rozszerzenie .3mf lub .zip." +"amf." msgid "Canceled" msgstr "Anulowano" @@ -16143,7 +16205,7 @@ msgstr "Jak używać wyniku kalibracji?" msgid "" "You could change the Flow Dynamics Calibration Factor in material editing" msgstr "" -"Możesz zmienić współczynnik Kalibracji Dynamiki Przepływu podczas edycji " +"Możesz zmienić współczynnik kalibracji dynamiki przepływu podczas edycji " "profilu filamentu" msgid "" @@ -16268,7 +16330,7 @@ msgid "Max volumetric speed calibration result has been saved to preset" msgstr "Wynik kalibracji maksymalnego przepływu został zapisany do profilu" msgid "When do you need Flow Dynamics Calibration" -msgstr "Kiedy potrzebujesz Kalibracji Dynamiki Przepływu" +msgstr "Kiedy potrzebujesz kalibracji dynamiki przepływu" msgid "" "We now have added the auto-calibration for different filaments, which is " @@ -16438,7 +16500,7 @@ msgid "materials with inaccurate filament diameter" msgstr "filamentami z niedokładną średnicą" msgid "We found the best Flow Dynamics Calibration Factor" -msgstr "Znaleźliśmy najlepszy współczynnik Kalibracji Dynamiki Przepływu" +msgstr "Znaleźliśmy najlepszy współczynnik kalibracji dynamiki przepływu" msgid "" "Part of the calibration failed! You may clean the plate and retry. The " @@ -16608,7 +16670,7 @@ msgid "To Volumetric Speed" msgstr "Do Prędkości Przepływu" msgid "Flow Dynamics Calibration Result" -msgstr "Wyniki Kalibracji Dynamiki Przepływu" +msgstr "Wynik kalibracji dynamiki przepływu" msgid "New" msgstr "Nowy" @@ -16631,7 +16693,7 @@ msgstr "" "To urządzenie może przechowywać tylko %d wyników w historii dla jednej dyszy." msgid "Edit Flow Dynamics Calibration" -msgstr "Edytuj Kalibrację Dynamiki Przepływu" +msgstr "Edytuj kalibrację dynamiki przepływu" msgid "New Flow Dynamic Calibration" msgstr "Nowa Kalibracji Dynamiki Przepływu" @@ -16714,10 +16776,10 @@ msgid "Print numbers" msgstr "Drukuj cyfry" msgid "Comma-separated list of printing accelerations" -msgstr "" +msgstr "Wartości przyspieszenia oddzielona przecinkami" msgid "Comma-separated list of printing speeds" -msgstr "" +msgstr "Wartości prędkości druku oddzielona przecinkami" msgid "" "Please input valid values:\n" @@ -16894,6 +16956,8 @@ msgid "" "The selected bed type does not match the file. Please confirm before " "starting the print." msgstr "" +"Wybrany typ stołu roboczego nie pasuje do pliku. Proszę potwierdzić przed " +"rozpoczęciem druku." msgid "Time-lapse" msgstr "Timelapse" @@ -17142,7 +17206,7 @@ msgid "Printable Space" msgstr "Przestrzeń do druku" msgid "Hot Bed STL" -msgstr "Model Stołu " +msgstr "Model Stołu" msgid "Load stl" msgstr "Wczytaj stl" @@ -17801,7 +17865,7 @@ msgid "" msgstr "" "W porównaniu ze standardowym profilem dyszy o średnicy 0.2 mm, ma on " "mniejszą wysokość warstwy, niższe prędkości i przyspieszenia, a także " -"zastosowany jest wzór wypełnienia Gyroid. To prowadzi do praktycznie " +"zastosowany jest wzór wypełnienia Gyroidalny. To prowadzi do praktycznie " "niewidocznych warstw i znacznie lepszej jakości wydruku, ale jednocześnie " "wydłuża jego czas." @@ -18056,10 +18120,10 @@ msgid "Auto-generate points" msgstr "Generuj punkty automatycznie" msgid "Add a brim ear" -msgstr "Dodaj ucho obrzeża" +msgstr "Dodaj ucho brim" msgid "Delete a brim ear" -msgstr "Usuń ucho obrzeża" +msgstr "Usuń ucho brim" msgid "Adjust section view" msgstr "Widok przekroju" @@ -18068,17 +18132,17 @@ msgid "" "Warning: The brim type is not set to \"painted\",the brim ears will not take " "effect !" msgstr "" -"Ostrzeżenie: rodzaj obrzeża nie jest ustawiony na „malowane”. Uszy obrzeża " -"nie będą działać!" +"Ostrzeżenie: rodzaj brimu nie jest ustawiony na „malowane”. Uszy brim nie " +"będą działać!" msgid "Set the brim type to \"painted\"" -msgstr "Ustal rodzaj obrzeża na „malowane“" +msgstr "Ustaw rodzaj brimu na „malowane“" msgid " invalid brim ears" -msgstr "nieprawidłowe uszy obrzeża" +msgstr " nieprawidłowe uszy brim" msgid "Brim Ears" -msgstr "Uszy obrzeża" +msgstr "Uszy brim" msgid "Please select single object." msgstr "Proszę wybrać pojedynczy obiekt." @@ -18203,8 +18267,8 @@ msgid "" "Timelapse\n" "Did you know that you can generate a timelapse video during each print?" msgstr "" -"Film poklatkowy\n" -"Czy wiesz, że możesz generować filmy poklatkowe podczas każdego druku?" +"Timelapse\n" +"Czy wiesz, że możesz generować filmy timelapse podczas każdego wydruku?" #: resources/data/hints.ini: [hint:Auto-Arrange] msgid "" @@ -21025,10 +21089,10 @@ msgstr "" #~ msgstr "Pliki certyfikatów (.crt, .pem)|.crt;.pem|Wszystkie pliki|." #~ msgid "" -#~ "Relative extrusion is recommended when using \"label_objects\" " -#~ "option.Some extruders work better with this option unchecked (absolute " -#~ "extrusion mode). Wipe tower is only compatible with relative mode. It is " -#~ "always enabled on BambuLab printers. Default is checked" +#~ "Relative extrusion is recommended when using \"label_objects\" option." +#~ "Some extruders work better with this option unchecked (absolute extrusion " +#~ "mode). Wipe tower is only compatible with relative mode. It is always " +#~ "enabled on BambuLab printers. Default is checked" #~ msgstr "" #~ "Przy użyciu opcji \"label_objects\" zaleca się ekstruzję względną. " #~ "Niektóre ekstrudery działają lepiej, gdy ta opcja jest odznaczona (tryb " @@ -21327,7 +21391,7 @@ msgstr "" #, c-format, boost-format #~ msgid "" #~ "Bed temperature of other layer is lower than bed temperature of initial " -#~ "layer for more than %d degree centigrade.\n" +#~ "layer for more than %d degrees Celsius.\n" #~ "This may cause model broken free from build plate during printing" #~ msgstr "" #~ "Temperatura podłoża innych warstw jest niższa niż temperatura podłoża " diff --git a/localization/i18n/pt_BR/OrcaSlicer_pt_BR.po b/localization/i18n/pt_BR/OrcaSlicer_pt_BR.po index d47c5f5c7f..553cd39496 100644 --- a/localization/i18n/pt_BR/OrcaSlicer_pt_BR.po +++ b/localization/i18n/pt_BR/OrcaSlicer_pt_BR.po @@ -4,7 +4,7 @@ msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-03-16 22:32+0800\n" -"PO-Revision-Date: 2025-03-17 21:32-0300\n" +"PO-Revision-Date: 2025-03-27 09:32-0300\n" "Last-Translator: Alexandre Folle de Menezes \n" "Language-Team: Portuguese, Brazilian\n" "Language: pt_BR\n" @@ -59,7 +59,7 @@ msgid "Erase all painting" msgstr "Apagar toda a pintura" msgid "Highlight overhang areas" -msgstr "Destacar áreas com saliências" +msgstr "Realçar áreas com saliências" msgid "Gap fill" msgstr "Preenchimento de vão" @@ -1719,7 +1719,7 @@ msgid "Bottom Minimum Shell Thickness" msgstr "Espessura Mínima da Casca de Base" msgid "Ironing" -msgstr "Passar ferro" +msgstr "Passar a ferro" msgid "Fuzzy Skin" msgstr "Textura Difusa" @@ -1785,7 +1785,7 @@ msgid "Delete the selected object" msgstr "Apagar o objeto selecionado" msgid "Load..." -msgstr "Carregar..." +msgstr "Carregar…" msgid "Cube" msgstr "Cubo" @@ -2458,7 +2458,7 @@ msgid "No printer" msgstr "Sem impressora" msgid "..." -msgstr "..." +msgstr "…" msgid "Failed to connect to the server" msgstr "Falha ao conectar ao servidor" @@ -2486,7 +2486,7 @@ msgid "Please check the network connection of the printer and Orca." msgstr "Por favor, verifique a conexão de rede da impressora e do Orca." msgid "Connecting..." -msgstr "Conectando..." +msgstr "Conectando…" msgid "?" msgstr "?" @@ -2525,7 +2525,7 @@ msgid "Retry" msgstr "Tentar Novamente" msgid "Calibrating AMS..." -msgstr "Calibrando AMS..." +msgstr "Calibrando AMS…" msgid "A problem occurred during calibration. Click to view the solution." msgstr "Ocorreu um problema durante a calibração. Clique para ver a solução." @@ -2537,7 +2537,7 @@ msgid "Cancel calibration" msgstr "Cancelar calibração" msgid "Idling..." -msgstr "Em espera..." +msgstr "Em espera…" msgid "Heat the nozzle" msgstr "Aquecer o bico" @@ -2594,7 +2594,7 @@ msgstr "" "Não é possível auto-arranjar nessa placa." msgid "Arranging..." -msgstr "Organizando..." +msgstr "Organizando…" msgid "Arranging" msgstr "Organizando" @@ -2642,7 +2642,7 @@ msgstr "" "Não é possível auto-orientar nessa placa." msgid "Orienting..." -msgstr "Orientando..." +msgstr "Orientando…" msgid "Orienting" msgstr "Orientando" @@ -3260,7 +3260,7 @@ msgid "Please save project and restart the program." msgstr "Por favor, salve o projeto e reinicie o programa." msgid "Processing G-Code from Previous file..." -msgstr "Processando G-code do arquivo anterior..." +msgstr "Processando G-code do arquivo anterior…" msgid "Slicing complete" msgstr "Fatiamento concluído" @@ -3498,7 +3498,7 @@ msgid "No historical tasks!" msgstr "Nenhuma tarefa no histórico!" msgid "Loading..." -msgstr "Carregando..." +msgstr "Carregando…" msgid "No AMS" msgstr "Nenhum AMS" @@ -3614,7 +3614,7 @@ msgid "Circular" msgstr "Circular" msgid "Load shape from STL..." -msgstr "Carregar forma de STL..." +msgstr "Carregar forma de STL…" msgid "Settings" msgstr "Configurações" @@ -3686,11 +3686,11 @@ msgstr "" #, c-format, boost-format msgid "" -"Recommended nozzle temperature of this filament type is [%d, %d] degree " -"centigrade" +"The recommended nozzle temperature for this filament type is [%d, %d] " +"degrees Celsius." msgstr "" "A temperatura do bico recomendada para este tipo de filamento é [%d, %d] " -"graus centígrados" +"graus Celsius." msgid "" "Too small max volumetric speed.\n" @@ -3720,7 +3720,7 @@ msgid "" "Too small ironing spacing.\n" "Reset to 0.1" msgstr "" -"Espaçamento de alisamento muito pequeno.\n" +"Espaçamento de passar a ferro muito pequeno.\n" "Redefinir para 0,1" msgid "" @@ -4204,7 +4204,7 @@ msgid "Temperature: " msgstr "Temperatura: " msgid "Loading G-codes" -msgstr "Carregando G-codes" +msgstr "Carregando G-code" msgid "Generating geometry vertex data" msgstr "Gerando dados de vértices de geometria" @@ -4931,7 +4931,7 @@ msgid "Show &Overhang" msgstr "Mostrar &Saliência" msgid "Show object overhang highlight in 3D scene" -msgstr "Mostrar destaque de saliência de objeto na cena 3D" +msgstr "Mostrar realce de saliência de objeto na cena 3D" msgid "Show Selected Outline (beta)" msgstr "Mostrar Contorno Selecionado (beta)" @@ -4991,7 +4991,7 @@ msgid "VFA" msgstr "VFA" msgid "More..." -msgstr "Mais..." +msgstr "Mais…" msgid "Tutorial" msgstr "Tutorial" @@ -5169,7 +5169,7 @@ msgid "Please enter the IP of printer to connect." msgstr "Por favor, digite o IP da impressora para conectar." msgid "Initializing..." -msgstr "Inicializando..." +msgstr "Inicializando…" msgid "Connection Failed. Please check the network and try again" msgstr "Falha na conexão. Por favor, verifique a rede e tente novamente" @@ -5220,7 +5220,7 @@ msgid "Information" msgstr "Informação" msgid "Playing..." -msgstr "Reproduzindo..." +msgstr "Reproduzindo…" msgid "Year" msgstr "Ano" @@ -5277,7 +5277,7 @@ msgid "No printers." msgstr "Nenhuma impressora." msgid "Loading file list..." -msgstr "Carregando lista de arquivos..." +msgstr "Carregando lista de arquivos…" msgid "No files" msgstr "Sem arquivos" @@ -5327,7 +5327,7 @@ msgid "Delete file" msgstr "Excluir arquivo" msgid "Fetching model information..." -msgstr "Obtendo informações do modelo ..." +msgstr "Obtendo informações do modelo…" msgid "Failed to fetch model information from printer." msgstr "Falha ao obter informação do modelo da impressora." @@ -5355,7 +5355,7 @@ msgstr "" "Título: %s\n" msgid "Download waiting..." -msgstr "Aguardando download..." +msgstr "Aguardando download…" msgid "Play" msgstr "Reproduzir" @@ -5368,7 +5368,7 @@ msgstr "Download concluído" #, c-format, boost-format msgid "Downloading %d%%..." -msgstr "Baixando %d%%..." +msgstr "Baixando %d%%…" msgid "" "Reconnecting the printer, the operation cannot be completed immediately, " @@ -5515,10 +5515,10 @@ msgid "Are you sure you want to cancel this print?" msgstr "Tem certeza de que deseja cancelar esta impressão?" msgid "Downloading..." -msgstr "Baixando..." +msgstr "Baixando…" msgid "Cloud Slicing..." -msgstr "Fatiando na Nuvem..." +msgstr "Fatiando na Nuvem…" #, c-format, boost-format msgid "In Cloud Slicing Queue, there are %s tasks ahead." @@ -6057,7 +6057,7 @@ msgid "Connection" msgstr "Conexão" msgid "Bed type" -msgstr "Tipo de mesa" +msgstr "Tipo de placa" msgid "Flushing volumes" msgstr "Volumes de Purga" @@ -6438,13 +6438,13 @@ msgid "Importing Model" msgstr "Importando Modelo" msgid "prepare 3mf file..." -msgstr "preparar o arquivo 3mf..." +msgstr "preparar o arquivo 3mf…" msgid "Download failed, unknown file format." msgstr "Baixar falhou, formato de arquivo desconhecido." msgid "downloading project ..." -msgstr "baixando projeto..." +msgstr "baixando projeto…" msgid "Download failed, File size exception." msgstr "Baixar falhou, erro no tamanho do arquivo." @@ -7000,7 +7000,7 @@ msgid "Clear my choice on the unsaved projects." msgstr "Limpar minha escolha nos projetos não salvos." msgid "No warnings when loading 3MF with modified G-codes" -msgstr "Sem avisos ao carregar 3MF com códigos G modificados" +msgstr "Sem avisos ao carregar 3MF com G-code modificado" msgid "Auto-Backup" msgstr "Backup Automático" @@ -7641,7 +7641,7 @@ msgid "Pin Code" msgstr "Código PIN" msgid "Binding..." -msgstr "Vinculando..." +msgstr "Vinculando…" msgid "Please confirm on the printer screen" msgstr "Confirme na tela da impressora" @@ -9220,7 +9220,7 @@ msgid "Manual Setup" msgstr "Configuração Manual" msgid "connecting..." -msgstr "conectando..." +msgstr "conectando…" msgid "Failed to connect to printer." msgstr "Falha ao conectar à impressora." @@ -9796,7 +9796,7 @@ msgid "" msgstr "" "O endereçamento relativo da extrusora requer a reinicialização da posição da " "extrusora em cada camada para evitar perda de precisão de ponto flutuante. " -"Adicione \"G92 E0\" ao código de camada." +"Adicione \"G92 E0\" ao layer_gcode." msgid "" "\"G92 E0\" was found in before_layer_gcode, which is incompatible with " @@ -10051,15 +10051,15 @@ msgid "HTTP digest" msgstr "Digest HTTP" msgid "Avoid crossing wall" -msgstr "Evitar atravessar parede" +msgstr "Evitar atravessar paredes" msgid "Detour and avoid to travel across wall which may cause blob on surface" msgstr "" -"Desviar e evitar atravessar parede, que pode causar irregularidade na " -"superfície" +"Desviar e evitar atravessar paredes, que pode causar irregularidades na " +"superfície." msgid "Avoid crossing wall - Max detour length" -msgstr "Evitar atravessar parede - Distância máximo do desvio" +msgstr "Evitar atravessar paredes - Distância máximo do desvio" msgid "" "Maximum detour distance for avoiding crossing wall. Don't detour if the " @@ -10067,10 +10067,10 @@ msgid "" "either as an absolute value or as percentage (for example 50%) of a direct " "travel path. Zero to disable" msgstr "" -"Distância máxima de desvio para evitar atravessar uma parede. Não desviar se " -"a distância de desvio for maior que esse valor. A distancia do desvio pode " -"ser especificada como um valor absoluto ou como porcentagem (por exemplo, " -"50%) de um caminho de deslocamento direto. Zero para desativar" +"Distância máxima de desvio para evitar atravessar paredes. Não desviar se a " +"distância de desvio for maior que esse valor. A distancia do desvio pode ser " +"especificada como um valor absoluto ou como porcentagem (por exemplo, 50%) " +"de um caminho de deslocamento direto. Zero para desativar." msgid "mm or %" msgstr "mm ou %" @@ -10174,7 +10174,7 @@ msgid "Engineering Plate" msgstr "Placa de Engenharia" msgid "Smooth High Temp Plate" -msgstr "Placa de Alta Temp. Liso" +msgstr "Placa de Alta Temp. Lisa" msgid "Textured Cool Plate" msgstr "Placa Fria Texturizada" @@ -10183,10 +10183,10 @@ msgid "First layer print sequence" msgstr "Sequência de impressão da primeira camada" msgid "Other layers print sequence" -msgstr "Sequência de impressão de outras camadas" +msgstr "Sequência de impressão das outras camadas" msgid "The number of other layers print sequence" -msgstr "O número de sequência de impressão de outras camadas" +msgstr "O número de sequência de impressão das outras camadas" msgid "Other layers filament sequence" msgstr "Sequência de impressão de outros filamentos" @@ -12980,7 +12980,7 @@ msgstr "" "serão geradas, medida em células." msgid "Ironing Type" -msgstr "Tipo do passar ferro" +msgstr "Tipo do passar a ferro" msgid "" "Ironing is using small flow to print on same height of surface again to make " @@ -12991,7 +12991,7 @@ msgstr "" "qual camada está sendo passada a ferro" msgid "No ironing" -msgstr "Desativado" +msgstr "Não passar a ferro" msgid "Top surfaces" msgstr "Superfícies superiores" @@ -13003,13 +13003,13 @@ msgid "All solid layer" msgstr "Todas as camadas sólidas" msgid "Ironing Pattern" -msgstr "Padrão do passar ferro" +msgstr "Padrão do passar a ferro" msgid "The pattern that will be used when ironing" msgstr "O padrão que será usado ao passar a ferro" msgid "Ironing flow" -msgstr "Fluxo do passar ferro" +msgstr "Fluxo do passar a ferro" msgid "" "The amount of material to extrude during ironing. Relative to flow of normal " @@ -13020,13 +13020,13 @@ msgstr "" "superextrusão na superfície" msgid "Ironing line spacing" -msgstr "Espaçamento de linha do passar ferro" +msgstr "Espaçamento de linha do passar a ferro" msgid "The distance between the lines of ironing" -msgstr "A distância entre as linhas do passar ferro" +msgstr "A distância entre as linhas do passar a ferro." msgid "Ironing inset" -msgstr "Inserção do passar ferro" +msgstr "Inserção do passar a ferro" msgid "" "The distance to keep from the edges. A value of 0 sets this to half of the " @@ -13036,13 +13036,13 @@ msgstr "" "do diâmetro do bico" msgid "Ironing speed" -msgstr "Velocidade do passar ferro" +msgstr "Velocidade do passar a ferro" msgid "Print speed of ironing lines" -msgstr "Velocidade de impressão das linhas do passar ferro" +msgstr "Velocidade de impressão das linhas do passar a ferro." msgid "Ironing angle" -msgstr "Ângulo do passar ferro" +msgstr "Ângulo do passar a ferro" msgid "" "The angle ironing is done at. A negative number disables this function and " @@ -13857,8 +13857,8 @@ msgstr "Desabilitar definir tempo de impressão restante" msgid "" "Disable generating of the M73: Set remaining print time in the final gcode" msgstr "" -"Desativar a geração do M73: Definir tempo restante de impressão no código " -"final" +"Desativar a geração do M73: Definir tempo restante de impressão no G-code " +"final." msgid "Seam position" msgstr "Posição da costura" @@ -13870,13 +13870,13 @@ msgid "Nearest" msgstr "Mais próximo" msgid "Aligned" -msgstr "Alinhado" +msgstr "Alinhada" msgid "Back" msgstr "Atrás" msgid "Random" -msgstr "Aleatório" +msgstr "Aleatória" msgid "Staggered inner seams" msgstr "Costuras internas escalonadas" @@ -13897,8 +13897,8 @@ msgid "" "This amount can be specified in millimeters or as a percentage of the " "current extruder diameter. The default value for this parameter is 10%." msgstr "" -"Para reduzir a visibilidade da costura em uma extrusão de loop fechado, o " -"loop é interrompido e encurtado por uma quantidade especificada.\n" +"Para reduzir a visibilidade da costura em uma extrusão de volta fechada, a " +"volta é interrompida e encurtada por uma quantidade especificada.\n" "Esta quantidade pode ser especificada em milímetros ou como uma porcentagem " "do diâmetro atual da extrusora. O valor padrão para este parâmetro é 10%." @@ -13932,7 +13932,7 @@ msgid "" msgstr "" "Esta opção define o ângulo limiar para aplicar uma costura junta cachecol " "condicional.\n" -"Se o ângulo máximo dentro do loop do perímetro exceder esse valor (indicando " +"Se o ângulo máximo dentro da volta do perímetro exceder esse valor (indicando " "a ausência de cantos afiados), será usada uma costura junta cachecol. O " "valor padrão é 155°." @@ -14036,18 +14036,18 @@ msgstr "" "utilizada para a ação de limpeza." msgid "Wipe on loops" -msgstr "Limpeza em loops" +msgstr "Limpeza em voltas" msgid "" "To minimize the visibility of the seam in a closed loop extrusion, a small " "inward movement is executed before the extruder leaves the loop." msgstr "" -"Para minimizar a visibilidade da costura em uma extrusão de loop fechado, é " -"executado um pequeno movimento para dentro antes que a extrusora saia do " -"loop." +"Para minimizar a visibilidade da costura em uma extrusão de volta fechada, é " +"executado um pequeno movimento para dentro antes que a extrusora saia da " +"volta." msgid "Wipe before external loop" -msgstr "Limpeza antes do loop externo" +msgstr "Limpeza antes da volta externa" msgid "" "To minimize visibility of potential overextrusion at the start of an " @@ -14353,13 +14353,13 @@ msgstr "" "apenas para Prusa XL. Para outras impressoras, defina como 1." msgid "Start G-code" -msgstr "Código de Início" +msgstr "G-code Inicial" msgid "Start G-code when start the whole printing" -msgstr "Código de início ao iniciar a impressão completa" +msgstr "G-code inicial ao iniciar a impressão completa." msgid "Start G-code when start the printing of this filament" -msgstr "Código de início ao iniciar a impressão deste filamento" +msgstr "G-code inicial ao iniciar a impressão deste filamento." msgid "Single Extruder Multi Material" msgstr "Multimaterial com Extrusora Única" @@ -14417,17 +14417,17 @@ msgstr "" "frontal da mesa de impressão no início da impressão." msgid "Slice gap closing radius" -msgstr "Raio de fechamento do vão de fatiamento" +msgstr "Raio de fechamento de vãos de fatiamento" msgid "" "Cracks smaller than 2x gap closing radius are being filled during the " "triangle mesh slicing. The gap closing operation may reduce the final print " "resolution, therefore it is advisable to keep the value reasonably low." msgstr "" -"Espaços menores que 2x o vão de fatiamento serão preenchidas durante o " -"fatiamento da malha. Aumentar o vão de fatiamento pode reduzir a resolução " -"final da impressão, portanto, é aconselhável manter o valor razoavelmente " -"baixo." +"Frestas menores que 2x o vão de fatiamento serão preenchidas durante o " +"fatiamento da malha de triângulos. O fechamento de vãos de fatiamento pode " +"reduzir a resolução final da impressão, portanto é aconselhável manter o " +"valor razoavelmente baixo." msgid "Slicing Mode" msgstr "Modo de Fatiamento" @@ -14496,7 +14496,7 @@ msgid "XY separation between an object and its support" msgstr "Separação XY entre um objeto e seu suporte" msgid "Support/object first layer gap" -msgstr "Vão suporte/objeto na primeira camada" +msgstr "Vão na primeira camada entre suporte e objeto" msgid "XY separation between an object and its support at the first layer." msgstr "Separação XY entre um objeto e seu suporte na primeira camada." @@ -14571,12 +14571,12 @@ msgstr "" "diâmetro do bico." msgid "Interface use loop pattern" -msgstr "Interface usa padrão de loop" +msgstr "Interface usa padrão de volta" msgid "" "Cover the top contact layer of the supports with loops. Disabled by default." msgstr "" -"Cubra a camada de contato superior dos suportes com loops. Desativado por " +"Cobrir a camada de contato superior dos suportes com voltas. Desativado por " "padrão." msgid "Support/raft interface" @@ -14941,7 +14941,7 @@ msgid "" msgstr "" "Detecta paredes finas que não podem conter duas larguras de linha. E usa uma " "linha única para imprimir. Talvez seja impresso não muito bem, porque não é " -"um loop fechado" +"uma volta fechada." msgid "" "This gcode is inserted when change filament, including T command to trigger " @@ -15223,7 +15223,7 @@ msgstr "" "Os furos do objeto serão aumentados ou reduzidos no plano XY pelo valor " "configurado. Valor positivo aumenta os furos. Valor negativo reduz os furos. " "Essa função é usada para ajustar ligeiramente o tamanho quando o objeto tem " -"problema de montagem" +"problemas de montagem." msgid "X-Y contour compensation" msgstr "Compensação XY de contornos" @@ -15237,7 +15237,7 @@ msgstr "" "O contorno do objeto será expandido ou reduzido no plano XY pelo valor " "configurado. Valor positivo aumenta o contorno. Valor negativo diminui o " "contorno. Essa função é usada para ajustar ligeiramente o tamanho quando o " -"objeto tem problemas de montagem" +"objeto tem problemas de montagem." msgid "Convert holes to polyholes" msgstr "Converter furos em polifuros" @@ -15659,37 +15659,38 @@ msgstr "Clonar objetos na lista de carregamento" msgid "load uptodate process/machine settings when using uptodate" msgstr "" -"carregar configurações de processo/máquina atualizadas ao usar Atualizar" +"Carregar configurações de processo/máquina atualizadas ao usar Atualizar" msgid "" "load uptodate process/machine settings from the specified file when using " "uptodate" msgstr "" -"carregar configurações de processo/máquina atualizadas do arquivo " -"especificado ao usar Atualizar" +"Carregar configurações de processo/máquina atualizadas do arquivo " +"especificado ao usar Atualizar." msgid "load uptodate filament settings when using uptodate" -msgstr "carregar configurações de filamento atualizadas ao usar Atualizar" +msgstr "Carregar configurações de filamento atualizadas ao usar Atualizar" msgid "" "load uptodate filament settings from the specified file when using uptodate" msgstr "" -"carregar configurações de filamento atualizadas do arquivo especificado ao " -"usar Atualizar" +"Carregar configurações de filamento atualizadas do arquivo especificado ao " +"usar Atualizar." msgid "" "if enabled, check whether current machine downward compatible with the " "machines in the list" msgstr "" -"se habilitado, verifica se a máquina atual é retrocompatível com as máquinas " -"na lista" +"Se habilitado, verifica se a máquina atual é retrocompatível com as máquinas " +"na lista." msgid "downward machines settings" -msgstr "configurações de máquinas abaixo" +msgstr "Configurações de máquinas abaixo" msgid "the machine settings list need to do downward checking" msgstr "" -"a lista de configurações de máquina precisa fazer uma verificação descendente" +"A lista de configurações de máquina precisa fazer uma verificação " +"descendente." msgid "Load assemble list" msgstr "Carregar lista de montagem" @@ -15753,7 +15754,7 @@ msgid "Allow rotatations when arrange" msgstr "Permitir rotações ao arranjar" msgid "If enabled, the arrange will allow rotations when place object" -msgstr "Se habilitado, o arranjo permitirá rotações ao posicionar os objetos" +msgstr "Se habilitado, o arranjo permitirá rotações ao posicionar objetos." msgid "Avoid extrusion calibrate region when doing arrange" msgstr "Evitar a região de calibração de extrusão ao fazer arranjos" @@ -15763,7 +15764,7 @@ msgid "" "object" msgstr "" "Se habilitado, o arranjo evitará a calibração da região de extrusão ao " -"posicionar os objetos" +"posicionar objetos." msgid "Skip modified gcodes in 3mf" msgstr "Pular G-codes modificados em 3mf" @@ -16328,7 +16329,7 @@ msgstr "" "Você ainda quer continuar com a calibração?" msgid "Connecting to printer..." -msgstr "Conectando à impressora..." +msgstr "Conectando à impressora…" msgid "The failed test result has been dropped." msgstr "O resultado do teste falhado foi descartado." @@ -16530,7 +16531,7 @@ msgstr "" "imprime com:" msgid "material with significant thermal shrinkage/expansion, such as..." -msgstr "material com significativa contração/expansão térmica, como..." +msgstr "material com significativa contração/expansão térmica, como…" msgid "materials with inaccurate filament diameter" msgstr "materiais com diâmetro de filamento impreciso" @@ -18801,26 +18802,6 @@ msgstr "" #~ "O valor 0 permite a reversão em todas as camadas ímpares " #~ "independentemente." -#~ msgid "" -#~ "The direction which the wall loops are extruded when looking down from " -#~ "the top.\n" -#~ "\n" -#~ "By default all walls are extruded in counter-clockwise, unless Reverse on " -#~ "odd is enabled. Set this to any option other than Auto will force the " -#~ "wall direction regardless of the Reverse on odd.\n" -#~ "\n" -#~ "This option will be disabled if spiral vase mode is enabled." -#~ msgstr "" -#~ "A direção na qual as voltas de parede são extrudados quando vistos de " -#~ "cima.\n" -#~ "\n" -#~ "Por padrão, todas as paredes são extrudadas no sentido anti-horário, a " -#~ "menos que o Reverso em ímpar esteja ativado. Definir isso como qualquer " -#~ "opção que não seja Automático forçará a direção da parede, " -#~ "independentemente do Reverso em ímpar.\n" -#~ "\n" -#~ "Esta opção será desativada se o modo de vaso espiral estiver ativado." - #~ msgid "" #~ "While printing by Object, the extruder may collide skirt.\n" #~ "Thus, reset the skirt layer to 1 to avoid that." diff --git a/localization/i18n/ru/OrcaSlicer_ru.po b/localization/i18n/ru/OrcaSlicer_ru.po index 40332ef2d5..dd0ba230ec 100644 --- a/localization/i18n/ru/OrcaSlicer_ru.po +++ b/localization/i18n/ru/OrcaSlicer_ru.po @@ -3726,8 +3726,8 @@ msgstr "" #, c-format, boost-format msgid "" -"Recommended nozzle temperature of this filament type is [%d, %d] degree " -"centigrade" +"The recommended nozzle temperature for this filament type is [%d, %d] " +"degrees Celsius." msgstr "" "Рекомендуемая температура сопла для данного типа пластиковой нити составляет " "[%d, %d] градусов Цельсия." diff --git a/localization/i18n/sv/OrcaSlicer_sv.po b/localization/i18n/sv/OrcaSlicer_sv.po index 24db2da22a..4f75526535 100644 --- a/localization/i18n/sv/OrcaSlicer_sv.po +++ b/localization/i18n/sv/OrcaSlicer_sv.po @@ -3594,8 +3594,8 @@ msgstr "" #, c-format, boost-format msgid "" -"Recommended nozzle temperature of this filament type is [%d, %d] degree " -"centigrade" +"The recommended nozzle temperature for this filament type is [%d, %d] " +"degrees Celsius." msgstr "" "Rekommenderad nozzel temperatur med denna filament typ är [%d, %d] grader " "celius" @@ -17712,7 +17712,7 @@ msgstr "" #, c-format, boost-format #~ msgid "" #~ "Bed temperature of other layer is lower than bed temperature of initial " -#~ "layer for more than %d degree centigrade.\n" +#~ "layer for more than %d degrees Celsius.\n" #~ "This may cause model broken free from build plate during printing" #~ msgstr "" #~ "Byggplattans temperatur för andra lager är mindre än temperaturen för " diff --git a/localization/i18n/tr/OrcaSlicer_tr.po b/localization/i18n/tr/OrcaSlicer_tr.po index 39cd77fadf..7b66619601 100644 --- a/localization/i18n/tr/OrcaSlicer_tr.po +++ b/localization/i18n/tr/OrcaSlicer_tr.po @@ -3647,10 +3647,10 @@ msgstr "" "Lütfen yazdırmak için sıcaklığı kullanıp kullanmayacağınızdan emin olun.\n" "\n" -#, c-format, boost-format +#, fuzzy, c-format, boost-format msgid "" -"Recommended nozzle temperature of this filament type is [%d, %d] degree " -"centigrade" +"The recommended nozzle temperature for this filament type is [%d, %d] " +"degrees Celsius." msgstr "" "Bu filament tipinin tavsiye edilen Nozul sıcaklığı [%d, %d] derece " "santigrattır" diff --git a/localization/i18n/uk/OrcaSlicer_uk.po b/localization/i18n/uk/OrcaSlicer_uk.po index 5eb7391a94..7c175c9bf0 100644 --- a/localization/i18n/uk/OrcaSlicer_uk.po +++ b/localization/i18n/uk/OrcaSlicer_uk.po @@ -3687,8 +3687,8 @@ msgstr "" #, c-format, boost-format msgid "" -"Recommended nozzle temperature of this filament type is [%d, %d] degree " -"centigrade" +"The recommended nozzle temperature for this filament type is [%d, %d] " +"degrees Celsius." msgstr "" "Рекомендована температура сопла для цього типу нитки становить [%d, %d] " "градусів Цельсія" diff --git a/localization/i18n/zh_CN/OrcaSlicer_zh_CN.po b/localization/i18n/zh_CN/OrcaSlicer_zh_CN.po index c982049ace..33a003a574 100644 --- a/localization/i18n/zh_CN/OrcaSlicer_zh_CN.po +++ b/localization/i18n/zh_CN/OrcaSlicer_zh_CN.po @@ -3523,8 +3523,8 @@ msgstr "" #, c-format, boost-format msgid "" -"Recommended nozzle temperature of this filament type is [%d, %d] degree " -"centigrade" +"The recommended nozzle temperature for this filament type is [%d, %d] " +"degrees Celsius." msgstr "该耗材的推荐喷嘴温度是[%d, %d]摄氏度" msgid "" @@ -17804,7 +17804,7 @@ msgstr "" #, c-format, boost-format #~ msgid "" #~ "Bed temperature of other layer is lower than bed temperature of initial " -#~ "layer for more than %d degree centigrade.\n" +#~ "layer for more than %d degrees Celsius.\n" #~ "This may cause model broken free from build plate during printing" #~ msgstr "" #~ "其它层的热床温度比首层热床温度低太多,超过了%d 摄氏度。\n" diff --git a/localization/i18n/zh_TW/OrcaSlicer_zh_TW.po b/localization/i18n/zh_TW/OrcaSlicer_zh_TW.po index ba1cdbe715..f2a5a5d2ce 100644 --- a/localization/i18n/zh_TW/OrcaSlicer_zh_TW.po +++ b/localization/i18n/zh_TW/OrcaSlicer_zh_TW.po @@ -3,14 +3,15 @@ # FIRST Translator Jiang Yue , 2019. # REVISED lin-ycv , 2024. # REVISED Shuwn Hsu, 2024. +# REVISED Enfeng Tsao, 2025. # msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-03-16 22:32+0800\n" -"PO-Revision-Date: 2025-01-11 10:54+0800\n" -"Last-Translator: Shuwn Hsu\n" +"PO-Revision-Date: 2025-03-27 19:32+0800\n" +"Last-Translator: 5idereal \n" "Language-Team: \n" "Language: zh_TW\n" "MIME-Version: 1.0\n" @@ -527,7 +528,7 @@ msgid "Cut by Plane" msgstr "用平面分割" msgid "non-manifold edges be caused by cut tool, do you want to fix it now?" -msgstr "切科後產生非流形邊,是否要修復?" +msgstr "切科後產生非流形邊,是否要修復?" msgid "Repairing model object" msgstr "修復模型物件" @@ -715,7 +716,7 @@ msgid "Default font" msgstr "預設字型" msgid "Advanced" -msgstr "高級" +msgstr "進階" msgid "" "The text cannot be written using the selected font. Please try choosing a " @@ -744,7 +745,7 @@ msgid "Too small, enlarged font height inside text input." msgstr "太小,已增大文字輸入框內的字體高度。" msgid "Text doesn't show current horizontal alignment." -msgstr "文字未呈現當前的水平對齊狀態。" +msgstr "文字未呈現目前的水平對齊狀態。" msgid "Revert font changes." msgstr "還原字體設定變更。" @@ -763,7 +764,7 @@ msgid "Click to change text into object part." msgstr "點擊將文字轉換為物件部分。" msgid "You can't change a type of the last solid part of the object." -msgstr "你無法變更模型最後一個實體部分的類型。" +msgstr "您無法變更模型最後一個實體部分的類型。" msgctxt "EmbossOperation" msgid "Cut" @@ -804,7 +805,7 @@ msgid "Can't rename temporary style." msgstr "無法更改臨時樣式名稱。" msgid "First Add style to list." -msgstr "首先將樣式添加到列表中。" +msgstr "首先將樣式新增到列表中。" #, boost-format msgid "Save %1% style" @@ -836,7 +837,7 @@ msgstr "無法刪除僅存的樣式。" #, boost-format msgid "Are you sure you want to permanently remove the \"%1%\" style?" -msgstr "你確定要永久移除「%1%」樣式嗎?" +msgstr "您確定要永久移除「%1%」樣式嗎?" #, boost-format msgid "Delete \"%1%\" style." @@ -856,7 +857,7 @@ msgstr "已修改樣式「%1%」" #, boost-format msgid "Current style is \"%1%\"" -msgstr "當前樣式為「%1%」" +msgstr "目前樣式為「%1%」" #, boost-format msgid "" @@ -864,9 +865,9 @@ msgid "" "\n" "Would you like to continue anyway?" msgstr "" -"將樣式更改為「%1%」會捨棄當前的樣式修改。\n" +"將樣式更改為「%1%」會捨棄目前的樣式修改。\n" "\n" -"你確定要繼續嗎?" +"您確定要繼續嗎?" msgid "Not valid style." msgstr "無效的樣式。" @@ -1168,8 +1169,8 @@ msgid "" "Do NOT save local path to 3MF file.\n" "Also disables 'reload from disk' option." msgstr "" -"不要將本地路徑保存到 3MF 文件中。\n" -"同時禁用「從磁碟重新載入」選項。" +"不要將本地路徑保存到 3MF 檔案中。\n" +"同時停用「從硬碟重新載入」選項。" #. TRN: An menu option to convert the SVG into an unmodifiable model part. msgid "Bake" @@ -1247,11 +1248,11 @@ msgstr "副檔名必須為「.svg」 ,但選擇的是 %1%" #, boost-format msgid "Nano SVG parser can't load from file (%1%)." -msgstr "Nano SVG 解析器無法載入文件 (%1%)。" +msgstr "Nano SVG 解析器無法載入檔案 (%1%)。" #, boost-format msgid "SVG file does NOT contain a single path to be embossed (%1%)." -msgstr "SVG 文件無要浮雕的路徑 (%1%)。" +msgstr "SVG 檔案無要浮雕的路徑 (%1%)。" msgid "No feature" msgstr "沒有特徵" @@ -1441,7 +1442,7 @@ msgid "" "OrcaSlicer will terminate because of running out of memory.It may be a bug. " "It will be appreciated if you report the issue to our team." msgstr "" -"系統記憶體耗盡,Orca Slicer 即將停止並且結束。這可能是個錯誤,希望你可以回報" +"系統記憶體耗盡,Orca Slicer 即將停止並且結束。這可能是個錯誤,希望您可以回報" "此問題,我們非常感激。" msgid "Fatal error" @@ -1451,7 +1452,7 @@ msgid "" "OrcaSlicer will terminate because of a localization error. It will be " "appreciated if you report the specific scenario this issue happened." msgstr "" -"遇到語系本地化錯誤,Orca Slicer 即將停止並且結束。希望你可以回報發生此問題的" +"遇到語系本地化錯誤,Orca Slicer 即將停止並且結束。希望您可以回報發生此問題的" "具體狀況,我們非常感激。" msgid "Critical error" @@ -1465,7 +1466,7 @@ msgid "Untitled" msgstr "未命名" msgid "Downloading Bambu Network Plug-in" -msgstr "正在下載 Bambu 網路插件" +msgstr "正在下載 Bambu 網路外掛程式" msgid "Login information expired. Please login again." msgstr "登入資訊已過期。請重新登入。" @@ -1522,7 +1523,7 @@ msgid "" "not be affected." msgstr "" "OrcaSlicer 的組態檔案可能已損壞,無法解析。\n" -"OrcaSlicer 已嘗試重新創建組態檔案。\n" +"OrcaSlicer 已嘗試重新建立組態檔案。\n" "請注意,應用程式設定將會丟失,但機臺組態設定不會受到影響。" msgid "Rebuild" @@ -1555,7 +1556,7 @@ msgstr "部分預設已被修改。" msgid "" "You can keep the modified presets to the new project, discard or save " "changes as new presets." -msgstr "你可以保留尚未儲存修改的預設應用到新項目中,或者選擇忽略。" +msgstr "您可以保留尚未儲存修改的預設套用到新項目中,或者選擇忽略。" msgid "User logged out" msgstr "使用者登出" @@ -1577,10 +1578,10 @@ msgstr "隱私協議更新" msgid "" "The number of user presets cached in the cloud has exceeded the upper limit, " "newly created user presets can only be used locally." -msgstr "雲端儲存的用戶預設數量已超過上限,新的用戶預設僅能在本地使用。" +msgstr "雲端儲存的使用者預設數量已超過上限,新的使用者預設僅能在本地使用。" msgid "Sync user presets" -msgstr "同步用戶預設" +msgstr "同步使用者預設" msgid "Loading user preset" msgstr "正在載入使用者預設" @@ -1815,16 +1816,16 @@ msgid "Fix model" msgstr "修復模型" msgid "Export as one STL" -msgstr "匯出為一個STL" +msgstr "匯出為單一 STL" msgid "Export as STLs" -msgstr "匯出為STLs" +msgstr "匯出為 STLs" msgid "Reload from disk" msgstr "從硬碟重新載入" msgid "Reload the selected parts from disk" -msgstr "從磁碟重新載入選中的零件" +msgstr "從硬碟重新載入選中的零件" msgid "Replace with STL" msgstr "替換為 STL" @@ -1924,10 +1925,10 @@ msgid "Ability to change text, font, size, ..." msgstr "編輯文字、字型、尺寸..." msgid "Edit SVG" -msgstr "編輯SVG" +msgstr "編輯 SVG" msgid "Change SVG source file, projection, size, ..." -msgstr "更改SVG來源、投影、尺寸..." +msgstr "更改 SVG 來源、投影、尺寸..." msgid "Invalidate cut info" msgstr "解除切割關係" @@ -2092,7 +2093,7 @@ msgid "Error!" msgstr "錯誤!" msgid "Failed to get the model data in the current file." -msgstr "取得目前檔案中的模型數據失敗。" +msgstr "取得目前檔案中的模型資料失敗。" msgid "Generic" msgstr "一般" @@ -2120,7 +2121,7 @@ msgstr "刪除的負體積屬於切割物件的一部分" msgid "" "To save cut correspondence you can delete all connectors from all related " "objects." -msgstr "為保證切割關係,你可以將所有關聯物件的連接件一起刪除。" +msgstr "為保證切割關係,您可以將所有關聯物件的連接件一起刪除。" msgid "" "This action will break a cut correspondence.\n" @@ -2341,7 +2342,7 @@ msgid "Enter Custom G-code used on current layer:" msgstr "輸入當層使用的自訂 G-code:" msgid "Jump to Layer" -msgstr "轉換到層" +msgstr "跳至層" msgid "Please enter the layer number" msgstr "請輸入層數" @@ -2455,16 +2456,16 @@ msgid "Retry" msgstr "重試" msgid "Calibrating AMS..." -msgstr "正在校準 AMS..." +msgstr "正在校正 AMS..." msgid "A problem occurred during calibration. Click to view the solution." -msgstr "校準過程遇到問題。點擊查看解決方案。" +msgstr "校正過程遇到問題。點擊查看解決方案。" msgid "Calibrate again" -msgstr "重新校準" +msgstr "重新校正" msgid "Cancel calibration" -msgstr "取消校準" +msgstr "取消校正" msgid "Idling..." msgstr "閒置..." @@ -2661,11 +2662,11 @@ msgstr "正在傳送列印設定" #, c-format, boost-format msgid "Successfully sent. Will automatically jump to the device page in %ss" -msgstr "已傳送完成,即將自動轉換到設備頁面(%s秒)" +msgstr "已傳送完成,即將自動跳至設備頁面(%s秒)" #, c-format, boost-format msgid "Successfully sent. Will automatically jump to the next page in %ss" -msgstr "已成功傳送。將自動轉換到 %ss 中的下一頁" +msgstr "已成功傳送。將自動跳至 %ss 中的下一頁" msgid "An SD card needs to be inserted before printing via LAN." msgstr "透過區域網路列印之前需要插入 SD 記憶卡。" @@ -2705,10 +2706,10 @@ msgid "" msgstr "匯入的 SLA 存檔不包含任何預設。目前的 SLA 預設被用作備用選項。" msgid "You cannot load SLA project with a multi-part object on the bed" -msgstr "你無法在列印板上載入包含多部分物件的 SLA 項目" +msgstr "您無法在列印板上載入包含多部分物件的 SLA 項目" msgid "Please check your object list before preset changing." -msgstr "請在更改預設之前檢查你的物件清單。" +msgstr "請在更改預設之前檢查您的物件清單。" msgid "Attention!" msgstr "注意!" @@ -2773,7 +2774,7 @@ msgstr "PrusaSlicer 最初是基於 Alessandro Ranellucci 的 Slic3r。" msgid "" "Slic3r was created by Alessandro Ranellucci with the help of many other " "contributors." -msgstr "Slic3r 由 Alessandro Ranellucci 在其他眾多貢獻者的幫助下創建。" +msgstr "Slic3r 由 Alessandro Ranellucci 在其他眾多貢獻者的幫助下建立。" msgid "Version" msgstr "版本" @@ -2811,7 +2812,7 @@ msgid "SN" msgstr "序號" msgid "Factors of Flow Dynamics Calibration" -msgstr "動態流量係數校準" +msgstr "動態流量係數校正" msgid "PA Profile" msgstr "PA 設定檔" @@ -2829,10 +2830,10 @@ msgid "Setting Virtual slot information while printing is not supported" msgstr "不支援在列印時設定虛擬槽位資訊" msgid "Are you sure you want to clear the filament information?" -msgstr "你確定要清除線材資訊嗎?" +msgstr "您確定要清除線材資訊嗎?" msgid "You need to select the material type and color first." -msgstr "你需要先選擇線材類型和顏色。" +msgstr "您需要先選擇線材類型和顏色。" #, c-format, boost-format msgid "Please input a valid value (K in %.1f~%.1f)" @@ -2849,14 +2850,14 @@ msgid "Custom Color" msgstr "自訂顏色" msgid "Dynamic flow calibration" -msgstr "動態流量校準" +msgstr "動態流量校正" msgid "" "The nozzle temp and max volumetric speed will affect the calibration " "results. Please fill in the same values as the actual printing. They can be " "auto-filled by selecting a filament preset." msgstr "" -"噴嘴溫度和最大體積速度會影響到校準結果,請填寫與實際列印相同的數值。可通過選" +"噴嘴溫度和最大體積速度會影響到校正結果,請填寫與實際列印相同的數值。可通過選" "擇已有的材料預設來自動填寫。" msgid "Nozzle Diameter" @@ -2894,7 +2895,7 @@ msgid "" "hot bed like the picture below, and fill the value on its left side into the " "factor K input box." msgstr "" -"校準完成。如下圖中的範例,請在你的熱床上找到最均勻完整的擠出線,並將其左側的" +"校正完成。如下圖中的範例,請在您的熱床上找到最均勻完整的擠出線,並將其左側的" "數值填入係數 K 欄位。" msgid "Save" @@ -2908,17 +2909,17 @@ msgstr "範例" #, c-format, boost-format msgid "Calibrating... %d%%" -msgstr "校準中... %d%%" +msgstr "校正中... %d%%" msgid "Calibration completed" -msgstr "校準已完成" +msgstr "校正已完成" #, c-format, boost-format msgid "%s does not support %s" msgstr "%s 不支援 %s" msgid "Dynamic flow Calibration" -msgstr "動態流量校準" +msgstr "動態流量校正" msgid "Step" msgstr "步驟" @@ -3025,13 +3026,13 @@ msgstr "" msgid "" "Note: if a new filament is inserted during printing, the AMS will not " "automatically read any information until printing is completed." -msgstr "備註: 若在列印過程中插入新的線材,AMS會等到列印完成才會讀取線材資訊。" +msgstr "備註:若在列印過程中插入新的線材,AMS 會等到列印完成才會讀取線材資訊。" msgid "" "When inserting a new filament, the AMS will not automatically read its " "information, leaving it blank for you to enter manually." msgstr "" -"在插入一卷新線材時,AMS 將不會自動讀取線材資訊,預留一個空的線材資訊等待你手" +"在插入一卷新線材時,AMS 將不會自動讀取線材資訊,預留一個空的線材資訊等待您手" "動輸入。" msgid "Power on update" @@ -3081,17 +3082,17 @@ msgid "File" msgstr "檔案" msgid "Calibration" -msgstr "校準" +msgstr "校正" msgid "" "Failed to download the plug-in. Please check your firewall settings and vpn " "software, check and retry." -msgstr "插件下載失敗。請檢查你的防火牆設定和 VPN 軟體,檢查後重試。" +msgstr "外掛程式下載失敗。請檢查您的防火牆設定和 VPN 軟體,檢查後重試。" msgid "" "Failed to install the plug-in. Please check whether it is blocked or deleted " "by anti-virus software." -msgstr "插件安裝失敗。請檢查是否被防毒軟體阻擋或刪除。" +msgstr "外掛程式安裝失敗。請檢查是否被防毒軟體阻擋或刪除。" msgid "click here to see more info" msgstr "點擊這裡查看更多資訊" @@ -3126,7 +3127,7 @@ msgid "Slicing complete" msgstr "切片完成" msgid "Access violation" -msgstr "非法訪問" +msgstr "非法存取" msgid "Illegal instruction" msgstr "非法指令" @@ -3186,7 +3187,7 @@ msgid "" "Copying of the temporary G-code has finished but the original code at %1% " "couldn't be opened during copy check. The output G-code is at %2%.tmp." msgstr "" -"臨時 G-code 的 複製已完成,但原始 G-code 因 %1% 在複製檢查期間無法打開。輸出 " +"臨時 G-code 的複製已完成,但原始 G-code 因 %1% 在複製檢查期間無法打開。輸出 " "G-code 為%2%.tmp。" #, boost-format @@ -3194,7 +3195,7 @@ msgid "" "Copying of the temporary G-code has finished but the exported code couldn't " "be opened during copy check. The output G-code is at %1%.tmp." msgstr "" -"臨時 G-code 的複制已完成,但匯出的 G-code 無法在復製檢查過程中打開。輸出 G-" +"臨時 G-code 的複製已完成,但匯出的 G-code 無法在複製檢查過程中打開。輸出 G-" "code 為 %1%.tmp。" #, boost-format @@ -3212,7 +3213,7 @@ msgid "" msgstr "" "無法儲存 G-code 檔案。\n" "錯誤資訊:%1%。\n" -"原始檔 %2%." +"原始檔 %2%。" msgid "Copying of the temporary G-code to the output G-code failed" msgstr "將臨時 G-Code 複製到輸出 G-Code 失敗" @@ -3381,7 +3382,7 @@ msgid "Select Printers" msgstr "選擇列印設備" msgid "Ams Status" -msgstr "AMS狀態" +msgstr "AMS 狀態" msgid "Printing Options" msgstr "列印選項" @@ -3393,7 +3394,7 @@ msgid "Timelapse" msgstr "縮時攝影" msgid "Flow Dynamic Calibration" -msgstr "動態流量校準" +msgstr "動態流量校正" msgid "Send Options" msgstr "傳送選項" @@ -3487,7 +3488,7 @@ msgid "Error! Invalid model" msgstr "錯誤!無效模型" msgid "The selected file contains no geometry." -msgstr "所選檔案不包含任何幾何數據。" +msgstr "所選檔案不包含任何幾何資料。" msgid "" "The selected file contains several disjoint areas. This is not supported." @@ -3526,8 +3527,8 @@ msgstr "" #, c-format, boost-format msgid "" -"Recommended nozzle temperature of this filament type is [%d, %d] degree " -"centigrade" +"The recommended nozzle temperature for this filament type is [%d, %d] " +"degrees Celsius." msgstr "該線材的推薦噴嘴溫度是攝氏 [%d, %d] 度" msgid "" @@ -3539,9 +3540,9 @@ msgstr "" #, c-format, boost-format msgid "" -"Current chamber temperature is higher than the material's safe " -"temperature,it may result in material softening and clogging.The maximum " -"safe temperature for the material is %d" +"Current chamber temperature is higher than the material's safe temperature," +"it may result in material softening and clogging.The maximum safe " +"temperature for the material is %d" msgstr "" "目前列印設備內部溫度高於線材的安全溫度,可能會導致線材軟化和堵塞。線材的最高" "安全溫度為:%d" @@ -3565,8 +3566,8 @@ msgid "" "\n" "The first layer height will be reset to 0.2." msgstr "" -"0為無效的首層層高值。\n" -"將被重設為0.2。" +"0 為無效的首層層高值。\n" +"將被重設為 0.2。" msgid "" "This setting is only used for model size tunning with small value in some " @@ -3658,7 +3659,7 @@ msgstr "" "填充密度為 0、縮時攝影模式為傳統。" msgid " But machines with I3 structure will not generate timelapse videos." -msgstr " 但採用 I3 結構的機器無法生成延時影片。" +msgstr " 但採用 I3 結構的機器無法產生延時影片。" msgid "" "Change these settings automatically? \n" @@ -3691,7 +3692,7 @@ msgid "Heating hotend" msgstr "加熱熱端" msgid "Calibrating extrusion" -msgstr "校準擠出補償" +msgstr "校正擠出補償" msgid "Scanning bed surface" msgstr "掃描熱床" @@ -3703,7 +3704,7 @@ msgid "Identifying build plate type" msgstr "識別列印板類型" msgid "Calibrating Micro Lidar" -msgstr "校準微型雷射雷達" +msgstr "校正微型雷射雷達" msgid "Homing toolhead" msgstr "工具頭回到起始點" @@ -3721,10 +3722,10 @@ msgid "Pause of front cover falling" msgstr "工具頭前蓋掉落暫停列印" msgid "Calibrating the micro lida" -msgstr "校準微型雷射雷達" +msgstr "校正微型雷射雷達" msgid "Calibrating extrusion flow" -msgstr "校準擠出流量" +msgstr "校正擠出流量" msgid "Paused due to nozzle temperature malfunction" msgstr "暫停:噴嘴溫度異常" @@ -3742,7 +3743,7 @@ msgid "Filament loading" msgstr "進料中" msgid "Motor noise calibration" -msgstr "電機噪音校準" +msgstr "電機噪音校正" msgid "Paused due to AMS lost" msgstr "由於 AMS 遺失而暫停" @@ -3803,7 +3804,7 @@ msgid "" "45℃.In order to avoid extruder clogging,low temperature filament(PLA/PETG/" "TPU) is not allowed to be loaded." msgstr "" -"當前或目標機箱溫度超過 45℃。為避免擠出機堵塞,不允許裝載低溫耗材(PLA/PETG/" +"目前或目標機箱溫度超過 45℃。為避免擠出機堵塞,不允許裝載低溫耗材(PLA/PETG/" "TPU)。" msgid "" @@ -3827,19 +3828,19 @@ msgstr "無法啟動列印作業" msgid "" "This calibration does not support the currently selected nozzle diameter" -msgstr "校準不支援目前選擇的噴嘴直徑" +msgstr "校正不支援目前選擇的噴嘴直徑" msgid "Current flowrate cali param is invalid" -msgstr "目前流量校準參數無效" +msgstr "目前流量校正參數無效" msgid "Selected diameter and machine diameter do not match" msgstr "所選噴嘴直徑與設備不匹配" msgid "Failed to generate cali gcode" -msgstr "產生校準代碼失敗" +msgstr "產生校正代碼失敗" msgid "Calibration error" -msgstr "校準錯誤" +msgstr "校正錯誤" msgid "TPU is not supported by AMS." msgstr "AMS 不支援 TPU 線材。" @@ -3868,7 +3869,7 @@ msgid "Built-in placeholders (Double click item to add to G-code)" msgstr "內建占位符(雙點擊加入GCODE)" msgid "Search gcode placeholders" -msgstr "收尋GOCDE內的占位符" +msgstr "搜尋 Gcode 內的占位符" msgid "Add selected placeholder to G-code" msgstr "將占位符加到GCODE" @@ -3889,7 +3890,7 @@ msgid "Slicing State" msgstr "切片狀態" msgid "Print Statistics" -msgstr "列印數據" +msgstr "列印統計資料" msgid "Objects Info" msgstr "物件資訊" @@ -3917,7 +3918,7 @@ msgid "Filament settings" msgstr "線材設定" msgid "SLA Materials settings" -msgstr "SLA材料設定" +msgstr "SLA 材料設定" msgid "Printer settings" msgstr "列印設備設定" @@ -4018,13 +4019,13 @@ msgid "Loading G-codes" msgstr "載入 G-code 中" msgid "Generating geometry vertex data" -msgstr "正在產生幾何頂點數據" +msgstr "正在產生幾何頂點資料" msgid "Generating geometry index data" -msgstr "正在產生幾何索引數據" +msgstr "正在產生幾何索引資料" msgid "Statistics of All Plates" -msgstr "所有列印板數據" +msgstr "所有列印板統計資料" msgid "Display" msgstr "顯示" @@ -4250,7 +4251,7 @@ msgid "Allow multiple materials on same plate" msgstr "允許同一列印板中包含多種材料" msgid "Avoid extrusion calibration region" -msgstr "避開擠出校準區域" +msgstr "避開擠出校正區域" msgid "Align to Y axis" msgstr "與 Y 軸對齊" @@ -4338,10 +4339,10 @@ msgstr "" "請將其完全移動到列印板內或列印板外,並確認高度在列印空間範圍以內來解決問題。" msgid "Calibration step selection" -msgstr "校準步驟選擇" +msgstr "校正步驟選擇" msgid "Micro lidar calibration" -msgstr "微型雷射雷達校準" +msgstr "微型雷射雷達校正" msgid "Bed leveling" msgstr "熱床調平" @@ -4353,27 +4354,27 @@ msgid "Motor noise cancellation" msgstr "電機噪音消除" msgid "Calibration program" -msgstr "校準程序" +msgstr "校正程序" msgid "" "The calibration program detects the status of your device automatically to " "minimize deviation.\n" "It keeps the device performing optimally." msgstr "" -"校準程序會自動檢測設備狀態以最小化偏差。\n" +"校正程序會自動檢測設備狀態以最小化偏差。\n" "它確保設備保持最佳性能。" msgid "Calibration Flow" -msgstr "校準流程" +msgstr "校正流程" msgid "Start Calibration" -msgstr "開始校準" +msgstr "開始校正" msgid "Completed" msgstr "已完成" msgid "Calibrating" -msgstr "校準中" +msgstr "校正中" msgid "No step selected" msgstr "未選擇任何步驟" @@ -4412,13 +4413,13 @@ msgid "ConnectPrinter(LAN)" msgstr "連接列印設備(區域網路)" msgid "Please input the printer access code:" -msgstr "請輸入列印設備訪問碼:" +msgstr "請輸入列印設備存取碼:" msgid "" "You can find it in \"Settings > Network > Connection code\"\n" "on the printer, as shown in the figure:" msgstr "" -"你可以在列印設備「設置->網路->連接->訪問碼」\n" +"您可以在列印設備「設置->網路->連接->存取碼」\n" "查看,如下圖所示:" msgid "Invalid input." @@ -4455,7 +4456,7 @@ msgid "No" msgstr "否" msgid "will be closed before creating a new model. Do you want to continue?" -msgstr "將會被關閉以建立新模型,是否繼續?" +msgstr "將會被關閉以建立新模型,是否繼續?" msgid "Slice plate" msgstr "切片單一列印板" @@ -4513,7 +4514,7 @@ msgid "Download Models" msgstr "下載模型" msgid "Default View" -msgstr "默認視圖" +msgstr "預設視圖" #. TRN To be shown in the main menu View->Top msgid "Top" @@ -4754,7 +4755,7 @@ msgid "Help" msgstr "幫助" msgid "Temperature Calibration" -msgstr "溫度校準" +msgstr "溫度校正" msgid "Pass 1" msgstr "粗調" @@ -4806,10 +4807,10 @@ msgid "Tutorial" msgstr "教學" msgid "Calibration help" -msgstr "校準幫助" +msgstr "校正幫助" msgid "More calibrations" -msgstr "更多校準" +msgstr "更多校正" msgid "&Open G-code" msgstr "打開 G-code" @@ -4818,10 +4819,10 @@ msgid "Open a G-code file" msgstr "打開 G-code 檔案" msgid "Re&load from Disk" -msgstr "從磁碟重新載入" +msgstr "從硬碟重新載入" msgid "Reload the plater from disk" -msgstr "從磁碟重新載入" +msgstr "從硬碟重新載入" msgid "Export &Toolpaths as OBJ" msgstr "將工具路徑匯出為 OBJ 格式" @@ -4897,7 +4898,7 @@ msgid "" "the configs." msgstr "" "\n" -"提示:在匯入設定之前,請確保已添加對應的列印設備。" +"提示:在匯入設定之前,請確保已新增對應的列印設備。" msgid "Import result" msgstr "匯入結果" @@ -4918,7 +4919,7 @@ msgid "" "2. The Filament presets\n" "3. The Printer presets" msgstr "" -"從 Bambu 雲端同步你的個人數據嗎?\n" +"從 Bambu 雲端同步您的個人資料嗎?\n" "包含以下資訊:\n" "1. 列印參數設定\n" "2. 線材設定\n" @@ -4966,7 +4967,7 @@ msgstr "連線失敗。請檢查網路並重試" msgid "" "Please check the network and try again, You can restart or update the " "printer if the issue persists." -msgstr "請檢查網路並重試。如果問題持續,你可以重新啟動或更新列印設備。" +msgstr "請檢查網路並重試。如果問題持續,您可以重新啟動或更新列印設備。" msgid "The printer has been logged out and cannot connect." msgstr "列印設備已登出,無法連接。" @@ -4982,7 +4983,7 @@ msgid "" "Do you want to install them?" msgstr "" "執行此功能需要「虛擬攝影機工具包」!\n" -"你要安裝它們嗎?" +"您要安裝它們嗎?" msgid "Downloading Virtual Camera Tools" msgstr "正在下載虛擬攝影機工具包..." @@ -5105,10 +5106,10 @@ msgid "Delete file" msgstr "刪除檔案" msgid "Fetching model information..." -msgstr "正在獲取模型資訊..." +msgstr "正在取得模型資訊..." msgid "Failed to fetch model information from printer." -msgstr "無法從列印設備獲取模型資訊。" +msgstr "無法從列印設備取得模型資訊。" msgid "Failed to parse model information." msgstr "解析模型資訊失敗。" @@ -5117,8 +5118,8 @@ msgid "" "The .gcode.3mf file contains no G-code data.Please slice it with Orca Slicer " "and export a new .gcode.3mf file." msgstr "" -".gcode.3mf 檔案中不包含 G-code 數據。請使用 Orca Slicer 進行切片並匯出新" -"的 .gcode.3mf 檔案。" +".gcode.3mf 檔案中不包含 G-code 資料。請使用 Orca Slicer 進行切片並匯出新的 ." +"gcode.3mf 檔案。" #, c-format, boost-format msgid "File '%s' was lost! Please download it again." @@ -5226,12 +5227,12 @@ msgid "" msgstr "已經完成了 MakeWorld 模型的列印,但評論資料同步失敗。" msgid "How do you like this printing file?" -msgstr "你覺得這個列印檔案怎麼樣?" +msgstr "您覺得這個列印檔案怎麼樣?" msgid "" "(The model has already been rated. Your rating will overwrite the previous " "rating.)" -msgstr "(此模型已被評價。你的評價將覆蓋先前的評價。)" +msgstr "(此模型已被評價。您的評價將覆蓋先前的評價。)" msgid "Rate" msgstr "速率" @@ -5317,7 +5318,7 @@ msgid "Still load" msgstr "繼續進料" msgid "Please select an AMS slot before calibration" -msgstr "請先選擇一個 AMS 槽位後進行校準" +msgstr "請先選擇一個 AMS 槽位後進行校正" msgid "" "Cannot read filament info: the filament is loaded to the tool head,please " @@ -5412,7 +5413,7 @@ msgid "" "\n" " error code: " msgstr "" -"由於某些原因,你的評論結果無法上傳。如下:\n" +"由於某些原因,您的評論結果無法上傳。如下:\n" "\n" " 錯誤代碼: " @@ -5426,15 +5427,15 @@ msgid "" msgstr "" "\n" "\n" -"你想要跳轉到網頁給予評分嗎?" +"您想要跳轉到網頁給予評分嗎?" msgid "" "Some of your images failed to upload. Would you like to redirect to the " "webpage for rating?" -msgstr "你的部分圖片上傳失敗。 要重定導向評價網頁嗎?" +msgstr "您的部分圖片上傳失敗。 要重定導向評價網頁嗎?" msgid "You can select up to 16 images." -msgstr "你最多可以選擇 16 張圖片。" +msgstr "您最多可以選擇 16 張圖片。" msgid "" "At least one successful print record of this print profile is required \n" @@ -5488,7 +5489,7 @@ msgid "" msgstr "該 3mf 檔案版本為測試版,並且較目前的 OrcaSlicer 版本更新。" msgid "If you would like to try Orca Slicer Beta, you may click to" -msgstr "如果你想嘗試 Orca Slicer 測試版,可以點擊以下載到" +msgstr "如果您想嘗試 Orca Slicer 測試版,可以點擊以下載到" msgid "Download Beta Version" msgstr "下載測試版" @@ -5497,7 +5498,7 @@ msgid "The 3mf file version is newer than the current Orca Slicer version." msgstr "該 3mf 檔案版本較目前的 Orca Slicer 版本更新。" msgid "Update your Orca Slicer could enable all functionality in the 3mf file." -msgstr "更新你的 Orca Slicer 以啟用 3mf 檔案中的所有功能。" +msgstr "更新您的 Orca Slicer 以啟用 3mf 檔案中的所有功能。" msgid "Current Version: " msgstr "目前版本:" @@ -5546,7 +5547,7 @@ msgid "Undo integration was successful." msgstr "整合取消成功。" msgid "New network plug-in available." -msgstr "網路插件有可用的更新。" +msgstr "網路外掛程式有可用的更新。" msgid "Details" msgstr "詳細" @@ -5603,7 +5604,7 @@ msgid "Cancel upload" msgstr "取消上傳" msgid "Jump to" -msgstr "轉換到" +msgstr "跳至" msgid "Error:" msgstr "錯誤:" @@ -5630,7 +5631,7 @@ msgid "WARNING:" msgstr "警告:" msgid "Your model needs support ! Please make support material enable." -msgstr "你的模型需要支撐才能列印。請開啟支撐選項。" +msgstr "您的模型需要支撐才能列印。請開啟支撐選項。" msgid "Gcode path overlap" msgstr "Gcode 路徑有重疊" @@ -5653,10 +5654,10 @@ msgstr "範圍" msgid "" "The application cannot run normally because OpenGL version is lower than " "2.0.\n" -msgstr "應用程式無法正常運行,因為 OpenGL 的版本低於 2.0。\n" +msgstr "應用程式無法正常執行,因為 OpenGL 的版本低於 2.0。\n" msgid "Please upgrade your graphics card driver." -msgstr "請升級你的顯示卡驅動。" +msgstr "請升級您的顯示卡驅動程式。" msgid "Unsupported OpenGL version" msgstr "不支援的 OpenGL 版本" @@ -5732,7 +5733,7 @@ msgid "Objects" msgstr "物件" msgid "Advance" -msgstr "高級" +msgstr "進階" msgid "Compare presets" msgstr "比較設定" @@ -5841,7 +5842,7 @@ msgstr "" msgid "" "Already did a synchronization, do you want to sync only changes or resync " "all?" -msgstr "已經同步過,你希望僅同步改變的線材還是重新同步所有線材?" +msgstr "已經同步過,您希望僅同步改變的線材還是重新同步所有線材?" msgid "Sync" msgstr "僅同步改變的" @@ -5912,7 +5913,7 @@ msgid "Loading file: %s" msgstr "載入檔案:%s" msgid "The 3mf is not supported by OrcaSlicer, load geometry data only." -msgstr "該 3mf 檔案不是來自 Orca Slicer,將只載入幾何數據。" +msgstr "該 3mf 檔案不是來自 Orca Slicer,將只載入幾何資料。" msgid "Load 3mf" msgstr "載入 3mf" @@ -5924,13 +5925,13 @@ msgid "" msgstr "該 3mf 的版本 %s 比 %s 的版本 %s 新,以下參數值無法識別:" msgid "You'd better upgrade your software.\n" -msgstr "建議升級你的軟體版本。\n" +msgstr "建議升級您的軟體版本。\n" #, c-format, boost-format msgid "" "The 3mf's version %s is newer than %s's version %s, Suggest to upgrade your " "software." -msgstr "該 3mf 的版本 %s 比 %s 的版本 %s 要新,建議升級你的軟體。" +msgstr "該 3mf 的版本 %s 比 %s 的版本 %s 要新,建議升級您的軟體。" msgid "Invalid values found in the 3mf:" msgstr "在 3mf 檔案中發現無效值:" @@ -5984,7 +5985,7 @@ msgid "" "The object from file %s is too small, and maybe in meters or inches.\n" " Do you want to scale to millimeters?" msgstr "" -"文件 %s 中的物件太小,可能以公尺(M)或英吋(Inches)為單位。\n" +"檔案 %s 中的物件太小,可能以公尺(M)或英吋(Inches)為單位。\n" "是否要轉換成毫米(mm)?" msgid "Object too small" @@ -6008,7 +6009,7 @@ msgid "Object with multiple parts was detected" msgstr "偵測到多零件物件" msgid "The file does not contain any geometry data." -msgstr "此檔案不包含任何幾何數據。" +msgstr "此檔案不包含任何幾何資料。" msgid "" "Your object appears to be too large, Do you want to scale it down to fit the " @@ -6049,7 +6050,7 @@ msgid "" "This action will break a cut correspondence.\n" "After that model consistency can't be guaranteed." msgstr "" -"你正在嘗試刪除一個屬於切割物件的部分。\n" +"您正在嘗試刪除一個屬於切割物件的部分。\n" "此操作將破壞切割對應關係。\n" "模型的一致性可能無法保證。" @@ -6099,7 +6100,7 @@ msgid "warnings" msgstr "警告" msgid "Invalid data" -msgstr "無效數據" +msgstr "無效資料" msgid "Slicing Canceled" msgstr "切片已取消" @@ -6113,7 +6114,7 @@ msgstr "請解決切片錯誤後再重新發布。" msgid "" "Network Plug-in is not detected. Network related features are unavailable." -msgstr "未偵測到網路插件。網路相關功能不可用。" +msgstr "未偵測到網路外掛程式。網路相關功能不可用。" msgid "" "Preview only mode:\n" @@ -6123,7 +6124,7 @@ msgstr "" "被載入的檔案僅包含 G-Code,不支援進入準備頁面" msgid "You can keep the modified presets to the new project or discard them" -msgstr "你可以將修改後的預設檔保留到新專案項目中或者忽略這些修改" +msgstr "您可以將修改後的預設檔保留到新專案項目中或者忽略這些修改" msgid "Creating a new project" msgstr "建立新專案" @@ -6170,13 +6171,13 @@ msgstr "資訊:" msgid "" "No accelerations provided for calibration. Use default acceleration value " -msgstr "未提供校準所需的加速度,將使用預設加速度值 " +msgstr "未提供校正所需的加速度,將使用預設加速度值 " msgid "mm/s²" msgstr "mm/s²" msgid "No speeds provided for calibration. Use default optimal speed " -msgstr "未提供校準所需的速度,將使用預設最佳速度 " +msgstr "未提供校正所需的速度,將使用預設最佳速度 " msgid "mm/s" msgstr "mm/s" @@ -6217,7 +6218,7 @@ msgid "Open as project" msgstr "作為專案項目打開" msgid "Import geometry only" -msgstr "僅匯入模型數據" +msgstr "僅匯入模型資料" msgid "" "This option can be changed later in preferences, under 'Load Behaviour'." @@ -6272,7 +6273,7 @@ msgid "" "Unable to perform boolean operation on model meshes. Only positive parts " "will be kept. You may fix the meshes and try again." msgstr "" -"無法對模型網格執行布林運算。只有正向部分會被保留。你可以修正網格後再試一次。" +"無法對模型網格執行布林運算。只有正向部分會被保留。您可以修正網格後再試一次。" #, boost-format msgid "Reason: part \"%1%\" is empty." @@ -6300,7 +6301,7 @@ msgid "" "3MF file?\n" "If you hit 'NO', all SVGs in the project will not be editable any more." msgstr "" -"你確定要將原始 SVG 檔案及其本地路徑儲存到 3MF 檔案中嗎?\n" +"您確定要將原始 SVG 檔案及其本地路徑儲存到 3MF 檔案中嗎?\n" "如果選擇『否』,專案中的所有 SVG 將不再可編輯。" msgid "Private protection" @@ -6329,7 +6330,7 @@ msgid "Custom supports and color painting were removed before repairing." msgstr "自訂的支撐和上色在模型修復之前被清除了。" msgid "Optimize Rotation" -msgstr "優化旋轉" +msgstr "最佳化旋轉" msgid "Invalid number" msgstr "無效數字" @@ -6389,7 +6390,7 @@ msgid "" "still want to do this printing, please set this filament's bed temperature " "to non-zero." msgstr "" -"列印板 %d:%s 不建議用於列印 %s(%s)線材。如果你仍想執行此列印,請將該線材的" +"列印板 %d:%s 不建議用於列印 %s(%s)線材。如果您仍想執行此列印,請將該線材的" "熱床溫度設為非零值。" msgid "Switching the language requires application restart.\n" @@ -6402,13 +6403,13 @@ msgid "Language selection" msgstr "語言選擇" msgid "Switching application language while some presets are modified." -msgstr "在切換應用語言之前發現某些參數預設有更改。" +msgstr "在切換應用程式語言之前發現某些參數預設有更改。" msgid "Changing application language" msgstr "正在為應用程式切換語言" msgid "Changing the region will log out your account.\n" -msgstr "修改區域會自動登出你的帳號。\n" +msgstr "修改區域會自動登出您的帳號。\n" msgid "Region selection" msgstr "區域選擇" @@ -6429,13 +6430,13 @@ msgid "with OrcaSlicer so that Orca can open models from" msgstr "與 OrcaSlicer 關聯,以便 Orca 可以從中打開模型" msgid "Current Association: " -msgstr "當前關聯:" +msgstr "目前關聯:" msgid "Current Instance" -msgstr "當前實例" +msgstr "目前實例" msgid "Current Instance Path: " -msgstr "當前實例路徑:" +msgstr "目前實例路徑:" msgid "General Settings" msgstr "一般設定" @@ -6465,11 +6466,11 @@ msgid "" "This stops the transmission of data to Bambu's cloud services. Users who " "don't use BBL machines or use LAN mode only can safely turn on this function." msgstr "" -"這會停止數據傳輸到 Bambu 的雲端服務。使用者如果不使用 Bambu 機台或僅使用區域" +"這會停止資料傳輸到 Bambu 的雲端服務。使用者如果不使用 Bambu 機台或僅使用區域" "網路模式,可以安全地啟用此功能。" msgid "Enable network plugin" -msgstr "啟用網路插件" +msgstr "啟用網路外掛程式" msgid "Check for stable updates only" msgstr "僅檢查穩定版更新" @@ -6491,15 +6492,15 @@ msgid "" "it is allowed to run multiple instances of same app from the command line. " "In such case this settings will allow only one instance." msgstr "" -"在 OSX 上,預設情況下總是只有一個應用程式實例在運行。但是卻允許從命令視窗執行" -"同一應用程式的多個實例。當你設定了這個設定後將只允許一個實例執行。" +"在 OSX 上,預設情況下總是只有一個應用程式實例在執行。但是卻允許從命令視窗執行" +"同一應用程式的多個實例。當您設定了這個設定後將只允許一個實例執行。" msgid "" "If this is enabled, when starting OrcaSlicer and another instance of the " "same OrcaSlicer is already running, that instance will be reactivated " "instead." msgstr "" -"啟用後,嘗試開起 OrcaSlicer 時若有另一個 OrcaSlicer 程序已在運行時,已在運行" +"啟用後,嘗試開起 OrcaSlicer 時若有另一個 OrcaSlicer 程序已在執行時,已在執行" "的程序會被重新啟動。" msgid "Home" @@ -6577,10 +6578,10 @@ msgstr "記住機臺設定" msgid "" "If enabled, Orca will remember and switch filament/process configuration for " "each printer automatically." -msgstr "啟用後,Orca會記住且自動切換各機臺線材與列印設定。" +msgstr "啟用後,Orca 會記住且自動切換各機臺線材與列印設定。" msgid "Multi-device Management(Take effect after restarting Orca)." -msgstr "多臺設備管理 (需重開Orca)" +msgstr "多臺設備管理 (需重開 Orca)" msgid "" "With this option enabled, you can send a task to multiple devices at the " @@ -6597,7 +6598,7 @@ msgid "Network" msgstr "網路" msgid "Auto sync user presets(Printer/Filament/Process)" -msgstr "自動同步用戶預設(列印設備/線材/列印品質參數)" +msgstr "自動同步使用者預設(列印設備/線材/列印品質參數)" msgid "User Sync" msgstr "使用者同步" @@ -6648,7 +6649,7 @@ msgid "Always Ask" msgstr "總是詢問" msgid "Load Geometry Only" -msgstr "僅載入幾何數據" +msgstr "僅載入幾何資料" msgid "Load Behaviour" msgstr "載入方式" @@ -6823,7 +6824,7 @@ msgid "Select/Remove printers(system presets)" msgstr "選擇/移除機台(系統預設)" msgid "Create printer" -msgstr "創建機臺" +msgstr "建立機臺" msgid "The selected preset is null!" msgstr "選擇的預設為空!" @@ -6880,7 +6881,7 @@ msgid "Log Out" msgstr "登出" msgid "Slice all plate to obtain time and filament estimation" -msgstr "正在切片以獲取切片資訊和預估列印時間" +msgstr "正在切片以取得切片資訊和預估列印時間" msgid "Packing project data into 3mf file" msgstr "正在將專案資料打包到 3mf 檔案中" @@ -6907,7 +6908,7 @@ msgid "Packing data to 3mf" msgstr "將資料打包至 3mf" msgid "Jump to webpage" -msgstr "轉換到網頁" +msgstr "跳至網頁" #, c-format, boost-format msgid "Save %s as" @@ -6985,7 +6986,7 @@ msgid "Online" msgstr "在線" msgid "Input access code" -msgstr "輸入訪問碼" +msgstr "輸入存取碼" msgid "Can't find my devices?" msgstr "無法找到我的設備?" @@ -7018,7 +7019,7 @@ msgid "Send print job to" msgstr "傳送列印作業至" msgid "Flow Dynamics Calibration" -msgstr "動態流量校準" +msgstr "動態流量校正" msgid "Click here if you can't connect to the printer" msgstr "如果無法連接到列印設備,請按一下此處" @@ -7067,7 +7068,7 @@ msgid "" "Filaments to AMS slots mappings have been established. You can click a " "filament above to change its mapping AMS slot" msgstr "" -"線材與 AMS 槽位的映射關係已設定完成。你可以點擊上方的線材來更改其對應的 AMS " +"線材與 AMS 槽位的映射關係已設定完成。您可以點擊上方的線材來更改其對應的 AMS " "槽位" msgid "" @@ -7140,7 +7141,7 @@ msgid "" "currently selected printer. It is recommended that you use the same printer " "type for slicing." msgstr "" -"產生 G-code 時選擇的列印設備類型與目前選擇的列印設備不一致。建議你使用相同的" +"產生 G-code 時選擇的列印設備類型與目前選擇的列印設備不一致。建議您使用相同的" "列印設備類型進行切片。" msgid "" @@ -7164,7 +7165,7 @@ msgid "" "If you changed your nozzle lately, please go to Device > Printer Parts to " "change settings." msgstr "" -"切片文件中的噴嘴直徑與記憶中的噴嘴不一致。如果你最近更換了噴嘴,請前往「設備 " +"切片檔案中的噴嘴直徑與記憶中的噴嘴不一致。如果您最近更換了噴嘴,請前往「設備 " "> 列印機部件」更新設定。" #, c-format, boost-format @@ -7178,7 +7179,7 @@ msgstr "請排除上述錯誤,否則無法繼續列印。" msgid "" "Please click the confirm button if you still want to proceed with printing." -msgstr "如果你仍然想繼續列印,請滑鼠左鍵點擊『確定』按鈕。" +msgstr "如果您仍然想繼續列印,請滑鼠左鍵點擊『確定』按鈕。" msgid "" "Connecting to the printer. Unable to cancel during the connection process." @@ -7187,10 +7188,10 @@ msgstr "正在連接列印設備。連接過程中無法取消。" msgid "" "Caution to use! Flow calibration on Textured PEI Plate may fail due to the " "scattered surface." -msgstr "小心使用!紋理 PEI 板 上的流量校準可能會因表面光線散射而失敗。" +msgstr "小心使用!紋理 PEI 板 上的流量校正可能會因表面光線散射而失敗。" msgid "Automatic flow calibration using Micro Lidar" -msgstr "使用 Micro Lidar 進行自動流量校準" +msgstr "使用 Micro Lidar 進行自動流量校正" msgid "Modifying the device name" msgstr "修改列印設備名稱" @@ -7235,10 +7236,10 @@ msgid "Failed to publish login request" msgstr "請求登陸失敗" msgid "Get ticket from device timeout" -msgstr "從設備獲取票證超時" +msgstr "從設備取得票證超時" msgid "Get ticket from server timeout" -msgstr "從伺服器獲取票證超時" +msgstr "從伺服器取得票證超時" msgid "Failed to post ticket to server" msgstr "將票證提交到伺服器失敗" @@ -7278,7 +7279,7 @@ msgid "Log in printer" msgstr "登入列印設備" msgid "Would you like to log in this printer with current account?" -msgstr "你想使用目前帳號登入這台列印設備嗎?" +msgstr "您想使用目前帳號登入這台列印設備嗎?" msgid "Check the reason" msgstr "查看原因" @@ -7296,9 +7297,9 @@ msgid "" "Use(collectively, the \"Terms\"). If you do not comply with or agree to the " "Bambu Lab Privacy Policy, please do not use Bambu Lab equipment and services." msgstr "" -"感謝你購買 Bambu Lab 設備。在使用 Bambu Lab 設備之前,請先閱讀條款與條件。點" -"擊同意使用 Bambu Lab 設備,即表示你同意遵守隱私政策與使用條款(以下統稱「條" -"款」)。若你不同意或無法遵守 Bambu Lab 隱私政策,請勿使用 Bambu Lab 的設備及" +"感謝您購買 Bambu Lab 設備。在使用 Bambu Lab 設備之前,請先閱讀條款與條件。點" +"擊同意使用 Bambu Lab 設備,即表示您同意遵守隱私政策與使用條款(以下統稱「條" +"款」)。若您不同意或無法遵守 Bambu Lab 隱私政策,請勿使用 Bambu Lab 的設備及" "服務。" msgid "and" @@ -7308,7 +7309,7 @@ msgid "Privacy Policy" msgstr "隱私協議" msgid "We ask for your help to improve everyone's printer" -msgstr "我們請求你的幫助來改善大家的列印設備" +msgstr "我們請求您的幫助來改善大家的列印設備" msgid "Statement about User Experience Improvement Program" msgstr "關於使用者體驗改善計劃的聲明" @@ -7328,11 +7329,11 @@ msgid "" "to these terms and the statement about Privacy Policy." msgstr "" "在 3D 列印社群中,我們通過分享彼此的成功與失敗經驗來調整切片參數與設置。%s 也" -"採用了相同的原則,利用機器學習,透過用戶的大量列印成功與失敗數據來提升其性" -"能。我們正以實際應用數據來訓練 %s,使其變得更智能。如果你願意,這項服務將存取" -"你的錯誤日誌和使用日誌,其中可能包含隱私政策中提到的相關資訊。我們不會收集任" +"採用了相同的原則,利用機器學習,透過使用者的大量列印成功與失敗資料來提升其性" +"能。我們正以實際應用資料來訓練 %s,使其變得更智能。如果您願意,這項服務將存取" +"您的錯誤日誌和使用日誌,其中可能包含隱私政策中提到的相關資訊。我們不會收集任" "何可直接或間接識別個人身份的個人資料,包括但不限於姓名、地址、支付資訊或電話" -"號碼。啟用此服務即表示你同意這些條款及隱私政策聲明。" +"號碼。啟用此服務即表示您同意這些條款及隱私政策聲明。" msgid "Statement on User Experience Improvement Plan" msgstr "關於使用者體驗改善計劃的聲明" @@ -7344,7 +7345,7 @@ msgid "Log out printer" msgstr "登出列印設備" msgid "Would you like to log out the printer?" -msgstr "你想登出列印設備嗎?" +msgstr "您想登出列印設備嗎?" msgid "Please log in first." msgstr "請先登入。" @@ -7364,7 +7365,7 @@ msgid "Delete this preset" msgstr "刪除此預設" msgid "Search in preset" -msgstr "在預設中搜索" +msgstr "在預設中搜尋" msgid "Click to reset all settings to the last saved preset." msgstr "點擊以將所有設定還原到最後一次儲存的版本。" @@ -7373,14 +7374,14 @@ msgid "" "Prime tower is required for smooth timelapse. There may be flaws on the " "model without prime tower. Are you sure you want to disable prime tower?" msgstr "" -"平滑模式的縮時錄影需要換料塔,否則列印物件上可能會有瑕疵。你是否要關閉換料" +"平滑模式的縮時錄影需要換料塔,否則列印物件上可能會有瑕疵。您是否要關閉換料" "塔?" msgid "" "Prime tower is required for smooth timelapse. There may be flaws on the " "model without prime tower. Do you want to enable prime tower?" msgstr "" -"平滑模式的縮時錄影需要換料塔,否則列印物件上可能會有瑕疵。你是否要啟用換料" +"平滑模式的縮時錄影需要換料塔,否則列印物件上可能會有瑕疵。您是否要啟用換料" "塔?" msgid "Still print by object?" @@ -7412,11 +7413,11 @@ msgid "" "precise dimensions or is part of an assembly, it's important to double-check " "whether this change in geometry impacts the functionality of your print." msgstr "" -"啟用此選項將會改變模型形狀。如果你的列印需要精準的尺寸或屬於組裝件的一部分," -"請務必再次確認此幾何形狀的更改是否會影響你的列印。" +"啟用此選項將會改變模型形狀。如果您的列印需要精準的尺寸或屬於組裝件的一部分," +"請務必再次確認此幾何形狀的更改是否會影響您的列印。" msgid "Are you sure you want to enable this option?" -msgstr "你確定要啟用此選項嗎?" +msgstr "您確定要啟用此選項嗎?" msgid "" "Layer height is too small.\n" @@ -7456,7 +7457,7 @@ msgid "" "complications.Please use with the latest printer firmware." msgstr "" "實驗性功能:在換線過程中以更大的距離收回並切斷線材,以減少沖洗量。儘管這可以" -"顯著減少沖洗,但也可能增加噴嘴堵塞或其他列印問題的風險。請搭配最新的打印機韌" +"顯著減少沖洗,但也可能增加噴嘴堵塞或其他列印問題的風險。請搭配最新的印表機韌" "體使用。" msgid "" @@ -7465,9 +7466,9 @@ msgid "" "by right-click the empty position of build plate and choose \"Add " "Primitive\"->\"Timelapse Wipe Tower\"." msgstr "" -"在錄製無工具頭縮時錄影影片時,建議添加一個「縮時錄影換料塔」\n" +"在錄製無工具頭縮時錄影影片時,建議新增一個「縮時錄影換料塔」\n" "可以通過右鍵點擊構建板的空白位置,選擇『新增標準模型』->『縮時錄影換料塔』來" -"進行添加。" +"進行新增。" msgid "" "A copy of the current system preset will be created, which will be detached " @@ -7476,7 +7477,7 @@ msgstr "將建立目前系統配置的副本,且該副本將與系統配置分 msgid "" "The current custom preset will be detached from the parent system preset." -msgstr "當前的自訂配置將與父系統配置分離不相關聯。" +msgstr "目前的自訂配置將與父系統配置分離不相關聯。" msgid "Modifications to the current profile will be saved." msgstr "目前設定檔的修改將會保存下來。" @@ -7793,13 +7794,13 @@ msgid "Wipe tower parameters" msgstr "換料塔參數" msgid "Toolchange parameters with single extruder MM printers" -msgstr "適用於單擠出機多材料打印機的工具切換參數" +msgstr "適用於單擠出機多材料印表機的工具切換參數" msgid "Ramming settings" msgstr "尖端成型設定" msgid "Toolchange parameters with multi extruder MM printers" -msgstr "適用於多擠出機多材料打印機的工具切換參數" +msgstr "適用於多擠出機多材料印表機的工具切換參數" msgid "Dependencies" msgstr "相依項目" @@ -7895,7 +7896,7 @@ msgid "" msgstr "" "已選擇單噴頭多材料模式,\n" "所有噴頭的直徑必須相同。\n" -"你是否要將所有噴頭的直徑更改為第一噴頭的噴嘴直徑值?" +"您是否要將所有噴頭的直徑更改為第一噴頭的噴嘴直徑值?" msgid "Nozzle diameter" msgstr "噴嘴直徑" @@ -7910,7 +7911,7 @@ msgid "" "This is a single extruder multi-material printer, diameters of all extruders " "will be set to the new value. Do you want to proceed?" msgstr "" -"這是一台單噴頭多材料列印機,所有噴頭的直徑將被設置為新的值。你要繼續嗎?" +"這是一台單噴頭多材料列印機,所有噴頭的直徑將被設置為新的值。您要繼續嗎?" msgid "Layer height limits" msgstr "層高限制" @@ -7928,7 +7929,7 @@ msgid "" msgstr "" "當使用韌體回抽模式時,擦拭選項不可用。\n" "\n" -"是否需要禁用擦拭以啟用韌體回抽?" +"是否需要停用擦拭以啟用韌體回抽?" msgid "Firmware Retraction" msgstr "韌體回抽" @@ -7965,8 +7966,8 @@ msgid "" "If the preset corresponds to a filament currently in use on your printer, " "please reset the filament information for that slot." msgstr "" -"你確定要刪除所選預設嗎?\n" -"如果該預設對應的是列印設備當前使用的線材,請重置該槽位的線材資訊。" +"您確定要刪除所選預設嗎?\n" +"如果該預設對應的是列印設備目前使用的線材,請重置該槽位的線材資訊。" #, boost-format msgid "Are you sure to %1% the selected preset?" @@ -8070,7 +8071,7 @@ msgid "" "You can save or discard the preset values you have modified." msgstr "" "\n" -"你可以儲存或放棄已修改的預設值。" +"您可以儲存或放棄已修改的預設值。" msgid "" "\n" @@ -8078,10 +8079,10 @@ msgid "" "transfer the values you have modified to the new preset." msgstr "" "\n" -"你可以儲存或放棄已修改的預設值,或選擇將修改的數值轉移到新的預設值。" +"您可以儲存或放棄已修改的預設值,或選擇將修改的數值轉移到新的預設值。" msgid "You have previously modified your settings." -msgstr "你之前已經對設定進行了修改。" +msgstr "您之前已經對設定進行了修改。" msgid "" "\n" @@ -8089,7 +8090,7 @@ msgid "" "the modified values to the new project" msgstr "" "\n" -"你可以放棄已修改的預設值,或選擇將修改的數值轉移到新專案中" +"您可以放棄已修改的預設值,或選擇將修改的數值轉移到新專案中" msgid "Extruders count" msgstr "擠出機數量" @@ -8108,7 +8109,7 @@ msgstr "選擇要比較的預設" msgid "" "You can only transfer to current active profile because it has been modified." -msgstr "因為當前的設定檔已被修改,你只能轉移到目前啟用的設定檔。" +msgstr "因為目前的設定檔已被修改,您只能轉移到目前啟用的設定檔。" msgid "" "Transfer the selected options from left preset to the right.\n" @@ -8204,7 +8205,7 @@ msgid "The configuration is up to date." msgstr "目前設定檔已經是最新版本。" msgid "Obj file Import color" -msgstr "Obj 文件匯入顏色" +msgstr "Obj 檔案匯入顏色" msgid "Specify number of colors:" msgstr "指定顏色數量:" @@ -8217,7 +8218,7 @@ msgid "Recommended " msgstr "建議 " msgid "Current filament colors:" -msgstr "當前線材顏色:" +msgstr "目前線材顏色:" msgid "Quick set:" msgstr "快速設置:" @@ -8247,13 +8248,13 @@ msgid "" "Note:The color has been selected, you can choose OK \n" " to continue or manually adjust it." msgstr "" -"注意:顏色已選擇,你可以點擊確定繼續,\n" +"注意:顏色已選擇,您可以點擊確定繼續,\n" "或者手動進行調整。" msgid "" "Waring:The count of newly added and \n" " current extruders exceeds 16." -msgstr "警告:新增的擠出機量與當前擠出機總數超過 16。" +msgstr "警告:新增的擠出機量與目前擠出機總數超過 16。" msgid "Ramming customization" msgstr "自訂尖端成型" @@ -8304,7 +8305,7 @@ msgid "" "Orca would re-calculate your flushing volumes every time the filaments color " "changed. You could disable the auto-calculate in Orca Slicer > Preferences" msgstr "" -"Orca 會在每次線材顏色變更時重新計算沖洗量。你可以在 Orca Slicer 的『偏好設" +"Orca 會在每次線材顏色變更時重新計算沖洗量。您可以在 Orca Slicer 的『偏好設" "置』中關閉自動計算功能" msgid "Flushing volume (mm³) for each filament pair." @@ -8340,7 +8341,7 @@ msgid "" "Windows Media Player is required for this task! Do you want to enable " "'Windows Media Player' for your operation system?" msgstr "" -"執行此設置需要 Windows Media Player!你是否要啟用 Windows Media Player?" +"執行此設置需要 Windows Media Player!您是否要啟用 Windows Media Player?" msgid "" "BambuSource has not correctly been registered for media playing! Press Yes " @@ -8365,12 +8366,12 @@ msgid "" "play video. (Try installing the gstreamer1.0-plugins-bad or gstreamer1.0-" "libav packages, then restart Orca Slicer?)" msgstr "" -"你的系統缺少 GStreamer 的 H.264 編解碼器,這是播放影片所必需的。(請嘗試安裝 " +"您的系統缺少 GStreamer 的 H.264 編解碼器,這是播放影片所必需的。(請嘗試安裝 " "gstreamer1.0-plugins-bad 或 gstreamer1.0-libav 套件,然後重新啟動 Orca " "Slicer。)" msgid "Bambu Network plug-in not detected." -msgstr "未偵測到 Bambu 網路插件。" +msgstr "未偵測到 Bambu 網路外掛程式。" msgid "Click here to download it." msgstr "點擊下載。" @@ -8513,7 +8514,7 @@ msgid "keyboard 1-9: set filament for object/part" msgstr "按鍵 1~9:設定物件/零件的線材" msgid "Camera view - Default" -msgstr "攝影機視角 - 默認" +msgstr "攝影機視角 - 預設" msgid "Camera view - Top" msgstr "攝影機視角 - 頂部" @@ -8652,15 +8653,15 @@ msgid "version %s update information :" msgstr "版本 %s 更新資訊:" msgid "Network plug-in update" -msgstr "網路插件升級" +msgstr "網路外掛程式升級" msgid "" "Click OK to update the Network plug-in when Orca Slicer launches next time." -msgstr "按下『確定』後,下次啟動 Orca Slicer 時會更新網路插件。" +msgstr "按下『確定』後,下次啟動 Orca Slicer 時會更新網路外掛程式。" #, c-format, boost-format msgid "A new Network plug-in(%s) available, Do you want to install it?" -msgstr "新版的網路插件(%s)可用,是否要安裝?" +msgstr "新版的網路外掛程式(%s)可用,是否要安裝?" msgid "New version of Orca Slicer" msgstr "新版本的 Orca Slicer" @@ -8690,7 +8691,7 @@ msgid "Check Assistant" msgstr "檢查助手" msgid "Filament Extruded, Continue" -msgstr "線才擠出,繼續" +msgstr "線材擠出,繼續" msgid "Not Extruded Yet, Retry" msgstr "尚未擠出,重試" @@ -8733,7 +8734,7 @@ msgid "IP" msgstr "IP" msgid "Access Code" -msgstr "訪問碼" +msgstr "存取碼" msgid "Printer model" msgstr "列印設備型號" @@ -8742,7 +8743,7 @@ msgid "Printer name" msgstr "列印設備名稱" msgid "Where to find your printer's IP and Access Code?" -msgstr "在哪裡可以找到列印設備的 IP 和訪問碼?" +msgstr "在哪裡可以找到列印設備的 IP 和存取碼?" msgid "Connect" msgstr "連線" @@ -8757,7 +8758,7 @@ msgid "Failed to connect to printer." msgstr "無法連接到列印設備。" msgid "Failed to publish login request." -msgstr "登入請求發送失敗。" +msgstr "登入請求傳送失敗。" msgid "The printer has already been bound." msgstr "此印表機已綁定。" @@ -8815,7 +8816,7 @@ msgid "" "continue. Do you want to update now? You can also update later from 'Upgrade " "firmware'." msgstr "" -"檢測到重要更新,必須執行後才能繼續列印。你要現在更新嗎?或者稍後可在『升級韌" +"檢測到重要更新,必須執行後才能繼續列印。您要現在更新嗎?或者稍後可在『升級韌" "體』中完成更新。" msgid "" @@ -8823,7 +8824,7 @@ msgid "" "printing. Do you want to update now? You can also update later on printer or " "update next time starting Orca." msgstr "" -"韌體版本異常,必須修復並更新後才能列印。你要現在更新嗎?也可以稍後在列印設備" +"韌體版本異常,必須修復並更新後才能列印。您要現在更新嗎?也可以稍後在列印設備" "上更新,或在下次啟動 Orca 時進行更新。" msgid "Extension Board" @@ -8917,7 +8918,7 @@ msgstr "沒有可列印的物件。可能是因為尺寸過小" msgid "" "Your print is very close to the priming regions. Make sure there is no " "collision." -msgstr "你的列印區域非常接近準備區域,請確認不會發生碰撞。" +msgstr "您的列印區域非常接近準備區域,請確認不會發生碰撞。" msgid "" "Failed to generate gcode for invalid custom G-code.\n" @@ -9006,7 +9007,7 @@ msgid "invalid header or corrupted" msgstr "無效檔案頭或檔案已損壞" msgid "unsupported multidisk" -msgstr "不支援多磁碟儲存" +msgstr "不支援多硬碟儲存" msgid "decompression failed" msgstr "解壓縮失敗或存檔已損壞" @@ -9146,7 +9147,7 @@ msgstr "物件 %1% 本身雖符合構建體積限制,但其最後一層超出 msgid "" "You might want to reduce the size of your model or change current print " "settings and retry." -msgstr "你可能想要減小模型的尺寸或更改目前的列印設定並重試。" +msgstr "您可能想要減小模型的尺寸或更改目前的列印設定並重試。" msgid "Variable layer height is not supported with Organic supports." msgstr "有機樹支撐不支持可變層高。" @@ -9229,7 +9230,7 @@ msgid "" "support_interface_filament == 0), all nozzles have to be of the same " "diameter." msgstr "" -"使用不同噴嘴直徑的多個擠出機進行列印。如果支撐要使用當前的耗材列印" +"使用不同噴嘴直徑的多個擠出機進行列印。如果支撐要使用目前的耗材列印" "(support_filament == 0 或 support_interface_filament == 0),則所有噴嘴必須" "具有相同的直徑。" @@ -9294,9 +9295,9 @@ msgid "" "You can adjust the maximum jerk setting in your printer's configuration to " "get higher speeds." msgstr "" -"抖動設定已超過打印機的最大急動值(machine_max_jerk_x/machine_max_jerk_y)。\n" +"抖動設定已超過印表機的最大急動值(machine_max_jerk_x/machine_max_jerk_y)。\n" "Orca 將自動限制急動速度,以確保不超出列印設備的性能範圍。\n" -"如需更高速度,你可以在列印設備配置中調整最大急動值。" +"如需更高速度,您可以在列印設備配置中調整最大急動值。" msgid "" "The acceleration setting exceeds the printer's maximum acceleration " @@ -9308,7 +9309,7 @@ msgid "" msgstr "" "加速度設定已超過列印設備的最大加速度值 (machine_max_acceleration_travel)。\n" "Orca 將自動限制加速度,以確保不超出列印設備的性能範圍。\n" -"如需更高速度,你可以在列印設備配置中調整 machine_max_acceleration_extruding " +"如需更高速度,您可以在列印設備配置中調整 machine_max_acceleration_extruding " "值。" msgid "" @@ -9322,12 +9323,12 @@ msgstr "" "移動加速度設定已超過列印設備的最大移動加速度值" "(machine_max_acceleration_travel)。\n" "Orca 將自動限制移動加速度,以確保不超出列印設備的性能範圍。\n" -"如需更高速度,你可以在列印設備配置中調整 machine_max_acceleration_travel 值。" +"如需更高速度,您可以在列印設備配置中調整 machine_max_acceleration_travel 值。" msgid "" "Filament shrinkage will not be used because filament shrinkage for the used " "filaments differs significantly." -msgstr "線材收縮補償將被禁用,因為所使用的線材之間的收縮率差異過大。" +msgstr "線材收縮補償將被停用,因為所使用的線材之間的收縮率差異過大。" msgid "Generating skirt & brim" msgstr "正在產生 Skirt 和 Brim" @@ -9402,7 +9403,7 @@ msgid "Preferred orientation" msgstr "首選方向" msgid "Automatically orient stls on the Z-axis upon initial import" -msgstr "匯入STL時自動對齊Z軸" +msgstr "匯入 STL 時自動對齊 Z 軸" msgid "Printer preset names" msgstr "列印設備預設名稱" @@ -9425,7 +9426,7 @@ msgid "" msgstr "" "Orca Slicer 可以將 G-code 檔案上傳到列印設備。此欄位應包含列印設備的主機名、" "IP 位址或 URL。啟用基本身份驗證的列印設備可以透過將使用者名稱和密碼放入以下格" -"式的URL中來訪問:https://username:password@your-octopi-address/" +"式的URL中來存取:https://username:password@your-octopi-address/" msgid "Device UI" msgstr "設備使用者界面" @@ -9435,7 +9436,7 @@ msgid "" msgstr "如果列印設備的使用者界面 URL 不同,請輸入在此" msgid "API Key / Password" -msgstr "API Key / 密碼" +msgstr "API 金鑰 / 密碼" msgid "" "Orca Slicer can upload G-code files to a printer host. This field should " @@ -9465,14 +9466,14 @@ msgid "Password" msgstr "密碼" msgid "Ignore HTTPS certificate revocation checks" -msgstr "忽略 HTTPS憑證 吊銷檢查" +msgstr "忽略 HTTPS 憑證吊銷檢查" msgid "" "Ignore HTTPS certificate revocation checks in case of missing or offline " "distribution points. One may want to enable this option for self signed " "certificates if connection fails." msgstr "" -"在缺少或離線的情況下忽略 HTTPS憑證 吊銷檢查。如果連接失敗,可以啟用此選項來處" +"在缺少或離線的情況下忽略 HTTPS 憑證吊銷檢查。如果連接失敗,可以啟用此選項來處" "理自簽名憑證。" msgid "Names of presets related to the physical printer" @@ -9485,7 +9486,7 @@ msgid "API key" msgstr "API 金鑰" msgid "HTTP digest" -msgstr "HTTP摘要" +msgstr "HTTP 摘要" msgid "Avoid crossing wall" msgstr "避免跨越外牆" @@ -9660,22 +9661,22 @@ msgid "" "generator and use this option to control whether the cosmetic top and bottom " "surface gap fill is generated" msgstr "" -"為選定的實心表面啟用間隙填充。你可以使用下方的『過濾微小間隙』選項來控制填充" +"為選定的實心表面啟用間隙填充。您可以使用下方的『過濾微小間隙』選項來控制填充" "的最小間隙長度。\n" "\n" "選項:\n" -"1. 所有區域:將間隙填充應用於頂部、底部和內部實心表面,以提升結構強度。\n" +"1. 所有區域:將間隙填充套用於頂部、底部和內部實心表面,以提升結構強度。\n" "2. 僅頂部和底部:僅在頂部和底部表面進行間隙填充,平衡列印速度,減少實心填充中" "的過度擠出,同時確保頂部和底部表面無針孔間隙。\n" -"3. 不填充:禁用所有實心填充區域的間隙填充。\n" +"3. 不填充:停用所有實心填充區域的間隙填充。\n" "\n" "請注意,若使用『經典』的牆產生器,當外牆之間無法容納完整寬度的線條時,間隙填" -"充仍可能生成。這類外牆間隙填充不受此設置控制。\n" +"充仍可能產生。這類外牆間隙填充不受此設置控制。\n" "如果希望移除所有間隙填充,包括『經典』的牆產生器間隙填充,可將『過濾微小間" "隙』設置為較大的數字(如 999999)。\n" "然而,不建議這麼做,因為外牆間的間隙填充能增強模型強度。若模型因外牆間隙填充" "過多而受影響,更好的解決方案是切換到『Arachne』牆產生器,並利用此選項控制是否" -"生成頂部和底部表面的美觀間隙填充" +"產生頂部和底部表面的美觀間隙填充" msgid "Everywhere" msgstr "全部" @@ -9798,7 +9799,7 @@ msgstr "" "降低內部橋接的密度有助於減少頂部表面的鼓起問題,並提升內部橋接的穩定性,因為" "較大的間距讓空氣更容易流通,加速冷卻效果。\n" "\n" -"此選項特別適用於「內部橋接覆蓋填充」功能,可進一步優化內部橋接結構,在擠出實" +"此選項特別適用於「內部橋接覆蓋填充」功能,可進一步改善內部橋接結構,在擠出實" "心填充前提供更穩固的支撐。" msgid "Bridge flow ratio" @@ -9952,7 +9953,7 @@ msgid "" "Reverse Threshold to 0 so that all internal walls print in alternating " "directions on even layers irrespective of their overhang degree." msgstr "" -"僅在內圍輪廓應用反向邏輯。\n" +"僅在內圍輪廓套用反向邏輯。\n" "\n" "此設定可顯著減少零件應力,因為應力會以交替方向分佈。這有助於減少零件翹曲,同" "時保持外部牆面的品質。此功能對於易翹曲的材料(例如 ABS/ASA),以及彈性線材" @@ -9971,10 +9972,10 @@ msgid "" "2. Partially Bridged: Only a part of the unsupported area will be bridged.\n" "3. Sacrificial Layer: A full sacrificial bridge layer is created." msgstr "" -"此選項為沉孔創建橋接,允許其在無支撐的情況下列印。可用模式包括:\n" -"1. 無:不創建任何橋接。\n" +"此選項為沉孔建立橋接,允許其在無支撐的情況下列印。可用模式包括:\n" +"1. 無:不建立任何橋接。\n" "2. 部分橋接:僅對未支撐區域的一部分進行橋接。\n" -"3. 犧牲層:創建一層完整的犧牲橋接層。" +"3. 犧牲層:建立一層完整的犧牲橋接層。" msgid "Partially bridged" msgstr "部分橋接" @@ -10039,12 +10040,12 @@ msgstr "" "啟用此選項以在可能發生外牆翹起的區域減慢列印速度。例如,在列印懸空的尖銳角落" "(如 Benchy 船體前部)時,會額外減速,從而減少多層累積後的翹起。\n" "\n" -"一般建議啟用此選項,除非你的列印設備冷卻性能足夠強大,或者列印速度足夠慢,避" +"一般建議啟用此選項,除非您的列印設備冷卻性能足夠強大,或者列印速度足夠慢,避" "免發生外部周邊翹起。如果使用高外部周邊列印速度,此參數可能因列印速度差異過大" -"而導致輕微瑕疵。如果你注意到瑕疵,請確保壓力補償已正確調整。\n" +"而導致輕微瑕疵。如果您注意到瑕疵,請確保壓力補償已正確調整。\n" "\n" "注意:啟用此選項時,懸空外周邊會被視為懸空結構,即使該懸空外部周邊是橋接的一" -"部分,也會應用懸空速度。例如,當外牆 100% 懸空且下方無牆支撐時,將應用 100% " +"部分,也會套用懸空速度。例如,當外牆 100% 懸空且下方無牆支撐時,將套用 100% " "懸空速度。" msgid "mm/s or %" @@ -10063,7 +10064,7 @@ msgid "" msgstr "" "外部可見橋接擠出的列印速度\n" "\n" -"如果禁用了『翹邊處降速』或啟用了『經典懸空模式』,則對支撐率低於 13% 的懸空牆" +"如果停用了『翹邊處降速』或啟用了『經典懸空模式』,則對支撐率低於 13% 的懸空牆" "(無論是橋接的一部分還是懸空結構)將使用該列印速度。" msgid "Internal" @@ -10146,7 +10147,7 @@ msgid "" "compatible with the active printer profile." msgstr "" "使用啟用的列印設備設定值來進行布林運算的表達式。如果此表達式的結果為 true,則" -"該設定檔將被視為與當前啟用的印表機設定檔相容。" +"該設定檔將被視為與目前啟用的印表機設定檔相容。" msgid "Compatible process profiles" msgstr "相容的切片設定" @@ -10160,7 +10161,7 @@ msgid "" "compatible with the active print profile." msgstr "" "使用啟用的列印設定檔值來進行布林運算的表達式。如果此表達式的結果為 true,則該" -"設定檔將被視為與當前啟用的列印設定檔相容。" +"設定檔將被視為與目前啟用的列印設定檔相容。" msgid "Print sequence, layer by layer or object by object" msgstr "列印順序,逐層列印或者逐件列印" @@ -10306,7 +10307,7 @@ msgid "" "4. Apply to all - generates second bridge layers for both internal and " "external-facing bridges\n" msgstr "" -"此選項可在內部和/或外部橋接結構上額外生成一層橋接填充。\n" +"此選項可在內部和/或外部橋接結構上額外產生一層橋接填充。\n" "\n" "額外的橋接層能改善橋接區域的外觀與穩定性,提供更佳的實心填充支撐。這對於高速" "列印機特別有幫助,因為橋接與實心填充的列印速度可能有顯著差異。額外的橋接層還" @@ -10315,14 +10316,14 @@ msgstr "" "一般建議將此選項設定為「僅外部橋接」,除非特定的切片模型需要其他調整。\n" "選項說明:\n" "1. 停用 - 不啟用第二層橋接層(預設值,確保與其他設定相容)。\n" -"2.\t僅外部橋接 - 僅對外部橋接區域添加第二層橋接層。請注意,若橋接結構過短或寬" -"度小於設定的輪廓數量,則不會生成額外橋接層,因為這樣的結構不會受益於第二層橋" +"2.\t僅外部橋接 - 僅對外部橋接區域新增第二層橋接層。請注意,若橋接結構過短或寬" +"度小於設定的輪廓數量,則不會產生額外橋接層,因為這樣的結構不會受益於第二層橋" "接。如果啟用,第二層橋接層將與第一層平行擠出,以提升橋接的強度。\n" -"3. 僅內部橋接 - 僅為內部橋接區域(例如稀疏填充上的橋接部分)添加第二層橋接" +"3. 僅內部橋接 - 僅為內部橋接區域(例如稀疏填充上的橋接部分)新增第二層橋接" "層。請注意,內部橋接層會計入模型的頂部外殼層數。第二層內部橋接層的擠出方向會" "盡可能接近垂直於第一層,若同一區域內存在多個橋接角度,則該區域的最後一個部分" "將作為角度參考。\n" -"4. 應用於所有橋接區域 - 為內部與外部橋接區域都添加第二層橋接層。\n" +"4. 套用於所有橋接區域 - 為內部與外部橋接區域都新增第二層橋接層。\n" msgid "Disabled" msgstr "停用" @@ -10334,7 +10335,7 @@ msgid "Internal bridge only" msgstr "僅內部橋接" msgid "Apply to all" -msgstr "應用於所有橋接區域" +msgstr "套用於所有橋接區域" msgid "Filter out small internal bridges" msgstr "忽略過小的內部橋接" @@ -10377,12 +10378,12 @@ msgstr "" "充可能會翹曲,導致表面起皺。\n" "\n" "啟用「有限過濾」或「不過濾」模式,將允許在部分未完全支撐的內部實心填充區域上" -"列印內部橋接層。下列選項可調整過濾的敏感度,決定哪些區域需要生成內部橋接。\n" +"列印內部橋接層。下列選項可調整過濾的敏感度,決定哪些區域需要產生內部橋接。\n" "\n" "選項說明:\n" "1.\t過濾 - 預設選項,能有效過濾小型內部橋接,在大多數情況下效果良好。\n" "\n" -"2. 有限過濾 - 僅在高度傾斜的表面上建立內部橋接,同時避免生成過多無用的橋接結" +"2. 有限過濾 - 僅在高度傾斜的表面上建立內部橋接,同時避免產生過多無用的橋接結" "構,適合處理較複雜的模型。\n" "\n" "3.\t不過濾 - 在所有可能的內部懸垂區域上建立內部橋接,適用於高度傾斜的頂部表面" @@ -10438,13 +10439,13 @@ msgid "" "All: Add solid infill for all suitable sloping surfaces\n" "Default value is All." msgstr "" -"在傾斜面附近添加實心填充,以保證垂直外殼的厚度(頂部+底部實心層)\n" -"無:不在任何地方添加實心填充。注意:如果你的模型有傾斜表面,請謹慎使用此選" +"在傾斜面附近新增實心填充,以保證垂直外殼的厚度(頂部+底部實心層)\n" +"無:不在任何地方新增實心填充。注意:如果您的模型有傾斜表面,請謹慎使用此選" "項\n" -"僅關鍵部位:避免為牆體添加實心填充\n" -"適中:僅為大角度傾斜的表面添加實心填充\n" -"全部:為所有適合的傾斜表面添加實心填充\n" -"默認值為 全部。" +"僅關鍵部位:避免為牆體新增實心填充\n" +"適中:僅為大角度傾斜的表面新增實心填充\n" +"全部:為所有適合的傾斜表面新增實心填充\n" +"預設值為 全部。" msgid "Critical Only" msgstr "僅關鍵部分" @@ -10611,10 +10612,10 @@ msgid "" msgstr "" "從頂部俯視時,牆體迴圈的擠出方向。\n" "\n" -"默認情況下,所有牆體以逆時針方向擠出,除非啟用了『偶數層反向』。若將此選項設" +"預設情況下,所有牆體以逆時針方向擠出,除非啟用了『偶數層反向』。若將此選項設" "為非自動,則無論是否啟用『偶數層反向』,都將強制指定牆體方向。\n" "\n" -"如果啟用了螺旋花瓶模式,該選項將被禁用。" +"如果啟用了螺旋花瓶模式,該選項將被停用。" msgid "Counter clockwise" msgstr "逆時針" @@ -10665,7 +10666,7 @@ msgstr "" "此選項設置允許的熱網格區域的最小值。由於探測器的 XY 偏移,大多數列印設備無法" "探測整個熱床。為確保感測範圍不超出熱床區域,應適當設置熱床網格的最小值和最大" "值。OrcaSlicer 會確保 adaptive_bed_mesh_min/adaptive_bed_mesh_max 的值不超出" -"這些最小值/最大值。此訊息通常可從設備製造商處獲取。默認設置為 (-99999, " +"這些最小值/最大值。此訊息通常可從設備製造商處取得。預設設置為 (-99999, " "-99999),表示無限制,允許探測整個熱床。" msgid "Bed mesh max" @@ -10684,7 +10685,7 @@ msgstr "" "此選項設置允許的熱網格區域的最大值。由於探測器的 XY 偏移,大多數列印設備無法" "探測整個熱床。為確保感測範圍不超出熱床區域,應適當設置熱床網格的最小值和最大" "值。OrcaSlicer 會確保 adaptive_bed_mesh_min/adaptive_bed_mesh_max 的值不超出" -"這些最小值/最大值。此訊息通常可從設備製造商處獲取。默認設置為 (-99999, " +"這些最小值/最大值。此訊息通常可從設備製造商處取得。預設設置為 (-99999, " "-99999),表示無限制,允許探測整個熱床。" msgid "Probe point distance" @@ -10694,7 +10695,7 @@ msgid "" "This option sets the preferred distance between probe points (grid size) for " "the X and Y directions, with the default being 50mm for both X and Y." msgstr "" -"此選項用於設定 X 和 Y 方向探測點之間的首選距離(網格尺寸),默認值為 X 和 Y " +"此選項用於設定 X 和 Y 方向探測點之間的首選距離(網格尺寸),預設值為 X 和 Y " "方向各為 50mm。" msgid "Mesh margin" @@ -10749,7 +10750,7 @@ msgstr "啟用壓力補償" msgid "" "Enable pressure advance, auto calibration result will be overwritten once " "enabled." -msgstr "啟用壓力補償功能,啟用後將覆蓋自動校準結果。" +msgstr "啟用壓力補償功能,啟用後將覆蓋自動校正結果。" msgid "Pressure advance(Klipper) AKA Linear advance factor(Marlin)" msgstr "壓力補償(Klipper),也稱為線性前進係數(Marlin)" @@ -10784,10 +10785,10 @@ msgstr "" "起,同時避免在更快的特徵中出現間隙。\n" "\n" "此功能旨在通過建模的方式,讓擠出系統在不同體積流速和加速度下的反應狀態來解決" -"這一限制。內部會生成一個擬合模型,可根據給定的體積流速和加速度推算出所需的壓" -"力補償值,並根據當前的打印條件將該值發送到打印機。\n" +"這一限制。內部會產生一個擬合模型,可根據給定的體積流速和加速度推算出所需的壓" +"力補償值,並根據目前的列印條件將該值傳送到印表機。\n" "\n" -"啟用後,上述的壓力補償值將被覆蓋。然而,建議設置一個合理的默認值,以作為備用" +"啟用後,上述的壓力補償值將被覆蓋。然而,建議設置一個合理的預設值,以作為備用" "或擠出機更換時的回推值。\n" msgid "Adaptive pressure advance measurements (beta)" @@ -10823,23 +10824,23 @@ msgid "" "your filament profile\n" "\n" msgstr "" -"添加壓力補償 (PA) 值、體積流速和加速度的數據集,使用逗號分隔。每行一組數據。" +"新增壓力補償 (PA) 值、體積流速和加速度的資料集,使用逗號分隔。每行一組資料。" "例如:\n" "0.04,3.96,3000\n" "0.033,3.96,10000\n" "0.029,7.91,3000\n" "0.026,7.91,10000\n" "\n" -"校準方法:\n" +"校正方法:\n" "1. 為每個加速度值執行至少 3 個速度的壓力補償測試。建議至少測試外牆速度、內牆" "速度和設定檔中最快的特徵列印速度(通常是稀疏或實心填充)。然後對最慢和最快的" "列印加速度執行相同速度的測試,但不超過 Klipper 輸入整形器建議的最大加速度。\n" -"2. 記錄每個體積流速和加速度的最佳壓力補償 (PA) 值。你可以通過從顏色方案下拉選" +"2. 記錄每個體積流速和加速度的最佳壓力補償 (PA) 值。您可以通過從顏色方案下拉選" "單中選擇流量,並將水平滑桿移動到 PA 測試線的圖案來找到流量數值。該數值應顯示" -"在頁面底部。理想的 PA 值應隨著體積流速的增加而減小。如果不是,請檢查你的擠出" +"在頁面底部。理想的 PA 值應隨著體積流速的增加而減小。如果不是,請檢查您的擠出" "機是否正常工作。當列印速度較慢且加速度較低時,可接受的 PA 值範圍會更大。如果" "看不出差異,請採用最快測試的 PA 值。\n" -"3. 將 PA 值、流量和加速度的三組數據輸入到此文字框中,然後保存你的線材設定檔\n" +"3. 將 PA 值、流量和加速度的三組資料輸入到此文字框中,然後保存您的線材設定檔\n" msgid "Enable adaptive pressure advance for overhangs (beta)" msgstr "啟用懸挑自適應壓力提前 (beta)" @@ -10864,7 +10865,7 @@ msgid "" "pressure drop in the nozzle when printing in the air and a lower PA helps " "counteract this." msgstr "" -"橋接的壓力補償值。設為 0 以禁用此功能。降低橋接時的壓力補償值有助於減少橋接結" +"橋接的壓力補償值。設為 0 以停用此功能。降低橋接時的壓力補償值有助於減少橋接結" "束後立即出現的輕微欠擠出現象。這種現象是由於在空中列印時噴嘴內壓力下降引起" "的,而降低壓力補償值有助於抵消這一影響。" @@ -10872,7 +10873,7 @@ msgid "" "Default line width if other line widths are set to 0. If expressed as a %, " "it will be computed over the nozzle diameter." msgstr "" -"當線寬設定為 0 時走線的默認線寬。如果以 % 表示,將以噴嘴直徑為基準來計算。" +"當線寬設定為 0 時走線的預設線寬。如果以 % 表示,將以噴嘴直徑為基準來計算。" msgid "Keep fan always on" msgstr "保持風扇永遠開啟" @@ -10933,7 +10934,7 @@ msgid "Filament notes" msgstr "線材備註" msgid "You can put your notes regarding the filament here." -msgstr "你可以將有關線材的備註存放在這裡。" +msgstr "您可以將有關線材的備註存放在這裡。" msgid "Required nozzle HRC" msgstr "噴嘴硬度要求" @@ -11004,7 +11005,7 @@ msgid "" "\n" "filament_diameter = sqrt( (4 * pellet_flow_coefficient) / PI )" msgstr "" -"顆粒流量係數是基於實驗數據得出的,用於計算顆粒列印機的材料體積。\n" +"顆粒流量係數是基於實驗資料得出的,用於計算顆粒列印機的材料體積。\n" "在內部系統中,該係數會被轉換為耗材直徑,而其它體積計算方式則維持不變。\n" "filament_diameter = sqrt( (4 * pellet_flow_coefficient) / PI )" @@ -11243,7 +11244,7 @@ msgid "" "Density of internal sparse infill, 100% turns all sparse infill into solid " "infill and internal solid infill pattern will be used" msgstr "" -"設定內部稀疏填充的密度,當密度為 100% 時,所有稀疏填充將變為實心填充,並應用" +"設定內部稀疏填充的密度,當密度為 100% 時,所有稀疏填充將變為實心填充,並套用" "內部實心填充的圖案" msgid "Sparse infill pattern" @@ -11326,7 +11327,7 @@ msgstr "" "是基於填充擠出寬度進行計算。Orca Slicer 會嘗試將兩條靠近的填充線連接到一段較" "短的牆。如果沒有找到比 infill_anchor_max 更短的牆,則填充線會只連接到一側的" "牆,且該段的長度受此參數限制,但不會超過 anchor_length_max。 \n" -"將此參數設為 0 可禁用單條填充線與牆的錨接功能。" +"將此參數設為 0 可停用單條填充線與牆的錨接功能。" msgid "0 (no open anchors)" msgstr "0(無錨線)" @@ -11353,7 +11354,7 @@ msgstr "" "是基於填充擠出寬度進行計算。Orca Slicer 會嘗試將兩條靠近的填充線連接到一段較" "短的牆。如果沒有找到短於此參數的牆,則填充線會只連接到單側牆,且該牆的長度受 " "infill_anchor 限制,但不會超過此參數的設定值。若此參數設定為 0,將啟用舊版填" -"充連接算法,並生成與設置為 1000 和 0 相同的結果。" +"充連接算法,並產生與設置為 1000 和 0 相同的結果。" msgid "0 (Simple connect)" msgstr "0(簡單連接)" @@ -11385,8 +11386,8 @@ msgid "mm/s² or %" msgstr "mm/s² 或 %" msgid "" -"Acceleration of sparse infill. If the value is expressed as a percentage " -"(e.g. 100%), it will be calculated based on the default acceleration." +"Acceleration of sparse infill. If the value is expressed as a percentage (e." +"g. 100%), it will be calculated based on the default acceleration." msgstr "" "稀疏填充的加速度。如果該值表示為百分比(例如 100%),則將根據預設加速度進行計" "算。" @@ -11510,7 +11511,7 @@ msgid "" msgstr "" "此冷卻風扇速度適用於列印支撐介面時。將此值設為高於正常速度,可減少支撐結構與" "受支撐零件之間的黏結強度,使拆除支撐更容易。\n" -"若設為 -1,則禁用此功能。\n" +"若設為 -1,則停用此功能。\n" "此設定會被 disable_fan_first_layers 覆寫。" msgid "Internal bridges fan speed" @@ -11670,7 +11671,7 @@ msgid "" "quality as line segments are converted to arcs by the slicer and then back " "to line segments by the firmware." msgstr "" -"啟用此選項可生成包含 G2 和 G3 弧形運動的 G-code 文件,其擬合公差與解析度一" +"啟用此選項可產生包含 G2 和 G3 弧形運動的 G-code 檔案,其擬合公差與解析度一" "致。 \n" "\n" "注意:對於 Klipper 控制的機器,建議關閉此功能。Klipper 無法有效利用弧形指令," @@ -11681,7 +11682,7 @@ msgid "Add line number" msgstr "標註行號" msgid "Enable this to add line number(Nx) at the beginning of each G-Code line" -msgstr "啟用此選項可在每行 G-Code 的開頭添加行號(Nx)" +msgstr "啟用此選項可在每行 G-Code 的開頭新增行號(Nx)" msgid "Scan first layer" msgstr "首層檢查" @@ -11834,13 +11835,13 @@ msgid "Pellet Modded Printer" msgstr "顆粒改裝列印機" msgid "Enable this option if your printer uses pellets instead of filaments" -msgstr "若你的列印機使用塑料顆粒而非傳統線材,請啟用此選項" +msgstr "若您的列印機使用塑料顆粒而非傳統線材,請啟用此選項" msgid "Support multi bed types" msgstr "支援多種熱床類型" msgid "Enable this option if you want to use multiple bed types" -msgstr "若你需要切換使用不同的列印床類型,請啟用此選項" +msgstr "若您需要切換使用不同的列印床類型,請啟用此選項" msgid "Label objects" msgstr "標註物件" @@ -11869,7 +11870,7 @@ msgid "" "descriptive text. If you print from SD card, the additional weight of the " "file could make your firmware slow down." msgstr "" -"啟用此選項可取得帶註釋的 G-code,其中每一行均由描述性文字進行解釋。如果你從 " +"啟用此選項可取得帶註釋的 G-code,其中每一行均由描述性文字進行解釋。如果您從 " "SD 卡列印,檔案的額外容量可能會導致韌體速度變慢。" msgid "Infill combination" @@ -11898,7 +11899,7 @@ msgid "" msgstr "" "設定稀疏填充合併列印最大層高。\n" "\n" -"你可以將其設為 0 或 100% 來使用噴嘴直徑(以最大程度縮短列印時間),或者設定為" +"您可以將其設為 0 或 100% 來使用噴嘴直徑(以最大程度縮短列印時間),或者設定為" "大約 80% 來增強稀疏填充的強度。結合的層數會根據此值與層高的比值計算,並向下取" "整到最接近的位數。\n" "\n" @@ -11966,7 +11967,7 @@ msgid "Maximum width of a segmented region" msgstr "分隔區域的最大寬度" msgid "Maximum width of a segmented region. Zero disables this feature." -msgstr "分隔區域的最大寬度。零表示禁用此功能。" +msgstr "分隔區域的最大寬度。零表示停用此功能。" msgid "Interlocking depth of a segmented region" msgstr "分隔區域的互鎖深度" @@ -11990,7 +11991,7 @@ msgid "" "filaments touch. This improves the adhesion between filaments, especially " "models printed in different materials." msgstr "" -"在不同材料的耗材接觸點生成梁式互鎖結構,增強耗材之間的附著力,特別適用於不同" +"在不同材料的耗材接觸點產生梁式互鎖結構,增強耗材之間的附著力,特別適用於不同" "材料列印的模型。\n" "譯者補充:此設定通常用於提升結構穩定性,透過梁式設計讓不同部分更緊密地連接在" "一起,常見於模組化或多材料列印中。" @@ -12032,7 +12033,7 @@ msgid "" "The distance from the outside of a model where interlocking structures will " "not be generated, measured in cells." msgstr "" -"設定模型外部距離範圍內不生成互鎖結構,此距離以單元數做計算\n" +"設定模型外部距離範圍內不產生互鎖結構,此距離以單元數做計算\n" "譯者補充:此設定用於確保互鎖結構不干擾模型的外部區域,特別適用於需要精細外觀" "或保護特定結構的列印需求。" @@ -12121,7 +12122,7 @@ msgid "" "If enabled, the machine limits will be emitted to G-code file.\n" "This option will be ignored if the g-code flavor is set to Klipper." msgstr "" -"啟用後,設備的限制參數將被寫入 G-code 文件中。若 G-code 格式為 Klipper,該選" +"啟用後,設備的限制參數將被寫入 G-code 檔案中。若 G-code 格式為 Klipper,該選" "項將無效。" msgid "" @@ -12336,7 +12337,7 @@ msgid "" "visible overhangs without impacting the print speed of features that will " "not be visible to the user." msgstr "" -"僅在外部輪廓與懸垂部分應用擠出速率平滑處理。這可減少外部可見區域因速度變化過" +"僅在外部輪廓與懸垂部分套用擠出速率平滑處理。這可減少外部可見區域因速度變化過" "快而產生的瑕疵,而不影響內部結構的列印速度。" msgid "Minimum speed for part cooling fan" @@ -12369,7 +12370,7 @@ msgid "" "minimum layer time defined above when the slowdown for better layer cooling " "is enabled." msgstr "" -"當啟用了為改善層冷卻而減速的功能時,這個參數設定列印設備能減速到的最低打印速" +"當啟用了為改善層冷卻而減速的功能時,這個參數設定列印設備能減速到的最低列印速" "度,以確保達到上面設定的最短層時間。" msgid "Diameter of nozzle" @@ -12381,7 +12382,7 @@ msgstr "設定備註" msgid "" "You can put here your personal notes. This text will be added to the G-code " "header comments." -msgstr "你可以在這裡放置你的個人備註。 該文字將會加入 G 代碼標題註釋中。" +msgstr "您可以在這裡放置您的個人備註。 該文字將會加入 G 代碼標題註釋中。" msgid "Host Type" msgstr "主機類型" @@ -12507,7 +12508,7 @@ msgid "" "Detect the overhang percentage relative to line width and use different " "speed to print. For 100%% overhang, bridge speed is used." msgstr "" -"偵測懸空相對於線寬的百分比,並應用不同的速度列印。100%% 的懸空將使用橋接速" +"偵測懸空相對於線寬的百分比,並套用不同的速度列印。100%% 的懸空將使用橋接速" "度。" msgid "Filament to print walls" @@ -12537,10 +12538,10 @@ msgid "" "Using lightning infill together with this option is not recommended as there " "is limited infill to anchor the extra perimeters to." msgstr "" -"此設定在每隔一層添加一個額外的牆壁。這樣填充會垂直嵌入牆壁之間,從而增強列印" +"此設定在每隔一層新增一個額外的牆壁。這樣填充會垂直嵌入牆壁之間,從而增強列印" "的強度。\n" "\n" -"啟用此選項時,需要禁用『確保垂直外殼厚度』選項。\n" +"啟用此選項時,需要停用『確保垂直外殼厚度』選項。\n" "\n" "不建議將此選項與『閃電填充』一起使用,因為填充有限,無法為額外的外牆提供穩固" "的支撐。" @@ -12552,7 +12553,7 @@ msgid "" "argument, and they can access the Orca Slicer config settings by reading " "environment variables." msgstr "" -"如果你想透過自訂腳本處理輸出的 G-code,只需在此處列出它們的絕對路徑即可。用分" +"如果您想透過自訂腳本處理輸出的 G-code,只需在此處列出它們的絕對路徑即可。用分" "號分隔多個腳本。腳本將傳遞 G-code 檔案的絕對路徑作為第一個參數,並且它們可以" "透過讀取環境變數來讀取 Orca Slicer 設定。" @@ -12640,7 +12641,7 @@ msgid "" "Force a retraction on top layer. Disabling could prevent clog on very slow " "patterns with small movements, like Hilbert curve" msgstr "" -"在頂層強制執行回抽操作。禁用此功能可能有助於避免在非常緩慢且移動距離較小的模" +"在頂層強制執行回抽操作。停用此功能可能有助於避免在非常緩慢且移動距離較小的模" "式(例如希爾伯特曲線)中出現堵塞" msgid "Retraction Length" @@ -12797,14 +12798,14 @@ msgstr "" "Marlin 韌體。" msgid "Show auto-calibration marks" -msgstr "顯示雷達校準線" +msgstr "顯示雷達校正線" msgid "Disable set remaining print time" msgstr "停用剩餘列印時間設定" msgid "" "Disable generating of the M73: Set remaining print time in the final gcode" -msgstr "停用在最終 G-code 中生成 M73 指令以設定剩餘列印時間" +msgstr "停用在最終 G-code 中產生 M73 指令以設定剩餘列印時間" msgid "Seam position" msgstr "接縫位置" @@ -12842,7 +12843,7 @@ msgid "" "current extruder diameter. The default value for this parameter is 10%." msgstr "" "為了降低閉環擠出中接縫的可見度,閉環會中斷並縮短指定的長度。\n" -"此長度可設定為毫米或擠出機直徑的百分比,默認值為 10%。" +"此長度可設定為毫米或擠出機直徑的百分比,預設值為 10%。" msgid "Scarf joint seam (beta)" msgstr "斜拼接縫(Beta)" @@ -12869,7 +12870,7 @@ msgid "" "The default value is 155°." msgstr "" "此選項設定斜拼接縫的角度閾值條件。當外牆迴圈內的最大角度超過該設定值(表示不" -"存在尖角)時,將應用斜接縫接縫。預設值為 155°。" +"存在尖角)時,將套用斜接縫接縫。預設值為 155°。" msgid "Conditional overhang threshold" msgstr "懸空閾值條件" @@ -12882,7 +12883,7 @@ msgid "" "at 40% of the external wall's width. Due to performance considerations, the " "degree of overhang is estimated." msgstr "" -"此選項用於設定斜拼接縫的懸空閾值。當外牆未支撐的部分小於該閾值時,將應用斜拼" +"此選項用於設定斜拼接縫的懸空閾值。當外牆未支撐的部分小於該閾值時,將套用斜拼" "接縫。預設閾值為外層牆寬度的 40%。為了考慮性能,此懸空程度為估算值。" msgid "Scarf joint speed" @@ -12917,7 +12918,7 @@ msgid "" "This amount can be specified in millimeters or as a percentage of the " "current layer height. The default value for this parameter is 0." msgstr "" -"設定斜拼接縫的起始高度。該值可用毫米或當前層高度的百分比表示,默認值為 0。" +"設定斜拼接縫的起始高度。該值可用毫米或目前層高度的百分比表示,預設值為 0。" msgid "Scarf around entire wall" msgstr "環繞整個牆體的斜拼接縫" @@ -12931,7 +12932,7 @@ msgstr "斜拼接縫長度" msgid "" "Length of the scarf. Setting this parameter to zero effectively disables the " "scarf." -msgstr "斜拼接縫的長度。若將此參數設為 0,將禁用斜接功能。" +msgstr "斜拼接縫的長度。若將此參數設為 0,將停用斜接功能。" msgid "Scarf steps" msgstr "斜拼接縫段數" @@ -12953,7 +12954,7 @@ msgid "" "if a wipe action is executed immediately following an outer wall extrusion, " "the speed of the outer wall extrusion will be utilized for the wipe action." msgstr "" -"拭的速度由當前擠出任務的速度決定。例如,若擦拭操作緊接著外牆的擠出執行,則將" +"拭的速度由目前擠出任務的速度決定。例如,若擦拭操作緊接著外牆的擠出執行,則將" "使用外牆擠出的速度進行擦拭。" msgid "Wipe on loops" @@ -13042,8 +13043,8 @@ msgid "" "distance from the object. Therefore, if brims are active it may intersect " "with them. To avoid this, increase the skirt distance value.\n" msgstr "" -"防風罩可有效保護 ABS 或 ASA 列印物免受氣流影響,避免翹曲或脫離打印床。通常僅" -"在開放式框架的打印機(即無外殼)中需要使用。\n" +"防風罩可有效保護 ABS 或 ASA 列印物免受氣流影響,避免翹曲或脫離列印床。通常僅" +"在開放式框架的印表機(即無外殼)中需要使用。\n" "\n" "啟用後,Skirt 的高度將與列印物的最高點相同。若未啟用,則使用『Skirt 高度』的" "設定值。\n" @@ -13131,7 +13132,7 @@ msgid "" "generated model has no seam" msgstr "" "平滑螺旋功能可平滑外輪廓的 Z 軸運動,並將實心模型轉換為具有實心底層的單壁列" -"印。生成的最終模型不會有接縫" +"印。產生的最終模型不會有接縫" msgid "Smooth Spiral" msgstr "平滑螺旋" @@ -13190,7 +13191,7 @@ msgid "" "process of taking a snapshot, prime tower is required for smooth mode to " "wipe nozzle." msgstr "" -"選擇平滑模式或傳統模式時,列印過程將生成縮時影片。每打印一層,相機會拍攝一張" +"選擇平滑模式或傳統模式時,列印過程將產生縮時影片。每列印一層,相機會拍攝一張" "照片。列印完成後,這些照片會被合成為縮時影片。如果選擇了平滑模式,擠出機會在" "每層列印完成後移動到廢料槽拍攝一張照片。由於在拍攝過程中熔融的線材可能會從噴" "嘴洩漏,平滑模式需要使用換料塔來清潔噴嘴。" @@ -13219,7 +13220,7 @@ msgid "" "seconds to preheat the next tool. Orca will insert a M104 command to preheat " "the tool in advance." msgstr "" -"為了縮短工具更換後的等待時間,Orca 可在當前工具使用期間提前預熱下一個工具。此" +"為了縮短工具更換後的等待時間,Orca 可在目前工具使用期間提前預熱下一個工具。此" "設定用於指定預熱下一個工具的時間(單位:秒)。Orca 將自動插入 M104 指令以提前" "進行工具預熱。" @@ -13258,7 +13259,7 @@ msgid "" "printing, where we use M600/PAUSE to trigger the manual filament change " "action." msgstr "" -"啟用此選項後,自定義的換線 G-code 將僅在打印開始時被省略,整個打印過程中會跳" +"啟用此選項後,自定義的換線 G-code 將僅在列印開始時被省略,整個列印過程中會跳" "過工具更換指令(例如:T0)。此功能適用於手動多材料列印,允許使用 M600/PAUSE " "指令來觸發手動換線操作。" @@ -13281,7 +13282,7 @@ msgid "" "with the print." msgstr "" "啟用此選項後,換料塔將不會在沒有工具更換的層中列印。在有工具更換的層中,擠出" -"機將向下移動以列印換料塔。請用戶自行確保清洗塔與列印物之間不會發生碰撞。" +"機將向下移動以列印換料塔。請使用者自行確保清洗塔與列印物之間不會發生碰撞。" msgid "Prime all printing extruders" msgstr "所有擠出機畫線" @@ -13331,7 +13332,7 @@ msgid "" "print bed, set this to -0.3 (or fix your endstop)." msgstr "" "此值將被加至(或減去)輸出 G-code 中的所有 Z 坐標,用於補償不準確的 Z 軸限位" -"開關位置。例如,如果限位開關的歸零導致噴嘴實際距離打印床 0.3 毫米,可將此值設" +"開關位置。例如,如果限位開關的歸零導致噴嘴實際距離列印床 0.3 毫米,可將此值設" "為 -0.3(或者調整限位開關位置)。" msgid "Enable support" @@ -13346,7 +13347,7 @@ msgid "" "generated" msgstr "" "選擇「普通 (自動)」或「樹狀 (自動)」時,系統將自動產生支撐結構。若選擇「普通 " -"(手動)」或「樹狀 (手動)」,則僅會生成手動設定的支撐區域" +"(手動)」或「樹狀 (手動)」,則僅會產生手動設定的支撐區域" msgid "Normal (auto)" msgstr "普通 (自動)" @@ -13390,7 +13391,7 @@ msgstr "僅支撐關鍵區域" msgid "" "Only create support for critical regions including sharp tail, cantilever, " "etc." -msgstr "僅針對關鍵區域(如尖銳尾部、懸臂等)生成支撐結構。" +msgstr "僅針對關鍵區域(如尖銳尾部、懸臂等)產生支撐結構。" msgid "Remove small overhangs" msgstr "移除小懸空" @@ -13402,7 +13403,7 @@ msgid "Top Z distance" msgstr "頂部 Z 間距" msgid "The z gap between the top support interface and object" -msgstr "支撐頂部和模型之間的z間隙" +msgstr "支撐頂部和模型之間的 Z 間隙" msgid "Bottom Z distance" msgstr "底部 Z 間距" @@ -13417,7 +13418,7 @@ msgid "" "Filament to print support base and raft. \"Default\" means no specific " "filament for support and current filament is used" msgstr "" -"用於列印支撐基座和筏層的線材。選擇『預設』時,將使用當前列印的線材,而非特定" +"用於列印支撐基座和筏層的線材。選擇『預設』時,將使用目前列印的線材,而非特定" "線材" msgid "Avoid interface filament for base" @@ -13446,7 +13447,7 @@ msgid "" "Filament to print support interface. \"Default\" means no specific filament " "for support interface and current filament is used" msgstr "" -"用於列印支撐介面的線材。選擇『預設』時,將使用當前列印的線材,而非指定的特定" +"用於列印支撐介面的線材。選擇『預設』時,將使用目前列印的線材,而非指定的特定" "線材" msgid "Top interface layers" @@ -13529,9 +13530,9 @@ msgid "" "style will create similar structure to normal support under large flat " "overhangs." msgstr "" -"支撐的樣式與形狀設定。普通支撐使用網格(默認設定)可提供更穩定的支撐,而緊貼" +"支撐的樣式與形狀設定。普通支撐使用網格(預設設定)可提供更穩定的支撐,而緊貼" "型支撐可節省材料並減少對物件表面的損傷。樹狀支撐中,『有機樹』會更積極地融合" -"分支,節省大量材料(默認為有機樹);而『混合樹』則會在較大的平坦懸空區域下生" +"分支,節省大量材料(預設為有機樹);而『混合樹』則會在較大的平坦懸空區域下生" "成類似於普通支撐的結構。" msgid "Default (Grid/Organic)" @@ -13579,7 +13580,7 @@ msgid "" "overlap is below the threshold. The smaller this value is, the steeper the " "overhang that can be printed without support." msgstr "" -"當閾值角度設為 0 時,系統將為重疊比例低於該閾值的懸垂部分生成支撐。數值越小," +"當閾值角度設為 0 時,系統將為重疊比例低於該閾值的懸垂部分產生支撐。數值越小," "代表可以在不使用支撐的情況下列印更陡峭的懸垂結構。" msgid "Tree support branch angle" @@ -13708,9 +13709,9 @@ msgid "" "heater is installed." msgstr "" "啟用此選項後,將自動控制機箱溫度。此功能會在執行『machine_start_gcode』之前發" -"送 M191 指令,用於設定機箱溫度並等待達到設定值。此外,在列印結束時會發送 " +"送 M191 指令,用於設定機箱溫度並等待達到設定值。此外,在列印結束時會傳送 " "M141 指令以關閉機箱加熱器(若設備有加熱器)。此功能需要韌體原生支援或通過宏指" -"令支援 M191 和 M141 指令,通常用於配備主動機箱加熱器的打印機。" +"令支援 M191 和 M141 指令,通常用於配備主動機箱加熱器的印表機。" msgid "Chamber temperature" msgstr "機箱溫度" @@ -13736,7 +13737,7 @@ msgid "" msgstr "" "對於 ABS、ASA、PC 和 PA 等高溫材料,較高的機箱溫度能有效抑制或減少翹曲,並可" "能提升層間結合強度。然而,較高的機箱溫度也會降低 ABS 和 ASA 的空氣過濾效率。" -"對於 PLA、PETG、TPU、PVA 和其他低溫材料,建議將此選項禁用(設為 0),因機箱溫" +"對於 PLA、PETG、TPU、PVA 和其他低溫材料,建議將此選項停用(設為 0),因機箱溫" "度應保持較低,以避免因材料在熱端軟化而導致擠出機堵塞。啟用此選項後,會設置一" "個名為 chamber_temperature 的 G-code 變數,可用於將所需的機箱溫度傳遞給列印開" "始宏,或像以下的熱浸泡宏(預熱):PRINT_START (其他變數) " @@ -13798,7 +13799,7 @@ msgid "" "layers" msgstr "" "當切片時,如果通過頂部殼層計算的厚度小於設定值,將自動增加頂部實心層的數量," -"以避免層高較小時頂部殼層過薄。若設為 0,則禁用此功能,頂部殼層厚度完全由設定" +"以避免層高較小時頂部殼層過薄。若設為 0,則停用此功能,頂部殼層厚度完全由設定" "的頂部殼層數決定" msgid "Speed of travel which is faster and without extrusion" @@ -13910,7 +13911,7 @@ msgstr "" "\n" "提高此速度可能會影響塔的穩定性,並增加噴嘴與換料塔上斑點的碰撞力。\n" "\n" -"在將此參數提高於預設值 90mm/sec 以上之前,請確保你的印表設備能夠可靠地在更高" +"在將此參數提高於預設值 90mm/sec 以上之前,請確保您的印表設備能夠可靠地在更高" "的速度下橋接,並且工具更換時的溢出能良好的被控制。\n" "\n" "對於換料塔外部周邊,無論此設定如何,都使用內部周邊速度。" @@ -13930,7 +13931,7 @@ msgid "" "wipe tower. These values are used to simplify creation of the full purging " "volumes below." msgstr "" -"此數據記錄了換料塔每次切換所需的體積,並用於簡化後續完整沖洗體積的計算。" +"此資料記錄了換料塔每次切換所需的體積,並用於簡化後續完整沖洗體積的計算。" msgid "" "Purging after filament change will be done inside objects' infills. This may " @@ -13985,12 +13986,12 @@ msgid "Idle temperature" msgstr "閒置溫度" msgid "" -"Nozzle temperature when the tool is currently not used in multi-tool " -"setups.This is only used when 'Ooze prevention' is active in Print Settings. " -"Set to 0 to disable." +"Nozzle temperature when the tool is currently not used in multi-tool setups." +"This is only used when 'Ooze prevention' is active in Print Settings. Set to " +"0 to disable." msgstr "" "當工具頭在多工具頭設置中未使用時的噴嘴溫度。僅在『列印設定』中啟用『防止漏" -"料』時有效。設置 0 為禁用。" +"料』時有效。設置 0 為停用。" msgid "X-Y hole compensation" msgstr "X-Y 孔洞尺寸補償" @@ -14057,7 +14058,7 @@ msgid "" "Picture sizes to be stored into a .gcode and .sl1 / .sl1s files, in the " "following format: \"XxY, XxY, ...\"" msgstr "" -"設定將存儲於 .gcode 和 .sl1 / .sl1s 文件中,其圖片尺寸,格式為:「XxY, " +"設定將存儲於 .gcode 和 .sl1 / .sl1s 檔案中,其圖片尺寸,格式為:「XxY, " "XxY, ...」" msgid "Format of G-code thumbnails" @@ -14130,7 +14131,7 @@ msgid "" "this setting reduces the number and length of these center walls, but may " "leave gaps or overextrude" msgstr "" -"何時在偶數和奇數牆層數之間創建過渡段。角度大於這個臨界值的楔形將不創建過渡" +"何時在偶數和奇數牆層數之間建立過渡段。角度大於這個臨界值的楔形將不建立過渡" "段,並且不會在楔形中心列印牆走線以填補剩餘空間。減小這個數值能減少中心牆走線" "的數量和長度,但可能會導致間隙或者過擠出" @@ -14182,7 +14183,7 @@ msgid "" "recommended to be set to the same size as the nozzle. This adjustment is " "expected to enhance adhesion." msgstr "" -"應用於首層的牆最小線寬,建議設定與噴嘴尺寸相同。這種調整有助於增強附著力。" +"套用於首層的牆最小線寬,建議設定與噴嘴尺寸相同。這種調整有助於增強附著力。" msgid "Minimum wall width" msgstr "牆最小線寬" @@ -14270,7 +14271,7 @@ msgstr "相容設備檢測" msgid "" "check whether current machine downward compatible with the machines in the " "list" -msgstr "檢查當前機器是否與列表中的機器向下相容" +msgstr "檢查目前機器是否與列表中的機器向下相容" msgid "Load default filaments" msgstr "載入預設列印耗材" @@ -14321,10 +14322,10 @@ msgid "Export settings to a file." msgstr "將設定匯出至指定資料夾。" msgid "Send progress to pipe" -msgstr "將進度發送到 Pipe" +msgstr "將進度傳送到 Pipe" msgid "Send progress to pipe." -msgstr "將進度發送到 Pipe。" +msgstr "將進度傳送到 Pipe。" msgid "Arrange Options" msgstr "佈局選項" @@ -14343,7 +14344,7 @@ msgstr "確認在列印板上" msgid "" "Lift the object above the bed when it is partially below. Disabled by default" -msgstr "當物件部分位於列印板的下方時,將其提升到列印板的上方。預設情況下禁用" +msgstr "當物件部分位於列印板的下方時,將其提升到列印板的上方。預設情況下停用" msgid "" "Arrange the supplied models in a plate and merge them in a single model in " @@ -14417,7 +14418,7 @@ msgstr "當使用最新版本時,從指定檔案載入最新的列印耗材設 msgid "" "if enabled, check whether current machine downward compatible with the " "machines in the list" -msgstr "若啟用,則檢查當前機器是否與列表中的機器向下相容" +msgstr "若啟用,則檢查目前機器是否與列表中的機器向下相容" msgid "downward machines settings" msgstr "相容機器設定" @@ -14452,8 +14453,8 @@ msgid "Debug level" msgstr "除錯模式等級" msgid "" -"Sets debug logging level. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, " -"5:trace\n" +"Sets debug logging level. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" +"trace\n" msgstr "" "設定除錯日誌級別。0:致命錯誤,1:錯誤,2:警告,3:資訊,4:除錯,5:追蹤\n" @@ -14488,12 +14489,12 @@ msgid "If enabled, the arrange will allow rotations when place object" msgstr "若啟用,物件排列時將允許旋轉調整" msgid "Avoid extrusion calibrate region when doing arrange" -msgstr "在排列物件時避開擠出校準區域" +msgstr "在排列物件時避開擠出校正區域" msgid "" "If enabled, the arrange will avoid extrusion calibrate region when place " "object" -msgstr "若啟用,物件排列時將避開擠出校準區域" +msgstr "若啟用,物件排列時將避開擠出校正區域" msgid "Skip modified gcodes in 3mf" msgstr "忽略 3MF 檔案內已修改的 G-code" @@ -14505,13 +14506,13 @@ msgid "MakerLab name" msgstr "MakerLab 名稱" msgid "MakerLab name to generate this 3mf" -msgstr "生成此 3MF 檔案時所使用的 MakerLab 名稱" +msgstr "產生此 3MF 檔案時所使用的 MakerLab 名稱" msgid "MakerLab version" msgstr "MakerLab 版本" msgid "MakerLab version to generate this 3mf" -msgstr "生成此 3MF 檔案時所使用的 MakerLab 版本" +msgstr "產生此 3MF 檔案時所使用的 MakerLab 版本" msgid "metadata name list" msgstr "中繼資料名稱清單" @@ -14529,7 +14530,7 @@ msgid "Allow 3mf with newer version to be sliced" msgstr "允許對較新版本的 3MF 進行切片處理" msgid "Current z-hop" -msgstr "當前 Z 抬升高度" +msgstr "目前 Z 抬升高度" msgid "Contains z-hop present at the beginning of the custom G-code block." msgstr "包含在自定義 G-code 區塊開頭的 Z 抬升動作。" @@ -14555,7 +14556,7 @@ msgid "Extra de-retraction" msgstr "額外返回抽" msgid "Currently planned extra extruder priming after de-retraction." -msgstr "當前計劃的額外擠出機加料,發生於回抽恢復後。" +msgstr "目前計劃的額外擠出機加料,發生於回抽恢復後。" msgid "Absolute E position" msgstr "絕對擠出值" @@ -14675,7 +14676,7 @@ msgid "" "index 0).\n" "Example: 'x:100% y:50% z:100'." msgstr "" -"包含各個物件所應用縮放比例資訊的字串。物件索引以 0 為起點(第一個物件的索引" +"包含各個物件所套用縮放比例資訊的字串。物件索引以 0 為起點(第一個物件的索引" "為 0)。範例:x:100% y:50% z:100。" msgid "Input filename without extension" @@ -14789,7 +14790,7 @@ msgid "Maximal layer z" msgstr "層的最大 Z 軸高度" msgid "Height of the last layer above the print bed." -msgstr "最後一層距打印床的高度。" +msgstr "最後一層距列印床的高度。" msgid "Filament extruder ID" msgstr "線材擠出機識別碼" @@ -14843,7 +14844,7 @@ msgid "" "No layers were detected. You might want to repair your STL file(s) or check " "their size or thickness and retry.\n" msgstr "" -"未檢測到任何列印層。請檢查你的 STL 文件是否需要修復,或者確認其尺寸與厚度,然" +"未檢測到任何列印層。請檢查您的 STL 檔案是否需要修復,或者確認其尺寸與厚度,然" "後再重試。\n" msgid "" @@ -14892,54 +14893,54 @@ msgid "This OBJ file couldn't be read because it's empty." msgstr "無法讀取此 OBJ 檔案,因為它是空的。" msgid "Flow Rate Calibration" -msgstr "流量比例校準" +msgstr "流量比例校正" msgid "Max Volumetric Speed Calibration" -msgstr "最大體積速度校準" +msgstr "最大體積速度校正" msgid "Manage Result" msgstr "管理結果" msgid "Manual Calibration" -msgstr "手動校準" +msgstr "手動校正" msgid "Result can be read by human eyes." msgstr "結果可由人眼讀取。" msgid "Auto-Calibration" -msgstr "自動校準" +msgstr "自動校正" msgid "We would use Lidar to read the calibration result" -msgstr "將使用雷射雷達來讀取校準結果" +msgstr "將使用雷射雷達來讀取校正結果" msgid "Prev" msgstr "上一個" msgid "Recalibration" -msgstr "重新校準" +msgstr "重新校正" msgid "Calibrate" -msgstr "校準" +msgstr "校正" msgid "Finish" msgstr "完成" msgid "How to use calibration result?" -msgstr "如何使用校準結果?" +msgstr "如何使用校正結果?" msgid "" "You could change the Flow Dynamics Calibration Factor in material editing" -msgstr "你可以在線材編輯中更改流量動態校準因子" +msgstr "您可以在線材編輯中更改流量動態校正因子" msgid "" "The current firmware version of the printer does not support calibration.\n" "Please upgrade the printer firmware." msgstr "" -"列印設備目前的韌體版本不支援校準。\n" +"列印設備目前的韌體版本不支援校正。\n" "請升級列印設備韌體。" msgid "Calibration not supported" -msgstr "不支援校準" +msgstr "不支援校正" msgid "Error desc" msgstr "錯誤描述" @@ -14988,7 +14989,7 @@ msgstr "新增預設失敗。" msgid "" "Are you sure to cancel the current calibration and return to the home page?" -msgstr "你確定要取消目前的校準並返回首頁嗎?" +msgstr "您確定要取消目前的校正並返回首頁嗎?" msgid "No Printer Connected!" msgstr "沒有連接列印設備!" @@ -14997,7 +14998,7 @@ msgid "Printer is not connected yet." msgstr "列印設備尚未連接。" msgid "Please select filament to calibrate." -msgstr "請選擇要校準的線材。" +msgstr "請選擇要校正的線材。" msgid "The input value size must be 3." msgstr "輸入值必須為 3。" @@ -15009,8 +15010,8 @@ msgid "" "historical results. \n" "Do you still want to continue the calibration?" msgstr "" -"此機型每個噴嘴最多只能保存 16 條歷史記錄。你可以刪除現有記錄後再開始校準,或" -"者選擇繼續校準,但無法新增新的校準記錄。你確定要繼續校準嗎?" +"此機型每個噴嘴最多只能保存 16 條歷史記錄。您可以刪除現有記錄後再開始校正,或" +"者選擇繼續校正,但無法新增新的校正記錄。您確定要繼續校正嗎?" msgid "Connecting to printer..." msgstr "正在連接列印設備..." @@ -15019,7 +15020,7 @@ msgid "The failed test result has been dropped." msgstr "測試失敗的結果已被刪除。" msgid "Flow Dynamics Calibration result has been saved to the printer" -msgstr "動態流量校準的結果已儲存至列印設備" +msgstr "動態流量校正的結果已儲存至列印設備" #, c-format, boost-format msgid "" @@ -15027,7 +15028,7 @@ msgid "" "Only one of the results with the same name is saved. Are you sure you want " "to override the historical result?" msgstr "" -"已經有一個同名的歷史校準結果:%s。僅保存同名結果中的其中一個。確定要覆寫歷史" +"已經有一個同名的歷史校正結果:%s。僅保存同名結果中的其中一個。確定要覆寫歷史" "結果嗎?" #, c-format, boost-format @@ -15040,16 +15041,16 @@ msgid "Internal Error" msgstr "內部錯誤" msgid "Please select at least one filament for calibration" -msgstr "請至少選擇一種線材進行校準" +msgstr "請至少選擇一種線材進行校正" msgid "Flow rate calibration result has been saved to preset" -msgstr "流量比例校準結果已儲存到預設值" +msgstr "流量比例校正結果已儲存到預設值" msgid "Max volumetric speed calibration result has been saved to preset" -msgstr "最大體積速度校準結果已儲存到預設值" +msgstr "最大體積速度校正結果已儲存到預設值" msgid "When do you need Flow Dynamics Calibration" -msgstr "在什麼情況下需要進行動態流量校準" +msgstr "在什麼情況下需要進行動態流量校正" msgid "" "We now have added the auto-calibration for different filaments, which is " @@ -15061,14 +15062,14 @@ msgid "" "3. If the max volumetric speed or print temperature is changed in the " "filament setting." msgstr "" -"我們現在已經為不同的列印線材新增了自動校準功能,該功能是完全自動化的,並且結" -"果將儲存在列印設備中以供將來使用。你只需要在以下有限情況下進行校準:\n" -"1. 如果你引入了不同品牌/型號的新列印線材,或者列印線材受潮;\n" +"我們現在已經為不同的列印線材新增了自動校正功能,該功能是完全自動化的,並且結" +"果將儲存在列印設備中以供將來使用。您只需要在以下有限情況下進行校正:\n" +"1. 如果您引入了不同品牌/型號的新列印線材,或者列印線材受潮;\n" "2. 如果噴嘴磨損或更換了新的噴嘴;\n" -"3. 如果你在列印線材設定中更改了最大體積速度或列印溫度。" +"3. 如果您在列印線材設定中更改了最大體積速度或列印溫度。" msgid "About this calibration" -msgstr "關於此校準" +msgstr "關於此校正" msgid "" "Please find the details of Flow Dynamics Calibration from our wiki.\n" @@ -15089,22 +15090,22 @@ msgid "" "cause the result not exactly the same in each calibration. We are still " "investigating the root cause to do improvements with new updates." msgstr "" -"請參考我們的 Wiki 頁面,了解「流體動力校準」的詳細資訊。\n" +"請參考我們的 Wiki 頁面,了解「流體動力校正」的詳細資訊。\n" "\n" -"通常不需要進行校準。當你啟動單色/單材質列印,並在列印開始選單中勾選『流體動力" -"校準』選項時,列印設備將按照舊方式,在列印前校準耗材。當你啟動多色/多材質列印" +"通常不需要進行校正。當您啟動單色/單材質列印,並在列印開始選單中勾選『流體動力" +"校正』選項時,列印設備將按照舊方式,在列印前校正耗材。當您啟動多色/多材質列印" "時,列印設備將在每次耗材切換時使用預設的補償參數,這在大部分情況下都能得到良" "好的結果。\n" "\n" -"請注意,有些情況可能會導致校準結果不可靠,例如列印板上的黏著力不足。你可以通" +"請注意,有些情況可能會導致校正結果不可靠,例如列印板上的黏著力不足。您可以通" "過清洗印板板或塗抹膠水來改善黏著力。有關此主題的更多資訊,請參考我們的 " "Wiki。\n" "\n" -"在我們的測試中,校準結果存在約 10% 的誤差,這可能導致每次校準的結果不完全相" +"在我們的測試中,校正結果存在約 10% 的誤差,這可能導致每次校正的結果不完全相" "同。我們仍在調查根本原因,並將在新的更新中進行改進。" msgid "When to use Flow Rate Calibration" -msgstr "何時使用流量率校準" +msgstr "何時使用流量率校正" msgid "" "After using Flow Dynamics Calibration, there might still be some extrusion " @@ -15117,7 +15118,7 @@ msgid "" "4. Weak Structural Integrity: Prints break easily or don't seem as sturdy as " "they should be." msgstr "" -"使用流量動態校準後,仍可能出現一些擠出問題,例如:\n" +"使用流量動態校正後,仍可能出現一些擠出問題,例如:\n" "1. 過度擠出:列印物體上有過多的線材,形成凸起或小球,或者層次看起來比預期的厚" "而且不均勻。\n" "2. 不足擠出:層次非常薄,填充強度不足,或者在緩慢列印時模型頂層有缺陷。\n" @@ -15129,8 +15130,8 @@ msgid "" "PLA used in RC planes. These materials expand greatly when heated, and " "calibration provides a useful reference flow rate." msgstr "" -"此外,對於像用於遙控飛機的輕質發泡 PLA(LW-PLA)這樣的發泡線材,流量率校準非" -"常重要。這些線材在加熱時會大幅膨脹,而校準提供了有用的流量率參考。" +"此外,對於像用於遙控飛機的輕質發泡 PLA(LW-PLA)這樣的發泡線材,流量率校正非" +"常重要。這些線材在加熱時會大幅膨脹,而校正提供了有用的流量率參考。" msgid "" "Flow Rate Calibration measures the ratio of expected to actual extrusion " @@ -15140,9 +15141,9 @@ msgid "" "you still see the listed defects after you have done other calibrations. For " "more details, please check out the wiki article." msgstr "" -"流量率校準測量預期擠出體積與實際擠出體積之間的比率。預設設定在 Bambu Lab 列印" -"設備和官方線材上表現良好,因為它們已經進行了預先校準和微調。對於普通的線材," -"通常情況下,你不需要執行流量率校準,除非在完成其他校準後仍然看到上述列出的缺" +"流量率校正測量預期擠出體積與實際擠出體積之間的比率。預設設定在 Bambu Lab 列印" +"設備和官方線材上表現良好,因為它們已經進行了預先校正和微調。對於普通的線材," +"通常情況下,您不需要執行流量率校正,除非在完成其他校正後仍然看到上述列出的缺" "陷。如需更多詳細資訊,請查閱 wiki 文章。" msgid "" @@ -15163,26 +15164,26 @@ msgid "" "can lead to sub-par prints or printer damage. Please make sure to carefully " "read and understand the process before doing it." msgstr "" -"自動流量率校準採用 Bambu Lab 的雷射雷達技術,直接測量校準圖案。然而,請注意," +"自動流量率校正採用 Bambu Lab 的雷射雷達技術,直接測量校正圖案。然而,請注意," "這種方法的功效和準確性可能會因特定類型的線材而受影響。特別是透明或半透明、帶" -"有閃光顆粒或具有高反射表面的線材可能不適合這種校準,並可能產生不理想的結" +"有閃光顆粒或具有高反射表面的線材可能不適合這種校正,並可能產生不理想的結" "果。\n" "\n" -"校準結果可能因每次校準或線材的不同而有所不同。我們仍在透過韌體更新不斷提高這" -"種校準的準確性和相容性。\n" +"校正結果可能因每次校正或線材的不同而有所不同。我們仍在透過韌體更新不斷提高這" +"種校正的準確性和相容性。\n" "\n" -"注意:流量率校準是一項先進的技術,只有完全理解其目的和影響的人才應嘗試。錯誤" +"注意:流量率校正是一項先進的技術,只有完全理解其目的和影響的人才應嘗試。錯誤" "的使用可能導致列印品質不佳或損壞列印設備。請確保在執行之前仔細閱讀和理解此過" "程。" msgid "When you need Max Volumetric Speed Calibration" -msgstr "當你需要最大體積速度校準時" +msgstr "當您需要最大體積速度校正時" msgid "Over-extrusion or under extrusion" msgstr "過度擠壓或擠壓不足" msgid "Max Volumetric Speed calibration is recommended when you print with:" -msgstr "使用以下選項列印時,建議進行最大體積速度校準:" +msgstr "使用以下選項列印時,建議進行最大體積速度校正:" msgid "material with significant thermal shrinkage/expansion, such as..." msgstr "具有顯著熱收縮/膨脹的材料,例如..." @@ -15191,17 +15192,17 @@ msgid "materials with inaccurate filament diameter" msgstr "線材直徑不準確的線材" msgid "We found the best Flow Dynamics Calibration Factor" -msgstr "我們找到了最佳的流量動態校準因子" +msgstr "我們找到了最佳的流量動態校正因子" msgid "" "Part of the calibration failed! You may clean the plate and retry. The " "failed test result would be dropped." -msgstr "部分校準失敗! 你可以清潔列印板並重試。 失敗的測試結果將不會儲存。" +msgstr "部分校正失敗!您可以清潔列印板並重試。 失敗的測試結果將不會儲存。" msgid "" "*We recommend you to add brand, materia, type, and even humidity level in " "the Name" -msgstr "*我們建議你在名稱中加入品牌、材料、類型,甚至濕度水平" +msgstr "*我們建議您在名稱中加入品牌、材料、類型,甚至濕度水平" msgid "Failed" msgstr "失敗" @@ -15218,7 +15219,7 @@ msgid "" msgstr "同名的結果只能儲存一個,是否要覆蓋其他結果?" msgid "Please find the best line on your plate" -msgstr "請在你的列印板上找到最佳線條" +msgstr "請在您的列印板上找到最佳線條" msgid "Please find the corner with perfect degree of extrusion" msgstr "請找到最完美的列印角度" @@ -15236,7 +15237,7 @@ msgid "Record Factor" msgstr "記錄係數" msgid "We found the best flow ratio for you" -msgstr "我們為你找到了最佳流量比" +msgstr "我們為您找到了最佳流量比" msgid "Flow Ratio" msgstr "流量比" @@ -15248,10 +15249,10 @@ msgid "Please enter the name of the preset you want to save." msgstr "請輸入要儲存的預設名稱。" msgid "Calibration1" -msgstr "校準 1" +msgstr "校正 1" msgid "Calibration2" -msgstr "校準 2" +msgstr "校正 2" msgid "Please find the best object on your plate" msgstr "請在列印板上選擇最理想的物件" @@ -15260,7 +15261,7 @@ msgid "Fill in the value above the block with smoothest top surface" msgstr "用最光滑的頂面填充塊上方的值" msgid "Skip Calibration2" -msgstr "跳過校準2" +msgstr "跳過校正2" #, c-format, boost-format msgid "flow ratio : %s " @@ -15276,13 +15277,13 @@ msgid "Please input a valid value (0 <= Max Volumetric Speed <= 60)" msgstr "請輸入一個有效值(0<=最大體積速度<=60)" msgid "Calibration Type" -msgstr "校準類型" +msgstr "校正類型" msgid "Complete Calibration" -msgstr "完整校準" +msgstr "完整校正" msgid "Fine Calibration based on flow ratio" -msgstr "基於流量比的精細校準" +msgstr "基於流量比的精細校正" msgid "Title" msgstr "標題" @@ -15290,7 +15291,7 @@ msgstr "標題" msgid "" "A test model will be printed. Please clear the build plate and place it back " "to the hot bed before calibration." -msgstr "將列印一份測試模型。在校準之前,請清理列印板並將其放回熱床上。" +msgstr "將列印一份測試模型。在校正之前,請清理列印板並將其放回熱床上。" msgid "Printing Parameters" msgstr "列印參數" @@ -15305,14 +15306,14 @@ msgid "External Spool" msgstr "外部線軸" msgid "Filament For Calibration" -msgstr "校準用線材" +msgstr "校正用線材" msgid "" "Tips for calibration material: \n" "- Materials that can share same hot bed temperature\n" "- Different filament brand and family(Brand = Bambu, Family = Basic, Matte)" msgstr "" -"校準線材提示:\n" +"校正線材提示:\n" "-可以共享相同熱床溫度的線材\n" "-不同的線材品牌和系列(Brand = Bambu, Family = Basic, Matte)" @@ -15327,7 +15328,7 @@ msgid "%s is not compatible with %s" msgstr "%s 與 %s 不相容" msgid "TPU is not supported for Flow Dynamics Auto-Calibration." -msgstr "不支援 TPU 進行流量動態自動校準。" +msgstr "不支援 TPU 進行流量動態自動校正。" msgid "Connecting to printer" msgstr "正在連接列印設備" @@ -15351,7 +15352,7 @@ msgid "To Volumetric Speed" msgstr "至體積速度" msgid "Flow Dynamics Calibration Result" -msgstr "動態流量校準結果" +msgstr "動態流量校正結果" msgid "New" msgstr "新增" @@ -15360,10 +15361,10 @@ msgid "No History Result" msgstr "無歷史結果" msgid "Success to get history result" -msgstr "成功獲取歷史結果" +msgstr "成功取得歷史結果" msgid "Refreshing the historical Flow Dynamics Calibration records" -msgstr "重整歷史流量動態校準記錄" +msgstr "重整歷史流量動態校正記錄" msgid "Action" msgstr "操作" @@ -15373,10 +15374,10 @@ msgid "This machine type can only hold %d history results per nozzle." msgstr "此設備型號每個噴嘴僅能儲存 %d 筆歷史結果。" msgid "Edit Flow Dynamics Calibration" -msgstr "編輯動態流量校準" +msgstr "編輯動態流量校正" msgid "New Flow Dynamic Calibration" -msgstr "重新校準動態流量" +msgstr "重新校正動態流量" msgid "Ok" msgstr "Ok" @@ -15391,13 +15392,13 @@ msgid "Address" msgstr "地址" msgid "Hostname" -msgstr "主機名" +msgstr "主機名稱" msgid "Service name" -msgstr "服務名" +msgstr "服務名稱" msgid "OctoPrint version" -msgstr "OctoPrint版本" +msgstr "OctoPrint 版本" msgid "Searching for devices" msgstr "正在尋找設備" @@ -15417,7 +15418,7 @@ msgstr "" "請選擇一個要使用的 IP 位址。" msgid "PA Calibration" -msgstr "PA校準" +msgstr "PA 校正" msgid "DDE" msgstr "近程擠出機" @@ -15429,13 +15430,13 @@ msgid "Extruder type" msgstr "擠出機類型" msgid "PA Tower" -msgstr "PA塔" +msgstr "PA 塔" msgid "PA Line" msgstr "劃線模式" msgid "PA Pattern" -msgstr "V形模式" +msgstr "V 形模式" msgid "Start PA: " msgstr "起始值:" @@ -15473,7 +15474,7 @@ msgstr "" "PA 步距:>= 0.001)" msgid "Temperature calibration" -msgstr "溫度校準" +msgstr "溫度校正" msgid "PLA" msgstr "PLA" @@ -15575,7 +15576,7 @@ msgid "Send G-Code to printer host" msgstr "傳送 G-code 到列印設備" msgid "Upload to Printer Host with the following filename:" -msgstr "使用下列檔案名上傳到列印設備:" +msgstr "使用下列檔案名稱上傳到列印設備:" msgid "Use forward slashes ( / ) as a directory separator if needed." msgstr "如有需要,請使用正斜線(/)作為目錄分隔符。" @@ -15610,7 +15611,7 @@ msgid "Size" msgstr "尺寸" msgid "Filename" -msgstr "檔案名" +msgstr "檔案名稱" msgid "Cancel selected" msgstr "取消選取" @@ -15639,7 +15640,7 @@ msgid "Time-lapse" msgstr "縮時錄影" msgid "Heated Bed Leveling" -msgstr "加熱床校平" +msgstr "熱床調平" msgid "Textured Build Plate (Side A)" msgstr "紋理列印板(A面)" @@ -15741,7 +15742,7 @@ msgid "Add Filament Preset under this filament" msgstr "在此線材下新增線材預設" msgid "We could create the filament presets for your following printer:" -msgstr "可以為你以下的列印設備建立線材預設:" +msgstr "可以為您以下的列印設備建立線材預設:" msgid "Select Vendor" msgstr "選擇廠牌" @@ -15768,7 +15769,7 @@ msgid "Filament Preset" msgstr "線材預設" msgid "Create" -msgstr "創建" +msgstr "建立" msgid "Vendor is not selected, please reselect vendor." msgstr "廠牌尚未選擇,請重新選擇廠牌。" @@ -15856,7 +15857,7 @@ msgid "Select Model" msgstr "選擇型號" msgid "Select Printer" -msgstr "Select Model" +msgstr "選擇印表機" msgid "Input Custom Model" msgstr "輸入自訂型號" @@ -15922,12 +15923,12 @@ msgstr "返回第一頁" msgid "" "You have not yet chosen which printer preset to create based on. Please " "choose the vendor and model of the printer" -msgstr "尚未選擇要基於哪個列印設備預設設定來創建,請選擇列印設備的廠牌和型號" +msgstr "尚未選擇要基於哪個列印設備預設設定來建立,請選擇列印設備的廠牌和型號" msgid "" "You have entered an illegal input in the printable area section on the first " "page. Please check before creating it." -msgstr "在第一頁的可列印區域部分輸入了無效的設定,請在創建前檢查。" +msgstr "在第一頁的可列印區域部分輸入了無效的設定,請在建立前檢查。" msgid "The custom printer or model is not entered, please enter it." msgstr "未輸入自訂列印設備或型號,請輸入。" @@ -15941,10 +15942,10 @@ msgid "" "reserve.\n" "\tCancel: Do not create a preset, return to the creation interface." msgstr "" -"創建的列印設備預設設定已經有相同名稱的預設設定。是否要覆蓋它?\n" -"\t是:覆蓋相同名稱的列印設備預設設定,並重新創建名稱相同的線材和處理預設設" +"建立的列印設備預設設定已經有相同名稱的預設設定。是否要覆蓋它?\n" +"\t是:覆蓋相同名稱的列印設備預設設定,並重新建立名稱相同的線材和處理預設設" "定,名稱不同的線材和處理預設設定將被保留。\n" -" \t取消:不創建預設設定,返回創建界面。" +" \t取消:不建立預設設定,返回建立界面。" msgid "You need to select at least one filament preset." msgstr "需要至少選擇一個線材預設設定。" @@ -15953,10 +15954,10 @@ msgid "You need to select at least one process preset." msgstr "需要至少選擇一個處理預設設定。" msgid "Create filament presets failed. As follows:\n" -msgstr "創建線材預設設定失敗,原因如下:\n" +msgstr "建立線材預設設定失敗,原因如下:\n" msgid "Create process presets failed. As follows:\n" -msgstr "創建處理預設設定失敗,原因如下:\n" +msgstr "建立處理預設設定失敗,原因如下:\n" msgid "Vendor is not find, please reselect." msgstr "未找到廠牌,請重新選擇。" @@ -15967,7 +15968,7 @@ msgstr "目前廠牌沒有可用的型號,請重新選擇。" msgid "" "You have not selected the vendor and model or entered the custom vendor and " "model." -msgstr "你尚未選擇廠牌和型號,或未輸入自訂的廠牌和型號。" +msgstr "您尚未選擇廠牌和型號,或未輸入自訂的廠牌和型號。" msgid "" "There may be escape characters in the custom printer vendor or model. Please " @@ -15986,19 +15987,19 @@ msgid "" msgstr "尚未選擇要更換噴嘴的列印設備,請選擇。" msgid "Create Printer Successful" -msgstr "列印設備創建成功" +msgstr "列印設備建立成功" msgid "Create Filament Successful" -msgstr "線材創建成功" +msgstr "線材建立成功" msgid "Printer Created" -msgstr "列印設備創建完成" +msgstr "列印設備建立完成" msgid "Please go to printer settings to edit your presets" -msgstr "請前往列印設備設定編輯你的預設設定" +msgstr "請前往列印設備設定編輯您的預設設定" msgid "Filament Created" -msgstr "線材創建完成" +msgstr "線材建立完成" msgid "" "Please go to filament setting to edit your presets if you need.\n" @@ -16006,7 +16007,7 @@ msgid "" "volumetric speed has a significant impact on printing quality. Please set " "them carefully." msgstr "" -"如需調整,請至線材設定頁編輯你的預設。\n" +"如需調整,請至線材設定頁編輯您的預設。\n" "請特別注意,噴嘴溫度、熱床溫度及最大體積速度會顯著影響列印品質,建議謹慎設" "定。" @@ -16020,9 +16021,9 @@ msgid "" msgstr "" "\n" "\n" -"Orca 偵測到你的使用者預設同步功能尚未啟用,這可能導致線材設定在裝置頁面上無法" +"Orca 偵測到您的使用者預設同步功能尚未啟用,這可能導致線材設定在裝置頁面上無法" "正常使用。\n" -"請點擊『同步用戶預設』以啟用同步功能。" +"請點擊『同步使用者預設』以啟用同步功能。" msgid "Printer Setting" msgstr "列印設備設定" @@ -16046,10 +16047,10 @@ msgid "initialize fail" msgstr "初始化失敗" msgid "add file fail" -msgstr "添加檔案失敗" +msgstr "新增檔案失敗" msgid "add bundle structure file fail" -msgstr "添加捆綁結構檔案失敗" +msgstr "新增捆綁結構檔案失敗" msgid "finalize fail" msgstr "失敗" @@ -16067,8 +16068,8 @@ msgid "" "If not, a time suffix will be added, and you can modify the name after " "creation." msgstr "" -"目前目錄中已存在 '%s' 資料夾。你是否要清除它並重新建立?\n" -"如果不想清除,將會加上時間後綴,並且你可以在建立後修改名稱。" +"目前目錄中已存在 '%s' 資料夾。您是否要清除它並重新建立?\n" +"如果不想清除,將會加上時間後綴,並且您可以在建立後修改名稱。" msgid "" "Printer and all the filament&&process presets that belongs to the printer. \n" @@ -16096,7 +16097,7 @@ msgid "" "Only printer names with user printer presets will be displayed, and each " "preset you choose will be exported as a zip." msgstr "" -"只有具有使用者列印設備預設設定的列印設備名稱會顯示,你選擇的每個預設設定將以 " +"只有具有使用者列印設備預設設定的列印設備名稱會顯示,您選擇的每個預設設定將以 " "zip 檔案格式匯出。" msgid "" @@ -16105,7 +16106,7 @@ msgid "" "exported as a zip." msgstr "" "只有具有使用者線材預設設定的線材名稱會顯示,\n" -"你選擇的每個線材名稱中的所有使用者線材預設設定將以 zip 檔案格式匯出。" +"您選擇的每個線材名稱中的所有使用者線材預設設定將以 zip 檔案格式匯出。" msgid "" "Only printer names with changed process presets will be displayed, \n" @@ -16113,16 +16114,16 @@ msgid "" "exported as a zip." msgstr "" "只有具有變更過處理預設設定的列印設備名稱會顯示,\n" -"你選擇的每個列印設備名稱中的所有使用者處理預設設定將以 zip 檔案格式匯出。" +"您選擇的每個列印設備名稱中的所有使用者處理預設設定將以 zip 檔案格式匯出。" msgid "Please select at least one printer or filament." msgstr "請至少選擇一個列印設備或線材。" msgid "Please select a type you want to export" -msgstr "請選擇你要匯出的類型" +msgstr "請選擇您要匯出的類型" msgid "Failed to create temporary folder, please try Export Configs again." -msgstr "創建臨時資料夾失敗,請再次嘗試匯出配置。" +msgstr "建立臨時資料夾失敗,請再次嘗試匯出配置。" msgid "Edit Filament" msgstr "編輯線材" @@ -16163,7 +16164,7 @@ msgid "" "information for that slot." msgstr "" "所有屬於此線材的預設設定將被刪除。\n" -"如果你正在列印設備上使用此線材,請重新設置該插槽的線材資訊。" +"如果您正在列印設備上使用此線材,請重新設置該插槽的線材資訊。" msgid "Delete filament" msgstr "刪除線材" @@ -16202,7 +16203,7 @@ msgstr "記錄的噴嘴:%.1f %s" msgid "" "Your nozzle diameter in preset is not consistent with memorized nozzle " "diameter. Did you change your nozzle lately?" -msgstr "預設的噴嘴直徑與記錄的噴嘴直徑不一致。你最近有更換噴嘴嗎?" +msgstr "預設的噴嘴直徑與記錄的噴嘴直徑不一致。您最近有更換噴嘴嗎?" #, c-format, boost-format msgid "*Printing %s material with %s may cause nozzle damage" @@ -16217,7 +16218,7 @@ msgstr "開始、結束或步距不是有效值。" msgid "" "Unable to calibrate: maybe because the set calibration value range is too " "large, or the step is too small" -msgstr "無法校準:可能是設定的校準值範圍太大,或步距太小" +msgstr "無法校正:可能是設定的校正值範圍太大,或步距太小" msgid "Physical Printer" msgstr "實體列印設備" @@ -16250,10 +16251,10 @@ msgid "" "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" "signed certificate." msgstr "" -"HTTPS CA 憑證檔案是可選的。 僅當你使用具有自行簽證的 HTTPS 時才需要它。" +"HTTPS CA 憑證檔案是可選的。 僅當您使用具有自行簽證的 HTTPS 時才需要它。" msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" -msgstr "憑證檔(*.crt, *.pem)|*.crt;*.pem|All files|*.*" +msgstr "憑證檔(*.crt, *.pem)|*.crt;*.pem|所有檔案|*.*" msgid "Open CA certificate file" msgstr "開啟 CA憑證檔" @@ -16267,7 +16268,7 @@ msgstr "在此系統上,%s 使用系統憑證儲存庫或鑰匙圈中的 HTTPS msgid "" "To use a custom CA file, please import your CA file into Certificate Store / " "Keychain." -msgstr "若要使用自訂 CA 憑證檔,請將你的 CA 憑證檔匯入到憑證儲存庫/鑰匙圈中。" +msgstr "若要使用自訂 CA 憑證檔,請將您的 CA 憑證檔匯入到憑證儲存庫/鑰匙圈中。" msgid "Login/Test" msgstr "登入/測試" @@ -16687,7 +16688,7 @@ msgid "Auto-generate points" msgstr "自動產生點" msgid "Add a brim ear" -msgstr "添加邊緣支撐 (Brim)" +msgstr "新增邊緣支撐 (Brim)" msgid "Delete a brim ear" msgstr "刪除邊緣支撐 (Brim)" @@ -16719,7 +16720,7 @@ msgid "" "consistency?" msgstr "" "精確牆壁\n" -"你知道啟用精確牆壁可以提高精度和層次一致性嗎?" +"您知道啟用精確牆壁可以提高精度和層次一致性嗎?" #: resources/data/hints.ini: [hint:Sandwich mode] msgid "" @@ -16729,7 +16730,7 @@ msgid "" "overhangs?" msgstr "" "三明治模式\n" -"你知道嗎?如果模型中沒有太陡峭的懸空區域,可以使用三明治模式\n" +"您知道嗎?如果模型中沒有太陡峭的懸空區域,可以使用三明治模式\n" "(內層-外層-內層)來提升精度並增強層的一致性。" #: resources/data/hints.ini: [hint:Chamber temperature] @@ -16738,7 +16739,7 @@ msgid "" "Did you know that OrcaSlicer supports chamber temperature?" msgstr "" "機箱溫度\n" -"你知道 OrcaSlicer 支援機箱內溫度控制嗎?" +"您知道 OrcaSlicer 支援機箱內溫度控制嗎?" #: resources/data/hints.ini: [hint:Calibration] msgid "" @@ -16746,9 +16747,9 @@ msgid "" "Did you know that calibrating your printer can do wonders? Check out our " "beloved calibration solution in OrcaSlicer." msgstr "" -"校準\n" -"你知道校準列印設備可以帶來奇效嗎?快來看看我們在 OrcaSlicer 中的\n" -"校準解決方案。" +"校正\n" +"您知道校正列印設備可以帶來奇效嗎?快來看看我們在 OrcaSlicer 中的\n" +"校正解決方案。" #: resources/data/hints.ini: [hint:Auxiliary fan] msgid "" @@ -16756,7 +16757,7 @@ msgid "" "Did you know that OrcaSlicer supports Auxiliary part cooling fan?" msgstr "" "輔助風扇\n" -"你知道 OrcaSlicer 支援輔助零件冷卻風扇嗎?" +"您知道 OrcaSlicer 支援輔助零件冷卻風扇嗎?" #: resources/data/hints.ini: [hint:Air filtration] msgid "" @@ -16764,7 +16765,7 @@ msgid "" "Did you know that OrcaSlicer can support Air filtration/Exhaust Fan?" msgstr "" "空氣過濾/排風扇\n" -"你知道 OrcaSlicer 支援空氣過濾/排風扇嗎?" +"您知道 OrcaSlicer 支援空氣過濾/排風扇嗎?" #: resources/data/hints.ini: [hint:G-code window] msgid "" @@ -16772,7 +16773,7 @@ msgid "" "You can turn on/off the G-code window by pressing the C key." msgstr "" "G-code 視窗\n" -"你可以按 C 鍵開啟/關閉 G-code 視窗。" +"您可以按 C 鍵開啟/關閉 G-code 視窗。" #: resources/data/hints.ini: [hint:Switch workspaces] msgid "" @@ -16781,7 +16782,7 @@ msgid "" "pressing the Tab key." msgstr "" "切換工作區\n" -"你可以按 Tab 鍵在 準備預覽 工作區之間切換。" +"您可以按 Tab 鍵在 準備預覽 工作區之間切換。" #: resources/data/hints.ini: [hint:How to use keyboard shortcuts] msgid "" @@ -16790,7 +16791,7 @@ msgid "" "3D scene operations." msgstr "" "如何使用鍵盤快捷鍵\n" -"你知道嗎? Orca Slicer 提供了廣泛的鍵盤快捷鍵和 3D 場景操作。" +"您知道嗎? Orca Slicer 提供了廣泛的鍵盤快捷鍵和 3D 場景操作。" #: resources/data/hints.ini: [hint:Reverse on odd] msgid "" @@ -16799,7 +16800,7 @@ msgid "" "the surface quality of your overhangs?" msgstr "" "奇數反向\n" -"你知道嗎?奇數反向 功能能大幅提升懸空結構的表面品質。" +"您知道嗎?奇數反向 功能能大幅提升懸空結構的表面品質。" #: resources/data/hints.ini: [hint:Cut Tool] msgid "" @@ -16808,7 +16809,7 @@ msgid "" "cutting tool?" msgstr "" "切割工具\n" -"你知道嗎?你可以使用切割工具以任何角度和位置切割模型。" +"您知道嗎?您可以使用切割工具以任何角度和位置切割模型。" #: resources/data/hints.ini: [hint:Fix Model] msgid "" @@ -16817,7 +16818,7 @@ msgid "" "problems on the Windows system?" msgstr "" "修復模型\n" -"你知道嗎?在 Windows 系統上修復損壞的 3D 模型,\n" +"您知道嗎?在 Windows 系統上修復損壞的 3D 模型,\n" "可以有效避免許多切片時的問題。" #: resources/data/hints.ini: [hint:Timelapse] @@ -16826,7 +16827,7 @@ msgid "" "Did you know that you can generate a timelapse video during each print?" msgstr "" "縮時錄影\n" -"你知道嗎?你可以每次列印時產生一段縮時錄影。" +"您知道嗎?您可以每次列印時產生一段縮時錄影。" #: resources/data/hints.ini: [hint:Auto-Arrange] msgid "" @@ -16834,7 +16835,7 @@ msgid "" "Did you know that you can auto-arrange all objects in your project?" msgstr "" "自動擺放\n" -"你知道嗎?你可以自動擺放專案項目中的所有物件。" +"您知道嗎?您可以自動擺放專案項目中的所有物件。" #: resources/data/hints.ini: [hint:Auto-Orient] msgid "" @@ -16843,7 +16844,7 @@ msgid "" "printing by a simple click?" msgstr "" "自動定向\n" -"你知道嗎?你只需單擊滑鼠,即可將物件旋轉到適合的列印方向。" +"您知道嗎?您只需單擊滑鼠,即可將物件旋轉到適合的列印方向。" #: resources/data/hints.ini: [hint:Lay on Face] msgid "" @@ -16853,7 +16854,7 @@ msgid "" "F key." msgstr "" "指定列印物件底部\n" -"你知道嗎?你可以快速指定模型的底面,使其位於列印板上。\n" +"您知道嗎?您可以快速指定模型的底面,使其位於列印板上。\n" "選擇「選擇底面」或按 F 鍵。" #: resources/data/hints.ini: [hint:Object List] @@ -16863,7 +16864,7 @@ msgid "" "settings for each object/part?" msgstr "" "物件清單\n" -"你知道嗎?你可以在清單中檢視所有物件/部件,並為每個物件/部件\n" +"您知道嗎?您可以在清單中檢視所有物件/部件,並為每個物件/部件\n" "調整設定。" #: resources/data/hints.ini: [hint:Search Functionality] @@ -16873,7 +16874,7 @@ msgid "" "Slicer setting?" msgstr "" "搜尋功能\n" -"你知道嗎?使用「搜尋工具」可以快速定位特定的 Orca Slicer 設定。" +"您知道嗎?使用「搜尋工具」可以快速定位特定的 Orca Slicer 設定。" #: resources/data/hints.ini: [hint:Simplify Model] msgid "" @@ -16882,7 +16883,7 @@ msgid "" "Simplify mesh feature? Right-click the model and select Simplify model." msgstr "" "簡化模型\n" -"你知道嗎?透過「簡化網格」功能,你可以減少模型中的三角形數量。\n" +"您知道嗎?透過「簡化網格」功能,您可以減少模型中的三角形數量。\n" "只需右鍵點擊模型,然後選擇「簡化模型」。" #: resources/data/hints.ini: [hint:Slicing Parameter Table] @@ -16892,7 +16893,7 @@ msgid "" "settings for each object/part?" msgstr "" "參數表格\n" -"你知道嗎?你可以看參數表格上的所有物件/零件,並更改每個物件/零\n" +"您知道嗎?您可以看參數表格上的所有物件/零件,並更改每個物件/零\n" "件的設定。" #: resources/data/hints.ini: [hint:Split to Objects/Parts] @@ -16902,7 +16903,7 @@ msgid "" "colorizing or printing?" msgstr "" "分割成物件/零件\n" -"你知道嗎?你可以把一個大物件分割成多個小物件/零件以便著色或\n" +"您知道嗎?您可以把一個大物件分割成多個小物件/零件以便著色或\n" "列印。" #: resources/data/hints.ini: [hint:Subtract a Part] @@ -16913,8 +16914,8 @@ msgid "" "directly in Orca Slicer." msgstr "" "減去零件\n" -"你知道嗎?你可以使用「負零件修飾器」將一個網格從另一個網格中減\n" -"去。這樣,就能直接在 Orca Slicer 裡輕鬆創建尺寸可調的孔洞。" +"您知道嗎?您可以使用「負零件修飾器」將一個網格從另一個網格中減\n" +"去。這樣,就能直接在 Orca Slicer 裡輕鬆建立尺寸可調的孔洞。" #: resources/data/hints.ini: [hint:STEP] msgid "" @@ -16925,7 +16926,7 @@ msgid "" "lower resolution STL. Give it a try!" msgstr "" "STEP檔案\n" -"你知道嗎?通過切片 STEP 檔案而不是 STL 檔案可以提高列印品質。\n" +"您知道嗎?通過切片 STEP 檔案而不是 STL 檔案可以提高列印品質。\n" "Orca Slicer 支援切片 STEP 檔案,提供比低解析度 STL 更平滑的結果。\n" "試試看!" @@ -16937,7 +16938,7 @@ msgid "" "the overall look of your model. Check it out!" msgstr "" "Z接縫位置\n" -"你知道嗎?你可以自訂Z接縫的位置,甚至可以將其繪製在列印上,使\n" +"您知道嗎?您可以自訂Z接縫的位置,甚至可以將其繪製在列印上,使\n" "其位於不太可見的位置。這樣可以改善模型的整體外觀。試試看!" #: resources/data/hints.ini: [hint:Fine-tuning for flow rate] @@ -16948,7 +16949,7 @@ msgid "" "printed model by doing some fine-tuning." msgstr "" "流量微調\n" -"你知道嗎?你可以微調流量,以獲得更好看的列印效果。根據線材的不\n" +"您知道嗎?您可以微調流量,以獲得更好看的列印效果。根據線材的不\n" "同,可以通過進行一些微調來提高列印模型的整體光潔度。" #: resources/data/hints.ini: [hint:Split your prints into plates] @@ -16959,7 +16960,7 @@ msgid "" "track of all the parts." msgstr "" "分類列印\n" -"你知道嗎?你可以把一個有很多零件的模型安排到多個獨立的列印板,\n" +"您知道嗎?您可以把一個有很多零件的模型安排到多個獨立的列印板,\n" "然後列印出來,這將簡化對所有零件的管理。" #: resources/data/hints.ini: [hint:Speed up your print with Adaptive Layer @@ -16970,7 +16971,7 @@ msgid "" "Layer Height option? Check it out!" msgstr "" "自適應層高度加速列印\n" -"你知道嗎?你可以使用「自適應層高度」選項可以更快地列印模型。\n" +"您知道嗎?您可以使用「自適應層高度」選項可以更快地列印模型。\n" "試試看!" #: resources/data/hints.ini: [hint:Support painting] @@ -16981,7 +16982,7 @@ msgid "" "model that actually need it." msgstr "" "自訂支撐\n" -"你知道嗎?你可以手動繪製增加/隱藏支撐的位置,此功能使僅將支撐\n" +"您知道嗎?您可以手動繪製增加/隱藏支撐的位置,此功能使僅將支撐\n" "材料放置在實際需要的模型截面上變得容易。" #: resources/data/hints.ini: [hint:Different types of supports] @@ -16992,7 +16993,7 @@ msgid "" "print speed. Check them out!" msgstr "" "支撐類型\n" -"你知道嗎?有多種可選的支撐類型,有機樹狀支撐非常適合人物/動物模型,\n" +"您知道嗎?有多種可選的支撐類型,有機樹狀支撐非常適合人物/動物模型,\n" "同時可以節線材並提高列印速度。試試看!" #: resources/data/hints.ini: [hint:Printing Silk Filament] @@ -17003,7 +17004,7 @@ msgid "" "the best results." msgstr "" "列印絲綢線材\n" -"你知道嗎?絲綢線材需要特別考慮才能成功列印。為了獲得最佳效果,\n" +"您知道嗎?絲綢線材需要特別考慮才能成功列印。為了獲得最佳效果,\n" "通常建議使用較高的溫度和較低的速度。" #: resources/data/hints.ini: [hint:Brim for better adhesion] @@ -17013,7 +17014,7 @@ msgid "" "the printing surface, it's recommended to use a brim?" msgstr "" "使用 Brim\n" -"你知道嗎?當模型與熱床表面的接觸面積較小時,建議使用 Brim 以提\n" +"您知道嗎?當模型與熱床表面的接觸面積較小時,建議使用 Brim 以提\n" "高列印成功率。" #: resources/data/hints.ini: [hint:Set parameters for multiple objects] @@ -17023,7 +17024,7 @@ msgid "" "one time?" msgstr "" "為多個物件設定參數\n" -"你知道嗎?你可以同時為所有選取的物件設定切片參數。" +"您知道嗎?您可以同時為所有選取的物件設定切片參數。" #: resources/data/hints.ini: [hint:Stack objects] msgid "" @@ -17031,7 +17032,7 @@ msgid "" "Did you know that you can stack objects as a whole one?" msgstr "" "組合物體\n" -"你知道嗎?你可以把多個物件組合為一個整體。" +"您知道嗎?您可以把多個物件組合為一個整體。" #: resources/data/hints.ini: [hint:Flush into support/objects/infill] msgid "" @@ -17040,7 +17041,7 @@ msgid "" "support/objects/infill during filament change?" msgstr "" "廢料運用到支撐/物件/填充中\n" -"你知道嗎?你可以在換料時將廢料運用到支撐/物件/填充,以節省浪費\n" +"您知道嗎?您可以在換料時將廢料運用到支撐/物件/填充,以節省浪費\n" "的線材。" #: resources/data/hints.ini: [hint:Improve strength] @@ -17050,7 +17051,7 @@ msgid "" "density to improve the strength of the model?" msgstr "" "提高強度\n" -"你知道嗎?你可以使用更多的牆層數和更高的疏散填充密度來提高模型\n" +"您知道嗎?您可以使用更多的牆層數和更高的疏散填充密度來提高模型\n" "強度。" #: resources/data/hints.ini: [hint:When need to print with the printer door @@ -17062,7 +17063,7 @@ msgid "" "higher enclosure temperature. More info about this in the Wiki." msgstr "" "當列印時需要打開機門時\n" -"你知道嗎?在列印低溫耗材且機箱內溫度較高的情況下,打開列印\n" +"您知道嗎?在列印低溫耗材且機箱內溫度較高的情況下,打開列印\n" "設備機門可以有效降低擠出機或噴嘴堵塞的機率。\n" "詳情可在Wiki上查看。" @@ -17074,7 +17075,7 @@ msgid "" "probability of warping." msgstr "" "避免翹曲\n" -"你知道嗎?當列印容易翹曲的材料(如 ABS)時,適當提高熱床溫度\n" +"您知道嗎?當列印容易翹曲的材料(如 ABS)時,適當提高熱床溫度\n" "可以降低翹曲的機率。" #~ msgid "" @@ -17100,7 +17101,7 @@ msgstr "" #~ "independent support layer height" #~ msgstr "" #~ "當使用專用的支撐線材時,我們推薦以下設定:\n" -#~ "0 頂層z距離,0 界面間距,同心模式,並且禁用獨立支撐層高" +#~ "0 頂層z距離,0 界面間距,同心模式,並且停用獨立支撐層高" #~ msgid "Branch Diameter with double walls" #~ msgstr "分支雙層牆直徑" @@ -17184,13 +17185,13 @@ msgstr "" #~ msgid "" #~ "Step 1, please confirm Orca Slicer and your printer are in the same LAN." -#~ msgstr "第1步,請確認 Orca Slicer 和你的列印設備在同一個區域網路上。" +#~ msgstr "第1步,請確認 Orca Slicer 和您的列印設備在同一個區域網路上。" #~ msgid "" #~ "Step 2, if the IP and Access Code below are different from the actual " #~ "values on your printer, please correct them." #~ msgstr "" -#~ "步驟2, 如果下面的 IP 和訪問碼與列印設備上的實際值不同,請輸入正確的數值。" +#~ "步驟2, 如果下面的 IP 和存取碼與列印設備上的實際值不同,請輸入正確的數值。" #~ msgid "Step 3: Ping the IP address to check for packet loss and latency." #~ msgstr "步驟 3:Ping 該 IP 地址以檢查封包遺失和延遲。" @@ -17287,21 +17288,21 @@ msgstr "" #~ "此選項有助於減少在大幅傾斜或曲面的模型上頂部表面瑕疵。\n" #~ "\n" #~ "預設情況下,小型內部橋接會被篩選掉,內部實心填充會直接印刷在稀疏填充上。這" -#~ "在大多數情況下運作良好,能加速列印並且不會過度影響頂部表面質量。\n" +#~ "在大多數情況下運作良好,能加速列印並且不會過度影響頂部表面品質。\n" #~ "\n" #~ "在大幅傾斜或曲面的模型中,特別是當使用過低的稀疏填充密度時,這可能會導致支" #~ "撐不夠的實心填充翹曲,進而造成瑕疵。\n" #~ "\n" -#~ "禁用此選項將在稍微未支撐的內部實心填充區列印內部橋接層。以下選項控制篩選的" -#~ "程度(創建內部橋接的數量)。\n" +#~ "停用此選項將在稍微未支撐的內部實心填充區列印內部橋接層。以下選項控制篩選的" +#~ "程度(建立內部橋接的數量)。\n" #~ "\n" #~ "篩選 - 啟用此選項。這是預設行為,並且在大多數情況下運作良好。\n" #~ "\n" -#~ "有限篩選 - 僅在大幅傾斜的表面上創建內部橋接。這對大多數困難模型來說效果良" +#~ "有限篩選 - 僅在大幅傾斜的表面上建立內部橋接。這對大多數困難模型來說效果良" #~ "好。\n" #~ "\n" -#~ "不篩選 - 在每個可能的內部懸空處創建內部橋接。這個選項對於大幅傾斜的頂部表" -#~ "面模型很有用。然而,在大多數情況下,它會創建過多不必要的橋接。" +#~ "不篩選 - 在每個可能的內部懸空處建立內部橋接。這個選項對於大幅傾斜的頂部表" +#~ "面模型很有用。然而,在大多數情況下,它會建立過多不必要的橋接。" #~ msgid "" #~ "This fan speed is enforced during all support interfaces, to be able to " @@ -17322,10 +17323,10 @@ msgstr "" #~ "\n" #~ "Allowed values: 1-5" #~ msgstr "" -#~ "較低的數值會讓擠出量的變化更平滑,但會導致 gcode 文件變得更大,列印設備需" +#~ "較低的數值會讓擠出量的變化更平滑,但會導致 gcode 檔案變得更大,列印設備需" #~ "要處理更多指令。\n" #~ "\n" -#~ "預設值為 3,適合大多數情況。如果你的列印設備有卡頓問題,可以調高這個數值," +#~ "預設值為 3,適合大多數情況。如果您的列印設備有卡頓問題,可以調高這個數值," #~ "減少調整次數\n" #~ "\n" #~ "可用範圍:1-5" @@ -17335,8 +17336,8 @@ msgstr "" #~ "normal(manual) or tree(manual) is selected, only support enforcers are " #~ "generated" #~ msgstr "" -#~ "選擇『普通(自動)』或『樹狀(自動)』時,會自動生成支撐結構。若選擇『普通" -#~ "(手動)』或『樹狀(手動)』,則僅生成支撐強化部分" +#~ "選擇『普通(自動)』或『樹狀(自動)』時,會自動產生支撐結構。若選擇『普通" +#~ "(手動)』或『樹狀(手動)』,則僅產生支撐強化部分" #~ msgid ", ver: " #~ msgstr ",版本" diff --git a/resources/images/im_code.svg b/resources/images/im_code.svg new file mode 100644 index 0000000000..6af2404040 --- /dev/null +++ b/resources/images/im_code.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/images/im_fold.svg b/resources/images/im_fold.svg index f4f3286dd4..9bd106e0d7 100644 --- a/resources/images/im_fold.svg +++ b/resources/images/im_fold.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/resources/images/im_hidden.svg b/resources/images/im_hidden.svg new file mode 100644 index 0000000000..4393cc3b11 --- /dev/null +++ b/resources/images/im_hidden.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/images/im_unfold.svg b/resources/images/im_unfold.svg index 45bcec6fbb..1d59d9cc41 100644 --- a/resources/images/im_unfold.svg +++ b/resources/images/im_unfold.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/resources/images/im_visible.svg b/resources/images/im_visible.svg new file mode 100644 index 0000000000..6c8c53b18a --- /dev/null +++ b/resources/images/im_visible.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/images/toolbar_reset_zero.svg b/resources/images/toolbar_reset_zero.svg new file mode 100644 index 0000000000..35c7469ab6 --- /dev/null +++ b/resources/images/toolbar_reset_zero.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/resources/images/toolbar_reset_zero_hover.svg b/resources/images/toolbar_reset_zero_hover.svg new file mode 100644 index 0000000000..b2b03a214f --- /dev/null +++ b/resources/images/toolbar_reset_zero_hover.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/profiles/BBL.json b/resources/profiles/BBL.json index 6ea28a67a2..cbc502fe7e 100644 --- a/resources/profiles/BBL.json +++ b/resources/profiles/BBL.json @@ -1,7 +1,7 @@ { "name": "Bambulab", "url": "http://www.bambulab.com/Parameters/vendor/BBL.json", - "version": "01.10.00.35", + "version": "01.10.00.36", "force_update": "0", "description": "the initial version of BBL configurations", "machine_model_list": [ diff --git a/resources/profiles/BBL/filament/Generic SBS @base.json b/resources/profiles/BBL/filament/Generic SBS @base.json index dffe348812..32c6a1f9c1 100644 --- a/resources/profiles/BBL/filament/Generic SBS @base.json +++ b/resources/profiles/BBL/filament/Generic SBS @base.json @@ -3,7 +3,7 @@ "name": "Generic SBS @base", "inherits": "fdm_filament_sbs", "from": "system", - "filament_id": "GFL99", + "filament_id": "GFLSBS99", "instantiation": "false", "filament_flow_ratio": [ "0.98" diff --git a/resources/profiles/BBL/filament/Generic SBS.json b/resources/profiles/BBL/filament/Generic SBS.json index 4309d0407a..539626eb81 100644 --- a/resources/profiles/BBL/filament/Generic SBS.json +++ b/resources/profiles/BBL/filament/Generic SBS.json @@ -3,7 +3,8 @@ "name": "Generic SBS", "inherits": "Generic SBS @base", "from": "system", - "setting_id": "GFSL99", + "setting_id": "BFLSBS99-1", + "filament_id": "BFLSBS99", "instantiation": "true", "compatible_printers": [ "Bambu Lab X1 Carbon 0.4 nozzle", diff --git a/resources/profiles/Creality/machine/Creality Hi 0.4 nozzle.json b/resources/profiles/Creality/machine/Creality Hi 0.4 nozzle.json index bbe1418e70..4ba8421d58 100644 --- a/resources/profiles/Creality/machine/Creality Hi 0.4 nozzle.json +++ b/resources/profiles/Creality/machine/Creality Hi 0.4 nozzle.json @@ -131,6 +131,7 @@ "2" ], "single_extruder_multi_material": "1", + "machine_load_filament_time": "105", "machine_pause_gcode": "PAUSE", "change_filament_gcode": "G2 Z{z_after_toolchange + 0.4} I0.86 J0.86 P1 F10000 ; spiral lift a little from second lift\nG1 X260 Y180 F30000\nG1 Z{z_after_toolchange} F600", "default_filament_profile": [ diff --git a/resources/profiles/Creality/machine/Creality Hi 0.6 nozzle.json b/resources/profiles/Creality/machine/Creality Hi 0.6 nozzle.json index 4540512e8d..734583b9d0 100644 --- a/resources/profiles/Creality/machine/Creality Hi 0.6 nozzle.json +++ b/resources/profiles/Creality/machine/Creality Hi 0.6 nozzle.json @@ -131,6 +131,7 @@ "2" ], "single_extruder_multi_material": "1", + "machine_load_filament_time": "105", "machine_pause_gcode": "PAUSE", "change_filament_gcode": "G2 Z{z_after_toolchange + 0.4} I0.86 J0.86 P1 F10000 ; spiral lift a little from second lift\nG1 X260 Y180 F30000\nG1 Z{z_after_toolchange} F600", "default_filament_profile": [ diff --git a/resources/profiles/MagicMaker/machine/MM BoneKing 0.4 nozzle.json b/resources/profiles/MagicMaker/machine/MM BoneKing 0.4 nozzle.json index 7315b9924d..2f832482d0 100644 --- a/resources/profiles/MagicMaker/machine/MM BoneKing 0.4 nozzle.json +++ b/resources/profiles/MagicMaker/machine/MM BoneKing 0.4 nozzle.json @@ -40,12 +40,6 @@ "extruder_clearance_height_to_lid": "100", "extruder_clearance_height_to_rod": "32", "extruder_clearance_radius": "50", - "machine_end_gcode": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nG1 E3 F300\nG1 E-10 F9000\nM84 ;steppers off\nG90 ;absolute positioning\nM107 ; turn off fan\nPRINT_END", - "machine_max_speed_e": [ - "60", - "120" - ], - "machine_start_gcode": "M190 S[bed_temperature_initial_layer_single]\nM109 S[nozzle_temperature_initial_layer]\nPRINT_START EXTRUDER=[nozzle_temperature_initial_layer] BED=[bed_temperature_initial_layer_single]\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 ;Home\nG1 Z1 F9000 ;move the platform to 15mm\nG92 E0\nG1 F500 E10\nG0 X0 Y0\nG92 E0 ;zero the extruded length\nG1 F1000 Y100 E20\nG92 E0 ;zero the extruded length again\nG1 F9000\nM117 Printing...", "min_layer_height": [ "0.05" ], @@ -72,27 +66,15 @@ "deretraction_speed": [ "30" ], - "machine_max_speed_x": [ - "500", - "500" - ], - "machine_max_speed_y": [ - "500", - "500" - ], "retraction_length": [ "1" ], "retraction_speed": [ "30" - ], - "z_hop_types": [ - "Spiral Lift" ], "default_filament_profile": [ - "Generic PLA @System" + "MM Generic PLA" ], - "is_custom_defined": "0", "machine_max_acceleration_e": [ "10000" ], @@ -117,14 +99,14 @@ "0.4" ], "machine_max_speed_z": [ - "10", + "12", "12" ], "printable_area": [ "0x0", "310x0", - "310x310", - "0x310" + "310x306", + "0x306" ], "thumbnails": [ "310x310" @@ -132,5 +114,23 @@ "z_hop": [ "0.2" ], - "version": "2.0.0.0" -} \ No newline at end of file + "is_custom_defined": "0", + "machine_end_gcode": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nM83\nG1 E-1 F1200 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+1 F300 \nG90 ;absolute positioning\nG1 X100 Y0 F6000\nG1 E-4 F1200\nM84 ;steppers off\nM107 ; turn off fan\nPRINT_END", + "machine_max_speed_e": [ + "100", + "120" + ], + "machine_max_speed_x": [ + "1000", + "500" + ], + "machine_max_speed_y": [ + "1000", + "500" + ], + "machine_start_gcode": "G0 Z3 F300\nM190 S[bed_temperature_initial_layer_single]\nM109 S[nozzle_temperature_initial_layer]\nPRINT_START EXTRUDER=[nozzle_temperature_initial_layer] BED=[bed_temperature_initial_layer_single]\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 ;Home\nG0 Z5 F300\nG1 X0 Y100 F6000\nG92 E0\nG0 Z0.5 F300\nG1 F1000 Y0 E15\nG1 F1000 X100 E25\nG92 E0 ;zero the extruded length again\nG1 F9000\nM117 Printing...", + "version": "2.1.0.1", + "z_hop_types": [ + "Slope Lift" + ] +} diff --git a/resources/profiles/MagicMaker/machine/MM hj SK 0.4 nozzle.json b/resources/profiles/MagicMaker/machine/MM hj SK 0.4 nozzle.json index 45d8bbdcc7..7837dcc7d9 100644 --- a/resources/profiles/MagicMaker/machine/MM hj SK 0.4 nozzle.json +++ b/resources/profiles/MagicMaker/machine/MM hj SK 0.4 nozzle.json @@ -11,7 +11,6 @@ "0.4" ], "gcode_flavor": "klipper", - "is_custom_defined": "0", "machine_pause_gcode": "PAUSE", "printable_area": [ "0x0", @@ -51,7 +50,6 @@ "extruder_clearance_height_to_lid": "100", "extruder_clearance_height_to_rod": "32", "extruder_clearance_radius": "50", - "machine_end_gcode": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nG1 E3 F300\nG1 E-10 F9000\nM84 ;steppers off\nG90 ;absolute positioning\nM107 ; turn off fan\nPRINT_END", "machine_max_acceleration_e": [ "6000" ], @@ -59,7 +57,6 @@ "60", "120" ], - "machine_start_gcode": "M190 S[bed_temperature_initial_layer_single]\nM109 S[nozzle_temperature_initial_layer]\nPRINT_START EXTRUDER=[nozzle_temperature_initial_layer] BED=[bed_temperature_initial_layer_single]\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 ;Home\nG1 Z1 F9000 ;move the platform to 15mm\nG92 E0\nG1 F500 E10\nG0 X0 Y0\nG92 E0 ;zero the extruded length\nG1 F1000 Y100 E20\nG92 E0 ;zero the extruded length again\nG1 F9000\nM117 Printing...", "min_layer_height": [ "0.05" ], @@ -127,12 +124,15 @@ ], "z_hop": [ "0.4" - ], - "z_hop_types": [ - "Spiral Lift" ], "default_filament_profile": [ "Generic PLA @System" ], - "version": "2.0.0.0" -} \ No newline at end of file + "is_custom_defined": "0", + "machine_end_gcode": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nM83\nG1 E-1 F1200 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+1 F300 \nG90 ;absolute positioning\nG1 X100 Y0 F6000\nG1 E-4 F1200\nM84 ;steppers off\nM107 ; turn off fan\nPRINT_END", + "machine_start_gcode": "G0 Z3 F300\nG90 ;absolute positioning\n;GZBC\n;G28 ;Home\nM190 S[bed_temperature_initial_layer_single]\nM104 S[nozzle_temperature_initial_layer]\n;BED_MESH_CLEAR ;touch\n;BLTOUCH_DEBUG COMMAND=reset ;touch\n;BED_MESH_CALIBRATE ;touch\n;BED_MESH_CALIBRATE METHOD=scan SCAN_MODE=rapid ;eddy\n;G1 Z5 F300;TB\n;G1 X0 Y0 ;TB\nM109 S[nozzle_temperature_initial_layer]\nPRINT_START EXTRUDER=[nozzle_temperature_initial_layer] BED=[bed_temperature_initial_layer_single]\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28;Home\nG0 Z5 F300\nG1 X0 Y100 F6000\nG92 E0\nG0 Z0.5 F300\nG1 F1000 Y0 E15\nG1 F1000 X100 E25\nG92 E0 ;zero the extruded length again\nG1 F9000\nM117 Printing...", + "version": "2.1.0.1", + "z_hop_types": [ + "Slope Lift" + ] +} diff --git a/resources/profiles/MagicMaker/machine/MM hqs SF 0.4 nozzle.json b/resources/profiles/MagicMaker/machine/MM hqs SF 0.4 nozzle.json index 299b558df7..49adbb7c8b 100644 --- a/resources/profiles/MagicMaker/machine/MM hqs SF 0.4 nozzle.json +++ b/resources/profiles/MagicMaker/machine/MM hqs SF 0.4 nozzle.json @@ -48,7 +48,6 @@ "extruder_clearance_height_to_lid": "100", "extruder_clearance_height_to_rod": "32", "extruder_clearance_radius": "50", - "machine_end_gcode": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nG1 E3 F300\nG1 E-10 F9000\nM84 ;steppers off\nG90 ;absolute positioning\nM107 ; turn off fan\nPRINT_END", "machine_max_acceleration_e": [ "6000" ], @@ -57,7 +56,6 @@ "120" ], "machine_pause_gcode": "M601", - "machine_start_gcode": "M190 S[bed_temperature_initial_layer_single]\nM109 S[nozzle_temperature_initial_layer]\nPRINT_START EXTRUDER=[nozzle_temperature_initial_layer] BED=[bed_temperature_initial_layer_single]\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 ;Home\nG1 Z1 F9000 ;move the platform to 15mm\nG92 E0\nG1 F500 E10\nG0 X0 Y0\nG92 E0 ;zero the extruded length\nG1 F1000 Y100 E20\nG92 E0 ;zero the extruded length again\nG1 F9000\nM117 Printing...", "min_layer_height": [ "0.05" ], @@ -89,7 +87,6 @@ "deretraction_speed": [ "30" ], - "is_custom_defined": "0", "machine_max_acceleration_extruding": [ "5000", "1500" @@ -98,14 +95,6 @@ "5000", "1500" ], - "machine_max_acceleration_x": [ - "20000", - "3000" - ], - "machine_max_acceleration_y": [ - "20000", - "3000" - ], "machine_max_jerk_z": [ "2", "0.4" @@ -126,12 +115,24 @@ ], "z_hop": [ "0.4" - ], - "z_hop_types": [ - "Spiral Lift" ], "default_filament_profile": [ "Generic PLA @System" ], - "version": "2.0.0.0" -} \ No newline at end of file + "gcode_flavor": "marlin2", + "is_custom_defined": "0", + "machine_end_gcode": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nM83\nG1 E-1 F1200 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+1 F300 \nG90 ;absolute positioning\nG1 X100 Y0 F6000\nG1 E-4 F1200\nM84 ;steppers off\nM107 ; turn off fan\nPRINT_END", + "machine_max_acceleration_x": [ + "10000", + "3000" + ], + "machine_max_acceleration_y": [ + "10000", + "3000" + ], + "machine_start_gcode": "G0 Z3 F300\nM190 S[bed_temperature_initial_layer_single]\nM109 S[nozzle_temperature_initial_layer]\nPRINT_START EXTRUDER=[nozzle_temperature_initial_layer] BED=[bed_temperature_initial_layer_single]\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 ;Home\n ;G29\nG0 Z5 F300\nG1 X0 Y100 F6000\nG92 E0\nG0 Z0.5 F300\nG1 F1000 Y0 E15\nG1 F1000 X100 E25\nG92 E0 ;zero the extruded length again\nG1 F9000\nM117 Printing...", + "version": "2.1.0.1", + "z_hop_types": [ + "Slope Lift" + ] +} diff --git a/resources/profiles/MagicMaker/machine/MM hqs hj 0.4 nozzle.json b/resources/profiles/MagicMaker/machine/MM hqs hj 0.4 nozzle.json index c968ba6b44..35f3510ce0 100644 --- a/resources/profiles/MagicMaker/machine/MM hqs hj 0.4 nozzle.json +++ b/resources/profiles/MagicMaker/machine/MM hqs hj 0.4 nozzle.json @@ -59,8 +59,6 @@ "extruder_clearance_height_to_lid": "100", "extruder_clearance_height_to_rod": "32", "extruder_clearance_radius": "50", - "is_custom_defined": "0", - "machine_end_gcode": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nG1 E3 F300\nG1 E-10 F9000\nM84 ;steppers off\nG90 ;absolute positioning\nM107 ; turn off fan\nPRINT_END", "machine_max_acceleration_e": [ "6000" ], @@ -77,7 +75,6 @@ "500" ], "machine_pause_gcode": "M601", - "machine_start_gcode": "M190 S[bed_temperature_initial_layer_single]\nM109 S[nozzle_temperature_initial_layer]\nPRINT_START EXTRUDER=[nozzle_temperature_initial_layer] BED=[bed_temperature_initial_layer_single]\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 ;Home\nG1 Z1 F9000 ;move the platform to 15mm\nG92 E0\nG1 F500 E10\nG0 X0 Y0\nG92 E0 ;zero the extruded length\nG1 F1000 Y100 E20\nG92 E0 ;zero the extruded length again\nG1 F9000\nM117 Printing...", "min_layer_height": [ "0.05" ], @@ -119,11 +116,20 @@ "0.2", "0.4" ], + "z_hop": [ + "0.2" + ], "thumbnails": [ "220x220" ], "default_filament_profile": [ "Generic PLA @System" ], - "version": "2.0.0.0" -} \ No newline at end of file + "z_hop_types": [ + "Slope Lift" + ], + "is_custom_defined": "0", + "machine_end_gcode": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nM83\nG1 E-1 F1200 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+1 F300 \nG90 ;absolute positioning\nG1 X100 Y0 F6000\nG1 E-4 F1200\nM84 ;steppers off\nM107 ; turn off fan\nPRINT_END", + "machine_start_gcode": "G0 Z3 F300\nM190 S[bed_temperature_initial_layer_single]\nM109 S[nozzle_temperature_initial_layer]\nPRINT_START EXTRUDER=[nozzle_temperature_initial_layer] BED=[bed_temperature_initial_layer_single]\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 ;Home\n ;G29\nG0 Z5 F300\nG1 X0 Y100 F6000\nG92 E0\nG0 Z0.5 F300\nG1 F1000 Y0 E15\nG1 F1000 X100 E25\nG92 E0 ;zero the extruded length again\nG1 F9000\nM117 Printing...", + "version": "2.1.0.1" +} diff --git a/resources/profiles/MagicMaker/machine/MM slb 0.4 nozzle.json b/resources/profiles/MagicMaker/machine/MM slb 0.4 nozzle.json index e6b4d0377f..0a44f1e2e3 100644 --- a/resources/profiles/MagicMaker/machine/MM slb 0.4 nozzle.json +++ b/resources/profiles/MagicMaker/machine/MM slb 0.4 nozzle.json @@ -10,18 +10,25 @@ "nozzle_diameter": [ "0.4" ], + "printable_area": [ + "0x0", + "125x0", + "125x125", + "0x125" + ], + "printable_height": "160", "auxiliary_fan": "0", "machine_max_acceleration_travel": [ "3000", "3000" ], "machine_max_acceleration_z": [ - "500", - "500" + "100", + "100" ], "machine_max_speed_z": [ - "12", - "12" + "5", + "5" ], "max_layer_height": [ "0.3" @@ -30,26 +37,28 @@ "retract_before_wipe": [ "70%" ], + "wipe_distance": [ + "1" + ], "single_extruder_multi_material": "1", "change_filament_gcode": "", "scan_first_layer": "0", "cooling_tube_length": "20", "cooling_tube_retraction": "60", - "deretraction_speed": [ - "25" - ], "extruder_clearance_height_to_lid": "100", "extruder_clearance_height_to_rod": "32", "extruder_clearance_radius": "50", - "machine_max_jerk_e": [ - "5", - "2.5" + "machine_max_acceleration_e": [ + "4000" ], "machine_max_speed_e": [ "60", "120" ], "machine_pause_gcode": "M601", + "min_layer_height": [ + "0.1" + ], "nozzle_type": "brass", "parking_pos_retraction": "22", "retract_length_toolchange": [ @@ -58,32 +67,9 @@ "retraction_minimum_travel": [ "1" ], - "retraction_speed": [ - "25" - ], - "default_filament_profile": [ - "Generic PLA @System" - ], - "is_custom_defined": "0", - "machine_end_gcode": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG28 X0\nG0 Y120\nG1 E-10 F9000\nM84 ;steppers off\nG90 ;absolute positioning\nPRINT_END", - "machine_max_acceleration_e": [ - "4000" - ], - "machine_max_acceleration_extruding": [ - "2000", - "1500" - ], - "machine_max_acceleration_retracting": [ - "2000", - "1500" - ], - "machine_max_acceleration_x": [ - "2000", - "3000" - ], - "machine_max_acceleration_y": [ - "2000", - "3000" + "machine_max_jerk_e": [ + "2.5", + "2.5" ], "machine_max_jerk_x": [ "9", @@ -93,8 +79,22 @@ "9", "20" ], + "thumbnails": [ + "125x125" + ], + "deretraction_speed": [ + "25" + ], + "machine_max_acceleration_extruding": [ + "2000", + "1500" + ], + "machine_max_acceleration_retracting": [ + "2000", + "1500" + ], "machine_max_jerk_z": [ - "0.2", + "2", "0.4" ], "machine_max_speed_x": [ @@ -105,25 +105,32 @@ "200", "500" ], - "machine_start_gcode": "M190 S[bed_temperature_initial_layer_single]\nM109 S[nozzle_temperature_initial_layer]\nPRINT_START EXTRUDER=[nozzle_temperature_initial_layer] BED=[bed_temperature_initial_layer_single]\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 ;Home\nG0 Z1\nG0 X0 Y0\nG92 E0\nG0 Z0.5\nG1 F1000 Y100 E20\nG92 E0\nM117 Printing...", - "min_layer_height": [ - "0.1" - ], - "printable_area": [ - "0x0", - "125x0", - "125x125", - "0x125" - ], - "printable_height": "160", "retraction_length": [ "2" ], - "thumbnails": [ - "120x120" + "retraction_speed": [ + "25" ], - "wipe_distance": [ - "1" + "z_hop": [ + "0.4" ], - "version": "2.0.0.0" -} \ No newline at end of file + "default_filament_profile": [ + "Generic PLA @System" + + ], + "is_custom_defined": "0", + "machine_max_acceleration_x": [ + "2000", + "3000" + ], + "machine_max_acceleration_y": [ + "2000", + "3000" + ], + "machine_start_gcode": "G0 Z3 F300\nM190 S[bed_temperature_initial_layer_single]\nM109 S[nozzle_temperature_initial_layer]\nPRINT_START EXTRUDER=[nozzle_temperature_initial_layer] BED=[bed_temperature_initial_layer_single]\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 ;Home\n;G29\nG0 Z5 F300\nG1 X0 Y50 F6000\nG92 E0\nG0 Z0.5 F300\nG1 F1000 Y0 E10\nG1 F1000 X50 E18\nG92 E0\nM117 Printing...", + "machine_end_gcode": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 \nM83\nG1 E-1 F600 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z1 F600\nG90 ;absolute positioning\nG1 X0 Y120 F6000\nG1 E-4 F1200\nM107 ; turn off fan\nM84 ;steppers off\nPRINT_END", + "version": "2.1.0.1", + "z_hop_types": [ + "Slope Lift" + ] +} diff --git a/resources/profiles/OrcaFilamentLibrary.json b/resources/profiles/OrcaFilamentLibrary.json index e718a2aa59..982830b0ec 100644 --- a/resources/profiles/OrcaFilamentLibrary.json +++ b/resources/profiles/OrcaFilamentLibrary.json @@ -1,6 +1,6 @@ { "name": "OrcaFilamentLibrary", - "version": "02.03.00.03", + "version": "02.03.00.04", "force_update": "0", "description": "Orca Filament Library", "filament_list": [ diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu ABS @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu ABS @base.json index f5d8680b06..c50fefb856 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu ABS @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu ABS @base.json @@ -3,7 +3,7 @@ "name": "Bambu ABS @base", "inherits": "fdm_filament_abs", "from": "system", - "filament_id": "GFB00", + "filament_id": "OGFB00", "instantiation": "false", "description": "When printing this filament, there's a risk of warping and low layer adhesion strength. To get better results, please refer to this wiki: Printing Tips for High Temp / Engineering materials.", "filament_cost": [ diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu ABS-GF @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu ABS-GF @base.json index a67aa45465..b8d164ad0b 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu ABS-GF @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu ABS-GF @base.json @@ -3,7 +3,7 @@ "name": "Bambu ABS-GF @base", "inherits": "fdm_filament_abs", "from": "system", - "filament_id": "GFB50", + "filament_id": "OGFB50", "instantiation": "false", "description": "When printing this filament, there's a risk of nozzle clogging, oozing, warping and low layer adhesion strength. To get better results, please refer to this wiki: Printing Tips for High Temp / Engineering materials.", "fan_cooling_layer_time": [ diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu ASA @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu ASA @base.json index 322bb3514c..2fffc05539 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu ASA @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu ASA @base.json @@ -3,7 +3,7 @@ "name": "Bambu ASA @base", "inherits": "fdm_filament_asa", "from": "system", - "filament_id": "GFB01", + "filament_id": "OGFB01", "instantiation": "false", "description": "When printing this filament, there's a risk of warping and low layer adhesion strength. To get better results, please refer to this wiki: Printing Tips for High Temp / Engineering materials.", "eng_plate_temp": [ diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu ASA-Aero @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu ASA-Aero @base.json index 4cfe7de309..407c0960f2 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu ASA-Aero @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu ASA-Aero @base.json @@ -3,7 +3,7 @@ "name": "Bambu ASA-Aero @base", "inherits": "fdm_filament_asa", "from": "system", - "filament_id": "GFB02", + "filament_id": "OGFB02", "instantiation": "false", "description": "This filament is only used to print models with a low density usually, and some special parameters are required. To get better printing quality, please refer to this wiki: ASA Aero Printing Guide.", "fan_cooling_layer_time": [ diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu ASA-CF @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu ASA-CF @base.json index d8c3c0ffce..1f369bd71e 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu ASA-CF @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu ASA-CF @base.json @@ -3,7 +3,7 @@ "name": "Bambu ASA-CF @base", "inherits": "fdm_filament_asa", "from": "system", - "filament_id": "GFB51", + "filament_id": "OGFB51", "instantiation": "false", "eng_plate_temp": [ "100" diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PA-CF @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PA-CF @base.json index f278ca567b..d24ba4bddb 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PA-CF @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PA-CF @base.json @@ -3,7 +3,7 @@ "name": "Bambu PA-CF @base", "inherits": "fdm_filament_pa", "from": "system", - "filament_id": "GFN03", + "filament_id": "OGFN03", "instantiation": "false", "description": "When printing this filament, there's a risk of nozzle clogging, oozing, warping and low layer adhesion strength. To get better results, please refer to this wiki: Printing Tips for High Temp / Engineering materials.", "filament_cost": [ diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PA6-CF @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PA6-CF @base.json index 7df1f06e4a..e48197c190 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PA6-CF @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PA6-CF @base.json @@ -3,7 +3,7 @@ "name": "Bambu PA6-CF @base", "inherits": "fdm_filament_pa", "from": "system", - "filament_id": "GFN05", + "filament_id": "OGFN05", "instantiation": "false", "description": "When printing this filament, there's a risk of nozzle clogging, oozing, warping and low layer adhesion strength. To get better results, please refer to this wiki: Printing Tips for High Temp / Engineering materials.", "fan_cooling_layer_time": [ diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PA6-GF @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PA6-GF @base.json index e2246b0cab..998709bb31 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PA6-GF @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PA6-GF @base.json @@ -3,7 +3,7 @@ "name": "Bambu PA6-GF @base", "inherits": "fdm_filament_pa", "from": "system", - "filament_id": "GFN08", + "filament_id": "OGFN08", "instantiation": "false", "description": "When printing this filament, there's a risk of nozzle clogging, oozing, warping and low layer adhesion strength. To get better results, please refer to this wiki: Printing Tips for High Temp / Engineering materials.", "fan_cooling_layer_time": [ diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PAHT-CF @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PAHT-CF @base.json index 17ef39575f..7b9521d064 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PAHT-CF @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PAHT-CF @base.json @@ -3,7 +3,7 @@ "name": "Bambu PAHT-CF @base", "inherits": "fdm_filament_pa", "from": "system", - "filament_id": "GFN04", + "filament_id": "OGFN04", "instantiation": "false", "description": "When printing this filament, there's a risk of nozzle clogging, oozing, warping and low layer adhesion strength. To get better results, please refer to this wiki: Printing Tips for High Temp / Engineering materials.", "fan_cooling_layer_time": [ diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PC @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PC @base.json index 001f7c94d7..8523dfb27a 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PC @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PC @base.json @@ -3,7 +3,7 @@ "name": "Bambu PC @base", "inherits": "fdm_filament_pc", "from": "system", - "filament_id": "GFC00", + "filament_id": "OGFC00", "instantiation": "false", "filament_vendor": [ "Bambu Lab" diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PC FR @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PC FR @base.json index c01a0dfe0d..771f914e96 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PC FR @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PC FR @base.json @@ -3,7 +3,7 @@ "name": "Bambu PC FR @base", "inherits": "fdm_filament_pc", "from": "system", - "filament_id": "GFC01", + "filament_id": "OGFC01", "instantiation": "false", "filament_cost": [ "0" diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PET-CF @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PET-CF @base.json index 86f36ecab1..23334321d7 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PET-CF @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PET-CF @base.json @@ -3,7 +3,7 @@ "name": "Bambu PET-CF @base", "inherits": "fdm_filament_pet", "from": "system", - "filament_id": "GFT01", + "filament_id": "OGFT01", "instantiation": "false", "description": "When printing this filament, there's a risk of nozzle clogging, oozing, warping and low layer adhesion strength. To get better results, please refer to this wiki: Printing Tips for High Temp / Engineering materials.", "cool_plate_temp": [ diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PETG Basic @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PETG Basic @base.json index 07f806457b..e9703ccd64 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PETG Basic @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PETG Basic @base.json @@ -3,7 +3,7 @@ "name": "Bambu PETG Basic @base", "inherits": "fdm_filament_pet", "from": "system", - "filament_id": "GFG00", + "filament_id": "OGFG00", "instantiation": "false", "description": "To get better transparent or translucent results with the corresponding filament, please refer to this wiki: Printing tips for transparent PETG.", "cool_plate_temp": [ diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PETG HF @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PETG HF @base.json index dc50f6b886..40ddd215e2 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PETG HF @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PETG HF @base.json @@ -3,7 +3,7 @@ "name": "Bambu PETG HF @base", "inherits": "fdm_filament_pet", "from": "system", - "filament_id": "GFG02", + "filament_id": "OGFG02", "instantiation": "false", "cool_plate_temp": [ "0" diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PETG Translucent @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PETG Translucent @base.json index 1582cd8d4a..170b4897f6 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PETG Translucent @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PETG Translucent @base.json @@ -3,7 +3,7 @@ "name": "Bambu PETG Translucent @base", "inherits": "fdm_filament_pet", "from": "system", - "filament_id": "GFG01", + "filament_id": "OGFG01", "instantiation": "false", "description": "To get better transparent or translucent results with the corresponding filament, please refer to this wiki: Printing tips for transparent PETG.", "cool_plate_temp": [ diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PETG-CF @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PETG-CF @base.json index 89eccb7c52..37e45c1161 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PETG-CF @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PETG-CF @base.json @@ -3,7 +3,7 @@ "name": "Bambu PETG-CF @base", "inherits": "fdm_filament_pet", "from": "system", - "filament_id": "GFG50", + "filament_id": "OGFG50", "instantiation": "false", "cool_plate_temp": [ "0" diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Aero @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Aero @base.json index a53ae18186..d5b7b0d2b6 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Aero @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Aero @base.json @@ -3,7 +3,7 @@ "name": "Bambu PLA Aero @base", "inherits": "fdm_filament_pla", "from": "system", - "filament_id": "GFA11", + "filament_id": "OGFA11", "instantiation": "false", "description": "This filament is only used to print models with a low density usually, and some special parameters are required. To get better printing quality, please refer to this wiki: Instructions for printing RC model with foaming PLA (PLA Aero).", "fan_min_speed": [ diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Basic @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Basic @base.json index 5e584c7980..370575adec 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Basic @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Basic @base.json @@ -3,7 +3,7 @@ "name": "Bambu PLA Basic @base", "inherits": "fdm_filament_pla", "from": "system", - "filament_id": "GFA00", + "filament_id": "OGFA00", "instantiation": "false", "filament_cost": [ "24.99" diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Dynamic @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Dynamic @base.json index 46b034593c..cee702812c 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Dynamic @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Dynamic @base.json @@ -3,7 +3,7 @@ "name": "Bambu PLA Dynamic @base", "inherits": "fdm_filament_pla", "from": "system", - "filament_id": "GFA13", + "filament_id": "OGFA13", "instantiation": "false", "filament_cost": [ "31.99" diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Galaxy @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Galaxy @base.json index a493400c1a..6695eab188 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Galaxy @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Galaxy @base.json @@ -3,7 +3,7 @@ "name": "Bambu PLA Galaxy @base", "inherits": "fdm_filament_pla", "from": "system", - "filament_id": "GFA15", + "filament_id": "OGFA15", "instantiation": "false", "filament_cost": [ "29.99" diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Glow @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Glow @base.json index 206578285f..4641fdb0a7 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Glow @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Glow @base.json @@ -3,7 +3,7 @@ "name": "Bambu PLA Glow @base", "inherits": "fdm_filament_pla", "from": "system", - "filament_id": "GFA12", + "filament_id": "OGFA12", "instantiation": "false", "filament_cost": [ "29.99" diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Impact @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Impact @base.json index f56887abff..031ee90bcf 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Impact @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Impact @base.json @@ -3,7 +3,7 @@ "name": "Bambu PLA Impact @base", "inherits": "fdm_filament_pla", "from": "system", - "filament_id": "GFA03", + "filament_id": "OGFA03", "instantiation": "false", "filament_cost": [ "25.4" diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Marble @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Marble @base.json index a34253171b..081b57b5af 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Marble @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Marble @base.json @@ -3,7 +3,7 @@ "name": "Bambu PLA Marble @base", "inherits": "fdm_filament_pla", "from": "system", - "filament_id": "GFA07", + "filament_id": "OGFA07", "instantiation": "false", "filament_cost": [ "29.99" diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Matte @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Matte @base.json index 700253f841..d5afe93c8e 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Matte @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Matte @base.json @@ -3,7 +3,7 @@ "name": "Bambu PLA Matte @base", "inherits": "fdm_filament_pla", "from": "system", - "filament_id": "GFA01", + "filament_id": "OGFA01", "instantiation": "false", "filament_cost": [ "24.99" diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Metal @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Metal @base.json index d2edaf4bd3..fd5c853a8f 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Metal @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Metal @base.json @@ -3,7 +3,7 @@ "name": "Bambu PLA Metal @base", "inherits": "fdm_filament_pla", "from": "system", - "filament_id": "GFA02", + "filament_id": "OGFA02", "instantiation": "false", "description": "To make the prints get higher gloss, please dry the filament before use, and set the outer wall speed to be 40 to 60 mm/s when slicing.", "filament_cost": [ diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Silk @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Silk @base.json index 40b486e812..1883fb3d7f 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Silk @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Silk @base.json @@ -3,7 +3,7 @@ "name": "Bambu PLA Silk @base", "inherits": "fdm_filament_pla", "from": "system", - "filament_id": "GFA05", + "filament_id": "OGFA05", "instantiation": "false", "description": "To make the prints get higher gloss, please dry the filament before use, and set the outer wall speed to be 40 to 60 mm/s when slicing.", "filament_cost": [ diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Silk+ @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Silk+ @base.json index 550061b0bc..89be4fef11 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Silk+ @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Silk+ @base.json @@ -3,7 +3,7 @@ "name": "Bambu PLA Silk+ @base", "inherits": "fdm_filament_pla", "from": "system", - "filament_id": "GFA06", + "filament_id": "OGFA06", "instantiation": "false", "description": "To make the prints get higher gloss, please dry the filament before use, and set the outer wall speed to be 40 to 60 mm/s when slicing.", "filament_cost": [ diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Sparkle @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Sparkle @base.json index 02bddb8948..44807890e7 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Sparkle @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Sparkle @base.json @@ -3,7 +3,7 @@ "name": "Bambu PLA Sparkle @base", "inherits": "fdm_filament_pla", "from": "system", - "filament_id": "GFA08", + "filament_id": "OGFA08", "instantiation": "false", "filament_cost": [ "29.99" diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Tough @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Tough @base.json index 489843c50b..750b8d9a63 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Tough @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Tough @base.json @@ -3,7 +3,7 @@ "name": "Bambu PLA Tough @base", "inherits": "fdm_filament_pla", "from": "system", - "filament_id": "GFA09", + "filament_id": "OGFA09", "instantiation": "false", "filament_cost": [ "28.99" diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Wood @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Wood @base.json index 45015187b3..5ba1c5b39e 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Wood @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA Wood @base.json @@ -3,7 +3,7 @@ "name": "Bambu PLA Wood @base", "inherits": "fdm_filament_pla", "from": "system", - "filament_id": "GFA16", + "filament_id": "OGFA16", "instantiation": "false", "filament_cost": [ "24.99" diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA-CF @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA-CF @base.json index b16b20ca1d..b3caa3d535 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA-CF @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PLA-CF @base.json @@ -3,7 +3,7 @@ "name": "Bambu PLA-CF @base", "inherits": "fdm_filament_pla", "from": "system", - "filament_id": "GFA50", + "filament_id": "OGFA50", "instantiation": "false", "additional_cooling_fan_speed": [ "0" diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PPA-CF @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PPA-CF @base.json index d94bae666c..7a08929b2c 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PPA-CF @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PPA-CF @base.json @@ -3,7 +3,7 @@ "name": "Bambu PPA-CF @base", "inherits": "fdm_filament_ppa", "from": "system", - "filament_id": "GFN06", + "filament_id": "OGFN06", "instantiation": "false", "filament_vendor": [ "Bambu Lab" diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PPS-CF @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PPS-CF @base.json index cef49fe98d..08ef894d07 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PPS-CF @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PPS-CF @base.json @@ -3,7 +3,7 @@ "name": "Bambu PPS-CF @base", "inherits": "fdm_filament_pps", "from": "system", - "filament_id": "GFT02", + "filament_id": "OGFT02", "instantiation": "false", "description": "When printing this filament, there's a risk of nozzle clogging, oozing, warping and low layer adhesion strength. To get better results, please refer to this wiki: Printing Tips for High Temp / Engineering materials.", "fan_max_speed": [ diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PVA @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PVA @base.json index f9396292cf..8d10a456e9 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PVA @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu PVA @base.json @@ -3,7 +3,7 @@ "name": "Bambu PVA @base", "inherits": "fdm_filament_pva", "from": "system", - "filament_id": "GFS04", + "filament_id": "OGFS04", "instantiation": "false", "description": "This is a water-soluble support filament, and usually it is only for the support structure and not for the model body. Printing this filament is of many requirements, and to get better printing quality, please refer to this wiki: PVA Printing Guide.", "filament_cost": [ diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu Support For PA PET @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu Support For PA PET @base.json index 3166617d72..999167bfef 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu Support For PA PET @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu Support For PA PET @base.json @@ -3,7 +3,7 @@ "name": "Bambu Support For PA/PET @base", "inherits": "fdm_filament_pa", "from": "system", - "filament_id": "GFS03", + "filament_id": "OGFS03", "instantiation": "false", "description": "This is a non-water-soluble support filament, and usually it is only for the support structure and not for the model body. To get better printing quality, please refer to this wiki: Printing Tips for Support Filament and Support Function.", "fan_cooling_layer_time": [ diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu Support For PLA @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu Support For PLA @base.json index 4fda6e0010..38a7c2ee4f 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu Support For PLA @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu Support For PLA @base.json @@ -3,7 +3,7 @@ "name": "Bambu Support For PLA @base", "inherits": "fdm_filament_pla", "from": "system", - "filament_id": "GFS02", + "filament_id": "OGFS02", "instantiation": "false", "description": "This is a non-water-soluble support filament, and usually it is only for the support structure and not for the model body. To get better printing quality, please refer to this wiki: Printing Tips for Support Filament and Support Function.", "cool_plate_temp": [ diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu Support For PLA-PETG @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu Support For PLA-PETG @base.json index 6eae3684bf..3047f0c839 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu Support For PLA-PETG @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu Support For PLA-PETG @base.json @@ -3,7 +3,7 @@ "name": "Bambu Support For PLA/PETG @base", "inherits": "fdm_filament_pla", "from": "system", - "filament_id": "GFS05", + "filament_id": "OGFS05", "instantiation": "false", "description": "This is a non-water-soluble support filament, and usually it is only for the support structure and not for the model body. To get better printing quality, please refer to this wiki: Printing Tips for Support Filament and Support Function.", "fan_cooling_layer_time": [ diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu Support G @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu Support G @base.json index 7a60603cae..1b71a3143a 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu Support G @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu Support G @base.json @@ -3,7 +3,7 @@ "name": "Bambu Support G @base", "inherits": "fdm_filament_pa", "from": "system", - "filament_id": "GFS01", + "filament_id": "OGFS01", "instantiation": "false", "description": "This is a non-water-soluble support filament, and usually it is only for the support structure and not for the model body. To get better printing quality, please refer to this wiki: Printing Tips for Support Filament and Support Function.", "fan_cooling_layer_time": [ diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu Support W @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu Support W @base.json index d94a54812e..e977bb4478 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu Support W @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu Support W @base.json @@ -3,7 +3,7 @@ "name": "Bambu Support W @base", "inherits": "fdm_filament_pla", "from": "system", - "filament_id": "GFS00", + "filament_id": "OGFS00", "instantiation": "false", "description": "This is a non-water-soluble support filament, and usually it is only for the support structure and not for the model body. To get better printing quality, please refer to this wiki: Printing Tips for Support Filament and Support Function.", "cool_plate_temp": [ diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu Support for ABS @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu Support for ABS @base.json index 3bd74d4d96..b37fd9fda9 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu Support for ABS @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu Support for ABS @base.json @@ -3,7 +3,7 @@ "name": "Bambu Support for ABS @base", "inherits": "fdm_filament_abs", "from": "system", - "filament_id": "GFS06", + "filament_id": "OGFS06", "instantiation": "false", "description": "This is a non-water-soluble support filament, and usually it is only for the support structure and not for the model body. To get better printing quality, please refer to this wiki: Printing Tips for Support Filament and Support Function.", "fan_max_speed": [ diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu TPU 95A @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu TPU 95A @base.json index eb0555633a..58703ae3ac 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu TPU 95A @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu TPU 95A @base.json @@ -3,7 +3,7 @@ "name": "Bambu TPU 95A @base", "inherits": "fdm_filament_tpu", "from": "system", - "filament_id": "GFU01", + "filament_id": "OGFU01", "instantiation": "false", "description": "This filament is too soft and not compatible with the AMS. Printing it is of many requirements, and to get better printing quality, please refer to this wiki: TPU printing guide.", "filament_cost": [ diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu TPU 95A HF @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu TPU 95A HF @base.json index 6deab30b35..5920b96f3e 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu TPU 95A HF @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Bambu/Bambu TPU 95A HF @base.json @@ -3,7 +3,7 @@ "name": "Bambu TPU 95A HF @base", "inherits": "fdm_filament_tpu", "from": "system", - "filament_id": "GFU00", + "filament_id": "OGFU00", "instantiation": "false", "description": "This filament is too soft and not compatible with the AMS. Printing it is of many requirements, and to get better printing quality, please refer to this wiki: TPU printing guide.", "filament_cost": [ diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Generic ABS @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Generic ABS @System.json index 518f53a614..5cde090033 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Generic ABS @System.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Generic ABS @System.json @@ -1,6 +1,6 @@ { "type": "filament", - "filament_id": "GFB99", + "filament_id": "OGFB99", "setting_id": "OGFSA04", "name": "Generic ABS @System", "from": "system", diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Generic ASA @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Generic ASA @System.json index 95f34f416a..3b6fab7f40 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Generic ASA @System.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Generic ASA @System.json @@ -1,6 +1,6 @@ { "type": "filament", - "filament_id": "GFB98", + "filament_id": "OGFB98", "setting_id": "OGFSA04", "name": "Generic ASA @System", "from": "system", diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Generic PA @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Generic PA @System.json index 4e28b8d3f4..3152c574dc 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Generic PA @System.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Generic PA @System.json @@ -1,6 +1,6 @@ { "type": "filament", - "filament_id": "GFN99", + "filament_id": "OGFN99", "setting_id": "OGFSA04", "name": "Generic PA @System", "from": "system", diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Generic PA-CF @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Generic PA-CF @System.json index 2f91467a13..c977883759 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Generic PA-CF @System.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Generic PA-CF @System.json @@ -1,6 +1,6 @@ { "type": "filament", - "filament_id": "GFN98", + "filament_id": "OGFN98", "setting_id": "OGFSA04", "name": "Generic PA-CF @System", "from": "system", diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Generic PC @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Generic PC @System.json index 1724ee008c..18ecf1b579 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Generic PC @System.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Generic PC @System.json @@ -1,6 +1,6 @@ { "type": "filament", - "filament_id": "GFC99", + "filament_id": "OGFC99", "setting_id": "OGFSA04", "name": "Generic PC @System", "from": "system", diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Generic PETG @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Generic PETG @System.json index 14fcba533c..9fa002b49e 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Generic PETG @System.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Generic PETG @System.json @@ -1,6 +1,6 @@ { "type": "filament", - "filament_id": "GFG99", + "filament_id": "OGFG99", "setting_id": "OGFSA04", "name": "Generic PETG @System", "from": "system", diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Generic PLA High Speed @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Generic PLA High Speed @System.json index b5ff0b42a8..85a2cf1f18 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Generic PLA High Speed @System.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Generic PLA High Speed @System.json @@ -2,7 +2,7 @@ "type": "filament", "name": "Generic PLA High Speed @System", "inherits": "fdm_filament_pla", - "filament_id": "GFL95", + "filament_id": "OGFL95", "from": "system", "setting_id": "OGFSL95_00", "instantiation": "true", diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Generic PLA-CF @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Generic PLA-CF @System.json index d6bb799618..e1d7a082a1 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Generic PLA-CF @System.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Generic PLA-CF @System.json @@ -1,6 +1,6 @@ { "type": "filament", - "filament_id": "GFL98", + "filament_id": "OGFL98", "setting_id": "OGFSA04", "name": "Generic PLA-CF @System", "from": "system", diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Generic PPA-GF @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Generic PPA-GF @System.json index 57ee34719d..5cadf8fb85 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Generic PPA-GF @System.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Generic PPA-GF @System.json @@ -2,7 +2,7 @@ "type": "filament", "name": "Generic PPA-GF @System", "inherits": "fdm_filament_ppa", - "filament_id": "GFN96", + "filament_id": "OGFN96", "from": "system", "setting_id": "OGFSN96_00", "instantiation": "true", diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Generic PVA @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Generic PVA @System.json index 20b1c491ff..1b9fca7888 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Generic PVA @System.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Generic PVA @System.json @@ -1,6 +1,6 @@ { "type": "filament", - "filament_id": "GFS99", + "filament_id": "OGFS99", "setting_id": "OGFSA04", "name": "Generic PVA @System", "from": "system", diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Generic TPU @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Generic TPU @System.json index 137d30dca6..4cc69180e4 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Generic TPU @System.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Generic TPU @System.json @@ -1,6 +1,6 @@ { "type": "filament", - "filament_id": "GFU99", + "filament_id": "OGFU99", "setting_id": "OGFSA04", "name": "Generic TPU @System", "from": "system", diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Overture/Overture Matte PLA @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Overture/Overture Matte PLA @base.json index 7e9e9a1c0b..430dfee5d9 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Overture/Overture Matte PLA @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Overture/Overture Matte PLA @base.json @@ -3,7 +3,7 @@ "name": "Overture Matte PLA @base", "inherits": "fdm_filament_pla", "from": "system", - "filament_id": "GFL05", + "filament_id": "OGFL05", "instantiation": "false", "filament_cost": [ "24.52" diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Overture/Overture PLA @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Overture/Overture PLA @base.json index 18e711b03c..cf4539628b 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Overture/Overture PLA @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Overture/Overture PLA @base.json @@ -3,7 +3,7 @@ "name": "Overture PLA @base", "inherits": "fdm_filament_pla", "from": "system", - "filament_id": "GFL04", + "filament_id": "OGFL04", "instantiation": "false", "filament_cost": [ "24.15" diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Fiberon PA12-CF @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Fiberon PA12-CF @base.json index e2a5bf6475..38e51a47e1 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Fiberon PA12-CF @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Fiberon PA12-CF @base.json @@ -3,7 +3,7 @@ "name": "Fiberon PA12-CF @base", "inherits": "fdm_filament_pa", "from": "system", - "filament_id": "GFL52", + "filament_id": "OGFL52", "instantiation": "false", "eng_plate_temp": [ "40" diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Fiberon PA6-CF @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Fiberon PA6-CF @base.json index 9d59fba6a8..776ff079ae 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Fiberon PA6-CF @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Fiberon PA6-CF @base.json @@ -3,7 +3,7 @@ "name": "Fiberon PA6-CF @base", "inherits": "fdm_filament_pa", "from": "system", - "filament_id": "GFL50", + "filament_id": "OGFL50", "instantiation": "false", "eng_plate_temp": [ "40" diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Fiberon PA6-GF @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Fiberon PA6-GF @base.json index 9ab9237e7b..9ee8ba6c39 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Fiberon PA6-GF @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Fiberon PA6-GF @base.json @@ -3,7 +3,7 @@ "name": "Fiberon PA6-GF @base", "inherits": "fdm_filament_pa", "from": "system", - "filament_id": "GFL51", + "filament_id": "OGFL51", "instantiation": "false", "eng_plate_temp": [ "40" diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Fiberon PA612-CF @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Fiberon PA612-CF @base.json index f545b1e1fb..76353f3782 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Fiberon PA612-CF @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Fiberon PA612-CF @base.json @@ -3,7 +3,7 @@ "name": "Fiberon PA612-CF @base", "inherits": "fdm_filament_pa", "from": "system", - "filament_id": "GFL53", + "filament_id": "OGFL53", "instantiation": "false", "fan_cooling_layer_time": [ "5" diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Fiberon PET-CF @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Fiberon PET-CF @base.json index 701883fca7..810c1597e8 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Fiberon PET-CF @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Fiberon PET-CF @base.json @@ -3,7 +3,7 @@ "name": "Fiberon PET-CF @base", "inherits": "fdm_filament_pet", "from": "system", - "filament_id": "GFL54", + "filament_id": "OGFL54", "instantiation": "false", "cool_plate_temp": [ "0" diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Fiberon PETG-ESD @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Fiberon PETG-ESD @base.json index 03c777e73a..8ee4a41050 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Fiberon PETG-ESD @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Fiberon PETG-ESD @base.json @@ -3,7 +3,7 @@ "name": "Fiberon PETG-ESD @base", "inherits": "fdm_filament_pet", "from": "system", - "filament_id": "GFL06", + "filament_id": "OGFL06", "instantiation": "false", "cool_plate_temp": [ "0" diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Fiberon PETG-rCF @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Fiberon PETG-rCF @base.json index e039bd5c93..60325d1527 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Fiberon PETG-rCF @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Fiberon PETG-rCF @base.json @@ -3,7 +3,7 @@ "name": "Fiberon PETG-rCF @base", "inherits": "fdm_filament_pet", "from": "system", - "filament_id": "GFL55", + "filament_id": "OGFL55", "instantiation": "false", "cool_plate_temp": [ "0" diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/PolyLite ABS @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/PolyLite ABS @base.json index 539a1d1fc2..0b4963d013 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/PolyLite ABS @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/PolyLite ABS @base.json @@ -3,7 +3,7 @@ "name": "PolyLite ABS @base", "inherits": "fdm_filament_abs", "from": "system", - "filament_id": "GFB60", + "filament_id": "OGFB60", "instantiation": "false", "filament_cost": [ "26.9" diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/PolyLite ASA @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/PolyLite ASA @base.json index d29a9a2aa5..f0e68a1d1a 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/PolyLite ASA @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/PolyLite ASA @base.json @@ -3,7 +3,7 @@ "name": "PolyLite ASA @base", "inherits": "fdm_filament_asa", "from": "system", - "filament_id": "GFB61", + "filament_id": "OGFB61", "instantiation": "false", "eng_plate_temp": [ "100" diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/PolyLite PETG @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/PolyLite PETG @base.json index f0100311cb..54afeeac8b 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/PolyLite PETG @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/PolyLite PETG @base.json @@ -3,7 +3,7 @@ "name": "PolyLite PETG @base", "inherits": "fdm_filament_pet", "from": "system", - "filament_id": "GFG60", + "filament_id": "OGFG60", "instantiation": "false", "cool_plate_temp": [ "0" diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/PolyLite PLA @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/PolyLite PLA @System.json index b779aeb6ef..0f1cc00ad2 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/PolyLite PLA @System.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/PolyLite PLA @System.json @@ -3,6 +3,7 @@ "name": "PolyLite PLA @System", "inherits": "PolyLite PLA @base", "from": "system", + "filament_id": "OGFL00", "setting_id": "OGFSL19", "instantiation": "true", "filament_max_volumetric_speed": [ diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/PolyLite PLA @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/PolyLite PLA @base.json index 1e7f4d16b7..a0b8231290 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/PolyLite PLA @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/PolyLite PLA @base.json @@ -3,7 +3,7 @@ "name": "PolyLite PLA @base", "inherits": "fdm_filament_pla", "from": "system", - "filament_id": "GFL00", + "filament_id": "OGFL00", "instantiation": "false", "filament_cost": [ "25.4" diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/PolyTerra Dual PLA @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/PolyTerra Dual PLA @System.json index b2b4efd5e7..31755e588f 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/PolyTerra Dual PLA @System.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/PolyTerra Dual PLA @System.json @@ -4,6 +4,7 @@ "instantiation": "true", "name": "PolyTerra Dual PLA @System", "renamed_from": "PolyTerra Dual PLA", + "filament_id": "OGFL00-1", "setting_id": "O1258005940", "inherits": "PolyTerra PLA @base", "compatible_printers": [] diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/PolyTerra PLA @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/PolyTerra PLA @base.json index 2deb2d9141..a9419b5137 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/PolyTerra PLA @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/PolyTerra PLA @base.json @@ -3,7 +3,7 @@ "name": "PolyTerra PLA @base", "inherits": "fdm_filament_pla", "from": "system", - "filament_id": "GFL01", + "filament_id": "OGFL01", "instantiation": "false", "filament_cost": [ "25.4" diff --git a/resources/profiles/OrcaFilamentLibrary/filament/SUNLU/SUNLU Marble PLA @base.json b/resources/profiles/OrcaFilamentLibrary/filament/SUNLU/SUNLU Marble PLA @base.json index 5448265560..f0bc00f17b 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/SUNLU/SUNLU Marble PLA @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/SUNLU/SUNLU Marble PLA @base.json @@ -3,7 +3,7 @@ "name": "SUNLU PLA Marble @base", "inherits": "fdm_filament_pla", "from": "system", - "filament_id": "GFSNL06", + "filament_id": "OGFSNL06", "instantiation": "false", "filament_cost": [ "31.99" diff --git a/resources/profiles/OrcaFilamentLibrary/filament/SUNLU/SUNLU PETG @base.json b/resources/profiles/OrcaFilamentLibrary/filament/SUNLU/SUNLU PETG @base.json index 9d2724491a..338f042e79 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/SUNLU/SUNLU PETG @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/SUNLU/SUNLU PETG @base.json @@ -3,7 +3,7 @@ "name": "SUNLU PETG @base", "inherits": "fdm_filament_pet", "from": "system", - "filament_id": "GFSNL08", + "filament_id": "OGFSNL08", "instantiation": "false", "description": "To get better transparent or translucent results with the corresponding filament, please refer to this wiki: Printing tips for transparent PETG.", "cool_plate_temp": [ diff --git a/resources/profiles/OrcaFilamentLibrary/filament/SUNLU/SUNLU PLA Matte @base.json b/resources/profiles/OrcaFilamentLibrary/filament/SUNLU/SUNLU PLA Matte @base.json index a79b7b65c0..3fea00cc3b 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/SUNLU/SUNLU PLA Matte @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/SUNLU/SUNLU PLA Matte @base.json @@ -3,7 +3,7 @@ "name": "SUNLU PLA Matte @base", "inherits": "fdm_filament_pla", "from": "system", - "filament_id": "GFSNL02", + "filament_id": "OGFSNL02", "instantiation": "false", "filament_cost": [ "25.99" diff --git a/resources/profiles/OrcaFilamentLibrary/filament/SUNLU/SUNLU PLA+ 2.0 @base.json b/resources/profiles/OrcaFilamentLibrary/filament/SUNLU/SUNLU PLA+ 2.0 @base.json index eddb7e97f5..f5cf65085c 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/SUNLU/SUNLU PLA+ 2.0 @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/SUNLU/SUNLU PLA+ 2.0 @base.json @@ -3,7 +3,7 @@ "name": "SUNLU PLA+ 2.0 @base", "inherits": "fdm_filament_pla", "from": "system", - "filament_id": "GFSNL04", + "filament_id": "OGFSNL04", "instantiation": "false", "filament_cost": [ "18.99" diff --git a/resources/profiles/OrcaFilamentLibrary/filament/SUNLU/SUNLU PLA+ @base.json b/resources/profiles/OrcaFilamentLibrary/filament/SUNLU/SUNLU PLA+ @base.json index e7efac83be..add42edf21 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/SUNLU/SUNLU PLA+ @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/SUNLU/SUNLU PLA+ @base.json @@ -3,7 +3,7 @@ "name": "SUNLU PLA+ @base", "inherits": "fdm_filament_pla", "from": "system", - "filament_id": "GFSNL03", + "filament_id": "OGFSNL03", "instantiation": "false", "filament_cost": [ "18.99" diff --git a/resources/profiles/OrcaFilamentLibrary/filament/SUNLU/SUNLU Silk PLA+ @base.json b/resources/profiles/OrcaFilamentLibrary/filament/SUNLU/SUNLU Silk PLA+ @base.json index 5b8fd61e35..3f1b8b6348 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/SUNLU/SUNLU Silk PLA+ @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/SUNLU/SUNLU Silk PLA+ @base.json @@ -3,7 +3,7 @@ "name": "SUNLU Silk PLA+ @base", "inherits": "fdm_filament_pla", "from": "system", - "filament_id": "GFSNL05", + "filament_id": "OGFSNL05", "instantiation": "false", "description": "To make the prints get higher gloss, please dry the filament before use, and set the outer wall speed to be 40 to 60 mm/s when slicing.", "filament_cost": [ diff --git a/resources/profiles/OrcaFilamentLibrary/filament/SUNLU/SUNLU Wood PLA @base.json b/resources/profiles/OrcaFilamentLibrary/filament/SUNLU/SUNLU Wood PLA @base.json index 65af44e85b..611804eb13 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/SUNLU/SUNLU Wood PLA @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/SUNLU/SUNLU Wood PLA @base.json @@ -3,7 +3,7 @@ "name": "SUNLU Wood PLA @base", "inherits": "fdm_filament_pla", "from": "system", - "filament_id": "GFSNL07", + "filament_id": "OGFSNL07", "instantiation": "false", "filament_cost": [ "26.99" diff --git a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_bvoh.json b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_bvoh.json index 1e2a27596f..0172786d9a 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_bvoh.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_bvoh.json @@ -4,7 +4,7 @@ "inherits": "fdm_filament_common", "from": "system", "instantiation": "false", - "filament_id": "GFS97", + "filament_id": "OGFS97", "additional_cooling_fan_speed": [ "70" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_eva.json b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_eva.json index 9e77bf4f93..4e904bea38 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_eva.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_eva.json @@ -2,7 +2,7 @@ "type": "filament", "name": "fdm_filament_eva", "inherits": "fdm_filament_common", - "filament_id": "GFR99", + "filament_id": "OGFR99", "from": "system", "instantiation": "false", "filament_type": [ diff --git a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_hips.json b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_hips.json index ce42a7aa9b..3acc15068f 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_hips.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_hips.json @@ -2,7 +2,7 @@ "type": "filament", "name": "fdm_filament_hips", "inherits": "fdm_filament_common", - "filament_id": "GFS98", + "filament_id": "OGFS98", "from": "system", "instantiation": "false", "cool_plate_temp": [ diff --git a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pa.json b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pa.json index 3c7c03a4a9..1e6f16b892 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pa.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pa.json @@ -2,7 +2,7 @@ "type": "filament", "name": "fdm_filament_pa", "inherits": "fdm_filament_common", - "filament_id": "GFN99", + "filament_id": "OGFN99", "from": "system", "instantiation": "false", "activate_air_filtration": [ diff --git a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pc.json b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pc.json index ba79aff70d..4640a0b685 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pc.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pc.json @@ -2,7 +2,7 @@ "type": "filament", "name": "fdm_filament_pc", "inherits": "fdm_filament_common", - "filament_id": "GFC99", + "filament_id": "OGFC99", "from": "system", "instantiation": "false", "supertack_plate_temp": [ diff --git a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pctg.json b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pctg.json index 21eb7ed51c..507432ba03 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pctg.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pctg.json @@ -2,7 +2,7 @@ "type": "filament", "name": "fdm_filament_pctg", "inherits": "fdm_filament_common", - "filament_id": "GFG97", + "filament_id": "OGFG97", "from": "system", "instantiation": "false", "eng_plate_temp": [ diff --git a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pe.json b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pe.json index d15ac9a773..10081f5415 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pe.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pe.json @@ -2,7 +2,7 @@ "type": "filament", "name": "fdm_filament_pe", "inherits": "fdm_filament_common", - "filament_id": "GFP99", + "filament_id": "OGFP99", "from": "system", "instantiation": "false", "additional_cooling_fan_speed": [ diff --git a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pet.json b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pet.json index f4a31b746b..1f68e23775 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pet.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pet.json @@ -2,7 +2,7 @@ "type": "filament", "name": "fdm_filament_pet", "inherits": "fdm_filament_common", - "filament_id": "GFG99", + "filament_id": "OGFG99", "from": "system", "instantiation": "false", "eng_plate_temp": [ diff --git a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pha.json b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pha.json index 35d3c9abe0..7a73836b5a 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pha.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pha.json @@ -2,7 +2,7 @@ "type": "filament", "name": "fdm_filament_pha", "inherits": "fdm_filament_common", - "filament_id": "GFR98", + "filament_id": "OGFR98", "from": "system", "instantiation": "false", "additional_cooling_fan_speed": [ diff --git a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pla.json b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pla.json index 45e21a49f3..97dae7e454 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pla.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pla.json @@ -4,7 +4,7 @@ "inherits": "fdm_filament_common", "from": "system", "instantiation": "false", - "filament_id": "GFL99", + "filament_id": "OGFL99", "additional_cooling_fan_speed": [ "70" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pla_silk.json b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pla_silk.json index 9e407dbf4a..8128724a95 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pla_silk.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pla_silk.json @@ -3,7 +3,7 @@ "name": "fdm_filament_pla_silk", "inherits": "fdm_filament_pla", "from": "system", - "filament_id": "GFL96", + "filament_id": "OGFL96", "instantiation": "false", "description": "To make the prints get higher gloss, please dry the filament before use, and set the outer wall speed to be 40 to 60 mm/s when slicing.", "filament_flow_ratio": [ diff --git a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pp.json b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pp.json index bd6701b87e..6e0fb67487 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pp.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_pp.json @@ -2,7 +2,7 @@ "type": "filament", "name": "fdm_filament_pp", "inherits": "fdm_filament_common", - "filament_id": "GFP97", + "filament_id": "OGFP97", "from": "system", "instantiation": "false", "additional_cooling_fan_speed": [ diff --git a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_ppa.json b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_ppa.json index 19409eabf4..307147ec35 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_ppa.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_ppa.json @@ -2,7 +2,7 @@ "type": "filament", "name": "fdm_filament_ppa", "inherits": "fdm_filament_common", - "filament_id": "GFN97", + "filament_id": "OGFN97", "from": "system", "instantiation": "false", "activate_air_filtration": [ diff --git a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_sbs.json b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_sbs.json index 69ce757d9d..02634084a0 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_sbs.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/base/fdm_filament_sbs.json @@ -4,7 +4,7 @@ "inherits": "fdm_filament_common", "from": "system", "instantiation": "false", - "filament_id": "GFL99", + "filament_id": "OGFLSBS99", "fan_cooling_layer_time": [ "100" ], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/eSUN/eSUN PLA+ @base.json b/resources/profiles/OrcaFilamentLibrary/filament/eSUN/eSUN PLA+ @base.json index ac6bcd04fc..7c70418cd5 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/eSUN/eSUN PLA+ @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/eSUN/eSUN PLA+ @base.json @@ -3,7 +3,7 @@ "name": "eSUN PLA+ @base", "inherits": "fdm_filament_pla", "from": "system", - "filament_id": "GFL03", + "filament_id": "OGFL03", "instantiation": "false", "filament_cost": [ "22.99" diff --git a/resources/profiles/Sovol/filament/Sovol SV06 ACE PLA.json b/resources/profiles/Sovol/filament/Sovol SV06 ACE PLA.json index a4ff71e307..574aa612f3 100644 --- a/resources/profiles/Sovol/filament/Sovol SV06 ACE PLA.json +++ b/resources/profiles/Sovol/filament/Sovol SV06 ACE PLA.json @@ -12,6 +12,7 @@ "3" ], "compatible_printers": [ + "Sovol SV06 ACE 0.2 nozzle", "Sovol SV06 ACE 0.4 nozzle", "Sovol SV06 ACE 0.6 nozzle", "Sovol SV06 ACE 0.8 nozzle" diff --git a/resources/web/data/text.js b/resources/web/data/text.js index fd9c28df1a..b8160fabd0 100644 --- a/resources/web/data/text.js +++ b/resources/web/data/text.js @@ -332,6 +332,118 @@ var LangText = { orca4: "Esta función detiene la transmisión de datos a los servicios en la nube de Bambu. Los usuarios que no utilicen máquinas BBL o que solo utilicen el modo LAN pueden activar esta función de forma segura.", orca5: "Activar Modo Invisible.", }, + it_IT: { + t1: "Benvenuti in OrcaSlicer", + t2: "OrcaSlicer verrà configurato seguendo diversi passaggi. Cominciamo!", + t3: "Condizioni d'uso", + t4: "Non accetto", + t5: "Accetto", + t6: "Chiediamo gentilmente il tuo aiuto per migliorare la qualità delle stampe.
Iscriviti al nostro programma di miglioramento dell'esperienza utente", + t7: "Iscriviti al nostro programma di miglioramento dell'esperienza utente", + t8: "Indietro", + t9: "Avanti", + t10: "Selezione della stampante", + t11: "Tutto", + t12: "Cancella tutto", + t13: "mm ugello", + t14: "Selezione del filamento", + t15: "Stampante", + t16: "Tipo di filamento", + t17: "Produttore", + t18: "errore", + t19: "È necessario selezionare almeno un filamento.", + t20: "Vuoi utilizzare il filamento predefinito?", + t21: "sì", + t22: "no", + t23: "Note di rilascio", + t24: "Inizia", + t25: "Fine", + t26: "Accedi", + t27: "Registrati", + t28: "Recente", + t29: "Negozio", + t30: "Manuale", + t31: "Nuovo progetto", + t32: "Crea un nuovo progetto", + t33: "Apri progetto", + t34: "hotspot", + t35: "Aperti di recente", + t36: "ok", + t37: "È necessario selezionare almeno una stampante.", + t38: "Annulla", + t39: "Conferma", + t40: "Disconnesso, controlla la connessione di rete e riprova.", + t47: "Seleziona la tua regione di accesso", + t48: "Asia-Pacifico", + t49: "Cina", + t50: "Disconnettiti", + t52: "Salta", + t53: "Iscriviti", + t54: "Nella comunità di stampa 3D, impariamo dai successi e dagli insuccessi di ognuno per adattare i nostri parametri e le nostre impostazioni di slicing. OrcaSlicer segue lo stesso principio, utilizzando l'apprendimento automatico per migliorare le sue prestazioni sfruttando i successi e gli insuccessi delle numerose stampe dei nostri utenti. Stiamo addestrando OrcaSlicer ad essere più intelligente, fornendogli dati del mondo reale. Se lo desideri, questo servizio accederà alle informazioni dei tuoi registri di errore e di utilizzo, i quali possono includere informazioni descritte in ", + t55: "Politica sulla riservatezza", + t56: ". Non raccoglieremo alcun Dato Personale tramite il quale un individuo possa essere identificato direttamente o indirettamente, inclusi (senza limitazioni) nomi, indirizzi, informazioni di pagamento o numeri di telefono. Abilitando questo servizio, accetti questi termini e la dichiarazione sulla Politica sulla riservatezza.", + t57: "", + t58: "", + t59: ".", + t60: "Europa", + t61: "Nord America", + t62: "Altri", + t63: "Dopo aver cambiato la regione, il tuo profilo verrà disconnesso. Sarà necessario accedere di nuovo.", + t64: "Moduli proprietari", + t65: "Si prega di notare che questi moduli non sono sviluppati o mantenuti da OrcaSlicer. Dovrebbero essere utilizzati a proprio rischio e discrezione.", + t66: "Controllo remoto completo", + t67: "Video in diretta", + t68: "Sincronizzazione dei dati utente", + t69: "Installa il modulo di rete Bambu", + t70: "", + t71: "Scaricamento", + t72: "Scaricamento non riuscito", + t73: "Installazione riuscita.", + t74: "Riavvia", + t75: "Le stampanti di alcuni produttori richiedono dei moduli proprietari per far in modo che la comunicazione abbia successo. Seleziona il modulo corrispondente se utilizzi tali stampanti.", + t76: "Modulo di rete Bambu non rilevato. Fai clic ", + t77: "qui", + t78: " per installarlo.", + t79: "Impossibile installare il modulo. ", + t80: "Prova i seguenti passaggi:", + t81: "1, Fare clic ", + t82: " per aprire la directory del modulo", + t83: "2, Chiudere tutte le istanze di OrcaSlicer", + t84: "3, Eliminare tutti i file all'interno della directory del modulo", + t85: "4, Riaprire OrcaSlicer e installare nuovamente il modulo", + t86: "Chiudi", + t87: "Manuale d'uso", + t88: "Rimuovi", + t89: "Apri cartella con contenuto", + t90: "Modello 3D", + t91: "Scarica modelli 3D", + t92: "Creato da", + t93: "Modificato da", + t94: "Condiviso da", + t95: "Informazioni sul modello", + t96: "Accessori", + t97: "Informazioni sul profilo", + t98: "Nome del modello", + t100: "Descrizione del modello", + t101: "Elenco dei materiali", + t102: "Istruzioni di montaggio ", + t103: "Altro", + t104: "Nome del profilo", + t105: "Autore del profilo", + t106: "Descrizione del profilo", + t107: "Modelli online", + t108: "ALTRO", + t109: "Filamenti di sistema", + t110: "Filamenti personalizzati", + t111: "Crea Nuovo", + t112: "Unisciti al programma", + t113: "Puoi modificare la tua scelta in 'Preferenze' in qualsiasi momento.", + orca1: "Modifica informazioni progetto", + orca2: "nessuna informazione sul modello", + orca3: "Modalità invisibile", + orca4: "Con questa modalità, la trasmissione dei dati ai servizi cloud di Bambu sarà interrotta. Gli utenti che non utilizzano macchine BBL o che usano solo la modalità LAN possono attivare questa funzione in modo sicuro.", + orca5: "Abilita la modalità invisibile.", + }, de_DE: { t1: "Willkommen im Orca Slicer", t2: "Das Orca Slicer wird in mehreren Schritten eingerichtet. Lass uns anfangen!", @@ -1313,7 +1425,7 @@ var LangText = { }, pt_BR: { t1: "Bem-vindo ao Orca Slicer", - t2: "Orca Slicer será configurado em algumas etapas. Vamos começar!", + t2: "Orca Slicer será configurado em várias etapas. Vamos começar!", t3: "Termos de Uso", t4: "Discordo", t5: "Concordo", @@ -1376,8 +1488,8 @@ var LangText = { t69: "Instalar Bambu Network plug-in", t70: "", t71: "Baixando", - t72: "Baixando falhou", - t73: "Instalação concluida.", + t72: "Falha baixando", + t73: "Instalação concluída.", t74: "Reiniciar", t75: "Algumass fabricantes de impressoras exigem plugins proprietários para comunicação com suas impressoras. Se você utiliza tais impressoras, selecione o plug-in correspondente.", t76: "Bambu Network plug-in não detectado. Clique ", @@ -1419,6 +1531,121 @@ var LangText = { t113: "Você pode alterar sua escolha nas Preferências a qualquer momento", orca1: "Editar Info do Projeto", orca2: "Sem informação do modelo", + orca3: "Modo Furtivo", + orca4: "Isso interrompe a transmissão de dados para os serviços de nuvem da Bambu. Usuários que não usam máquinas BBL ou usam somente o modo LAN podem ativar essa função com segurança.", + orca5: "Habilita Modo Furtivo.", + }, + lt: { + t1: "Pasisveikinkite su Orca Slicer", + t2: "Orca Slicer bus nustatyta per kelis žingsnius. Pradėkime!", + t3: "Naudotojo sutartis", + t4: "Nesutinku", + t5: "Sutinku", + t6: "Maloniai prašome jūsų pagalbos, kad pagerintume visų spausdinimą.
Prisijunkite prie mūsų klientų patirties gerinimo programos", + t7: "Prisijunkite prie mūsų klientų patirties gerinimo programos", + t8: "Atgal", + t9: "Pirmyn", + t10: "Spausdintuvo pasirinkimas", + t11: "Visi", + t12: "Išvalyti visus", + t13: "mm purkštukas", + t14: "Gijos pasirinkimas", + t15: "Spausdintuvas", + t16: "Gijos tipas", + t17: "Gamintojas", + t18: "klaida", + t19: "Turi būti pasirinkta bent viena gija.", + t20: "Ar norite naudoti numatytąją giją?", + t21: "taip", + t22: "ne", + t23: "Išleidimo pastabos", + t24: "Pradėti", + t25: "Pabaigti", + t26: "Prisijungti", + t27: "Prisiregistruoti", + t28: "Naujausi", + t29: "Pirkti", + t30: "Rankinis", + t31: "Naujas projektas", + t32: "Sukurti naują projektą", + t33: "Atverti projektą", + t34: "Prieigos taškas", + t35: "Neseniai atidaryti", + t36: "gerai", + t37: "Turi būti pasirinktas bent vienas spausdintuvas.", + t38: "Atšaukti", + t39: "Patvirtinti", + t40: "Tinklas atjungtas, patikrinkite ir bandykite vėliau.", + t47: "Pasirinkite prisijungimo regioną", + t48: "Azija-Ramusis vandenynas", + t49: "Kinija", + t50: "Atsijungti", + t52: "Praleisti", + t53: "Prisijungti", + t54: "3D spausdinimo bendruomenėje mokomės vieni iš kitų sėkmių ir nesėkmių, kad galėtume pritaikyti savo pjaustymo parametrus ir nustatymus. Orca Slicer vadovaujasi tuo pačiu principu ir naudoja mašininį mokymąsi, kad pagerintų savo veikimą, remdamasi daugybės mūsų naudotojų atspaudų sėkmėmis ir nesėkmėmis. Maitindami Orca Slicer realaus pasaulio duomenimis, mokome ją būti protingesne. Jei pageidaujate, ši paslauga pasieks informaciją iš jūsų klaidų žurnalų ir naudojimo žurnalų, į kuriuos gali būti įtraukta informacija, aprašyta ", + t55: "privatumo politikoje", + t56: ". Nerinksime jokių asmens duomenų, pagal kuriuos galima tiesiogiai ar netiesiogiai nustatyti asmens tapatybę, įskaitant, bet neapsiribojant vardus, adresus, mokėjimo informaciją ar telefono numerius. Įjungdami šią paslaugą sutinkate su šiomis sąlygomis ir privatumo politikos nuostatomis.", + t57: "", + t58: "", + t59: ".", + t60: "Europa", + t61: "Šiaurės Amerika", + t62: "Kiti", + t63: "Pakeitus regioną, jūsų paskyra bus išregistruota. Vėliau vėl prisijunkite.", + t64: "Patentuoti papildiniai", + t65: "Atkreipkite dėmesį, kad OrcaSlicer šių papildinių nesukuria ir neprižiūri. Juos turėtumėte naudoti savo nuožiūra ir rizika.", + t66: "Pilnas nuotolinis valdymas", + t67: "Tiesioginė transliacija", + t68: "Naudotojo duomenų sinchronizavimas", + t69: "Įdiegti Bambu tinklo papildinį", + t70: "", + t71: "Atsisiunčiama", + t72: "Nepavyko atsisiųsti", + t73: "Diegimas sėkmingas.", + t74: "Paleisti iš naujo", + t75: "Kai kurie spausdintuvų gamintojai reikalauja patentuotų priedų, kad būtų galima bendrauti su jų spausdintuvais. Jei naudojate tokius spausdintuvus, pasirinkite atitinkamą įskiepį.", + t76: "Neaptiktas Bambu tinklo papildinys. Spustelėkite ", + t77: "čia", + t78: " jo diegimui.", + t79: "Nepavyko įdiegti papildinio. ", + t80: "Išbandykite šiuos žingsnius:", + t81: "1, Spustelkite ", + t82: " atidaryti papildinių katalogą", + t83: "2, Uždarykite visas veikiančias Orca Slicer programas", + t84: "3, Ištrinkite visus failus iš papildinių katalogo", + t85: "4, Iš naujo atverkite OrcaSlicer ir iš naujo įdiekite papildinį", + t86: "Užverti", + t87: "Naudotojo vadovas", + t88: "Pašalinti", + t89: "Atidaryti katalogą, kuriame yra", + t90: "3D modelis", + t91: "Atsisiųsti 3D modelius", + t92: "Sukurta", + t93: "Perkurta", + t94: "Pasidalinta", + t95: "Modelio informacija", + t96: "Priedai", + t97: "Profilio informacija", + t98: "Modelio pavadinimas", + t100: "Modelio aprašymas", + t101: "BOM", + t102: "Surinkimo vadovas", + t103: "Kita", + t104: "Profilio pavadinimas", + t105: "Profilio autorius", + t106: "Profilio aprašymas", + t107: "Modeliai internete", + t108: "DAUGIAU", + t109: "Sistemos gijos", + t110: "Pasirinktinės gijos", + t111: "Sukurti naują", + t112: "Prisijungti prie programos", + t113: "Savo pasirinkimą galite bet kada pakeisti.", + orca1: "Redaguoti projekto informaciją", + orca2: "nėra informacijos apie modelį", + orca3: "Slaptas režimas", + orca4: "Tai sustabdo duomenų perdavimą į Bambu debesijos paslaugas. Vartotojai, kurie nenaudoja BBL mašinų arba naudoja tik LAN režimą, gali drąsiai įjungti šią funkciją.", + orca5: "Įjungti slaptą režimą.", }, }; diff --git a/scripts/pack_profiles.sh b/scripts/pack_profiles.sh new file mode 100755 index 0000000000..946f7814bc --- /dev/null +++ b/scripts/pack_profiles.sh @@ -0,0 +1,81 @@ +#!/bin/bash + +# Check if required arguments are provided +if [ "$#" -lt 3 ]; then + echo "Usage: $0 VERSION NUMBER VENDOR1 [VENDOR2 ...]" + echo "Example: $0 2.3.0 1 OrcaFilamentLibrary BBL" + exit 1 +fi + +# Get version and number from arguments +VERSION="$1" +NUMBER="$2" +shift 2 # Remove first two arguments, leaving only vendor names + +# Set paths +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +RESOURCES_DIR="$SCRIPT_DIR/../resources/profiles" +ORIGINAL_DIR="$(pwd)" +OUTPUT_FILE="orcaslicer-profiles_ota_${VERSION}.${NUMBER}.zip" +TEMP_DIR="/tmp/orca_profiles_$$" # Use PID to make temp dir unique + +# Check if resources directory exists +if [ ! -d "$RESOURCES_DIR" ]; then + echo "Error: Profiles directory not found at $RESOURCES_DIR" + exit 1 +fi + +# Create temporary directory with profiles root folder +mkdir -p "$TEMP_DIR/profiles" + +# Process each vendor +for VENDOR in "$@"; do + echo "Processing vendor: $VENDOR" + + # Copy JSON file if it exists + if [ -f "$RESOURCES_DIR/$VENDOR.json" ]; then + cp "$RESOURCES_DIR/$VENDOR.json" "$TEMP_DIR/profiles/" + echo "Added $VENDOR.json" + else + echo "Warning: $VENDOR.json not found" + fi + + # Copy vendor directory if it exists + if [ -d "$RESOURCES_DIR/$VENDOR" ]; then + cp -r "$RESOURCES_DIR/$VENDOR" "$TEMP_DIR/profiles/" + echo "Added $VENDOR directory" + + # Remove excluded file types + find "$TEMP_DIR/profiles/$VENDOR" -type f \( \ + -name "*.jpg" -o \ + -name "*.stl" -o \ + -name "*.svg" -o \ + -name "*.png" -o \ + -name "*.py" \ + \) -delete + else + echo "Warning: $VENDOR directory not found" + fi +done + +# Create zip file +cd "$TEMP_DIR" +zip -r "$OUTPUT_FILE" profiles/ + +# Move zip file to original directory +mv "$OUTPUT_FILE" "$ORIGINAL_DIR/" + +# Return to original directory +cd "$ORIGINAL_DIR" + +# Clean up +rm -rf "$TEMP_DIR" + +# Print results +if [ -f "$OUTPUT_FILE" ]; then + echo "Created profiles package: $OUTPUT_FILE" + echo "Size: $(du -h "$OUTPUT_FILE" | cut -f1)" +else + echo "Error: Failed to create zip file" + exit 1 +fi \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8133c2b06a..a3983ac9f1 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -4,8 +4,6 @@ project(OrcaSlicer-native) add_subdirectory(build-utils) add_subdirectory(admesh) # add_subdirectory(avrdude) -# boost/nowide -add_subdirectory(boost) add_subdirectory(clipper) add_subdirectory(clipper2) add_subdirectory(miniz) diff --git a/src/OrcaSlicer.cpp b/src/OrcaSlicer.cpp index 32b02f8faf..6b4954a024 100644 --- a/src/OrcaSlicer.cpp +++ b/src/OrcaSlicer.cpp @@ -36,10 +36,10 @@ using namespace nlohmann; #include #include #include -#include +#include #include #include -#include +#include #include #include diff --git a/src/boost/CMakeLists.txt b/src/boost/CMakeLists.txt deleted file mode 100644 index e8c9e11ce6..0000000000 --- a/src/boost/CMakeLists.txt +++ /dev/null @@ -1,24 +0,0 @@ -cmake_minimum_required(VERSION 2.8.12) -project(nowide) - -add_library(nowide STATIC - nowide/args.hpp - nowide/cenv.hpp - nowide/config.hpp - nowide/convert.hpp - nowide/cstdio.hpp - nowide/cstdlib.hpp - nowide/filebuf.hpp - nowide/fstream.hpp - nowide/integration/filesystem.hpp - nowide/iostream.cpp - nowide/iostream.hpp - nowide/stackstring.hpp - nowide/system.hpp - nowide/utf8_codecvt.hpp - nowide/windows.hpp -) - -target_link_libraries(nowide PUBLIC boost_headeronly) - - diff --git a/src/boost/nowide/args.hpp b/src/boost/nowide/args.hpp deleted file mode 100644 index bb806d02e8..0000000000 --- a/src/boost/nowide/args.hpp +++ /dev/null @@ -1,167 +0,0 @@ -// -// Copyright (c) 2012 Artyom Beilis (Tonkikh) -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -#ifndef BOOST_NOWIDE_ARGS_HPP_INCLUDED -#define BOOST_NOWIDE_ARGS_HPP_INCLUDED - -#include -#include -#include -#ifdef BOOST_WINDOWS -#include -#endif - -namespace boost { -namespace nowide { - #if !defined(BOOST_WINDOWS) && !defined(BOOST_NOWIDE_DOXYGEN) - class args { - public: - args(int &,char **&) {} - args(int &,char **&,char **&){} - ~args() {} - }; - - #else - - /// - /// \brief args is a class that fixes standard main() function arguments and changes them to UTF-8 under - /// Microsoft Windows. - /// - /// The class uses \c GetCommandLineW(), \c CommandLineToArgvW() and \c GetEnvironmentStringsW() - /// in order to obtain the information. It does not relates to actual values of argc,argv and env - /// under Windows. - /// - /// It restores the original values in its destructor - /// - /// \note the class owns the memory of the newly allocated strings - /// - class args { - public: - - /// - /// Fix command line agruments - /// - args(int &argc,char **&argv) : - old_argc_(argc), - old_argv_(argv), - old_env_(0), - old_argc_ptr_(&argc), - old_argv_ptr_(&argv), - old_env_ptr_(0) - { - fix_args(argc,argv); - } - /// - /// Fix command line agruments and environment - /// - args(int &argc,char **&argv,char **&en) : - old_argc_(argc), - old_argv_(argv), - old_env_(en), - old_argc_ptr_(&argc), - old_argv_ptr_(&argv), - old_env_ptr_(&en) - { - fix_args(argc,argv); - fix_env(en); - } - /// - /// Restore original argc,argv,env values, if changed - /// - ~args() - { - if(old_argc_ptr_) - *old_argc_ptr_ = old_argc_; - if(old_argv_ptr_) - *old_argv_ptr_ = old_argv_; - if(old_env_ptr_) - *old_env_ptr_ = old_env_; - } - private: - void fix_args(int &argc,char **&argv) - { - int wargc; - wchar_t **wargv = CommandLineToArgvW(GetCommandLineW(),&wargc); - if(!wargv) { - argc = 0; - static char *dummy = 0; - argv = &dummy; - return; - } - try{ - args_.resize(wargc+1,0); - arg_values_.resize(wargc); - for(int i=0;i args_; - std::vector arg_values_; - stackstring env_; - std::vector envp_; - - int old_argc_; - char **old_argv_; - char **old_env_; - - int *old_argc_ptr_; - char ***old_argv_ptr_; - char ***old_env_ptr_; - }; - - #endif - -} // nowide -} // namespace boost -#endif - -/// -// vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 diff --git a/src/boost/nowide/cenv.hpp b/src/boost/nowide/cenv.hpp deleted file mode 100644 index a38a24b978..0000000000 --- a/src/boost/nowide/cenv.hpp +++ /dev/null @@ -1,124 +0,0 @@ -// -// Copyright (c) 2012 Artyom Beilis (Tonkikh) -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -#ifndef BOOST_NOWIDE_CENV_H_INCLUDED -#define BOOST_NOWIDE_CENV_H_INCLUDED - -#include -#include -#include -#include -#include -#include - -#ifdef BOOST_WINDOWS -#include -#endif - -namespace boost { -namespace nowide { - #if !defined(BOOST_WINDOWS) && !defined(BOOST_NOWIDE_DOXYGEN) - using ::getenv; - using ::setenv; - using ::unsetenv; - using ::putenv; - #else - /// - /// \brief UTF-8 aware getenv. Returns 0 if the variable is not set. - /// - /// This function is not thread safe or reenterable as defined by the standard library - /// - inline char *getenv(char const *key) - { - static stackstring value; - - wshort_stackstring name; - if(!name.convert(key)) - return 0; - - static const size_t buf_size = 64; - wchar_t buf[buf_size]; - std::vector tmp; - wchar_t *ptr = buf; - size_t n = GetEnvironmentVariableW(name.c_str(),buf,buf_size); - if(n == 0 && GetLastError() == 203) // ERROR_ENVVAR_NOT_FOUND - return 0; - if(n >= buf_size) { - tmp.resize(n+1,L'\0'); - n = GetEnvironmentVariableW(name.c_str(),&tmp[0],static_cast(tmp.size() - 1)); - // The size may have changed - if(n >= tmp.size() - 1) - return 0; - ptr = &tmp[0]; - } - if(!value.convert(ptr)) - return 0; - return value.c_str(); - } - /// - /// \brief UTF-8 aware setenv, \a key - the variable name, \a value is a new UTF-8 value, - /// - /// if override is not 0, that the old value is always overridded, otherwise, - /// if the variable exists it remains unchanged - /// - inline int setenv(char const *key,char const *value,int override) - { - wshort_stackstring name; - if(!name.convert(key)) - return -1; - if(!override) { - wchar_t unused[2]; - if(!(GetEnvironmentVariableW(name.c_str(),unused,2)==0 && GetLastError() == 203)) // ERROR_ENVVAR_NOT_FOUND - return 0; - } - wstackstring wval; - if(!wval.convert(value)) - return -1; - if(SetEnvironmentVariableW(name.c_str(),wval.c_str())) - return 0; - return -1; - } - /// - /// \brief Remove enviroment variable \a key - /// - inline int unsetenv(char const *key) - { - wshort_stackstring name; - if(!name.convert(key)) - return -1; - if(SetEnvironmentVariableW(name.c_str(),0)) - return 0; - return -1; - } - /// - /// \brief UTF-8 aware putenv implementation, expects string in format KEY=VALUE - /// - inline int putenv(char *string) - { - char const *key = string; - char const *key_end = string; - while(*key_end != '=' && *key_end != 0) - ++ key_end; - if(*key_end == 0) - return -1; - wshort_stackstring wkey; - if(!wkey.convert(key,key_end)) - return -1; - wstackstring wvalue; - if(!wvalue.convert(key_end+1)) - return -1; - if(SetEnvironmentVariableW(wkey.c_str(),wvalue.c_str())) - return 0; - return -1; - } - #endif -} // nowide -} // namespace boost - -#endif -/// -// vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 diff --git a/src/boost/nowide/config.hpp b/src/boost/nowide/config.hpp deleted file mode 100644 index d983109f38..0000000000 --- a/src/boost/nowide/config.hpp +++ /dev/null @@ -1,54 +0,0 @@ -// -// Copyright (c) 2012 Artyom Beilis (Tonkikh) -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -#ifndef BOOST_NOWIDE_CONFIG_HPP_INCLUDED -#define BOOST_NOWIDE_CONFIG_HPP_INCLUDED - -#include - -#ifndef BOOST_SYMBOL_VISIBLE -# define BOOST_SYMBOL_VISIBLE -#endif - -#ifdef BOOST_HAS_DECLSPEC -# if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_NOWIDE_DYN_LINK) -# ifdef BOOST_NOWIDE_SOURCE -# define BOOST_NOWIDE_DECL BOOST_SYMBOL_EXPORT -# else -# define BOOST_NOWIDE_DECL BOOST_SYMBOL_IMPORT -# endif // BOOST_NOWIDE_SOURCE -# endif // DYN_LINK -#endif // BOOST_HAS_DECLSPEC - -#ifndef BOOST_NOWIDE_DECL -# define BOOST_NOWIDE_DECL -#endif - -// -// Automatically link to the correct build variant where possible. -// -#if !defined(BOOST_ALL_NO_LIB) && !defined(BOOST_NOWIDE_NO_LIB) && !defined(BOOST_NOWIDE_SOURCE) -// -// Set the name of our library, this will get undef'ed by auto_link.hpp -// once it's done with it: -// -#define BOOST_LIB_NAME boost_nowide -// -// If we're importing code from a dll, then tell auto_link.hpp about it: -// -#if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_NOWIDE_DYN_LINK) -# define BOOST_DYN_LINK -#endif -// -// And include the header that does the work: -// -#include -#endif // auto-linking disabled - - -#endif // boost/nowide/config.hpp -// vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 \ No newline at end of file diff --git a/src/boost/nowide/convert.hpp b/src/boost/nowide/convert.hpp deleted file mode 100644 index 89b8871d09..0000000000 --- a/src/boost/nowide/convert.hpp +++ /dev/null @@ -1,154 +0,0 @@ -// -// Copyright (c) 2012 Artyom Beilis (Tonkikh) -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -#ifndef BOOST_NOWIDE_CONVERT_H_INCLUDED -#define BOOST_NOWIDE_CONVERT_H_INCLUDED - -#include -#include - -namespace boost { -namespace nowide { - /// - /// \brief Template function that converts a buffer of UTF sequences in range [source_begin,source_end) - /// to the output \a buffer of size \a buffer_size. - /// - /// In case of success a NULL terminated string is returned (buffer), otherwise 0 is returned. - /// - /// If there is not enough room in the buffer or the source sequence contains invalid UTF, - /// 0 is returned, and the contents of the buffer are undefined. - /// - template - CharOut *basic_convert(CharOut *buffer,size_t buffer_size,CharIn const *source_begin,CharIn const *source_end) - { - CharOut *rv = buffer; - if(buffer_size == 0) - return 0; - buffer_size --; - while(source_begin!=source_end) { - using namespace boost::locale::utf; - code_point c = utf_traits::template decode(source_begin,source_end); - if(c==illegal || c==incomplete) { - rv = 0; - break; - } - size_t width = utf_traits::width(c); - if(buffer_size < width) { - rv=0; - break; - } - buffer = utf_traits::template encode(c,buffer); - buffer_size -= width; - } - *buffer++ = 0; - return rv; - } - - /// \cond INTERNAL - namespace details { - // - // wcslen defined only in C99... So we will not use it - // - template - Char const *basic_strend(Char const *s) - { - while(*s) - s++; - return s; - } - } - /// \endcond - - /// - /// Convert NULL terminated UTF source string to NULL terminated \a output string of size at - /// most output_size (including NULL) - /// - /// In case of success output is returned, if the input sequence is illegal, - /// or there is not enough room NULL is returned - /// - inline char *narrow(char *output,size_t output_size,wchar_t const *source) - { - return basic_convert(output,output_size,source,details::basic_strend(source)); - } - /// - /// Convert UTF text in range [begin,end) to NULL terminated \a output string of size at - /// most output_size (including NULL) - /// - /// In case of success output is returned, if the input sequence is illegal, - /// or there is not enough room NULL is returned - /// - inline char *narrow(char *output,size_t output_size,wchar_t const *begin,wchar_t const *end) - { - return basic_convert(output,output_size,begin,end); - } - /// - /// Convert NULL terminated UTF source string to NULL terminated \a output string of size at - /// most output_size (including NULL) - /// - /// In case of success output is returned, if the input sequence is illegal, - /// or there is not enough room NULL is returned - /// - inline wchar_t *widen(wchar_t *output,size_t output_size,char const *source) - { - return basic_convert(output,output_size,source,details::basic_strend(source)); - } - /// - /// Convert UTF text in range [begin,end) to NULL terminated \a output string of size at - /// most output_size (including NULL) - /// - /// In case of success output is returned, if the input sequence is illegal, - /// or there is not enough room NULL is returned - /// - inline wchar_t *widen(wchar_t *output,size_t output_size,char const *begin,char const *end) - { - return basic_convert(output,output_size,begin,end); - } - - - /// - /// Convert between Wide - UTF-16/32 string and UTF-8 string. - /// - /// boost::locale::conv::conversion_error is thrown in a case of a error - /// - inline std::string narrow(wchar_t const *s) - { - return boost::locale::conv::utf_to_utf(s); - } - /// - /// Convert between UTF-8 and UTF-16 string, implemented only on Windows platform - /// - /// boost::locale::conv::conversion_error is thrown in a case of a error - /// - inline std::wstring widen(char const *s) - { - return boost::locale::conv::utf_to_utf(s); - } - /// - /// Convert between Wide - UTF-16/32 string and UTF-8 string - /// - /// boost::locale::conv::conversion_error is thrown in a case of a error - /// - inline std::string narrow(std::wstring const &s) - { - return boost::locale::conv::utf_to_utf(s); - } - /// - /// Convert between UTF-8 and UTF-16 string, implemented only on Windows platform - /// - /// boost::locale::conv::conversion_error is thrown in a case of a error - /// - inline std::wstring widen(std::string const &s) - { - return boost::locale::conv::utf_to_utf(s); - } - -} // nowide -} // namespace boost - -#endif -/// -// vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 diff --git a/src/boost/nowide/cstdio.hpp b/src/boost/nowide/cstdio.hpp deleted file mode 100644 index d0bda97a01..0000000000 --- a/src/boost/nowide/cstdio.hpp +++ /dev/null @@ -1,101 +0,0 @@ -// -// Copyright (c) 2012 Artyom Beilis (Tonkikh) -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -#ifndef BOOST_NOWIDE_CSTDIO_H_INCLUDED -#define BOOST_NOWIDE_CSTDIO_H_INCLUDED - -#include -#include -#include -#include -#include -#include - -#ifdef BOOST_MSVC -# pragma warning(push) -# pragma warning(disable : 4996) -#endif - - -namespace boost { -namespace nowide { -#if !defined(BOOST_WINDOWS) && !defined(BOOST_NOWIDE_DOXYGEN) - using std::fopen; - using std::freopen; - using std::remove; - using std::rename; -#else - -/// -/// \brief Same as freopen but file_name and mode are UTF-8 strings -/// -/// If invalid UTF-8 given, NULL is returned and errno is set to EINVAL -/// -inline FILE *freopen(char const *file_name,char const *mode,FILE *stream) -{ - wstackstring wname; - wshort_stackstring wmode; - if(!wname.convert(file_name) || !wmode.convert(mode)) { - errno = EINVAL; - return 0; - } - return _wfreopen(wname.c_str(),wmode.c_str(),stream); -} -/// -/// \brief Same as fopen but file_name and mode are UTF-8 strings -/// -/// If invalid UTF-8 given, NULL is returned and errno is set to EINVAL -/// -inline FILE *fopen(char const *file_name,char const *mode) -{ - wstackstring wname; - wshort_stackstring wmode; - if(!wname.convert(file_name) || !wmode.convert(mode)) { - errno = EINVAL; - return 0; - } - return _wfopen(wname.c_str(),wmode.c_str()); -} -/// -/// \brief Same as rename but old_name and new_name are UTF-8 strings -/// -/// If invalid UTF-8 given, -1 is returned and errno is set to EINVAL -/// -inline int rename(char const *old_name,char const *new_name) -{ - wstackstring wold,wnew; - if(!wold.convert(old_name) || !wnew.convert(new_name)) { - errno = EINVAL; - return -1; - } - return _wrename(wold.c_str(),wnew.c_str()); -} -/// -/// \brief Same as rename but name is UTF-8 string -/// -/// If invalid UTF-8 given, -1 is returned and errno is set to EINVAL -/// -inline int remove(char const *name) -{ - wstackstring wname; - if(!wname.convert(name)) { - errno = EINVAL; - return -1; - } - return _wremove(wname.c_str()); -} -#endif -} // nowide -} // namespace boost - -#ifdef BOOST_MSVC -#pragma warning(pop) -#endif - -#endif -/// -// vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 diff --git a/src/boost/nowide/cstdlib.hpp b/src/boost/nowide/cstdlib.hpp deleted file mode 100644 index 27e20610a3..0000000000 --- a/src/boost/nowide/cstdlib.hpp +++ /dev/null @@ -1,16 +0,0 @@ -// -// Copyright (c) 2012 Artyom Beilis (Tonkikh) -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -#ifndef BOOST_NOWIDE_CSTDLIB_HPP_INCLUDED -#define BOOST_NOWIDE_CSTDLIB_HPP_INCLUDED - -#include -#include - -#endif -/// -// vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 diff --git a/src/boost/nowide/filebuf.hpp b/src/boost/nowide/filebuf.hpp deleted file mode 100644 index 2d6f4a443f..0000000000 --- a/src/boost/nowide/filebuf.hpp +++ /dev/null @@ -1,415 +0,0 @@ -// -// Copyright (c) 2012 Artyom Beilis (Tonkikh) -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -#ifndef BOOST_NOWIDE_FILEBUF_HPP -#define BOOST_NOWIDE_FILEBUF_HPP - -#include -#include -#include -#include -#include -#include - -#ifdef BOOST_MSVC -# pragma warning(push) -# pragma warning(disable : 4996 4244 4800) -#endif - - -namespace boost { -namespace nowide { -#if !defined(BOOST_WINDOWS) && !defined(BOOST_NOWIDE_FSTREAM_TESTS) && !defined(BOOST_NOWIDE_DOXYGEN) - using std::basic_filebuf; - using std::filebuf; -#else // Windows - - /// - /// \brief This forward declaration defined the basic_filebuf type. - /// - /// it is implemented and specialized for CharType = char, it behaves - /// implements std::filebuf over standard C I/O - /// - template > - class basic_filebuf; - - /// - /// \brief This is implementation of std::filebuf - /// - /// it is implemented and specialized for CharType = char, it behaves - /// implements std::filebuf over standard C I/O - /// - template<> - class basic_filebuf : public std::basic_streambuf { - public: - /// - /// Creates new filebuf - /// - basic_filebuf() : - buffer_size_(4), - buffer_(0), - file_(0), - own_(true), - mode_(std::ios::in | std::ios::out) - { - setg(0,0,0); - setp(0,0); - } - - virtual ~basic_filebuf() - { - if(file_) { - ::fclose(file_); - file_ = 0; - } - if(own_ && buffer_) - delete [] buffer_; - } - - /// - /// Same as std::filebuf::open but s is UTF-8 string - /// - basic_filebuf *open(std::string const &s,std::ios_base::openmode mode) - { - return open(s.c_str(),mode); - } - /// - /// Same as std::filebuf::open but s is UTF-8 string - /// - basic_filebuf *open(char const *s,std::ios_base::openmode mode) - { - if(file_) { - sync(); - ::fclose(file_); - file_ = 0; - } - bool ate = bool(mode & std::ios_base::ate); - if(ate) - mode = mode ^ std::ios_base::ate; - wchar_t const *smode = get_mode(mode); - if(!smode) - return 0; - wstackstring name; - if(!name.convert(s)) - return 0; - #ifdef BOOST_NOWIDE_FSTREAM_TESTS - FILE *f = ::fopen(s,boost::nowide::convert(smode).c_str()); - #else - FILE *f = ::_wfopen(name.c_str(),smode); - #endif - if(!f) - return 0; - if(ate && fseek(f,0,SEEK_END)!=0) { - fclose(f); - return 0; - } - file_ = f; - return this; - } - /// - /// Same as std::filebuf::close() - /// - basic_filebuf *close() - { - bool res = sync() == 0; - if(file_) { - if(::fclose(file_)!=0) - res = false; - file_ = 0; - } - return res ? this : 0; - } - /// - /// Same as std::filebuf::is_open() - /// - bool is_open() const - { - return file_ != 0; - } - - private: - void make_buffer() - { - if(buffer_) - return; - if(buffer_size_ > 0) { - buffer_ = new char [buffer_size_]; - own_ = true; - } - } - protected: - - virtual std::streambuf *setbuf(char *s,std::streamsize n) - { - if(!buffer_ && n>=0) { - buffer_ = s; - buffer_size_ = n; - own_ = false; - } - return this; - } - -#ifdef BOOST_NOWIDE_DEBUG_FILEBUF - - void print_buf(char *b,char *p,char *e) - { - std::cerr << "-- Is Null: " << (b==0) << std::endl;; - if(b==0) - return; - if(e != 0) - std::cerr << "-- Total: " << e - b <<" offset from start " << p - b << std::endl; - else - std::cerr << "-- Total: " << p - b << std::endl; - - std::cerr << "-- ["; - for(char *ptr = b;ptrprint_state(); - } - ~print_guard() - { - std::cerr << "Out: " << f << std::endl; - self->print_state(); - } - basic_filebuf *self; - char const *f; - }; -#else -#endif - - int overflow(int c) - { -#ifdef BOOST_NOWIDE_DEBUG_FILEBUF - print_guard g(this,__FUNCTION__); -#endif - if(!file_) - return EOF; - - if(fixg() < 0) - return EOF; - - size_t n = pptr() - pbase(); - if(n > 0) { - if(::fwrite(pbase(),1,n,file_) < n) - return -1; - fflush(file_); - } - - if(buffer_size_ > 0) { - make_buffer(); - setp(buffer_,buffer_+buffer_size_); - if(c!=EOF) - sputc(c); - } - else if(c!=EOF) { - if(::fputc(c,file_)==EOF) - return EOF; - fflush(file_); - } - return 0; - } - - - int sync() - { - return overflow(EOF); - } - - int underflow() - { -#ifdef BOOST_NOWIDE_DEBUG_FILEBUF - print_guard g(this,__FUNCTION__); -#endif - if(!file_) - return EOF; - if(fixp() < 0) - return EOF; - if(buffer_size_ == 0) { - int c = ::fgetc(file_); - if(c==EOF) { - return EOF; - } - last_char_ = c; - setg(&last_char_,&last_char_,&last_char_ + 1); - return c; - } - make_buffer(); - size_t n = ::fread(buffer_,1,buffer_size_,file_); - setg(buffer_,buffer_,buffer_+n); - if(n == 0) - return EOF; - return std::char_traits::to_int_type(*gptr()); - } - - int pbackfail(int) - { - return pubseekoff(-1,std::ios::cur); - } - - std::streampos seekoff(std::streamoff off, - std::ios_base::seekdir seekdir, - std::ios_base::openmode /*m*/) - { -#ifdef BOOST_NOWIDE_DEBUG_FILEBUF - print_guard g(this,__FUNCTION__); -#endif - if(!file_) - return EOF; - if(fixp() < 0 || fixg() < 0) - return EOF; - if(seekdir == std::ios_base::cur) { - if( ::fseek(file_,off,SEEK_CUR) < 0) - return EOF; - } - else if(seekdir == std::ios_base::beg) { - if( ::fseek(file_,off,SEEK_SET) < 0) - return EOF; - } - else if(seekdir == std::ios_base::end) { - if( ::fseek(file_,off,SEEK_END) < 0) - return EOF; - } - else - return -1; - return ftell(file_); - } - std::streampos seekpos(std::streampos off,std::ios_base::openmode m) - { - return seekoff(std::streamoff(off),std::ios_base::beg,m); - } - private: - int fixg() - { - if(gptr()!=egptr()) { - std::streamsize off = gptr() - egptr(); - setg(0,0,0); - if(fseek(file_,off,SEEK_CUR) != 0) - return -1; - } - setg(0,0,0); - return 0; - } - - int fixp() - { - if(pptr()!=0) { - int r = sync(); - setp(0,0); - return r; - } - return 0; - } - - void reset(FILE *f = 0) - { - sync(); - if(file_) { - fclose(file_); - file_ = 0; - } - file_ = f; - } - - - static wchar_t const *get_mode(std::ios_base::openmode mode) - { - // - // done according to n2914 table 106 27.9.1.4 - // - - // note can't use switch case as overload operator can't be used - // in constant expression - if(mode == (std::ios_base::out)) - return L"w"; - if(mode == (std::ios_base::out | std::ios_base::app)) - return L"a"; - if(mode == (std::ios_base::app)) - return L"a"; - if(mode == (std::ios_base::out | std::ios_base::trunc)) - return L"w"; - if(mode == (std::ios_base::in)) - return L"r"; - if(mode == (std::ios_base::in | std::ios_base::out)) - return L"r+"; - if(mode == (std::ios_base::in | std::ios_base::out | std::ios_base::trunc)) - return L"w+"; - if(mode == (std::ios_base::in | std::ios_base::out | std::ios_base::app)) - return L"a+"; - if(mode == (std::ios_base::in | std::ios_base::app)) - return L"a+"; - if(mode == (std::ios_base::binary | std::ios_base::out)) - return L"wb"; - if(mode == (std::ios_base::binary | std::ios_base::out | std::ios_base::app)) - return L"ab"; - if(mode == (std::ios_base::binary | std::ios_base::app)) - return L"ab"; - if(mode == (std::ios_base::binary | std::ios_base::out | std::ios_base::trunc)) - return L"wb"; - if(mode == (std::ios_base::binary | std::ios_base::in)) - return L"rb"; - if(mode == (std::ios_base::binary | std::ios_base::in | std::ios_base::out)) - return L"r+b"; - if(mode == (std::ios_base::binary | std::ios_base::in | std::ios_base::out | std::ios_base::trunc)) - return L"w+b"; - if(mode == (std::ios_base::binary | std::ios_base::in | std::ios_base::out | std::ios_base::app)) - return L"a+b"; - if(mode == (std::ios_base::binary | std::ios_base::in | std::ios_base::app)) - return L"a+b"; - return 0; - } - - size_t buffer_size_; - char *buffer_; - FILE *file_; - bool own_; - char last_char_; - std::ios::openmode mode_; - }; - - /// - /// \brief Convinience typedef - /// - typedef basic_filebuf filebuf; - - #endif // windows - -} // nowide -} // namespace boost - -#ifdef BOOST_MSVC -# pragma warning(pop) -#endif - - -#endif - -// vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 diff --git a/src/boost/nowide/fstream.hpp b/src/boost/nowide/fstream.hpp deleted file mode 100644 index b0824a51b5..0000000000 --- a/src/boost/nowide/fstream.hpp +++ /dev/null @@ -1,283 +0,0 @@ -// -// Copyright (c) 2012 Artyom Beilis (Tonkikh) -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -#ifndef BOOST_NOWIDE_FSTREAM_INCLUDED_HPP -#define BOOST_NOWIDE_FSTREAM_INCLUDED_HPP - -//#include -#include -#include -#include -#include -#include -#include - -namespace boost { -/// -/// \brief This namespace includes implementation of the standard library functios -/// such that they accept UTF-8 strings on Windows. On other platforms it is just an alias -/// of std namespace (i.e. not on Windows) -/// -namespace nowide { -#if !defined(BOOST_WINDOWS) && !defined(BOOST_NOWIDE_FSTREAM_TESTS) && !defined(BOOST_NOWIDE_DOXYGEN) - - using std::basic_ifstream; - using std::basic_ofstream; - using std::basic_fstream; - using std::ifstream; - using std::ofstream; - using std::fstream; - -#else - /// - /// \brief Same as std::basic_ifstream but accepts UTF-8 strings under Windows - /// - template > - class basic_ifstream : public std::basic_istream - { - public: - typedef basic_filebuf internal_buffer_type; - typedef std::basic_istream internal_stream_type; - - basic_ifstream() : - internal_stream_type(0) - { - buf_.reset(new internal_buffer_type()); - std::ios::rdbuf(buf_.get()); - } - - explicit basic_ifstream(char const *file_name,std::ios_base::openmode mode = std::ios_base::in) : - internal_stream_type(0) - { - buf_.reset(new internal_buffer_type()); - std::ios::rdbuf(buf_.get()); - open(file_name,mode); - } - - explicit basic_ifstream(std::string const &file_name,std::ios_base::openmode mode = std::ios_base::in) : - internal_stream_type(0) - { - buf_.reset(new internal_buffer_type()); - std::ios::rdbuf(buf_.get()); - open(file_name,mode); - } - - - void open(std::string const &file_name,std::ios_base::openmode mode = std::ios_base::in) - { - open(file_name.c_str(),mode); - } - void open(char const *file_name,std::ios_base::openmode mode = std::ios_base::in) - { - if(!buf_->open(file_name,mode | std::ios_base::in)) { - this->setstate(std::ios_base::failbit); - } - else { - this->clear(); - } - } - bool is_open() - { - return buf_->is_open(); - } - bool is_open() const - { - return buf_->is_open(); - } - void close() - { - if(!buf_->close()) - this->setstate(std::ios_base::failbit); - else - this->clear(); - } - - internal_buffer_type *rdbuf() const - { - return buf_.get(); - } - ~basic_ifstream() - { - buf_->close(); - } - - private: - boost::scoped_ptr buf_; - }; - - /// - /// \brief Same as std::basic_ofstream but accepts UTF-8 strings under Windows - /// - - template > - class basic_ofstream : public std::basic_ostream - { - public: - typedef basic_filebuf internal_buffer_type; - typedef std::basic_ostream internal_stream_type; - - basic_ofstream() : - internal_stream_type(0) - { - buf_.reset(new internal_buffer_type()); - std::ios::rdbuf(buf_.get()); - } - explicit basic_ofstream(char const *file_name,std::ios_base::openmode mode = std::ios_base::out) : - internal_stream_type(0) - { - buf_.reset(new internal_buffer_type()); - std::ios::rdbuf(buf_.get()); - open(file_name,mode); - } - explicit basic_ofstream(std::string const &file_name,std::ios_base::openmode mode = std::ios_base::out) : - internal_stream_type(0) - { - buf_.reset(new internal_buffer_type()); - std::ios::rdbuf(buf_.get()); - open(file_name,mode); - } - void open(std::string const &file_name,std::ios_base::openmode mode = std::ios_base::out) - { - open(file_name.c_str(),mode); - } - void open(char const *file_name,std::ios_base::openmode mode = std::ios_base::out) - { - if(!buf_->open(file_name,mode | std::ios_base::out)) { - this->setstate(std::ios_base::failbit); - } - else { - this->clear(); - } - } - bool is_open() - { - return buf_->is_open(); - } - bool is_open() const - { - return buf_->is_open(); - } - void close() - { - if(!buf_->close()) - this->setstate(std::ios_base::failbit); - else - this->clear(); - } - - internal_buffer_type *rdbuf() const - { - return buf_.get(); - } - ~basic_ofstream() - { - buf_->close(); - } - - private: - boost::scoped_ptr buf_; - }; - - /// - /// \brief Same as std::basic_fstream but accepts UTF-8 strings under Windows - /// - - template > - class basic_fstream : public std::basic_iostream - { - public: - typedef basic_filebuf internal_buffer_type; - typedef std::basic_iostream internal_stream_type; - - basic_fstream() : - internal_stream_type(0) - { - buf_.reset(new internal_buffer_type()); - std::ios::rdbuf(buf_.get()); - } - explicit basic_fstream(char const *file_name,std::ios_base::openmode mode = std::ios_base::out | std::ios_base::in) : - internal_stream_type(0) - { - buf_.reset(new internal_buffer_type()); - std::ios::rdbuf(buf_.get()); - open(file_name,mode); - } - explicit basic_fstream(std::string const &file_name,std::ios_base::openmode mode = std::ios_base::out | std::ios_base::in) : - internal_stream_type(0) - { - buf_.reset(new internal_buffer_type()); - std::ios::rdbuf(buf_.get()); - open(file_name,mode); - } - void open(std::string const &file_name,std::ios_base::openmode mode = std::ios_base::out | std::ios_base::out) - { - open(file_name.c_str(),mode); - } - void open(char const *file_name,std::ios_base::openmode mode = std::ios_base::out | std::ios_base::out) - { - if(!buf_->open(file_name,mode)) { - this->setstate(std::ios_base::failbit); - } - else { - this->clear(); - } - } - bool is_open() - { - return buf_->is_open(); - } - bool is_open() const - { - return buf_->is_open(); - } - void close() - { - if(!buf_->close()) - this->setstate(std::ios_base::failbit); - else - this->clear(); - } - - internal_buffer_type *rdbuf() const - { - return buf_.get(); - } - ~basic_fstream() - { - buf_->close(); - } - - private: - boost::scoped_ptr buf_; - }; - - - /// - /// \brief Same as std::filebuf but accepts UTF-8 strings under Windows - /// - typedef basic_filebuf filebuf; - /// - /// Same as std::ifstream but accepts UTF-8 strings under Windows - /// - typedef basic_ifstream ifstream; - /// - /// Same as std::ofstream but accepts UTF-8 strings under Windows - /// - typedef basic_ofstream ofstream; - /// - /// Same as std::fstream but accepts UTF-8 strings under Windows - /// - typedef basic_fstream fstream; - -#endif -} // nowide -} // namespace boost - - - -#endif -// vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 diff --git a/src/boost/nowide/integration/filesystem.hpp b/src/boost/nowide/integration/filesystem.hpp deleted file mode 100644 index c2a44b4ee5..0000000000 --- a/src/boost/nowide/integration/filesystem.hpp +++ /dev/null @@ -1,28 +0,0 @@ -// -// Copyright (c) 2012 Artyom Beilis (Tonkikh) -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -#ifndef BOOST_NOWIDE_INTEGRATION_FILESYSTEM_HPP_INCLUDED -#define BOOST_NOWIDE_INTEGRATION_FILESYSTEM_HPP_INCLUDED - -#include -#include -namespace boost { - namespace nowide { - /// - /// Instal utf8_codecvt facet into boost::filesystem::path such all char strings are interpreted as utf-8 strings - /// - inline void nowide_filesystem() - { - std::locale tmp = std::locale(std::locale(),new boost::nowide::utf8_codecvt()); - boost::filesystem::path::imbue(tmp); - } - } // nowide -} // boost - -#endif -/// -// vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 diff --git a/src/boost/nowide/iostream.cpp b/src/boost/nowide/iostream.cpp deleted file mode 100644 index 6b9099110b..0000000000 --- a/src/boost/nowide/iostream.cpp +++ /dev/null @@ -1,261 +0,0 @@ -// -// Copyright (c) 2012 Artyom Beilis (Tonkikh) -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -#define BOOST_NOWIDE_SOURCE -#include -#include -#include -#include - -#ifdef BOOST_WINDOWS - -#ifndef NOMINMAX -# define NOMINMAX -#endif - - -#include - -namespace boost { -namespace nowide { -namespace details { - class console_output_buffer : public std::streambuf { - public: - console_output_buffer(HANDLE h) : - handle_(h), - isatty_(false) - { - if(handle_) { - DWORD dummy; - isatty_ = GetConsoleMode(handle_,&dummy) == TRUE; - } - } - protected: - int sync() - { - return overflow(EOF); - } - int overflow(int c) - { - if(!handle_) - return -1; - int n = pptr() - pbase(); - int r = 0; - - if(n > 0 && (r=write(pbase(),n)) < 0) - return -1; - if(r < n) { - memmove(pbase(),pbase() + r,n-r); - } - setp(buffer_, buffer_ + buffer_size); - pbump(n-r); - if(c!=EOF) - sputc(c); - return 0; - } - private: - - int write(char const *p,int n) - { - namespace uf = boost::locale::utf; - char const *b = p; - char const *e = p+n; - DWORD size=0; - if(!isatty_) { - if(!WriteFile(handle_,p,n,&size,0) || static_cast(size) != n) - return -1; - return n; - } - if(n > buffer_size) - return -1; - wchar_t *out = wbuffer_; - uf::code_point c; - size_t decoded = 0; - while(p < e && (c = uf::utf_traits::decode(p,e))!=uf::illegal && c!=uf::incomplete) { - out = uf::utf_traits::encode(c,out); - decoded = p-b; - } - if(c==uf::illegal) - return -1; - if(!WriteConsoleW(handle_,wbuffer_,out - wbuffer_,&size,0)) - return -1; - return decoded; - } - - static const int buffer_size = 1024; - char buffer_[buffer_size]; - wchar_t wbuffer_[buffer_size]; // for null - HANDLE handle_; - bool isatty_; - }; - - class console_input_buffer: public std::streambuf { - public: - console_input_buffer(HANDLE h) : - handle_(h), - isatty_(false), - wsize_(0) - { - if(handle_) { - DWORD dummy; - isatty_ = GetConsoleMode(handle_,&dummy) == TRUE; - } - } - - protected: - int pbackfail(int c) - { - if(c==EOF) - return EOF; - - if(gptr()!=eback()) { - gbump(-1); - *gptr() = c; - return 0; - } - - if(pback_buffer_.empty()) { - pback_buffer_.resize(4); - char *b = &pback_buffer_[0]; - char *e = b + pback_buffer_.size(); - setg(b,e-1,e); - *gptr() = c; - } - else { - size_t n = pback_buffer_.size(); - std::vector tmp; - tmp.resize(n*2); - memcpy(&tmp[n],&pback_buffer_[0],n); - tmp.swap(pback_buffer_); - char *b = &pback_buffer_[0]; - char *e = b + n * 2; - char *p = b+n-1; - *p = c; - setg(b,p,e); - } - - return 0; - } - - int underflow() - { - if(!handle_) - return -1; - if(!pback_buffer_.empty()) - pback_buffer_.clear(); - - size_t n = read(); - setg(buffer_,buffer_,buffer_+n); - if(n == 0) - return EOF; - return std::char_traits::to_int_type(*gptr()); - } - - private: - - size_t read() - { - namespace uf = boost::locale::utf; - if(!isatty_) { - DWORD read_bytes = 0; - if(!ReadFile(handle_,buffer_,buffer_size,&read_bytes,0)) - return 0; - return read_bytes; - } - DWORD read_wchars = 0; - size_t n = wbuffer_size - wsize_; - if(!ReadConsoleW(handle_,wbuffer_,n,&read_wchars,0)) - return 0; - wsize_ += read_wchars; - char *out = buffer_; - wchar_t *b = wbuffer_; - wchar_t *e = b + wsize_; - wchar_t *p = b; - uf::code_point c; - wsize_ = e-p; - while(p < e && (c = uf::utf_traits::decode(p,e))!=uf::illegal && c!=uf::incomplete) { - out = uf::utf_traits::encode(c,out); - wsize_ = e-p; - } - - if(c==uf::illegal) - return -1; - - - if(c==uf::incomplete) { - memmove(b,e-wsize_,sizeof(wchar_t)*wsize_); - } - - return out - buffer_; - } - - static const size_t buffer_size = 1024 * 3; - static const size_t wbuffer_size = 1024; - char buffer_[buffer_size]; - wchar_t wbuffer_[buffer_size]; // for null - HANDLE handle_; - bool isatty_; - int wsize_; - std::vector pback_buffer_; - }; - - winconsole_ostream::winconsole_ostream(int fd) : std::ostream(0) - { - HANDLE h = 0; - switch(fd) { - case 1: - h = GetStdHandle(STD_OUTPUT_HANDLE); - break; - case 2: - h = GetStdHandle(STD_ERROR_HANDLE); - break; - } - d.reset(new console_output_buffer(h)); - std::ostream::rdbuf(d.get()); - } - - winconsole_ostream::~winconsole_ostream() - { - } - - winconsole_istream::winconsole_istream() : std::istream(0) - { - HANDLE h = GetStdHandle(STD_INPUT_HANDLE); - d.reset(new console_input_buffer(h)); - std::istream::rdbuf(d.get()); - } - - winconsole_istream::~winconsole_istream() - { - } - -} // details - -BOOST_NOWIDE_DECL details::winconsole_istream cin; -BOOST_NOWIDE_DECL details::winconsole_ostream cout(1); -BOOST_NOWIDE_DECL details::winconsole_ostream cerr(2); -BOOST_NOWIDE_DECL details::winconsole_ostream clog(2); - -namespace { - struct initialize { - initialize() - { - boost::nowide::cin.tie(&boost::nowide::cout); - boost::nowide::cerr.tie(&boost::nowide::cout); - boost::nowide::clog.tie(&boost::nowide::cout); - } - } inst; -} - - - -} // nowide -} // namespace boost - -#endif -/// -// vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 diff --git a/src/boost/nowide/iostream.hpp b/src/boost/nowide/iostream.hpp deleted file mode 100644 index 6ab004a254..0000000000 --- a/src/boost/nowide/iostream.hpp +++ /dev/null @@ -1,99 +0,0 @@ -// -// Copyright (c) 2012 Artyom Beilis (Tonkikh) -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -#ifndef BOOST_NOWIDE_IOSTREAM_HPP_INCLUDED -#define BOOST_NOWIDE_IOSTREAM_HPP_INCLUDED - -#include -#include -#include -#include -#include - -#ifdef BOOST_MSVC -# pragma warning(push) -# pragma warning(disable : 4251) -#endif - - -namespace boost { -namespace nowide { - #if !defined(BOOST_WINDOWS) && !defined(BOOST_NOWIDE_DOXYGEN) - using std::cout; - using std::cerr; - using std::cin; - using std::clog; - #else - - /// \cond INTERNAL - namespace details { - class console_output_buffer; - class console_input_buffer; - - class BOOST_NOWIDE_DECL winconsole_ostream : public std::ostream { - winconsole_ostream(winconsole_ostream const &); - void operator=(winconsole_ostream const &); - public: - winconsole_ostream(int fd); - ~winconsole_ostream(); - private: - boost::scoped_ptr d; - }; - - class BOOST_NOWIDE_DECL winconsole_istream : public std::istream { - winconsole_istream(winconsole_istream const &); - void operator=(winconsole_istream const &); - public: - - winconsole_istream(); - ~winconsole_istream(); - private: - struct data; - boost::scoped_ptr d; - }; - } // details - - /// \endcond - - /// - /// \brief Same as std::cin, but uses UTF-8 - /// - /// Note, the stream is not synchronized with stdio and not affected by std::ios::sync_with_stdio - /// - extern BOOST_NOWIDE_DECL details::winconsole_istream cin; - /// - /// \brief Same as std::cout, but uses UTF-8 - /// - /// Note, the stream is not synchronized with stdio and not affected by std::ios::sync_with_stdio - /// - extern BOOST_NOWIDE_DECL details::winconsole_ostream cout; - /// - /// \brief Same as std::cerr, but uses UTF-8 - /// - /// Note, the stream is not synchronized with stdio and not affected by std::ios::sync_with_stdio - /// - extern BOOST_NOWIDE_DECL details::winconsole_ostream cerr; - /// - /// \brief Same as std::clog, but uses UTF-8 - /// - /// Note, the stream is not synchronized with stdio and not affected by std::ios::sync_with_stdio - /// - extern BOOST_NOWIDE_DECL details::winconsole_ostream clog; - - #endif - -} // nowide -} // namespace boost - -#ifdef BOOST_MSVC -# pragma warning(pop) -#endif - - -#endif -/// -// vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 diff --git a/src/boost/nowide/stackstring.hpp b/src/boost/nowide/stackstring.hpp deleted file mode 100644 index 948a22f7f6..0000000000 --- a/src/boost/nowide/stackstring.hpp +++ /dev/null @@ -1,154 +0,0 @@ -// -// Copyright (c) 2012 Artyom Beilis (Tonkikh) -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -#ifndef BOOST_NOWIDE_DETAILS_WIDESTR_H_INCLUDED -#define BOOST_NOWIDE_DETAILS_WIDESTR_H_INCLUDED -#include -#include -#include - -namespace boost { -namespace nowide { - -/// -/// \brief A class that allows to create a temporary wide or narrow UTF strings from -/// wide or narrow UTF source. -/// -/// It uses on stack buffer of the string is short enough -/// and allocated a buffer on the heap if the size of the buffer is too small -/// -template -class basic_stackstring { -public: - - static const size_t buffer_size = BufferSize; - typedef CharOut output_char; - typedef CharIn input_char; - - basic_stackstring(basic_stackstring const &other) : - mem_buffer_(0) - { - clear(); - if(other.mem_buffer_) { - size_t len = 0; - while(other.mem_buffer_[len]) - len ++; - mem_buffer_ = new output_char[len + 1]; - memcpy(mem_buffer_,other.mem_buffer_,sizeof(output_char) * (len+1)); - } - else { - memcpy(buffer_,other.buffer_,buffer_size * sizeof(output_char)); - } - } - - void swap(basic_stackstring &other) - { - std::swap(mem_buffer_,other.mem_buffer_); - for(size_t i=0;i wstackstring; -/// -/// Convinience typedef -/// -typedef basic_stackstring stackstring; -/// -/// Convinience typedef -/// -typedef basic_stackstring wshort_stackstring; -/// -/// Convinience typedef -/// -typedef basic_stackstring short_stackstring; - - -} // nowide -} // namespace boost - -#endif -/// -// vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 diff --git a/src/boost/nowide/system.hpp b/src/boost/nowide/system.hpp deleted file mode 100644 index a1fc975059..0000000000 --- a/src/boost/nowide/system.hpp +++ /dev/null @@ -1,46 +0,0 @@ -// -// Copyright (c) 2012 Artyom Beilis (Tonkikh) -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -#ifndef BOOST_NOWIDE_CSTDLIB_HPP -#define BOOST_NOWIDE_CSTDLIB_HPP - -#include -#include -#include -namespace boost { -namespace nowide { - -#if !defined(BOOST_WINDOWS) && !defined(BOOST_NOWIDE_DOXYGEN) - -using ::system; - -#else // Windows - -/// -/// Same as std::system but cmd is UTF-8. -/// -/// If the input is not valid UTF-8, -1 returned and errno set to EINVAL -/// -inline int system(char const *cmd) -{ - if(!cmd) - return _wsystem(0); - wstackstring wcmd; - if(!wcmd.convert(cmd)) { - errno = EINVAL; - return -1; - } - return _wsystem(wcmd.c_str()); -} - -#endif -} // nowide -} // namespace boost - -#endif -/// -// vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 diff --git a/src/boost/nowide/utf8_codecvt.hpp b/src/boost/nowide/utf8_codecvt.hpp deleted file mode 100644 index 877c9f0e0d..0000000000 --- a/src/boost/nowide/utf8_codecvt.hpp +++ /dev/null @@ -1,499 +0,0 @@ -// -// Copyright (c) 2015 Artyom Beilis (Tonkikh) -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -#ifndef BOOST_NOWIDE_UTF8_CODECVT_HPP -#define BOOST_NOWIDE_UTF8_CODECVT_HPP - -#include -#include -#include -#include - -namespace boost { -namespace nowide { - -// -// Make sure that mbstate can keep 16 bit of UTF-16 sequence -// -BOOST_STATIC_ASSERT(sizeof(std::mbstate_t)>=2); - -#ifdef _MSC_VER -// MSVC do_length is non-standard it counts wide characters instead of narrow and does not change mbstate -#define BOOST_NOWIDE_DO_LENGTH_MBSTATE_CONST -#endif - -template -class utf8_codecvt; - -template -class utf8_codecvt : public std::codecvt -{ -public: - utf8_codecvt(size_t refs = 0) : std::codecvt(refs) - { - } -protected: - - typedef CharType uchar; - - virtual std::codecvt_base::result do_unshift(std::mbstate_t &s,char *from,char * /*to*/,char *&next) const - { - boost::uint16_t &state = *reinterpret_cast(&s); -#ifdef DEBUG_CODECVT - std::cout << "Entering unshift " << std::hex << state << std::dec << std::endl; -#endif - if(state != 0) - return std::codecvt_base::error; - next=from; - return std::codecvt_base::ok; - } - virtual int do_encoding() const throw() - { - return 0; - } - virtual int do_max_length() const throw() - { - return 4; - } - virtual bool do_always_noconv() const throw() - { - return false; - } - - virtual int - do_length( std::mbstate_t - #ifdef BOOST_NOWIDE_DO_LENGTH_MBSTATE_CONST - const - #endif - &std_state, - char const *from, - char const *from_end, - size_t max) const - { - #ifndef BOOST_NOWIDE_DO_LENGTH_MBSTATE_CONST - char const *save_from = from; - boost::uint16_t &state = *reinterpret_cast(&std_state); - #else - size_t save_max = max; - boost::uint16_t state = *reinterpret_cast(&std_state); - #endif - while(max > 0 && from < from_end){ - char const *prev_from = from; - boost::uint32_t ch=boost::locale::utf::utf_traits::decode(from,from_end); - if(ch==boost::locale::utf::incomplete || ch==boost::locale::utf::illegal) { - from = prev_from; - break; - } - max --; - if(ch > 0xFFFF) { - if(state == 0) { - from = prev_from; - state = 1; - } - else { - state = 0; - } - } - } - #ifndef BOOST_NOWIDE_DO_LENGTH_MBSTATE_CONST - return from - save_from; - #else - return int(save_max - max); - #endif - } - - - virtual std::codecvt_base::result - do_in( std::mbstate_t &std_state, - char const *from, - char const *from_end, - char const *&from_next, - uchar *to, - uchar *to_end, - uchar *&to_next) const - { - std::codecvt_base::result r=std::codecvt_base::ok; - - // mbstate_t is POD type and should be initialized to 0 (i.a. state = stateT()) - // according to standard. We use it to keep a flag 0/1 for surrogate pair writing - // - // if 0 no code above >0xFFFF observed, of 1 a code above 0xFFFF observerd - // and first pair is written, but no input consumed - boost::uint16_t &state = *reinterpret_cast(&std_state); - while(to < to_end && from < from_end) - { -#ifdef DEBUG_CODECVT - std::cout << "Entering IN--------------" << std::endl; - std::cout << "State " << std::hex << state <::decode(from,from_end); - - if(ch==boost::locale::utf::illegal) { - from = from_saved; - r=std::codecvt_base::error; - break; - } - if(ch==boost::locale::utf::incomplete) { - from = from_saved; - r=std::codecvt_base::partial; - break; - } - // Normal codepoints go direcly to stream - if(ch <= 0xFFFF) { - *to++=ch; - } - else { - // for other codepoints we do following - // - // 1. We can't consume our input as we may find ourselfs - // in state where all input consumed but not all output written,i.e. only - // 1st pair is written - // 2. We only write first pair and mark this in the state, we also revert back - // the from pointer in order to make sure this codepoint would be read - // once again and then we would consume our input together with writing - // second surrogate pair - ch-=0x10000; - boost::uint16_t vh = ch >> 10; - boost::uint16_t vl = ch & 0x3FF; - boost::uint16_t w1 = vh + 0xD800; - boost::uint16_t w2 = vl + 0xDC00; - if(state == 0) { - from = from_saved; - *to++ = w1; - state = 1; - } - else { - *to++ = w2; - state = 0; - } - } - } - from_next=from; - to_next=to; - if(r == std::codecvt_base::ok && (from!=from_end || state!=0)) - r = std::codecvt_base::partial; -#ifdef DEBUG_CODECVT - std::cout << "Returning "; - switch(r) { - case std::codecvt_base::ok: - std::cout << "ok" << std::endl; - break; - case std::codecvt_base::partial: - std::cout << "partial" << std::endl; - break; - case std::codecvt_base::error: - std::cout << "error" << std::endl; - break; - default: - std::cout << "other" << std::endl; - break; - } - std::cout << "State " << std::hex << state <=2 in order - // to be able to store first observerd surrogate pair - // - // State: state!=0 - a first surrogate pair was observerd (state = first pair), - // we expect the second one to come and then zero the state - /// - boost::uint16_t &state = *reinterpret_cast(&std_state); - while(to < to_end && from < from_end) - { -#ifdef DEBUG_CODECVT - std::cout << "Entering OUT --------------" << std::endl; - std::cout << "State " << std::hex << state <::width(ch); - if(to_end - to < len) { - r=std::codecvt_base::partial; - break; - } - to = boost::locale::utf::utf_traits::encode(ch,to); - state = 0; - from++; - } - from_next=from; - to_next=to; - if(r==std::codecvt_base::ok && from!=from_end) - r = std::codecvt_base::partial; -#ifdef DEBUG_CODECVT - std::cout << "Returning "; - switch(r) { - case std::codecvt_base::ok: - std::cout << "ok" << std::endl; - break; - case std::codecvt_base::partial: - std::cout << "partial" << std::endl; - break; - case std::codecvt_base::error: - std::cout << "error" << std::endl; - break; - default: - std::cout << "other" << std::endl; - break; - } - std::cout << "State " << std::hex << state < -class utf8_codecvt : public std::codecvt -{ -public: - utf8_codecvt(size_t refs = 0) : std::codecvt(refs) - { - } -protected: - - typedef CharType uchar; - - virtual std::codecvt_base::result do_unshift(std::mbstate_t &/*s*/,char *from,char * /*to*/,char *&next) const - { - next=from; - return std::codecvt_base::ok; - } - virtual int do_encoding() const throw() - { - return 0; - } - virtual int do_max_length() const throw() - { - return 4; - } - virtual bool do_always_noconv() const throw() - { - return false; - } - - virtual int - do_length( std::mbstate_t - #ifdef BOOST_NOWIDE_DO_LENGTH_MBSTATE_CONST - const - #endif - &/*state*/, - char const *from, - char const *from_end, - size_t max) const - { - #ifndef BOOST_NOWIDE_DO_LENGTH_MBSTATE_CONST - char const *start_from = from; - #else - size_t save_max = max; - #endif - - while(max > 0 && from < from_end){ - char const *save_from = from; - boost::uint32_t ch=boost::locale::utf::utf_traits::decode(from,from_end); - if(ch==boost::locale::utf::incomplete || ch==boost::locale::utf::illegal) { - from = save_from; - break; - } - max--; - } - #ifndef BOOST_NOWIDE_DO_LENGTH_MBSTATE_CONST - return from - start_from; - #else - return save_max - max; - #endif - } - - - virtual std::codecvt_base::result - do_in( std::mbstate_t &/*state*/, - char const *from, - char const *from_end, - char const *&from_next, - uchar *to, - uchar *to_end, - uchar *&to_next) const - { - std::codecvt_base::result r=std::codecvt_base::ok; - - // mbstate_t is POD type and should be initialized to 0 (i.a. state = stateT()) - // according to standard. We use it to keep a flag 0/1 for surrogate pair writing - // - // if 0 no code above >0xFFFF observed, of 1 a code above 0xFFFF observerd - // and first pair is written, but no input consumed - while(to < to_end && from < from_end) - { -#ifdef DEBUG_CODECVT - std::cout << "Entering IN--------------" << std::endl; - std::cout << "State " << std::hex << state <::decode(from,from_end); - - if(ch==boost::locale::utf::illegal) { - r=std::codecvt_base::error; - from = from_saved; - break; - } - if(ch==boost::locale::utf::incomplete) { - r=std::codecvt_base::partial; - from=from_saved; - break; - } - *to++=ch; - } - from_next=from; - to_next=to; - if(r == std::codecvt_base::ok && from!=from_end) - r = std::codecvt_base::partial; -#ifdef DEBUG_CODECVT - std::cout << "Returning "; - switch(r) { - case std::codecvt_base::ok: - std::cout << "ok" << std::endl; - break; - case std::codecvt_base::partial: - std::cout << "partial" << std::endl; - break; - case std::codecvt_base::error: - std::cout << "error" << std::endl; - break; - default: - std::cout << "other" << std::endl; - break; - } - std::cout << "State " << std::hex << state <::width(ch); - if(to_end - to < len) { - r=std::codecvt_base::partial; - break; - } - to = boost::locale::utf::utf_traits::encode(ch,to); - from++; - } - from_next=from; - to_next=to; - if(r==std::codecvt_base::ok && from!=from_end) - r = std::codecvt_base::partial; -#ifdef DEBUG_CODECVT - std::cout << "Returning "; - switch(r) { - case std::codecvt_base::ok: - std::cout << "ok" << std::endl; - break; - case std::codecvt_base::partial: - std::cout << "partial" << std::endl; - break; - case std::codecvt_base::error: - std::cout << "error" << std::endl; - break; - default: - std::cout << "other" << std::endl; - break; - } - std::cout << "State " << std::hex << state < - -#ifdef BOOST_NOWIDE_USE_WINDOWS_H -#include -#else - -// -// These are function prototypes... Allow to to include windows.h -// -extern "C" { - -__declspec(dllimport) wchar_t* __stdcall GetEnvironmentStringsW(void); -__declspec(dllimport) int __stdcall FreeEnvironmentStringsW(wchar_t *); -__declspec(dllimport) wchar_t* __stdcall GetCommandLineW(void); -__declspec(dllimport) wchar_t** __stdcall CommandLineToArgvW(wchar_t const *,int *); -__declspec(dllimport) unsigned long __stdcall GetLastError(); -__declspec(dllimport) void* __stdcall LocalFree(void *); -__declspec(dllimport) int __stdcall SetEnvironmentVariableW(wchar_t const *,wchar_t const *); -__declspec(dllimport) unsigned long __stdcall GetEnvironmentVariableW(wchar_t const *,wchar_t *,unsigned long); - -} - -#endif - - - -#endif -/// -// vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 diff --git a/src/imgui/imconfig.h b/src/imgui/imconfig.h index b230fa718c..bd83a3c44e 100644 --- a/src/imgui/imconfig.h +++ b/src/imgui/imconfig.h @@ -173,6 +173,9 @@ namespace ImGui const wchar_t SphereButtonIcon = 0x0816; const wchar_t GapFillIcon = 0x0817; const wchar_t ConfirmIcon = 0x0818; + const wchar_t gCodeButtonIcon = 0x0819; // ORCA + const wchar_t VisibleIcon = 0x0820; // ORCA + const wchar_t HiddenIcon = 0x0821; // ORCA const wchar_t MinimalizeDarkButton = 0x081C; const wchar_t MinimalizeHoverDarkButton = 0x081D; diff --git a/src/libslic3r/AppConfig.cpp b/src/libslic3r/AppConfig.cpp index 6efaf3f670..588d1e0c0a 100644 --- a/src/libslic3r/AppConfig.cpp +++ b/src/libslic3r/AppConfig.cpp @@ -15,7 +15,6 @@ #include #include -#include #include #include #include @@ -182,6 +181,9 @@ void AppConfig::set_defaults() if (get("reverse_mouse_wheel_zoom").empty()) set_bool("reverse_mouse_wheel_zoom", false); + if (get("camera_orbit_mult").empty()) + set("camera_orbit_mult", "1.0"); + if (get("zoom_to_mouse").empty()) set_bool("zoom_to_mouse", false); diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index 64e0a9e87f..41adb363f9 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -560,7 +560,6 @@ target_link_libraries(libslic3r miniz boost_libs clipper - nowide ${EXPAT_LIBRARIES} glu-libtess qhull diff --git a/src/libslic3r/Config.cpp b/src/libslic3r/Config.cpp index 57f51f0b23..9cd0ffa3dd 100644 --- a/src/libslic3r/Config.cpp +++ b/src/libslic3r/Config.cpp @@ -19,7 +19,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/src/libslic3r/Fill/FillBase.cpp b/src/libslic3r/Fill/FillBase.cpp index 80869397d0..4a56cddaef 100644 --- a/src/libslic3r/Fill/FillBase.cpp +++ b/src/libslic3r/Fill/FillBase.cpp @@ -153,6 +153,12 @@ void Fill::fill_surface_extrusion(const Surface* surface, const FillParams& para out.push_back(eec = new ExtrusionEntityCollection()); // Only concentric fills are not sorted. eec->no_sort = this->no_sort(); + // ORCA: special flag for flow rate calibration + auto is_flow_calib = params.extrusion_role == erTopSolidInfill && this->print_object_config->has("calib_flowrate_topinfill_special_order") && + this->print_object_config->option("calib_flowrate_topinfill_special_order")->getBool(); + if (is_flow_calib) { + eec->no_sort = true; + } size_t idx = eec->entities.size(); if (params.use_arachne) { Flow new_flow = params.flow.with_spacing(float(this->spacing)); @@ -165,11 +171,16 @@ void Fill::fill_surface_extrusion(const Surface* surface, const FillParams& para params.extrusion_role, flow_mm3_per_mm, float(flow_width), params.flow.height()); } - if (!params.can_reverse) { + + if (is_flow_calib) { for (size_t i = idx; i < eec->entities.size(); i++) - eec->entities[i]->set_reverse(); + eec->entities[i]->reverse(); + } else { + if (!params.can_reverse) { + for (size_t i = idx; i < eec->entities.size(); i++) + eec->entities[i]->set_reverse(); + } } - // Orca: run gap fill this->_create_gap_fill(surface, params, eec); } diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 6d00134253..090b91c912 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -4077,6 +4077,7 @@ LayerResult GCode::process_layer( // Extrude the skirt, brim, support, perimeters, infill ordered by the extruders. for (unsigned int extruder_id : layer_tools.extruders) { + std::string gcode_toolchange; if (has_wipe_tower) { if (!m_wipe_tower->is_empty_wipe_tower_gcode(*this, extruder_id, extruder_id == layer_tools.extruders.back())) { if (need_insert_timelapse_gcode_for_traditional && !has_insert_timelapse_gcode) { @@ -4095,11 +4096,16 @@ LayerResult GCode::process_layer( } has_insert_timelapse_gcode = true; } - gcode += m_wipe_tower->tool_change(*this, extruder_id, extruder_id == layer_tools.extruders.back()); + gcode_toolchange = m_wipe_tower->tool_change(*this, extruder_id, extruder_id == layer_tools.extruders.back()); } } else { - gcode += this->set_extruder(extruder_id, print_z); + gcode_toolchange = this->set_extruder(extruder_id, print_z); } + if (!gcode_toolchange.empty()) { + // Disable vase mode for layers that has toolchange + result.spiral_vase_enable = false; + } + gcode += std::move(gcode_toolchange); // let analyzer tag generator aware of a role type change if (layer_tools.has_wipe_tower && m_wipe_tower) @@ -5335,7 +5341,7 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description, ref_speed = EXTRUDER_CONFIG(filament_max_volumetric_speed) / _mm3_per_mm; if (EXTRUDER_CONFIG(filament_max_volumetric_speed) > 0) { - ref_speed = std::min(ref_speed, EXTRUDER_CONFIG(filament_max_volumetric_speed) / path.mm3_per_mm); + ref_speed = std::min(ref_speed, EXTRUDER_CONFIG(filament_max_volumetric_speed) / _mm3_per_mm); } if (sloped) { ref_speed = std::min(ref_speed, m_config.scarf_joint_speed.get_abs_value(ref_speed)); @@ -6064,7 +6070,8 @@ std::string GCode::travel_to(const Point& point, ExtrusionRole role, std::string // use G1 because we rely on paths being straight (G0 may make round paths) if (travel.size() >= 2) { - if (m_spiral_vase) { + // Orca: use `travel_to_xyz` to ensure we start at the correct z, in case we moved z in custom/filament change gcode + if (false/*m_spiral_vase*/) { // No lazy z lift for spiral vase mode for (size_t i = 1; i < travel.size(); ++i) { gcode += m_writer.travel_to_xy(this->point_to_gcode(travel.points[i]), comment); @@ -6292,8 +6299,7 @@ std::string GCode::retract(bool toolchange, bool is_last_retraction, LiftType li } if (needs_lift && can_lift) { - size_t extruder_id = m_writer.extruder()->id(); - gcode += m_writer.lift(!m_spiral_vase ? lift_type : LiftType::NormalLift); + gcode += m_writer.lift(lift_type, m_spiral_vase != nullptr); } return gcode; diff --git a/src/libslic3r/GCode/ExtrusionProcessor.hpp b/src/libslic3r/GCode/ExtrusionProcessor.hpp index dd0065247d..62a01db11e 100644 --- a/src/libslic3r/GCode/ExtrusionProcessor.hpp +++ b/src/libslic3r/GCode/ExtrusionProcessor.hpp @@ -442,6 +442,10 @@ public: }; float extrusion_speed = std::min(calculate_speed(curr.distance), calculate_speed(next.distance)); + // ORCA: Clamp resulting speed to lowest of calculated speed based on the overhang values and the current speed + // Fixes bug where resulting overhang speed is higher than the current speed due to (for example) volumetric flow limits. + extrusion_speed = std::min(extrusion_speed, original_speed); + if(slowdown_for_curled_edges) { float curled_speed = calculate_speed(artificial_distance_to_curled_lines); extrusion_speed = std::min(curled_speed, extrusion_speed); // adjust extrusion speed based on what is smallest - the calculated overhang speed or the artificial curled speed diff --git a/src/libslic3r/GCode/PostProcessor.cpp b/src/libslic3r/GCode/PostProcessor.cpp index 927d106b5f..1e084cd35e 100644 --- a/src/libslic3r/GCode/PostProcessor.cpp +++ b/src/libslic3r/GCode/PostProcessor.cpp @@ -8,8 +8,8 @@ #include #include #include +#include #include -#include #include // BBS diff --git a/src/libslic3r/Geometry.cpp b/src/libslic3r/Geometry.cpp index 90e65f5103..69aff57c9a 100644 --- a/src/libslic3r/Geometry.cpp +++ b/src/libslic3r/Geometry.cpp @@ -478,6 +478,16 @@ Transform3d Transformation::get_rotation_matrix() const return extract_rotation_matrix(m_matrix); } +Vec3d Transformation::get_rotation_by_quaternion() const +{ + Matrix3d rotation_matrix = m_matrix.matrix().block(0, 0, 3, 3); + Eigen::Quaterniond quaternion(rotation_matrix); + quaternion.normalize(); + Vec3d temp_rotation = quaternion.matrix().eulerAngles(2, 1, 0); + std::swap(temp_rotation(0), temp_rotation(2)); + return temp_rotation; +} + void Transformation::set_rotation(const Vec3d& rotation) { const Vec3d offset = get_offset(); @@ -839,6 +849,17 @@ TransformationSVD::TransformationSVD(const Transform3d& trafo) return curMat; } +Transformation generate_transform(const Vec3d& x_dir, const Vec3d& y_dir, const Vec3d& z_dir, const Vec3d& origin) { + Matrix3d m; + m.col(0) = x_dir.normalized(); + m.col(1) = y_dir.normalized(); + m.col(2) = z_dir.normalized(); + Transform3d mm(m); + Transformation tran(mm); + tran.set_offset(origin); + return tran; +} + bool is_point_inside_polygon_corner(const Point &a, const Point &b, const Point &c, const Point &query_point) { // Cast all input points into int64_t to prevent overflows when points are close to max values of coord_t. const Vec2i64 a_i64 = a.cast(); diff --git a/src/libslic3r/Geometry.hpp b/src/libslic3r/Geometry.hpp index 0383aadb07..9560d7aa54 100644 --- a/src/libslic3r/Geometry.hpp +++ b/src/libslic3r/Geometry.hpp @@ -421,6 +421,7 @@ public: void set_offset(Axis axis, double offset) { m_matrix.translation()[axis] = offset; } Vec3d get_rotation() const; + Vec3d get_rotation_by_quaternion() const; double get_rotation(Axis axis) const { return get_rotation()[axis]; } Transform3d get_rotation_matrix() const; @@ -545,6 +546,7 @@ inline bool is_rotation_ninety_degrees(const Vec3d &rotation) } Transformation mat_around_a_point_rotate(const Transformation& innMat, const Vec3d &pt, const Vec3d &axis, float rotate_theta_radian); +Transformation generate_transform(const Vec3d &x_dir, const Vec3d &y_dir, const Vec3d &z_dir, const Vec3d &origin); /** * Checks if a given point is inside a corner of a polygon. diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp index 1911deafaa..34e1949b98 100644 --- a/src/libslic3r/Model.cpp +++ b/src/libslic3r/Model.cpp @@ -1216,23 +1216,27 @@ bool ModelObject::make_boolean(ModelObject *cut_object, const std::string &boole return true; } -ModelVolume* ModelObject::add_volume(const TriangleMesh &mesh) +ModelVolume *ModelObject::add_volume(const TriangleMesh &mesh, bool modify_to_center_geometry) { ModelVolume* v = new ModelVolume(this, mesh); this->volumes.push_back(v); - v->center_geometry_after_creation(); - this->invalidate_bounding_box(); + if (modify_to_center_geometry) { + v->center_geometry_after_creation(); + this->invalidate_bounding_box(); + } // BBS: backup Slic3r::save_object_mesh(*this); return v; } -ModelVolume* ModelObject::add_volume(TriangleMesh &&mesh, ModelVolumeType type /*= ModelVolumeType::MODEL_PART*/) +ModelVolume *ModelObject::add_volume(TriangleMesh &&mesh, ModelVolumeType type /*= ModelVolumeType::MODEL_PART*/, bool modify_to_center_geometry) { ModelVolume* v = new ModelVolume(this, std::move(mesh), type); this->volumes.push_back(v); - v->center_geometry_after_creation(); - this->invalidate_bounding_box(); + if (modify_to_center_geometry) { + v->center_geometry_after_creation(); + this->invalidate_bounding_box(); + } // BBS: backup Slic3r::save_object_mesh(*this); return v; @@ -2260,48 +2264,12 @@ double ModelObject::get_instance_max_z(size_t instance_idx) const unsigned int ModelObject::update_instances_print_volume_state(const BuildVolume &build_volume) { unsigned int num_printable = 0; - enum { - INSIDE = 1, - OUTSIDE = 2 - }; - //BBS: add logs for build_volume //const BoundingBoxf3& print_volume = build_volume.bounding_volume(); //BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(", print_volume {%1%, %2%, %3%} to {%4%, %5%, %6%}")\ // %print_volume.min.x() %print_volume.min.y() %print_volume.min.z()%print_volume.max.x() %print_volume.max.y() %print_volume.max.z(); for (ModelInstance* model_instance : this->instances) { - unsigned int inside_outside = 0; - for (const ModelVolume *vol : this->volumes) { - if (vol->is_model_part()) { - //BBS: add bounding box empty check logic, for some volume is empty before split(it will be removed after split to object) - BoundingBoxf3 bb = vol->get_convex_hull().bounding_box(); - Vec3d size = bb.size(); - if ((size.x() == 0.f) || (size.y() == 0.f) || (size.z() == 0.f)) { - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(", object %1%'s vol %2% is empty, skip it, box: {%3%, %4%, %5%} to {%6%, %7%, %8%}")%this->name %vol->name\ - %bb.min.x() %bb.min.y() %bb.min.z()%bb.max.x() %bb.max.y() %bb.max.z(); - continue; - } - - const Transform3d matrix = model_instance->get_matrix() * vol->get_matrix(); - BuildVolume::ObjectState state = build_volume.object_state(vol->mesh().its, matrix.cast(), true /* may be below print bed */); - if (state == BuildVolume::ObjectState::Inside) - // Volume is completely inside. - inside_outside |= INSIDE; - else if (state == BuildVolume::ObjectState::Outside) - // Volume is completely outside. - inside_outside |= OUTSIDE; - else if (state == BuildVolume::ObjectState::Below) { - // Volume below the print bed, thus it is completely outside, however this does not prevent the object to be printable - // if some of its volumes are still inside the build volume. - } else - // Volume colliding with the build volume. - inside_outside |= INSIDE | OUTSIDE; - } - } - model_instance->print_volume_state = - inside_outside == (INSIDE | OUTSIDE) ? ModelInstancePVS_Partly_Outside : - inside_outside == INSIDE ? ModelInstancePVS_Inside : ModelInstancePVS_Fully_Outside; - if (inside_outside == INSIDE) { + if (model_instance->update_print_volume_state(build_volume) == ModelInstancePVS_Inside) { //BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(", object %1%'s instance inside print volum")%this->name; ++num_printable; } @@ -3329,6 +3297,46 @@ void ModelInstance::get_arrange_polygon(void *ap, const Slic3r::DynamicPrintConf ret.extrude_ids.push_back(1); } +ModelInstanceEPrintVolumeState ModelInstance::calc_print_volume_state(const BuildVolume& build_volume) const +{ + enum { + INSIDE = 1, + OUTSIDE = 2 + }; + + unsigned int inside_outside = 0; + for (const ModelVolume* vol : this->object->volumes) { + if (vol->is_model_part()) { + //BBS: add bounding box empty check logic, for some volume is empty before split(it will be removed after split to object) + BoundingBoxf3 bb = vol->get_convex_hull().bounding_box(); + Vec3d size = bb.size(); + if ((size.x() == 0.f) || (size.y() == 0.f) || (size.z() == 0.f)) { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(", object %1%'s vol %2% is empty, skip it, box: {%3%, %4%, %5%} to {%6%, %7%, %8%}")%this->object->name %vol->name\ + %bb.min.x() %bb.min.y() %bb.min.z()%bb.max.x() %bb.max.y() %bb.max.z(); + continue; + } + + const Transform3d matrix = this->get_matrix() * vol->get_matrix(); + BuildVolume::ObjectState state = build_volume.object_state(vol->mesh().its, matrix.cast(), true /* may be below print bed */); + if (state == BuildVolume::ObjectState::Inside) + // Volume is completely inside. + inside_outside |= INSIDE; + else if (state == BuildVolume::ObjectState::Outside) + // Volume is completely outside. + inside_outside |= OUTSIDE; + else if (state == BuildVolume::ObjectState::Below) { + // Volume below the print bed, thus it is completely outside, however this does not prevent the object to be printable + // if some of its volumes are still inside the build volume. + } else + // Volume colliding with the build volume. + inside_outside |= INSIDE | OUTSIDE; + } + } + + return inside_outside == (INSIDE | OUTSIDE) ? ModelInstancePVS_Partly_Outside : + inside_outside == INSIDE ? ModelInstancePVS_Inside : ModelInstancePVS_Fully_Outside; +} + indexed_triangle_set FacetsAnnotation::get_facets(const ModelVolume& mv, EnforcerBlockerType type) const { TriangleSelector selector(mv.mesh()); diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp index cee1f732c6..3866e252b7 100644 --- a/src/libslic3r/Model.hpp +++ b/src/libslic3r/Model.hpp @@ -411,8 +411,8 @@ public: return global_config.option(config_option); } - ModelVolume* add_volume(const TriangleMesh &mesh); - ModelVolume* add_volume(TriangleMesh &&mesh, ModelVolumeType type = ModelVolumeType::MODEL_PART); + ModelVolume* add_volume(const TriangleMesh &mesh, bool modify_to_center_geometry = true); + ModelVolume* add_volume(TriangleMesh &&mesh, ModelVolumeType type = ModelVolumeType::MODEL_PART, bool modify_to_center_geometry = true); ModelVolume* add_volume(const ModelVolume &volume, ModelVolumeType type = ModelVolumeType::INVALID); ModelVolume* add_volume(const ModelVolume &volume, TriangleMesh &&mesh); ModelVolume* add_volume_with_shared_mesh(const ModelVolume &other, ModelVolumeType type = ModelVolumeType::MODEL_PART); @@ -1245,11 +1245,13 @@ public: m_assemble_initialized = true; m_assemble_transformation = transformation; } - void set_assemble_from_transform(Transform3d& transform) { + void set_assemble_from_transform(const Transform3d& transform) { m_assemble_initialized = true; m_assemble_transformation.set_matrix(transform); } + Vec3d get_assemble_offset() const {return m_assemble_transformation.get_offset(); } void set_assemble_offset(const Vec3d& offset) { m_assemble_transformation.set_offset(offset); } + void set_assemble_rotation(const Vec3d &rotation) { m_assemble_transformation.set_rotation(rotation); } void rotate_assemble(double angle, const Vec3d& axis) { m_assemble_transformation.set_rotation(m_assemble_transformation.get_rotation() + Geometry::extract_euler_angles(Eigen::Quaterniond(Eigen::AngleAxisd(angle, axis)).toRotationMatrix())); } @@ -1326,6 +1328,8 @@ public: this->object->invalidate_bounding_box(); } + ModelInstanceEPrintVolumeState calc_print_volume_state(const BuildVolume& build_volume) const; + protected: friend class Print; friend class SLAPrint; @@ -1335,6 +1339,12 @@ protected: explicit ModelInstance(const ModelInstance &rhs) = default; void set_model_object(ModelObject *model_object) { object = model_object; } + ModelInstanceEPrintVolumeState update_print_volume_state(const BuildVolume& build_volume) + { + print_volume_state = calc_print_volume_state(build_volume); + return print_volume_state; + } + private: // Parent object, owning this instance. ModelObject* object; diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 28f174399c..d4caac27a7 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -34,7 +34,6 @@ //BBS: add regex #include -#include #include #include #include @@ -836,7 +835,7 @@ static std::vector s_Preset_print_options { "hole_to_polyhole", "hole_to_polyhole_threshold", "hole_to_polyhole_twisted", "mmu_segmented_region_max_width", "mmu_segmented_region_interlocking_depth", "small_area_infill_flow_compensation", "small_area_infill_flow_compensation_model", "seam_slope_type", "seam_slope_conditional", "scarf_angle_threshold", "scarf_joint_speed", "scarf_joint_flow_ratio", "seam_slope_start_height", "seam_slope_entire_loop", "seam_slope_min_length", "seam_slope_steps", "seam_slope_inner_walls", "scarf_overhang_threshold", - "interlocking_beam", "interlocking_orientation", "interlocking_beam_layer_count", "interlocking_depth", "interlocking_boundary_avoidance", "interlocking_beam_width", + "interlocking_beam", "interlocking_orientation", "interlocking_beam_layer_count", "interlocking_depth", "interlocking_boundary_avoidance", "interlocking_beam_width","calib_flowrate_topinfill_special_order" }; static std::vector s_Preset_filament_options { diff --git a/src/libslic3r/PresetBundle.cpp b/src/libslic3r/PresetBundle.cpp index 6ba8dd4f78..ba5e1de944 100644 --- a/src/libslic3r/PresetBundle.cpp +++ b/src/libslic3r/PresetBundle.cpp @@ -16,7 +16,6 @@ #include #include #include -#include #include #include #include diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 7446f4cfb7..993a6889b6 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -3206,6 +3206,11 @@ void PrintConfigDef::init_fff_params() def->mode = comAdvanced; def->set_default_value(new ConfigOptionInt(2)); + // ORCA: special flag for flow rate calibration + def = this->add("calib_flowrate_topinfill_special_order", coBool); + def->mode = comDevelop; + def->set_default_value(new ConfigOptionBool(false)); + def = this->add("ironing_type", coEnum); def->label = L("Ironing Type"); def->category = L("Quality"); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 1e37aec5f1..e874939c98 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -907,6 +907,10 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionInt, interlocking_depth)) ((ConfigOptionInt, interlocking_boundary_avoidance)) + // Orca: internal use only + ((ConfigOptionBool, calib_flowrate_topinfill_special_order)) // ORCA: special flag for flow rate calibration + + ) // This object is mapped to Perl as Slic3r::Config::PrintRegion. diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 080c7aa946..0ca12c6860 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -733,8 +733,6 @@ void PrintObject::simplify_extrusion_path() } if (this->set_started(posSimplifySupportPath)) { - //BBS: disable circle simplification for support as it causes separation of support walls - #if 0 m_print->set_status(75, L("Optimizing toolpath")); BOOST_LOG_TRIVIAL(debug) << "Simplify extrusion path of support in parallel - start"; tbb::parallel_for( @@ -748,7 +746,6 @@ void PrintObject::simplify_extrusion_path() ); m_print->throw_if_canceled(); BOOST_LOG_TRIVIAL(debug) << "Simplify extrusion path of support in parallel - end"; - #endif this->set_done(posSimplifySupportPath); } } @@ -1312,7 +1309,8 @@ void PrintObject::detect_surfaces_type() Layer *upper_layer = (idx_layer + 1 < this->layer_count()) ? m_layers[idx_layer + 1] : nullptr; Layer *lower_layer = (idx_layer > 0) ? m_layers[idx_layer - 1] : nullptr; // collapse very narrow parts (using the safety offset in the diff is not enough) - float offset = layerm->flow(frExternalPerimeter).scaled_width() / 10.f; + const float offset_top = layerm->flow(frExternalPerimeter).scaled_width() / 10.f; + const float offset_bottom = layerm->flow(frExternalPerimeter).scaled_width(); ExPolygons layerm_slices_surfaces = to_expolygons(layerm->slices.surfaces); // no_perimeter_full_bridge allow to put bridges where there are nothing, hence adding area to slice, that's why we need to start from the result of PerimeterGenerator. @@ -1327,7 +1325,7 @@ void PrintObject::detect_surfaces_type() ExPolygons upper_slices = interface_shells ? diff_ex(layerm_slices_surfaces, upper_layer->m_regions[region_id]->slices.surfaces, ApplySafetyOffset::Yes) : diff_ex(layerm_slices_surfaces, upper_layer->lslices, ApplySafetyOffset::Yes); - surfaces_append(top, opening_ex(upper_slices, offset), stTop); + surfaces_append(top, opening_ex(upper_slices, offset_top), stTop); } else { // if no upper layer, all surfaces of this one are solid // we clone surfaces because we're going to clear the slices collection @@ -1353,7 +1351,7 @@ void PrintObject::detect_surfaces_type() bottom, opening_ex( diff_ex(layerm_slices_surfaces, lower_layer->lslices, ApplySafetyOffset::Yes), - offset), + offset_bottom), surface_type_bottom_other); // if user requested internal shells, we need to identify surfaces // lying on other slices not belonging to this region @@ -1367,7 +1365,7 @@ void PrintObject::detect_surfaces_type() intersection(layerm_slices_surfaces, lower_layer->lslices), // supported lower_layer->m_regions[region_id]->slices.surfaces, ApplySafetyOffset::Yes), - offset), + offset_bottom), stBottom); } #endif @@ -1383,12 +1381,25 @@ void PrintObject::detect_surfaces_type() // and top surfaces; let's do an intersection to discover them and consider them // as bottom surfaces (to allow for bridge detection) if (! top.empty() && ! bottom.empty()) { - // Polygons overlapping = intersection(to_polygons(top), to_polygons(bottom)); - // Slic3r::debugf " layer %d contains %d membrane(s)\n", $layerm->layer->id, scalar(@$overlapping) - // if $Slic3r::debug; - Polygons top_polygons = to_polygons(std::move(top)); - top.clear(); - surfaces_append(top, diff_ex(top_polygons, bottom), stTop); + const auto cracks = intersection_ex(top, bottom); + if (!cracks.empty()) { + const float small_crack_threshold = -offset_bottom; + + for (const auto& crack : cracks) { + if (offset_ex(crack, small_crack_threshold).empty()) { + // Crack too small, leave it as part of the top surface, remove it from bottom surfaces + Surfaces bot_tmp; + for (auto& b : bottom) { + surfaces_append(bot_tmp, diff_ex(b.expolygon, crack), b.surface_type); + } + bottom = std::move(bot_tmp); + } + } + + Polygons top_polygons = to_polygons(std::move(top)); + top.clear(); + surfaces_append(top, diff_ex(top_polygons, bottom), stTop); + } } #ifdef SLIC3R_DEBUG_SLICE_PROCESSING diff --git a/src/libslic3r/calib.cpp b/src/libslic3r/calib.cpp index 7bda3a6bb9..efec782e7f 100644 --- a/src/libslic3r/calib.cpp +++ b/src/libslic3r/calib.cpp @@ -490,6 +490,7 @@ std::string CalibPressureAdvanceLine::print_pa_lines(double start_x, double star double y_pos = start_y; // prime line + gcode << writer.set_pressure_advance(0.0); auto prime_x = start_x; gcode << move_to(Vec2d(prime_x, y_pos + (num) * m_space_y), writer); gcode << writer.set_speed(slow); @@ -505,6 +506,12 @@ std::string CalibPressureAdvanceLine::print_pa_lines(double start_x, double star gcode << writer.set_speed(slow); gcode << writer.extrude_to_xy(Vec2d(start_x + m_length_short + m_length_long + m_length_short, y_pos + i * m_space_y), e_per_mm * m_length_short); + + if (i == 0) { + // Print extra anchor line + gcode << writer.set_pressure_advance(0.0); + gcode << writer.extrude_to_xy(Vec2d(start_x + m_length_short + m_length_long + m_length_short, y_pos + (num) * m_space_y), e_per_mm * m_space_y * num * 1.2); + } } gcode << writer.set_pressure_advance(0.0); @@ -517,7 +524,7 @@ std::string CalibPressureAdvanceLine::print_pa_lines(double start_x, double star // gcode << move_to(Vec2d(start_x + m_length_short + m_length_long, y_pos + (num - 1) * m_space_y + 7), writer); // gcode << writer.extrude_to_xy(Vec2d(start_x + m_length_short + m_length_long, y_pos + (num - 1) * m_space_y + 2), thin_e_per_mm * 7); - const auto box_start_x = start_x + m_length_short + m_length_long + m_length_short; + const auto box_start_x = start_x + m_length_short + m_length_long + m_length_short + m_line_width; DrawBoxOptArgs default_box_opt_args(2, m_height_layer, m_line_width, fast); default_box_opt_args.is_filled = true; gcode << draw_box(writer, box_start_x, start_y - m_space_y, diff --git a/src/libslic3r/libslic3r.h b/src/libslic3r/libslic3r.h index 9df346e708..1c10cf7912 100644 --- a/src/libslic3r/libslic3r.h +++ b/src/libslic3r/libslic3r.h @@ -75,7 +75,7 @@ static constexpr double RESOLUTION = 0.0125; static constexpr double SPARSE_INFILL_RESOLUTION = 0.04; #define SCALED_SPARSE_INFILL_RESOLUTION (SPARSE_INFILL_RESOLUTION / SCALING_FACTOR) -static constexpr double SUPPORT_RESOLUTION = 0.1; +static constexpr double SUPPORT_RESOLUTION = 0.0375; #define SCALED_SUPPORT_RESOLUTION (SUPPORT_RESOLUTION / SCALING_FACTOR) // Maximum perimeter length for the loop to apply the small perimeter speed. #define SMALL_PERIMETER_LENGTH(LENGTH) (((LENGTH) / SCALING_FACTOR) * 2 * PI) diff --git a/src/libslic3r/pchheader.hpp b/src/libslic3r/pchheader.hpp index 349e3f0d4c..1bedfb482a 100644 --- a/src/libslic3r/pchheader.hpp +++ b/src/libslic3r/pchheader.hpp @@ -81,12 +81,11 @@ #include #include #include -#include #include #include #include #include -#include +#include #include #include diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp index 9070887052..6c74b837c5 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -895,8 +895,13 @@ int GLVolumeCollection::get_selection_support_threshold_angle(bool &enable_suppo } //BBS: add outline drawing logic -void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disable_cullface, const Transform3d& view_matrix, const Transform3d& projection_matrix, const GUI::Size& cnv_size, - std::function filter_func) const +void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, + bool disable_cullface, + const Transform3d & view_matrix, + const Transform3d& projection_matrix, + const GUI::Size& cnv_size, + std::function filter_func, + bool partly_inside_enable) const { GLVolumeWithIdAndZList to_render = volumes_to_render(volumes, type, view_matrix, filter_func); if (to_render.empty()) @@ -964,7 +969,7 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disab //shader->set_uniform("print_volume.xy_data", m_render_volume.data); //shader->set_uniform("print_volume.z_data", m_render_volume.zs); - if (volume.first->partly_inside) { + if (volume.first->partly_inside && partly_inside_enable) { //only partly inside volume need to be painted with boundary check shader->set_uniform("print_volume.type", static_cast(m_print_volume.type)); shader->set_uniform("print_volume.xy_data", m_print_volume.data); @@ -1077,14 +1082,15 @@ bool GLVolumeCollection::check_outside_state(const BuildVolume &build_volume, Mo { if (! volume->is_modifier && (volume->shader_outside_printer_detection_enabled || (! volume->is_wipe_tower && volume->composite_id.volume_id >= 0))) { BuildVolume::ObjectState state; - const BoundingBoxf3& bb = volume_bbox(*volume); if (volume_below(*volume)) state = BuildVolume::ObjectState::Below; else { switch (plate_build_volume.type()) { - case BuildVolume_Type::Rectangle: - //FIXME this test does not evaluate collision of a build volume bounding box with non-convex objects. + case BuildVolume_Type::Rectangle: { + //FIXME this test does not evaluate collision of a build volume bounding box with non-convex objects. + const BoundingBoxf3& bb = volume_bbox(*volume); state = plate_build_volume.volume_state_bbox(bb); + } break; case BuildVolume_Type::Circle: case BuildVolume_Type::Convex: diff --git a/src/slic3r/GUI/3DScene.hpp b/src/slic3r/GUI/3DScene.hpp index 8e39c0febd..c94fdecb42 100644 --- a/src/slic3r/GUI/3DScene.hpp +++ b/src/slic3r/GUI/3DScene.hpp @@ -471,8 +471,14 @@ public: int get_selection_support_threshold_angle(bool&) const; // Render the volumes by OpenGL. //BBS: add outline drawing logic - void render(ERenderType type, bool disable_cullface, const Transform3d& view_matrix, const Transform3d& projection_matrix, const GUI::Size& cnv_size, - std::function filter_func = std::function()) const; + void render(ERenderType type, + bool disable_cullface, + const Transform3d & view_matrix, + const Transform3d& projection_matrix, + const GUI::Size& cnv_size, + std::function filter_func = std::function(), + bool partly_inside_enable =true + ) const; // Clear the geometry void clear() { for (auto *v : volumes) delete v; volumes.clear(); } diff --git a/src/slic3r/GUI/ConfigManipulation.cpp b/src/slic3r/GUI/ConfigManipulation.cpp index a62f37c437..35584dabfc 100644 --- a/src/slic3r/GUI/ConfigManipulation.cpp +++ b/src/slic3r/GUI/ConfigManipulation.cpp @@ -90,7 +90,7 @@ void ConfigManipulation::check_nozzle_temperature_range(DynamicPrintConfig *conf if (config->opt_int("nozzle_temperature", 0) < temperature_range_low || config->opt_int("nozzle_temperature", 0) > temperature_range_high) { wxString msg_text = _(L("Nozzle may be blocked when the temperature is out of recommended range.\n" "Please make sure whether to use the temperature to print.\n\n")); - msg_text += wxString::Format(_L("Recommended nozzle temperature of this filament type is [%d, %d] degree centigrade"), temperature_range_low, temperature_range_high); + msg_text += wxString::Format(_L("The recommended nozzle temperature for this filament type is [%d, %d] degrees Celsius."), temperature_range_low, temperature_range_high); MessageDialog dialog(m_msg_dlg_parent, msg_text, "", wxICON_WARNING | wxOK); is_msg_dlg_already_exist = true; dialog.ShowModal(); @@ -113,7 +113,7 @@ void ConfigManipulation::check_nozzle_temperature_initial_layer_range(DynamicPri { wxString msg_text = _(L("Nozzle may be blocked when the temperature is out of recommended range.\n" "Please make sure whether to use the temperature to print.\n\n")); - msg_text += wxString::Format(_L("Recommended nozzle temperature of this filament type is [%d, %d] degree centigrade"), temperature_range_low, temperature_range_high); + msg_text += wxString::Format(_L("The recommended nozzle temperature for this filament type is [%d, %d] degrees Celsius."), temperature_range_low, temperature_range_high); MessageDialog dialog(m_msg_dlg_parent, msg_text, "", wxICON_WARNING | wxOK); is_msg_dlg_already_exist = true; dialog.ShowModal(); diff --git a/src/slic3r/GUI/DesktopIntegrationDialog.cpp b/src/slic3r/GUI/DesktopIntegrationDialog.cpp index 2948703ce9..3520f6cb28 100644 --- a/src/slic3r/GUI/DesktopIntegrationDialog.cpp +++ b/src/slic3r/GUI/DesktopIntegrationDialog.cpp @@ -117,7 +117,7 @@ void resolve_path_from_var(const std::string& var, std::vector& pat wxString wxdirs; if (! wxGetEnv(boost::nowide::widen(var), &wxdirs) || wxdirs.empty() ) return; - std::string dirs = boost::nowide::narrow(wxdirs); + std::string dirs = into_u8(wxdirs); for (size_t i = dirs.find(':'); i != std::string::npos; i = dirs.find(':')) { paths.push_back(dirs.substr(0, i)); @@ -302,7 +302,7 @@ void DesktopIntegrationDialog::perform_desktop_integration() // if all failed - try creating default home folder if (i == target_candidates.size() - 1) { // create $HOME/.local/share - create_path(boost::nowide::narrow(wxFileName::GetHomeDir()), ".local/share/icons" + icon_theme_dirs); + create_path(into_u8(wxFileName::GetHomeDir()), ".local/share/icons" + icon_theme_dirs); // copy icon target_dir_icons = GUI::format("%1%/.local/share",wxFileName::GetHomeDir()); std::string icon_path = GUI::format("%1%/images/OrcaSlicer.png",resources_dir()); @@ -354,7 +354,7 @@ void DesktopIntegrationDialog::perform_desktop_integration() // if all failed - try creating default home folder if (i == target_candidates.size() - 1) { // create $HOME/.local/share - create_path(boost::nowide::narrow(wxFileName::GetHomeDir()), ".local/share/applications"); + create_path(into_u8(wxFileName::GetHomeDir()), ".local/share/applications"); // create desktop file target_dir_desktop = GUI::format("%1%/.local/share",wxFileName::GetHomeDir()); std::string path = GUI::format("%1%/applications/OrcaSlicer%2%.desktop", target_dir_desktop, version_suffix); @@ -562,7 +562,7 @@ void DesktopIntegrationDialog::perform_downloader_desktop_integration(std::strin // if all failed - try creating default home folder if (!candidate_found) { // create $HOME/.local/share - create_path(boost::nowide::narrow(wxFileName::GetHomeDir()), ".local/share/applications"); + create_path(into_u8(wxFileName::GetHomeDir()), ".local/share/applications"); // create desktop file target_dir_desktop = GUI::format("%1%/.local/share", wxFileName::GetHomeDir()); std::string path = GUI::format("%1%/applications/OrcaSlicerURLProtocol-%2%%3%.desktop", target_dir_desktop, url_prefix, version_suffix); diff --git a/src/slic3r/GUI/Downloader.cpp b/src/slic3r/GUI/Downloader.cpp index c5a22ac688..63cd9dafc8 100644 --- a/src/slic3r/GUI/Downloader.cpp +++ b/src/slic3r/GUI/Downloader.cpp @@ -175,7 +175,7 @@ void Downloader::start_download(const std::string& full_url) void Downloader::on_progress(wxCommandEvent& event) { size_t id = event.GetInt(); - float percent = (float)std::stoi(boost::nowide::narrow(event.GetString())) / 100.f; + float percent = (float)std::stoi(into_u8(event.GetString())) / 100.f; //BOOST_LOG_TRIVIAL(error) << "progress " << id << ": " << percent; NotificationManager* ntf_mngr = wxGetApp().notification_manager(); BOOST_LOG_TRIVIAL(trace) << "Download "<< id << ": " << percent; @@ -187,7 +187,7 @@ void Downloader::on_error(wxCommandEvent& event) set_download_state(event.GetInt(), DownloadState::DownloadError); BOOST_LOG_TRIVIAL(error) << "Download error: " << event.GetString(); NotificationManager* ntf_mngr = wxGetApp().notification_manager(); - ntf_mngr->set_download_URL_error(id, boost::nowide::narrow(event.GetString())); + ntf_mngr->set_download_URL_error(id, into_u8(event.GetString())); show_error(nullptr, format_wxstr(L"%1%\n%2%", _L("The download has failed") + ":", event.GetString())); } void Downloader::on_complete(wxCommandEvent& event) diff --git a/src/slic3r/GUI/DownloaderFileGet.cpp b/src/slic3r/GUI/DownloaderFileGet.cpp index 08d33951ef..6ad07c43d2 100644 --- a/src/slic3r/GUI/DownloaderFileGet.cpp +++ b/src/slic3r/GUI/DownloaderFileGet.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include diff --git a/src/slic3r/GUI/FileArchiveDialog.cpp b/src/slic3r/GUI/FileArchiveDialog.cpp index 2cd84b6acd..ac0eda96d5 100644 --- a/src/slic3r/GUI/FileArchiveDialog.cpp +++ b/src/slic3r/GUI/FileArchiveDialog.cpp @@ -228,7 +228,7 @@ FileArchiveDialog::FileArchiveDialog(wxWindow* parent_window, mz_zip_archive* ar path = boost::filesystem::path(extra.substr(0, extra_size)); } else { wxString wname = boost::nowide::widen(stat.m_filename); - std::string name = boost::nowide::narrow(wname); + std::string name = into_u8(wname); path = boost::filesystem::path(name); } assert(!path.empty()); diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 31eb38b728..dad2dfb361 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -596,9 +596,9 @@ void GCodeViewer::SequentialView::GCodeWindow::render(float top, float bottom, f //BBS: GUI refactor: move to right //imgui.set_next_window_pos(0.0f, top, ImGuiCond_Always, 0.0f, 0.0f); - imgui.set_next_window_pos(right, top, ImGuiCond_Always, 1.0f, 0.0f); + imgui.set_next_window_pos(right, top + 6 * m_scale, ImGuiCond_Always, 1.0f, 0.0f); // ORCA add a small gap between legend and code viewer imgui.set_next_window_size(0.0f, wnd_height, ImGuiCond_Always); - ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 8.0f * m_scale); // ORCA add window rounding to modernize / match style ImGui::SetNextWindowBgAlpha(0.8f); imgui.begin(std::string("G-code"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove); @@ -879,6 +879,7 @@ void GCodeViewer::set_scale(float scale) if (m_sequential_view.m_scale != scale) { m_sequential_view.m_scale = scale; m_sequential_view.marker.m_scale = scale; + m_sequential_view.gcode_window.m_scale = scale; // ORCA } } @@ -4053,7 +4054,7 @@ void GCodeViewer::render_all_plates_stats(const std::vectorAddRectFilled(ImVec2(pos_rect.x,pos_rect.y - ImGui::GetStyle().WindowPadding.y), - ImVec2(pos_rect.x + ImGui::GetWindowWidth() + ImGui::GetFrameHeight(),pos_rect.y + ImGui::GetFrameHeight() + window_padding * 2.5), - ImGui::GetColorU32(ImVec4(0,0,0,0.3))); + // ORCA dont use background on top bar to give modern look + //draw_list->AddRectFilled(ImVec2(pos_rect.x,pos_rect.y - ImGui::GetStyle().WindowPadding.y), + //ImVec2(pos_rect.x + ImGui::GetWindowWidth() + ImGui::GetFrameHeight(),pos_rect.y + ImGui::GetFrameHeight() + window_padding * 2.5), + //ImGui::GetColorU32(ImVec4(0,0,0,0.3))); auto append_item = [icon_size, &imgui, imperial_units, &window_padding, &draw_list, this]( EItemType type, @@ -4464,12 +4466,14 @@ void GCodeViewer::render_legend(float &legend_height, int canvas_width, int canv if (b_menu_item) callback(); if (checkbox) { - ImGui::SameLine(ImGui::GetWindowWidth() - ImGui::CalcTextSize(_u8L("Display").c_str()).x / 2 - ImGui::GetFrameHeight() / 2 - 2 * window_padding); - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0.0, 0.0)); - ImGui::PushStyleColor(ImGuiCol_CheckMark, ImVec4(0.00f, 0.59f, 0.53f, 1.00f)); - ImGui::Checkbox(("##" + columns_offsets[0].first).c_str(), &visible); - ImGui::PopStyleColor(1); - ImGui::PopStyleVar(1); + //ImGui::SameLine(ImGui::GetWindowWidth() - ImGui::CalcTextSize(_u8L("Display").c_str()).x / 2 - ImGui::GetFrameHeight() / 2 - 2 * window_padding); + //ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0.0, 0.0)); + //ImGui::PushStyleColor(ImGuiCol_CheckMark, ImVec4(0.00f, 0.59f, 0.53f, 1.00f)); + //ImGui::Checkbox(("##" + columns_offsets[0].first).c_str(), &visible); + //ImGui::PopStyleVar(1); + // ORCA replace checkboxes with eye icon + ImGui::SameLine(ImGui::GetWindowWidth() - (16.f + 0.f) * m_scale - window_padding * 2 - (ImGui::GetScrollMaxY() > 0.0f ? ImGui::GetStyle().ScrollbarSize : 0)); + ImGui::Text(into_u8(visible ? ImGui::VisibleIcon : ImGui::HiddenIcon).c_str(), ImVec2(16 * m_scale, 16 * m_scale)); } } @@ -4515,8 +4519,13 @@ void GCodeViewer::render_legend(float &legend_height, int canvas_width, int canv } }; - auto append_headers = [&imgui, window_padding](const std::vector>& title_offsets) { + auto append_headers = [&imgui, window_padding, this](const std::vector>& title_offsets) { for (size_t i = 0; i < title_offsets.size(); i++) { + if (title_offsets[i].first == _u8L("Display")) { // ORCA Hide Display header + ImGui::SameLine(title_offsets[i].second); + ImGui::Dummy({(16.f - 6.f) * m_scale, 1}); // 16(icon) - 6(half of spacing) + continue; + } ImGui::SameLine(title_offsets[i].second); imgui.bold_text(title_offsets[i].first); } @@ -4534,14 +4543,16 @@ void GCodeViewer::render_legend(float &legend_height, int canvas_width, int canv return ret; }; - auto calculate_offsets = [&imgui, max_width, window_padding](const std::vector>>& title_columns, float extra_size = 0.0f) { + auto calculate_offsets = [&imgui, max_width, window_padding, this](const std::vector>>& title_columns, float extra_size = 0.0f) { const ImGuiStyle& style = ImGui::GetStyle(); std::vector offsets; - offsets.push_back(max_width(title_columns[0].second, title_columns[0].first, extra_size) + 3.0f * style.ItemSpacing.x); + // ORCA increase spacing for more readable format. Using direct number requires much less code change in here. GetTextLineHeight for additional spacing for icon_size + offsets.push_back(max_width(title_columns[0].second, title_columns[0].first, extra_size) + 12.f * m_scale + ImGui::GetTextLineHeight()); for (size_t i = 1; i < title_columns.size() - 1; i++) - offsets.push_back(offsets.back() + max_width(title_columns[i].second, title_columns[i].first) + style.ItemSpacing.x); + offsets.push_back(offsets.back() + max_width(title_columns[i].second, title_columns[i].first) + 12.f * m_scale); // ORCA increase spacing for more readable format. Using direct number requires much less code change in here if (title_columns.back().first == _u8L("Display")) { - const auto preferred_offset = ImGui::GetWindowWidth() - ImGui::CalcTextSize(_u8L("Display").c_str()).x - ImGui::GetFrameHeight() / 2 - 2 * window_padding - ImGui::GetStyle().ScrollbarSize; + //const auto preferred_offset = ImGui::GetWindowWidth() - ImGui::CalcTextSize(_u8L("Display").c_str()).x - ImGui::GetFrameHeight() / 2 - 2 * window_padding - ImGui::GetStyle().ScrollbarSize; + const auto preferred_offset = ImGui::GetWindowWidth() - (16.f - 6.f) * m_scale - ImGui::GetFrameHeight() / 2 - 2 * window_padding - (ImGui::GetScrollMaxY() > 0.0f ? ImGui::GetStyle().ScrollbarSize : 0); if (preferred_offset > offsets.back()) { offsets.back() = preferred_offset; } @@ -4553,7 +4564,6 @@ void GCodeViewer::render_legend(float &legend_height, int canvas_width, int canv for (size_t i = 1; i < title_columns.size(); i++) { ret.push_back(std::max(offsets[i - 1], i * average_col_width)); } - return ret; }; @@ -4639,30 +4649,39 @@ void GCodeViewer::render_legend(float &legend_height, int canvas_width, int canv //BBS display Color Scheme ImGui::Dummy({ window_padding, window_padding }); ImGui::Dummy({ window_padding, window_padding }); - ImGui::SameLine(); + ImGui::SameLine(window_padding * 2); // ORCA Ignores item spacing to get perfect window margins since since this part uses dummies for window padding std::wstring btn_name; if (m_fold) btn_name = ImGui::UnfoldButtonIcon; else btn_name = ImGui::FoldButtonIcon; ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0, 0, 0, 0)); - ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(0.0f, 0.59f, 0.53f, 1.00f)); - ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(0.0f, 0.59f, 0.53f, 0.78f)); - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0.0f, 0.0f)); - //ImGui::PushItemWidth( - float button_width = 34.0f; - if (ImGui::Button(into_u8(btn_name).c_str(), ImVec2(button_width, 0))) { + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(84 / 255.f, 84 / 255.f, 90 / 255.f, 1.f)); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(84 / 255.f, 84 / 255.f, 90 / 255.f, 1.f)); + float calc_padding = (ImGui::GetFrameHeight() - 16 * m_scale) / 2; // ORCA calculated padding for 16x16 icon + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(calc_padding, calc_padding)); // ORCA Center icon with frame padding + ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f * m_scale); // ORCA Match button style with combo box + + float button_width = 16 * m_scale + calc_padding * 2; // ORCA match buttons height with combo box + if (ImGui::Button(into_u8(btn_name).c_str(), ImVec2(button_width, button_width))) { m_fold = !m_fold; } - ImGui::PopStyleColor(3); - ImGui::PopStyleVar(1); + ImGui::SameLine(); - imgui.bold_text(_u8L("Color Scheme")); + const wchar_t gCodeToggle = ImGui::gCodeButtonIcon; + if (ImGui::Button(into_u8(gCodeToggle).c_str(), ImVec2(button_width, button_width))) { + wxGetApp().toggle_show_gcode_window(); + wxGetApp().plater()->get_current_canvas3D()->post_event(SimpleEvent(wxEVT_PAINT)); + } + ImGui::PopStyleColor(3); + ImGui::PopStyleVar(2); + + //imgui.bold_text(_u8L("Color Scheme")); push_combo_style(); ImGui::SameLine(); const char* view_type_value = view_type_items_str[m_view_type_sel].c_str(); - ImGuiComboFlags flags = 0; + ImGuiComboFlags flags = ImGuiComboFlags_HeightLargest; // ORCA allow to fit all items to prevent scrolling on reaching last elements if (ImGui::BBLBeginCombo("", view_type_value, flags)) { ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 0.0f); for (int i = 0; i < view_type_items_str.size(); i++) { @@ -4685,11 +4704,15 @@ void GCodeViewer::render_legend(float &legend_height, int canvas_width, int canv ImGui::EndCombo(); } pop_combo_style(); - ImGui::SameLine(); + ImGui::SameLine(0, window_padding); // ORCA Without (0,window_padding) it adds unnecessary item spacing after combo box ImGui::Dummy({ window_padding, window_padding }); + ImGui::Dummy({ window_padding, window_padding }); // ORCA Matches top-bottom window paddings + float window_width = ImGui::GetWindowWidth(); // ORCA Store window width if (m_fold) { - legend_height = ImGui::GetStyle().WindowPadding.y + ImGui::GetFrameHeight() + window_padding * 2.5; + legend_height = ImGui::GetFrameHeight() + window_padding * 4; // ORCA using 4 instead 2 gives correct toolbar margins while its folded + ImGui::SameLine(window_width); // ORCA use stored window width while folded. This prevents annoying position change on fold/expand button + ImGui::Dummy({ 0, 0 }); imgui.end(); ImGui::PopStyleColor(6); ImGui::PopStyleVar(2); @@ -4813,16 +4836,16 @@ void GCodeViewer::render_legend(float &legend_height, int canvas_width, int canv labels.push_back(_u8L(ExtrusionEntity::role_to_string(role))); auto [time, percent] = role_time_and_percent(role); times.push_back((time > 0.0f) ? short_time(get_time_dhms(time)) : ""); - if (percent == 0) - ::sprintf(buffer, "0%%"); + if (percent == 0) // ORCA remove % symbol from rows + ::sprintf(buffer, "0"); else - percent > 0.001 ? ::sprintf(buffer, "%.1f%%", percent * 100) : ::sprintf(buffer, "<0.1%%"); + percent > 0.001 ? ::sprintf(buffer, "%.1f", percent * 100) : ::sprintf(buffer, "<0.1"); percents.push_back(buffer); auto [model_used_filament_m, model_used_filament_g] = used_filament_per_role(role); - ::sprintf(buffer, imperial_units ? "%.2f in" : "%.2f m", model_used_filament_m); + ::sprintf(buffer, imperial_units ? "%.2fin" : "%.2fm", model_used_filament_m); // ORCA dont use spacing between value and unit used_filaments_length.push_back(buffer); - ::sprintf(buffer, imperial_units ? "%.2f oz" : "%.2f g", model_used_filament_g); + ::sprintf(buffer, imperial_units ? "%.2foz" : "%.2fg", model_used_filament_g); // ORCA dont use spacing between value and unit used_filaments_weight.push_back(buffer); } } @@ -4831,15 +4854,16 @@ void GCodeViewer::render_legend(float &legend_height, int canvas_width, int canv { auto [time, percent] = move_time_and_percent(EMoveType::Travel); travel_time = (time > 0.0f) ? short_time(get_time_dhms(time)) : ""; - if (percent == 0) - ::sprintf(buffer, "0%%"); + if (percent == 0) // ORCA remove % symbol from rows + ::sprintf(buffer, "0"); else - percent > 0.001 ? ::sprintf(buffer, "%.1f%%", percent * 100) : ::sprintf(buffer, "<0.1%%"); + percent > 0.001 ? ::sprintf(buffer, "%.1f", percent * 100) : ::sprintf(buffer, "<0.1"); travel_percent = buffer; } - offsets = calculate_offsets({ {_u8L("Line Type"), labels}, {_u8L("Time"), times}, {_u8L("Percent"), percents}, {"", used_filaments_length}, {"", used_filaments_weight}, {_u8L("Display"), {""}}}, icon_size); - append_headers({{_u8L("Line Type"), offsets[0]}, {_u8L("Time"), offsets[1]}, {_u8L("Percent"), offsets[2]}, {_u8L("Used filament"), offsets[3]}, {_u8L("Display"), offsets[5]}}); + // ORCA use % symbol for percentage and use "Usage" for "Used filaments" + offsets = calculate_offsets({ {_u8L("Line Type"), labels}, {_u8L("Time"), times}, {_u8L("%"), percents}, {"", used_filaments_length}, {"", used_filaments_weight}, {_u8L("Display"), {""}}}, icon_size); + append_headers({{_u8L("Line Type"), offsets[0]}, {_u8L("Time"), offsets[1]}, {_u8L("%"), offsets[2]}, {_u8L("Usage"), offsets[3]}, {_u8L("Display"), offsets[5]}}); break; } case EViewType::Height: { imgui.title(_u8L("Layer Height (mm)")); break; } @@ -4870,7 +4894,7 @@ void GCodeViewer::render_legend(float &legend_height, int canvas_width, int canv } offsets = calculate_offsets({ { "Extruder NNN", {""}}}, icon_size); - append_headers({ {_u8L("Filament"), offsets[0]}, {_u8L("Used filament"), offsets[1]} }); + append_headers({ {_u8L("Filament"), offsets[0]}, {_u8L("Usage"), offsets[1]} }); break; } case EViewType::ColorPrint: @@ -5699,8 +5723,8 @@ void GCodeViewer::render_legend(float &legend_height, int canvas_width, int canv void GCodeViewer::push_combo_style() { - ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f); - ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.0f); + ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f * m_scale); // ORCA scale rounding + ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.0f * m_scale); // ORCA scale frame size ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(8.0,8.0)); ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.0f, 0.0f, 0.0f, 0.3f)); ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(0.0f, 0.0f, 0.0f, 0.3f)); diff --git a/src/slic3r/GUI/GCodeViewer.hpp b/src/slic3r/GUI/GCodeViewer.hpp index 18073c6a96..94a7b0bc43 100644 --- a/src/slic3r/GUI/GCodeViewer.hpp +++ b/src/slic3r/GUI/GCodeViewer.hpp @@ -660,6 +660,7 @@ public: std::vector m_lines; public: + float m_scale = 1.0f; GCodeWindow() = default; ~GCodeWindow() { stop_mapping_file(); } void load_gcode(const std::string& filename, const std::vector &lines_ends); diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 6945f3b19b..a803a38fac 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -14,7 +14,6 @@ #include "libslic3r/Technologies.hpp" #include "libslic3r/Tesselate.hpp" #include "libslic3r/PresetBundle.hpp" -#include "3DBed.hpp" #include "3DScene.hpp" #include "BackgroundSlicingProcess.hpp" #include "GLShader.hpp" @@ -1168,6 +1167,13 @@ GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas, Bed3D &bed) load_arrange_settings(); m_selection.set_volumes(&m_volumes.volumes); + + m_assembly_view_desc["object_selection_caption"] = _L("Left mouse button"); + m_assembly_view_desc["object_selection"] = _L("object selection"); + m_assembly_view_desc["part_selection_caption"] = "Alt +" + _L("Left mouse button"); + m_assembly_view_desc["part_selection"] = _L("part selectiont"); + m_assembly_view_desc["number_key_caption"] = "1~16 " + _L("number keys"); + m_assembly_view_desc["number_key"] = _L("number keys can quickly change the color of objects"); } GLCanvas3D::~GLCanvas3D() @@ -1939,7 +1945,11 @@ void GLCanvas3D::render(bool only_init) /* assemble render*/ else if (m_canvas_type == ECanvasType::CanvasAssembleView) { //BBS: add outline logic + if (m_show_world_axes) { + m_axes.render(); + } _render_objects(GLVolumeCollection::ERenderType::Opaque, !m_gizmos.is_running()); + _render_selection(); //_render_bed(camera.get_view_matrix(), camera.get_projection_matrix(), !camera.is_looking_downward(), show_axes); _render_plane(); //BBS: add outline logic insteadof selection under assemble view @@ -2147,6 +2157,9 @@ void GLCanvas3D::update_plate_thumbnails() void GLCanvas3D::select_all() { + if (!m_gizmos.is_allow_select_all()) { + return; + } m_selection.add_all(); m_dirty = true; } @@ -2262,16 +2275,10 @@ std::vector GLCanvas3D::load_object(const Model& model, int obj_idx) void GLCanvas3D::mirror_selection(Axis axis) { TransformationType transformation_type; - if (wxGetApp().obj_manipul()->is_local_coordinates()) - transformation_type.set_local(); - else if (wxGetApp().obj_manipul()->is_instance_coordinates()) - transformation_type.set_instance(); - + //transformation_type.set_world(); transformation_type.set_relative(); - m_selection.setup_cache(); m_selection.mirror(axis, transformation_type); - do_mirror(L("Mirror Object")); // BBS //wxGetApp().obj_manipul()->set_dirty(); @@ -4073,9 +4080,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) GLGizmosManager::EType c = m_gizmos.get_current_type(); if (current_printer_technology() == ptFFF && (fff_print()->config().print_sequence == PrintSequence::ByObject)) { - if (c == GLGizmosManager::EType::Move || - c == GLGizmosManager::EType::Scale || - c == GLGizmosManager::EType::Rotate ) + if (can_sequential_clearance_show_in_gizmo()) update_sequential_clearance(); } else { if (c == GLGizmosManager::EType::Move || @@ -4178,11 +4183,22 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) int volume_idx = get_first_hover_volume_idx(); bool already_selected = m_selection.contains_volume(volume_idx); bool ctrl_down = evt.CmdDown(); - + bool alt_down = evt.AltDown(); Selection::IndicesList curr_idxs = m_selection.get_volume_idxs(); if (already_selected && ctrl_down) m_selection.remove(volume_idx); + else if (alt_down) { + Selection::EMode mode = Selection::Volume; + if (already_selected) { + std::vector volume_idxs; + for (auto idx : curr_idxs) { volume_idxs.emplace_back(idx); } + m_selection.remove_volumes(mode, volume_idxs); + } + std::vector add_volume_idxs; + add_volume_idxs.emplace_back(volume_idx); + m_selection.add_volumes(mode, add_volume_idxs, true); + } else { m_selection.add(volume_idx, !ctrl_down, true); m_mouse.drag.move_requires_threshold = !already_selected; @@ -4299,7 +4315,9 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) // if dragging over blank area with left button, rotate if ((any_gizmo_active || m_hover_volume_idxs.empty()) && m_mouse.is_start_position_3D_defined()) { Camera& camera = wxGetApp().plater()->get_camera(); - const Vec3d rot = (Vec3d(pos.x(), pos.y(), 0.) - m_mouse.drag.start_position_3D) * (PI * TRACKBALLSIZE / 180.); + auto mult_pref = wxGetApp().app_config->get("camera_orbit_mult"); + const double mult = mult_pref.empty() ? 1.0 : std::stod(mult_pref); + const Vec3d rot = (Vec3d(pos.x(), pos.y(), 0.) - m_mouse.drag.start_position_3D) * (PI * TRACKBALLSIZE / 180.) * mult; if (this->m_canvas_type == ECanvasType::CanvasAssembleView || m_gizmos.get_current_type() == GLGizmosManager::FdmSupports || m_gizmos.get_current_type() == GLGizmosManager::Seam || m_gizmos.get_current_type() == GLGizmosManager::MmuSegmentation) { Vec3d rotate_target = Vec3d::Zero(); @@ -4658,11 +4676,19 @@ void GLCanvas3D::do_move(const std::string& snapshot_type) // Move instances/volumes ModelObject* model_object = m_model->objects[object_idx]; if (model_object != nullptr) { - if (selection_mode == Selection::Instance) - model_object->instances[instance_idx]->set_transformation(v->get_instance_transformation()); + if (selection_mode == Selection::Instance) { + if (m_canvas_type == GLCanvas3D::ECanvasType::CanvasAssembleView) { + if ((model_object->instances[instance_idx]->get_assemble_offset() - v->get_instance_offset()).norm() > 1e-2) { + model_object->instances[instance_idx]->set_assemble_transformation(v->get_instance_transformation()); + } + } else { + model_object->instances[instance_idx]->set_transformation(v->get_instance_transformation()); + } + } else if (selection_mode == Selection::Volume) { - if (model_object->volumes[volume_idx]->get_transformation() != v->get_volume_transformation()) { - model_object->volumes[volume_idx]->set_transformation(v->get_volume_transformation()); + auto cur_mv = model_object->volumes[volume_idx]; + if (cur_mv->get_transformation() != v->get_volume_transformation()) { + cur_mv->set_transformation(v->get_volume_transformation()); // BBS: backup Slic3r::save_object_mesh(*model_object); } @@ -4769,11 +4795,17 @@ void GLCanvas3D::do_rotate(const std::string& snapshot_type) // Rotate instances/volumes. ModelObject* model_object = m_model->objects[object_idx]; if (model_object != nullptr) { - if (selection_mode == Selection::Instance) - model_object->instances[instance_idx]->set_transformation(v->get_instance_transformation()); + if (selection_mode == Selection::Instance) { + if (m_canvas_type == GLCanvas3D::ECanvasType::CanvasAssembleView) { + model_object->instances[instance_idx]->set_assemble_from_transform(v->get_instance_transformation().get_matrix()); + } else { + model_object->instances[instance_idx]->set_transformation(v->get_instance_transformation()); + } + } else if (selection_mode == Selection::Volume) { - if (model_object->volumes[volume_idx]->get_transformation() != v->get_volume_transformation()) { - model_object->volumes[volume_idx]->set_transformation(v->get_volume_transformation()); + auto cur_mv = model_object->volumes[volume_idx]; + if (cur_mv->get_transformation() != v->get_volume_transformation()) { + cur_mv->set_transformation(v->get_volume_transformation()); // BBS: backup Slic3r::save_object_mesh(*model_object); } @@ -4784,23 +4816,24 @@ void GLCanvas3D::do_rotate(const std::string& snapshot_type) //BBS: notify instance updates to part plater list m_selection.notify_instance_update(-1, -1); + if (m_canvas_type != CanvasAssembleView) { + // Fixes sinking/flying instances + for (const std::pair &i : done) { + ModelObject *m = m_model->objects[i.first]; - // Fixes sinking/flying instances - for (const std::pair& i : done) { - ModelObject* m = m_model->objects[i.first]; + // BBS: don't call translate if the z is zero + const double shift_z = m->get_instance_min_z(i.second); + // leave sinking instances as sinking + if ((min_zs.find({i.first, i.second})->second >= SINKING_Z_THRESHOLD || shift_z > SINKING_Z_THRESHOLD) && (shift_z != 0.0f)) { + const Vec3d shift(0.0, 0.0, -shift_z); + m_selection.translate(i.first, i.second, shift); + m->translate_instance(i.second, shift); + // BBS: notify instance updates to part plater list + m_selection.notify_instance_update(i.first, i.second); + } - //BBS: don't call translate if the z is zero - const double shift_z = m->get_instance_min_z(i.second); - // leave sinking instances as sinking - if ((min_zs.find({ i.first, i.second })->second >= SINKING_Z_THRESHOLD || shift_z > SINKING_Z_THRESHOLD)&&(shift_z != 0.0f)) { - const Vec3d shift(0.0, 0.0, -shift_z); - m_selection.translate(i.first, i.second, shift); - m->translate_instance(i.second, shift); - //BBS: notify instance updates to part plater list - m_selection.notify_instance_update(i.first, i.second); + wxGetApp().obj_list()->update_info_items(static_cast(i.first)); } - - wxGetApp().obj_list()->update_info_items(static_cast(i.first)); } //BBS: nofity object list to update wxGetApp().plater()->sidebar().obj_list()->update_plate_values_for_items(); @@ -4850,12 +4883,14 @@ void GLCanvas3D::do_scale(const std::string& snapshot_type) // Rotate instances/volumes ModelObject* model_object = m_model->objects[object_idx]; if (model_object != nullptr) { - if (selection_mode == Selection::Instance) + if (selection_mode == Selection::Instance) { model_object->instances[instance_idx]->set_transformation(v->get_instance_transformation()); + } else if (selection_mode == Selection::Volume) { - if (model_object->volumes[volume_idx]->get_transformation() != v->get_volume_transformation()) { + auto cur_mv = model_object->volumes[volume_idx]; + if (cur_mv->get_transformation() != v->get_volume_transformation()) { model_object->instances[instance_idx]->set_transformation(v->get_instance_transformation()); - model_object->volumes[volume_idx]->set_transformation(v->get_volume_transformation()); + cur_mv->set_transformation(v->get_volume_transformation()); // BBS: backup Slic3r::save_object_mesh(*model_object); } @@ -5211,6 +5246,17 @@ void GLCanvas3D::mouse_up_cleanup() m_canvas->ReleaseMouse(); } +bool GLCanvas3D::can_sequential_clearance_show_in_gizmo() { + switch (m_gizmos.get_current_type()) { + case GLGizmosManager::EType::Move: + case GLGizmosManager::EType::Scale: + case GLGizmosManager::EType::Rotate: { + return true; + } + } + return false; +} + void GLCanvas3D::update_sequential_clearance() { if (current_printer_technology() != ptFFF || (fff_print()->config().print_sequence == PrintSequence::ByLayer)) @@ -7267,6 +7313,7 @@ void GLCanvas3D::_render_objects(GLVolumeCollection::ERenderType type, bool with GLShaderProgram* shader = wxGetApp().get_shader("gouraud"); ECanvasType canvas_type = this->m_canvas_type; + bool partly_inside_enable = canvas_type == ECanvasType::CanvasAssembleView ? false : true; if (shader != nullptr) { shader->start_using(); @@ -7310,7 +7357,8 @@ void GLCanvas3D::_render_objects(GLVolumeCollection::ERenderType type, bool with else { return (m_render_sla_auxiliaries || volume.composite_id.volume_id >= 0); } - }); + }, + partly_inside_enable); } } else { @@ -7344,7 +7392,8 @@ void GLCanvas3D::_render_objects(GLVolumeCollection::ERenderType type, bool with else { return true; } - }); + }, + partly_inside_enable); if (m_canvas_type == CanvasAssembleView && m_gizmos.m_assemble_view_data->model_objects_clipper()->get_position() > 0) { const GLGizmosManager& gm = get_gizmos_manager(); shader->stop_using(); @@ -7412,19 +7461,11 @@ void GLCanvas3D::_render_sequential_clearance() { if (m_gizmos.is_dragging()) return; - - switch (m_gizmos.get_current_type()) - { - case GLGizmosManager::EType::Flatten: - case GLGizmosManager::EType::Cut: - // case GLGizmosManager::EType::Hollow: - // case GLGizmosManager::EType::SlaSupports: - case GLGizmosManager::EType::FdmSupports: - case GLGizmosManager::EType::Seam: { return; } - default: { break; } + auto type = m_gizmos.get_current_type(); + if (type == GLGizmosManager::EType::Undefined + || can_sequential_clearance_show_in_gizmo()) { + m_sequential_print_clearance.render(); } - - m_sequential_print_clearance.render(); } #if ENABLE_RENDER_SELECTION_CENTER @@ -8169,6 +8210,7 @@ void GLCanvas3D::_render_return_toolbar() const wxPostEvent(m_canvas, SimpleEvent(EVT_GLVIEWTOOLBAR_3D)); const_cast(&m_gizmos)->reset_all_states(); wxGetApp().plater()->get_view3D_canvas3D()->get_gizmos_manager().reset_all_states(); + wxGetApp().plater()->get_view3D_canvas3D()->reload_scene(true); } ImGui::PopStyleColor(5); ImGui::PopStyleVar(1); @@ -8368,8 +8410,45 @@ void GLCanvas3D::_render_paint_toolbar() const ImGui::PopStyleColor(); } +float GLCanvas3D::_show_assembly_tooltip_information(float caption_max, float x, float y) const +{ + ImGuiWrapper *imgui = wxGetApp().imgui(); + ImTextureID normal_id = m_gizmos.get_icon_texture_id(GLGizmosManager::MENU_ICON_NAME::IC_TOOLBAR_TOOLTIP); + ImTextureID hover_id = m_gizmos.get_icon_texture_id(GLGizmosManager::MENU_ICON_NAME::IC_TOOLBAR_TOOLTIP_HOVER); + + caption_max += imgui->calc_text_size(": "sv).x + 35.f; + + float scale = get_scale(); + ImVec2 button_size = ImVec2(25 * scale, 25 * scale); // ORCA: Use exact resolution will prevent blur on icon + + ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, {0, ImGui::GetStyle().FramePadding.y}); + ImGui::ImageButton3(normal_id, hover_id, button_size); + + if (ImGui::IsItemHovered()) { + ImGui::BeginTooltip2(ImVec2(x, y)); + auto draw_text_with_caption = [this, &imgui, & caption_max](const wxString &caption, const wxString &text) { + imgui->text_colored(ImGuiWrapper::COL_ACTIVE, caption); + ImGui::SameLine(caption_max); + imgui->text_colored(ImGuiWrapper::COL_WINDOW_BG, text); + }; + + for (const auto &t : std::array{"object_selection", "part_selection", "number_key"}) { + draw_text_with_caption(m_assembly_view_desc.at(t + "_caption") + ": ", m_assembly_view_desc.at(t)); + } + ImGui::EndTooltip(); + } + ImGui::PopStyleVar(2); + auto same_line_size = button_size.x * 1.8;//with an space size + ImGui::SameLine(same_line_size); + same_line_size = imgui->calc_text_size("|"sv).x + same_line_size + imgui->calc_text_size(" "sv).x; + imgui->text_colored(ImGuiWrapper::COL_ACTIVE, "|"); + ImGui::SameLine(same_line_size); + return same_line_size; +} + //BBS -void GLCanvas3D::_render_assemble_control() const +void GLCanvas3D::_render_assemble_control() { if (m_canvas_type != ECanvasType::CanvasAssembleView) { GLVolume::explosion_ratio = m_explosion_ratio = 1.0; @@ -8390,8 +8469,8 @@ void GLCanvas3D::_render_assemble_control() const const float text_padding = 7.0f; const float text_size_x = std::max(imgui->calc_text_size(_L("Reset direction")).x + 2 * ImGui::GetStyle().FramePadding.x, std::max(imgui->calc_text_size(_L("Explosion Ratio")).x, imgui->calc_text_size(_L("Section View")).x)); - const float slider_width = 75.0f; - const float value_size = imgui->calc_text_size(std::string_view{"3.00"}).x + text_padding * 2; + const float slider_width = 60.0f; + const float value_size = imgui->calc_text_size("3.00"sv).x + text_padding * 2; const float item_spacing = imgui->get_item_spacing().x; ImVec2 window_padding = ImGui::GetStyle().WindowPadding; @@ -8399,7 +8478,19 @@ void GLCanvas3D::_render_assemble_control() const imgui->begin(_L("Assemble Control"), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoTitleBar); ImGui::AlignTextToFramePadding(); - + float tip_icon_size; + { + float caption_max = 0.f; + for (const auto &t : std::array{"object_selection", "part_selection", "number_key"}) { + caption_max = std::max(caption_max, imgui->calc_text_size(m_assembly_view_desc.at(t + "_caption")).x); + } + const ImVec2 pos = ImGui::GetCursorScreenPos(); + const float text_y =imgui->calc_text_size(_L("part selection")).y; + float get_cur_x = pos.x; + float get_cur_y = pos.y - ImGui::GetFrameHeight() - 4 * text_y; + tip_icon_size =_show_assembly_tooltip_information(caption_max, get_cur_x, get_cur_y); + } + float same_line_width = tip_icon_size; { float clp_dist = m_gizmos.m_assemble_view_data->model_objects_clipper()->get_position(); if (clp_dist == 0.f) { @@ -8413,32 +8504,76 @@ void GLCanvas3D::_render_assemble_control() const }); } } - - ImGui::SameLine(window_padding.x + text_size_x + item_spacing); + same_line_width += (text_size_x + item_spacing); + ImGui::SameLine(same_line_width); ImGui::PushItemWidth(slider_width); bool view_slider_changed = imgui->bbl_slider_float_style("##clp_dist", &clp_dist, 0.f, 1.f, "%.2f", 1.0f, true); - ImGui::SameLine(window_padding.x + text_size_x + slider_width + item_spacing * 2); + same_line_width += (slider_width + item_spacing); + ImGui::SameLine(same_line_width); ImGui::PushItemWidth(value_size); bool view_input_changed = ImGui::BBLDragFloat("##clp_dist_input", &clp_dist, 0.05f, 0.0f, 0.0f, "%.2f"); if (view_slider_changed || view_input_changed) m_gizmos.m_assemble_view_data->model_objects_clipper()->set_position(clp_dist, true); - } + same_line_width += (value_size + item_spacing * 2); + } { - ImGui::SameLine(window_padding.x + text_size_x + slider_width + item_spacing * 6 + value_size); + auto temp_x = imgui->calc_text_size(_L("Explosion Ratio")).x; + ImGui::SameLine(same_line_width); + ImGui::PushItemWidth(temp_x); imgui->text(_L("Explosion Ratio")); - ImGui::SameLine(window_padding.x + 2 * text_size_x + slider_width + item_spacing * 7 + value_size); + same_line_width += (temp_x + item_spacing); + ImGui::SameLine(same_line_width); ImGui::PushItemWidth(slider_width); bool explosion_slider_changed = imgui->bbl_slider_float_style("##ratio_slider", &m_explosion_ratio, 1.0f, 3.0f, "%1.2f"); - ImGui::SameLine(window_padding.x + 2 * text_size_x + 2 * slider_width + item_spacing * 8 + value_size); + same_line_width += (slider_width + item_spacing); + ImGui::SameLine(same_line_width); ImGui::PushItemWidth(value_size); bool explosion_input_changed = ImGui::BBLDragFloat("##ratio_input", &m_explosion_ratio, 0.1f, 1.0f, 3.0f, "%1.2f"); + same_line_width += (value_size + item_spacing*2); } + { + ImGui::SameLine(same_line_width); + // input + std::vector modes = {_u8L("Object"), _u8L("Part")}; + int selection_idx = m_selection.get_volume_selection_mode() == Selection::Instance ? 0 : 1; + auto label = _u8L("Selection Mode") + ":" ; + auto label_width = imgui->calc_text_size(label).x ; + auto item_width = imgui->calc_text_size(_u8L("Object")).x * 2.5 + imgui->calc_text_size("xx"sv).x+ item_spacing; + //render imgui + ImGui::AlignTextToFramePadding(); + ImGui::PushItemWidth(label_width); + imgui->text(label); + same_line_width += (label_width + item_spacing); + ImGui::SameLine(same_line_width); + ImGui::PushItemWidth(item_width); + size_t selection_out = selection_idx; + const char *selected_str = (selection_idx >= 0 && selection_idx < int(modes.size())) ? modes[selection_idx].c_str() : ""; + ImGuiWrapper::push_combo_style(get_scale()); + if (ImGui::BBLBeginCombo(("##" + label).c_str(), selected_str, 0)) { + for (size_t line_idx = 0; line_idx < modes.size(); ++line_idx) { + ImGui::PushID(int(line_idx)); + if (ImGui::Selectable("", line_idx == selection_idx)) + selection_out = line_idx; + ImGui::SameLine(); + ImGui::Text("%s", modes[line_idx].c_str()); + ImGui::PopID(); + } + ImGui::EndCombo(); + } + ImGuiWrapper::pop_combo_style(); + if (selection_idx != selection_out) {//do + if (selection_out == 0) { m_selection.unlock_volume_selection_mode(); } + m_selection.set_volume_selection_mode(selection_out == 1 ? Selection::Volume : Selection::Instance); + if (selection_out == 1) { m_selection.lock_volume_selection_mode(); } + } + same_line_width += (label_width + item_width); + } imgui->end(); ImGuiWrapper::pop_toolbar_style(); diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index c2a5b9d00d..26c14fa75e 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -18,7 +18,7 @@ #include "Camera.hpp" #include "SceneRaycaster.hpp" #include "IMToolbar.hpp" - +#include "slic3r/GUI/3DBed.hpp" #include "libslic3r/Slicing.hpp" #include @@ -512,6 +512,7 @@ private: wxGLContext* m_context; SceneRaycaster m_scene_raycaster; Bed3D &m_bed; + std::map m_assembly_view_desc; #if ENABLE_RETINA_GL std::unique_ptr m_retina_helper; #endif @@ -611,8 +612,8 @@ private: PrinterTechnology current_printer_technology() const; - - + bool m_show_world_axes{false}; + Bed3D::Axes m_axes; //BBS:record key botton frequency int auto_orient_count = 0; int auto_arrange_count = 0; @@ -807,6 +808,7 @@ public: void set_color_clip_plane(const Vec3d& cp_normal, double offset) { m_volumes.set_color_clip_plane(cp_normal, offset); } void set_color_clip_plane_colors(const std::array& colors) { m_volumes.set_color_clip_plane_colors(colors); } + void set_show_world_axes(bool flag) { m_show_world_axes = flag; } void refresh_camera_scene_box(); void set_color_by(const std::string& value); @@ -1111,6 +1113,7 @@ public: m_sequential_print_clearance.set_polygons(polygons, height_polygons); } + bool can_sequential_clearance_show_in_gizmo(); void update_sequential_clearance(); const Print* fff_print() const; @@ -1189,7 +1192,8 @@ private: // BBS //void _render_view_toolbar() const; void _render_paint_toolbar() const; - void _render_assemble_control() const; + float _show_assembly_tooltip_information(float caption_max, float x, float y) const; + void _render_assemble_control(); void _render_assemble_info() const; #if ENABLE_SHOW_CAMERA_TARGET void _render_camera_target(); diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index b04739f860..fe149fa4ab 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -1575,30 +1575,30 @@ void GUI_App::init_networking_callbacks() // GUI::wxGetApp().request_user_handle(online_login); // }); - m_agent->set_server_callback([this](std::string url, int status) { - - CallAfter([this]() { - if (!m_server_error_dialog) { - /*m_server_error_dialog->EndModal(wxCLOSE); - m_server_error_dialog->Destroy(); - m_server_error_dialog = nullptr;*/ - m_server_error_dialog = new NetworkErrorDialog(mainframe); - } - - if(plater()->get_select_machine_dialog() && plater()->get_select_machine_dialog()->IsShown()){ - return; - } - - if (m_server_error_dialog->m_show_again) { - return; - } - - if (m_server_error_dialog->IsShown()) { - return; - } - - m_server_error_dialog->ShowModal(); - }); + m_agent->set_server_callback([](std::string url, int status) { + BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << boost::format(": server_callback, url=%1%, status=%2%") % url % status; + //CallAfter([this]() { + // if (!m_server_error_dialog) { + // /*m_server_error_dialog->EndModal(wxCLOSE); + // m_server_error_dialog->Destroy(); + // m_server_error_dialog = nullptr;*/ + // m_server_error_dialog = new NetworkErrorDialog(mainframe); + // } + // + // if(plater()->get_select_machine_dialog() && plater()->get_select_machine_dialog()->IsShown()){ + // return; + // } + // + // if (m_server_error_dialog->m_show_again) { + // return; + // } + // + // if (m_server_error_dialog->IsShown()) { + // return; + // } + // + // m_server_error_dialog->ShowModal(); + //}); }); @@ -4789,6 +4789,7 @@ void GUI_App::start_sync_user_preset(bool with_progress_dlg) [this, progressFn, cancelFn, finishFn, t = std::weak_ptr(m_user_sync_token)] { // get setting list, update setting list std::string version = preset_bundle->get_vendor_profile_version(PresetBundle::ORCA_DEFAULT_BUNDLE).to_string(); + if(!m_agent) return; int ret = m_agent->get_setting_list2(version, [this](auto info) { auto type = info[BBL_JSON_KEY_TYPE]; auto name = info[BBL_JSON_KEY_NAME]; @@ -5923,7 +5924,7 @@ void GUI_App::MacOpenURL(const wxString& url) { if (url.empty()) return; - start_download(boost::nowide::narrow(url)); + start_download(into_u8(url)); } // wxWidgets override to get an event on open files. @@ -6685,7 +6686,7 @@ void GUI_App::associate_url(std::wstring url_prefix) } key_full = key_string; #elif defined(__linux__) && defined(SLIC3R_DESKTOP_INTEGRATION) - DesktopIntegrationDialog::perform_downloader_desktop_integration(boost::nowide::narrow(url_prefix)); + DesktopIntegrationDialog::perform_downloader_desktop_integration(into_u8(url_prefix)); #endif // WIN32 } diff --git a/src/slic3r/GUI/GUI_Geometry.hpp b/src/slic3r/GUI/GUI_Geometry.hpp index b18e4ae5a5..39faafb833 100644 --- a/src/slic3r/GUI/GUI_Geometry.hpp +++ b/src/slic3r/GUI/GUI_Geometry.hpp @@ -6,7 +6,7 @@ namespace GUI { enum class ECoordinatesType : unsigned char { - World, + World = 0, Instance, Local }; diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index e2175f09d2..e4e4989ac2 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -1192,6 +1192,8 @@ void ObjectList::OnContextMenu(wxDataViewEvent& evt) void ObjectList::list_manipulation(const wxPoint& mouse_pos, bool evt_context_menu/* = false*/) { + if (m_prevent_list_manipulation) return; + // Interesting fact: when mouse_pos.x < 0, HitTest(mouse_pos, item, col) returns item = null, but column = last column. // So, when mouse was moved to scene immediately after clicking in ObjectList, in the scene will be shown context menu for the Editing column. if (mouse_pos.x < 0) @@ -1289,7 +1291,7 @@ void ObjectList::list_manipulation(const wxPoint& mouse_pos, bool evt_context_me dynamic_cast(wxGetApp().get_plate_tab())->reset_model_config(); else if (m_objects_model->GetItemType(item) & itLayer) dynamic_cast(wxGetApp().get_layer_tab())->reset_model_config(); - else + else if (item.IsOk()) dynamic_cast(wxGetApp().get_model_tab(vol_idx >= 0))->reset_model_config(); } else if (col_num == colName) @@ -4668,6 +4670,7 @@ void ObjectList::select_item(std::function get_item) return; m_prevent_list_events = true; + m_prevent_list_manipulation = true; wxDataViewItem item = get_item(); if (item.IsOk()) { @@ -4676,6 +4679,7 @@ void ObjectList::select_item(std::function get_item) part_selection_changed(); } + m_prevent_list_manipulation = false; m_prevent_list_events = false; } @@ -4728,6 +4732,7 @@ void ObjectList::select_items(const std::vector& ov_ids) void ObjectList::select_items(const wxDataViewItemArray& sels) { m_prevent_list_events = true; + m_prevent_list_manipulation = true; m_last_selected_item = sels.empty() ? wxDataViewItem(nullptr) : sels.back(); UnselectAll(); @@ -4742,6 +4747,7 @@ void ObjectList::select_items(const wxDataViewItemArray& sels) part_selection_changed(); + m_prevent_list_manipulation = false; m_prevent_list_events = false; } @@ -4753,6 +4759,9 @@ void ObjectList::select_all() void ObjectList::select_item_all_children() { + if (wxGetApp().plater() && !wxGetApp().plater()->canvas3D()->get_gizmos_manager().is_allow_select_all()) { + return; + } wxDataViewItemArray sels; // There is no selection before OR some object is selected => select all objects @@ -5418,7 +5427,7 @@ void ObjectList::fix_through_netfabb() } if (msg.IsEmpty()) msg = _L("Repairing was canceled"); - plater->get_notification_manager()->push_notification(NotificationType::NetfabbFinished, NotificationManager::NotificationLevel::PrintInfoShortNotificationLevel, boost::nowide::narrow(msg)); + plater->get_notification_manager()->push_notification(NotificationType::NetfabbFinished, NotificationManager::NotificationLevel::PrintInfoShortNotificationLevel, into_u8(msg)); } void ObjectList::simplify() diff --git a/src/slic3r/GUI/GUI_ObjectList.hpp b/src/slic3r/GUI/GUI_ObjectList.hpp index ef503251f6..f8058dd701 100644 --- a/src/slic3r/GUI/GUI_ObjectList.hpp +++ b/src/slic3r/GUI/GUI_ObjectList.hpp @@ -175,6 +175,7 @@ private: bool m_prevent_list_events = false; // We use this flag to avoid circular event handling Select() // happens to fire a wxEVT_LIST_ITEM_SELECTED on OSX, whose event handler // calls this method again and again and again + bool m_prevent_list_manipulation = false; bool m_prevent_update_filament_in_config = false; // We use this flag to avoid updating of the extruder value in config // during updating of the extruder count. diff --git a/src/slic3r/GUI/GUI_ObjectTable.cpp b/src/slic3r/GUI/GUI_ObjectTable.cpp index 56c1550c46..39b30de5e8 100644 --- a/src/slic3r/GUI/GUI_ObjectTable.cpp +++ b/src/slic3r/GUI/GUI_ObjectTable.cpp @@ -1890,6 +1890,7 @@ void ObjectGridTable::init_cols(ObjectGrid *object_grid) col->size = object_grid->GetTextExtent(L("Auto Brim")).x + 8; //add 8 for border col->choices.Add(_L("Auto")); col->choices.Add(_L("Mouse ear")); + col->choices.Add(_L("Painted")); col->choices.Add(_L("Outer brim only")); col->choices.Add(_L("Inner brim only")); col->choices.Add(_L("Outer and inner brim")); diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index 25b333e281..978a0e3cab 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -823,10 +823,10 @@ bool AssembleView::init(wxWindow* parent, Bed3D& bed, Model* model, DynamicPrint m_canvas->enable_assemble_view_toolbar(false); m_canvas->enable_return_toolbar(true); m_canvas->enable_separator_toolbar(false); - + //m_canvas->set_show_world_axes(true);//wait for GitHub users to see if they have this requirement // BBS: set volume_selection_mode to Volume - m_canvas->get_selection().set_volume_selection_mode(Selection::Volume); - m_canvas->get_selection().lock_volume_selection_mode(); + //same to 3d //m_canvas->get_selection().set_volume_selection_mode(Selection::Instance); + //m_canvas->get_selection().lock_volume_selection_mode(); wxBoxSizer* main_sizer = new wxBoxSizer(wxVERTICAL); main_sizer->Add(m_canvas_widget, 1, wxALL | wxEXPAND, 0); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp index 089dd1d454..0b68e64150 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp @@ -227,7 +227,71 @@ bool GLGizmoBase::render_combo(const std::string &label, const std::vector &lines, int &selection_idx, float label_width, float item_width); - + void render_cross_mark(const Vec3f& target,bool is_single =false); public: GLGizmoBase(GLCanvas3D& parent, const std::string& icon_filename, diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp index 6acf77a0f8..c82936650b 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp @@ -48,6 +48,7 @@ bool GLGizmoMove3D::on_mouse(const wxMouseEvent &mouse_event) { void GLGizmoMove3D::data_changed(bool is_serializing) { m_grabbers[2].enabled = !m_parent.get_selection().is_wipe_tower(); + change_cs_by_selection(); } bool GLGizmoMove3D::on_init() @@ -67,7 +68,11 @@ bool GLGizmoMove3D::on_init() std::string GLGizmoMove3D::on_get_name() const { - return _u8L("Move"); + if (!on_is_activable() && m_state == EState::Off) { + return _u8L("Move") + ":\n" + _u8L("Please select at least one object."); + } else { + return _u8L("Move"); + } } bool GLGizmoMove3D::on_is_activable() const @@ -75,13 +80,21 @@ bool GLGizmoMove3D::on_is_activable() const return !m_parent.get_selection().is_empty(); } +void GLGizmoMove3D::on_set_state() { + if (get_state() == On) { + m_last_selected_obejct_idx = -1; + m_last_selected_volume_idx = -1; + change_cs_by_selection(); + } +} + void GLGizmoMove3D::on_start_dragging() { assert(m_hover_id != -1); m_displacement = Vec3d::Zero(); const BoundingBoxf3& box = m_parent.get_selection().get_bounding_box(); - m_starting_drag_position = m_grabbers[m_hover_id].center; + m_starting_drag_position = m_grabbers[m_hover_id].matrix * m_grabbers[m_hover_id].center; m_starting_box_center = box.center(); m_starting_box_bottom_center = box.center(); m_starting_box_bottom_center(2) = box.min(2); @@ -121,42 +134,38 @@ void GLGizmoMove3D::on_render() glsafe(::glClear(GL_DEPTH_BUFFER_BIT)); glsafe(::glEnable(GL_DEPTH_TEST)); - const BoundingBoxf3& box = selection.get_bounding_box(); - const Vec3d& center = box.center(); + const auto &[box, box_trafo] = selection.get_bounding_box_in_current_reference_system(); + m_bounding_box = box; + m_center = box_trafo.translation(); + if (m_object_manipulation) { + m_object_manipulation->cs_center = box_trafo.translation(); + } + const Transform3d base_matrix = box_trafo; float space_size = 20.f *INV_ZOOM; -#if ENABLE_FIXED_GRABBER + for (int i = 0; i < 3; ++i) { + m_grabbers[i].matrix = base_matrix; + } + + const Vec3d zero = Vec3d::Zero(); + // x axis - m_grabbers[0].center = { box.max.x() + space_size, center.y(), center.z() }; + m_grabbers[0].center = {m_bounding_box.max.x() + space_size, 0, 0}; // y axis - m_grabbers[1].center = { center.x(), box.max.y() + space_size, center.z() }; + m_grabbers[1].center = {0, m_bounding_box.max.y() + space_size,0}; // z axis - m_grabbers[2].center = { center.x(), center.y(), box.max.z() + space_size }; + m_grabbers[2].center = {0,0, m_bounding_box.max.z() + space_size}; for (int i = 0; i < 3; ++i) { m_grabbers[i].color = AXES_COLOR[i]; m_grabbers[i].hover_color = AXES_HOVER_COLOR[i]; } -#else - // x axis - m_grabbers[0].center = { box.max.x() + Offset, center.y(), center.z() }; - m_grabbers[0].color = AXES_COLOR[0]; - - // y axis - m_grabbers[1].center = { center.x(), box.max.y() + Offset, center.z() }; - m_grabbers[1].color = AXES_COLOR[1]; - - // z axis - m_grabbers[2].center = { center.x(), center.y(), box.max.z() + Offset }; - m_grabbers[2].color = AXES_COLOR[2]; -#endif - glsafe(::glLineWidth((m_hover_id != -1) ? 2.0f : 1.5f)); - auto render_grabber_connection = [this, ¢er](unsigned int id) { + auto render_grabber_connection = [this, &zero](unsigned int id) { if (m_grabbers[id].enabled) { //if (!m_grabber_connections[id].model.is_initialized() || !m_grabber_connections[id].old_center.isApprox(center)) { - m_grabber_connections[id].old_center = center; + m_grabber_connections[id].old_center = m_grabbers[id].center; m_grabber_connections[id].model.reset(); GLModel::Geometry init_data; @@ -166,7 +175,7 @@ void GLGizmoMove3D::on_render() init_data.reserve_indices(2); // vertices - init_data.add_vertex((Vec3f)center.cast()); + init_data.add_vertex((Vec3f)zero.cast()); init_data.add_vertex((Vec3f)m_grabbers[id].center.cast()); // indices @@ -186,7 +195,7 @@ void GLGizmoMove3D::on_render() if (shader != nullptr) { shader->start_using(); const Camera& camera = wxGetApp().plater()->get_camera(); - shader->set_uniform("view_model_matrix", camera.get_view_matrix()); + shader->set_uniform("view_model_matrix", camera.get_view_matrix() * base_matrix); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); // draw axes @@ -199,6 +208,28 @@ void GLGizmoMove3D::on_render() // draw grabbers render_grabbers(box); + + if (m_object_manipulation->is_instance_coordinates()) { + shader = wxGetApp().get_shader("flat"); + if (shader != nullptr) { + shader->start_using(); + const Camera& camera = wxGetApp().plater()->get_camera(); + + Geometry::Transformation cur_tran; + if (auto mi = m_parent.get_selection().get_selected_single_intance()) { + cur_tran = mi->get_transformation(); + } else { + cur_tran = selection.get_first_volume()->get_instance_transformation(); + } + + shader->set_uniform("view_model_matrix", camera.get_view_matrix() * cur_tran.get_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + + render_cross_mark(Vec3f::Zero(), true); + + shader->stop_using(); + } + } } void GLGizmoMove3D::on_register_raycasters_for_picking() @@ -245,5 +276,30 @@ double GLGizmoMove3D::calc_projection(const UpdateData& data) const return projection; } + +void GLGizmoMove3D::change_cs_by_selection() { + int obejct_idx, volume_idx; + ModelVolume *model_volume = m_parent.get_selection().get_selected_single_volume(obejct_idx, volume_idx); + if (m_last_selected_obejct_idx == obejct_idx && m_last_selected_volume_idx == volume_idx) { + return; + } + m_last_selected_obejct_idx = obejct_idx; + m_last_selected_volume_idx = volume_idx; + if (m_parent.get_selection().is_multiple_full_object()) { + m_object_manipulation->set_use_object_cs(false); + } + else if (model_volume) { + m_object_manipulation->set_use_object_cs(true); + } else { + m_object_manipulation->set_use_object_cs(false); + } + if (m_object_manipulation->get_use_object_cs()) { + m_object_manipulation->set_coordinates_type(ECoordinatesType::Instance); + } else { + m_object_manipulation->set_coordinates_type(ECoordinatesType::World); + } +} + + } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp b/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp index 4d0b4581f0..df3abdddc7 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp @@ -16,6 +16,8 @@ class GLGizmoMove3D : public GLGizmoBase static const double Offset; Vec3d m_displacement{ Vec3d::Zero() }; + Vec3d m_center{ Vec3d::Zero() }; + BoundingBoxf3 m_bounding_box; double m_snap_step{ 1.0 }; Vec3d m_starting_drag_position{ Vec3d::Zero() }; Vec3d m_starting_box_center{ Vec3d::Zero() }; @@ -57,6 +59,7 @@ protected: bool on_init() override; std::string on_get_name() const override; bool on_is_activable() const override; + virtual void on_set_state() override; void on_start_dragging() override; void on_stop_dragging() override; void on_dragging(const UpdateData& data) override; @@ -68,6 +71,9 @@ protected: private: double calc_projection(const UpdateData& data) const; + void change_cs_by_selection(); //cs mean Coordinate System +private: + int m_last_selected_obejct_idx, m_last_selected_volume_idx; }; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp index 5b79edb95d..59c5f194ed 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp @@ -527,25 +527,6 @@ bool GLGizmoRotate3D::on_mouse(const wxMouseEvent &mouse_event) return use_grabbers(mouse_event); } -void GLGizmoRotate3D::data_changed(bool is_serializing) { - const Selection &selection = m_parent.get_selection(); - bool is_wipe_tower = selection.is_wipe_tower(); - if (is_wipe_tower) { - DynamicPrintConfig& config = wxGetApp().preset_bundle->prints.get_edited_preset().config; - float wipe_tower_rotation_angle = - dynamic_cast( - config.option("wipe_tower_rotation_angle")) - ->value; - set_rotation(Vec3d(0., 0., (M_PI / 180.) * wipe_tower_rotation_angle)); - m_gizmos[0].disable_grabber(); - m_gizmos[1].disable_grabber(); - } else { - set_rotation(Vec3d::Zero()); - m_gizmos[0].enable_grabber(); - m_gizmos[1].enable_grabber(); - } -} - bool GLGizmoRotate3D::on_init() { for (GLGizmoRotate& g : m_gizmos) @@ -561,7 +542,57 @@ bool GLGizmoRotate3D::on_init() std::string GLGizmoRotate3D::on_get_name() const { - return _u8L("Rotate"); + if (!on_is_activable() && m_state == EState::Off) { + return _u8L("Rotate") + ":\n" + _u8L("Please select at least one object."); + } else { + return _u8L("Rotate"); + } +} + +void GLGizmoRotate3D::on_set_state() +{ + for (GLGizmoRotate &g : m_gizmos) + g.set_state(m_state); + if (get_state() == On) { + m_object_manipulation->set_coordinates_type(ECoordinatesType::World); + } else { + m_last_volume = nullptr; + } +} + +void GLGizmoRotate3D::data_changed(bool is_serializing) { + const Selection &selection = m_parent.get_selection(); + const GLVolume * volume = selection.get_first_volume(); + if (volume == nullptr) { + m_last_volume = nullptr; + return; + } + if (m_last_volume != volume) { + m_last_volume = volume; + Geometry::Transformation tran; + if (selection.is_single_full_instance()) { + tran = volume->get_instance_transformation(); + } else { + tran = volume->get_volume_transformation(); + } + m_object_manipulation->set_init_rotation(tran); + } + + bool is_wipe_tower = selection.is_wipe_tower(); + if (is_wipe_tower) { + DynamicPrintConfig& config = wxGetApp().preset_bundle->prints.get_edited_preset().config; + float wipe_tower_rotation_angle = + dynamic_cast( + config.option("wipe_tower_rotation_angle")) + ->value; + set_rotation(Vec3d(0., 0., (M_PI / 180.) * wipe_tower_rotation_angle)); + m_gizmos[0].disable_grabber(); + m_gizmos[1].disable_grabber(); + } else { + set_rotation(Vec3d::Zero()); + m_gizmos[0].enable_grabber(); + m_gizmos[1].enable_grabber(); + } } bool GLGizmoRotate3D::on_is_activable() const diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp index 769809df8d..8cbacde3c6 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp @@ -151,11 +151,9 @@ public: protected: bool on_init() override; std::string on_get_name() const override; - void on_set_state() override { - for (GLGizmoRotate& g : m_gizmos) - g.set_state(m_state); - } - void on_set_hover_id() override { + void on_set_state() override; + void on_set_hover_id() override + { for (int i = 0; i < 3; ++i) m_gizmos[i].set_hover_id((m_hover_id == i) ? 0 : -1); } @@ -179,7 +177,7 @@ protected: void on_render_input_window(float x, float y, float bottom_limit) override; private: - + const GLVolume *m_last_volume; class RotoptimzeWindow { ImGuiWrapper *m_imgui = nullptr; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp index 8d2781e6a8..143d5b6669 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp @@ -5,7 +5,7 @@ #include -#include +#include namespace Slic3r { namespace GUI { @@ -24,11 +24,11 @@ Vec3d GetIntersectionOfRayAndPlane(Vec3d ray_position, Vec3d ray_dir, Vec3d plan //BBS: GUI refactor: add obj manipulation GLGizmoScale3D::GLGizmoScale3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id, GizmoObjectManipulation* obj_manipulation) : GLGizmoBase(parent, icon_filename, sprite_id) + , m_scale(Vec3d::Ones()) + , m_offset(Vec3d::Zero()) + , m_snap_step(0.05) //BBS: GUI refactor: add obj manipulation , m_object_manipulation(obj_manipulation) - , m_base_color(DEFAULT_BASE_COLOR) - , m_drag_color(DEFAULT_DRAG_COLOR) - , m_highlight_color(DEFAULT_HIGHLIGHT_COLOR) { m_grabber_connections[0].grabber_indices = { 0, 1 }; m_grabber_connections[1].grabber_indices = { 2, 3 }; @@ -39,6 +39,17 @@ GLGizmoScale3D::GLGizmoScale3D(GLCanvas3D& parent, const std::string& icon_filen m_grabber_connections[6].grabber_indices = { 9, 6 }; } +const Vec3d &GLGizmoScale3D::get_scale() +{ + if (m_object_manipulation) { + Vec3d cache_scale = m_object_manipulation->get_cache().scale.cwiseQuotient(Vec3d(100,100,100)); + Vec3d temp_scale = cache_scale.cwiseProduct(m_scale); + m_object_manipulation->limit_scaling_ratio(temp_scale); + m_scale = temp_scale.cwiseQuotient(cache_scale); + } + return m_scale; +} + std::string GLGizmoScale3D::get_tooltip() const { const Selection& selection = m_parent.get_selection(); @@ -70,77 +81,57 @@ std::string GLGizmoScale3D::get_tooltip() const return ""; } -static int constraint_id(int grabber_id) -{ - static const std::vector id_map = { 1, 0, 3, 2, 5, 4, 8, 9, 6, 7 }; - return (0 <= grabber_id && grabber_id < (int)id_map.size()) ? id_map[grabber_id] : -1; -} - bool GLGizmoScale3D::on_mouse(const wxMouseEvent &mouse_event) { if (mouse_event.Dragging()) { if (m_dragging) { // Apply new temporary scale factors - Selection& selection = m_parent.get_selection(); TransformationType transformation_type; - if (selection.is_single_full_instance()) { - transformation_type.set_instance(); - } else if (selection.is_single_volume_or_modifier()) { + if (wxGetApp().obj_manipul()->is_local_coordinates()) transformation_type.set_local(); - } + else if (wxGetApp().obj_manipul()->is_instance_coordinates()) + transformation_type.set_instance(); transformation_type.set_relative(); if (mouse_event.AltDown()) transformation_type.set_independent(); - selection.scale(m_scale, transformation_type); - if (m_starting.ctrl_down && m_hover_id < 6) { - // constrained scale: - // uses the performed scale to calculate the new position of the constrained grabber - // and from that calculates the offset (in world coordinates) to be applied to fullfill the constraint - update_render_data(); - const Vec3d constraint_position = m_grabbers[constraint_id(m_hover_id)].center; - // re-apply the scale because the selection always applies the transformations with respect to the initial state - // set into on_start_dragging() with the call to selection.setup_cache() - m_parent.get_selection().scale_and_translate(m_scale, m_starting.pivots[m_hover_id] - constraint_position, transformation_type); - } + Selection& selection = m_parent.get_selection(); + selection.scale_and_translate(get_scale(), get_offset(), transformation_type); } } return use_grabbers(mouse_event); } +void GLGizmoScale3D::data_changed(bool is_serializing) +{ + const Selection &selection = m_parent.get_selection(); + bool enable_scale_xyz = selection.is_single_full_instance() || + selection.is_single_volume_or_modifier(); + for (unsigned int i = 0; i < 6; ++i) + m_grabbers[i].enabled = enable_scale_xyz; + + set_scale(Vec3d::Ones()); + + change_cs_by_selection(); +} + void GLGizmoScale3D::enable_ununiversal_scale(bool enable) { for (unsigned int i = 0; i < 6; ++i) m_grabbers[i].enabled = enable; } -void GLGizmoScale3D::data_changed(bool is_serializing) { - const Selection &selection = m_parent.get_selection(); - bool enable_scale_xyz = selection.is_single_full_instance() || - selection.is_single_volume_or_modifier(); - for (unsigned int i = 0; i < 6; ++i) - m_grabbers[i].enabled = enable_scale_xyz; - - set_scale(Vec3d::Ones()); -} - bool GLGizmoScale3D::on_init() { - for (int i = 0; i < 10; ++i) { + for (int i = 0; i < 10; ++i) + { m_grabbers.push_back(Grabber()); } double half_pi = 0.5 * (double)PI; - // x axis - m_grabbers[0].angles(1) = half_pi; - m_grabbers[1].angles(1) = half_pi; - - // y axis - m_grabbers[2].angles(0) = half_pi; - m_grabbers[3].angles(0) = half_pi; // BBS m_grabbers[4].enabled = false; @@ -151,7 +142,11 @@ bool GLGizmoScale3D::on_init() std::string GLGizmoScale3D::on_get_name() const { - return _u8L("Scale"); + if (!on_is_activable() && m_state == EState::Off) { + return _u8L("Scale") + ":\n" + _u8L("Please select at least one object."); + } else { + return _u8L("Scale"); + } } bool GLGizmoScale3D::on_is_activable() const @@ -160,21 +155,48 @@ bool GLGizmoScale3D::on_is_activable() const return !selection.is_empty() && !selection.is_wipe_tower(); } +void GLGizmoScale3D::on_set_state() { + if (get_state() == On) { + m_last_selected_obejct_idx = -1; + m_last_selected_volume_idx = -1; + change_cs_by_selection(); + } +} + +static int constraint_id(int grabber_id) +{ + static const std::vector id_map = {1, 0, 3, 2, 5, 4, 8, 9, 6, 7}; + return (0 <= grabber_id && grabber_id < (int) id_map.size()) ? id_map[grabber_id] : -1; +} + void GLGizmoScale3D::on_start_dragging() { - assert(m_hover_id != -1); - m_starting.drag_position = m_grabbers[m_hover_id].center; - m_starting.plane_center = m_grabbers[4].center; - m_starting.plane_nromal = m_grabbers[5].center - m_grabbers[4].center; - m_starting.ctrl_down = wxGetKeyState(WXK_CONTROL); - m_starting.box = m_box; + if (m_hover_id != -1) { + auto grabbers_transform = m_grabbers_tran.get_matrix(); + m_starting.drag_position = grabbers_transform * m_grabbers[m_hover_id].center; + m_starting.plane_center = grabbers_transform * m_grabbers[4].center; // plane_center = bottom center + m_starting.plane_nromal = (grabbers_transform * m_grabbers[5].center - grabbers_transform * m_grabbers[4].center).normalized(); + m_starting.ctrl_down = wxGetKeyState(WXK_CONTROL); + m_starting.box = m_bounding_box; - m_starting.pivots[0] = m_grabbers[1].center; - m_starting.pivots[1] = m_grabbers[0].center; - m_starting.pivots[2] = m_grabbers[3].center; - m_starting.pivots[3] = m_grabbers[2].center; - m_starting.pivots[4] = m_grabbers[5].center; - m_starting.pivots[5] = m_grabbers[4].center; + m_starting.center = m_center; + m_starting.instance_center = m_instance_center; + + const Vec3d box_half_size = 0.5 * m_bounding_box.size(); + + m_starting.local_pivots[0] = Vec3d(box_half_size.x(), 0.0, -box_half_size.z()); + m_starting.local_pivots[1] = Vec3d(-box_half_size.x(), 0.0, -box_half_size.z()); + m_starting.local_pivots[2] = Vec3d(0.0, box_half_size.y(), -box_half_size.z()); + m_starting.local_pivots[3] = Vec3d(0.0, -box_half_size.y(), -box_half_size.z()); + m_starting.local_pivots[4] = Vec3d(0.0, 0.0, box_half_size.z()); + m_starting.local_pivots[5] = Vec3d(0.0, 0.0, -box_half_size.z()); + for (size_t i = 0; i < 6; i++) { + m_starting.pivots[i] = grabbers_transform * m_starting.local_pivots[i]; // todo delete + } + m_starting.constraint_position = grabbers_transform * m_grabbers[constraint_id(m_hover_id)].center; + m_scale = m_starting.scale = Vec3d::Ones() ; + m_offset = Vec3d::Zero(); + } } void GLGizmoScale3D::on_stop_dragging() @@ -185,26 +207,95 @@ void GLGizmoScale3D::on_stop_dragging() void GLGizmoScale3D::on_dragging(const UpdateData& data) { - if (m_hover_id == 0 || m_hover_id == 1) + if ((m_hover_id == 0) || (m_hover_id == 1)) do_scale_along_axis(X, data); - else if (m_hover_id == 2 || m_hover_id == 3) + else if ((m_hover_id == 2) || (m_hover_id == 3)) do_scale_along_axis(Y, data); - else if (m_hover_id == 4 || m_hover_id == 5) + else if ((m_hover_id == 4) || (m_hover_id == 5)) do_scale_along_axis(Z, data); else if (m_hover_id >= 6) do_scale_uniform(data); } +void GLGizmoScale3D::update_grabbers_data() +{ + const Selection &selection = m_parent.get_selection(); + const auto &[box, box_trafo] = selection.get_bounding_box_in_current_reference_system(); + m_bounding_box = box; + m_center = box_trafo.translation(); + m_grabbers_tran.set_matrix(box_trafo); + m_instance_center = (selection.is_single_full_instance() || selection.is_single_volume_or_modifier()) ? selection.get_first_volume()->get_instance_offset() : m_center; + + const Vec3d box_half_size = 0.5 * m_bounding_box.size(); + bool ctrl_down = wxGetKeyState(WXK_CONTROL); + + + bool single_instance = selection.is_single_full_instance(); + bool single_volume = selection.is_single_modifier() || selection.is_single_volume(); + + // x axis + m_grabbers[0].center = Vec3d(-(box_half_size.x()), 0.0, -box_half_size.z()); + m_grabbers[0].color = (ctrl_down && m_hover_id == 1) ? CONSTRAINED_COLOR : AXES_COLOR[0]; + m_grabbers[1].center = Vec3d(box_half_size.x(), 0.0, -box_half_size.z()); + m_grabbers[1].color = (ctrl_down && m_hover_id == 0) ? CONSTRAINED_COLOR : AXES_COLOR[0]; + // y axis + m_grabbers[2].center = Vec3d(0.0, -(box_half_size.y()), -box_half_size.z()); + m_grabbers[2].color = (ctrl_down && m_hover_id == 3) ? CONSTRAINED_COLOR : AXES_COLOR[1]; + m_grabbers[3].center = Vec3d(0.0, box_half_size.y(), -box_half_size.z()); + m_grabbers[3].color = (ctrl_down && m_hover_id == 2) ? CONSTRAINED_COLOR : AXES_COLOR[1]; + // z axis do not show 4 + m_grabbers[4].center = Vec3d(0.0, 0.0, -(box_half_size.z())); + m_grabbers[4].enabled = false; + + m_grabbers[5].center = Vec3d(0.0, 0.0, box_half_size.z()); + m_grabbers[5].color = (ctrl_down && m_hover_id == 4) ? CONSTRAINED_COLOR : AXES_COLOR[2]; + // uniform + m_grabbers[6].center = Vec3d(-box_half_size.x(), -box_half_size.y(), -box_half_size.z()); + m_grabbers[6].color = (ctrl_down && m_hover_id == 8) ? CONSTRAINED_COLOR : GRABBER_UNIFORM_COL; + m_grabbers[7].center = Vec3d(box_half_size.x(), -box_half_size.y(), -box_half_size.z()); + m_grabbers[7].color = (ctrl_down && m_hover_id == 9) ? CONSTRAINED_COLOR : GRABBER_UNIFORM_COL; + m_grabbers[8].center = Vec3d(box_half_size.x(), box_half_size.y(), -box_half_size.z()); + m_grabbers[8].color = (ctrl_down && m_hover_id == 6) ? CONSTRAINED_COLOR : GRABBER_UNIFORM_COL; + m_grabbers[9].center = Vec3d(-box_half_size.x(), box_half_size.y(), -box_half_size.z()); + m_grabbers[9].color = (ctrl_down && m_hover_id == 7) ? CONSTRAINED_COLOR : GRABBER_UNIFORM_COL; + for (int i = 0; i < 6; ++i) { + //m_grabbers[i].color = AXES_COLOR[i / 2]; + m_grabbers[i].hover_color = AXES_HOVER_COLOR[i / 2]; + } + for (int i = 6; i < 10; ++i) { + //m_grabbers[i].color = GRABBER_UNIFORM_COL; + m_grabbers[i].hover_color = GRABBER_UNIFORM_HOVER_COL; + } + + for (int i = 0; i < 10; ++i) { + m_grabbers[i].matrix = m_grabbers_tran.get_matrix(); + } +} + + +void GLGizmoScale3D::change_cs_by_selection() { + int obejct_idx, volume_idx; + ModelVolume *model_volume = m_parent.get_selection().get_selected_single_volume(obejct_idx, volume_idx); + if (m_last_selected_obejct_idx == obejct_idx && m_last_selected_volume_idx == volume_idx) { return; } + m_last_selected_obejct_idx = obejct_idx; + m_last_selected_volume_idx = volume_idx; + if (m_parent.get_selection().is_multiple_full_object()) { + m_object_manipulation->set_coordinates_type(ECoordinatesType::World); + } else if (model_volume) { + m_object_manipulation->set_coordinates_type(ECoordinatesType::Local); + } +} + void GLGizmoScale3D::on_render() { glsafe(::glClear(GL_DEPTH_BUFFER_BIT)); glsafe(::glEnable(GL_DEPTH_TEST)); - update_render_data(); + update_grabbers_data(); glsafe(::glLineWidth((m_hover_id != -1) ? 2.0f : 1.5f)); - const float grabber_mean_size = (float) ((m_box.size().x() + m_box.size().y() + m_box.size().z()) / 3.0); + const float grabber_mean_size = (float)((m_bounding_box.size().x() + m_bounding_box.size().y() + m_bounding_box.size().z()) / 3.0); //draw connections GLShaderProgram* shader = wxGetApp().get_shader("flat"); @@ -213,7 +304,7 @@ void GLGizmoScale3D::on_render() // BBS: when select multiple objects, uniform scale can be deselected, display the connection(4,5) //if (single_instance || single_volume) { const Camera& camera = wxGetApp().plater()->get_camera(); - shader->set_uniform("view_model_matrix", camera.get_view_matrix()); + shader->set_uniform("view_model_matrix", camera.get_view_matrix() * m_grabbers_tran.get_matrix()); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); if (m_grabbers[4].enabled && m_grabbers[5].enabled) render_grabbers_connection(4, 5, m_grabbers[4].color); @@ -298,29 +389,53 @@ void GLGizmoScale3D::on_render_input_window(float x, float y, float bottom_limit void GLGizmoScale3D::do_scale_along_axis(Axis axis, const UpdateData& data) { double ratio = calc_ratio(data); - if (ratio > 0.0) { - Vec3d curr_scale = m_scale; - curr_scale(axis) = m_starting.scale(axis) * ratio; - m_scale = curr_scale; + if (ratio > 0.0) + { + m_scale(axis) = m_starting.scale(axis) * ratio; + if (m_starting.ctrl_down && abs(ratio-1.0f)>0.001) { + double local_offset = 0.5 * (m_scale(axis) - m_starting.scale(axis)) * m_starting.box.size()(axis); + if (m_hover_id == 2 * axis) { + local_offset *= -1.0; + } + Vec3d local_offset_vec; + switch (axis) + { + case X: { local_offset_vec = local_offset * Vec3d::UnitX(); break; } + case Y: { local_offset_vec = local_offset * Vec3d::UnitY(); break;} + case Z: { local_offset_vec = local_offset * Vec3d::UnitZ(); break; + } + default: break; + } + if (m_object_manipulation->is_world_coordinates()) { + m_offset = local_offset_vec; + } else {//if (m_object_manipulation->is_instance_coordinates()) + m_offset = m_grabbers_tran.get_matrix_no_offset() * local_offset_vec; + } + } + else + m_offset = Vec3d::Zero(); } } -void GLGizmoScale3D::do_scale_uniform(const UpdateData & data) +void GLGizmoScale3D::do_scale_uniform(const UpdateData& data) { - const double ratio = calc_ratio(data); + double ratio = calc_ratio(data); if (ratio > 0.0) + { m_scale = m_starting.scale * ratio; + m_offset = Vec3d::Zero(); + } } double GLGizmoScale3D::calc_ratio(const UpdateData& data) const { double ratio = 0.0; - Vec3d pivot = (m_starting.ctrl_down && m_hover_id < 6) ? m_starting.pivots[m_hover_id] : m_starting.plane_center; - + Vec3d pivot = (m_starting.ctrl_down && (m_hover_id < 6)) ? m_starting.constraint_position : m_starting.plane_center; // plane_center = bottom center Vec3d starting_vec = m_starting.drag_position - pivot; double len_starting_vec = starting_vec.norm(); - if (len_starting_vec != 0.0) { + if (len_starting_vec != 0.0) + { Vec3d mouse_dir = data.mouse_ray.unit_vector(); Vec3d plane_normal = m_starting.plane_nromal; if (m_hover_id == 5) { @@ -328,10 +443,16 @@ double GLGizmoScale3D::calc_ratio(const UpdateData& data) const Vec3d plane_vec = mouse_dir.cross(m_starting.plane_nromal); plane_normal = plane_vec.cross(m_starting.plane_nromal); } - + plane_normal = plane_normal.normalized(); // finds the intersection of the mouse ray with the plane that the drag point moves // use ray-plane intersection see i.e. https://en.wikipedia.org/wiki/Line%E2%80%93plane_intersection - Vec3d inters = GetIntersectionOfRayAndPlane(data.mouse_ray.a, mouse_dir, m_starting.drag_position, plane_normal.normalized()); + auto dot_value = (plane_normal.dot(mouse_dir)); + auto angle = Geometry::rad2deg(acos(dot_value)); + auto big_than_min_angle = abs(angle) < 95 && abs(angle) > 85; + if (big_than_min_angle) { + return 1; + } + Vec3d inters = GetIntersectionOfRayAndPlane(data.mouse_ray.a, mouse_dir, m_starting.drag_position, plane_normal); Vec3d inters_vec = inters - m_starting.drag_position; @@ -347,78 +468,5 @@ double GLGizmoScale3D::calc_ratio(const UpdateData& data) const return ratio; } -void GLGizmoScale3D::update_render_data() -{ - - const Selection& selection = m_parent.get_selection(); - - bool single_instance = selection.is_single_full_instance(); - bool single_volume = selection.is_single_volume_or_modifier(); - - m_box.reset(); - m_transform = Transform3d::Identity(); - Vec3d angles = Vec3d::Zero(); - - if (single_instance) { - // calculate bounding box in instance local reference system - const Selection::IndicesList& idxs = selection.get_volume_idxs(); - for (unsigned int idx : idxs) { - const GLVolume* vol = selection.get_volume(idx); - m_box.merge(vol->bounding_box().transformed(vol->get_volume_transformation().get_matrix())); - } - - // gets transform from first selected volume - const GLVolume* v = selection.get_first_volume(); - m_transform = v->get_instance_transformation().get_matrix(); - // gets angles from first selected volume - angles = v->get_instance_rotation(); - } - else if (single_volume) { - const GLVolume* v = selection.get_first_volume(); - m_box = v->bounding_box(); - m_transform = v->world_matrix(); - angles = Geometry::extract_euler_angles(m_transform); - } - else - m_box = selection.get_bounding_box(); - - const Vec3d& center = m_box.center(); - - // x axis - m_grabbers[0].center = m_transform * Vec3d(m_box.min.x(), center.y(), m_box.min.z()); - m_grabbers[1].center = m_transform * Vec3d(m_box.max.x(), center.y(), m_box.min.z()); - - // y axis - m_grabbers[2].center = m_transform * Vec3d(center.x(), m_box.min.y(), m_box.min.z()); - m_grabbers[3].center = m_transform * Vec3d(center.x(), m_box.max.y(), m_box.min.z()); - - // z axis do not show 4 - m_grabbers[4].center = m_transform * Vec3d(center.x(), center.y(), m_box.min.z()); - m_grabbers[4].enabled = false; - - m_grabbers[5].center = m_transform * Vec3d(center.x(), center.y(), m_box.max.z()); - - // uniform - m_grabbers[6].center = m_transform * Vec3d(m_box.min.x(), m_box.min.y(), m_box.min.z()); - m_grabbers[7].center = m_transform * Vec3d(m_box.max.x(), m_box.min.y(), m_box.min.z()); - m_grabbers[8].center = m_transform * Vec3d(m_box.max.x(), m_box.max.y(), m_box.min.z()); - m_grabbers[9].center = m_transform * Vec3d(m_box.min.x(), m_box.max.y(), m_box.min.z()); - - for (int i = 0; i < 6; ++i) { - m_grabbers[i].color = AXES_COLOR[i/2]; - m_grabbers[i].hover_color = AXES_HOVER_COLOR[i/2]; - } - - for (int i = 6; i < 10; ++i) { - m_grabbers[i].color = GRABBER_UNIFORM_COL; - m_grabbers[i].hover_color = GRABBER_UNIFORM_HOVER_COL; - } - - // sets grabbers orientation - for (int i = 0; i < 10; ++i) { - m_grabbers[i].angles = angles; - } -} - } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp b/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp index 77929bb538..6b46a596ba 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp @@ -19,25 +19,28 @@ class GLGizmoScale3D : public GLGizmoBase { Vec3d scale; Vec3d drag_position; + Vec3d constraint_position; + Vec3d center{Vec3d::Zero()};//sphere bounding box center + Vec3d instance_center{Vec3d::Zero()}; Vec3d plane_center; // keep the relative center position for scale in the bottom plane - Vec3d plane_nromal; // keep the bottom plane + Vec3d plane_nromal; // keep the bottom plane BoundingBoxf3 box; - Vec3d pivots[6]; + Vec3d pivots[6];// Vec3d constraint_position{Vec3d::Zero()}; + Vec3d local_pivots[6]; bool ctrl_down; StartingData() : scale(Vec3d::Ones()), drag_position(Vec3d::Zero()), ctrl_down(false) { for (int i = 0; i < 5; ++i) { pivots[i] = Vec3d::Zero(); } } }; - BoundingBoxf3 m_box; - Transform3d m_transform; - Vec3d m_scale{ Vec3d::Ones() }; - double m_snap_step{ 0.05 }; + mutable BoundingBoxf3 m_bounding_box; + Geometry::Transformation m_grabbers_tran;//m_grabbers_transform + Vec3d m_center{Vec3d::Zero()}; + Vec3d m_instance_center{Vec3d::Zero()}; + Vec3d m_scale; + Vec3d m_offset; + double m_snap_step; StartingData m_starting; - ColorRGBA m_base_color; - ColorRGBA m_drag_color; - ColorRGBA m_highlight_color; - struct GrabberConnection { GLModel model; @@ -58,9 +61,11 @@ public: double get_snap_step(double step) const { return m_snap_step; } void set_snap_step(double step) { m_snap_step = step; } - const Vec3d& get_scale() const { return m_scale; } + const Vec3d &get_scale(); void set_scale(const Vec3d& scale) { m_starting.scale = scale; m_scale = scale; } + const Vec3d& get_offset() const { return m_offset; } + std::string get_tooltip() const override; /// @@ -76,6 +81,7 @@ protected: virtual bool on_init() override; virtual std::string on_get_name() const override; virtual bool on_is_activable() const override; + virtual void on_set_state() override; virtual void on_start_dragging() override; virtual void on_stop_dragging() override; virtual void on_dragging(const UpdateData& data) override; @@ -92,7 +98,10 @@ private: void do_scale_uniform(const UpdateData& data); double calc_ratio(const UpdateData& data) const; - void update_render_data(); + void update_grabbers_data(); + void change_cs_by_selection(); // cs mean Coordinate System +private: + int m_last_selected_obejct_idx, m_last_selected_volume_idx; }; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoText.cpp b/src/slic3r/GUI/Gizmos/GLGizmoText.cpp index 63069b42b5..72c69dc0e9 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoText.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoText.cpp @@ -1024,20 +1024,6 @@ void GLGizmoText::show_tooltip_information(float x, float y) ImGui::PopStyleVar(2); } -ModelVolume *GLGizmoText::get_selected_single_volume(int &out_object_idx, int &out_volume_idx) const -{ - if (m_parent.get_selection().is_single_volume() || m_parent.get_selection().is_single_modifier()) { - const Selection &selection = m_parent.get_selection(); - const GLVolume * gl_volume = selection.get_first_volume(); - out_object_idx = gl_volume->object_idx(); - ModelObject *model_object = selection.get_model()->objects[out_object_idx]; - out_volume_idx = gl_volume->volume_idx(); - if (out_volume_idx < model_object->volumes.size()) - return model_object->volumes[out_volume_idx]; - } - return nullptr; -} - void GLGizmoText::reset_text_info() { m_font_name = ""; diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp index 91918fa147..0a45b86d4d 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp @@ -62,7 +62,9 @@ std::vector GLGizmosManager::get_selectable_idxs() const out.reserve(m_gizmos.size()); if (m_parent.get_canvas_type() == GLCanvas3D::CanvasAssembleView) { for (size_t i = 0; i < m_gizmos.size(); ++i) - if (m_gizmos[i]->get_sprite_id() == (unsigned int) Measure || + if (m_gizmos[i]->get_sprite_id() == (unsigned int) Move || + m_gizmos[i]->get_sprite_id() == (unsigned int) Rotate || + m_gizmos[i]->get_sprite_id() == (unsigned int) Measure || m_gizmos[i]->get_sprite_id() == (unsigned int) Assembly || m_gizmos[i]->get_sprite_id() == (unsigned int) MmuSegmentation) out.push_back(i); @@ -247,6 +249,16 @@ bool GLGizmosManager::init_icon_textures() else return false; + if (IMTexture::load_from_svg_file(Slic3r::resources_dir() + "/images/toolbar_reset_zero.svg", 14, 14, texture_id)) + icon_list.insert(std::make_pair((int) IC_TOOLBAR_RESET_ZERO, texture_id)); + else + return false; + + if (IMTexture::load_from_svg_file(Slic3r::resources_dir() + "/images/toolbar_reset_zero_hover.svg", 14, 14, texture_id)) + icon_list.insert(std::make_pair((int) IC_TOOLBAR_RESET_ZERO_HOVER, texture_id)); + else + return false; + if (IMTexture::load_from_svg_file(Slic3r::resources_dir() + "/images/toolbar_tooltip.svg", 25, 25, texture_id)) // ORCA: Use same resolution with gizmos to prevent blur on icon icon_list.insert(std::make_pair((int)IC_TOOLBAR_TOOLTIP, texture_id)); else @@ -371,6 +383,9 @@ void GLGizmosManager::update_assemble_view_data() void GLGizmosManager::update_data() { if (!m_enabled) return; + + const Selection& selection = m_parent.get_selection(); + if (m_common_gizmos_data) m_common_gizmos_data->update(get_current() ? get_current()->get_requirements() @@ -381,8 +396,10 @@ void GLGizmosManager::update_data() if (m_current != Flatten && !m_gizmos.empty()) m_gizmos[Flatten]->data_changed(m_serializing); //BBS: GUI refactor: add object manipulation in gizmo - m_object_manipulation.update_ui_from_settings(); - m_object_manipulation.UpdateAndShow(true); + if (!selection.is_empty()) { + m_object_manipulation.update_ui_from_settings(); + m_object_manipulation.UpdateAndShow(true); + } } bool GLGizmosManager::is_running() const @@ -461,6 +478,22 @@ bool GLGizmosManager::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_p return false; } +bool GLGizmosManager::is_paint_gizmo() +{ + return m_current == EType::FdmSupports || + m_current == EType::MmuSegmentation || + m_current == EType::Seam; +} + +bool GLGizmosManager::is_allow_select_all() { + if (m_current == Undefined || m_current == EType::Move|| + m_current == EType::Rotate || + m_current == EType::Scale) { + return true; + } + return false; +} + ClippingPlane GLGizmosManager::get_clipping_plane() const { if (! m_common_gizmos_data diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp index 06b0f69210..14654239c4 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp @@ -164,6 +164,8 @@ public: enum MENU_ICON_NAME { IC_TOOLBAR_RESET = 0, IC_TOOLBAR_RESET_HOVER, + IC_TOOLBAR_RESET_ZERO, + IC_TOOLBAR_RESET_ZERO_HOVER, IC_TOOLBAR_TOOLTIP, IC_TOOLBAR_TOOLTIP_HOVER, IC_NAME_COUNT, @@ -261,6 +263,8 @@ public: return nullptr; } + bool is_paint_gizmo(); + bool is_allow_select_all(); ClippingPlane get_clipping_plane() const; ClippingPlane get_assemble_view_clipping_plane() const; bool wants_reslice_supports_on_undo() const; diff --git a/src/slic3r/GUI/Gizmos/GizmoObjectManipulation.cpp b/src/slic3r/GUI/Gizmos/GizmoObjectManipulation.cpp index a1490ebc70..be2448e987 100644 --- a/src/slic3r/GUI/Gizmos/GizmoObjectManipulation.cpp +++ b/src/slic3r/GUI/Gizmos/GizmoObjectManipulation.cpp @@ -6,8 +6,8 @@ //#include "I18N.hpp" #include "GLGizmosManager.hpp" #include "slic3r/GUI/GLCanvas3D.hpp" - #include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/Utils/UndoRedo.hpp" #include "libslic3r/AppConfig.hpp" #include "libslic3r/Model.hpp" @@ -54,6 +54,24 @@ GizmoObjectManipulation::GizmoObjectManipulation(GLCanvas3D& glcanvas) { m_imperial_units = wxGetApp().app_config->get("use_inches") == "1"; m_new_unit_string = m_imperial_units ? L("in") : L("mm"); + + const wxString shift = "Shift+"; + const wxString alt = GUI::shortkey_alt_prefix(); + const wxString ctrl = GUI::shortkey_ctrl_prefix(); + m_desc_move["part_selection_caption"] = alt + _L("Left mouse button"); + m_desc_move["part_selection"] = _L("Part selection"); + m_desc_move["snap_step_caption"] = shift + _L("Left mouse button"); + m_desc_move["snap_step"] = _L("Fixed step drag"); + + m_desc_rotate["part_selection_caption"] = alt + _L("Left mouse button"); + m_desc_rotate["part_selection"] = _L("Part selection"); + + m_desc_scale["part_selection_caption"] = alt + _L("Left mouse button"); + m_desc_scale["part_selection"] = _L("Part selection"); + m_desc_scale["snap_step_caption"] = shift + _L("Left mouse button"); + m_desc_scale["snap_step"] = _L("Fixed step drag"); + m_desc_scale["single_sided_caption"] = ctrl + _L("Left mouse button"); + m_desc_scale["single_sided"] = _L("Single sided scaling"); } void GizmoObjectManipulation::UpdateAndShow(const bool show) @@ -74,31 +92,40 @@ void GizmoObjectManipulation::update_ui_from_settings() update_buffered_value(); } } +void delete_negative_sign(Vec3d& value) { + for (size_t i = 0; i < value.size(); i++) { + if (abs(value[i]) < 0.001) + value[i] = 0.f; + } +} -void GizmoObjectManipulation::update_settings_value(const Selection& selection) +void GizmoObjectManipulation::update_settings_value(const Selection &selection) { m_new_move_label_string = L("Position"); - m_new_rotate_label_string = L("Rotation"); + m_new_rotate_label_string = L("Rotate (relative)"); + m_new_rotation = Vec3d::Zero(); + m_new_absolute_rotation = Vec3d::Zero(); m_new_scale_label_string = L("Scale ratios"); - m_coordinates_type = ECoordinatesType::World; - ObjectList* obj_list = wxGetApp().obj_list(); if (selection.is_single_full_instance()) { // all volumes in the selection belongs to the same instance, any of them contains the needed instance data, so we take the first one const GLVolume* volume = selection.get_first_volume(); m_new_position = volume->get_instance_offset(); - - if (is_world_coordinates()) { - m_new_rotate_label_string = L("Rotate"); - m_new_rotation = volume->get_instance_rotation() * (180. / M_PI); - m_new_size = selection.get_scaled_instance_bounding_box().size(); - m_new_scale = m_new_size.cwiseProduct(selection.get_unscaled_instance_bounding_box().size().cwiseInverse()) * 100.; - } - else { - m_new_rotation = volume->get_instance_rotation() * (180. / M_PI); - m_new_size = volume->get_instance_transformation().get_scaling_factor().cwiseProduct(wxGetApp().model().objects[volume->object_idx()]->raw_mesh_bounding_box().size()); - m_new_scale = volume->get_instance_scaling_factor() * 100.; + auto rotation = volume->get_instance_transformation().get_rotation_by_quaternion(); + m_new_absolute_rotation = rotation * (180. / M_PI); + delete_negative_sign(m_new_absolute_rotation); + if (is_world_coordinates()) {//for move and rotate + m_new_size = selection.get_bounding_box_in_current_reference_system().first.size(); + m_unscale_size = selection.get_unscaled_instance_bounding_box().size(); + m_new_scale = m_new_size.cwiseQuotient(m_unscale_size) * 100.0; + } + else {//if (is_local_coordinates()) {//for scale + auto tran = selection.get_first_volume()->get_instance_transformation(); + m_new_position = tran.get_matrix().inverse() * cs_center; + m_new_size = selection.get_bounding_box_in_current_reference_system().first.size(); + m_unscale_size = selection.get_full_unscaled_instance_local_bounding_box().size(); + m_new_scale = m_new_size.cwiseQuotient(m_unscale_size) * 100.0; } m_new_enabled = true; @@ -108,32 +135,48 @@ void GizmoObjectManipulation::update_settings_value(const Selection& selection) else if (selection.is_single_full_object() && obj_list->is_selected(itObject)) { const BoundingBoxf3& box = selection.get_bounding_box(); m_new_position = box.center(); - m_new_rotation = Vec3d::Zero(); m_new_scale = Vec3d(100., 100., 100.); - m_new_size = box.size(); - m_new_rotate_label_string = L("Rotate"); + m_new_size = selection.get_bounding_box_in_current_reference_system().first.size(); m_new_scale_label_string = L("Scale"); m_new_enabled = true; m_new_title_string = L("Object Operations"); - } - else if (selection.is_single_modifier() || selection.is_single_volume()) { - // the selection contains a single volume - const GLVolume* volume = selection.get_first_volume(); - m_new_position = volume->get_volume_offset(); - m_new_rotation = volume->get_volume_rotation() * (180. / M_PI); - m_new_scale = volume->get_volume_scaling_factor() * 100.; - m_new_size = volume->get_instance_transformation().get_scaling_factor().cwiseProduct(volume->get_volume_transformation().get_scaling_factor().cwiseProduct(volume->bounding_box().size())); + } else if (selection.is_single_volume_or_modifier()) { + const GLVolume *volume = selection.get_first_volume(); + auto rotation = volume->get_volume_transformation().get_rotation_by_quaternion(); + m_new_absolute_rotation = rotation * (180. / M_PI); + delete_negative_sign(m_new_absolute_rotation); + if (is_world_coordinates()) {//for move and rotate + const Geometry::Transformation trafo(volume->world_matrix()); + const Vec3d &offset = trafo.get_offset(); + m_new_position = offset; + m_new_scale = Vec3d(100.0, 100.0, 100.0); + m_unscale_size = selection.get_bounding_box_in_current_reference_system().first.size(); + m_new_size = selection.get_bounding_box_in_current_reference_system().first.size(); + } else if (is_local_coordinates()) {//for scale + m_new_position = Vec3d::Zero(); + m_new_scale = volume->get_volume_scaling_factor() * 100.0; + m_unscale_size = selection.get_bounding_box_in_current_reference_system().first.size(); + m_new_size = selection.get_bounding_box_in_current_reference_system().first.size(); + } else { + m_new_position = volume->get_volume_offset(); + m_new_scale_label_string = L("Scale"); + m_new_scale = Vec3d(100.0, 100.0, 100.0); + m_unscale_size = selection.get_bounding_box_in_current_reference_system().first.size(); + m_new_size = selection.get_bounding_box_in_current_reference_system().first.size(); + } m_new_enabled = true; m_new_title_string = L("Volume Operations"); - } - else if (obj_list->multiple_selection() || obj_list->is_selected(itInstanceRoot)) { + } else if (obj_list->is_connectors_item_selected() || obj_list->multiple_selection() || obj_list->is_selected(itInstanceRoot)) { reset_settings_value(); m_new_move_label_string = L("Translate"); - m_new_rotate_label_string = L("Rotate"); m_new_scale_label_string = L("Scale"); - m_new_size = selection.get_bounding_box().size(); + m_unscale_size = selection.get_bounding_box_in_current_reference_system().first.size(); + m_new_size = selection.get_bounding_box_in_current_reference_system().first.size(); m_new_enabled = true; m_new_title_string = L("Group Operations"); + } else if (selection.is_wipe_tower()) { + const BoundingBoxf3 &box = selection.get_bounding_box(); + m_new_position = box.center(); } else { // No selection, reset the cache. @@ -150,7 +193,7 @@ void GizmoObjectManipulation::update_buffered_value() m_buffered_position = this->m_new_position; m_buffered_rotation = this->m_new_rotation; - + m_buffered_absolute_rotation = this->m_new_absolute_rotation; m_buffered_scale = this->m_new_scale; if (this->m_imperial_units) @@ -176,6 +219,7 @@ void GizmoObjectManipulation::update_if_dirty() }; update_label(m_cache.move_label_string, m_new_move_label_string); update_label(m_cache.rotate_label_string, m_new_rotate_label_string); + update_label(m_cache.rotate_label_string, m_new_rotate_label_string); update_label(m_cache.scale_label_string, m_new_scale_label_string); enum ManipulationEditorKey @@ -204,6 +248,7 @@ void GizmoObjectManipulation::update_if_dirty() update(m_cache.scale, m_cache.scale_rounded, m_new_scale); update(m_cache.size, m_cache.size_rounded, m_new_size); update(m_cache.rotation, m_cache.rotation_rounded, m_new_rotation); + update(m_cache.absolute_rotation, m_cache.absolute_rotation_rounded, m_new_absolute_rotation); } update_reset_buttons_visibility(); @@ -216,8 +261,9 @@ void GizmoObjectManipulation::update_reset_buttons_visibility() { const Selection& selection = m_glcanvas.get_selection(); - if (selection.is_single_full_instance() || selection.is_single_modifier() || selection.is_single_volume()) { - const GLVolume* volume = selection.get_first_volume(); + if (selection.is_single_full_instance() || selection.is_single_volume_or_modifier()) { + const GLVolume * volume = selection.get_first_volume(); + Vec3d rotation; Vec3d scale; double min_z = 0.; @@ -231,8 +277,9 @@ void GizmoObjectManipulation::update_reset_buttons_visibility() scale = volume->get_volume_scaling_factor(); min_z = get_volume_min_z(volume); } - m_show_clear_rotation = !rotation.isApprox(Vec3d::Zero()); - m_show_clear_scale = !scale.isApprox(Vec3d::Ones(), EPSILON); + m_show_clear_rotation = !rotation.isApprox(m_init_rotation); + m_show_reset_0_rotation = !rotation.isApprox(Vec3d::Zero()); + m_show_clear_scale = (m_cache.scale / 100.0f - Vec3d::Ones()).norm() > 0.001; m_show_drop_to_bed = (std::abs(min_z) > EPSILON); } } @@ -242,6 +289,7 @@ void GizmoObjectManipulation::reset_settings_value() { m_new_position = Vec3d::Zero(); m_new_rotation = Vec3d::Zero(); + m_new_absolute_rotation = Vec3d::Zero(); m_new_scale = Vec3d::Ones() * 100.; m_new_size = Vec3d::Zero(); m_new_enabled = false; @@ -262,11 +310,22 @@ void GizmoObjectManipulation::change_position_value(int axis, double value) selection.setup_cache(); TransformationType trafo_type; trafo_type.set_relative(); - if (selection.requires_local_axes()) { + switch (m_coordinates_type) { + case ECoordinatesType::Instance: { trafo_type.set_instance(); + break; + } + case ECoordinatesType::Local: { + trafo_type.set_local(); + break; + } + default: { + break; + } } selection.translate(position - m_cache.position, trafo_type); - m_glcanvas.do_move(L("Set Position")); + wxGetApp().plater()->take_snapshot("Set Position", UndoRedo::SnapshotType::GizmoAction); + m_glcanvas.do_move(""); m_cache.position = position; m_cache.position_rounded(axis) = DBL_MAX; @@ -287,38 +346,67 @@ void GizmoObjectManipulation::change_rotation_value(int axis, double value) transformation_type.set_relative(); if (selection.is_single_full_instance()) transformation_type.set_independent(); - if (is_local_coordinates()) transformation_type.set_local(); - if (is_instance_coordinates()) transformation_type.set_instance(); selection.setup_cache(); - selection.rotate( - (M_PI / 180.0) * (transformation_type.absolute() ? rotation : rotation - m_cache.rotation), - transformation_type); - m_glcanvas.do_rotate(L("Set Orientation")); + selection.rotate((M_PI / 180.0) * (transformation_type.absolute() ? rotation : rotation - m_cache.rotation), transformation_type); + wxGetApp().plater()->take_snapshot(_u8L("Set Orientation"), UndoRedo::SnapshotType::GizmoAction); + m_glcanvas.do_rotate(""); m_cache.rotation = rotation; m_cache.rotation_rounded(axis) = DBL_MAX; this->UpdateAndShow(true); } -void GizmoObjectManipulation::change_scale_value(int axis, double value) -{ - if (std::abs(m_cache.scale_rounded(axis) - value) < EPSILON) +void GizmoObjectManipulation::change_absolute_rotation_value(int axis, double value) { + if (std::abs(m_cache.absolute_rotation_rounded(axis) - value) < EPSILON) return; - Vec3d scale = m_cache.scale; - if (scale[axis] != 0 && std::abs(m_cache.size[axis] * value / scale[axis]) > MAX_NUM) { - scale[axis] *= MAX_NUM / m_cache.size[axis]; - } - else { - scale(axis) = value; - } + Vec3d absolute_rotation = m_cache.absolute_rotation; + absolute_rotation(axis) = value; - this->do_scale(axis, scale); + Selection &selection = m_glcanvas.get_selection(); + TransformationType transformation_type; + transformation_type.set_relative(); + if (selection.is_single_full_instance()) + transformation_type.set_independent(); + if (is_local_coordinates()) + transformation_type.set_local(); + if (is_instance_coordinates()) + transformation_type.set_instance(); + + selection.setup_cache(); + auto diff_rotation = transformation_type.absolute() ? absolute_rotation : absolute_rotation - m_cache.absolute_rotation; + selection.rotate((M_PI / 180.0) * diff_rotation, transformation_type); + wxGetApp().plater()->take_snapshot("set absolute orientation", UndoRedo::SnapshotType::GizmoAction); + m_glcanvas.do_rotate(""); + + m_cache.absolute_rotation = absolute_rotation; + m_cache.absolute_rotation_rounded(axis) = DBL_MAX; + this->UpdateAndShow(true); +} + +void GizmoObjectManipulation::change_scale_value(int axis, double value) +{ + if (value <= 0.0) + return; + if (std::abs(m_cache.scale_rounded(axis) - value) < EPSILON) { + m_show_clear_scale = (m_cache.scale / 100.0f - Vec3d::Ones()).norm() > 0.001; + return; + } + Vec3d scale = m_cache.scale; + scale(axis) = value; + Vec3d ref_scale = m_cache.scale; + const Selection &selection = m_glcanvas.get_selection(); + if (selection.is_single_volume_or_modifier()) { + scale = scale.cwiseQuotient(ref_scale); // scale / ref_scale + ref_scale = Vec3d::Ones(); + } else if (selection.is_single_full_instance()) + ref_scale = 100 * Vec3d::Ones(); + this->do_scale(axis, scale.cwiseQuotient(ref_scale)); m_cache.scale = scale; m_cache.scale_rounded(axis) = DBL_MAX; @@ -328,6 +416,8 @@ void GizmoObjectManipulation::change_scale_value(int axis, double value) void GizmoObjectManipulation::change_size_value(int axis, double value) { + if (value <= 0.0) + return; if (std::abs(m_cache.size_rounded(axis) - value) < EPSILON) return; @@ -337,17 +427,17 @@ void GizmoObjectManipulation::change_size_value(int axis, double value) const Selection& selection = m_glcanvas.get_selection(); Vec3d ref_size = m_cache.size; - if (selection.is_single_volume() || selection.is_single_modifier()) { - Vec3d instance_scale = wxGetApp().model().objects[selection.get_first_volume()->object_idx()]->instances[0]->get_transformation().get_scaling_factor(); - ref_size = selection.get_first_volume()->bounding_box().size(); - ref_size = Vec3d(instance_scale[0] * ref_size[0], instance_scale[1] * ref_size[1], instance_scale[2] * ref_size[2]); + if (selection.is_single_volume_or_modifier()) { + size = size.cwiseQuotient(ref_size); + ref_size = Vec3d::Ones(); + } else if (selection.is_single_full_instance()) { + if (is_world_coordinates()) + ref_size = selection.get_full_unscaled_instance_bounding_box().size(); + else + ref_size = selection.get_full_unscaled_instance_local_bounding_box().size(); } - else if (selection.is_single_full_instance()) - ref_size = is_world_coordinates() ? - selection.get_unscaled_instance_bounding_box().size() : - wxGetApp().model().objects[selection.get_first_volume()->object_idx()]->raw_mesh_bounding_box().size(); - this->do_scale(axis, 100. * Vec3d(size(0) / ref_size(0), size(1) / ref_size(1), size(2) / ref_size(2))); + this->do_scale(axis, size.cwiseQuotient(ref_size)); m_cache.size = size; m_cache.size_rounded(axis) = DBL_MAX; @@ -357,25 +447,33 @@ void GizmoObjectManipulation::change_size_value(int axis, double value) void GizmoObjectManipulation::do_scale(int axis, const Vec3d &scale) const { Selection& selection = m_glcanvas.get_selection(); - Vec3d scaling_factor = scale; - TransformationType transformation_type(TransformationType::World_Relative_Joint); - if (selection.is_single_full_instance()) { - transformation_type.set_absolute(); - if (! is_world_coordinates()) - transformation_type.set_local(); - } + TransformationType transformation_type; + if (is_local_coordinates()) + transformation_type.set_local(); + else if (is_instance_coordinates()) + transformation_type.set_instance(); + if (selection.is_single_volume_or_modifier() && !is_local_coordinates()) + transformation_type.set_relative(); - // BBS: when select multiple objects, uniform scale can be deselected - if (m_uniform_scale/* || selection.requires_uniform_scale()*/) - scaling_factor = scale(axis) * Vec3d::Ones(); + Vec3d scaling_factor = m_uniform_scale ? scale(axis) * Vec3d::Ones() : scale; + limit_scaling_ratio(scaling_factor); selection.setup_cache(); - selection.scale_legacy(scaling_factor * 0.01, transformation_type); + selection.scale(scaling_factor, transformation_type); m_glcanvas.do_scale(L("Set Scale")); } -void GizmoObjectManipulation::on_change(const std::string& opt_key, int axis, double new_value) + +void GizmoObjectManipulation::limit_scaling_ratio(Vec3d &scaling_factor) const{ + for (size_t i = 0; i < scaling_factor.size(); i++) { // range protect //scaling_factor too big has problem + if (scaling_factor[i] * m_unscale_size[i] > MAX_NUM) { + scaling_factor[i] = MAX_NUM / m_unscale_size[i]; + } + } +} + +void GizmoObjectManipulation::on_change(const std::string &opt_key, int axis, double new_value) { if (!m_cache.is_valid()) return; @@ -387,55 +485,42 @@ void GizmoObjectManipulation::on_change(const std::string& opt_key, int axis, do change_position_value(axis, new_value); else if (opt_key == "rotation") change_rotation_value(axis, new_value); + else if (opt_key == "absolute_rotation") + change_absolute_rotation_value(axis, new_value); else if (opt_key == "scale") change_scale_value(axis, new_value); else if (opt_key == "size") change_size_value(axis, new_value); } -void GizmoObjectManipulation::set_uniform_scaling(const bool new_value) -{ - const Selection &selection = m_glcanvas.get_selection(); - if (selection.is_single_full_instance() && is_world_coordinates() && !new_value) { - // Verify whether the instance rotation is multiples of 90 degrees, so that the scaling in world coordinates is possible. - // all volumes in the selection belongs to the same instance, any of them contains the needed instance data, so we take the first one - const GLVolume* volume = selection.get_first_volume(); - // Is the angle close to a multiple of 90 degrees? +bool GizmoObjectManipulation::render_combo( + ImGuiWrapper *imgui_wrapper, const std::string &label, const std::vector &lines, size_t &selection_idx, float label_width, float item_width) +{ + ImGui::AlignTextToFramePadding(); + imgui_wrapper->text(label); + ImGui::SameLine(label_width); + ImGui::PushItemWidth(item_width); - if (! Geometry::is_rotation_ninety_degrees(volume->get_instance_rotation())) { - // Cannot apply scaling in the world coordinate system. - // BBS: remove tilt prompt dialog + size_t selection_out = selection_idx; - // Bake the rotation into the meshes of the object. - wxGetApp().model().objects[volume->composite_id.object_id]->bake_xy_rotation_into_meshes(volume->composite_id.instance_id); - // Update the 3D scene, selections etc. - wxGetApp().plater()->update(); - // Recalculate cached values at this panel, refresh the screen. - this->UpdateAndShow(true); + const char *selected_str = (selection_idx >= 0 && selection_idx < int(lines.size())) ? lines[selection_idx].c_str() : ""; + if (ImGui::BBLBeginCombo(("##" + label).c_str(), selected_str, 0)) { + for (size_t line_idx = 0; line_idx < lines.size(); ++line_idx) { + ImGui::PushID(int(line_idx)); + if (ImGui::Selectable("", line_idx == selection_idx)) selection_out = line_idx; + + ImGui::SameLine(); + ImGui::Text("%s", lines[line_idx].c_str()); + ImGui::PopID(); } + + ImGui::EndCombo(); } - m_uniform_scale = new_value; -} -void GizmoObjectManipulation::set_coordinates_type(ECoordinatesType type) -{ - if (wxGetApp().get_mode() == comSimple) - type = ECoordinatesType::World; + bool is_changed = selection_idx != selection_out; + selection_idx = selection_out; - if (m_coordinates_type == type) - return; - - m_coordinates_type = type; - this->UpdateAndShow(true); - GLCanvas3D* canvas = wxGetApp().plater()->canvas3D(); - canvas->get_gizmos_manager().update_data(); - canvas->set_as_dirty(); - canvas->request_extra_frame(); -} - -ECoordinatesType GizmoObjectManipulation::get_coordinates_type() const -{ - return m_coordinates_type; + return is_changed; } void GizmoObjectManipulation::reset_position_value() @@ -456,30 +541,45 @@ void GizmoObjectManipulation::reset_position_value() return; // Copy position values from GLVolumes into Model (ModelInstance / ModelVolume), trigger background processing. - m_glcanvas.do_move(L("Reset Position")); + wxGetApp().plater()->take_snapshot(_u8L("Reset Position"), UndoRedo::SnapshotType::GizmoAction); + m_glcanvas.do_move(""); UpdateAndShow(true); } -void GizmoObjectManipulation::reset_rotation_value() +void GizmoObjectManipulation::reset_rotation_value(bool reset_relative) { - Selection& selection = m_glcanvas.get_selection(); - - if (selection.is_single_volume() || selection.is_single_modifier()) { - GLVolume* volume = const_cast(selection.get_first_volume()); - volume->set_volume_rotation(Vec3d::Zero()); - } - else if (selection.is_single_full_instance()) { - for (unsigned int idx : selection.get_volume_idxs()) { - GLVolume* volume = const_cast(selection.get_volume(idx)); - volume->set_instance_rotation(Vec3d::Zero()); + Selection &selection = m_glcanvas.get_selection(); + selection.setup_cache(); + if (selection.is_single_volume_or_modifier()) { + GLVolume * vol = const_cast(selection.get_first_volume()); + Geometry::Transformation trafo = vol->get_volume_transformation(); + if (reset_relative) { + auto offset = trafo.get_offset(); + trafo.set_matrix(m_init_rotation_scale_tran); + trafo.set_offset(offset); } - } - else + else { + trafo.reset_rotation(); + } + vol->set_volume_transformation(trafo); + } else if (selection.is_single_full_instance()) { + Geometry::Transformation trafo = selection.get_first_volume()->get_instance_transformation(); + if (reset_relative) { + auto offset = trafo.get_offset(); + trafo.set_matrix(m_init_rotation_scale_tran); + trafo.set_offset(offset); + } else { + trafo.reset_rotation(); + } + for (unsigned int idx : selection.get_volume_idxs()) { + const_cast(selection.get_volume(idx))->set_instance_transformation(trafo); + } + } else return; + // Synchronize instances/volumes. - // Update rotation at the GLVolumes. - selection.synchronize_unselected_instances(Selection::SyncRotationType::GENERAL); + selection.synchronize_unselected_instances(Selection::SyncRotationType::RESET); selection.synchronize_unselected_volumes(); // Copy rotation values from GLVolumes into Model (ModelInstance / ModelVolume), trigger background processing. m_glcanvas.do_rotate(L("Reset Rotation")); @@ -496,9 +596,37 @@ void GizmoObjectManipulation::reset_scale_value() change_scale_value(2, 100.); } -static const char* label_values[2][3] = { +void GizmoObjectManipulation::set_uniform_scaling(const bool use_uniform_scale) +{ + if (!use_uniform_scale) + // Recalculate cached values at this panel, refresh the screen. + this->UpdateAndShow(true); + + m_uniform_scale = use_uniform_scale; + set_dirty(); +} + +void GizmoObjectManipulation::set_coordinates_type(ECoordinatesType type) +{ + /*if (wxGetApp().get_mode() == comSimple) + type = ECoordinatesType::World;*/ + + if (m_coordinates_type == type) return; + + m_coordinates_type = type; + //m_word_local_combo->SetSelection((int) m_coordinates_type); + this->UpdateAndShow(true); + GLCanvas3D *canvas = wxGetApp().plater()->canvas3D(); + canvas->get_gizmos_manager().update_data(); + canvas->set_as_dirty(); + canvas->request_extra_frame(); + +} + +static const char* label_values[3][3] = { { "##position_x", "##position_y", "##position_z"}, -{ "##rotation_x", "##rotation_y", "##rotation_z"} +{ "##rotation_x", "##rotation_y", "##rotation_z"}, +{ "##absolute_rotation_x", "##absolute_rotation_y", "##absolute_rotation_z"} }; static const char* label_scale_values[2][3] = { @@ -523,6 +651,23 @@ bool GizmoObjectManipulation::reset_button(ImGuiWrapper *imgui_wrapper, float ca return pressed; } +bool GizmoObjectManipulation::reset_zero_button(ImGuiWrapper *imgui_wrapper, float caption_max, float unit_size, float space_size, float end_text_size) +{ + bool pressed = false; + ImTextureID normal_id = m_glcanvas.get_gizmos_manager().get_icon_texture_id(GLGizmosManager::MENU_ICON_NAME::IC_TOOLBAR_RESET_ZERO); + ImTextureID hover_id = m_glcanvas.get_gizmos_manager().get_icon_texture_id(GLGizmosManager::MENU_ICON_NAME::IC_TOOLBAR_RESET_ZERO_HOVER); + + float font_size = ImGui::GetFontSize() * 1.1; + ImVec2 button_size = ImVec2(font_size, font_size); + + ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0.0f); + + pressed = ImGui::ImageButton3(normal_id, hover_id, button_size); + + ImGui::PopStyleVar(1); + return pressed; +} + float GizmoObjectManipulation::max_unit_size(int number, Vec3d &vec1, Vec3d &vec2,std::string str) { if (number <= 1) return -1; @@ -546,6 +691,111 @@ bool GizmoObjectManipulation::reset_button(ImGuiWrapper *imgui_wrapper, float ca return unit_size + 8.0; } + bool GizmoObjectManipulation::bbl_checkbox(const wxString &label, bool &value) +{ + bool result; + bool b_value = value; + if (b_value) { + ImGui::PushStyleColor(ImGuiCol_FrameBg, ImVec4(0.00f, 0.68f, 0.26f, 1.00f)); + ImGui::PushStyleColor(ImGuiCol_FrameBgHovered, ImVec4(0.00f, 0.68f, 0.26f, 1.00f)); + ImGui::PushStyleColor(ImGuiCol_FrameBgActive, ImVec4(0.00f, 0.68f, 0.26f, 1.00f)); + } + auto label_utf8 = into_u8(label); + result = ImGui::BBLCheckbox(label_utf8.c_str(), &value); + + if (b_value) { ImGui::PopStyleColor(3); } + return result; +} + +void GizmoObjectManipulation::show_move_tooltip_information(ImGuiWrapper *imgui_wrapper, float caption_max, float x, float y) +{ + ImTextureID normal_id = m_glcanvas.get_gizmos_manager().get_icon_texture_id(GLGizmosManager::MENU_ICON_NAME::IC_TOOLBAR_TOOLTIP); + ImTextureID hover_id = m_glcanvas.get_gizmos_manager().get_icon_texture_id(GLGizmosManager::MENU_ICON_NAME::IC_TOOLBAR_TOOLTIP_HOVER); + + caption_max += imgui_wrapper->calc_text_size(": "sv).x + 35.f; + + float scale = m_glcanvas.get_scale(); + ImVec2 button_size = ImVec2(25 * scale, 25 * scale); // ORCA: Use exact resolution will prevent blur on icon + ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, {0, ImGui::GetStyle().FramePadding.y}); + ImGui::ImageButton3(normal_id, hover_id, button_size); + + if (ImGui::IsItemHovered()) { + ImGui::BeginTooltip2(ImVec2(x, y)); + auto draw_text_with_caption = [this, &imgui_wrapper,& caption_max](const wxString &caption, const wxString &text) { + imgui_wrapper->text_colored(ImGuiWrapper::COL_ACTIVE, caption); + ImGui::SameLine(caption_max); + imgui_wrapper->text_colored(ImGuiWrapper::COL_WINDOW_BG, text); + }; + + for (const auto &t : std::array{"part_selection", "snap_step"}) + draw_text_with_caption(m_desc_move.at(t + "_caption") + ": ", m_desc_move.at(t)); + ImGui::EndTooltip(); + } + ImGui::PopStyleVar(2); +} + +void GizmoObjectManipulation::show_rotate_tooltip_information(ImGuiWrapper *imgui_wrapper, float caption_max, float x, float y) +{ + ImTextureID normal_id = m_glcanvas.get_gizmos_manager().get_icon_texture_id(GLGizmosManager::MENU_ICON_NAME::IC_TOOLBAR_TOOLTIP); + ImTextureID hover_id = m_glcanvas.get_gizmos_manager().get_icon_texture_id(GLGizmosManager::MENU_ICON_NAME::IC_TOOLBAR_TOOLTIP_HOVER); + + caption_max += imgui_wrapper->calc_text_size(": "sv).x + 35.f; + + float scale = m_glcanvas.get_scale(); + ImVec2 button_size = ImVec2(25 * scale, 25 * scale); // ORCA: Use exact resolution will prevent blur on icon + ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, {0, ImGui::GetStyle().FramePadding.y}); + ImGui::ImageButton3(normal_id, hover_id, button_size); + + if (ImGui::IsItemHovered()) { + ImGui::BeginTooltip2(ImVec2(x, y)); + auto draw_text_with_caption = [this, &imgui_wrapper, &caption_max](const wxString &caption, const wxString &text) { + imgui_wrapper->text_colored(ImGuiWrapper::COL_ACTIVE, caption); + ImGui::SameLine(caption_max); + imgui_wrapper->text_colored(ImGuiWrapper::COL_WINDOW_BG, text); + }; + + for (const auto &t : std::array{"part_selection"}) + draw_text_with_caption(m_desc_rotate.at(t + "_caption") + ": ", m_desc_rotate.at(t)); + ImGui::EndTooltip(); + } + ImGui::PopStyleVar(2); +} + +void GizmoObjectManipulation::show_scale_tooltip_information(ImGuiWrapper *imgui_wrapper, float caption_max, float x, float y) +{ + ImTextureID normal_id = m_glcanvas.get_gizmos_manager().get_icon_texture_id(GLGizmosManager::MENU_ICON_NAME::IC_TOOLBAR_TOOLTIP); + ImTextureID hover_id = m_glcanvas.get_gizmos_manager().get_icon_texture_id(GLGizmosManager::MENU_ICON_NAME::IC_TOOLBAR_TOOLTIP_HOVER); + + caption_max += imgui_wrapper->calc_text_size(": "sv).x + 35.f; + + float scale = m_glcanvas.get_scale(); + ImVec2 button_size = ImVec2(25 * scale, 25 * scale); // ORCA: Use exact resolution will prevent blur on icon + ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, {0, ImGui::GetStyle().FramePadding.y}); + ImGui::ImageButton3(normal_id, hover_id, button_size); + + if (ImGui::IsItemHovered()) { + ImGui::BeginTooltip2(ImVec2(x, y)); + auto draw_text_with_caption = [this, &imgui_wrapper, &caption_max](const wxString &caption, const wxString &text) { + imgui_wrapper->text_colored(ImGuiWrapper::COL_ACTIVE, caption); + ImGui::SameLine(caption_max); + imgui_wrapper->text_colored(ImGuiWrapper::COL_WINDOW_BG, text); + }; + + for (const auto &t : std::array{"part_selection", "snap_step", "single_sided"}) + draw_text_with_caption(m_desc_scale.at(t + "_caption") + ": ", m_desc_scale.at(t)); + ImGui::EndTooltip(); + } + ImGui::PopStyleVar(2); +} + +void GizmoObjectManipulation::set_init_rotation(const Geometry::Transformation &value) { + m_init_rotation_scale_tran = value.get_matrix_no_offset(); + m_init_rotation = value.get_rotation(); +} + void GizmoObjectManipulation::do_render_move_window(ImGuiWrapper *imgui_wrapper, std::string window_name, float x, float y, float bottom_limit) { // BBS: GUI refactor: move gizmo to the right @@ -584,13 +834,7 @@ void GizmoObjectManipulation::do_render_move_window(ImGuiWrapper *imgui_wrapper, float space_size = imgui_wrapper->get_style_scaling() * 8; float position_size = imgui_wrapper->calc_text_size(_L("Position")).x + space_size; - auto position_title = _L("World coordinates"); - Selection& selection = m_glcanvas.get_selection(); - if(selection.is_single_modifier() || selection.is_single_volume()) - position_title = _L("Object coordinates"); - - float World_size = imgui_wrapper->calc_text_size(position_title).x + space_size; - float caption_max = std::max(position_size, World_size) + 2 * space_size; + float caption_max = imgui_wrapper->calc_text_size(_L("Object coordinates")).x + 2 * space_size; float end_text_size = imgui_wrapper->calc_text_size(this->m_new_unit_string).x; // position @@ -602,15 +846,34 @@ void GizmoObjectManipulation::do_render_move_window(ImGuiWrapper *imgui_wrapper, Vec3d display_position = m_buffered_position; // Rotation - Vec3d rotation = this->m_buffered_rotation; float unit_size = imgui_wrapper->calc_text_size(MAX_SIZE).x + space_size; int index = 1; int index_unit = 1; ImGui::AlignTextToFramePadding(); unsigned int current_active_id = ImGui::GetActiveID(); - ImGui::PushItemWidth(caption_max); - imgui_wrapper->text(position_title); + + Selection & selection = m_glcanvas.get_selection(); + std::vector modes = {_u8L("World coordinates"), _u8L("Object coordinates")};//_u8L("Part coordinates") + if (selection.is_multiple_full_object() || selection.is_wipe_tower()) { + modes.pop_back(); + } + size_t selection_idx = (int) m_coordinates_type; + if (selection_idx >= modes.size()) { + set_coordinates_type(ECoordinatesType::World); + selection_idx = 0; + } + + float caption_cs_size = imgui_wrapper->calc_text_size(""sv).x; + float caption_size = caption_cs_size + 2 * space_size; + float combox_content_size = imgui_wrapper->calc_text_size(_L("Object coordinates")).x * 1.2 + imgui_wrapper->calc_text_size("xxx"sv).x + imgui_wrapper->scaled(3); + ImGuiWrapper::push_combo_style(m_glcanvas.get_scale()); + bool combox_changed = false; + if (render_combo(imgui_wrapper, "", modes, selection_idx, caption_size, combox_content_size)) { + combox_changed = true; + } + ImGuiWrapper::pop_combo_style(); + caption_max = combox_content_size - 4 * space_size; ImGui::SameLine(caption_max + index * space_size); ImGui::PushItemWidth(unit_size); ImGui::TextAlignCenter("X"); @@ -636,15 +899,22 @@ void GizmoObjectManipulation::do_render_move_window(ImGuiWrapper *imgui_wrapper, ImGui::BBLInputDouble(label_values[0][2], &display_position[2], 0.0f, 0.0f, "%.2f"); ImGui::SameLine(caption_max + (++index_unit) * unit_size + (++index) * space_size); imgui_wrapper->text(this->m_new_unit_string); - - for (int i = 0;i MAX_NUM)display_position[i] = MAX_NUM; - if (display_position[i] < -MAX_NUM)display_position[i] = -MAX_NUM; + bool is_avoid_one_update{false}; + if (combox_changed) { + combox_changed = false; + set_coordinates_type((ECoordinatesType) selection_idx); + UpdateAndShow(true); + is_avoid_one_update = true; // avoid update(current_active_id, "position", original_position } - m_buffered_position = display_position; - update(current_active_id, "position", original_position, m_buffered_position); + if (!is_avoid_one_update) { + for (int i = 0; i < display_position.size(); i++) { + if (display_position[i] > MAX_NUM) display_position[i] = MAX_NUM; + if (display_position[i] < -MAX_NUM) display_position[i] = -MAX_NUM; + } + m_buffered_position = display_position; + update(current_active_id, "position", original_position, m_buffered_position); + } // the init position values are not zero, won't add reset button // send focus to m_glcanvas @@ -658,7 +928,14 @@ void GizmoObjectManipulation::do_render_move_window(ImGuiWrapper *imgui_wrapper, } } if (!focued_on_text) m_glcanvas.handle_sidebar_focus_event("", false); - + float get_cur_y = ImGui::GetContentRegionMax().y + ImGui::GetFrameHeight() + y; + float tip_caption_max = 0.f; + float total_text_max = 0.f; + for (const auto &t : std::array{"part_selection", "snap_step"}) { + tip_caption_max = std::max(tip_caption_max, imgui_wrapper->calc_text_size(m_desc_move[t + "_caption"]).x); + total_text_max = std::max(total_text_max, imgui_wrapper->calc_text_size(m_desc_move[t]).x); + } + show_move_tooltip_information(imgui_wrapper, tip_caption_max, x, get_cur_y); m_last_active_item = current_active_id; last_move_input_window_width = ImGui::GetWindowWidth(); imgui_wrapper->end(); @@ -703,7 +980,7 @@ void GizmoObjectManipulation::do_render_rotate_window(ImGuiWrapper *imgui_wrappe }; float space_size = imgui_wrapper->get_style_scaling() * 8; - float position_size = imgui_wrapper->calc_text_size(_L("Rotation")).x + space_size; + float position_size = imgui_wrapper->calc_text_size(_L("Rotate (relative)")).x + space_size; float World_size = imgui_wrapper->calc_text_size(_L("World coordinates")).x + space_size; float caption_max = std::max(position_size, World_size) + 2 * space_size; float end_text_size = imgui_wrapper->calc_text_size(this->m_new_unit_string).x; @@ -717,7 +994,7 @@ void GizmoObjectManipulation::do_render_rotate_window(ImGuiWrapper *imgui_wrappe Vec3d display_position = m_buffered_position; // Rotation Vec3d rotation = this->m_buffered_rotation; - + Vec3d absolute_rotation = this->m_buffered_absolute_rotation; float unit_size = imgui_wrapper->calc_text_size(MAX_SIZE).x + space_size; int index = 1; int index_unit = 1; @@ -740,30 +1017,50 @@ void GizmoObjectManipulation::do_render_rotate_window(ImGuiWrapper *imgui_wrappe index_unit = 1; // ImGui::PushItemWidth(unit_size * 2); + bool is_relative_input = false; ImGui::AlignTextToFramePadding(); - imgui_wrapper->text(_L("Rotation")); + imgui_wrapper->text(_L("Rotate (relative)")); ImGui::SameLine(caption_max + index * space_size); ImGui::PushItemWidth(unit_size); - ImGui::BBLInputDouble(label_values[1][0], &rotation[0], 0.0f, 0.0f, "%.2f"); + if (ImGui::BBLInputDouble(label_values[1][0], &rotation[0], 0.0f, 0.0f, "%.2f")) { + is_relative_input = true; + } ImGui::SameLine(caption_max + unit_size + (++index) * space_size); ImGui::PushItemWidth(unit_size); - ImGui::BBLInputDouble(label_values[1][1], &rotation[1], 0.0f, 0.0f, "%.2f"); + if (ImGui::BBLInputDouble(label_values[1][1], &rotation[1], 0.0f, 0.0f, "%.2f")) { + is_relative_input = true; + } ImGui::SameLine(caption_max + (++index_unit) * unit_size + (++index) * space_size); ImGui::PushItemWidth(unit_size); - ImGui::BBLInputDouble(label_values[1][2], &rotation[2], 0.0f, 0.0f, "%.2f"); + if (ImGui::BBLInputDouble(label_values[1][2], &rotation[2], 0.0f, 0.0f, "%.2f")) { + is_relative_input = true; + } ImGui::SameLine(caption_max + (++index_unit) * unit_size + (++index) * space_size); imgui_wrapper->text(_L("°")); m_buffered_rotation = rotation; - update(current_active_id, "rotation", this->m_new_rotation, m_buffered_rotation); + if (is_relative_input) { + m_last_rotate_type = RotateType::Relative; + } + if (m_last_rotate_type == RotateType::Relative) { + bool is_valid = update(current_active_id, "rotation", this->m_new_rotation, m_buffered_rotation) >= 0; + if (is_valid) { + m_last_rotate_type = RotateType::None; + } + } if (m_show_clear_rotation) { ImGui::SameLine(caption_max + 3 * unit_size + 4 * space_size + end_text_size); - if (reset_button(imgui_wrapper, caption_max, unit_size, space_size, end_text_size)) { reset_rotation_value(); } + if (reset_button(imgui_wrapper, caption_max, unit_size, space_size, end_text_size)) { + reset_rotation_value(true); + } + if (ImGui::IsItemHovered()) { + float tooltip_size = imgui_wrapper->calc_text_size(_L("Reset current rotation to the value when open the rotation tool.")).x + 3 * space_size; + imgui_wrapper->tooltip(_u8L("Reset current rotation to the value when open the rotation tool."), tooltip_size); + } } else { ImGui::SameLine(caption_max + 3 * unit_size + 5 * space_size + end_text_size); ImGui::InvisibleButton("", ImVec2(ImGui::GetFontSize(), ImGui::GetFontSize())); } - // send focus to m_glcanvas bool focued_on_text = false; for (int j = 0; j < 3; j++) { @@ -774,8 +1071,69 @@ void GizmoObjectManipulation::do_render_rotate_window(ImGuiWrapper *imgui_wrappe break; } } - if (!focued_on_text) m_glcanvas.handle_sidebar_focus_event("", false); + index = 1; + index_unit = 1; + ImGui::AlignTextToFramePadding(); + imgui_wrapper->text(_L("Rotate (absolute)")); + ImGui::SameLine(caption_max + index * space_size); + ImGui::PushItemWidth(unit_size); + bool is_absolute_input = false; + if (ImGui::BBLInputDouble(label_values[2][0], &absolute_rotation[0], 0.0f, 0.0f, "%.2f")) { + is_absolute_input = true; + } + ImGui::SameLine(caption_max + unit_size + (++index) * space_size); + ImGui::PushItemWidth(unit_size); + if (ImGui::BBLInputDouble(label_values[2][1], &absolute_rotation[1], 0.0f, 0.0f, "%.2f")) { + is_absolute_input = true; + } + ImGui::SameLine(caption_max + (++index_unit) * unit_size + (++index) * space_size); + ImGui::PushItemWidth(unit_size); + if (ImGui::BBLInputDouble(label_values[2][2], &absolute_rotation[2], 0.0f, 0.0f, "%.2f")) { + is_absolute_input = true; + } + ImGui::SameLine(caption_max + (++index_unit) * unit_size + (++index) * space_size); + imgui_wrapper->text(_L("°")); + m_buffered_absolute_rotation = absolute_rotation; + if (is_absolute_input) { + m_last_rotate_type = RotateType::Absolute; + } + if (m_last_rotate_type == RotateType::Absolute) { + bool is_valid = update(current_active_id, "absolute_rotation", this->m_new_absolute_rotation, m_buffered_absolute_rotation) >= 0; + if (is_valid) { + m_last_rotate_type = RotateType::None; + } + } + + if (m_show_reset_0_rotation) { + ImGui::SameLine(caption_max + 3 * unit_size + 4 * space_size + end_text_size); + if (reset_zero_button(imgui_wrapper, caption_max, unit_size, space_size, end_text_size)) { reset_rotation_value(false); } + if (ImGui::IsItemHovered()) { + float tooltip_size = imgui_wrapper->calc_text_size(_L("Reset current rotation to real zeros.")).x + 3 * space_size; + imgui_wrapper->tooltip(_L("Reset current rotation to real zeros."), tooltip_size); + } + } + // send focus to m_glcanvas + bool absolute_focued_on_text = false; + for (int j = 0; j < 3; j++) { + unsigned int id = ImGui::GetID(label_values[2][j]); + if (current_active_id == id) { + m_glcanvas.handle_sidebar_focus_event(label_values[2][j] + 2, true); + absolute_focued_on_text = true; + break; + } + } + if (!focued_on_text && !absolute_focued_on_text) + m_glcanvas.handle_sidebar_focus_event("", false); + + float get_cur_y = ImGui::GetContentRegionMax().y + ImGui::GetFrameHeight() + y; + float tip_caption_max = 0.f; + float total_text_max = 0.f; + for (const auto &t : std::array{"part_selection"}) { + tip_caption_max = std::max(tip_caption_max, imgui_wrapper->calc_text_size(m_desc_move[t + "_caption"]).x); + total_text_max = std::max(total_text_max, imgui_wrapper->calc_text_size(m_desc_move[t]).x); + } + show_rotate_tooltip_information(imgui_wrapper, tip_caption_max, x, get_cur_y); m_last_active_item = current_active_id; last_rotate_input_window_width = ImGui::GetWindowWidth(); imgui_wrapper->end(); @@ -826,8 +1184,7 @@ void GizmoObjectManipulation::do_render_scale_input_window(ImGuiWrapper* imgui_w float space_size = imgui_wrapper->get_style_scaling() * 8; float scale_size = imgui_wrapper->calc_text_size(_L("Scale")).x + space_size; - float size_len = imgui_wrapper->calc_text_size(_L("Size")).x + space_size; - float caption_max = std::max(scale_size, size_len) + 2 * space_size; + float caption_max = imgui_wrapper->calc_text_size(_L("Object coordinates")).x + 2 * space_size; float end_text_size = imgui_wrapper->calc_text_size(this->m_new_unit_string).x; ImGui::AlignTextToFramePadding(); unsigned int current_active_id = ImGui::GetActiveID(); @@ -843,10 +1200,30 @@ void GizmoObjectManipulation::do_render_scale_input_window(ImGuiWrapper* imgui_w int index = 2; int index_unit = 1; - ImGui::PushItemWidth(caption_max); - ImGui::Dummy(ImVec2(caption_max, -1)); - //imgui_wrapper->text(_L(" ")); - //ImGui::PushItemWidth(unit_size * 1.5); + Selection & selection = m_glcanvas.get_selection(); + std::vector modes = {_u8L("World coordinates"), _u8L("Object coordinates"), _u8L("Part coordinates")}; + if (selection.is_single_full_object()) { modes.pop_back(); } + if (selection.is_multiple_full_object()) { + modes.pop_back(); + modes.pop_back(); + } + size_t selection_idx = (int) m_coordinates_type; + if (selection_idx >= modes.size()) { + set_coordinates_type(ECoordinatesType::World); + selection_idx = 0; + } + + float caption_cs_size = imgui_wrapper->calc_text_size(""sv).x; + float caption_size = caption_cs_size + 2 * space_size; + float combox_content_size = imgui_wrapper->calc_text_size(_L("Object coordinates")).x * 1.2 + imgui_wrapper->calc_text_size("xxx"sv).x + imgui_wrapper->scaled(3); + ImGuiWrapper::push_combo_style(m_glcanvas.get_scale()); + bool combox_changed = false; + if (render_combo(imgui_wrapper, "", modes, selection_idx, caption_size, combox_content_size)) { + combox_changed = true; + } + ImGuiWrapper::pop_combo_style(); + caption_max = combox_content_size - 4 * space_size; + //ImGui::Dummy(ImVec2(caption_max, -1)); ImGui::SameLine(caption_max + space_size); ImGui::PushItemWidth(unit_size); ImGui::TextAlignCenter("X"); @@ -874,7 +1251,9 @@ void GizmoObjectManipulation::do_render_scale_input_window(ImGuiWrapper* imgui_w ImGui::BBLInputDouble(label_scale_values[0][2], &scale[2], 0.0f, 0.0f, "%.2f"); ImGui::SameLine(caption_max + (++index_unit) *unit_size + (++index) * space_size); imgui_wrapper->text(_L("%")); - m_buffered_scale = scale; + if (scale.x() > 0 && scale.y() > 0 && scale.z() > 0) { + m_buffered_scale = scale; + } if (m_show_clear_scale) { ImGui::SameLine(caption_max + 3 * unit_size + 4 * space_size + end_text_size); @@ -908,17 +1287,31 @@ void GizmoObjectManipulation::do_render_scale_input_window(ImGuiWrapper* imgui_w ImGui::BBLInputDouble(label_scale_values[1][2], &display_size[2], 0.0f, 0.0f, "%.2f"); ImGui::SameLine(caption_max + (++index_unit) *unit_size + (++index) * space_size); imgui_wrapper->text(this->m_new_unit_string); - - for (int i = 0;i MAX_NUM) display_size[i] = MAX_NUM; + for (int i = 0; i < display_size.size(); i++) { + if (std::abs(display_size[i]) > MAX_NUM) { + display_size[i] = MAX_NUM; + } + } + if (display_size.x() > 0 && display_size.y() > 0 && display_size.z() > 0) { + m_buffered_size = display_size; } - m_buffered_size = display_size; - int size_sel = update(current_active_id, "size", original_size, m_buffered_size); - ImGui::PopStyleVar(1); - ImGui::Separator(); + ImGui::AlignTextToFramePadding(); + bool is_avoid_one_update{false}; + if (combox_changed) { + combox_changed = false; + set_coordinates_type((ECoordinatesType) selection_idx); + UpdateAndShow(true); + is_avoid_one_update = true; + } + auto uniform_scale_size =imgui_wrapper->calc_text_size(_L("uniform scale")).x; + ImGui::PushItemWidth(uniform_scale_size); + int size_sel{-1}; + if (!is_avoid_one_update) { + size_sel = update(current_active_id, "size", original_size, m_buffered_size); + } + ImGui::PopStyleVar(1); bool uniform_scale = this->m_uniform_scale; // BBS: when select multiple objects, uniform scale can be deselected @@ -959,9 +1352,6 @@ void GizmoObjectManipulation::do_render_scale_input_window(ImGuiWrapper* imgui_w } } - - - //send focus to m_glcanvas bool focued_on_text = false; for (int i = 0; i < 2; i++) @@ -977,7 +1367,14 @@ void GizmoObjectManipulation::do_render_scale_input_window(ImGuiWrapper* imgui_w } if (!focued_on_text) m_glcanvas.handle_sidebar_focus_event("", false); - + float get_cur_y = ImGui::GetContentRegionMax().y + ImGui::GetFrameHeight() + y; + float tip_caption_max = 0.f; + float total_text_max = 0.f; + for (const auto &t : std::array{"part_selection", "snap_step", "single_sided"}) { + tip_caption_max = std::max(tip_caption_max, imgui_wrapper->calc_text_size(m_desc_scale[t + "_caption"]).x); + total_text_max = std::max(total_text_max, imgui_wrapper->calc_text_size(m_desc_scale[t]).x); + } + show_scale_tooltip_information(imgui_wrapper, tip_caption_max, x, get_cur_y); m_last_active_item = current_active_id; last_scale_input_window_width = ImGui::GetWindowWidth(); diff --git a/src/slic3r/GUI/Gizmos/GizmoObjectManipulation.hpp b/src/slic3r/GUI/Gizmos/GizmoObjectManipulation.hpp index 3a3dc145ce..2f8b03c160 100644 --- a/src/slic3r/GUI/Gizmos/GizmoObjectManipulation.hpp +++ b/src/slic3r/GUI/Gizmos/GizmoObjectManipulation.hpp @@ -4,6 +4,7 @@ #include #include "libslic3r/Point.hpp" +#include "libslic3r/Geometry.hpp" #include #include "slic3r/GUI/GUI_Geometry.hpp" @@ -30,6 +31,8 @@ public: Vec3d position_rounded; Vec3d rotation; Vec3d rotation_rounded; + Vec3d absolute_rotation; + Vec3d absolute_rotation_rounded; Vec3d scale; Vec3d scale_rounded; Vec3d size; @@ -56,7 +59,7 @@ public: Cache m_cache; bool m_imperial_units { false }; - + bool m_use_object_cs{false}; // Mirroring buttons and their current state //enum MirrorButtonState { // mbHidden, @@ -75,19 +78,28 @@ public: std::string m_new_unit_string; Vec3d m_new_position; Vec3d m_new_rotation; + Vec3d m_new_absolute_rotation; Vec3d m_new_scale; Vec3d m_new_size; + Vec3d m_unscale_size; Vec3d m_buffered_position; Vec3d m_buffered_rotation; + Vec3d m_buffered_absolute_rotation; Vec3d m_buffered_scale; Vec3d m_buffered_size; + Vec3d cs_center; bool m_new_enabled {true}; bool m_uniform_scale {true}; - ECoordinatesType m_coordinates_type{ ECoordinatesType::World }; + // Does the object manipulation panel work in World or Local coordinates? + ECoordinatesType m_coordinates_type{ECoordinatesType::World}; + bool m_show_reset_0_rotation{false}; bool m_show_clear_rotation { false }; bool m_show_clear_scale { false }; bool m_show_drop_to_bed { false }; + enum class RotateType { None, Relative, Absolute + }; + RotateType m_last_rotate_type{RotateType::None}; // 0:no input 1:relative 2:absolute protected: float last_move_input_window_width = 0.0f; @@ -108,21 +120,33 @@ public: void set_uniform_scaling(const bool uniform_scale); bool get_uniform_scaling() const { return m_uniform_scale; } + void set_use_object_cs(bool flag){ if (m_use_object_cs != flag) m_use_object_cs = flag; } + bool get_use_object_cs() { return m_use_object_cs; } + // Does the object manipulation panel work in World or Local coordinates? + void set_coordinates_type(ECoordinatesType type); + ECoordinatesType get_coordinates_type() const { return m_coordinates_type; } + bool is_world_coordinates() const { return m_coordinates_type == ECoordinatesType::World; } + bool is_instance_coordinates() const { return m_coordinates_type == ECoordinatesType::Instance; } + bool is_local_coordinates() const { return m_coordinates_type == ECoordinatesType::Local; } - void set_coordinates_type(ECoordinatesType type); - ECoordinatesType get_coordinates_type() const; - bool is_world_coordinates() const { return m_coordinates_type == ECoordinatesType::World; } - bool is_instance_coordinates() const { return m_coordinates_type == ECoordinatesType::Instance; } - bool is_local_coordinates() const { return m_coordinates_type == ECoordinatesType::Local; } - + const Cache& get_cache() {return m_cache; } void reset_cache() { m_cache.reset(); } + void limit_scaling_ratio(Vec3d &scaling_factor) const; void on_change(const std::string& opt_key, int axis, double new_value); + bool render_combo(ImGuiWrapper *imgui_wrapper, const std::string &label, const std::vector &lines, size_t &selection_idx, float label_width, float item_width); void do_render_move_window(ImGuiWrapper *imgui_wrapper, std::string window_name, float x, float y, float bottom_limit); void do_render_rotate_window(ImGuiWrapper *imgui_wrapper, std::string window_name, float x, float y, float bottom_limit); void do_render_scale_input_window(ImGuiWrapper* imgui_wrapper, std::string window_name, float x, float y, float bottom_limit); float max_unit_size(int number, Vec3d &vec1, Vec3d &vec2,std::string str); bool reset_button(ImGuiWrapper *imgui_wrapper, float caption_max, float unit_size, float space_size, float end_text_size); + bool reset_zero_button(ImGuiWrapper *imgui_wrapper, float caption_max, float unit_size, float space_size, float end_text_size); + bool bbl_checkbox(const wxString &label, bool &value); + + void show_move_tooltip_information(ImGuiWrapper *imgui_wrapper, float caption_max, float x, float y); + void show_rotate_tooltip_information(ImGuiWrapper *imgui_wrapper, float caption_max, float x, float y); + void show_scale_tooltip_information(ImGuiWrapper *imgui_wrapper, float caption_max, float x, float y); + void set_init_rotation(const Geometry::Transformation &value); private: void reset_settings_value(); @@ -134,18 +158,24 @@ private: //Show or hide mirror buttons //void update_mirror_buttons_visibility(); - // change values + // change values void change_position_value(int axis, double value); void change_rotation_value(int axis, double value); + void change_absolute_rotation_value(int axis, double value); void change_scale_value(int axis, double value); void change_size_value(int axis, double value); void do_scale(int axis, const Vec3d &scale) const; void reset_position_value(); - void reset_rotation_value(); + void reset_rotation_value(bool reset_relative); void reset_scale_value(); GLCanvas3D& m_glcanvas; unsigned int m_last_active_item { 0 }; + std::map m_desc_move; + std::map m_desc_rotate; + std::map m_desc_scale; + Vec3d m_init_rotation; + Transform3d m_init_rotation_scale_tran; }; }} diff --git a/src/slic3r/GUI/ImGuiWrapper.cpp b/src/slic3r/GUI/ImGuiWrapper.cpp index d70700b9cf..2229dd9a40 100644 --- a/src/slic3r/GUI/ImGuiWrapper.cpp +++ b/src/slic3r/GUI/ImGuiWrapper.cpp @@ -71,6 +71,9 @@ static const std::map font_icons = { {ImGui::GapFillIcon , "gap_fill" }, {ImGui::FoldButtonIcon , "im_fold" }, {ImGui::UnfoldButtonIcon , "im_unfold" }, + {ImGui::gCodeButtonIcon , "im_code" }, //ORCA + {ImGui::VisibleIcon , "im_visible" }, //ORCA + {ImGui::HiddenIcon , "im_hidden" }, //ORCA {ImGui::SphereButtonIcon , "toolbar_modifier_sphere" }, // dark mode icon {ImGui::MinimalizeDarkButton , "notification_minimalize_dark" }, diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 42c77f6177..3b81a41bd4 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -2681,7 +2681,7 @@ void MainFrame::init_menubar_as_editor() viewMenu->Check(wxID_CAMERA_PERSPECTIVE + camera_id_base, true); else viewMenu->Check(wxID_CAMERA_ORTHOGONAL + camera_id_base, true); - }, wxID_ANY); + }, perspective_item->GetId()); append_menu_check_item(viewMenu, wxID_ANY, _L("Auto Perspective"), _L("Automatically switch between orthographic and perspective when changing from top/bottom/side views"), [this](wxCommandEvent&) { wxGetApp().app_config->set_bool("auto_perspective", !wxGetApp().app_config->get_bool("auto_perspective")); diff --git a/src/slic3r/GUI/Mouse3DController.cpp b/src/slic3r/GUI/Mouse3DController.cpp index 2282559369..3a71e1ddfe 100644 --- a/src/slic3r/GUI/Mouse3DController.cpp +++ b/src/slic3r/GUI/Mouse3DController.cpp @@ -1151,12 +1151,12 @@ bool Mouse3DController::connect_device() if (m_device != nullptr) { wchar_t buffer[1024]; hid_get_manufacturer_string(m_device, buffer, 1024); - m_device_str = boost::nowide::narrow(buffer); + m_device_str = into_u8(buffer); // #3479 seems to show that sometimes an extra whitespace is added, so we remove it boost::algorithm::trim(m_device_str); hid_get_product_string(m_device, buffer, 1024); - m_device_str += "/" + boost::nowide::narrow(buffer); + m_device_str += "/" + into_u8(buffer); // #3479 seems to show that sometimes an extra whitespace is added, so we remove it boost::algorithm::trim(m_device_str); diff --git a/src/slic3r/GUI/NotificationManager.cpp b/src/slic3r/GUI/NotificationManager.cpp index c2152f97f5..005e896e1b 100644 --- a/src/slic3r/GUI/NotificationManager.cpp +++ b/src/slic3r/GUI/NotificationManager.cpp @@ -1364,7 +1364,7 @@ void NotificationManager::URLDownloadNotification::render_pause_button_inner(ImG button_text = m_is_dark ? (m_download_paused ? ImGui::PlayHoverDarkButton : ImGui::PauseHoverDarkButton) : (m_download_paused ? ImGui::PlayHoverButton : ImGui::PauseHoverButton); } - ImVec2 button_pic_size = ImGui::CalcTextSize(boost::nowide::narrow(button_text).c_str()); + ImVec2 button_pic_size = ImGui::CalcTextSize(into_u8(button_text).c_str()); ImVec2 button_size(button_pic_size.x * 1.25f, button_pic_size.y * 1.25f); ImGui::SetCursorPosX(win_size.x - m_line_height * 5.0f); ImGui::SetCursorPosY(win_size.y / 2 - button_size.y); @@ -1405,7 +1405,7 @@ void NotificationManager::URLDownloadNotification::render_open_button_inner(ImGu button_text = m_is_dark ? ImGui::OpenHoverDarkButton : ImGui::OpenHoverButton; } - ImVec2 button_pic_size = ImGui::CalcTextSize(boost::nowide::narrow(button_text).c_str()); + ImVec2 button_pic_size = ImGui::CalcTextSize(into_u8(button_text).c_str()); ImVec2 button_size(button_pic_size.x * 1.25f, button_pic_size.y * 1.25f); ImGui::SetCursorPosX(win_size.x - m_line_height * 5.0f); ImGui::SetCursorPosY(win_size.y / 2 - button_size.y); diff --git a/src/slic3r/GUI/PartPlate.cpp b/src/slic3r/GUI/PartPlate.cpp index e5f2a190f0..3a07a42810 100644 --- a/src/slic3r/GUI/PartPlate.cpp +++ b/src/slic3r/GUI/PartPlate.cpp @@ -2074,6 +2074,16 @@ bool PartPlate::check_outside(int obj_id, int instance_id, BoundingBoxf3* boundi if (instance_box.max.z() > plate_box.min.z()) plate_box.min.z() += instance_box.min.z(); // not considering outsize if sinking + if (instance_box.min.z() < SINKING_Z_THRESHOLD) { + // Orca: For sinking object, we use a more expensive algorithm so part below build plate won't be considered + if (plate_box.intersects(instance_box)) { + // TODO: FIXME: this does not take exclusion area into account + const BuildVolume build_volume(get_shape(), m_plater->build_volume().printable_height()); + const auto state = instance->calc_print_volume_state(build_volume); + outside = state == ModelInstancePVS_Partly_Outside; + } + } + else if (plate_box.contains(instance_box)) { if (m_exclude_bounding_box.size() > 0) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 2ebeda4267..cec62136b5 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -9831,7 +9831,7 @@ void Plater::_calib_pa_select_added_objects() { // For linear mode, pass 1 means normal version while pass 2 mean "for perfectionists" version void adjust_settings_for_flowrate_calib(ModelObjectPtrs& objects, bool linear, int pass) { -auto print_config = &wxGetApp().preset_bundle->prints.get_edited_preset().config; + auto print_config = &wxGetApp().preset_bundle->prints.get_edited_preset().config; auto printerConfig = &wxGetApp().preset_bundle->printers.get_edited_preset().config; auto filament_config = &wxGetApp().preset_bundle->filaments.get_edited_preset().config; @@ -9889,7 +9889,7 @@ auto print_config = &wxGetApp().preset_bundle->prints.get_edited_preset().config _obj->config.set_key_value("sparse_infill_pattern", new ConfigOptionEnum(ipRectilinear)); _obj->config.set_key_value("top_surface_line_width", new ConfigOptionFloatOrPercent(nozzle_diameter * 1.2f, false)); _obj->config.set_key_value("internal_solid_infill_line_width", new ConfigOptionFloatOrPercent(nozzle_diameter * 1.2f, false)); - _obj->config.set_key_value("top_surface_pattern", new ConfigOptionEnum(ipMonotonic)); + _obj->config.set_key_value("top_surface_pattern", new ConfigOptionEnum(ipArchimedeanChords)); _obj->config.set_key_value("top_solid_infill_flow_ratio", new ConfigOptionFloat(1.0f)); _obj->config.set_key_value("infill_direction", new ConfigOptionFloat(45)); _obj->config.set_key_value("solid_infill_direction", new ConfigOptionFloat(135)); @@ -9898,7 +9898,9 @@ auto print_config = &wxGetApp().preset_bundle->prints.get_edited_preset().config _obj->config.set_key_value("internal_solid_infill_speed", new ConfigOptionFloat(internal_solid_speed)); _obj->config.set_key_value("top_surface_speed", new ConfigOptionFloat(top_surface_speed)); _obj->config.set_key_value("seam_slope_type", new ConfigOptionEnum(SeamScarfType::None)); + _obj->config.set_key_value("gap_fill_target", new ConfigOptionEnum(GapFillTarget::gftNowhere)); print_config->set_key_value("max_volumetric_extrusion_rate_slope", new ConfigOptionFloat(0)); + _obj->config.set_key_value("calib_flowrate_topinfill_special_order", new ConfigOptionBool(true)); // extract flowrate from name, filename format: flowrate_xxx std::string obj_name = _obj->name; @@ -10121,6 +10123,7 @@ void Plater::calib_retraction(const Calib_Params& params) if (max_lh->values[0] < layer_height) max_lh->values[0] = { layer_height }; + printer_config->set_key_value("use_firmware_retraction", new ConfigOptionBool(false)); obj->config.set_key_value("wall_loops", new ConfigOptionInt(2)); obj->config.set_key_value("top_shell_layers", new ConfigOptionInt(0)); obj->config.set_key_value("bottom_shell_layers", new ConfigOptionInt(3)); @@ -10427,7 +10430,7 @@ bool Plater::preview_zip_archive(const boost::filesystem::path& archive_path) if (size != stat.m_uncomp_size) // size must fit continue; wxString wname = boost::nowide::widen(stat.m_filename); - std::string name = boost::nowide::narrow(wname); + std::string name = into_u8(wname); fs::path archive_path(name); std::string extra(1024, 0); diff --git a/src/slic3r/GUI/Preferences.cpp b/src/slic3r/GUI/Preferences.cpp index 77dce6fa74..08ea9d0e18 100644 --- a/src/slic3r/GUI/Preferences.cpp +++ b/src/slic3r/GUI/Preferences.cpp @@ -512,6 +512,59 @@ wxBoxSizer *PreferencesDialog::create_item_input(wxString title, wxString title2 return sizer_input; } +wxBoxSizer *PreferencesDialog::create_camera_orbit_mult_input(wxString title, wxWindow *parent, wxString tooltip) +{ + wxBoxSizer *sizer_input = new wxBoxSizer(wxHORIZONTAL); + auto input_title = new wxStaticText(parent, wxID_ANY, title); + input_title->SetForegroundColour(DESIGN_GRAY900_COLOR); + input_title->SetFont(::Label::Body_13); + input_title->SetToolTip(tooltip); + input_title->Wrap(-1); + auto param = "camera_orbit_mult"; + + auto input = new ::TextInput(parent, wxEmptyString, wxEmptyString, wxEmptyString, wxDefaultPosition, DESIGN_INPUT_SIZE, wxTE_PROCESS_ENTER); + StateColor input_bg(std::pair(wxColour("#F0F0F1"), StateColor::Disabled), std::pair(*wxWHITE, StateColor::Enabled)); + input->SetBackgroundColor(input_bg); + input->GetTextCtrl()->SetValue(app_config->get(param)); + wxTextValidator validator(wxFILTER_NUMERIC); + input->GetTextCtrl()->SetValidator(validator); + + sizer_input->Add(0, 0, 0, wxEXPAND | wxLEFT, 23); + sizer_input->Add(input_title, 0, wxALIGN_CENTER_VERTICAL | wxALL, 3); + sizer_input->Add(input, 0, wxALIGN_CENTER_VERTICAL, 0); + sizer_input->Add(0, 0, 0, wxEXPAND | wxLEFT, 3); + + const double min = 0.05; + const double max = 2.0; + + input->GetTextCtrl()->Bind(wxEVT_TEXT_ENTER, [this, param, input, min, max](wxCommandEvent &e) { + auto value = input->GetTextCtrl()->GetValue(); + double conv = 1.0; + if (value.ToCDouble(&conv)) { + conv = conv < min ? min : conv > max ? max : conv; + auto strval = std::string(wxString::FromCDouble(conv, 2).mb_str()); + input->GetTextCtrl()->SetValue(strval); + app_config->set(param, strval); + app_config->save(); + } + e.Skip(); + }); + + input->GetTextCtrl()->Bind(wxEVT_KILL_FOCUS, [this, param, input, min, max](wxFocusEvent &e) { + auto value = input->GetTextCtrl()->GetValue(); + double conv = 1.0; + if (value.ToCDouble(&conv)) { + conv = conv < min ? min : conv > max ? max : conv; + auto strval = std::string(wxString::FromCDouble(conv, 2).mb_str()); + input->GetTextCtrl()->SetValue(strval); + app_config->set(param, strval); + } + e.Skip(); + }); + + return sizer_input; +} + wxBoxSizer *PreferencesDialog::create_item_backup_input(wxString title, wxWindow *parent, wxString tooltip, std::string param) { wxBoxSizer *m_sizer_input = new wxBoxSizer(wxHORIZONTAL); @@ -1164,6 +1217,7 @@ wxWindow* PreferencesDialog::create_general_page() auto item_mouse_zoom_settings = create_item_checkbox(_L("Zoom to mouse position"), page, _L("Zoom in towards the mouse pointer's position in the 3D view, rather than the 2D window center."), 50, "zoom_to_mouse"); auto item_use_free_camera_settings = create_item_checkbox(_L("Use free camera"), page, _L("If enabled, use free camera. If not enabled, use constrained camera."), 50, "use_free_camera"); auto reverse_mouse_zoom = create_item_checkbox(_L("Reverse mouse zoom"), page, _L("If enabled, reverses the direction of zoom with mouse wheel."), 50, "reverse_mouse_wheel_zoom"); + auto camera_orbit_mult = create_camera_orbit_mult_input(_L("Orbit speed multiplier"), page, _L("Multiplies the orbit speed for finer or coarser camera movement.")); auto item_show_splash_screen = create_item_checkbox(_L("Show splash screen"), page, _L("Show the splash screen during startup."), 50, "show_splash_screen"); auto item_hints = create_item_checkbox(_L("Show \"Tip of the day\" notification after start"), page, _L("If enabled, useful hints are displayed at startup."), 50, "show_hints"); @@ -1247,6 +1301,7 @@ wxWindow* PreferencesDialog::create_general_page() sizer_page->Add(item_mouse_zoom_settings, 0, wxTOP, FromDIP(3)); sizer_page->Add(item_use_free_camera_settings, 0, wxTOP, FromDIP(3)); sizer_page->Add(reverse_mouse_zoom, 0, wxTOP, FromDIP(3)); + sizer_page->Add(camera_orbit_mult, 0, wxTOP, FromDIP(3)); sizer_page->Add(item_show_splash_screen, 0, wxTOP, FromDIP(3)); sizer_page->Add(item_hints, 0, wxTOP, FromDIP(3)); sizer_page->Add(item_calc_in_long_retract, 0, wxTOP, FromDIP(3)); diff --git a/src/slic3r/GUI/Preferences.hpp b/src/slic3r/GUI/Preferences.hpp index c0df651cb4..5977397e16 100644 --- a/src/slic3r/GUI/Preferences.hpp +++ b/src/slic3r/GUI/Preferences.hpp @@ -115,6 +115,7 @@ public: wxBoxSizer *create_item_button(wxString title, wxString title2, wxWindow *parent, wxString tooltip, wxString tooltip2, std::function onclick, bool button_on_left = false); wxWindow* create_item_downloads(wxWindow* parent, int padding_left, std::string param); wxBoxSizer *create_item_input(wxString title, wxString title2, wxWindow *parent, wxString tooltip, std::string param, std::function onchange = {}); + wxBoxSizer *create_camera_orbit_mult_input(wxString title, wxWindow *parent, wxString tooltip); wxBoxSizer *create_item_backup_input(wxString title, wxWindow *parent, wxString tooltip, std::string param); wxBoxSizer *create_item_multiple_combobox( wxString title, wxWindow *parent, wxString tooltip, int padding_left, std::string parama, std::vector vlista, std::vector vlistb); diff --git a/src/slic3r/GUI/PresetComboBoxes.cpp b/src/slic3r/GUI/PresetComboBoxes.cpp index d7eb66e6fc..8b0ee1e154 100644 --- a/src/slic3r/GUI/PresetComboBoxes.cpp +++ b/src/slic3r/GUI/PresetComboBoxes.cpp @@ -796,15 +796,6 @@ bool PlaterPresetComboBox::switch_to_tab() if (!tab) return false; - //BBS Select NoteBook Tab params - if (tab->GetParent() == wxGetApp().params_panel()) - wxGetApp().mainframe->select_tab(MainFrame::tp3DEditor); - else { - wxGetApp().params_dialog()->Popup(); - tab->OnActivate(); - } - tab->restore_last_select_item(); - const Preset* selected_filament_preset = nullptr; if (m_type == Preset::TYPE_FILAMENT) { @@ -815,7 +806,6 @@ bool PlaterPresetComboBox::switch_to_tab() if (wxGetApp().get_tab(m_type)->select_preset(preset_name)) wxGetApp().get_tab(m_type)->get_combo_box()->set_filament_idx(m_filament_idx); else { - wxGetApp().params_dialog()->Hide(); return false; } } @@ -843,6 +833,15 @@ bool PlaterPresetComboBox::switch_to_tab() } */ + //BBS Select NoteBook Tab params + if (tab->GetParent() == wxGetApp().params_panel()) + wxGetApp().mainframe->select_tab(MainFrame::tp3DEditor); + else { + wxGetApp().params_dialog()->Popup(); + tab->OnActivate(); + } + tab->restore_last_select_item(); + return true; } diff --git a/src/slic3r/GUI/PrintHostDialogs.cpp b/src/slic3r/GUI/PrintHostDialogs.cpp index 86b43f3ee8..5b4a2bf2df 100644 --- a/src/slic3r/GUI/PrintHostDialogs.cpp +++ b/src/slic3r/GUI/PrintHostDialogs.cpp @@ -227,7 +227,7 @@ std::string PrintHostSendDialog::storage() const return GUI::format("%1%", m_preselected_storage); if (combo_storage->GetSelection() < 0 || combo_storage->GetSelection() >= int(m_paths.size())) return {}; - return boost::nowide::narrow(m_paths[combo_storage->GetSelection()]); + return into_u8(m_paths[combo_storage->GetSelection()]); } void PrintHostSendDialog::EndModal(int ret) @@ -491,7 +491,7 @@ void PrintHostQueueDialog::on_progress(Event &evt) wxVariant nm, hst; job_list->GetValue(nm, evt.job_id, COL_FILENAME); job_list->GetValue(hst, evt.job_id, COL_HOST); - wxGetApp().notification_manager()->set_upload_job_notification_percentage(evt.job_id + 1, boost::nowide::narrow(nm.GetString()), boost::nowide::narrow(hst.GetString()), evt.progress / 100.f); + wxGetApp().notification_manager()->set_upload_job_notification_percentage(evt.job_id + 1, into_u8(nm.GetString()), into_u8(hst.GetString()), evt.progress / 100.f); } } @@ -512,7 +512,7 @@ void PrintHostQueueDialog::on_error(Event &evt) wxVariant nm, hst; job_list->GetValue(nm, evt.job_id, COL_FILENAME); job_list->GetValue(hst, evt.job_id, COL_HOST); - wxGetApp().notification_manager()->upload_job_notification_show_error(evt.job_id + 1, boost::nowide::narrow(nm.GetString()), boost::nowide::narrow(hst.GetString())); + wxGetApp().notification_manager()->upload_job_notification_show_error(evt.job_id + 1, into_u8(nm.GetString()), into_u8(hst.GetString())); } void PrintHostQueueDialog::on_cancel(Event &evt) @@ -527,7 +527,7 @@ void PrintHostQueueDialog::on_cancel(Event &evt) wxVariant nm, hst; job_list->GetValue(nm, evt.job_id, COL_FILENAME); job_list->GetValue(hst, evt.job_id, COL_HOST); - wxGetApp().notification_manager()->upload_job_notification_show_canceled(evt.job_id + 1, boost::nowide::narrow(nm.GetString()), boost::nowide::narrow(hst.GetString())); + wxGetApp().notification_manager()->upload_job_notification_show_canceled(evt.job_id + 1, into_u8(nm.GetString()), into_u8(hst.GetString())); } void PrintHostQueueDialog::on_info(Event& evt) @@ -538,17 +538,17 @@ void PrintHostQueueDialog::on_info(Event& evt) if (evt.tag == L"resolve") { wxVariant hst(evt.status); job_list->SetValue(hst, evt.job_id, COL_HOST); - wxGetApp().notification_manager()->set_upload_job_notification_host(evt.job_id + 1, boost::nowide::narrow(evt.status)); + wxGetApp().notification_manager()->set_upload_job_notification_host(evt.job_id + 1, into_u8(evt.status)); } else if (evt.tag == L"complete") { wxVariant hst(evt.status); job_list->SetValue(hst, evt.job_id, COL_ERRORMSG); wxGetApp().notification_manager()->set_upload_job_notification_completed(evt.job_id + 1); - wxGetApp().notification_manager()->set_upload_job_notification_status(evt.job_id + 1, boost::nowide::narrow(evt.status)); + wxGetApp().notification_manager()->set_upload_job_notification_status(evt.job_id + 1, into_u8(evt.status)); } else if(evt.tag == L"complete_with_warning"){ wxVariant hst(evt.status); job_list->SetValue(hst, evt.job_id, COL_ERRORMSG); wxGetApp().notification_manager()->set_upload_job_notification_completed_with_warning(evt.job_id + 1); - wxGetApp().notification_manager()->set_upload_job_notification_status(evt.job_id + 1, boost::nowide::narrow(evt.status)); + wxGetApp().notification_manager()->set_upload_job_notification_status(evt.job_id + 1, into_u8(evt.status)); } else if (evt.tag == L"set_complete_off") { wxGetApp().notification_manager()->set_upload_job_notification_comp_on_100(evt.job_id + 1, false); } diff --git a/src/slic3r/GUI/PrinterWebView.cpp b/src/slic3r/GUI/PrinterWebView.cpp index 35870df65b..86d89e1192 100644 --- a/src/slic3r/GUI/PrinterWebView.cpp +++ b/src/slic3r/GUI/PrinterWebView.cpp @@ -77,12 +77,26 @@ void PrinterWebView::load_url(wxString& url, wxString apikey) return; m_apikey = apikey; m_apikey_sent = false; - - m_browser->LoadURL(url); + + if (this->IsShown()) { + m_url_deferred = *wxEmptyString; + m_browser->LoadURL(url); + } else { + m_url_deferred = url; + } //m_browser->SetFocus(); UpdateState(); } +bool PrinterWebView::Show(bool show) +{ + if (show && !m_url_deferred.empty()) { + m_browser->LoadURL(m_url_deferred); + m_url_deferred = *wxEmptyString; + } + return wxPanel::Show(show); +} + void PrinterWebView::reload() { m_browser->Reload(); diff --git a/src/slic3r/GUI/PrinterWebView.hpp b/src/slic3r/GUI/PrinterWebView.hpp index 4b2702a4c8..887091dde3 100644 --- a/src/slic3r/GUI/PrinterWebView.hpp +++ b/src/slic3r/GUI/PrinterWebView.hpp @@ -43,6 +43,9 @@ public: void OnLoaded(wxWebViewEvent& evt); void reload(); void update_mode(); + + bool Show(bool show = true) override; + private: void SendAPIKey(); @@ -51,6 +54,8 @@ private: wxString m_apikey; bool m_apikey_sent; + wxString m_url_deferred; + // DECLARE_EVENT_TABLE() }; diff --git a/src/slic3r/GUI/Search.cpp b/src/slic3r/GUI/Search.cpp index 958f3b2b2e..efa7e3581a 100644 --- a/src/slic3r/GUI/Search.cpp +++ b/src/slic3r/GUI/Search.cpp @@ -47,7 +47,7 @@ static char marker_by_type(Preset::Type type, PrinterTechnology pt) } } -std::string Option::opt_key() const { return boost::nowide::narrow(key).substr(2); } +std::string Option::opt_key() const { return into_u8(key).substr(2); } void FoundOption::get_marked_label_and_tooltip(const char **label_, const char **tooltip_) const { @@ -210,9 +210,9 @@ bool OptionsSearcher::search(const std::string &search, bool force /* = false*/, std::string label = into_u8(get_label(opt)); //all if (type == Preset::TYPE_INVALID) { - found.emplace_back(FoundOption{label, label, boost::nowide::narrow(get_tooltip(opt)), i, 0}); + found.emplace_back(FoundOption{label, label, into_u8(get_tooltip(opt)), i, 0}); } else if (type == opt.type){ - found.emplace_back(FoundOption{label, label, boost::nowide::narrow(get_tooltip(opt)), i, 0}); + found.emplace_back(FoundOption{label, label, into_u8(get_tooltip(opt)), i, 0}); } continue; @@ -253,9 +253,9 @@ bool OptionsSearcher::search(const std::string &search, bool force /* = false*/, #endif if (type == Preset::TYPE_INVALID) { - found.emplace_back(FoundOption{label_plain, label_u8, boost::nowide::narrow(get_tooltip(opt)), i, score}); + found.emplace_back(FoundOption{label_plain, label_u8, into_u8(get_tooltip(opt)), i, score}); } else if (type == opt.type) { - found.emplace_back(FoundOption{label_plain, label_u8, boost::nowide::narrow(get_tooltip(opt)), i, score}); + found.emplace_back(FoundOption{label_plain, label_u8, into_u8(get_tooltip(opt)), i, score}); } } diff --git a/src/slic3r/GUI/Selection.cpp b/src/slic3r/GUI/Selection.cpp index 68f1387492..9b6d97443a 100644 --- a/src/slic3r/GUI/Selection.cpp +++ b/src/slic3r/GUI/Selection.cpp @@ -401,6 +401,39 @@ void Selection::remove_volumes(EMode mode, const std::vector& volu this->set_bounding_boxes_dirty(); } +ModelVolume *Selection::get_selected_single_volume(int &out_object_idx, int &out_volume_idx) const +{ + if (is_single_volume() || is_single_modifier()) { + const GLVolume *gl_volume = get_first_volume(); + out_object_idx = gl_volume->object_idx(); + ModelObject *model_object = get_model()->objects[out_object_idx]; + out_volume_idx = gl_volume->volume_idx(); + if (out_volume_idx < model_object->volumes.size()) + return model_object->volumes[out_volume_idx]; + } + return nullptr; +} + +ModelObject *Selection::get_selected_single_object(int &out_object_idx) const +{ + if (is_single_volume() || is_single_modifier() || is_single_full_object()) { + const GLVolume *gl_volume = get_first_volume(); + out_object_idx = gl_volume->object_idx(); + return get_model()->objects[out_object_idx]; + } + return nullptr; +} + +const ModelInstance *Selection::get_selected_single_intance() const +{ + int object_idx; + auto mo = get_selected_single_object(object_idx); + if (mo) { + return mo->instances[get_instance_idx()]; + } + return nullptr; +} + void Selection::add_curr_plate() { if (!m_valid) @@ -910,17 +943,17 @@ const BoundingBoxf3& Selection::get_scaled_instance_bounding_box() const return *m_scaled_instance_bounding_box; } -const BoundingBoxf3& Selection::get_full_unscaled_instance_bounding_box() const +const BoundingBoxf3 &Selection::get_full_unscaled_instance_bounding_box() const { assert(is_single_full_instance()); if (!m_full_unscaled_instance_bounding_box.has_value()) { - std::optional* bbox = const_cast*>(&m_full_unscaled_instance_bounding_box); - *bbox = BoundingBoxf3(); + std::optional *bbox = const_cast *>(&m_full_unscaled_instance_bounding_box); + *bbox = BoundingBoxf3(); if (m_valid) { for (unsigned int i : m_list) { - const GLVolume& volume = *(*m_volumes)[i]; - Transform3d trafo = volume.get_instance_transformation().get_matrix_no_scaling_factor() * volume.get_volume_transformation().get_matrix(); + const GLVolume &volume = *(*m_volumes)[i]; + Transform3d trafo = volume.get_instance_transformation().get_matrix_no_scaling_factor() * volume.get_volume_transformation().get_matrix(); trafo.translation().z() += volume.get_sla_shift_z(); (*bbox)->merge(volume.transformed_convex_hull_bounding_box(trafo)); } @@ -929,17 +962,17 @@ const BoundingBoxf3& Selection::get_full_unscaled_instance_bounding_box() const return *m_full_unscaled_instance_bounding_box; } -const BoundingBoxf3& Selection::get_full_scaled_instance_bounding_box() const +const BoundingBoxf3 &Selection::get_full_scaled_instance_bounding_box() const { assert(is_single_full_instance()); if (!m_full_scaled_instance_bounding_box.has_value()) { - std::optional* bbox = const_cast*>(&m_full_scaled_instance_bounding_box); - *bbox = BoundingBoxf3(); + std::optional *bbox = const_cast *>(&m_full_scaled_instance_bounding_box); + *bbox = BoundingBoxf3(); if (m_valid) { for (unsigned int i : m_list) { - const GLVolume& volume = *(*m_volumes)[i]; - Transform3d trafo = volume.get_instance_transformation().get_matrix() * volume.get_volume_transformation().get_matrix(); + const GLVolume &volume = *(*m_volumes)[i]; + Transform3d trafo = volume.get_instance_transformation().get_matrix() * volume.get_volume_transformation().get_matrix(); trafo.translation().z() += volume.get_sla_shift_z(); (*bbox)->merge(volume.transformed_convex_hull_bounding_box(trafo)); } @@ -948,17 +981,17 @@ const BoundingBoxf3& Selection::get_full_scaled_instance_bounding_box() const return *m_full_scaled_instance_bounding_box; } -const BoundingBoxf3& Selection::get_full_unscaled_instance_local_bounding_box() const +const BoundingBoxf3 &Selection::get_full_unscaled_instance_local_bounding_box() const { assert(is_single_full_instance()); if (!m_full_unscaled_instance_local_bounding_box.has_value()) { - std::optional* bbox = const_cast*>(&m_full_unscaled_instance_local_bounding_box); - *bbox = BoundingBoxf3(); + std::optional *bbox = const_cast *>(&m_full_unscaled_instance_local_bounding_box); + *bbox = BoundingBoxf3(); if (m_valid) { for (unsigned int i : m_list) { - const GLVolume& volume = *(*m_volumes)[i]; - Transform3d trafo = volume.get_volume_transformation().get_matrix(); + const GLVolume &volume = *(*m_volumes)[i]; + Transform3d trafo = volume.get_volume_transformation().get_matrix(); trafo.translation().z() += volume.get_sla_shift_z(); (*bbox)->merge(volume.transformed_convex_hull_bounding_box(trafo)); } @@ -967,22 +1000,20 @@ const BoundingBoxf3& Selection::get_full_unscaled_instance_local_bounding_box() return *m_full_unscaled_instance_local_bounding_box; } -const std::pair& Selection::get_bounding_box_in_current_reference_system() const +const std::pair &Selection::get_bounding_box_in_current_reference_system() const { static int last_coordinates_type = -1; assert(!is_empty()); ECoordinatesType coordinates_type = wxGetApp().obj_manipul()->get_coordinates_type(); - if (m_mode == Instance && coordinates_type == ECoordinatesType::Local) - coordinates_type = ECoordinatesType::World; + if (m_mode == Instance && coordinates_type == ECoordinatesType::Local) coordinates_type = ECoordinatesType::World; - if (last_coordinates_type != int(coordinates_type)) - const_cast>*>(&m_bounding_box_in_current_reference_system)->reset(); + if (last_coordinates_type != int(coordinates_type)) const_cast> *>(&m_bounding_box_in_current_reference_system)->reset(); if (!m_bounding_box_in_current_reference_system.has_value()) { - last_coordinates_type = int(coordinates_type); - *const_cast>*>(&m_bounding_box_in_current_reference_system) = get_bounding_box_in_reference_system(coordinates_type); + last_coordinates_type = int(coordinates_type); + *const_cast> *>(&m_bounding_box_in_current_reference_system) = get_bounding_box_in_reference_system(coordinates_type); } return *m_bounding_box_in_current_reference_system; @@ -994,11 +1025,19 @@ std::pair Selection::get_bounding_box_in_reference_s // trafo to current reference system // Transform3d trafo; - switch (type) - { - case ECoordinatesType::World: { trafo = Transform3d::Identity(); break; } - case ECoordinatesType::Instance: { trafo = get_first_volume()->get_instance_transformation().get_matrix(); break; } - case ECoordinatesType::Local: { trafo = get_first_volume()->world_matrix(); break; } + switch (type) { + case ECoordinatesType::World: { + trafo = Transform3d::Identity(); + break; + } + case ECoordinatesType::Instance: { + trafo = get_first_volume()->get_instance_transformation().get_matrix(); + break; + } + case ECoordinatesType::Local: { + trafo = get_first_volume()->world_matrix(); + break; + } } // @@ -1006,60 +1045,55 @@ std::pair Selection::get_bounding_box_in_reference_s // Geometry::Transformation t(trafo); t.reset_scaling_factor(); - const Transform3d basis_trafo = t.get_matrix_no_offset(); - std::vector axes = { Vec3d::UnitX(), Vec3d::UnitY(), Vec3d::UnitZ() }; - for (size_t i = 0; i < axes.size(); ++i) { - axes[i] = basis_trafo * axes[i]; - } + const Transform3d basis_trafo = t.get_matrix_no_offset(); + std::vector axes = {Vec3d::UnitX(), Vec3d::UnitY(), Vec3d::UnitZ()}; + for (size_t i = 0; i < axes.size(); ++i) { axes[i] = basis_trafo * axes[i]; } // // calculate bounding box aligned to trafo basis // - Vec3d min = { DBL_MAX, DBL_MAX, DBL_MAX }; - Vec3d max = { -DBL_MAX, -DBL_MAX, -DBL_MAX }; + Vec3d min = {DBL_MAX, DBL_MAX, DBL_MAX}; + Vec3d max = {-DBL_MAX, -DBL_MAX, -DBL_MAX}; for (unsigned int id : m_list) { - const GLVolume& vol = *get_volume(id); - const Transform3d vol_world_rafo = vol.world_matrix(); - const TriangleMesh* mesh = vol.convex_hull(); + const GLVolume & vol = *get_volume(id); + const Transform3d vol_world_rafo = vol.world_matrix(); + const TriangleMesh *mesh = vol.convex_hull(); if (mesh == nullptr) mesh = &m_model->objects[vol.object_idx()]->volumes[vol.volume_idx()]->mesh(); assert(mesh != nullptr); - for (const stl_vertex& v : mesh->its.vertices) { + for (const stl_vertex &v : mesh->its.vertices) { const Vec3d world_v = vol_world_rafo * v.cast(); for (int i = 0; i < 3; ++i) { const double i_comp = world_v.dot(axes[i]); - min(i) = std::min(min(i), i_comp); - max(i) = std::max(max(i), i_comp); + min(i) = std::min(min(i), i_comp); + max(i) = std::max(max(i), i_comp); } } } - const Vec3d box_size = max - min; - Vec3d half_box_size = 0.5 * box_size; + const Vec3d box_size = max - min; + Vec3d half_box_size = 0.5 * box_size; Geometry::Transformation out_trafo(trafo); - Vec3d center = 0.5 * (min + max); + Vec3d center = 0.5 * (min + max); - // Fix for non centered volume + // Fix for non centered volume // by move with calculated center(to volume center) and extend half box size // e.g. for right aligned embossed text - if (m_list.size() == 1 && - type == ECoordinatesType::Local) { - const GLVolume& vol = *get_volume(*m_list.begin()); + if (m_list.size() == 1 && type == ECoordinatesType::Local) { + const GLVolume & vol = *get_volume(*m_list.begin()); const Transform3d vol_world_trafo = vol.world_matrix(); - Vec3d world_zero = vol_world_trafo * Vec3d::Zero(); - for (size_t i = 0; i < 3; i++){ + Vec3d world_zero = vol_world_trafo * Vec3d::Zero(); + for (size_t i = 0; i < 3; i++) { // move center to local volume zero center[i] = world_zero.dot(axes[i]); // extend half size to bigger distance from center - half_box_size[i] = std::max( - abs(center[i] - min[i]), - abs(center[i] - max[i])); + half_box_size[i] = std::max(abs(center[i] - min[i]), abs(center[i] - max[i])); } } - + const BoundingBoxf3 out_box(-half_box_size, half_box_size); out_trafo.set_offset(basis_trafo * center); - return { out_box, out_trafo.get_matrix_no_scaling_factor() }; + return {out_box, out_trafo.get_matrix_no_scaling_factor()}; } const std::pair Selection::get_bounding_sphere() const @@ -1138,34 +1172,52 @@ void Selection::move_to_center(const Vec3d& displacement, bool local) this->set_bounding_boxes_dirty(); } -void Selection::translate(const Vec3d& displacement, TransformationType transformation_type) +void Selection::translate(const Vec3d &displacement, TransformationType transformation_type) { - if (!m_valid) - return; - - // Emboss use translate in local coordinate - assert(transformation_type.relative() || - transformation_type.local()); + if (!m_valid) return; for (unsigned int i : m_list) { - GLVolume& v = *(*m_volumes)[i]; - const VolumeCache& volume_data = m_cache.volumes_data[i]; + GLVolume & v = *(*m_volumes)[i]; + const VolumeCache &volume_data = m_cache.volumes_data[i]; if (m_mode == Instance && !is_wipe_tower()) { assert(is_from_fully_selected_instance(i)); if (transformation_type.instance()) { - const Geometry::Transformation& inst_trafo = volume_data.get_instance_transform(); + const Geometry::Transformation &inst_trafo = volume_data.get_instance_transform(); v.set_instance_offset(inst_trafo.get_offset() + inst_trafo.get_rotation_matrix() * displacement); - } - else + } else transform_instance_relative(v, volume_data, transformation_type, Geometry::translation_transform(displacement), m_cache.dragging_center); - } - else { - if (transformation_type.local() && transformation_type.absolute()) { - const Geometry::Transformation& vol_trafo = volume_data.get_volume_transform(); - const Geometry::Transformation& inst_trafo = volume_data.get_instance_transform(); - v.set_volume_offset(vol_trafo.get_offset() + inst_trafo.get_scaling_factor_matrix().inverse() * vol_trafo.get_rotation_matrix() * displacement); + } else { + if (v.is_wipe_tower) {//in world cs + int plate_idx = v.object_idx() - 1000; + BoundingBoxf3 plate_bbox = wxGetApp().plater()->get_partplate_list().get_plate(plate_idx)->get_bounding_box(); + Vec3d tower_size = v.bounding_box().size(); + Vec3d tower_origin = m_cache.volumes_data[i].get_volume_position(); + Vec3d actual_displacement = displacement; + const double margin = WIPE_TOWER_MARGIN; + + actual_displacement = (m_cache.volumes_data[i].get_instance_rotation_matrix() * m_cache.volumes_data[i].get_instance_scale_matrix() * + m_cache.volumes_data[i].get_instance_mirror_matrix()) + .inverse() * + displacement; + if (tower_origin(0) + actual_displacement(0) - margin < plate_bbox.min(0)) { + actual_displacement(0) = plate_bbox.min(0) - tower_origin(0) + margin; + } else if (tower_origin(0) + actual_displacement(0) + tower_size(0) + margin > plate_bbox.max(0)) { + actual_displacement(0) = plate_bbox.max(0) - tower_origin(0) - tower_size(0) - margin; + } + + if (tower_origin(1) + actual_displacement(1) - margin < plate_bbox.min(1)) { + actual_displacement(1) = plate_bbox.min(1) - tower_origin(1) + margin; + } else if (tower_origin(1) + actual_displacement(1) + tower_size(1) + margin > plate_bbox.max(1)) { + actual_displacement(1) = plate_bbox.max(1) - tower_origin(1) - tower_size(1) - margin; + } + + v.set_volume_offset(m_cache.volumes_data[i].get_volume_position() + actual_displacement); } - else { + else if (transformation_type.local() && transformation_type.absolute()) { + const Geometry::Transformation &vol_trafo = volume_data.get_volume_transform(); + const Geometry::Transformation &inst_trafo = volume_data.get_instance_transform(); + v.set_volume_offset(vol_trafo.get_offset() + inst_trafo.get_scaling_factor_matrix().inverse() * vol_trafo.get_rotation_matrix() * displacement); + } else { Vec3d relative_disp = displacement; if (transformation_type.world() && transformation_type.instance()) relative_disp = volume_data.get_instance_transform().get_scaling_factor_matrix().inverse() * relative_disp; @@ -1181,12 +1233,14 @@ void Selection::translate(const Vec3d& displacement, TransformationType transfor else if (m_mode == Volume) synchronize_unselected_volumes(); #endif // !DISABLE_INSTANCES_SYNCH - - ensure_not_below_bed(); + if (wxGetApp().plater()->canvas3D()->get_canvas_type() != GLCanvas3D::ECanvasType::CanvasAssembleView) { + ensure_not_below_bed(); + } set_bounding_boxes_dirty(); - wxGetApp().plater()->canvas3D()->requires_check_outside_state(); + if (wxGetApp().plater()->canvas3D()->get_canvas_type() != GLCanvas3D::ECanvasType::CanvasAssembleView) { + wxGetApp().plater()->canvas3D()->requires_check_outside_state(); + } } - // Rotate an object around one of the axes. Only one rotation component is expected to be changing. void Selection::rotate(const Vec3d& rotation, TransformationType transformation_type) { @@ -1287,7 +1341,9 @@ void Selection::rotate(const Vec3d& rotation, TransformationType transformation_ #endif // !DISABLE_INSTANCES_SYNCH set_bounding_boxes_dirty(); - wxGetApp().plater()->canvas3D()->requires_check_outside_state(); + if (wxGetApp().plater()->canvas3D()->get_canvas_type() != GLCanvas3D::ECanvasType::CanvasAssembleView) { + wxGetApp().plater()->canvas3D()->requires_check_outside_state(); + } } void Selection::flattening_rotate(const Vec3d& normal) @@ -1320,96 +1376,6 @@ void Selection::flattening_rotate(const Vec3d& normal) this->set_bounding_boxes_dirty(); } -void Selection::scale_legacy(const Vec3d& scale, TransformationType transformation_type) -{ - if (!m_valid) - return; - - for (unsigned int i : m_list) { - GLVolume &v = *(*m_volumes)[i]; - if (is_single_full_instance()) { - if (transformation_type.relative()) { - Transform3d m = Geometry::assemble_transform(Vec3d::Zero(), Vec3d::Zero(), scale); - Eigen::Matrix new_matrix = (m * m_cache.volumes_data[i].get_instance_scale_matrix()).matrix().block(0, 0, 3, 3); - // extracts scaling factors from the composed transformation - Vec3d new_scale(new_matrix.col(0).norm(), new_matrix.col(1).norm(), new_matrix.col(2).norm()); - if (transformation_type.joint()) - v.set_instance_offset(m_cache.dragging_center + m * (m_cache.volumes_data[i].get_instance_position() - m_cache.dragging_center)); - - v.set_instance_scaling_factor(new_scale); - // Restore mirror state - v.set_instance_mirror(m_cache.volumes_data[i].get_instance_transform().get_mirror()); - } - else { - const auto mirror = v.get_instance_mirror(); - if (transformation_type.world() && (std::abs(scale.x() - scale.y()) > EPSILON || std::abs(scale.x() - scale.z()) > EPSILON)) { - // Non-uniform scaling. Transform the scaling factors into the local coordinate system. - // This is only possible, if the instance rotation is mulitples of ninety degrees. - assert(Geometry::is_rotation_ninety_degrees(v.get_instance_rotation())); - v.set_instance_scaling_factor((v.get_instance_transformation().get_rotation_matrix().matrix().block<3, 3>(0, 0).transpose() * scale).cwiseAbs()); - } - else - v.set_instance_scaling_factor(scale); - // Restore mirror state - v.set_instance_mirror(mirror); - } - - // update the instance assemble transform - ModelObject* object = m_model->objects[v.object_idx()]; - Geometry::Transformation assemble_transform = object->instances[v.instance_idx()]->get_assemble_transformation(); - const auto mirror = assemble_transform.get_mirror(); - assemble_transform.set_scaling_factor(v.get_instance_scaling_factor()); - assemble_transform.set_mirror(mirror); - object->instances[v.instance_idx()]->set_assemble_transformation(assemble_transform); - } - else if (is_single_volume() || is_single_modifier()) { - const auto mirror = v.get_volume_transformation().get_mirror(); - v.set_volume_scaling_factor(scale); - // Restore mirror state - v.set_volume_mirror(mirror); - } - else { - Transform3d m = Geometry::assemble_transform(Vec3d::Zero(), Vec3d::Zero(), scale); - if (m_mode == Instance) { - Eigen::Matrix new_matrix = (m * m_cache.volumes_data[i].get_instance_scale_matrix()).matrix().block(0, 0, 3, 3); - // extracts scaling factors from the composed transformation - Vec3d new_scale(new_matrix.col(0).norm(), new_matrix.col(1).norm(), new_matrix.col(2).norm()); - if (transformation_type.joint()) - v.set_instance_offset(m_cache.dragging_center + m * (m_cache.volumes_data[i].get_instance_position() - m_cache.dragging_center)); - - v.set_instance_scaling_factor(new_scale); - // Restore mirror state - v.set_instance_mirror(m_cache.volumes_data[i].get_instance_transform().get_mirror()); - } - else if (m_mode == Volume) { - Eigen::Matrix new_matrix = (m * m_cache.volumes_data[i].get_volume_scale_matrix()).matrix().block(0, 0, 3, 3); - // extracts scaling factors from the composed transformation - Vec3d new_scale(new_matrix.col(0).norm(), new_matrix.col(1).norm(), new_matrix.col(2).norm()); - if (transformation_type.joint()) { - Vec3d offset = m * (m_cache.volumes_data[i].get_volume_position() + m_cache.volumes_data[i].get_instance_position() - m_cache.dragging_center); - v.set_volume_offset(m_cache.dragging_center - m_cache.volumes_data[i].get_instance_position() + offset); - } - v.set_volume_scaling_factor(new_scale); - // Restore mirror state - v.set_volume_mirror(m_cache.volumes_data[i].get_volume_transform().get_mirror()); - } - } - } - -#if !DISABLE_INSTANCES_SYNCH - if (m_mode == Instance) - // even if there is no rotation, we pass SyncRotationType::GENERAL to force - // synchronize_unselected_instances() to apply the scale to the other instances - synchronize_unselected_instances(SyncRotationType::GENERAL); - else if (m_mode == Volume) - synchronize_unselected_volumes(); -#endif // !DISABLE_INSTANCES_SYNCH - - ensure_on_bed(); - set_bounding_boxes_dirty(); - wxGetApp().plater()->canvas3D()->requires_check_outside_state(); -} - void Selection::scale(const Vec3d& scale, TransformationType transformation_type) { scale_and_translate(scale, Vec3d::Zero(), transformation_type); @@ -1552,16 +1518,9 @@ void Selection::scale_to_fit_print_volume(const DynamicPrintConfig& config) } #endif // ENABLE_ENHANCED_PRINT_VOLUME_FIT -void Selection::mirror(Axis axis, TransformationType transformation_type) +void Selection::scale_and_translate(const Vec3d &scale, const Vec3d &world_translation, TransformationType transformation_type) { - const Vec3d mirror((axis == X) ? -1.0 : 1.0, (axis == Y) ? -1.0 : 1.0, (axis == Z) ? -1.0 : 1.0); - scale_and_translate(mirror, Vec3d::Zero(), transformation_type); -} - -void Selection::scale_and_translate(const Vec3d& scale, const Vec3d& world_translation, TransformationType transformation_type) -{ - if (!m_valid) - return; + if (!m_valid) return; Vec3d relative_scale = scale; if (transformation_type.absolute()) { @@ -1582,45 +1541,52 @@ void Selection::scale_and_translate(const Vec3d& scale, const Vec3d& world_trans } for (unsigned int i : m_list) { - GLVolume& v = *(*m_volumes)[i]; - const VolumeCache& volume_data = m_cache.volumes_data[i]; - const Geometry::Transformation& inst_trafo = volume_data.get_instance_transform(); + GLVolume & v = *(*m_volumes)[i]; + const VolumeCache & volume_data = m_cache.volumes_data[i]; + const Geometry::Transformation &inst_trafo = volume_data.get_instance_transform(); if (m_mode == Instance) { if (transformation_type.instance()) { const Vec3d world_inst_pivot = m_cache.dragging_center - inst_trafo.get_offset(); const Vec3d local_inst_pivot = inst_trafo.get_matrix_no_offset().inverse() * world_inst_pivot; - Matrix3d inst_rotation, inst_scale; + Matrix3d inst_rotation, inst_scale; inst_trafo.get_matrix().computeRotationScaling(&inst_rotation, &inst_scale); const Transform3d offset_trafo = Geometry::translation_transform(inst_trafo.get_offset() + world_translation); - const Transform3d scale_trafo = Transform3d(inst_scale) * Geometry::scale_transform(relative_scale); - v.set_instance_transformation(Geometry::translation_transform(world_inst_pivot) * offset_trafo * Transform3d(inst_rotation) * scale_trafo * Geometry::translation_transform(-local_inst_pivot)); - } - else - transform_instance_relative(v, volume_data, transformation_type, Geometry::translation_transform(world_translation) * Geometry::scale_transform(relative_scale), m_cache.dragging_center); - } - else { + const Transform3d scale_trafo = Transform3d(inst_scale) * Geometry::scale_transform(relative_scale); + v.set_instance_transformation(Geometry::translation_transform(world_inst_pivot) * offset_trafo * Transform3d(inst_rotation) * scale_trafo * + Geometry::translation_transform(-local_inst_pivot)); + } else + transform_instance_relative(v, volume_data, transformation_type, Geometry::translation_transform(world_translation) * Geometry::scale_transform(relative_scale), + m_cache.dragging_center); + // update the instance assemble transform + ModelObject * object = m_model->objects[v.object_idx()]; + Geometry::Transformation assemble_transform = object->instances[v.instance_idx()]->get_assemble_transformation(); + assemble_transform.set_scaling_factor(v.get_instance_scaling_factor()); + object->instances[v.instance_idx()]->set_assemble_transformation(assemble_transform); + } else { if (!is_single_volume_or_modifier()) { assert(transformation_type.world()); - transform_volume_relative(v, volume_data, transformation_type, Geometry::translation_transform(world_translation) * Geometry::scale_transform(scale), m_cache.dragging_center); - } - else { + transform_volume_relative(v, volume_data, transformation_type, Geometry::translation_transform(world_translation) * Geometry::scale_transform(scale), + m_cache.dragging_center); + } else { transformation_type.set_independent(); Vec3d translation; - if (transformation_type.local()) + if (transformation_type.local()) { translation = volume_data.get_volume_transform().get_matrix_no_offset().inverse() * inst_trafo.get_matrix_no_offset().inverse() * world_translation; + } else if (transformation_type.instance()) translation = inst_trafo.get_matrix_no_offset().inverse() * world_translation; else translation = world_translation; - transform_volume_relative(v, volume_data, transformation_type, Geometry::translation_transform(translation) * Geometry::scale_transform(scale), m_cache.dragging_center); + transform_volume_relative(v, volume_data, transformation_type, Geometry::translation_transform(translation) * Geometry::scale_transform(scale), + m_cache.dragging_center); } } } #if !DISABLE_INSTANCES_SYNCH if (m_mode == Instance) - // even if there is no rotation, we pass SyncRotationType::GENERAL to force + // even if there is no rotation, we pass SyncRotationType::GENERAL to force // synchronize_unselected_instances() to apply the scale to the other instances synchronize_unselected_instances(SyncRotationType::GENERAL); else if (m_mode == Volume) @@ -1629,7 +1595,16 @@ void Selection::scale_and_translate(const Vec3d& scale, const Vec3d& world_trans ensure_on_bed(); set_bounding_boxes_dirty(); - wxGetApp().plater()->canvas3D()->requires_check_outside_state(); + if (wxGetApp().plater()->canvas3D()->get_canvas_type() != GLCanvas3D::ECanvasType::CanvasAssembleView) { + wxGetApp().plater()->canvas3D()->requires_check_outside_state(); + } +} + +void Selection::mirror(Axis axis, TransformationType transformation_type) +{ + const Vec3d mirror((axis == X) ? -1.0 : 1.0, (axis == Y) ? -1.0 : 1.0, (axis == Z) ? -1.0 : 1.0); + scale_and_translate(mirror, Vec3d::Zero(), transformation_type); + } void Selection::translate(unsigned int object_idx, const Vec3d& displacement) @@ -1944,7 +1919,8 @@ void Selection::render(float scale_factor) m_scale_factor = scale_factor; // render cumulative bounding box of selected volumes const auto& [box, trafo] = get_bounding_box_in_current_reference_system(); - render_bounding_box(box, trafo, ColorRGB::WHITE()); + render_bounding_box(box, trafo, + wxGetApp().plater()->canvas3D()->get_canvas_type() == GLCanvas3D::ECanvasType::CanvasAssembleView ? ColorRGB::YELLOW(): ColorRGB::WHITE()); render_synchronized_volumes(); } @@ -1992,40 +1968,33 @@ void Selection::render_sidebar_hints(const std::string& sidebar_field, bool unif glsafe(::glEnable(GL_DEPTH_TEST)); - const Transform3d base_matrix = Geometry::assemble_transform(get_bounding_box().center()); + Vec3d center = get_bounding_box().center(); Transform3d orient_matrix = Transform3d::Identity(); if (!boost::starts_with(sidebar_field, "layer")) { shader->set_uniform("emission_factor", 0.05f); + const auto &[box, box_trafo] = get_bounding_box_in_current_reference_system(); // BBS - if (is_single_full_instance()/* && !wxGetApp().obj_manipul()->get_world_coordinates()*/) { - if (!boost::starts_with(sidebar_field, "position")) { - if (boost::starts_with(sidebar_field, "scale")) + if (is_single_full_instance() && !wxGetApp().obj_manipul()->is_world_coordinates()) { + center = box_trafo.translation(); + orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_rotation_matrix(); + } else if (is_single_volume_or_modifier()) { + if (!wxGetApp().obj_manipul()->is_world_coordinates()) { + if (wxGetApp().obj_manipul()->is_local_coordinates()) { + orient_matrix = get_bounding_box_in_current_reference_system().second; + orient_matrix.translation() = Vec3d::Zero(); + } else { orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_rotation_matrix(); - else if (boost::starts_with(sidebar_field, "rotation")) { - if (boost::ends_with(sidebar_field, "x")) - orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_rotation_matrix(); - else if (boost::ends_with(sidebar_field, "y")) { - const Vec3d& rotation = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_rotation(); - if (rotation.x() == 0.0) - orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_rotation_matrix(); - else - orient_matrix.rotate(Eigen::AngleAxisd(rotation.z(), Vec3d::UnitZ())); - } + center = box_trafo.translation(); } } - } - else if (is_single_volume() || is_single_modifier()) { - orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_rotation_matrix(); - if (!boost::starts_with(sidebar_field, "position")) - orient_matrix = orient_matrix * (*m_volumes)[*m_list.begin()]->get_volume_transformation().get_rotation_matrix(); - - } - else { - if (requires_local_axes()) + } else { + if (requires_local_axes()) { orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_rotation_matrix(); + } } } + const Transform3d base_matrix = Geometry::assemble_transform(center); if (!boost::starts_with(sidebar_field, "layer")) glsafe(::glClear(GL_DEPTH_BUFFER_BIT)); @@ -2033,6 +2002,8 @@ void Selection::render_sidebar_hints(const std::string& sidebar_field, bool unif render_sidebar_position_hints(sidebar_field, *shader, base_matrix * orient_matrix); else if (boost::starts_with(sidebar_field, "rotation")) render_sidebar_rotation_hints(sidebar_field, *shader, base_matrix * orient_matrix); + else if (boost::starts_with(sidebar_field, "absolute_rotation")) + render_sidebar_rotation_hints(sidebar_field, *shader, base_matrix * orient_matrix); else if (boost::starts_with(sidebar_field, "scale") || boost::starts_with(sidebar_field, "size")) //BBS: GUI refactor: add uniform_scale from gizmo render_sidebar_scale_hints(sidebar_field, uniform_scale, *shader, base_matrix * orient_matrix); @@ -3052,6 +3023,9 @@ void Selection::ensure_not_below_bed() bool Selection::is_from_fully_selected_instance(unsigned int volume_idx) const { + if (m_mode == Instance && wxGetApp().plater()->canvas3D()->get_canvas_type() == GLCanvas3D::ECanvasType::CanvasAssembleView) { + return true; + } struct SameInstance { int obj_idx; @@ -3180,14 +3154,14 @@ void Selection::paste_objects_from_clipboard() Vec3d displacement; bool in_current = plate->intersects(bbox); auto start_point = in_current ? bbox.center() : plate->get_build_volume().center(); + auto start_offset = in_current ? src_object->instances.front()->get_offset() : plate->get_build_volume().center(); if (shift_all(0) != 0 || shift_all(1) != 0) { // BBS: if multiple objects are selected, move them as a whole after copy if (i == 0) empty_cell_all = wxGetApp().plater()->canvas3D()->get_nearest_empty_cell({start_point(0), start_point(1)}, {bbox.size()(0)+1,bbox.size()(1)+1}); auto instance_shift = src_object->instances.front()->get_offset() - src_objects[0]->instances.front()->get_offset(); - displacement = {shift_all.x() + empty_cell_all.x()+instance_shift.x(), shift_all.y() + empty_cell_all.y()+instance_shift.y(), start_point(2)}; + displacement = {shift_all.x() + empty_cell_all.x() + instance_shift.x(), shift_all.y() + empty_cell_all.y() + instance_shift.y(), start_offset(2)}; } else { // BBS: if only one object is copied, find an empty cell to put it - auto start_offset = in_current ? src_object->instances.front()->get_offset() : plate->get_build_volume().center(); auto point_offset = start_offset - start_point; auto empty_cell = wxGetApp().plater()->canvas3D()->get_nearest_empty_cell({start_point(0), start_point(1)}, {bbox.size()(0)+1, bbox.size()(1)+1}); displacement = {empty_cell.x() + point_offset.x(), empty_cell.y() + point_offset.y(), start_offset(2)}; diff --git a/src/slic3r/GUI/Selection.hpp b/src/slic3r/GUI/Selection.hpp index 0e95b41009..0ad56930df 100644 --- a/src/slic3r/GUI/Selection.hpp +++ b/src/slic3r/GUI/Selection.hpp @@ -15,6 +15,7 @@ class Model; class ModelObject; class ModelVolume; class ObjectID; +class ModelInstance; class GLVolume; class GLArrow; class GLCurvedArrow; @@ -225,6 +226,9 @@ public: void remove_volumes(EMode mode, const std::vector& volume_idxs); //BBS + ModelVolume * get_selected_single_volume(int &out_object_idx, int &out_volume_idx) const; + ModelObject * get_selected_single_object(int &out_object_idx) const; + const ModelInstance * get_selected_single_intance() const; void add_curr_plate(); void add_object_from_idx(std::vector& object_idxs); void remove_curr_plate(); @@ -326,20 +330,17 @@ public: const std::pair get_bounding_sphere() const; void setup_cache(); - void translate(const Vec3d& displacement, TransformationType transformation_type); void move_to_center(const Vec3d& displacement, bool local = false); void rotate(const Vec3d& rotation, TransformationType transformation_type); void flattening_rotate(const Vec3d& normal); - [[deprecated("Only used by GizmoObjectManipulation")]] - void scale_legacy(const Vec3d& scale, TransformationType transformation_type); void scale(const Vec3d& scale, TransformationType transformation_type); #if ENABLE_ENHANCED_PRINT_VOLUME_FIT void scale_to_fit_print_volume(const BuildVolume& volume); #else void scale_to_fit_print_volume(const DynamicPrintConfig& config); #endif // ENABLE_ENHANCED_PRINT_VOLUME_FIT - void scale_and_translate(const Vec3d& scale, const Vec3d& world_translation, TransformationType transformation_type); + void scale_and_translate(const Vec3d &scale, const Vec3d &world_translation, TransformationType transformation_type); void mirror(Axis axis, TransformationType transformation_type); void translate(unsigned int object_idx, const Vec3d& displacement); @@ -351,6 +352,7 @@ public: //BBS: add partplate related logic void notify_instance_update(int object_idx, int instance_idx); // BBS + EMode get_volume_selection_mode(){ return m_volume_selection_mode;} void set_volume_selection_mode(EMode mode) { if (!m_volume_selection_locked) m_volume_selection_mode = mode; } void lock_volume_selection_mode() { m_volume_selection_locked = true; } void unlock_volume_selection_mode() { m_volume_selection_locked = false; } @@ -358,11 +360,11 @@ public: void erase(); void render(float scale_factor = 1.0); - //BBS: GUI refactor: add uniform scale from gizmo - void render_sidebar_hints(const std::string& sidebar_field, bool uniform_scale); #if ENABLE_RENDER_SELECTION_CENTER void render_center(bool gizmo_is_dragging); #endif // ENABLE_RENDER_SELECTION_CENTER + //BBS: GUI refactor: add uniform scale from gizmo + void render_sidebar_hints(const std::string& sidebar_field, bool uniform_scale); bool requires_local_axes() const; @@ -405,7 +407,8 @@ private: void set_bounding_boxes_dirty() { m_bounding_box.reset(); m_unscaled_instance_bounding_box.reset(); m_scaled_instance_bounding_box.reset(); - m_full_unscaled_instance_bounding_box.reset(); m_full_scaled_instance_bounding_box.reset(); + m_full_unscaled_instance_bounding_box.reset(); + m_full_scaled_instance_bounding_box.reset(); m_full_unscaled_instance_local_bounding_box.reset(); m_bounding_box_in_current_reference_system.reset(); m_bounding_sphere.reset(); diff --git a/src/slic3r/GUI/SendSystemInfoDialog.cpp b/src/slic3r/GUI/SendSystemInfoDialog.cpp index 73de9101c4..836d5c641e 100644 --- a/src/slic3r/GUI/SendSystemInfoDialog.cpp +++ b/src/slic3r/GUI/SendSystemInfoDialog.cpp @@ -498,7 +498,7 @@ static std::string generate_system_info_json() std::vector blacklisted_libraries; BlacklistedLibraryCheck::get_instance().get_blacklisted(blacklisted_libraries); for (const std::wstring& wstr : blacklisted_libraries) { - std::string utf8 = boost::nowide::narrow(wstr); + std::string utf8 = into_u8(wstr); if (size_t last_bs_pos = utf8.find_last_of("\\"); last_bs_pos < utf8.size() - 1) { // Remove anything before last backslash so we don't send the path to the DLL. utf8.erase(0, last_bs_pos + 1); diff --git a/src/slic3r/GUI/calib_dlg.cpp b/src/slic3r/GUI/calib_dlg.cpp index 529a1319c9..615114b413 100644 --- a/src/slic3r/GUI/calib_dlg.cpp +++ b/src/slic3r/GUI/calib_dlg.cpp @@ -432,8 +432,8 @@ void Temp_Calibration_Dlg::on_filament_type_changed(wxCommandEvent& event) { end = 230; break; case tPCTG: - start = 240; - end = 280; + start = 280; + end = 240; break; case tTPU: start = 240; diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index 89a7b58f90..d09f69b663 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -1203,9 +1203,9 @@ Updates PresetUpdater::priv::get_config_updates(const Semver &old_slic3r_version auto machine_in_cache = (cache_profile_path / vendor_name / PRESET_PRINTER_NAME); if (( fs::exists(path_in_vendor)) - &&( fs::exists(print_in_cache)) - &&( fs::exists(filament_in_cache)) - &&( fs::exists(machine_in_cache))) { + || fs::exists(print_in_cache) + || fs::exists(filament_in_cache) + || fs::exists(machine_in_cache)) { Semver vendor_ver = get_version_from_json(path_in_vendor.string()); std::map key_values; @@ -1240,11 +1240,10 @@ Updates PresetUpdater::priv::get_config_updates(const Semver &old_slic3r_version Version version; version.config_version = cache_ver; version.comment = description; - - updates.updates.emplace_back(std::move(file_path), std::move(path_in_vendor.string()), std::move(version), vendor_name, changelog, "", force_update, false); - - //BBS: add directory support - updates.updates.emplace_back(cache_path / vendor_name, vendor_path / vendor_name, Version(), vendor_name, "", "", force_update, true); + // Orca: update vendor.json + updates.updates.emplace_back(std::move(file_path), std::move(path_in_vendor.string()), std::move(version), vendor_name, changelog, "", force_update, false); + //Orca: update vendor folder + updates.updates.emplace_back(cache_profile_path / vendor_name, vendor_path / vendor_name, Version(), vendor_name, "", "", force_update, true); } } } diff --git a/src/slic3r/pchheader.hpp b/src/slic3r/pchheader.hpp index 591b41092d..46cd9907d0 100644 --- a/src/slic3r/pchheader.hpp +++ b/src/slic3r/pchheader.hpp @@ -76,8 +76,8 @@ #include #include #include -#include #include +#include #include #include #include