Provided by: inventor-doc_2.1.5-10-18_all bug

NAME

       SoBaseKit — base class for all node kits

INHERITS FROM

       SoBase > SoFieldContainer > SoNode > SoBaseKit

SYNOPSIS

       #include <Inventor/nodekits/SoBaseKit.h>

          Parts from class SoBaseKit:

     (SoNodeKitListPart)  callbackList

          Methods from class SoBaseKit:

                              SoBaseKit()
     static const SoNodekitCatalog *
                              getClassNodekitCatalog() const
     virtual const SoNodekitCatalog *
                              getNodekitCatalog() const
     virtual SoNode *         getPart(const SbName &partName, SbBool makeIfNeeded)
     SbString                 getPartString(const SoBase *part)
     virtual SoNodeKitPath *  createPathToPart(const SbName &partName, SbBool makeIfNeeded, const
                                   SoPath *pathToExtend = NULL)
     virtual SbBool           setPart(const SbName &partName, SoNode *newPart)
     SbBool                   set(char *partName, char *parameters)
     SbBool                   set(char *nameValuePairs)
     static SbBool            isSearchingChildren()
     static void              setSearchingChildren(SbBool newVal)
     static SoType            getClassTypeId()

          Methods from class SoNode:

     void                setOverride(SbBool state)
     SbBool              isOverride() const
     SoNode *            copy(SbBool copyConnections = FALSE) const
     virtual SbBool      affectsState() const
     static SoNode *     getByName(const SbName &name)
     static int          getByName(const SbName &name, SoNodeList &list)

          Methods from class SoFieldContainer:

     void                setToDefaults()
     SbBool              hasDefaultValues() const
     SbBool              fieldsAreEqual(const SoFieldContainer *fc) const
     void                copyFieldValues(const SoFieldContainer  *fc,  SbBool  copyConnections  =
                              FALSE)
     void                get(SbString &fieldDataString)
     virtual int         getFields(SoFieldList &resultList) const
     virtual SoField *   getField(const SbName &fieldName) const
     SbBool              getFieldName(const SoField *field, SbName &fieldName) const
     SbBool              isNotifyEnabled() const
     SbBool              enableNotify(SbBool flag)

          Methods from class SoBase:

     void                ref()
     void                unref() const
     void                unrefNoDelete() const
     void                touch()
     virtual SoType      getTypeId() const
     SbBool              isOfType(SoType type) const
     virtual void        setName(const SbName &name)
     virtual SbName      getName() const

          Macros from class SoBaseKit:

     SO_GET_PART(kit, partName, partClass)
     SO_CHECK_PART(kit, partName, partClass)

DESCRIPTION

       This  is  the  base  class  from  which  all nodekit nodes are derived. Nodekits provide a
       convenient mechanism for creating groups of scene graph nodes with  some  larger  meaning.
       When  you  create a shape node such as an indexed face set, for example, you almost always
       precede it with a coordinate node. You may also want to add a transform  node  or  specify
       properties  with  material, drawing style, material binding, etc. Instead of creating each
       of these nodes individually and then arranging them into a subgraph, you can use a nodekit
       of the appropriate type (in this case, SoShapeKit).

       Each class of nodekit has a nodekit catalog (SoNodekitCatalog) that describes the nodes in
       the subgraph, referred to as  parts.  The  catalog  has  an  entry  for  each  part,  with
       information  such  as  the partName, partType, and nullByDefault (if FALSE the constructor
       creates it). The catalog also describes the arrangement of parts in the  subgraph.  (Other
       information  is  described  below;  a  complete  description  is  in  the SoNodekitCatalog
       reference page.)

       If we regard the scene graph arrangement as a branching tree, then the top node (root)  of
       the  arrangement  is  always  the  nodekit  itself. The leaf nodes are those at the bottom
       (containing no children). Some leaves of the tree are defined in the catalog to be  public
       parts,  while  other leaves are private. All non-leaf parts are considered internal to the
       nodekit structure and are marked  private.  Public  parts  are  accessible;  they  may  be
       requested,  changed,  or  set  by  the programmer with member functions such as getPart().
       Private parts are not accessible, so methods such as getPart()  will  have  no  effect  on
       them. For example, if you call getPart() to retrieve a private part, NULL will be returned
       even when the part exists.

       Every nodekit reference page has a Parts section describing the function  of  each  public
       part  it  adds to those inherited from its parent class. Also, a Catalog Parts section has
       tables of often-needed information from  the  catalog  (part  type,  etc.).  These  tables
       include  all  public parts, both new and inherited. Only the public parts of a nodekit are
       described in  the  reference  pages.  Nodekits  take  care  of  the  rest  for  you;  they
       automatically  arrange  the  subgraph,  creating  and  deleting  the  private  parts  when
       necessary. (The SoNodekitCatalog reference page has methods for finding out the part names
       and arrangement of all parts, both public and private.)

       The  nodekit catalog is a template shared by all instances of a class. They use the shared
       catalog as a guide when  creating  parts  (i.e.,  constructing  actual  nodes),  but  each
       instance  stores  its  own parts separately. Moreover, nodekits are not SoGroup nodes, and
       parts are added as hidden children;  you  can  only  access  parts  with  the  methods  of
       SoBaseKit and its derived classes.

       Any  public  part may be retrieved with getPart(), installed with setPart(), or removed by
       giving a NULL argument to setPart(). Paths from the nodekit down to a part can be  created
       by createPathToPart().

       By  default,  parts  are  not created until the user requests or sets them. This keeps the
       subgraph uncluttered and efficient for traversal. Additionally, removing a  part  (setting
       it to NULL) has the extra effect of removing any internal parts that are no longer needed.

       Since nodekits hide their children, any SoPath containing nodekits will end at the topmost
       nodekit. However, since nodekits may be nested within other nodekits, you may wish to cast
       an  (SoPath  *)  into an (SoNodeKitPath *). The methods of SoNodeKitPath allow you to view
       all nodekits that lie on the path (see the reference page for SoNodeKitPath).

       Public parts in the nodekit catalog fall into three categories:

       [1] regular nodes

       [2] nodekits, or nested nodekits (which may nest recursively). Any node which is public in
       a  nested  nodekit  is  accessible  to  the  higher level nodekit(s) that contains it. The
       description of getPart() below  shows  how  to  refer  to  nested  parts  by  name  (e.g.,
       "appearance.material").  This  works  for any nodekit method that takes a part name for an
       argument.

       [3] lists, or list parts. These  parts  group  together  children  (list  elements)  of  a
       particular  type  or  types. As with nested nodekits, you can refer to individual elements
       using notation described in getPart() (e.g., "childList[0]", or if the list  elements  are
       in turn nodekits, "childList[2].transform").

       When  the  catalog denotes that a part is a list, the part itself is always a node of type
       SoNodeKitListPart. The  catalog  specifies  a  set  of  permissible  listItemTypes  and  a
       listContainerType  for  that part. It gives this information to the SoNodeKitListPart when
       it creates it. From then on, the list part will enforce type  checking.  So  even  if  you
       retrieve  the  SoNodeKitListPart  with  getPart(),  you  will  not  be able to add illegal
       children. (See the SoNodeKitListPart reference page for more information). As an  example,
       the callbackList part of SoBaseKit has an SoSeparator container and allows only SoCallback
       and SoEventCallback nodes in the list. Children may be added, retrieved, and removed  from
       an  SoNodeKitListPart  node  using  methods that parallel those of SoGroup. However, type-
       checking is strictly enforced.

       Note that, although all public parts are leaves in the nodekit catalog, you  are  free  to
       add  children  to  them (assuming that they are groups, nodekits, or list parts). A part's
       status as a leaf in the catalog just means that the nodekit will  not  manage  the  part's
       children.  For  example,  SoWrapperKit  has  a  part  called  contents with a part type of
       SoSeparator. You can put whatever you want underneath the separator, as long  as  contents
       itself is an SoSeparator.

       Thus,  a nodekit only controls a section of the scene graph. Above and below that section,
       anything goes.

       However, when nodekits are nested, they effectively create a larger `known' section of the
       scene  graph. For example, the appearance part of the SoSeparatorKit is a leaf node in the
       SoSeparatorKit catalog. But appearance is in turn  an  SoAppearanceKit,  containing  parts
       such  as material and drawStyle. The two nodekits combine to make an even larger template,
       which the SoSeparatorKit can examine by looking at the catalogs for both  classes.  So  an
       SoSeparatorKit  can  successfully  return  a  part  named  "material";  first it finds (or
       creates) the appearance part, then it gets  the  material  by  calling  getPart()  on  the
       appearance.

       When  the  catalog  defines the listItemTypes of a list part to be nodekits, the name-able
       space expands further. For example, SoSeparatorKit has a part childList which permits only
       SoSeparatorKits,   so   each  list  element  can  be  further  searched.  Hence  the  name
       "childList[0].childList[1].childList[2].material" is perfectly legal.

PARTS

     (SoNodeKitListPart)  callbackList
          This is the only part that the base class SoBaseKit creates. It is a public  part  that
          is inherited by all nodekits. It provides an easy way to add callbacks for a nodekit to
          use during action traversal (e.g. SoHandleEventAction). It  is  a  list  part  and  may
          contain numerous SoCallback and/or SoEventCallback nodes.

METHODS

                              SoBaseKit()
          Constructor.

     static const SoNodekitCatalog *
                              getClassNodekitCatalog() const
          Returns the SoNodekitCatalog for the class SoBaseKit.

     virtual const SoNodekitCatalog *
                              getNodekitCatalog() const
          Returns  the  SoNodekitCatalog for this instance of SoBaseKit. While each instance of a
          given class creates its own distinct  set  of  parts  (which  are  actual  nodes),  all
          instances share the same catalog (which describes the parts but contains no actual node
          pointers).

     virtual SoNode *         getPart(const SbName &partName, SbBool makeIfNeeded)
          Searches the nodekit catalog (and those of all nested  nodekits)  for  the  part  named
          partName.  Returns  a  pointer to the part if a match is found, the part is public, and
          the part has already been built. If no match is found, or if the part is private,  NULL
          is  returned.  If  partName  is  in  the  catalog (or that of one of its nested nodekit
          parts), but the part has not been built yet, the argument makeIfNeeded  determines  the
          course  of  action.  When makeIfNeeded is FALSE, NULL is returned; when makeIfNeeded is
          TRUE, getPart() will create the part (as well as any necessary intermediary parts), put
          it in the correct place, and return a pointer to the newly created part.

          Elements  of  list  parts  and  parts  within nested nodekits can all be retrieved with
          getPart() The full syntax for legal partName arguments is given below.

          Part name BNF notation:

          partName = singleName | compoundName

          compoundName = singleName | compoundName.singleName

          singleName = singlePartName | singleListElementName

          singlePartName = the name of any single part in the catalog (including those  that  are
          lists or nodekits), or in the recursively nested catalogs of any of its parts.

          singleListElementName = singleListName[index]

          singleListName  =  the  name  of  any  single  list-type part in the catalog, or in the
          recursively nested catalogs of any of its parts.

          index = integer

          Examples of valid part names are:

          "transform",       "appearance.material",       "childList[2].drawStyle",       "foot",
          "bird.leftLeg.foot", "octopus.leg[4].suctionCup[2].material"

     SbString                 getPartString(const SoBase *part)
          Given a node or a path to a node, checks if the part exists in the nodekit, in a nested
          nodekit, or an element of a list part. If so, returns  a  string  describing  the  part
          name; otherwise, returns an empty string ("").

     virtual SoNodeKitPath *  createPathToPart(const SbName &partName, SbBool makeIfNeeded, const
                                   SoPath *pathToExtend = NULL)
          Returns a path that begins at this nodekit and ends at partName. Searching for the part
          is  the  same  as  in  getPart().  NULL  is returned if partName cannot be found, or if
          makeIfNeeded is FALSE and the part is not yet built. If the the part is  retrieved  and
          the  argument  pathToExtend  is  NULL,  the  path  returned  begins at this and ends at
          partName. If pathToExtend is not NULL, the path created is a copy of pathToExtend  with
          entries appended all the way down to partName. It is okay for pathToExtend to go beyond
          the nodekit; extra nodes will be popped off the tail before continuing from  this  down
          to partName.

     virtual SbBool           setPart(const SbName &partName, SoNode *newPart)
          Inserts  the  given  node  (not  a  copy)  as  the  new part specified by partName. See
          getPart() for the syntax of partName. This method adds any extra nodes  needed  to  fit
          the part into the nodekit's catalog. For example, if you call:
               mySepKit->setPart("childList[0]", myNewChild);
          the  kit  may  need to create the part childList before it can install myNewChild. Run-
          time type checking verifies that the node type of newPart matches the type  called  for
          by partName. For example, if partName was a material for an SoSeparatorKit, but newPart
          was an SoTransform node, then the node would not  be  installed,  and  FALSE  would  be
          returned.

          If newPart is NULL, then the node specified by partName is removed. If this renders any
          private parts useless (as occurs when you remove the last child of  an  SoGroup  node),
          they will also be removed. Hence nodekits do not retain unnecessary nodes.

          TRUE is returned on success, and FALSE upon error.

     SbBool                   set(char *partName, char *parameters)
     SbBool                   set(char *nameValuePairs)
          These  functions  allow  field  values  of  parts  (nodes)  to  be set. If partName and
          parameters are used, then a single part is specified by partName; the field values  are
          specified  in  parameters. The format of paramaters is the Inventor File Format syntax.
          For example,
               mySepKit->set("material", "diffuseColor 1 0 0 shininess 0.6");
          sets the part material to the values "diffuseColor 1 0 0  shininess  0.6".  The  values
          used  in  parameters  must of course be appropriate for the node-type to which partName
          belongs. In this case, the nodekit SoSeparatorKit has a part named material which is of
          type SoMaterial.

          The  nameValuePairs  syntax  can  be  used to set the field values in several different
          parts simultaneously. In this case, the argument string, nameValuePairs contains  name-
          value pairs: "partName1 { parameters1 } ... partNameN { parametersN }".

          For example,
               mySepKit->set("material { diffuseColor 1 1 1 }
                           transform { translation 4 3 .6 }");
               mySepKit->set("childList[0].material { ambientColor .5 .5 .5 }");

     static SbBool            isSearchingChildren()
     static void              setSearchingChildren(SbBool newVal)
          Sets  and  queries if nodekit children are searched during SoSearchAction traversal. By
          default, they are not.

     static SoType            getClassTypeId()
          Returns type identifier for this class.

MACROS

       SO_GET_PART(kit, partName, partClass)
          Calls getPart() with makeIfNeeded set to TRUE,  then  casts  the  result  to  the  type
          partClass.  Note  that in the debug library, this macro checks to see if the part is of
          type partClass, while the regular library does no type checking.

     SO_CHECK_PART(kit, partName, partClass)
          Calls getPart(), but with makeIfNeeded set to FALSE, then casts the result to the  type
          partClass.  Note  that in the debug library, this macro checks to see if the part is of
          type partClass, while the regular library does no type checking.

ACTION BEHAVIOR

       SoGLRenderAction, SoCallbackAction, SoGetBoundingBoxAction, SoHandleEventAction
          Behaves like an SoGroup. Traverses each child in order.

     SoRayPickAction
          Traverses each child in order. Then, for any pick containing the kit on its path, makes
          an   SoNodeKitDetail   as   follows:   Sets   the   "detailNodeKit"  (retrievable  with
          SoNodeKitDetail::getNodeKit()) to  be  a  pointer  to  itself.  Sets  the  "detailPart"
          (retrievable  with  SoNodeKitDetail::getPart())  to be a pointer to the kit's leaf-most
          part  that  lies  on  the  pickPath.  Sets  the  "detailPartName"   (retrievable   with
          SoNodeKitDetail::getPartName())  to  be  the  partName  of  that  part, as found in the
          catalog.

          Does not descend into nested nodekits. Each nodekit along the path is the  "detailPart"
          in  its  parent's detail. However, if the pick path goes through a list part, a pointer
          to the child is used  for  the  "detailPart",  and  "detailPartName"  is  of  the  form
          "listName[i]".

     SoGetMatrixAction
          Behaves like an SoGroup. Does nothing unless the kit is in the middle of the path chain
          the action is being applied to. If so, the children up to and including the  next  node
          in the chain are traversed.

     SoSearchAction
          First, searches itself like an SoNode. Then, checks the value of isSearchingChildren().
          If TRUE, traverses the children in order. If FALSE, returns.

     SoWriteAction
          Begins by writing out regular fields, then writes out the parts.  A  nodekit  does  not
          write out its parts the way an SoGroup writes out its children. Instead, it writes each
          part as an SoSFNode field. First the partName is written, then the node being used  for
          that part.

          To keep the files terse, nodekits write out as few parts as possible. However, nodekits
          always write a part if another instance or a path is writing it. If  this  is  not  the
          case, parts are left out according to the following rules:

          [1] NULL parts only write if the catalog states they are created by default.

          [2] Empty SoGroup and SoSeparator nodes do not write.

          [3] Non-leaf parts only write if they have non-default field values.

          [4]  List  parts  only  write  if  they have children or if the container node has non-
          default field values.

          [5] Nested nodekit parts only write if they need to write one or more parts, or if they
          have non-default field values.

CATALOG PARTS

       ┌────────────────────────────────────────────────────────┐
       │                       All parts                        │
       │                                                NULL by │
       │Part Name      Part Type         Default Type   Default │
       │                                                        │
       │callbackList   NodeKitListPart   --               yes   │
       │                                                        │
       └────────────────────────────────────────────────────────┘
       ┌───────────────────────────────────────────────────────────────┐
       │      Extra information for list parts from above table        │
       │                                                               │
       │Part Name      Container Type   Permissible Types              │
       │                                                               │
       │callbackList   Separator        Callback, EventCallback        │
       │                                                               │
       └───────────────────────────────────────────────────────────────┘

FILE FORMAT/DEFAULTS

       BaseKit {
          callbackList  NULL
     }

SEE ALSO

       SoAppearanceKit,  SoCameraKit,  SoLightKit, SoNodeKit, SoNodeKitDetail, SoNodeKitListPart,
       SoNodeKitPath, SoNodekitCatalog, SoSceneKit, SoSeparatorKit, SoShapeKit, SoWrapperKit

                                                                                 SoBaseKit(3IV)()