Compare commits

..

60 Commits

Author SHA1 Message Date
SoftFever
43087cc6a6 update locale and tweak some profiles 2023-08-14 20:15:57 +08:00
SoftFever
e56863af0d fix cicd build 2023-08-13 22:32:49 +08:00
Noisyfox
f714e72faa Simple brim ears impl (#1779)
* First working brim ear impl, ported from SuperSlicer

* Make brim ears configurable

* Generate ears only if ear size > 0

* Fix `Polygon::convex_points` as well as brim ear max angle

* Fix another error in `Polygon::convex_points` and `Polygon::concave_points`

* Apply brim ears to inner brims as well

* tweak hide and disable condition a bit

---------

Co-authored-by: SoftFever <softfeverever@gmail.com>
2023-08-13 22:29:45 +08:00
SoftFever
afe1030b58 test (#1785) 2023-08-13 22:16:16 +08:00
Carlos Caruncho
02405db48e Update Spanish translation (#1783)
* Some Spanish string fixes

PO updated

* More spanish strings fixes

* Compiled MO

* Update spanish strings and MO

* Update

* Update OrcaSlicer_es.po

* Update OrcaSlicer_es.po

* Delete OrcaSlicer.mo

* update .mo files

* Update OrcaSlicer_es.po

* Update OrcaSlicer_es.po

* Update OrcaSlicer_es.po

---------

Co-authored-by: SoftFever <softfeverever@gmail.com>
2023-08-13 10:26:52 +08:00
SoftFever
6298b1c449 Merge branch 'main' of github.com:SoftFever/OrcaSlicer 2023-08-13 10:07:07 +08:00
just-trey
fe1d7a0751 AnkerMake Profile Additions (#1716)
* Ankermake Profile Additions

* updated based on feedback
2023-08-13 10:06:37 +08:00
SoftFever
270fff56f5 Fix Troodon2 klipper bug 2023-08-13 09:56:24 +08:00
SoftFever
3be1168d12 Fix vivedino profile 2023-08-12 22:19:03 +08:00
SoftFever
9f5678c3d1 minor tweak internal bridge speed 2023-08-12 20:26:22 +08:00
SoftFever
5807135a1f Fixed an issue that internal_bridge_speed is applied to external bridge infills
A new extrusion role - erInternalBridgeInfill is introduced.
SuperSlicer's implementation is referenced.

Signed-off-by: SoftFever <103989404+SoftFever@users.noreply.github.com>
2023-08-12 15:38:22 +08:00
SoftFever
8dd9561574 Optimize new overhang slowdown and re-enable it #1642
Signed-off-by: SoftFever <103989404+SoftFever@users.noreply.github.com>
2023-08-12 15:34:08 +08:00
SoftFever
b79fc88ade 1.6.4-beta3 2023-08-11 21:14:25 +08:00
SoftFever
61db1ef369 misc profile fixes 2023-08-11 21:13:53 +08:00
Arthur
a1bc4b3a57 FIX: tree support's enforcers inside a hole were wrong
Previously holes of enforcer_polygons was taken as contours,
which caused enforcers inside a hole were too large.

Jira: STUDIO-3877
Change-Id: If38c34e2469b822012a2ed0b082783563fe99228
2023-08-11 20:50:03 +08:00
SoftFever
99406816cd fix crashes on some Linux distro caused by locale by @pfrench42 #235 (#1766)
fix crashes on some Linux distro caused by locale by @pfrench42

#235
2023-08-11 20:26:37 +08:00
Lee Colarelli
abc0f1c682 feat: added Anycubic Kobra 2 (#1765)
* feat: added Anycubic Kobra 2

Signed-off-by: Lee Colarelli <lee@leecolarelli.com>

* fix: corrected buildplate texture size

Signed-off-by: Lee Colarelli <lee@leecolarelli.com>

* fix: corrected max layer height

Signed-off-by: Lee Colarelli <lee@leecolarelli.com>

* fix bed model

---------

Signed-off-by: Lee Colarelli <lee@leecolarelli.com>
Co-authored-by: SoftFever <softfeverever@gmail.com>
2023-08-11 20:26:20 +08:00
SoftFever
7e87d9f031 Fix CICD 2023-08-11 18:31:52 +08:00
otkd
905ad5296b Update Ukrainian translation (#1748)
* refactor(localization): update Ukrainian

- Fixed typos and inconsistencies in existing Ukrainian translations

Signed-off-by: otkd <7527203+otkd@users.noreply.github.com>

* Update bbl/i18n/uk/OrcaSlicer_uk.po

Co-authored-by: Bohdan Keller <vickas777@gmail.com>

* Apply suggestions from code review

Co-authored-by: Bohdan Keller <vickas777@gmail.com>

* Ukrainian translation changes

- Further changes based on recommendations in #1748
- Updates .mo with current changes and from 9da51fe574db8160e4e95c04fc0bac2b2cba822e 7692851dbd808561f5ebfaacf826eb3166a84265

Signed-off-by: otkd <7527203+otkd@users.noreply.github.com>

---------

Signed-off-by: otkd <7527203+otkd@users.noreply.github.com>
Co-authored-by: Bohdan Keller <vickas777@gmail.com>
2023-08-11 08:41:00 +08:00
Alexander Sulfrian
f1afe93d6f Fix compiling imgui with boost libraries (#1755)
Addind only the include dirs is wrong. The cmake boost_headeronly
library contains more settings.

Without adding the cmake boost_headeronly library, the compilation of
imgui is missing the defines for the boost library (f.e.
BOOST_LOG_DYN_LINK) and it will result in linker errors.

Co-authored-by: SoftFever <softfeverever@gmail.com>
2023-08-11 08:20:10 +08:00
SoftFever
84a7f3c084 fix build errors 2023-08-10 23:30:37 +08:00
SoftFever
24bf61af73 increase the line width limit to 5x the nozzle diameter #1745 2023-08-10 23:00:59 +08:00
SoftFever
3e393df9df support chamber temperature per filament #1160 2023-08-10 22:08:48 +08:00
SoftFever
333a5067ec Fix a bug that overhang slowdown won't work when top z is 0 #1763 2023-08-10 21:09:27 +08:00
SoftFever
7b88104870 update locale 2023-08-10 20:43:00 +08:00
SoftFever
89ec02444a internal bridge speed 2023-08-10 17:34:51 +08:00
SoftFever
bb89336285 add One wall threshold parameter 2023-08-10 10:56:12 +08:00
SoftFever
b396f55ddc don't force build debug version of boost on Windows 2023-08-10 10:56:12 +08:00
Alexander Sulfrian
c1e85db46e Fix wxWidgets debugging macros (#1742)
wxFAIL will always generate an assert error and does not expect a
condition.
2023-08-09 23:25:25 +08:00
SoftFever
e02e8c6f15 disable GENERATOR_IS_MULTI_CONFIG for openvdb so we can skip building debug version for it. 2023-08-09 22:16:58 +08:00
SoftFever
637a171559 Fixed an unicode bug in Mesh boolean 2023-08-09 17:13:44 +08:00
SoftFever
362ee83ff3 update locale 2 2023-08-09 14:12:18 +08:00
SoftFever
37c54aa4f6 clean up 2023-08-09 13:42:41 +08:00
SoftFever
a4c632026f update loacale 2023-08-09 12:09:06 +08:00
SoftFever
b8d7661ac4 Merge branch 'main' into feature/1.6.4_rc 2023-08-09 11:41:25 +08:00
SoftFever
36750c74e6 refactor exclude object 2023-08-09 10:53:39 +08:00
SoftFever
f8c9c6bfc4 Merge some BS1.7 changes:
fix full screen issue on Windows
2023-08-09 00:47:48 +08:00
djperya
ec7f7bd484 Ukrainian translation (#1717)
* Some Ukrainian translation fixes

* Some Ukrainian translation fixes

* Update OrcaSlicer_uk.po

* Update OrcaSlicer_uk.po

clarification of the Ukrainian translation

* Update bbl/i18n/uk/OrcaSlicer_uk.po

Co-authored-by: Bohdan Keller <vickas777@gmail.com>

* Update bbl/i18n/uk/OrcaSlicer_uk.po

Co-authored-by: Bohdan Keller <vickas777@gmail.com>

* Update bbl/i18n/uk/OrcaSlicer_uk.po

Co-authored-by: Bohdan Keller <vickas777@gmail.com>

---------

Co-authored-by: Bohdan Keller <vickas777@gmail.com>
2023-08-08 23:01:37 +08:00
stasyan68
f374d34fdc Updating the Russian translation (#1718)
* Updating the Russian translation

Updating the Russian translation and adding new lines

* Add files via upload

* Delete OrcaSlicer.mo

* Create RU

* Delete RU

* Updating the Russian translation

Updating the Russian translation

* Updating the Russian translation

Updating the Russian translation

* Updating the translation into Russian, with the support of @lizardjazz11

Updating the translation into Russian, with the support of @lizardjazz1
2023-08-08 22:59:47 +08:00
Carlos Caruncho
77c00a944d Update Spanish translation (#1719)
* Some Spanish string fixes

PO updated

* More spanish strings fixes

* Compiled MO

* Update spanish strings and MO

* Update

* Update OrcaSlicer_es.po

* Update OrcaSlicer_es.po

* Delete OrcaSlicer.mo

* update .mo files

* Update OrcaSlicer_es.po

* Update OrcaSlicer_es.po

---------

Co-authored-by: SoftFever <softfeverever@gmail.com>
2023-08-08 22:45:02 +08:00
renemosner
7f07569304 Updated cs_CZ translations (#1734)
Completion of the CS/CZ translation
2023-08-08 22:44:40 +08:00
SoftFever
da05ae02da Merge some BS1.7 changes:
Boolean operation feature
2023-08-08 22:14:20 +08:00
SoftFever
9e73dfeb5d enforce no tracking 2023-08-08 19:36:24 +08:00
SoftFever
bcbbbf35db Merge some BS1.7 changes:
internal_solid_infill_pattern
2023-08-08 19:08:13 +08:00
SoftFever
7ece35931e Merge some BS1.7 changes:
Port object canceling for BL X1 from BS.

Todo: refactor
2023-08-08 19:08:13 +08:00
SoftFever
3acd89e877 Merge some BS1.7 changes:
bring back fill_bed feature, original implemention from PrusaSlicer. BS added exclusion logic.
2023-08-08 19:08:13 +08:00
SoftFever
b8db25ac0e revert PA tower 2023-08-06 23:19:02 +08:00
SoftFever
dc55845a40 tweak machine end gcode for qidi 2023-08-06 23:18:36 +08:00
SoftFever
6800291468 Revert "update PA tower so it's one wall for most nozzles(0.4 upwards)"
This reverts commit ab6649da8a.
2023-08-06 21:20:59 +08:00
SoftFever
fcc19342c5 DummyPR (#1698)
* upload deps binaries
2023-08-06 18:24:49 +08:00
SoftFever
ff6bf5e5ad update Czech translation on behalf of @renemosner (#1702) 2023-08-06 18:12:01 +08:00
SoftFever
ba3c1eb23b Update README.md
update discord link
2023-08-05 09:49:54 +08:00
SoftFever
4705867d2a Update README.md 2023-08-05 09:40:05 +08:00
SoftFever
0fa666792a bump version to 1.6.4-beta2 2023-08-04 21:05:36 +08:00
SoftFever
14f248f8fa fixed an bug that CN plate name was not working properly 2023-08-04 20:36:32 +08:00
Hotsolidinfill
580424701b fix Korean font not be loaded properly (#1681)
* Update Korean Translation
- Make overhang printable
- Lift Z Enforcement
- etc

* fix Korean font not be loaded
2023-08-04 19:15:15 +08:00
Carlos Caruncho
127ce2b909 Spanish translation update (#1646)
* Some Spanish string fixes

PO updated

* More spanish strings fixes

* Compiled MO

* Update spanish strings and MO

* Update

* Update OrcaSlicer_es.po

* Update OrcaSlicer_es.po

* Delete OrcaSlicer.mo

* update .mo files

---------

Co-authored-by: SoftFever <softfeverever@gmail.com>
2023-08-04 19:11:58 +08:00
SoftFever
013a64243f tweak single wall #1680 2023-08-04 18:56:58 +08:00
SoftFever
ce59235bd7 Fix set fan bug 2023-08-04 18:56:58 +08:00
djperya
d381a5ed11 Ukrainian translation (#1672)
* Some Ukrainian translation fixes

* Some Ukrainian translation fixes

* Update OrcaSlicer_uk.po
2023-08-04 18:46:59 +08:00
565 changed files with 78394 additions and 12830 deletions

View File

@@ -7,16 +7,18 @@ on:
- main
paths:
- 'deps/**'
- .github/workflows/build_deps.yml
push:
branches:
- main
paths:
- 'deps/**'
- .github/workflows/build_deps.yml
jobs:
build_deps:
strategy:
fail-fast: true
fail-fast: false
matrix:
include:
- os: ubuntu-22.04
@@ -35,6 +37,18 @@ jobs:
if: matrix.os == 'Windows'
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
if: matrix.os == 'windows-2019'
working-directory: ${{ github.workspace }}
@@ -43,6 +57,9 @@ jobs:
mkdir ${{ github.workspace }}/deps/build
mkdir ${{ github.workspace }}/deps/build/OrcaSlicer_dep
.\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
if: matrix.os == 'macos-12' && matrix.arch == 'x86_64'
@@ -51,7 +68,7 @@ jobs:
brew install cmake git gettext
mkdir -p ${{ github.workspace }}/deps/build_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
if: matrix.os == 'macos-12' && matrix.arch == 'arm64'
@@ -60,7 +77,7 @@ jobs:
brew install cmake git gettext
mkdir -p ${{ github.workspace }}/deps/build_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
if: matrix.os == 'ubuntu-22.04'
@@ -76,4 +93,33 @@ jobs:
mkdir -p ${{ github.workspace }}/deps/build/destdir
sudo ./BuildLinux.sh -ur
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

View File

@@ -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'

View File

@@ -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

View File

@@ -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
View 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'

View File

@@ -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
View File

@@ -25,6 +25,4 @@ build_*/
SVG
src/OrcaSlicer-doc/
.idea/
bbl/i18n/es/OrcaSlicer_es.mo
bbl/i18n/es/OrcaSlicer.mo
/.cache/

View File

@@ -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
}
}

View File

@@ -40,7 +40,7 @@ while getopts ":dsiuhgbr" opt; do
BUILD_DEPS="1"
;;
s )
BUILD_BAMBU_STUDIO="1"
BUILD_ORCA="1"
;;
b )
BUILD_DEBUG="1"
@@ -87,7 +87,7 @@ then
mkdir build
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"
# libwebkit2gtk-4.1-dev ??
export DEV_PACKAGES_COUNT=$(echo ${REQUIRED_DEV_PACKAGES} | wc -w)
@@ -212,7 +212,7 @@ then
echo "done"
fi
if [[ -n "$BUILD_BAMBU_STUDIO" ]]
if [[ -n "$BUILD_ORCA" ]]
then
echo "[7/9] Configuring Slic3r..."
BUILD_ARGS=""

View File

@@ -510,7 +510,7 @@ endif ()
# l10n
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
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"
@@ -708,8 +708,8 @@ elseif (SLIC3R_FHS)
)
install(FILES src/platform/unix/OrcaSlicer.desktop DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/applications)
foreach(SIZE 32 128 192)
install(FILES ${SLIC3R_RESOURCES_DIR}/images/BambuStudio_${SIZE}px.png
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/${SIZE}x${SIZE}/apps RENAME BambuStudio.png
install(FILES ${SLIC3R_RESOURCES_DIR}/images/OrcaSlicer_${SIZE}px.png
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/${SIZE}x${SIZE}/apps RENAME OrcaSlicer.png
)
endforeach()
elseif (CMAKE_MACOSX_BUNDLE)

View File

@@ -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

View File

@@ -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

View File

@@ -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 $*

View File

@@ -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"]

View File

@@ -4,14 +4,10 @@
[![Build Mac Intel](https://github.com/SoftFever/OrcaSlicer/actions/workflows/build_mac_x64.yml/badge.svg)](https://github.com/SoftFever/OrcaSlicer/actions/workflows/build_mac_x64.yml)
[![Build Linux](https://github.com/SoftFever/OrcaSlicer/actions/workflows/build_linux.yml/badge.svg)](https://github.com/SoftFever/OrcaSlicer/actions/workflows/build_linux.yml)
# Orca Slicer
Orca Slicer is a fork of Bambu Studio. It was previously known as BambuStudio-SoftFever.
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.
Orca Slicer incorporates a lot of features from SuperSlicer by @supermerill
Prebuilt binaries are available through the [github releases page](https://github.com/SoftFever/OrcaSlicer/releases/).
# Orca Slicer
Orca Slicer is an open source slicer for FDM printers.
You can download Orca Slicer here: [github releases page](https://github.com/SoftFever/OrcaSlicer/releases/).
![discord-mark-blue](https://github.com/SoftFever/OrcaSlicer/assets/103989404/b97d5ffc-072d-4d0a-bbda-e67ef373876f) Join community: [OrcaSlicer Official Discord Server](https://discord.gg/WTEkCR6SnV)
# Main features
- Auto calibrations for all printers
@@ -21,6 +17,13 @@ Prebuilt binaries are available through the [github releases page](https://githu
- More granular controls
- 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
**Windows**:
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.
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.

View File

@@ -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}")

View File

@@ -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" )

View File

@@ -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;
}
}

View File

@@ -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

View File

@@ -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;
}

View File

@@ -3,17 +3,17 @@ cd deps
mkdir build
cd build
set DEPS=%CD%/OrcaSlicer_dep
if "%1"=="studio" (
GOTO :studio
if "%1"=="slicer" (
GOTO :slicer
)
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
cmake --build . --config Release --target deps -- -m
if "%1"=="deps" exit /b 0
:studio
echo "building studio..."
:slicer
echo "building Orca Slicer..."
cd %WP%
mkdir build
cd build

View File

@@ -12,7 +12,7 @@ while getopts ":a:sdphn" opt; do
export ARCH="$OPTARG"
;;
s )
export BUILD_TARGET="studio"
export BUILD_TARGET="slicer"
;;
n )
export NIGHTLY_BUILD="1"
@@ -20,7 +20,7 @@ while getopts ":a:sdphn" opt; do
h ) echo "Usage: ./build_release_macos.sh [-d]"
echo " -d: Build deps only"
echo " -a: Set ARCHITECTURE (arm64 or x86_64)"
echo " -s: Build studio only"
echo " -s: Build slicer only"
echo " -n: Nightly build"
exit 0
;;
@@ -54,12 +54,12 @@ mkdir -p build_$ARCH
cd build_$ARCH
DEPS=$PWD/OrcaSlicer_dep_$ARCH
mkdir -p $DEPS
if [ "studio." != $BUILD_TARGET. ];
if [ "slicer." != $BUILD_TARGET. ];
then
echo "building deps..."
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 --build . --config Release --target all
cmake --build . --config Release --target deps
if [ "1." == "$PACK_DEPS". ];
then
tar -zcvf OrcaSlicer_dep_mac_${ARCH}_$(date +"%d-%m-%Y").tar.gz OrcaSlicer_dep_$ARCH
@@ -75,7 +75,7 @@ fi
cd $WD
mkdir -p 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 --build . --config Release --target ALL_BUILD
mkdir -p OrcaSlicer

View File

@@ -3,17 +3,17 @@ cd deps
mkdir build
cd build
set DEPS=%CD%/OrcaSlicer_dep
if "%1"=="studio" (
GOTO :studio
if "%1"=="slicer" (
GOTO :slicer
)
echo "building deps.."
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
:studio
echo "building studio..."
:slicer
echo "building Orca Slicer..."
cd %WP%
mkdir build
cd build

View File

@@ -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

View File

@@ -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

View File

@@ -238,7 +238,8 @@ endif()
set(OpenVDB_LIB_COMPONENTS "")
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})
set(LIB_NAME ${COMPONENT})

View File

@@ -52,7 +52,7 @@
<string>OBJ</string>
</array>
<key>CFBundleTypeIconFile</key>
<string>BambuStudio.icns</string>
<string>OrcaSlicer.icns</string>
<key>CFBundleTypeName</key>
<string>STL</string>
<key>CFBundleTypeRole</key>
@@ -69,7 +69,7 @@
<string>AMF</string>
</array>
<key>CFBundleTypeIconFile</key>
<string>BambuStudio.icns</string>
<string>OrcaSlicer.icns</string>
<key>CFBundleTypeName</key>
<string>AMF</string>
<key>CFBundleTypeRole</key>
@@ -86,7 +86,7 @@
<string>3MF</string>
</array>
<key>CFBundleTypeIconFile</key>
<string>BambuStudio.icns</string>
<string>OrcaSlicer.icns</string>
<key>CFBundleTypeName</key>
<string>3MF</string>
<key>CFBundleTypeRole</key>

View File

@@ -7,7 +7,7 @@ else()
endif()
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_HASH SHA256=7463a1df566704f212263312717ab2c36b45d45cba6cd0dccebf91b2cc4b4da9
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
)
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_HASH SHA256=7463a1df566704f212263312717ab2c36b45d45cba6cd0dccebf91b2cc4b4da9
URL https://github.com/tamasmeszaros/c-blosc/archive/refs/heads/v1.17.0_tm.zip

View File

@@ -90,7 +90,7 @@ if (_cfg_rel GREATER -1 OR _cfg_relwdeb GREATER -1 OR _cfg_minsizerel GREATER -1
list(APPEND _boost_variants release)
endif()
if (_cfg_deb GREATER -1 OR (MSVC AND ${DEP_DEBUG}) )
if (MSVC AND ${DEP_DEBUG} )
list(APPEND _boost_variants debug)
endif()

View File

@@ -1,4 +1,4 @@
bambustudio_add_cmake_project(
orcaslicer_add_cmake_project(
CGAL
GIT_REPOSITORY https://github.com/CGAL/cgal.git
GIT_TAG caacd806dc55c61cc68adaad99f2240f00493b29 # releases/CGAL-5.3

6
deps/CMakeLists.txt vendored
View File

@@ -34,7 +34,7 @@ endif ()
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.")
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")
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.")
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})
set(_configs_line -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE})
@@ -145,7 +145,7 @@ else()
endif()
endfunction(bambustudio_add_cmake_project)
endfunction(orcaslicer_add_cmake_project)
if (MSVC)

View File

@@ -55,7 +55,7 @@ else()
set(_curl_static ON)
endif()
bambustudio_add_cmake_project(CURL
orcaslicer_add_cmake_project(CURL
# GIT_REPOSITORY https://github.com/curl/curl.git
# GIT_TAG curl-7_75_0
URL https://github.com/curl/curl/archive/refs/tags/curl-7_75_0.zip

View File

@@ -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_HASH SHA256=1921f26d2e1daf9132da3c432e2fd02093ecaedf846e65d7679ddf868c7289c4
CMAKE_ARGS

View File

@@ -1,4 +1,4 @@
bambustudio_add_cmake_project(EXPAT
orcaslicer_add_cmake_project(EXPAT
# GIT_REPOSITORY https://github.com/nigels-com/glew.git
# GIT_TAG 3a8eff7 # 2.1.0
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/expat

View File

@@ -10,7 +10,7 @@ else()
set(_ft_disable_zlib "-D FT_DISABLE_ZLIB=TRUE")
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_HASH SHA256=efe71fd4b8246f1b0b1b9bfca13cfff1c9ad85930340c27df469733bbb620938
#DEPENDS ${ZLIB_PKG}

View File

@@ -2,7 +2,7 @@
set(OpenGL_GL_PREFERENCE "LEGACY") # to prevent a nasty warning by cmake
find_package(OpenGL QUIET REQUIRED)
bambustudio_add_cmake_project(
orcaslicer_add_cmake_project(
GLEW
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/glew
)

View File

@@ -12,7 +12,7 @@ else()
set(_glfw_use_wayland "-DGLFW_USE_WAYLAND=FF")
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_HASH SHA256=e02d956935e5b9fb4abf90e2c2e07c9a0526d7eacae8ee5353484c69a2a76cd0
#DEPENDS dep_Boost

View File

@@ -11,7 +11,7 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
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_HASH SHA256=017bdc33ff3a72e11301c0feb4657cb27719d7f97fa67a78ed506c594218bbf1
DEPENDS ${ZLIB_PKG}

View File

@@ -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_HASH SHA256=c6dd7a5701fff8ad5ebb45a3dc8e757e61d52658de3918e38bab233e7fd3b4ae
CMAKE_ARGS

View File

@@ -8,7 +8,7 @@ endif()
# get relative path of CMAKE_BINARY_DIR against root source directory
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_HASH SHA256=28334f0e98f1b1629799783e9b4d21e05349d89e695809d7e6dfa45ea43e1dbc
#PATCH_COMMAND ${PATCH_CMD} ${CMAKE_CURRENT_LIST_DIR}/0001-OCCT-fix.patch

View File

@@ -1,5 +1,5 @@
bambustudio_add_cmake_project(OpenCSG
orcaslicer_add_cmake_project(OpenCSG
# GIT_REPOSITORY https://github.com/floriankirsch/OpenCSG.git
# GIT_TAG 83e274457b46c9ad11a4ee599203250b1618f3b9 #v1.4.2
URL https://github.com/floriankirsch/OpenCSG/archive/refs/tags/opencsg-1-4-2-release.zip

View File

@@ -36,7 +36,7 @@ else ()
set(_patch_cmd "")
endif ()
bambustudio_add_cmake_project(OpenEXR
orcaslicer_add_cmake_project(OpenEXR
# GIT_REPOSITORY https://github.com/openexr/openexr.git
URL https://github.com/AcademySoftwareFoundation/openexr/archive/refs/tags/v2.5.5.zip
URL_HASH SHA256=0307a3d7e1fa1e77e9d84d7e9a8694583fbbbfd50bdc6884e2c96b8ef6b902de

View File

@@ -6,7 +6,7 @@ else()
set(_build_static ON)
endif()
bambustudio_add_cmake_project(OpenVDB
orcaslicer_add_cmake_project(OpenVDB
# support vs2022, update to 8.2
URL https://github.com/tamasmeszaros/openvdb/archive/a68fd58d0e2b85f01adeb8b13d7555183ab10aa5.zip
URL_HASH SHA256=f353e7b99bd0cbfc27ac9082de51acf32a8bc0b3e21ff9661ecca6f205ec1d81

4
deps/PNG/PNG.cmake vendored
View File

@@ -7,7 +7,7 @@ endif ()
if(APPLE AND IS_CROSS_COMPILE)
# 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_TAG v1.6.35
DEPENDS ${ZLIB_PKG}
@@ -26,7 +26,7 @@ set(_patch_step "")
if (APPLE)
set(_patch_step PATCH_COMMAND ${PATCH_CMD} ${CMAKE_CURRENT_LIST_DIR}/PNG.patch)
endif ()
bambustudio_add_cmake_project(PNG
orcaslicer_add_cmake_project(PNG
# GIT_REPOSITORY https://github.com/glennrp/libpng.git
# GIT_TAG v1.6.35
URL https://github.com/glennrp/libpng/archive/refs/tags/v1.6.35.zip

View File

@@ -1,5 +1,5 @@
include(GNUInstallDirs)
bambustudio_add_cmake_project(Qhull
orcaslicer_add_cmake_project(Qhull
URL "https://github.com/qhull/qhull/archive/v8.0.1.zip"
URL_HASH SHA256=5287f5edd6a0372588f5d6640799086a4033d89d19711023ef8229dd9301d69b
CMAKE_ARGS

2
deps/TBB/TBB.cmake vendored
View File

@@ -1,4 +1,4 @@
bambustudio_add_cmake_project(
orcaslicer_add_cmake_project(
TBB
URL "https://github.com/oneapi-src/oneTBB/archive/refs/tags/v2021.5.0.zip"
URL_HASH SHA256=83ea786c964a384dd72534f9854b419716f412f9d43c0be88d41874763e7bb47

View File

@@ -2,7 +2,7 @@ find_package(OpenGL QUIET REQUIRED)
if (APPLE)
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_HASH SHA256=4fca1b582c88319f3ad6ecd5b46320eadaf5eb4ef6f6c32d44caaae4a03d0726
DEPENDS ${ZLIB_PKG} ${PNG_PKG} dep_JPEG
@@ -14,7 +14,7 @@ if (APPLE)
-Dpixarlog:BOOL=OFF
)
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_HASH SHA256=c56edfacef0a60c0de3e6489194fcb2f24c03dbb550a8a7de5938642d045bd32
DEPENDS ${ZLIB_PKG} ${PNG_PKG} dep_JPEG

View File

@@ -1,4 +1,4 @@
bambustudio_add_cmake_project(ZLIB
orcaslicer_add_cmake_project(ZLIB
# GIT_REPOSITORY https://github.com/madler/zlib.git
# GIT_TAG v1.2.11
URL https://github.com/madler/zlib/archive/refs/tags/v1.2.11.zip

View File

@@ -26,7 +26,7 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
set(_patch_cmd ${PATCH_CMD} ${CMAKE_CURRENT_LIST_DIR}/0001-wxWidget-fix.patch)
endif ()
bambustudio_add_cmake_project(
orcaslicer_add_cmake_project(
wxWidgets
GIT_REPOSITORY "https://github.com/wxWidgets/wxWidgets"
GIT_TAG ${_wx_git_tag}

View File

@@ -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
1. Get PO-file 'BambuStudio_xx.pot' from corresponding sub-folder here:
https://github.com/bambulab/BambuStudio/tree/master/bbl/i18n
1. Get PO-file 'OrcaSlicer_xx.pot' from corresponding sub-folder here:
https://github.com/softfever/OrcaSlicer/tree/master/localization/i18n
2. Open this file in PoEdit as "Edit a translation"
3. Apply your corrections to the translation
4. Push changed BambuStudio_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.
4. Push changed OrcaSlicer_xx.po into the original folder
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
1. Get file BambuStudio.pot here :
https://github.com/bambulab/BambuStudio/tree/master/bbl/i18n
1. Get file OrcaSlicer.pot here :
https://github.com/softfever/OrcaSlicer/tree/master/localization/i18n
2. Open it in PoEdit for "Create new translation"
3. Select Translation Language (for example 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:
- Rename the file to BambuStudio_fr.po
- Click "Save file" button. BambuStudio_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
- copy BambuStudio_xx.mo into resources/i18n/xx and rename it to BambuStudio.mo, then push the changed file.
- Rename the file to OrcaSlicer_fr.po
- 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/softfever/OrcaSlicer/tree/master/localization/i18n, and be pushed
- 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).
### 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
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:
```
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

View File

@@ -6,58 +6,58 @@
"files": [
{
"type": "po",
"pattern": "bbl/i18n/en/OrcaSlicer_en.po",
"pattern": "localization/i18n/en/OrcaSlicer_en.po",
"lang": "en"
},
{
"type": "po",
"pattern": "bbl/i18n/fr/OrcaSlicer_fr.po",
"pattern": "localization/i18n/fr/OrcaSlicer_fr.po",
"lang": "fr"
},
{
"type": "po",
"pattern": "bbl/i18n/de/OrcaSlicer_de.po",
"pattern": "localization/i18n/de/OrcaSlicer_de.po",
"lang": "de"
},
{
"type": "po",
"pattern": "bbl/i18n/sv/OrcaSlicer_sv.po",
"pattern": "localization/i18n/sv/OrcaSlicer_sv.po",
"lang": "sv"
},
{
"type": "po",
"pattern": "bbl/i18n/es/OrcaSlicer_es.po",
"pattern": "localization/i18n/es/OrcaSlicer_es.po",
"lang": "es"
},
{
"type": "po",
"pattern": "bbl/i18n/nl/OrcaSlicer_nl.po",
"pattern": "localization/i18n/nl/OrcaSlicer_nl.po",
"lang": "nl"
},
{
"type": "po",
"pattern": "bbl/i18n/hu/OrcaSlicer_hu.po",
"pattern": "localization/i18n/hu/OrcaSlicer_hu.po",
"lang": "hu"
},
{
"type": "po",
"pattern": "bbl/i18n/ja/OrcaSlicer_ja.po",
"pattern": "localization/i18n/ja/OrcaSlicer_ja.po",
"lang": "ja"
},
{
"type": "po",
"pattern": "bbl/i18n/ko/OrcaSlicer_ko.po",
"pattern": "localization/i18n/ko/OrcaSlicer_ko.po",
"lang": "ko"
},
{
"type": "po",
"pattern": "bbl/i18n/ru/OrcaSlicer_ru.po",
"pattern": "localization/i18n/ru/OrcaSlicer_ru.po",
"lang": "ru"
}
]
},
"download": {
"folder": "bbl/i18n",
"folder": "localization/i18n",
"includeSourceLang" : "true",
"files": {
"output": "${lang}/OrcaSlicer_${lang}.po"

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\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"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -656,7 +656,7 @@ msgid "Open Project"
msgstr ""
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"
msgstr ""
@@ -847,6 +847,12 @@ msgstr ""
msgid "Set as individual objects"
msgstr ""
msgid "Fill bed with copies"
msgstr ""
msgid "Fill the remaining area of bed with copies of the selected object"
msgstr ""
msgid "Printable"
msgstr ""
@@ -1549,6 +1555,15 @@ msgstr ""
msgid "Orienting"
msgstr ""
msgid "Filling bed "
msgstr ""
msgid "Bed filling canceled."
msgstr ""
msgid "Bed filling done."
msgstr ""
msgid "Error! Unable to create thread!"
msgstr ""
@@ -2785,6 +2800,9 @@ msgstr ""
msgid "An object is layed over the boundary of plate."
msgstr ""
msgid "A G-code path goes beyond the max print height."
msgstr ""
msgid "A G-code path goes beyond the boundary of plate."
msgstr ""
@@ -2797,12 +2815,6 @@ msgid ""
"confirming that the height is within the build volume."
msgstr ""
msgid "Jump to"
msgstr ""
msgid "ERROR:"
msgstr ""
msgid "Calibration step selection"
msgstr ""
@@ -3357,7 +3369,7 @@ msgstr ""
msgid ""
"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?"
msgstr ""
@@ -3750,6 +3762,9 @@ msgstr ""
msgid "Slice ok."
msgstr ""
msgid "Jump to"
msgstr ""
msgid "Error:"
msgstr ""
@@ -3759,6 +3774,9 @@ msgstr ""
msgid "Export successfully."
msgstr ""
msgid "Serious warning:"
msgstr ""
msgid " (Repair)"
msgstr ""
@@ -4231,6 +4249,11 @@ msgid ""
"on the printer."
msgstr ""
msgid ""
"Unable to perform boolean operation on model meshes. Only positive parts "
"will be exported."
msgstr ""
msgid ""
"Print By Object: \n"
"Suggest to use auto-arrange to avoid collisions when printing."
@@ -4251,6 +4274,14 @@ msgstr ""
msgid "Plate Settings"
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
msgid "Part name: %1%\n"
msgstr ""
@@ -4961,8 +4992,8 @@ msgstr ""
msgid ""
"When recording timelapse without toolhead, it is recommended to add a "
"\"Timelapse Wipe Tower\" \n"
"by right-click the empty position of build plate and choose \"Add Primitive"
"\"->\"Timelapse Wipe Tower\"."
"by right-click the empty position of build plate and choose \"Add "
"Primitive\"->\"Timelapse Wipe Tower\"."
msgstr ""
msgid "Line width"
@@ -4998,6 +5029,12 @@ msgid ""
"the overhang degree range and wall speed is used"
msgstr ""
msgid "Bridge"
msgstr ""
msgid "Set speed for external and internal bridges"
msgstr ""
msgid "Travel speed"
msgstr ""
@@ -5064,9 +5101,6 @@ msgstr ""
msgid "Print temperature"
msgstr ""
msgid "Chamber temperature"
msgstr ""
msgid "Nozzle"
msgstr ""
@@ -5924,7 +5958,7 @@ msgstr ""
msgid "Bottom surface"
msgstr ""
msgid "Bridge"
msgid "Internal Bridge"
msgstr ""
msgid "Gap infill"
@@ -6073,9 +6107,6 @@ msgstr ""
msgid "No extrusions under current settings."
msgstr ""
msgid "Bed temperatures for the used filaments differ significantly."
msgstr ""
msgid ""
"Smooth mode of timelapse is not supported when \"by object\" sequence is "
"enabled."
@@ -6436,6 +6467,21 @@ msgid ""
"pattern"
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"
msgstr ""
@@ -6459,12 +6505,23 @@ msgstr ""
msgid "mm/s or %"
msgstr ""
msgid "External"
msgstr ""
msgid "Speed of bridge and completely overhang wall"
msgstr ""
msgid "mm/s"
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"
msgstr ""
@@ -6479,6 +6536,9 @@ msgid ""
"models. Auto means the brim width is analysed and calculated automatically."
msgstr ""
msgid "Mouse ear"
msgstr ""
msgid "outer_only"
msgstr ""
@@ -6496,6 +6556,30 @@ msgid ""
"easily"
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"
msgstr ""
@@ -6654,6 +6738,14 @@ msgstr ""
msgid "Line pattern of bottom surface infill, not bridge infill"
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 ""
"Line width of outer wall. If expressed as a %, it will be computed over the "
"nozzle diameter."
@@ -6888,6 +6980,12 @@ msgstr ""
msgid "money/kg"
msgstr ""
msgid "Vendor"
msgstr ""
msgid "Vendor of filament. For show only"
msgstr ""
msgid "(Undefined)"
msgstr ""
@@ -7100,10 +7198,10 @@ msgstr ""
msgid ""
"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"
"\". \"full_fan_speed_layer\" will be ignored if lower than "
"\"close_fan_the_first_x_layers\", in which case the fan will be running at "
"maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1."
"\"close_fan_the_first_x_layers\" to maximum at layer "
"\"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower "
"than \"close_fan_the_first_x_layers\", in which case the fan will be running "
"at maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1."
msgstr ""
msgid "Support interface fan speed"
@@ -7340,6 +7438,9 @@ msgstr ""
msgid "All solid layer"
msgstr ""
msgid "Ironing Pattern"
msgstr ""
msgid "Ironing flow"
msgstr ""
@@ -8002,6 +8103,12 @@ msgid ""
"etc."
msgstr ""
msgid "Remove small overhangs"
msgstr ""
msgid "Remove small overhangs that possibly need no supports."
msgstr ""
msgid "Top Z distance"
msgstr ""
@@ -8201,6 +8308,9 @@ msgid ""
"support"
msgstr ""
msgid "Chamber temperature"
msgstr ""
msgid "Target chamber temperature"
msgstr ""
@@ -8479,6 +8589,12 @@ msgstr ""
msgid "Load cached slicing data from directory"
msgstr ""
msgid "Export STL"
msgstr ""
msgid "Export the objects as multiple STL."
msgstr ""
msgid "Slice"
msgstr ""
@@ -8494,6 +8610,12 @@ msgstr ""
msgid "Update the configs values of 3mf to latest."
msgstr ""
msgid "Load default filaments"
msgstr ""
msgid "Load first filament as default for those not loaded"
msgstr ""
msgid "mtcpp"
msgstr ""
@@ -8542,6 +8664,12 @@ msgstr ""
msgid "Arrange options: 0-disable, 1-enable, others-auto"
msgstr ""
msgid "Repetions count"
msgstr ""
msgid "Repetions count of the whole model"
msgstr ""
msgid "Convert Unit"
msgstr ""
@@ -8572,6 +8700,14 @@ msgstr ""
msgid "Skip some objects in this print"
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"
msgstr ""
@@ -8685,6 +8821,159 @@ msgstr ""
msgid "Support: propagate branches at layer %d"
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"
msgstr ""
@@ -8852,3 +9141,103 @@ msgstr ""
msgid "Connection to printers connected via the print host failed."
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 ""

File diff suppressed because it is too large Load Diff

View File

@@ -130,5 +130,10 @@ src/libslic3r/PrintObject.cpp
src/libslic3r/PrintObjectSlice.cpp
src/libslic3r/PlaceholderParser.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/PhysicalPrinterDialog.cpp

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

View File

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 7.2 KiB

View File

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

View File

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

View File

Before

Width:  |  Height:  |  Size: 96 KiB

After

Width:  |  Height:  |  Size: 96 KiB

View File

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 6.2 KiB

View File

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 7.2 KiB

View File

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 21 KiB

View File

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 7.5 KiB

View File

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 7.2 KiB

View File

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

View File

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

View 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

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