Merge branch 'main' into feat/configurable-bambu-network-lib
14
.doxygen
@@ -48,7 +48,7 @@ PROJECT_NAME = OrcaSlicer
|
||||
# could be handy for archiving the generated documentation or if some version
|
||||
# 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
|
||||
# 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
|
||||
# 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
|
||||
# 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
|
||||
# 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
|
||||
# (namespaces, classes, functions, etc.) that should be excluded from the
|
||||
@@ -1286,7 +1290,7 @@ GENERATE_HTML = YES
|
||||
# The default directory is: html.
|
||||
# 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
|
||||
# generated HTML page (for example: .htm, .php, .asp).
|
||||
@@ -1565,7 +1569,7 @@ TOC_EXPAND = NO
|
||||
# protocol see https://www.sitemaps.org
|
||||
# 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
|
||||
# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
|
||||
|
||||
6
.github/workflows/build_all.yml
vendored
@@ -94,7 +94,7 @@ jobs:
|
||||
- name: Apt-Install Dependencies
|
||||
uses: ./.github/actions/apt-install-deps
|
||||
- name: Restore Test Artifact
|
||||
uses: actions/download-artifact@v6
|
||||
uses: actions/download-artifact@v7
|
||||
with:
|
||||
name: ${{ github.sha }}-tests
|
||||
- uses: lukka/get-cmake@latest
|
||||
@@ -106,7 +106,7 @@ jobs:
|
||||
tar -xvf build_tests.tar
|
||||
scripts/run_unit_tests.sh
|
||||
- name: Upload Test Logs
|
||||
uses: actions/upload-artifact@v5
|
||||
uses: actions/upload-artifact@v6
|
||||
if: ${{ failure() }}
|
||||
with:
|
||||
name: unit-test-logs
|
||||
@@ -170,7 +170,7 @@ jobs:
|
||||
arch: ${{ matrix.variant.arch }}
|
||||
upload-artifact: false
|
||||
- name: Upload artifacts Flatpak
|
||||
uses: actions/upload-artifact@v5
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: OrcaSlicer-Linux-flatpak_${{ env.ver }}_${{ matrix.variant.arch }}.flatpak
|
||||
path: '/__w/OrcaSlicer/OrcaSlicer/OrcaSlicer-Linux-flatpak_${{ env.ver }}_${{ matrix.variant.arch }}.flatpak'
|
||||
|
||||
6
.github/workflows/build_deps.yml
vendored
@@ -35,7 +35,7 @@ jobs:
|
||||
# So building XOR cache loading.
|
||||
# We use `lookup-only` to skip pulling cache.
|
||||
- name: load cached deps
|
||||
uses: actions/cache/restore@v4
|
||||
uses: actions/cache/restore@v5
|
||||
id: cache-load
|
||||
with:
|
||||
path: ${{ env.DEPS_PATH }}
|
||||
@@ -97,7 +97,7 @@ jobs:
|
||||
|
||||
- name: Upload OrcaSlicer_dep director(ies) for use later
|
||||
if: ${{ !cancelled() && ! env.ACT}}
|
||||
uses: actions/upload-artifact@v5
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: ${{ env.ARTIFACT_NAME }}
|
||||
path: ${{ env.DEPS_PATH }}
|
||||
@@ -106,7 +106,7 @@ jobs:
|
||||
|
||||
- name: Save cache from main branch
|
||||
if: ${{ !cancelled() && github.ref == 'refs/heads/main' && steps.cache-load.outputs.cache-hit != 'true' }}
|
||||
uses: actions/cache/save@v4
|
||||
uses: actions/cache/save@v5
|
||||
with:
|
||||
path: ${{ env.DEPS_PATH }}
|
||||
key: ${{ steps.cache-load.outputs.cache-primary-key }}
|
||||
|
||||
20
.github/workflows/build_orca.yml
vendored
@@ -31,7 +31,7 @@ jobs:
|
||||
lfs: 'true'
|
||||
|
||||
- name: Download deps artifacts
|
||||
uses: actions/download-artifact@v4
|
||||
uses: actions/download-artifact@v7
|
||||
with:
|
||||
name: ${{ inputs.artifact-name }}
|
||||
path: ${{ inputs.artifact-path }}
|
||||
@@ -180,14 +180,14 @@ jobs:
|
||||
|
||||
- name: Upload artifacts mac
|
||||
if: inputs.os == 'macos-14'
|
||||
uses: actions/upload-artifact@v5
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: OrcaSlicer_Mac_universal_${{ env.ver }}
|
||||
path: ${{ github.workspace }}/OrcaSlicer_Mac_universal_${{ env.ver }}.dmg
|
||||
|
||||
- name: Upload OrcaSlicer_profile_validator DMG mac
|
||||
if: inputs.os == 'macos-14'
|
||||
uses: actions/upload-artifact@v5
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: OrcaSlicer_profile_validator_Mac_universal_DMG_${{ env.ver }}
|
||||
path: ${{ github.workspace }}/OrcaSlicer_profile_validator_Mac_universal_${{ env.ver }}.dmg
|
||||
@@ -254,28 +254,28 @@ jobs:
|
||||
|
||||
- name: Upload artifacts Win zip
|
||||
if: inputs.os == 'windows-latest'
|
||||
uses: actions/upload-artifact@v5
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: OrcaSlicer_Windows_${{ env.ver }}_portable
|
||||
path: ${{ github.workspace }}/build/OrcaSlicer
|
||||
|
||||
- name: Upload artifacts Win installer
|
||||
if: inputs.os == 'windows-latest'
|
||||
uses: actions/upload-artifact@v5
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: OrcaSlicer_Windows_${{ env.ver }}
|
||||
path: ${{ github.workspace }}/build/OrcaSlicer*.exe
|
||||
|
||||
- name: Upload artifacts Win PDB
|
||||
if: inputs.os == 'windows-latest'
|
||||
uses: actions/upload-artifact@v5
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: PDB
|
||||
path: ${{ github.workspace }}/build/src/Release/Debug_PDB_${{ env.ver }}_for_developers_only.7z
|
||||
|
||||
- name: Upload OrcaSlicer_profile_validator Win
|
||||
if: inputs.os == 'windows-latest'
|
||||
uses: actions/upload-artifact@v5
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: OrcaSlicer_profile_validator_Windows_${{ env.ver }}
|
||||
path: ${{ github.workspace }}/build/src/Release/OrcaSlicer_profile_validator.exe
|
||||
@@ -335,7 +335,7 @@ jobs:
|
||||
# and doesn't preserve file permissions
|
||||
- name: Upload Test Artifact
|
||||
if: inputs.os == 'ubuntu-24.04'
|
||||
uses: actions/upload-artifact@v5
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: ${{ github.sha }}-tests
|
||||
overwrite: true
|
||||
@@ -357,7 +357,7 @@ jobs:
|
||||
env:
|
||||
ubuntu-ver: ${{ (inputs.os == 'ubuntu-20.04' && '2004') || (inputs.os == 'ubuntu-24.04' && '2404') || '' }}
|
||||
ubuntu-ver-str: ${{ (inputs.os == 'ubuntu-24.04' && '_Ubuntu2404') || '' }}
|
||||
uses: actions/upload-artifact@v5
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: OrcaSlicer_Linux_ubuntu_${{ env.ubuntu-ver }}_${{ env.ver }}
|
||||
path: './build/OrcaSlicer_Linux_AppImage${{ env.ubuntu-ver-str }}_${{ env.ver }}.AppImage'
|
||||
@@ -366,7 +366,7 @@ jobs:
|
||||
if: ${{ ! env.ACT && inputs.os == 'ubuntu-20.04' || inputs.os == 'ubuntu-24.04' }}
|
||||
env:
|
||||
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:
|
||||
name: OrcaSlicer_profile_validator_Linux_ubuntu_${{ env.ubuntu-ver }}_${{ env.ver }}
|
||||
path: './build/src/Release/OrcaSlicer_profile_validator'
|
||||
|
||||
78
.github/workflows/doxygen-docs.yml
vendored
Normal 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"
|
||||
2
.github/workflows/shellcheck.yml
vendored
@@ -21,7 +21,7 @@ jobs:
|
||||
steps:
|
||||
- name: Cache shellcheck download
|
||||
id: cache-shellcheck-v0_11
|
||||
uses: actions/cache@v4
|
||||
uses: actions/cache@v5
|
||||
with:
|
||||
path: ~/shellcheck
|
||||
key: ${{ runner.os }}-shellcheck-v0_11
|
||||
|
||||
1
.gitignore
vendored
@@ -42,3 +42,4 @@ deps_src/build/
|
||||
test.js
|
||||
/.cache/
|
||||
.clangd
|
||||
internal_docs/
|
||||
|
||||
22
README.md
@@ -44,19 +44,19 @@ If you come across any of these in search results, please <b>report them</b> as
|
||||
|
||||
# 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.
|
||||
- **[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.
|
||||
- **[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**
|
||||
Use varied infill [patterns](https://github.com/OrcaSlicer/OrcaSlicer/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)**
|
||||
- **[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://www.orcaslicer.com/wiki/strength_settings_patterns) and accurate hole shapes for improved clarity.
|
||||
- **[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.
|
||||
- **[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.
|
||||
- **Network Printer Support**
|
||||
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.
|
||||
- **User-Friendly Interface**
|
||||
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
|
||||
|
||||
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)**
|
||||
- **[Contribute to the wiki](https://github.com/OrcaSlicer/OrcaSlicer/wiki/How-to-wiki)**
|
||||
- **[Access the wiki here](https://www.orcaslicer.com/wiki)**
|
||||
- **[Contribute to the wiki](https://www.orcaslicer.com/wiki/How-to-wiki)**
|
||||
|
||||
# Download
|
||||
|
||||
@@ -144,7 +144,7 @@ winget install --id=SoftFever.OrcaSlicer -e
|
||||
|
||||
# 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.
|
||||
|
||||
|
||||
6
deps/Qhull/Qhull.cmake
vendored
@@ -1,11 +1,11 @@
|
||||
include(GNUInstallDirs)
|
||||
orcaslicer_add_cmake_project(Qhull
|
||||
URL "https://github.com/qhull/qhull/archive/v8.0.1.zip"
|
||||
URL_HASH SHA256=5287f5edd6a0372588f5d6640799086a4033d89d19711023ef8229dd9301d69b
|
||||
URL "https://github.com/qhull/qhull/archive/v8.0.2.zip"
|
||||
URL_HASH SHA256=a378e9a39e718e289102c20d45632f873bfdc58a7a5f924246ea4b176e185f1e
|
||||
CMAKE_ARGS
|
||||
-DINCLUDE_INSTALL_DIR=${CMAKE_INSTALL_INCLUDEDIR}
|
||||
)
|
||||
|
||||
if (MSVC)
|
||||
add_debug_dep(dep_Qhull)
|
||||
endif ()
|
||||
endif ()
|
||||
|
||||
@@ -10,13 +10,13 @@ add_subdirectory(earcut)
|
||||
add_subdirectory(fast_float)
|
||||
add_subdirectory(nanosvg)
|
||||
add_subdirectory(nlohmann)
|
||||
add_subdirectory(spline) # Header-only spline library
|
||||
add_subdirectory(stb_dxt) # Header-only STB DXT compression library
|
||||
|
||||
# Static libraries
|
||||
add_subdirectory(Shiny)
|
||||
add_subdirectory(admesh)
|
||||
add_subdirectory(clipper)
|
||||
add_subdirectory(clipper2)
|
||||
add_subdirectory(expat)
|
||||
add_subdirectory(glu-libtess)
|
||||
add_subdirectory(hidapi)
|
||||
|
||||
@@ -24,18 +24,7 @@ target_link_libraries(your_target PRIVATE semver::semver)
|
||||
target_link_libraries(your_target PRIVATE hints)
|
||||
```
|
||||
|
||||
### 3. **spline** (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)
|
||||
### 3. **stb_dxt** (Interface Library)
|
||||
- **Type**: Interface library (header-only)
|
||||
- **Target**: `stb_dxt` or `stb_dxt::stb_dxt`
|
||||
- **Headers**: `stb_dxt.h`
|
||||
@@ -53,10 +42,9 @@ target_link_libraries(your_target PRIVATE stb_dxt::stb_dxt)
|
||||
1. **In your CMakeLists.txt**, simply link the library:
|
||||
```cmake
|
||||
add_executable(my_app main.cpp)
|
||||
target_link_libraries(my_app
|
||||
PRIVATE
|
||||
target_link_libraries(my_app
|
||||
PRIVATE
|
||||
semver::semver # For version parsing
|
||||
spline::spline # For spline interpolation
|
||||
stb_dxt::stb_dxt # For DXT texture compression
|
||||
hints # For hints functionality
|
||||
)
|
||||
@@ -67,9 +55,6 @@ target_link_libraries(my_app
|
||||
// For semver
|
||||
#include <semver.h>
|
||||
|
||||
// For spline
|
||||
#include <spline.h>
|
||||
|
||||
// For stb_dxt
|
||||
#include <stb_dxt.h>
|
||||
|
||||
@@ -100,7 +85,6 @@ target_link_libraries(mycomponent
|
||||
PUBLIC
|
||||
semver::semver # Version handling is part of public API
|
||||
PRIVATE
|
||||
spline::spline # Used internally for interpolation
|
||||
stb_dxt::stb_dxt # Used internally for texture compression
|
||||
)
|
||||
|
||||
|
||||
@@ -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
|
||||
)
|
||||
@@ -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 */
|
||||
@@ -11108,6 +11108,19 @@ msgid ""
|
||||
"easily."
|
||||
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"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -12177,6 +12177,26 @@ msgstr ""
|
||||
"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"
|
||||
|
||||
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"
|
||||
msgstr "Orelles de la Vora d'Adherència"
|
||||
|
||||
|
||||
@@ -11730,6 +11730,26 @@ msgid ""
|
||||
msgstr ""
|
||||
"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"
|
||||
msgstr "Uši límce"
|
||||
|
||||
|
||||
@@ -12766,6 +12766,26 @@ msgstr ""
|
||||
"Eine Lücke zwischen der innersten Randlinie und dem Objekt kann das Abnehmen "
|
||||
"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"
|
||||
msgstr "Brim Ohren"
|
||||
|
||||
|
||||
@@ -11327,6 +11327,26 @@ msgstr ""
|
||||
"This creates a gap between the innermost brim line and the object and can "
|
||||
"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"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -12147,6 +12147,26 @@ msgstr ""
|
||||
"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"
|
||||
|
||||
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"
|
||||
msgstr "Orejas de borde"
|
||||
|
||||
|
||||
@@ -12298,6 +12298,26 @@ msgstr ""
|
||||
"Un espace entre la ligne de bord la plus interne et l'objet peut faciliter "
|
||||
"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 l’empreinte 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"
|
||||
msgstr "Bordures à oreilles"
|
||||
|
||||
|
||||
@@ -11603,6 +11603,26 @@ msgstr ""
|
||||
"A legbelső peremvonal és a tárgy közötti rés, ami megkönnyítheti a perem "
|
||||
"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"
|
||||
msgstr "Karimás fülek"
|
||||
|
||||
|
||||
@@ -12234,6 +12234,26 @@ msgstr ""
|
||||
"Crea uno spazio tra la linea più interna della tesa e l'oggetto per rendere "
|
||||
"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"
|
||||
msgstr "Tesa ad orecchio"
|
||||
|
||||
|
||||
@@ -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"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -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"
|
||||
msgstr "브림 귀"
|
||||
|
||||
|
||||
@@ -12183,6 +12183,26 @@ msgstr ""
|
||||
"Sukuriamas tarpas tarp vidinės krašto linijos ir objekto, todėl galima "
|
||||
"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"
|
||||
msgstr "Krašto \"ausys\""
|
||||
|
||||
|
||||
@@ -11751,6 +11751,26 @@ msgstr ""
|
||||
"Dit creëert ruimte tussen de binnenste brimlijn en het object en zorgt "
|
||||
"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"
|
||||
msgstr "Rand oren"
|
||||
|
||||
|
||||
@@ -12130,6 +12130,26 @@ msgstr ""
|
||||
"Szczelina między najbardziej wewnętrzną linią brimu a obiektem może ułatwić "
|
||||
"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"
|
||||
msgstr "Uszy brim"
|
||||
|
||||
|
||||
@@ -12555,6 +12555,26 @@ msgstr ""
|
||||
"Um espaço entre a linha mais interna da borda e o objeto pode facilitar a "
|
||||
"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"
|
||||
msgstr "Orelhas da borda"
|
||||
|
||||
|
||||
@@ -12291,6 +12291,26 @@ msgid ""
|
||||
"easily."
|
||||
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"
|
||||
msgstr "Ушки каймы"
|
||||
|
||||
|
||||
@@ -11574,6 +11574,26 @@ msgstr ""
|
||||
"Mellanrum mellan innersta brim linjen och objektet kan underlätta vid "
|
||||
"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"
|
||||
msgstr "Brätte öron"
|
||||
|
||||
|
||||
@@ -12097,6 +12097,26 @@ msgstr ""
|
||||
"En içteki kenar çizgisi ile nesne arasındaki boşluk, kenarlığın daha kolay "
|
||||
"çı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"
|
||||
msgstr "Kenar kulakları"
|
||||
|
||||
|
||||
@@ -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"
|
||||
msgstr "Вушка кайми"
|
||||
|
||||
|
||||
@@ -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ễ "
|
||||
"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"
|
||||
msgstr "Tai brim"
|
||||
|
||||
|
||||
@@ -2490,7 +2490,7 @@ msgid "Plate"
|
||||
msgstr "盘"
|
||||
|
||||
msgid "Brim"
|
||||
msgstr "Brim"
|
||||
msgstr "边缘"
|
||||
|
||||
msgid "Object/Part Setting"
|
||||
msgstr "对象/零件设置"
|
||||
@@ -11493,6 +11493,26 @@ msgid ""
|
||||
"easily."
|
||||
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"
|
||||
msgstr "圆盘"
|
||||
|
||||
|
||||
@@ -2493,7 +2493,7 @@ msgid "Plate"
|
||||
msgstr "列印板"
|
||||
|
||||
msgid "Brim"
|
||||
msgstr "Brim"
|
||||
msgstr "邊緣"
|
||||
|
||||
msgid "Object/Part Setting"
|
||||
msgstr "物件/零件 設定"
|
||||
@@ -11560,6 +11560,26 @@ msgid ""
|
||||
"easily."
|
||||
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"
|
||||
msgstr "耳狀 Brim"
|
||||
|
||||
|
||||
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
1
resources/images/canvas_menu.svg
Normal 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 |
1
resources/images/canvas_menu_dark.svg
Normal 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 |
1
resources/images/canvas_menu_dark_hover.svg
Normal 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 |
1
resources/images/canvas_menu_hover.svg
Normal 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 |
1
resources/images/canvas_zoom.svg
Normal 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 |
1
resources/images/canvas_zoom_dark.svg
Normal 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 |
1
resources/images/canvas_zoom_dark_hover.svg
Normal 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 |
1
resources/images/canvas_zoom_hover.svg
Normal 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 |
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 31 KiB |
@@ -136,7 +136,7 @@
|
||||
"60"
|
||||
],
|
||||
"scan_first_layer": "0",
|
||||
"enable_power_loss_recovery": "1",
|
||||
"enable_power_loss_recovery": "printer_configuration",
|
||||
"silent_mode": "0",
|
||||
"single_extruder_multi_material": "1",
|
||||
"support_air_filtration": "0",
|
||||
|
||||
@@ -11,6 +11,9 @@
|
||||
"nozzle_diameter": [
|
||||
"0.4"
|
||||
],
|
||||
"nozzle_volume": [
|
||||
"156"
|
||||
],
|
||||
"retract_before_wipe": [
|
||||
"0%"
|
||||
],
|
||||
@@ -132,7 +135,7 @@
|
||||
"0"
|
||||
],
|
||||
"parking_pos_retraction": [
|
||||
"25"
|
||||
"0"
|
||||
],
|
||||
"retract_when_changing_layer": [
|
||||
"0"
|
||||
@@ -141,7 +144,10 @@
|
||||
"0"
|
||||
],
|
||||
"high_current_on_filament_swap": [
|
||||
"1"
|
||||
"0"
|
||||
],
|
||||
"enable_filament_ramming": [
|
||||
"0"
|
||||
],
|
||||
"z_hop_types": "Spiral Lift"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,9 @@
|
||||
"nozzle_diameter": [
|
||||
"0.4"
|
||||
],
|
||||
"nozzle_volume": [
|
||||
"156"
|
||||
],
|
||||
"retract_before_wipe": [
|
||||
"0%"
|
||||
],
|
||||
@@ -132,7 +135,7 @@
|
||||
"0"
|
||||
],
|
||||
"parking_pos_retraction": [
|
||||
"25"
|
||||
"0"
|
||||
],
|
||||
"retract_when_changing_layer": [
|
||||
"0"
|
||||
@@ -141,7 +144,10 @@
|
||||
"0"
|
||||
],
|
||||
"high_current_on_filament_swap": [
|
||||
"1"
|
||||
"0"
|
||||
],
|
||||
"enable_filament_ramming": [
|
||||
"0"
|
||||
],
|
||||
"z_hop_types": "Spiral Lift"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,9 @@
|
||||
"nozzle_diameter": [
|
||||
"0.4"
|
||||
],
|
||||
"nozzle_volume": [
|
||||
"156"
|
||||
],
|
||||
"retract_before_wipe": [
|
||||
"0%"
|
||||
],
|
||||
@@ -132,7 +135,7 @@
|
||||
"0"
|
||||
],
|
||||
"parking_pos_retraction": [
|
||||
"25"
|
||||
"0"
|
||||
],
|
||||
"retract_when_changing_layer": [
|
||||
"0"
|
||||
@@ -141,7 +144,10 @@
|
||||
"0"
|
||||
],
|
||||
"high_current_on_filament_swap": [
|
||||
"1"
|
||||
"0"
|
||||
],
|
||||
"enable_filament_ramming": [
|
||||
"0"
|
||||
],
|
||||
"z_hop_types": "Spiral Lift"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
"printer_variant": "0.4",
|
||||
"nozzle_diameter": [
|
||||
"0.4"
|
||||
],
|
||||
"nozzle_volume": [
|
||||
"156"
|
||||
],
|
||||
"retract_before_wipe": [
|
||||
"0%"
|
||||
@@ -132,7 +135,7 @@
|
||||
"0"
|
||||
],
|
||||
"parking_pos_retraction": [
|
||||
"25"
|
||||
"0"
|
||||
],
|
||||
"retract_when_changing_layer": [
|
||||
"0"
|
||||
@@ -141,7 +144,10 @@
|
||||
"0"
|
||||
],
|
||||
"high_current_on_filament_swap": [
|
||||
"1"
|
||||
"0"
|
||||
],
|
||||
"enable_filament_ramming": [
|
||||
"0"
|
||||
],
|
||||
"z_hop_types": "Spiral Lift"
|
||||
}
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 7.0 KiB After Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 63 KiB |
|
Before Width: | Height: | Size: 408 KiB After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
@@ -4,6 +4,9 @@
|
||||
"from": "system",
|
||||
"inherits": "fdm_openeye_common",
|
||||
"instantiation": "true",
|
||||
"adaptive_bed_mesh_margin": "10",
|
||||
"bed_mesh_max": "211,211",
|
||||
"bed_mesh_min": "1.5,7",
|
||||
"layer_change_gcode": "SET_PRINT_STATS_INFO CURRENT_LAYER={layer_num + 1}\n_MMU_UPDATE_HEIGHT",
|
||||
"machine_end_gcode": "MMU_END\nEND_PRINT",
|
||||
"machine_load_filament_time": "30",
|
||||
@@ -24,8 +27,8 @@
|
||||
"30"
|
||||
],
|
||||
"machine_pause_gcode": "PAUSE",
|
||||
"machine_start_gcode": "SET_PRINT_STATS_INFO TOTAL_LAYER=[total_layer_count]\nMMU_START_SETUP INITIAL_TOOL={initial_tool} TOTAL_TOOLCHANGES=!total_toolchanges! REFERENCED_TOOLS=!referenced_tools! TOOL_COLORS=!colors! TOOL_TEMPS=!temperatures! TOOL_MATERIALS=!materials! FILAMENT_NAMES=!filament_names! PURGE_VOLUMES=!purge_volumes!\nMMU_START_CHECK\nSTART_PRINT BED_TEMP=[bed_temperature_initial_layer] EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TYPE=\"{curr_bed_type}\"\n; Enter YOUR exist start_print macro call here (minus purging logic because tool may not be loaded yet)\nMMU_START_LOAD_INITIAL_TOOL\n; Optionally add YOUR additional start logic (like purging) here to run just prior to start\nSTART_PRINT_SECONDARY\nSET_PRINT_STATS_INFO TOTAL_LAYER={total_layer_count} ; For pause at layer functionality and better print stats",
|
||||
"machine_unload_filament_time": "30",
|
||||
"machine_start_gcode": "SET_PRINT_STATS_INFO TOTAL_LAYER=[total_layer_count]\nMMU_START_SETUP INITIAL_TOOL={initial_tool} TOTAL_TOOLCHANGES=!total_toolchanges! REFERENCED_TOOLS=!referenced_tools! TOOL_COLORS=!colors! TOOL_TEMPS=!temperatures! TOOL_MATERIALS=!materials! FILAMENT_NAMES=!filament_names! PURGE_VOLUMES=!purge_volumes!\nMMU_START_CHECK\nSTART_PRINT BED_TEMP=[bed_temperature_initial_layer] EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TYPE=\"{curr_bed_type}\" MESH_MIN={adaptive_bed_mesh_min[0]},{adaptive_bed_mesh_min[1]} MESH_MAX={adaptive_bed_mesh_max[0]},{adaptive_bed_mesh_max[1]} ALGORITHM=[bed_mesh_algo] PROBE_COUNT={bed_mesh_probe_count[0]},{bed_mesh_probe_count[1]} ADAPTIVE_MARGIN={adaptive_bed_mesh_margin}\n; Enter YOUR exist start_print macro call here (minus purging logic because tool may not be loaded yet)\nMMU_START_LOAD_INITIAL_TOOL\n; Optionally add YOUR additional start logic (like purging) here to run just prior to start\nSTART_PRINT_SECONDARY\nSET_PRINT_STATS_INFO TOTAL_LAYER={total_layer_count} ; For pause at layer functionality and better print stats",
|
||||
"machine_unload_filament_time": "30",
|
||||
"name": "OpenEYE Peacock V2 0.4 nozzle",
|
||||
"nozzle_diameter": [
|
||||
"0.4"
|
||||
@@ -45,4 +48,4 @@
|
||||
],
|
||||
"setting_id": "GM001",
|
||||
"type": "machine"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -124,8 +124,8 @@
|
||||
"0"
|
||||
],
|
||||
"machine_pause_gcode": "PAUSE",
|
||||
"machine_start_gcode": "SET_PRINT_STATS_INFO TOTAL_LAYER=[total_layer_count]\nMMU_START_SETUP INITIAL_TOOL={initial_tool} TOTAL_TOOLCHANGES=!total_toolchanges! REFERENCED_TOOLS=!referenced_tools! TOOL_COLORS=!colors! TOOL_TEMPS=!temperatures! TOOL_MATERIALS=!materials! FILAMENT_NAMES=!filament_names! PURGE_VOLUMES=!purge_volumes!\nMMU_START_CHECK\nSTART_PRINT BED_TEMP=[bed_temperature_initial_layer] EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TYPE=\"{curr_bed_type}\"\n; Enter YOUR exist start_print macro call here (minus purging logic because tool may not be loaded yet)\nMMU_START_LOAD_INITIAL_TOOL\n; Optionally add YOUR additional start logic (like purging) here to run just prior to start\nSTART_PRINT_SECONDARY\nSET_PRINT_STATS_INFO TOTAL_LAYER={total_layer_count} ; For pause at layer functionality and better print stats",
|
||||
"machine_tool_change_time": "0",
|
||||
"machine_start_gcode": "SET_PRINT_STATS_INFO TOTAL_LAYER=[total_layer_count]\nMMU_START_SETUP INITIAL_TOOL={initial_tool} TOTAL_TOOLCHANGES=!total_toolchanges! REFERENCED_TOOLS=!referenced_tools! TOOL_COLORS=!colors! TOOL_TEMPS=!temperatures! TOOL_MATERIALS=!materials! FILAMENT_NAMES=!filament_names! PURGE_VOLUMES=!purge_volumes!\nMMU_START_CHECK\nSTART_PRINT BED_TEMP=[bed_temperature_initial_layer] EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TYPE=\"{curr_bed_type}\" MESH_MIN={adaptive_bed_mesh_min[0]},{adaptive_bed_mesh_min[1]} MESH_MAX={adaptive_bed_mesh_max[0]},{adaptive_bed_mesh_max[1]} ALGORITHM=[bed_mesh_algo] PROBE_COUNT={bed_mesh_probe_count[0]},{bed_mesh_probe_count[1]} ADAPTIVE_MARGIN={adaptive_bed_mesh_margin}\n; Enter YOUR exist start_print macro call here (minus purging logic because tool may not be loaded yet)\nMMU_START_LOAD_INITIAL_TOOL\n; Optionally add YOUR additional start logic (like purging) here to run just prior to start\nSTART_PRINT_SECONDARY\nSET_PRINT_STATS_INFO TOTAL_LAYER={total_layer_count} ; For pause at layer functionality and better print stats",
|
||||
"machine_tool_change_time": "0",
|
||||
"machine_unload_filament_time": "0",
|
||||
"manual_filament_change": "0",
|
||||
"max_layer_height": [
|
||||
|
||||
|
Before Width: | Height: | Size: 6.9 KiB After Width: | Height: | Size: 6.9 KiB |
@@ -80,6 +80,10 @@
|
||||
{
|
||||
"name": "0.20mm Standard @iQ TiQ2 P2 - PACF Pro Fiberthree + VXL90 Xioneer (0.4 Nozzle)",
|
||||
"sub_path": "process/0.20mm Standard @iQ TiQ2 P2 - PACF Pro Fiberthree + VXL90 Xioneer (0.4 Nozzle).json"
|
||||
},
|
||||
{
|
||||
"name": "0.20mm Standard @iQ TiQ2 P1 - HPP4GF25 Grauts (0.4 Nozzle)",
|
||||
"sub_path": "process/0.20mm Standard @iQ TiQ2 P1 - HPP4GF25 Grauts (0.4 Nozzle).json"
|
||||
}
|
||||
],
|
||||
"filament_list": [
|
||||
@@ -106,6 +110,10 @@
|
||||
{
|
||||
"name": "VXL90 TiQ2 P2 @iQ TiQ2 0.4 Nozzle",
|
||||
"sub_path": "filament/VXL90 TiQ2 P2 @iQ TiQ2 0.4 Nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "Grauts HPP4GF25 P1 @iQ TiQ2 0.4 Nozzle",
|
||||
"sub_path": "filament/Grauts HPP4GF25 P1 @iQ TiQ2 0.4 Nozzle.json"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -0,0 +1,303 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Grauts HPP4GF25 P1 @iQ TiQ2 0.4 Nozzle",
|
||||
"inherits": "fdm_filament_common",
|
||||
"from": "system",
|
||||
"setting_id": "IQS1",
|
||||
"filament_id": "IQM1",
|
||||
"instantiation": "true",
|
||||
"compatible_prints": [
|
||||
"0.20mm Standard @iQ TiQ2 P1 - HPP4GF25 Grauts (0.4 Nozzle)"
|
||||
],
|
||||
"filament_cost": [
|
||||
"70.58"
|
||||
],
|
||||
"filament_density": [
|
||||
"1.09"
|
||||
],
|
||||
"filament_end_gcode": [
|
||||
"; filament end gcode\n{if current_extruder==0}\nG1 Z{layer_z+2} F900 ; safe distance for T0 while tool change\nG1 X-17 Y1 F9000\nG1 X-17 Y45 F9000\nG1 Y1 F9000\nG1 Y45 F9000\n{endif}\n\n{if current_extruder==1}\n{if current_extruder==0}T1{endif}\nG1 X-23 Y3 F9000\nG1 Y45 F9000\nG1 Y3 F9000\nG1 Y45 F9000\n{endif}\n"
|
||||
],
|
||||
"filament_flow_ratio": [
|
||||
"0.926"
|
||||
],
|
||||
"filament_settings_id": [
|
||||
"Grauts HPP4GF25 P1 @iQ TiQ2 0.4 Nozzle"
|
||||
],
|
||||
"filament_shrink": [
|
||||
"98.994%"
|
||||
],
|
||||
"filament_shrinkage_compensation_z": [
|
||||
"99%"
|
||||
],
|
||||
"filament_start_gcode": [
|
||||
"; Filament gcode\n{if current_extruder==0}\nG1 X-17 Y1 F9000\nG1 Y45 F9000\nG1 Y1 F9000\nG1 Y45 F9000\n{if layer_z==0}G1 Z{first_layer_height + 2.0}{endif}\n{if layer_z==0}G1 X[first_layer_print_min_0] Y[first_layer_print_min_1]{endif}\n{if layer_z==0}G1 Z{layer_z}{endif}\n{endif}\n\n{if current_extruder==1}\nG1 X-23 Y3 F9000\nG1 Y45 F9000\nG1 Y3 F9000\nG1 Y45 F9000\n{endif}\n"
|
||||
],
|
||||
"filament_type": [
|
||||
"HPP4GF25"
|
||||
],
|
||||
"hot_plate_temp": [
|
||||
"110"
|
||||
],
|
||||
"hot_plate_temp_initial_layer": [
|
||||
"110"
|
||||
],
|
||||
"idle_temperature": [
|
||||
"180"
|
||||
],
|
||||
"is_custom_defined": "0",
|
||||
"nozzle_temperature": [
|
||||
"220"
|
||||
],
|
||||
"nozzle_temperature_initial_layer": [
|
||||
"220"
|
||||
],
|
||||
"nozzle_temperature_range_high": [
|
||||
"280"
|
||||
],
|
||||
"nozzle_temperature_range_low": [
|
||||
"220"
|
||||
],
|
||||
"temperature_vitrification": [
|
||||
"127"
|
||||
],
|
||||
"version": "2.3.1.10",
|
||||
|
||||
|
||||
"activate_air_filtration": [
|
||||
"0"
|
||||
],
|
||||
"activate_chamber_temp_control": [
|
||||
"0"
|
||||
],
|
||||
"adaptive_pressure_advance": [
|
||||
"0"
|
||||
],
|
||||
"adaptive_pressure_advance_bridges": [
|
||||
"0"
|
||||
],
|
||||
"adaptive_pressure_advance_model": [
|
||||
"0,0,0\n0,0,0"
|
||||
],
|
||||
"adaptive_pressure_advance_overhangs": [
|
||||
"0"
|
||||
],
|
||||
"additional_cooling_fan_speed": [
|
||||
"0"
|
||||
],
|
||||
"chamber_temperature": [
|
||||
"0"
|
||||
],
|
||||
"close_fan_the_first_x_layers": [
|
||||
"3"
|
||||
],
|
||||
"compatible_printers": [
|
||||
"iQ TiQ2 0.4 Nozzle"
|
||||
],
|
||||
"compatible_printers_condition": "",
|
||||
"compatible_prints_condition": "",
|
||||
"complete_print_exhaust_fan_speed": [
|
||||
"80"
|
||||
],
|
||||
"cool_plate_temp": [
|
||||
"105"
|
||||
],
|
||||
"cool_plate_temp_initial_layer": [
|
||||
"105"
|
||||
],
|
||||
"default_filament_colour": [
|
||||
"#000000"
|
||||
],
|
||||
"dont_slow_down_outer_wall": [
|
||||
"0"
|
||||
],
|
||||
"during_print_exhaust_fan_speed": [
|
||||
"60"
|
||||
],
|
||||
"enable_overhang_bridge_fan": [
|
||||
"1"
|
||||
],
|
||||
"enable_pressure_advance": [
|
||||
"0"
|
||||
],
|
||||
"eng_plate_temp": [
|
||||
"105"
|
||||
],
|
||||
"eng_plate_temp_initial_layer": [
|
||||
"105"
|
||||
],
|
||||
"fan_cooling_layer_time": [
|
||||
"30"
|
||||
],
|
||||
"fan_max_speed": [
|
||||
"80"
|
||||
],
|
||||
"fan_min_speed": [
|
||||
"10"
|
||||
],
|
||||
"filament_cooling_final_speed": [
|
||||
"3.5"
|
||||
],
|
||||
"filament_cooling_initial_speed": [
|
||||
"10"
|
||||
],
|
||||
"filament_cooling_moves": [
|
||||
"2"
|
||||
],
|
||||
"filament_deretraction_speed": [
|
||||
"nil"
|
||||
],
|
||||
"filament_diameter": [
|
||||
"1.75"
|
||||
],
|
||||
"filament_is_support": [
|
||||
"0"
|
||||
],
|
||||
"filament_loading_speed": [
|
||||
"10"
|
||||
],
|
||||
"filament_loading_speed_start": [
|
||||
"50"
|
||||
],
|
||||
"filament_long_retractions_when_cut": [
|
||||
"nil"
|
||||
],
|
||||
"filament_max_volumetric_speed": [
|
||||
"12"
|
||||
],
|
||||
"filament_minimal_purge_on_wipe_tower": [
|
||||
"15"
|
||||
],
|
||||
"filament_multitool_ramming": [
|
||||
"1"
|
||||
],
|
||||
"filament_multitool_ramming_flow": [
|
||||
"40"
|
||||
],
|
||||
"filament_multitool_ramming_volume": [
|
||||
"10"
|
||||
],
|
||||
"filament_notes": [
|
||||
""
|
||||
],
|
||||
"filament_ramming_parameters": [
|
||||
"120 100 6.6 6.8 7.2 7.6 7.9 8.2 8.7 9.4 9.9 10.0| 0.05 6.6 0.45 6.8 0.95 7.8 1.45 8.3 1.95 9.7 2.45 10 2.95 7.6 3.45 7.6 3.95 7.6 4.45 7.6 4.95 7.6"
|
||||
],
|
||||
"filament_retract_before_wipe": [
|
||||
"nil"
|
||||
],
|
||||
"filament_retract_lift_above": [
|
||||
"nil"
|
||||
],
|
||||
"filament_retract_lift_below": [
|
||||
"nil"
|
||||
],
|
||||
"filament_retract_lift_enforce": [
|
||||
"nil"
|
||||
],
|
||||
"filament_retract_restart_extra": [
|
||||
"nil"
|
||||
],
|
||||
"filament_retract_when_changing_layer": [
|
||||
"nil"
|
||||
],
|
||||
"filament_retraction_distances_when_cut": [
|
||||
"nil"
|
||||
],
|
||||
"filament_retraction_length": [
|
||||
"4"
|
||||
],
|
||||
"filament_retraction_minimum_travel": [
|
||||
"nil"
|
||||
],
|
||||
"filament_retraction_speed": [
|
||||
"40"
|
||||
],
|
||||
"filament_soluble": [
|
||||
"0"
|
||||
],
|
||||
"filament_stamping_distance": [
|
||||
"45"
|
||||
],
|
||||
"filament_stamping_loading_speed": [
|
||||
"29"
|
||||
],
|
||||
"filament_toolchange_delay": [
|
||||
"0"
|
||||
],
|
||||
"filament_unloading_speed": [
|
||||
"100"
|
||||
],
|
||||
"filament_unloading_speed_start": [
|
||||
"100"
|
||||
],
|
||||
"filament_vendor": [
|
||||
"iQ Materials"
|
||||
],
|
||||
"filament_wipe": [
|
||||
"nil"
|
||||
],
|
||||
"filament_wipe_distance": [
|
||||
"nil"
|
||||
],
|
||||
"filament_z_hop": [
|
||||
"nil"
|
||||
],
|
||||
"filament_z_hop_types": [
|
||||
"nil"
|
||||
],
|
||||
"full_fan_speed_layer": [
|
||||
"0"
|
||||
],
|
||||
"internal_bridge_fan_speed": [
|
||||
"-1"
|
||||
],
|
||||
"overhang_fan_speed": [
|
||||
"80"
|
||||
],
|
||||
"overhang_fan_threshold": [
|
||||
"25%"
|
||||
],
|
||||
"pellet_flow_coefficient": [
|
||||
"0.4157"
|
||||
],
|
||||
"pressure_advance": [
|
||||
"0.02"
|
||||
],
|
||||
"reduce_fan_stop_start_freq": [
|
||||
"1"
|
||||
],
|
||||
"required_nozzle_HRC": [
|
||||
"0"
|
||||
],
|
||||
"slow_down_for_layer_cooling": [
|
||||
"1"
|
||||
],
|
||||
"slow_down_layer_time": [
|
||||
"3"
|
||||
],
|
||||
"slow_down_min_speed": [
|
||||
"10"
|
||||
],
|
||||
"supertack_plate_temp": [
|
||||
"35"
|
||||
],
|
||||
"supertack_plate_temp_initial_layer": [
|
||||
"35"
|
||||
],
|
||||
"support_material_interface_fan_speed": [
|
||||
"-1"
|
||||
],
|
||||
"textured_cool_plate_temp": [
|
||||
"40"
|
||||
],
|
||||
"textured_cool_plate_temp_initial_layer": [
|
||||
"40"
|
||||
],
|
||||
"textured_plate_temp": [
|
||||
"105"
|
||||
],
|
||||
"textured_plate_temp_initial_layer": [
|
||||
"105"
|
||||
]
|
||||
}
|
||||
@@ -30,9 +30,6 @@
|
||||
"chamber_temperature": [
|
||||
"0"
|
||||
],
|
||||
"close_fan_the_first_x_layers": [
|
||||
"3"
|
||||
],
|
||||
"compatible_printers": [
|
||||
"iQ TiQ2 0.4 Nozzle"
|
||||
],
|
||||
@@ -89,6 +86,9 @@
|
||||
"filament_cooling_moves": [
|
||||
"4"
|
||||
],
|
||||
"close_fan_the_first_x_layers": [
|
||||
"1000"
|
||||
],
|
||||
"filament_cost": [
|
||||
"29.99"
|
||||
],
|
||||
@@ -162,7 +162,7 @@
|
||||
"nil"
|
||||
],
|
||||
"filament_retraction_length": [
|
||||
"0.2"
|
||||
"0.4"
|
||||
],
|
||||
"filament_retraction_minimum_travel": [
|
||||
"nil"
|
||||
@@ -222,7 +222,7 @@
|
||||
"0"
|
||||
],
|
||||
"hot_plate_temp": [
|
||||
"80"
|
||||
"70"
|
||||
],
|
||||
"hot_plate_temp_initial_layer": [
|
||||
"80"
|
||||
@@ -237,7 +237,7 @@
|
||||
"-1"
|
||||
],
|
||||
"nozzle_temperature": [
|
||||
"250"
|
||||
"240"
|
||||
],
|
||||
"nozzle_temperature_initial_layer": [
|
||||
"250"
|
||||
@@ -261,7 +261,7 @@
|
||||
"0.02"
|
||||
],
|
||||
"reduce_fan_stop_start_freq": [
|
||||
"1"
|
||||
"0"
|
||||
],
|
||||
"required_nozzle_HRC": [
|
||||
"3"
|
||||
|
||||
@@ -0,0 +1,70 @@
|
||||
{
|
||||
"type": "process",
|
||||
"inherits": "fdm_process_tiq_common",
|
||||
"from": "system",
|
||||
"instantiation": "true",
|
||||
"default_acceleration": "1500",
|
||||
"enable_extra_bridge_layer": "apply_to_all",
|
||||
"enable_prime_tower": "0",
|
||||
"initial_layer_infill_speed": "100",
|
||||
"inner_wall_acceleration": "1500",
|
||||
"inner_wall_speed": "100",
|
||||
"is_custom_defined": "0",
|
||||
"name": "0.20mm Standard @iQ TiQ2 P1 - HPP4GF25 Grauts (0.4 Nozzle)",
|
||||
"notes": "Pre-Select: FBA Time Delay: 0 EPC Factor: 0\n\nDeutsch P1 HPP4GF25\n\n1. Überprüfen Sie, dass sich das Grauts HPP4GF25 im linken Extruder befindet. Halten Sie das Filament trocken! Detailierte Trocknungsanleitung, siehe unten.\n\n2. Überprüfen Sie, dass sich eine 0,4 mm Wolfram-Kupfer Düse im linken Extruder befindet.\n\n3. Verwenden Sie Magigoo Kleber für PPGF auf der PET-Folie, um eine bessere Haftung zu gewährleisten, im Singledruck in der Regel auf PET-Folie nicht erforderlich.\n\n4. Reinigen Sie ggf. die Düse mit einer Messing-Drahtbürste.\nNun sind sie bereit, um Ihren Druck zu starten.\n\n\nTipp: Am besten lässt sich das Bauteil bei einer Druckplattentemperatur von 80°C entfernen, da dann der Kleber weich wird.\n\n\nEnglish P1 HPP4GF25\n\n1. Check Left extruder filament: Grauts HPP4GF25 - Keep the filament dry!! Detailed drying instruction below.\n\n2. Check left extruder nozzle: 0.4mm Wolfram\n\n3. Check bed: PET with Magigoo glue for PPGF\n\n4. Check nozzle: Clean it with brush\n\nWELLDONE! YOU ARE READY NOW TO START YOUR PRINT JOB!\n\n\nTip: The component is best removed at a printing plate temperature of 80°C, as this softens the adhesive.",
|
||||
"outer_wall_acceleration": "1500",
|
||||
"outer_wall_speed": "80",
|
||||
"print_settings_id": "0.20mm Standard @iQ TiQ2 P1 - HPP4GF25 Grauts (0.4 Nozzle)",
|
||||
"sparse_infill_speed": "100",
|
||||
"support_angle": "0",
|
||||
"support_base_pattern": "default",
|
||||
"support_interface_bottom_layers": "0",
|
||||
"support_interface_top_layers": "3",
|
||||
"support_object_first_layer_gap": "0.3",
|
||||
"support_object_xy_distance": "0.35",
|
||||
"support_on_build_plate_only": "0",
|
||||
"support_speed": "100",
|
||||
"support_style": "snug",
|
||||
"support_top_z_distance": "0.2",
|
||||
"support_type": "normal(auto)",
|
||||
"top_surface_acceleration": "1500",
|
||||
"top_surface_speed": "80",
|
||||
"travel_acceleration": "1500",
|
||||
"version": "2.3.1.10",
|
||||
|
||||
"bridge_flow": "1.07",
|
||||
"bridge_speed": "25",
|
||||
"brim_type": "no_brim",
|
||||
"enable_support": "1",
|
||||
"exclude_object": "0",
|
||||
"gcode_label_objects": "0",
|
||||
"compatible_printers": [
|
||||
"iQ TiQ2 0.4 Nozzle"
|
||||
],
|
||||
"internal_bridge_speed": "50%",
|
||||
"internal_solid_infill_speed": "60",
|
||||
"ironing_pattern": "concentric",
|
||||
"prime_tower_width": "80",
|
||||
"layer_height": "0.2",
|
||||
"reduce_crossing_wall": "1",
|
||||
"skirt_height": "1",
|
||||
"skirt_loops": "2",
|
||||
"small_perimeter_speed": "30%",
|
||||
"small_perimeter_threshold": "5",
|
||||
"sparse_infill_density": "30%",
|
||||
"sparse_infill_pattern": "triangles",
|
||||
"support_base_pattern_spacing": "1",
|
||||
"support_bottom_interface_spacing": "0.3",
|
||||
"support_bottom_z_distance": "0.24",
|
||||
"support_expansion": "0.5",
|
||||
"support_filament": "1",
|
||||
"support_interface_filament": "1",
|
||||
"support_interface_pattern": "rectilinear_interlaced",
|
||||
"support_interface_spacing": "0",
|
||||
"top_shell_thickness": "0",
|
||||
"top_solid_infill_flow_ratio": "0.98",
|
||||
"tree_support_branch_diameter_angle": "10",
|
||||
"tree_support_branch_diameter_organic": "3",
|
||||
"tree_support_tip_diameter": "2",
|
||||
"wall_loops": "2"
|
||||
}
|
||||
@@ -20,6 +20,9 @@
|
||||
"enable_overhang_speed": "0",
|
||||
"enable_prime_tower": "0",
|
||||
"gap_infill_speed": "50",
|
||||
"thick_internal_bridges": "0",
|
||||
"enable_extra_bridge_layer": "apply_to_all",
|
||||
"bottom_shell_thickness": "0.8",
|
||||
"initial_layer_infill_speed": "25",
|
||||
"initial_layer_speed": "25",
|
||||
"initial_layer_travel_speed": "50%",
|
||||
@@ -63,10 +66,11 @@
|
||||
"tree_support_wall_count": "2",
|
||||
"wall_direction": "ccw",
|
||||
"wall_loops": "3",
|
||||
"wall_sequence": "inner-outer-inner wall",
|
||||
"wall_sequence": "inner wall/outer wall",
|
||||
"support_base_pattern": "rectilinear-grid",
|
||||
"support_interface_pattern": "rectilinear_interlaced",
|
||||
"support_interface_spacing": "0",
|
||||
"small_perimeter_speed": "30%",
|
||||
"small_perimeter_speed": "50",
|
||||
"support_interface_speed": "50",
|
||||
"brim_type": "no_brim"
|
||||
}
|
||||
@@ -11,7 +11,7 @@
|
||||
<summary>Get even more perfect prints!</summary>
|
||||
<developer_name>SoftFever</developer_name>
|
||||
<url type="homepage">https://github.com/OrcaSlicer/OrcaSlicer</url>
|
||||
<url type="help">https://github.com/OrcaSlicer/OrcaSlicer/wiki</url>
|
||||
<url type="help">https://www.orcaslicer.com/wiki</url>
|
||||
<url type="bugtracker">https://github.com/OrcaSlicer/OrcaSlicer/issues/</url>
|
||||
<url type="donation">https://ko-fi.com/SoftFever</url>
|
||||
<metadata_license>0BSD</metadata_license>
|
||||
|
||||
@@ -6,8 +6,6 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
# Include dev-utils for encoding check and other utilities
|
||||
add_subdirectory(dev-utils)
|
||||
# Clipper2 math utils
|
||||
add_subdirectory(clipper2)
|
||||
# add_subdirectory(avrdude)
|
||||
# Note: semver and hints are now included from deps_src/CMakeLists.txt
|
||||
|
||||
|
||||
@@ -331,10 +331,18 @@ void AppConfig::set_defaults()
|
||||
set("auto_calculate_flush","all");
|
||||
}
|
||||
|
||||
if (get("show_canvas_zoom_button").empty()) {
|
||||
set_bool("show_canvas_zoom_button", true);
|
||||
}
|
||||
|
||||
if (get("remember_printer_config").empty()) {
|
||||
set_bool("remember_printer_config", true);
|
||||
}
|
||||
|
||||
if (get("group_filament_presets").empty()) {
|
||||
set("group_filament_presets", "1"); // All "0" / None "1" / By Type "2" / By Vendor "3"
|
||||
}
|
||||
|
||||
if (get("enable_high_low_temp_mixed_printing").empty()){
|
||||
set_bool("enable_high_low_temp_mixed_printing", false);
|
||||
}
|
||||
|
||||
@@ -162,8 +162,8 @@ void fuzzy_extrusion_line(Arachne::ExtrusionJunctions& ext_lines, coordf_t slice
|
||||
}
|
||||
|
||||
if (ext_lines.back().p == ext_lines.front().p) { // Connect endpoints.
|
||||
out.front().p = out.back().p;
|
||||
out.front().w = out.back().w;
|
||||
out.back().p = out.front().p;
|
||||
out.back().w = out.front().w;
|
||||
}
|
||||
|
||||
if (out.size() >= 3)
|
||||
|
||||
@@ -1707,6 +1707,12 @@ void Fill::connect_infill(Polylines &&infill_ordered, const std::vector<const Po
|
||||
size_t polyline_idx1 = get_and_update_merged_with(((cp1 - graph.map_infill_end_point_to_boundary.data()) / 2));
|
||||
size_t polyline_idx2 = get_and_update_merged_with(((cp2 - graph.map_infill_end_point_to_boundary.data()) / 2));
|
||||
const Points &contour = graph.boundary[cp1->contour_idx];
|
||||
|
||||
// Orca: If multiline infill is requested, skip connections that are too short.
|
||||
if (params.multiline > 1 && arc.arc_length < scale_(spacing) * params.multiline) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const std::vector<double> &contour_params = graph.boundary_params[cp1->contour_idx];
|
||||
if (polyline_idx1 != polyline_idx2) {
|
||||
Polyline &polyline1 = infill_ordered[polyline_idx1];
|
||||
|
||||
@@ -3084,10 +3084,11 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato
|
||||
m_sorted_layer_filaments.emplace_back(lt.extruders);
|
||||
}
|
||||
|
||||
// Orca: finish tracking power lost recovery
|
||||
// Orca: disable power loss recovery if it was enabled earlier
|
||||
{
|
||||
if (m_second_layer_things_done && print.config().enable_power_loss_recovery.value == true) {
|
||||
file.write(m_writer.enable_power_loss_recovery(false));
|
||||
const auto plr_mode = print.config().enable_power_loss_recovery.value;
|
||||
if (m_second_layer_things_done && plr_mode == PowerLossRecoveryMode::Enable) {
|
||||
file.write(m_writer.enable_power_loss_recovery(PowerLossRecoveryMode::Disable));
|
||||
}
|
||||
}
|
||||
++ finished_objects;
|
||||
@@ -3165,9 +3166,9 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato
|
||||
m_sorted_layer_filaments.emplace_back(lt.extruders);
|
||||
}
|
||||
|
||||
// Orca: finish tracking power lost recovery
|
||||
if (m_second_layer_things_done && print.config().enable_power_loss_recovery.value == true) {
|
||||
file.write(m_writer.enable_power_loss_recovery(false));
|
||||
// Orca: disable power loss recovery
|
||||
if (m_second_layer_things_done && print.config().enable_power_loss_recovery.value == PowerLossRecoveryMode::Enable) {
|
||||
file.write(m_writer.enable_power_loss_recovery(PowerLossRecoveryMode::Disable));
|
||||
}
|
||||
if (m_wipe_tower)
|
||||
// Purge the extruder, pull out the active filament.
|
||||
@@ -4381,10 +4382,9 @@ LayerResult GCode::process_layer(
|
||||
}
|
||||
|
||||
if (!first_layer && !m_second_layer_things_done) {
|
||||
// Orca: start tracking power lost recovery
|
||||
if (print.config().enable_power_loss_recovery.value == true) {
|
||||
gcode += m_writer.enable_power_loss_recovery(true);
|
||||
}
|
||||
// Orca: set power loss recovery
|
||||
const auto plr_mode = print.config().enable_power_loss_recovery.value;
|
||||
gcode += m_writer.enable_power_loss_recovery(plr_mode);
|
||||
|
||||
if (print.is_BBL_printer()) {
|
||||
// BBS: open first layer inspection at second layer
|
||||
|
||||
@@ -1846,7 +1846,7 @@ void GCodeProcessor::apply_config(const PrintConfig& config)
|
||||
// sanity check
|
||||
if(m_preheat_steps < 1)
|
||||
m_preheat_steps = 1;
|
||||
m_result.backtrace_enabled = m_preheat_time > 0 && (m_is_XL_printer || (!m_single_extruder_multi_material && filament_count > 1));
|
||||
m_result.backtrace_enabled = config.ooze_prevention && m_preheat_time > 0 && (m_is_XL_printer || (!m_single_extruder_multi_material && filament_count > 1));
|
||||
|
||||
assert(config.nozzle_volume.size() == config.nozzle_diameter.size());
|
||||
m_nozzle_volume.resize(config.nozzle_volume.size());
|
||||
|
||||
@@ -15,7 +15,6 @@
|
||||
#include "../PrintConfig.hpp"
|
||||
|
||||
#include "SmallAreaInfillFlowCompensator.hpp"
|
||||
#include "spline/spline.h"
|
||||
#include <boost/log/trivial.hpp>
|
||||
|
||||
namespace Slic3r {
|
||||
@@ -47,37 +46,43 @@ SmallAreaInfillFlowCompensator::SmallAreaInfillFlowCompensator(const Slic3r::GCo
|
||||
}
|
||||
} catch (...) {
|
||||
std::stringstream ss;
|
||||
ss << "Error parsing data point in small area infill compensation model:" << line << std::endl;
|
||||
ss << "Small Area Flow Compensation: Error parsing data point in small area infill compensation model:" << line << std::endl;
|
||||
|
||||
throw Slic3r::InvalidArgument(ss.str());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < eLengths.size(); i++) {
|
||||
for (size_t i = 0; i < eLengths.size(); i++) {
|
||||
if (i == 0) {
|
||||
if (!nearly_equal(eLengths[i], 0.0)) {
|
||||
throw Slic3r::InvalidArgument("First extrusion length for small area infill compensation model must be 0");
|
||||
throw Slic3r::InvalidArgument("Small Area Flow Compensation: First extrusion length for small area infill compensation model must be 0");
|
||||
}
|
||||
} else {
|
||||
if (nearly_equal(eLengths[i], 0.0)) {
|
||||
throw Slic3r::InvalidArgument("Only the first extrusion length for small area infill compensation model can be 0");
|
||||
throw Slic3r::InvalidArgument("Small Area Flow Compensation: Only the first extrusion length for small area infill compensation model can be 0");
|
||||
}
|
||||
if (eLengths[i] <= eLengths[i - 1]) {
|
||||
throw Slic3r::InvalidArgument("Extrusion lengths for subsequent points must be increasing");
|
||||
throw Slic3r::InvalidArgument("Small Area Flow Compensation: Extrusion lengths for subsequent points must be increasing");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!flowComps.empty() && !nearly_equal(flowComps.back(), 1.0)) {
|
||||
throw Slic3r::InvalidArgument("Final compensation factor for small area infill flow compensation model must be 1.0");
|
||||
for (size_t i = 1; i < flowComps.size(); ++i) {
|
||||
if (flowComps[i] <= flowComps[i - 1]) {
|
||||
throw Slic3r::InvalidArgument("Small Area Flow Compensation: Flow compensation factors must strictly increase with extrusion length");
|
||||
}
|
||||
}
|
||||
|
||||
flowModel = std::make_unique<tk::spline>();
|
||||
flowModel->set_points(eLengths, flowComps);
|
||||
if (!flowComps.empty() && !nearly_equal(flowComps.back(), 1.0)) {
|
||||
throw Slic3r::InvalidArgument("Small Area Flow Compensation: Final compensation factor for small area infill flow compensation model must be 1.0");
|
||||
}
|
||||
|
||||
flowModel = std::make_unique<PchipInterpolatorHelper>(eLengths, flowComps);
|
||||
|
||||
} catch (std::exception& e) {
|
||||
BOOST_LOG_TRIVIAL(error) << "Error parsing small area infill compensation model: " << e.what();
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -92,7 +97,7 @@ double SmallAreaInfillFlowCompensator::flow_comp_model(const double line_length)
|
||||
return 1.0;
|
||||
}
|
||||
|
||||
return (*flowModel)(line_length);
|
||||
return flowModel->interpolate(line_length);
|
||||
}
|
||||
|
||||
double SmallAreaInfillFlowCompensator::modify_flow(const double line_length, const double dE, const ExtrusionRole role)
|
||||
|
||||
@@ -4,12 +4,9 @@
|
||||
#include "../libslic3r.h"
|
||||
#include "../PrintConfig.hpp"
|
||||
#include "../ExtrusionEntity.hpp"
|
||||
#include "PchipInterpolatorHelper.hpp"
|
||||
#include <memory>
|
||||
|
||||
namespace tk {
|
||||
class spline;
|
||||
} // namespace tk
|
||||
|
||||
namespace Slic3r {
|
||||
|
||||
class SmallAreaInfillFlowCompensator
|
||||
@@ -26,8 +23,7 @@ private:
|
||||
std::vector<double> eLengths;
|
||||
std::vector<double> flowComps;
|
||||
|
||||
// TODO: Cubic Spline
|
||||
std::unique_ptr<tk::spline> flowModel;
|
||||
std::unique_ptr<PchipInterpolatorHelper> flowModel;
|
||||
|
||||
double flow_comp_model(const double line_length);
|
||||
|
||||
|
||||
@@ -1215,6 +1215,10 @@ WipeTower::ToolChangeResult WipeTower2::construct_tcr(WipeTowerWriter2& writer,
|
||||
result.extrusions = std::move(writer.extrusions());
|
||||
result.wipe_path = std::move(writer.wipe_path());
|
||||
result.is_finish_first = is_finish;
|
||||
// ORCA: Always initialize the tool_change_start_pos with a valid position
|
||||
// to avoid undefined variable travel on X in Gcode.cpp function std::string WipeTowerIntegration::post_process_wipe_tower_moves
|
||||
result.tool_change_start_pos = result.start_pos; // always valid fallback
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@@ -58,10 +58,18 @@ public:
|
||||
std::vector<std::pair<float, float>> get_z_and_depth_pairs() const;
|
||||
float get_brim_width() const { return m_wipe_tower_brim_width_real; }
|
||||
float get_wipe_tower_height() const { return m_wipe_tower_height; }
|
||||
|
||||
|
||||
|
||||
|
||||
// ORCA: Match WipeTower API used by Print skirt/brim planning.
|
||||
// Returned bounding box is in WIPE-TOWER-LOCAL coordinates (before placement on the bed).
|
||||
// Include brim and y-shift to match what WT gcode actually prints.
|
||||
BoundingBoxf get_bbx() const{
|
||||
const float brim = m_wipe_tower_brim_width_real;
|
||||
const Vec2d min(-brim, -brim + double(m_y_shift));
|
||||
const Vec2d max(double(m_wipe_tower_width) + brim, double(m_wipe_tower_depth) + brim + double(m_y_shift));
|
||||
return BoundingBoxf(min, max);
|
||||
}
|
||||
// WT2 doesn't currently compute a rib-origin compensation like WipeTower (m_rib_offset),
|
||||
// so expose a zero offset for consistency purposes (to maintain API parity).
|
||||
Vec2f get_rib_offset() const { return Vec2f::Zero(); }
|
||||
|
||||
// Switch to a next layer.
|
||||
void set_layer(
|
||||
|
||||
@@ -444,23 +444,28 @@ std::string GCodeWriter::reset_e(bool force)
|
||||
}
|
||||
}
|
||||
|
||||
std::string GCodeWriter::enable_power_loss_recovery(bool enable)
|
||||
std::string GCodeWriter::enable_power_loss_recovery(PowerLossRecoveryMode mode)
|
||||
{
|
||||
std::ostringstream gcode;
|
||||
|
||||
|
||||
if (mode == PowerLossRecoveryMode::PrinterConfiguration)
|
||||
return std::string();
|
||||
|
||||
const bool enable = mode == PowerLossRecoveryMode::Enable;
|
||||
|
||||
if (m_is_bbl_printers) {
|
||||
gcode << "; start tracking Power Loss Recovery https://wiki.bambulab.com/en/knowledge-sharing/power-loss-recovery\n";
|
||||
gcode << "M1003 S" << (enable ? "1" : "0") << "\n";
|
||||
gcode << "M1003 S" << (enable ? "1" : "0");
|
||||
}
|
||||
else if (FLAVOR_IS(gcfMarlinFirmware)) {
|
||||
gcode << "; start tracking Power-loss Recovery https://marlinfw.org/docs/gcode/M413.html\n";
|
||||
gcode << "M413 S" << (enable ? "1" : "0") << "\n";
|
||||
gcode << "M413 S" << (enable ? "1" : "0");
|
||||
} else {
|
||||
return std::string();
|
||||
}
|
||||
|
||||
if (GCodeWriter::full_gcode_comment) gcode << " ; set Power-loss Recovery";
|
||||
gcode << "\n";
|
||||
return gcode.str();
|
||||
}
|
||||
|
||||
|
||||
std::string GCodeWriter::update_progress(unsigned int num, unsigned int tot, bool allow_100) const
|
||||
{
|
||||
if (FLAVOR_IS_NOT(gcfMakerWare) && FLAVOR_IS_NOT(gcfSailfish))
|
||||
|
||||
@@ -61,7 +61,7 @@ public:
|
||||
std::string set_input_shaping(char axis, float damp, float freq, std::string type) const;
|
||||
std::string reset_e(bool force = false);
|
||||
std::string update_progress(unsigned int num, unsigned int tot, bool allow_100 = false) const;
|
||||
std::string enable_power_loss_recovery(bool enable);
|
||||
std::string enable_power_loss_recovery(PowerLossRecoveryMode mode);
|
||||
// return false if this extruder was already selected
|
||||
bool need_toolchange(unsigned int filament_id) const;
|
||||
std::string set_extruder(unsigned int filament_id);
|
||||
|
||||
@@ -904,7 +904,7 @@ static std::vector<std::string> s_Preset_print_options {
|
||||
"top_surface_speed", "support_speed", "support_object_xy_distance", "support_object_first_layer_gap", "support_interface_speed",
|
||||
"bridge_speed", "internal_bridge_speed", "gap_infill_speed", "travel_speed", "travel_speed_z", "initial_layer_speed",
|
||||
"outer_wall_acceleration", "initial_layer_acceleration", "top_surface_acceleration", "default_acceleration", "skirt_type", "skirt_loops", "skirt_speed","min_skirt_length", "skirt_distance", "skirt_start_angle", "skirt_height","single_loop_draft_shield", "draft_shield",
|
||||
"brim_width", "brim_object_gap", "brim_type", "brim_ears_max_angle", "brim_ears_detection_length", "enable_support", "support_type", "support_threshold_angle", "support_threshold_overlap","enforce_support_layers",
|
||||
"brim_width", "brim_object_gap", "brim_use_efc_outline", "brim_type", "brim_ears_max_angle", "brim_ears_detection_length", "enable_support", "support_type", "support_threshold_angle", "support_threshold_overlap","enforce_support_layers",
|
||||
"raft_layers", "raft_first_layer_density", "raft_first_layer_expansion", "raft_contact_distance", "raft_expansion",
|
||||
"support_base_pattern", "support_base_pattern_spacing", "support_expansion", "support_style",
|
||||
// BBS
|
||||
|
||||
@@ -3333,6 +3333,8 @@ void Print::_make_wipe_tower()
|
||||
m_wipe_tower_data.z_and_depth_pairs = wipe_tower.get_z_and_depth_pairs();
|
||||
m_wipe_tower_data.brim_width = wipe_tower.get_brim_width();
|
||||
m_wipe_tower_data.height = wipe_tower.get_wipe_tower_height();
|
||||
m_wipe_tower_data.bbx = wipe_tower.get_bbx();
|
||||
m_wipe_tower_data.rib_offset = wipe_tower.get_rib_offset();
|
||||
|
||||
// Unload the current filament over the purge tower.
|
||||
coordf_t layer_height = m_objects.front()->config().layer_height.value;
|
||||
|
||||
@@ -161,6 +161,14 @@ static t_config_enum_values s_keys_map_BedTempFormula {
|
||||
};
|
||||
CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(BedTempFormula)
|
||||
|
||||
// Orca
|
||||
static t_config_enum_values s_keys_map_PowerLossRecoveryMode {
|
||||
{ "printer_configuration", int(PowerLossRecoveryMode::PrinterConfiguration) },
|
||||
{ "enable", int(PowerLossRecoveryMode::Enable) },
|
||||
{ "disable", int(PowerLossRecoveryMode::Disable) }
|
||||
};
|
||||
CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(PowerLossRecoveryMode)
|
||||
|
||||
static t_config_enum_values s_keys_map_FuzzySkinType {
|
||||
{ "none", int(FuzzySkinType::None) },
|
||||
{ "external", int(FuzzySkinType::External) },
|
||||
@@ -1562,6 +1570,16 @@ void PrintConfigDef::init_fff_params()
|
||||
def->mode = comAdvanced;
|
||||
def->set_default_value(new ConfigOptionFloat(0.));
|
||||
|
||||
def = this->add("brim_use_efc_outline", coBool);
|
||||
def->label = L("Brim follows compensated outline");
|
||||
def->category = L("Support");
|
||||
def->tooltip = L("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." );
|
||||
def->mode = comAdvanced;
|
||||
def->set_default_value(new ConfigOptionBool(false));
|
||||
|
||||
def = this->add("brim_ears", coBool);
|
||||
def->label = L("Brim ears");
|
||||
def->category = L("Support");
|
||||
@@ -3366,11 +3384,18 @@ void PrintConfigDef::init_fff_params()
|
||||
def->set_default_value(new ConfigOptionBool(false));
|
||||
|
||||
// Orca
|
||||
def = this->add("enable_power_loss_recovery", coBool);
|
||||
def->label = L("Turn on Power Loss Recovery");
|
||||
def->tooltip = L("Enable this to insert power loss recovery commands in generated G-code.(Only for Bambu Lab printers and Marlin firmware based printers)");
|
||||
def = this->add("enable_power_loss_recovery", coEnum);
|
||||
def->label = L("Power Loss Recovery");
|
||||
def->tooltip = L("Choose how to control power loss recovery. When set to Printer configuration, the slicer will not emit power loss recovery G-code and will leave the printer's configuration unchanged. Applicable to Bambu Lab or Marlin 2 firmware based printers.");
|
||||
def->mode = comAdvanced;
|
||||
def->set_default_value(new ConfigOptionBool(false));
|
||||
def->enum_keys_map = &ConfigOptionEnum<PowerLossRecoveryMode>::get_enum_values();
|
||||
def->enum_values.push_back("printer_configuration");
|
||||
def->enum_values.push_back("enable");
|
||||
def->enum_values.push_back("disable");
|
||||
def->enum_labels.push_back(L("Printer configuration"));
|
||||
def->enum_labels.push_back(L("Enable"));
|
||||
def->enum_labels.push_back(L("Disable"));
|
||||
def->set_default_value(new ConfigOptionEnum<PowerLossRecoveryMode>(PowerLossRecoveryMode::PrinterConfiguration));
|
||||
|
||||
//BBS
|
||||
// def = this->add("spaghetti_detector", coBool);
|
||||
@@ -7432,6 +7457,13 @@ void PrintConfigDef::handle_legacy(t_config_option_key &opt_key, std::string &va
|
||||
else if (opt_key == "extruder_type") {
|
||||
ReplaceString(value, "DirectDrive", "Direct Drive");
|
||||
}
|
||||
else if (opt_key == "enable_power_loss_recovery") {
|
||||
if (value == "1" || boost::iequals(value, "true")) {
|
||||
value = "enable";
|
||||
} else if (value == "0" || boost::iequals(value, "false")) {
|
||||
value = "disable";
|
||||
}
|
||||
}
|
||||
else if(opt_key == "ensure_vertical_shell_thickness") {
|
||||
if(value == "1") {
|
||||
value = "ensure_all";
|
||||
|
||||
@@ -102,6 +102,13 @@ enum class BedTempFormula {
|
||||
count,
|
||||
};
|
||||
|
||||
// Orca
|
||||
enum class PowerLossRecoveryMode {
|
||||
PrinterConfiguration,
|
||||
Enable,
|
||||
Disable,
|
||||
};
|
||||
|
||||
// BBS
|
||||
enum class WallSequence {
|
||||
InnerOuter,
|
||||
@@ -507,6 +514,7 @@ CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(PrintHostType)
|
||||
CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(AuthorizationType)
|
||||
CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(WipeTowerWallType)
|
||||
CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(PerimeterGeneratorType)
|
||||
CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(PowerLossRecoveryMode)
|
||||
|
||||
#undef CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS
|
||||
|
||||
@@ -874,6 +882,7 @@ PRINT_CONFIG_CLASS_DEFINE(
|
||||
PrintObjectConfig,
|
||||
|
||||
((ConfigOptionFloat, brim_object_gap))
|
||||
((ConfigOptionBool, brim_use_efc_outline))
|
||||
((ConfigOptionEnum<BrimType>, brim_type))
|
||||
((ConfigOptionFloat, brim_width))
|
||||
((ConfigOptionFloat, brim_ears_detection_length))
|
||||
@@ -1271,7 +1280,7 @@ PRINT_CONFIG_CLASS_DEFINE(
|
||||
((ConfigOptionIntsNullable, filament_flush_temp))
|
||||
// BBS
|
||||
((ConfigOptionBool, scan_first_layer))
|
||||
((ConfigOptionBool, enable_power_loss_recovery))
|
||||
((ConfigOptionEnum<PowerLossRecoveryMode>, enable_power_loss_recovery))
|
||||
((ConfigOptionBool, enable_wrapping_detection))
|
||||
((ConfigOptionInt, wrapping_detection_layers))
|
||||
((ConfigOptionPoints, wrapping_exclude_area))
|
||||
|
||||
@@ -1006,6 +1006,7 @@ bool PrintObject::invalidate_state_by_config_options(
|
||||
for (const t_config_option_key &opt_key : opt_keys) {
|
||||
if ( opt_key == "brim_width"
|
||||
|| opt_key == "brim_object_gap"
|
||||
|| opt_key == "brim_use_efc_outline"
|
||||
|| opt_key == "brim_type"
|
||||
|| opt_key == "brim_ears_max_angle"
|
||||
|| opt_key == "brim_ears_detection_length"
|
||||
|
||||
@@ -494,6 +494,8 @@ set(SLIC3R_GUI_SOURCES
|
||||
GUI/Widgets/ErrorMsgStaticText.hpp
|
||||
GUI/Widgets/FanControl.cpp
|
||||
GUI/Widgets/FanControl.hpp
|
||||
GUI/Widgets/HyperLink.cpp
|
||||
GUI/Widgets/HyperLink.hpp
|
||||
GUI/Widgets/ImageSwitchButton.cpp
|
||||
GUI/Widgets/ImageSwitchButton.hpp
|
||||
GUI/Widgets/Label.cpp
|
||||
|
||||
@@ -298,11 +298,7 @@ void AMSMaterialsSetting::create_panel_kn(wxWindow* parent)
|
||||
if (language.find("zh") == 0)
|
||||
region = "zh";
|
||||
wxString link_url = wxString::Format("https://wiki.bambulab.com/%s/software/bambu-studio/calibration_pa", region);
|
||||
m_wiki_ctrl = new wxHyperlinkCtrl(parent, wxID_ANY, "Wiki", link_url);
|
||||
m_wiki_ctrl->SetNormalColour(*wxBLUE);
|
||||
m_wiki_ctrl->SetHoverColour(wxColour(0, 0, 200));
|
||||
m_wiki_ctrl->SetVisitedColour(*wxBLUE);
|
||||
m_wiki_ctrl->SetFont(Label::Head_14);
|
||||
m_wiki_ctrl = new HyperLink(parent, "Wiki Guide", link_url);
|
||||
cali_title_sizer->Add(m_ratio_text, 0, wxALIGN_CENTER_VERTICAL);
|
||||
cali_title_sizer->Add(m_wiki_ctrl, 0, wxALIGN_CENTER_VERTICAL);
|
||||
|
||||
|
||||