Part Snapping Language Extension
Specification
Maintained by: The LDraw.org Standards Committee
Writer: Roland Melkert, Orion Pobursky
Revision: 1, XX-XXX-XXXX
Author's Note: This is a unofficial specification, not yet ratified by the LSC
Part snapping metas
Part snapping metas are currently exclusively used combined with shadow library files in order to add extra information to LDraw part files. This information is needed by LDCad to calculate possible 'LEGO like' part placement positions.
These metas basically describe hotspots and their shapes which then will be used to test against each other while adding a new part to the current model. This will be done for all snap info on both the source and destination brick(s) in order to find the best / closest match (e.g. an axle pin into a beam hole).
The SNAP_CLEAR meta
The clear meta is used to flush all or part of the inherited snap information gathered for the current part file so far. This meta might be needed to replace inherited information in order to extend it or increase its detail. Like e.g. information obtained from an axle primitive because that primitive is used as part of a bigger shape inside this file.
Example
0 !SNAP_CLEAR [id=axleHole]
Properties
Property | Type | Default | Description |
---|---|---|---|
id | string | Used to only clear information obtained from snap info using the given freely named ID. Leave it empty to clear all information for the current part. |
The SNAP_INCL meta
The include meta is used to add the information from another shadow library file to this part too. This is done non recursively.
Example
0 !SNAP_INCL [ref=connhole.dat] [pos=-50 10 0] [ori=0 -1 0 0 0 -1 1 0 0] [grid=C 1 C 3 20 20]
Properties
Property | Type | Default | Description |
---|---|---|---|
ID | string | Optional identifier which can be used in clear metas to optionally drop this meta's information in higher level parts using it. | |
pos | vector | Position of the included information / object. | |
ori | 3x3 matrix | Orientation transformation to apply to the included information / object. | |
scale | vector | Optional scaling vector to apply to the included information / object | |
ref | ldrawRef | Reference to the source shadow library file. Must only use local part references. | |
grid | mixed array |
Defines a grid pattern to use for multiple placement / inclusion of the referenced file. The grid uses the orientation stated in the ori parameter. As LDraw part data is Y-axis orientated only the X and Z grid stepping values need to be given like so: Xcnt Zcnt Xstep Zstep for example: 4 8 20 20 which could be used to make a 4x8 grid of e.g. studs. Optionally each count value can be preceded by a C character indicating the grid should be centered on that axis. If no C is given the axis will add to the pos parameter. For example to center the 4x8 grid around its pos parameter use: C 4 C 8 20 20 |
The SNAP_CYL meta
The cylinder meta is the main workhorse among the snap info metas. This because it describes holes and pens which is what LEGO is all about. If you take a good look at some LEGO bricks you'll notice all of them have similar interlocking holes and pens. The only real difference between them are the diameters and pattern of the hole/pens shapes (like the side of a key). It is this information that the cylinder meta tries to capture in order to calculate matching pairs.
Example
0 !SNAP_CYL [id=connhole] [gender=F] [caps=none] [secs=R 8 2 R 6 16 R 8 2] [center=true] [slide=true] [pos=0 0 0] [ori=1 0 0 0 1 0 0 0 1]
Properties
Property | Type | Default | Description |
---|---|---|---|
ID | string | Optional identifier which can be used in clear metas to optionally drop this meta's information in higher level parts using it. | |
group | string | optional group identifier. Can be used to limit potential matches to only snap info having the same group string. Can be used to prevent unwanted matches when very complicated shapes are involved e.g. click rotation holes etc. | |
pos | vector | Position of this shape. | |
ori | 3x3 matrix | Orientation of this shape. | |
scale | enum | none |
Defines how scaled references to the master (official) part should be handled information inheritance wise. Must be one of the following:
|
mirror | enum | cor |
Defines how mirrored references to the master (official) part should be handled information inheritance wise. Must be one of the following:
|
gender | enum | male | Sets the gender of the cylinder shape M for male (pen) and F for female (hole). |
secs | mixed array |
Describes the shape of the hole (along the neg Y-axis) or pen by a sequence of shape variants, radius's and lengths. The info must be given in blocks of: shapeVariant radius length where shapeVariant must be one of the following:
For example a plain stud can be described using a single block: R 8 4 while a technic beam hole needs three: R 8 2 R 6 16 R 8 2. | |
caps | enum | one |
Defines the ends of the shape, must be one of the following:
|
grid | mixed array |
Defines a grid pattern to use for multiple placement of this cylindrical shape. The grid uses the orientation stated in the ori parameter. As all snap info is Y-axis orientated only the X and Z grid stepping values need to be given like so: Xcnt Zcnt Xstep Zstep for example: 4 8 20 20 which could be used to make a 4x8 grid of e.g. studs. Optionally each count value can be preceded by a C character indicating the grid should be centered on that axis. If no C is given the axis will add to the pos parameter. For example to center the 4x8 grid around it's pos parameter use: C 4 C 8 20 20 | |
center | boolean | false | Indicates if this cylinder shape should be centered at its position or not. |
slide | boolean | false |
Indicates if this cylinder shape should be considered 'smooth' enough to make sliding of matching parts possible. If ether part of a matched pair of snap info metas has the slide option set to true the user will be able to slide them together. If not it will just 'snap'. Be careful while setting this option as it can cause unwanted sliding of e.g. a stud inside an anti stud. In practice it is best to limit the slide=true value to things you know will slide most of the time (e.g. clips, bush and gear parts etc). |
The SNAP_CLP meta
The clip meta is used to describe all clip like shapes. Clips are always of the female gender and will be tested against male cylinder shapes.
Example
0 !SNAP_CLP [radius=4] [length=8] [pos=0 0 0] [ori=1 0 0 0 1 0 0 0 1] [center=true]
Properties
Property | Type | Default | Description |
---|---|---|---|
ID | string | See cylinder meta. | |
pos | vector | See cylinder meta. | |
ori | 3x3 matrix | See cylinder meta. | |
radius | float | 4.0 | Inner radius of the clip while in rest. |
length | float | 8.0 | Length or width of the clip's (partial) hole. |
center | boolean | See cylinder meta. | |
slide | boolean | See cylinder meta. | |
scale | enum | none | See cylinder meta. |
mirror | enum | none | See cylinder meta. |
The SNAP_FGR meta
The fingers meta is used to describe all the interlocking finger like shapes. finger shapes will only be tested among them selves.
Example
0 !SNAP_FGR [group=lckHng] [genderOfs=M] [seq=4.5 8 4.5] [radius=6] [center=true] [pos=-30 10 0] [ori=1 0 0 0 0 1 0 -1 0]
Properties
Property | Type | Default | Description |
---|---|---|---|
ID | string | See cylinder meta. | |
group | string | See cylinder meta. | |
pos | vector | See cylinder meta. | |
ori | 3x3 matrix | See cylinder meta. | |
genderOfs | enum | male | Indicates the gender of the first finger of the shape, must be ether M for male or F for female. |
seq | float array | Defines the width of each finger by a sequence of floats. | |
radius | float | Outer radius of the finger (tip). these are usually beveled and thus the main snapping parameter. | |
center | boolean | See cylinder meta. | |
scale | enum | none | See cylinder meta. |
mirror | enum | none | See cylinder meta. |
The SNAP_GEN meta
The generic meta is used to describe very oddly shaped things which in practice only have a few counter parts. Things like electric plugs and window glass etc.
Matching is done only among generic metas themselves based on the group name alone. But the bounding information will influence the best candidate selection when multiple pairs are located closely together.
Example
0 !SNAP_GEN [group=nxtc] [gender=M] [pos=0 -1.5 1.5] [ori=1 0 0 0 0 1 0 -1 0] [bounding=box 12.5 16.5 8]
Properties
Property | Type | Default | Description |
---|---|---|---|
ID | string | See cylinder meta. | |
group | string | See cylinder meta. | |
pos | vector | See cylinder meta. | |
ori | 3x3 matrix | See cylinder meta. | |
gender | enum | male | See cylinder meta. |
bounding | mixed array |
Defines a bounding shape which will be used in the 'best pair candidate' calculations. Is needed because the positional alone will might cause unwanted matches otherwise. There are several types of bounding shapes, namely:
| |
scale | enum | none | See cylinder meta. |
mirror | enum | none | See cylinder meta. |