X3DProductStructureChildNode : X3DChildNode {
  default-container-field: children
  SFString [in,out] name ""
    change: chNone
}

CADAssembly : X3DGroupingNode, X3DProductStructureChildNode {
  SFString [in,out] name           ""
    change: chNone
}

CADFace : X3DProductStructureChildNode, X3DBoundedObject {
  SFNode   [in,out] shape      NULL
    range: X3DShapeNode, LOD, Transform
  SFVec3f  []       bboxCenter 0 0 0
    range: (-Inf, Inf)
  SFVec3f  []       bboxSize   -1 -1 -1
    range: [0, Inf) or -1 -1 -1
}

CADLayer : X3DGroupingNode {
  SFString [in,out] name           ""
    change: chNone
  # MFBool   [in,out] visible        [] # X3D 4 removed it, in favor of "SFBool visible" at X3DGroupingNode; we just follow X3D 4 spec for all X3D versions, for simplicity
}

CADPart : X3DGroupingNode, X3DProductStructureChildNode {
  SFVec3f    [in,out] center           0 0 0
    range: (-Inf,Inf)
    change: chTransform
  SFString   [in,out] name             ""
    change: chNone
  SFRotation [in,out] rotation         0 0 1 0
    range: [-1,1] or (-Inf,Inf)
    change: chTransform
  SFVec3f    [in,out] scale            1 1 1
    range: (0,Inf)
    change: chTransform
  SFRotation [in,out] scaleOrientation 0 0 1 0
    range: [-1,1] or (-Inf,Inf)
    change: chTransform
  SFVec3f    [in,out] translation      0 0 0
    range: (-Inf,Inf)
    change: chTransform
}

IndexedQuadSet : X3DComposedGeometryNode {
  MFInt32 [in]     set_index       []
    range: [0,Inf)
    not-slim
  MFInt32 []       index           []
    range: [0,Inf)
    change: chGeometry
}

QuadSet : X3DComposedGeometryNode {
}
