# Export Options The addon registers `export_scene.skp` under **File -> Export -> SketchUp (.skp)**. It converts Blender data to the public `skppy.Model` graph and writes either a modern SKP container or a genuine pre-ZIP SketchUp Make 2017 file without requiring the SketchUp SDK. The complete model is validated and serialized before the destination is replaced. A conversion or writer failure therefore leaves an existing output file untouched. ## Settings | Option | Default | Behavior | |--------|---------|----------| | **File Format** | Modern | Writes the current ZIP-based format or the legacy SketchUp Make 2017 CArchive format. | | **Objects** | Visible | Export visible objects, selected objects, or every object in the active scene. | | **Inches per Blender Unit** | 39.37007874 | Converts Blender coordinates to SketchUp's internal inch unit. Use `1` when Blender units already represent inches. | | **Apply Modifiers** | On | Uses evaluated mesh data with the current modifier stack. Unmodified shared mesh data remains one reusable SKP definition. | | **Merge Coplanar Faces** | On | Merges adjacent polygons on the same plane when their material and UV projection match. Internal edges are removed and enclosed boundaries become face holes. | | **Materials and PBR** | On | Preserves Base Color, Alpha, Metallic, and Roughness from the Principled BSDF. | | **V-Ray Materials** | Off | Generates V-Ray material graphs from Base Color, Alpha, Metallic, and Roughness while retaining the normal SketchUp appearance as a fallback. | | **Embedded Textures** | On | Embeds packed or file-backed images linked to Base Color. Procedural-only node graphs are not baked. | | **UV Coordinates** | On | Converts the active UV layer to per-face SKP projections and control points. | | **Collections as Tags** | On | Uses `skppy_layer_name` when present; otherwise uses the object's first collection. | | **Cameras and Markers** | On | Exports cameras and timeline camera markers as saved SketchUp scenes. | | **Text as Annotations** | On | Converts Blender Font objects to model-space SketchUp text annotations. | | **Custom Properties** | On | Writes scalar bool, unsigned integer, finite float, and string properties to a `Blender` attribute dictionary. | ## Geometry and instances Mesh, Curve, Surface, and Meta objects are converted to SKP mesh definitions. Objects sharing the same unmodified Blender data and material slots reuse one definition and become separate component instances with their world transforms. When modifiers change evaluated geometry, the affected object receives its own definition. Collection-instance Empty objects become component definitions containing nested instances. The Empty's world transform places the component, while the source members keep their collection-local hierarchy and Blender's `instance_offset`. This also works for source collections that are not linked directly into the active scene, where Blender may not have evaluated useful `matrix_world` values for their objects. An object linked through more than one path in the same collection hierarchy is exported once, following Blender's evaluated-instance behavior. Child mesh and nested-collection definitions are written before the collection definition that references them; this dependency order is required by official SketchUp readers. Object-parent and nested-collection cycles are rejected explicitly. Ordinary Empty objects, lights, armatures, and other object families without a direct SKP representation are counted as ignored in the completion report. Blender mesh vertices and edges remain shared inside each definition. Polygon loop direction, smooth/sharp state, material slots, and active UV data are preserved. Blender supports arbitrary per-loop UVs while one SKP face stores a single projective mapping; non-affine n-gon mappings are fitted and reported as conversion warnings. Coplanar merging only joins edge-connected polygons with matching orientation, plane, material slot, and affine UV projection. Material boundaries, UV seams, non-coplanar edges, and non-manifold boundaries therefore remain separate. Closed interior cycles are emitted as SketchUp inner loops rather than being filled. ### Edge shading For every retained mesh edge, the exporter maps Blender's actual face and edge shading state to SketchUp's public `Edge.flags`: | Blender edge state | SketchUp flags | Exported result | |--------------------|----------------|-----------------| | Exactly two adjacent smooth-shaded faces and no explicit sharp mark | `soft` + `smooth` | Smooth shared boundary | | Either adjacent face is flat-shaded | none | Hard boundary | | Explicitly marked sharp | none | Hard boundary | | Boundary edge with fewer than two adjacent faces | none | Hard, visible boundary | | Non-manifold edge with more than two adjacent faces | none | Hard boundary | This rule preserves smooth/flat transitions instead of smoothing an edge when only one adjacent polygon is smooth. It does not apply the importer's angle threshold: Blender's authored `use_smooth` and `use_edge_sharp` state is the source of truth during export. When coplanar merging removes an eligible internal edge, no SketchUp edge remains to carry shading flags; all retained edges use the mapping above. The SketchUp 2017 path writes the legacy object archive while preserving reusable component definitions, placements, geometry, transforms, edge flags, face holes, materials, textures, and tags. Modern export remains the choice for cameras, annotations, scenes, and custom properties that do not have equivalent legacy output support. ## Materials and textures The exporter reads the Principled BSDF when available and falls back to the material's viewport diffuse state. Linked Image Texture nodes are followed through intermediate nodes. Packed images and existing image files are embedded in the SKP; generated or procedural images without bytes produce a warning and leave the material untextured. Optional material custom properties `skppy_x_scale` and `skppy_y_scale` set the physical texture tile size in SketchUp inches. Both default to `1.0`. When **V-Ray Materials** is enabled, the exporter adds a deterministic `MtlSingleBRDF` -> `BRDFVRayMtl` graph to every exported material. Base colour is converted from sRGB to V-Ray's linear colour representation; opacity, metallic, and roughness remain normalized factors. The graph targets the V-Ray metadata generation observed for each output container: plugin version 23 for modern SKP and version 16 for SketchUp Make 2017. The ordinary SketchUp material and native PBR block are always written too, so SketchUp and importers without V-Ray retain a useful appearance. An embedded base-colour image is also connected through a V-Ray `TexBitmap`, `BitmapBuffer`, and `UVWGenChannel` graph. The bitmap uses the same embedded image basename and face UV channel as the native SketchUp texture. ## Tags, cameras, and text An object's `skppy_layer_name` string takes precedence over collection mapping. Otherwise the first collection becomes its SketchUp tag. Collection visibility initializes tag visibility. Every exported camera retains its projection, orientation, clipping distances, field of view, and orthographic height. A timeline marker with a camera becomes a named SketchUp scene using that camera snapshot. Font objects retain their body, world position, view direction, material, tag, visibility, and scalar custom properties. Blender font files and typography do not map directly to SketchUp's installed font registry, so the modern writer uses SketchUp's required default font unless the public model is authored with an explicit registered font. ## Validation The headless integration suite installs the packaged addon in Blender, exports a scene containing reusable meshes, a standalone collection source with an instance offset and nested transforms, smooth, sharp, boundary, and smooth/flat-transition edges, texture/UV data, PBR state, tags, text, attributes, and a camera-marker scene, then inspects the result. Separate C validators open both the modern and SketchUp 2017 Blender-generated files through the public SketchUp SDK and verify geometry, collection dependency ordering, edge flags, and container versions.