Merge branch 'main' into libvgcode

This commit is contained in:
SoftFever
2026-01-06 11:09:09 +08:00
committed by GitHub
510 changed files with 11271 additions and 4462 deletions

View File

@@ -48,7 +48,7 @@ PROJECT_NAME = OrcaSlicer
# could be handy for archiving the generated documentation or if some version # could be handy for archiving the generated documentation or if some version
# control system is used. # control system is used.
PROJECT_NUMBER = 1.6.3 PROJECT_NUMBER = latest
# Using the PROJECT_BRIEF tag one can provide an optional one line description # Using the PROJECT_BRIEF tag one can provide an optional one line description
# for a project that appears at the top of each page and should give viewer a # for a project that appears at the top of each page and should give viewer a
@@ -68,7 +68,7 @@ PROJECT_LOGO = ./resources/images/OrcaSlicer_32px.png
# entered, it will be relative to the location where doxygen was started. If # entered, it will be relative to the location where doxygen was started. If
# left blank the current directory will be used. # left blank the current directory will be used.
OUTPUT_DIRECTORY = ../ OUTPUT_DIRECTORY = .
# If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096 # If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096
# sub-directories (in 2 levels) under the output directory of each output format # sub-directories (in 2 levels) under the output directory of each output format
@@ -1059,7 +1059,11 @@ EXCLUDE_SYMLINKS = NO
# Note that the wildcards are matched against the file with absolute path, so to # Note that the wildcards are matched against the file with absolute path, so to
# exclude all test directories for example use the pattern */test/* # exclude all test directories for example use the pattern */test/*
EXCLUDE_PATTERNS = EXCLUDE_PATTERNS = */deps/*
EXCLUDE_PATTERNS = */build/*
EXCLUDE_PATTERNS = */deps_src/*
# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
# (namespaces, classes, functions, etc.) that should be excluded from the # (namespaces, classes, functions, etc.) that should be excluded from the
@@ -1286,7 +1290,7 @@ GENERATE_HTML = YES
# The default directory is: html. # The default directory is: html.
# This tag requires that the tag GENERATE_HTML is set to YES. # This tag requires that the tag GENERATE_HTML is set to YES.
HTML_OUTPUT = OrcaSlicer_Dev_Document HTML_OUTPUT = internal_docs
# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each # The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
# generated HTML page (for example: .htm, .php, .asp). # generated HTML page (for example: .htm, .php, .asp).
@@ -1565,7 +1569,7 @@ TOC_EXPAND = NO
# protocol see https://www.sitemaps.org # protocol see https://www.sitemaps.org
# This tag requires that the tag GENERATE_HTML is set to YES. # This tag requires that the tag GENERATE_HTML is set to YES.
SITEMAP_URL = SITEMAP_URL = internals.orcaslicer.com
# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that

View File

@@ -93,7 +93,7 @@ jobs:
- name: Apt-Install Dependencies - name: Apt-Install Dependencies
uses: ./.github/actions/apt-install-deps uses: ./.github/actions/apt-install-deps
- name: Restore Test Artifact - name: Restore Test Artifact
uses: actions/download-artifact@v6 uses: actions/download-artifact@v7
with: with:
name: ${{ github.sha }}-tests name: ${{ github.sha }}-tests
- uses: lukka/get-cmake@latest - uses: lukka/get-cmake@latest
@@ -105,7 +105,7 @@ jobs:
tar -xvf build_tests.tar tar -xvf build_tests.tar
scripts/run_unit_tests.sh scripts/run_unit_tests.sh
- name: Upload Test Logs - name: Upload Test Logs
uses: actions/upload-artifact@v5 uses: actions/upload-artifact@v6
if: ${{ failure() }} if: ${{ failure() }}
with: with:
name: unit-test-logs name: unit-test-logs
@@ -169,7 +169,7 @@ jobs:
arch: ${{ matrix.variant.arch }} arch: ${{ matrix.variant.arch }}
upload-artifact: false upload-artifact: false
- name: Upload artifacts Flatpak - name: Upload artifacts Flatpak
uses: actions/upload-artifact@v5 uses: actions/upload-artifact@v6
with: with:
name: OrcaSlicer-Linux-flatpak_${{ env.ver }}_${{ matrix.variant.arch }}.flatpak name: OrcaSlicer-Linux-flatpak_${{ env.ver }}_${{ matrix.variant.arch }}.flatpak
path: '/__w/OrcaSlicer/OrcaSlicer/OrcaSlicer-Linux-flatpak_${{ env.ver }}_${{ matrix.variant.arch }}.flatpak' path: '/__w/OrcaSlicer/OrcaSlicer/OrcaSlicer-Linux-flatpak_${{ env.ver }}_${{ matrix.variant.arch }}.flatpak'

View File

@@ -41,7 +41,7 @@ jobs:
- name: load cache - name: load cache
id: cache_deps id: cache_deps
uses: actions/cache@v4 uses: actions/cache@v5
with: with:
path: ${{ steps.set_outputs.outputs.cache-path }} path: ${{ steps.set_outputs.outputs.cache-path }}
key: ${{ steps.set_outputs.outputs.cache-key }} key: ${{ steps.set_outputs.outputs.cache-key }}

View File

@@ -39,7 +39,7 @@ jobs:
lfs: 'true' lfs: 'true'
- name: load cached deps - name: load cached deps
uses: actions/cache@v4 uses: actions/cache@v5
with: with:
path: ${{ inputs.cache-path }} path: ${{ inputs.cache-path }}
key: ${{ inputs.cache-key }} key: ${{ inputs.cache-key }}
@@ -105,14 +105,14 @@ jobs:
# Upload Artifacts # Upload Artifacts
# - name: Upload Mac ${{ inputs.arch }} artifacts # - name: Upload Mac ${{ inputs.arch }} artifacts
# if: inputs.os == 'macos-14' # if: inputs.os == 'macos-14'
# uses: actions/upload-artifact@v5 # uses: actions/upload-artifact@v6
# with: # with:
# name: OrcaSlicer_dep_mac_${{ env.date }} # name: OrcaSlicer_dep_mac_${{ env.date }}
# path: ${{ github.workspace }}/deps/build/OrcaSlicer_dep*.tar.gz # path: ${{ github.workspace }}/deps/build/OrcaSlicer_dep*.tar.gz
- name: Upload Windows artifacts - name: Upload Windows artifacts
if: inputs.os == 'windows-latest' if: inputs.os == 'windows-latest'
uses: actions/upload-artifact@v5 uses: actions/upload-artifact@v6
with: with:
name: OrcaSlicer_dep_win64_${{ env.date }} name: OrcaSlicer_dep_win64_${{ env.date }}
path: ${{ github.workspace }}/deps/build/OrcaSlicer_dep*.zip path: ${{ github.workspace }}/deps/build/OrcaSlicer_dep*.zip
@@ -121,7 +121,7 @@ jobs:
if: ${{ ! env.ACT && inputs.os == 'ubuntu-20.04' || inputs.os == 'ubuntu-24.04' }} if: ${{ ! env.ACT && inputs.os == 'ubuntu-20.04' || inputs.os == 'ubuntu-24.04' }}
env: env:
ubuntu-ver: ${{ (inputs.os == 'ubuntu-20.04' && '2004') || (inputs.os == 'ubuntu-24.04' && '2404') || '' }} ubuntu-ver: ${{ (inputs.os == 'ubuntu-20.04' && '2004') || (inputs.os == 'ubuntu-24.04' && '2404') || '' }}
uses: actions/upload-artifact@v5 uses: actions/upload-artifact@v6
with: with:
name: OrcaSlicer_dep_ubuntu_${{ env.ubuntu-ver }}_${{ env.date }} name: OrcaSlicer_dep_ubuntu_${{ env.ubuntu-ver }}_${{ env.date }}
path: ${{ github.workspace }}/deps/build/OrcaSlicer_dep_ubuntu_*.tar.gz path: ${{ github.workspace }}/deps/build/OrcaSlicer_dep_ubuntu_*.tar.gz

View File

@@ -31,7 +31,7 @@ jobs:
lfs: 'true' lfs: 'true'
- name: load cached deps - name: load cached deps
uses: actions/cache@v4 uses: actions/cache@v5
with: with:
path: ${{ inputs.cache-path }} path: ${{ inputs.cache-path }}
key: ${{ inputs.cache-key }} key: ${{ inputs.cache-key }}
@@ -181,14 +181,14 @@ jobs:
- name: Upload artifacts mac - name: Upload artifacts mac
if: inputs.os == 'macos-14' if: inputs.os == 'macos-14'
uses: actions/upload-artifact@v5 uses: actions/upload-artifact@v6
with: with:
name: OrcaSlicer_Mac_universal_${{ env.ver }} name: OrcaSlicer_Mac_universal_${{ env.ver }}
path: ${{ github.workspace }}/OrcaSlicer_Mac_universal_${{ env.ver }}.dmg path: ${{ github.workspace }}/OrcaSlicer_Mac_universal_${{ env.ver }}.dmg
- name: Upload OrcaSlicer_profile_validator DMG mac - name: Upload OrcaSlicer_profile_validator DMG mac
if: inputs.os == 'macos-14' if: inputs.os == 'macos-14'
uses: actions/upload-artifact@v5 uses: actions/upload-artifact@v6
with: with:
name: OrcaSlicer_profile_validator_Mac_universal_DMG_${{ env.ver }} name: OrcaSlicer_profile_validator_Mac_universal_DMG_${{ env.ver }}
path: ${{ github.workspace }}/OrcaSlicer_profile_validator_Mac_universal_${{ env.ver }}.dmg path: ${{ github.workspace }}/OrcaSlicer_profile_validator_Mac_universal_${{ env.ver }}.dmg
@@ -255,28 +255,28 @@ jobs:
- name: Upload artifacts Win zip - name: Upload artifacts Win zip
if: inputs.os == 'windows-latest' if: inputs.os == 'windows-latest'
uses: actions/upload-artifact@v5 uses: actions/upload-artifact@v6
with: with:
name: OrcaSlicer_Windows_${{ env.ver }}_portable name: OrcaSlicer_Windows_${{ env.ver }}_portable
path: ${{ github.workspace }}/build/OrcaSlicer path: ${{ github.workspace }}/build/OrcaSlicer
- name: Upload artifacts Win installer - name: Upload artifacts Win installer
if: inputs.os == 'windows-latest' if: inputs.os == 'windows-latest'
uses: actions/upload-artifact@v5 uses: actions/upload-artifact@v6
with: with:
name: OrcaSlicer_Windows_${{ env.ver }} name: OrcaSlicer_Windows_${{ env.ver }}
path: ${{ github.workspace }}/build/OrcaSlicer*.exe path: ${{ github.workspace }}/build/OrcaSlicer*.exe
- name: Upload artifacts Win PDB - name: Upload artifacts Win PDB
if: inputs.os == 'windows-latest' if: inputs.os == 'windows-latest'
uses: actions/upload-artifact@v5 uses: actions/upload-artifact@v6
with: with:
name: PDB name: PDB
path: ${{ github.workspace }}/build/src/Release/Debug_PDB_${{ env.ver }}_for_developers_only.7z path: ${{ github.workspace }}/build/src/Release/Debug_PDB_${{ env.ver }}_for_developers_only.7z
- name: Upload OrcaSlicer_profile_validator Win - name: Upload OrcaSlicer_profile_validator Win
if: inputs.os == 'windows-latest' if: inputs.os == 'windows-latest'
uses: actions/upload-artifact@v5 uses: actions/upload-artifact@v6
with: with:
name: OrcaSlicer_profile_validator_Windows_${{ env.ver }} name: OrcaSlicer_profile_validator_Windows_${{ env.ver }}
path: ${{ github.workspace }}/build/src/Release/OrcaSlicer_profile_validator.exe path: ${{ github.workspace }}/build/src/Release/OrcaSlicer_profile_validator.exe
@@ -336,7 +336,7 @@ jobs:
# and doesn't preserve file permissions # and doesn't preserve file permissions
- name: Upload Test Artifact - name: Upload Test Artifact
if: inputs.os == 'ubuntu-24.04' if: inputs.os == 'ubuntu-24.04'
uses: actions/upload-artifact@v5 uses: actions/upload-artifact@v6
with: with:
name: ${{ github.sha }}-tests name: ${{ github.sha }}-tests
overwrite: true overwrite: true
@@ -358,7 +358,7 @@ jobs:
env: env:
ubuntu-ver: ${{ (inputs.os == 'ubuntu-20.04' && '2004') || (inputs.os == 'ubuntu-24.04' && '2404') || '' }} ubuntu-ver: ${{ (inputs.os == 'ubuntu-20.04' && '2004') || (inputs.os == 'ubuntu-24.04' && '2404') || '' }}
ubuntu-ver-str: ${{ (inputs.os == 'ubuntu-24.04' && '_Ubuntu2404') || '' }} ubuntu-ver-str: ${{ (inputs.os == 'ubuntu-24.04' && '_Ubuntu2404') || '' }}
uses: actions/upload-artifact@v5 uses: actions/upload-artifact@v6
with: with:
name: OrcaSlicer_Linux_ubuntu_${{ env.ubuntu-ver }}_${{ env.ver }} name: OrcaSlicer_Linux_ubuntu_${{ env.ubuntu-ver }}_${{ env.ver }}
path: './build/OrcaSlicer_Linux_AppImage${{ env.ubuntu-ver-str }}_${{ env.ver }}.AppImage' path: './build/OrcaSlicer_Linux_AppImage${{ env.ubuntu-ver-str }}_${{ env.ver }}.AppImage'
@@ -367,7 +367,7 @@ jobs:
if: ${{ ! env.ACT && inputs.os == 'ubuntu-20.04' || inputs.os == 'ubuntu-24.04' }} if: ${{ ! env.ACT && inputs.os == 'ubuntu-20.04' || inputs.os == 'ubuntu-24.04' }}
env: env:
ubuntu-ver: ${{ (inputs.os == 'ubuntu-20.04' && '2004') || (inputs.os == 'ubuntu-24.04' && '2404') || '' }} ubuntu-ver: ${{ (inputs.os == 'ubuntu-20.04' && '2004') || (inputs.os == 'ubuntu-24.04' && '2404') || '' }}
uses: actions/upload-artifact@v5 uses: actions/upload-artifact@v6
with: with:
name: OrcaSlicer_profile_validator_Linux_ubuntu_${{ env.ubuntu-ver }}_${{ env.ver }} name: OrcaSlicer_profile_validator_Linux_ubuntu_${{ env.ubuntu-ver }}_${{ env.ver }}
path: './build/src/Release/OrcaSlicer_profile_validator' path: './build/src/Release/OrcaSlicer_profile_validator'

78
.github/workflows/doxygen-docs.yml vendored Normal file
View File

@@ -0,0 +1,78 @@
name: Generate Doxygen Documentation
on:
schedule:
- cron: '0 0 * * 1' # Every Monday at midnight UTC
workflow_dispatch: # Manual trigger
concurrency:
group: ${{ github.workflow }}
cancel-in-progress: true
jobs:
build-and-deploy:
name: Build and Deploy Docs
runs-on: ubuntu-latest
timeout-minutes: 60
# Only run on main branch of the main repository
if: github.repository == 'OrcaSlicer/OrcaSlicer' && github.ref == 'refs/heads/main'
permissions:
contents: read
steps:
- uses: thejerrybao/setup-swap-space@v1
with:
swap-space-path: /swapfile
swap-size-gb: 8
remove-existing-swap-files: true
- name: Checkout repository
uses: actions/checkout@v6
- name: Install Doxygen and Graphviz
run: |
set -euo pipefail
sudo apt-get update
sudo apt-get install -y doxygen graphviz
- name: Generate documentation
run: |
set -euo pipefail
# Override DOT_NUM_THREADS to avoid parallel dot race condition bug
sed -i 's/^DOT_NUM_THREADS.*/DOT_NUM_THREADS = 1/' .doxygen
doxygen .doxygen
# Verify documentation was generated
if [ ! -f "internal_docs/index.html" ]; then
echo "Error: Documentation generation failed - index.html not found"
exit 1
fi
- name: Install Rclone
run: |
set -euo pipefail
sudo -v
curl -fsSL https://rclone.org/install.sh | sudo bash
- name: optimize
run: |
set -euo pipefail
rm -f internal_docs/Nodes.xml internal_docs/Tokens.xml
find internal_docs -name "*.map" -type f -delete || true
find internal_docs -name "*.md5" -type f -delete || true
- name: upload
# We configure rclone dynamically using environment variables
run: |
set -euo pipefail
# Remove existing config if it exists to avoid conflicts
rclone config delete cloudflare 2>/dev/null || true
rclone config create cloudflare s3 \
provider Cloudflare \
access_key_id ${{ secrets.R2_ACCESS_KEY_ID }} \
secret_access_key ${{ secrets.R2_SECRET_ACCESS_KEY }} \
endpoint ${{ secrets.R2_ENDPOINT }}
rclone sync internal_docs/ cloudflare:orcaslicer-internals \
--progress \
--transfers 512 \
--checkers 512
echo "Documentation upload completed successfully"

View File

@@ -21,7 +21,7 @@ jobs:
steps: steps:
- name: Cache shellcheck download - name: Cache shellcheck download
id: cache-shellcheck-v0_11 id: cache-shellcheck-v0_11
uses: actions/cache@v4 uses: actions/cache@v5
with: with:
path: ~/shellcheck path: ~/shellcheck
key: ${{ runner.os }}-shellcheck-v0_11 key: ${{ runner.os }}-shellcheck-v0_11

1
.gitignore vendored
View File

@@ -42,3 +42,4 @@ deps_src/build/
test.js test.js
/.cache/ /.cache/
.clangd .clangd
internal_docs/

View File

@@ -1,3 +1,7 @@
if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "4.0")
set(CMAKE_POLICY_VERSION_MINIMUM 3.5 CACHE STRING "" FORCE)
endif()
cmake_minimum_required(VERSION 3.13) cmake_minimum_required(VERSION 3.13)
# Verify that your CMake version is exactly 3.5 series or higher on windows # Verify that your CMake version is exactly 3.5 series or higher on windows
@@ -571,6 +575,7 @@ endif()
if(POLICY CMP0167) if(POLICY CMP0167)
cmake_policy(SET CMP0167 NEW) cmake_policy(SET CMP0167 NEW)
endif() endif()
set(Boost_NO_SYSTEM_PATHS TRUE)
find_package(Boost 1.83.0 REQUIRED COMPONENTS system filesystem thread log log_setup locale regex chrono atomic date_time iostreams program_options nowide) 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_libs INTERFACE)
@@ -688,6 +693,10 @@ find_package(PNG REQUIRED)
set(OpenGL_GL_PREFERENCE "LEGACY") set(OpenGL_GL_PREFERENCE "LEGACY")
find_package(OpenGL REQUIRED) find_package(OpenGL REQUIRED)
if(APPLE AND CMAKE_VERSION VERSION_GREATER_EQUAL "4.0")
set(OPENGL_LIBRARIES "-framework OpenGL" CACHE STRING "OpenGL framework" FORCE)
endif()
set(GLEW_ROOT "${CMAKE_PREFIX_PATH}") set(GLEW_ROOT "${CMAKE_PREFIX_PATH}")
message("GLEW_ROOT: ${GLEW_ROOT}") message("GLEW_ROOT: ${GLEW_ROOT}")
# Find glew or use bundled version # Find glew or use bundled version

View File

@@ -44,19 +44,19 @@ If you come across any of these in search results, please <b>report them</b> as
# Main features # Main features
- **[Advanced Calibration Tools](https://github.com/OrcaSlicer/OrcaSlicer/wiki/Calibration)** - **[Advanced Calibration Tools](https://www.orcaslicer.com/wiki/Calibration)**
Comprehensive suite: temperature towers, flow rate, retraction & more for optimal performance. Comprehensive suite: temperature towers, flow rate, retraction & more for optimal performance.
- **[Precise Wall](https://github.com/OrcaSlicer/OrcaSlicer/wiki/quality_settings_precision#precise-wall) and [Seam Control](https://github.com/OrcaSlicer/OrcaSlicer/wiki/quality_settings_seam)** - **[Precise Wall](https://www.orcaslicer.com/wiki/quality_settings_precision#precise-wall) and [Seam Control](https://www.orcaslicer.com/wiki/quality_settings_seam)**
Adjust outer wall spacing and apply scarf seams to enhance print accuracy. Adjust outer wall spacing and apply scarf seams to enhance print accuracy.
- **[Sandwich Mode](https://github.com/OrcaSlicer/OrcaSlicer/wiki/quality_settings_wall_and_surfaces#innerouterinner) and [Polyholes](https://github.com/OrcaSlicer/OrcaSlicer/wiki/quality_settings_precision#polyholes) Support** - **[Sandwich Mode](https://www.orcaslicer.com/wiki/quality_settings_wall_and_surfaces#innerouterinner) and [Polyholes](https://www.orcaslicer.com/wiki/quality_settings_precision#polyholes) Support**
Use varied infill [patterns](https://github.com/OrcaSlicer/OrcaSlicer/wiki/strength_settings_patterns) and accurate hole shapes for improved clarity. Use varied infill [patterns](https://www.orcaslicer.com/wiki/strength_settings_patterns) and accurate hole shapes for improved clarity.
- **[Overhang](https://github.com/OrcaSlicer/OrcaSlicer/wiki/quality_settings_overhangs) and [Support Optimization](https://github.com/OrcaSlicer/OrcaSlicer/wiki#support-settings)** - **[Overhang](https://www.orcaslicer.com/wiki/quality_settings_overhangs) and [Support Optimization](https://www.orcaslicer.com/wiki#support-settings)**
Modify geometry for printable overhangs with precise support placement. Modify geometry for printable overhangs with precise support placement.
- **[Granular Controls and Customization](https://github.com/OrcaSlicer/OrcaSlicer/wiki#process-settings)** - **[Granular Controls and Customization](https://www.orcaslicer.com/wiki#process-settings)**
Fine-tune print speed, layer height, pressure, and temperature with precision. Fine-tune print speed, layer height, pressure, and temperature with precision.
- **Network Printer Support** - **Network Printer Support**
Seamless integration with Klipper, PrusaLink, and OctoPrint for remote control. Seamless integration with Klipper, PrusaLink, and OctoPrint for remote control.
- **[Mouse Ear Brims](https://github.com/OrcaSlicer/OrcaSlicer/wiki/others_settings_brim) & [Adaptive Bed Mesh](https://github.com/OrcaSlicer/OrcaSlicer/wiki/printer_basic_information_adaptive_bed_mesh)** - **[Mouse Ear Brims](https://www.orcaslicer.com/wiki/others_settings_brim) & [Adaptive Bed Mesh](https://www.orcaslicer.com/wiki/printer_basic_information_adaptive_bed_mesh)**
Automatic brims and adaptive mesh calibration ensure consistent adhesion. Automatic brims and adaptive mesh calibration ensure consistent adhesion.
- **User-Friendly Interface** - **User-Friendly Interface**
Intuitive drag-and-drop design with pre-made profiles for popular printers. Intuitive drag-and-drop design with pre-made profiles for popular printers.
@@ -68,10 +68,10 @@ If you come across any of these in search results, please <b>report them</b> as
# Wiki # Wiki
The [wiki](https://github.com/OrcaSlicer/OrcaSlicer/wiki) aims to provide a detailed explanation of the slicer settings, including how to maximize their use and how to calibrate and set up your printer. The [wiki](https://www.orcaslicer.com/wiki) aims to provide a detailed explanation of the slicer settings, including how to maximize their use and how to calibrate and set up your printer.
- **[Access the wiki here](https://github.com/OrcaSlicer/OrcaSlicer/wiki)** - **[Access the wiki here](https://www.orcaslicer.com/wiki)**
- **[Contribute to the wiki](https://github.com/OrcaSlicer/OrcaSlicer/wiki/How-to-wiki)** - **[Contribute to the wiki](https://www.orcaslicer.com/wiki/How-to-wiki)**
# Download # Download
@@ -144,7 +144,7 @@ winget install --id=SoftFever.OrcaSlicer -e
# How to Compile # How to Compile
All updated build instructions for Windows, macOS, and Linux are now available on the official [OrcaSlicer Wiki - How to build](https://github.com/OrcaSlicer/OrcaSlicer/wiki/How-to-build) page. All updated build instructions for Windows, macOS, and Linux are now available on the official [OrcaSlicer Wiki - How to build](https://www.orcaslicer.com/wiki/How-to-build) page.
Please refer to the wiki to ensure you're following the latest and most accurate steps for your platform. Please refer to the wiki to ensure you're following the latest and most accurate steps for your platform.

View File

@@ -3,7 +3,7 @@
set -e set -e
set -o pipefail set -o pipefail
while getopts ":dpa:snt:xbc:1h" opt; do while getopts ":dpa:snt:xbc:1Th" opt; do
case "${opt}" in case "${opt}" in
d ) d )
export BUILD_TARGET="deps" export BUILD_TARGET="deps"
@@ -37,6 +37,9 @@ while getopts ":dpa:snt:xbc:1h" opt; do
1 ) 1 )
export CMAKE_BUILD_PARALLEL_LEVEL=1 export CMAKE_BUILD_PARALLEL_LEVEL=1
;; ;;
T )
export BUILD_TESTS="1"
;;
h ) echo "Usage: ./build_release_macos.sh [-d]" h ) echo "Usage: ./build_release_macos.sh [-d]"
echo " -d: Build deps only" echo " -d: Build deps only"
echo " -a: Set ARCHITECTURE (arm64 or x86_64 or universal)" echo " -a: Set ARCHITECTURE (arm64 or x86_64 or universal)"
@@ -47,6 +50,7 @@ while getopts ":dpa:snt:xbc:1h" opt; do
echo " -b: Build without reconfiguring CMake" echo " -b: Build without reconfiguring CMake"
echo " -c: Set CMake build configuration, default is Release" echo " -c: Set CMake build configuration, default is Release"
echo " -1: Use single job for building" echo " -1: Use single job for building"
echo " -T: Build and run tests"
exit 0 exit 0
;; ;;
* ) * )
@@ -85,6 +89,15 @@ if [ -z "$OSX_DEPLOYMENT_TARGET" ]; then
export OSX_DEPLOYMENT_TARGET="11.3" export OSX_DEPLOYMENT_TARGET="11.3"
fi fi
CMAKE_VERSION=$(cmake --version | head -1 | sed 's/[^0-9]*\([0-9]*\).*/\1/')
if [ "$CMAKE_VERSION" -ge 4 ] 2>/dev/null; then
export CMAKE_POLICY_VERSION_MINIMUM=3.5
export CMAKE_POLICY_COMPAT="-DCMAKE_POLICY_VERSION_MINIMUM=3.5"
echo "Detected CMake 4.x, adding compatibility flag (env + cmake arg)"
else
export CMAKE_POLICY_COMPAT=""
fi
echo "Build params:" echo "Build params:"
echo " - ARCH: $ARCH" echo " - ARCH: $ARCH"
echo " - BUILD_CONFIG: $BUILD_CONFIG" echo " - BUILD_CONFIG: $BUILD_CONFIG"
@@ -133,7 +146,8 @@ function build_deps() {
-G "${DEPS_CMAKE_GENERATOR}" \ -G "${DEPS_CMAKE_GENERATOR}" \
-DCMAKE_BUILD_TYPE="$BUILD_CONFIG" \ -DCMAKE_BUILD_TYPE="$BUILD_CONFIG" \
-DCMAKE_OSX_ARCHITECTURES:STRING="${_ARCH}" \ -DCMAKE_OSX_ARCHITECTURES:STRING="${_ARCH}" \
-DCMAKE_OSX_DEPLOYMENT_TARGET="${OSX_DEPLOYMENT_TARGET}" -DCMAKE_OSX_DEPLOYMENT_TARGET="${OSX_DEPLOYMENT_TARGET}" \
${CMAKE_POLICY_COMPAT}
fi fi
cmake --build . --config "$BUILD_CONFIG" --target deps cmake --build . --config "$BUILD_CONFIG" --target deps
) )
@@ -170,13 +184,24 @@ function build_slicer() {
-G "${SLICER_CMAKE_GENERATOR}" \ -G "${SLICER_CMAKE_GENERATOR}" \
-DORCA_TOOLS=ON \ -DORCA_TOOLS=ON \
${ORCA_UPDATER_SIG_KEY:+-DORCA_UPDATER_SIG_KEY="$ORCA_UPDATER_SIG_KEY"} \ ${ORCA_UPDATER_SIG_KEY:+-DORCA_UPDATER_SIG_KEY="$ORCA_UPDATER_SIG_KEY"} \
${BUILD_TESTS:+-DBUILD_TESTS=ON} \
-DCMAKE_BUILD_TYPE="$BUILD_CONFIG" \ -DCMAKE_BUILD_TYPE="$BUILD_CONFIG" \
-DCMAKE_OSX_ARCHITECTURES="${_ARCH}" \ -DCMAKE_OSX_ARCHITECTURES="${_ARCH}" \
-DCMAKE_OSX_DEPLOYMENT_TARGET="${OSX_DEPLOYMENT_TARGET}" -DCMAKE_OSX_DEPLOYMENT_TARGET="${OSX_DEPLOYMENT_TARGET}" \
${CMAKE_POLICY_COMPAT}
fi fi
cmake --build . --config "$BUILD_CONFIG" --target "$SLICER_BUILD_TARGET" cmake --build . --config "$BUILD_CONFIG" --target "$SLICER_BUILD_TARGET"
) )
if [ "1." == "$BUILD_TESTS". ]; then
echo "Running tests for $_ARCH..."
(
set -x
cd "$PROJECT_BUILD_DIR"
ctest --build-config "$BUILD_CONFIG" --output-on-failure
)
fi
echo "Verify localization with gettext..." echo "Verify localization with gettext..."
( (
cd "$PROJECT_DIR" cd "$PROJECT_DIR"

View File

@@ -223,9 +223,14 @@ if(NOT TARGET GLEW::glew AND NOT GLEW_USE_STATIC_LIBS)
PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${GLEW_INCLUDE_DIRS}") PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${GLEW_INCLUDE_DIRS}")
if(APPLE) if(APPLE)
if(CMAKE_VERSION VERSION_GREATER_EQUAL "4.0")
set_target_properties(GLEW::glew
PROPERTIES INTERFACE_LINK_LIBRARIES "-framework OpenGL")
else()
set_target_properties(GLEW::glew set_target_properties(GLEW::glew
PROPERTIES INTERFACE_LINK_LIBRARIES OpenGL::GL) PROPERTIES INTERFACE_LINK_LIBRARIES OpenGL::GL)
endif() endif()
endif()
if(GLEW_SHARED_LIBRARY_RELEASE) if(GLEW_SHARED_LIBRARY_RELEASE)
set_property(TARGET GLEW::glew set_property(TARGET GLEW::glew
@@ -258,9 +263,14 @@ elseif(NOT TARGET GLEW::glew_s AND GLEW_USE_STATIC_LIBS)
set_target_properties(GLEW::glew_s PROPERTIES INTERFACE_COMPILE_DEFINITIONS GLEW_STATIC) set_target_properties(GLEW::glew_s PROPERTIES INTERFACE_COMPILE_DEFINITIONS GLEW_STATIC)
if(APPLE) if(APPLE)
if(CMAKE_VERSION VERSION_GREATER_EQUAL "4.0")
set_target_properties(GLEW::glew_s
PROPERTIES INTERFACE_LINK_LIBRARIES "-framework OpenGL")
else()
set_target_properties(GLEW::glew_s set_target_properties(GLEW::glew_s
PROPERTIES INTERFACE_LINK_LIBRARIES OpenGL::GL) PROPERTIES INTERFACE_LINK_LIBRARIES OpenGL::GL)
endif() endif()
endif()
if(GLEW_STATIC_LIBRARY_RELEASE) if(GLEW_STATIC_LIBRARY_RELEASE)
set_property(TARGET GLEW::glew_s set_property(TARGET GLEW::glew_s
@@ -292,9 +302,14 @@ if(NOT TARGET GLEW::GLEW)
PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${GLEW_INCLUDE_DIRS}") PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${GLEW_INCLUDE_DIRS}")
if(APPLE) if(APPLE)
if(CMAKE_VERSION VERSION_GREATER_EQUAL "4.0")
set_target_properties(GLEW::GLEW
PROPERTIES INTERFACE_LINK_LIBRARIES "-framework OpenGL")
else()
set_target_properties(GLEW::GLEW set_target_properties(GLEW::GLEW
PROPERTIES INTERFACE_LINK_LIBRARIES OpenGL::GL) PROPERTIES INTERFACE_LINK_LIBRARIES OpenGL::GL)
endif() endif()
endif()
if(TARGET GLEW::glew) if(TARGET GLEW::glew)
if(GLEW_SHARED_LIBRARY_RELEASE) if(GLEW_SHARED_LIBRARY_RELEASE)

View File

@@ -1,59 +0,0 @@
--- a/BGL/include/CGAL/boost/graph/iterator.h 2022-10-07 19:04:41 UTC
+++ b/BGL/include/CGAL/boost/graph/iterator.h
@@ -213,18 +213,7 @@ class Halfedge_around_source_iterator { (public)
{}
#ifndef DOXYGEN_RUNNING
- // design patter: "safe bool"
- // will be replaced by explicit operator bool with C++11
- typedef void (Halfedge_around_source_iterator::*bool_type)() const;
- void this_type_does_not_support_comparisons() const {}
-
- operator bool_type() const
- {
- return (! (this->base() == nullptr)) ?
- &Halfedge_around_source_iterator::this_type_does_not_support_comparisons : 0;
- }
-
bool operator==( const Self& i) const {
CGAL_assertion( anchor == anchor);
return ( g == i.g) && ( pos == i.pos) && ( winding == i.winding);
@@ -313,18 +302,7 @@ class Halfedge_around_target_iterator { (public)
{}
#ifndef DOXYGEN_RUNNING
- // design patter: "safe bool"
- // will be replaced by explicit operator bool with C++11
- typedef void (Halfedge_around_target_iterator::*bool_type)() const;
- void this_type_does_not_support_comparisons() const {}
-
- operator bool_type() const
- {
- return (! (this->base() == nullptr)) ?
- &Halfedge_around_target_iterator::this_type_does_not_support_comparisons : 0;
- }
-
bool operator==( const Self& i) const {
CGAL_assertion( anchor == anchor);
return ( g == i.g) && ( pos == i.pos) && ( winding == i.winding);
@@ -411,18 +389,6 @@ class Halfedge_around_face_iterator { (public)
const value_type& operator * ( ) const { return pos; }
pointer operator -> ( ) { return &pos; }
const value_type* operator -> ( ) const { return &pos; }
-
- // design patter: "safe bool"
- // will be replaced by explicit operator bool with C++11
- typedef void (Halfedge_around_face_iterator::*bool_type)() const;
-
- void this_type_does_not_support_comparisons() const {}
-
- operator bool_type() const
- {
- return (! (this->base() == nullptr)) ?
- &Halfedge_around_face_iterator::this_type_does_not_support_comparisons : 0;
- }
bool operator==( const Self& i) const {
CGAL_assertion( anchor == anchor);

View File

@@ -5,11 +5,10 @@ endif ()
orcaslicer_add_cmake_project( orcaslicer_add_cmake_project(
CGAL CGAL
# GIT_REPOSITORY https://github.com/CGAL/cgal.git # GIT_REPOSITORY https://github.com/CGAL/cgal.git
# GIT_TAG bec70a6d52d8aacb0b3d82a7b4edc3caa899184b # releases/CGAL-5.0 # GIT_TAG 3654f780ae0c64675cabaef0e5ddaf904c48b4b7 # releases/CGAL-5.6.3
# For whatever reason, this keeps downloading forever (repeats downloads if finished) # For whatever reason, this keeps downloading forever (repeats downloads if finished)
URL https://github.com/CGAL/cgal/archive/refs/tags/v5.4.zip URL https://github.com/CGAL/cgal/releases/download/v5.6.3/CGAL-5.6.3.zip
URL_HASH SHA256=d7605e0a5a5ca17da7547592f6f6e4a59430a0bc861948974254d0de43eab4c0 URL_HASH SHA256=5d577acb4a9918ccb960491482da7a3838f8d363aff47e14d703f19fd84733d4
PATCH_COMMAND git apply ${CGAL_DIRECTORY_FLAG} --verbose --ignore-space-change --whitespace=fix ${CMAKE_CURRENT_LIST_DIR}/0001-clang19.patch
DEPENDS dep_Boost dep_GMP dep_MPFR DEPENDS dep_Boost dep_GMP dep_MPFR
) )

6
deps/CMakeLists.txt vendored
View File

@@ -1,3 +1,7 @@
if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "4.0")
set(CMAKE_POLICY_VERSION_MINIMUM 3.5 CACHE STRING "" FORCE)
endif()
# #
# This CMake project downloads, configures and builds OrcaSlicer dependencies on Unix and Windows. # This CMake project downloads, configures and builds OrcaSlicer dependencies on Unix and Windows.
# #
@@ -177,6 +181,7 @@ if (NOT IS_CROSS_COMPILE OR NOT APPLE)
DOWNLOAD_DIR ${DEP_DOWNLOAD_DIR}/${projectname} DOWNLOAD_DIR ${DEP_DOWNLOAD_DIR}/${projectname}
${_gen} ${_gen}
CMAKE_ARGS CMAKE_ARGS
-DCMAKE_POLICY_VERSION_MINIMUM=3.5
-DCMAKE_INSTALL_PREFIX:STRING=${DESTDIR} -DCMAKE_INSTALL_PREFIX:STRING=${DESTDIR}
-DCMAKE_MODULE_PATH:STRING=${PROJECT_SOURCE_DIR}/../cmake/modules -DCMAKE_MODULE_PATH:STRING=${PROJECT_SOURCE_DIR}/../cmake/modules
-DCMAKE_PREFIX_PATH:STRING=${DESTDIR} -DCMAKE_PREFIX_PATH:STRING=${DESTDIR}
@@ -221,6 +226,7 @@ else()
DOWNLOAD_DIR ${DEP_DOWNLOAD_DIR}/${projectname} DOWNLOAD_DIR ${DEP_DOWNLOAD_DIR}/${projectname}
${_gen} ${_gen}
CMAKE_ARGS CMAKE_ARGS
-DCMAKE_POLICY_VERSION_MINIMUM=3.5
-DCMAKE_INSTALL_PREFIX:STRING=${DESTDIR} -DCMAKE_INSTALL_PREFIX:STRING=${DESTDIR}
-DCMAKE_PREFIX_PATH:STRING=${DESTDIR} -DCMAKE_PREFIX_PATH:STRING=${DESTDIR}
-DBUILD_SHARED_LIBS:BOOL=OFF -DBUILD_SHARED_LIBS:BOOL=OFF

View File

@@ -1,7 +1,7 @@
include(GNUInstallDirs) include(GNUInstallDirs)
orcaslicer_add_cmake_project(Qhull orcaslicer_add_cmake_project(Qhull
URL "https://github.com/qhull/qhull/archive/v8.0.1.zip" URL "https://github.com/qhull/qhull/archive/v8.0.2.zip"
URL_HASH SHA256=5287f5edd6a0372588f5d6640799086a4033d89d19711023ef8229dd9301d69b URL_HASH SHA256=a378e9a39e718e289102c20d45632f873bfdc58a7a5f924246ea4b176e185f1e
CMAKE_ARGS CMAKE_ARGS
-DINCLUDE_INSTALL_DIR=${CMAKE_INSTALL_INCLUDEDIR} -DINCLUDE_INSTALL_DIR=${CMAKE_INSTALL_INCLUDEDIR}
) )

View File

@@ -24,6 +24,14 @@ else ()
set(_wx_edge "-DwxUSE_WEBVIEW_EDGE=OFF") set(_wx_edge "-DwxUSE_WEBVIEW_EDGE=OFF")
endif () endif ()
set(_wx_opengl_override "")
if(APPLE AND CMAKE_VERSION VERSION_GREATER_EQUAL "4.0")
set(_wx_opengl_override
-DOPENGL_gl_LIBRARY="-framework OpenGL"
-DOPENGL_glu_LIBRARY="-framework OpenGL"
)
endif()
orcaslicer_add_cmake_project( orcaslicer_add_cmake_project(
wxWidgets wxWidgets
GIT_REPOSITORY "https://github.com/SoftFever/Orca-deps-wxWidgets" GIT_REPOSITORY "https://github.com/SoftFever/Orca-deps-wxWidgets"
@@ -31,6 +39,7 @@ orcaslicer_add_cmake_project(
DEPENDS ${PNG_PKG} ${ZLIB_PKG} ${EXPAT_PKG} ${JPEG_PKG} DEPENDS ${PNG_PKG} ${ZLIB_PKG} ${EXPAT_PKG} ${JPEG_PKG}
${_wx_flatpak_patch} ${_wx_flatpak_patch}
CMAKE_ARGS CMAKE_ARGS
${_wx_opengl_override}
-DwxBUILD_PRECOMP=ON -DwxBUILD_PRECOMP=ON
${_wx_toolkit} ${_wx_toolkit}
"-DCMAKE_DEBUG_POSTFIX:STRING=${_wx_debug_postfix}" "-DCMAKE_DEBUG_POSTFIX:STRING=${_wx_debug_postfix}"

View File

@@ -10,13 +10,13 @@ add_subdirectory(earcut)
add_subdirectory(fast_float) add_subdirectory(fast_float)
add_subdirectory(nanosvg) add_subdirectory(nanosvg)
add_subdirectory(nlohmann) add_subdirectory(nlohmann)
add_subdirectory(spline) # Header-only spline library
add_subdirectory(stb_dxt) # Header-only STB DXT compression library add_subdirectory(stb_dxt) # Header-only STB DXT compression library
# Static libraries # Static libraries
add_subdirectory(Shiny) add_subdirectory(Shiny)
add_subdirectory(admesh) add_subdirectory(admesh)
add_subdirectory(clipper) add_subdirectory(clipper)
add_subdirectory(clipper2)
add_subdirectory(expat) add_subdirectory(expat)
add_subdirectory(glu-libtess) add_subdirectory(glu-libtess)
add_subdirectory(hidapi) add_subdirectory(hidapi)

View File

@@ -24,18 +24,7 @@ target_link_libraries(your_target PRIVATE semver::semver)
target_link_libraries(your_target PRIVATE hints) target_link_libraries(your_target PRIVATE hints)
``` ```
### 3. **spline** (Interface Library) ### 3. **stb_dxt** (Interface Library)
- **Type**: Interface library (header-only)
- **Target**: `spline` or `spline::spline`
- **Headers**: `spline.h`
- **Usage**:
```cmake
target_link_libraries(your_target PRIVATE spline)
# or
target_link_libraries(your_target PRIVATE spline::spline)
```
### 4. **stb_dxt** (Interface Library)
- **Type**: Interface library (header-only) - **Type**: Interface library (header-only)
- **Target**: `stb_dxt` or `stb_dxt::stb_dxt` - **Target**: `stb_dxt` or `stb_dxt::stb_dxt`
- **Headers**: `stb_dxt.h` - **Headers**: `stb_dxt.h`
@@ -56,7 +45,6 @@ add_executable(my_app main.cpp)
target_link_libraries(my_app target_link_libraries(my_app
PRIVATE PRIVATE
semver::semver # For version parsing semver::semver # For version parsing
spline::spline # For spline interpolation
stb_dxt::stb_dxt # For DXT texture compression stb_dxt::stb_dxt # For DXT texture compression
hints # For hints functionality hints # For hints functionality
) )
@@ -67,9 +55,6 @@ target_link_libraries(my_app
// For semver // For semver
#include <semver.h> #include <semver.h>
// For spline
#include <spline.h>
// For stb_dxt // For stb_dxt
#include <stb_dxt.h> #include <stb_dxt.h>
@@ -100,7 +85,6 @@ target_link_libraries(mycomponent
PUBLIC PUBLIC
semver::semver # Version handling is part of public API semver::semver # Version handling is part of public API
PRIVATE PRIVATE
spline::spline # Used internally for interpolation
stb_dxt::stb_dxt # Used internally for texture compression stb_dxt::stb_dxt # Used internally for texture compression
) )

View File

@@ -1,37 +0,0 @@
cmake_minimum_required(VERSION 3.13)
project(spline)
# Create interface library for spline (header-only library)
add_library(spline INTERFACE)
# Set include directories for the interface library
target_include_directories(spline SYSTEM
INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
$<INSTALL_INTERFACE:include>
)
# Add compile features
target_compile_features(spline INTERFACE cxx_std_11)
# Create an alias for consistent naming
add_library(spline::spline ALIAS spline)
# Install headers if needed
install(FILES
spline.h
DESTINATION include/spline
)
# Install the interface library
install(TARGETS spline
EXPORT splineTargets
INCLUDES DESTINATION include
)
# Export the targets
install(EXPORT splineTargets
FILE splineTargets.cmake
NAMESPACE spline::
DESTINATION lib/cmake/spline
)

View File

@@ -1,944 +0,0 @@
/*
* spline.h
*
* simple cubic spline interpolation library without external
* dependencies
*
* ---------------------------------------------------------------------
* Copyright (C) 2011, 2014, 2016, 2021 Tino Kluge (ttk448 at gmail.com)
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
* ---------------------------------------------------------------------
*
*/
#ifndef TK_SPLINE_H
#define TK_SPLINE_H
#include <cstdio>
#include <cassert>
#include <cmath>
#include <vector>
#include <algorithm>
#ifdef HAVE_SSTREAM
#include <sstream>
#include <string>
#endif // HAVE_SSTREAM
// not ideal but disable unused-function warnings
// (we get them because we have implementations in the header file,
// and this is because we want to be able to quickly separate them
// into a cpp file if necessary)
#if !defined(_MSC_VER)
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-function"
#endif
namespace tk
{
// spline interpolation
class spline
{
public:
// spline types
enum spline_type {
linear = 10, // linear interpolation
cspline = 30, // cubic splines (classical C^2)
cspline_hermite = 31 // cubic hermite splines (local, only C^1)
};
// boundary condition type for the spline end-points
enum bd_type {
first_deriv = 1,
second_deriv = 2,
not_a_knot = 3
};
protected:
std::vector<double> m_x,m_y; // x,y coordinates of points
// interpolation parameters
// f(x) = a_i + b_i*(x-x_i) + c_i*(x-x_i)^2 + d_i*(x-x_i)^3
// where a_i = y_i, or else it won't go through grid points
std::vector<double> m_b,m_c,m_d; // spline coefficients
double m_c0; // for left extrapolation
spline_type m_type;
bd_type m_left, m_right;
double m_left_value, m_right_value;
bool m_made_monotonic;
void set_coeffs_from_b(); // calculate c_i, d_i from b_i
size_t find_closest(double x) const; // closest idx so that m_x[idx]<=x
public:
// default constructor: set boundary condition to be zero curvature
// at both ends, i.e. natural splines
spline(): m_type(cspline),
m_left(second_deriv), m_right(second_deriv),
m_left_value(0.0), m_right_value(0.0), m_made_monotonic(false)
{
;
}
spline(const std::vector<double>& X, const std::vector<double>& Y,
spline_type type = cspline,
bool make_monotonic = false,
bd_type left = second_deriv, double left_value = 0.0,
bd_type right = second_deriv, double right_value = 0.0
):
m_type(type),
m_left(left), m_right(right),
m_left_value(left_value), m_right_value(right_value),
m_made_monotonic(false) // false correct here: make_monotonic() sets it
{
this->set_points(X,Y,m_type);
if(make_monotonic) {
this->make_monotonic();
}
}
// modify boundary conditions: if called it must be before set_points()
void set_boundary(bd_type left, double left_value,
bd_type right, double right_value);
// set all data points (cubic_spline=false means linear interpolation)
void set_points(const std::vector<double>& x,
const std::vector<double>& y,
spline_type type=cspline);
// adjust coefficients so that the spline becomes piecewise monotonic
// where possible
// this is done by adjusting slopes at grid points by a non-negative
// factor and this will break C^2
// this can also break boundary conditions if adjustments need to
// be made at the boundary points
// returns false if no adjustments have been made, true otherwise
bool make_monotonic();
// evaluates the spline at point x
double operator() (double x) const;
double deriv(int order, double x) const;
// solves for all x so that: spline(x) = y
std::vector<double> solve(double y, bool ignore_extrapolation=true) const;
// returns the input data points
std::vector<double> get_x() const { return m_x; }
std::vector<double> get_y() const { return m_y; }
double get_x_min() const { assert(!m_x.empty()); return m_x.front(); }
double get_x_max() const { assert(!m_x.empty()); return m_x.back(); }
#ifdef HAVE_SSTREAM
// spline info string, i.e. spline type, boundary conditions etc.
std::string info() const;
#endif // HAVE_SSTREAM
};
namespace internal
{
// band matrix solver
class band_matrix
{
private:
std::vector< std::vector<double> > m_upper; // upper band
std::vector< std::vector<double> > m_lower; // lower band
public:
band_matrix() {}; // constructor
band_matrix(int dim, int n_u, int n_l); // constructor
~band_matrix() {}; // destructor
void resize(int dim, int n_u, int n_l); // init with dim,n_u,n_l
int dim() const; // matrix dimension
int num_upper() const
{
return (int)m_upper.size()-1;
}
int num_lower() const
{
return (int)m_lower.size()-1;
}
// access operator
double & operator () (int i, int j); // write
double operator () (int i, int j) const; // read
// we can store an additional diagonal (in m_lower)
double& saved_diag(int i);
double saved_diag(int i) const;
void lu_decompose();
std::vector<double> r_solve(const std::vector<double>& b) const;
std::vector<double> l_solve(const std::vector<double>& b) const;
std::vector<double> lu_solve(const std::vector<double>& b,
bool is_lu_decomposed=false);
};
double get_eps();
std::vector<double> solve_cubic(double a, double b, double c, double d,
int newton_iter=0);
} // namespace internal
// ---------------------------------------------------------------------
// implementation part, which could be separated into a cpp file
// ---------------------------------------------------------------------
// spline implementation
// -----------------------
void spline::set_boundary(spline::bd_type left, double left_value,
spline::bd_type right, double right_value)
{
assert(m_x.size()==0); // set_points() must not have happened yet
m_left=left;
m_right=right;
m_left_value=left_value;
m_right_value=right_value;
}
void spline::set_coeffs_from_b()
{
assert(m_x.size()==m_y.size());
assert(m_x.size()==m_b.size());
assert(m_x.size()>2);
size_t n=m_b.size();
if(m_c.size()!=n)
m_c.resize(n);
if(m_d.size()!=n)
m_d.resize(n);
for(size_t i=0; i<n-1; i++) {
const double h = m_x[i+1]-m_x[i];
// from continuity and differentiability condition
m_c[i] = ( 3.0*(m_y[i+1]-m_y[i])/h - (2.0*m_b[i]+m_b[i+1]) ) / h;
// from differentiability condition
m_d[i] = ( (m_b[i+1]-m_b[i])/(3.0*h) - 2.0/3.0*m_c[i] ) / h;
}
// for left extrapolation coefficients
m_c0 = (m_left==first_deriv) ? 0.0 : m_c[0];
}
void spline::set_points(const std::vector<double>& x,
const std::vector<double>& y,
spline_type type)
{
assert(x.size()==y.size());
assert(x.size()>=3);
// not-a-knot with 3 points has many solutions
if(m_left==not_a_knot || m_right==not_a_knot)
assert(x.size()>=4);
m_type=type;
m_made_monotonic=false;
m_x=x;
m_y=y;
int n = (int) x.size();
// check strict monotonicity of input vector x
for(int i=0; i<n-1; i++) {
assert(m_x[i]<m_x[i+1]);
}
if(type==linear) {
// linear interpolation
m_d.resize(n);
m_c.resize(n);
m_b.resize(n);
for(int i=0; i<n-1; i++) {
m_d[i]=0.0;
m_c[i]=0.0;
m_b[i]=(m_y[i+1]-m_y[i])/(m_x[i+1]-m_x[i]);
}
// ignore boundary conditions, set slope equal to the last segment
m_b[n-1]=m_b[n-2];
m_c[n-1]=0.0;
m_d[n-1]=0.0;
} else if(type==cspline) {
// classical cubic splines which are C^2 (twice cont differentiable)
// this requires solving an equation system
// setting up the matrix and right hand side of the equation system
// for the parameters b[]
int n_upper = (m_left == spline::not_a_knot) ? 2 : 1;
int n_lower = (m_right == spline::not_a_knot) ? 2 : 1;
internal::band_matrix A(n,n_upper,n_lower);
std::vector<double> rhs(n);
for(int i=1; i<n-1; i++) {
A(i,i-1)=1.0/3.0*(x[i]-x[i-1]);
A(i,i)=2.0/3.0*(x[i+1]-x[i-1]);
A(i,i+1)=1.0/3.0*(x[i+1]-x[i]);
rhs[i]=(y[i+1]-y[i])/(x[i+1]-x[i]) - (y[i]-y[i-1])/(x[i]-x[i-1]);
}
// boundary conditions
if(m_left == spline::second_deriv) {
// 2*c[0] = f''
A(0,0)=2.0;
A(0,1)=0.0;
rhs[0]=m_left_value;
} else if(m_left == spline::first_deriv) {
// b[0] = f', needs to be re-expressed in terms of c:
// (2c[0]+c[1])(x[1]-x[0]) = 3 ((y[1]-y[0])/(x[1]-x[0]) - f')
A(0,0)=2.0*(x[1]-x[0]);
A(0,1)=1.0*(x[1]-x[0]);
rhs[0]=3.0*((y[1]-y[0])/(x[1]-x[0])-m_left_value);
} else if(m_left == spline::not_a_knot) {
// f'''(x[1]) exists, i.e. d[0]=d[1], or re-expressed in c:
// -h1*c[0] + (h0+h1)*c[1] - h0*c[2] = 0
A(0,0) = -(x[2]-x[1]);
A(0,1) = x[2]-x[0];
A(0,2) = -(x[1]-x[0]);
rhs[0] = 0.0;
} else {
assert(false);
}
if(m_right == spline::second_deriv) {
// 2*c[n-1] = f''
A(n-1,n-1)=2.0;
A(n-1,n-2)=0.0;
rhs[n-1]=m_right_value;
} else if(m_right == spline::first_deriv) {
// b[n-1] = f', needs to be re-expressed in terms of c:
// (c[n-2]+2c[n-1])(x[n-1]-x[n-2])
// = 3 (f' - (y[n-1]-y[n-2])/(x[n-1]-x[n-2]))
A(n-1,n-1)=2.0*(x[n-1]-x[n-2]);
A(n-1,n-2)=1.0*(x[n-1]-x[n-2]);
rhs[n-1]=3.0*(m_right_value-(y[n-1]-y[n-2])/(x[n-1]-x[n-2]));
} else if(m_right == spline::not_a_knot) {
// f'''(x[n-2]) exists, i.e. d[n-3]=d[n-2], or re-expressed in c:
// -h_{n-2}*c[n-3] + (h_{n-3}+h_{n-2})*c[n-2] - h_{n-3}*c[n-1] = 0
A(n-1,n-3) = -(x[n-1]-x[n-2]);
A(n-1,n-2) = x[n-1]-x[n-3];
A(n-1,n-1) = -(x[n-2]-x[n-3]);
rhs[0] = 0.0;
} else {
assert(false);
}
// solve the equation system to obtain the parameters c[]
m_c=A.lu_solve(rhs);
// calculate parameters b[] and d[] based on c[]
m_d.resize(n);
m_b.resize(n);
for(int i=0; i<n-1; i++) {
m_d[i]=1.0/3.0*(m_c[i+1]-m_c[i])/(x[i+1]-x[i]);
m_b[i]=(y[i+1]-y[i])/(x[i+1]-x[i])
- 1.0/3.0*(2.0*m_c[i]+m_c[i+1])*(x[i+1]-x[i]);
}
// for the right extrapolation coefficients (zero cubic term)
// f_{n-1}(x) = y_{n-1} + b*(x-x_{n-1}) + c*(x-x_{n-1})^2
double h=x[n-1]-x[n-2];
// m_c[n-1] is determined by the boundary condition
m_d[n-1]=0.0;
m_b[n-1]=3.0*m_d[n-2]*h*h+2.0*m_c[n-2]*h+m_b[n-2]; // = f'_{n-2}(x_{n-1})
if(m_right==first_deriv)
m_c[n-1]=0.0; // force linear extrapolation
} else if(type==cspline_hermite) {
// hermite cubic splines which are C^1 (cont. differentiable)
// and derivatives are specified on each grid point
// (here we use 3-point finite differences)
m_b.resize(n);
m_c.resize(n);
m_d.resize(n);
// set b to match 1st order derivative finite difference
for(int i=1; i<n-1; i++) {
const double h = m_x[i+1]-m_x[i];
const double hl = m_x[i]-m_x[i-1];
m_b[i] = -h/(hl*(hl+h))*m_y[i-1] + (h-hl)/(hl*h)*m_y[i]
+ hl/(h*(hl+h))*m_y[i+1];
}
// boundary conditions determine b[0] and b[n-1]
if(m_left==first_deriv) {
m_b[0]=m_left_value;
} else if(m_left==second_deriv) {
const double h = m_x[1]-m_x[0];
m_b[0]=0.5*(-m_b[1]-0.5*m_left_value*h+3.0*(m_y[1]-m_y[0])/h);
} else if(m_left == not_a_knot) {
// f''' continuous at x[1]
const double h0 = m_x[1]-m_x[0];
const double h1 = m_x[2]-m_x[1];
m_b[0]= -m_b[1] + 2.0*(m_y[1]-m_y[0])/h0
+ h0*h0/(h1*h1)*(m_b[1]+m_b[2]-2.0*(m_y[2]-m_y[1])/h1);
} else {
assert(false);
}
if(m_right==first_deriv) {
m_b[n-1]=m_right_value;
m_c[n-1]=0.0;
} else if(m_right==second_deriv) {
const double h = m_x[n-1]-m_x[n-2];
m_b[n-1]=0.5*(-m_b[n-2]+0.5*m_right_value*h+3.0*(m_y[n-1]-m_y[n-2])/h);
m_c[n-1]=0.5*m_right_value;
} else if(m_right == not_a_knot) {
// f''' continuous at x[n-2]
const double h0 = m_x[n-2]-m_x[n-3];
const double h1 = m_x[n-1]-m_x[n-2];
m_b[n-1]= -m_b[n-2] + 2.0*(m_y[n-1]-m_y[n-2])/h1 + h1*h1/(h0*h0)
*(m_b[n-3]+m_b[n-2]-2.0*(m_y[n-2]-m_y[n-3])/h0);
// f'' continuous at x[n-1]: c[n-1] = 3*d[n-2]*h[n-2] + c[n-1]
m_c[n-1]=(m_b[n-2]+2.0*m_b[n-1])/h1-3.0*(m_y[n-1]-m_y[n-2])/(h1*h1);
} else {
assert(false);
}
m_d[n-1]=0.0;
// parameters c and d are determined by continuity and differentiability
set_coeffs_from_b();
} else {
assert(false);
}
// for left extrapolation coefficients
m_c0 = (m_left==first_deriv) ? 0.0 : m_c[0];
}
bool spline::make_monotonic()
{
assert(m_x.size()==m_y.size());
assert(m_x.size()==m_b.size());
assert(m_x.size()>2);
bool modified = false;
const int n=(int)m_x.size();
// make sure: input data monotonic increasing --> b_i>=0
// input data monotonic decreasing --> b_i<=0
for(int i=0; i<n; i++) {
int im1 = std::max(i-1, 0);
int ip1 = std::min(i+1, n-1);
if( ((m_y[im1]<=m_y[i]) && (m_y[i]<=m_y[ip1]) && m_b[i]<0.0) ||
((m_y[im1]>=m_y[i]) && (m_y[i]>=m_y[ip1]) && m_b[i]>0.0) ) {
modified=true;
m_b[i]=0.0;
}
}
// if input data is monotonic (b[i], b[i+1], avg have all the same sign)
// ensure a sufficient criteria for monotonicity is satisfied:
// sqrt(b[i]^2+b[i+1]^2) <= 3 |avg|, with avg=(y[i+1]-y[i])/h,
for(int i=0; i<n-1; i++) {
double h = m_x[i+1]-m_x[i];
double avg = (m_y[i+1]-m_y[i])/h;
if( avg==0.0 && (m_b[i]!=0.0 || m_b[i+1]!=0.0) ) {
modified=true;
m_b[i]=0.0;
m_b[i+1]=0.0;
} else if( (m_b[i]>=0.0 && m_b[i+1]>=0.0 && avg>0.0) ||
(m_b[i]<=0.0 && m_b[i+1]<=0.0 && avg<0.0) ) {
// input data is monotonic
double r = sqrt(m_b[i]*m_b[i]+m_b[i+1]*m_b[i+1])/std::fabs(avg);
if(r>3.0) {
// sufficient criteria for monotonicity: r<=3
// adjust b[i] and b[i+1]
modified=true;
m_b[i] *= (3.0/r);
m_b[i+1] *= (3.0/r);
}
}
}
if(modified==true) {
set_coeffs_from_b();
m_made_monotonic=true;
}
return modified;
}
// return the closest idx so that m_x[idx] <= x (return 0 if x<m_x[0])
size_t spline::find_closest(double x) const
{
std::vector<double>::const_iterator it;
it=std::upper_bound(m_x.begin(),m_x.end(),x); // *it > x
size_t idx = std::max( int(it-m_x.begin())-1, 0); // m_x[idx] <= x
return idx;
}
double spline::operator() (double x) const
{
// polynomial evaluation using Horner's scheme
// TODO: consider more numerically accurate algorithms, e.g.:
// - Clenshaw
// - Even-Odd method by A.C.R. Newbery
// - Compensated Horner Scheme
size_t n=m_x.size();
size_t idx=find_closest(x);
double h=x-m_x[idx];
double interpol;
if(x<m_x[0]) {
// extrapolation to the left
interpol=(m_c0*h + m_b[0])*h + m_y[0];
} else if(x>m_x[n-1]) {
// extrapolation to the right
interpol=(m_c[n-1]*h + m_b[n-1])*h + m_y[n-1];
} else {
// interpolation
interpol=((m_d[idx]*h + m_c[idx])*h + m_b[idx])*h + m_y[idx];
}
return interpol;
}
double spline::deriv(int order, double x) const
{
assert(order>0);
size_t n=m_x.size();
size_t idx = find_closest(x);
double h=x-m_x[idx];
double interpol;
if(x<m_x[0]) {
// extrapolation to the left
switch(order) {
case 1:
interpol=2.0*m_c0*h + m_b[0];
break;
case 2:
interpol=2.0*m_c0;
break;
default:
interpol=0.0;
break;
}
} else if(x>m_x[n-1]) {
// extrapolation to the right
switch(order) {
case 1:
interpol=2.0*m_c[n-1]*h + m_b[n-1];
break;
case 2:
interpol=2.0*m_c[n-1];
break;
default:
interpol=0.0;
break;
}
} else {
// interpolation
switch(order) {
case 1:
interpol=(3.0*m_d[idx]*h + 2.0*m_c[idx])*h + m_b[idx];
break;
case 2:
interpol=6.0*m_d[idx]*h + 2.0*m_c[idx];
break;
case 3:
interpol=6.0*m_d[idx];
break;
default:
interpol=0.0;
break;
}
}
return interpol;
}
std::vector<double> spline::solve(double y, bool ignore_extrapolation) const
{
std::vector<double> x; // roots for the entire spline
std::vector<double> root; // roots for each piecewise cubic
const size_t n=m_x.size();
// left extrapolation
if(ignore_extrapolation==false) {
root = internal::solve_cubic(m_y[0]-y,m_b[0],m_c0,0.0,1);
for(size_t j=0; j<root.size(); j++) {
if(root[j]<0.0) {
x.push_back(m_x[0]+root[j]);
}
}
}
// brute force check if piecewise cubic has roots in their resp. segment
// TODO: make more efficient
for(size_t i=0; i<n-1; i++) {
root = internal::solve_cubic(m_y[i]-y,m_b[i],m_c[i],m_d[i],1);
for(size_t j=0; j<root.size(); j++) {
double h = (i>0) ? (m_x[i]-m_x[i-1]) : 0.0;
double eps = internal::get_eps()*512.0*std::min(h,1.0);
if( (-eps<=root[j]) && (root[j]<m_x[i+1]-m_x[i]) ) {
double new_root = m_x[i]+root[j];
if(x.size()>0 && x.back()+eps > new_root) {
x.back()=new_root; // avoid spurious duplicate roots
} else {
x.push_back(new_root);
}
}
}
}
// right extrapolation
if(ignore_extrapolation==false) {
root = internal::solve_cubic(m_y[n-1]-y,m_b[n-1],m_c[n-1],0.0,1);
for(size_t j=0; j<root.size(); j++) {
if(0.0<=root[j]) {
x.push_back(m_x[n-1]+root[j]);
}
}
}
return x;
};
#ifdef HAVE_SSTREAM
std::string spline::info() const
{
std::stringstream ss;
ss << "type " << m_type << ", left boundary deriv " << m_left << " = ";
ss << m_left_value << ", right boundary deriv " << m_right << " = ";
ss << m_right_value << std::endl;
if(m_made_monotonic) {
ss << "(spline has been adjusted for piece-wise monotonicity)";
}
return ss.str();
}
#endif // HAVE_SSTREAM
namespace internal
{
// band_matrix implementation
// -------------------------
band_matrix::band_matrix(int dim, int n_u, int n_l)
{
resize(dim, n_u, n_l);
}
void band_matrix::resize(int dim, int n_u, int n_l)
{
assert(dim>0);
assert(n_u>=0);
assert(n_l>=0);
m_upper.resize(n_u+1);
m_lower.resize(n_l+1);
for(size_t i=0; i<m_upper.size(); i++) {
m_upper[i].resize(dim);
}
for(size_t i=0; i<m_lower.size(); i++) {
m_lower[i].resize(dim);
}
}
int band_matrix::dim() const
{
if(m_upper.size()>0) {
return (int)m_upper[0].size();
} else {
return 0;
}
}
// defines the new operator (), so that we can access the elements
// by A(i,j), index going from i=0,...,dim()-1
double & band_matrix::operator () (int i, int j)
{
int k=j-i; // what band is the entry
assert( (i>=0) && (i<dim()) && (j>=0) && (j<dim()) );
assert( (-num_lower()<=k) && (k<=num_upper()) );
// k=0 -> diagonal, k<0 lower left part, k>0 upper right part
if(k>=0) return m_upper[k][i];
else return m_lower[-k][i];
}
double band_matrix::operator () (int i, int j) const
{
int k=j-i; // what band is the entry
assert( (i>=0) && (i<dim()) && (j>=0) && (j<dim()) );
assert( (-num_lower()<=k) && (k<=num_upper()) );
// k=0 -> diagonal, k<0 lower left part, k>0 upper right part
if(k>=0) return m_upper[k][i];
else return m_lower[-k][i];
}
// second diag (used in LU decomposition), saved in m_lower
double band_matrix::saved_diag(int i) const
{
assert( (i>=0) && (i<dim()) );
return m_lower[0][i];
}
double & band_matrix::saved_diag(int i)
{
assert( (i>=0) && (i<dim()) );
return m_lower[0][i];
}
// LR-Decomposition of a band matrix
void band_matrix::lu_decompose()
{
int i_max,j_max;
int j_min;
double x;
// preconditioning
// normalize column i so that a_ii=1
for(int i=0; i<this->dim(); i++) {
assert(this->operator()(i,i)!=0.0);
this->saved_diag(i)=1.0/this->operator()(i,i);
j_min=std::max(0,i-this->num_lower());
j_max=std::min(this->dim()-1,i+this->num_upper());
for(int j=j_min; j<=j_max; j++) {
this->operator()(i,j) *= this->saved_diag(i);
}
this->operator()(i,i)=1.0; // prevents rounding errors
}
// Gauss LR-Decomposition
for(int k=0; k<this->dim(); k++) {
i_max=std::min(this->dim()-1,k+this->num_lower()); // num_lower not a mistake!
for(int i=k+1; i<=i_max; i++) {
assert(this->operator()(k,k)!=0.0);
x=-this->operator()(i,k)/this->operator()(k,k);
this->operator()(i,k)=-x; // assembly part of L
j_max=std::min(this->dim()-1,k+this->num_upper());
for(int j=k+1; j<=j_max; j++) {
// assembly part of R
this->operator()(i,j)=this->operator()(i,j)+x*this->operator()(k,j);
}
}
}
}
// solves Ly=b
std::vector<double> band_matrix::l_solve(const std::vector<double>& b) const
{
assert( this->dim()==(int)b.size() );
std::vector<double> x(this->dim());
int j_start;
double sum;
for(int i=0; i<this->dim(); i++) {
sum=0;
j_start=std::max(0,i-this->num_lower());
for(int j=j_start; j<i; j++) sum += this->operator()(i,j)*x[j];
x[i]=(b[i]*this->saved_diag(i)) - sum;
}
return x;
}
// solves Rx=y
std::vector<double> band_matrix::r_solve(const std::vector<double>& b) const
{
assert( this->dim()==(int)b.size() );
std::vector<double> x(this->dim());
int j_stop;
double sum;
for(int i=this->dim()-1; i>=0; i--) {
sum=0;
j_stop=std::min(this->dim()-1,i+this->num_upper());
for(int j=i+1; j<=j_stop; j++) sum += this->operator()(i,j)*x[j];
x[i]=( b[i] - sum ) / this->operator()(i,i);
}
return x;
}
std::vector<double> band_matrix::lu_solve(const std::vector<double>& b,
bool is_lu_decomposed)
{
assert( this->dim()==(int)b.size() );
std::vector<double> x,y;
if(is_lu_decomposed==false) {
this->lu_decompose();
}
y=this->l_solve(b);
x=this->r_solve(y);
return x;
}
// machine precision of a double, i.e. the successor of 1 is 1+eps
double get_eps()
{
//return std::numeric_limits<double>::epsilon(); // __DBL_EPSILON__
return 2.2204460492503131e-16; // 2^-52
}
// solutions for a + b*x = 0
std::vector<double> solve_linear(double a, double b)
{
std::vector<double> x; // roots
if(b==0.0) {
if(a==0.0) {
// 0*x = 0
x.resize(1);
x[0] = 0.0; // any x solves it but we need to pick one
return x;
} else {
// 0*x + ... = 0, no solution
return x;
}
} else {
x.resize(1);
x[0] = -a/b;
return x;
}
}
// solutions for a + b*x + c*x^2 = 0
std::vector<double> solve_quadratic(double a, double b, double c,
int newton_iter=0)
{
if(c==0.0) {
return solve_linear(a,b);
}
// rescale so that we solve x^2 + 2p x + q = (x+p)^2 + q - p^2 = 0
double p=0.5*b/c;
double q=a/c;
double discr = p*p-q;
const double eps=0.5*internal::get_eps();
double discr_err = (6.0*(p*p)+3.0*fabs(q)+fabs(discr))*eps;
std::vector<double> x; // roots
if(fabs(discr)<=discr_err) {
// discriminant is zero --> one root
x.resize(1);
x[0] = -p;
} else if(discr<0) {
// no root
} else {
// two roots
x.resize(2);
x[0] = -p - sqrt(discr);
x[1] = -p + sqrt(discr);
}
// improve solution via newton steps
for(size_t i=0; i<x.size(); i++) {
for(int k=0; k<newton_iter; k++) {
double f = (c*x[i] + b)*x[i] + a;
double f1 = 2.0*c*x[i] + b;
// only adjust if slope is large enough
if(fabs(f1)>1e-8) {
x[i] -= f/f1;
}
}
}
return x;
}
// solutions for the cubic equation: a + b*x +c*x^2 + d*x^3 = 0
// this is a naive implementation of the analytic solution without
// optimisation for speed or numerical accuracy
// newton_iter: number of newton iterations to improve analytical solution
// see also
// gsl: gsl_poly_solve_cubic() in solve_cubic.c
// octave: roots.m - via eigenvalues of the Frobenius companion matrix
std::vector<double> solve_cubic(double a, double b, double c, double d,
int newton_iter)
{
if(d==0.0) {
return solve_quadratic(a,b,c,newton_iter);
}
// convert to normalised form: a + bx + cx^2 + x^3 = 0
if(d!=1.0) {
a/=d;
b/=d;
c/=d;
}
// convert to depressed cubic: z^3 - 3pz - 2q = 0
// via substitution: z = x + c/3
std::vector<double> z; // roots of the depressed cubic
double p = -(1.0/3.0)*b + (1.0/9.0)*(c*c);
double r = 2.0*(c*c)-9.0*b;
double q = -0.5*a - (1.0/54.0)*(c*r);
double discr=p*p*p-q*q; // discriminant
// calculating numerical round-off errors with assumptions:
// - each operation is precise but each intermediate result x
// when stored has max error of x*eps
// - only multiplication with a power of 2 introduces no new error
// - a,b,c,d and some fractions (e.g. 1/3) have rounding errors eps
// - p_err << |p|, q_err << |q|, ... (this is violated in rare cases)
// would be more elegant to use boost::numeric::interval<double>
const double eps = internal::get_eps();
double p_err = eps*((3.0/3.0)*fabs(b)+(4.0/9.0)*(c*c)+fabs(p));
double r_err = eps*(6.0*(c*c)+18.0*fabs(b)+fabs(r));
double q_err = 0.5*fabs(a)*eps + (1.0/54.0)*fabs(c)*(r_err+fabs(r)*3.0*eps)
+ fabs(q)*eps;
double discr_err = (p*p) * (3.0*p_err + fabs(p)*2.0*eps)
+ fabs(q) * (2.0*q_err + fabs(q)*eps) + fabs(discr)*eps;
// depending on the discriminant we get different solutions
if(fabs(discr)<=discr_err) {
// discriminant zero: one or two real roots
if(fabs(p)<=p_err) {
// p and q are zero: single root
z.resize(1);
z[0] = 0.0; // triple root
} else {
z.resize(2);
z[0] = 2.0*q/p; // single root
z[1] = -0.5*z[0]; // double root
}
} else if(discr>0) {
// three real roots: via trigonometric solution
z.resize(3);
double ac = (1.0/3.0) * acos( q/(p*sqrt(p)) );
double sq = 2.0*sqrt(p);
z[0] = sq * cos(ac);
z[1] = sq * cos(ac-2.0*M_PI/3.0);
z[2] = sq * cos(ac-4.0*M_PI/3.0);
} else if (discr<0.0) {
// single real root: via Cardano's fromula
z.resize(1);
double sgnq = (q >= 0 ? 1 : -1);
double basis = fabs(q) + sqrt(-discr);
double C = sgnq * pow(basis, 1.0/3.0); // c++11 has std::cbrt()
z[0] = C + p/C;
}
for(size_t i=0; i<z.size(); i++) {
// convert depressed cubic roots to original cubic: x = z - c/3
z[i] -= (1.0/3.0)*c;
// improve solution via newton steps
for(int k=0; k<newton_iter; k++) {
double f = ((z[i] + c)*z[i] + b)*z[i] + a;
double f1 = (3.0*z[i] + 2.0*c)*z[i] + b;
// only adjust if slope is large enough
if(fabs(f1)>1e-8) {
z[i] -= f/f1;
}
}
}
// ensure if a=0 we get exactly x=0 as root
// TODO: remove this fudge
if(a==0.0) {
assert(z.size()>0); // cubic should always have at least one root
double xmin=fabs(z[0]);
size_t imin=0;
for(size_t i=1; i<z.size(); i++) {
if(xmin>fabs(z[i])) {
xmin=fabs(z[i]);
imin=i;
}
}
z[imin]=0.0; // replace the smallest absolute value with 0
}
std::sort(z.begin(), z.end());
return z;
}
} // namespace internal
} // namespace tk
#if !defined(_MSC_VER)
#pragma GCC diagnostic pop
#endif
#endif /* TK_SPLINE_H */

View File

@@ -11108,6 +11108,19 @@ msgid ""
"easily." "easily."
msgstr "" msgstr ""
msgid "Brim follows compensated outline"
msgstr ""
msgid ""
"When enabled, the brim is aligned with the first-layer perimeter geometry "
"after Elephant Foot Compensation is applied.\n"
"This option is intended for cases where Elephant Foot Compensation "
"significantly alters the first-layer footprint.\n"
"\n"
"If your current setup already works well, enabling it may be unnecessary and "
"can cause the brim to fuse with upper layers."
msgstr ""
msgid "Brim ears" msgid "Brim ears"
msgstr "" msgstr ""

View File

@@ -12177,6 +12177,26 @@ msgstr ""
"Un espai entre la línia de la Vora d'Adherència més interna i l'objecte pot " "Un espai entre la línia de la Vora d'Adherència més interna i l'objecte pot "
"fer que la Vora d'Adherència s'elimini més fàcilment" "fer que la Vora d'Adherència s'elimini més fàcilment"
msgid "Brim follows compensated outline"
msgstr "Vora d'Adherència segueix un esquema compensat"
msgid ""
"When enabled, the brim is aligned with the first-layer perimeter geometry "
"after Elephant Foot Compensation is applied.\n"
"This option is intended for cases where Elephant Foot Compensation "
"significantly alters the first-layer footprint.\n"
"\n"
"If your current setup already works well, enabling it may be unnecessary and "
"can cause the brim to fuse with upper layers."
msgstr ""
"Quan està activat, vora d'adherència s'alinea amb la geometria del perímetre de la primera capa "
"després d'aplicar la compensació del peu d'elefant.\n"
"Aquesta opció està pensada per als casos en què la compensació del peu d'elefant "
"altera significativament la petjada de la primera capa.\n"
"\n"
"Si la vostra configuració actual ja funciona bé, activar-la pot ser innecessari i "
"pot fer que el vora d'adherència es fusioni amb les capes superiors."
msgid "Brim ears" msgid "Brim ears"
msgstr "Orelles de la Vora d'Adherència" msgstr "Orelles de la Vora d'Adherència"

View File

@@ -11730,6 +11730,26 @@ msgid ""
msgstr "" msgstr ""
"Mezera mezi nejvnitřnějším límcem a předmětem může usnadnit odstranění límce" "Mezera mezi nejvnitřnějším límcem a předmětem může usnadnit odstranění límce"
msgid "Brim follows compensated outline"
msgstr "Límec sleduje kompenzovaný obrys"
msgid ""
"When enabled, the brim is aligned with the first-layer perimeter geometry "
"after Elephant Foot Compensation is applied.\n"
"This option is intended for cases where Elephant Foot Compensation "
"significantly alters the first-layer footprint.\n"
"\n"
"If your current setup already works well, enabling it may be unnecessary and "
"can cause the brim to fuse with upper layers."
msgstr ""
"Když je povoleno, límec je zarovnán s obvodovou geometrií první vrstvy "
"po použití kompenzace sloní nohy.\n"
"Tato možnost je určena pro případy, kdy je kompenzace sloní nohy "
"výrazně mění stopu první vrstvy.\n"
"\n"
"Pokud vaše aktuální nastavení již funguje dobře, jeho povolení může být zbytečné a "
"může způsobit spojení límec s horními vrstvami."
msgid "Brim ears" msgid "Brim ears"
msgstr "Uši límce" msgstr "Uši límce"

View File

@@ -12766,6 +12766,26 @@ msgstr ""
"Eine Lücke zwischen der innersten Randlinie und dem Objekt kann das Abnehmen " "Eine Lücke zwischen der innersten Randlinie und dem Objekt kann das Abnehmen "
"des Randes erleichtern" "des Randes erleichtern"
msgid "Brim follows compensated outline"
msgstr "Umrandung folgt einem kompensierten Umriss"
msgid ""
"When enabled, the brim is aligned with the first-layer perimeter geometry "
"after Elephant Foot Compensation is applied.\n"
"This option is intended for cases where Elephant Foot Compensation "
"significantly alters the first-layer footprint.\n"
"\n"
"If your current setup already works well, enabling it may be unnecessary and "
"can cause the brim to fuse with upper layers."
msgstr ""
"Wenn diese Option aktiviert ist, wird umrandung an der Umfangsgeometrie der ersten Ebene ausgerichtet "
"nach Anwendung der Elefantenfußkompensation.\n"
"Diese Option ist für Fälle gedacht, in denen eine Elefantenfuß-Entschädigung vorliegt "
"verändert den Footprint der ersten Schicht erheblich.\n"
"\n"
"Wenn Ihr aktuelles Setup bereits gut funktioniert, kann es unnötig sein, es zu aktivieren "
"kann dazu führen, dass der umrandung mit den oberen Schichten verschmilzt."
msgid "Brim ears" msgid "Brim ears"
msgstr "Brim Ohren" msgstr "Brim Ohren"

View File

@@ -11327,6 +11327,26 @@ msgstr ""
"This creates a gap between the innermost brim line and the object and can " "This creates a gap between the innermost brim line and the object and can "
"make the brim easier to remove." "make the brim easier to remove."
msgid "Brim follows compensated outline"
msgstr "Brim follows compensated outline"
msgid ""
"When enabled, the brim is aligned with the first-layer perimeter geometry "
"after Elephant Foot Compensation is applied.\n"
"This option is intended for cases where Elephant Foot Compensation "
"significantly alters the first-layer footprint.\n"
"\n"
"If your current setup already works well, enabling it may be unnecessary and "
"can cause the brim to fuse with upper layers."
msgstr ""
"When enabled, the brim is aligned with the first-layer perimeter geometry "
"after Elephant Foot Compensation is applied.\n"
"This option is intended for cases where Elephant Foot Compensation "
"significantly alters the first-layer footprint.\n"
"\n"
"If your current setup already works well, enabling it may be unnecessary and "
"can cause the brim to fuse with upper layers."
msgid "Brim ears" msgid "Brim ears"
msgstr "" msgstr ""

View File

@@ -12147,6 +12147,26 @@ msgstr ""
"Un hueco entre la línea más interna del borde de adherencia y el objeto " "Un hueco entre la línea más interna del borde de adherencia y el objeto "
"puede hacer que el borde de adherencia se retire más fácilmente" "puede hacer que el borde de adherencia se retire más fácilmente"
msgid "Brim follows compensated outline"
msgstr "Borde de adherencia sigue el esquema compensado"
msgid ""
"When enabled, the brim is aligned with the first-layer perimeter geometry "
"after Elephant Foot Compensation is applied.\n"
"This option is intended for cases where Elephant Foot Compensation "
"significantly alters the first-layer footprint.\n"
"\n"
"If your current setup already works well, enabling it may be unnecessary and "
"can cause the brim to fuse with upper layers."
msgstr ""
"Cuando está habilitado, el borde de adherencia está alineado con la geometría del perímetro de la primera capa "
"después de aplicar la compensación de pata de elefante.\n"
"Esta opción está destinada a casos en los que la Compensación por pata de elefante "
"altera significativamente la huella de la primera capa.\n"
"\n"
"Si su configuración actual ya funciona bien, habilitarla puede ser innecesario y "
"puede hacer que el borde de adherencia se fusione con las capas superiores."
msgid "Brim ears" msgid "Brim ears"
msgstr "Orejas de borde" msgstr "Orejas de borde"

View File

@@ -12298,6 +12298,26 @@ msgstr ""
"Un espace entre la ligne de bord la plus interne et l'objet peut faciliter " "Un espace entre la ligne de bord la plus interne et l'objet peut faciliter "
"le retrait du bord" "le retrait du bord"
msgid "Brim follows compensated outline"
msgstr "Bordure suit le contour compensé"
msgid ""
"When enabled, the brim is aligned with the first-layer perimeter geometry "
"after Elephant Foot Compensation is applied.\n"
"This option is intended for cases where Elephant Foot Compensation "
"significantly alters the first-layer footprint.\n"
"\n"
"If your current setup already works well, enabling it may be unnecessary and "
"can cause the brim to fuse with upper layers."
msgstr ""
"Lorsqu'il est activé, le bordure est aligné avec la géométrie du périmètre de la première couche "
"après l'application de la compensation du pied d'éléphant.\n"
"Cette option est destinée aux cas où la compensation du pied d'éléphant "
"modifie considérablement lempreinte de la première couche.\n"
"\n"
"Si votre configuration actuelle fonctionne déjà bien, son activation peut être inutile et "
"peut provoquer la fusion du bordure avec les couches supérieures."
msgid "Brim ears" msgid "Brim ears"
msgstr "Bordures à oreilles" msgstr "Bordures à oreilles"

View File

@@ -11603,6 +11603,26 @@ msgstr ""
"A legbelső peremvonal és a tárgy közötti rés, ami megkönnyítheti a perem " "A legbelső peremvonal és a tárgy közötti rés, ami megkönnyítheti a perem "
"eltávolítását" "eltávolítását"
msgid "Brim follows compensated outline"
msgstr "A Perem a kompenzált körvonalat követi"
msgid ""
"When enabled, the brim is aligned with the first-layer perimeter geometry "
"after Elephant Foot Compensation is applied.\n"
"This option is intended for cases where Elephant Foot Compensation "
"significantly alters the first-layer footprint.\n"
"\n"
"If your current setup already works well, enabling it may be unnecessary and "
"can cause the brim to fuse with upper layers."
msgstr ""
"Ha engedélyezve van, a perem igazodik az első réteg kerületi geometriájához "
"az elefánttalp-kompenzáció alkalmazása után.\n"
"Ez az opció arra az esetre szolgál, amikor az elefánttalp-kompenzáció "
"jelentősen megváltoztatja az első réteg alapterületét.\n"
"\n"
"Ha a jelenlegi beállítás már jól működik, előfordulhat, hogy az engedélyezése felesleges és "
"a perem összeolvadását okozhatja a felső rétegekkel."
msgid "Brim ears" msgid "Brim ears"
msgstr "Karimás fülek" msgstr "Karimás fülek"

View File

@@ -12234,6 +12234,26 @@ msgstr ""
"Crea uno spazio tra la linea più interna della tesa e l'oggetto per rendere " "Crea uno spazio tra la linea più interna della tesa e l'oggetto per rendere "
"più facile la rimozione della tesa." "più facile la rimozione della tesa."
msgid "Brim follows compensated outline"
msgstr "Tesa segue il contorno compensato"
msgid ""
"When enabled, the brim is aligned with the first-layer perimeter geometry "
"after Elephant Foot Compensation is applied.\n"
"This option is intended for cases where Elephant Foot Compensation "
"significantly alters the first-layer footprint.\n"
"\n"
"If your current setup already works well, enabling it may be unnecessary and "
"can cause the brim to fuse with upper layers."
msgstr ""
"Quando abilitato, tesa è allineato con la geometria perimetrale del primo strato "
"dopo l'applicazione della compensazione del piede di elefante.\n"
"Questa opzione è prevista per i casi in cui è prevista la compensazione del piede di elefante "
"altera significativamente l'impronta del primo strato.\n"
"\n"
"Se la tua configurazione attuale funziona già bene, abilitarla potrebbe non essere necessaria e "
"può causare la fusione del tesa con gli strati superiori."
msgid "Brim ears" msgid "Brim ears"
msgstr "Tesa ad orecchio" msgstr "Tesa ad orecchio"

View File

@@ -11394,6 +11394,26 @@ msgstr ""
"ブリムを取り外しやすくする為、一番内側のブリムラインをモデルと少し距離を設け" "ブリムを取り外しやすくする為、一番内側のブリムラインをモデルと少し距離を設け"
"ます。" "ます。"
msgid "Brim follows compensated outline"
msgstr "ブリム は補正されたアウトラインに従います"
msgid ""
"When enabled, the brim is aligned with the first-layer perimeter geometry "
"after Elephant Foot Compensation is applied.\n"
"This option is intended for cases where Elephant Foot Compensation "
"significantly alters the first-layer footprint.\n"
"\n"
"If your current setup already works well, enabling it may be unnecessary and "
"can cause the brim to fuse with upper layers."
msgstr ""
"有効にすると、ブリム は最初の層の周囲ジオメトリと位置合わせされます。 "
"エレファント・フット・コンペンセーション適用後。\n"
"このオプションは、象の足の補正が必要な場合を対象としています。 "
"最初の層のフットプリントを大幅に変更します。\n"
"\n"
"現在の設定がすでにうまく機能している場合は、それを有効にする必要はないかもしれません。 "
"ブリム が上位層と融合する可能性があります。"
msgid "Brim ears" msgid "Brim ears"
msgstr "" msgstr ""

View File

@@ -11817,6 +11817,26 @@ msgstr ""
"가장 안쪽 브림 라인과 객체 사이에 간격을 주어 쉽게 브림을 제거 할 수 있게 합" "가장 안쪽 브림 라인과 객체 사이에 간격을 주어 쉽게 브림을 제거 할 수 있게 합"
"니다" "니다"
msgid "Brim follows compensated outline"
msgstr "브림는 보상된 아웃라인을 따릅니다."
msgid ""
"When enabled, the brim is aligned with the first-layer perimeter geometry "
"after Elephant Foot Compensation is applied.\n"
"This option is intended for cases where Elephant Foot Compensation "
"significantly alters the first-layer footprint.\n"
"\n"
"If your current setup already works well, enabling it may be unnecessary and "
"can cause the brim to fuse with upper layers."
msgstr ""
"활성화되면 브림은 첫 번째 레이어 주변 형상과 정렬됩니다 "
"코끼리 발 보정이 적용된 후.\n"
"이 옵션은 코끼리 발 보상이 적용되는 경우를 위한 것입니다 "
"첫 번째 레이어 공간을 크게 변경합니다.\n"
"\n"
"현재 설정이 이미 잘 작동하는 경우 활성화할 필요가 없으며 "
"브림이 상위 레이어와 융합될 수 있습니다."
msgid "Brim ears" msgid "Brim ears"
msgstr "브림 귀" msgstr "브림 귀"

View File

@@ -12183,6 +12183,26 @@ msgstr ""
"Sukuriamas tarpas tarp vidinės krašto linijos ir objekto, todėl galima " "Sukuriamas tarpas tarp vidinės krašto linijos ir objekto, todėl galima "
"lengviau jį atskirti." "lengviau jį atskirti."
msgid "Brim follows compensated outline"
msgstr "Kraštas atitinka kompensuotą kontūrą"
msgid ""
"When enabled, the brim is aligned with the first-layer perimeter geometry "
"after Elephant Foot Compensation is applied.\n"
"This option is intended for cases where Elephant Foot Compensation "
"significantly alters the first-layer footprint.\n"
"\n"
"If your current setup already works well, enabling it may be unnecessary and "
"can cause the brim to fuse with upper layers."
msgstr ""
"Kai įjungta, kraštas yra sulygiuotas su pirmojo sluoksnio perimetro geometrija "
"pritaikius dramblio pėdos kompensaciją.\n"
"Ši parinktis skirta tais atvejais, kai kompensuojama dramblio pėda "
"žymiai pakeičia pirmojo sluoksnio pėdsaką.\n"
"\n"
"Jei dabartinė sąranka jau veikia gerai, jos įjungti gali nebūti ir "
"gali sukelti kraštas susiliejimą su viršutiniais sluoksniais."
msgid "Brim ears" msgid "Brim ears"
msgstr "Krašto \"ausys\"" msgstr "Krašto \"ausys\""

View File

@@ -11751,6 +11751,26 @@ msgstr ""
"Dit creëert ruimte tussen de binnenste brimlijn en het object en zorgt " "Dit creëert ruimte tussen de binnenste brimlijn en het object en zorgt "
"ervoor dat het object eenvoudiger van het printbed kan worden verwijderd." "ervoor dat het object eenvoudiger van het printbed kan worden verwijderd."
msgid "Brim follows compensated outline"
msgstr "Rand volgt de gecompenseerde omtrek"
msgid ""
"When enabled, the brim is aligned with the first-layer perimeter geometry "
"after Elephant Foot Compensation is applied.\n"
"This option is intended for cases where Elephant Foot Compensation "
"significantly alters the first-layer footprint.\n"
"\n"
"If your current setup already works well, enabling it may be unnecessary and "
"can cause the brim to fuse with upper layers."
msgstr ""
"Indien ingeschakeld, wordt de rand uitgelijnd met de omtrekgeometrie van de eerste laag "
"nadat olifantenvoetcompensatie is toegepast.\n"
"Deze optie is bedoeld voor gevallen waarin sprake is van olifantenvoetcompensatie "
"verandert de voetafdruk van de eerste laag aanzienlijk.\n"
"\n"
"Als uw huidige configuratie al goed werkt, kan het inschakelen hiervan niet nodig zijn "
"kan ervoor zorgen dat de rand samensmelt met de bovenste lagen."
msgid "Brim ears" msgid "Brim ears"
msgstr "Rand oren" msgstr "Rand oren"

View File

@@ -12130,6 +12130,26 @@ msgstr ""
"Szczelina między najbardziej wewnętrzną linią brimu a obiektem może ułatwić " "Szczelina między najbardziej wewnętrzną linią brimu a obiektem może ułatwić "
"usunięcie brimu" "usunięcie brimu"
msgid "Brim follows compensated outline"
msgstr "Brim podąża za skompensowanym konturem"
msgid ""
"When enabled, the brim is aligned with the first-layer perimeter geometry "
"after Elephant Foot Compensation is applied.\n"
"This option is intended for cases where Elephant Foot Compensation "
"significantly alters the first-layer footprint.\n"
"\n"
"If your current setup already works well, enabling it may be unnecessary and "
"can cause the brim to fuse with upper layers."
msgstr ""
"Po włączeniu brim jest wyrównany z geometrią obwodu pierwszej warstwy "
"po zastosowaniu Kompensacji Stopy Słonia.\n"
"Ta opcja jest przeznaczona dla przypadków, w których występuje kompensacja stopy słonia "
"znacząco zmienia ślad pierwszej warstwy.\n"
"\n"
"Jeśli Twoja bieżąca konfiguracja już działa dobrze, włączenie jej może być niepotrzebne i "
"może spowodować stopienie brim z górnymi warstwami."
msgid "Brim ears" msgid "Brim ears"
msgstr "Uszy brim" msgstr "Uszy brim"

View File

@@ -12555,6 +12555,26 @@ msgstr ""
"Um espaço entre a linha mais interna da borda e o objeto pode facilitar a " "Um espaço entre a linha mais interna da borda e o objeto pode facilitar a "
"remoção da borda." "remoção da borda."
msgid "Brim follows compensated outline"
msgstr "Borda segue contorno compensado"
msgid ""
"When enabled, the brim is aligned with the first-layer perimeter geometry "
"after Elephant Foot Compensation is applied.\n"
"This option is intended for cases where Elephant Foot Compensation "
"significantly alters the first-layer footprint.\n"
"\n"
"If your current setup already works well, enabling it may be unnecessary and "
"can cause the brim to fuse with upper layers."
msgstr ""
"Quando ativado, o borda fica alinhado com a geometria do perímetro da primeira camada "
"após a aplicação da Compensação da Pé de Elefante.\n"
"Esta opção destina-se aos casos em que a Compensação da Pé de Elefante "
"altera significativamente a pegada da primeira camada.\n"
"\n"
"Se a sua configuração atual já funciona bem, ativá-la pode ser desnecessário e "
"pode fazer com que o borda se funda com as camadas superiores."
msgid "Brim ears" msgid "Brim ears"
msgstr "Orelhas da borda" msgstr "Orelhas da borda"

View File

@@ -12291,6 +12291,26 @@ msgid ""
"easily." "easily."
msgstr "Смещение каймы от печатаемой модели, может облегчить её удаление." msgstr "Смещение каймы от печатаемой модели, может облегчить её удаление."
msgid "Brim follows compensated outline"
msgstr "Кайма соответствует компенсированному контуру"
msgid ""
"When enabled, the brim is aligned with the first-layer perimeter geometry "
"after Elephant Foot Compensation is applied.\n"
"This option is intended for cases where Elephant Foot Compensation "
"significantly alters the first-layer footprint.\n"
"\n"
"If your current setup already works well, enabling it may be unnecessary and "
"can cause the brim to fuse with upper layers."
msgstr ""
"Если этот параметр включен, кайма выравнивается по геометрии периметра первого слоя "
"после применения компенсации «слоновьей стопы».\n"
"Эта опция предназначена для случаев, когда «Компенсация слоновой стопы» "
"существенно изменяет след первого слоя.\n"
"\n"
"Если ваша текущая настройка уже работает хорошо, ее включение может быть ненужным и "
"может привести к слиянию кайма с верхними слоями."
msgid "Brim ears" msgid "Brim ears"
msgstr "Ушки каймы" msgstr "Ушки каймы"

View File

@@ -11574,6 +11574,26 @@ msgstr ""
"Mellanrum mellan innersta brim linjen och objektet kan underlätta vid " "Mellanrum mellan innersta brim linjen och objektet kan underlätta vid "
"borttagande av brim" "borttagande av brim"
msgid "Brim follows compensated outline"
msgstr "Brim följer kompenserad disposition"
msgid ""
"When enabled, the brim is aligned with the first-layer perimeter geometry "
"after Elephant Foot Compensation is applied.\n"
"This option is intended for cases where Elephant Foot Compensation "
"significantly alters the first-layer footprint.\n"
"\n"
"If your current setup already works well, enabling it may be unnecessary and "
"can cause the brim to fuse with upper layers."
msgstr ""
"När den är aktiverad, är brim justerad med det första lagrets omkretsgeometri "
"efter att elefantfotskompensation tillämpas.\n"
"Detta alternativ är avsett för fall där elefantfotskompensation "
"förändrar det första skiktets fotavtryck avsevärt.\n"
"\n"
"Om din nuvarande inställning redan fungerar bra kan det vara onödigt att aktivera det och "
"kan få brim att smälta samman med de övre lagren."
msgid "Brim ears" msgid "Brim ears"
msgstr "Brätte öron" msgstr "Brätte öron"

View File

@@ -12097,6 +12097,26 @@ msgstr ""
"En içteki kenar çizgisi ile nesne arasındaki boşluk, kenarlığın daha kolay " "En içteki kenar çizgisi ile nesne arasındaki boşluk, kenarlığın daha kolay "
ıkarılmasını sağlayabilir." ıkarılmasını sağlayabilir."
msgid "Brim follows compensated outline"
msgstr "Kenar telafi edilen taslağı takip ediyor"
msgid ""
"When enabled, the brim is aligned with the first-layer perimeter geometry "
"after Elephant Foot Compensation is applied.\n"
"This option is intended for cases where Elephant Foot Compensation "
"significantly alters the first-layer footprint.\n"
"\n"
"If your current setup already works well, enabling it may be unnecessary and "
"can cause the brim to fuse with upper layers."
msgstr ""
"Etkinleştirildiğinde, kenar birinci katmanın çevre geometrisiyle hizalanır "
"Fil Ayağı Telafisi uygulandıktan sonra.\n"
"Bu seçenek Fil Ayağı Telafisinin geçerli olmadığı durumlar için tasarlanmıştır "
"ilk katmanın ayak izini önemli ölçüde değiştirir.\n"
"\n"
"Mevcut kurulumunuz zaten iyi çalışıyorsa, bunu etkinleştirmek gereksiz olabilir ve "
"kenar'in üst katmanlarla kaynaşmasına neden olabilir."
msgid "Brim ears" msgid "Brim ears"
msgstr "Kenar kulakları" msgstr "Kenar kulakları"

View File

@@ -12138,6 +12138,26 @@ msgstr ""
"Зазор між першою внутрішньою лінією кайми та об'єктом може сприяти легшому " "Зазор між першою внутрішньою лінією кайми та об'єктом може сприяти легшому "
"відокремленню кайми" "відокремленню кайми"
msgid "Brim follows compensated outline"
msgstr "Кайма має компенсований контур"
msgid ""
"When enabled, the brim is aligned with the first-layer perimeter geometry "
"after Elephant Foot Compensation is applied.\n"
"This option is intended for cases where Elephant Foot Compensation "
"significantly alters the first-layer footprint.\n"
"\n"
"If your current setup already works well, enabling it may be unnecessary and "
"can cause the brim to fuse with upper layers."
msgstr ""
"Якщо ввімкнено, кайма вирівнюється з геометрією периметра першого рівня "
"після застосування Elephant Foot Compensation.\n"
"Ця опція призначена для випадків компенсації слонячої стопи "
"значно змінює поверхню першого шару.\n"
"\n"
"Якщо ваші поточні налаштування вже працюють добре, увімкнення їх може бути непотрібним "
"може призвести до злиття кайма з верхніми шарами."
msgid "Brim ears" msgid "Brim ears"
msgstr "Вушка кайми" msgstr "Вушка кайми"

View File

@@ -11926,6 +11926,26 @@ msgstr ""
"Khoảng cách giữa đường brim trong cùng và đối tượng có thể làm cho brim dễ " "Khoảng cách giữa đường brim trong cùng và đối tượng có thể làm cho brim dễ "
"dàng tháo hơn." "dàng tháo hơn."
msgid "Brim follows compensated outline"
msgstr "Brim tuân theo phác thảo được bù đắp"
msgid ""
"When enabled, the brim is aligned with the first-layer perimeter geometry "
"after Elephant Foot Compensation is applied.\n"
"This option is intended for cases where Elephant Foot Compensation "
"significantly alters the first-layer footprint.\n"
"\n"
"If your current setup already works well, enabling it may be unnecessary and "
"can cause the brim to fuse with upper layers."
msgstr ""
"Khi được bật, brim sẽ được căn chỉnh theo hình học chu vi lớp đầu tiên "
"sau khi áp dụng Bồi thường bàn chân voi.\n"
"Tùy chọn này dành cho các trường hợp Bồi thường chân voi "
"làm thay đổi đáng kể dấu chân lớp đầu tiên.\n"
"\n"
"Nếu thiết lập hiện tại của bạn đã hoạt động tốt, việc bật nó có thể không cần thiết và "
"có thể khiến brim kết hợp với các lớp trên."
msgid "Brim ears" msgid "Brim ears"
msgstr "Tai brim" msgstr "Tai brim"

View File

@@ -2490,7 +2490,7 @@ msgid "Plate"
msgstr "盘" msgstr "盘"
msgid "Brim" msgid "Brim"
msgstr "Brim" msgstr "边缘"
msgid "Object/Part Setting" msgid "Object/Part Setting"
msgstr "对象/零件设置" msgstr "对象/零件设置"
@@ -11493,6 +11493,26 @@ msgid ""
"easily." "easily."
msgstr "在brim和模型之间设置间隙能够让brim更容易剥离" msgstr "在brim和模型之间设置间隙能够让brim更容易剥离"
msgid "Brim follows compensated outline"
msgstr "边缘 遵循补偿轮廓"
msgid ""
"When enabled, the brim is aligned with the first-layer perimeter geometry "
"after Elephant Foot Compensation is applied.\n"
"This option is intended for cases where Elephant Foot Compensation "
"significantly alters the first-layer footprint.\n"
"\n"
"If your current setup already works well, enabling it may be unnecessary and "
"can cause the brim to fuse with upper layers."
msgstr ""
"启用后,边缘 与第一层周边几何体对齐 "
"应用象脚补偿后。\n"
"此选项适用于象脚补偿的情况 "
"显着改变第一层足迹。\n"
"\n"
"如果您当前的设置已经运行良好,则可能没有必要启用它,并且 "
"可以导致 边缘 与上层融合。"
msgid "Brim ears" msgid "Brim ears"
msgstr "圆盘" msgstr "圆盘"

View File

@@ -2493,7 +2493,7 @@ msgid "Plate"
msgstr "列印板" msgstr "列印板"
msgid "Brim" msgid "Brim"
msgstr "Brim" msgstr "邊緣"
msgid "Object/Part Setting" msgid "Object/Part Setting"
msgstr "物件/零件 設定" msgstr "物件/零件 設定"
@@ -11560,6 +11560,26 @@ msgid ""
"easily." "easily."
msgstr "在 Brim 和模型之間設定間隙,能夠讓 Brim 更容易拆除" msgstr "在 Brim 和模型之間設定間隙,能夠讓 Brim 更容易拆除"
msgid "Brim follows compensated outline"
msgstr "邊緣 遵循補償輪廓"
msgid ""
"When enabled, the brim is aligned with the first-layer perimeter geometry "
"after Elephant Foot Compensation is applied.\n"
"This option is intended for cases where Elephant Foot Compensation "
"significantly alters the first-layer footprint.\n"
"\n"
"If your current setup already works well, enabling it may be unnecessary and "
"can cause the brim to fuse with upper layers."
msgstr ""
"啟用後,邊緣 與第一層周邊幾何體對齊 "
"應用像腳補償後。\n"
"此選項適用於像腳補償的情況 "
"顯著改變第一層足跡。\n"
"\n"
"如果您當前的設置已經運行良好,則可能沒有必要啟用它,並且 "
"可以導致 邊緣 與上層融合。"
msgid "Brim ears" msgid "Brim ears"
msgstr "耳狀 Brim" msgstr "耳狀 Brim"

View File

@@ -1,167 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="100%"
height="100%"
viewBox="0 0 18 18"
version="1.1"
xml:space="preserve"
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;"
id="svg4"
sodipodi:docname="axis_toggle.svg"
inkscape:version="1.4 (86a8ad7, 2024-10-11)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview4"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
showgrid="true"
inkscape:zoom="64.833333"
inkscape:cx="9"
inkscape:cy="8.6915168"
inkscape:window-width="2560"
inkscape:window-height="1369"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="g15"><inkscape:grid
id="grid4"
units="px"
originx="0"
originy="0"
spacingx="1"
spacingy="1"
empcolor="#0099e5"
empopacity="0.30196078"
color="#0099e5"
opacity="0.14901961"
empspacing="5"
enabled="true"
visible="false" /><inkscape:grid
type="axonomgrid"
id="grid8"
units="pt"
originx="9"
originy="9"
spacingx="3.7795276"
spacingy="1.3333333"
empcolor="#0099e5"
empopacity="0.30196078"
color="#0099e5"
opacity="0.14901961"
empspacing="4"
dotted="false"
gridanglex="36"
gridanglez="36"
enabled="true"
visible="true" /><inkscape:grid
type="modular"
id="grid9"
units="px"
originx="0"
originy="0"
spacingx="151.1811"
spacingy="151.1811"
empcolor="#0047cb"
empopacity="0.30196078"
color="#0099e5"
opacity="0.14901961"
empspacing="0"
marginx="0"
marginy="0"
gapx="37.795276"
gapy="37.795276"
enabled="true"
visible="true" /><inkscape:grid
type="axonomgrid"
id="grid10"
units="px"
originx="0"
originy="0"
spacingx="3.7795276"
spacingy="3.7795276"
empcolor="#0099e5"
empopacity="0.30196078"
color="#0099e5"
opacity="0.14901961"
empspacing="5"
dotted="false"
gridanglex="30"
gridanglez="30"
enabled="false"
visible="true" /></sodipodi:namedview><defs
id="defs4" />
<g
id="g15"
transform="matrix(0.129199,0,0,0.129199,22.9215,0.522556)">
<g
transform="matrix(8.25599,0,0,8.25599,-182.056,-21.0726)"
id="g1"
style="display:inline">
<circle
cx="9"
cy="10.5"
r="7.5"
style="display:inline;fill:#c4c4c4"
id="circle1" />
</g>
<g
id="g19"
inkscape:label="grid"
style="display:inline;stroke:#8d8d8d;stroke-opacity:1;stroke-linecap:square"><path
id="path3"
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:1.5;display:inline;stroke:#8d8d8d;stroke-opacity:1;fill:none;fill-opacity:0.7;stroke-width:1.032;stroke-dasharray:none;paint-order:fill markers stroke"
d="M -157.72198 101.92044 L -57.660489 29.22151 " /><path
id="path8"
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:1.5;display:inline;stroke:#8d8d8d;stroke-opacity:1;fill:none;fill-opacity:0.7;stroke-width:1.032;stroke-dasharray:none;paint-order:fill markers stroke"
d="M -130.16207 123.17697 L -45.951829 61.994656 " /><path
id="path10"
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:1.5;display:inline;stroke:#8d8d8d;stroke-opacity:1;fill:none;fill-opacity:0.7;stroke-width:1.032;stroke-dasharray:none;paint-order:fill markers stroke"
d="M -169.42074 62.090704 L -85.342701 123.17697 " /><path
id="path21"
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:1.5;display:inline;stroke:#8d8d8d;stroke-opacity:1;fill:none;fill-opacity:0.7;stroke-width:1.032;stroke-dasharray:none;paint-order:fill markers stroke"
d="M -169.42074 69.140098 L -85.210515 7.9577807 " /><path
id="path23"
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:1.5;display:inline;stroke:#8d8d8d;stroke-opacity:1;fill:none;fill-opacity:0.7;stroke-width:1.032;stroke-dasharray:none;paint-order:fill markers stroke"
d="M -130.16206 8.0538225 L -46.084024 69.140097 " /><path
id="path25"
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:1.5;display:inline;stroke:#8d8d8d;stroke-opacity:1;fill:none;fill-opacity:0.7;stroke-width:1.032;stroke-dasharray:none;paint-order:fill markers stroke"
d="M -57.782786 101.92044 L -157.72198 29.310363 " /><circle
cx="9"
cy="10.5"
r="7.5"
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;display:inline;fill:none;stroke:#000000;stroke-opacity:1;stroke-width:0.28125025;stroke-dasharray:none;stroke-dashoffset:0"
id="circle2"
transform="matrix(8.2559904,0,0,8.2559904,-182.056,-21.0726)" /></g><path
style="display:inline;fill:#ff3c5b;fill-opacity:1;stroke:#ff3c5b;stroke-width:10.32;stroke-dasharray:none;paint-order:fill markers stroke"
d="m -114.85451,70.775398 -31.59786,22.95719"
id="path6"
sodipodi:nodetypes="cc" /><path
style="display:inline;fill:#64c818;fill-opacity:1;stroke:#64c818;stroke-width:10.32;stroke-dasharray:none;paint-order:fill markers stroke"
d="m -100.65025,70.775398 31.597858,22.95719"
id="path5"
sodipodi:nodetypes="cc" /><path
style="clip-rule:evenodd;display:inline;fill:#2f88e9;fill-opacity:1;fill-rule:evenodd;stroke:#2f88e9;stroke-width:1.33333;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;stroke-dasharray:none;paint-order:fill markers stroke"
d="M 8.9999995,8 V 3"
id="path4"
sodipodi:nodetypes="cc"
transform="matrix(7.739998,0,0,7.739998,-177.41236,-4.0445824)" /><path
style="display:none;fill:#e6e6e6;fill-opacity:0.7;stroke:#1a1a1a;stroke-width:1.032;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke"
d="m -86.44599,50.135404 -21.30639,-15.479996 -21.30638,15.479996 21.30638,15.479996 z"
id="path11" /><path
style="display:none;fill:#b3b3b3;fill-opacity:0.7;stroke:#1a1a1a;stroke-width:1.032;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke"
d="m -129.05876,50.135404 v 30.959992 l 21.30638,15.479996 V 65.6154 Z"
id="path12" /><path
style="display:none;fill:#999999;fill-opacity:0.7;stroke:#1a1a1a;stroke-width:1.032;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke"
d="M -107.75238,96.575392 -86.44599,81.095396 V 50.135404 L -107.75238,65.6154 Z"
id="path13" /></g>
</svg>

Before

Width:  |  Height:  |  Size: 7.0 KiB

View File

@@ -1,167 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="100%"
height="100%"
viewBox="0 0 18 18"
version="1.1"
xml:space="preserve"
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;"
id="svg4"
sodipodi:docname="axis_toggle_dark_test.svg"
inkscape:version="1.4 (86a8ad7, 2024-10-11)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview4"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
showgrid="true"
inkscape:zoom="64.833333"
inkscape:cx="9"
inkscape:cy="8.6915168"
inkscape:window-width="2560"
inkscape:window-height="1369"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="g19"><inkscape:grid
id="grid4"
units="px"
originx="0"
originy="0"
spacingx="1"
spacingy="1"
empcolor="#0099e5"
empopacity="0.30196078"
color="#0099e5"
opacity="0.14901961"
empspacing="5"
enabled="true"
visible="false" /><inkscape:grid
type="axonomgrid"
id="grid8"
units="pt"
originx="9"
originy="9"
spacingx="3.7795276"
spacingy="1.3333333"
empcolor="#0099e5"
empopacity="0.30196078"
color="#0099e5"
opacity="0.14901961"
empspacing="4"
dotted="false"
gridanglex="36"
gridanglez="36"
enabled="true"
visible="true" /><inkscape:grid
type="modular"
id="grid9"
units="px"
originx="0"
originy="0"
spacingx="151.1811"
spacingy="151.1811"
empcolor="#0047cb"
empopacity="0.30196078"
color="#0099e5"
opacity="0.14901961"
empspacing="0"
marginx="0"
marginy="0"
gapx="37.795276"
gapy="37.795276"
enabled="true"
visible="true" /><inkscape:grid
type="axonomgrid"
id="grid10"
units="px"
originx="0"
originy="0"
spacingx="3.7795276"
spacingy="3.7795276"
empcolor="#0099e5"
empopacity="0.30196078"
color="#0099e5"
opacity="0.14901961"
empspacing="5"
dotted="false"
gridanglex="30"
gridanglez="30"
enabled="false"
visible="true" /></sodipodi:namedview><defs
id="defs4" />
<g
id="g15"
transform="matrix(0.129199,0,0,0.129199,22.9215,0.522556)">
<g
transform="matrix(8.25599,0,0,8.25599,-182.056,-21.0726)"
id="g1"
style="display:inline">
<circle
cx="9"
cy="10.5"
r="7.5"
style="display:inline;fill:#3b3b3b"
id="circle1" />
</g>
<g
id="g19"
inkscape:label="grid"
style="display:inline;stroke:#8d8d8d;stroke-opacity:1;stroke-linecap:square"><path
id="path3"
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:1.5;display:inline;stroke:#8d8d8d;stroke-opacity:1;fill:none;fill-opacity:0.7;stroke-width:1.032;stroke-dasharray:none;paint-order:fill markers stroke"
d="M -157.72198 101.92044 L -57.660489 29.22151 " /><path
id="path8"
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:1.5;display:inline;stroke:#8d8d8d;stroke-opacity:1;fill:none;fill-opacity:0.7;stroke-width:1.032;stroke-dasharray:none;paint-order:fill markers stroke"
d="M -130.16207 123.17697 L -45.951829 61.994656 " /><path
id="path10"
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:1.5;display:inline;stroke:#8d8d8d;stroke-opacity:1;fill:none;fill-opacity:0.7;stroke-width:1.032;stroke-dasharray:none;paint-order:fill markers stroke"
d="M -169.42074 62.090704 L -85.342701 123.17697 " /><path
id="path21"
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:1.5;display:inline;stroke:#8d8d8d;stroke-opacity:1;fill:none;fill-opacity:0.7;stroke-width:1.032;stroke-dasharray:none;paint-order:fill markers stroke"
d="M -169.42074 69.140098 L -85.210515 7.9577807 " /><path
id="path23"
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:1.5;display:inline;stroke:#8d8d8d;stroke-opacity:1;fill:none;fill-opacity:0.7;stroke-width:1.032;stroke-dasharray:none;paint-order:fill markers stroke"
d="M -130.16206 8.0538225 L -46.084024 69.140097 " /><path
id="path25"
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:1.5;display:inline;stroke:#8d8d8d;stroke-opacity:1;fill:none;fill-opacity:0.7;stroke-width:1.032;stroke-dasharray:none;paint-order:fill markers stroke"
d="M -57.782786 101.92044 L -157.72198 29.310363 " /><circle
cx="9"
cy="10.5"
r="7.5"
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;display:inline;fill:none;stroke:#000000;stroke-opacity:1;stroke-width:0.28125025;stroke-dasharray:none;stroke-dashoffset:0"
id="circle2"
transform="matrix(8.2559904,0,0,8.2559904,-182.056,-21.0726)" /></g><path
style="display:inline;fill:#ff3c5b;fill-opacity:1;stroke:#ff3c5b;stroke-width:10.32;stroke-dasharray:none;paint-order:fill markers stroke"
d="m -114.85451,70.775398 -31.59786,22.95719"
id="path6"
sodipodi:nodetypes="cc" /><path
style="display:inline;fill:#64c818;fill-opacity:1;stroke:#64c818;stroke-width:10.32;stroke-dasharray:none;paint-order:fill markers stroke"
d="m -100.65025,70.775398 31.597858,22.95719"
id="path5"
sodipodi:nodetypes="cc" /><path
style="clip-rule:evenodd;display:inline;fill:#2f88e9;fill-opacity:1;fill-rule:evenodd;stroke:#2f88e9;stroke-width:1.33333;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;stroke-dasharray:none;paint-order:fill markers stroke"
d="m 8.9999995,8 0,-5"
id="path4"
sodipodi:nodetypes="cc"
transform="matrix(7.739998,0,0,7.739998,-177.41236,-4.0445824)" /><path
style="display:none;fill:#e6e6e6;fill-opacity:0.7;stroke:#1a1a1a;stroke-width:1.032;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke"
d="m -86.44599,50.135404 -21.30639,-15.479996 -21.30638,15.479996 21.30638,15.479996 z"
id="path11" /><path
style="display:none;fill:#b3b3b3;fill-opacity:0.7;stroke:#1a1a1a;stroke-width:1.032;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke"
d="m -129.05876,50.135404 v 30.959992 l 21.30638,15.479996 V 65.6154 Z"
id="path12" /><path
style="display:none;fill:#999999;fill-opacity:0.7;stroke:#1a1a1a;stroke-width:1.032;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke"
d="M -107.75238,96.575392 -86.44599,81.095396 V 50.135404 L -107.75238,65.6154 Z"
id="path13" /></g>
</svg>

Before

Width:  |  Height:  |  Size: 7.1 KiB

View File

@@ -1,167 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="100%"
height="100%"
viewBox="0 0 18 18"
version="1.1"
xml:space="preserve"
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;"
id="svg4"
sodipodi:docname="axis_toggle_hover.svg"
inkscape:version="1.4 (86a8ad7, 2024-10-11)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview4"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
showgrid="true"
inkscape:zoom="64.833333"
inkscape:cx="9"
inkscape:cy="8.6915168"
inkscape:window-width="2560"
inkscape:window-height="1369"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="g15"><inkscape:grid
id="grid4"
units="px"
originx="0"
originy="0"
spacingx="1"
spacingy="1"
empcolor="#0099e5"
empopacity="0.30196078"
color="#0099e5"
opacity="0.14901961"
empspacing="5"
enabled="true"
visible="false" /><inkscape:grid
type="axonomgrid"
id="grid8"
units="pt"
originx="9"
originy="9"
spacingx="3.7795276"
spacingy="1.3333333"
empcolor="#0099e5"
empopacity="0.30196078"
color="#0099e5"
opacity="0.14901961"
empspacing="4"
dotted="false"
gridanglex="36"
gridanglez="36"
enabled="true"
visible="true" /><inkscape:grid
type="modular"
id="grid9"
units="px"
originx="0"
originy="0"
spacingx="151.1811"
spacingy="151.1811"
empcolor="#0047cb"
empopacity="0.30196078"
color="#0099e5"
opacity="0.14901961"
empspacing="0"
marginx="0"
marginy="0"
gapx="37.795276"
gapy="37.795276"
enabled="true"
visible="true" /><inkscape:grid
type="axonomgrid"
id="grid10"
units="px"
originx="0"
originy="0"
spacingx="3.7795276"
spacingy="3.7795276"
empcolor="#0099e5"
empopacity="0.30196078"
color="#0099e5"
opacity="0.14901961"
empspacing="5"
dotted="false"
gridanglex="30"
gridanglez="30"
enabled="false"
visible="true" /></sodipodi:namedview><defs
id="defs4" />
<g
id="g15"
transform="matrix(0.129199,0,0,0.129199,22.9215,0.522556)">
<g
transform="matrix(8.25599,0,0,8.25599,-182.056,-21.0726)"
id="g1"
style="display:inline">
<circle
cx="9"
cy="10.5"
r="7.5"
style="display:inline;fill:#c4c4c4"
id="circle1" />
</g>
<g
id="g19"
inkscape:label="grid"
style="display:inline;stroke:#8d8d8d;stroke-opacity:1;stroke-linecap:square"><path
id="path3"
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:1.5;display:inline;stroke:#8d8d8d;stroke-opacity:1;fill:none;fill-opacity:0.7;stroke-width:1.032;stroke-dasharray:none;paint-order:fill markers stroke"
d="M -157.72198 101.92044 L -57.660489 29.22151 " /><path
id="path8"
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:1.5;display:inline;stroke:#8d8d8d;stroke-opacity:1;fill:none;fill-opacity:0.7;stroke-width:1.032;stroke-dasharray:none;paint-order:fill markers stroke"
d="M -130.16207 123.17697 L -45.951829 61.994656 " /><path
id="path10"
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:1.5;display:inline;stroke:#8d8d8d;stroke-opacity:1;fill:none;fill-opacity:0.7;stroke-width:1.032;stroke-dasharray:none;paint-order:fill markers stroke"
d="M -169.42074 62.090704 L -85.342701 123.17697 " /><path
id="path21"
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:1.5;display:inline;stroke:#8d8d8d;stroke-opacity:1;fill:none;fill-opacity:0.7;stroke-width:1.032;stroke-dasharray:none;paint-order:fill markers stroke"
d="M -169.42074 69.140098 L -85.210515 7.9577807 " /><path
id="path23"
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:1.5;display:inline;stroke:#8d8d8d;stroke-opacity:1;fill:none;fill-opacity:0.7;stroke-width:1.032;stroke-dasharray:none;paint-order:fill markers stroke"
d="M -130.16206 8.0538225 L -46.084024 69.140097 " /><path
id="path25"
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:1.5;display:inline;stroke:#8d8d8d;stroke-opacity:1;fill:none;fill-opacity:0.7;stroke-width:1.032;stroke-dasharray:none;paint-order:fill markers stroke"
d="M -57.782786 101.92044 L -157.72198 29.310363 " /><circle
cx="9"
cy="10.5"
r="7.5"
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;display:inline;fill:none;stroke:#000000;stroke-opacity:1;stroke-width:0.28125025;stroke-dasharray:none;stroke-dashoffset:0"
id="circle2"
transform="matrix(8.2559904,0,0,8.2559904,-182.056,-21.0726)" /></g><path
style="display:none;fill:#ff3c5b;fill-opacity:1;stroke:#ff3c5b;stroke-width:10.32;stroke-dasharray:none;paint-order:fill markers stroke"
d="m -114.85451,70.775398 -31.59786,22.95719"
id="path6"
sodipodi:nodetypes="cc" /><path
style="display:none;fill:#64c818;fill-opacity:1;stroke:#64c818;stroke-width:10.32;stroke-dasharray:none;paint-order:fill markers stroke"
d="m -100.65025,70.775398 31.597858,22.95719"
id="path5"
sodipodi:nodetypes="cc" /><path
style="clip-rule:evenodd;display:none;fill:#2f88e9;fill-opacity:1;fill-rule:evenodd;stroke:#2f88e9;stroke-width:1.33333;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;stroke-dasharray:none;paint-order:fill markers stroke"
d="M 8.9999995,8 V 3"
id="path4"
sodipodi:nodetypes="cc"
transform="matrix(7.739998,0,0,7.739998,-177.41236,-4.0445824)" /><path
style="display:none;fill:#e6e6e6;fill-opacity:0.7;stroke:#1a1a1a;stroke-width:1.032;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke"
d="m -86.44599,50.135404 -21.30639,-15.479996 -21.30638,15.479996 21.30638,15.479996 z"
id="path11" /><path
style="display:none;fill:#b3b3b3;fill-opacity:0.7;stroke:#1a1a1a;stroke-width:1.032;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke"
d="m -129.05876,50.135404 v 30.959992 l 21.30638,15.479996 V 65.6154 Z"
id="path12" /><path
style="display:none;fill:#999999;fill-opacity:0.7;stroke:#1a1a1a;stroke-width:1.032;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke"
d="M -107.75238,96.575392 -86.44599,81.095396 V 50.135404 L -107.75238,65.6154 Z"
id="path13" /></g>
</svg>

Before

Width:  |  Height:  |  Size: 7.0 KiB

View File

@@ -1,167 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="100%"
height="100%"
viewBox="0 0 18 18"
version="1.1"
xml:space="preserve"
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;"
id="svg4"
sodipodi:docname="axis_toggle_hover_dark.svg"
inkscape:version="1.4 (86a8ad7, 2024-10-11)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview4"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
showgrid="true"
inkscape:zoom="64.833333"
inkscape:cx="9"
inkscape:cy="8.6915168"
inkscape:window-width="2560"
inkscape:window-height="1369"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="g19"><inkscape:grid
id="grid4"
units="px"
originx="0"
originy="0"
spacingx="1"
spacingy="1"
empcolor="#0099e5"
empopacity="0.30196078"
color="#0099e5"
opacity="0.14901961"
empspacing="5"
enabled="true"
visible="false" /><inkscape:grid
type="axonomgrid"
id="grid8"
units="pt"
originx="9"
originy="9"
spacingx="3.7795276"
spacingy="1.3333333"
empcolor="#0099e5"
empopacity="0.30196078"
color="#0099e5"
opacity="0.14901961"
empspacing="4"
dotted="false"
gridanglex="36"
gridanglez="36"
enabled="true"
visible="true" /><inkscape:grid
type="modular"
id="grid9"
units="px"
originx="0"
originy="0"
spacingx="151.1811"
spacingy="151.1811"
empcolor="#0047cb"
empopacity="0.30196078"
color="#0099e5"
opacity="0.14901961"
empspacing="0"
marginx="0"
marginy="0"
gapx="37.795276"
gapy="37.795276"
enabled="true"
visible="true" /><inkscape:grid
type="axonomgrid"
id="grid10"
units="px"
originx="0"
originy="0"
spacingx="3.7795276"
spacingy="3.7795276"
empcolor="#0099e5"
empopacity="0.30196078"
color="#0099e5"
opacity="0.14901961"
empspacing="5"
dotted="false"
gridanglex="30"
gridanglez="30"
enabled="false"
visible="true" /></sodipodi:namedview><defs
id="defs4" />
<g
id="g15"
transform="matrix(0.129199,0,0,0.129199,22.9215,0.522556)">
<g
transform="matrix(8.25599,0,0,8.25599,-182.056,-21.0726)"
id="g1"
style="display:inline">
<circle
cx="9"
cy="10.5"
r="7.5"
style="display:inline;fill:#3b3b3b"
id="circle1" />
</g>
<g
id="g19"
inkscape:label="grid"
style="display:inline;stroke:#8d8d8d;stroke-opacity:1;stroke-linecap:square"><path
id="path3"
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:1.5;display:inline;stroke:#8d8d8d;stroke-opacity:1;fill:none;fill-opacity:0.7;stroke-width:1.032;stroke-dasharray:none;paint-order:fill markers stroke"
d="M -157.72198 101.92044 L -57.660489 29.22151 " /><path
id="path8"
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:1.5;display:inline;stroke:#8d8d8d;stroke-opacity:1;fill:none;fill-opacity:0.7;stroke-width:1.032;stroke-dasharray:none;paint-order:fill markers stroke"
d="M -130.16207 123.17697 L -45.951829 61.994656 " /><path
id="path10"
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:1.5;display:inline;stroke:#8d8d8d;stroke-opacity:1;fill:none;fill-opacity:0.7;stroke-width:1.032;stroke-dasharray:none;paint-order:fill markers stroke"
d="M -169.42074 62.090704 L -85.342701 123.17697 " /><path
id="path21"
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:1.5;display:inline;stroke:#8d8d8d;stroke-opacity:1;fill:none;fill-opacity:0.7;stroke-width:1.032;stroke-dasharray:none;paint-order:fill markers stroke"
d="M -169.42074 69.140098 L -85.210515 7.9577807 " /><path
id="path23"
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:1.5;display:inline;stroke:#8d8d8d;stroke-opacity:1;fill:none;fill-opacity:0.7;stroke-width:1.032;stroke-dasharray:none;paint-order:fill markers stroke"
d="M -130.16206 8.0538225 L -46.084024 69.140097 " /><path
id="path25"
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:1.5;display:inline;stroke:#8d8d8d;stroke-opacity:1;fill:none;fill-opacity:0.7;stroke-width:1.032;stroke-dasharray:none;paint-order:fill markers stroke"
d="M -57.782786 101.92044 L -157.72198 29.310363 " /><circle
cx="9"
cy="10.5"
r="7.5"
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;display:inline;fill:none;stroke:#000000;stroke-opacity:1;stroke-width:0.28125025;stroke-dasharray:none;stroke-dashoffset:0"
id="circle2"
transform="matrix(8.2559904,0,0,8.2559904,-182.056,-21.0726)" /></g><path
style="display:none;fill:#ff3c5b;fill-opacity:1;stroke:#ff3c5b;stroke-width:10.32;stroke-dasharray:none;paint-order:fill markers stroke"
d="m -114.85451,70.775398 -31.59786,22.95719"
id="path6"
sodipodi:nodetypes="cc" /><path
style="display:none;fill:#64c818;fill-opacity:1;stroke:#64c818;stroke-width:10.32;stroke-dasharray:none;paint-order:fill markers stroke"
d="m -100.65025,70.775398 31.597858,22.95719"
id="path5"
sodipodi:nodetypes="cc" /><path
style="clip-rule:evenodd;display:none;fill:#2f88e9;fill-opacity:1;fill-rule:evenodd;stroke:#2f88e9;stroke-width:1.33333;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;stroke-dasharray:none;paint-order:fill markers stroke"
d="M 8.9999995,8 V 3"
id="path4"
sodipodi:nodetypes="cc"
transform="matrix(7.739998,0,0,7.739998,-177.41236,-4.0445824)" /><path
style="display:none;fill:#e6e6e6;fill-opacity:0.7;stroke:#1a1a1a;stroke-width:1.032;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke"
d="m -86.44599,50.135404 -21.30639,-15.479996 -21.30638,15.479996 21.30638,15.479996 z"
id="path11" /><path
style="display:none;fill:#b3b3b3;fill-opacity:0.7;stroke:#1a1a1a;stroke-width:1.032;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke"
d="m -129.05876,50.135404 v 30.959992 l 21.30638,15.479996 V 65.6154 Z"
id="path12" /><path
style="display:none;fill:#999999;fill-opacity:0.7;stroke:#1a1a1a;stroke-width:1.032;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke"
d="M -107.75238,96.575392 -86.44599,81.095396 V 50.135404 L -107.75238,65.6154 Z"
id="path13" /></g>
</svg>

Before

Width:  |  Height:  |  Size: 7.0 KiB

View File

@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg id="a" xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewBox="0 0 36 36"><circle cx="17.5" cy="17.5" r="17.5" style="fill:#fafafa;"/><line x1="10.5" y1="11.5" x2="24.5" y2="11.5" style="fill:none; stroke:#2b3436; stroke-linecap:round; stroke-linejoin:round;"/><line x1="10.5" y1="17.5" x2="24.5" y2="17.5" style="fill:none; stroke:#2b3436; stroke-linecap:round; stroke-linejoin:round;"/><line x1="10.5" y1="23.5" x2="24.5" y2="23.5" style="fill:none; stroke:#2b3436; stroke-linecap:round; stroke-linejoin:round;"/></svg>

After

Width:  |  Height:  |  Size: 575 B

View File

@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg id="a" xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewBox="0 0 36 36"><circle cx="17.5" cy="17.5" r="17.5" style="fill:#393c42;"/><line x1="10.5" y1="11.5" x2="24.5" y2="11.5" style="fill:none; stroke:#b6b6b6; stroke-linecap:round; stroke-linejoin:round;"/><line x1="10.5" y1="17.5" x2="24.5" y2="17.5" style="fill:none; stroke:#b6b6b6; stroke-linecap:round; stroke-linejoin:round;"/><line x1="10.5" y1="23.5" x2="24.5" y2="23.5" style="fill:none; stroke:#b6b6b6; stroke-linecap:round; stroke-linejoin:round;"/></svg>

After

Width:  |  Height:  |  Size: 575 B

View File

@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg id="a" xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewBox="0 0 36 36"><circle cx="17.5" cy="17.5" r="17.5" style="fill:#283232;"/><line x1="10.5" y1="11.5" x2="24.5" y2="11.5" style="fill:none; stroke:#b6b6b6; stroke-linecap:round; stroke-linejoin:round;"/><line x1="10.5" y1="17.5" x2="24.5" y2="17.5" style="fill:none; stroke:#b6b6b6; stroke-linecap:round; stroke-linejoin:round;"/><line x1="10.5" y1="23.5" x2="24.5" y2="23.5" style="fill:none; stroke:#b6b6b6; stroke-linecap:round; stroke-linejoin:round;"/></svg>

After

Width:  |  Height:  |  Size: 575 B

View File

@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg id="a" xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewBox="0 0 36 36"><circle cx="17.5" cy="17.5" r="17.5" style="fill:#e5f0ee;"/><line x1="10.5" y1="11.5" x2="24.5" y2="11.5" style="fill:none; stroke:#2b3436; stroke-linecap:round; stroke-linejoin:round;"/><line x1="10.5" y1="17.5" x2="24.5" y2="17.5" style="fill:none; stroke:#2b3436; stroke-linecap:round; stroke-linejoin:round;"/><line x1="10.5" y1="23.5" x2="24.5" y2="23.5" style="fill:none; stroke:#2b3436; stroke-linecap:round; stroke-linejoin:round;"/></svg>

After

Width:  |  Height:  |  Size: 575 B

View File

@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg id="a" xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewBox="0 0 36 36"><circle cx="17" cy="17" r="17" style="fill:#fafafa;"/><circle cx="16.03" cy="15.97" r="6.47" style="fill:none; stroke:#2b3436; stroke-miterlimit:10;"/><path d="M11.56,15.97c0-2.47,2-4.47,4.47-4.47" style="fill:none; stroke:#2b3436; stroke-miterlimit:10;"/><line x1="20.53" y1="20.47" x2="24.5" y2="24.5" style="fill:none; stroke:#2b3436; stroke-miterlimit:10;"/></svg>

After

Width:  |  Height:  |  Size: 496 B

View File

@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg id="a" xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewBox="0 0 36 36"><circle cx="17.5" cy="17.5" r="17.5" style="fill:#393c42;"/><circle cx="16.03" cy="15.97" r="6.47" style="fill:none; stroke:#b6b6b6; stroke-miterlimit:10; stroke-width:1.08px;"/><path d="M11.56,15.97c0-2.47,2-4.47,4.47-4.47" style="fill:none; stroke:#b6b6b6; stroke-miterlimit:10; stroke-width:.75px;"/><line x1="20.53" y1="20.47" x2="24.5" y2="24.5" style="fill:none; stroke:#b6b6b6; stroke-miterlimit:10;"/></svg>

After

Width:  |  Height:  |  Size: 543 B

View File

@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg id="a" xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewBox="0 0 36 36"><circle cx="17.5" cy="17.5" r="17.5" style="fill:#283232;"/><circle cx="16.03" cy="15.97" r="6.47" style="fill:none; stroke:#b6b6b6; stroke-miterlimit:10; stroke-width:1.08px;"/><path d="M11.56,15.97c0-2.47,2-4.47,4.47-4.47" style="fill:none; stroke:#b6b6b6; stroke-miterlimit:10; stroke-width:.75px;"/><line x1="20.53" y1="20.47" x2="24.5" y2="24.5" style="fill:none; stroke:#b6b6b6; stroke-miterlimit:10;"/></svg>

After

Width:  |  Height:  |  Size: 543 B

View File

@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg id="a" xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewBox="0 0 36 36"><circle cx="17.5" cy="17.5" r="17.5" style="fill:#e5f0ee;"/><circle cx="16.03" cy="15.97" r="6.47" style="fill:none; stroke:#2b3436; stroke-miterlimit:10;"/><path d="M11.56,15.97c0-2.47,2-4.47,4.47-4.47" style="fill:none; stroke:#2b3436; stroke-miterlimit:10;"/><line x1="20.53" y1="20.47" x2="24.5" y2="24.5" style="fill:none; stroke:#2b3436; stroke-miterlimit:10;"/></svg>

After

Width:  |  Height:  |  Size: 502 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M15.5,22.5l-14-14m21,7-14-14m0,21-7-7m21-7-7-7M2.086,2.086,21.914,21.914" style="fill:none;stroke:#949494;stroke-linecap:round;stroke-linejoin:round;opacity:0.75"/><path d="M8.5,22.5l14-14m-21,7,14-14m0,21,7-7m-21-7,7-7m13.414.586L2.086,21.914" style="fill:none;stroke:#009688;stroke-linecap:round;stroke-linejoin:round"/><path d="M3.5,1.5h17a2,2,0,0,1,2,2v17a2,2,0,0,1-2,2H3.5a2,2,0,0,1-2-2V3.5A2,2,0,0,1,3.5,1.5Z" style="fill:none;stroke:#949494;stroke-linecap:round;stroke-linejoin:round"/></svg>

Before

Width:  |  Height:  |  Size: 591 B

View File

@@ -41,7 +41,7 @@
"before_layer_change_gcode": "; BEFORE_LAYER_CHANGE [layer_num] @ [layer_z]mm", "before_layer_change_gcode": "; BEFORE_LAYER_CHANGE [layer_num] @ [layer_z]mm",
"best_object_pos": "0.5,0.5", "best_object_pos": "0.5,0.5",
"change_extrusion_role_gcode": "", "change_extrusion_role_gcode": "",
"change_filament_gcode": "", "change_filament_gcode": "; FLUSH_START\n;;; M400 P0\nT[next_extruder] ; change extruder\n; 1\n;;; G90\n;;; G1 Z{toolchange_z+2} F480\n;;; G1 X261 Y25 F12000\n;;; G1 Y1 F600\n;;; M400 P2730\n;;; G1 Y25 F3000\n;;; M400 P76250\n;;; M400 P35780\n; 2.1\n;;; G90\n;;; G1 Z{toolchange_z+2} F480\n;;; G1 X47 Y230 F12000\n;;; M400 P0\n; 2.2\n;;; G1 X47 Y276 F600\n;;; G1 X47 Y230 F12000\n;;; G1 X47 Y276 F600\n;;; G1 X47 Y230 F12000\n; 3.1\n;;; G1 F36000\n;;; G1 Y250\n;;; G1 F8000\n;;; G1 X81\n;;; G1 Y273\n; 3.2\n;;; G1 F8000\n;;; G1 X96\n;;; G1 X81\n;;; G1 F8000\n;;; G1 X96\n;;; G1 X81\n;;; G1 F8000\n;;; G1 X96\n;;; G1 X81\n;;; G1 X96\n;;; G1 X81\n;;; G1 X96\n;;; G1 X81\n;;; G1 X96\n;;; G1 X81\n; 3.3\n;;; G1 X72\n;;; G1 X77\n;;; G1 Z{toolchange_z}\n;;; M400 P0\n; FLUSH_END",
"cooling_tube_length": "0", "cooling_tube_length": "0",
"cooling_tube_retraction": "0", "cooling_tube_retraction": "0",
"deretraction_speed": [ "deretraction_speed": [

View File

@@ -1405,6 +1405,10 @@
"name": "Generic PLA-CF @base", "name": "Generic PLA-CF @base",
"sub_path": "filament/Generic PLA-CF @base.json" "sub_path": "filament/Generic PLA-CF @base.json"
}, },
{
"name": "Numakers PLA+ @base",
"sub_path": "filament/Numakers/Numakers PLA+ @base.json"
},
{ {
"name": "Overture Matte PLA @base", "name": "Overture Matte PLA @base",
"sub_path": "filament/Overture/Overture Matte PLA @base.json" "sub_path": "filament/Overture/Overture Matte PLA @base.json"
@@ -1458,12 +1462,12 @@
"sub_path": "filament/Polymaker/Panchroma PLA Neon @base.json" "sub_path": "filament/Polymaker/Panchroma PLA Neon @base.json"
}, },
{ {
"name": "Panchroma PLA Silk @base", "name": "Panchroma PLA Satin @base",
"sub_path": "filament/Polymaker/Panchroma PLA Silk @base.json" "sub_path": "filament/Polymaker/Panchroma PLA Satin @base.json"
}, },
{ {
"name": "Panchroma PLA Stain @base", "name": "Panchroma PLA Silk @base",
"sub_path": "filament/Polymaker/Panchroma PLA Stain @base.json" "sub_path": "filament/Polymaker/Panchroma PLA Silk @base.json"
}, },
{ {
"name": "Panchroma PLA Starlight @base", "name": "Panchroma PLA Starlight @base",
@@ -5101,6 +5105,42 @@
"name": "Generic PLA-CF @BBL P2S", "name": "Generic PLA-CF @BBL P2S",
"sub_path": "filament/Generic PLA-CF @BBL P2S.json" "sub_path": "filament/Generic PLA-CF @BBL P2S.json"
}, },
{
"name": "Numakers PLA+ @BBL A1",
"sub_path": "filament/Numakers/Numakers PLA+ @BBL A1.json"
},
{
"name": "Numakers PLA+ @BBL A1 0.2 nozzle",
"sub_path": "filament/Numakers/Numakers PLA+ @BBL A1 0.2 nozzle.json"
},
{
"name": "Numakers PLA+ @BBL A1M",
"sub_path": "filament/Numakers/Numakers PLA+ @BBL A1M.json"
},
{
"name": "Numakers PLA+ @BBL A1M 0.2 nozzle",
"sub_path": "filament/Numakers/Numakers PLA+ @BBL A1M 0.2 nozzle.json"
},
{
"name": "Numakers PLA+ @BBL P1P",
"sub_path": "filament/Numakers/Numakers PLA+ @BBL P1P.json"
},
{
"name": "Numakers PLA+ @BBL P1P 0.2 nozzle",
"sub_path": "filament/Numakers/Numakers PLA+ @BBL P1P 0.2 nozzle.json"
},
{
"name": "Numakers PLA+ @BBL X1",
"sub_path": "filament/Numakers/Numakers PLA+ @BBL X1.json"
},
{
"name": "Numakers PLA+ @BBL X1C",
"sub_path": "filament/Numakers/Numakers PLA+ @BBL X1C.json"
},
{
"name": "Numakers PLA+ @BBL X1C 0.2 nozzle",
"sub_path": "filament/Numakers/Numakers PLA+ @BBL X1C 0.2 nozzle.json"
},
{ {
"name": "Overture Matte PLA @BBL A1", "name": "Overture Matte PLA @BBL A1",
"sub_path": "filament/Overture/Overture Matte PLA @BBL A1.json" "sub_path": "filament/Overture/Overture Matte PLA @BBL A1.json"
@@ -5641,6 +5681,46 @@
"name": "Panchroma PLA Neon @BBL X1C 0.2 nozzle", "name": "Panchroma PLA Neon @BBL X1C 0.2 nozzle",
"sub_path": "filament/Polymaker/Panchroma PLA Neon @BBL X1C 0.2 nozzle.json" "sub_path": "filament/Polymaker/Panchroma PLA Neon @BBL X1C 0.2 nozzle.json"
}, },
{
"name": "Panchroma PLA Satin @BBL A1",
"sub_path": "filament/Polymaker/Panchroma PLA Satin @BBL A1.json"
},
{
"name": "Panchroma PLA Satin @BBL A1 0.2 nozzle",
"sub_path": "filament/Polymaker/Panchroma PLA Satin @BBL A1 0.2 nozzle.json"
},
{
"name": "Panchroma PLA Satin @BBL A1M",
"sub_path": "filament/Polymaker/Panchroma PLA Satin @BBL A1M.json"
},
{
"name": "Panchroma PLA Satin @BBL A1M 0.2 nozzle",
"sub_path": "filament/Polymaker/Panchroma PLA Satin @BBL A1M 0.2 nozzle.json"
},
{
"name": "Panchroma PLA Satin @BBL P1P",
"sub_path": "filament/Polymaker/Panchroma PLA Satin @BBL P1P.json"
},
{
"name": "Panchroma PLA Satin @BBL P1P 0.2 nozzle",
"sub_path": "filament/Polymaker/Panchroma PLA Satin @BBL P1P 0.2 nozzle.json"
},
{
"name": "Panchroma PLA Satin @BBL X1",
"sub_path": "filament/Polymaker/Panchroma PLA Satin @BBL X1.json"
},
{
"name": "Panchroma PLA Satin @BBL X1 0.2 nozzle",
"sub_path": "filament/Polymaker/Panchroma PLA Satin @BBL X1 0.2 nozzle.json"
},
{
"name": "Panchroma PLA Satin @BBL X1C",
"sub_path": "filament/Polymaker/Panchroma PLA Satin @BBL X1C.json"
},
{
"name": "Panchroma PLA Satin @BBL X1C 0.2 nozzle",
"sub_path": "filament/Polymaker/Panchroma PLA Satin @BBL X1C 0.2 nozzle.json"
},
{ {
"name": "Panchroma PLA Silk @BBL A1", "name": "Panchroma PLA Silk @BBL A1",
"sub_path": "filament/Polymaker/Panchroma PLA Silk @BBL A1.json" "sub_path": "filament/Polymaker/Panchroma PLA Silk @BBL A1.json"
@@ -5677,46 +5757,6 @@
"name": "Panchroma PLA Silk @BBL X1C", "name": "Panchroma PLA Silk @BBL X1C",
"sub_path": "filament/Polymaker/Panchroma PLA Silk @BBL X1C.json" "sub_path": "filament/Polymaker/Panchroma PLA Silk @BBL X1C.json"
}, },
{
"name": "Panchroma PLA Stain @BBL A1",
"sub_path": "filament/Polymaker/Panchroma PLA Stain @BBL A1.json"
},
{
"name": "Panchroma PLA Stain @BBL A1 0.2 nozzle",
"sub_path": "filament/Polymaker/Panchroma PLA Stain @BBL A1 0.2 nozzle.json"
},
{
"name": "Panchroma PLA Stain @BBL A1M",
"sub_path": "filament/Polymaker/Panchroma PLA Stain @BBL A1M.json"
},
{
"name": "Panchroma PLA Stain @BBL A1M 0.2 nozzle",
"sub_path": "filament/Polymaker/Panchroma PLA Stain @BBL A1M 0.2 nozzle.json"
},
{
"name": "Panchroma PLA Stain @BBL P1P",
"sub_path": "filament/Polymaker/Panchroma PLA Stain @BBL P1P.json"
},
{
"name": "Panchroma PLA Stain @BBL P1P 0.2 nozzle",
"sub_path": "filament/Polymaker/Panchroma PLA Stain @BBL P1P 0.2 nozzle.json"
},
{
"name": "Panchroma PLA Stain @BBL X1",
"sub_path": "filament/Polymaker/Panchroma PLA Stain @BBL X1.json"
},
{
"name": "Panchroma PLA Stain @BBL X1 0.2 nozzle",
"sub_path": "filament/Polymaker/Panchroma PLA Stain @BBL X1 0.2 nozzle.json"
},
{
"name": "Panchroma PLA Stain @BBL X1C",
"sub_path": "filament/Polymaker/Panchroma PLA Stain @BBL X1C.json"
},
{
"name": "Panchroma PLA Stain @BBL X1C 0.2 nozzle",
"sub_path": "filament/Polymaker/Panchroma PLA Stain @BBL X1C 0.2 nozzle.json"
},
{ {
"name": "Panchroma PLA Starlight @BBL A1", "name": "Panchroma PLA Starlight @BBL A1",
"sub_path": "filament/Polymaker/Panchroma PLA Starlight @BBL A1.json" "sub_path": "filament/Polymaker/Panchroma PLA Starlight @BBL A1.json"
@@ -7661,46 +7701,6 @@
"name": "Overture TPU @BBL X1C 0.2 nozzle", "name": "Overture TPU @BBL X1C 0.2 nozzle",
"sub_path": "filament/Overture/Overture TPU @BBL X1C 0.2 nozzle.json" "sub_path": "filament/Overture/Overture TPU @BBL X1C 0.2 nozzle.json"
}, },
{
"name": "Numakers PLA+ @base",
"sub_path": "filament/Numakers/Numakers PLA+ @base.json"
},
{
"name": "Numakers PLA+ @BBL A1",
"sub_path": "filament/Numakers/Numakers PLA+ @BBL A1.json"
},
{
"name": "Numakers PLA+ @BBL A1 0.2 nozzle",
"sub_path": "filament/Numakers/Numakers PLA+ @BBL A1 0.2 nozzle.json"
},
{
"name": "Numakers PLA+ @BBL A1M",
"sub_path": "filament/Numakers/Numakers PLA+ @BBL A1M.json"
},
{
"name": "Numakers PLA+ @BBL A1M 0.2 nozzle",
"sub_path": "filament/Numakers/Numakers PLA+ @BBL A1M 0.2 nozzle.json"
},
{
"name": "Numakers PLA+ @BBL P1P",
"sub_path": "filament/Numakers/Numakers PLA+ @BBL P1P.json"
},
{
"name": "Numakers PLA+ @BBL P1P 0.2 nozzle",
"sub_path": "filament/Numakers/Numakers PLA+ @BBL P1P 0.2 nozzle.json"
},
{
"name": "Numakers PLA+ @BBL X1",
"sub_path": "filament/Numakers/Numakers PLA+ @BBL X1.json"
},
{
"name": "Numakers PLA+ @BBL X1C",
"sub_path": "filament/Numakers/Numakers PLA+ @BBL X1C.json"
},
{
"name": "Numakers PLA+ @BBL X1C 0.2 nozzle",
"sub_path": "filament/Numakers/Numakers PLA+ @BBL X1C 0.2 nozzle.json"
},
{ {
"name": "fdm_filament_dual_common", "name": "fdm_filament_dual_common",
"sub_path": "filament/fdm_filament_dual_common.json" "sub_path": "filament/fdm_filament_dual_common.json"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 31 KiB

View File

@@ -1,7 +1,8 @@
{ {
"type": "filament", "type": "filament",
"name": "Panchroma PLA Stain @BBL A1 0.2 nozzle", "name": "Panchroma PLA Satin @BBL A1 0.2 nozzle",
"inherits": "Panchroma PLA Stain @base", "renamed_from": "Panchroma PLA Stain @BBL A1 0.2 nozzle",
"inherits": "Panchroma PLA Satin @base",
"from": "system", "from": "system",
"setting_id": "GFSPM005_01", "setting_id": "GFSPM005_01",
"instantiation": "true", "instantiation": "true",

View File

@@ -1,7 +1,8 @@
{ {
"type": "filament", "type": "filament",
"name": "Panchroma PLA Stain @BBL A1", "name": "Panchroma PLA Satin @BBL A1",
"inherits": "Panchroma PLA Stain @base", "renamed_from": "Panchroma PLA Stain @BBL A1",
"inherits": "Panchroma PLA Satin @base",
"from": "system", "from": "system",
"setting_id": "GFSPM005_00", "setting_id": "GFSPM005_00",
"instantiation": "true", "instantiation": "true",

View File

@@ -1,7 +1,8 @@
{ {
"type": "filament", "type": "filament",
"name": "Panchroma PLA Stain @BBL A1M 0.2 nozzle", "name": "Panchroma PLA Satin @BBL A1M 0.2 nozzle",
"inherits": "Panchroma PLA Stain @base", "renamed_from": "Panchroma PLA Stain @BBL A1M 0.2 nozzle",
"inherits": "Panchroma PLA Satin @base",
"from": "system", "from": "system",
"setting_id": "GFSPM005_03", "setting_id": "GFSPM005_03",
"instantiation": "true", "instantiation": "true",

View File

@@ -1,7 +1,8 @@
{ {
"type": "filament", "type": "filament",
"name": "Panchroma PLA Stain @BBL A1M", "name": "Panchroma PLA Satin @BBL A1M",
"inherits": "Panchroma PLA Stain @base", "renamed_from": "Panchroma PLA Stain @BBL A1M",
"inherits": "Panchroma PLA Satin @base",
"from": "system", "from": "system",
"setting_id": "GFSPM005_02", "setting_id": "GFSPM005_02",
"instantiation": "true", "instantiation": "true",

View File

@@ -1,7 +1,8 @@
{ {
"type": "filament", "type": "filament",
"name": "Panchroma PLA Stain @BBL P1P 0.2 nozzle", "name": "Panchroma PLA Satin @BBL P1P 0.2 nozzle",
"inherits": "Panchroma PLA Stain @base", "renamed_from": "Panchroma PLA Stain @BBL P1P 0.2 nozzle",
"inherits": "Panchroma PLA Satin @base",
"from": "system", "from": "system",
"setting_id": "GFSPM005_05", "setting_id": "GFSPM005_05",
"instantiation": "true", "instantiation": "true",

View File

@@ -1,7 +1,8 @@
{ {
"type": "filament", "type": "filament",
"name": "Panchroma PLA Stain @BBL P1P", "name": "Panchroma PLA Satin @BBL P1P",
"inherits": "Panchroma PLA Stain @base", "renamed_from": "Panchroma PLA Stain @BBL P1P",
"inherits": "Panchroma PLA Satin @base",
"from": "system", "from": "system",
"setting_id": "GFSPM005_04", "setting_id": "GFSPM005_04",
"instantiation": "true", "instantiation": "true",

View File

@@ -1,7 +1,8 @@
{ {
"type": "filament", "type": "filament",
"name": "Panchroma PLA Stain @BBL X1 0.2 nozzle", "name": "Panchroma PLA Satin @BBL X1 0.2 nozzle",
"inherits": "Panchroma PLA Stain @base", "renamed_from": "Panchroma PLA Stain @BBL X1 0.2 nozzle",
"inherits": "Panchroma PLA Satin @base",
"from": "system", "from": "system",
"setting_id": "GFSPM005_07", "setting_id": "GFSPM005_07",
"instantiation": "true", "instantiation": "true",

View File

@@ -1,7 +1,8 @@
{ {
"type": "filament", "type": "filament",
"name": "Panchroma PLA Stain @BBL X1", "name": "Panchroma PLA Satin @BBL X1",
"inherits": "Panchroma PLA Stain @base", "renamed_from": "Panchroma PLA Stain @BBL X1",
"inherits": "Panchroma PLA Satin @base",
"from": "system", "from": "system",
"setting_id": "GFSPM005_06", "setting_id": "GFSPM005_06",
"instantiation": "true", "instantiation": "true",

View File

@@ -1,7 +1,8 @@
{ {
"type": "filament", "type": "filament",
"name": "Panchroma PLA Stain @BBL X1C 0.2 nozzle", "name": "Panchroma PLA Satin @BBL X1C 0.2 nozzle",
"inherits": "Panchroma PLA Stain @base", "renamed_from": "Panchroma PLA Stain @BBL X1C 0.2 nozzle",
"inherits": "Panchroma PLA Satin @base",
"from": "system", "from": "system",
"setting_id": "GFSPM005_09", "setting_id": "GFSPM005_09",
"instantiation": "true", "instantiation": "true",

View File

@@ -1,7 +1,8 @@
{ {
"type": "filament", "type": "filament",
"name": "Panchroma PLA Stain @BBL X1C", "name": "Panchroma PLA Satin @BBL X1C",
"inherits": "Panchroma PLA Stain @base", "renamed_from": "Panchroma PLA Stain @BBL X1C",
"inherits": "Panchroma PLA Satin @base",
"from": "system", "from": "system",
"setting_id": "GFSPM005_08", "setting_id": "GFSPM005_08",
"instantiation": "true", "instantiation": "true",

View File

@@ -1,6 +1,7 @@
{ {
"type": "filament", "type": "filament",
"name": "Panchroma PLA Stain @base", "name": "Panchroma PLA Satin @base",
"renamed_from": "Panchroma PLA Stain @base",
"inherits": "fdm_filament_pla", "inherits": "fdm_filament_pla",
"from": "system", "from": "system",
"filament_id": "GFPM005", "filament_id": "GFPM005",

View File

@@ -136,7 +136,7 @@
"60" "60"
], ],
"scan_first_layer": "0", "scan_first_layer": "0",
"enable_power_loss_recovery": "1", "enable_power_loss_recovery": "printer_configuration",
"silent_mode": "0", "silent_mode": "0",
"single_extruder_multi_material": "1", "single_extruder_multi_material": "1",
"support_air_filtration": "0", "support_air_filtration": "0",

View File

@@ -11,6 +11,9 @@
"nozzle_diameter": [ "nozzle_diameter": [
"0.4" "0.4"
], ],
"nozzle_volume": [
"156"
],
"retract_before_wipe": [ "retract_before_wipe": [
"0%" "0%"
], ],
@@ -132,7 +135,7 @@
"0" "0"
], ],
"parking_pos_retraction": [ "parking_pos_retraction": [
"25" "0"
], ],
"retract_when_changing_layer": [ "retract_when_changing_layer": [
"0" "0"
@@ -141,7 +144,10 @@
"0" "0"
], ],
"high_current_on_filament_swap": [ "high_current_on_filament_swap": [
"1" "0"
],
"enable_filament_ramming": [
"0"
], ],
"z_hop_types": "Spiral Lift" "z_hop_types": "Spiral Lift"
} }

View File

@@ -11,6 +11,9 @@
"nozzle_diameter": [ "nozzle_diameter": [
"0.4" "0.4"
], ],
"nozzle_volume": [
"156"
],
"retract_before_wipe": [ "retract_before_wipe": [
"0%" "0%"
], ],
@@ -132,7 +135,7 @@
"0" "0"
], ],
"parking_pos_retraction": [ "parking_pos_retraction": [
"25" "0"
], ],
"retract_when_changing_layer": [ "retract_when_changing_layer": [
"0" "0"
@@ -141,7 +144,10 @@
"0" "0"
], ],
"high_current_on_filament_swap": [ "high_current_on_filament_swap": [
"1" "0"
],
"enable_filament_ramming": [
"0"
], ],
"z_hop_types": "Spiral Lift" "z_hop_types": "Spiral Lift"
} }

View File

@@ -11,6 +11,9 @@
"nozzle_diameter": [ "nozzle_diameter": [
"0.4" "0.4"
], ],
"nozzle_volume": [
"156"
],
"retract_before_wipe": [ "retract_before_wipe": [
"0%" "0%"
], ],
@@ -132,7 +135,7 @@
"0" "0"
], ],
"parking_pos_retraction": [ "parking_pos_retraction": [
"25" "0"
], ],
"retract_when_changing_layer": [ "retract_when_changing_layer": [
"0" "0"
@@ -141,7 +144,10 @@
"0" "0"
], ],
"high_current_on_filament_swap": [ "high_current_on_filament_swap": [
"1" "0"
],
"enable_filament_ramming": [
"0"
], ],
"z_hop_types": "Spiral Lift" "z_hop_types": "Spiral Lift"
} }

View File

@@ -10,6 +10,9 @@
"printer_variant": "0.4", "printer_variant": "0.4",
"nozzle_diameter": [ "nozzle_diameter": [
"0.4" "0.4"
],
"nozzle_volume": [
"156"
], ],
"retract_before_wipe": [ "retract_before_wipe": [
"0%" "0%"
@@ -132,7 +135,7 @@
"0" "0"
], ],
"parking_pos_retraction": [ "parking_pos_retraction": [
"25" "0"
], ],
"retract_when_changing_layer": [ "retract_when_changing_layer": [
"0" "0"
@@ -141,7 +144,10 @@
"0" "0"
], ],
"high_current_on_filament_swap": [ "high_current_on_filament_swap": [
"1" "0"
],
"enable_filament_ramming": [
"0"
], ],
"z_hop_types": "Spiral Lift" "z_hop_types": "Spiral Lift"
} }

View File

@@ -7,6 +7,10 @@
{ {
"name": "Cubicon xCeler-I", "name": "Cubicon xCeler-I",
"sub_path": "machine/Cubicon xCeler-I.json" "sub_path": "machine/Cubicon xCeler-I.json"
},
{
"name": "Cubicon xCeler-Plus",
"sub_path": "machine/Cubicon xCeler-Plus.json"
} }
], ],
"process_list": [ "process_list": [
@@ -19,16 +23,20 @@
"sub_path": "process/fdm_process_common_klipper.json" "sub_path": "process/fdm_process_common_klipper.json"
}, },
{ {
"name": "cubicon common @Cubicon xCeler-I 0.4 nozzle", "name": "process template @base",
"sub_path": "process/cubicon common @Cubicon xCeler-I 0.4 nozzle.json" "sub_path": "process/process template @base.json"
}, },
{ {
"name": "process template @Cubicon xCeler-I 0.4 nozzle", "name": "cubicon common @base",
"sub_path": "process/process template @Cubicon xCeler-I 0.4 nozzle.json" "sub_path": "process/cubicon common @base.json"
}, },
{ {
"name": "cubicon default @Cubicon xCeler-I 0.4 nozzle", "name": "cubicon default @Cubicon xCeler-I 0.4 nozzle",
"sub_path": "process/cubicon default @Cubicon xCeler-I 0.4 nozzle.json" "sub_path": "process/cubicon default @Cubicon xCeler-I 0.4 nozzle.json"
},
{
"name": "cubicon default @Cubicon xCeler-Plus 0.4 nozzle",
"sub_path": "process/cubicon default @Cubicon xCeler-Plus 0.4 nozzle.json"
} }
], ],
"filament_list": [ "filament_list": [
@@ -37,12 +45,12 @@
"sub_path": "filament/fdm_filament_common.json" "sub_path": "filament/fdm_filament_common.json"
}, },
{ {
"name": "fdm_filament_abs", "name": "fdm_filament_pla",
"sub_path": "filament/fdm_filament_abs.json" "sub_path": "filament/fdm_filament_pla.json"
}, },
{ {
"name": "fdm_filament_pa", "name": "fdm_filament_abs",
"sub_path": "filament/fdm_filament_pa.json" "sub_path": "filament/fdm_filament_abs.json"
}, },
{ {
"name": "fdm_filament_pc", "name": "fdm_filament_pc",
@@ -53,44 +61,119 @@
"sub_path": "filament/fdm_filament_pet.json" "sub_path": "filament/fdm_filament_pet.json"
}, },
{ {
"name": "fdm_filament_pla", "name": "fdm_filament_pa",
"sub_path": "filament/fdm_filament_pla.json" "sub_path": "filament/fdm_filament_pa.json"
}, },
{ {
"name": "Cubicon ABS @Cubicon xCeler-I 0.4 nozzle", "name": "Cubicon PLA @base",
"sub_path": "filament/Cubicon ABS @Cubicon xCeler-I 0.4 nozzle.json" "sub_path": "filament/Cubicon PLA @base.json"
},
{
"name": "Cubicon PA-CF @Cubicon xCeler-I 0.4 nozzle",
"sub_path": "filament/Cubicon PA-CF @Cubicon xCeler-I 0.4 nozzle.json"
},
{
"name": "Cubicon PC @Cubicon xCeler-I 0.4 nozzle",
"sub_path": "filament/Cubicon PC @Cubicon xCeler-I 0.4 nozzle.json"
},
{
"name": "Cubicon PETG @Cubicon xCeler-I 0.4 nozzle",
"sub_path": "filament/Cubicon PETG @Cubicon xCeler-I 0.4 nozzle.json"
}, },
{ {
"name": "Cubicon PLA @Cubicon xCeler-I 0.4 nozzle", "name": "Cubicon PLA @Cubicon xCeler-I 0.4 nozzle",
"sub_path": "filament/Cubicon PLA @Cubicon xCeler-I 0.4 nozzle.json" "sub_path": "filament/Cubicon PLA @Cubicon xCeler-I 0.4 nozzle.json"
}, },
{ {
"name": "Cubicon ABS-A100 @Cubicon xCeler-I 0.4 nozzle", "name": "Cubicon PLA @Cubicon xCeler-Plus 0.4 nozzle",
"sub_path": "filament/Cubicon ABS-A100 @Cubicon xCeler-I 0.4 nozzle.json" "sub_path": "filament/Cubicon PLA @Cubicon xCeler-Plus 0.4 nozzle.json"
}, },
{ {
"name": "Cubicon ABSk @Cubicon xCeler-I 0.4 nozzle", "name": "Cubicon PLA+ @base",
"sub_path": "filament/Cubicon ABSk @Cubicon xCeler-I 0.4 nozzle.json" "sub_path": "filament/Cubicon PLA+ @base.json"
}, },
{ {
"name": "Cubicon PLA+ @Cubicon xCeler-I 0.4 nozzle", "name": "Cubicon PLA+ @Cubicon xCeler-I 0.4 nozzle",
"sub_path": "filament/Cubicon PLA+ @Cubicon xCeler-I 0.4 nozzle.json" "sub_path": "filament/Cubicon PLA+ @Cubicon xCeler-I 0.4 nozzle.json"
}, },
{
"name": "Cubicon PLA+ @Cubicon xCeler-Plus 0.4 nozzle",
"sub_path": "filament/Cubicon PLA+ @Cubicon xCeler-Plus 0.4 nozzle.json"
},
{
"name": "Cubicon PLAi21 @base",
"sub_path": "filament/Cubicon PLAi21 @base.json"
},
{ {
"name": "Cubicon PLAi21 @Cubicon xCeler-I 0.4 nozzle", "name": "Cubicon PLAi21 @Cubicon xCeler-I 0.4 nozzle",
"sub_path": "filament/Cubicon PLAi21 @Cubicon xCeler-I 0.4 nozzle.json" "sub_path": "filament/Cubicon PLAi21 @Cubicon xCeler-I 0.4 nozzle.json"
},
{
"name": "Cubicon PLAi21 @Cubicon xCeler-Plus 0.4 nozzle",
"sub_path": "filament/Cubicon PLAi21 @Cubicon xCeler-Plus 0.4 nozzle.json"
},
{
"name": "Cubicon ABS @base",
"sub_path": "filament/Cubicon ABS @base.json"
},
{
"name": "Cubicon ABS @Cubicon xCeler-I 0.4 nozzle",
"sub_path": "filament/Cubicon ABS @Cubicon xCeler-I 0.4 nozzle.json"
},
{
"name": "Cubicon ABS @Cubicon xCeler-Plus 0.4 nozzle",
"sub_path": "filament/Cubicon ABS @Cubicon xCeler-Plus 0.4 nozzle.json"
},
{
"name": "Cubicon ABSk @base",
"sub_path": "filament/Cubicon ABSk @base.json"
},
{
"name": "Cubicon ABSk @Cubicon xCeler-I 0.4 nozzle",
"sub_path": "filament/Cubicon ABSk @Cubicon xCeler-I 0.4 nozzle.json"
},
{
"name": "Cubicon ABSk @Cubicon xCeler-Plus 0.4 nozzle",
"sub_path": "filament/Cubicon ABSk @Cubicon xCeler-Plus 0.4 nozzle.json"
},
{
"name": "Cubicon ABS-A100 @base",
"sub_path": "filament/Cubicon ABS-A100 @base.json"
},
{
"name": "Cubicon ABS-A100 @Cubicon xCeler-I 0.4 nozzle",
"sub_path": "filament/Cubicon ABS-A100 @Cubicon xCeler-I 0.4 nozzle.json"
},
{
"name": "Cubicon ABS-A100 @Cubicon xCeler-Plus 0.4 nozzle",
"sub_path": "filament/Cubicon ABS-A100 @Cubicon xCeler-Plus 0.4 nozzle.json"
},
{
"name": "Cubicon PETG @base",
"sub_path": "filament/Cubicon PETG @base.json"
},
{
"name": "Cubicon PETG @Cubicon xCeler-I 0.4 nozzle",
"sub_path": "filament/Cubicon PETG @Cubicon xCeler-I 0.4 nozzle.json"
},
{
"name": "Cubicon PETG @Cubicon xCeler-Plus 0.4 nozzle",
"sub_path": "filament/Cubicon PETG @Cubicon xCeler-Plus 0.4 nozzle.json"
},
{
"name": "Cubicon PC @base",
"sub_path": "filament/Cubicon PC @base.json"
},
{
"name": "Cubicon PC @Cubicon xCeler-I 0.4 nozzle",
"sub_path": "filament/Cubicon PC @Cubicon xCeler-I 0.4 nozzle.json"
},
{
"name": "Cubicon PC @Cubicon xCeler-Plus 0.4 nozzle",
"sub_path": "filament/Cubicon PC @Cubicon xCeler-Plus 0.4 nozzle.json"
},
{
"name": "Cubicon PA-CF @base",
"sub_path": "filament/Cubicon PA-CF @base.json"
},
{
"name": "Cubicon PA-CF @Cubicon xCeler-I 0.4 nozzle",
"sub_path": "filament/Cubicon PA-CF @Cubicon xCeler-I 0.4 nozzle.json"
},
{
"name": "Cubicon PA-CF @Cubicon xCeler-Plus 0.4 nozzle",
"sub_path": "filament/Cubicon PA-CF @Cubicon xCeler-Plus 0.4 nozzle.json"
} }
], ],
"machine_list": [ "machine_list": [
@@ -101,6 +184,10 @@
{ {
"name": "Cubicon xCeler-I 0.4 nozzle", "name": "Cubicon xCeler-I 0.4 nozzle",
"sub_path": "machine/Cubicon xCeler-I 0.4 nozzle.json" "sub_path": "machine/Cubicon xCeler-I 0.4 nozzle.json"
},
{
"name": "Cubicon xCeler-Plus 0.4 nozzle",
"sub_path": "machine/Cubicon xCeler-Plus 0.4 nozzle.json"
} }
] ]
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

View File

@@ -1,71 +1,13 @@
{ {
"type": "filament", "type": "filament",
"name": "Cubicon ABS @Cubicon xCeler-I 0.4 nozzle",
"inherits": "fdm_filament_abs",
"filament_id": "P510cfb0",
"instantiation": "true", "instantiation": "true",
"version": "1.0.0.0",
"compatible_printers": [ "compatible_printers": [
"Cubicon xCeler-I 0.4 nozzle" "Cubicon xCeler-I 0.4 nozzle"
], ],
"default_filament_colour": "",
"filament_settings_id": [ "inherits": "Cubicon ABS @base",
"Cubicon ABS @Cubicon xCeler-I 0.4 nozzle" "name": "Cubicon ABS @Cubicon xCeler-I 0.4 nozzle",
], "filament_settings_id": ["Cubicon ABS @Cubicon xCeler-I 0.4 nozzle"]
"filament_type": [
"ABS"
],
"filament_vendor": [
"Cubicon"
],
"hot_plate_temp": [
"115"
],
"hot_plate_temp_initial_layer": [
"115"
],
"close_fan_the_first_x_layers": [
"3"
],
"fan_cooling_layer_time": [
"30"
],
"filament_density": [
"1.24"
],
"filament_flow_ratio": [
"0.99"
],
"filament_max_volumetric_speed": [
"25"
],
"nozzle_temperature_initial_layer": [
"240"
],
"fan_max_speed": [
"80"
],
"fan_min_speed": [
"70"
],
"slow_down_min_speed": [
"30"
],
"slow_down_layer_time": [
"3"
],
"nozzle_temperature": [
"245"
],
"temperature_vitrification": [
"78"
],
"nozzle_temperature_range_low": [
"220"
],
"nozzle_temperature_range_high": [
"260"
],
"additional_cooling_fan_speed": [
"0"
]
} }

View File

@@ -0,0 +1,13 @@
{
"type": "filament",
"instantiation": "true",
"version": "1.0.0.0",
"compatible_printers": [
"Cubicon xCeler-Plus 0.4 nozzle"
],
"inherits": "Cubicon ABS @base",
"name": "Cubicon ABS @Cubicon xCeler-Plus 0.4 nozzle",
"filament_settings_id": ["Cubicon ABS @Cubicon xCeler-Plus 0.4 nozzle"]
}

View File

@@ -0,0 +1,73 @@
{
"type": "filament",
"instantiation": "true",
"version": "1.0.0.0",
"compatible_printers": [
"Cubicon xCeler-I 0.4 nozzle",
"Cubicon xCeler-Plus 0.4 nozzle"
],
"default_filament_colour": "",
"filament_id": "P510cfb0",
"name": "Cubicon ABS @base",
"filament_settings_id": ["Cubicon ABS @base"],
"filament_vendor": ["Cubicon"],
"inherits": "fdm_filament_abs",
"filament_type": ["ABS"],
"is_custom_defined": "0",
"hot_plate_temp": [
"115"
],
"hot_plate_temp_initial_layer": [
"115"
],
"close_fan_the_first_x_layers": [
"3"
],
"fan_cooling_layer_time": [
"30"
],
"filament_density": [
"1.24"
],
"filament_flow_ratio": [
"0.99"
],
"filament_max_volumetric_speed": [
"23"
],
"nozzle_temperature_initial_layer": [
"240"
],
"fan_max_speed": [
"80"
],
"fan_min_speed": [
"70"
],
"slow_down_min_speed": [
"30"
],
"slow_down_layer_time": [
"3"
],
"nozzle_temperature": [
"245"
],
"temperature_vitrification": [
"78"
],
"nozzle_temperature_range_low": [
"220"
],
"nozzle_temperature_range_high": [
"260"
],
"additional_cooling_fan_speed": [
"0"
]
}

View File

@@ -1,71 +1,13 @@
{ {
"type": "filament", "type": "filament",
"name": "Cubicon ABS-A100 @Cubicon xCeler-I 0.4 nozzle",
"inherits": "Cubicon ABS @Cubicon xCeler-I 0.4 nozzle",
"filament_id": "P510cfb1",
"instantiation": "true", "instantiation": "true",
"version": "1.0.0.0",
"compatible_printers": [ "compatible_printers": [
"Cubicon xCeler-I 0.4 nozzle" "Cubicon xCeler-I 0.4 nozzle"
], ],
"default_filament_colour": "",
"filament_settings_id": [ "inherits": "Cubicon ABS-A100 @base",
"Cubicon ABS-A100 @Cubicon xCeler-I 0.4 nozzle" "name": "Cubicon ABS-A100 @Cubicon xCeler-I 0.4 nozzle",
], "filament_settings_id": ["Cubicon ABS-A100 @Cubicon xCeler-I 0.4 nozzle"]
"filament_type": [
"ABS"
],
"filament_vendor": [
"Cubicon"
],
"hot_plate_temp": [
"100"
],
"hot_plate_temp_initial_layer": [
"100"
],
"close_fan_the_first_x_layers": [
"3"
],
"fan_cooling_layer_time": [
"30"
],
"filament_density": [
"1.24"
],
"filament_flow_ratio": [
"0.99"
],
"filament_max_volumetric_speed": [
"25"
],
"nozzle_temperature_initial_layer": [
"225"
],
"fan_max_speed": [
"80"
],
"fan_min_speed": [
"70"
],
"slow_down_min_speed": [
"30"
],
"slow_down_layer_time": [
"3"
],
"nozzle_temperature": [
"230"
],
"temperature_vitrification": [
"78"
],
"nozzle_temperature_range_low": [
"220"
],
"nozzle_temperature_range_high": [
"240"
],
"additional_cooling_fan_speed": [
"0"
]
} }

View File

@@ -0,0 +1,13 @@
{
"type": "filament",
"instantiation": "true",
"version": "1.0.0.0",
"compatible_printers": [
"Cubicon xCeler-Plus 0.4 nozzle"
],
"inherits": "Cubicon ABS-A100 @base",
"name": "Cubicon ABS-A100 @Cubicon xCeler-Plus 0.4 nozzle",
"filament_settings_id": ["Cubicon ABS-A100 @Cubicon xCeler-Plus 0.4 nozzle"]
}

View File

@@ -0,0 +1,74 @@
{
"type": "filament",
"instantiation": "true",
"version": "1.0.0.0",
"compatible_printers": [
"Cubicon xCeler-I 0.4 nozzle",
"Cubicon xCeler-Plus 0.4 nozzle"
],
"default_filament_colour": "",
"filament_id": "P510cfb1",
"filament_settings_id": [
"Cubicon ABS-A100 @base"
],
"filament_type": [
"ABS"
],
"filament_vendor": [
"Cubicon"
],
"inherits": "Cubicon ABS @base",
"is_custom_defined": "0",
"name": "Cubicon ABS-A100 @base",
"hot_plate_temp": [
"100"
],
"hot_plate_temp_initial_layer": [
"100"
],
"close_fan_the_first_x_layers": [
"3"
],
"fan_cooling_layer_time": [
"30"
],
"filament_density": [
"1.24"
],
"filament_flow_ratio": [
"0.99"
],
"filament_max_volumetric_speed": [
"23"
],
"nozzle_temperature_initial_layer": [
"225"
],
"fan_max_speed": [
"80"
],
"fan_min_speed": [
"70"
],
"slow_down_min_speed": [
"30"
],
"slow_down_layer_time": [
"3"
],
"nozzle_temperature": [
"230"
],
"temperature_vitrification": [
"78"
],
"nozzle_temperature_range_low": [
"220"
],
"nozzle_temperature_range_high": [
"240"
],
"additional_cooling_fan_speed": [
"0"
]
}

View File

@@ -1,71 +1,13 @@
{ {
"type": "filament", "type": "filament",
"name": "Cubicon ABSk @Cubicon xCeler-I 0.4 nozzle",
"inherits": "Cubicon ABS @Cubicon xCeler-I 0.4 nozzle",
"filament_id": "P510cfb2",
"instantiation": "true", "instantiation": "true",
"version": "1.0.0.0",
"compatible_printers": [ "compatible_printers": [
"Cubicon xCeler-I 0.4 nozzle" "Cubicon xCeler-I 0.4 nozzle"
], ],
"default_filament_colour": "",
"filament_settings_id": [ "inherits": "Cubicon ABSk @base",
"Cubicon ABSk @Cubicon xCeler-I 0.4 nozzle" "name": "Cubicon ABSk @Cubicon xCeler-I 0.4 nozzle",
], "filament_settings_id": ["Cubicon ABSk @Cubicon xCeler-I 0.4 nozzle"]
"filament_type": [
"ABS"
],
"filament_vendor": [
"Cubicon"
],
"hot_plate_temp": [
"115"
],
"hot_plate_temp_initial_layer": [
"115"
],
"close_fan_the_first_x_layers": [
"3"
],
"fan_cooling_layer_time": [
"30"
],
"filament_density": [
"1.24"
],
"filament_flow_ratio": [
"0.99"
],
"filament_max_volumetric_speed": [
"25"
],
"nozzle_temperature_initial_layer": [
"240"
],
"fan_max_speed": [
"80"
],
"fan_min_speed": [
"70"
],
"slow_down_min_speed": [
"30"
],
"slow_down_layer_time": [
"3"
],
"nozzle_temperature": [
"240"
],
"temperature_vitrification": [
"85"
],
"nozzle_temperature_range_low": [
"220"
],
"nozzle_temperature_range_high": [
"240"
],
"additional_cooling_fan_speed": [
"0"
]
} }

View File

@@ -0,0 +1,13 @@
{
"type": "filament",
"instantiation": "true",
"version": "1.0.0.0",
"compatible_printers": [
"Cubicon xCeler-Plus 0.4 nozzle"
],
"inherits": "Cubicon ABSk @base",
"name": "Cubicon ABSk @Cubicon xCeler-Plus 0.4 nozzle",
"filament_settings_id": ["Cubicon ABSk @Cubicon xCeler-Plus 0.4 nozzle"]
}

Some files were not shown because too many files have changed in this diff Show More