Compare commits
398 Commits
7dc6741808
...
dev
| Author | SHA1 | Date | |
|---|---|---|---|
| 132f0f3646 | |||
|
|
8835175fb3 | ||
| 28c3abdb4a | |||
| b30bfc9293 | |||
| d70423fcc0 | |||
| 1b7c0c48e7 | |||
|
|
cb86137730 | ||
| c8913af660 | |||
| 9611049e01 | |||
| bad5947fb5 | |||
| d27558a3ee | |||
| 81f6f78c49 | |||
| bf593445bd | |||
| aa032c0140 | |||
|
|
95e60692c0 | ||
| fda2cdbecb | |||
| a1cc9f18c4 | |||
| 084d35d605 | |||
|
|
02aac24a09 | ||
| 51c2bf6985 | |||
| 4e99d12be1 | |||
| 8b5d8f92e0 | |||
| d3c9dd6eb9 | |||
| 254ff36c50 | |||
| b317196217 | |||
| cc343ee27c | |||
| 74d1b16b7c | |||
| adf6889712 | |||
| 653082868a | |||
| 997e770256 | |||
| fb1a6456e6 | |||
| 43cd80600e | |||
|
|
23e1abdbbb | ||
| e575021f53 | |||
| 7e8c89ce45 | |||
| a40a8df894 | |||
|
|
41f36ed18a | ||
| e04189bbfe | |||
| 20988e425a | |||
| df63937406 | |||
| 4ba408859d | |||
| 996e95f93c | |||
|
|
c4bd0b5a67 | ||
| 5c43873ede | |||
| 249645619e | |||
| be9f303b37 | |||
| 6da8b3b6e4 | |||
| a3cd451575 | |||
|
|
6f700c923a | ||
| 46fd59ed71 | |||
| ba49463ee7 | |||
| 576380e9a0 | |||
| cac534ccbb | |||
| 2e68105da4 | |||
| ed7ed6636d | |||
| e190359041 | |||
|
|
bed94790d4 | ||
| d8ad61ec54 | |||
| 7e9a1482d6 | |||
| aa0adbf993 | |||
| 00af9a9701 | |||
| fcdede2dd6 | |||
| 5d17b23c3a | |||
| 1ec8a43a50 | |||
| 96cfa91c67 | |||
| 669ace82c0 | |||
| 93163ae6e8 | |||
| af2d506da1 | |||
| 637541994a | |||
|
|
63cd4c4f5e | ||
| fd4104da39 | |||
| 5bb23fbcfa | |||
| 6a22c54e9f | |||
| 3ac3262e77 | |||
| 18ecc07240 | |||
| cb468492b3 | |||
| 379a2161ca | |||
| c47a7e28c7 | |||
|
|
502126c915 | ||
| 2ace632022 | |||
| feee2b0bff | |||
| b7dfc53bc0 | |||
| d77c3c7a5c | |||
|
|
faaa59ae01 | ||
| 1bde2690b6 | |||
| 92fddd9e4a | |||
| f9414b2db7 | |||
| d1e7e7eaca | |||
| 75929a15f8 | |||
| c0585d7107 | |||
| aeeed1c138 | |||
| 10f05fabc9 | |||
| 78b719d3c2 | |||
|
|
052ade3e91 | ||
| 035851133e | |||
| 1ff8883d25 | |||
| 30ada043ef | |||
| e0aaa7c92e | |||
| edae13541f | |||
| d150c19f9f | |||
| 71890e4cc2 | |||
| 95494efcae | |||
| 8893a80c12 | |||
| a4facf74d7 | |||
| ed8fd89217 | |||
| 58869be9f7 | |||
| fda0174a77 | |||
|
|
52c6239f6d | ||
| c007cee093 | |||
| d011268d20 | |||
| 126d3ef4c4 | |||
| 3f228ef6e2 | |||
| 8733184dc5 | |||
| 5f815d8a54 | |||
| 6d491eb694 | |||
|
|
42e0e75d70 | ||
| c24e27a9db | |||
| 3d12ae4da4 | |||
|
|
b9e6916dfe | ||
| 7cd9ef53b5 | |||
| e747a9820e | |||
| ba6940e64b | |||
|
|
4342e9b1b1 | ||
| a212a1d8cc | |||
| cd0c13203f | |||
| 77d7bdb265 | |||
| fb5e753769 | |||
| c953232f3c | |||
| cd2666d8e2 | |||
| 2f34c52b6f | |||
|
|
2606b22185 | ||
| 038e1634eb | |||
| f03f111d5e | |||
| aaa58346d3 | |||
| 506762c538 | |||
|
|
492d474c82 | ||
| 225995c892 | |||
| dfe109ac8d | |||
| ca22c0c461 | |||
| 8afab3e58e | |||
| b4462dcd9d | |||
|
|
f598e376a6 | ||
| e8ebef926e | |||
| 85598dee3b | |||
| 2dbf7e9c09 | |||
|
|
210820185b | ||
| 7615b8b601 | |||
| 17df0c6b9b | |||
| 9e306ea1d1 | |||
| 3ab518a9b6 | |||
| 63804e7561 | |||
| 0c4800443f | |||
| 72c0c2c098 | |||
| b517373538 | |||
| 1bd6a43614 | |||
|
|
575a540a70 | ||
| 47c442aba9 | |||
| 042c254691 | |||
| 7a699d2adf | |||
| 00825b1002 | |||
|
|
811e0f441b | ||
| 235fe7780d | |||
| 93b0b55f43 | |||
| cdd0d22d9a | |||
| 0a3510e996 | |||
| 819ac01d44 | |||
|
|
aa6322e928 | ||
| a7491130fb | |||
| 8e23bd97e6 | |||
| 71424f086e | |||
| b2edf5ec4c | |||
| 8c61990827 | |||
| 54b50028b1 | |||
| 40da5ff1b7 | |||
| 9facf05c10 | |||
| fe3951b6c3 | |||
| 1effd4926f | |||
|
|
d061f21d79 | ||
| 266fab5e17 | |||
| a4b85b01bd | |||
| 30e28cb019 | |||
| 1a36808d9f | |||
| 8a57aa78fb | |||
| de9e473cca | |||
| a7f58175fa | |||
| 460b878fbb | |||
| 4a8925df13 | |||
| db3619e889 | |||
|
|
5e5a3949d4 | ||
| 0ef97eeb9b | |||
| 6149e4ac43 | |||
|
|
57360bacd0 | ||
| db3708aef6 | |||
| 2050ff35f4 | |||
| 038e79e52a | |||
| 6f47d02813 | |||
| 3916f3ace6 | |||
| df3fecf722 | |||
| 2c4fa570e1 | |||
| ab2229ec8b | |||
| cc36c0a18b | |||
| 47e22c5a61 | |||
| c2161ef1fc | |||
|
|
8f6e74cf02 | ||
| 767b65008b | |||
| 1b3f0b16ff | |||
| d9931a6fae | |||
| 179be37a36 | |||
|
|
412f3ae71b | ||
| 0f2f2bc7a9 | |||
| 685cd704e7 | |||
| 09179ce825 | |||
| 27d0399263 | |||
| 0f57034b52 | |||
| db748fb649 | |||
| 6eb0629136 | |||
| 8bd4ea54b2 | |||
| d951212576 | |||
| e23bca0734 | |||
| f5cdaf51cb | |||
| 476dc5b2ce | |||
| 548b23317f | |||
| 9d40e74baf | |||
| b39fa0b693 | |||
|
|
f3ea2be8b0 | ||
| c66903d22e | |||
| 4bc815b04d | |||
| 127a321621 | |||
| 27af5f7ebb | |||
| edef17d0ad | |||
| 76f648e82a | |||
|
|
b68d702a3d | ||
| 173a6b70d2 | |||
| c08add9b1e | |||
| 3ea8c1b2ad | |||
|
|
20293cc044 | ||
| dd6f723271 | |||
| c28d22ccdb | |||
| 3abe90d8f3 | |||
| 04cbf00a2d | |||
| be8e523574 | |||
| c680486157 | |||
| 90bdb5384d | |||
| 04ecda99ee | |||
| 2d1a783e9c | |||
| ef2be1a3be | |||
| 5c27d4d16b | |||
| 654aa775db | |||
| 9307ba6fba | |||
| c0d6b480c1 | |||
| fdb1bcb282 | |||
| 09a4ac064f | |||
| c00ca5a32e | |||
| 9955f23f31 | |||
| 25afb355b4 | |||
| b7c399e3cb | |||
| 02e58ea00f | |||
| 819e00e067 | |||
| ed76b13e4c | |||
| 47553ebb82 | |||
| 949770a741 | |||
| 65e1ee3be6 | |||
| 3f938db257 | |||
| 1598f35c08 | |||
| 8e9afbf260 | |||
| 6e52988cdd | |||
| 2e701d5597 | |||
| 150faf3b5a | |||
| 64cd90eabc | |||
| 877171ceb1 | |||
| 521009de7c | |||
| 8028e9c7b7 | |||
| a85c57032d | |||
| 219b4e127d | |||
| f7ddab0e93 | |||
| 80a41b0cc2 | |||
| 6f3e601f21 | |||
| e82862821e | |||
| b6230e69e4 | |||
| c58d674a70 | |||
| fecb394272 | |||
| 54d12f4da0 | |||
| 4ddd33662d | |||
| a6eae757c5 | |||
| 6463fac211 | |||
| 57f6301e03 | |||
| 699a968875 | |||
| c1652798b4 | |||
| ec4d512136 | |||
| abf47e0003 | |||
| 0438ba3ae5 | |||
| c3f9539988 | |||
| 1d82230564 | |||
| 15d5d31d06 | |||
| ccc53b7d4f | |||
| 8e12b3bcdf | |||
| 0d23521cac | |||
| 2189e58cc6 | |||
| 87f43f2239 | |||
| 0ddfed4f07 | |||
| e7daf79394 | |||
| 7bb94da45b | |||
| d28609ee95 | |||
| 8364ad0671 | |||
| 797b10e4ad | |||
| ec77b76abb | |||
| bb269d84a5 | |||
| 46eb980e24 | |||
| 85a4db1630 | |||
| 701a10e886 | |||
| 2eea773ee2 | |||
| 44f9408b22 | |||
| 044fba8d5a | |||
| 257c60fa5e | |||
| 5a84fb13c0 | |||
| 89d84ed369 | |||
| 9c3d5fae12 | |||
| 96ae9bb609 | |||
| 9cbd856ab6 | |||
| bb151ae835 | |||
| 7ebaff322c | |||
| e17da96c22 | |||
| 3e9745c7cc | |||
| 3da3e6c60c | |||
| 85b823d614 | |||
| d20d12c1f4 | |||
| ab5f6a609d | |||
| 5ba203a8d1 | |||
| 3ca3f8e466 | |||
| 5620f6a8eb | |||
| 1583ff479c | |||
| b7d81040e6 | |||
| b249cf2000 | |||
| dfc27da142 | |||
| dde92af857 | |||
| 7b92e63a49 | |||
| 8fac8ac892 | |||
| e5183590c5 | |||
| 3b4ef37e58 | |||
| eb4ad8b637 | |||
| f0e0f57e7c | |||
| 05e1c224f0 | |||
| f1636d9057 | |||
| 44d99b0a68 | |||
| 83b3008234 | |||
| 78af87ac3c | |||
| b3c0413b7c | |||
| 4f301b1652 | |||
| debf153f58 | |||
| f3d271ded2 | |||
| 13790f2055 | |||
| bcdeafe119 | |||
| 7978884ca6 | |||
| cb7b44073c | |||
| 99ae6db064 | |||
| fcf439e369 | |||
| cecdfacd33 | |||
| 5bc698815c | |||
| 73ccf8f4de | |||
| 0b4daed512 | |||
| 8a7d736aa9 | |||
| ce179cac62 | |||
| ab7b95a3d7 | |||
| da8e476485 | |||
| 810d5f6c0c | |||
| 8a75aed6d8 | |||
| a0efdc105d | |||
| 422d80a4d4 | |||
| db4df2573c | |||
| 2f7e8798d2 | |||
| d816eeda1d | |||
| af5b40021d | |||
| 653186e9d3 | |||
| c6ec937ea0 | |||
| 3aa644e9ee | |||
| 21cf8891b2 | |||
| ceeb831a41 | |||
| 316c74e299 | |||
| a5ff515fd7 | |||
| 6952090865 | |||
| 10e1fb49f4 | |||
| 32b9b2ef8d | |||
| 0a538b0d88 | |||
| 2c658d00c1 | |||
| 5a2da916fa | |||
| 82d1cf2c71 | |||
| 85d7315e30 | |||
| 179ba2b85c | |||
| ac8135aec8 | |||
| 74f040fa50 | |||
| 73fa36f9ec | |||
| 7fafabad42 | |||
| 465678f3e4 | |||
| 967c68fa52 | |||
| 6715d1f75e | |||
| c365b4fa6b | |||
| e9cca3daeb | |||
| 443ff04430 |
237
.gitea/workflows/deploy.yaml
Normal file
237
.gitea/workflows/deploy.yaml
Normal file
@@ -0,0 +1,237 @@
|
||||
name: Build and Deploy
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main, int, dev]
|
||||
|
||||
concurrency:
|
||||
group: print-calculator-deploy-${{ gitea.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
test-backend:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up JDK 21
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
java-version: "21"
|
||||
distribution: "temurin"
|
||||
cache: gradle
|
||||
|
||||
- name: Run Tests with Gradle
|
||||
run: |
|
||||
cd backend
|
||||
chmod +x gradlew
|
||||
./gradlew test
|
||||
|
||||
test-frontend:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Node 22
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: "22"
|
||||
cache: "npm"
|
||||
cache-dependency-path: "frontend/package-lock.json"
|
||||
|
||||
- name: Resolve Chrome binary
|
||||
shell: bash
|
||||
run: |
|
||||
set -euo pipefail
|
||||
if command -v chromium >/dev/null 2>&1; then
|
||||
CHROME_PATH="$(command -v chromium)"
|
||||
elif command -v chromium-browser >/dev/null 2>&1; then
|
||||
CHROME_PATH="$(command -v chromium-browser)"
|
||||
elif command -v google-chrome >/dev/null 2>&1; then
|
||||
CHROME_PATH="$(command -v google-chrome)"
|
||||
else
|
||||
apt-get update
|
||||
apt-get install -y --no-install-recommends chromium
|
||||
CHROME_PATH="$(command -v chromium)"
|
||||
fi
|
||||
|
||||
echo "CHROME_BIN=$CHROME_PATH" >> "$GITHUB_ENV"
|
||||
echo "Using CHROME_BIN=$CHROME_PATH"
|
||||
|
||||
- name: Install frontend dependencies
|
||||
shell: bash
|
||||
run: |
|
||||
cd frontend
|
||||
npm ci --no-audit --no-fund --prefer-offline
|
||||
|
||||
- name: Run frontend tests (headless)
|
||||
shell: bash
|
||||
env:
|
||||
CI: "true"
|
||||
run: |
|
||||
cd frontend
|
||||
echo "Karma CHROME_BIN=$CHROME_BIN"
|
||||
npm run test -- --watch=false --browsers=ChromeHeadlessNoSandbox
|
||||
|
||||
build-and-push:
|
||||
needs: [test-backend, test-frontend]
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set TAG + OWNER lowercase
|
||||
shell: bash
|
||||
run: |
|
||||
if [[ "${{ gitea.ref }}" == "refs/heads/main" ]]; then
|
||||
echo "TAG=prod" >> "$GITHUB_ENV"
|
||||
elif [[ "${{ gitea.ref }}" == "refs/heads/int" ]]; then
|
||||
echo "TAG=int" >> "$GITHUB_ENV"
|
||||
else
|
||||
echo "TAG=dev" >> "$GITHUB_ENV"
|
||||
fi
|
||||
|
||||
echo "OWNER_LOWER=$(echo '${{ gitea.repository_owner }}' | tr '[:upper:]' '[:lower:]')" >> "$GITHUB_ENV"
|
||||
|
||||
- name: Ensure docker CLI exists
|
||||
shell: bash
|
||||
run: |
|
||||
if ! command -v docker >/dev/null 2>&1; then
|
||||
apt-get update
|
||||
apt-get install -y --no-install-recommends docker.io
|
||||
fi
|
||||
docker version
|
||||
|
||||
- name: Login to Gitea Registry
|
||||
shell: bash
|
||||
run: |
|
||||
set -euo pipefail
|
||||
printf '%s' "${{ secrets.REGISTRY_TOKEN }}" | docker login "${{ secrets.REGISTRY_URL }}" \
|
||||
-u "${{ secrets.REGISTRY_USER }}" --password-stdin
|
||||
|
||||
- name: Build & Push Backend
|
||||
shell: bash
|
||||
run: |
|
||||
BACKEND_IMAGE="${{ secrets.REGISTRY_URL }}/${{ env.OWNER_LOWER }}/print-calculator-backend:${{ env.TAG }}"
|
||||
docker build -t "$BACKEND_IMAGE" ./backend
|
||||
docker push "$BACKEND_IMAGE"
|
||||
|
||||
- name: Build & Push Frontend
|
||||
shell: bash
|
||||
run: |
|
||||
FRONTEND_IMAGE="${{ secrets.REGISTRY_URL }}/${{ env.OWNER_LOWER }}/print-calculator-frontend:${{ env.TAG }}"
|
||||
docker build -t "$FRONTEND_IMAGE" ./frontend
|
||||
docker push "$FRONTEND_IMAGE"
|
||||
|
||||
- name: Cleanup Docker on runner (prevent vdisk growth)
|
||||
if: always()
|
||||
shell: bash
|
||||
run: |
|
||||
set +e
|
||||
|
||||
# Keep recent artifacts, drop old local residue from CI builds.
|
||||
docker container prune -f --filter "until=168h" || true
|
||||
docker image prune -a -f --filter "until=168h" || true
|
||||
docker builder prune -a -f --filter "until=168h" || true
|
||||
docker network prune -f --filter "until=168h" || true
|
||||
|
||||
deploy:
|
||||
needs: build-and-push
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set ENV
|
||||
shell: bash
|
||||
run: |
|
||||
if [[ "${{ gitea.ref }}" == "refs/heads/main" ]]; then
|
||||
echo "ENV=prod" >> "$GITHUB_ENV"
|
||||
elif [[ "${{ gitea.ref }}" == "refs/heads/int" ]]; then
|
||||
echo "ENV=int" >> "$GITHUB_ENV"
|
||||
else
|
||||
echo "ENV=dev" >> "$GITHUB_ENV"
|
||||
fi
|
||||
|
||||
- name: Setup SSH key
|
||||
shell: bash
|
||||
run: |
|
||||
set -euo pipefail
|
||||
|
||||
apt-get update
|
||||
apt-get install -y --no-install-recommends openssh-client
|
||||
|
||||
mkdir -p ~/.ssh
|
||||
chmod 700 ~/.ssh
|
||||
|
||||
printf '%s' "${{ secrets.SSH_PRIVATE_KEY_B64 }}" | tr -d '\r\n\t ' > /tmp/key.b64
|
||||
echo "b64_len=$(wc -c < /tmp/key.b64)"
|
||||
|
||||
base64 -d /tmp/key.b64 > ~/.ssh/id_ed25519
|
||||
|
||||
tr -d '\r' < ~/.ssh/id_ed25519 > ~/.ssh/id_ed25519.clean
|
||||
mv ~/.ssh/id_ed25519.clean ~/.ssh/id_ed25519
|
||||
chmod 600 ~/.ssh/id_ed25519
|
||||
|
||||
ssh-keygen -y -f ~/.ssh/id_ed25519 >/dev/null
|
||||
|
||||
ssh-keyscan -H "${{ secrets.SERVER_HOST }}" >> ~/.ssh/known_hosts 2>/dev/null
|
||||
|
||||
- name: Write env and compose to server
|
||||
shell: bash
|
||||
run: |
|
||||
if [[ "${{ gitea.ref }}" == "refs/heads/main" ]]; then
|
||||
DEPLOY_TAG="prod"
|
||||
elif [[ "${{ gitea.ref }}" == "refs/heads/int" ]]; then
|
||||
DEPLOY_TAG="int"
|
||||
else
|
||||
DEPLOY_TAG="dev"
|
||||
fi
|
||||
DEPLOY_OWNER=$(echo '${{ gitea.repository_owner }}' | tr '[:upper:]' '[:lower:]')
|
||||
|
||||
cat "deploy/envs/${{ env.ENV }}.env" > /tmp/full_env.env
|
||||
|
||||
if [[ "${{ env.ENV }}" == "prod" ]]; then
|
||||
DB_URL="${{ secrets.DB_URL_PROD }}"
|
||||
DB_USER="${{ secrets.DB_USERNAME_PROD }}"
|
||||
DB_PASS="${{ secrets.DB_PASSWORD_PROD }}"
|
||||
elif [[ "${{ env.ENV }}" == "int" ]]; then
|
||||
DB_URL="${{ secrets.DB_URL_INT }}"
|
||||
DB_USER="${{ secrets.DB_USERNAME_INT }}"
|
||||
DB_PASS="${{ secrets.DB_PASSWORD_INT }}"
|
||||
else
|
||||
DB_URL="${{ secrets.DB_URL_DEV }}"
|
||||
DB_USER="${{ secrets.DB_USERNAME_DEV }}"
|
||||
DB_PASS="${{ secrets.DB_PASSWORD_DEV }}"
|
||||
fi
|
||||
|
||||
printf '\nDB_URL="%s"\nDB_USERNAME="%s"\nDB_PASSWORD="%s"\n' \
|
||||
"$DB_URL" "$DB_USER" "$DB_PASS" >> /tmp/full_env.env
|
||||
|
||||
printf 'REGISTRY_URL="%s"\nREPO_OWNER="%s"\nTAG="%s"\n' \
|
||||
"${{ secrets.REGISTRY_URL }}" "$DEPLOY_OWNER" "$DEPLOY_TAG" >> /tmp/full_env.env
|
||||
|
||||
ADMIN_TTL="${{ secrets.ADMIN_SESSION_TTL_MINUTES }}"
|
||||
ADMIN_TTL="${ADMIN_TTL:-480}"
|
||||
printf 'ADMIN_PASSWORD="%s"\nADMIN_SESSION_SECRET="%s"\nADMIN_SESSION_TTL_MINUTES="%s"\n' \
|
||||
"${{ secrets.ADMIN_PASSWORD }}" "${{ secrets.ADMIN_SESSION_SECRET }}" "$ADMIN_TTL" >> /tmp/full_env.env
|
||||
if [[ -n "${{ secrets.OPENAI_API_KEY }}" ]]; then
|
||||
printf 'OPENAI_API_KEY="%s"\n' "${{ secrets.OPENAI_API_KEY }}" >> /tmp/full_env.env
|
||||
fi
|
||||
|
||||
echo "Preparing to send env file with variables:"
|
||||
grep -Ev "PASSWORD|SECRET|KEY|TOKEN" /tmp/full_env.env || true
|
||||
|
||||
ssh -i ~/.ssh/id_ed25519 -o BatchMode=yes "${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }}" \
|
||||
"setenv ${{ env.ENV }}" < /tmp/full_env.env
|
||||
|
||||
ssh -i ~/.ssh/id_ed25519 -o BatchMode=yes "${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }}" \
|
||||
"setcompose ${{ env.ENV }}" < docker-compose.deploy.yml
|
||||
|
||||
- name: Trigger deploy on Unraid (forced command key)
|
||||
shell: bash
|
||||
run: |
|
||||
set -euo pipefail
|
||||
ssh -i ~/.ssh/id_ed25519 -o BatchMode=yes "${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }}" "deploy ${{ env.ENV }}"
|
||||
185
.gitea/workflows/pr-checks.yaml
Normal file
185
.gitea/workflows/pr-checks.yaml
Normal file
@@ -0,0 +1,185 @@
|
||||
name: PR Checks
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches: [main, int, dev]
|
||||
|
||||
concurrency:
|
||||
group: print-calculator-pr-${{ gitea.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
prettier-autofix:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Setup Node 22
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: "22"
|
||||
|
||||
- name: Apply formatting with Prettier
|
||||
shell: bash
|
||||
run: |
|
||||
npx --yes prettier@3.6.2 --write \
|
||||
"frontend/src/**/*.{ts,html,scss,css,json}" \
|
||||
".gitea/workflows/*.{yml,yaml}"
|
||||
|
||||
- name: Commit and push formatting changes
|
||||
shell: bash
|
||||
run: |
|
||||
if git diff --quiet; then
|
||||
echo "No formatting changes to commit."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if ! command -v jq >/dev/null 2>&1; then
|
||||
apt-get update
|
||||
apt-get install -y --no-install-recommends jq
|
||||
fi
|
||||
|
||||
EVENT_FILE="${GITHUB_EVENT_PATH:-}"
|
||||
if [[ -z "$EVENT_FILE" || ! -f "$EVENT_FILE" ]]; then
|
||||
echo "Event payload not found, skipping auto-push."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
HEAD_REPO="$(jq -r '.pull_request.head.repo.full_name // empty' "$EVENT_FILE")"
|
||||
BASE_REPO="$(jq -r '.repository.full_name // empty' "$EVENT_FILE")"
|
||||
PR_BRANCH="$(jq -r '.pull_request.head.ref // empty' "$EVENT_FILE")"
|
||||
|
||||
if [[ -z "$PR_BRANCH" ]]; then
|
||||
echo "PR branch not found in event payload, skipping auto-push."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [[ -n "$HEAD_REPO" && -n "$BASE_REPO" && "$HEAD_REPO" != "$BASE_REPO" ]]; then
|
||||
echo "PR from fork ($HEAD_REPO), skipping auto-push."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
git config user.name "printcalc-ci"
|
||||
git config user.email "ci@printcalculator.local"
|
||||
|
||||
git add frontend/src .gitea/workflows
|
||||
git commit -m "style: apply prettier formatting"
|
||||
git push origin "HEAD:${PR_BRANCH}"
|
||||
|
||||
security-sast:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Install Python and Semgrep
|
||||
shell: bash
|
||||
run: |
|
||||
apt-get update
|
||||
apt-get install -y --no-install-recommends python3 python3-pip
|
||||
python3 -m pip install --upgrade pip
|
||||
python3 -m pip install semgrep
|
||||
|
||||
- name: Run Semgrep (SAST)
|
||||
shell: bash
|
||||
run: |
|
||||
semgrep --version
|
||||
semgrep --config auto --error \
|
||||
--exclude frontend/node_modules \
|
||||
--exclude backend/build \
|
||||
backend/src frontend/src
|
||||
|
||||
- name: Install Gitleaks
|
||||
shell: bash
|
||||
run: |
|
||||
set -euo pipefail
|
||||
VERSION="8.24.2"
|
||||
curl -sSL "https://github.com/gitleaks/gitleaks/releases/download/v${VERSION}/gitleaks_${VERSION}_linux_x64.tar.gz" \
|
||||
-o /tmp/gitleaks.tar.gz
|
||||
tar -xzf /tmp/gitleaks.tar.gz -C /tmp
|
||||
install -m 0755 /tmp/gitleaks /usr/local/bin/gitleaks
|
||||
gitleaks version
|
||||
|
||||
- name: Run Gitleaks (secrets scan)
|
||||
shell: bash
|
||||
run: |
|
||||
set +e
|
||||
gitleaks detect --source . --no-git --redact --exit-code 1 \
|
||||
--report-format json --report-path /tmp/gitleaks-report.json
|
||||
rc=$?
|
||||
if [[ $rc -ne 0 ]]; then
|
||||
echo "Gitleaks findings:"
|
||||
cat /tmp/gitleaks-report.json
|
||||
fi
|
||||
exit $rc
|
||||
|
||||
test-backend:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up JDK 21
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
java-version: "21"
|
||||
distribution: "temurin"
|
||||
cache: gradle
|
||||
|
||||
- name: Run Tests with Gradle
|
||||
run: |
|
||||
cd backend
|
||||
chmod +x gradlew
|
||||
./gradlew test
|
||||
|
||||
test-frontend:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Node 22
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: "22"
|
||||
cache: "npm"
|
||||
cache-dependency-path: "frontend/package-lock.json"
|
||||
|
||||
- name: Resolve Chrome binary
|
||||
shell: bash
|
||||
run: |
|
||||
set -euo pipefail
|
||||
if command -v chromium >/dev/null 2>&1; then
|
||||
CHROME_PATH="$(command -v chromium)"
|
||||
elif command -v chromium-browser >/dev/null 2>&1; then
|
||||
CHROME_PATH="$(command -v chromium-browser)"
|
||||
elif command -v google-chrome >/dev/null 2>&1; then
|
||||
CHROME_PATH="$(command -v google-chrome)"
|
||||
else
|
||||
apt-get update
|
||||
apt-get install -y --no-install-recommends chromium
|
||||
CHROME_PATH="$(command -v chromium)"
|
||||
fi
|
||||
|
||||
echo "CHROME_BIN=$CHROME_PATH" >> "$GITHUB_ENV"
|
||||
echo "Using CHROME_BIN=$CHROME_PATH"
|
||||
|
||||
- name: Install frontend dependencies
|
||||
shell: bash
|
||||
run: |
|
||||
cd frontend
|
||||
npm ci --no-audit --no-fund --prefer-offline
|
||||
|
||||
- name: Run frontend tests (headless)
|
||||
shell: bash
|
||||
env:
|
||||
CI: "true"
|
||||
run: |
|
||||
cd frontend
|
||||
echo "Karma CHROME_BIN=$CHROME_BIN"
|
||||
npm run test -- --watch=false --browsers=ChromeHeadlessNoSandbox
|
||||
31
.gitignore
vendored
31
.gitignore
vendored
@@ -24,3 +24,34 @@ hs_err_pid*
|
||||
replay_pid*
|
||||
/frontend/.vscode/
|
||||
/backend/venv/
|
||||
|
||||
# IDEs and editors
|
||||
.idea/
|
||||
*.iml
|
||||
.vscode/
|
||||
.vs/
|
||||
.fleet/
|
||||
.project
|
||||
.classpath
|
||||
.settings/
|
||||
.DS_Store
|
||||
|
||||
# Build Results
|
||||
target/
|
||||
build/
|
||||
.gradle/
|
||||
.mvn/
|
||||
|
||||
./storage_orders
|
||||
./storage_quotes
|
||||
./storage_requests
|
||||
./storage_media
|
||||
./storage_shop
|
||||
storage_orders
|
||||
storage_quotes
|
||||
storage_requests
|
||||
storage_media
|
||||
storage_shop
|
||||
|
||||
# Qodana local reports/artifacts
|
||||
backend/.qodana/
|
||||
|
||||
45
GEMINI.md
Normal file
45
GEMINI.md
Normal file
@@ -0,0 +1,45 @@
|
||||
# GEMINI Project Context
|
||||
|
||||
Questo file serve a dare contesto all'AI (Antigravity/Gemini) sulla struttura e logica del progetto.
|
||||
|
||||
## Project Overview
|
||||
**Nome**: Print Calculator
|
||||
**Scopo**: Calcolare costi e tempi di stampa 3D da file STL in modo preciso tramite slicing reale.
|
||||
**Stack**:
|
||||
- **Backend**: Java 21 (Spring Boot 3.4), PostgreSQL, Flyway.
|
||||
- **Frontend**: Angular 19 (TypeScript), Angular Material, Three.js per visualizzazione 3D.
|
||||
|
||||
## Architecture
|
||||
|
||||
### Backend (`/backend`)
|
||||
- **`BackendApplication.java`**: Entrypoint dell'applicazione Spring Boot.
|
||||
- **`controller/`**: Espone le API REST per l'upload e il calcolo dei preventivi.
|
||||
- **`service/SlicerService.java`**: Wrappa l'eseguibile di **OrcaSlicer** per effettuare lo slicing reale del modello.
|
||||
- Gestisce i profili di stampa (Macchina, Processo, Filamento) caricati da file JSON.
|
||||
- Crea configurazioni on-the-fly e invoca OrcaSlicer in modalità headless.
|
||||
- **`service/GCodeParser.java`**: Analizza il G-Code generato per estrarre tempo di stampa e peso del materiale dai metadati del file.
|
||||
- **`service/QuoteCalculator.java`**: Calcola il prezzo finale basandosi su politiche di prezzo salvate nel database.
|
||||
- Gestisce costi macchina a scaglioni (tiered pricing).
|
||||
- Calcola costi energetici basati sulla potenza della stampante e costo del kWh.
|
||||
- Applica markup percentuali e fee fissi per job.
|
||||
|
||||
### Frontend (`/frontend`)
|
||||
- Applicazione Angular 19 con architettura modulare (core, features, shared).
|
||||
- **Three.js**: Utilizzato per il rendering dei file STL caricati dall'utente.
|
||||
- **Angular Material**: Per l'interfaccia utente.
|
||||
- **ngx-translate**: Per il supporto multilingua.
|
||||
|
||||
## Key Concepts
|
||||
- **Real Slicing**: Il backend esegue un vero slicing usando OrcaSlicer. Questo garantisce stime di tempo e materiale estremamente precise.
|
||||
- **Database-Driven Pricing**: A differenza di versioni precedenti, il calcolo del preventivo è ora guidato da entità DB (`PricingPolicy`, `PrinterMachine`, `FilamentVariant`).
|
||||
- **G-Code Metadata**: L'applicazione legge direttamene i commenti generati dallo slicer nel G-Code (es. `; estimated printing time`, `; filament used [g]`).
|
||||
|
||||
## Development Notes
|
||||
- **Backend**: Richiede JDK 21. Si avvia con `./gradlew bootRun`.
|
||||
- **Database**: Richiede PostgreSQL. Le migrazioni sono gestite da Flyway.
|
||||
- **Frontend**: Richiede Node.js 22. Si avvia con `npm start`.
|
||||
- **OrcaSlicer**: Deve essere installato sul sistema e il percorso configurato in `application.properties` o tramite variabile d'ambiente `SLICER_PATH`.
|
||||
|
||||
## AI Agent Rules
|
||||
- **No Inline Code**: Tutti i componenti Angular DEVONO usare file separati per HTML (`templateUrl`) e SCSS (`styleUrl`). È vietato usare `template` o `styles` inline nel decoratore `@Component`.
|
||||
- **Spring Boot Conventions**: Seguire i pattern standard di Spring Boot (Service-Repository-Controller).
|
||||
10
Makefile
10
Makefile
@@ -1,10 +0,0 @@
|
||||
.PHONY: install s
|
||||
install:
|
||||
@echo "Installing Backend dependencies..."
|
||||
cd backend && pip install -r requirements.txt || pip install fastapi uvicorn trimesh python-multipart numpy
|
||||
@echo "Installing Frontend dependencies..."
|
||||
cd frontend && npm install
|
||||
|
||||
start:
|
||||
@echo "Starting development environment..."
|
||||
./start.sh
|
||||
140
README.md
140
README.md
@@ -1,70 +1,116 @@
|
||||
# Print Calculator (OrcaSlicer Edition)
|
||||
|
||||
Un'applicazione Full Stack (Angular + Python/FastAPI) per calcolare preventivi di stampa 3D precisi utilizzando **OrcaSlicer** in modalità headless.
|
||||
Un'applicazione Full Stack (Angular + Spring Boot) per calcolare preventivi di stampa 3D precisi utilizzando **OrcaSlicer** in modalità headless.
|
||||
|
||||
## Funzionalità
|
||||
|
||||
* **Slicing Reale**: Usa il motore di OrcaSlicer per stimare tempo e materiale, non semplici approssimazioni geometriche.
|
||||
* **Preventivazione Completa**: Calcola costo materiale, ammortamento macchina, energia e ricarico.
|
||||
* **Configurabile**: Prezzi e parametri macchina modificabili via variabili d'ambiente.
|
||||
* **Docker Ready**: Tutto containerizzato per un facile deployment.
|
||||
* **Slicing Reale**: Usa il motore di OrcaSlicer per stimare tempo e materiale, garantendo la massima precisione.
|
||||
* **Preventivazione Database-Driven**: Calcolo basato su politiche di prezzo configurabili nel database (costo materiale, ammortamento macchina a scaglioni, energia e markup).
|
||||
* **Visualizzazione 3D**: Anteprima del file STL caricato tramite Three.js.
|
||||
* **Multi-Profilo**: Supporto per diverse stampanti, materiali e profili di processo.
|
||||
|
||||
## Stack Tecnologico
|
||||
|
||||
- **Backend**: Java 21, Spring Boot 3.4, PostgreSQL.
|
||||
- **Frontend**: Angular 19, Angular Material, Three.js.
|
||||
- **Slicer**: OrcaSlicer (invocato via CLI).
|
||||
|
||||
## Prerequisiti
|
||||
|
||||
* Docker Desktop & Docker Compose installati.
|
||||
* **Java 21** installato.
|
||||
* **Node.js 22** e **npm** installati.
|
||||
* **PostgreSQL** attivo.
|
||||
* **OrcaSlicer** installato sul sistema.
|
||||
* **FFmpeg** installato sul sistema o presente nell'immagine Docker del backend.
|
||||
|
||||
## Avvio Rapido
|
||||
|
||||
1. Clona il repository.
|
||||
2. Esegui lo script di avvio o docker-compose:
|
||||
```bash
|
||||
docker-compose up --build
|
||||
```
|
||||
*Nota: La prima build impiegherà alcuni minuti per scaricare OrcaSlicer (~200MB) e compilare il Frontend.*
|
||||
### 1. Database
|
||||
Crea un database PostgreSQL chiamato `printcalc`. Lo schema viene gestito dal progetto tramite configurazione JPA/SQL del repository.
|
||||
|
||||
3. Accedi all'applicazione:
|
||||
* **Frontend**: [http://localhost](http://localhost)
|
||||
* **API Docs**: [http://localhost:8000/docs](http://localhost:8000/docs)
|
||||
### 2. Backend
|
||||
Configura il percorso di OrcaSlicer in `backend/src/main/resources/application.properties` o tramite la variabile d'ambiente `SLICER_PATH`. Per il media service pubblico puoi configurare anche:
|
||||
|
||||
## Configurazione Prezzi
|
||||
- `MEDIA_STORAGE_ROOT` per la root `storage_media` usata dal backend (`original/`, `public/`, `private/`)
|
||||
- `SHOP_STORAGE_ROOT` per la root `storage_shop` usata dal backend per i modelli dei prodotti shop
|
||||
- `MEDIA_FFMPEG_PATH` per il binario `ffmpeg` (nel deploy Docker default: `/usr/local/bin/ffmpeg-media`)
|
||||
- `MEDIA_UPLOAD_MAX_FILE_SIZE_BYTES` per il limite per asset immagine
|
||||
|
||||
Puoi modificare i prezzi nel file `docker-compose.yml` (sezione `environment` del servizio backend):
|
||||
|
||||
* `FILAMENT_COST_PER_KG`: Costo filamento al kg (es. 25.0).
|
||||
* `MACHINE_COST_PER_HOUR`: Costo orario macchina (ammortamento/manutenzione).
|
||||
* `ENERGY_COST_PER_KWH`: Costo energia elettrica.
|
||||
* `MARKUP_PERCENT`: Margine di profitto percentuale (es. 20 = +20%).
|
||||
|
||||
## Struttura del Progetto
|
||||
|
||||
* `/backend`: API Python FastAPI. Include Dockerfile che scarica OrcaSlicer AppImage.
|
||||
* `/frontend`: Applicazione Angular 19+ con Material Design.
|
||||
* `/backend/profiles`: Contiene i profili di slicing (.ini). Attualmente configurato per una stima generica simil-Bambu Lab A1.
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Errore Download OrcaSlicer
|
||||
Se la build del backend fallisce durante il download di `OrcaSlicer.AppImage`, verifica la tua connessione internet o aggiorna l'URL nel `backend/Dockerfile`.
|
||||
|
||||
### Slicing Fallito (Costo 0 o Errore)
|
||||
Se l'API ritorna errore o valori nulli:
|
||||
1. Controlla che il file STL sia valido (manifold).
|
||||
2. Controlla i log del backend: `docker logs print-calculator-backend`.
|
||||
|
||||
## Sviluppo Locale (Senza Docker)
|
||||
|
||||
**Backend**:
|
||||
Richiede Linux (o WSL2) per eseguire l'AppImage di OrcaSlicer.
|
||||
```bash
|
||||
cd backend
|
||||
pip install -r requirements.txt
|
||||
# Assicurati di avere OrcaSlicer installato e nel PATH o aggiorna SLICER_PATH in slicer.py
|
||||
uvicorn main:app --reload
|
||||
./gradlew bootRun
|
||||
```
|
||||
|
||||
**Frontend**:
|
||||
### 3. Frontend
|
||||
```bash
|
||||
cd frontend
|
||||
npm install
|
||||
npm start
|
||||
```
|
||||
|
||||
Accedi a [http://localhost:4200](http://localhost:4200).
|
||||
|
||||
## Configurazione Prezzi
|
||||
|
||||
I prezzi non sono più gestiti tramite variabili d'ambiente fisse ma tramite tabelle nel database:
|
||||
- `pricing_policy`: Definisce markup, fee fissi e costi elettrici.
|
||||
- `pricing_policy_machine_hour_tier`: Definisce i costi orari delle macchine in base alla durata della stampa.
|
||||
- `printer_machine`: Anagrafica stampanti e consumi energetici.
|
||||
- `filament_material_type` / `filament_variant`: Listino prezzi materiali.
|
||||
|
||||
## Struttura del Progetto
|
||||
|
||||
* `/backend`: API Spring Boot.
|
||||
* `/frontend`: Applicazione Angular.
|
||||
* `/backend/profiles`: Contiene i file di configurazione per OrcaSlicer.
|
||||
* `/storage_media`: Originali e varianti media pubbliche/private su filesystem.
|
||||
* `/storage_shop`: Modelli e file prodotti dello shop.
|
||||
|
||||
## Media pubblici
|
||||
|
||||
Il backend salva sempre l'originale in `storage_media/original/` e precomputa le varianti pubbliche in `storage_media/public/`. La cartella `storage_media/private/` è predisposta per asset non pubblici.
|
||||
|
||||
Nel deploy Docker i volumi attesi sono `/mnt/cache/appdata/print-calculator/${ENV}/storage_media:/app/storage_media` e `/mnt/cache/appdata/print-calculator/${ENV}/storage_shop:/app/storage_shop`.
|
||||
|
||||
Nginx non deve passare dal backend per i file pubblici. Configurazione attesa:
|
||||
|
||||
```nginx
|
||||
location /media/ {
|
||||
alias /mnt/cache/appdata/print-calculator/${ENV}/storage_media/public/;
|
||||
}
|
||||
```
|
||||
|
||||
Usage key iniziali previste per frontend:
|
||||
|
||||
- `HOME_SECTION / shop-gallery`
|
||||
- `HOME_SECTION / founders-gallery`
|
||||
- `HOME_SECTION / capability-prototyping`
|
||||
- `HOME_SECTION / capability-custom-parts`
|
||||
- `HOME_SECTION / capability-small-series`
|
||||
- `HOME_SECTION / capability-cad`
|
||||
- `ABOUT_MEMBER / joe`
|
||||
- `ABOUT_MEMBER / matteo`
|
||||
- riservati per estensioni future: `SHOP_PRODUCT`, `SHOP_CATEGORY`, `SHOP_GALLERY`
|
||||
|
||||
Operativamente:
|
||||
|
||||
- carica i file dal media admin endpoint del backend
|
||||
- associa ogni asset con `POST /api/admin/media/usages`
|
||||
- per `ABOUT_MEMBER` imposta `isPrimary=true` sulla foto principale del membro
|
||||
- home e about leggono da `GET /api/public/media/usages?usageType=...&usageKey=...`
|
||||
- il frontend usa `<picture>` e preferisce AVIF/WEBP con fallback JPEG, senza usare l'originale
|
||||
- nel back-office frontend la gestione operativa della home passa dalla pagina `admin/home-media`
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Percorso OrcaSlicer
|
||||
Assicurati che `slicer.path` punti al binario corretto. Su macOS è solitamente `/Applications/OrcaSlicer.app/Contents/MacOS/OrcaSlicer`. Su Linux è il percorso all'AppImage (estratta o meno).
|
||||
|
||||
### FFmpeg e media pubblici
|
||||
Verifica che `MEDIA_FFMPEG_PATH` punti a un `ffmpeg` con supporto JPEG, WebP e AVIF (encoder + muxer AVIF). Nel container backend il default è `/usr/local/bin/ffmpeg-media`: usa `/usr/bin/ffmpeg` se già compatibile, altrimenti installa un fallback statico con supporto AVIF. Se gli URL media restituiti dalle API admin non sono raggiungibili, controlla che `APP_FRONTEND_BASE_URL` punti al dominio corretto, che `location /media/` sia esposto da Nginx e che il volume `storage_media` sia montato correttamente.
|
||||
|
||||
### Database connection
|
||||
Verifica le credenziali in `application.properties`. Se usi Docker, puoi passare `DB_URL`, `DB_USERNAME` e `DB_PASSWORD` come variabili d'ambiente.
|
||||
|
||||
### Deploy e traduzioni OpenAI
|
||||
Nel deploy Gitea la chiave OpenAI deve stare nel secret `OPENAI_API_KEY`. La pipeline la aggiunge al file `.env` dell'ambiente durante il deploy e il container backend la riceve come variabile runtime. I file `deploy/envs/*.env` restano per i valori specifici di `dev/int/prod`.
|
||||
|
||||
54
backend/.gitignore
vendored
Normal file
54
backend/.gitignore
vendored
Normal file
@@ -0,0 +1,54 @@
|
||||
/target/
|
||||
!.mvn/wrapper/maven-wrapper.jar
|
||||
!**/src/main/**/target/
|
||||
!**/src/test/**/target/
|
||||
target
|
||||
|
||||
### STS ###
|
||||
.apt_generated
|
||||
.classpath
|
||||
.factorypath
|
||||
.project
|
||||
.settings
|
||||
.springBeans
|
||||
.sts4-cache
|
||||
|
||||
### IntelliJ IDEA ###
|
||||
.idea
|
||||
*.iws
|
||||
*.iml
|
||||
*.ipr
|
||||
|
||||
### NetBeans ###
|
||||
/nbproject/private/
|
||||
/nbproject/public/
|
||||
/nbproject/project.properties
|
||||
/nbproject/project.xml
|
||||
|
||||
### VS Code ###
|
||||
.vscode/
|
||||
|
||||
### Gradle ###
|
||||
.gradle
|
||||
build/
|
||||
!gradle/wrapper/gradle-wrapper.jar
|
||||
!**/src/main/**/build/
|
||||
!**/src/test/**/build/
|
||||
|
||||
### Java ###
|
||||
*.class
|
||||
*.log
|
||||
*.ctxt
|
||||
.mtj.tmp/
|
||||
*.jar
|
||||
*.war
|
||||
*.nar
|
||||
*.ear
|
||||
*.zip
|
||||
*.tar.gz
|
||||
*.rar
|
||||
|
||||
### Spring Boot ###
|
||||
HELP.md
|
||||
|
||||
!gradle/wrapper/gradle-wrapper.jar
|
||||
@@ -1,43 +1,110 @@
|
||||
FROM --platform=linux/amd64 python:3.10-slim-bookworm
|
||||
# Stage 1: Build Java JAR
|
||||
FROM eclipse-temurin:21-jdk-jammy AS build
|
||||
WORKDIR /app
|
||||
COPY gradle gradle
|
||||
COPY gradlew build.gradle settings.gradle ./
|
||||
# Download dependencies first to cache them
|
||||
RUN ./gradlew dependencies --no-daemon
|
||||
COPY src ./src
|
||||
RUN ./gradlew bootJar -x test --no-daemon
|
||||
|
||||
# Install system dependencies for OrcaSlicer (AppImage)
|
||||
RUN apt-get update && apt-get install -y \
|
||||
# Stage 2: Runtime Environment
|
||||
FROM eclipse-temurin:21-jre-jammy
|
||||
ARG ORCA_VERSION=2.3.1
|
||||
ARG ORCA_DOWNLOAD_URL
|
||||
ARG FFMPEG_STATIC_URL=https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz
|
||||
|
||||
# Install system dependencies for OrcaSlicer and media processing.
|
||||
# Prefer system ffmpeg; if AVIF support is incomplete, install a static ffmpeg fallback.
|
||||
RUN set -eux; \
|
||||
apt-get update; \
|
||||
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
|
||||
ffmpeg \
|
||||
wget \
|
||||
p7zip-full \
|
||||
xz-utils \
|
||||
ca-certificates \
|
||||
assimp-utils \
|
||||
libgl1 \
|
||||
libglib2.0-0 \
|
||||
libgtk-3-0 \
|
||||
libdbus-1-3 \
|
||||
libwebkit2gtk-4.1-0 \
|
||||
libwebkit2gtk-4.0-37 \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
libwebkit2gtk-4.0-37; \
|
||||
check_ffmpeg_support() { \
|
||||
ffmpeg_bin="$1"; \
|
||||
"$ffmpeg_bin" -hide_banner -encoders > /tmp/ffmpeg-encoders.txt 2>&1 || return 1; \
|
||||
"$ffmpeg_bin" -hide_banner -muxers > /tmp/ffmpeg-muxers.txt 2>&1 || return 1; \
|
||||
grep -Eq '[[:space:]]mjpeg[[:space:]]' /tmp/ffmpeg-encoders.txt || return 1; \
|
||||
grep -Eq '[[:space:]](libwebp|webp)[[:space:]]' /tmp/ffmpeg-encoders.txt || return 1; \
|
||||
grep -Eq '[[:space:]](libaom-av1|librav1e|libsvtav1)[[:space:]]' /tmp/ffmpeg-encoders.txt || return 1; \
|
||||
grep -Eq '[[:space:]]avif([[:space:]]|,|$)' /tmp/ffmpeg-muxers.txt || return 1; \
|
||||
return 0; \
|
||||
}; \
|
||||
if check_ffmpeg_support /usr/bin/ffmpeg; then \
|
||||
ln -sf /usr/bin/ffmpeg /usr/local/bin/ffmpeg-media; \
|
||||
else \
|
||||
echo "System ffmpeg lacks AVIF support, installing static fallback from ${FFMPEG_STATIC_URL}"; \
|
||||
wget -q "${FFMPEG_STATIC_URL}" -O /tmp/ffmpeg-static.tar.xz; \
|
||||
tar -xJf /tmp/ffmpeg-static.tar.xz -C /tmp; \
|
||||
FFMPEG_STATIC_BIN="$(find /tmp -maxdepth 2 -type f -name ffmpeg | head -n 1)"; \
|
||||
test -n "${FFMPEG_STATIC_BIN}"; \
|
||||
install -m 0755 "${FFMPEG_STATIC_BIN}" /usr/local/bin/ffmpeg-media; \
|
||||
check_ffmpeg_support /usr/local/bin/ffmpeg-media; \
|
||||
fi; \
|
||||
rm -f /tmp/ffmpeg-muxers.txt; \
|
||||
rm -f /tmp/ffmpeg-encoders.txt; \
|
||||
rm -f /tmp/ffmpeg-static.tar.xz; \
|
||||
rm -rf /tmp/ffmpeg-*-amd64-static; \
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Set working directory
|
||||
WORKDIR /app
|
||||
|
||||
# Download and extract OrcaSlicer
|
||||
# Using v2.2.0 as a stable recent release
|
||||
# We extract the AppImage to run it without FUSE
|
||||
RUN wget -q https://github.com/SoftFever/OrcaSlicer/releases/download/v2.2.0/OrcaSlicer_Linux_V2.2.0.AppImage -O OrcaSlicer.AppImage \
|
||||
&& 7z x OrcaSlicer.AppImage -o/opt/orcaslicer \
|
||||
# Install OrcaSlicer
|
||||
WORKDIR /opt
|
||||
RUN set -eux; \
|
||||
ORCA_URL="${ORCA_DOWNLOAD_URL:-}"; \
|
||||
if [ -n "${ORCA_URL}" ]; then \
|
||||
wget -q "${ORCA_URL}" -O OrcaSlicer.AppImage; \
|
||||
else \
|
||||
CANDIDATES="\
|
||||
https://github.com/OrcaSlicer/OrcaSlicer/releases/download/v${ORCA_VERSION}/OrcaSlicer_Linux_AppImage_Ubuntu2204_V${ORCA_VERSION}.AppImage \
|
||||
https://github.com/SoftFever/OrcaSlicer/releases/download/v${ORCA_VERSION}/OrcaSlicer_Linux_AppImage_Ubuntu2204_V${ORCA_VERSION}.AppImage \
|
||||
https://github.com/SoftFever/OrcaSlicer/releases/download/v2.2.0/OrcaSlicer_Linux_V2.2.0.AppImage"; \
|
||||
ok=0; \
|
||||
for url in $CANDIDATES; do \
|
||||
if wget -q --spider "$url"; then \
|
||||
echo "Using OrcaSlicer URL: $url"; \
|
||||
wget -q "$url" -O OrcaSlicer.AppImage; \
|
||||
ok=1; \
|
||||
break; \
|
||||
fi; \
|
||||
done; \
|
||||
if [ "$ok" -ne 1 ]; then \
|
||||
echo "Failed to find OrcaSlicer AppImage for version ${ORCA_VERSION}" >&2; \
|
||||
echo "Tried URLs:" >&2; \
|
||||
for url in $CANDIDATES; do echo " - $url" >&2; done; \
|
||||
exit 1; \
|
||||
fi; \
|
||||
fi \
|
||||
&& chmod +x OrcaSlicer.AppImage \
|
||||
&& rm -rf /opt/orcaslicer /opt/squashfs-root \
|
||||
&& ./OrcaSlicer.AppImage --appimage-extract >/dev/null \
|
||||
&& mv /opt/squashfs-root /opt/orcaslicer \
|
||||
&& chmod -R +x /opt/orcaslicer \
|
||||
&& rm OrcaSlicer.AppImage
|
||||
|
||||
# Add OrcaSlicer to PATH
|
||||
ENV PATH="/opt/orcaslicer/usr/bin:${PATH}"
|
||||
# Set Slicer Path env variable for Java app
|
||||
ENV SLICER_PATH="/opt/orcaslicer/AppRun"
|
||||
ENV ASSIMP_PATH="assimp"
|
||||
# Use ffmpeg selected at image build time (system or static fallback) for media generation.
|
||||
ENV MEDIA_FFMPEG_PATH="/usr/local/bin/ffmpeg-media"
|
||||
|
||||
# Install Python dependencies
|
||||
COPY requirements.txt .
|
||||
RUN pip install --no-cache-dir -r requirements.txt
|
||||
WORKDIR /app
|
||||
# Copy JAR from build stage
|
||||
COPY --from=build /app/build/libs/*.jar app.jar
|
||||
# Copy profiles
|
||||
COPY profiles ./profiles
|
||||
|
||||
# Create directories for app and temp files
|
||||
RUN mkdir -p /app/temp /app/profiles
|
||||
EXPOSE 8080
|
||||
|
||||
# Copy application code
|
||||
COPY . .
|
||||
|
||||
# Expose port
|
||||
EXPOSE 8000
|
||||
|
||||
# Run the application
|
||||
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
|
||||
COPY entrypoint.sh .
|
||||
RUN chmod +x entrypoint.sh
|
||||
ENTRYPOINT ["./entrypoint.sh"]
|
||||
|
||||
70
backend/build.gradle
Normal file
70
backend/build.gradle
Normal file
@@ -0,0 +1,70 @@
|
||||
plugins {
|
||||
id 'java'
|
||||
id 'application'
|
||||
id 'org.springframework.boot' version '3.4.1'
|
||||
id 'io.spring.dependency-management' version '1.1.7'
|
||||
}
|
||||
|
||||
group = 'com.printcalculator'
|
||||
version = '0.0.1-SNAPSHOT'
|
||||
|
||||
java {
|
||||
toolchain {
|
||||
languageVersion = JavaLanguageVersion.of(21)
|
||||
}
|
||||
}
|
||||
|
||||
application {
|
||||
mainClass = 'com.printcalculator.BackendApplication'
|
||||
}
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation 'org.springframework.boot:spring-boot-starter-web'
|
||||
implementation 'org.springframework.boot:spring-boot-starter-security'
|
||||
implementation 'org.springframework.boot:spring-boot-starter-validation'
|
||||
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
|
||||
implementation 'xyz.capybara:clamav-client:2.1.2'
|
||||
implementation 'org.springframework.boot:spring-boot-starter-actuator'
|
||||
runtimeOnly 'org.postgresql:postgresql'
|
||||
developmentOnly 'org.springframework.boot:spring-boot-devtools'
|
||||
testImplementation 'org.springframework.boot:spring-boot-starter-test'
|
||||
testImplementation 'org.springframework.security:spring-security-test'
|
||||
testRuntimeOnly 'com.h2database:h2'
|
||||
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
|
||||
compileOnly 'org.projectlombok:lombok'
|
||||
annotationProcessor 'org.projectlombok:lombok'
|
||||
implementation 'io.github.openhtmltopdf:openhtmltopdf-pdfbox:1.1.37'
|
||||
implementation 'io.github.openhtmltopdf:openhtmltopdf-svg-support:1.1.37'
|
||||
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
|
||||
implementation 'net.codecrete.qrbill:qrbill-generator:3.4.0'
|
||||
implementation 'org.springframework.boot:spring-boot-starter-mail'
|
||||
implementation 'org.jsoup:jsoup:1.18.3'
|
||||
implementation platform('org.lwjgl:lwjgl-bom:3.3.4')
|
||||
implementation 'org.lwjgl:lwjgl'
|
||||
implementation 'org.lwjgl:lwjgl-assimp'
|
||||
runtimeOnly 'org.lwjgl:lwjgl::natives-linux'
|
||||
runtimeOnly 'org.lwjgl:lwjgl::natives-macos'
|
||||
runtimeOnly 'org.lwjgl:lwjgl::natives-macos-arm64'
|
||||
runtimeOnly 'org.lwjgl:lwjgl-assimp::natives-linux'
|
||||
runtimeOnly 'org.lwjgl:lwjgl-assimp::natives-macos'
|
||||
runtimeOnly 'org.lwjgl:lwjgl-assimp::natives-macos-arm64'
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
tasks.named('test') {
|
||||
useJUnitPlatform()
|
||||
}
|
||||
|
||||
tasks.named('bootRun') {
|
||||
args = ["--spring.profiles.active=local"]
|
||||
}
|
||||
|
||||
application {
|
||||
applicationDefaultJvmArgs = ["-Dspring.profiles.active=local"]
|
||||
}
|
||||
@@ -1,150 +0,0 @@
|
||||
import re
|
||||
import os
|
||||
import logging
|
||||
from typing import Dict, Any, Optional
|
||||
from config import settings
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
class GCodeParser:
|
||||
@staticmethod
|
||||
def parse_metadata(gcode_path: str) -> Dict[str, Any]:
|
||||
"""
|
||||
Parses the G-code to extract estimated time and material usage.
|
||||
Scans both the beginning (header) and end (footer) of the file.
|
||||
"""
|
||||
stats = {
|
||||
"print_time_seconds": 0,
|
||||
"filament_length_mm": 0,
|
||||
"filament_volume_mm3": 0,
|
||||
"filament_weight_g": 0,
|
||||
"slicer_estimated_cost": 0
|
||||
}
|
||||
|
||||
if not os.path.exists(gcode_path):
|
||||
logger.warning(f"GCode file not found for parsing: {gcode_path}")
|
||||
return stats
|
||||
|
||||
try:
|
||||
with open(gcode_path, 'r', encoding='utf-8', errors='ignore') as f:
|
||||
# Read header (first 500 lines)
|
||||
header_lines = [f.readline().strip() for _ in range(500) if f]
|
||||
|
||||
# Read footer (last 20KB)
|
||||
f.seek(0, 2)
|
||||
file_size = f.tell()
|
||||
read_len = min(file_size, 20480)
|
||||
f.seek(file_size - read_len)
|
||||
footer_lines = f.read().splitlines()
|
||||
|
||||
all_lines = header_lines + footer_lines
|
||||
|
||||
for line in all_lines:
|
||||
line = line.strip()
|
||||
if not line.startswith(";"):
|
||||
continue
|
||||
|
||||
GCodeParser._parse_line(line, stats)
|
||||
|
||||
# Fallback calculation
|
||||
if stats["filament_weight_g"] == 0 and stats["filament_length_mm"] > 0:
|
||||
GCodeParser._calculate_weight_fallback(stats)
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error parsing G-code: {e}")
|
||||
|
||||
return stats
|
||||
|
||||
@staticmethod
|
||||
def _parse_line(line: str, stats: Dict[str, Any]):
|
||||
# Parse Time
|
||||
if "estimated printing time =" in line: # Header
|
||||
time_str = line.split("=")[1].strip()
|
||||
stats["print_time_seconds"] = GCodeParser._parse_time_string(time_str)
|
||||
elif "total estimated time:" in line: # Footer
|
||||
parts = line.split("total estimated time:")
|
||||
if len(parts) > 1:
|
||||
stats["print_time_seconds"] = GCodeParser._parse_time_string(parts[1].strip())
|
||||
|
||||
# Parse Filament info
|
||||
if "filament used [g] =" in line:
|
||||
try:
|
||||
stats["filament_weight_g"] = float(line.split("=")[1].strip())
|
||||
except ValueError: pass
|
||||
|
||||
if "filament used [mm] =" in line:
|
||||
try:
|
||||
stats["filament_length_mm"] = float(line.split("=")[1].strip())
|
||||
except ValueError: pass
|
||||
|
||||
if "filament used [cm3] =" in line:
|
||||
try:
|
||||
# cm3 to mm3
|
||||
stats["filament_volume_mm3"] = float(line.split("=")[1].strip()) * 1000
|
||||
except ValueError: pass
|
||||
|
||||
@staticmethod
|
||||
def _calculate_weight_fallback(stats: Dict[str, Any]):
|
||||
# Assumes 1.75mm diameter and PLA density 1.24
|
||||
radius = 1.75 / 2
|
||||
volume_mm3 = 3.14159 * (radius ** 2) * stats["filament_length_mm"]
|
||||
volume_cm3 = volume_mm3 / 1000.0
|
||||
stats["filament_weight_g"] = volume_cm3 * 1.24
|
||||
|
||||
@staticmethod
|
||||
def _parse_time_string(time_str: str) -> int:
|
||||
"""
|
||||
Converts '1d 2h 3m 4s' to seconds.
|
||||
"""
|
||||
total_seconds = 0
|
||||
days = re.search(r'(\d+)d', time_str)
|
||||
hours = re.search(r'(\d+)h', time_str)
|
||||
mins = re.search(r'(\d+)m', time_str)
|
||||
secs = re.search(r'(\d+)s', time_str)
|
||||
|
||||
if days: total_seconds += int(days.group(1)) * 86400
|
||||
if hours: total_seconds += int(hours.group(1)) * 3600
|
||||
if mins: total_seconds += int(mins.group(1)) * 60
|
||||
if secs: total_seconds += int(secs.group(1))
|
||||
|
||||
return total_seconds
|
||||
|
||||
|
||||
class QuoteCalculator:
|
||||
@staticmethod
|
||||
def calculate(stats: Dict[str, Any]) -> Dict[str, Any]:
|
||||
"""
|
||||
Calculates the final quote based on parsed stats and settings.
|
||||
"""
|
||||
# 1. Material Cost
|
||||
# Cost per gram = (Cost per kg / 1000)
|
||||
material_cost = (stats["filament_weight_g"] / 1000.0) * settings.FILAMENT_COST_PER_KG
|
||||
|
||||
# 2. Machine Time Cost
|
||||
# Cost per second = (Cost per hour / 3600)
|
||||
print_time_hours = stats["print_time_seconds"] / 3600.0
|
||||
machine_cost = print_time_hours * settings.MACHINE_COST_PER_HOUR
|
||||
|
||||
# 3. Energy Cost
|
||||
# kWh = (Watts / 1000) * hours
|
||||
kwh_used = (settings.PRINTER_POWER_WATTS / 1000.0) * print_time_hours
|
||||
energy_cost = kwh_used * settings.ENERGY_COST_PER_KWH
|
||||
|
||||
# Subtotal
|
||||
subtotal = material_cost + machine_cost + energy_cost
|
||||
|
||||
# 4. Markup
|
||||
markup_factor = 1.0 + (settings.MARKUP_PERCENT / 100.0)
|
||||
total_price = subtotal * markup_factor
|
||||
|
||||
return {
|
||||
"breakdown": {
|
||||
"material_cost": round(material_cost, 2),
|
||||
"machine_cost": round(machine_cost, 2),
|
||||
"energy_cost": round(energy_cost, 2),
|
||||
"subtotal": round(subtotal, 2),
|
||||
"markup_amount": round(total_price - subtotal, 2)
|
||||
},
|
||||
"total_price": round(total_price, 2),
|
||||
"currency": "EUR"
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
import os
|
||||
|
||||
class Settings:
|
||||
# Directories
|
||||
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
TEMP_DIR = os.environ.get("TEMP_DIR", os.path.join(BASE_DIR, "temp"))
|
||||
PROFILES_DIR = os.environ.get("PROFILES_DIR", os.path.join(BASE_DIR, "profiles"))
|
||||
|
||||
# Slicer Paths
|
||||
SLICER_PATH = os.environ.get("SLICER_PATH", "/opt/orcaslicer/AppRun")
|
||||
ORCA_HOME = os.environ.get("ORCA_HOME", "/opt/orcaslicer")
|
||||
|
||||
# Defaults Profiles (Bambu A1)
|
||||
MACHINE_PROFILE = os.path.join(ORCA_HOME, "resources/profiles/BBL/machine/Bambu Lab A1 0.4 nozzle.json")
|
||||
PROCESS_PROFILE = os.path.join(ORCA_HOME, "resources/profiles/BBL/process/0.20mm Standard @BBL A1.json")
|
||||
FILAMENT_PROFILE = os.path.join(ORCA_HOME, "resources/profiles/BBL/filament/Generic PLA @BBL A1.json")
|
||||
|
||||
# Pricing
|
||||
FILAMENT_COST_PER_KG = float(os.environ.get("FILAMENT_COST_PER_KG", 25.0))
|
||||
MACHINE_COST_PER_HOUR = float(os.environ.get("MACHINE_COST_PER_HOUR", 2.0))
|
||||
ENERGY_COST_PER_KWH = float(os.environ.get("ENERGY_COST_PER_KWH", 0.30))
|
||||
PRINTER_POWER_WATTS = float(os.environ.get("PRINTER_POWER_WATTS", 150.0))
|
||||
MARKUP_PERCENT = float(os.environ.get("MARKUP_PERCENT", 20.0))
|
||||
|
||||
settings = Settings()
|
||||
76
backend/entrypoint.sh
Normal file
76
backend/entrypoint.sh
Normal file
@@ -0,0 +1,76 @@
|
||||
#!/bin/sh
|
||||
set -e
|
||||
|
||||
# In container default to the ffmpeg selected during image build.
|
||||
if [ -z "${MEDIA_FFMPEG_PATH:-}" ]; then
|
||||
MEDIA_FFMPEG_PATH="/usr/local/bin/ffmpeg-media"
|
||||
fi
|
||||
export MEDIA_FFMPEG_PATH
|
||||
|
||||
validate_ffmpeg_support() {
|
||||
ffmpeg_bin="$1"
|
||||
if ! command -v "$ffmpeg_bin" >/dev/null 2>&1; then
|
||||
echo "ERROR: FFmpeg executable not found: ${ffmpeg_bin}" >&2
|
||||
exit 11
|
||||
fi
|
||||
|
||||
encoders="$(mktemp)"
|
||||
muxers="$(mktemp)"
|
||||
trap 'rm -f "$encoders" "$muxers"' EXIT
|
||||
|
||||
"$ffmpeg_bin" -hide_banner -encoders > "$encoders" 2>&1 || {
|
||||
echo "ERROR: Unable to inspect FFmpeg encoders from ${ffmpeg_bin}" >&2
|
||||
cat "$encoders" >&2
|
||||
exit 12
|
||||
}
|
||||
"$ffmpeg_bin" -hide_banner -muxers > "$muxers" 2>&1 || {
|
||||
echo "ERROR: Unable to inspect FFmpeg muxers from ${ffmpeg_bin}" >&2
|
||||
cat "$muxers" >&2
|
||||
exit 13
|
||||
}
|
||||
|
||||
grep -Eq '[[:space:]]mjpeg[[:space:]]' "$encoders" || {
|
||||
echo "ERROR: FFmpeg '${ffmpeg_bin}' missing JPEG encoder (mjpeg)." >&2
|
||||
exit 14
|
||||
}
|
||||
grep -Eq '[[:space:]](libwebp|webp)[[:space:]]' "$encoders" || {
|
||||
echo "ERROR: FFmpeg '${ffmpeg_bin}' missing WebP encoder." >&2
|
||||
exit 15
|
||||
}
|
||||
grep -Eq '[[:space:]](libaom-av1|librav1e|libsvtav1)[[:space:]]' "$encoders" || {
|
||||
echo "ERROR: FFmpeg '${ffmpeg_bin}' missing AVIF-capable encoder." >&2
|
||||
exit 16
|
||||
}
|
||||
grep -Eq '[[:space:]]avif([[:space:]]|,|$)' "$muxers" || {
|
||||
echo "ERROR: FFmpeg '${ffmpeg_bin}' missing AVIF muxer." >&2
|
||||
exit 17
|
||||
}
|
||||
}
|
||||
|
||||
validate_ffmpeg_support "$MEDIA_FFMPEG_PATH"
|
||||
|
||||
echo "----------------------------------------------------------------"
|
||||
echo "Starting Backend Application"
|
||||
echo "DB_URL: $DB_URL"
|
||||
echo "DB_USERNAME: $DB_USERNAME"
|
||||
echo "SPRING_DATASOURCE_URL: $SPRING_DATASOURCE_URL"
|
||||
echo "SLICER_PATH: $SLICER_PATH"
|
||||
echo "MEDIA_FFMPEG_PATH: $MEDIA_FFMPEG_PATH"
|
||||
echo "----------------------------------------------------------------"
|
||||
|
||||
# Determine which environment variables to use for database connection
|
||||
# This allows compatibility with different docker-compose configurations
|
||||
FINAL_DB_URL="${DB_URL:-$SPRING_DATASOURCE_URL}"
|
||||
FINAL_DB_USER="${DB_USERNAME:-$SPRING_DATASOURCE_USERNAME}"
|
||||
FINAL_DB_PASS="${DB_PASSWORD:-$SPRING_DATASOURCE_PASSWORD}"
|
||||
|
||||
if [ -n "$FINAL_DB_URL" ]; then
|
||||
echo "Using database URL: $FINAL_DB_URL"
|
||||
exec java -jar app.jar \
|
||||
--spring.datasource.url="${FINAL_DB_URL}" \
|
||||
--spring.datasource.username="${FINAL_DB_USER}" \
|
||||
--spring.datasource.password="${FINAL_DB_PASS}"
|
||||
else
|
||||
echo "No database URL specified in environment, relying on application.properties defaults."
|
||||
exec java -jar app.jar
|
||||
fi
|
||||
BIN
backend/gradle/wrapper/gradle-wrapper.jar
vendored
Normal file
BIN
backend/gradle/wrapper/gradle-wrapper.jar
vendored
Normal file
Binary file not shown.
7
backend/gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
7
backend/gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-9.1.0-bin.zip
|
||||
networkTimeout=10000
|
||||
validateDistributionUrl=true
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
248
backend/gradlew
vendored
Executable file
248
backend/gradlew
vendored
Executable file
@@ -0,0 +1,248 @@
|
||||
#!/bin/sh
|
||||
|
||||
#
|
||||
# Copyright © 2015 the original authors.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# https://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
##############################################################################
|
||||
#
|
||||
# Gradle start up script for POSIX generated by Gradle.
|
||||
#
|
||||
# Important for running:
|
||||
#
|
||||
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
|
||||
# noncompliant, but you have some other compliant shell such as ksh or
|
||||
# bash, then to run this script, type that shell name before the whole
|
||||
# command line, like:
|
||||
#
|
||||
# ksh Gradle
|
||||
#
|
||||
# Busybox and similar reduced shells will NOT work, because this script
|
||||
# requires all of these POSIX shell features:
|
||||
# * functions;
|
||||
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
|
||||
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
|
||||
# * compound commands having a testable exit status, especially «case»;
|
||||
# * various built-in commands including «command», «set», and «ulimit».
|
||||
#
|
||||
# Important for patching:
|
||||
#
|
||||
# (2) This script targets any POSIX shell, so it avoids extensions provided
|
||||
# by Bash, Ksh, etc; in particular arrays are avoided.
|
||||
#
|
||||
# The "traditional" practice of packing multiple parameters into a
|
||||
# space-separated string is a well documented source of bugs and security
|
||||
# problems, so this is (mostly) avoided, by progressively accumulating
|
||||
# options in "$@", and eventually passing that to Java.
|
||||
#
|
||||
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
|
||||
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
|
||||
# see the in-line comments for details.
|
||||
#
|
||||
# There are tweaks for specific operating systems such as AIX, CygWin,
|
||||
# Darwin, MinGW, and NonStop.
|
||||
#
|
||||
# (3) This script is generated from the Groovy template
|
||||
# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
||||
# within the Gradle project.
|
||||
#
|
||||
# You can find Gradle at https://github.com/gradle/gradle/.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
# Attempt to set APP_HOME
|
||||
|
||||
# Resolve links: $0 may be a link
|
||||
app_path=$0
|
||||
|
||||
# Need this for daisy-chained symlinks.
|
||||
while
|
||||
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
|
||||
[ -h "$app_path" ]
|
||||
do
|
||||
ls=$( ls -ld "$app_path" )
|
||||
link=${ls#*' -> '}
|
||||
case $link in #(
|
||||
/*) app_path=$link ;; #(
|
||||
*) app_path=$APP_HOME$link ;;
|
||||
esac
|
||||
done
|
||||
|
||||
# This is normally unused
|
||||
# shellcheck disable=SC2034
|
||||
APP_BASE_NAME=${0##*/}
|
||||
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
|
||||
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit
|
||||
|
||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||
MAX_FD=maximum
|
||||
|
||||
warn () {
|
||||
echo "$*"
|
||||
} >&2
|
||||
|
||||
die () {
|
||||
echo
|
||||
echo "$*"
|
||||
echo
|
||||
exit 1
|
||||
} >&2
|
||||
|
||||
# OS specific support (must be 'true' or 'false').
|
||||
cygwin=false
|
||||
msys=false
|
||||
darwin=false
|
||||
nonstop=false
|
||||
case "$( uname )" in #(
|
||||
CYGWIN* ) cygwin=true ;; #(
|
||||
Darwin* ) darwin=true ;; #(
|
||||
MSYS* | MINGW* ) msys=true ;; #(
|
||||
NONSTOP* ) nonstop=true ;;
|
||||
esac
|
||||
|
||||
|
||||
|
||||
# Determine the Java command to use to start the JVM.
|
||||
if [ -n "$JAVA_HOME" ] ; then
|
||||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||
# IBM's JDK on AIX uses strange locations for the executables
|
||||
JAVACMD=$JAVA_HOME/jre/sh/java
|
||||
else
|
||||
JAVACMD=$JAVA_HOME/bin/java
|
||||
fi
|
||||
if [ ! -x "$JAVACMD" ] ; then
|
||||
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
else
|
||||
JAVACMD=java
|
||||
if ! command -v java >/dev/null 2>&1
|
||||
then
|
||||
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
fi
|
||||
|
||||
# Increase the maximum file descriptors if we can.
|
||||
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
|
||||
case $MAX_FD in #(
|
||||
max*)
|
||||
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
|
||||
# shellcheck disable=SC2039,SC3045
|
||||
MAX_FD=$( ulimit -H -n ) ||
|
||||
warn "Could not query maximum file descriptor limit"
|
||||
esac
|
||||
case $MAX_FD in #(
|
||||
'' | soft) :;; #(
|
||||
*)
|
||||
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
|
||||
# shellcheck disable=SC2039,SC3045
|
||||
ulimit -n "$MAX_FD" ||
|
||||
warn "Could not set maximum file descriptor limit to $MAX_FD"
|
||||
esac
|
||||
fi
|
||||
|
||||
# Collect all arguments for the java command, stacking in reverse order:
|
||||
# * args from the command line
|
||||
# * the main class name
|
||||
# * -classpath
|
||||
# * -D...appname settings
|
||||
# * --module-path (only if needed)
|
||||
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
|
||||
|
||||
# For Cygwin or MSYS, switch paths to Windows format before running java
|
||||
if "$cygwin" || "$msys" ; then
|
||||
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
|
||||
|
||||
JAVACMD=$( cygpath --unix "$JAVACMD" )
|
||||
|
||||
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
||||
for arg do
|
||||
if
|
||||
case $arg in #(
|
||||
-*) false ;; # don't mess with options #(
|
||||
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
|
||||
[ -e "$t" ] ;; #(
|
||||
*) false ;;
|
||||
esac
|
||||
then
|
||||
arg=$( cygpath --path --ignore --mixed "$arg" )
|
||||
fi
|
||||
# Roll the args list around exactly as many times as the number of
|
||||
# args, so each arg winds up back in the position where it started, but
|
||||
# possibly modified.
|
||||
#
|
||||
# NB: a `for` loop captures its iteration list before it begins, so
|
||||
# changing the positional parameters here affects neither the number of
|
||||
# iterations, nor the values presented in `arg`.
|
||||
shift # remove old arg
|
||||
set -- "$@" "$arg" # push replacement arg
|
||||
done
|
||||
fi
|
||||
|
||||
|
||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||
|
||||
# Collect all arguments for the java command:
|
||||
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
|
||||
# and any embedded shellness will be escaped.
|
||||
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
|
||||
# treated as '${Hostname}' itself on the command line.
|
||||
|
||||
set -- \
|
||||
"-Dorg.gradle.appname=$APP_BASE_NAME" \
|
||||
-jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \
|
||||
"$@"
|
||||
|
||||
# Stop when "xargs" is not available.
|
||||
if ! command -v xargs >/dev/null 2>&1
|
||||
then
|
||||
die "xargs is not available"
|
||||
fi
|
||||
|
||||
# Use "xargs" to parse quoted args.
|
||||
#
|
||||
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
|
||||
#
|
||||
# In Bash we could simply go:
|
||||
#
|
||||
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
|
||||
# set -- "${ARGS[@]}" "$@"
|
||||
#
|
||||
# but POSIX shell has neither arrays nor command substitution, so instead we
|
||||
# post-process each arg (as a line of input to sed) to backslash-escape any
|
||||
# character that might be a shell metacharacter, then use eval to reverse
|
||||
# that process (while maintaining the separation between arguments), and wrap
|
||||
# the whole thing up as a single "set" statement.
|
||||
#
|
||||
# This will of course break if any of these variables contains a newline or
|
||||
# an unmatched quote.
|
||||
#
|
||||
|
||||
eval "set -- $(
|
||||
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
|
||||
xargs -n1 |
|
||||
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
|
||||
tr '\n' ' '
|
||||
)" '"$@"'
|
||||
|
||||
exec "$JAVACMD" "$@"
|
||||
93
backend/gradlew.bat
vendored
Normal file
93
backend/gradlew.bat
vendored
Normal file
@@ -0,0 +1,93 @@
|
||||
@rem
|
||||
@rem Copyright 2015 the original author or authors.
|
||||
@rem
|
||||
@rem Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@rem you may not use this file except in compliance with the License.
|
||||
@rem You may obtain a copy of the License at
|
||||
@rem
|
||||
@rem https://www.apache.org/licenses/LICENSE-2.0
|
||||
@rem
|
||||
@rem Unless required by applicable law or agreed to in writing, software
|
||||
@rem distributed under the License is distributed on an "AS IS" BASIS,
|
||||
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
@rem See the License for the specific language governing permissions and
|
||||
@rem limitations under the License.
|
||||
@rem
|
||||
@rem SPDX-License-Identifier: Apache-2.0
|
||||
@rem
|
||||
|
||||
@if "%DEBUG%"=="" @echo off
|
||||
@rem ##########################################################################
|
||||
@rem
|
||||
@rem Gradle startup script for Windows
|
||||
@rem
|
||||
@rem ##########################################################################
|
||||
|
||||
@rem Set local scope for the variables with windows NT shell
|
||||
if "%OS%"=="Windows_NT" setlocal
|
||||
|
||||
set DIRNAME=%~dp0
|
||||
if "%DIRNAME%"=="" set DIRNAME=.
|
||||
@rem This is normally unused
|
||||
set APP_BASE_NAME=%~n0
|
||||
set APP_HOME=%DIRNAME%
|
||||
|
||||
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
|
||||
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
|
||||
|
||||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
|
||||
|
||||
@rem Find java.exe
|
||||
if defined JAVA_HOME goto findJavaFromJavaHome
|
||||
|
||||
set JAVA_EXE=java.exe
|
||||
%JAVA_EXE% -version >NUL 2>&1
|
||||
if %ERRORLEVEL% equ 0 goto execute
|
||||
|
||||
echo. 1>&2
|
||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
|
||||
echo. 1>&2
|
||||
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
|
||||
echo location of your Java installation. 1>&2
|
||||
|
||||
goto fail
|
||||
|
||||
:findJavaFromJavaHome
|
||||
set JAVA_HOME=%JAVA_HOME:"=%
|
||||
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||
|
||||
if exist "%JAVA_EXE%" goto execute
|
||||
|
||||
echo. 1>&2
|
||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
|
||||
echo. 1>&2
|
||||
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
|
||||
echo location of your Java installation. 1>&2
|
||||
|
||||
goto fail
|
||||
|
||||
:execute
|
||||
@rem Setup the command line
|
||||
|
||||
|
||||
|
||||
@rem Execute Gradle
|
||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %*
|
||||
|
||||
:end
|
||||
@rem End local scope for the variables with windows NT shell
|
||||
if %ERRORLEVEL% equ 0 goto mainEnd
|
||||
|
||||
:fail
|
||||
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
||||
rem the _cmd.exe /c_ return code!
|
||||
set EXIT_CODE=%ERRORLEVEL%
|
||||
if %EXIT_CODE% equ 0 set EXIT_CODE=1
|
||||
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
|
||||
exit /b %EXIT_CODE%
|
||||
|
||||
:mainEnd
|
||||
if "%OS%"=="Windows_NT" endlocal
|
||||
|
||||
:omega
|
||||
112
backend/main.py
112
backend/main.py
@@ -1,112 +0,0 @@
|
||||
import os
|
||||
import shutil
|
||||
import uuid
|
||||
import logging
|
||||
from fastapi import FastAPI, UploadFile, File, HTTPException
|
||||
from fastapi.middleware.cors import CORSMiddleware
|
||||
from pydantic import BaseModel
|
||||
|
||||
# Import custom modules
|
||||
from config import settings
|
||||
from slicer import slicer_service
|
||||
from calculator import GCodeParser, QuoteCalculator
|
||||
|
||||
# Configure logging
|
||||
logging.basicConfig(level=logging.INFO)
|
||||
logger = logging.getLogger("api")
|
||||
|
||||
app = FastAPI(title="Print Calculator API")
|
||||
|
||||
# CORS Setup
|
||||
app.add_middleware(
|
||||
CORSMiddleware,
|
||||
allow_origins=["*"],
|
||||
allow_credentials=True,
|
||||
allow_methods=["*"],
|
||||
allow_headers=["*"],
|
||||
)
|
||||
|
||||
# Ensure directories exist
|
||||
os.makedirs(settings.TEMP_DIR, exist_ok=True)
|
||||
|
||||
class QuoteResponse(BaseModel):
|
||||
printer: str
|
||||
print_time_seconds: int
|
||||
print_time_formatted: str
|
||||
material_grams: float
|
||||
cost: dict
|
||||
notes: list[str] = []
|
||||
|
||||
def cleanup_files(files: list):
|
||||
for f in files:
|
||||
try:
|
||||
if os.path.exists(f):
|
||||
os.remove(f)
|
||||
except Exception as e:
|
||||
logger.warning(f"Failed to delete temp file {f}: {e}")
|
||||
|
||||
def format_time(seconds: int) -> str:
|
||||
m, s = divmod(seconds, 60)
|
||||
h, m = divmod(m, 60)
|
||||
if h > 0:
|
||||
return f"{int(h)}h {int(m)}m"
|
||||
return f"{int(m)}m {int(s)}s"
|
||||
|
||||
@app.post("/calculate/stl", response_model=QuoteResponse)
|
||||
async def calculate_from_stl(file: UploadFile = File(...)):
|
||||
if not file.filename.lower().endswith(".stl"):
|
||||
raise HTTPException(status_code=400, detail="Only .stl files are supported.")
|
||||
|
||||
# Unique ID for this request
|
||||
req_id = str(uuid.uuid4())
|
||||
input_filename = f"{req_id}.stl"
|
||||
output_filename = f"{req_id}.gcode"
|
||||
|
||||
input_path = os.path.join(settings.TEMP_DIR, input_filename)
|
||||
output_path = os.path.join(settings.TEMP_DIR, output_filename)
|
||||
|
||||
try:
|
||||
# 1. Save Uploaded File
|
||||
with open(input_path, "wb") as buffer:
|
||||
shutil.copyfileobj(file.file, buffer)
|
||||
|
||||
# 2. Slice
|
||||
# slicer_service methods raise exceptions on failure
|
||||
slicer_service.slice_stl(input_path, output_path)
|
||||
|
||||
# 3. Parse Results
|
||||
stats = GCodeParser.parse_metadata(output_path)
|
||||
|
||||
if stats["print_time_seconds"] == 0 and stats["filament_weight_g"] == 0:
|
||||
# Slicing likely failed or produced empty output without throwing error
|
||||
raise HTTPException(status_code=500, detail="Slicing completed but no stats found. Check mesh validity.")
|
||||
|
||||
# 4. Calculate Costs
|
||||
quote = QuoteCalculator.calculate(stats)
|
||||
|
||||
return {
|
||||
"printer": "BambuLab A1 (Estimated)",
|
||||
"print_time_seconds": stats["print_time_seconds"],
|
||||
"print_time_formatted": format_time(stats["print_time_seconds"]),
|
||||
"material_grams": stats["filament_weight_g"],
|
||||
"cost": {
|
||||
"material": quote["breakdown"]["material_cost"],
|
||||
"machine": quote["breakdown"]["machine_cost"],
|
||||
"energy": quote["breakdown"]["energy_cost"],
|
||||
"markup": quote["breakdown"]["markup_amount"],
|
||||
"total": quote["total_price"]
|
||||
},
|
||||
"notes": ["Estimation generated using OrcaSlicer headless."]
|
||||
}
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error processing request: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
finally:
|
||||
# Cleanup
|
||||
cleanup_files([input_path, output_path])
|
||||
|
||||
@app.get("/health")
|
||||
def health_check():
|
||||
return {"status": "ok", "slicer": settings.SLICER_PATH}
|
||||
Binary file not shown.
@@ -6,13 +6,13 @@ bed_shape = 0x0,256x0,256x256,0x256
|
||||
nozzle_diameter = 0.4
|
||||
filament_diameter = 1.75
|
||||
max_print_speed = 500
|
||||
travel_speed = 500
|
||||
travel_speed = 700
|
||||
gcode_flavor = klipper
|
||||
# Bambu uses specific gcode but klipper/marlin is close enough for time est if accel matches
|
||||
machine_max_acceleration_x = 10000
|
||||
machine_max_acceleration_y = 10000
|
||||
machine_max_acceleration_e = 5000
|
||||
machine_max_acceleration_extruding = 5000
|
||||
machine_max_acceleration_e = 6000
|
||||
machine_max_acceleration_extruding = 6000
|
||||
|
||||
# PRINT SETTINGS
|
||||
layer_height = 0.2
|
||||
@@ -26,17 +26,17 @@ bottom_solid_layers = 3
|
||||
|
||||
# SPEED SETTINGS (Conservative defaults for A1)
|
||||
perimeter_speed = 200
|
||||
external_perimeter_speed = 150
|
||||
external_perimeter_speed = 200
|
||||
infill_speed = 250
|
||||
solid_infill_speed = 200
|
||||
top_solid_infill_speed = 150
|
||||
support_material_speed = 150
|
||||
bridge_speed = 50
|
||||
bridge_speed = 150
|
||||
gap_fill_speed = 50
|
||||
|
||||
# FILAMENT SETTINGS
|
||||
filament_density = 1.24
|
||||
filament_cost = 25.0
|
||||
filament_cost = 18.0
|
||||
filament_max_volumetric_speed = 15
|
||||
temperature = 220
|
||||
bed_temperature = 60
|
||||
bed_temperature = 65
|
||||
|
||||
88
backend/profiles/printers/BL-P001.json
Normal file
88
backend/profiles/printers/BL-P001.json
Normal file
@@ -0,0 +1,88 @@
|
||||
{
|
||||
"00.00.00.00": {
|
||||
"display_name": "Bambu Lab X1 Carbon",
|
||||
"print": {
|
||||
"ipcam": {
|
||||
"resolution_supported": [ "720p", "1080p" ],
|
||||
"virtual_camera": "enabled",
|
||||
"liveview": {
|
||||
"remote": "tutk"
|
||||
},
|
||||
"file": {
|
||||
"remote": "tutk",
|
||||
"model_download": "enabled"
|
||||
}
|
||||
},
|
||||
"support_motor_noise_cali":false,
|
||||
"support_tunnel_mqtt":false,
|
||||
"support_mqtt_alive":false,
|
||||
"support_command_ams_switch":false,
|
||||
"support_cloud_print_only":false,
|
||||
"support_1080dpi":false,
|
||||
"support_prompt_sound":false,
|
||||
"support_ams_humidity":false,
|
||||
"support_auto_recovery_step_loss":false,
|
||||
"support_auto_leveling":true,
|
||||
"support_update_remain":false,
|
||||
"support_timelapse":true,
|
||||
"support_filament_backup":false,
|
||||
"support_chamber_fan":true,
|
||||
"support_aux_fan":true,
|
||||
"support_send_to_sd":false,
|
||||
"support_print_all":true,
|
||||
"support_print_without_sd":true,
|
||||
"support_flow_calibration":true,
|
||||
"support_build_plate_marker_detect":false,
|
||||
"support_lidar_calibration":true,
|
||||
"support_ai_monitoring":false,
|
||||
"support_first_layer_inspect":true,
|
||||
"support_chamber_temp_edit":false,
|
||||
"support_extrusion_cali":false,
|
||||
"support_user_preset":false
|
||||
},
|
||||
"model_id":"BL-P001",
|
||||
"compatible_machine":["BL-P002", "C11", "C12", "C13"],
|
||||
"printer_type":"3DPrinter-X1-Carbon",
|
||||
"printer_thumbnail_image":"printer_thumbnail",
|
||||
"printer_connect_help_image":"input_access_code_x1",
|
||||
"printer_use_ams_image":"ams_icon",
|
||||
"use_ams_type":"generic",
|
||||
"printer_arch":"core_xy",
|
||||
"printer_series":"series_x1",
|
||||
"has_cali_line":true,
|
||||
"printer_is_enclosed":true
|
||||
},
|
||||
"01.01.01.00": {
|
||||
"print": {
|
||||
"support_1080dpi":true,
|
||||
"support_ams_humidity":true,
|
||||
"support_update_remain":true,
|
||||
"support_auto_recovery_step_loss":true,
|
||||
"support_filament_backup":true,
|
||||
"support_send_to_sd":true,
|
||||
"support_build_plate_marker_detect":true,
|
||||
"support_ai_monitoring":true
|
||||
}
|
||||
},
|
||||
"01.05.06.01" : {
|
||||
"print": {
|
||||
"support_command_ams_switch":true
|
||||
}
|
||||
},
|
||||
"01.05.06.05" : {
|
||||
"engineer":"00.03.10.05",
|
||||
"print": {
|
||||
"support_mqtt_alive":true
|
||||
}
|
||||
},
|
||||
"01.05.06.06": {
|
||||
"print": {
|
||||
"support_tunnel_mqtt":true
|
||||
}
|
||||
},
|
||||
"01.06.06.00": {
|
||||
"print": {
|
||||
"support_user_preset":true
|
||||
}
|
||||
}
|
||||
}
|
||||
88
backend/profiles/printers/BL-P002.json
Normal file
88
backend/profiles/printers/BL-P002.json
Normal file
@@ -0,0 +1,88 @@
|
||||
{
|
||||
"00.00.00.00": {
|
||||
"display_name": "Bambu Lab X1",
|
||||
"print": {
|
||||
"ipcam": {
|
||||
"resolution_supported": [ "720p", "1080p" ],
|
||||
"virtual_camera": "enabled",
|
||||
"liveview": {
|
||||
"remote": "tutk"
|
||||
},
|
||||
"file": {
|
||||
"remote": "tutk",
|
||||
"model_download": "enabled"
|
||||
}
|
||||
},
|
||||
"support_motor_noise_cali":false,
|
||||
"support_tunnel_mqtt":false,
|
||||
"support_mqtt_alive":false,
|
||||
"support_command_ams_switch":false,
|
||||
"support_cloud_print_only":false,
|
||||
"support_1080dpi":false,
|
||||
"support_prompt_sound":false,
|
||||
"support_ams_humidity":false,
|
||||
"support_auto_recovery_step_loss":false,
|
||||
"support_auto_leveling":true,
|
||||
"support_update_remain":false,
|
||||
"support_timelapse":true,
|
||||
"support_filament_backup":false,
|
||||
"support_chamber_fan":true,
|
||||
"support_aux_fan":true,
|
||||
"support_send_to_sd":false,
|
||||
"support_print_all":true,
|
||||
"support_print_without_sd":true,
|
||||
"support_flow_calibration":true,
|
||||
"support_build_plate_marker_detect":false,
|
||||
"support_lidar_calibration":true,
|
||||
"support_ai_monitoring":false,
|
||||
"support_first_layer_inspect":true,
|
||||
"support_chamber_temp_edit":false,
|
||||
"support_extrusion_cali":false,
|
||||
"support_user_preset":false
|
||||
},
|
||||
"model_id": "BL-P002",
|
||||
"compatible_machine":["BL-P001", "C11", "C12", "C13"],
|
||||
"printer_type": "3DPrinter-X1",
|
||||
"printer_thumbnail_image": "printer_thumbnail",
|
||||
"printer_connect_help_image": "input_access_code_x1",
|
||||
"printer_use_ams_image":"ams_icon",
|
||||
"use_ams_type":"generic",
|
||||
"printer_arch" : "core_xy",
|
||||
"printer_series":"series_x1",
|
||||
"has_cali_line":true,
|
||||
"printer_is_enclosed":true
|
||||
},
|
||||
"01.01.01.00": {
|
||||
"print": {
|
||||
"support_1080dpi":true,
|
||||
"support_ams_humidity":true,
|
||||
"support_update_remain":true,
|
||||
"support_auto_recovery_step_loss":true,
|
||||
"support_filament_backup":true,
|
||||
"support_send_to_sd":true,
|
||||
"support_build_plate_marker_detect":true,
|
||||
"support_ai_monitoring":true
|
||||
}
|
||||
},
|
||||
"01.05.06.01" : {
|
||||
"print": {
|
||||
"support_command_ams_switch":true
|
||||
}
|
||||
},
|
||||
"01.05.06.05" : {
|
||||
"engineer":"00.03.10.05",
|
||||
"print": {
|
||||
"support_mqtt_alive":true
|
||||
}
|
||||
},
|
||||
"01.05.06.06": {
|
||||
"print": {
|
||||
"support_tunnel_mqtt":true
|
||||
}
|
||||
},
|
||||
"01.06.06.00": {
|
||||
"print": {
|
||||
"support_user_preset":true
|
||||
}
|
||||
}
|
||||
}
|
||||
93
backend/profiles/printers/C11.json
Normal file
93
backend/profiles/printers/C11.json
Normal file
@@ -0,0 +1,93 @@
|
||||
{
|
||||
"00.00.00.00": {
|
||||
"display_name": "Bambu Lab P1P",
|
||||
"print": {
|
||||
"ipcam": {
|
||||
"resolution_supported": [ "720p" ],
|
||||
"liveview": {
|
||||
"local": "local"
|
||||
}
|
||||
},
|
||||
"support_motor_noise_cali":false,
|
||||
"support_tunnel_mqtt":false,
|
||||
"support_mqtt_alive":false,
|
||||
"support_command_ams_switch":false,
|
||||
"support_cloud_print_only":true,
|
||||
"support_1080dpi":false,
|
||||
"support_prompt_sound":false,
|
||||
"support_ams_humidity":true,
|
||||
"support_auto_recovery_step_loss":true,
|
||||
"support_auto_leveling":true,
|
||||
"support_update_remain":true,
|
||||
"support_timelapse":true,
|
||||
"support_filament_backup":true,
|
||||
"support_chamber_fan":true,
|
||||
"support_aux_fan":true,
|
||||
"support_send_to_sd":false,
|
||||
"support_print_all":false,
|
||||
"support_print_without_sd":false,
|
||||
"support_flow_calibration":false,
|
||||
"support_build_plate_marker_detect":false,
|
||||
"support_lidar_calibration":false,
|
||||
"support_ai_monitoring":false,
|
||||
"support_first_layer_inspect":false,
|
||||
"support_chamber_temp_edit":false,
|
||||
"support_extrusion_cali":true,
|
||||
"support_user_preset":false,
|
||||
"bed_temperature_limit": 100
|
||||
},
|
||||
"model_id": "C11",
|
||||
"compatible_machine":["BL-P001", "BL-P002", "C12", "C13"],
|
||||
"printer_type": "C11",
|
||||
"ftp_folder" : "sdcard/",
|
||||
"printer_thumbnail_image": "printer_thumbnail_p1p",
|
||||
"printer_connect_help_image": "input_access_code_p1p",
|
||||
"printer_use_ams_image":"ams_icon",
|
||||
"use_ams_type":"generic",
|
||||
"printer_arch" : "core_xy",
|
||||
"printer_series":"series_p1p",
|
||||
"has_cali_line":false,
|
||||
"printer_is_enclosed":false
|
||||
},
|
||||
"01.02.00.00": {
|
||||
"print": {
|
||||
"support_send_to_sd":true
|
||||
}
|
||||
},
|
||||
"01.02.99.00": {
|
||||
"print": {
|
||||
"ipcam": {
|
||||
"liveview": {
|
||||
"remote": "tutk"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"01.02.99.10" : {
|
||||
"print": {
|
||||
"support_command_ams_switch":true
|
||||
}
|
||||
},
|
||||
"01.03.50.01" : {
|
||||
"engineer":"00.06.03.51",
|
||||
"print": {
|
||||
"support_mqtt_alive":true,
|
||||
"support_tunnel_mqtt":true
|
||||
}
|
||||
},
|
||||
"01.04.50.01": {
|
||||
"print": {
|
||||
"ipcam": {
|
||||
"file": {
|
||||
"remote": "tutk"
|
||||
}
|
||||
},
|
||||
"support_user_preset":true
|
||||
}
|
||||
},
|
||||
"01.07.50.00": {
|
||||
"print": {
|
||||
"support_print_all": true
|
||||
}
|
||||
}
|
||||
}
|
||||
85
backend/profiles/printers/C12.json
Normal file
85
backend/profiles/printers/C12.json
Normal file
@@ -0,0 +1,85 @@
|
||||
{
|
||||
"00.00.00.00": {
|
||||
"display_name": "Bambu Lab P1S",
|
||||
"print": {
|
||||
"ipcam": {
|
||||
"resolution_supported": [ "720p" ],
|
||||
"liveview": {
|
||||
"local": "local"
|
||||
}
|
||||
},
|
||||
"support_motor_noise_cali":false,
|
||||
"support_tunnel_mqtt":false,
|
||||
"support_mqtt_alive":false,
|
||||
"support_command_ams_switch":false,
|
||||
"support_cloud_print_only":true,
|
||||
"support_1080dpi":false,
|
||||
"support_prompt_sound":false,
|
||||
"support_ams_humidity":true,
|
||||
"support_auto_recovery_step_loss":true,
|
||||
"support_auto_leveling":true,
|
||||
"support_update_remain":true,
|
||||
"support_timelapse":true,
|
||||
"support_filament_backup":true,
|
||||
"support_chamber_fan":true,
|
||||
"support_aux_fan":true,
|
||||
"support_send_to_sd":true,
|
||||
"support_print_all":false,
|
||||
"support_print_without_sd":false,
|
||||
"support_flow_calibration":false,
|
||||
"support_build_plate_marker_detect":false,
|
||||
"support_lidar_calibration":false,
|
||||
"support_ai_monitoring":false,
|
||||
"support_first_layer_inspect":false,
|
||||
"support_chamber_temp_edit":false,
|
||||
"support_extrusion_cali":true,
|
||||
"support_user_preset":false,
|
||||
"bed_temperature_limit": 100
|
||||
},
|
||||
"model_id": "C12",
|
||||
"compatible_machine":["BL-P001", "BL-P002", "C11", "C13"],
|
||||
"printer_type": "C12",
|
||||
"ftp_folder" : "sdcard/",
|
||||
"printer_thumbnail_image": "printer_thumbnail_p1s",
|
||||
"printer_connect_help_image": "input_access_code_p1p",
|
||||
"printer_use_ams_image":"ams_icon",
|
||||
"use_ams_type":"generic",
|
||||
"printer_arch" : "core_xy",
|
||||
"printer_series":"series_p1p",
|
||||
"has_cali_line":false,
|
||||
"printer_is_enclosed":true
|
||||
},
|
||||
"01.02.99.10" : {
|
||||
"print": {
|
||||
"support_command_ams_switch":true
|
||||
}
|
||||
},
|
||||
"01.03.50.01": {
|
||||
"engineer":"00.06.03.51",
|
||||
"resolution_supported": [ "720p" ],
|
||||
"print": {
|
||||
"ipcam": {
|
||||
"liveview": {
|
||||
"remote": "tutk"
|
||||
}
|
||||
},
|
||||
"support_mqtt_alive":true,
|
||||
"support_tunnel_mqtt":true
|
||||
}
|
||||
},
|
||||
"01.04.50.01": {
|
||||
"print": {
|
||||
"ipcam": {
|
||||
"file": {
|
||||
"remote": "tutk"
|
||||
}
|
||||
},
|
||||
"support_user_preset":true
|
||||
}
|
||||
},
|
||||
"01.07.50.00": {
|
||||
"print": {
|
||||
"support_print_all": true
|
||||
}
|
||||
}
|
||||
}
|
||||
61
backend/profiles/printers/C13.json
Normal file
61
backend/profiles/printers/C13.json
Normal file
@@ -0,0 +1,61 @@
|
||||
{
|
||||
"00.00.00.00": {
|
||||
"display_name": "Bambu Lab X1E",
|
||||
"print": {
|
||||
"ipcam": {
|
||||
"resolution_supported": [ "720p", "1080p" ],
|
||||
"virtual_camera": "enabled",
|
||||
"liveview": {
|
||||
"remote": "tutk"
|
||||
},
|
||||
"file": {
|
||||
"remote": "tutk",
|
||||
"model_download": "enabled"
|
||||
}
|
||||
},
|
||||
"support_motor_noise_cali":false,
|
||||
"support_tunnel_mqtt":true,
|
||||
"support_mqtt_alive":true,
|
||||
"support_command_ams_switch":true,
|
||||
"support_ssl_for_mqtt":true,
|
||||
"support_cloud_print_only":false,
|
||||
"support_1080dpi":true,
|
||||
"support_prompt_sound":false,
|
||||
"support_ams_humidity":true,
|
||||
"support_auto_recovery_step_loss":true,
|
||||
"support_auto_leveling":true,
|
||||
"support_update_remain":true,
|
||||
"support_timelapse":true,
|
||||
"support_filament_backup":true,
|
||||
"support_chamber_fan":true,
|
||||
"support_aux_fan":true,
|
||||
"support_send_to_sd":true,
|
||||
"support_print_all":true,
|
||||
"support_print_without_sd":true,
|
||||
"support_flow_calibration":true,
|
||||
"support_build_plate_marker_detect":true,
|
||||
"support_lidar_calibration":true,
|
||||
"support_ai_monitoring":true,
|
||||
"support_first_layer_inspect":true,
|
||||
"support_chamber_temp_edit":true,
|
||||
"support_extrusion_cali":false,
|
||||
"support_user_preset":false,
|
||||
"bed_temperature_limit": 110,
|
||||
"nozzle_max_temperature": 320
|
||||
},
|
||||
"model_id": "C13",
|
||||
"compatible_machine":["BL-P001", "BL-P002", "C11", "C12"],
|
||||
"printer_type": "C13",
|
||||
"printer_thumbnail_image": "printer_thumbnail",
|
||||
"printer_connect_help_image": "input_access_code_x1",
|
||||
"printer_use_ams_image":"ams_icon",
|
||||
"use_ams_type":"generic",
|
||||
"printer_arch" : "core_xy",
|
||||
"printer_series":"series_x1",
|
||||
"has_cali_line":true,
|
||||
"printer_is_enclosed":true
|
||||
},
|
||||
"01.05.06.06": {
|
||||
"rv2166": "00.00.21.20"
|
||||
}
|
||||
}
|
||||
62
backend/profiles/printers/N1.json
Normal file
62
backend/profiles/printers/N1.json
Normal file
@@ -0,0 +1,62 @@
|
||||
{
|
||||
"00.00.00.00": {
|
||||
"display_name": "Bambu Lab A1 mini",
|
||||
"print": {
|
||||
"ipcam": {
|
||||
"resolution_supported": [ "720p" ],
|
||||
"liveview": {
|
||||
"local": "local",
|
||||
"remote": "tutk"
|
||||
}
|
||||
},
|
||||
"support_motor_noise_cali":true,
|
||||
"support_tunnel_mqtt":true,
|
||||
"support_mqtt_alive":true,
|
||||
"support_command_ams_switch":true,
|
||||
"support_cloud_print_only":true,
|
||||
"support_1080dpi":true,
|
||||
"support_prompt_sound":true,
|
||||
"support_ams_humidity":false,
|
||||
"support_auto_recovery_step_loss":true,
|
||||
"support_auto_leveling":true,
|
||||
"support_update_remain":false,
|
||||
"support_timelapse":true,
|
||||
"support_filament_backup":true,
|
||||
"support_chamber_fan":false,
|
||||
"support_aux_fan":false,
|
||||
"support_send_to_sd":true,
|
||||
"support_print_all":false,
|
||||
"support_print_without_sd":false,
|
||||
"support_flow_calibration":true,
|
||||
"support_lidar_calibration":false,
|
||||
"support_ai_monitoring":false,
|
||||
"support_first_layer_inspect":false,
|
||||
"support_chamber_temp_edit":false,
|
||||
"support_extrusion_cali":true,
|
||||
"support_user_preset":false,
|
||||
"bed_temperature_limit": 100
|
||||
},
|
||||
"model_id": "N1",
|
||||
"compatible_machine":[],
|
||||
"printer_type": "N1",
|
||||
"ftp_folder" : "sdcard/",
|
||||
"printer_thumbnail_image": "printer_thumbnail_n1",
|
||||
"printer_connect_help_image": "input_access_code_n1",
|
||||
"printer_use_ams_image":"extra_icon",
|
||||
"use_ams_type":"f1",
|
||||
"printer_arch" : "i3",
|
||||
"printer_series":"series_p1p",
|
||||
"has_cali_line":false,
|
||||
"printer_is_enclosed":false
|
||||
},
|
||||
"01.01.50.01": {
|
||||
"print": {
|
||||
"ipcam": {
|
||||
"file": {
|
||||
"remote": "tutk"
|
||||
}
|
||||
},
|
||||
"support_user_preset":true
|
||||
}
|
||||
}
|
||||
}
|
||||
61
backend/profiles/printers/N2S.json
Normal file
61
backend/profiles/printers/N2S.json
Normal file
@@ -0,0 +1,61 @@
|
||||
{
|
||||
"00.00.00.00": {
|
||||
"display_name": "Bambu Lab A1",
|
||||
"print": {
|
||||
"ipcam": {
|
||||
"resolution_supported": [ "720p" ],
|
||||
"liveview": {
|
||||
"local": "local",
|
||||
"remote": "tutk"
|
||||
}
|
||||
},
|
||||
"support_motor_noise_cali":true,
|
||||
"support_tunnel_mqtt":true,
|
||||
"support_mqtt_alive":true,
|
||||
"support_command_ams_switch":true,
|
||||
"support_cloud_print_only":true,
|
||||
"support_1080dpi":true,
|
||||
"support_prompt_sound":true,
|
||||
"support_ams_humidity":false,
|
||||
"support_auto_recovery_step_loss":true,
|
||||
"support_auto_leveling":true,
|
||||
"support_update_remain":false,
|
||||
"support_timelapse":true,
|
||||
"support_filament_backup":true,
|
||||
"support_chamber_fan":false,
|
||||
"support_aux_fan":false,
|
||||
"support_send_to_sd":true,
|
||||
"support_print_all":false,
|
||||
"support_print_without_sd":false,
|
||||
"support_flow_calibration":true,
|
||||
"support_lidar_calibration":false,
|
||||
"support_ai_monitoring":false,
|
||||
"support_first_layer_inspect":false,
|
||||
"support_chamber_temp_edit":false,
|
||||
"support_extrusion_cali":true,
|
||||
"support_user_preset":true,
|
||||
"bed_temperature_limit": 100
|
||||
},
|
||||
"model_id": "N2S",
|
||||
"compatible_machine":[],
|
||||
"printer_type": "N2S",
|
||||
"ftp_folder" : "sdcard/",
|
||||
"printer_thumbnail_image": "printer_thumbnail_n2s",
|
||||
"printer_connect_help_image": "input_access_code_n1",
|
||||
"printer_use_ams_image":"extra_icon",
|
||||
"use_ams_type":"f1",
|
||||
"printer_arch" : "i3",
|
||||
"printer_series":"series_p1p",
|
||||
"has_cali_line":false,
|
||||
"printer_is_enclosed":false
|
||||
},
|
||||
"01.01.50.01": {
|
||||
"print": {
|
||||
"ipcam": {
|
||||
"file": {
|
||||
"remote": "tutk"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
74
backend/profiles/printers/O1D.json
Normal file
74
backend/profiles/printers/O1D.json
Normal file
@@ -0,0 +1,74 @@
|
||||
{
|
||||
"00.00.00.00": {
|
||||
"display_name": "Bambu Lab H2D",
|
||||
"print": {
|
||||
"2D": {
|
||||
"laser": {
|
||||
"power": [ 10, 40 ]
|
||||
}
|
||||
},
|
||||
"ipcam": {
|
||||
"resolution_supported": [ "1080p" ],
|
||||
"virtual_camera": "enabled",
|
||||
"liveview": {
|
||||
"remote": "tutk"
|
||||
},
|
||||
"file": {
|
||||
"local": "local",
|
||||
"remote": "tutk",
|
||||
"model_download": "enabled"
|
||||
}
|
||||
},
|
||||
"nozzle_temp_range": [ 20, 350 ],
|
||||
"bed_temp_range": [ 20, 120 ],
|
||||
"support_motor_noise_cali": false,
|
||||
"support_tunnel_mqtt": true,
|
||||
"support_mqtt_alive": true,
|
||||
"support_command_ams_switch": true,
|
||||
"support_ssl_for_mqtt": true,
|
||||
"support_cloud_print_only": false,
|
||||
"support_1080dpi": true,
|
||||
"support_prompt_sound": false,
|
||||
"support_ams_humidity": true,
|
||||
"support_auto_recovery_step_loss": true,
|
||||
"support_bed_leveling": 2,
|
||||
"support_update_remain": true,
|
||||
"support_timelapse": true,
|
||||
"support_filament_backup": true,
|
||||
"support_chamber_fan": true,
|
||||
"support_aux_fan": true,
|
||||
"support_send_to_sd": true,
|
||||
"support_print_all": true,
|
||||
"support_print_without_sd": true,
|
||||
"support_flow_calibration": true,
|
||||
"support_auto_flow_calibration": true,
|
||||
"support_build_plate_marker_detect": true,
|
||||
"support_build_plate_marker_detect_type": 2,
|
||||
"support_lidar_calibration": false,
|
||||
"support_nozzle_offset_calibration": true,
|
||||
"support_high_tempbed_calibration": true,
|
||||
"support_ai_monitoring": true,
|
||||
"support_first_layer_inspect": false,
|
||||
"support_save_remote_print_file_to_storage": true,
|
||||
"support_chamber_temp_edit": true,
|
||||
"support_chamber_temp_edit_range": [ 20, 65 ],
|
||||
"support_chamber_temp_switch_heating": 40,
|
||||
"support_extrusion_cali": false,
|
||||
"support_user_preset": false
|
||||
},
|
||||
"model_id": "O1D",
|
||||
"printer_modes": [ "fdm", "laser", "cut" ],
|
||||
"compatible_machine": [],
|
||||
"printer_type": "O1D",
|
||||
"printer_thumbnail_image": "printer_thumbnail_h2d",
|
||||
"printer_connect_help_image": "input_access_code_h2d",
|
||||
"printer_use_ams_image": "ams_icon",
|
||||
"printer_ext_image": ["ext_image_o_right", "ext_image_o_left"],
|
||||
"use_ams_type": "generic",
|
||||
"printer_arch": "core_xy",
|
||||
"printer_series": "series_o",
|
||||
"has_cali_line": true,
|
||||
"printer_is_enclosed": true,
|
||||
"enable_set_nozzle_info": false
|
||||
}
|
||||
}
|
||||
51
backend/profiles/printers/ams_load.gcode
Normal file
51
backend/profiles/printers/ams_load.gcode
Normal file
@@ -0,0 +1,51 @@
|
||||
M620 S[next_extruder]
|
||||
M106 S255
|
||||
M104 S250
|
||||
M17 S
|
||||
M17 X0.5 Y0.5
|
||||
G91
|
||||
G1 Y-5 F1200
|
||||
G1 Z3
|
||||
G90
|
||||
G28 X
|
||||
M17 R
|
||||
G1 X70 F21000
|
||||
G1 Y245
|
||||
G1 Y265 F3000
|
||||
G4
|
||||
M106 S0
|
||||
M109 S250
|
||||
G1 X90
|
||||
G1 Y255
|
||||
G1 X120
|
||||
G1 X20 Y50 F21000
|
||||
G1 Y-3
|
||||
T[next_extruder]
|
||||
G1 X54
|
||||
G1 Y265
|
||||
G92 E0
|
||||
G1 E40 F180
|
||||
G4
|
||||
M104 S[new_filament_temp]
|
||||
G1 X70 F15000
|
||||
G1 X76
|
||||
G1 X65
|
||||
G1 X76
|
||||
G1 X65
|
||||
G1 X90 F3000
|
||||
G1 Y255
|
||||
G1 X100
|
||||
G1 Y265
|
||||
G1 X70 F10000
|
||||
G1 X100 F5000
|
||||
G1 X70 F10000
|
||||
G1 X100 F5000
|
||||
G1 X165 F12000
|
||||
G1 Y245
|
||||
G1 X70
|
||||
G1 Y265 F3000
|
||||
G91
|
||||
G1 Z-3 F1200
|
||||
G90
|
||||
M621 S[next_extruder]
|
||||
|
||||
33
backend/profiles/printers/ams_unload.gcode
Normal file
33
backend/profiles/printers/ams_unload.gcode
Normal file
@@ -0,0 +1,33 @@
|
||||
M620 S255
|
||||
M106 P1 S255
|
||||
M104 S250
|
||||
M17 S
|
||||
M17 X0.5 Y0.5
|
||||
G91
|
||||
G1 Y-5 F3000
|
||||
G1 Z3 F1200
|
||||
G90
|
||||
G28 X
|
||||
M17 R
|
||||
G1 X70 F21000
|
||||
G1 Y245
|
||||
G1 Y265 F3000
|
||||
G4
|
||||
M106 P1 S0
|
||||
M109 S250
|
||||
G1 X90 F3000
|
||||
G1 Y255 F4000
|
||||
G1 X100 F5000
|
||||
G1 X120 F21000
|
||||
G1 X20 Y50
|
||||
G1 Y-3
|
||||
T255
|
||||
G4
|
||||
M104 S0
|
||||
G1 X70 F3000
|
||||
|
||||
G91
|
||||
G1 Z-3 F1200
|
||||
G90
|
||||
M621 S255
|
||||
|
||||
60
backend/profiles/printers/filaments_blacklist.json
Normal file
60
backend/profiles/printers/filaments_blacklist.json
Normal file
@@ -0,0 +1,60 @@
|
||||
{
|
||||
"whitelist": [
|
||||
],
|
||||
"blacklist": [
|
||||
{
|
||||
"vendor": "Third Party",
|
||||
"type": "TPU",
|
||||
"action": "prohibition",
|
||||
"description": "TPU: not supported"
|
||||
},
|
||||
{
|
||||
"vendor": "Bambulab",
|
||||
"type": "TPU",
|
||||
"action": "prohibition",
|
||||
"description": "TPU: not supported"
|
||||
},
|
||||
{
|
||||
"vendor": "Third Party",
|
||||
"type": "PVA",
|
||||
"action": "warning",
|
||||
"description": "PVA: flexible"
|
||||
},
|
||||
{
|
||||
"vendor": "Third Party",
|
||||
"type": "PLA-CF",
|
||||
"action": "warning",
|
||||
"description": "CF/GF: hard and brittle"
|
||||
},
|
||||
{
|
||||
"vendor": "Third Party",
|
||||
"type": "PETG-CF",
|
||||
"action": "warning",
|
||||
"description": "CF/GF: hard and brittle"
|
||||
},
|
||||
{
|
||||
"vendor": "Third Party",
|
||||
"type": "PA-CF",
|
||||
"action": "warning",
|
||||
"description": "CF/GF: hard and brittle"
|
||||
},
|
||||
{
|
||||
"vendor": "Third Party",
|
||||
"type": "PAHT-CF",
|
||||
"action": "warning",
|
||||
"description": "CF/GF: hard and brittle"
|
||||
},
|
||||
{
|
||||
"vendor": "Bambulab",
|
||||
"type": "PET-CF",
|
||||
"action": "prohibition",
|
||||
"description": "Bambu PET-CF/PA6-CF: not supported"
|
||||
},
|
||||
{
|
||||
"vendor": "Bambulab",
|
||||
"type": "PA6-CF",
|
||||
"action": "prohibition",
|
||||
"description": "Bambu PET-CF/PA6-CF: not supported"
|
||||
}
|
||||
]
|
||||
}
|
||||
1
backend/profiles/printers/version.txt
Normal file
1
backend/profiles/printers/version.txt
Normal file
@@ -0,0 +1 @@
|
||||
01.10.00.01
|
||||
194
backend/profiles/profiles/Afinia.json
Normal file
194
backend/profiles/profiles/Afinia.json
Normal file
@@ -0,0 +1,194 @@
|
||||
{
|
||||
"name": "Afinia",
|
||||
"version": "02.03.01.10",
|
||||
"force_update": "0",
|
||||
"description": "Afinia configurations",
|
||||
"machine_model_list": [
|
||||
{
|
||||
"name": "Afinia H+1(HS)",
|
||||
"sub_path": "machine/Afinia H+1(HS).json"
|
||||
}
|
||||
],
|
||||
"process_list": [
|
||||
{
|
||||
"name": "fdm_process_common",
|
||||
"sub_path": "process/fdm_process_common.json"
|
||||
},
|
||||
{
|
||||
"name": "fdm_process_afinia_common",
|
||||
"sub_path": "process/fdm_process_afinia_common.json"
|
||||
},
|
||||
{
|
||||
"name": "fdm_process_afinia_HS_common",
|
||||
"sub_path": "process/fdm_process_afinia_HS_common.json"
|
||||
},
|
||||
{
|
||||
"name": "0.12mm Fine @Afinia H+1(HS)",
|
||||
"sub_path": "process/0.12mm Fine @Afinia H+1(HS).json"
|
||||
},
|
||||
{
|
||||
"name": "0.16mm Optimal @Afinia H+1(HS)",
|
||||
"sub_path": "process/0.16mm Optimal @Afinia H+1(HS).json"
|
||||
},
|
||||
{
|
||||
"name": "0.20mm Standard @Afinia H+1(HS)",
|
||||
"sub_path": "process/0.20mm Standard @Afinia H+1(HS).json"
|
||||
},
|
||||
{
|
||||
"name": "0.24mm Draft @Afinia H+1(HS)",
|
||||
"sub_path": "process/0.24mm Draft @Afinia H+1(HS).json"
|
||||
},
|
||||
{
|
||||
"name": "0.28mm Extra Draft @Afinia H+1(HS)",
|
||||
"sub_path": "process/0.28mm Extra Draft @Afinia H+1(HS).json"
|
||||
},
|
||||
{
|
||||
"name": "fdm_process_afinia_0.18_nozzle_0.6",
|
||||
"sub_path": "process/fdm_process_afinia_0.18_nozzle_0.6.json"
|
||||
},
|
||||
{
|
||||
"name": "fdm_process_afinia_0.24_nozzle_0.6",
|
||||
"sub_path": "process/fdm_process_afinia_0.24_nozzle_0.6.json"
|
||||
},
|
||||
{
|
||||
"name": "fdm_process_afinia_0.30_nozzle_0.6",
|
||||
"sub_path": "process/fdm_process_afinia_0.30_nozzle_0.6.json"
|
||||
},
|
||||
{
|
||||
"name": "fdm_process_afinia_0.36_nozzle_0.6",
|
||||
"sub_path": "process/fdm_process_afinia_0.36_nozzle_0.6.json"
|
||||
},
|
||||
{
|
||||
"name": "fdm_process_afinia_0.42_nozzle_0.6",
|
||||
"sub_path": "process/fdm_process_afinia_0.42_nozzle_0.6.json"
|
||||
},
|
||||
{
|
||||
"name": "fdm_process_afinia_0.18_nozzle_0.6_HS",
|
||||
"sub_path": "process/fdm_process_afinia_0.18_nozzle_0.6_HS.json"
|
||||
},
|
||||
{
|
||||
"name": "fdm_process_afinia_0.24_nozzle_0.6_HS",
|
||||
"sub_path": "process/fdm_process_afinia_0.24_nozzle_0.6_HS.json"
|
||||
},
|
||||
{
|
||||
"name": "fdm_process_afinia_0.30_nozzle_0.6_HS",
|
||||
"sub_path": "process/fdm_process_afinia_0.30_nozzle_0.6_HS.json"
|
||||
},
|
||||
{
|
||||
"name": "fdm_process_afinia_0.36_nozzle_0.6_HS",
|
||||
"sub_path": "process/fdm_process_afinia_0.36_nozzle_0.6_HS.json"
|
||||
},
|
||||
{
|
||||
"name": "fdm_process_afinia_0.42_nozzle_0.6_HS",
|
||||
"sub_path": "process/fdm_process_afinia_0.42_nozzle_0.6_HS.json"
|
||||
},
|
||||
{
|
||||
"name": "0.18mm Fine @Afinia H+1(HS) 0.6 nozzle",
|
||||
"sub_path": "process/0.18mm Fine @Afinia H+1(HS) 0.6 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "0.24mm Standard @Afinia H+1(HS) 0.6 nozzle",
|
||||
"sub_path": "process/0.24mm Standard @Afinia H+1(HS) 0.6 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "0.30mm Standard @Afinia H+1(HS) 0.6 nozzle",
|
||||
"sub_path": "process/0.30mm Standard @Afinia H+1(HS) 0.6 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "0.30mm Strength @Afinia H+1(HS) 0.6 nozzle",
|
||||
"sub_path": "process/0.30mm Strength @Afinia H+1(HS) 0.6 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "0.36mm Draft @Afinia H+1(HS) 0.6 nozzle",
|
||||
"sub_path": "process/0.36mm Draft @Afinia H+1(HS) 0.6 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "0.42mm Extra Draft @Afinia H+1(HS) 0.6 nozzle",
|
||||
"sub_path": "process/0.42mm Extra Draft @Afinia H+1(HS) 0.6 nozzle.json"
|
||||
}
|
||||
],
|
||||
"filament_list": [
|
||||
{
|
||||
"name": "fdm_filament_common",
|
||||
"sub_path": "filament/fdm_filament_common.json"
|
||||
},
|
||||
{
|
||||
"name": "fdm_filament_pla",
|
||||
"sub_path": "filament/fdm_filament_pla.json"
|
||||
},
|
||||
{
|
||||
"name": "fdm_filament_abs",
|
||||
"sub_path": "filament/fdm_filament_abs.json"
|
||||
},
|
||||
{
|
||||
"name": "fdm_filament_tpu",
|
||||
"sub_path": "filament/fdm_filament_tpu.json"
|
||||
},
|
||||
{
|
||||
"name": "Afinia PLA",
|
||||
"sub_path": "filament/Afinia PLA.json"
|
||||
},
|
||||
{
|
||||
"name": "Afinia Value PLA",
|
||||
"sub_path": "filament/Afinia Value PLA.json"
|
||||
},
|
||||
{
|
||||
"name": "Afinia ABS",
|
||||
"sub_path": "filament/Afinia ABS.json"
|
||||
},
|
||||
{
|
||||
"name": "Afinia ABS+",
|
||||
"sub_path": "filament/Afinia ABS+.json"
|
||||
},
|
||||
{
|
||||
"name": "Afinia Value ABS",
|
||||
"sub_path": "filament/Afinia Value ABS.json"
|
||||
},
|
||||
{
|
||||
"name": "Afinia TPU",
|
||||
"sub_path": "filament/Afinia TPU.json"
|
||||
},
|
||||
{
|
||||
"name": "Afinia PLA@HS",
|
||||
"sub_path": "filament/Afinia PLA@HS.json"
|
||||
},
|
||||
{
|
||||
"name": "Afinia Value PLA@HS",
|
||||
"sub_path": "filament/Afinia Value PLA@HS.json"
|
||||
},
|
||||
{
|
||||
"name": "Afinia ABS@HS",
|
||||
"sub_path": "filament/Afinia ABS@HS.json"
|
||||
},
|
||||
{
|
||||
"name": "Afinia Value ABS@HS",
|
||||
"sub_path": "filament/Afinia Value ABS@HS.json"
|
||||
},
|
||||
{
|
||||
"name": "Afinia ABS+@HS",
|
||||
"sub_path": "filament/Afinia ABS+@HS.json"
|
||||
},
|
||||
{
|
||||
"name": "Afinia TPU@HS",
|
||||
"sub_path": "filament/Afinia TPU@HS.json"
|
||||
}
|
||||
],
|
||||
"machine_list": [
|
||||
{
|
||||
"name": "fdm_machine_common",
|
||||
"sub_path": "machine/fdm_machine_common.json"
|
||||
},
|
||||
{
|
||||
"name": "fdm_afinia_common",
|
||||
"sub_path": "machine/fdm_afinia_common.json"
|
||||
},
|
||||
{
|
||||
"name": "Afinia H+1(HS) 0.4 nozzle",
|
||||
"sub_path": "machine/Afinia H+1(HS) 0.4 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "Afinia H+1(HS) 0.6 nozzle",
|
||||
"sub_path": "machine/Afinia H+1(HS) 0.6 nozzle.json"
|
||||
}
|
||||
]
|
||||
}
|
||||
BIN
backend/profiles/profiles/Afinia/Afinia H+1(HS)_cover.png
Normal file
BIN
backend/profiles/profiles/Afinia/Afinia H+1(HS)_cover.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 32 KiB |
37
backend/profiles/profiles/Afinia/filament/Afinia ABS+.json
Normal file
37
backend/profiles/profiles/Afinia/filament/Afinia ABS+.json
Normal file
@@ -0,0 +1,37 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"filament_id": "GFB00",
|
||||
"setting_id": "GFSB00",
|
||||
"name": "Afinia ABS+",
|
||||
"from": "system",
|
||||
"instantiation": "true",
|
||||
"inherits": "fdm_filament_abs",
|
||||
"filament_flow_ratio": [
|
||||
"0.95"
|
||||
],
|
||||
"filament_cost": [
|
||||
"24.99"
|
||||
],
|
||||
"filament_vendor": [
|
||||
"Afinia"
|
||||
],
|
||||
"fan_max_speed": [
|
||||
"60"
|
||||
],
|
||||
"filament_max_volumetric_speed": [
|
||||
"16"
|
||||
],
|
||||
"nozzle_temperature": [
|
||||
"275"
|
||||
],
|
||||
"nozzle_temperature_initial_layer": [
|
||||
"275"
|
||||
],
|
||||
"slow_down_layer_time": [
|
||||
"12"
|
||||
],
|
||||
"compatible_printers": [
|
||||
"Afinia H400 Pro 0.4 nozzle",
|
||||
"Afinia H400 Pro 0.6 nozzle"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"filament_id": "GFB00_01",
|
||||
"setting_id": "GFSB00",
|
||||
"name": "Afinia ABS+@HS",
|
||||
"from": "system",
|
||||
"instantiation": "true",
|
||||
"inherits": "fdm_filament_abs",
|
||||
"filament_flow_ratio": [
|
||||
"0.95"
|
||||
],
|
||||
"filament_cost": [
|
||||
"24.99"
|
||||
],
|
||||
"filament_vendor": [
|
||||
"Afinia"
|
||||
],
|
||||
"fan_max_speed": [
|
||||
"60"
|
||||
],
|
||||
"filament_max_volumetric_speed": [
|
||||
"16"
|
||||
],
|
||||
"nozzle_temperature": [
|
||||
"275"
|
||||
],
|
||||
"nozzle_temperature_initial_layer": [
|
||||
"275"
|
||||
],
|
||||
"slow_down_layer_time": [
|
||||
"12"
|
||||
],
|
||||
"compatible_printers": [
|
||||
"Afinia H+1(HS) 0.4 nozzle",
|
||||
"Afinia H+1(HS) 0.6 nozzle"
|
||||
]
|
||||
}
|
||||
31
backend/profiles/profiles/Afinia/filament/Afinia ABS.json
Normal file
31
backend/profiles/profiles/Afinia/filament/Afinia ABS.json
Normal file
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"filament_id": "GFB00",
|
||||
"setting_id": "GFSB00",
|
||||
"name": "Afinia ABS",
|
||||
"from": "system",
|
||||
"instantiation": "true",
|
||||
"inherits": "fdm_filament_abs",
|
||||
"filament_flow_ratio": [
|
||||
"0.95"
|
||||
],
|
||||
"filament_cost": [
|
||||
"24.99"
|
||||
],
|
||||
"filament_vendor": [
|
||||
"Afinia"
|
||||
],
|
||||
"fan_max_speed": [
|
||||
"60"
|
||||
],
|
||||
"filament_max_volumetric_speed": [
|
||||
"16"
|
||||
],
|
||||
"slow_down_layer_time": [
|
||||
"12"
|
||||
],
|
||||
"compatible_printers": [
|
||||
"Afinia H400 Pro 0.4 nozzle",
|
||||
"Afinia H400 Pro 0.6 nozzle"
|
||||
]
|
||||
}
|
||||
31
backend/profiles/profiles/Afinia/filament/Afinia ABS@HS.json
Normal file
31
backend/profiles/profiles/Afinia/filament/Afinia ABS@HS.json
Normal file
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"filament_id": "GFB00_01",
|
||||
"setting_id": "GFSB00",
|
||||
"name": "Afinia ABS@HS",
|
||||
"from": "system",
|
||||
"instantiation": "true",
|
||||
"inherits": "fdm_filament_abs",
|
||||
"filament_flow_ratio": [
|
||||
"0.95"
|
||||
],
|
||||
"filament_cost": [
|
||||
"24.99"
|
||||
],
|
||||
"filament_vendor": [
|
||||
"Afinia"
|
||||
],
|
||||
"fan_max_speed": [
|
||||
"60"
|
||||
],
|
||||
"filament_max_volumetric_speed": [
|
||||
"16"
|
||||
],
|
||||
"slow_down_layer_time": [
|
||||
"12"
|
||||
],
|
||||
"compatible_printers": [
|
||||
"Afinia H+1(HS) 0.4 nozzle",
|
||||
"Afinia H+1(HS) 0.6 nozzle"
|
||||
]
|
||||
}
|
||||
34
backend/profiles/profiles/Afinia/filament/Afinia PLA.json
Normal file
34
backend/profiles/profiles/Afinia/filament/Afinia PLA.json
Normal file
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"filament_id": "GFA00",
|
||||
"setting_id": "GFSA00",
|
||||
"name": "Afinia PLA",
|
||||
"from": "system",
|
||||
"instantiation": "true",
|
||||
"inherits": "fdm_filament_pla",
|
||||
"filament_cost": [
|
||||
"24.99"
|
||||
],
|
||||
"filament_density": [
|
||||
"1.26"
|
||||
],
|
||||
"filament_flow_ratio": [
|
||||
"0.98"
|
||||
],
|
||||
"filament_max_volumetric_speed": [
|
||||
"21"
|
||||
],
|
||||
"filament_vendor": [
|
||||
"Afinia"
|
||||
],
|
||||
"filament_long_retractions_when_cut": [
|
||||
"1"
|
||||
],
|
||||
"filament_retraction_distances_when_cut": [
|
||||
"18"
|
||||
],
|
||||
"compatible_printers": [
|
||||
"Afinia H400 Pro 0.4 nozzle",
|
||||
"Afinia H400 Pro 0.6 nozzle"
|
||||
]
|
||||
}
|
||||
34
backend/profiles/profiles/Afinia/filament/Afinia PLA@HS.json
Normal file
34
backend/profiles/profiles/Afinia/filament/Afinia PLA@HS.json
Normal file
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"filament_id": "GFA00_01",
|
||||
"setting_id": "GFSA00",
|
||||
"name": "Afinia PLA@HS",
|
||||
"from": "system",
|
||||
"instantiation": "true",
|
||||
"inherits": "fdm_filament_pla",
|
||||
"filament_cost": [
|
||||
"24.99"
|
||||
],
|
||||
"filament_density": [
|
||||
"1.26"
|
||||
],
|
||||
"filament_flow_ratio": [
|
||||
"0.98"
|
||||
],
|
||||
"filament_max_volumetric_speed": [
|
||||
"21"
|
||||
],
|
||||
"filament_vendor": [
|
||||
"Afinia"
|
||||
],
|
||||
"filament_long_retractions_when_cut": [
|
||||
"1"
|
||||
],
|
||||
"filament_retraction_distances_when_cut": [
|
||||
"18"
|
||||
],
|
||||
"compatible_printers": [
|
||||
"Afinia H+1(HS) 0.4 nozzle",
|
||||
"Afinia H+1(HS) 0.6 nozzle"
|
||||
]
|
||||
}
|
||||
27
backend/profiles/profiles/Afinia/filament/Afinia TPU.json
Normal file
27
backend/profiles/profiles/Afinia/filament/Afinia TPU.json
Normal file
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Afinia TPU",
|
||||
"inherits": "fdm_filament_tpu",
|
||||
"from": "system",
|
||||
"filament_id": "GFU01",
|
||||
"instantiation": "true",
|
||||
"filament_vendor": [
|
||||
"Afinia"
|
||||
],
|
||||
"filament_density": [
|
||||
"1.22"
|
||||
],
|
||||
"nozzle_temperature_initial_layer": [
|
||||
"230"
|
||||
],
|
||||
"filament_cost": [
|
||||
"41.99"
|
||||
],
|
||||
"nozzle_temperature": [
|
||||
"230"
|
||||
],
|
||||
"compatible_printers": [
|
||||
"Afinia H400 Pro 0.4 nozzle",
|
||||
"Afinia H400 Pro 0.6 nozzle"
|
||||
]
|
||||
}
|
||||
27
backend/profiles/profiles/Afinia/filament/Afinia TPU@HS.json
Normal file
27
backend/profiles/profiles/Afinia/filament/Afinia TPU@HS.json
Normal file
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Afinia TPU@HS",
|
||||
"inherits": "fdm_filament_tpu",
|
||||
"from": "system",
|
||||
"filament_id": "GFU01_01",
|
||||
"instantiation": "true",
|
||||
"filament_vendor": [
|
||||
"Afinia"
|
||||
],
|
||||
"filament_density": [
|
||||
"1.22"
|
||||
],
|
||||
"nozzle_temperature_initial_layer": [
|
||||
"230"
|
||||
],
|
||||
"filament_cost": [
|
||||
"41.99"
|
||||
],
|
||||
"nozzle_temperature": [
|
||||
"230"
|
||||
],
|
||||
"compatible_printers": [
|
||||
"Afinia H+1(HS) 0.4 nozzle",
|
||||
"Afinia H+1(HS) 0.6 nozzle"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"filament_id": "GFB00",
|
||||
"setting_id": "GFSB00",
|
||||
"name": "Afinia Value ABS",
|
||||
"from": "system",
|
||||
"instantiation": "true",
|
||||
"inherits": "fdm_filament_abs",
|
||||
"filament_flow_ratio": [
|
||||
"0.95"
|
||||
],
|
||||
"filament_cost": [
|
||||
"24.99"
|
||||
],
|
||||
"filament_vendor": [
|
||||
"Afinia"
|
||||
],
|
||||
"fan_max_speed": [
|
||||
"60"
|
||||
],
|
||||
"filament_max_volumetric_speed": [
|
||||
"16"
|
||||
],
|
||||
"nozzle_temperature": [
|
||||
"245"
|
||||
],
|
||||
"nozzle_temperature_initial_layer": [
|
||||
"245"
|
||||
],
|
||||
"slow_down_layer_time": [
|
||||
"12"
|
||||
],
|
||||
"compatible_printers": [
|
||||
"Afinia H400 Pro 0.4 nozzle",
|
||||
"Afinia H400 Pro 0.6 nozzle"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"filament_id": "GFB00_01",
|
||||
"setting_id": "GFSB00",
|
||||
"name": "Afinia Value ABS@HS",
|
||||
"from": "system",
|
||||
"instantiation": "true",
|
||||
"inherits": "fdm_filament_abs",
|
||||
"filament_flow_ratio": [
|
||||
"0.95"
|
||||
],
|
||||
"filament_cost": [
|
||||
"24.99"
|
||||
],
|
||||
"filament_vendor": [
|
||||
"Afinia"
|
||||
],
|
||||
"fan_max_speed": [
|
||||
"60"
|
||||
],
|
||||
"filament_max_volumetric_speed": [
|
||||
"16"
|
||||
],
|
||||
"nozzle_temperature": [
|
||||
"245"
|
||||
],
|
||||
"nozzle_temperature_initial_layer": [
|
||||
"245"
|
||||
],
|
||||
"slow_down_layer_time": [
|
||||
"12"
|
||||
],
|
||||
"compatible_printers": [
|
||||
"Afinia H+1(HS) 0.4 nozzle",
|
||||
"Afinia H+1(HS) 0.6 nozzle"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"filament_id": "GFA00",
|
||||
"setting_id": "GFSA00",
|
||||
"name": "Afinia Value PLA",
|
||||
"from": "system",
|
||||
"instantiation": "true",
|
||||
"inherits": "fdm_filament_pla",
|
||||
"filament_cost": [
|
||||
"24.99"
|
||||
],
|
||||
"filament_density": [
|
||||
"1.26"
|
||||
],
|
||||
"filament_flow_ratio": [
|
||||
"0.98"
|
||||
],
|
||||
"filament_max_volumetric_speed": [
|
||||
"21"
|
||||
],
|
||||
"filament_vendor": [
|
||||
"Afinia"
|
||||
],
|
||||
"filament_long_retractions_when_cut": [
|
||||
"1"
|
||||
],
|
||||
"filament_retraction_distances_when_cut": [
|
||||
"18"
|
||||
],
|
||||
"nozzle_temperature": [
|
||||
"190"
|
||||
],
|
||||
"nozzle_temperature_initial_layer": [
|
||||
"190"
|
||||
],
|
||||
"compatible_printers": [
|
||||
"Afinia H400 Pro 0.4 nozzle",
|
||||
"Afinia H400 Pro 0.6 nozzle"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"filament_id": "GFA00_01",
|
||||
"setting_id": "GFSA00",
|
||||
"name": "Afinia Value PLA@HS",
|
||||
"from": "system",
|
||||
"instantiation": "true",
|
||||
"inherits": "fdm_filament_pla",
|
||||
"filament_cost": [
|
||||
"24.99"
|
||||
],
|
||||
"filament_density": [
|
||||
"1.26"
|
||||
],
|
||||
"filament_flow_ratio": [
|
||||
"0.98"
|
||||
],
|
||||
"filament_max_volumetric_speed": [
|
||||
"21"
|
||||
],
|
||||
"filament_vendor": [
|
||||
"Afinia"
|
||||
],
|
||||
"filament_long_retractions_when_cut": [
|
||||
"1"
|
||||
],
|
||||
"filament_retraction_distances_when_cut": [
|
||||
"18"
|
||||
],
|
||||
"nozzle_temperature": [
|
||||
"190"
|
||||
],
|
||||
"nozzle_temperature_initial_layer": [
|
||||
"190"
|
||||
],
|
||||
"compatible_printers": [
|
||||
"Afinia H+1(HS) 0.4 nozzle",
|
||||
"Afinia H+1(HS) 0.6 nozzle"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,82 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "fdm_filament_abs",
|
||||
"inherits": "fdm_filament_common",
|
||||
"from": "system",
|
||||
"instantiation": "false",
|
||||
"activate_air_filtration": [
|
||||
"0"
|
||||
],
|
||||
"cool_plate_temp": [
|
||||
"0"
|
||||
],
|
||||
"cool_plate_temp_initial_layer": [
|
||||
"0"
|
||||
],
|
||||
"eng_plate_temp": [
|
||||
"90"
|
||||
],
|
||||
"eng_plate_temp_initial_layer": [
|
||||
"90"
|
||||
],
|
||||
"fan_cooling_layer_time": [
|
||||
"30"
|
||||
],
|
||||
"fan_max_speed": [
|
||||
"80"
|
||||
],
|
||||
"fan_min_speed": [
|
||||
"10"
|
||||
],
|
||||
"filament_cost": [
|
||||
"20"
|
||||
],
|
||||
"filament_density": [
|
||||
"1.04"
|
||||
],
|
||||
"filament_max_volumetric_speed": [
|
||||
"28.6"
|
||||
],
|
||||
"filament_type": [
|
||||
"ABS"
|
||||
],
|
||||
"hot_plate_temp": [
|
||||
"90"
|
||||
],
|
||||
"hot_plate_temp_initial_layer": [
|
||||
"90"
|
||||
],
|
||||
"nozzle_temperature": [
|
||||
"270"
|
||||
],
|
||||
"nozzle_temperature_initial_layer": [
|
||||
"270"
|
||||
],
|
||||
"nozzle_temperature_range_high": [
|
||||
"280"
|
||||
],
|
||||
"nozzle_temperature_range_low": [
|
||||
"240"
|
||||
],
|
||||
"overhang_fan_speed": [
|
||||
"80"
|
||||
],
|
||||
"overhang_fan_threshold": [
|
||||
"25%"
|
||||
],
|
||||
"reduce_fan_stop_start_freq": [
|
||||
"1"
|
||||
],
|
||||
"slow_down_layer_time": [
|
||||
"3"
|
||||
],
|
||||
"slow_down_min_speed": [
|
||||
"20"
|
||||
],
|
||||
"textured_plate_temp": [
|
||||
"90"
|
||||
],
|
||||
"textured_plate_temp_initial_layer": [
|
||||
"90"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,166 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "fdm_filament_common",
|
||||
"from": "system",
|
||||
"instantiation": "false",
|
||||
"activate_air_filtration": [
|
||||
"0"
|
||||
],
|
||||
"chamber_temperatures": [
|
||||
"0"
|
||||
],
|
||||
"close_fan_the_first_x_layers": [
|
||||
"3"
|
||||
],
|
||||
"complete_print_exhaust_fan_speed": [
|
||||
"70"
|
||||
],
|
||||
"cool_plate_temp": [
|
||||
"60"
|
||||
],
|
||||
"cool_plate_temp_initial_layer": [
|
||||
"60"
|
||||
],
|
||||
"during_print_exhaust_fan_speed": [
|
||||
"70"
|
||||
],
|
||||
"eng_plate_temp": [
|
||||
"60"
|
||||
],
|
||||
"eng_plate_temp_initial_layer": [
|
||||
"60"
|
||||
],
|
||||
"fan_cooling_layer_time": [
|
||||
"60"
|
||||
],
|
||||
"fan_max_speed": [
|
||||
"100"
|
||||
],
|
||||
"fan_min_speed": [
|
||||
"35"
|
||||
],
|
||||
"filament_cost": [
|
||||
"0"
|
||||
],
|
||||
"filament_density": [
|
||||
"0"
|
||||
],
|
||||
"filament_deretraction_speed": [
|
||||
"nil"
|
||||
],
|
||||
"filament_diameter": [
|
||||
"1.75"
|
||||
],
|
||||
"filament_flow_ratio": [
|
||||
"1"
|
||||
],
|
||||
"filament_is_support": [
|
||||
"0"
|
||||
],
|
||||
"filament_long_retractions_when_cut": [
|
||||
"nil"
|
||||
],
|
||||
"filament_max_volumetric_speed": [
|
||||
"0"
|
||||
],
|
||||
"filament_minimal_purge_on_wipe_tower": [
|
||||
"15"
|
||||
],
|
||||
"filament_retract_before_wipe": [
|
||||
"nil"
|
||||
],
|
||||
"filament_retract_restart_extra": [
|
||||
"nil"
|
||||
],
|
||||
"filament_retract_when_changing_layer": [
|
||||
"nil"
|
||||
],
|
||||
"filament_retraction_distances_when_cut": [
|
||||
"nil"
|
||||
],
|
||||
"filament_retraction_length": [
|
||||
"nil"
|
||||
],
|
||||
"filament_retraction_minimum_travel": [
|
||||
"nil"
|
||||
],
|
||||
"filament_retraction_speed": [
|
||||
"nil"
|
||||
],
|
||||
"filament_settings_id": [
|
||||
""
|
||||
],
|
||||
"filament_soluble": [
|
||||
"0"
|
||||
],
|
||||
"filament_type": [
|
||||
"PLA"
|
||||
],
|
||||
"filament_vendor": [
|
||||
"Generic"
|
||||
],
|
||||
"filament_wipe": [
|
||||
"nil"
|
||||
],
|
||||
"filament_wipe_distance": [
|
||||
"nil"
|
||||
],
|
||||
"filament_z_hop": [
|
||||
"nil"
|
||||
],
|
||||
"filament_z_hop_types": [
|
||||
"nil"
|
||||
],
|
||||
"full_fan_speed_layer": [
|
||||
"0"
|
||||
],
|
||||
"hot_plate_temp": [
|
||||
"60"
|
||||
],
|
||||
"hot_plate_temp_initial_layer": [
|
||||
"60"
|
||||
],
|
||||
"nozzle_temperature": [
|
||||
"200"
|
||||
],
|
||||
"nozzle_temperature_initial_layer": [
|
||||
"200"
|
||||
],
|
||||
"overhang_fan_speed": [
|
||||
"100"
|
||||
],
|
||||
"overhang_fan_threshold": [
|
||||
"95%"
|
||||
],
|
||||
"reduce_fan_stop_start_freq": [
|
||||
"0"
|
||||
],
|
||||
"required_nozzle_HRC": [
|
||||
"3"
|
||||
],
|
||||
"slow_down_for_layer_cooling": [
|
||||
"1"
|
||||
],
|
||||
"slow_down_layer_time": [
|
||||
"8"
|
||||
],
|
||||
"slow_down_min_speed": [
|
||||
"10"
|
||||
],
|
||||
"temperature_vitrification": [
|
||||
"100"
|
||||
],
|
||||
"textured_plate_temp": [
|
||||
"60"
|
||||
],
|
||||
"textured_plate_temp_initial_layer": [
|
||||
"60"
|
||||
],
|
||||
"compatible_printers": [],
|
||||
"filament_start_gcode": [
|
||||
"; Filament gcode\n;{if activate_air_filtration[current_extruder] && support_air_filtration}\n;M106 P3 S{during_print_exhaust_fan_speed_num[current_extruder]} \n;{endif}"
|
||||
],
|
||||
"filament_end_gcode": [
|
||||
"; filament end gcode \n;M106 P3 S0\n"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,82 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "fdm_filament_pla",
|
||||
"inherits": "fdm_filament_common",
|
||||
"from": "system",
|
||||
"instantiation": "false",
|
||||
"fan_cooling_layer_time": [
|
||||
"100"
|
||||
],
|
||||
"filament_max_volumetric_speed": [
|
||||
"12"
|
||||
],
|
||||
"filament_density": [
|
||||
"1.24"
|
||||
],
|
||||
"filament_cost": [
|
||||
"20"
|
||||
],
|
||||
"cool_plate_temp": [
|
||||
"35"
|
||||
],
|
||||
"eng_plate_temp": [
|
||||
"0"
|
||||
],
|
||||
"hot_plate_temp": [
|
||||
"60"
|
||||
],
|
||||
"textured_plate_temp": [
|
||||
"60"
|
||||
],
|
||||
"cool_plate_temp_initial_layer": [
|
||||
"35"
|
||||
],
|
||||
"eng_plate_temp_initial_layer": [
|
||||
"0"
|
||||
],
|
||||
"hot_plate_temp_initial_layer": [
|
||||
"60"
|
||||
],
|
||||
"textured_plate_temp_initial_layer": [
|
||||
"60"
|
||||
],
|
||||
"nozzle_temperature_initial_layer": [
|
||||
"220"
|
||||
],
|
||||
"reduce_fan_stop_start_freq": [
|
||||
"1"
|
||||
],
|
||||
"fan_min_speed": [
|
||||
"100"
|
||||
],
|
||||
"overhang_fan_threshold": [
|
||||
"50%"
|
||||
],
|
||||
"close_fan_the_first_x_layers": [
|
||||
"1"
|
||||
],
|
||||
"nozzle_temperature": [
|
||||
"220"
|
||||
],
|
||||
"temperature_vitrification": [
|
||||
"45"
|
||||
],
|
||||
"nozzle_temperature_range_low": [
|
||||
"190"
|
||||
],
|
||||
"nozzle_temperature_range_high": [
|
||||
"240"
|
||||
],
|
||||
"slow_down_min_speed": [
|
||||
"20"
|
||||
],
|
||||
"slow_down_layer_time": [
|
||||
"4"
|
||||
],
|
||||
"additional_cooling_fan_speed": [
|
||||
"70"
|
||||
],
|
||||
"filament_start_gcode": [
|
||||
"; filament start gcode\n;{if (bed_temperature[current_extruder] >45)||(bed_temperature_initial_layer[current_extruder] >45)}M106 P3 S255\n;{elsif(bed_temperature[current_extruder] >35)||(bed_temperature_initial_layer[current_extruder] >35)}M106 P3 S180\n;{endif}\n\n;{if activate_air_filtration[current_extruder] && support_air_filtration}\n;M106 P3 S{during_print_exhaust_fan_speed_num[current_extruder]} \n;{endif}"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "fdm_filament_tpu",
|
||||
"inherits": "fdm_filament_common",
|
||||
"from": "system",
|
||||
"instantiation": "false",
|
||||
"additional_cooling_fan_speed": [
|
||||
"70"
|
||||
],
|
||||
"close_fan_the_first_x_layers": [
|
||||
"1"
|
||||
],
|
||||
"cool_plate_temp": [
|
||||
"30"
|
||||
],
|
||||
"cool_plate_temp_initial_layer": [
|
||||
"30"
|
||||
],
|
||||
"eng_plate_temp": [
|
||||
"30"
|
||||
],
|
||||
"eng_plate_temp_initial_layer": [
|
||||
"30"
|
||||
],
|
||||
"fan_cooling_layer_time": [
|
||||
"100"
|
||||
],
|
||||
"fan_min_speed": [
|
||||
"100"
|
||||
],
|
||||
"filament_cost": [
|
||||
"20"
|
||||
],
|
||||
"filament_density": [
|
||||
"1.24"
|
||||
],
|
||||
"filament_max_volumetric_speed": [
|
||||
"8"
|
||||
],
|
||||
"filament_retraction_length": [
|
||||
"2.0"
|
||||
],
|
||||
"filament_type": [
|
||||
"TPU"
|
||||
],
|
||||
"hot_plate_temp": [
|
||||
"35"
|
||||
],
|
||||
"hot_plate_temp_initial_layer": [
|
||||
"35"
|
||||
],
|
||||
"nozzle_temperature": [
|
||||
"240"
|
||||
],
|
||||
"nozzle_temperature_initial_layer": [
|
||||
"240"
|
||||
],
|
||||
"nozzle_temperature_range_high": [
|
||||
"250"
|
||||
],
|
||||
"nozzle_temperature_range_low": [
|
||||
"200"
|
||||
],
|
||||
"reduce_fan_stop_start_freq": [
|
||||
"1"
|
||||
],
|
||||
"temperature_vitrification": [
|
||||
"30"
|
||||
],
|
||||
"textured_plate_temp": [
|
||||
"35"
|
||||
],
|
||||
"textured_plate_temp_initial_layer": [
|
||||
"35"
|
||||
],
|
||||
"filament_start_gcode": [
|
||||
"; filament start gcode\n{if (bed_temperature[current_extruder] >35)||(bed_temperature_initial_layer[current_extruder] >35)}M106 P3 S255\n{elsif(bed_temperature[current_extruder] >30)||(bed_temperature_initial_layer[current_extruder] >30)}M106 P3 S180\n{endif}\n\n{if activate_air_filtration[current_extruder] && support_air_filtration}\nM106 P3 S{during_print_exhaust_fan_speed_num[current_extruder]} \n{endif}"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"type": "machine",
|
||||
"setting_id": "GM001",
|
||||
"name": "Afinia H+1(HS) 0.4 nozzle",
|
||||
"from": "system",
|
||||
"instantiation": "true",
|
||||
"inherits": "fdm_afinia_common",
|
||||
"printer_model": "Afinia H+1(HS)",
|
||||
"default_print_profile": "0.20mm Standard @Afinia H+1(HS)",
|
||||
"nozzle_diameter": [
|
||||
"0.4"
|
||||
],
|
||||
"printer_variant": "0.4",
|
||||
"printable_area": [
|
||||
"0x0",
|
||||
"207x0",
|
||||
"207x255",
|
||||
"0x255"
|
||||
],
|
||||
"printable_height": "230"
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"type": "machine",
|
||||
"setting_id": "GM001",
|
||||
"name": "Afinia H+1(HS) 0.6 nozzle",
|
||||
"from": "system",
|
||||
"instantiation": "true",
|
||||
"inherits": "Afinia H+1(HS) 0.4 nozzle",
|
||||
"printer_model": "Afinia H+1(HS)",
|
||||
"default_print_profile": "0.30mm Strength @Afinia H+1(HS) 0.6 nozzle",
|
||||
"nozzle_diameter": [
|
||||
"0.6"
|
||||
],
|
||||
"printer_variant": "0.6",
|
||||
"max_layer_height": [
|
||||
"0.42"
|
||||
],
|
||||
"min_layer_height": [
|
||||
"0.18"
|
||||
],
|
||||
"retraction_length": [
|
||||
"1.4"
|
||||
],
|
||||
"retraction_minimum_travel": [
|
||||
"3"
|
||||
]
|
||||
}
|
||||
12
backend/profiles/profiles/Afinia/machine/Afinia H+1(HS).json
Normal file
12
backend/profiles/profiles/Afinia/machine/Afinia H+1(HS).json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"type": "machine_model",
|
||||
"name": "Afinia H+1(HS)",
|
||||
"model_id": "my_afinia_h_1_hs_01",
|
||||
"nozzle_diameter": "0.4;0.6",
|
||||
"machine_tech": "FFF",
|
||||
"family": "Afinia",
|
||||
"bed_model": "",
|
||||
"bed_texture": "",
|
||||
"hotend_model": "",
|
||||
"default_materials": "Afinia ABS;Afinia PLA"
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
{
|
||||
"type": "machine",
|
||||
"name": "fdm_afinia_common",
|
||||
"from": "system",
|
||||
"instantiation": "false",
|
||||
"inherits": "fdm_machine_common",
|
||||
"gcode_flavor": "klipper",
|
||||
"machine_max_acceleration_e": ["5000", "5000"],
|
||||
"machine_max_acceleration_extruding": ["20000", "20000"],
|
||||
"machine_max_acceleration_retracting": ["5000", "5000"],
|
||||
"machine_max_acceleration_travel": ["20000", "20000"],
|
||||
"machine_max_acceleration_x": ["20000", "20000"],
|
||||
"machine_max_acceleration_y": ["20000", "20000"],
|
||||
"machine_max_acceleration_z": ["500", "200"],
|
||||
"machine_max_speed_e": ["25", "25"],
|
||||
"machine_max_speed_x": ["500", "200"],
|
||||
"machine_max_speed_y": ["500", "200"],
|
||||
"machine_max_speed_z": ["12", "12"],
|
||||
"machine_max_jerk_e": ["2.5", "2.5"],
|
||||
"machine_max_jerk_x": ["9", "9"],
|
||||
"machine_max_jerk_y": ["9", "9"],
|
||||
"machine_max_jerk_z": ["0.2", "0.4"],
|
||||
"machine_min_extruding_rate": ["0", "0"],
|
||||
"machine_min_travel_rate": ["0", "0"],
|
||||
"max_layer_height": ["0.32"],
|
||||
"min_layer_height": ["0.08"],
|
||||
"printable_height": "250",
|
||||
"extruder_clearance_radius": "65",
|
||||
"extruder_clearance_height_to_rod": "36",
|
||||
"extruder_clearance_height_to_lid": "140",
|
||||
"printer_settings_id": "",
|
||||
"printer_technology": "FFF",
|
||||
"printer_variant": "0.4",
|
||||
"retraction_minimum_travel": ["1"],
|
||||
"retract_before_wipe": ["70%"],
|
||||
"retract_when_changing_layer": ["1"],
|
||||
"retraction_length": ["0.8"],
|
||||
"retract_length_toolchange": ["2"],
|
||||
"z_hop": ["0.4"],
|
||||
"retract_restart_extra": ["0"],
|
||||
"retract_restart_extra_toolchange": ["0"],
|
||||
"retraction_speed": ["30"],
|
||||
"deretraction_speed": ["30"],
|
||||
"z_hop_types": "Normal Lift",
|
||||
"silent_mode": "0",
|
||||
"single_extruder_multi_material": "1",
|
||||
"change_filament_gcode": "",
|
||||
"wipe": ["1"],
|
||||
"default_filament_profile": [""],
|
||||
"default_print_profile": "0.20mm Standard @Afinia H+1(HS)",
|
||||
"bed_exclude_area": ["0x0"],
|
||||
"machine_start_gcode": ";M190 S[bed_temperature_initial_layer_single]\n;M109 S[nozzle_temperature_initial_layer]\nPRINT_START EXTRUDER=[nozzle_temperature_initial_layer] BED=[bed_temperature_initial_layer_single]\n",
|
||||
"machine_end_gcode": "PRINT_END",
|
||||
"layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]",
|
||||
"before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\n;[layer_z]\nG92 E0\n",
|
||||
"machine_pause_gcode": "PAUSE",
|
||||
"scan_first_layer": "0",
|
||||
"nozzle_type": "undefine",
|
||||
"auxiliary_fan": "0"
|
||||
}
|
||||
119
backend/profiles/profiles/Afinia/machine/fdm_machine_common.json
Normal file
119
backend/profiles/profiles/Afinia/machine/fdm_machine_common.json
Normal file
@@ -0,0 +1,119 @@
|
||||
{
|
||||
"type": "machine",
|
||||
"name": "fdm_machine_common",
|
||||
"from": "system",
|
||||
"instantiation": "false",
|
||||
"printer_technology": "FFF",
|
||||
"deretraction_speed": [
|
||||
"40"
|
||||
],
|
||||
"extruder_colour": [
|
||||
"#FCE94F"
|
||||
],
|
||||
"extruder_offset": [
|
||||
"0x0"
|
||||
],
|
||||
"gcode_flavor": "marlin",
|
||||
"silent_mode": "0",
|
||||
"machine_max_acceleration_e": [
|
||||
"5000"
|
||||
],
|
||||
"machine_max_acceleration_extruding": [
|
||||
"10000"
|
||||
],
|
||||
"machine_max_acceleration_retracting": [
|
||||
"1000"
|
||||
],
|
||||
"machine_max_acceleration_x": [
|
||||
"10000"
|
||||
],
|
||||
"machine_max_acceleration_y": [
|
||||
"10000"
|
||||
],
|
||||
"machine_max_acceleration_z": [
|
||||
"500"
|
||||
],
|
||||
"machine_max_speed_e": [
|
||||
"60"
|
||||
],
|
||||
"machine_max_speed_x": [
|
||||
"500"
|
||||
],
|
||||
"machine_max_speed_y": [
|
||||
"500"
|
||||
],
|
||||
"machine_max_speed_z": [
|
||||
"10"
|
||||
],
|
||||
"machine_max_jerk_e": [
|
||||
"5"
|
||||
],
|
||||
"machine_max_jerk_x": [
|
||||
"8"
|
||||
],
|
||||
"machine_max_jerk_y": [
|
||||
"8"
|
||||
],
|
||||
"machine_max_jerk_z": [
|
||||
"0.4"
|
||||
],
|
||||
"machine_min_extruding_rate": [
|
||||
"0"
|
||||
],
|
||||
"machine_min_travel_rate": [
|
||||
"0"
|
||||
],
|
||||
"max_layer_height": [
|
||||
"0.32"
|
||||
],
|
||||
"min_layer_height": [
|
||||
"0.08"
|
||||
],
|
||||
"printable_height": "250",
|
||||
"extruder_clearance_radius": "65",
|
||||
"extruder_clearance_height_to_rod": "36",
|
||||
"extruder_clearance_height_to_lid": "140",
|
||||
"nozzle_diameter": [
|
||||
"0.4"
|
||||
],
|
||||
"printer_settings_id": "",
|
||||
"printer_variant": "0.4",
|
||||
"retraction_minimum_travel": [
|
||||
"2"
|
||||
],
|
||||
"retract_before_wipe": [
|
||||
"70%"
|
||||
],
|
||||
"retract_when_changing_layer": [
|
||||
"1"
|
||||
],
|
||||
"retraction_length": [
|
||||
"5"
|
||||
],
|
||||
"retract_length_toolchange": [
|
||||
"1"
|
||||
],
|
||||
"z_hop": [
|
||||
"0"
|
||||
],
|
||||
"retract_restart_extra": [
|
||||
"0"
|
||||
],
|
||||
"retract_restart_extra_toolchange": [
|
||||
"0"
|
||||
],
|
||||
"retraction_speed": [
|
||||
"60"
|
||||
],
|
||||
"single_extruder_multi_material": "1",
|
||||
"change_filament_gcode": "",
|
||||
"wipe": [
|
||||
"1"
|
||||
],
|
||||
"default_print_profile": "",
|
||||
"machine_start_gcode": "G0 Z20 F9000\nG92 E0; G1 E-10 F1200\nG28\nM970 Q1 A10 B10 C130 K0\nM970 Q1 A10 B131 C250 K1\nM974 Q1 S1 P0\nM970 Q0 A10 B10 C130 H20 K0\nM970 Q0 A10 B131 C250 K1\nM974 Q0 S1 P0\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nG29 ;Home\nG90;\nG92 E0 ;Reset Extruder \nG1 Z2.0 F3000 ;Move Z Axis up \nG1 X10.1 Y20 Z0.28 F5000.0 ;Move to start position\nM109 S205;\nG1 X10.1 Y200.0 Z0.28 F1500.0 E15 ;Draw the first line\nG1 X10.4 Y200.0 Z0.28 F5000.0 ;Move to side a little\nG1 X10.4 Y20 Z0.28 F1500.0 E30 ;Draw the second line\nG92 E0 ;Reset Extruder \nG1 X110 Y110 Z2.0 F3000 ;Move Z Axis up",
|
||||
"machine_end_gcode": "M400 ; wait for buffer to clear\nG92 E0 ; zero the extruder\nG1 E-4.0 F3600; retract \nG91\nG1 Z3;\nM104 S0 ; turn off hotend\nM140 S0 ; turn off bed\nM106 S0 ; turn off fan\nG90 \nG0 X110 Y200 F3600 \nprint_end",
|
||||
"layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]",
|
||||
"before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\n;[layer_z]\nG92 E0\n",
|
||||
"machine_pause_gcode": "M601"
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"type": "process",
|
||||
"setting_id": "GP004",
|
||||
"name": "0.12mm Fine @Afinia H+1(HS)",
|
||||
"from": "system",
|
||||
"instantiation": "true",
|
||||
"inherits": "fdm_process_afinia_HS_common",
|
||||
"layer_height": "0.12",
|
||||
"bottom_shell_layers": "5",
|
||||
"elefant_foot_compensation": "0.15",
|
||||
"top_shell_layers": "5",
|
||||
"top_shell_thickness": "0.6",
|
||||
"bridge_flow": "1",
|
||||
"initial_layer_speed": "50",
|
||||
"initial_layer_infill_speed": "105",
|
||||
"outer_wall_speed": "150",
|
||||
"inner_wall_speed": "200",
|
||||
"sparse_infill_speed": "200",
|
||||
"internal_solid_infill_speed": "200",
|
||||
"gap_infill_speed": "150",
|
||||
"overhang_1_4_speed": "60",
|
||||
"overhang_2_4_speed": "30",
|
||||
"overhang_3_4_speed": "10",
|
||||
"support_threshold_angle": "20",
|
||||
"support_top_z_distance": "0.12",
|
||||
"support_bottom_z_distance": "0.12",
|
||||
"compatible_printers": [
|
||||
"Afinia H+1(HS) 0.4 nozzle"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"type": "process",
|
||||
"setting_id": "GP004",
|
||||
"name": "0.16mm Optimal @Afinia H+1(HS)",
|
||||
"from": "system",
|
||||
"instantiation": "true",
|
||||
"inherits": "fdm_process_afinia_HS_common",
|
||||
"layer_height": "0.16",
|
||||
"elefant_foot_compensation": "0.15",
|
||||
"bottom_shell_layers": "4",
|
||||
"top_shell_layers": "6",
|
||||
"top_shell_thickness": "1.0",
|
||||
"bridge_flow": "1",
|
||||
"initial_layer_speed": "50",
|
||||
"initial_layer_infill_speed": "105",
|
||||
"outer_wall_speed": "150",
|
||||
"inner_wall_speed": "200",
|
||||
"sparse_infill_speed": "200",
|
||||
"internal_solid_infill_speed": "200",
|
||||
"gap_infill_speed": "150",
|
||||
"overhang_1_4_speed": "60",
|
||||
"overhang_2_4_speed": "30",
|
||||
"overhang_3_4_speed": "10",
|
||||
"support_threshold_angle": "25",
|
||||
"support_top_z_distance": "0.16",
|
||||
"support_bottom_z_distance": "0.16",
|
||||
"compatible_printers": [
|
||||
"Afinia H+1(HS) 0.4 nozzle"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"type": "process",
|
||||
"name": "0.18mm Fine @Afinia H+1(HS) 0.6 nozzle",
|
||||
"inherits": "fdm_process_afinia_0.18_nozzle_0.6_HS",
|
||||
"from": "system",
|
||||
"setting_id": "GP021",
|
||||
"instantiation": "true",
|
||||
"description": "It has a smaller layer height and results in smoother surface and higher printing quality.",
|
||||
"elefant_foot_compensation": "0.15",
|
||||
"smooth_coefficient": "150",
|
||||
"overhang_totally_speed": "50",
|
||||
"compatible_printers": [
|
||||
"Afinia H+1(HS) 0.6 nozzle"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"type": "process",
|
||||
"setting_id": "GP004",
|
||||
"name": "0.20mm Standard @Afinia H+1(HS)",
|
||||
"from": "system",
|
||||
"inherits": "fdm_process_afinia_HS_common",
|
||||
"instantiation": "true",
|
||||
"elefant_foot_compensation": "0.15",
|
||||
"top_shell_thickness": "1.0",
|
||||
"bridge_flow": "1",
|
||||
"initial_layer_speed": "50",
|
||||
"initial_layer_infill_speed": "105",
|
||||
"outer_wall_speed": "150",
|
||||
"inner_wall_speed": "200",
|
||||
"sparse_infill_speed": "200",
|
||||
"internal_solid_infill_speed": "200",
|
||||
"gap_infill_speed": "150",
|
||||
"top_shell_layers": "5",
|
||||
"compatible_printers": [
|
||||
"Afinia H+1(HS) 0.4 nozzle"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"type": "process",
|
||||
"setting_id": "GP004",
|
||||
"name": "0.24mm Draft @Afinia H+1(HS)",
|
||||
"from": "system",
|
||||
"instantiation": "true",
|
||||
"inherits": "fdm_process_afinia_HS_common",
|
||||
"layer_height": "0.24",
|
||||
"elefant_foot_compensation": "0.15",
|
||||
"top_surface_line_width": "0.45",
|
||||
"top_shell_thickness": "1.0",
|
||||
"bridge_flow": "1",
|
||||
"initial_layer_speed": "50",
|
||||
"initial_layer_infill_speed": "105",
|
||||
"outer_wall_speed": "150",
|
||||
"inner_wall_speed": "200",
|
||||
"sparse_infill_speed": "200",
|
||||
"internal_solid_infill_speed": "200",
|
||||
"gap_infill_speed": "150",
|
||||
"support_threshold_angle": "35",
|
||||
"top_shell_layers": "4",
|
||||
"compatible_printers": [
|
||||
"Afinia H+1(HS) 0.4 nozzle"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"type": "process",
|
||||
"name": "0.24mm Standard @Afinia H+1(HS) 0.6 nozzle",
|
||||
"inherits": "fdm_process_afinia_0.24_nozzle_0.6_HS",
|
||||
"from": "system",
|
||||
"setting_id": "GP022",
|
||||
"instantiation": "true",
|
||||
"description": "It has a balanced layer height for good quality and reasonable printing time.",
|
||||
"elefant_foot_compensation": "0.15",
|
||||
"smooth_coefficient": "150",
|
||||
"overhang_totally_speed": "50",
|
||||
"compatible_printers": [
|
||||
"Afinia H+1(HS) 0.6 nozzle"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"type": "process",
|
||||
"setting_id": "GP004",
|
||||
"name": "0.28mm Extra Draft @Afinia H+1(HS)",
|
||||
"from": "system",
|
||||
"instantiation": "true",
|
||||
"inherits": "fdm_process_afinia_HS_common",
|
||||
"layer_height": "0.28",
|
||||
"elefant_foot_compensation": "0.15",
|
||||
"top_surface_line_width": "0.45",
|
||||
"top_shell_thickness": "1.0",
|
||||
"bridge_flow": "1",
|
||||
"initial_layer_speed": "50",
|
||||
"initial_layer_infill_speed": "105",
|
||||
"outer_wall_speed": "200",
|
||||
"inner_wall_speed": "200",
|
||||
"sparse_infill_speed": "200",
|
||||
"internal_solid_infill_speed": "200",
|
||||
"gap_infill_speed": "200",
|
||||
"support_threshold_angle": "40",
|
||||
"top_shell_layers": "4",
|
||||
"compatible_printers": [
|
||||
"Afinia H+1(HS) 0.4 nozzle"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"type": "process",
|
||||
"name": "0.30mm Standard @Afinia H+1(HS) 0.6 nozzle",
|
||||
"inherits": "fdm_process_afinia_0.30_nozzle_0.6_HS",
|
||||
"from": "system",
|
||||
"setting_id": "GP023",
|
||||
"instantiation": "true",
|
||||
"description": "It has a big layer height, and results in apparent layer lines and ordinary printing quality and printing time.",
|
||||
"elefant_foot_compensation": "0.15",
|
||||
"smooth_coefficient": "150",
|
||||
"overhang_totally_speed": "50",
|
||||
"compatible_printers": [
|
||||
"Afinia H+1(HS) 0.6 nozzle"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"type": "process",
|
||||
"name": "0.30mm Strength @Afinia H+1(HS) 0.6 nozzle",
|
||||
"inherits": "fdm_process_afinia_0.30_nozzle_0.6_HS",
|
||||
"from": "system",
|
||||
"setting_id": "GP024",
|
||||
"instantiation": "true",
|
||||
"description": "It has a big layer height with optimized settings for stronger parts.",
|
||||
"elefant_foot_compensation": "0.15",
|
||||
"smooth_coefficient": "150",
|
||||
"overhang_totally_speed": "50",
|
||||
"sparse_infill_density": "25%",
|
||||
"wall_loops": "3",
|
||||
"compatible_printers": [
|
||||
"Afinia H+1(HS) 0.6 nozzle"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"type": "process",
|
||||
"name": "0.36mm Draft @Afinia H+1(HS) 0.6 nozzle",
|
||||
"inherits": "fdm_process_afinia_0.36_nozzle_0.6_HS",
|
||||
"from": "system",
|
||||
"setting_id": "GP025",
|
||||
"instantiation": "true",
|
||||
"description": "It has a bigger layer height for faster printing but with more visible layer lines.",
|
||||
"elefant_foot_compensation": "0.15",
|
||||
"smooth_coefficient": "150",
|
||||
"overhang_totally_speed": "50",
|
||||
"compatible_printers": [
|
||||
"Afinia H+1(HS) 0.6 nozzle"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"type": "process",
|
||||
"name": "0.42mm Extra Draft @Afinia H+1(HS) 0.6 nozzle",
|
||||
"inherits": "fdm_process_afinia_0.42_nozzle_0.6_HS",
|
||||
"from": "system",
|
||||
"setting_id": "GP026",
|
||||
"instantiation": "true",
|
||||
"description": "It has the biggest layer height for fastest printing but with very visible layer lines.",
|
||||
"elefant_foot_compensation": "0.15",
|
||||
"smooth_coefficient": "150",
|
||||
"overhang_totally_speed": "50",
|
||||
"compatible_printers": [
|
||||
"Afinia H+1(HS) 0.6 nozzle"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"type": "process",
|
||||
"name": "fdm_process_afinia_0.18_nozzle_0.6",
|
||||
"inherits": "fdm_process_afinia_common",
|
||||
"from": "system",
|
||||
"instantiation": "false",
|
||||
"layer_height": "0.18",
|
||||
"initial_layer_print_height": "0.18",
|
||||
"bridge_flow": "1",
|
||||
"line_width": "0.62",
|
||||
"outer_wall_line_width": "0.62",
|
||||
"ironing_inset": "0.31",
|
||||
"initial_layer_line_width": "0.62",
|
||||
"sparse_infill_line_width": "0.62",
|
||||
"inner_wall_line_width": "0.62",
|
||||
"internal_solid_infill_line_width": "0.62",
|
||||
"support_line_width": "0.62",
|
||||
"top_surface_line_width": "0.62",
|
||||
"initial_layer_speed": "35",
|
||||
"initial_layer_infill_speed": "55",
|
||||
"sparse_infill_speed": "100",
|
||||
"top_surface_speed": "120",
|
||||
"bridge_speed": "30",
|
||||
"overhang_3_4_speed": "15",
|
||||
"tree_support_tip_diameter": "1.2"
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"type": "process",
|
||||
"name": "fdm_process_afinia_0.18_nozzle_0.6_HS",
|
||||
"inherits": "fdm_process_afinia_HS_common",
|
||||
"from": "system",
|
||||
"instantiation": "false",
|
||||
"layer_height": "0.18",
|
||||
"initial_layer_print_height": "0.18",
|
||||
"bridge_flow": "1",
|
||||
"line_width": "0.62",
|
||||
"outer_wall_line_width": "0.62",
|
||||
"ironing_inset": "0.31",
|
||||
"initial_layer_line_width": "0.62",
|
||||
"sparse_infill_line_width": "0.62",
|
||||
"inner_wall_line_width": "0.62",
|
||||
"internal_solid_infill_line_width": "0.62",
|
||||
"support_line_width": "0.62",
|
||||
"top_surface_line_width": "0.62",
|
||||
"initial_layer_speed": "35",
|
||||
"initial_layer_infill_speed": "55",
|
||||
"sparse_infill_speed": "100",
|
||||
"top_surface_speed": "120",
|
||||
"bridge_speed": "30",
|
||||
"overhang_3_4_speed": "15",
|
||||
"tree_support_tip_diameter": "1.2"
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"type": "process",
|
||||
"name": "fdm_process_afinia_0.24_nozzle_0.6",
|
||||
"inherits": "fdm_process_afinia_common",
|
||||
"from": "system",
|
||||
"instantiation": "false",
|
||||
"layer_height": "0.24",
|
||||
"initial_layer_print_height": "0.24",
|
||||
"bridge_flow": "1",
|
||||
"line_width": "0.62",
|
||||
"outer_wall_line_width": "0.62",
|
||||
"ironing_inset": "0.31",
|
||||
"initial_layer_line_width": "0.62",
|
||||
"sparse_infill_line_width": "0.62",
|
||||
"inner_wall_line_width": "0.62",
|
||||
"internal_solid_infill_line_width": "0.62",
|
||||
"support_line_width": "0.62",
|
||||
"top_surface_line_width": "0.62",
|
||||
"initial_layer_speed": "35",
|
||||
"initial_layer_infill_speed": "55",
|
||||
"sparse_infill_speed": "100",
|
||||
"top_surface_speed": "130",
|
||||
"bridge_speed": "30",
|
||||
"overhang_3_4_speed": "15",
|
||||
"tree_support_tip_diameter": "1.2"
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"type": "process",
|
||||
"name": "fdm_process_afinia_0.24_nozzle_0.6_HS",
|
||||
"inherits": "fdm_process_afinia_HS_common",
|
||||
"from": "system",
|
||||
"instantiation": "false",
|
||||
"layer_height": "0.24",
|
||||
"initial_layer_print_height": "0.24",
|
||||
"bridge_flow": "1",
|
||||
"line_width": "0.62",
|
||||
"outer_wall_line_width": "0.62",
|
||||
"ironing_inset": "0.31",
|
||||
"initial_layer_line_width": "0.62",
|
||||
"sparse_infill_line_width": "0.62",
|
||||
"inner_wall_line_width": "0.62",
|
||||
"internal_solid_infill_line_width": "0.62",
|
||||
"support_line_width": "0.62",
|
||||
"top_surface_line_width": "0.62",
|
||||
"initial_layer_speed": "35",
|
||||
"initial_layer_infill_speed": "55",
|
||||
"sparse_infill_speed": "100",
|
||||
"top_surface_speed": "130",
|
||||
"bridge_speed": "30",
|
||||
"overhang_3_4_speed": "15",
|
||||
"tree_support_tip_diameter": "1.2"
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"type": "process",
|
||||
"name": "fdm_process_afinia_0.30_nozzle_0.6",
|
||||
"inherits": "fdm_process_afinia_common",
|
||||
"from": "system",
|
||||
"instantiation": "false",
|
||||
"layer_height": "0.3",
|
||||
"initial_layer_print_height": "0.3",
|
||||
"bridge_flow": "1",
|
||||
"line_width": "0.62",
|
||||
"outer_wall_line_width": "0.62",
|
||||
"ironing_inset": "0.31",
|
||||
"initial_layer_line_width": "0.62",
|
||||
"sparse_infill_line_width": "0.62",
|
||||
"inner_wall_line_width": "0.62",
|
||||
"internal_solid_infill_line_width": "0.62",
|
||||
"support_line_width": "0.62",
|
||||
"top_surface_line_width": "0.62",
|
||||
"initial_layer_speed": "35",
|
||||
"initial_layer_infill_speed": "55",
|
||||
"sparse_infill_speed": "100",
|
||||
"top_surface_speed": "150",
|
||||
"bridge_speed": "30",
|
||||
"overhang_3_4_speed": "15",
|
||||
"tree_support_tip_diameter": "1.2"
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"type": "process",
|
||||
"name": "fdm_process_afinia_0.30_nozzle_0.6_HS",
|
||||
"inherits": "fdm_process_afinia_HS_common",
|
||||
"from": "system",
|
||||
"instantiation": "false",
|
||||
"layer_height": "0.3",
|
||||
"initial_layer_print_height": "0.3",
|
||||
"bridge_flow": "1",
|
||||
"line_width": "0.62",
|
||||
"outer_wall_line_width": "0.62",
|
||||
"ironing_inset": "0.31",
|
||||
"initial_layer_line_width": "0.62",
|
||||
"sparse_infill_line_width": "0.62",
|
||||
"inner_wall_line_width": "0.62",
|
||||
"internal_solid_infill_line_width": "0.62",
|
||||
"support_line_width": "0.62",
|
||||
"top_surface_line_width": "0.62",
|
||||
"initial_layer_speed": "35",
|
||||
"initial_layer_infill_speed": "55",
|
||||
"sparse_infill_speed": "100",
|
||||
"top_surface_speed": "150",
|
||||
"bridge_speed": "30",
|
||||
"overhang_3_4_speed": "15",
|
||||
"tree_support_tip_diameter": "1.2"
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"type": "process",
|
||||
"name": "fdm_process_afinia_0.36_nozzle_0.6",
|
||||
"inherits": "fdm_process_afinia_common",
|
||||
"from": "system",
|
||||
"instantiation": "false",
|
||||
"layer_height": "0.36",
|
||||
"initial_layer_print_height": "0.36",
|
||||
"bridge_flow": "1",
|
||||
"line_width": "0.62",
|
||||
"outer_wall_line_width": "0.62",
|
||||
"ironing_inset": "0.31",
|
||||
"initial_layer_line_width": "0.62",
|
||||
"sparse_infill_line_width": "0.62",
|
||||
"inner_wall_line_width": "0.62",
|
||||
"internal_solid_infill_line_width": "0.62",
|
||||
"support_line_width": "0.62",
|
||||
"top_surface_line_width": "0.62",
|
||||
"initial_layer_speed": "35",
|
||||
"initial_layer_infill_speed": "55",
|
||||
"sparse_infill_speed": "100",
|
||||
"top_surface_speed": "140",
|
||||
"bridge_speed": "30",
|
||||
"overhang_3_4_speed": "15",
|
||||
"tree_support_tip_diameter": "1.2"
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"type": "process",
|
||||
"name": "fdm_process_afinia_0.36_nozzle_0.6_HS",
|
||||
"inherits": "fdm_process_afinia_HS_common",
|
||||
"from": "system",
|
||||
"instantiation": "false",
|
||||
"layer_height": "0.36",
|
||||
"initial_layer_print_height": "0.36",
|
||||
"bridge_flow": "1",
|
||||
"line_width": "0.62",
|
||||
"outer_wall_line_width": "0.62",
|
||||
"ironing_inset": "0.31",
|
||||
"initial_layer_line_width": "0.62",
|
||||
"sparse_infill_line_width": "0.62",
|
||||
"inner_wall_line_width": "0.62",
|
||||
"internal_solid_infill_line_width": "0.62",
|
||||
"support_line_width": "0.62",
|
||||
"top_surface_line_width": "0.62",
|
||||
"initial_layer_speed": "35",
|
||||
"initial_layer_infill_speed": "55",
|
||||
"sparse_infill_speed": "100",
|
||||
"top_surface_speed": "140",
|
||||
"bridge_speed": "30",
|
||||
"overhang_3_4_speed": "15",
|
||||
"tree_support_tip_diameter": "1.2"
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"type": "process",
|
||||
"name": "fdm_process_afinia_0.42_nozzle_0.6",
|
||||
"inherits": "fdm_process_afinia_common",
|
||||
"from": "system",
|
||||
"instantiation": "false",
|
||||
"layer_height": "0.42",
|
||||
"initial_layer_print_height": "0.42",
|
||||
"bridge_flow": "1",
|
||||
"line_width": "0.62",
|
||||
"outer_wall_line_width": "0.62",
|
||||
"ironing_inset": "0.31",
|
||||
"initial_layer_line_width": "0.62",
|
||||
"sparse_infill_line_width": "0.62",
|
||||
"inner_wall_line_width": "0.62",
|
||||
"internal_solid_infill_line_width": "0.62",
|
||||
"support_line_width": "0.62",
|
||||
"top_surface_line_width": "0.62",
|
||||
"initial_layer_speed": "35",
|
||||
"initial_layer_infill_speed": "55",
|
||||
"sparse_infill_speed": "100",
|
||||
"top_surface_speed": "130",
|
||||
"bridge_speed": "30",
|
||||
"overhang_3_4_speed": "15",
|
||||
"tree_support_tip_diameter": "1.2"
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"type": "process",
|
||||
"name": "fdm_process_afinia_0.42_nozzle_0.6_HS",
|
||||
"inherits": "fdm_process_afinia_HS_common",
|
||||
"from": "system",
|
||||
"instantiation": "false",
|
||||
"layer_height": "0.42",
|
||||
"initial_layer_print_height": "0.42",
|
||||
"bridge_flow": "1",
|
||||
"line_width": "0.62",
|
||||
"outer_wall_line_width": "0.62",
|
||||
"ironing_inset": "0.31",
|
||||
"initial_layer_line_width": "0.62",
|
||||
"sparse_infill_line_width": "0.62",
|
||||
"inner_wall_line_width": "0.62",
|
||||
"internal_solid_infill_line_width": "0.62",
|
||||
"support_line_width": "0.62",
|
||||
"top_surface_line_width": "0.62",
|
||||
"initial_layer_speed": "35",
|
||||
"initial_layer_infill_speed": "55",
|
||||
"sparse_infill_speed": "100",
|
||||
"top_surface_speed": "130",
|
||||
"bridge_speed": "30",
|
||||
"overhang_3_4_speed": "15",
|
||||
"tree_support_tip_diameter": "1.2"
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"type": "process",
|
||||
"name": "fdm_process_afinia_HS_common",
|
||||
"inherits": "fdm_process_afinia_common",
|
||||
"from": "system",
|
||||
"instantiation": "false",
|
||||
"default_acceleration": "4000",
|
||||
"travel_acceleration": "4000",
|
||||
"outer_wall_acceleration": "2500",
|
||||
"inner_wall_acceleration": "3000",
|
||||
"initial_layer_acceleration": "500",
|
||||
"top_surface_acceleration": "2000",
|
||||
"travel_speed": "200",
|
||||
"compatible_printers": []
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
{
|
||||
"type": "process",
|
||||
"name": "fdm_process_afinia_common",
|
||||
"inherits": "fdm_process_common",
|
||||
"from": "system",
|
||||
"instantiation": "false",
|
||||
"max_travel_detour_distance": "0",
|
||||
"bottom_surface_pattern": "monotonic",
|
||||
"bottom_shell_layers": "3",
|
||||
"bottom_shell_thickness": "0",
|
||||
"bridge_speed": "50",
|
||||
"brim_object_gap": "0.1",
|
||||
"compatible_printers_condition": "",
|
||||
"draft_shield": "disabled",
|
||||
"elefant_foot_compensation": "0",
|
||||
"enable_arc_fitting": "1",
|
||||
"default_acceleration": "6000",
|
||||
"travel_acceleration": "6000",
|
||||
"outer_wall_acceleration": "3000",
|
||||
"inner_wall_acceleration": "5000",
|
||||
"top_surface_acceleration": "2000",
|
||||
"initial_layer_acceleration": "500",
|
||||
"line_width": "0.42",
|
||||
"internal_bridge_support_thickness": "0.8",
|
||||
"initial_layer_line_width": "0.5",
|
||||
"initial_layer_speed": "50",
|
||||
"initial_layer_infill_speed": "90",
|
||||
"outer_wall_speed": "120",
|
||||
"inner_wall_speed": "160",
|
||||
"gap_infill_speed": "50",
|
||||
"sparse_infill_speed": "250",
|
||||
"ironing_flow": "10%",
|
||||
"ironing_spacing": "0.15",
|
||||
"ironing_speed": "30",
|
||||
"ironing_type": "no ironing",
|
||||
"layer_height": "0.2",
|
||||
"reduce_infill_retraction": "1",
|
||||
"filename_format": "{input_filename_base}_{filament_type[0]}_{print_time}.gcode",
|
||||
"detect_overhang_wall": "1",
|
||||
"overhang_1_4_speed": "0",
|
||||
"overhang_2_4_speed": "50",
|
||||
"overhang_3_4_speed": "30",
|
||||
"overhang_4_4_speed": "10",
|
||||
"only_one_wall_top": "1",
|
||||
"seam_position": "aligned",
|
||||
"skirt_height": "1",
|
||||
"skirt_loops": "0",
|
||||
"minimum_sparse_infill_area": "15",
|
||||
"internal_solid_infill_line_width": "0.42",
|
||||
"internal_solid_infill_speed": "180",
|
||||
"resolution": "0.012",
|
||||
"support_type": "normal(auto)",
|
||||
"support_style": "default",
|
||||
"support_top_z_distance": "0.2",
|
||||
"support_bottom_z_distance": "0.2",
|
||||
"support_interface_bottom_layers": "2",
|
||||
"support_interface_spacing": "0.5",
|
||||
"support_expansion": "0",
|
||||
"support_base_pattern_spacing": "2.5",
|
||||
"support_speed": "200",
|
||||
"support_interface_speed": "80",
|
||||
"support_threshold_angle": "30",
|
||||
"support_object_xy_distance": "0.35",
|
||||
"tree_support_branch_diameter": "2",
|
||||
"tree_support_branch_angle": "45",
|
||||
"tree_support_wall_count": "0",
|
||||
"top_surface_pattern": "monotonicline",
|
||||
"top_surface_speed": "200",
|
||||
"top_shell_layers": "3",
|
||||
"top_shell_thickness": "0.8",
|
||||
"travel_speed": "500",
|
||||
"enable_prime_tower": "1",
|
||||
"wipe_tower_no_sparse_layers": "0",
|
||||
"prime_tower_width": "35",
|
||||
"wall_generator": "classic",
|
||||
"exclude_object": "1",
|
||||
"wall_infill_order": "outer wall/inner wall/infill",
|
||||
"compatible_printers": []
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
{
|
||||
"type": "process",
|
||||
"name": "fdm_process_common",
|
||||
"from": "system",
|
||||
"instantiation": "false",
|
||||
"adaptive_layer_height": "0",
|
||||
"reduce_crossing_wall": "0",
|
||||
"bridge_flow": "0.95",
|
||||
"bridge_speed": "50",
|
||||
"brim_width": "5",
|
||||
"print_sequence": "by layer",
|
||||
"default_acceleration": "10000",
|
||||
"bridge_no_support": "0",
|
||||
"elefant_foot_compensation": "0.1",
|
||||
"outer_wall_line_width": "0.42",
|
||||
"outer_wall_speed": "120",
|
||||
"inner_wall_speed": "160",
|
||||
"line_width": "0.45",
|
||||
"infill_direction": "45",
|
||||
"sparse_infill_density": "15%",
|
||||
"sparse_infill_pattern": "crosshatch",
|
||||
"initial_layer_line_width": "0.42",
|
||||
"initial_layer_print_height": "0.2",
|
||||
"initial_layer_speed": "50",
|
||||
"initial_layer_infill_speed": "90",
|
||||
"gap_infill_speed": "50",
|
||||
"infill_combination": "0",
|
||||
"sparse_infill_line_width": "0.45",
|
||||
"infill_wall_overlap": "15%",
|
||||
"sparse_infill_speed": "200",
|
||||
"interface_shells": "0",
|
||||
"detect_overhang_wall": "0",
|
||||
"reduce_infill_retraction": "0",
|
||||
"filename_format": "{input_filename_base}.gcode",
|
||||
"wall_loops": "2",
|
||||
"inner_wall_line_width": "0.45",
|
||||
"print_settings_id": "",
|
||||
"raft_layers": "0",
|
||||
"seam_position": "nearest",
|
||||
"skirt_distance": "2",
|
||||
"skirt_height": "2",
|
||||
"minimum_sparse_infill_area": "0",
|
||||
"internal_solid_infill_line_width": "0.45",
|
||||
"internal_solid_infill_speed": "180",
|
||||
"spiral_mode": "0",
|
||||
"standby_temperature_delta": "-5",
|
||||
"enable_support": "0",
|
||||
"support_filament": "0",
|
||||
"support_line_width": "0.42",
|
||||
"support_interface_filament": "0",
|
||||
"support_on_build_plate_only": "0",
|
||||
"support_top_z_distance": "0.15",
|
||||
"support_interface_loop_pattern": "0",
|
||||
"support_interface_top_layers": "2",
|
||||
"support_interface_spacing": "0",
|
||||
"support_interface_speed": "80",
|
||||
"support_interface_pattern": "auto",
|
||||
"support_base_pattern": "default",
|
||||
"support_base_pattern_spacing": "2",
|
||||
"support_speed": "200",
|
||||
"support_threshold_angle": "40",
|
||||
"support_object_xy_distance": "0.5",
|
||||
"detect_thin_wall": "0",
|
||||
"top_surface_line_width": "0.42",
|
||||
"top_surface_speed": "120",
|
||||
"travel_speed": "400",
|
||||
"enable_prime_tower": "0",
|
||||
"prime_tower_width": "60",
|
||||
"xy_hole_compensation": "0",
|
||||
"xy_contour_compensation": "0",
|
||||
"compatible_printers": []
|
||||
}
|
||||
390
backend/profiles/profiles/Anker.json
Normal file
390
backend/profiles/profiles/Anker.json
Normal file
@@ -0,0 +1,390 @@
|
||||
{
|
||||
"name": "Anker",
|
||||
"version": "02.03.01.10",
|
||||
"force_update": "0",
|
||||
"description": "Anker configurations",
|
||||
"machine_model_list": [
|
||||
{
|
||||
"name": "Anker M5",
|
||||
"sub_path": "machine/Anker M5.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker M5 All-Metal Hot End",
|
||||
"sub_path": "machine/Anker M5 All-Metal Hot End.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker M5C",
|
||||
"sub_path": "machine/Anker M5C.json"
|
||||
}
|
||||
],
|
||||
"process_list": [
|
||||
{
|
||||
"name": "fdm_process_common",
|
||||
"sub_path": "process/fdm_process_common.json"
|
||||
},
|
||||
{
|
||||
"name": "fdm_process_anker_common",
|
||||
"sub_path": "process/fdm_process_anker_common.json"
|
||||
},
|
||||
{
|
||||
"name": "fdm_process_anker_common_0_2",
|
||||
"sub_path": "process/fdm_process_anker_common_0_2.json"
|
||||
},
|
||||
{
|
||||
"name": "fdm_process_anker_common_0_25",
|
||||
"sub_path": "process/fdm_process_anker_common_0_25.json"
|
||||
},
|
||||
{
|
||||
"name": "fdm_process_anker_common_0_6",
|
||||
"sub_path": "process/fdm_process_anker_common_0_6.json"
|
||||
},
|
||||
{
|
||||
"name": "0.05mm Ultradetail @Anker",
|
||||
"sub_path": "process/0.05mm Ultradetail @Anker.json"
|
||||
},
|
||||
{
|
||||
"name": "0.10mm Detail @Anker",
|
||||
"sub_path": "process/0.10mm Detail @Anker.json"
|
||||
},
|
||||
{
|
||||
"name": "0.15mm Optimal @Anker",
|
||||
"sub_path": "process/0.15mm Optimal @Anker.json"
|
||||
},
|
||||
{
|
||||
"name": "0.20mm Standard @Anker",
|
||||
"sub_path": "process/0.20mm Standard @Anker.json"
|
||||
},
|
||||
{
|
||||
"name": "0.25mm Draft @Anker",
|
||||
"sub_path": "process/0.25mm Draft @Anker.json"
|
||||
},
|
||||
{
|
||||
"name": "0.30mm Superdraft @Anker",
|
||||
"sub_path": "process/0.30mm Superdraft @Anker.json"
|
||||
},
|
||||
{
|
||||
"name": "fdm_process_anker_fast_common",
|
||||
"sub_path": "process/fdm_process_anker_fast_common.json"
|
||||
},
|
||||
{
|
||||
"name": "0.05mm Optimal 0.2 nozzle @Anker",
|
||||
"sub_path": "process/0.05mm Optimal 0.2 nozzle @Anker.json"
|
||||
},
|
||||
{
|
||||
"name": "0.10mm Standard 0.2 nozzle @Anker",
|
||||
"sub_path": "process/0.10mm Standard 0.2 nozzle @Anker.json"
|
||||
},
|
||||
{
|
||||
"name": "0.15mm Draft 0.2 nozzle @Anker",
|
||||
"sub_path": "process/0.15mm Draft 0.2 nozzle @Anker.json"
|
||||
},
|
||||
{
|
||||
"name": "0.05mm Optimal 0.25 nozzle @Anker",
|
||||
"sub_path": "process/0.05mm Optimal 0.25 nozzle @Anker.json"
|
||||
},
|
||||
{
|
||||
"name": "0.10mm Standard 0.25 nozzle @Anker",
|
||||
"sub_path": "process/0.10mm Standard 0.25 nozzle @Anker.json"
|
||||
},
|
||||
{
|
||||
"name": "0.15mm Draft 0.25 nozzle @Anker",
|
||||
"sub_path": "process/0.15mm Draft 0.25 nozzle @Anker.json"
|
||||
},
|
||||
{
|
||||
"name": "0.15mm Detail 0.6 nozzle @Anker",
|
||||
"sub_path": "process/0.15mm Detail 0.6 nozzle @Anker.json"
|
||||
},
|
||||
{
|
||||
"name": "0.20mm Optimal 0.6 nozzle @Anker",
|
||||
"sub_path": "process/0.20mm Optimal 0.6 nozzle @Anker.json"
|
||||
},
|
||||
{
|
||||
"name": "0.30mm Standard 0.6mm nozzle @Anker",
|
||||
"sub_path": "process/0.30mm Standard 0.6mm nozzle @Anker.json"
|
||||
},
|
||||
{
|
||||
"name": "0.35mm Draft 0.6mm nozzle @Anker",
|
||||
"sub_path": "process/0.35mm Draft 0.6mm nozzle @Anker.json"
|
||||
},
|
||||
{
|
||||
"name": "0.40mm Superdraft 0.6mm nozzle @Anker",
|
||||
"sub_path": "process/0.40mm Superdraft 0.6mm nozzle @Anker.json"
|
||||
},
|
||||
{
|
||||
"name": "0.15mm Fast @Anker",
|
||||
"sub_path": "process/0.15mm Fast @Anker.json"
|
||||
},
|
||||
{
|
||||
"name": "0.20mm Fast @Anker",
|
||||
"sub_path": "process/0.20mm Fast @Anker.json"
|
||||
},
|
||||
{
|
||||
"name": "0.25mm Fast @Anker",
|
||||
"sub_path": "process/0.25mm Fast @Anker.json"
|
||||
}
|
||||
],
|
||||
"filament_list": [
|
||||
{
|
||||
"name": "fdm_filament_common",
|
||||
"sub_path": "filament/fdm_filament_common.json"
|
||||
},
|
||||
{
|
||||
"name": "fdm_filament_abs",
|
||||
"sub_path": "filament/fdm_filament_abs.json"
|
||||
},
|
||||
{
|
||||
"name": "fdm_filament_asa",
|
||||
"sub_path": "filament/fdm_filament_asa.json"
|
||||
},
|
||||
{
|
||||
"name": "fdm_filament_pa",
|
||||
"sub_path": "filament/fdm_filament_pa.json"
|
||||
},
|
||||
{
|
||||
"name": "fdm_filament_pc",
|
||||
"sub_path": "filament/fdm_filament_pc.json"
|
||||
},
|
||||
{
|
||||
"name": "fdm_filament_pet",
|
||||
"sub_path": "filament/fdm_filament_pet.json"
|
||||
},
|
||||
{
|
||||
"name": "fdm_filament_pla",
|
||||
"sub_path": "filament/fdm_filament_pla.json"
|
||||
},
|
||||
{
|
||||
"name": "fdm_filament_pva",
|
||||
"sub_path": "filament/fdm_filament_pva.json"
|
||||
},
|
||||
{
|
||||
"name": "fdm_filament_tpu",
|
||||
"sub_path": "filament/fdm_filament_tpu.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic ABS @base",
|
||||
"sub_path": "filament/Anker Generic ABS @base.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic ASA @base",
|
||||
"sub_path": "filament/Anker Generic ASA @base.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PA @base",
|
||||
"sub_path": "filament/Anker Generic PA @base.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PA-CF @base",
|
||||
"sub_path": "filament/Anker Generic PA-CF @base.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PC @base",
|
||||
"sub_path": "filament/Anker Generic PC @base.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PETG @base",
|
||||
"sub_path": "filament/Anker Generic PETG @base.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PETG-CF @base",
|
||||
"sub_path": "filament/Anker Generic PETG-CF @base.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PLA @base",
|
||||
"sub_path": "filament/Anker Generic PLA @base.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PLA Silk @base",
|
||||
"sub_path": "filament/Anker Generic PLA Silk @base.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PLA+ @base",
|
||||
"sub_path": "filament/Anker Generic PLA+ @base.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PLA-CF @base",
|
||||
"sub_path": "filament/Anker Generic PLA-CF @base.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PVA @base",
|
||||
"sub_path": "filament/Anker Generic PVA @base.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic TPU @base",
|
||||
"sub_path": "filament/Anker Generic TPU @base.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic ABS",
|
||||
"sub_path": "filament/Anker Generic ABS.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic ABS 0.2 nozzle",
|
||||
"sub_path": "filament/Anker Generic ABS 0.2 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic ABS 0.25 nozzle",
|
||||
"sub_path": "filament/Anker Generic ABS 0.25 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic ASA",
|
||||
"sub_path": "filament/Anker Generic ASA.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic ASA 0.2 nozzle",
|
||||
"sub_path": "filament/Anker Generic ASA 0.2 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic ASA 0.25 nozzle",
|
||||
"sub_path": "filament/Anker Generic ASA 0.25 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PA",
|
||||
"sub_path": "filament/Anker Generic PA.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PA 0.2 nozzle",
|
||||
"sub_path": "filament/Anker Generic PA 0.2 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PA 0.25 nozzle",
|
||||
"sub_path": "filament/Anker Generic PA 0.25 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PA-CF",
|
||||
"sub_path": "filament/Anker Generic PA-CF.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PC",
|
||||
"sub_path": "filament/Anker Generic PC.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PC 0.2 nozzle",
|
||||
"sub_path": "filament/Anker Generic PC 0.2 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PC 0.25 nozzle",
|
||||
"sub_path": "filament/Anker Generic PC 0.25 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PETG",
|
||||
"sub_path": "filament/Anker Generic PETG.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PETG 0.2 nozzle",
|
||||
"sub_path": "filament/Anker Generic PETG 0.2 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PETG 0.25 nozzle",
|
||||
"sub_path": "filament/Anker Generic PETG 0.25 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PETG-CF",
|
||||
"sub_path": "filament/Anker Generic PETG-CF.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PLA",
|
||||
"sub_path": "filament/Anker Generic PLA.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PLA 0.2 nozzle",
|
||||
"sub_path": "filament/Anker Generic PLA 0.2 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PLA 0.25 nozzle",
|
||||
"sub_path": "filament/Anker Generic PLA 0.25 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PLA Silk",
|
||||
"sub_path": "filament/Anker Generic PLA Silk.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PLA Silk 0.2 nozzle",
|
||||
"sub_path": "filament/Anker Generic PLA Silk 0.2 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PLA Silk 0.25 nozzle",
|
||||
"sub_path": "filament/Anker Generic PLA Silk 0.25 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PLA+",
|
||||
"sub_path": "filament/Anker Generic PLA+.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PLA+ 0.2 nozzle",
|
||||
"sub_path": "filament/Anker Generic PLA+ 0.2 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PLA+ 0.25 nozzle",
|
||||
"sub_path": "filament/Anker Generic PLA+ 0.25 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PLA-CF",
|
||||
"sub_path": "filament/Anker Generic PLA-CF.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PVA",
|
||||
"sub_path": "filament/Anker Generic PVA.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic TPU",
|
||||
"sub_path": "filament/Anker Generic TPU.json"
|
||||
}
|
||||
],
|
||||
"machine_list": [
|
||||
{
|
||||
"name": "fdm_machine_common",
|
||||
"sub_path": "machine/fdm_machine_common.json"
|
||||
},
|
||||
{
|
||||
"name": "fdm_marlin_common",
|
||||
"sub_path": "machine/fdm_marlin_common.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker M5 0.2 nozzle",
|
||||
"sub_path": "machine/Anker M5 0.2 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker M5 0.25 nozzle",
|
||||
"sub_path": "machine/Anker M5 0.25 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker M5 0.4 nozzle",
|
||||
"sub_path": "machine/Anker M5 0.4 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker M5 0.6 nozzle",
|
||||
"sub_path": "machine/Anker M5 0.6 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker M5 All-Metal 0.2 nozzle",
|
||||
"sub_path": "machine/Anker M5 All-Metal 0.2 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker M5 All-Metal 0.25 nozzle",
|
||||
"sub_path": "machine/Anker M5 All-Metal 0.25 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker M5 All-Metal 0.4 nozzle",
|
||||
"sub_path": "machine/Anker M5 All-Metal 0.4 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker M5 All-Metal 0.6 nozzle",
|
||||
"sub_path": "machine/Anker M5 All-Metal 0.6 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker M5C 0.2 nozzle",
|
||||
"sub_path": "machine/Anker M5C 0.2 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker M5C 0.25 nozzle",
|
||||
"sub_path": "machine/Anker M5C 0.25 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker M5C 0.4 nozzle",
|
||||
"sub_path": "machine/Anker M5C 0.4 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker M5C 0.6 nozzle",
|
||||
"sub_path": "machine/Anker M5C 0.6 nozzle.json"
|
||||
}
|
||||
]
|
||||
}
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 22 KiB |
BIN
backend/profiles/profiles/Anker/Anker M5C_cover.png
Normal file
BIN
backend/profiles/profiles/Anker/Anker M5C_cover.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 13 KiB |
BIN
backend/profiles/profiles/Anker/Anker M5_cover.png
Normal file
BIN
backend/profiles/profiles/Anker/Anker M5_cover.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 21 KiB |
BIN
backend/profiles/profiles/Anker/M5-CE-bed.stl
Normal file
BIN
backend/profiles/profiles/Anker/M5-CE-bed.stl
Normal file
Binary file not shown.
15
backend/profiles/profiles/Anker/M5-CE-texture.svg
Normal file
15
backend/profiles/profiles/Anker/M5-CE-texture.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 7.3 KiB |
BIN
backend/profiles/profiles/Anker/M5C-CE-bed.stl
Normal file
BIN
backend/profiles/profiles/Anker/M5C-CE-bed.stl
Normal file
Binary file not shown.
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic ABS 0.2 nozzle",
|
||||
"inherits": "Anker Generic ABS @base",
|
||||
"from": "system",
|
||||
"setting_id": "GFSB99_20",
|
||||
"instantiation": "true",
|
||||
"filament_max_volumetric_speed": [
|
||||
"2"
|
||||
],
|
||||
"compatible_printers": [
|
||||
"Anker M5 0.2 nozzle",
|
||||
"Anker M5 All-Metal 0.2 nozzle",
|
||||
"Anker M5C 0.2 nozzle"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic ABS 0.25 nozzle",
|
||||
"inherits": "Anker Generic ABS @base",
|
||||
"from": "system",
|
||||
"setting_id": "GFSB99_25",
|
||||
"instantiation": "true",
|
||||
"filament_max_volumetric_speed": [
|
||||
"3"
|
||||
],
|
||||
"compatible_printers": [
|
||||
"Anker M5 0.25 nozzle",
|
||||
"Anker M5 All-Metal 0.25 nozzle",
|
||||
"Anker M5C 0.25 nozzle"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic ABS @base",
|
||||
"inherits": "fdm_filament_abs",
|
||||
"from": "system",
|
||||
"filament_id": "GFB99",
|
||||
"instantiation": "false"
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic ABS",
|
||||
"inherits": "Anker Generic ABS @base",
|
||||
"from": "system",
|
||||
"setting_id": "GFSB99",
|
||||
"instantiation": "true",
|
||||
"compatible_printers": [
|
||||
"Anker M5 0.4 nozzle",
|
||||
"Anker M5 0.6 nozzle",
|
||||
"Anker M5 All-Metal 0.4 nozzle",
|
||||
"Anker M5 All-Metal 0.6 nozzle",
|
||||
"Anker M5C 0.4 nozzle",
|
||||
"Anker M5C 0.6 nozzle"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic ASA 0.2 nozzle",
|
||||
"inherits": "Anker Generic ASA @base",
|
||||
"from": "system",
|
||||
"setting_id": "GFSB98_20",
|
||||
"instantiation": "true",
|
||||
"filament_max_volumetric_speed": [
|
||||
"2"
|
||||
],
|
||||
"compatible_printers": [
|
||||
"Anker M5 0.2 nozzle",
|
||||
"Anker M5 All-Metal 0.2 nozzle",
|
||||
"Anker M5C 0.2 nozzle"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic ASA 0.25 nozzle",
|
||||
"inherits": "Anker Generic ASA @base",
|
||||
"from": "system",
|
||||
"setting_id": "GFSB98_25",
|
||||
"instantiation": "true",
|
||||
"filament_max_volumetric_speed": [
|
||||
"3"
|
||||
],
|
||||
"compatible_printers": [
|
||||
"Anker M5 0.25 nozzle",
|
||||
"Anker M5 All-Metal 0.25 nozzle",
|
||||
"Anker M5C 0.25 nozzle"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic ASA @base",
|
||||
"inherits": "fdm_filament_asa",
|
||||
"from": "system",
|
||||
"filament_id": "GFB98",
|
||||
"instantiation": "false"
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic ASA",
|
||||
"inherits": "Anker Generic ASA @base",
|
||||
"from": "system",
|
||||
"setting_id": "GFSB98",
|
||||
"instantiation": "true",
|
||||
"compatible_printers": [
|
||||
"Anker M5 0.4 nozzle",
|
||||
"Anker M5 0.6 nozzle",
|
||||
"Anker M5 All-Metal 0.4 nozzle",
|
||||
"Anker M5 All-Metal 0.6 nozzle",
|
||||
"Anker M5C 0.4 nozzle",
|
||||
"Anker M5C 0.6 nozzle"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic PA 0.2 nozzle",
|
||||
"inherits": "Anker Generic PA @base",
|
||||
"from": "system",
|
||||
"setting_id": "GFSN99_20",
|
||||
"instantiation": "true",
|
||||
"filament_max_volumetric_speed": [
|
||||
"2"
|
||||
],
|
||||
"compatible_printers": [
|
||||
"Anker M5 All-Metal 0.2 nozzle",
|
||||
"Anker M5C 0.2 nozzle"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic PA 0.25 nozzle",
|
||||
"inherits": "Anker Generic PA @base",
|
||||
"from": "system",
|
||||
"setting_id": "GFSN99_25",
|
||||
"instantiation": "true",
|
||||
"filament_max_volumetric_speed": [
|
||||
"3"
|
||||
],
|
||||
"compatible_printers": [
|
||||
"Anker M5 All-Metal 0.25 nozzle",
|
||||
"Anker M5C 0.25 nozzle"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic PA @base",
|
||||
"inherits": "fdm_filament_pa",
|
||||
"from": "system",
|
||||
"filament_id": "GFN99",
|
||||
"instantiation": "false"
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic PA-CF @base",
|
||||
"inherits": "fdm_filament_pa",
|
||||
"from": "system",
|
||||
"filament_id": "GFN98",
|
||||
"instantiation": "false",
|
||||
"filament_type": [
|
||||
"PA-CF"
|
||||
],
|
||||
"required_nozzle_HRC": [
|
||||
"40"
|
||||
],
|
||||
"filament_cost": [
|
||||
"55"
|
||||
],
|
||||
"filament_max_volumetric_speed": [
|
||||
"6"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic PA-CF",
|
||||
"inherits": "Anker Generic PA-CF @base",
|
||||
"from": "system",
|
||||
"setting_id": "GFSN98",
|
||||
"instantiation": "true",
|
||||
"compatible_printers": [
|
||||
"Anker M5 All-Metal 0.4 nozzle",
|
||||
"Anker M5 All-Metal 0.6 nozzle",
|
||||
"Anker M5C 0.4 nozzle",
|
||||
"Anker M5C 0.6 nozzle"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic PA",
|
||||
"inherits": "Anker Generic PA @base",
|
||||
"from": "system",
|
||||
"setting_id": "GFSN99",
|
||||
"instantiation": "true",
|
||||
"compatible_printers": [
|
||||
"Anker M5 All-Metal 0.4 nozzle",
|
||||
"Anker M5 All-Metal 0.6 nozzle",
|
||||
"Anker M5C 0.4 nozzle",
|
||||
"Anker M5C 0.6 nozzle"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic PC 0.2 nozzle",
|
||||
"inherits": "Anker Generic PC @base",
|
||||
"from": "system",
|
||||
"setting_id": "GFSC99_20",
|
||||
"instantiation": "true",
|
||||
"filament_max_volumetric_speed": [
|
||||
"2"
|
||||
],
|
||||
"compatible_printers": [
|
||||
"Anker M5 All-Metal 0.2 nozzle",
|
||||
"Anker M5C 0.2 nozzle"
|
||||
]
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user