Legacy SKP Format (SketchUp 3–2020)¶
SketchUp save targets from version 3 through 2020 use a pre-ZIP serialized object graph. SketchUp 2021 and later use the ZIP/VFF container described in Modern SKP format.
This page is the entry point for legacy-format users and contributors. Detailed wire layouts have been moved into focused references:
Reference |
Contents |
|---|---|
Header, strings, version map, references, primitive values, and root order |
|
Class-to-model mapping and schema tables by save generation |
|
Confirmed entity, material, scene, and rendering fields |
Evidence and scope¶
The implementation is an independent interoperability effort based on files created through documented public APIs, user-owned compatibility samples, and observable file behavior. These notes are not an official specification.
Every statement in the detailed reference is either:
confirmed by controlled fixture generation or a cross-version sample;
required to consume a complete file without losing stream alignment; or
explicitly marked unknown or inferred.
Unobserved class/schema combinations fail with a specific legacy-format error. They are not decoded using a nearby layout.
Identifying the container¶
Both container families begin with legacy UTF-16 product and version strings. The bytes immediately after those strings distinguish them:
Property |
Legacy (3–2020) |
Modern (2021+) |
|---|---|---|
Boundary after product/version |
16-byte model identifier |
|
Main body |
Serialized object graph |
ZIP containing |
Per-file schema selection |
|
TLV tags and namespaces |
skppy.load() performs this check automatically. File extension and product
text alone are insufficient.
Parser model¶
The archive is a graph, not a list of independent records. Class definitions, class references, object references, and null values share one ordered archive session. A later entity may point to a vertex, edge, material, definition, or layer decoded earlier.
The parser therefore has three stages:
Read the header and the file’s
CVersionMap.Decode the graph while preserving archive identity and unresolved links.
Resolve links into the same public
Modelclasses used by the modern parser.
Technical archive indexes never become public entity IDs. Public IDs are allocated during model assembly and references are translated afterward.
Public model coverage¶
Legacy data |
Public |
|---|---|
Vertices, edges, loops, faces, curves, arcs |
|
Definitions, instances, groups, placed images |
Component/entity classes |
Materials, textures, embedded image data |
|
Layers and SU2020 layer groups |
|
Guides and section planes |
Construction entity classes |
Cameras and saved pages |
|
Rendering, shadows, axes, options |
Shared model metadata |
Text, dimensions, fonts, styles |
Annotation and style classes |
Attribute and relationship maps |
Public dictionaries and entity relationships |
Parser-only state is retained only when needed for graph identity, unresolved references, exact payload boundaries, or data without a lossless public owner.
Version-aware behavior¶
The file’s CVersionMap is the primary selector for body layouts. The target
generation is also required for a small number of confirmed down-save
differences, including early construction lines and section-plane names.
Important public capability boundaries include:
Capability |
First confirmed save target |
|---|---|
Entity-owned attribute dictionaries |
SketchUp 4 |
Component-instance names |
SketchUp 5 |
Model-level dictionaries |
SketchUp 7 |
Named section planes |
SketchUp 2018 |
Custom line styles |
SketchUp 2019 |
Layer folders |
SketchUp 2020 |
Generated folder membership retained by current public fixture path |
SketchUp 2021 (modern container) |
Older files keep older semantics; the parser does not synthesize a modern value merely to make versions look alike.
Validation¶
The companion skppy-tests repository generates controlled save targets with the documented SketchUp C API and runs version-aware semantic checks. Focused raw-byte tests cover wire branches that the public API cannot generate directly.
When adding legacy support:
add an independent raw fixture or controlled generated sample;
record the schema boundary in the class reference;
assert complete payload consumption;
verify the resulting public model rather than archive-only state; and
reject layouts for which evidence is incomplete.
Known boundaries¶
The legacy writer is intentionally out of scope;
skppywrites the confirmed modern container.Some historical runtime-only values have no public model counterpart and are consumed without assigning speculative names.
Interactive-only texture control points are covered by raw fixtures because the documented geometry API emits affine projections.
Embedded thumbnails are metadata and are not treated as model textures.
See the class catalog for the supported schema matrix and field layouts for confirmed details.