193 lines
4.8 KiB
Markdown
193 lines
4.8 KiB
Markdown
# UVtools PCB Exposure CLI — Build & Usage Guide
|
|
|
|
This guide covers building a wrapper for the`UVtoolsCmd`, for headless Gerber → `.pm4n` (or any slicer format) conversion on Ubuntu.
|
|
|
|
> **Note:** The UVtools maintainer is implementing an official equivalent via
|
|
> the generic `run` command and a new `FileArray` reflection property
|
|
> (`-p FileArray=file.gbr`). Once that ships in a release
|
|
> ([issue 1127](https://github.com/sn4k3/UVtools/issues/1127)), you can switch to
|
|
> `pcb-expose-official.sh` and skip the patch/compile steps entirely — see
|
|
> [Option B](#option-b-official-release-no-compiling-required) below.
|
|
|
|
---
|
|
|
|
## Option A: Patched local build (`pcb-expose` command)
|
|
|
|
### 1. Install .NET SDK
|
|
|
|
```bash
|
|
sudo snap install dotnet
|
|
export DOTNET_ROOT=/var/snap/dotnet/common/dotnet
|
|
dotnet --version
|
|
```
|
|
|
|
Add the `export` line to your `~/.bashrc` so it persists across shells:
|
|
|
|
```bash
|
|
echo 'export DOTNET_ROOT=/var/snap/dotnet/common/dotnet' >> ~/.bashrc
|
|
```
|
|
|
|
### 2. Clone the repo
|
|
|
|
```bash
|
|
cd ~/proj
|
|
git clone --depth 1 https://github.com/sn4k3/UVtools.git
|
|
cd UVtools
|
|
```
|
|
|
|
### 3. Apply the patch
|
|
|
|
Copy `pcb-expose.patch` into the repo root, then:
|
|
|
|
```bash
|
|
git apply ../kicad2msla/UVtools/pcb-expose.patch
|
|
```
|
|
|
|
This does two things:
|
|
- Adds `UVtools.Cmd/Symbols/PcbExposeCommand.cs` (new `pcb-expose` subcommand)
|
|
- Registers it in `UVtools.Cmd/Program.cs`
|
|
|
|
Verify it applied cleanly:
|
|
|
|
```bash
|
|
git add .
|
|
git status
|
|
# modified: UVtools.Cmd/Program.cs
|
|
# new file: UVtools.Cmd/Symbols/PcbExposeCommand.cs
|
|
```
|
|
|
|
### 4. Restore & build
|
|
|
|
```bash
|
|
dotnet restore
|
|
|
|
dotnet publish UVtools.Cmd/UVtools.Cmd.csproj \
|
|
-c Release \
|
|
-r linux-x64 \
|
|
--self-contained false \
|
|
-o ./publish/
|
|
```
|
|
|
|
### 5. Copy the OpenCV native library
|
|
|
|
The published output doesn't include `libcvextern.so` — copy it from the repo:
|
|
|
|
```bash
|
|
cp build/platforms/linux-x64/libcvextern.so ./publish/
|
|
```
|
|
|
|
### 6. Test it
|
|
|
|
```bash
|
|
./publish/UVtoolsCmd pcb-expose \
|
|
~/proj/kicad2msla/Dummy.pm4n \
|
|
~/proj/kicad2msla/gerbers/Flow_Controller_Panel-Front.gtl \
|
|
--invert \
|
|
--mirror \
|
|
--exposure 120 \
|
|
--output ~/proj/kicad2msla/Flow_Controller_Panel-Front.pm4n
|
|
```
|
|
|
|
### 7. Install the wrapper
|
|
|
|
Copy `pcb-expose-patched.sh` somewhere on your `$PATH`, e.g.:
|
|
|
|
```bash
|
|
# Copy the script
|
|
cp ~/proj/kicad2msla/UVtools/pcb-expose-patched.sh ~/.local/bin
|
|
# Make it executable
|
|
chmod +x ~/.local/bin/pcb-expose-patched.sh
|
|
# Create a symlink
|
|
ln -s ~/.local/bin/pcb-expose-patched.sh ~/.local/bin/pcb-expose.sh
|
|
```
|
|
|
|
By default the wrapper looks for the build at `~/proj/UVtools/publish/UVtoolsCmd`.
|
|
If yours is elsewhere, either edit the `UVTOOLSCMD` variable at the top of the
|
|
script, or set it as an environment variable each time:
|
|
|
|
```bash
|
|
export UVTOOLSCMD=~/proj/UVtools/publish/UVtoolsCmd
|
|
```
|
|
|
|
### 8. Usage
|
|
|
|
```bash
|
|
pcb-expose.sh ~/proj/kicad2msla/Dummy.pm4n \
|
|
~/proj/kicad2msla/gerbers/Flow_Controller_Panel-Front.gtl \
|
|
--invert --mirror --exposure 120 \
|
|
--output ~/proj/kicad2msla/Flow_Controller_Panel-Front.pm4n
|
|
```
|
|
|
|
Multiple files / per-file polarity inversion / merging into one layer:
|
|
|
|
```bash
|
|
pcb-expose.sh Dummy.pm4n \
|
|
Board-F.Cu.gtl Board-B.Cu.gtl \
|
|
--merge --invert-polarity --mirror --exposure 120 \
|
|
--output Board-combined.pm4n
|
|
```
|
|
|
|
---
|
|
|
|
## Option B: Official release (no compiling required)
|
|
|
|
Once the maintainer's `FileArray` property ships in an official UVtools
|
|
release:
|
|
|
|
### 1. Download & install the release
|
|
|
|
Grab the Linux release from the
|
|
[UVtools releases page](https://github.com/sn4k3/UVtools/releases) and
|
|
extract it, e.g. to `~/UVtools/`. `libcvextern.so` is bundled in official
|
|
releases, so no extra steps are needed there.
|
|
|
|
### 2. Install the wrapper
|
|
|
|
```bash
|
|
# Copy the script
|
|
cp ~/proj/kicad2msla/UVtools/pcb-expose-official.sh ~/.local/bin
|
|
# Make it executable
|
|
chmod +x ~/.local/bin/pcb-expose-official.sh
|
|
# Create a symlink
|
|
ln -s ~/.local/bin/pcb-expose-official.sh ~/.local/bin/pcb-expose.sh
|
|
```
|
|
|
|
By default it looks for `~/UVtools/UVtoolsCmd`. Override with:
|
|
|
|
```bash
|
|
export UVTOOLSCMD=~/UVtools/UVtoolsCmd
|
|
```
|
|
|
|
### 3. Usage
|
|
|
|
Same interface as Option A (minus `--invert-polarity`, which the official
|
|
`FileArray` property doesn't support per-file):
|
|
|
|
```bash
|
|
pcb-expose.sh ~/proj/kicad2msla/Dummy.pm4n \
|
|
~/proj/kicad2msla/gerbers/Flow_Controller_Panel-Front.gtl \
|
|
--invert --mirror --exposure 120 \
|
|
--output ~/proj/kicad2msla/Flow_Controller_Panel-Front.pm4n
|
|
```
|
|
|
|
Internally this runs:
|
|
|
|
```bash
|
|
UVtoolsCmd run Dummy.pm4n PCBExposure \
|
|
-p FileArray=Board-F.Cu.gtl \
|
|
-p InvertColor=true \
|
|
-p Mirror=true \
|
|
-p ExposureTime=120 \
|
|
--output Board-F.Cu.pm4n
|
|
```
|
|
|
|
---
|
|
|
|
## Files in this bundle
|
|
|
|
| File | Purpose |
|
|
|---|---|
|
|
| `pcb-expose.patch` | `git apply`-able patch adding the `pcb-expose` command (Option A) |
|
|
| `pcb-expose-patched.sh` | Wrapper for the patched local build |
|
|
| `pcb-expose-official.sh` | Wrapper for the official release using `run` + `FileArray` |
|