Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 12 additions & 12 deletions .github/workflows/release-candidate.yml
Original file line number Diff line number Diff line change
Expand Up @@ -58,24 +58,24 @@ jobs:
name: snapmaker-studio-installer
path: rc

- name: Download the published v1.1.0 installer, verify its checksum
- name: Download the published v1.5.0 installer, verify its checksum
shell: pwsh
run: |
$ErrorActionPreference = "Stop"
if ($env:GITHUB_ACTIONS -ne 'true' -or $env:RUNNER_ENVIRONMENT -ne 'github-hosted' -or [string]::IsNullOrWhiteSpace($env:ImageOS) -or $env:GITHUB_REPOSITORY -ne 'DVOpenLabs/snapmaker-studio' `
-or $env:ACT -or $env:WDAGUtilityAccount) { throw 'Disposable preflight failed.' }
$url = "https://github.com/DVOpenLabs/snapmaker-studio/releases/download/v1.1.0/Snapmaker.Studio_1.1.0_x64-setup.exe"
$dest = "old\Snapmaker.Studio_1.1.0_x64-setup.exe"
$url = "https://github.com/DVOpenLabs/snapmaker-studio/releases/download/v1.5.0/Snapmaker.Studio_1.5.0_x64-setup.exe"
$dest = "old\Snapmaker.Studio_1.5.0_x64-setup.exe"
New-Item -ItemType Directory -Force -Path old | Out-Null
Invoke-WebRequest -Uri $url -OutFile $dest
$hash = (Get-FileHash -Algorithm SHA256 $dest).Hash.ToLower()
$expected = "b41931774eac5586bc31746599d4a637e89eda195c620067dc1c756281b217ee"
$expected = "d443f64f5167239f1422c719882cf245cff5d00d40c55fb67fc5a1e497b84e82"
if ($hash -ne $expected) {
throw "Downloaded v1.1.0 installer hash $hash does not match the published $expected"
throw "Downloaded v1.5.0 installer hash $hash does not match the published $expected"
}
Write-Host "v1.1.0 installer verified: $hash"
Write-Host "v1.5.0 installer verified: $hash"

- name: Install v1.1.0 (default path), record its registration
- name: Install v1.5.0 (default path), record its registration
shell: pwsh
run: |
$ErrorActionPreference = "Stop"
Expand All @@ -90,14 +90,14 @@ jobs:
if ((Test-Path -LiteralPath $userKey) -or (Test-Path -LiteralPath $machine64Key) -or (Test-Path -LiteralPath $machine32Key) -or (Test-Path -LiteralPath $rememberedKey) -or (Test-Path `
-LiteralPath $manufacturerKey) -or (Test-Path -LiteralPath $defaultExe) -or (Get-Process -Name 'snapmaker-studio-desktop' -ErrorAction SilentlyContinue)) { throw `
'Initial exact production state is not clean.' }
$old = (Resolve-Path "old\Snapmaker.Studio_1.1.0_x64-setup.exe").Path
$old = (Resolve-Path "old\Snapmaker.Studio_1.5.0_x64-setup.exe").Path
$p = Start-Process -FilePath $old -ArgumentList '/S', '/NCRC' -PassThru -Wait
if ($p.ExitCode -ne 0) { throw "v1.1.0 silent install failed, exit $($p.ExitCode)" }
if ($p.ExitCode -ne 0) { throw "v1.5.0 silent install failed, exit $($p.ExitCode)" }
Start-Sleep -Seconds 2
$beforePath = 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall\Snapmaker Studio'
if (-not (Test-Path -LiteralPath $beforePath)) { throw 'Exact v1.1.0 registration is absent' }
if (-not (Test-Path -LiteralPath $beforePath)) { throw 'Exact v1.5.0 registration is absent' }
$beforeProps = Get-ItemProperty -LiteralPath $beforePath
if ($beforeProps.DisplayVersion -ne "1.1.0") { throw "v1.1.0 registration says DisplayVersion=$($beforeProps.DisplayVersion), expected 1.1.0" }
if ($beforeProps.DisplayVersion -ne "1.5.0") { throw "v1.5.0 registration says DisplayVersion=$($beforeProps.DisplayVersion), expected 1.5.0" }
# NSIS can write InstallLocation wrapped in literal quote
# characters (part of the string value itself, not just how it
# displays) — trim them unconditionally so every later
Expand All @@ -112,7 +112,7 @@ jobs:
if ($installLocation -ne (Join-Path $env:LOCALAPPDATA 'Snapmaker Studio')) { throw 'First install did not use the exact default path.' }
"owned_uninstaller=$ownedUninstaller" >> $env:GITHUB_ENV
"owned_uninstaller_sha256=$((Get-FileHash -LiteralPath $ownedUninstaller -Algorithm SHA256).Hash)" >> $env:GITHUB_ENV
Write-Host "v1.1.0 installed at $installLocation, DisplayVersion 1.1.0"
Write-Host "v1.5.0 installed at $installLocation, DisplayVersion 1.5.0"
pwsh -NoProfile -File .github/scripts/ci-assert-registry.ps1 -Action Assert -InstallDir $installLocation -OutFile $env:RUNNER_TEMP\rc-before.json
if ($LASTEXITCODE -ne 0) { throw 'Registry assertion failed.' }

Expand Down
65 changes: 62 additions & 3 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,35 @@ All notable changes to this project are documented here. The format is based on

## [Unreleased]

## [1.6.0] - 2026-10-21

**A job you can pick up again, sizes Studio will not guess, and more projects that prepare.**

### Added
- **This job keeps its files together.** A job holds its project, its prepared copy and its sliced
G-code. After a restart Studio shows what it recorded, checks the files only when you ask, and
reopens only what is unchanged (plus a changed file you name). Each file is labelled recorded,
checked, reopened or left out, and a file that was not reopened keeps its old fingerprint, labelled
as the earlier record. A saved fingerprint is history, not proof that a file was reopened or is
unchanged. Opening a saved job's G-code by hand no longer rewrites its recorded identity.
- **A settings receipt on After slicing** for the original, the prepared copy and the sliced file:
which settings each one carries (the sliced file's read strictly from its G-code), with neutral advice.
- **Refreshed Home, This job and After slicing screens.**

### Changed
- **Printer setup is explicit.** A profile with no printer address is "not set up" until you save one
in Settings; Studio no longer looks up `U1.local` on its own. A stored address is kept, and "Not set
up" and "Could not reach <address>" are different messages. The address you type is a draft until you
press Save. Printer controls are unchanged: Studio does not contact a printer on its own until you set one up, and anything
that controls it still waits for your confirmation.
- **No remote fonts.** The interface uses your system fonts and loads no font from the internet.
- **Wording about the network is now exact.** Studio says your files and checks stay on this computer.
Studio does not contact a printer on its own until you set one up, and features you start yourself (the
update check, the model browser, Auto-detect) can reach beyond this computer.
- The main view scrolls back to the top when you move to a different page. Long project names in
Recent projects can no longer overlap the status chip, and the watch-folder placeholder shows single
backslashes.

### Fixed
- **More Bambu Studio projects now prepare.** Studio keeps six more per-object settings that
Snapmaker Orca 2.4.0 reads in the same words: infill pattern, skeleton and skin infill
Expand All @@ -20,9 +49,11 @@ All notable changes to this project are documented here. The format is based on
- When Prepare refuses a file, the message now says in plain language which settings or structure
and on which object, and what to do next. The raw technical wording is kept in a collapsed
"Technical details" area.
- A project with blank (`nil`) per-part values (for example speeds) that Snapmaker Orca 2.4.0 cannot read, which
stops Orca loading the whole file, is now named in plain language by the Doctor and by Prepare
instead of being passed on.
- A project with blank (`nil`) per-part values (for example speeds) is now named in plain language by
the Doctor and by Prepare, and Studio does not prepare it. This is a precaution. It rests on Snapmaker
Orca's command-line output and a reading of the Snapmaker Orca 2.4.0 source; an isolated check that opened
such a file in the Snapmaker Orca 2.4.1 interface did **not** show it failing to load, so Studio does
not establish that blank values stop Orca from loading a file. Review the original in Snapmaker Orca.
- A prepared copy of a multi-plate project that carried the authoring slicer's per-plate cache
files is no longer reported as not validated because the plate count appeared to drop; plates
are now counted from the project's plate list. The fidelity audit also reports infill density
Expand All @@ -38,6 +69,34 @@ All notable changes to this project are documented here. The format is based on
- Preparing a copy no longer leaves a `<name>.orig.3mf` file beside your original. The original
was never modified; the extra copy was only a leftover. The command-line `repair` and
`optimize` commands still keep their snapshot, and no longer leave one behind if they fail.
- **Size-dependent verdicts no longer trust raw numbers.** Bed fit, the readiness "Fits the print bed"
check, the print-success estimate, the first-layer footprint checks and the Scale Doctor used the raw
numbers stored in a 3MF mesh. A file that declares inches, or that rotates or scales its objects through
a placement transform, could be reported as fitting, ready or "likely" at the wrong size. Studio now first
decides whether those numbers are the physical size: every model part is in millimetres, and every placed
mesh keeps its axis extents through its transforms (no change, a move, or an axis mirror). When that is not
established, each of these says "not checked" with the reason, instead of a verdict, and a not-checked bed
fit stops a project from showing as ready. STL files are unchanged (assumed millimetres).

### Known limitations
- **Sizes Studio cannot establish are "not checked", not guessed.** A project that declares a unit other
than millimetres, or whose objects are rotated or scaled by a placement transform, shows "not checked"
for the size-dependent verdicts above and cannot reach a green ready state. Studio does not convert
declared units, and a near-identity scale can be labelled "rotated".
- **Placement and layout still read the raw coordinates.** The Object placement card ignores declared
units and transforms, so it is outside the "not checked" handling above. Volume, material and cost for a
project that declares a non-millimetre unit are also not corrected in this release.
- **Loading is not slicing, and slicing is not printing.** Studio checks, in isolated runs, that Snapmaker
Orca 2.4.1 opens a prepared copy: four of the six per-object settings above (infill pattern, top and
bottom shell layers, brim type) showed their prepared values in its interface, the two infill densities
could not be located there and are not confirmed, and a repeated part loaded. Those runs used a
synthetic test project, and two import prompts also appeared on the unprepared control. Nobody sliced
those copies or printed them for this release, so the results say nothing about sliced output or a
finished print.
- **Blank (`nil`) per-part values.** The in-app refusal for such a project still says Snapmaker Orca 2.4.0
"stops loading the whole file" when it meets one. That sentence is not established by the interface
check described above and will be corrected in a later release; Studio's decision not to prepare such a
project is unchanged.

## [1.5.0] - 2026-10-06

Expand Down
Loading
Loading