export · diff

git:20260920.03973a5 to git:20261005.4e1901c

29 added, 1 removed. Audit A to A.

---
name: export
description: Write a CAD file out of an object a PartCAD package declares - STEP, BREP, STL, 3MF, OBJ, IGES, glTF, three.js, URDF for 3D, SVG or DXF for a sketch, or a file type the package implements itself - using `pc export`, which changes nothing in `partcad.yaml`. Use for /pc:export or when the user asks to export, save out, dump, hand off, or produce a CAD file of a part, sketch, assembly or whole package - for a printer, a supplier, a simulator, or another CAD tool. For a bare file with no package use /pc:convert; for a 2D picture use /pc:render.
---
# pc:export
Write geometry out of a package, leaving the package exactly as it was.
`$ARGUMENTS` says what to export and to what.
`pc export` is the close sibling of `pc convert`, and the difference is the whole
reason to know both:
| | writes a file | changes `partcad.yaml` | formats |
| --- | --- | --- | --- |
| `pc export` | yes | **no** | more — `urdf`, plus any a package implements itself |
| `pc convert` | yes | **yes** — the object *becomes* the new format | a fixed list per kind |
So this is what to use whenever someone wants a file *out* of a package — to
print, to quote, to import somewhere else — which is nearly always what "export
it as STEP" means. `/pc:convert` is for the rarer case where the object itself
should stop being what it is.
## 1. Work out which case you are in
Do this before running anything. It is the same first step in `/pc:convert` and
`/pc:render`.
1. **Is there a package?** PartCAD searches upward for `partcad.yaml`, so look in
the current directory and above. `pc --no-ansi list` lists what the package
holds; if there is no package it says so.
2. **Does the reference name an object?** Check it against
`pc --no-ansi list parts` / `list sketches` / `list assemblies`.
`pc --no-ansi info <name>` succeeds only for an object that resolves.
3. **Does a file the user named belong to an object?** Someone who says "export
`bracket.step` as STL" inside a package usually means the part built from it.
Read `partcad.yaml` and look for an object whose `path:` is that file — and
note that a file-backed object *without* a `path:` is `<name>` plus the type's
extension, so a part `bracket` of type `step` is `bracket.step` whether or not
the path is written down.
**If 2 or 3 matched, it is an object: use `pc export` (§3).**
**If there is no package, or the file is not one an object is built from, there
is nothing to export from.** A bare file is converted, not exported: hand it to
`pc adhoc convert` — that is `/pc:convert` §4, and it is the ad-hoc equivalent of
this skill, since it too writes a file and changes no package.
## 2. Make sure PartCAD is available
Resolve a command as `/pc:init` does (`pc`, then `partcad`, then
`python -m partcad_cli.click.command`). If none is found, stop and run
`/pc:setup executable` first.
Pass `--no-ansi` on every run so the output is plain text. It is a global flag
and goes before the subcommand, and it routes the logs to **stderr** — so
capture both streams when reading them: `pc --no-ansi export ... 2>&1`.
## 3. Export
```sh
mkdir -p ./out # -O expects the directory to exist
pc --no-ansi export -t stl -O ./out bracket # a part
pc --no-ansi export -t step -O ./out -a gearbox # an assembly (-a)
pc --no-ansi export -t dxf -O ./out -s outline # a sketch (-s)
pc --no-ansi export -t stl -O ./out -P //pub/std bolt # an object in another package
```
Formats: `step`, `brep`, `stl`, `3mf`, `threejs`, `obj`, `gltf`, `iges`, `urdf`,
`svg`, `dxf`, plus any file type a package implements itself. `-t urdf` writes a
`.urdf` plus the directory of mesh files it references — it is the one that
produces more than one file.
`svg` and `dxf` are the flat pair, and are what a **sketch** exports to: a sketch
is already 2D, so this is its geometry and not a picture of it. A part or an
assembly accepts them as well, but what comes back is a projection — if that is
what is wanted, `/pc:render` is the command that says so, and the viewing-angle
options exist only there.
Useful options:
- `-O <dir>` — where the files go. The directory must exist; add `-p` to create
the structure a configured output path needs.
- **No object name** exports everything the package declares; a `...` suffix on
the package (`-P //...`) walks the imported packages too, and `...:<name>`
exports every object of that name from here down. Say what that will produce
before running it on a package that imports the public index.
- `-e <package>` — read another package's `export:` options and implementations,
which is how one package's exporter is applied to another's objects.
Each file is named after the object, so exporting several objects into one
directory is safe — unlike several *views* of one object, which is `/pc:render`.
If the format the user asked for is not in the list, check whether the package
implements it: read the `export:` and `render:` sections of `partcad.yaml`. A
package can declare a file type of its own, and it is then nameable with `-t`
like any other.
- ## 4. Report what happened
+ ## 4. Exporting part of an assembly
+
+ `--filter` keeps only some of the links of an assembly or a scene, so one
+ sub-assembly can be exported without a declaration for it. It takes a JSON or
+ YAML *file* naming the links, or the same written out on the command line:
+
+ ```sh
+ pc --no-ansi export -a -t step -O ./out --filter ./head.yaml logo
+ pc --no-ansi export -a -t step -O ./out --filter '[bone1, bone2]' logo
+ ```
+
+ A link the filter names is kept and a link it does not name is dropped; a link
+ named with nothing under it keeps everything under it, and a link named with
+ children under it keeps those children only. The names are the ones the Assembly
+ YAML file uses, which are the names a `connect:` uses — read the `.assy` file to
+ find them. Everything kept stays where the whole assembly put it.
+
+ The object has to be named, with `-a` or `-S` for its kind: a part has no links,
+ and neither has a whole package. The file written is the one an unfiltered export
+ would have written, under the object's own name, so send two filters of one object
+ to directories of their own with `-O`.
+
+ Nothing is written into the package. A `filter:` on an `export:` file type in
+ `partcad.yaml` asks for the same thing permanently, per file type, which is what
+ the user wants when the subset should be exported every time; and
+ `pc filter FILTER SRC DST` makes the subset an object of the package, which is
+ what they want when it should have a name.
+
+ ## 5. Report what happened
Name the files that were written, with their paths — all of them for `-t urdf`
or a whole-package export, or a count plus the directory when there are many.
State that `partcad.yaml` is unchanged, since that is the property that makes
this command the right one. If PartCAD printed an error, surface it verbatim.