Compare commits
60 Commits
v1.6.4-bet
...
v1.6.4-bet
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
43087cc6a6 | ||
|
|
e56863af0d | ||
|
|
f714e72faa | ||
|
|
afe1030b58 | ||
|
|
02405db48e | ||
|
|
6298b1c449 | ||
|
|
fe1d7a0751 | ||
|
|
270fff56f5 | ||
|
|
3be1168d12 | ||
|
|
9f5678c3d1 | ||
|
|
5807135a1f | ||
|
|
8dd9561574 | ||
|
|
b79fc88ade | ||
|
|
61db1ef369 | ||
|
|
a1bc4b3a57 | ||
|
|
99406816cd | ||
|
|
abc0f1c682 | ||
|
|
7e87d9f031 | ||
|
|
905ad5296b | ||
|
|
f1afe93d6f | ||
|
|
84a7f3c084 | ||
|
|
24bf61af73 | ||
|
|
3e393df9df | ||
|
|
333a5067ec | ||
|
|
7b88104870 | ||
|
|
89ec02444a | ||
|
|
bb89336285 | ||
|
|
b396f55ddc | ||
|
|
c1e85db46e | ||
|
|
e02e8c6f15 | ||
|
|
637a171559 | ||
|
|
362ee83ff3 | ||
|
|
37c54aa4f6 | ||
|
|
a4c632026f | ||
|
|
b8d7661ac4 | ||
|
|
36750c74e6 | ||
|
|
f8c9c6bfc4 | ||
|
|
ec7f7bd484 | ||
|
|
f374d34fdc | ||
|
|
77c00a944d | ||
|
|
7f07569304 | ||
|
|
da05ae02da | ||
|
|
9e73dfeb5d | ||
|
|
bcbbbf35db | ||
|
|
7ece35931e | ||
|
|
3acd89e877 | ||
|
|
b8db25ac0e | ||
|
|
dc55845a40 | ||
|
|
6800291468 | ||
|
|
fcc19342c5 | ||
|
|
ff6bf5e5ad | ||
|
|
ba3c1eb23b | ||
|
|
4705867d2a | ||
|
|
0fa666792a | ||
|
|
14f248f8fa | ||
|
|
580424701b | ||
|
|
127ce2b909 | ||
|
|
013a64243f | ||
|
|
ce59235bd7 | ||
|
|
d381a5ed11 |
54
.github/workflows/build_deps.yml
vendored
@@ -7,16 +7,18 @@ on:
|
|||||||
- main
|
- main
|
||||||
paths:
|
paths:
|
||||||
- 'deps/**'
|
- 'deps/**'
|
||||||
|
- .github/workflows/build_deps.yml
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
paths:
|
paths:
|
||||||
- 'deps/**'
|
- 'deps/**'
|
||||||
|
- .github/workflows/build_deps.yml
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build_deps:
|
build_deps:
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: true
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
- os: ubuntu-22.04
|
- os: ubuntu-22.04
|
||||||
@@ -35,6 +37,18 @@ jobs:
|
|||||||
if: matrix.os == 'Windows'
|
if: matrix.os == 'Windows'
|
||||||
uses: ilammy/msvc-dev-cmd@v1
|
uses: ilammy/msvc-dev-cmd@v1
|
||||||
|
|
||||||
|
- name: Get the date on Ubuntu and macOS
|
||||||
|
if: matrix.os != 'windows-2019'
|
||||||
|
id: get-date-unix
|
||||||
|
run: echo "date=$(date +'%Y%m%d')" >> $GITHUB_ENV
|
||||||
|
shell: bash
|
||||||
|
|
||||||
|
- name: Get the date on Windows
|
||||||
|
if: matrix.os == 'windows-2019'
|
||||||
|
id: get-date-windows
|
||||||
|
run: echo "date=$(Get-Date -Format 'yyyyMMdd')" | Out-File -Append -FilePath $env:GITHUB_ENV -Encoding utf8
|
||||||
|
shell: pwsh
|
||||||
|
|
||||||
- name: Build on Windows
|
- name: Build on Windows
|
||||||
if: matrix.os == 'windows-2019'
|
if: matrix.os == 'windows-2019'
|
||||||
working-directory: ${{ github.workspace }}
|
working-directory: ${{ github.workspace }}
|
||||||
@@ -43,6 +57,9 @@ jobs:
|
|||||||
mkdir ${{ github.workspace }}/deps/build
|
mkdir ${{ github.workspace }}/deps/build
|
||||||
mkdir ${{ github.workspace }}/deps/build/OrcaSlicer_dep
|
mkdir ${{ github.workspace }}/deps/build/OrcaSlicer_dep
|
||||||
.\build_release.bat deps
|
.\build_release.bat deps
|
||||||
|
cd ${{ github.workspace }}/deps/build
|
||||||
|
'"C:/Program Files/7-Zip/7z.exe" a OrcaSlicer_dep_win64_${{ env.date }}.zip ${{ github.workspace }}/deps/build/OrcaSlicer_dep'
|
||||||
|
ls
|
||||||
|
|
||||||
- name: Build on Mac x86_64
|
- name: Build on Mac x86_64
|
||||||
if: matrix.os == 'macos-12' && matrix.arch == 'x86_64'
|
if: matrix.os == 'macos-12' && matrix.arch == 'x86_64'
|
||||||
@@ -51,7 +68,7 @@ jobs:
|
|||||||
brew install cmake git gettext
|
brew install cmake git gettext
|
||||||
mkdir -p ${{ github.workspace }}/deps/build_x86_64
|
mkdir -p ${{ github.workspace }}/deps/build_x86_64
|
||||||
mkdir -p ${{ github.workspace }}/deps/build_x86_64/OrcaSlicer_dep_x86_64
|
mkdir -p ${{ github.workspace }}/deps/build_x86_64/OrcaSlicer_dep_x86_64
|
||||||
./build_release_macos.sh -d -a x86_64
|
./build_release_macos.sh -dp -a x86_64
|
||||||
|
|
||||||
- name: Build on Mac arm64
|
- name: Build on Mac arm64
|
||||||
if: matrix.os == 'macos-12' && matrix.arch == 'arm64'
|
if: matrix.os == 'macos-12' && matrix.arch == 'arm64'
|
||||||
@@ -60,7 +77,7 @@ jobs:
|
|||||||
brew install cmake git gettext
|
brew install cmake git gettext
|
||||||
mkdir -p ${{ github.workspace }}/deps/build_arm64
|
mkdir -p ${{ github.workspace }}/deps/build_arm64
|
||||||
mkdir -p ${{ github.workspace }}/deps/build_arm64/OrcaSlicer_dep_arm64
|
mkdir -p ${{ github.workspace }}/deps/build_arm64/OrcaSlicer_dep_arm64
|
||||||
./build_release_macos.sh -d -a arm64
|
./build_release_macos.sh -dp -a arm64
|
||||||
|
|
||||||
- name: Build on Ubuntu
|
- name: Build on Ubuntu
|
||||||
if: matrix.os == 'ubuntu-22.04'
|
if: matrix.os == 'ubuntu-22.04'
|
||||||
@@ -76,4 +93,33 @@ jobs:
|
|||||||
mkdir -p ${{ github.workspace }}/deps/build/destdir
|
mkdir -p ${{ github.workspace }}/deps/build/destdir
|
||||||
sudo ./BuildLinux.sh -ur
|
sudo ./BuildLinux.sh -ur
|
||||||
sudo chown $USER -R ./
|
sudo chown $USER -R ./
|
||||||
./BuildLinux.sh -dr
|
./BuildLinux.sh -dr
|
||||||
|
|
||||||
|
- name: Upload Mac arm64 artifacts
|
||||||
|
if: matrix.os == 'macos-12' && matrix.arch == 'arm64'
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: OrcaSlicer_dep_mac_arm64_${{ env.date }}
|
||||||
|
path: ${{ github.workspace }}/deps/build_arm64/OrcaSlicer_dep*.tar.gz
|
||||||
|
|
||||||
|
- name: Upload Mac x86_64 artifacts
|
||||||
|
if: matrix.os == 'macos-12' && matrix.arch == 'x86_64'
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: OrcaSlicer_dep_mac_x86_64_${{ env.date }}
|
||||||
|
path: ${{ github.workspace }}/deps/build_x86_64/OrcaSlicer_dep*.tar.gz
|
||||||
|
|
||||||
|
- name: Upload Windows artifacts
|
||||||
|
if: matrix.os == 'windows-2019'
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: OrcaSlicer_dep_win64_${{ env.date }}
|
||||||
|
path: ${{ github.workspace }}/deps/build/*.zip
|
||||||
|
|
||||||
|
- name: Upload Ubuntu artifacts
|
||||||
|
if: matrix.os == 'ubuntu-22.04'
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: OrcaSlicer_dep_ubuntu_${{ env.date }}
|
||||||
|
path: ${{ github.workspace }}/deps/build/destdir
|
||||||
|
|
||||||
81
.github/workflows/build_linux.yml
vendored
@@ -1,81 +0,0 @@
|
|||||||
name: Build Linux
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
paths:
|
|
||||||
- 'src/**'
|
|
||||||
- '**/CMakeLists.txt'
|
|
||||||
- 'version.inc'
|
|
||||||
- 'bbl/**'
|
|
||||||
- 'resources/**'
|
|
||||||
|
|
||||||
pull_request:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
paths:
|
|
||||||
- 'src/**'
|
|
||||||
- '**/CMakeLists.txt'
|
|
||||||
- 'version.inc'
|
|
||||||
- 'bbl/**'
|
|
||||||
- 'resources/**'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
appimage-builder:
|
|
||||||
name: Linux AppImage Build
|
|
||||||
|
|
||||||
runs-on: ubuntu-20.04
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- name: Install dependencies
|
|
||||||
run: |
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y autoconf build-essential cmake curl eglexternalplatform-dev \
|
|
||||||
extra-cmake-modules file git libcairo2-dev libcurl4-openssl-dev libdbus-1-dev libglew-dev libglu1-mesa-dev \
|
|
||||||
libglu1-mesa-dev libgstreamer1.0-dev libgstreamerd-3-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-good1.0-dev \
|
|
||||||
libgtk-3-dev libgtk-3-dev libmspack-dev libosmesa6-dev libsecret-1-dev libsoup2.4-dev libssl-dev libudev-dev libwayland-dev \
|
|
||||||
libwebkit2gtk-4.0-dev libxkbcommon-dev locales locales-all m4 pkgconf sudo wayland-protocols wget
|
|
||||||
- name: Install dependencies from BuildLinux.sh
|
|
||||||
shell: bash
|
|
||||||
run: sudo ./BuildLinux.sh -ur
|
|
||||||
- name: Fix permissions
|
|
||||||
shell: bash
|
|
||||||
run: sudo chown $USER -R ./
|
|
||||||
# - name: Build deps
|
|
||||||
# id: cache_deps
|
|
||||||
# uses: actions/cache@v3
|
|
||||||
# env:
|
|
||||||
# cache-name: ${{ runner.os }}-cache-orcaslicer_deps_x64
|
|
||||||
# with:
|
|
||||||
# path: ${{ github.workspace }}/deps/build/destdir
|
|
||||||
# key: build-${{ env.cache-name }}
|
|
||||||
|
|
||||||
# - if: ${{ steps.cache_deps.outputs.cache-hit != 'true' }}
|
|
||||||
# name: Build deps
|
|
||||||
# working-directory: ${{ github.workspace }}
|
|
||||||
# continue-on-error: true
|
|
||||||
# run: ./BuildLinux.sh -dr
|
|
||||||
- name: Download and extract deps
|
|
||||||
working-directory: ${{ github.workspace }}
|
|
||||||
run: |
|
|
||||||
mkdir -p ${{ github.workspace }}/deps/build
|
|
||||||
mkdir -p ${{ github.workspace }}/deps/build/destdir
|
|
||||||
curl -LJO https://github.com/SoftFever/FileSharing/releases/download/2023.08/OrcaSlicer_dep_ubuntu_02-08-2023.tar.gz
|
|
||||||
tar -zxf OrcaSlicer_dep_ubuntu_02-08-2023.tar.gz -C ${{ github.workspace }}/deps/build
|
|
||||||
chown -R $(id -u):$(id -g) ${{ github.workspace }}/deps/build/destdir
|
|
||||||
ls -l ${{ github.workspace }}/deps/build/destdir
|
|
||||||
rm OrcaSlicer_dep_ubuntu_02-08-2023.tar.gz
|
|
||||||
|
|
||||||
|
|
||||||
- name: Build Studio
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
./BuildLinux.sh -isr
|
|
||||||
chmod +x ./build/OrcaSlicer_ubu64.AppImage
|
|
||||||
|
|
||||||
- uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: OrcaSlicer_Linux
|
|
||||||
path: './build/OrcaSlicer_ubu64.AppImage'
|
|
||||||
109
.github/workflows/build_mac_arm64.yml
vendored
@@ -1,109 +0,0 @@
|
|||||||
name: Build Mac AppleSilicon
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
paths:
|
|
||||||
- 'src/**'
|
|
||||||
- '**/CMakeLists.txt'
|
|
||||||
- 'version.inc'
|
|
||||||
- 'bbl/**'
|
|
||||||
- 'resources/**'
|
|
||||||
|
|
||||||
pull_request:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
paths:
|
|
||||||
- 'src/**'
|
|
||||||
- '**/CMakeLists.txt'
|
|
||||||
- 'version.inc'
|
|
||||||
- 'bbl/**'
|
|
||||||
- 'resources/**'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build_osx_arm64:
|
|
||||||
name: Build Mac AppleSilicon
|
|
||||||
runs-on: macos-12
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Install tools
|
|
||||||
run: |
|
|
||||||
brew install cmake git gettext zstd
|
|
||||||
- run: mkdir -p ${{ github.workspace }}/deps/build_arm64
|
|
||||||
- run: mkdir -p ${{ github.workspace }}/deps/build_arm64/OrcaSlicer_dep_arm64
|
|
||||||
|
|
||||||
# - name: build deps
|
|
||||||
# id: cache_deps
|
|
||||||
# uses: actions/cache@v3
|
|
||||||
# env:
|
|
||||||
# cache-name: ${{ runner.os }}-cache-orcaslicer_deps_arm64
|
|
||||||
# with:
|
|
||||||
# path: ${{ github.workspace }}/deps/build/OrcaSlicer_dep
|
|
||||||
# key: build-${{ env.cache-name }}
|
|
||||||
|
|
||||||
# - if: ${{ steps.cache_deps.outputs.cache-hit != 'true' }}
|
|
||||||
# name: build deps
|
|
||||||
# working-directory: ${{ github.workspace }}
|
|
||||||
# continue-on-error: true
|
|
||||||
# run: ./build_release_macos.sh -d -a arm64
|
|
||||||
- name: Download and extract deps
|
|
||||||
working-directory: ${{ github.workspace }}
|
|
||||||
run: |
|
|
||||||
curl -LJO https://github.com/SoftFever/FileSharing/releases/download/2023.08/OrcaSlicer_dep_mac_arm64_02-08-2023.tar.gz
|
|
||||||
tar -zxf OrcaSlicer_dep_mac_arm64_02-08-2023.tar.gz -C ${{ github.workspace }}/deps/build_arm64
|
|
||||||
chown -R $(id -u):$(id -g) ${{ github.workspace }}/deps/build_arm64/OrcaSlicer_dep_arm64
|
|
||||||
ls -l ${{ github.workspace }}/deps/build_arm64/OrcaSlicer_dep_arm64
|
|
||||||
rm OrcaSlicer_dep_mac_arm64_02-08-2023.tar.gz
|
|
||||||
|
|
||||||
|
|
||||||
- name: Build studio
|
|
||||||
working-directory: ${{ github.workspace }}
|
|
||||||
run: |
|
|
||||||
./build_release_macos.sh -s -n -a arm64
|
|
||||||
|
|
||||||
- name: Sign app
|
|
||||||
working-directory: ${{ github.workspace }}
|
|
||||||
if: github.event_name != 'pull_request'
|
|
||||||
env:
|
|
||||||
BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }}
|
|
||||||
P12_PASSWORD: ${{ secrets.P12_PASSWORD }}
|
|
||||||
KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
|
|
||||||
CERTIFICATE_ID: ${{ secrets.MACOS_CERTIFICATE_ID }}
|
|
||||||
run: |
|
|
||||||
CERTIFICATE_PATH=$RUNNER_TEMP/build_certificate.p12
|
|
||||||
KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db
|
|
||||||
echo -n "$BUILD_CERTIFICATE_BASE64" | base64 --decode --output $CERTIFICATE_PATH
|
|
||||||
security create-keychain -p $KEYCHAIN_PASSWORD $KEYCHAIN_PATH
|
|
||||||
security set-keychain-settings -lut 21600 $KEYCHAIN_PATH
|
|
||||||
security unlock-keychain -p $KEYCHAIN_PASSWORD $KEYCHAIN_PATH
|
|
||||||
security import $CERTIFICATE_PATH -P $P12_PASSWORD -A -t cert -f pkcs12 -k $KEYCHAIN_PATH
|
|
||||||
security list-keychain -d user -s $KEYCHAIN_PATH
|
|
||||||
security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k $P12_PASSWORD $KEYCHAIN_PATH
|
|
||||||
codesign --deep --force --verbose --sign "$CERTIFICATE_ID" ${{ github.workspace }}/build_arm64/OrcaSlicer/OrcaSlicer.app
|
|
||||||
|
|
||||||
- name: Pack app
|
|
||||||
working-directory: ${{ github.workspace }}
|
|
||||||
run: |
|
|
||||||
export ver=$(grep '^#define SoftFever_VERSION' ./build_arm64/src/libslic3r/libslic3r_version.h | cut -d ' ' -f3)
|
|
||||||
ver="_V${ver//\"}"
|
|
||||||
cd ${{ github.workspace }}/build_arm64/OrcaSlicer
|
|
||||||
zip -FSrq OrcaSlicer${ver}_Mac_AppleSilicon_signed.zip ./OrcaSlicer.app
|
|
||||||
|
|
||||||
# (wip: staple failed, error 65)
|
|
||||||
# - name: Notarize the app
|
|
||||||
# run: |
|
|
||||||
# cd ${{ github.workspace }}/build_arm64/OrcaSlicer
|
|
||||||
# xcrun notarytool store-credentials "notarytool-profile" --apple-id "${{ secrets.APPLE_DEV_ACCOUNT }}" --team-id "${{ secrets.TEAM_ID }}" --password "${{ secrets.APP_PWD }}"
|
|
||||||
# ditto -c -k --keepParent "OrcaSlicer.app" "OrcaSlicer.zip"
|
|
||||||
# xcrun notarytool submit "OrcaSlicer.zip" --keychain-profile "notarytool-profile" --wait
|
|
||||||
# xcrun stapler staple OrcaSlicer.app
|
|
||||||
# zip -FSrq OrcaSlicer_Mac_notarized.zip OrcaSlicer.app
|
|
||||||
|
|
||||||
- name: Upload artifacts
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: OrcaSlicer_Mac_AppleSilicon
|
|
||||||
path: ${{ github.workspace }}/build_arm64/OrcaSlicer/OrcaSlicer*.zip
|
|
||||||
108
.github/workflows/build_mac_x64.yml
vendored
@@ -1,108 +0,0 @@
|
|||||||
name: Build Mac Intel
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
paths:
|
|
||||||
- 'src/**'
|
|
||||||
- '**/CMakeLists.txt'
|
|
||||||
- 'version.inc'
|
|
||||||
- 'bbl/**'
|
|
||||||
- 'resources/**'
|
|
||||||
|
|
||||||
pull_request:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
paths:
|
|
||||||
- 'src/**'
|
|
||||||
- '**/CMakeLists.txt'
|
|
||||||
- 'version.inc'
|
|
||||||
- 'bbl/**'
|
|
||||||
- 'resources/**'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build_osx_x86_64:
|
|
||||||
name: Build Mac Intel
|
|
||||||
runs-on: macos-12
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Install tools
|
|
||||||
run: |
|
|
||||||
brew install cmake git gettext
|
|
||||||
- run: mkdir -p ${{ github.workspace }}/deps/build_x86_64
|
|
||||||
- run: mkdir -p ${{ github.workspace }}/deps/build_x86_64/OrcaSlicer_dep_x86_64
|
|
||||||
|
|
||||||
# - name: build deps
|
|
||||||
# id: cache_deps
|
|
||||||
# uses: actions/cache@v3
|
|
||||||
# env:
|
|
||||||
# cache-name: ${{ runner.os }}-cache-orcaslicer_deps_x64
|
|
||||||
# with:
|
|
||||||
# path: ${{ github.workspace }}/deps/build/OrcaSlicer_dep
|
|
||||||
# key: build-${{ env.cache-name }}
|
|
||||||
|
|
||||||
# - if: ${{ steps.cache_deps.outputs.cache-hit != 'true' }}
|
|
||||||
# name: build deps
|
|
||||||
# working-directory: ${{ github.workspace }}
|
|
||||||
# continue-on-error: true
|
|
||||||
# run: ./build_release_macos.sh -d -a x86_64
|
|
||||||
|
|
||||||
- name: Download and extract deps
|
|
||||||
working-directory: ${{ github.workspace }}
|
|
||||||
run: |
|
|
||||||
curl -LJO https://github.com/SoftFever/FileSharing/releases/download/2023.08/OrcaSlicer_dep_mac_x86_64_02-08-2023.tar.gz
|
|
||||||
tar -zxf OrcaSlicer_dep_mac_x86_64_02-08-2023.tar.gz -C ${{ github.workspace }}/deps/build_x86_64
|
|
||||||
chown -R $(id -u):$(id -g) ${{ github.workspace }}/deps/build_x86_64/OrcaSlicer_dep_x86_64
|
|
||||||
ls -l ${{ github.workspace }}/deps/build_x86_64/OrcaSlicer_dep_x86_64
|
|
||||||
rm OrcaSlicer_dep_mac_x86_64_02-08-2023.tar.gz
|
|
||||||
|
|
||||||
|
|
||||||
- name: Build studio
|
|
||||||
working-directory: ${{ github.workspace }}
|
|
||||||
run: ./build_release_macos.sh -s -n -a x86_64
|
|
||||||
|
|
||||||
- name: Sign app
|
|
||||||
working-directory: ${{ github.workspace }}
|
|
||||||
env:
|
|
||||||
BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }}
|
|
||||||
P12_PASSWORD: ${{ secrets.P12_PASSWORD }}
|
|
||||||
KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
|
|
||||||
CERTIFICATE_ID: ${{ secrets.MACOS_CERTIFICATE_ID }}
|
|
||||||
if: github.event_name != 'pull_request'
|
|
||||||
run: |
|
|
||||||
CERTIFICATE_PATH=$RUNNER_TEMP/build_certificate.p12
|
|
||||||
KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db
|
|
||||||
echo -n "$BUILD_CERTIFICATE_BASE64" | base64 --decode --output $CERTIFICATE_PATH
|
|
||||||
security create-keychain -p $KEYCHAIN_PASSWORD $KEYCHAIN_PATH
|
|
||||||
security set-keychain-settings -lut 21600 $KEYCHAIN_PATH
|
|
||||||
security unlock-keychain -p $KEYCHAIN_PASSWORD $KEYCHAIN_PATH
|
|
||||||
security import $CERTIFICATE_PATH -P $P12_PASSWORD -A -t cert -f pkcs12 -k $KEYCHAIN_PATH
|
|
||||||
security list-keychain -d user -s $KEYCHAIN_PATH
|
|
||||||
security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k $P12_PASSWORD $KEYCHAIN_PATH
|
|
||||||
codesign --deep --force --verbose --sign "$CERTIFICATE_ID" ${{ github.workspace }}/build_x86_64/OrcaSlicer/OrcaSlicer.app
|
|
||||||
|
|
||||||
- name: pack app
|
|
||||||
working-directory: ${{ github.workspace }}
|
|
||||||
run: |
|
|
||||||
export ver=$(grep '^#define SoftFever_VERSION' ./build_x86_64/src/libslic3r/libslic3r_version.h | cut -d ' ' -f3)
|
|
||||||
ver="_V${ver//\"}"
|
|
||||||
cd ${{ github.workspace }}/build_x86_64/OrcaSlicer
|
|
||||||
zip -FSrq OrcaSlicer${ver}_Mac_Intel_signed.zip OrcaSlicer.app
|
|
||||||
|
|
||||||
# (wip: staple failed, error 65)
|
|
||||||
# - name: Notarize the app
|
|
||||||
# run: |
|
|
||||||
# xcrun notarytool store-credentials "notarytool-profile" --apple-id "${{ secrets.APPLE_DEV_ACCOUNT }}" --team-id "${{ secrets.TEAM_ID }}" --password "${{ secrets.APP_PWD }}"
|
|
||||||
# ditto -c -k --keepParent "OrcaSlicer.app" "OrcaSlicer.zip"
|
|
||||||
# xcrun notarytool submit "OrcaSlicer.zip" --keychain-profile "notarytool-profile" --wait
|
|
||||||
# xcrun stapler staple OrcaSlicer.app
|
|
||||||
# zip -FSrq OrcaSlicer_Mac_notarized.zip OrcaSlicer.app
|
|
||||||
|
|
||||||
- name: Upload artifacts
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: OrcaSlicer_Mac_Intel
|
|
||||||
path: ${{ github.workspace }}/build_x86_64/OrcaSlicer/OrcaSlicer*.zip
|
|
||||||
271
.github/workflows/build_orca.yml
vendored
Normal file
@@ -0,0 +1,271 @@
|
|||||||
|
name: Build OrcaSlicer
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
paths:
|
||||||
|
- 'src/**'
|
||||||
|
- '**/CMakeLists.txt'
|
||||||
|
- 'version.inc'
|
||||||
|
- 'localization/**'
|
||||||
|
- 'resources/**'
|
||||||
|
- ".github/workflows/build_orca.yml"
|
||||||
|
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
paths:
|
||||||
|
- 'src/**'
|
||||||
|
- '**/CMakeLists.txt'
|
||||||
|
- 'version.inc'
|
||||||
|
- 'localization/**'
|
||||||
|
- 'resources/**'
|
||||||
|
- ".github/workflows/build_orca.yml"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build_orca:
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- os: ubuntu-20.04
|
||||||
|
- os: windows-2019
|
||||||
|
- os: macos-12
|
||||||
|
arch: x86_64
|
||||||
|
- os: macos-12
|
||||||
|
arch: arm64
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Get the version and date on Ubuntu and macOS
|
||||||
|
if: matrix.os != 'windows-2019'
|
||||||
|
id: get-version-unix
|
||||||
|
run: |
|
||||||
|
ver=$(grep 'set(SoftFever_VERSION' version.inc | cut -d '"' -f2)
|
||||||
|
echo "ver=$ver" >> $GITHUB_ENV
|
||||||
|
echo "date=$(date +'%Y%m%d')" >> $GITHUB_ENV
|
||||||
|
shell: bash
|
||||||
|
|
||||||
|
- name: Get the version and date on Windows
|
||||||
|
if: matrix.os == 'windows-2019'
|
||||||
|
id: get-version-windows
|
||||||
|
run: |
|
||||||
|
echo "date=$(Get-Date -Format 'yyyyMMdd')" | Out-File -Append -FilePath $env:GITHUB_ENV -Encoding utf8
|
||||||
|
# Extract the version from the file
|
||||||
|
$versionContent = Get-Content version.inc -Raw
|
||||||
|
if ($versionContent -match 'set\(SoftFever_VERSION "(.*?)"\)') {
|
||||||
|
$ver = $matches[1]
|
||||||
|
}
|
||||||
|
echo "ver=$ver" | Out-File -Append -FilePath $env:GITHUB_ENV -Encoding utf8
|
||||||
|
echo "date: ${{ env.date }} version: $ver"
|
||||||
|
shell: pwsh
|
||||||
|
|
||||||
|
# Mac
|
||||||
|
- name: Install tools mac
|
||||||
|
if: matrix.os == 'macos-12'
|
||||||
|
run: |
|
||||||
|
brew install cmake git gettext zstd
|
||||||
|
mkdir -p ${{ github.workspace }}/deps/build_${{matrix.arch}}
|
||||||
|
mkdir -p ${{ github.workspace }}/deps/build_${{matrix.arch}}/OrcaSlicer_dep_${{matrix.arch}}
|
||||||
|
|
||||||
|
# - name: build deps
|
||||||
|
# if: matrix.os == 'macos-12'
|
||||||
|
# id: cache_deps
|
||||||
|
# uses: actions/cache@v3
|
||||||
|
# env:
|
||||||
|
# cache-name: ${{ runner.os }}-cache-orcaslicer_deps_${{matrix.arch}}
|
||||||
|
# with:
|
||||||
|
# path: ${{ github.workspace }}/deps/build/OrcaSlicer_dep
|
||||||
|
# key: build-${{ env.cache-name }}
|
||||||
|
|
||||||
|
# - if: ${{ steps.cache_deps.outputs.cache-hit != 'true' }}
|
||||||
|
# name: build deps
|
||||||
|
# working-directory: ${{ github.workspace }}
|
||||||
|
# continue-on-error: true
|
||||||
|
# run: ./build_release_macos.sh -d -a ${{matrix.arch}}
|
||||||
|
- name: Download and extract deps
|
||||||
|
if: matrix.os == 'macos-12'
|
||||||
|
working-directory: ${{ github.workspace }}
|
||||||
|
run: |
|
||||||
|
curl -LJO https://github.com/SoftFever/FileSharing/releases/download/2023.08.2/OrcaSlicer_dep_mac_${{matrix.arch}}_06-08-2023.tar.gz
|
||||||
|
tar -zxfOrcaSlicer_dep_mac_${{matrix.arch}}_06-08-2023.tar.gz -C ${{ github.workspace }}/deps/build_${{matrix.arch}}
|
||||||
|
chown -R $(id -u):$(id -g) ${{ github.workspace }}/deps/build_${{matrix.arch}}/OrcaSlicer_dep_${{matrix.arch}}
|
||||||
|
ls -l ${{ github.workspace }}/deps/build_${{matrix.arch}}/OrcaSlicer_dep_${{matrix.arch}}
|
||||||
|
rm OrcaSlicer_dep_mac_${{matrix.arch}}_06-08-2023.tar.gz
|
||||||
|
|
||||||
|
|
||||||
|
- name: Build slicer mac
|
||||||
|
if: matrix.os == 'macos-12'
|
||||||
|
working-directory: ${{ github.workspace }}
|
||||||
|
run: |
|
||||||
|
./build_release_macos.sh -s -n -a ${{matrix.arch}}
|
||||||
|
|
||||||
|
- name: Sign app
|
||||||
|
if: matrix.os == 'macos-12'
|
||||||
|
working-directory: ${{ github.workspace }}
|
||||||
|
env:
|
||||||
|
BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }}
|
||||||
|
P12_PASSWORD: ${{ secrets.P12_PASSWORD }}
|
||||||
|
KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
|
||||||
|
CERTIFICATE_ID: ${{ secrets.MACOS_CERTIFICATE_ID }}
|
||||||
|
run: |
|
||||||
|
CERTIFICATE_PATH=$RUNNER_TEMP/build_certificate.p12
|
||||||
|
KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db
|
||||||
|
echo -n "$BUILD_CERTIFICATE_BASE64" | base64 --decode --output $CERTIFICATE_PATH
|
||||||
|
security create-keychain -p $KEYCHAIN_PASSWORD $KEYCHAIN_PATH
|
||||||
|
security set-keychain-settings -lut 21600 $KEYCHAIN_PATH
|
||||||
|
security unlock-keychain -p $KEYCHAIN_PASSWORD $KEYCHAIN_PATH
|
||||||
|
security import $CERTIFICATE_PATH -P $P12_PASSWORD -A -t cert -f pkcs12 -k $KEYCHAIN_PATH
|
||||||
|
security list-keychain -d user -s $KEYCHAIN_PATH
|
||||||
|
security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k $P12_PASSWORD $KEYCHAIN_PATH
|
||||||
|
codesign --deep --force --verbose --options runtime --timestamp --entitlements ${{ github.workspace }}/scripts/disable_validation.entitlements --sign "$CERTIFICATE_ID" ${{ github.workspace }}/build_${{matrix.arch}}/OrcaSlicer/OrcaSlicer.app
|
||||||
|
ln -s /Applications ${{ github.workspace }}/build_${{matrix.arch}}/OrcaSlicer/Applications
|
||||||
|
hdiutil create -volname "OrcaSlicer" -srcfolder ${{ github.workspace }}/build_${{matrix.arch}}/OrcaSlicer -ov -format UDZO OrcaSlicer_Mac_${{matrix.arch}}_V${{ env.ver }}.dmg
|
||||||
|
codesign --deep --force --verbose --options runtime --timestamp --entitlements ${{ github.workspace }}/scripts/disable_validation.entitlements --sign "$CERTIFICATE_ID" OrcaSlicer_Mac_${{matrix.arch}}_V${{ env.ver }}.dmg
|
||||||
|
|
||||||
|
# Thanks to RaySajuuk, it's working now
|
||||||
|
- name: Notarize the app
|
||||||
|
if: matrix.os == 'macos-12'
|
||||||
|
working-directory: ${{ github.workspace }}
|
||||||
|
run: |
|
||||||
|
xcrun notarytool store-credentials "notarytool-profile" --apple-id "${{ secrets.APPLE_DEV_ACCOUNT }}" --team-id "${{ secrets.TEAM_ID }}" --password "${{ secrets.APP_PWD }}"
|
||||||
|
xcrun notarytool submit "OrcaSlicer_Mac_${{matrix.arch}}_V${{ env.ver }}.dmg" --keychain-profile "notarytool-profile" --wait
|
||||||
|
xcrun stapler staple OrcaSlicer_Mac_${{matrix.arch}}_V${{ env.ver }}.dmg
|
||||||
|
|
||||||
|
- name: Upload artifacts mac
|
||||||
|
if: matrix.os == 'macos-12'
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: OrcaSlicer_Mac_${{matrix.arch}}_V${{ env.ver }}
|
||||||
|
path: ${{ github.workspace }}/OrcaSlicer_Mac_${{matrix.arch}}_V${{ env.ver }}.dmg
|
||||||
|
|
||||||
|
# Windows
|
||||||
|
- name: setup MSVC
|
||||||
|
if: matrix.os == 'windows-2019'
|
||||||
|
uses: ilammy/msvc-dev-cmd@v1
|
||||||
|
|
||||||
|
- name: Install perl
|
||||||
|
if: matrix.os == 'windows-2019'
|
||||||
|
run: |
|
||||||
|
choco install strawberryperl
|
||||||
|
|
||||||
|
- name: download deps
|
||||||
|
if: matrix.os == 'windows-2019'
|
||||||
|
shell: powershell
|
||||||
|
run: '(new-object System.Net.WebClient).DownloadFile("https://github.com/SoftFever/FileSharing/releases/download/4/OrcaSlicer_dep_18Jul2023.zip", "$env:temp\OrcaSlicer_dep_18Jul2023.zip")'
|
||||||
|
|
||||||
|
- name: maker dir
|
||||||
|
if: matrix.os == 'windows-2019'
|
||||||
|
working-directory: ${{ github.workspace }}
|
||||||
|
run: |
|
||||||
|
mkdir ${{ github.workspace }}/deps/build
|
||||||
|
mkdir ${{ github.workspace }}/deps/build/OrcaSlicer_dep
|
||||||
|
|
||||||
|
- name: extract deps
|
||||||
|
if: matrix.os == 'windows-2019'
|
||||||
|
working-directory: ${{ github.workspace }}/deps/build
|
||||||
|
shell: cmd
|
||||||
|
run: '"C:/Program Files/7-Zip/7z.exe" x %temp%\OrcaSlicer_dep_18Jul2023.zip'
|
||||||
|
|
||||||
|
# - name: build deps
|
||||||
|
# if: matrix.os == 'windows-2019'
|
||||||
|
# id: cache_deps
|
||||||
|
# uses: actions/cache@v3
|
||||||
|
# env:
|
||||||
|
# cache-name: ${{ runner.os }}-cache-orcaslicer_deps
|
||||||
|
# with:
|
||||||
|
# path: ${{ github.workspace }}/deps/build/OrcaSlicer_dep
|
||||||
|
# key: ${{ runner.os }}-build-${{ env.cache-name }}
|
||||||
|
|
||||||
|
# - if: ${{ steps.cache_deps.outputs.cache-hit != 'true' }}
|
||||||
|
# name: build deps
|
||||||
|
# working-directory: ${{ github.workspace }}
|
||||||
|
# continue-on-error: true
|
||||||
|
# run: .\build_release.bat deps
|
||||||
|
|
||||||
|
# - run: Get-ChildItem ${{ github.workspace }}/deps/build/ -Exclude OrcaSlicer_dep | Remove-Item -Recurse -Force
|
||||||
|
|
||||||
|
- name: Build slicer Win
|
||||||
|
if: matrix.os == 'windows-2019'
|
||||||
|
working-directory: ${{ github.workspace }}
|
||||||
|
run: .\build_release.bat slicer
|
||||||
|
|
||||||
|
# - name: pack app
|
||||||
|
# if: matrix.os == 'windows-2019'
|
||||||
|
# working-directory: ${{ github.workspace }}/build
|
||||||
|
# shell: cmd
|
||||||
|
# run: '"C:/Program Files/7-Zip/7z.exe" a -tzip OrcaSlicer_dev_build.zip ${{ github.workspace }}/build/OrcaSlicer'
|
||||||
|
|
||||||
|
- name: Upload artifacts Win
|
||||||
|
if: matrix.os == 'windows-2019'
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: OrcaSlicer_Windows_V${{ env.ver }}
|
||||||
|
path: ${{ github.workspace }}/build/OrcaSlicer
|
||||||
|
|
||||||
|
# Ubuntu
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
if: matrix.os == 'ubuntu-20.04'
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y autoconf build-essential cmake curl eglexternalplatform-dev \
|
||||||
|
extra-cmake-modules file git libcairo2-dev libcurl4-openssl-dev libdbus-1-dev libglew-dev libglu1-mesa-dev \
|
||||||
|
libglu1-mesa-dev libgstreamer1.0-dev libgstreamerd-3-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-good1.0-dev \
|
||||||
|
libgtk-3-dev libgtk-3-dev libmspack-dev libosmesa6-dev libsecret-1-dev libsoup2.4-dev libssl-dev libudev-dev libwayland-dev \
|
||||||
|
libwebkit2gtk-4.0-dev libxkbcommon-dev locales locales-all m4 pkgconf sudo wayland-protocols wget
|
||||||
|
|
||||||
|
- name: Install dependencies from BuildLinux.sh
|
||||||
|
if: matrix.os == 'ubuntu-20.04'
|
||||||
|
shell: bash
|
||||||
|
run: sudo ./BuildLinux.sh -ur
|
||||||
|
|
||||||
|
- name: Fix permissions
|
||||||
|
if: matrix.os == 'ubuntu-20.04'
|
||||||
|
shell: bash
|
||||||
|
run: sudo chown $USER -R ./
|
||||||
|
# - name: Build deps
|
||||||
|
# if: matrix.os == 'ubuntu-20.04'
|
||||||
|
# id: cache_deps
|
||||||
|
# uses: actions/cache@v3
|
||||||
|
# env:
|
||||||
|
# cache-name: ${{ runner.os }}-cache-orcaslicer_deps_x64
|
||||||
|
# with:
|
||||||
|
# path: ${{ github.workspace }}/deps/build/destdir
|
||||||
|
# key: build-${{ env.cache-name }}
|
||||||
|
|
||||||
|
# - if: ${{ steps.cache_deps.outputs.cache-hit != 'true' }}
|
||||||
|
# name: Build deps
|
||||||
|
# working-directory: ${{ github.workspace }}
|
||||||
|
# continue-on-error: true
|
||||||
|
# run: ./BuildLinux.sh -dr
|
||||||
|
- name: Download and extract deps
|
||||||
|
if: matrix.os == 'ubuntu-20.04'
|
||||||
|
working-directory: ${{ github.workspace }}
|
||||||
|
run: |
|
||||||
|
mkdir -p ${{ github.workspace }}/deps/build
|
||||||
|
mkdir -p ${{ github.workspace }}/deps/build/destdir
|
||||||
|
curl -LJO https://github.com/SoftFever/FileSharing/releases/download/2023.08/OrcaSlicer_dep_ubuntu_02-08-2023.tar.gz
|
||||||
|
tar -zxf OrcaSlicer_dep_ubuntu_02-08-2023.tar.gz -C ${{ github.workspace }}/deps/build
|
||||||
|
chown -R $(id -u):$(id -g) ${{ github.workspace }}/deps/build/destdir
|
||||||
|
ls -l ${{ github.workspace }}/deps/build/destdir
|
||||||
|
rm OrcaSlicer_dep_ubuntu_02-08-2023.tar.gz
|
||||||
|
|
||||||
|
|
||||||
|
- name: Build slicer
|
||||||
|
if: matrix.os == 'ubuntu-20.04'
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
./BuildLinux.sh -isr
|
||||||
|
chmod +x ./build/OrcaSlicer_ubu64.AppImage
|
||||||
|
|
||||||
|
- name: Upload artifacts Ubuntu
|
||||||
|
if: matrix.os == 'ubuntu-20.04'
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: OrcaSlicer_Linux_V${{ env.ver }}
|
||||||
|
path: './build/OrcaSlicer_ubu64.AppImage'
|
||||||
79
.github/workflows/build_win.yml
vendored
@@ -1,79 +0,0 @@
|
|||||||
name: Build Win64
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
paths:
|
|
||||||
- 'src/**'
|
|
||||||
- '**/CMakeLists.txt'
|
|
||||||
- 'version.inc'
|
|
||||||
- 'bbl/**'
|
|
||||||
- 'resources/**'
|
|
||||||
- '.github/workflows/build_win.yml'
|
|
||||||
|
|
||||||
pull_request:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
paths:
|
|
||||||
- 'src/**'
|
|
||||||
- '**/CMakeLists.txt'
|
|
||||||
- 'version.inc'
|
|
||||||
- 'bbl/**'
|
|
||||||
- 'resources/**'
|
|
||||||
- '.github/workflows/build_win.yml'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build_win64:
|
|
||||||
name: Build Win64
|
|
||||||
runs-on: windows-2019
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- uses: ilammy/msvc-dev-cmd@v1
|
|
||||||
- name: Install perl
|
|
||||||
run: |
|
|
||||||
choco install strawberryperl
|
|
||||||
- run: mkdir ${{ github.workspace }}/deps/build
|
|
||||||
- run: mkdir ${{ github.workspace }}/deps/build/OrcaSlicer_dep
|
|
||||||
- name: download deps
|
|
||||||
shell: powershell
|
|
||||||
run: '(new-object System.Net.WebClient).DownloadFile("https://github.com/SoftFever/FileSharing/releases/download/4/OrcaSlicer_dep_18Jul2023.zip", "$env:temp\OrcaSlicer_dep_18Jul2023.zip")'
|
|
||||||
- name: extract deps
|
|
||||||
working-directory: ${{ github.workspace }}/deps/build
|
|
||||||
shell: cmd
|
|
||||||
run: '"C:/Program Files/7-Zip/7z.exe" x %temp%\OrcaSlicer_dep_18Jul2023.zip'
|
|
||||||
|
|
||||||
- run: dir "${{ github.workspace }}\deps\build\OrcaSlicer_dep"
|
|
||||||
|
|
||||||
# - name: build deps
|
|
||||||
# id: cache_deps
|
|
||||||
# uses: actions/cache@v3
|
|
||||||
# env:
|
|
||||||
# cache-name: ${{ runner.os }}-cache-orcaslicer_deps
|
|
||||||
# with:
|
|
||||||
# path: ${{ github.workspace }}/deps/build/OrcaSlicer_dep
|
|
||||||
# key: ${{ runner.os }}-build-${{ env.cache-name }}
|
|
||||||
|
|
||||||
# - if: ${{ steps.cache_deps.outputs.cache-hit != 'true' }}
|
|
||||||
# name: build deps
|
|
||||||
# working-directory: ${{ github.workspace }}
|
|
||||||
# continue-on-error: true
|
|
||||||
# run: .\build_release.bat deps
|
|
||||||
|
|
||||||
# - run: Get-ChildItem ${{ github.workspace }}/deps/build/ -Exclude OrcaSlicer_dep | Remove-Item -Recurse -Force
|
|
||||||
|
|
||||||
- name: Build studio
|
|
||||||
working-directory: ${{ github.workspace }}
|
|
||||||
run: .\build_release.bat studio
|
|
||||||
|
|
||||||
# - name: pack app
|
|
||||||
# working-directory: ${{ github.workspace }}/build
|
|
||||||
# shell: cmd
|
|
||||||
# run: '"C:/Program Files/7-Zip/7z.exe" a -tzip OrcaSlicer_dev_build.zip ${{ github.workspace }}/build/OrcaSlicer'
|
|
||||||
|
|
||||||
- name: Upload artifacts
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: OrcaSlicer_Win64_nightly
|
|
||||||
path: ${{ github.workspace }}/build/OrcaSlicer
|
|
||||||
2
.gitignore
vendored
@@ -25,6 +25,4 @@ build_*/
|
|||||||
SVG
|
SVG
|
||||||
src/OrcaSlicer-doc/
|
src/OrcaSlicer-doc/
|
||||||
.idea/
|
.idea/
|
||||||
bbl/i18n/es/OrcaSlicer_es.mo
|
|
||||||
bbl/i18n/es/OrcaSlicer.mo
|
|
||||||
/.cache/
|
/.cache/
|
||||||
@@ -1,103 +0,0 @@
|
|||||||
{
|
|
||||||
"build_systems":
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"name": "List",
|
|
||||||
//"file_regex": " at ([^-\\s]*) line ([0-9]*)",
|
|
||||||
// "file_regex": " at (D\\:\\/src\\/Slic3r\\/.*?) line ([0-9]*)",
|
|
||||||
"shell_cmd": "ls -l"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Run",
|
|
||||||
"working_dir": "$project_path",
|
|
||||||
"file_regex": " at (.*?) line ([0-9]*)",
|
|
||||||
// "shell_cmd": "chdir & perl slic3r.pl --DataDir \"C:\\Users\\Public\\Documents\\Prusa3D\\Slic3r settings MK2\" --gui \"..\\Slic3r-tests\\gap fill torture 20 -rt.stl\""
|
|
||||||
"shell_cmd": "chdir & perl slic3r.pl"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "full",
|
|
||||||
"file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
|
|
||||||
"shell_cmd": "chdir & perl Build.pl"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "xs",
|
|
||||||
"working_dir": "$project_path/build",
|
|
||||||
// for Visual Studio:
|
|
||||||
"file_regex": "^(..[^:]*)\\(([0-9]+)\\)(.*)$",
|
|
||||||
// For GCC:
|
|
||||||
// "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
|
|
||||||
"shell_cmd": "chdir & ninja -j 6 -v",
|
|
||||||
"env": {
|
|
||||||
// "PATH": "C:\\Program Files (x86)\\MSBuild\\12.0\\bin\\amd64;C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\VC\\BIN\\amd64;C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\Common7\\IDE;C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\Common7\\Tools;%PATH%;c:\\wperl64d\\site\\bin;c:\\wperl64d\\bin",
|
|
||||||
// "PERL_CPANM_HOME": "c:\\wperl64d\\cpanm",
|
|
||||||
// "WXDIR": "D:\\src-perl\\wxWidgets-3.0.3-beta1",
|
|
||||||
// "BOOST_DIR": "D:\\src-perl\\boost_1_61_0",
|
|
||||||
// "BOOST_INCLUDEDIR": "D:\\src-perl\\boost_1_61_0",
|
|
||||||
// "BOOST_LIBRARYDIR": "D:\\src-perl\\boost_1_61_0\\stage\\x64\\lib",
|
|
||||||
// "SLIC3R_STATIC": "1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "xs & run",
|
|
||||||
"working_dir": "$project_path/build",
|
|
||||||
"file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
|
|
||||||
"shell_cmd": "chdir & ninja -j 6 & cd .. & perl slic3r.pl --gui \"..\\Slic3r-tests\\star3-big2.stl\""
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Slic3r - clean",
|
|
||||||
"working_dir": "$project_path/build",
|
|
||||||
"file_regex": "^(..[^:]*)(?::|\\()([0-9]+)(?::|\\))(?:([0-9]+):)?\\s*(.*)",
|
|
||||||
"shell_cmd": ["chdir & ninja clean"]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "run tests",
|
|
||||||
"working_dir": "$project_path/build",
|
|
||||||
// for Visual Studio:
|
|
||||||
"file_regex": "^(..[^:]*)\\(([0-9]+)\\)(.*)$",
|
|
||||||
"shell_cmd": "chdir & ctest --verbose"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Clean & Configure",
|
|
||||||
"working_dir": "$project_path",
|
|
||||||
// for Visual Studio:
|
|
||||||
"file_regex": "^(..[^:]*)(?::|\\()([0-9]+)(?::|\\))(?:([0-9]+):)?\\s*(.*)",
|
|
||||||
"shell_cmd": "chdir & rmdir /S /Q build & mkdir build & cd build & cmake -G Ninja .. -DCMAKE_COLOR_MAKEFILE=OFF -DCMAKE_RULE_PROGRESS=OFF -DCMAKE_RULE_MESSAGES=OFF -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Configure",
|
|
||||||
"working_dir": "$project_path/build",
|
|
||||||
// for Visual Studio:
|
|
||||||
"file_regex": "^(..[^:]*)(?::|\\()([0-9]+)(?::|\\))(?:([0-9]+):)?\\s*(.*)",
|
|
||||||
"shell_cmd": "cmake -G Ninja .. -DCMAKE_COLOR_MAKEFILE=OFF -DCMAKE_RULE_PROGRESS=OFF -DCMAKE_RULE_MESSAGES=OFF -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"folders":
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"path": ".",
|
|
||||||
// "folder_exclude_patterns": [".svn", "._d", ".metadata", ".settings"],
|
|
||||||
"file_exclude_patterns": ["XS.c", "*.pch", "*.ilk", "*.js" ]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
|
|
||||||
"settings":
|
|
||||||
{
|
|
||||||
"sublimegdb_workingdir": "${folder:${project_path:run}}",
|
|
||||||
// NOTE: You MUST provide --interpreter=mi for the plugin to work
|
|
||||||
// "sublimegdb_commandline": "D:\\Qt\\Tools\\mingw492_32\\bin\\gdb.exe --interpreter=mi -ex 'target localhost:2345'",
|
|
||||||
// "sublimegdb_commandline": "D:\\Qt\\Tools\\mingw492_32\\bin\\gdb.exe --interpreter=mi perl --args perl slic3r.pl",
|
|
||||||
// "sublimegdb_commandline": "D:\\Qt\\Tools\\mingw492_32\\bin\\gdb.exe --interpreter=mi perl --args slic3r.pl ",
|
|
||||||
// "sublimegdb_commandline": "D:\\Qt\\Tools\\mingw492_32\\bin\\gdb.exe --interpreter=mi -e C:\\Strawberry\\perl\\bin\\perl.exe -s C:\\Strawberry\\perl\\site\\lib\\auto\\Slic3r\\XS\\XS.xs.dll --args perl slic3r.pl -j 1 --gui D:\\src\\Slic3r-tests\\star3-big.stl",
|
|
||||||
"sublimegdb_commandline": "D:\\Qt\\Tools\\mingw492_32\\bin\\gdb.exe --interpreter=mi perl.exe --args perl slic3r.pl -j 1 --gui", // D:\\src\\Slic3r-tests\\star3-big.stl",
|
|
||||||
// "sublimegdb_commandline": "D:\\Qt\\Tools\\mingw492_32\\bin\\gdb.exe --interpreter=mi -x slic3r.gdb",
|
|
||||||
// "arguments": "slic3r -j 1 --gui ../Slic3r-tests/star3-big.stl",
|
|
||||||
// "arguments": "../slic3r.pl -j 1 --gui",
|
|
||||||
// "sublimegdb_exec_cmd": "-exec-continue",
|
|
||||||
|
|
||||||
// Add "pending breakpoints" for symbols that are dynamically loaded from
|
|
||||||
// external shared libraries
|
|
||||||
"debug_ext" : true,
|
|
||||||
"run_after_init": false,
|
|
||||||
"close_views": false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -40,7 +40,7 @@ while getopts ":dsiuhgbr" opt; do
|
|||||||
BUILD_DEPS="1"
|
BUILD_DEPS="1"
|
||||||
;;
|
;;
|
||||||
s )
|
s )
|
||||||
BUILD_BAMBU_STUDIO="1"
|
BUILD_ORCA="1"
|
||||||
;;
|
;;
|
||||||
b )
|
b )
|
||||||
BUILD_DEBUG="1"
|
BUILD_DEBUG="1"
|
||||||
@@ -87,7 +87,7 @@ then
|
|||||||
mkdir build
|
mkdir build
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Addtional Dev packages for BambuStudio
|
# Addtional Dev packages for OrcaSlicer
|
||||||
export REQUIRED_DEV_PACKAGES="libmspack-dev libgstreamerd-3-dev libsecret-1-dev libwebkit2gtk-4.0-dev libosmesa6-dev libssl-dev libcurl4-openssl-dev eglexternalplatform-dev libudev-dev libdbus-1-dev extra-cmake-modules"
|
export REQUIRED_DEV_PACKAGES="libmspack-dev libgstreamerd-3-dev libsecret-1-dev libwebkit2gtk-4.0-dev libosmesa6-dev libssl-dev libcurl4-openssl-dev eglexternalplatform-dev libudev-dev libdbus-1-dev extra-cmake-modules"
|
||||||
# libwebkit2gtk-4.1-dev ??
|
# libwebkit2gtk-4.1-dev ??
|
||||||
export DEV_PACKAGES_COUNT=$(echo ${REQUIRED_DEV_PACKAGES} | wc -w)
|
export DEV_PACKAGES_COUNT=$(echo ${REQUIRED_DEV_PACKAGES} | wc -w)
|
||||||
@@ -212,7 +212,7 @@ then
|
|||||||
echo "done"
|
echo "done"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ -n "$BUILD_BAMBU_STUDIO" ]]
|
if [[ -n "$BUILD_ORCA" ]]
|
||||||
then
|
then
|
||||||
echo "[7/9] Configuring Slic3r..."
|
echo "[7/9] Configuring Slic3r..."
|
||||||
BUILD_ARGS=""
|
BUILD_ARGS=""
|
||||||
|
|||||||
@@ -510,7 +510,7 @@ endif ()
|
|||||||
|
|
||||||
# l10n
|
# l10n
|
||||||
set(L10N_DIR "${SLIC3R_RESOURCES_DIR}/i18n")
|
set(L10N_DIR "${SLIC3R_RESOURCES_DIR}/i18n")
|
||||||
set(BBL_L18N_DIR "${CMAKE_CURRENT_SOURCE_DIR}/bbl/i18n")
|
set(BBL_L18N_DIR "${CMAKE_CURRENT_SOURCE_DIR}/localization/i18n")
|
||||||
add_custom_target(gettext_make_pot
|
add_custom_target(gettext_make_pot
|
||||||
COMMAND xgettext --keyword=L --keyword=_L --keyword=_u8L --keyword=L_CONTEXT:1,2c --keyword=_L_PLURAL:1,2 --add-comments=TRN --from-code=UTF-8 --no-location --debug --boost
|
COMMAND xgettext --keyword=L --keyword=_L --keyword=_u8L --keyword=L_CONTEXT:1,2c --keyword=_L_PLURAL:1,2 --add-comments=TRN --from-code=UTF-8 --no-location --debug --boost
|
||||||
-f "${BBL_L18N_DIR}/list.txt"
|
-f "${BBL_L18N_DIR}/list.txt"
|
||||||
@@ -708,8 +708,8 @@ elseif (SLIC3R_FHS)
|
|||||||
)
|
)
|
||||||
install(FILES src/platform/unix/OrcaSlicer.desktop DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/applications)
|
install(FILES src/platform/unix/OrcaSlicer.desktop DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/applications)
|
||||||
foreach(SIZE 32 128 192)
|
foreach(SIZE 32 128 192)
|
||||||
install(FILES ${SLIC3R_RESOURCES_DIR}/images/BambuStudio_${SIZE}px.png
|
install(FILES ${SLIC3R_RESOURCES_DIR}/images/OrcaSlicer_${SIZE}px.png
|
||||||
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/${SIZE}x${SIZE}/apps RENAME BambuStudio.png
|
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/${SIZE}x${SIZE}/apps RENAME OrcaSlicer.png
|
||||||
)
|
)
|
||||||
endforeach()
|
endforeach()
|
||||||
elseif (CMAKE_MACOSX_BUNDLE)
|
elseif (CMAKE_MACOSX_BUNDLE)
|
||||||
|
|||||||
@@ -1,71 +0,0 @@
|
|||||||
# Build Bambu Slicer in a container
|
|
||||||
#
|
|
||||||
# Build an AppImage using rootless Podman (refer to https://github.com/containers/podman/blob/main/docs/tutorials/rootless_tutorial.md):
|
|
||||||
# rm -rf build; podman build . -t orca-slicer-builder && podman run --rm localhost/orca-slicer-builder /bin/bash -c 'tar -c $(find build | grep ubu64.AppImage | head -1)' | tar -xv
|
|
||||||
#
|
|
||||||
# Troubleshooting the build container:
|
|
||||||
# podman run -it --name orca-slicer-builder localhost/orca-slicer-builder /bin/bash
|
|
||||||
#
|
|
||||||
# Debugging the resulting AppImage:
|
|
||||||
# 1) Install `gdb`
|
|
||||||
# 2) In a terminal in the same directory as the AppImage, start it with following:
|
|
||||||
# echo -e "run\nbt\nquit" | gdb ./BambuStudio_ubu64.AppImage
|
|
||||||
# 3) Find related issue using backtrace output for clues and add backtrace to it on github
|
|
||||||
#
|
|
||||||
# Docker alternative AppImage build syntax (use this if you can't install podman):
|
|
||||||
# rm -rf build; docker build . --file Containerfile -t orca-slicer-builder; docker run --rm orca-slicer-builder /bin/bash -c 'tar -c $(find build | grep ubu64.AppImage | head -1)' | tar -xv
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# TODO: bind mount OrcaSlicer to inside the container instead of COPY to enable faster rebuilds during dev work.
|
|
||||||
|
|
||||||
FROM docker.io/ubuntu:20.04
|
|
||||||
LABEL maintainer "DeftDawg <DeftDawg@gmail.com>"
|
|
||||||
|
|
||||||
# Disable interactive package configuration
|
|
||||||
RUN apt-get update && \
|
|
||||||
echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections
|
|
||||||
|
|
||||||
# Add a deb-src
|
|
||||||
RUN echo deb-src http://archive.ubuntu.com/ubuntu \
|
|
||||||
$(cat /etc/*release | grep VERSION_CODENAME | cut -d= -f2) main universe>> /etc/apt/sources.list
|
|
||||||
|
|
||||||
RUN apt-get update && apt-get install -y \
|
|
||||||
git \
|
|
||||||
build-essential \
|
|
||||||
autoconf pkgconf m4 \
|
|
||||||
cmake extra-cmake-modules \
|
|
||||||
libglu1-mesa-dev libglu1-mesa-dev \
|
|
||||||
libwayland-dev libxkbcommon-dev wayland-protocols \
|
|
||||||
eglexternalplatform-dev libglew-dev \
|
|
||||||
libgtk-3-dev \
|
|
||||||
libdbus-1-dev \
|
|
||||||
libcairo2-dev \
|
|
||||||
libgtk-3-dev libwebkit2gtk-4.0-dev \
|
|
||||||
libsoup2.4-dev \
|
|
||||||
libgstreamer1.0-dev libgstreamer-plugins-good1.0-dev libgstreamer-plugins-base1.0-dev libgstreamerd-3-dev \
|
|
||||||
libmspack-dev \
|
|
||||||
libosmesa6-dev \
|
|
||||||
libssl-dev libcurl4-openssl-dev libsecret-1-dev \
|
|
||||||
libudev-dev \
|
|
||||||
curl \
|
|
||||||
wget \
|
|
||||||
file \
|
|
||||||
sudo
|
|
||||||
|
|
||||||
COPY ./ OrcaSlicer
|
|
||||||
|
|
||||||
WORKDIR OrcaSlicer
|
|
||||||
|
|
||||||
# These can run together, but we run them seperate for podman caching
|
|
||||||
# Update System dependencies
|
|
||||||
RUN ./BuildLinux.sh -u
|
|
||||||
|
|
||||||
# Build dependencies in ./deps
|
|
||||||
RUN ./BuildLinux.sh -d
|
|
||||||
|
|
||||||
# Build slic3r
|
|
||||||
RUN ./BuildLinux.sh -s
|
|
||||||
|
|
||||||
# Build AppImage
|
|
||||||
ENV container podman
|
|
||||||
RUN ./BuildLinux.sh -i
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
PROJECT_ROOT=$(cd -P -- "$(dirname -- "$0")" && printf '%s\n' "$(pwd -P)")
|
|
||||||
|
|
||||||
set -x
|
|
||||||
|
|
||||||
# Wishlist hint: For developers, creating a Docker Compose
|
|
||||||
# setup with persistent volumes for the build & deps directories
|
|
||||||
# would speed up recompile times significantly. For end users,
|
|
||||||
# the simplicity of a single Docker image and a one-time compilation
|
|
||||||
# seems better.
|
|
||||||
docker build -t bambustudio \
|
|
||||||
--build-arg USER=$USER \
|
|
||||||
--build-arg UID=$(id -u) \
|
|
||||||
--build-arg GID=$(id -g) \
|
|
||||||
$PROJECT_ROOT
|
|
||||||
25
DockerRun.sh
@@ -1,25 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
set -x
|
|
||||||
# Just in case, here's some other things that might help:
|
|
||||||
# Force the container's hostname to be the same as your workstation
|
|
||||||
# -h $HOSTNAME \
|
|
||||||
# If there's problems with the X display, try this
|
|
||||||
# -v /tmp/.X11-unix:/tmp/.X11-unix \
|
|
||||||
docker run \
|
|
||||||
`# Use the hosts networking. Printer wifi and also dbus communication` \
|
|
||||||
--net=host \
|
|
||||||
`# Some X installs will not have permissions to talk to sockets for shared memory` \
|
|
||||||
--ipc host \
|
|
||||||
`# Run as your workstations username to keep permissions the same` \
|
|
||||||
-u $USER \
|
|
||||||
`# Bind mount your home directory into the container for loading/saving files` \
|
|
||||||
-v $HOME:/home/$USER \
|
|
||||||
`# Pass the X display number to the container` \
|
|
||||||
-e DISPLAY=$DISPLAY \
|
|
||||||
`# It seems that libGL and dbus things need privileged mode` \
|
|
||||||
--privileged=true \
|
|
||||||
`# Attach tty for running bambu with command line things` \
|
|
||||||
-ti \
|
|
||||||
`# Pass all parameters from this script to the bambu ENTRYPOINT binary` \
|
|
||||||
bambustudio $*
|
|
||||||
|
|
||||||
94
Dockerfile
@@ -1,94 +0,0 @@
|
|||||||
FROM docker.io/ubuntu:20.04
|
|
||||||
LABEL maintainer "DeftDawg <DeftDawg@gmail.com>"
|
|
||||||
|
|
||||||
# Disable interactive package configuration
|
|
||||||
RUN apt-get update && \
|
|
||||||
echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections
|
|
||||||
|
|
||||||
# Add a deb-src
|
|
||||||
RUN echo deb-src http://archive.ubuntu.com/ubuntu \
|
|
||||||
$(cat /etc/*release | grep VERSION_CODENAME | cut -d= -f2) main universe>> /etc/apt/sources.list
|
|
||||||
|
|
||||||
RUN apt-get update && apt-get install -y \
|
|
||||||
autoconf \
|
|
||||||
build-essential \
|
|
||||||
cmake \
|
|
||||||
curl \
|
|
||||||
eglexternalplatform-dev \
|
|
||||||
extra-cmake-modules \
|
|
||||||
file \
|
|
||||||
git \
|
|
||||||
gstreamer1.0-plugins-bad \
|
|
||||||
gstreamer1.0-libav \
|
|
||||||
libcairo2-dev \
|
|
||||||
libcurl4-openssl-dev \
|
|
||||||
libdbus-1-dev \
|
|
||||||
libglew-dev \
|
|
||||||
libglu1-mesa-dev \
|
|
||||||
libglu1-mesa-dev \
|
|
||||||
libgstreamer1.0-dev \
|
|
||||||
libgstreamerd-3-dev \
|
|
||||||
libgstreamer-plugins-base1.0-dev \
|
|
||||||
libgstreamer-plugins-good1.0-dev \
|
|
||||||
libgtk-3-dev \
|
|
||||||
libgtk-3-dev \
|
|
||||||
libmspack-dev \
|
|
||||||
libosmesa6-dev \
|
|
||||||
libsecret-1-dev \
|
|
||||||
libsoup2.4-dev \
|
|
||||||
libssl-dev \
|
|
||||||
libudev-dev \
|
|
||||||
libwayland-dev \
|
|
||||||
libwebkit2gtk-4.0-dev \
|
|
||||||
libxkbcommon-dev \
|
|
||||||
locales \
|
|
||||||
locales-all \
|
|
||||||
m4 \
|
|
||||||
pkgconf \
|
|
||||||
sudo \
|
|
||||||
wayland-protocols \
|
|
||||||
wget
|
|
||||||
|
|
||||||
# Change your locale here if you want. See the output
|
|
||||||
# of `locale -a` to pick the correct string formatting.
|
|
||||||
ENV LC_ALL=en_US.utf8
|
|
||||||
RUN locale-gen $LC_ALL
|
|
||||||
|
|
||||||
# Set this so that Orca Slicer doesn't complain about
|
|
||||||
# the CA cert path on every startup
|
|
||||||
ENV SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt
|
|
||||||
|
|
||||||
COPY ./ BambuStudio
|
|
||||||
|
|
||||||
WORKDIR BambuStudio
|
|
||||||
|
|
||||||
# These can run together, but we run them seperate for podman caching
|
|
||||||
# Update System dependencies
|
|
||||||
RUN ./BuildLinux.sh -u
|
|
||||||
|
|
||||||
# Build dependencies in ./deps
|
|
||||||
RUN ./BuildLinux.sh -d
|
|
||||||
|
|
||||||
# Build slic3r
|
|
||||||
RUN ./BuildLinux.sh -s
|
|
||||||
|
|
||||||
# Build AppImage
|
|
||||||
ENV container podman
|
|
||||||
RUN ./BuildLinux.sh -i
|
|
||||||
|
|
||||||
# It's easier to run Orca Slicer as the same username,
|
|
||||||
# UID and GID as your workstation. Since we bind mount
|
|
||||||
# your home directory into the container, it's handy
|
|
||||||
# to keep permissions the same. Just in case, defaults
|
|
||||||
# are root.
|
|
||||||
SHELL ["/bin/bash", "-l", "-c"]
|
|
||||||
ARG USER=root
|
|
||||||
ARG UID=0
|
|
||||||
ARG GID=0
|
|
||||||
RUN [[ "$UID" != "0" ]] \
|
|
||||||
&& groupadd -g $GID $USER \
|
|
||||||
&& useradd -u $UID -g $GID $USER
|
|
||||||
|
|
||||||
# Using an entrypoint instead of CMD because the binary
|
|
||||||
# accepts several command line arguments.
|
|
||||||
ENTRYPOINT ["/BambuStudio/build/package/bin/orca-slicer"]
|
|
||||||
21
README.md
@@ -4,14 +4,10 @@
|
|||||||
[](https://github.com/SoftFever/OrcaSlicer/actions/workflows/build_mac_x64.yml)
|
[](https://github.com/SoftFever/OrcaSlicer/actions/workflows/build_mac_x64.yml)
|
||||||
[](https://github.com/SoftFever/OrcaSlicer/actions/workflows/build_linux.yml)
|
[](https://github.com/SoftFever/OrcaSlicer/actions/workflows/build_linux.yml)
|
||||||
|
|
||||||
# Orca Slicer
|
# Orca Slicer
|
||||||
Orca Slicer is a fork of Bambu Studio. It was previously known as BambuStudio-SoftFever.
|
Orca Slicer is an open source slicer for FDM printers.
|
||||||
Bambu Studio is based on [PrusaSlicer](https://github.com/prusa3d/PrusaSlicer) by Prusa Research, which is from [Slic3r](https://github.com/Slic3r/Slic3r) by Alessandro Ranellucci and the RepRap community.
|
You can download Orca Slicer here: [github releases page](https://github.com/SoftFever/OrcaSlicer/releases/).
|
||||||
Orca Slicer incorporates a lot of features from SuperSlicer by @supermerill
|
 Join community: [OrcaSlicer Official Discord Server](https://discord.gg/WTEkCR6SnV)
|
||||||
|
|
||||||
|
|
||||||
Prebuilt binaries are available through the [github releases page](https://github.com/SoftFever/OrcaSlicer/releases/).
|
|
||||||
|
|
||||||
|
|
||||||
# Main features
|
# Main features
|
||||||
- Auto calibrations for all printers
|
- Auto calibrations for all printers
|
||||||
@@ -21,6 +17,13 @@ Prebuilt binaries are available through the [github releases page](https://githu
|
|||||||
- More granular controls
|
- More granular controls
|
||||||
- More features can be found in [change notes](https://github.com/SoftFever/OrcaSlicer/releases/)
|
- More features can be found in [change notes](https://github.com/SoftFever/OrcaSlicer/releases/)
|
||||||
|
|
||||||
|
### Some background
|
||||||
|
OrcaSlicer is fork of Bambu Studio
|
||||||
|
It was previously known as BambuStudio-SoftFever
|
||||||
|
Bambu Studio is forked from [PrusaSlicer](https://github.com/prusa3d/PrusaSlicer) by Prusa Research, which is from [Slic3r](https://github.com/Slic3r/Slic3r) by Alessandro Ranellucci and the RepRap community.
|
||||||
|
Orca Slicer incorporates a lot of features from SuperSlicer by @supermerill
|
||||||
|
Orca Slicer's logo is designed by community member Justin Levine(@freejstnalxndr)
|
||||||
|
|
||||||
# How to install
|
# How to install
|
||||||
**Windows**:
|
**Windows**:
|
||||||
1. Unzip the binaries to any folder you prefer, then execute orca-slicer.exe to start the application.
|
1. Unzip the binaries to any folder you prefer, then execute orca-slicer.exe to start the application.
|
||||||
@@ -88,5 +91,5 @@ The GNU Affero General Public License, version 3 ensures that if you use any par
|
|||||||
|
|
||||||
Orca Slicer includes a pressure advance calibration pattern test adapted from Andrew Ellis' generator, which is licensed under GNU General Public License, version 3. Ellis' generator is itself adapted from a generator developed by Sineos for Marlin, which is licensed under GNU General Public License, version 3.
|
Orca Slicer includes a pressure advance calibration pattern test adapted from Andrew Ellis' generator, which is licensed under GNU General Public License, version 3. Ellis' generator is itself adapted from a generator developed by Sineos for Marlin, which is licensed under GNU General Public License, version 3.
|
||||||
|
|
||||||
The bambu networking plugin is based on non-free libraries. It is optional to the Orca Slicer and provides extended functionalities for users.
|
The bambu networking plugin is based on non-free libraries from Bambulab. It is optional to the Orca Slicer and provides extended functionalities for Bambulab printer users.
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +0,0 @@
|
|||||||
# Add individual tools as executables in separate directories
|
|
||||||
add_subdirectory(bbs_gcode_checker)
|
|
||||||
|
|
||||||
install(TARGETS bbs_gcode_checker RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}")
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
cmake_minimum_required (VERSION 3.8)
|
|
||||||
|
|
||||||
project ("bbs_gcode_checker")
|
|
||||||
|
|
||||||
add_executable (bbs_gcode_checker "main.cpp" "GCodeChecker.cpp" "GCodeChecker.h" )
|
|
||||||
|
|
||||||
@@ -1,702 +0,0 @@
|
|||||||
#include "GCodeChecker.h"
|
|
||||||
#include <fstream>
|
|
||||||
#include <math.h>
|
|
||||||
#include <map>
|
|
||||||
#include <string.h>
|
|
||||||
namespace BambuStudio {
|
|
||||||
|
|
||||||
//BBS: only check wodth when dE is longer than this value
|
|
||||||
const double CHECK_WIDTH_E_THRESHOLD = 0.0025;
|
|
||||||
const double WIDTH_THRESHOLD = 0.02;
|
|
||||||
const double RADIUS_THRESHOLD = 0.005;
|
|
||||||
|
|
||||||
const double filament_diameter = 1.75;
|
|
||||||
const double Pi = 3.14159265358979323846;
|
|
||||||
|
|
||||||
const std::string Extrusion_Role_Tag = " FEATURE: ";
|
|
||||||
const std::string Width_Tag = " LINE_WIDTH: ";
|
|
||||||
const std::string Wipe_Start_Tag = " WIPE_START";
|
|
||||||
const std::string Wipe_End_Tag = " WIPE_END";
|
|
||||||
const std::string Layer_Change_Tag = " CHANGE_LAYER";
|
|
||||||
const std::string Height_Tag = " LAYER_HEIGHT: ";
|
|
||||||
const std::string filament_flow_ratio_tag = " filament_flow_ratio";
|
|
||||||
const std::string nozzle_temperature_Tag = " nozzle_temperature =";
|
|
||||||
const std::string nozzle_temperature_initial_layer_Tag = " nozzle_temperature_initial_layer";
|
|
||||||
const std::string Z_HEIGHT_TAG = " Z_HEIGHT: ";
|
|
||||||
const std::string Initial_Layer_Ptint_Height_Tag = " initial_layer_print_height =";
|
|
||||||
|
|
||||||
GCodeCheckResult GCodeChecker::parse_file(const std::string& path)
|
|
||||||
{
|
|
||||||
std::ifstream file(path);
|
|
||||||
if (file.fail()) {
|
|
||||||
std::cout << "Failed to open file " << path << std::endl;
|
|
||||||
return GCodeCheckResult::ParseFailed;
|
|
||||||
}
|
|
||||||
std::string line_raw;
|
|
||||||
std::string line;
|
|
||||||
while (std::getline(file, line_raw)) {
|
|
||||||
const char *c = line_raw.c_str();
|
|
||||||
c = skip_whitespaces(c);
|
|
||||||
if (std::toupper(*c) == 'N')
|
|
||||||
c = skip_word(c);
|
|
||||||
c = skip_whitespaces(c);
|
|
||||||
line = c;
|
|
||||||
if (parse_line(line) != GCodeCheckResult::Success) {
|
|
||||||
std::cout << "Failed to parse line " << line_raw << std::endl;
|
|
||||||
return GCodeCheckResult::ParseFailed;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_layer_num == 0) {
|
|
||||||
std::cout << "Invalid gcode file without layer change comment" << std::endl;
|
|
||||||
return GCodeCheckResult::ParseFailed;
|
|
||||||
}
|
|
||||||
|
|
||||||
return GCodeCheckResult::Success;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool GCodeChecker::include_chinese(const char* str)
|
|
||||||
{
|
|
||||||
char c;
|
|
||||||
while(1)
|
|
||||||
{
|
|
||||||
c=*str++;
|
|
||||||
if (is_end_of_line(c))
|
|
||||||
break;
|
|
||||||
if ((c & 0x80) && (*str & 0x80))
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
GCodeCheckResult GCodeChecker::parse_line(const std::string& line)
|
|
||||||
{
|
|
||||||
// update start position
|
|
||||||
m_start_position = m_end_position;
|
|
||||||
|
|
||||||
GCodeCheckResult ret;
|
|
||||||
const char *c = skip_whitespaces(line.c_str());
|
|
||||||
if (include_chinese(c)) {
|
|
||||||
//chinese is forbidden
|
|
||||||
return GCodeCheckResult::ParseFailed;
|
|
||||||
} if (is_end_of_line(*c)) {
|
|
||||||
//BBS: skip empty line
|
|
||||||
return GCodeCheckResult::Success;
|
|
||||||
} else if (is_comment_line(*c)) {
|
|
||||||
GCodeLine gcode_line;
|
|
||||||
gcode_line.m_raw = c;
|
|
||||||
ret = parse_comment(gcode_line);
|
|
||||||
if (ret != GCodeCheckResult::Success)
|
|
||||||
return ret;
|
|
||||||
} else {
|
|
||||||
GCodeLine gcode_line;
|
|
||||||
gcode_line.m_raw = c;
|
|
||||||
ret = parse_command(gcode_line);
|
|
||||||
if (ret != GCodeCheckResult::Success)
|
|
||||||
return ret;
|
|
||||||
ret = check_line_width(gcode_line);
|
|
||||||
if (ret != GCodeCheckResult::Success)
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
return GCodeCheckResult::Success;
|
|
||||||
}
|
|
||||||
|
|
||||||
GCodeCheckResult GCodeChecker::parse_comment(GCodeLine& line)
|
|
||||||
{
|
|
||||||
const char *c = line.m_raw.c_str();
|
|
||||||
c++;
|
|
||||||
std::string comment = c;
|
|
||||||
// extrusion role tag
|
|
||||||
if (starts_with(comment, Extrusion_Role_Tag)) {
|
|
||||||
m_role = string_to_role(comment.substr(Extrusion_Role_Tag.length()));
|
|
||||||
if (m_role == erExternalPerimeter) {
|
|
||||||
|
|
||||||
if (z_height == initial_layer_height && nozzle_temp != nozzle_temperature_initial_layer[filament_id]) {
|
|
||||||
std::cout << "invalid filament nozzle initial layer temperature comment with invalid value!" << std::endl;
|
|
||||||
return GCodeCheckResult::ParseFailed;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (z_height != initial_layer_height && nozzle_temp != nozzle_temperature[filament_id]) {
|
|
||||||
std::cout << "invalid filament nozzle temperature comment with invalid value!" << std::endl;
|
|
||||||
return GCodeCheckResult::ParseFailed;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} else if (starts_with(comment, Wipe_Start_Tag)) {
|
|
||||||
m_wiping = true;
|
|
||||||
} else if (starts_with(comment, Wipe_End_Tag)) {
|
|
||||||
m_wiping = false;
|
|
||||||
} else if (starts_with(comment, Height_Tag)) {
|
|
||||||
std::string str = comment.substr(Height_Tag.size());
|
|
||||||
if (!parse_double_from_str(str, m_height)) {
|
|
||||||
std::cout << "invalid height comment with invalid value!" << std::endl;
|
|
||||||
return GCodeCheckResult::ParseFailed;
|
|
||||||
}
|
|
||||||
} else if (starts_with(comment, Width_Tag)) {
|
|
||||||
std::string str = comment.substr(Width_Tag.size());
|
|
||||||
if (!parse_double_from_str(str, m_width)) {
|
|
||||||
std::cout << "invalid width comment with invalid value!" << std::endl;
|
|
||||||
return GCodeCheckResult::ParseFailed;
|
|
||||||
}
|
|
||||||
} else if (starts_with(comment, Layer_Change_Tag)) {
|
|
||||||
m_layer_num++;
|
|
||||||
} else if (starts_with(comment, filament_flow_ratio_tag))
|
|
||||||
{
|
|
||||||
std::string str = comment.substr(filament_flow_ratio_tag.size()+3);
|
|
||||||
if (!parse_double_from_str(str, filament_flow_ratio))
|
|
||||||
{
|
|
||||||
std::cout << "invalid filament flow ratio comment with invalid value!" << std::endl;
|
|
||||||
return GCodeCheckResult::ParseFailed;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (starts_with(comment, nozzle_temperature_Tag)) {
|
|
||||||
std::string str = comment.substr(nozzle_temperature_Tag.size() + 1);
|
|
||||||
if (!parse_double_from_str(str, nozzle_temperature)) {
|
|
||||||
std::cout << "invalid nozzle temperature comment with invalid value!" << std::endl;
|
|
||||||
return GCodeCheckResult::ParseFailed;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (starts_with(comment, nozzle_temperature_initial_layer_Tag)) {
|
|
||||||
std::string str = comment.substr(nozzle_temperature_initial_layer_Tag.size() + 3);
|
|
||||||
if (!parse_double_from_str(str, nozzle_temperature_initial_layer)) {
|
|
||||||
std::cout << "invalid nozzle temperature initial layer comment with invalid value!" << std::endl;
|
|
||||||
return GCodeCheckResult::ParseFailed;
|
|
||||||
}
|
|
||||||
} else if (starts_with(comment, Z_HEIGHT_TAG)) {
|
|
||||||
std::string str = comment.substr(Z_HEIGHT_TAG.size());
|
|
||||||
if (!parse_double_from_str(str, z_height)) {
|
|
||||||
std::cout << "invalid z height comment with invalid value!" << std::endl;
|
|
||||||
return GCodeCheckResult::ParseFailed;
|
|
||||||
}
|
|
||||||
} else if (starts_with(comment, Initial_Layer_Ptint_Height_Tag)) {
|
|
||||||
std::string str = comment.substr(Initial_Layer_Ptint_Height_Tag.size());
|
|
||||||
if (!parse_double_from_str(str, initial_layer_height)) {
|
|
||||||
std::cout << "invalid initial layer height comment with invalid value!" << std::endl;
|
|
||||||
return GCodeCheckResult::ParseFailed;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return GCodeCheckResult::Success;
|
|
||||||
}
|
|
||||||
|
|
||||||
GCodeCheckResult GCodeChecker::parse_command(GCodeLine& gcode_line)
|
|
||||||
{
|
|
||||||
const std::string cmd = gcode_line.cmd();
|
|
||||||
GCodeCheckResult ret = GCodeCheckResult::Success;
|
|
||||||
switch (::toupper(cmd[0])) {
|
|
||||||
case 'G':
|
|
||||||
{
|
|
||||||
switch (::atoi(&cmd[1]))
|
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
case 1: { ret = parse_G0_G1(gcode_line); break; } // Move
|
|
||||||
case 2:
|
|
||||||
case 3: { ret = parse_G2_G3(gcode_line); break; } // Move
|
|
||||||
case 90: { ret = parse_G90(gcode_line); break; } // Set to Absolute Positioning
|
|
||||||
case 91: { ret = parse_G91(gcode_line); break; } // Set to Relative Positioning
|
|
||||||
case 92: { ret = parse_G92(gcode_line); break; } // Set Position
|
|
||||||
default: { break; }
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 'M':{
|
|
||||||
switch (::atoi(&cmd[1]))
|
|
||||||
{
|
|
||||||
case 82: { ret = parse_M82(gcode_line); break; } // Set to Absolute extrusion
|
|
||||||
case 83: { ret = parse_M83(gcode_line); break; } // Set to Relative extrusion
|
|
||||||
case 104: {
|
|
||||||
ret = parse_M104_M109(gcode_line);
|
|
||||||
break;
|
|
||||||
} // Set to nozzle temperature
|
|
||||||
case 109: {
|
|
||||||
ret = parse_M104_M109(gcode_line);
|
|
||||||
break;
|
|
||||||
} // Set to nozzle temperature
|
|
||||||
default: { break; }
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 'T':{
|
|
||||||
|
|
||||||
int pt = ::atoi(&cmd[1]);
|
|
||||||
if (pt == 1000 || pt == 1100 || pt == 255) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pt < 0 || pt > 254 || pt >= filament_flow_ratio.size()) {
|
|
||||||
std::cout << "Invalid T command"<<std::endl;
|
|
||||||
ret = GCodeCheckResult::ParseFailed;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
filament_id = pt;
|
|
||||||
flow_ratio = filament_flow_ratio[pt];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default: {
|
|
||||||
//BBS: other g command? impossible! must be invalid
|
|
||||||
ret = GCodeCheckResult::ParseFailed;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
GCodeCheckResult GCodeChecker::parse_axis(GCodeLine& gcode_line)
|
|
||||||
{
|
|
||||||
const std::string cmd = gcode_line.m_raw;
|
|
||||||
const char* c = cmd.c_str();
|
|
||||||
c = skip_word(c);
|
|
||||||
while (! is_end_of_gcode_line(*c)) {
|
|
||||||
c = skip_whitespaces(c);
|
|
||||||
if (is_end_of_gcode_line(*c))
|
|
||||||
break;
|
|
||||||
|
|
||||||
Axis axis = UNKNOWN_AXIS;
|
|
||||||
switch (*c) {
|
|
||||||
case 'X': axis = X; break;
|
|
||||||
case 'Y': axis = Y; break;
|
|
||||||
case 'Z': axis = Z; break;
|
|
||||||
case 'E': axis = E; break;
|
|
||||||
case 'F': axis = F; break;
|
|
||||||
case 'I': axis = I; break;
|
|
||||||
case 'J': axis = J; break;
|
|
||||||
case 'P': axis = P; break;
|
|
||||||
default:
|
|
||||||
//BBS: invalid command which has invalid axis
|
|
||||||
std::cout << "Invalid gcode because of invalid axis!" << std::endl;
|
|
||||||
return GCodeCheckResult::ParseFailed;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *pend = nullptr;
|
|
||||||
double v = strtod(++c, &pend);
|
|
||||||
if (pend != nullptr && is_end_of_word(*pend) && !isnan(v) && !isinf(v)) {
|
|
||||||
gcode_line.m_axis[int(axis)] = v;
|
|
||||||
if (gcode_line.m_mask & (1 << int(axis))) {
|
|
||||||
//BBS: invalid command which has duplicated axis
|
|
||||||
std::cout << "Invalid gcode because of duplicated axis!" << std::endl;
|
|
||||||
return GCodeCheckResult::ParseFailed;
|
|
||||||
} else {
|
|
||||||
gcode_line.m_mask |= 1 << int(axis);
|
|
||||||
}
|
|
||||||
if (c == pend) {
|
|
||||||
//BBS: invalid command which has invalid axis value
|
|
||||||
std::cout << "Invalid gcode because of invalid axis value!" << std::endl;
|
|
||||||
return GCodeCheckResult::ParseFailed;
|
|
||||||
}
|
|
||||||
c = pend;
|
|
||||||
} else {
|
|
||||||
//BBS: invalid command for invalid axis value
|
|
||||||
std::cout << "Invalid gcode because of invalid axis value!" << std::endl;
|
|
||||||
return GCodeCheckResult::ParseFailed;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return GCodeCheckResult::Success;
|
|
||||||
}
|
|
||||||
|
|
||||||
GCodeCheckResult GCodeChecker::parse_G0_G1(GCodeLine& gcode_line)
|
|
||||||
{
|
|
||||||
if (parse_axis(gcode_line) != GCodeCheckResult::Success)
|
|
||||||
return GCodeCheckResult::ParseFailed;
|
|
||||||
|
|
||||||
//BBS: invalid G1 command which has no axis or invalid axis
|
|
||||||
if ((!gcode_line.m_mask) ||
|
|
||||||
gcode_line.has(I) ||
|
|
||||||
gcode_line.has(J)) {
|
|
||||||
std::cout << "Invalid G0_G1 gcode because of no axis or invalid axis!" << std::endl;
|
|
||||||
return GCodeCheckResult::ParseFailed;
|
|
||||||
}
|
|
||||||
|
|
||||||
//BBS: invalid G1 command which has zero speed
|
|
||||||
if (gcode_line.has(F) && gcode_line.get(F) == 0.0) {
|
|
||||||
std::cout << "Invalid G0_G1 gcode because has F axis but 0 speed!" << std::endl;
|
|
||||||
return GCodeCheckResult::ParseFailed;
|
|
||||||
}
|
|
||||||
|
|
||||||
return GCodeCheckResult::Success;
|
|
||||||
}
|
|
||||||
|
|
||||||
GCodeCheckResult GCodeChecker::parse_G2_G3(GCodeLine& gcode_line)
|
|
||||||
{
|
|
||||||
if (parse_axis(gcode_line) != GCodeCheckResult::Success)
|
|
||||||
return GCodeCheckResult::ParseFailed;
|
|
||||||
|
|
||||||
//BBS: invalid G2_G3 command which has no axis or Z axis
|
|
||||||
if (!gcode_line.m_mask) {
|
|
||||||
std::cout << "Invalid G2_G3 gcode because of no axis or has Z axis!" << std::endl;
|
|
||||||
return GCodeCheckResult::ParseFailed;
|
|
||||||
}
|
|
||||||
//BBS: invalid G2_G3 command which has zero speed
|
|
||||||
if (gcode_line.has(F) && gcode_line.get(F) == 0.0) {
|
|
||||||
std::cout << "Invalid G2_G3 gcode because has F axis but 0 speed!" << std::endl;
|
|
||||||
return GCodeCheckResult::ParseFailed;
|
|
||||||
}
|
|
||||||
//BBS: invalid G2_G3 command which has no I and J axis
|
|
||||||
if (!gcode_line.has(I) &&
|
|
||||||
!gcode_line.has(J)) {
|
|
||||||
std::cout << "Invalid G2_G3 gcode because of no I and J axis at same time!" << std::endl;
|
|
||||||
return GCodeCheckResult::ParseFailed;
|
|
||||||
}
|
|
||||||
//BBS: invalid G2_G3 command which has no X and Y axis at same time
|
|
||||||
if (!gcode_line.has(X) && !gcode_line.has(Y) && !gcode_line.has(I) && !gcode_line.has(J)) {
|
|
||||||
if (!gcode_line.has(X) || !gcode_line.has(P) || (int)gcode_line.get(P) != 1) {
|
|
||||||
std::cout << "Invalid G2_G3 gcode because of no X and Y axis at same time!" << std::endl;
|
|
||||||
return GCodeCheckResult::ParseFailed;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return GCodeCheckResult::Success;
|
|
||||||
}
|
|
||||||
|
|
||||||
GCodeCheckResult GCodeChecker::parse_G90(const GCodeLine& gcode_line)
|
|
||||||
{
|
|
||||||
const char* c = gcode_line.m_raw.c_str();
|
|
||||||
//BBS: G90 is single command with no argument
|
|
||||||
if (!is_single_gcode_word(c)) {
|
|
||||||
std::cout << "Invalid G90 gcode with invalid end!" << std::endl;
|
|
||||||
return GCodeCheckResult::ParseFailed;
|
|
||||||
}
|
|
||||||
m_global_positioning_type = EPositioningType::Absolute;
|
|
||||||
return GCodeCheckResult::Success;
|
|
||||||
}
|
|
||||||
|
|
||||||
GCodeCheckResult GCodeChecker::parse_G91(const GCodeLine& gcode_line)
|
|
||||||
{
|
|
||||||
const char* c = gcode_line.m_raw.c_str();
|
|
||||||
//BBS: G91 is single command with no argument
|
|
||||||
if (!is_single_gcode_word(c)) {
|
|
||||||
std::cout << "Invalid G91 gcode with invalid end!" << std::endl;
|
|
||||||
return GCodeCheckResult::ParseFailed;
|
|
||||||
}
|
|
||||||
m_global_positioning_type = EPositioningType::Relative;
|
|
||||||
return GCodeCheckResult::Success;
|
|
||||||
}
|
|
||||||
|
|
||||||
GCodeCheckResult GCodeChecker::parse_G92(GCodeLine& gcode_line)
|
|
||||||
{
|
|
||||||
if (parse_axis(gcode_line) != GCodeCheckResult::Success)
|
|
||||||
return GCodeCheckResult::ParseFailed;
|
|
||||||
|
|
||||||
//BBS: invalid G92 command which has no axis or invalid axis
|
|
||||||
if (!gcode_line.m_mask ||
|
|
||||||
gcode_line.has(F) ||
|
|
||||||
gcode_line.has(I) ||
|
|
||||||
gcode_line.has(J)) {
|
|
||||||
std::cout << "Invalid G2_G3 gcode because of no axis or invalid axis!" << std::endl;
|
|
||||||
return GCodeCheckResult::ParseFailed;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gcode_line.has(X))
|
|
||||||
m_origin[X] = m_end_position[X] - gcode_line.get(X);
|
|
||||||
|
|
||||||
if (gcode_line.has(Y))
|
|
||||||
m_origin[Y] = m_end_position[Y] - gcode_line.get(Y);
|
|
||||||
|
|
||||||
if (gcode_line.has(Z))
|
|
||||||
m_origin[Z] = m_end_position[Z] - gcode_line.get(Z);
|
|
||||||
|
|
||||||
if (gcode_line.has(E))
|
|
||||||
m_end_position[E] = gcode_line.get(E);
|
|
||||||
|
|
||||||
for (unsigned char a = X; a <= E; ++a) {
|
|
||||||
m_origin[a] = m_end_position[a];
|
|
||||||
}
|
|
||||||
|
|
||||||
return GCodeCheckResult::Success;
|
|
||||||
}
|
|
||||||
|
|
||||||
GCodeCheckResult GCodeChecker::parse_M82(const GCodeLine& gcode_line)
|
|
||||||
{
|
|
||||||
const char* c = gcode_line.m_raw.c_str();
|
|
||||||
//BBS: M82 is single command with no argument
|
|
||||||
if (!is_single_gcode_word(c)) {
|
|
||||||
std::cout << "Invalid M82 gcode with invalid end!" << std::endl;
|
|
||||||
return GCodeCheckResult::ParseFailed;
|
|
||||||
}
|
|
||||||
m_e_local_positioning_type = EPositioningType::Absolute;
|
|
||||||
return GCodeCheckResult::Success;
|
|
||||||
}
|
|
||||||
|
|
||||||
GCodeCheckResult GCodeChecker::parse_M83(const GCodeLine& gcode_line)
|
|
||||||
{
|
|
||||||
const char* c = gcode_line.m_raw.c_str();
|
|
||||||
//BBS: M83 is single command with no argument
|
|
||||||
if (!is_single_gcode_word(c)) {
|
|
||||||
std::cout << "Invalid M83 gcode with invalid end!" << std::endl;
|
|
||||||
return GCodeCheckResult::ParseFailed;
|
|
||||||
}
|
|
||||||
m_e_local_positioning_type = EPositioningType::Relative;
|
|
||||||
return GCodeCheckResult::Success;
|
|
||||||
}
|
|
||||||
|
|
||||||
GCodeCheckResult GCodeChecker::parse_M104_M109(const GCodeLine &gcode_line)
|
|
||||||
{
|
|
||||||
const char *c = gcode_line.m_raw.c_str();
|
|
||||||
const char *rs = strchr(c,'S');
|
|
||||||
|
|
||||||
std::string str=rs;
|
|
||||||
str = str.substr(1);
|
|
||||||
for (int i = 0; i < str.size(); i++) {
|
|
||||||
if (str[i] == ' ')
|
|
||||||
str=str.substr(0,i);
|
|
||||||
}
|
|
||||||
if (!parse_double_from_str(str, nozzle_temp)) {
|
|
||||||
std::cout << "invalid nozzle temperature comment with invalid value!" << std::endl;
|
|
||||||
return GCodeCheckResult::ParseFailed;
|
|
||||||
}
|
|
||||||
|
|
||||||
return GCodeCheckResult::Success;
|
|
||||||
}
|
|
||||||
|
|
||||||
double GCodeChecker::calculate_G1_width(const std::array<double, 3>& source,
|
|
||||||
const std::array<double, 3>& target,
|
|
||||||
double e, double height, bool is_bridge) const
|
|
||||||
{
|
|
||||||
double volume = (e / flow_ratio) * Pi * (filament_diameter / 2.0f) * (filament_diameter / 2.0f);
|
|
||||||
std::array<double, 3> delta = { target[0] - source[0],
|
|
||||||
target[1] - source[1],
|
|
||||||
target[2] - source[2] };
|
|
||||||
double length = sqrt(delta[0] * delta[0] + delta[1] * delta[1] + delta[2] * delta[2]);
|
|
||||||
double mm3_per_mm = volume / length;
|
|
||||||
return is_bridge? 2 * sqrt(mm3_per_mm/Pi) :
|
|
||||||
(mm3_per_mm / height) + height * (1 - 0.25 * Pi);
|
|
||||||
}
|
|
||||||
|
|
||||||
double GCodeChecker::calculate_G2_G3_width(const std::array<double, 2>& source,
|
|
||||||
const std::array<double, 2>& target,
|
|
||||||
const std::array<double, 2>& center,
|
|
||||||
bool is_ccw, double e, double height,
|
|
||||||
bool is_bridge) const
|
|
||||||
{
|
|
||||||
std::array<double, 2> v1 = { source[0] - center[0], source[1] - center[1] };
|
|
||||||
std::array<double, 2> v2 = { target[0] - center[0], target[1] - center[1] };
|
|
||||||
|
|
||||||
double dot = v1[0] * v2[0] + v1[1] * v2[1];
|
|
||||||
double cross = v1[0] * v2[1] - v1[1] * v2[0];
|
|
||||||
double radian = atan2(cross, dot);
|
|
||||||
radian = is_ccw ?
|
|
||||||
(radian < 0 ? 2 * Pi + radian : radian) :
|
|
||||||
(radian < 0 ? -radian : 2 * Pi - radian);
|
|
||||||
double radius = sqrt(v1[0] * v1[0] + v1[1] * v1[1]);
|
|
||||||
double length = radius * radian;
|
|
||||||
double volume = (e / flow_ratio) * Pi * (filament_diameter / 2) * (filament_diameter / 2);
|
|
||||||
double mm3_per_mm = volume / length;
|
|
||||||
|
|
||||||
return is_bridge? 2 * sqrt(mm3_per_mm/Pi) :
|
|
||||||
(mm3_per_mm / height) + height * (1 - 0.25 * Pi);
|
|
||||||
}
|
|
||||||
|
|
||||||
GCodeCheckResult GCodeChecker::check_line_width(const GCodeLine& gcode_line)
|
|
||||||
{
|
|
||||||
//BBS: don't need to check extrusion before first layer
|
|
||||||
if (m_layer_num <= 0) {
|
|
||||||
return GCodeCheckResult::Success;
|
|
||||||
}
|
|
||||||
|
|
||||||
GCodeCheckResult ret = GCodeCheckResult::Success;
|
|
||||||
//BBS: only need to handle G0 G1 G2 G3
|
|
||||||
const std::string cmd = gcode_line.cmd();
|
|
||||||
int cmd_id = ::atoi(&cmd[1]);
|
|
||||||
if (::toupper(cmd[0]) == 'G')
|
|
||||||
switch (::atoi(&cmd[1]))
|
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
case 1: { ret = check_G0_G1_width(gcode_line); break; }
|
|
||||||
case 2:
|
|
||||||
case 3: { ret = check_G2_G3_width(gcode_line); break; }
|
|
||||||
default: { break; }
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
GCodeCheckResult GCodeChecker::check_G0_G1_width(const GCodeLine& line)
|
|
||||||
{
|
|
||||||
auto absolute_position = [this](Axis axis, const GCodeLine& lineG1) {
|
|
||||||
bool is_relative = (m_global_positioning_type == EPositioningType::Relative);
|
|
||||||
if (axis == E)
|
|
||||||
is_relative |= (m_e_local_positioning_type == EPositioningType::Relative);
|
|
||||||
|
|
||||||
if (lineG1.has(Axis(axis))) {
|
|
||||||
double ret = lineG1.get(Axis(axis));
|
|
||||||
return is_relative ? m_start_position[axis] + ret : m_origin[axis] + ret;
|
|
||||||
} else
|
|
||||||
return m_start_position[axis];
|
|
||||||
};
|
|
||||||
|
|
||||||
auto move_type = [this](const std::array<double, 4>& delta_pos) {
|
|
||||||
EMoveType type = EMoveType::Noop;
|
|
||||||
|
|
||||||
if (m_wiping)
|
|
||||||
type = EMoveType::Wipe;
|
|
||||||
else if (delta_pos[E] < 0.0f)
|
|
||||||
type = (delta_pos[X] != 0.0f || delta_pos[Y] != 0.0f || delta_pos[Z] != 0.0f) ? EMoveType::Travel : EMoveType::Retract;
|
|
||||||
else if (delta_pos[E] > 0.0f) {
|
|
||||||
if (delta_pos[X] == 0.0f && delta_pos[Y] == 0.0f)
|
|
||||||
type = (delta_pos[Z] == 0.0f) ? EMoveType::Unretract : EMoveType::Travel;
|
|
||||||
else if (delta_pos[X] != 0.0f || delta_pos[Y] != 0.0f)
|
|
||||||
type = EMoveType::Extrude;
|
|
||||||
}
|
|
||||||
else if (delta_pos[X] != 0.0f || delta_pos[Y] != 0.0f || delta_pos[Z] != 0.0f)
|
|
||||||
type = EMoveType::Travel;
|
|
||||||
|
|
||||||
return type;
|
|
||||||
};
|
|
||||||
|
|
||||||
for (unsigned char a = X; a <= E; ++a) {
|
|
||||||
m_end_position[a] = absolute_position((Axis)a, line);
|
|
||||||
}
|
|
||||||
|
|
||||||
// calculates movement deltas
|
|
||||||
std::array<double, 4> delta_pos;
|
|
||||||
for (unsigned char a = X; a <= E; ++a)
|
|
||||||
delta_pos[a] = m_end_position[a] - m_start_position[a];
|
|
||||||
|
|
||||||
// Todo: currently, for precision, there alwasy has possible to generate
|
|
||||||
// such gcode because of decimal truncation
|
|
||||||
/*if (line.has(Axis(E)) && delta_pos[E] == 0.0 && !m_wiping) {
|
|
||||||
std::cout << "Invalid GCode because has E axis but 0 extrusion" << std::endl;
|
|
||||||
return GCodeCheckResult::CheckFailed;
|
|
||||||
}*/
|
|
||||||
|
|
||||||
EMoveType type = move_type(delta_pos);
|
|
||||||
if (type == EMoveType::Extrude && m_end_position[Z] == 0.0f)
|
|
||||||
type = EMoveType::Travel;
|
|
||||||
|
|
||||||
//BBS: calculate line width and compare.
|
|
||||||
//Don't need to check gap fill which has verious width
|
|
||||||
if (type == EMoveType::Extrude &&
|
|
||||||
m_role != erGapFill &&
|
|
||||||
delta_pos[E] > CHECK_WIDTH_E_THRESHOLD) {
|
|
||||||
std::array<double, 3> source = { m_start_position[X], m_start_position[Y], m_start_position[Z] };
|
|
||||||
std::array<double, 3> target = { m_end_position[X], m_end_position[Y], m_end_position[Z] };
|
|
||||||
|
|
||||||
bool is_bridge = m_role == erOverhangPerimeter || m_role == erBridgeInfill;
|
|
||||||
if (!is_bridge) {
|
|
||||||
double width_real = calculate_G1_width(source, target, delta_pos[E], m_height, is_bridge);
|
|
||||||
if (fabs(width_real - m_width) > WIDTH_THRESHOLD) {
|
|
||||||
std::cout << "Invalid G0_G1 because has abnormal line width." << std::endl;
|
|
||||||
std::cout << "Width: " << m_width << " Width_real: " << width_real << std::endl;
|
|
||||||
return GCodeCheckResult::CheckFailed;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return GCodeCheckResult::Success;
|
|
||||||
}
|
|
||||||
|
|
||||||
GCodeCheckResult GCodeChecker::check_G2_G3_width(const GCodeLine& line)
|
|
||||||
{
|
|
||||||
auto absolute_position = [this](Axis axis, const GCodeLine& lineG2_3) {
|
|
||||||
bool is_relative = (m_global_positioning_type == EPositioningType::Relative);
|
|
||||||
if (axis == E)
|
|
||||||
is_relative |= (m_e_local_positioning_type == EPositioningType::Relative);
|
|
||||||
|
|
||||||
if (lineG2_3.has(Axis(axis))) {
|
|
||||||
double ret = lineG2_3.get(Axis(axis));
|
|
||||||
if (axis == I)
|
|
||||||
return m_start_position[X] + ret;
|
|
||||||
else if (axis == J)
|
|
||||||
return m_start_position[Y] + ret;
|
|
||||||
else
|
|
||||||
return is_relative ? m_start_position[axis] + ret : m_origin[axis] + ret;
|
|
||||||
} else {
|
|
||||||
if (axis == I)
|
|
||||||
return m_start_position[X];
|
|
||||||
else if (axis == J)
|
|
||||||
return m_start_position[Y];
|
|
||||||
else
|
|
||||||
return m_start_position[axis];
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
auto move_type = [this](const double& delta_E) {
|
|
||||||
EMoveType type = EMoveType::Noop;
|
|
||||||
|
|
||||||
if (m_wiping)
|
|
||||||
type = EMoveType::Wipe;
|
|
||||||
else if (delta_E < 0.0f || delta_E == 0.0f)
|
|
||||||
type = EMoveType::Travel;
|
|
||||||
else
|
|
||||||
type = EMoveType::Extrude;
|
|
||||||
|
|
||||||
return type;
|
|
||||||
};
|
|
||||||
|
|
||||||
for (unsigned char a = X; a <= E; ++a) {
|
|
||||||
m_end_position[a] = absolute_position((Axis)a, line);
|
|
||||||
}
|
|
||||||
std::array<double, 2> source = { m_start_position[X], m_start_position[Y] };
|
|
||||||
std::array<double, 2> target = { m_end_position[X], m_end_position[Y] };
|
|
||||||
std::array<double, 2> center = { absolute_position(I, line),absolute_position(J, line) };
|
|
||||||
const std::string& cmd = line.cmd();
|
|
||||||
bool is_ccw = (::atoi(&cmd[1]) == 2) ? false : true;
|
|
||||||
double delta_e = m_end_position[E] - m_start_position[E];
|
|
||||||
EMoveType type = move_type(delta_e);
|
|
||||||
|
|
||||||
//BBS: judge whether is normal arc by radius
|
|
||||||
double radius1 = sqrt(pow((source[0] - center[0]), 2) + pow((source[1] - center[1]), 2));
|
|
||||||
double radius2 = sqrt(pow((target[0] - center[0]), 2) + pow((target[1] - center[1]), 2));
|
|
||||||
if (fabs(radius2 - radius1) > RADIUS_THRESHOLD) {
|
|
||||||
std::cout << "Invalid G2_G3 because of abnormal radius." << std::endl;
|
|
||||||
std::cout << "radius1: " << radius1 << " radius2: " << radius2 << std::endl;
|
|
||||||
return GCodeCheckResult::CheckFailed;
|
|
||||||
}
|
|
||||||
|
|
||||||
//BBS: calculate line width and compare
|
|
||||||
//Don't need to check gap fill which has verious width
|
|
||||||
if (type == EMoveType::Extrude &&
|
|
||||||
m_role != erGapFill &&
|
|
||||||
delta_e > CHECK_WIDTH_E_THRESHOLD) {
|
|
||||||
bool is_bridge = m_role == erOverhangPerimeter || m_role == erBridgeInfill;
|
|
||||||
|
|
||||||
if (!is_bridge) {
|
|
||||||
double width_real = calculate_G2_G3_width(source, target, center, is_ccw, delta_e, m_height, is_bridge);
|
|
||||||
if (fabs(width_real - m_width) > WIDTH_THRESHOLD) {
|
|
||||||
std::cout << "Invalid G2_G3 because has abnormal line width." << std::endl;
|
|
||||||
std::cout << "Width: " << m_width << " Width_real: " << width_real << std::endl;
|
|
||||||
return GCodeCheckResult::CheckFailed;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return GCodeCheckResult::Success;
|
|
||||||
}
|
|
||||||
|
|
||||||
const std::map<std::string, ExtrusionRole> string_to_role_map = {
|
|
||||||
{ "Inner wall", erPerimeter },
|
|
||||||
{ "Outer wall", erExternalPerimeter },
|
|
||||||
{ "Overhang wall", erOverhangPerimeter },
|
|
||||||
{ "Sparse infill", erInternalInfill },
|
|
||||||
{ "Internal solid infill", erSolidInfill },
|
|
||||||
{ "Top surface", erTopSolidInfill },
|
|
||||||
{ "Bottom surface", erBottomSurface },
|
|
||||||
{ "Ironing", erIroning },
|
|
||||||
{ "Bridge", erBridgeInfill },
|
|
||||||
{ "Gap infill", erGapFill },
|
|
||||||
{ "Skirt", erSkirt },
|
|
||||||
{ "Brim", erBrim },
|
|
||||||
{ "Support", erSupportMaterial },
|
|
||||||
{ "Support interface", erSupportMaterialInterface },
|
|
||||||
{ "Support transition", erSupportTransition },
|
|
||||||
{ "Prime tower", erWipeTower },
|
|
||||||
{ "Custom", erCustom },
|
|
||||||
{ "Mixed", erMixed }
|
|
||||||
};
|
|
||||||
|
|
||||||
ExtrusionRole GCodeChecker::string_to_role(const std::string &role)
|
|
||||||
{
|
|
||||||
for (auto it = string_to_role_map.begin(); it != string_to_role_map.end(); it++) {
|
|
||||||
if (role == it->first)
|
|
||||||
return it->second;
|
|
||||||
}
|
|
||||||
return erNone;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,222 +0,0 @@
|
|||||||
#ifndef _GCodeChecker_H_
|
|
||||||
#define _GCodeChecker_H_
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
#include <array>
|
|
||||||
|
|
||||||
namespace BambuStudio {
|
|
||||||
|
|
||||||
enum class GCodeCheckResult : unsigned char
|
|
||||||
{
|
|
||||||
Success,
|
|
||||||
ParseFailed,
|
|
||||||
CheckFailed,
|
|
||||||
Count
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class EMoveType : unsigned char
|
|
||||||
{
|
|
||||||
Noop,
|
|
||||||
Retract,
|
|
||||||
Unretract,
|
|
||||||
Tool_change,
|
|
||||||
Color_change,
|
|
||||||
Pause_Print,
|
|
||||||
Custom_GCode,
|
|
||||||
Travel,
|
|
||||||
Wipe,
|
|
||||||
Extrude,
|
|
||||||
Count
|
|
||||||
};
|
|
||||||
|
|
||||||
enum Axis {
|
|
||||||
X=0,
|
|
||||||
Y,
|
|
||||||
Z,
|
|
||||||
E,
|
|
||||||
F,
|
|
||||||
I,
|
|
||||||
J,
|
|
||||||
P,
|
|
||||||
NUM_AXES,
|
|
||||||
UNKNOWN_AXIS = NUM_AXES,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum ExtrusionRole : uint8_t {
|
|
||||||
erNone,
|
|
||||||
erPerimeter,
|
|
||||||
erExternalPerimeter,
|
|
||||||
erOverhangPerimeter,
|
|
||||||
erInternalInfill,
|
|
||||||
erSolidInfill,
|
|
||||||
erTopSolidInfill,
|
|
||||||
erBottomSurface,
|
|
||||||
erIroning,
|
|
||||||
erBridgeInfill,
|
|
||||||
erGapFill,
|
|
||||||
erSkirt,
|
|
||||||
erBrim,
|
|
||||||
erSupportMaterial,
|
|
||||||
erSupportMaterialInterface,
|
|
||||||
erSupportTransition,
|
|
||||||
erWipeTower,
|
|
||||||
erCustom,
|
|
||||||
// Extrusion role for a collection with multiple extrusion roles.
|
|
||||||
erMixed,
|
|
||||||
erCount
|
|
||||||
};
|
|
||||||
|
|
||||||
class GCodeChecker {
|
|
||||||
public:
|
|
||||||
class GCodeLine {
|
|
||||||
public:
|
|
||||||
GCodeLine() {}
|
|
||||||
const std::string cmd() const {
|
|
||||||
const char *cmd = GCodeChecker::skip_whitespaces(m_raw.c_str());
|
|
||||||
return std::string(cmd, GCodeChecker::skip_word(cmd) - cmd);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool has(Axis axis) const { return (m_mask & (1 << int(axis))) != 0; }
|
|
||||||
double get(Axis axis) const { return m_axis[int(axis)]; }
|
|
||||||
|
|
||||||
std::string m_raw;
|
|
||||||
double m_axis[NUM_AXES] = { 0.0f };
|
|
||||||
uint32_t m_mask = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class EPositioningType : unsigned char
|
|
||||||
{
|
|
||||||
Absolute,
|
|
||||||
Relative
|
|
||||||
};
|
|
||||||
|
|
||||||
GCodeChecker() {}
|
|
||||||
GCodeCheckResult parse_file(const std::string& path);
|
|
||||||
|
|
||||||
private:
|
|
||||||
bool include_chinese(const char* str);
|
|
||||||
GCodeCheckResult parse_line(const std::string& line);
|
|
||||||
|
|
||||||
GCodeCheckResult parse_command(GCodeLine& gcode_line);
|
|
||||||
GCodeCheckResult parse_axis(GCodeLine& gcode_line);
|
|
||||||
GCodeCheckResult parse_G0_G1(GCodeLine& gcode_line);
|
|
||||||
GCodeCheckResult parse_G2_G3(GCodeLine& gcode_line);
|
|
||||||
GCodeCheckResult parse_G90(const GCodeLine& gcode_line);
|
|
||||||
GCodeCheckResult parse_G91(const GCodeLine& gcode_line);
|
|
||||||
GCodeCheckResult parse_G92(GCodeLine& gcode_line);
|
|
||||||
GCodeCheckResult parse_M82(const GCodeLine& gcode_line);
|
|
||||||
GCodeCheckResult parse_M83(const GCodeLine& gcode_line);
|
|
||||||
GCodeCheckResult parse_M104_M109(const GCodeLine &gcode_line);
|
|
||||||
|
|
||||||
GCodeCheckResult parse_comment(GCodeLine& gcode_line);
|
|
||||||
|
|
||||||
GCodeCheckResult check_line_width(const GCodeLine& gcode_line);
|
|
||||||
GCodeCheckResult check_G0_G1_width(const GCodeLine& gcode_line);
|
|
||||||
GCodeCheckResult check_G2_G3_width(const GCodeLine& gcode_line);
|
|
||||||
|
|
||||||
double calculate_G1_width(const std::array<double, 3>& source,
|
|
||||||
const std::array<double, 3>& target,
|
|
||||||
double e, double height, bool is_bridge) const;
|
|
||||||
double calculate_G2_G3_width(const std::array<double, 2>& source,
|
|
||||||
const std::array<double, 2>& target,
|
|
||||||
const std::array<double, 2>& center,
|
|
||||||
bool is_ccw, double e, double height, bool is_bridge) const;
|
|
||||||
|
|
||||||
public:
|
|
||||||
static bool is_whitespace(char c) { return c == ' ' || c == '\t'; }
|
|
||||||
static bool is_end_of_line(char c) { return c == '\r' || c == '\n' || c == 0; }
|
|
||||||
static bool is_comment_line(char c) { return c == ';'; }
|
|
||||||
static bool is_end_of_gcode_line(char c) { return is_comment_line(c) || is_end_of_line(c); }
|
|
||||||
static bool is_end_of_word(char c) { return is_whitespace(c) || is_end_of_gcode_line(c); }
|
|
||||||
static const char* skip_word(const char *c) {
|
|
||||||
for (; ! is_end_of_word(*c); ++ c)
|
|
||||||
; // silence -Wempty-body
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
static const char* skip_whitespaces(const char *c) {
|
|
||||||
for (; is_whitespace(*c); ++ c)
|
|
||||||
; // silence -Wempty-body
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
static bool is_single_gcode_word(const char* c) {
|
|
||||||
c = skip_word(c);
|
|
||||||
c = skip_whitespaces(c);
|
|
||||||
return is_end_of_gcode_line(*c);
|
|
||||||
}
|
|
||||||
static bool starts_with(const std::string &comment, const std::string &tag) {
|
|
||||||
size_t tag_len = tag.size();
|
|
||||||
return comment.size() >= tag_len && comment.substr(0, tag_len) == tag;
|
|
||||||
}
|
|
||||||
static ExtrusionRole string_to_role(const std::string& role);
|
|
||||||
//BBS: Returns true if the number was parsed correctly into out and the number spanned the whole input string.
|
|
||||||
static bool parse_double_from_str(const std::string& input, double& out) {
|
|
||||||
size_t read = 0;
|
|
||||||
try {
|
|
||||||
out = std::stod(input, &read);
|
|
||||||
return input.size() == read;
|
|
||||||
} catch (...) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool parse_double_from_str(const std::string &input, std::vector<double> &out)
|
|
||||||
{
|
|
||||||
|
|
||||||
std::string cmd=input;
|
|
||||||
size_t read = 0;
|
|
||||||
|
|
||||||
while (cmd.size() >= 5)
|
|
||||||
{
|
|
||||||
int pt = 0;
|
|
||||||
for (pt = 0; pt < cmd.size(); pt++) {
|
|
||||||
char temp = cmd[pt];
|
|
||||||
if (temp == ',')
|
|
||||||
{
|
|
||||||
try {
|
|
||||||
double num = std::stod(cmd.substr(0, pt), &read);
|
|
||||||
|
|
||||||
out.push_back(num);
|
|
||||||
cmd = cmd.substr(pt+1);
|
|
||||||
break;
|
|
||||||
} catch (...) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
double num = std::stod(cmd, &read);
|
|
||||||
out.push_back(num);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
EPositioningType m_global_positioning_type = EPositioningType::Absolute;
|
|
||||||
EPositioningType m_e_local_positioning_type = EPositioningType::Absolute;
|
|
||||||
|
|
||||||
std::array<double, 4> m_start_position = { 0.0, 0.0, 0.0, 0.0 };
|
|
||||||
std::array<double, 4> m_end_position = { 0.0, 0.0, 0.0, 0.0 };
|
|
||||||
std::array<double, 4> m_origin = { 0.0, 0.0, 0.0, 0.0 };
|
|
||||||
|
|
||||||
//BBS: use these value to save information from comment
|
|
||||||
ExtrusionRole m_role = erNone;
|
|
||||||
bool m_wiping = false;
|
|
||||||
int m_layer_num = 0;
|
|
||||||
double m_height = 0.0;
|
|
||||||
double m_width = 0.0;
|
|
||||||
double z_height=0.0f;
|
|
||||||
double initial_layer_height=0.0f;
|
|
||||||
int filament_id;
|
|
||||||
double flow_ratio = 0;
|
|
||||||
double nozzle_temp = 0.0f;
|
|
||||||
std::vector<double> filament_flow_ratio;
|
|
||||||
std::vector<double> nozzle_temperature;
|
|
||||||
std::vector<double> nozzle_temperature_initial_layer;
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
#include "GCodeChecker.h"
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
using namespace BambuStudio;
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
if (argc != 2) {
|
|
||||||
cout << "Invalid input arguments" << endl;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
string path(argv[1]);
|
|
||||||
cout << "Start to check file " << path << endl;
|
|
||||||
GCodeChecker checker;
|
|
||||||
|
|
||||||
//BBS: parse and check whether has invalid gcode
|
|
||||||
if (checker.parse_file(path) != GCodeCheckResult::Success) {
|
|
||||||
cout << "Failed to parse and check file " << path << endl;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
cout << "Success to parse and check file" << path << endl;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@@ -3,17 +3,17 @@ cd deps
|
|||||||
mkdir build
|
mkdir build
|
||||||
cd build
|
cd build
|
||||||
set DEPS=%CD%/OrcaSlicer_dep
|
set DEPS=%CD%/OrcaSlicer_dep
|
||||||
if "%1"=="studio" (
|
if "%1"=="slicer" (
|
||||||
GOTO :studio
|
GOTO :slicer
|
||||||
)
|
)
|
||||||
echo "building deps.."
|
echo "building deps.."
|
||||||
cmake ../ -G "Visual Studio 16 2019" -DDESTDIR="%CD%/OrcaSlicer_dep" -DCMAKE_BUILD_TYPE=Release
|
cmake ../ -G "Visual Studio 16 2019" -DDESTDIR="%CD%/OrcaSlicer_dep" -DCMAKE_BUILD_TYPE=Release
|
||||||
cmake --build . --config Release --target ALL_BUILD -- -m
|
cmake --build . --config Release --target deps -- -m
|
||||||
|
|
||||||
if "%1"=="deps" exit /b 0
|
if "%1"=="deps" exit /b 0
|
||||||
|
|
||||||
:studio
|
:slicer
|
||||||
echo "building studio..."
|
echo "building Orca Slicer..."
|
||||||
cd %WP%
|
cd %WP%
|
||||||
mkdir build
|
mkdir build
|
||||||
cd build
|
cd build
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ while getopts ":a:sdphn" opt; do
|
|||||||
export ARCH="$OPTARG"
|
export ARCH="$OPTARG"
|
||||||
;;
|
;;
|
||||||
s )
|
s )
|
||||||
export BUILD_TARGET="studio"
|
export BUILD_TARGET="slicer"
|
||||||
;;
|
;;
|
||||||
n )
|
n )
|
||||||
export NIGHTLY_BUILD="1"
|
export NIGHTLY_BUILD="1"
|
||||||
@@ -20,7 +20,7 @@ while getopts ":a:sdphn" opt; do
|
|||||||
h ) echo "Usage: ./build_release_macos.sh [-d]"
|
h ) echo "Usage: ./build_release_macos.sh [-d]"
|
||||||
echo " -d: Build deps only"
|
echo " -d: Build deps only"
|
||||||
echo " -a: Set ARCHITECTURE (arm64 or x86_64)"
|
echo " -a: Set ARCHITECTURE (arm64 or x86_64)"
|
||||||
echo " -s: Build studio only"
|
echo " -s: Build slicer only"
|
||||||
echo " -n: Nightly build"
|
echo " -n: Nightly build"
|
||||||
exit 0
|
exit 0
|
||||||
;;
|
;;
|
||||||
@@ -54,12 +54,12 @@ mkdir -p build_$ARCH
|
|||||||
cd build_$ARCH
|
cd build_$ARCH
|
||||||
DEPS=$PWD/OrcaSlicer_dep_$ARCH
|
DEPS=$PWD/OrcaSlicer_dep_$ARCH
|
||||||
mkdir -p $DEPS
|
mkdir -p $DEPS
|
||||||
if [ "studio." != $BUILD_TARGET. ];
|
if [ "slicer." != $BUILD_TARGET. ];
|
||||||
then
|
then
|
||||||
echo "building deps..."
|
echo "building deps..."
|
||||||
echo "cmake ../ -DDESTDIR=$DEPS -DOPENSSL_ARCH=darwin64-${ARCH}-cc -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_ARCHITECTURES:STRING=${ARCH}"
|
echo "cmake ../ -DDESTDIR=$DEPS -DOPENSSL_ARCH=darwin64-${ARCH}-cc -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_ARCHITECTURES:STRING=${ARCH}"
|
||||||
cmake ../ -DDESTDIR="$DEPS" -DOPENSSL_ARCH="darwin64-${ARCH}-cc" -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_ARCHITECTURES:STRING=${ARCH}
|
cmake ../ -DDESTDIR="$DEPS" -DOPENSSL_ARCH="darwin64-${ARCH}-cc" -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_ARCHITECTURES:STRING=${ARCH}
|
||||||
cmake --build . --config Release --target all
|
cmake --build . --config Release --target deps
|
||||||
if [ "1." == "$PACK_DEPS". ];
|
if [ "1." == "$PACK_DEPS". ];
|
||||||
then
|
then
|
||||||
tar -zcvf OrcaSlicer_dep_mac_${ARCH}_$(date +"%d-%m-%Y").tar.gz OrcaSlicer_dep_$ARCH
|
tar -zcvf OrcaSlicer_dep_mac_${ARCH}_$(date +"%d-%m-%Y").tar.gz OrcaSlicer_dep_$ARCH
|
||||||
@@ -75,7 +75,7 @@ fi
|
|||||||
cd $WD
|
cd $WD
|
||||||
mkdir -p build_$ARCH
|
mkdir -p build_$ARCH
|
||||||
cd build_$ARCH
|
cd build_$ARCH
|
||||||
echo "building studio..."
|
echo "building slicer..."
|
||||||
cmake .. -GXcode -DBBL_RELEASE_TO_PUBLIC=1 -DCMAKE_PREFIX_PATH="$DEPS/usr/local" -DCMAKE_INSTALL_PREFIX="$PWD/OrcaSlicer" -DCMAKE_BUILD_TYPE=Release -DCMAKE_MACOSX_RPATH=ON -DCMAKE_INSTALL_RPATH="$DEPS/usr/local" -DCMAKE_MACOSX_BUNDLE=ON -DCMAKE_OSX_ARCHITECTURES=${ARCH}
|
cmake .. -GXcode -DBBL_RELEASE_TO_PUBLIC=1 -DCMAKE_PREFIX_PATH="$DEPS/usr/local" -DCMAKE_INSTALL_PREFIX="$PWD/OrcaSlicer" -DCMAKE_BUILD_TYPE=Release -DCMAKE_MACOSX_RPATH=ON -DCMAKE_INSTALL_RPATH="$DEPS/usr/local" -DCMAKE_MACOSX_BUNDLE=ON -DCMAKE_OSX_ARCHITECTURES=${ARCH}
|
||||||
cmake --build . --config Release --target ALL_BUILD
|
cmake --build . --config Release --target ALL_BUILD
|
||||||
mkdir -p OrcaSlicer
|
mkdir -p OrcaSlicer
|
||||||
|
|||||||
@@ -3,17 +3,17 @@ cd deps
|
|||||||
mkdir build
|
mkdir build
|
||||||
cd build
|
cd build
|
||||||
set DEPS=%CD%/OrcaSlicer_dep
|
set DEPS=%CD%/OrcaSlicer_dep
|
||||||
if "%1"=="studio" (
|
if "%1"=="slicer" (
|
||||||
GOTO :studio
|
GOTO :slicer
|
||||||
)
|
)
|
||||||
echo "building deps.."
|
echo "building deps.."
|
||||||
cmake ../ -G "Visual Studio 17 2022" -A x64 -DDESTDIR="%CD%/OrcaSlicer_dep" -DCMAKE_BUILD_TYPE=Release
|
cmake ../ -G "Visual Studio 17 2022" -A x64 -DDESTDIR="%CD%/OrcaSlicer_dep" -DCMAKE_BUILD_TYPE=Release
|
||||||
cmake --build . --config Release --target ALL_BUILD -- -m
|
cmake --build . --config Release --target deps -- -m
|
||||||
|
|
||||||
if "%1"=="deps" exit /b 0
|
if "%1"=="deps" exit /b 0
|
||||||
|
|
||||||
:studio
|
:slicer
|
||||||
echo "building studio..."
|
echo "building Orca Slicer..."
|
||||||
cd %WP%
|
cd %WP%
|
||||||
mkdir build
|
mkdir build
|
||||||
cd build
|
cd build
|
||||||
|
|||||||
@@ -1,23 +0,0 @@
|
|||||||
set WP=%CD%
|
|
||||||
cd deps
|
|
||||||
mkdir build
|
|
||||||
cd build
|
|
||||||
set DEPS=%CD%/OrcaSlicer_dep
|
|
||||||
if "%1"=="studio" (
|
|
||||||
GOTO :studio
|
|
||||||
)
|
|
||||||
echo "building deps.."
|
|
||||||
cmake ../ -G "Visual Studio 16 2019" -DDESTDIR="%CD%/OrcaSlicer_dep" -DCMAKE_BUILD_TYPE=Release
|
|
||||||
cmake --build . --config Release --target ALL_BUILD -- -m
|
|
||||||
|
|
||||||
if "%1"=="deps" exit /b 0
|
|
||||||
|
|
||||||
:studio
|
|
||||||
echo "building studio..."
|
|
||||||
cd %WP%
|
|
||||||
mkdir build
|
|
||||||
cd build
|
|
||||||
|
|
||||||
cmake .. -G "Visual Studio 16 2019" -DBBL_RELEASE_TO_PUBLIC=1 -DCMAKE_PREFIX_PATH="%DEPS%/usr/local" -DCMAKE_INSTALL_PREFIX="./OrcaSlicer" -DCMAKE_BUILD_TYPE=Release -DWIN10SDK_PATH="C:/Program Files (x86)/Windows Kits/10/Include/10.0.19041.0"
|
|
||||||
cmake --build . --config RelWithDebInfo --target ALL_BUILD -- -m
|
|
||||||
@REM cmake --build . --target install --config RelWithDebInfo
|
|
||||||
495
build_win.bat
@@ -1,495 +0,0 @@
|
|||||||
@setlocal disableDelayedExpansion enableExtensions
|
|
||||||
@IF "%PS_ECHO_ON%" NEQ "" (echo on) ELSE (echo off)
|
|
||||||
@GOTO :MAIN
|
|
||||||
:HELP
|
|
||||||
@ECHO.
|
|
||||||
@ECHO Performs initial build or rebuild of the app (build) and deps (build/deps).
|
|
||||||
@ECHO Default options are determined from build directories and system state.
|
|
||||||
@ECHO.
|
|
||||||
@ECHO Usage: build_win [-ARCH ^<arch^>] [-CONFIG ^<config^>] [-VERSION ^<version^>]
|
|
||||||
@ECHO [-PRODUCT ^<product^>] [-DESTDIR ^<directory^>]
|
|
||||||
@ECHO [-STEPS ^<all^|all-dirty^|app^|app-dirty^|deps^|deps-dirty^>]
|
|
||||||
@ECHO [-RUN ^<console^|custom^|none^|viewer^|window^>]
|
|
||||||
@ECHO.
|
|
||||||
@ECHO -a -ARCH Target processor architecture
|
|
||||||
@ECHO Default: %PS_ARCH_HOST%
|
|
||||||
@ECHO -c -CONFIG MSVC project config
|
|
||||||
@ECHO Default: %PS_CONFIG_DEFAULT%
|
|
||||||
@ECHO -v -VERSION Major version number of MSVC installation to use for build
|
|
||||||
@ECHO Default: %PS_VERSION_SUPPORTED%
|
|
||||||
@ECHO -p -PRODUCT Product ID of MSVC installation to use for build
|
|
||||||
@ECHO Default: %PS_PRODUCT_DEFAULT%
|
|
||||||
@ECHO -s -STEPS Performs only the specified build steps:
|
|
||||||
@ECHO all - clean and build deps and app
|
|
||||||
@ECHO all-dirty - build deps and app without cleaning
|
|
||||||
@ECHO app - clean and build main applications
|
|
||||||
@ECHO app-dirty - build main applications without cleaning
|
|
||||||
@ECHO deps - clean and build deps
|
|
||||||
@ECHO deps-dirty - build deps without cleaning
|
|
||||||
@ECHO Default: %PS_STEPS_DEFAULT%
|
|
||||||
@ECHO -r -RUN Specifies what to perform at the run step:
|
|
||||||
@ECHO console - run and wait on orca-slicer-console.exe
|
|
||||||
@ECHO custom - run and wait on your custom build/%PS_CUSTOM_RUN_FILE%
|
|
||||||
@ECHO ide - open project in Visual Studio if not open (no wait)
|
|
||||||
@ECHO none - run step does nothing
|
|
||||||
@ECHO viewer - run bambu-gcodeviewer.exe (no wait)
|
|
||||||
@ECHO window - run orca-slicer.exe (no wait)
|
|
||||||
@ECHO Default: none
|
|
||||||
@ECHO -d -DESTDIR Deps destination directory
|
|
||||||
@ECHO Warning: Changing destdir path will not delete the old destdir.
|
|
||||||
@ECHO Default: %PS_DESTDIR_DEFAULT_MSG%
|
|
||||||
@ECHO.
|
|
||||||
@ECHO Examples:
|
|
||||||
@ECHO.
|
|
||||||
@ECHO Initial build: build_win -d "c:\src\BambuSlicer-deps"
|
|
||||||
@ECHO Build post deps change: build_win -s all
|
|
||||||
@ECHO App dirty build: build_win
|
|
||||||
@ECHO App dirty build ^& run: build_win -r console
|
|
||||||
@ECHO All clean build ^& run: build_win -s all -r console -d "deps\build\out_deps"
|
|
||||||
@ECHO.
|
|
||||||
GOTO :END
|
|
||||||
|
|
||||||
:MAIN
|
|
||||||
REM Script constants
|
|
||||||
SET START_TIME=%TIME%
|
|
||||||
SET PS_START_DIR=%CD%
|
|
||||||
SET PS_SOLUTION_NAME=BambuStudio
|
|
||||||
SET PS_CHOICE_TIMEOUT=30
|
|
||||||
SET PS_CUSTOM_RUN_FILE=custom_run.bat
|
|
||||||
SET PS_DEPS_PATH_FILE_NAME=.DEPS_PATH.txt
|
|
||||||
SET PS_DEPS_PATH_FILE=%~dp0deps\build\%PS_DEPS_PATH_FILE_NAME%
|
|
||||||
SET PS_CONFIG_LIST="Debug;MinSizeRel;Release;RelWithDebInfo"
|
|
||||||
|
|
||||||
REM The officially supported toolchain version is 16 (Visual Studio 2019)
|
|
||||||
REM TODO: Update versions after Boost gets rolled to 1.78 or later
|
|
||||||
SET PS_VERSION_SUPPORTED=16
|
|
||||||
SET PS_VERSION_EXCEEDED=17
|
|
||||||
SET VSWHERE=%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe
|
|
||||||
IF NOT EXIST "%VSWHERE%" SET VSWHERE=%ProgramFiles%\Microsoft Visual Studio\Installer\vswhere.exe
|
|
||||||
FOR /F "tokens=4 USEBACKQ delims=." %%I IN (`"%VSWHERE%" -nologo -property productId`) DO SET PS_PRODUCT_DEFAULT=%%I
|
|
||||||
IF "%PS_PRODUCT_DEFAULT%" EQU "" (
|
|
||||||
SET EXIT_STATUS=-1
|
|
||||||
@ECHO ERROR: No Visual Studio installation found. 1>&2
|
|
||||||
GOTO :HELP
|
|
||||||
)
|
|
||||||
REM Default to the latest supported version if multiple are available
|
|
||||||
FOR /F "tokens=1 USEBACKQ delims=." %%I IN (
|
|
||||||
`^""%VSWHERE%" -version "[%PS_VERSION_SUPPORTED%,%PS_VERSION_EXCEEDED%)" -latest -nologo -property catalog_buildVersion^"`
|
|
||||||
) DO SET PS_VERSION_SUPPORTED=%%I
|
|
||||||
|
|
||||||
REM Probe build directories and system state for reasonable default arguments
|
|
||||||
pushd %~dp0
|
|
||||||
SET PS_CONFIG=RelWithDebInfo
|
|
||||||
SET PS_ARCH=%PROCESSOR_ARCHITECTURE:amd64=x64%
|
|
||||||
CALL :TOLOWER PS_ARCH
|
|
||||||
SET PS_RUN=none
|
|
||||||
SET PS_DESTDIR=
|
|
||||||
SET PS_VERSION=
|
|
||||||
SET PS_PRODUCT=%PS_PRODUCT_DEFAULT%
|
|
||||||
CALL :RESOLVE_DESTDIR_CACHE
|
|
||||||
|
|
||||||
REM Set up parameters used by help menu
|
|
||||||
SET EXIT_STATUS=0
|
|
||||||
SET PS_CONFIG_DEFAULT=%PS_CONFIG%
|
|
||||||
SET PS_ARCH_HOST=%PS_ARCH%
|
|
||||||
(echo " -help /help -h /h -? /? ")| findstr /I /C:" %~1 ">nul && GOTO :HELP
|
|
||||||
|
|
||||||
REM Parse arguments
|
|
||||||
SET EXIT_STATUS=1
|
|
||||||
SET PS_CURRENT_STEP=arguments
|
|
||||||
SET PARSER_STATE=
|
|
||||||
SET PARSER_FAIL=
|
|
||||||
FOR %%I in (%*) DO CALL :PARSE_OPTION "ARCH CONFIG DESTDIR STEPS RUN VERSION PRODUCT" PARSER_STATE "%%~I"
|
|
||||||
IF "%PARSER_FAIL%" NEQ "" (
|
|
||||||
@ECHO ERROR: Invalid switch: %PARSER_FAIL% 1>&2
|
|
||||||
GOTO :HELP
|
|
||||||
)ELSE IF "%PARSER_STATE%" NEQ "" (
|
|
||||||
@ECHO ERROR: Missing parameter for: %PARSER_STATE% 1>&2
|
|
||||||
GOTO :HELP
|
|
||||||
)
|
|
||||||
|
|
||||||
REM Validate arguments
|
|
||||||
SET PS_ASK_TO_CONTINUE=
|
|
||||||
CALL :TOLOWER PS_ARCH
|
|
||||||
SET PS_ARCH=%PS_ARCH:amd64=x64%
|
|
||||||
CALL :PARSE_OPTION_VALUE %PS_CONFIG_LIST:;= % PS_CONFIG
|
|
||||||
IF "%PS_CONFIG%" EQU "" GOTO :HELP
|
|
||||||
REM RESOLVE_DESTDIR_CACHE must go after PS_ARCH and PS_CONFIG, but before PS STEPS
|
|
||||||
CALL :RESOLVE_DESTDIR_CACHE
|
|
||||||
IF "%PS_STEPS%" EQU "" SET PS_STEPS=%PS_STEPS_DEFAULT%
|
|
||||||
CALL :PARSE_OPTION_VALUE "all all-dirty deps-dirty deps app-dirty app app-cmake" PS_STEPS
|
|
||||||
IF "%PS_STEPS%" EQU "" GOTO :HELP
|
|
||||||
(echo %PS_STEPS%)| findstr /I /C:"dirty">nul && SET PS_STEPS_DIRTY=1 || SET PS_STEPS_DIRTY=
|
|
||||||
IF "%PS_STEPS%" EQU "app-cmake" SET PS_STEPS_DIRTY=1
|
|
||||||
IF "%PS_DESTDIR%" EQU "" SET PS_DESTDIR=%PS_DESTDIR_CACHED%
|
|
||||||
IF "%PS_DESTDIR%" EQU "" (
|
|
||||||
@ECHO ERROR: Parameter required: -DESTDIR 1>&2
|
|
||||||
GOTO :HELP
|
|
||||||
)
|
|
||||||
CALL :CANONICALIZE_PATH PS_DESTDIR "%PS_START_DIR%"
|
|
||||||
IF "%PS_DESTDIR%" NEQ "%PS_DESTDIR_CACHED%" (
|
|
||||||
(echo "all deps all-dirty deps-dirty")| findstr /I /C:"%PS_STEPS%">nul || (
|
|
||||||
IF EXIST "%PS_DESTDIR%" (
|
|
||||||
@ECHO WARNING: DESTDIR does not match cache: 1>&2
|
|
||||||
@ECHO WARNING: new: %PS_DESTDIR% 1>&2
|
|
||||||
@ECHO WARNING: old: %PS_DESTDIR_CACHED% 1>&2
|
|
||||||
SET PS_ASK_TO_CONTINUE=1
|
|
||||||
) ELSE (
|
|
||||||
@ECHO ERROR: Invalid parameter: DESTDIR=%PS_DESTDIR% 1>&2
|
|
||||||
GOTO :HELP
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
SET PS_DESTDIR_DEFAULT_MSG=
|
|
||||||
CALL :PARSE_OPTION_VALUE "console custom ide none viewer window" PS_RUN
|
|
||||||
IF "%PS_RUN%" EQU "" GOTO :HELP
|
|
||||||
IF "%PS_RUN%" NEQ "none" IF "%PS_STEPS:~0,4%" EQU "deps" (
|
|
||||||
@ECHO ERROR: RUN=%PS_RUN% specified with STEPS=%PS_STEPS%
|
|
||||||
@ECHO ERROR: RUN=none is the only valid option for STEPS "deps" or "deps-dirty"
|
|
||||||
GOTO :HELP
|
|
||||||
)
|
|
||||||
IF DEFINED PS_VERSION (
|
|
||||||
SET /A PS_VERSION_EXCEEDED=%PS_VERSION% + 1
|
|
||||||
) ELSE SET PS_VERSION=%PS_VERSION_SUPPORTED%
|
|
||||||
SET MSVC_FILTER=-products Microsoft.VisualStudio.Product.%PS_PRODUCT% -version "[%PS_VERSION%,%PS_VERSION_EXCEEDED%)"
|
|
||||||
FOR /F "tokens=* USEBACKQ" %%I IN (`^""%VSWHERE%" %MSVC_FILTER% -nologo -property installationPath^"`) DO SET MSVC_DIR=%%I
|
|
||||||
IF NOT EXIST "%MSVC_DIR%" (
|
|
||||||
@ECHO ERROR: Compatible Visual Studio installation not found. 1>&2
|
|
||||||
GOTO :HELP
|
|
||||||
)
|
|
||||||
REM Give the user a chance to cancel if we found something odd.
|
|
||||||
IF "%PS_ASK_TO_CONTINUE%" EQU "" GOTO :BUILD_ENV
|
|
||||||
@ECHO.
|
|
||||||
@ECHO Unexpected parameters detected. Build paused for %PS_CHOICE_TIMEOUT% seconds.
|
|
||||||
choice /T %PS_CHOICE_TIMEOUT% /C YN /D N /M "Continue"
|
|
||||||
IF %ERRORLEVEL% NEQ 1 GOTO :HELP
|
|
||||||
|
|
||||||
REM Set up MSVC environment
|
|
||||||
:BUILD_ENV
|
|
||||||
SET EXIT_STATUS=2
|
|
||||||
SET PS_CURRENT_STEP=environment
|
|
||||||
@ECHO **********************************************************************
|
|
||||||
@ECHO ** Build Config: %PS_CONFIG%
|
|
||||||
@ECHO ** Target Arch: %PS_ARCH%
|
|
||||||
@ECHO ** Build Steps: %PS_STEPS%
|
|
||||||
@ECHO ** Run App: %PS_RUN%
|
|
||||||
@ECHO ** Deps path: %PS_DESTDIR%
|
|
||||||
@ECHO ** Using Microsoft Visual Studio installation found at:
|
|
||||||
@ECHO ** %MSVC_DIR%
|
|
||||||
CALL "%MSVC_DIR%\Common7\Tools\vsdevcmd.bat" -arch=%PS_ARCH% -host_arch=%PS_ARCH_HOST% -app_platform=Desktop
|
|
||||||
IF %ERRORLEVEL% NEQ 0 GOTO :END
|
|
||||||
REM Need to reset the echo state after vsdevcmd.bat clobbers it.
|
|
||||||
@IF "%PS_ECHO_ON%" NEQ "" (echo on) ELSE (echo off)
|
|
||||||
IF "%PS_DRY_RUN_ONLY%" NEQ "" (
|
|
||||||
@ECHO Script terminated early because PS_DRY_RUN_ONLY is set. 1>&2
|
|
||||||
GOTO :END
|
|
||||||
)
|
|
||||||
IF /I "%PS_STEPS:~0,3%" EQU "app" GOTO :BUILD_APP
|
|
||||||
|
|
||||||
REM Build deps
|
|
||||||
:BUILD_DEPS
|
|
||||||
SET EXIT_STATUS=3
|
|
||||||
SET PS_CURRENT_STEP=deps
|
|
||||||
IF "%PS_STEPS_DIRTY%" EQU "" (
|
|
||||||
CALL :MAKE_OR_CLEAN_DIRECTORY deps\build "%PS_DEPS_PATH_FILE_NAME%" .vs
|
|
||||||
CALL :MAKE_OR_CLEAN_DIRECTORY "%PS_DESTDIR%"
|
|
||||||
)
|
|
||||||
cd deps\build || GOTO :END
|
|
||||||
cmake.exe .. -DDESTDIR="%PS_DESTDIR%"
|
|
||||||
IF %ERRORLEVEL% NEQ 0 IF "%PS_STEPS_DIRTY%" NEQ "" (
|
|
||||||
(del CMakeCache.txt && cmake.exe .. -DDESTDIR="%PS_DESTDIR%") || GOTO :END
|
|
||||||
) ELSE GOTO :END
|
|
||||||
(echo %PS_DESTDIR%)> "%PS_DEPS_PATH_FILE%"
|
|
||||||
msbuild /m ALL_BUILD.vcxproj /p:Configuration=%PS_CONFIG% /v:quiet || GOTO :END
|
|
||||||
cd ..\..
|
|
||||||
IF /I "%PS_STEPS:~0,4%" EQU "deps" GOTO :RUN_APP
|
|
||||||
|
|
||||||
REM Build app
|
|
||||||
:BUILD_APP
|
|
||||||
SET EXIT_STATUS=4
|
|
||||||
SET PS_CURRENT_STEP=app
|
|
||||||
IF "%PS_STEPS_DIRTY%" EQU "" CALL :MAKE_OR_CLEAN_DIRECTORY build "%PS_CUSTOM_RUN_FILE%" .vs
|
|
||||||
cd build || GOTO :END
|
|
||||||
REM Make sure we have a custom batch file skeleton for the run stage
|
|
||||||
set PS_CUSTOM_BAT=%PS_CUSTOM_RUN_FILE%
|
|
||||||
CALL :CANONICALIZE_PATH PS_CUSTOM_BAT
|
|
||||||
IF NOT EXIST %PS_CUSTOM_BAT% CALL :WRITE_CUSTOM_SCRIPT_SKELETON %PS_CUSTOM_BAT%
|
|
||||||
SET PS_PROJECT_IS_OPEN=
|
|
||||||
FOR /F "tokens=2 delims=," %%I in (
|
|
||||||
'tasklist /V /FI "IMAGENAME eq devenv.exe " /NH /FO CSV ^| find "%PS_SOLUTION_NAME%"'
|
|
||||||
) do SET PS_PROJECT_IS_OPEN=%%~I
|
|
||||||
cmake.exe .. -DCMAKE_PREFIX_PATH="%PS_DESTDIR%\usr\local" -DCMAKE_CONFIGURATION_TYPES=%PS_CONFIG_LIST%
|
|
||||||
IF %ERRORLEVEL% NEQ 0 IF "%PS_STEPS_DIRTY%" NEQ "" (
|
|
||||||
(del CMakeCache.txt && cmake.exe .. -DCMAKE_PREFIX_PATH="%PS_DESTDIR%\usr\local" -DCMAKE_CONFIGURATION_TYPES=%PS_CONFIG_LIST%) || GOTO :END
|
|
||||||
) ELSE GOTO :END
|
|
||||||
REM Skip the build step if we're using the undocumented app-cmake to regenerate the full config from inside devenv
|
|
||||||
IF "%PS_STEPS%" NEQ "app-cmake" msbuild /m ALL_BUILD.vcxproj /p:Configuration=%PS_CONFIG% /v:quiet || GOTO :END
|
|
||||||
(echo %PS_DESTDIR%)> "%PS_DEPS_PATH_FILE_FOR_CONFIG%"
|
|
||||||
|
|
||||||
REM Run app
|
|
||||||
:RUN_APP
|
|
||||||
REM All build steps complete.
|
|
||||||
CALL :DIFF_TIME ELAPSED_TIME %START_TIME% %TIME%
|
|
||||||
IF "%PS_CURRENT_STEP%" NEQ "arguments" (
|
|
||||||
@ECHO.
|
|
||||||
@ECHO Total Build Time Elapsed %ELAPSED_TIME%
|
|
||||||
)
|
|
||||||
SET EXIT_STATUS=5
|
|
||||||
SET PS_CURRENT_STEP=run
|
|
||||||
IF "%PS_RUN%" EQU "none" GOTO :PROLOGUE
|
|
||||||
cd src\%PS_CONFIG% || GOTO :END
|
|
||||||
SET PS_PROJECT_IS_OPEN=
|
|
||||||
FOR /F "tokens=2 delims=," %%I in (
|
|
||||||
'tasklist /V /FI "IMAGENAME eq devenv.exe " /NH /FO CSV ^| find "%PS_SOLUTION_NAME%"'
|
|
||||||
) do SET PS_PROJECT_IS_OPEN=%%~I
|
|
||||||
@ECHO.
|
|
||||||
@ECHO Running %PS_RUN% application...
|
|
||||||
@REM icacls below is just a hack for file-not-found error handling
|
|
||||||
IF "%PS_RUN%" EQU "console" (
|
|
||||||
icacls orca-slicer-console.exe >nul || GOTO :END
|
|
||||||
start /wait /b orca-slicer-console.exe
|
|
||||||
) ELSE IF "%PS_RUN%" EQU "window" (
|
|
||||||
icacls orca-slicer.exe >nul || GOTO :END
|
|
||||||
start orca-slicer.exe
|
|
||||||
) ELSE IF "%PS_RUN%" EQU "viewer" (
|
|
||||||
icacls bambu-gcodeviewer.exe >nul || GOTO :END
|
|
||||||
start bambu-gcodeviewer.exe
|
|
||||||
) ELSE IF "%PS_RUN%" EQU "custom" (
|
|
||||||
icacls %PS_CUSTOM_BAT% >nul || GOTO :END
|
|
||||||
CALL %PS_CUSTOM_BAT%
|
|
||||||
) ELSE IF "%PS_RUN%" EQU "ide" (
|
|
||||||
IF "%PS_PROJECT_IS_OPEN%" NEQ "" (
|
|
||||||
@ECHO WARNING: Solution is already open in Visual Studio. Skipping ide run step. 1>&2
|
|
||||||
) ELSE (
|
|
||||||
@ECHO Preparing to run Visual Studio...
|
|
||||||
cd ..\.. || GOTO :END
|
|
||||||
REM This hack generates a single config for MSVS, guaranteeing it gets set as the active config.
|
|
||||||
cmake.exe .. -DCMAKE_PREFIX_PATH="%PS_DESTDIR%\usr\local" -DCMAKE_CONFIGURATION_TYPES=%PS_CONFIG% > nul 2> nul || GOTO :END
|
|
||||||
REM Now launch devenv with the single config (setting it active) and a /command switch to re-run cmake and generate the full config list
|
|
||||||
start devenv.exe %PS_SOLUTION_NAME%.sln /command ^"shell /o ^^^"%~f0^^^" -d ^^^"%PS_DESTDIR%^^^" -c %PS_CONFIG% -a %PS_ARCH% -r none -s app-cmake^"
|
|
||||||
REM If devenv fails to launch just directly regenerate the full config list.
|
|
||||||
IF %ERRORLEVEL% NEQ 0 (
|
|
||||||
cmake.exe .. -DCMAKE_PREFIX_PATH="%PS_DESTDIR%\usr\local" -DCMAKE_CONFIGURATION_TYPES=%PS_CONFIG_LIST% 2> nul 1> nul || GOTO :END
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
@REM ********** DON'T ADD ANY CODE BETWEEN THESE TWO SECTIONS **********
|
|
||||||
@REM RUN_APP may hand off control, so let exit codes fall through to PROLOGUE.
|
|
||||||
|
|
||||||
:PROLOGUE
|
|
||||||
SET EXIT_STATUS=%ERRORLEVEL%
|
|
||||||
:END
|
|
||||||
@IF "%PS_ECHO_ON%%PS_DRY_RUN_ONLY%" NEQ "" (
|
|
||||||
@ECHO **********************************************************************
|
|
||||||
@ECHO ** Script Parameters:
|
|
||||||
@ECHO **********************************************************************
|
|
||||||
@SET PS_
|
|
||||||
)
|
|
||||||
IF "%EXIT_STATUS%" NEQ "0" (
|
|
||||||
IF "%PS_CURRENT_STEP%" NEQ "arguments" (
|
|
||||||
@ECHO.
|
|
||||||
@ECHO ERROR: *** Build process failed at %PS_CURRENT_STEP% step. *** 1>&2
|
|
||||||
)
|
|
||||||
) ELSE (
|
|
||||||
@ECHO All steps completed successfully.
|
|
||||||
)
|
|
||||||
popd
|
|
||||||
exit /B %EXIT_STATUS%
|
|
||||||
|
|
||||||
GOTO :EOF
|
|
||||||
REM Functions and stubs start here.
|
|
||||||
|
|
||||||
:RESOLVE_DESTDIR_CACHE
|
|
||||||
@REM Resolves all DESTDIR cache values and sets PS_STEPS_DEFAULT
|
|
||||||
@REM Note: This just sets global variables, so it doesn't use setlocal.
|
|
||||||
SET PS_DEPS_PATH_FILE_FOR_CONFIG=%~dp0build\.vs\%PS_ARCH%\%PS_CONFIG%\%PS_DEPS_PATH_FILE_NAME%
|
|
||||||
mkdir "%~dp0build\.vs\%PS_ARCH%\%PS_CONFIG%" > nul 2> nul
|
|
||||||
REM Copy a legacy file if we don't have one in the proper location.
|
|
||||||
echo f|xcopy /D "%~dp0build\%PS_ARCH%\%PS_CONFIG%\%PS_DEPS_PATH_FILE_NAME%" "%PS_DEPS_PATH_FILE_FOR_CONFIG%" > nul 2> nul
|
|
||||||
CALL :CANONICALIZE_PATH PS_DEPS_PATH_FILE_FOR_CONFIG
|
|
||||||
IF EXIST "%PS_DEPS_PATH_FILE_FOR_CONFIG%" (
|
|
||||||
FOR /F "tokens=* USEBACKQ" %%I IN ("%PS_DEPS_PATH_FILE_FOR_CONFIG%") DO (
|
|
||||||
SET PS_DESTDIR_CACHED=%%I
|
|
||||||
SET PS_DESTDIR_DEFAULT_MSG=%%I
|
|
||||||
)
|
|
||||||
SET PS_STEPS_DEFAULT=app-dirty
|
|
||||||
) ELSE IF EXIST "%PS_DEPS_PATH_FILE%" (
|
|
||||||
FOR /F "tokens=* USEBACKQ" %%I IN ("%PS_DEPS_PATH_FILE%") DO (
|
|
||||||
SET PS_DESTDIR_CACHED=%%I
|
|
||||||
SET PS_DESTDIR_DEFAULT_MSG=%%I
|
|
||||||
)
|
|
||||||
SET PS_STEPS_DEFAULT=app
|
|
||||||
) ELSE (
|
|
||||||
SET PS_DESTDIR_CACHED=
|
|
||||||
SET PS_DESTDIR_DEFAULT_MSG=Cache missing. Argument required.
|
|
||||||
SET PS_STEPS_DEFAULT=all
|
|
||||||
)
|
|
||||||
GOTO :EOF
|
|
||||||
|
|
||||||
:PARSE_OPTION
|
|
||||||
@REM Argument parser called for each argument
|
|
||||||
@REM %1 - Valid option list
|
|
||||||
@REM %2 - Variable name for parser state; must be unset when parsing finished
|
|
||||||
@REM %3 - Current argument value
|
|
||||||
@REM PARSER_FAIL will be set on an error
|
|
||||||
@REM Note: Must avoid delayed expansion since filenames may contain ! character
|
|
||||||
setlocal disableDelayedExpansion
|
|
||||||
IF "%PARSER_FAIL%" NEQ "" GOTO :EOF
|
|
||||||
CALL SET LAST_ARG=%%%2%%
|
|
||||||
IF "%LAST_ARG%" EQU "" (
|
|
||||||
CALL :PARSE_OPTION_NAME %1 %~2 %~3 1
|
|
||||||
SET ARG_TYPE=NAME
|
|
||||||
) ELSE (
|
|
||||||
SET PS_SET_COMMAND=SET PS_%LAST_ARG%=%~3
|
|
||||||
SET ARG_TYPE=LAST_ARG
|
|
||||||
SET %~2=
|
|
||||||
)
|
|
||||||
CALL SET LAST_ARG=%%%2%%
|
|
||||||
IF "%LAST_ARG%%ARG_TYPE%" EQU "NAME" SET PARSER_FAIL=%~3
|
|
||||||
(
|
|
||||||
endlocal
|
|
||||||
SET PARSER_FAIL=%PARSER_FAIL%
|
|
||||||
SET %~2=%LAST_ARG%
|
|
||||||
%PS_SET_COMMAND%
|
|
||||||
)
|
|
||||||
GOTO :EOF
|
|
||||||
|
|
||||||
:PARSE_OPTION_VALUE
|
|
||||||
setlocal disableDelayedExpansion
|
|
||||||
@REM Parses value and verifies it is within the supplied list
|
|
||||||
@REM %1 - Valid option list
|
|
||||||
@REM %2 - In/out variable name; unset on error
|
|
||||||
CALL SET NAME=%~2
|
|
||||||
CALL SET SAVED_VALUE=%%%NAME%%%
|
|
||||||
CALL :PARSE_OPTION_NAME %1 %NAME% -%SAVED_VALUE%
|
|
||||||
CALL SET NEW_VALUE=%%%NAME%%%
|
|
||||||
IF "%NEW_VALUE%" EQU "" (
|
|
||||||
@ECHO ERROR: Invalid parameter: %NAME:~3%=%SAVED_VALUE% 1>&2
|
|
||||||
)
|
|
||||||
endlocal & SET %NAME%=%NEW_VALUE%
|
|
||||||
GOTO :EOF
|
|
||||||
|
|
||||||
:PARSE_OPTION_NAME
|
|
||||||
@REM Parses an option name
|
|
||||||
@REM %1 - Valid option list
|
|
||||||
@REM %2 - Out variable name; unset on error
|
|
||||||
@REM %3 - Current argument value
|
|
||||||
@REM %4 - Boolean indicating single character switches are valid
|
|
||||||
@REM Note: Delayed expansion safe because ! character is invalid in option name
|
|
||||||
setlocal enableDelayedExpansion
|
|
||||||
IF "%4" NEQ "" FOR %%I IN (%~1) DO @(
|
|
||||||
SET SHORT_NAME=%%~I
|
|
||||||
SET SHORT_ARG_!SHORT_NAME:~0,1!=%%~I
|
|
||||||
)
|
|
||||||
@SET OPTION_NAME=%~3
|
|
||||||
@(echo %OPTION_NAME%)| findstr /R /C:"[-/]..*">nul || GOTO :PARSE_OPTION_NAME_FAIL
|
|
||||||
@SET OPTION_NAME=%OPTION_NAME:~1%
|
|
||||||
IF "%4" NEQ "" (
|
|
||||||
IF "%OPTION_NAME%" EQU "%OPTION_NAME:~0,1%" (
|
|
||||||
IF "!SHORT_ARG_%OPTION_NAME:~0,1%!" NEQ "" SET OPTION_NAME=!SHORT_ARG_%OPTION_NAME:~0,1%!
|
|
||||||
)
|
|
||||||
)
|
|
||||||
@(echo %OPTION_NAME%)| findstr /R /C:".[ ][ ]*.">nul && GOTO :PARSE_OPTION_NAME_FAIL
|
|
||||||
@(echo %~1 )| findstr /I /C:" %OPTION_NAME% ">nul || GOTO :PARSE_OPTION_NAME_FAIL
|
|
||||||
FOR %%I IN (%~1) DO SET OPTION_NAME=!OPTION_NAME:%%~I=%%~I!
|
|
||||||
endlocal & SET %~2=%OPTION_NAME%
|
|
||||||
GOTO :EOF
|
|
||||||
:PARSE_OPTION_NAME_FAIL
|
|
||||||
endlocal & SET %~2=
|
|
||||||
GOTO :EOF
|
|
||||||
|
|
||||||
:MAKE_OR_CLEAN_DIRECTORY
|
|
||||||
@REM Create directory if it doesn't exist or clean it if it does
|
|
||||||
@REM %1 - Directory path to clean or create
|
|
||||||
@REM %* - Optional list of files/dirs to keep (in the base directory only)
|
|
||||||
setlocal disableDelayedExpansion
|
|
||||||
IF NOT EXIST "%~1" (
|
|
||||||
@ECHO Creating %~1
|
|
||||||
mkdir "%~1" && (
|
|
||||||
endlocal
|
|
||||||
GOTO :EOF
|
|
||||||
)
|
|
||||||
)
|
|
||||||
@ECHO Cleaning %~1 ...
|
|
||||||
SET KEEP_LIST=
|
|
||||||
:MAKE_OR_CLEAN_DIRECTORY_ARG_LOOP
|
|
||||||
IF "%~2" NEQ "" (
|
|
||||||
SET KEEP_LIST=%KEEP_LIST% "%~2"
|
|
||||||
SHIFT /2
|
|
||||||
GOTO :MAKE_OR_CLEAN_DIRECTORY_ARG_LOOP
|
|
||||||
)
|
|
||||||
for /F "usebackq delims=" %%I in (`dir /a /b "%~1"`) do (
|
|
||||||
(echo %KEEP_LIST%)| findstr /I /L /C:"\"%%I\"">nul || (
|
|
||||||
rmdir /s /q "%~1\%%I" 2>nul ) || del /q /f "%~1\%%I"
|
|
||||||
)
|
|
||||||
endlocal
|
|
||||||
GOTO :EOF
|
|
||||||
|
|
||||||
:TOLOWER
|
|
||||||
@REM Converts supplied environment variable to lowercase
|
|
||||||
@REM %1 - Input/output variable name
|
|
||||||
@REM Note: This is slow on very long strings, but is used only on very short ones
|
|
||||||
setlocal disableDelayedExpansion
|
|
||||||
@FOR %%b IN (a b c d e f g h i j k l m n o p q r s t u v w x y z) DO @CALL set %~1=%%%1:%%b=%%b%%
|
|
||||||
@CALL SET OUTPUT=%%%~1%%
|
|
||||||
endlocal & SET %~1=%OUTPUT%
|
|
||||||
GOTO :EOF
|
|
||||||
|
|
||||||
:CANONICALIZE_PATH
|
|
||||||
@REM Canonicalizes the path in the supplied variable
|
|
||||||
@REM %1 - Input/output variable containing path to canonicalize
|
|
||||||
@REM %2 - Optional base directory
|
|
||||||
setlocal
|
|
||||||
CALL :CANONICALIZE_PATH_INNER %1 %%%~1%% %2
|
|
||||||
endlocal & SET %~1=%OUTPUT%
|
|
||||||
GOTO :EOF
|
|
||||||
:CANONICALIZE_PATH_INNER
|
|
||||||
if "%~3" NEQ "" (pushd %3 || GOTO :EOF)
|
|
||||||
SET OUTPUT=%~f2
|
|
||||||
if "%~3" NEQ "" popd
|
|
||||||
GOTO :EOF
|
|
||||||
|
|
||||||
:DIFF_TIME
|
|
||||||
@REM Calculates elapsed time between two timestamps (TIME environment variable format)
|
|
||||||
@REM %1 - Output variable
|
|
||||||
@REM %2 - Start time
|
|
||||||
@REM %3 - End time
|
|
||||||
setlocal EnableDelayedExpansion
|
|
||||||
set START_ARG=%2
|
|
||||||
set END_ARG=%3
|
|
||||||
set END=!END_ARG:%TIME:~8,1%=%%100)*100+1!
|
|
||||||
set START=!START_ARG:%TIME:~8,1%=%%100)*100+1!
|
|
||||||
set /A DIFF=((((10!END:%TIME:~2,1%=%%100)*60+1!%%100)-((((10!START:%TIME:~2,1%=%%100)*60+1!%%100), DIFF-=(DIFF^>^>31)*24*60*60*100
|
|
||||||
set /A CC=DIFF%%100+100,DIFF/=100,SS=DIFF%%60+100,DIFF/=60,MM=DIFF%%60+100,HH=DIFF/60+100
|
|
||||||
@endlocal & set %1=%HH:~1%%TIME:~2,1%%MM:~1%%TIME:~2,1%%SS:~1%%TIME:~8,1%%CC:~1%
|
|
||||||
@GOTO :EOF
|
|
||||||
|
|
||||||
:WRITE_CUSTOM_SCRIPT_SKELETON
|
|
||||||
@REM Writes the following text to the supplied file
|
|
||||||
@REM %1 - Output filename
|
|
||||||
setlocal
|
|
||||||
@(
|
|
||||||
ECHO @ECHO.
|
|
||||||
ECHO @ECHO ********************************************************************************
|
|
||||||
ECHO @ECHO ** This is a custom run script skeleton.
|
|
||||||
ECHO @ECHO ********************************************************************************
|
|
||||||
ECHO @ECHO.
|
|
||||||
ECHO @ECHO ********************************************************************************
|
|
||||||
ECHO @ECHO ** The working directory is:
|
|
||||||
ECHO @ECHO ********************************************************************************
|
|
||||||
ECHO dir
|
|
||||||
ECHO @ECHO.
|
|
||||||
ECHO @ECHO ********************************************************************************
|
|
||||||
ECHO @ECHO ** The environment is:
|
|
||||||
ECHO @ECHO ********************************************************************************
|
|
||||||
ECHO set
|
|
||||||
ECHO @ECHO.
|
|
||||||
ECHO @ECHO ********************************************************************************
|
|
||||||
ECHO @ECHO ** Edit or replace this script to run custom steps after a successful build:
|
|
||||||
ECHO @ECHO ** %~1
|
|
||||||
ECHO @ECHO ********************************************************************************
|
|
||||||
ECHO @ECHO.
|
|
||||||
) > "%~1"
|
|
||||||
endlocal
|
|
||||||
GOTO :EOF
|
|
||||||
@@ -238,7 +238,8 @@ endif()
|
|||||||
set(OpenVDB_LIB_COMPONENTS "")
|
set(OpenVDB_LIB_COMPONENTS "")
|
||||||
set(OpenVDB_DEBUG_SUFFIX "d" CACHE STRING "Suffix for the debug libraries")
|
set(OpenVDB_DEBUG_SUFFIX "d" CACHE STRING "Suffix for the debug libraries")
|
||||||
|
|
||||||
get_property(_is_multi GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
|
# get_property(_is_multi GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
|
||||||
|
set(_is_multi FALSE)
|
||||||
|
|
||||||
foreach(COMPONENT ${OpenVDB_FIND_COMPONENTS})
|
foreach(COMPONENT ${OpenVDB_FIND_COMPONENTS})
|
||||||
set(LIB_NAME ${COMPONENT})
|
set(LIB_NAME ${COMPONENT})
|
||||||
|
|||||||
@@ -52,7 +52,7 @@
|
|||||||
<string>OBJ</string>
|
<string>OBJ</string>
|
||||||
</array>
|
</array>
|
||||||
<key>CFBundleTypeIconFile</key>
|
<key>CFBundleTypeIconFile</key>
|
||||||
<string>BambuStudio.icns</string>
|
<string>OrcaSlicer.icns</string>
|
||||||
<key>CFBundleTypeName</key>
|
<key>CFBundleTypeName</key>
|
||||||
<string>STL</string>
|
<string>STL</string>
|
||||||
<key>CFBundleTypeRole</key>
|
<key>CFBundleTypeRole</key>
|
||||||
@@ -69,7 +69,7 @@
|
|||||||
<string>AMF</string>
|
<string>AMF</string>
|
||||||
</array>
|
</array>
|
||||||
<key>CFBundleTypeIconFile</key>
|
<key>CFBundleTypeIconFile</key>
|
||||||
<string>BambuStudio.icns</string>
|
<string>OrcaSlicer.icns</string>
|
||||||
<key>CFBundleTypeName</key>
|
<key>CFBundleTypeName</key>
|
||||||
<string>AMF</string>
|
<string>AMF</string>
|
||||||
<key>CFBundleTypeRole</key>
|
<key>CFBundleTypeRole</key>
|
||||||
@@ -86,7 +86,7 @@
|
|||||||
<string>3MF</string>
|
<string>3MF</string>
|
||||||
</array>
|
</array>
|
||||||
<key>CFBundleTypeIconFile</key>
|
<key>CFBundleTypeIconFile</key>
|
||||||
<string>BambuStudio.icns</string>
|
<string>OrcaSlicer.icns</string>
|
||||||
<key>CFBundleTypeName</key>
|
<key>CFBundleTypeName</key>
|
||||||
<string>3MF</string>
|
<string>3MF</string>
|
||||||
<key>CFBundleTypeRole</key>
|
<key>CFBundleTypeRole</key>
|
||||||
|
|||||||
4
deps/Blosc/Blosc.cmake
vendored
@@ -7,7 +7,7 @@ else()
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(IS_CROSS_COMPILE AND APPLE)
|
if(IS_CROSS_COMPILE AND APPLE)
|
||||||
bambustudio_add_cmake_project(Blosc
|
orcaslicer_add_cmake_project(Blosc
|
||||||
#URL https://github.com/Blosc/c-blosc/archive/refs/tags/v1.17.0.zip
|
#URL https://github.com/Blosc/c-blosc/archive/refs/tags/v1.17.0.zip
|
||||||
#URL_HASH SHA256=7463a1df566704f212263312717ab2c36b45d45cba6cd0dccebf91b2cc4b4da9
|
#URL_HASH SHA256=7463a1df566704f212263312717ab2c36b45d45cba6cd0dccebf91b2cc4b4da9
|
||||||
URL https://github.com/tamasmeszaros/c-blosc/archive/refs/heads/v1.17.0_tm.zip
|
URL https://github.com/tamasmeszaros/c-blosc/archive/refs/heads/v1.17.0_tm.zip
|
||||||
@@ -26,7 +26,7 @@ if(IS_CROSS_COMPILE AND APPLE)
|
|||||||
-DDEACTIVATE_AVX2=ON
|
-DDEACTIVATE_AVX2=ON
|
||||||
)
|
)
|
||||||
else()
|
else()
|
||||||
bambustudio_add_cmake_project(Blosc
|
orcaslicer_add_cmake_project(Blosc
|
||||||
#URL https://github.com/Blosc/c-blosc/archive/refs/tags/v1.17.0.zip
|
#URL https://github.com/Blosc/c-blosc/archive/refs/tags/v1.17.0.zip
|
||||||
#URL_HASH SHA256=7463a1df566704f212263312717ab2c36b45d45cba6cd0dccebf91b2cc4b4da9
|
#URL_HASH SHA256=7463a1df566704f212263312717ab2c36b45d45cba6cd0dccebf91b2cc4b4da9
|
||||||
URL https://github.com/tamasmeszaros/c-blosc/archive/refs/heads/v1.17.0_tm.zip
|
URL https://github.com/tamasmeszaros/c-blosc/archive/refs/heads/v1.17.0_tm.zip
|
||||||
|
|||||||
2
deps/Boost/Boost.cmake
vendored
@@ -90,7 +90,7 @@ if (_cfg_rel GREATER -1 OR _cfg_relwdeb GREATER -1 OR _cfg_minsizerel GREATER -1
|
|||||||
list(APPEND _boost_variants release)
|
list(APPEND _boost_variants release)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (_cfg_deb GREATER -1 OR (MSVC AND ${DEP_DEBUG}) )
|
if (MSVC AND ${DEP_DEBUG} )
|
||||||
list(APPEND _boost_variants debug)
|
list(APPEND _boost_variants debug)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|||||||
2
deps/CGAL/CGAL.cmake
vendored
@@ -1,4 +1,4 @@
|
|||||||
bambustudio_add_cmake_project(
|
orcaslicer_add_cmake_project(
|
||||||
CGAL
|
CGAL
|
||||||
GIT_REPOSITORY https://github.com/CGAL/cgal.git
|
GIT_REPOSITORY https://github.com/CGAL/cgal.git
|
||||||
GIT_TAG caacd806dc55c61cc68adaad99f2240f00493b29 # releases/CGAL-5.3
|
GIT_TAG caacd806dc55c61cc68adaad99f2240f00493b29 # releases/CGAL-5.3
|
||||||
|
|||||||
6
deps/CMakeLists.txt
vendored
@@ -34,7 +34,7 @@ endif ()
|
|||||||
set(DESTDIR "${CMAKE_CURRENT_BINARY_DIR}/destdir" CACHE PATH "Destination directory")
|
set(DESTDIR "${CMAKE_CURRENT_BINARY_DIR}/destdir" CACHE PATH "Destination directory")
|
||||||
set(DEP_DOWNLOAD_DIR ${CMAKE_CURRENT_BINARY_DIR} CACHE PATH "Path for downloaded source packages.")
|
set(DEP_DOWNLOAD_DIR ${CMAKE_CURRENT_BINARY_DIR} CACHE PATH "Path for downloaded source packages.")
|
||||||
|
|
||||||
option(DEP_DEBUG "Build debug variants (only applicable on Windows)" ON)
|
option(DEP_DEBUG "Build debug variants (only applicable on Windows)" OFF)
|
||||||
|
|
||||||
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||||
option(DEP_WX_GTK3 "Build wxWidgets against GTK3" OFF)
|
option(DEP_WX_GTK3 "Build wxWidgets against GTK3" OFF)
|
||||||
@@ -85,7 +85,7 @@ if (NOT _is_multi AND NOT CMAKE_BUILD_TYPE)
|
|||||||
message(STATUS "Forcing CMAKE_BUILD_TYPE to Release as it was not specified.")
|
message(STATUS "Forcing CMAKE_BUILD_TYPE to Release as it was not specified.")
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
function(bambustudio_add_cmake_project projectname)
|
function(orcaslicer_add_cmake_project projectname)
|
||||||
cmake_parse_arguments(P_ARGS "" "INSTALL_DIR;BUILD_COMMAND;INSTALL_COMMAND" "CMAKE_ARGS" ${ARGN})
|
cmake_parse_arguments(P_ARGS "" "INSTALL_DIR;BUILD_COMMAND;INSTALL_COMMAND" "CMAKE_ARGS" ${ARGN})
|
||||||
|
|
||||||
set(_configs_line -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE})
|
set(_configs_line -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE})
|
||||||
@@ -145,7 +145,7 @@ else()
|
|||||||
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
endfunction(bambustudio_add_cmake_project)
|
endfunction(orcaslicer_add_cmake_project)
|
||||||
|
|
||||||
|
|
||||||
if (MSVC)
|
if (MSVC)
|
||||||
|
|||||||
2
deps/CURL/CURL.cmake
vendored
@@ -55,7 +55,7 @@ else()
|
|||||||
set(_curl_static ON)
|
set(_curl_static ON)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
bambustudio_add_cmake_project(CURL
|
orcaslicer_add_cmake_project(CURL
|
||||||
# GIT_REPOSITORY https://github.com/curl/curl.git
|
# GIT_REPOSITORY https://github.com/curl/curl.git
|
||||||
# GIT_TAG curl-7_75_0
|
# GIT_TAG curl-7_75_0
|
||||||
URL https://github.com/curl/curl/archive/refs/tags/curl-7_75_0.zip
|
URL https://github.com/curl/curl/archive/refs/tags/curl-7_75_0.zip
|
||||||
|
|||||||
2
deps/Cereal/Cereal.cmake
vendored
@@ -1,4 +1,4 @@
|
|||||||
bambustudio_add_cmake_project(Cereal
|
orcaslicer_add_cmake_project(Cereal
|
||||||
URL "https://github.com/USCiLab/cereal/archive/v1.2.2.tar.gz"
|
URL "https://github.com/USCiLab/cereal/archive/v1.2.2.tar.gz"
|
||||||
URL_HASH SHA256=1921f26d2e1daf9132da3c432e2fd02093ecaedf846e65d7679ddf868c7289c4
|
URL_HASH SHA256=1921f26d2e1daf9132da3c432e2fd02093ecaedf846e65d7679ddf868c7289c4
|
||||||
CMAKE_ARGS
|
CMAKE_ARGS
|
||||||
|
|||||||
2
deps/EXPAT/EXPAT.cmake
vendored
@@ -1,4 +1,4 @@
|
|||||||
bambustudio_add_cmake_project(EXPAT
|
orcaslicer_add_cmake_project(EXPAT
|
||||||
# GIT_REPOSITORY https://github.com/nigels-com/glew.git
|
# GIT_REPOSITORY https://github.com/nigels-com/glew.git
|
||||||
# GIT_TAG 3a8eff7 # 2.1.0
|
# GIT_TAG 3a8eff7 # 2.1.0
|
||||||
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/expat
|
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/expat
|
||||||
|
|||||||
2
deps/FREETYPE/FREETYPE.cmake
vendored
@@ -10,7 +10,7 @@ else()
|
|||||||
set(_ft_disable_zlib "-D FT_DISABLE_ZLIB=TRUE")
|
set(_ft_disable_zlib "-D FT_DISABLE_ZLIB=TRUE")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
bambustudio_add_cmake_project(FREETYPE
|
orcaslicer_add_cmake_project(FREETYPE
|
||||||
URL https://mirror.ossplanet.net/nongnu/freetype/freetype-2.12.1.tar.gz
|
URL https://mirror.ossplanet.net/nongnu/freetype/freetype-2.12.1.tar.gz
|
||||||
URL_HASH SHA256=efe71fd4b8246f1b0b1b9bfca13cfff1c9ad85930340c27df469733bbb620938
|
URL_HASH SHA256=efe71fd4b8246f1b0b1b9bfca13cfff1c9ad85930340c27df469733bbb620938
|
||||||
#DEPENDS ${ZLIB_PKG}
|
#DEPENDS ${ZLIB_PKG}
|
||||||
|
|||||||
2
deps/GLEW/GLEW.cmake
vendored
@@ -2,7 +2,7 @@
|
|||||||
set(OpenGL_GL_PREFERENCE "LEGACY") # to prevent a nasty warning by cmake
|
set(OpenGL_GL_PREFERENCE "LEGACY") # to prevent a nasty warning by cmake
|
||||||
find_package(OpenGL QUIET REQUIRED)
|
find_package(OpenGL QUIET REQUIRED)
|
||||||
|
|
||||||
bambustudio_add_cmake_project(
|
orcaslicer_add_cmake_project(
|
||||||
GLEW
|
GLEW
|
||||||
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/glew
|
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/glew
|
||||||
)
|
)
|
||||||
|
|||||||
2
deps/GLFW/GLFW.cmake
vendored
@@ -12,7 +12,7 @@ else()
|
|||||||
set(_glfw_use_wayland "-DGLFW_USE_WAYLAND=FF")
|
set(_glfw_use_wayland "-DGLFW_USE_WAYLAND=FF")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
bambustudio_add_cmake_project(GLFW
|
orcaslicer_add_cmake_project(GLFW
|
||||||
URL https://github.com/glfw/glfw/archive/refs/tags/3.3.7.zip
|
URL https://github.com/glfw/glfw/archive/refs/tags/3.3.7.zip
|
||||||
URL_HASH SHA256=e02d956935e5b9fb4abf90e2c2e07c9a0526d7eacae8ee5353484c69a2a76cd0
|
URL_HASH SHA256=e02d956935e5b9fb4abf90e2c2e07c9a0526d7eacae8ee5353484c69a2a76cd0
|
||||||
#DEPENDS dep_Boost
|
#DEPENDS dep_Boost
|
||||||
|
|||||||
2
deps/JPEG/JPEG.cmake
vendored
@@ -11,7 +11,7 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
|||||||
endif ()
|
endif ()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
bambustudio_add_cmake_project(JPEG
|
orcaslicer_add_cmake_project(JPEG
|
||||||
URL https://github.com/libjpeg-turbo/libjpeg-turbo/archive/refs/tags/2.0.6.zip
|
URL https://github.com/libjpeg-turbo/libjpeg-turbo/archive/refs/tags/2.0.6.zip
|
||||||
URL_HASH SHA256=017bdc33ff3a72e11301c0feb4657cb27719d7f97fa67a78ed506c594218bbf1
|
URL_HASH SHA256=017bdc33ff3a72e11301c0feb4657cb27719d7f97fa67a78ed506c594218bbf1
|
||||||
DEPENDS ${ZLIB_PKG}
|
DEPENDS ${ZLIB_PKG}
|
||||||
|
|||||||
2
deps/NLopt/NLopt.cmake
vendored
@@ -1,4 +1,4 @@
|
|||||||
bambustudio_add_cmake_project(NLopt
|
orcaslicer_add_cmake_project(NLopt
|
||||||
URL "https://github.com/stevengj/nlopt/archive/v2.5.0.tar.gz"
|
URL "https://github.com/stevengj/nlopt/archive/v2.5.0.tar.gz"
|
||||||
URL_HASH SHA256=c6dd7a5701fff8ad5ebb45a3dc8e757e61d52658de3918e38bab233e7fd3b4ae
|
URL_HASH SHA256=c6dd7a5701fff8ad5ebb45a3dc8e757e61d52658de3918e38bab233e7fd3b4ae
|
||||||
CMAKE_ARGS
|
CMAKE_ARGS
|
||||||
|
|||||||
2
deps/OCCT/OCCT.cmake
vendored
@@ -8,7 +8,7 @@ endif()
|
|||||||
# get relative path of CMAKE_BINARY_DIR against root source directory
|
# get relative path of CMAKE_BINARY_DIR against root source directory
|
||||||
file(RELATIVE_PATH BINARY_DIR_REL ${CMAKE_SOURCE_DIR}/.. ${CMAKE_BINARY_DIR})
|
file(RELATIVE_PATH BINARY_DIR_REL ${CMAKE_SOURCE_DIR}/.. ${CMAKE_BINARY_DIR})
|
||||||
|
|
||||||
bambustudio_add_cmake_project(OCCT
|
orcaslicer_add_cmake_project(OCCT
|
||||||
URL https://github.com/Open-Cascade-SAS/OCCT/archive/refs/tags/V7_6_0.zip
|
URL https://github.com/Open-Cascade-SAS/OCCT/archive/refs/tags/V7_6_0.zip
|
||||||
URL_HASH SHA256=28334f0e98f1b1629799783e9b4d21e05349d89e695809d7e6dfa45ea43e1dbc
|
URL_HASH SHA256=28334f0e98f1b1629799783e9b4d21e05349d89e695809d7e6dfa45ea43e1dbc
|
||||||
#PATCH_COMMAND ${PATCH_CMD} ${CMAKE_CURRENT_LIST_DIR}/0001-OCCT-fix.patch
|
#PATCH_COMMAND ${PATCH_CMD} ${CMAKE_CURRENT_LIST_DIR}/0001-OCCT-fix.patch
|
||||||
|
|||||||
2
deps/OpenCSG/OpenCSG.cmake
vendored
@@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
bambustudio_add_cmake_project(OpenCSG
|
orcaslicer_add_cmake_project(OpenCSG
|
||||||
# GIT_REPOSITORY https://github.com/floriankirsch/OpenCSG.git
|
# GIT_REPOSITORY https://github.com/floriankirsch/OpenCSG.git
|
||||||
# GIT_TAG 83e274457b46c9ad11a4ee599203250b1618f3b9 #v1.4.2
|
# GIT_TAG 83e274457b46c9ad11a4ee599203250b1618f3b9 #v1.4.2
|
||||||
URL https://github.com/floriankirsch/OpenCSG/archive/refs/tags/opencsg-1-4-2-release.zip
|
URL https://github.com/floriankirsch/OpenCSG/archive/refs/tags/opencsg-1-4-2-release.zip
|
||||||
|
|||||||
2
deps/OpenEXR/OpenEXR.cmake
vendored
@@ -36,7 +36,7 @@ else ()
|
|||||||
set(_patch_cmd "")
|
set(_patch_cmd "")
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
bambustudio_add_cmake_project(OpenEXR
|
orcaslicer_add_cmake_project(OpenEXR
|
||||||
# GIT_REPOSITORY https://github.com/openexr/openexr.git
|
# GIT_REPOSITORY https://github.com/openexr/openexr.git
|
||||||
URL https://github.com/AcademySoftwareFoundation/openexr/archive/refs/tags/v2.5.5.zip
|
URL https://github.com/AcademySoftwareFoundation/openexr/archive/refs/tags/v2.5.5.zip
|
||||||
URL_HASH SHA256=0307a3d7e1fa1e77e9d84d7e9a8694583fbbbfd50bdc6884e2c96b8ef6b902de
|
URL_HASH SHA256=0307a3d7e1fa1e77e9d84d7e9a8694583fbbbfd50bdc6884e2c96b8ef6b902de
|
||||||
|
|||||||
2
deps/OpenVDB/OpenVDB.cmake
vendored
@@ -6,7 +6,7 @@ else()
|
|||||||
set(_build_static ON)
|
set(_build_static ON)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
bambustudio_add_cmake_project(OpenVDB
|
orcaslicer_add_cmake_project(OpenVDB
|
||||||
# support vs2022, update to 8.2
|
# support vs2022, update to 8.2
|
||||||
URL https://github.com/tamasmeszaros/openvdb/archive/a68fd58d0e2b85f01adeb8b13d7555183ab10aa5.zip
|
URL https://github.com/tamasmeszaros/openvdb/archive/a68fd58d0e2b85f01adeb8b13d7555183ab10aa5.zip
|
||||||
URL_HASH SHA256=f353e7b99bd0cbfc27ac9082de51acf32a8bc0b3e21ff9661ecca6f205ec1d81
|
URL_HASH SHA256=f353e7b99bd0cbfc27ac9082de51acf32a8bc0b3e21ff9661ecca6f205ec1d81
|
||||||
|
|||||||
4
deps/PNG/PNG.cmake
vendored
@@ -7,7 +7,7 @@ endif ()
|
|||||||
|
|
||||||
if(APPLE AND IS_CROSS_COMPILE)
|
if(APPLE AND IS_CROSS_COMPILE)
|
||||||
# TODO: check if it doesn't create problem when compiling from arm to x86_64
|
# TODO: check if it doesn't create problem when compiling from arm to x86_64
|
||||||
bambustudio_add_cmake_project(PNG
|
orcaslicer_add_cmake_project(PNG
|
||||||
GIT_REPOSITORY https://github.com/glennrp/libpng.git
|
GIT_REPOSITORY https://github.com/glennrp/libpng.git
|
||||||
GIT_TAG v1.6.35
|
GIT_TAG v1.6.35
|
||||||
DEPENDS ${ZLIB_PKG}
|
DEPENDS ${ZLIB_PKG}
|
||||||
@@ -26,7 +26,7 @@ set(_patch_step "")
|
|||||||
if (APPLE)
|
if (APPLE)
|
||||||
set(_patch_step PATCH_COMMAND ${PATCH_CMD} ${CMAKE_CURRENT_LIST_DIR}/PNG.patch)
|
set(_patch_step PATCH_COMMAND ${PATCH_CMD} ${CMAKE_CURRENT_LIST_DIR}/PNG.patch)
|
||||||
endif ()
|
endif ()
|
||||||
bambustudio_add_cmake_project(PNG
|
orcaslicer_add_cmake_project(PNG
|
||||||
# GIT_REPOSITORY https://github.com/glennrp/libpng.git
|
# GIT_REPOSITORY https://github.com/glennrp/libpng.git
|
||||||
# GIT_TAG v1.6.35
|
# GIT_TAG v1.6.35
|
||||||
URL https://github.com/glennrp/libpng/archive/refs/tags/v1.6.35.zip
|
URL https://github.com/glennrp/libpng/archive/refs/tags/v1.6.35.zip
|
||||||
|
|||||||
2
deps/Qhull/Qhull.cmake
vendored
@@ -1,5 +1,5 @@
|
|||||||
include(GNUInstallDirs)
|
include(GNUInstallDirs)
|
||||||
bambustudio_add_cmake_project(Qhull
|
orcaslicer_add_cmake_project(Qhull
|
||||||
URL "https://github.com/qhull/qhull/archive/v8.0.1.zip"
|
URL "https://github.com/qhull/qhull/archive/v8.0.1.zip"
|
||||||
URL_HASH SHA256=5287f5edd6a0372588f5d6640799086a4033d89d19711023ef8229dd9301d69b
|
URL_HASH SHA256=5287f5edd6a0372588f5d6640799086a4033d89d19711023ef8229dd9301d69b
|
||||||
CMAKE_ARGS
|
CMAKE_ARGS
|
||||||
|
|||||||
2
deps/TBB/TBB.cmake
vendored
@@ -1,4 +1,4 @@
|
|||||||
bambustudio_add_cmake_project(
|
orcaslicer_add_cmake_project(
|
||||||
TBB
|
TBB
|
||||||
URL "https://github.com/oneapi-src/oneTBB/archive/refs/tags/v2021.5.0.zip"
|
URL "https://github.com/oneapi-src/oneTBB/archive/refs/tags/v2021.5.0.zip"
|
||||||
URL_HASH SHA256=83ea786c964a384dd72534f9854b419716f412f9d43c0be88d41874763e7bb47
|
URL_HASH SHA256=83ea786c964a384dd72534f9854b419716f412f9d43c0be88d41874763e7bb47
|
||||||
|
|||||||
4
deps/TIFF/TIFF.cmake
vendored
@@ -2,7 +2,7 @@ find_package(OpenGL QUIET REQUIRED)
|
|||||||
|
|
||||||
if (APPLE)
|
if (APPLE)
|
||||||
message(STATUS "Compiling TIFF for macos ${CMAKE_SYSTEM_VERSION}.")
|
message(STATUS "Compiling TIFF for macos ${CMAKE_SYSTEM_VERSION}.")
|
||||||
bambustudio_add_cmake_project(TIFF
|
orcaslicer_add_cmake_project(TIFF
|
||||||
URL https://gitlab.com/libtiff/libtiff/-/archive/v4.3.0/libtiff-v4.3.0.zip
|
URL https://gitlab.com/libtiff/libtiff/-/archive/v4.3.0/libtiff-v4.3.0.zip
|
||||||
URL_HASH SHA256=4fca1b582c88319f3ad6ecd5b46320eadaf5eb4ef6f6c32d44caaae4a03d0726
|
URL_HASH SHA256=4fca1b582c88319f3ad6ecd5b46320eadaf5eb4ef6f6c32d44caaae4a03d0726
|
||||||
DEPENDS ${ZLIB_PKG} ${PNG_PKG} dep_JPEG
|
DEPENDS ${ZLIB_PKG} ${PNG_PKG} dep_JPEG
|
||||||
@@ -14,7 +14,7 @@ if (APPLE)
|
|||||||
-Dpixarlog:BOOL=OFF
|
-Dpixarlog:BOOL=OFF
|
||||||
)
|
)
|
||||||
else()
|
else()
|
||||||
bambustudio_add_cmake_project(TIFF
|
orcaslicer_add_cmake_project(TIFF
|
||||||
URL https://gitlab.com/libtiff/libtiff/-/archive/v4.1.0/libtiff-v4.1.0.zip
|
URL https://gitlab.com/libtiff/libtiff/-/archive/v4.1.0/libtiff-v4.1.0.zip
|
||||||
URL_HASH SHA256=c56edfacef0a60c0de3e6489194fcb2f24c03dbb550a8a7de5938642d045bd32
|
URL_HASH SHA256=c56edfacef0a60c0de3e6489194fcb2f24c03dbb550a8a7de5938642d045bd32
|
||||||
DEPENDS ${ZLIB_PKG} ${PNG_PKG} dep_JPEG
|
DEPENDS ${ZLIB_PKG} ${PNG_PKG} dep_JPEG
|
||||||
|
|||||||
2
deps/ZLIB/ZLIB.cmake
vendored
@@ -1,4 +1,4 @@
|
|||||||
bambustudio_add_cmake_project(ZLIB
|
orcaslicer_add_cmake_project(ZLIB
|
||||||
# GIT_REPOSITORY https://github.com/madler/zlib.git
|
# GIT_REPOSITORY https://github.com/madler/zlib.git
|
||||||
# GIT_TAG v1.2.11
|
# GIT_TAG v1.2.11
|
||||||
URL https://github.com/madler/zlib/archive/refs/tags/v1.2.11.zip
|
URL https://github.com/madler/zlib/archive/refs/tags/v1.2.11.zip
|
||||||
|
|||||||
2
deps/wxWidgets/wxWidgets.cmake
vendored
@@ -26,7 +26,7 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
|||||||
set(_patch_cmd ${PATCH_CMD} ${CMAKE_CURRENT_LIST_DIR}/0001-wxWidget-fix.patch)
|
set(_patch_cmd ${PATCH_CMD} ${CMAKE_CURRENT_LIST_DIR}/0001-wxWidget-fix.patch)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
bambustudio_add_cmake_project(
|
orcaslicer_add_cmake_project(
|
||||||
wxWidgets
|
wxWidgets
|
||||||
GIT_REPOSITORY "https://github.com/wxWidgets/wxWidgets"
|
GIT_REPOSITORY "https://github.com/wxWidgets/wxWidgets"
|
||||||
GIT_TAG ${_wx_git_tag}
|
GIT_TAG ${_wx_git_tag}
|
||||||
|
|||||||
@@ -12,24 +12,24 @@ Full manual for GNUgettext can be seen here: http://www.gnu.org/software/gettext
|
|||||||
|
|
||||||
|
|
||||||
### Scenario 1. How do I add a translation or fix an existing translation
|
### Scenario 1. How do I add a translation or fix an existing translation
|
||||||
1. Get PO-file 'BambuStudio_xx.pot' from corresponding sub-folder here:
|
1. Get PO-file 'OrcaSlicer_xx.pot' from corresponding sub-folder here:
|
||||||
https://github.com/bambulab/BambuStudio/tree/master/bbl/i18n
|
https://github.com/softfever/OrcaSlicer/tree/master/localization/i18n
|
||||||
2. Open this file in PoEdit as "Edit a translation"
|
2. Open this file in PoEdit as "Edit a translation"
|
||||||
3. Apply your corrections to the translation
|
3. Apply your corrections to the translation
|
||||||
4. Push changed BambuStudio_xx.po into the original folder
|
4. Push changed OrcaSlicer_xx.po into the original folder
|
||||||
5. copy BambuStudio_xx.mo into resources/i18n/xx and rename it to BambuStudio.mo, then push the changed file.
|
5. copy OrcaSlicer_xx.mo into resources/i18n/xx and rename it to OrcaSlicer.mo, then push the changed file.
|
||||||
|
|
||||||
### Scenario 2. How do I add a new language support
|
### Scenario 2. How do I add a new language support
|
||||||
1. Get file BambuStudio.pot here :
|
1. Get file OrcaSlicer.pot here :
|
||||||
https://github.com/bambulab/BambuStudio/tree/master/bbl/i18n
|
https://github.com/softfever/OrcaSlicer/tree/master/localization/i18n
|
||||||
2. Open it in PoEdit for "Create new translation"
|
2. Open it in PoEdit for "Create new translation"
|
||||||
3. Select Translation Language (for example French).
|
3. Select Translation Language (for example French).
|
||||||
4. As a result you will have fr.po - the file containing translation to French.
|
4. As a result you will have fr.po - the file containing translation to French.
|
||||||
Notice. When the translation is complete you need to:
|
Notice. When the translation is complete you need to:
|
||||||
- Rename the file to BambuStudio_fr.po
|
- Rename the file to OrcaSlicer_fr.po
|
||||||
- Click "Save file" button. BambuStudio_fr.mo will be created immediately
|
- Click "Save file" button. OrcaSlicer_fr.mo will be created immediately
|
||||||
- Bambu_Studio_fr.po needs to be copied into the sub-folder fr of https://github.com/bambulab/BambuStudio/tree/master/bbl/i18n, and be pushed
|
- Bambu_Studio_fr.po needs to be copied into the sub-folder fr of https://github.com/softfever/OrcaSlicer/tree/master/localization/i18n, and be pushed
|
||||||
- copy BambuStudio_xx.mo into resources/i18n/xx and rename it to BambuStudio.mo, then push the changed file.
|
- copy OrcaSlicer_xx.mo into resources/i18n/xx and rename it to OrcaSlicer.mo, then push the changed file.
|
||||||
( name of folder "fr" means "French" - the translation language).
|
( name of folder "fr" means "French" - the translation language).
|
||||||
|
|
||||||
### Scenario 3. How do I add a new text resource when implementing a feature to Orca Slicer
|
### Scenario 3. How do I add a new text resource when implementing a feature to Orca Slicer
|
||||||
@@ -43,11 +43,11 @@ If you add new file resource, add it to the list of files containing macro `L()`
|
|||||||
### Scenario 4. How do I use GNUgettext to localize my own application taking Orca Slicer as an example
|
### Scenario 4. How do I use GNUgettext to localize my own application taking Orca Slicer as an example
|
||||||
|
|
||||||
1. For convenience create a list of files with this macro `L(s)`. We have
|
1. For convenience create a list of files with this macro `L(s)`. We have
|
||||||
https://github.com/bambulab/BambuStudio/blob/master/bbl/i18n/list.txt.
|
https://github.com/softfever/OrcaSlicer/blob/master/localization/i18n/list.txt.
|
||||||
|
|
||||||
2. Create template file(*.POT) with GNUgettext command:
|
2. Create template file(*.POT) with GNUgettext command:
|
||||||
```
|
```
|
||||||
xgettext --keyword=L --add-comments=TRN --from-code=UTF-8 --debug -o BambuStudio.pot -f list.txt
|
xgettext --keyword=L --add-comments=TRN --from-code=UTF-8 --debug -o OrcaSlicer.pot -f list.txt
|
||||||
```
|
```
|
||||||
|
|
||||||
Use flag `--from-code=UTF-8` to specify that the source strings are in UTF-8 encoding
|
Use flag `--from-code=UTF-8` to specify that the source strings are in UTF-8 encoding
|
||||||
|
|||||||
@@ -6,58 +6,58 @@
|
|||||||
"files": [
|
"files": [
|
||||||
{
|
{
|
||||||
"type": "po",
|
"type": "po",
|
||||||
"pattern": "bbl/i18n/en/OrcaSlicer_en.po",
|
"pattern": "localization/i18n/en/OrcaSlicer_en.po",
|
||||||
"lang": "en"
|
"lang": "en"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "po",
|
"type": "po",
|
||||||
"pattern": "bbl/i18n/fr/OrcaSlicer_fr.po",
|
"pattern": "localization/i18n/fr/OrcaSlicer_fr.po",
|
||||||
"lang": "fr"
|
"lang": "fr"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "po",
|
"type": "po",
|
||||||
"pattern": "bbl/i18n/de/OrcaSlicer_de.po",
|
"pattern": "localization/i18n/de/OrcaSlicer_de.po",
|
||||||
"lang": "de"
|
"lang": "de"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "po",
|
"type": "po",
|
||||||
"pattern": "bbl/i18n/sv/OrcaSlicer_sv.po",
|
"pattern": "localization/i18n/sv/OrcaSlicer_sv.po",
|
||||||
"lang": "sv"
|
"lang": "sv"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "po",
|
"type": "po",
|
||||||
"pattern": "bbl/i18n/es/OrcaSlicer_es.po",
|
"pattern": "localization/i18n/es/OrcaSlicer_es.po",
|
||||||
"lang": "es"
|
"lang": "es"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "po",
|
"type": "po",
|
||||||
"pattern": "bbl/i18n/nl/OrcaSlicer_nl.po",
|
"pattern": "localization/i18n/nl/OrcaSlicer_nl.po",
|
||||||
"lang": "nl"
|
"lang": "nl"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "po",
|
"type": "po",
|
||||||
"pattern": "bbl/i18n/hu/OrcaSlicer_hu.po",
|
"pattern": "localization/i18n/hu/OrcaSlicer_hu.po",
|
||||||
"lang": "hu"
|
"lang": "hu"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "po",
|
"type": "po",
|
||||||
"pattern": "bbl/i18n/ja/OrcaSlicer_ja.po",
|
"pattern": "localization/i18n/ja/OrcaSlicer_ja.po",
|
||||||
"lang": "ja"
|
"lang": "ja"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "po",
|
"type": "po",
|
||||||
"pattern": "bbl/i18n/ko/OrcaSlicer_ko.po",
|
"pattern": "localization/i18n/ko/OrcaSlicer_ko.po",
|
||||||
"lang": "ko"
|
"lang": "ko"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "po",
|
"type": "po",
|
||||||
"pattern": "bbl/i18n/ru/OrcaSlicer_ru.po",
|
"pattern": "localization/i18n/ru/OrcaSlicer_ru.po",
|
||||||
"lang": "ru"
|
"lang": "ru"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"download": {
|
"download": {
|
||||||
"folder": "bbl/i18n",
|
"folder": "localization/i18n",
|
||||||
"includeSourceLang" : "true",
|
"includeSourceLang" : "true",
|
||||||
"files": {
|
"files": {
|
||||||
"output": "${lang}/OrcaSlicer_${lang}.po"
|
"output": "${lang}/OrcaSlicer_${lang}.po"
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2023-07-31 21:29+0800\n"
|
"POT-Creation-Date: 2023-08-14 19:56+0800\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
@@ -656,7 +656,7 @@ msgid "Open Project"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"The version of Bambu studio is too low and needs to be updated to the latest "
|
"The version of Orca Slicer is too low and needs to be updated to the latest "
|
||||||
"version before it can be used normally"
|
"version before it can be used normally"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -847,6 +847,12 @@ msgstr ""
|
|||||||
msgid "Set as individual objects"
|
msgid "Set as individual objects"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Fill bed with copies"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Fill the remaining area of bed with copies of the selected object"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Printable"
|
msgid "Printable"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -1549,6 +1555,15 @@ msgstr ""
|
|||||||
msgid "Orienting"
|
msgid "Orienting"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Filling bed "
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Bed filling canceled."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Bed filling done."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Error! Unable to create thread!"
|
msgid "Error! Unable to create thread!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -2785,6 +2800,9 @@ msgstr ""
|
|||||||
msgid "An object is layed over the boundary of plate."
|
msgid "An object is layed over the boundary of plate."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "A G-code path goes beyond the max print height."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "A G-code path goes beyond the boundary of plate."
|
msgid "A G-code path goes beyond the boundary of plate."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -2797,12 +2815,6 @@ msgid ""
|
|||||||
"confirming that the height is within the build volume."
|
"confirming that the height is within the build volume."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Jump to"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "ERROR:"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Calibration step selection"
|
msgid "Calibration step selection"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -3357,7 +3369,7 @@ msgstr ""
|
|||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Another virtual camera is running.\n"
|
"Another virtual camera is running.\n"
|
||||||
"Bambu Studio supports only a single virtual camera.\n"
|
"Orca Slicer supports only a single virtual camera.\n"
|
||||||
"Do you want to stop this virtual camera?"
|
"Do you want to stop this virtual camera?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -3750,6 +3762,9 @@ msgstr ""
|
|||||||
msgid "Slice ok."
|
msgid "Slice ok."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Jump to"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Error:"
|
msgid "Error:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -3759,6 +3774,9 @@ msgstr ""
|
|||||||
msgid "Export successfully."
|
msgid "Export successfully."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Serious warning:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid " (Repair)"
|
msgid " (Repair)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -4231,6 +4249,11 @@ msgid ""
|
|||||||
"on the printer."
|
"on the printer."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Unable to perform boolean operation on model meshes. Only positive parts "
|
||||||
|
"will be exported."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Print By Object: \n"
|
"Print By Object: \n"
|
||||||
"Suggest to use auto-arrange to avoid collisions when printing."
|
"Suggest to use auto-arrange to avoid collisions when printing."
|
||||||
@@ -4251,6 +4274,14 @@ msgstr ""
|
|||||||
msgid "Plate Settings"
|
msgid "Plate Settings"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#, possible-boost-format
|
||||||
|
msgid "Number of currently selected parts: %1%\n"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#, possible-boost-format
|
||||||
|
msgid "Number of currently selected objects: %1%\n"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, possible-boost-format
|
#, possible-boost-format
|
||||||
msgid "Part name: %1%\n"
|
msgid "Part name: %1%\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -4961,8 +4992,8 @@ msgstr ""
|
|||||||
msgid ""
|
msgid ""
|
||||||
"When recording timelapse without toolhead, it is recommended to add a "
|
"When recording timelapse without toolhead, it is recommended to add a "
|
||||||
"\"Timelapse Wipe Tower\" \n"
|
"\"Timelapse Wipe Tower\" \n"
|
||||||
"by right-click the empty position of build plate and choose \"Add Primitive"
|
"by right-click the empty position of build plate and choose \"Add "
|
||||||
"\"->\"Timelapse Wipe Tower\"."
|
"Primitive\"->\"Timelapse Wipe Tower\"."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Line width"
|
msgid "Line width"
|
||||||
@@ -4998,6 +5029,12 @@ msgid ""
|
|||||||
"the overhang degree range and wall speed is used"
|
"the overhang degree range and wall speed is used"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Bridge"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Set speed for external and internal bridges"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Travel speed"
|
msgid "Travel speed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -5064,9 +5101,6 @@ msgstr ""
|
|||||||
msgid "Print temperature"
|
msgid "Print temperature"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Chamber temperature"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Nozzle"
|
msgid "Nozzle"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -5924,7 +5958,7 @@ msgstr ""
|
|||||||
msgid "Bottom surface"
|
msgid "Bottom surface"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Bridge"
|
msgid "Internal Bridge"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Gap infill"
|
msgid "Gap infill"
|
||||||
@@ -6073,9 +6107,6 @@ msgstr ""
|
|||||||
msgid "No extrusions under current settings."
|
msgid "No extrusions under current settings."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Bed temperatures for the used filaments differ significantly."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Smooth mode of timelapse is not supported when \"by object\" sequence is "
|
"Smooth mode of timelapse is not supported when \"by object\" sequence is "
|
||||||
"enabled."
|
"enabled."
|
||||||
@@ -6436,6 +6467,21 @@ msgid ""
|
|||||||
"pattern"
|
"pattern"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "One wall threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#, possible-c-format, possible-boost-format
|
||||||
|
msgid ""
|
||||||
|
"If a top surface has to be printed and it's partially covered by another "
|
||||||
|
"layer, it won't be considered at a top layer where its width is below this "
|
||||||
|
"value. This can be useful to not let the 'one perimeter on top' trigger on "
|
||||||
|
"surface that should be covered only by perimeters. This value can be a mm or "
|
||||||
|
"a % of the perimeter extrusion width.\n"
|
||||||
|
"Warning: If enabled, artifacts can be created is you have some thin features "
|
||||||
|
"on the next layer, like letters. Set this setting to 0 to remove these "
|
||||||
|
"artifacts."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Only one wall on first layer"
|
msgid "Only one wall on first layer"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -6459,12 +6505,23 @@ msgstr ""
|
|||||||
msgid "mm/s or %"
|
msgid "mm/s or %"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "External"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Speed of bridge and completely overhang wall"
|
msgid "Speed of bridge and completely overhang wall"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "mm/s"
|
msgid "mm/s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Internal"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Speed of internal bridge. If the value is expressed as a percentage, it will "
|
||||||
|
"be calculated based on the bridge_speed. Default value is 150%."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Brim width"
|
msgid "Brim width"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -6479,6 +6536,9 @@ msgid ""
|
|||||||
"models. Auto means the brim width is analysed and calculated automatically."
|
"models. Auto means the brim width is analysed and calculated automatically."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Mouse ear"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "outer_only"
|
msgid "outer_only"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -6496,6 +6556,30 @@ msgid ""
|
|||||||
"easily"
|
"easily"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Brim ears"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Only draw brim over the sharp edges of the model."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Brim ear max angle"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Maximum angle to let a brim ear appear. \n"
|
||||||
|
"If set to 0, no brim will be created. \n"
|
||||||
|
"If set to ~180, brim will be created on everything but straight sections."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Brim ear detection radius"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"The geometry will be decimated before dectecting sharp angles. This "
|
||||||
|
"parameter indicates the minimum length of the deviation for the decimation.\n"
|
||||||
|
"0 to deactivate"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Compatible machine"
|
msgid "Compatible machine"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -6654,6 +6738,14 @@ msgstr ""
|
|||||||
msgid "Line pattern of bottom surface infill, not bridge infill"
|
msgid "Line pattern of bottom surface infill, not bridge infill"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Internal solid infill pattern"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Line pattern of internal solid infill. if the detect nattow internal solid "
|
||||||
|
"infill be enabled, the concentric pattern will be used for the small area."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Line width of outer wall. If expressed as a %, it will be computed over the "
|
"Line width of outer wall. If expressed as a %, it will be computed over the "
|
||||||
"nozzle diameter."
|
"nozzle diameter."
|
||||||
@@ -6888,6 +6980,12 @@ msgstr ""
|
|||||||
msgid "money/kg"
|
msgid "money/kg"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Vendor"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Vendor of filament. For show only"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "(Undefined)"
|
msgid "(Undefined)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -7100,10 +7198,10 @@ msgstr ""
|
|||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Fan speed will be ramped up linearly from zero at layer "
|
"Fan speed will be ramped up linearly from zero at layer "
|
||||||
"\"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer"
|
"\"close_fan_the_first_x_layers\" to maximum at layer "
|
||||||
"\". \"full_fan_speed_layer\" will be ignored if lower than "
|
"\"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower "
|
||||||
"\"close_fan_the_first_x_layers\", in which case the fan will be running at "
|
"than \"close_fan_the_first_x_layers\", in which case the fan will be running "
|
||||||
"maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1."
|
"at maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Support interface fan speed"
|
msgid "Support interface fan speed"
|
||||||
@@ -7340,6 +7438,9 @@ msgstr ""
|
|||||||
msgid "All solid layer"
|
msgid "All solid layer"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Ironing Pattern"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Ironing flow"
|
msgid "Ironing flow"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -8002,6 +8103,12 @@ msgid ""
|
|||||||
"etc."
|
"etc."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Remove small overhangs"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Remove small overhangs that possibly need no supports."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Top Z distance"
|
msgid "Top Z distance"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -8201,6 +8308,9 @@ msgid ""
|
|||||||
"support"
|
"support"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Chamber temperature"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Target chamber temperature"
|
msgid "Target chamber temperature"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -8479,6 +8589,12 @@ msgstr ""
|
|||||||
msgid "Load cached slicing data from directory"
|
msgid "Load cached slicing data from directory"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Export STL"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Export the objects as multiple STL."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Slice"
|
msgid "Slice"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -8494,6 +8610,12 @@ msgstr ""
|
|||||||
msgid "Update the configs values of 3mf to latest."
|
msgid "Update the configs values of 3mf to latest."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Load default filaments"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Load first filament as default for those not loaded"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "mtcpp"
|
msgid "mtcpp"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -8542,6 +8664,12 @@ msgstr ""
|
|||||||
msgid "Arrange options: 0-disable, 1-enable, others-auto"
|
msgid "Arrange options: 0-disable, 1-enable, others-auto"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Repetions count"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Repetions count of the whole model"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Convert Unit"
|
msgid "Convert Unit"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -8572,6 +8700,14 @@ msgstr ""
|
|||||||
msgid "Skip some objects in this print"
|
msgid "Skip some objects in this print"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "load uptodate process/machine settings when using uptodate"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"load uptodate process/machine settings from the specified file when using "
|
||||||
|
"uptodate"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Data directory"
|
msgid "Data directory"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -8685,6 +8821,159 @@ msgstr ""
|
|||||||
msgid "Support: propagate branches at layer %d"
|
msgid "Support: propagate branches at layer %d"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Unknown file format. Input file must have .stl, .obj, .amf(.xml) extension."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Loading of a model file failed."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "The supplied file couldn't be read because it's empty"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Unknown file format. Input file must have .3mf or .zip.amf extension."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Canceled"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "load_obj: failed to parse"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "The file contains polygons with more than 4 vertices."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "The file contains polygons with less than 2 vertices."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "The file contains invalid vertex index."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "This OBJ file couldn't be read because it's empty."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Network lookup"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Address"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Hostname"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Service name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "OctoPrint version"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Searching for devices"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Finished"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Unable to perform boolean operation on selected parts"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Mesh Boolean"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Union"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Difference"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Intersection"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Source Volume"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Tool Volume"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "selected"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Part 1"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Subtract from"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Part 2"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Subtract with"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Delete input"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Send to print"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Upload to Printer Host with the following filename:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Use forward slashes ( / ) as a directory separator if needed."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#, possible-c-format, possible-boost-format
|
||||||
|
msgid "Upload filename doesn't end with \"%s\". Do you wish to continue?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Upload"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Upload and Print"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Simulate"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Print host upload queue"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "ID"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Progress"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Host"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgctxt "OfFile"
|
||||||
|
msgid "Size"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Filename"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Error Message"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Cancel selected"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Show error message"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Enqueued"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Uploading"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Cancelling"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Error uploading to print host:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "PA Calibration"
|
msgid "PA Calibration"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -8852,3 +9141,103 @@ msgstr ""
|
|||||||
|
|
||||||
msgid "Connection to printers connected via the print host failed."
|
msgid "Connection to printers connected via the print host failed."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/data/hints.ini: [hint:3D Scene Operations]
|
||||||
|
msgid "3D Scene Operations\nDid you know how to control view and object/part selection with mouse and touchpanel in the 3D scene?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/data/hints.ini: [hint:Cut Tool]
|
||||||
|
msgid "Cut Tool\nDid you know that you can cut a model at any angle and position with the cutting tool?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/data/hints.ini: [hint:Fix Model]
|
||||||
|
msgid "Fix Model\nDid you know that you can fix a corrupted 3D model to avoid a lot of slicing problems?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/data/hints.ini: [hint:Timelapse]
|
||||||
|
msgid "Timelapse\nDid you know that you can generate a timelapse video during each print?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/data/hints.ini: [hint:Auto-Arrange]
|
||||||
|
msgid "Auto-Arrange\nDid you know that you can auto-arrange all objects in your project?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/data/hints.ini: [hint:Auto-Orient]
|
||||||
|
msgid "Auto-Orient\nDid you know that you can rotate objects to an optimal orientation for printing by a simple click?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/data/hints.ini: [hint:Lay on Face]
|
||||||
|
msgid "Lay on Face\nDid you know that you can quickly orient a model so that one of its faces sits on the print bed? Select the \"Place on face\" function or press the <b>F</b> key."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/data/hints.ini: [hint:Object List]
|
||||||
|
msgid "Object List\nDid you know that you can view all objects/parts in a list and change settings for each object/part?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/data/hints.ini: [hint:Simplify Model]
|
||||||
|
msgid "Simplify Model\nDid you know that you can reduce the number of triangles in a mesh using the Simplify mesh feature? Right-click the model and select Simplify model. Read more in the documentation."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/data/hints.ini: [hint:Slicing Parameter Table]
|
||||||
|
msgid "Slicing Parameter Table\nDid you know that you can view all objects/parts on a table and change settings for each object/part?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/data/hints.ini: [hint:Split to Objects/Parts]
|
||||||
|
msgid "Split to Objects/Parts\nDid you know that you can split a big object into small ones for easy colorizing or printing?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/data/hints.ini: [hint:Subtract a Part]
|
||||||
|
msgid "Subtract a Part\nDid you know that you can subtract one mesh from another using the Negative part modifier? That way you can, for example, create easily resizable holes directly in Orca Slicer. Read more in the documentation."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/data/hints.ini: [hint:STEP]
|
||||||
|
msgid "STEP\nDid you know that you can improve your print quality by slicing a STEP file instead of an STL?\nOrca Slicer supports slicing STEP files, providing smoother results than a lower resolution STL. Give it a try!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/data/hints.ini: [hint:Z seam location]
|
||||||
|
msgid "Z seam location\nDid you know that you can customize the location of the Z seam, and even paint it on your print, to have it in a less visible location? This improves the overall look of your model. Check it out!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/data/hints.ini: [hint:Fine-tuning for flow rate]
|
||||||
|
msgid "Fine-tuning for flow rate\nDid you know that flow rate can be fine-tuned for even better-looking prints? Depending on the material, you can improve the overall finish of the printed model by doing some fine-tuning."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/data/hints.ini: [hint:Split your prints into plates]
|
||||||
|
msgid "Split your prints into plates\nDid you know that you can split a model that has a lot of parts into individual plates ready to print? This will simplify the process of keeping track of all the parts."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/data/hints.ini: [hint:Speed up your print with Adaptive Layer Height]
|
||||||
|
msgid "Speed up your print with Adaptive Layer Height\nDid you know that you can print a model even faster, by using the Adaptive Layer Height option? Check it out!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/data/hints.ini: [hint:Support painting]
|
||||||
|
msgid "Support painting\nDid you know that you can paint the location of your supports? This feature makes it easy to place the support material only on the sections of the model that actually need it."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/data/hints.ini: [hint:Different types of supports]
|
||||||
|
msgid "Different types of supports\nDid you know that you can choose from multiple types of supports? Tree supports work great for organic models, while saving filament and improving print speed. Check them out!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/data/hints.ini: [hint:Printing Silk Filament]
|
||||||
|
msgid "Printing Silk Filament\nDid you know that Silk filament needs special consideration to print it successfully? Higher temperature and lower speed are always recommended for the best results."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/data/hints.ini: [hint:Brim for better adhesion]
|
||||||
|
msgid "Brim for better adhesion\nDid you know that when printing models have a small contact interface with the printing surface, it's recommended to use a brim?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/data/hints.ini: [hint:Set parameters for multiple objects]
|
||||||
|
msgid "Set parameters for multiple objects\nDid you know that you can set slicing parameters for all selected objects at one time?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/data/hints.ini: [hint:Stack objects]
|
||||||
|
msgid "Stack objects\nDid you know that you can stack objects as a whole one?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/data/hints.ini: [hint:Flush into support/objects/infill]
|
||||||
|
msgid "Flush into support/objects/infill\nDid you know that you can save the wasted filament by flushing them into support/objects/infill during filament change?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: resources/data/hints.ini: [hint:Improve strength]
|
||||||
|
msgid "Improve strength\nDid you know that you can use more wall loops and higher sparse infill density to improve the strength of the model?"
|
||||||
|
msgstr ""
|
||||||
2275
bbl/i18n/cs/OrcaSlicer_cs.po → localization/i18n/cs/OrcaSlicer_cs.po
Executable file → Normal file
@@ -130,5 +130,10 @@ src/libslic3r/PrintObject.cpp
|
|||||||
src/libslic3r/PrintObjectSlice.cpp
|
src/libslic3r/PrintObjectSlice.cpp
|
||||||
src/libslic3r/PlaceholderParser.cpp
|
src/libslic3r/PlaceholderParser.cpp
|
||||||
src/libslic3r/TreeSupport.cpp
|
src/libslic3r/TreeSupport.cpp
|
||||||
|
src/libslic3r/Model.cpp
|
||||||
|
src/libslic3r/Format/OBJ.cpp
|
||||||
|
src/slic3r/GUI/BonjourDialog.cpp
|
||||||
|
src/slic3r/GUI/Gizmos/GLGizmoMeshBoolean.cpp
|
||||||
|
src/slic3r/GUI/PrintHostDialogs.cpp
|
||||||
src/slic3r/GUI/calib_dlg.cpp
|
src/slic3r/GUI/calib_dlg.cpp
|
||||||
src/slic3r/GUI/PhysicalPrinterDialog.cpp
|
src/slic3r/GUI/PhysicalPrinterDialog.cpp
|
||||||
|
Before Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 7.2 KiB After Width: | Height: | Size: 7.2 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 96 KiB After Width: | Height: | Size: 96 KiB |
|
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 6.2 KiB |
|
Before Width: | Height: | Size: 7.2 KiB After Width: | Height: | Size: 7.2 KiB |
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 7.5 KiB After Width: | Height: | Size: 7.5 KiB |
|
Before Width: | Height: | Size: 7.2 KiB After Width: | Height: | Size: 7.2 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
4
resources/images/back_up_ts_bk.svg
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<svg width="162" height="162" viewBox="0 0 162 162" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<circle cx="81" cy="81" r="81" fill="white"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M161.375 70.875C161.789 74.1919 162 77.5713 162 81H151.875V70.875H161.375ZM156.113 50.625C157.438 53.8989 158.555 57.2793 159.449 60.75H151.875V50.625H156.113ZM151.875 41.7559V50.625H141.75V40.5H151.164C151.406 40.9165 151.641 41.335 151.875 41.7559ZM101.25 2.55176C104.719 3.44482 108.102 4.56299 111.375 5.88818V10.125H101.25V2.55176ZM60.75 2.55176C64.0469 1.70264 67.4297 1.05615 70.875 0.626465V10.125H60.75V2.55176ZM0.625 70.875C1.05469 67.4282 1.70312 64.0483 2.55078 60.75H10.125V70.875H0.625ZM0.625 91.125C0.210938 87.8081 0 84.4287 0 81H10.125V91.125H0.625ZM5.88672 111.375C4.5625 108.101 3.44531 104.721 2.55078 101.25H10.125V111.375H5.88672ZM10.125 120.244V111.375H20.25V121.5H10.8359C10.5938 121.083 10.3594 120.665 10.125 120.244ZM60.75 159.448C57.2812 158.555 53.8984 157.437 50.625 156.112V151.875H60.75V159.448ZM101.25 159.448C97.9531 160.297 94.5703 160.944 91.125 161.374V151.875H101.25V159.448ZM161.375 91.125C160.945 94.5718 160.297 97.9517 159.449 101.25H151.875V91.125H161.375ZM141.75 91.125V81H151.875V91.125H141.75ZM141.75 101.25V91.125H131.625V81H141.75V70.875H151.875V60.75H141.75V50.625H131.625V40.5H141.75V30.375H144.234C143.43 29.3711 142.602 28.3862 141.75 27.4224V30.375H131.625V20.25H134.578C133.613 19.3989 132.629 18.5708 131.625 17.7661V20.25H121.5V10.8364C121.082 10.5957 120.668 10.3584 120.246 10.125H111.375V20.25H101.25V10.125H91.125V0.626465C87.8086 0.212891 84.4297 0 81 0V10.125H70.875V20.25H60.75V10.125H50.625V5.88818C47.5703 7.12402 44.6094 8.54053 41.7539 10.125H50.625V20.25H40.5V10.8364C36.9453 12.8926 33.5625 15.2114 30.375 17.7661V20.25H27.4219C24.8828 22.4893 22.4883 24.8853 20.25 27.4224V30.375H17.7656C15.2109 33.5615 12.8906 36.9453 10.8359 40.5H20.25V50.625H10.125V41.7559C8.53906 44.6108 7.12109 47.5718 5.88672 50.625H10.125V60.75H20.25V70.875H10.125V81H20.25V91.125H10.125V101.25H20.25V111.375H30.375V121.5H20.25V131.625H17.7656C18.5703 132.629 19.3984 133.614 20.25 134.578V131.625H30.375V141.75H27.4219C28.3867 142.601 29.3711 143.429 30.375 144.234V141.75H40.5V151.164C40.918 151.404 41.332 151.642 41.7539 151.875H50.625V141.75H60.75V151.875H70.875V161.374C74.1914 161.787 77.5703 162 81 162V151.875H91.125V141.75H101.25V151.875H111.375V156.112C114.43 154.876 117.391 153.459 120.246 151.875H111.375V141.75H121.5V151.164C125.055 149.107 128.438 146.789 131.625 144.234V141.75H134.578C137.117 139.511 139.512 137.115 141.75 134.578V131.625H144.234C146.789 128.438 149.109 125.055 151.164 121.5H141.75V111.375H151.875V120.244C153.461 117.389 154.879 114.428 156.113 111.375H151.875V101.25H141.75ZM131.625 101.25H141.75V111.375H131.625V101.25ZM121.5 101.25H131.625V91.125H121.5V81H131.625V70.875H141.75V60.75H131.625V50.625H121.5V40.5H131.625V30.375H121.5V20.25H111.375V30.375H101.25V20.25H91.125V10.125H81V20.25H70.875V30.375H60.75V20.25H50.625V30.375H40.5V20.25H30.375V30.375H20.25V40.5H30.375V50.625H20.25V60.75H30.375V70.875H20.25V81H30.375V91.125H20.25V101.25H30.375V111.375H40.5V121.5H30.375V131.625H40.5V141.75H50.625V131.625H60.75V141.75H70.875V151.875H81V141.75H91.125V131.625H101.25V141.75H111.375V131.625H121.5V141.75H131.625V131.625H141.75V121.5H131.625V111.375H121.5V101.25ZM111.375 101.25H121.5V91.125H111.375V81H121.5V70.875H131.625V60.75H121.5V50.625H111.375V40.5H121.5V30.375H111.375V40.5H101.25V30.375H91.125V20.25H81V30.375H70.875V40.5H60.75V30.375H50.625V40.5H40.5V30.375H30.375V40.5H40.5V50.625H30.375V60.75H40.5V70.875H30.375V81H40.5V91.125H30.375V101.25H40.5V111.375H50.625V121.5H40.5V131.625H50.625V121.5H60.75V131.625H70.875V141.75H81V131.625H91.125V121.5H101.25V131.625H111.375V121.5H121.5V131.625H131.625V121.5H121.5V111.375H111.375V101.25ZM101.25 101.25H111.375V91.125H101.25V81H111.375V70.875H121.5V60.75H111.375V50.625H101.25V40.5H91.125V30.375H81V40.5H70.875V50.625H60.75V40.5H50.625V50.625H40.5V60.75H50.625V70.875H40.5V81H50.625V91.125H40.5V101.25H50.625V111.375H60.75V121.5H70.875V131.625H81V121.5H91.125V111.375H101.25V121.5H111.375V111.375H101.25V101.25ZM91.125 101.25H101.25V91.125H91.125V81H101.25V70.875H111.375V60.75H101.25V50.625H91.125V40.5H81V50.625H70.875V60.75H60.75V50.625H50.625V60.75H60.75V70.875H50.625V81H60.75V91.125H50.625V101.25H60.75V111.375H70.875V121.5H81V111.375H91.125V101.25ZM81 101.25H91.125V91.125H81V81H91.125V70.875H101.25V60.75H91.125V50.625H81V60.75H70.875V70.875H60.75V81H70.875V91.125H60.75V101.25H70.875V111.375H81V101.25ZM81 101.25H70.875V91.125H81V101.25ZM81 70.875H91.125V60.75H81V70.875ZM81 70.875H70.875V81H81V70.875Z" fill="#D9D9D9"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 4.6 KiB |