SOTRANSFORMBOXDRAGGER(3iv)

SoTransformBoxDragger(3IV) πŸ’–

okay bestie, welcome to the SoTransformBoxDragger(3IV) manual page, the main-character entry of the dragger cinematic universe ✨ no cap


NAME

SoTransformBoxDragger β€” box-like object you scale, rotate, and translate by dragging with the mouse πŸŽ€


INHERITS FROM

SoBase > SoFieldContainer > SoNode > SoBaseKit > SoInteractionKit > SoDragger > SoTransformBoxDragger

it's giving very long family tree, and every single one of those ancestors is showing up to the function πŸ’…


SYNOPSIS

#include <Inventor/draggers/SoTransformBoxDragger.h>

   Fields from class SoTransformBoxDragger:

SoSFRotation        rotation
SoSFVec3f           translation
SoSFVec3f           scaleFactor

   Fields from class SoDragger:

SoSFBool            isActive

   Fields from class SoInteractionKit:

SoSFEnum            renderCaching
SoSFEnum            boundingBoxCaching
SoSFEnum            renderCulling
SoSFEnum            pickCulling

   Parts from class SoBaseKit:

(SoNodeKitListPart)  callbackList

   Methods from class SoTransformBoxDragger:

                     SoTransformBoxDragger()
static const SoNodekitCatalog *
                     getClassNodekitCatalog() const
static SoType       getClassTypeId()

   Methods from class SoDragger:

void                addStartCallback(SoDraggerCB *f, void *userData =
                         NULL)
void                removeStartCallback(SoDraggerCB *f, void *userData =
                         NULL)
void                addMotionCallback(SoDraggerCB *f, void *userData =
                         NULL)
void                removeMotionCallback(SoDraggerCB *f, void *userData =
                         NULL)
void                addFinishCallback(SoDraggerCB *f, void *userData =
                         NULL)
void                removeFinishCallback(SoDraggerCB *f, void *userData =
                         NULL)
void                addValueChangedCallback(SoDraggerCB *f, void *userData
                         = NULL)
void                removeValueChangedCallback(SoDraggerCB *f, void
                         *userData = NULL)
SbBool              enableValueChangedCallbacks()
void                setMinGesture(int pixels)
int                 getMinGesture() const
static void         setMinScale(float newMinScale)
static float        getMinScale()

   Methods from class SoInteractionKit:

virtual SbBool      setPartAsPath(const SbName &partName, SoPath
                         *surrogatePath )

   Methods from class SoBaseKit:

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)

   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)

like, that's a whole lot of inherited slay, and honestly? we love an heirloom 🧚


DESCRIPTION

so SoTransformBoxDragger is a composite dragger shaped like a box with little cubes chillin' at the corners 🎁✨ Click and drag any of those cubes and boom, you scale the box uniformly. Drag any edge of the box and the whole dragger rotates about its center, along an axis parallel to that edge. Pick any face of the box and you get 2D translation in the plane of that face. it's giving three-in-one, the way that a single widget said "I contain multitudes" πŸ˜­πŸ’…

Although the box looks just about like a wireframe cube, bestie it is secretly composed of many different simple draggers arranged in a composite assembly. When one part gets dragged, the transformBox makes sure they all move together β€” no part left behind, periodt. Each of the parts of the box is a different dragger with the default geometry changed. The faces of the box are SoTranslate2Draggers, the edges are SoRotateCylindricalDraggers, and the cubes are an SoScaleUniformDragger. Drag them and the dragger will update its translation, rotation and scaleFactor fields to reflect the changes. As with all draggers, if you change the fields the dragger will move to match the new settings. two-way street, iconic behavior πŸ”₯

Remember: This is not an SoTransform! ⚠️ do not come for it, it is simply not that girl

If you want to move other objects with this dragger, you can either:

  • [a] Use an SoTransformBoxManip, which is subclassed from SoTransform. It creates one of these draggers and uses it as the interface to change its fields. (see the SoTransformBoxManip man page). πŸ‘‘
  • [b] Use field-to-field connections to connect the fields of this dragger to those of any SoTransformation node. πŸ¦‹

You can change the parts in any instance of this dragger using setPart(). The default part geometries are defined as resources for this SoTransformBoxDragger class. They are detailed in the Dragger Resources section of the online reference page for this class. You can make your program use different default resources for the parts by copying the file /usr/share/data/draggerDefaults/transformBoxDragger.iv into your own directory, editing the file, and then setting the environment variable SO_DRAGGER_DIR to be a path to that directory. πŸ“ yes, that is a real path, go touch grass in your own directory


FIELDS

  • SoSFRotation rotation β€” Orientation of the dragger. πŸŒ€
  • SoSFVec3f translation β€” Position of the dragger. πŸ“
  • SoSFVec3f scaleFactor β€” Scale of the dragger. πŸ”

three fields, three vibes, all of them carrying the whole look ✨


METHODS

  • SoTransformBoxDragger() β€” Constructor. the birth of a legend πŸŽ€
  • static const SoNodekitCatalog * getClassNodekitCatalog() const β€” Returns an SoNodekitCatalog for this class. the family scrapbook πŸ“–
  • static SoType getClassTypeId() β€” Returns type identifier for this class. your little ID card, bestie πŸͺͺ

CATALOG PARTS

All parts 🌈

here's the full roster β€” Part Name, Part Type, Default Type, and NULL by Default:

  • callbackList β€” Part Type: NodeKitListPart β€” Default Type: -- β€” NULL by Default: yes
  • surroundScale β€” Part Type: SurroundScale β€” Default Type: -- β€” NULL by Default: yes
  • antiSquish β€” Part Type: AntiSquish β€” Default Type: -- β€” NULL by Default: no
  • scaler β€” Part Type: ScaleUniformDragger β€” Default Type: -- β€” NULL by Default: yes
  • rotator1 β€” Part Type: RotateCylindricalDragger β€” Default Type: -- β€” NULL by Default: yes
  • rotator2 β€” Part Type: RotateCylindricalDragger β€” Default Type: -- β€” NULL by Default: yes
  • rotator3 β€” Part Type: RotateCylindricalDragger β€” Default Type: -- β€” NULL by Default: yes
  • translator1 β€” Part Type: Translate2Dragger β€” Default Type: -- β€” NULL by Default: yes
  • translator2 β€” Part Type: Translate2Dragger β€” Default Type: -- β€” NULL by Default: yes
  • translator3 β€” Part Type: Translate2Dragger β€” Default Type: -- β€” NULL by Default: yes
  • translator4 β€” Part Type: Translate2Dragger β€” Default Type: -- β€” NULL by Default: yes
  • translator5 β€” Part Type: Translate2Dragger β€” Default Type: -- β€” NULL by Default: yes
  • translator6 β€” Part Type: Translate2Dragger β€” Default Type: -- β€” NULL by Default: yes

six translators?? the way this dragger has a full entourage 😭 every single one of them is a yes on NULL by default except antiSquish, who said "not me" πŸ™ˆ

Extra information for list parts from above table πŸ’œ

  • callbackList β€” Container Type: Separator β€” Permissible Types: Callback, EventCallback

that's the only list part up there, and it's very much booked and busy πŸ’…


πŸŽ€ DRAGGER RESOURCES πŸŽ€

okay bestie, this is where it gets juicy β€” every part of the dragger is its own little resource, and you can swap each one out. let's go one by one, no skips, periodt. πŸ’…


  • transformBoxScalerScaler πŸ’–
    • Part: scaler.scaler
    • Appearance: Eight small white cubes at the corners of the box ✨
    • Description: pick this and boom β€” you're doing uniform 3D scaling of the dragger. slay.
  • transformBoxScalerScalerActive πŸ’›
    • Part: scaler.scalerActive
    • Appearance: Yellow version of the regular scaler part
    • Description: this is what shows up while the dragger is being scaled. it's the glow-up version fr.
  • transformBoxScalerFeedback
    • Part: scaler.feedback
    • Appearance: Empty separator
    • Description: this removes any feedback geometry that got created in the constructor of the SoScaleUniformDragger. it's giving "no thoughts, empty" but make it functional.
  • transformBoxScalerFeedbackActive
    • Part: scaler.feedbackActive
    • Appearance: Empty separator
    • Description: same energy β€” this removes any feedbackActive geometry created in the constructor of the SoScaleUniformDragger.
  • transformBoxRotatorRotator πŸŒ€
    • Parts:
      • rotator1.rotator
      • rotator2.rotator
      • rotator3.rotator
    • Appearance: Four white lines along the edges of the box
    • Description: pick this and rotational dragging begins, bestie. and here's the tea β€” in each of the three rotateCylindrical draggers, the lines of the rotator part are oriented parallel to the axis of rotation. iconic.
  • transformBoxRotatorRotatorActive πŸ’›
    • Parts:
      • rotator1.rotatorActive
      • rotator2.rotatorActive
      • rotator3.rotatorActive
    • Appearance: Four yellow lines along the edges of the box
    • Description: displayed while the dragger is being rotated πŸŒ€βœ¨
  • transformBoxRotatorFeedback
    • Parts:
      • rotator1.feedback
      • rotator2.feedback
      • rotator3.feedback
    • Appearance: Empty separator
    • Description: removes any feedback geometry created in the constructor of the SoRotateCylindricalDragger. bye bye extra geometry πŸ’…
  • transformBoxRotatorFeedbackActive πŸ’œ
    • Parts:
      • rotator1.feedbackActive
      • rotator2.feedbackActive
      • rotator3.feedbackActive
    • Appearance: Thin purple line through center of box
    • Description: shown to reveal the axis of rotation during rotational dragging. so you always know which way you're spinning. πŸ¦‹
  • transformBoxTranslatorTranslator 🫢
    • Parts:
      • translator1.translator
      • translator2.translator
      • translator3.translator
      • translator4.translator
      • translator5.translator
      • translator6.translator
    • Appearance: Invisible but pickable square surface
    • Description: picking these starts 2-D translational dragging within the plane of one of the sides of the box. and get this β€” the invisible squares of the six translate2Draggers are arranged to form the sides of the box. the squares are easy to discern even though they're rendered as invisible, because they're bounded by the lines of the rotational dragger parts. invisible but make it findable, iykyk. πŸ‘‘
  • transformBoxTranslatorTranslatorActive
    • Parts:
      • translator1.translatorActive
      • translator2.translatorActive
      • translator3.translatorActive
      • translator4.translatorActive
      • translator5.translatorActive
      • translator6.translatorActive
    • Appearance: Invisible square surface
    • Description: shown during 2-D translational dragging.
  • transformBoxTranslatorXAxisFeedback πŸ’œ
    • Parts:
      • translator1.xAxisFeedback
      • translator2.xAxisFeedback
      • translator3.xAxisFeedback
      • translator4.xAxisFeedback
      • translator5.xAxisFeedback
      • translator6.xAxisFeedback
    • Appearance: Short thin purple line
    • Description: only shown if the dragger is moving and the axis is a permissable direction of motion. when you press <shift>, motion gets constrained, and this only shows up if the primary motion is in the X direction. no cap.
  • transformBoxTranslatorYAxisFeedback πŸ’œ
    • Parts:
      • translator1.yAxisFeedback
      • translator2.yAxisFeedback
      • translator3.yAxisFeedback
      • translator4.yAxisFeedback
      • translator5.yAxisFeedback
      • translator6.yAxisFeedback
    • Appearance: Short thin purple line
    • Description: same deal β€” only shown if the dragger is moving and the axis is a permissable direction of motion. with <shift> held, motion is constrained, and this appears only if the primary motion is in the Y direction.

🌈 FILE FORMAT/DEFAULTS 🌈

here's the whole vibe laid out, every single default, character for character. don't touch unless you know what you're doing, bestie πŸ’–

TransformBoxDragger {
    renderCaching                 AUTO
    boundingBoxCaching            AUTO
    renderCulling                 AUTO
    pickCulling                   AUTO
    isActive                      FALSE
    rotation                      0 0 1  0
    translation                   0 0 0
    scaleFactor                   1 1 1
    callbackList                  NULL
    surroundScale                 NULL
    antiSquish                    AntiSquish {
        sizing BIGGEST_DIMENSION }

    scaler                        ScaleUniformDragger {
    }

    rotator1                      RotateCylindricalDragger {
    }

    rotator2                      RotateCylindricalDragger {
    }

    rotator3                      RotateCylindricalDragger {
    }

    translator1                   Translate2Dragger {
    }

    translator2                   Translate2Dragger {
    }

    translator3                   Translate2Dragger {
    }

    translator4                   Translate2Dragger {
    }

    translator5                   Translate2Dragger {
    }

    translator6                   Translate2Dragger {
    }

    scaler.scaler                 <transformBoxScalerScaler resource>
    scaler.scalerActive           <transformBoxScalerScalerActive resource>
    scaler.feedback               <transformBoxScalerFeedback resource>
    scaler.feedbackActive         <transformBoxScalerFeedbackActive resource>
    rotator1.rotator              <transformBoxRotatorRotator resource>
    rotator2.rotator              <transformBoxRotatorRotator resource>
    rotator3.rotator              <transformBoxRotatorRotator resource>
    rotator1.rotatorActive        <transformBoxRotatorRotatorActive resource>
    rotator2.rotatorActive        <transformBoxRotatorRotatorActive resource>
    rotator3.rotatorActive        <transformBoxRotatorRotatorActive resource>
    rotator1.feedback             <transformBoxRotatorFeedback resource>
    rotator2.feedback             <transformBoxRotatorFeedback resource>
    rotator3.feedback             <transformBoxRotatorFeedback resource>
    rotator1.feedbackActive       <transformBoxRotatorFeedbackActive resource>
    rotator2.feedbackActive       <transformBoxRotatorFeedbackActive resource>
    rotator3.feedbackActive       <transformBoxRotatorFeedbackActive resource>
    translator1.translator        <transformBoxTranslatorTranslator resource>
    translator2.translator        <transformBoxTranslatorTranslator resource>
    translator3.translator        <transformBoxTranslatorTranslator resource>
    translator4.translator        <transformBoxTranslatorTranslator resource>
    translator5.translator        <transformBoxTranslatorTranslator resource>
    translator6.translator        <transformBoxTranslatorTranslator resource>
    translator1.translatorActive  <transformBoxTranslatorTranslatorActive resource>
    translator2.translatorActive  <transformBoxTranslatorTranslatorActive resource>
    translator3.translatorActive  <transformBoxTranslatorTranslatorActive resource>
    translator4.translatorActive  <transformBoxTranslatorTranslatorActive resource>
    translator5.translatorActive  <transformBoxTranslatorTranslatorActive resource>
    translator6.translatorActive  <transformBoxTranslatorTranslatorActive resource>
    translator1.xAxisFeedback     <transformBoxTranslatorXAxisFeedback resource>
    translator2.xAxisFeedback     <transformBoxTranslatorXAxisFeedback resource>
    translator3.xAxisFeedback     <transformBoxTranslatorXAxisFeedback resource>
    translator4.xAxisFeedback     <transformBoxTranslatorXAxisFeedback resource>
    translator5.xAxisFeedback     <transformBoxTranslatorXAxisFeedback resource>
    translator6.xAxisFeedback     <transformBoxTranslatorXAxisFeedback resource>
    translator1.yAxisFeedback     <transformBoxTranslatorYAxisFeedback resource>
    translator2.yAxisFeedback     <transformBoxTranslatorYAxisFeedback resource>
    translator3.yAxisFeedback     <transformBoxTranslatorYAxisFeedback resource>
    translator4.yAxisFeedback     <transformBoxTranslatorYAxisFeedback resource>
    translator5.yAxisFeedback     <transformBoxTranslatorYAxisFeedback resource>
    translator6.yAxisFeedback     <transformBoxTranslatorYAxisFeedback resource>
}

that's the full default setup, every field accounted for, nothing skipped. keep going bestie, there's more πŸ’…βœ¨

πŸ‘€ SEE ALSO πŸ‘€

okay so if you've made it this far you're clearly a girl who reads docs and honestly? iconic behavior πŸ’…. Here's the whole friend group this page runs with β€” go say hi, they're all part of the same vibe:

  • SoInteractionKit
  • SoDragger
  • SoCenterballDragger
  • SoDirectionalLightDragger
  • SoDragPointDragger
  • SoHandleBoxDragger
  • SoJackDragger
  • SoPointLightDragger
  • SoRotateCylindricalDragger
  • SoRotateDiscDragger
  • SoRotateSphericalDragger
  • SoScale1Dragger
  • SoScale2Dragger
  • SoScale2UniformDragger
  • SoScaleUniformDragger
  • SoSpotLightDragger
  • SoTabBoxDragger
  • SoTabPlaneDragger
  • SoTrackballDragger
  • SoTransformerDragger
  • SoTranslate1Dragger
  • SoTranslate2Dragger
ngl bestie, that's the entire dragger cinematic universe right there. SoDragger is the mom of the family (everyone inherits from her), SoInteractionKit is the whole friend group chat, and the rest are the individual little gremlins that each do one specific job. SoTransformBoxDragger is literally one of them, so like… you already know her. 🌸

and that's a wrap on SoTransformBoxDragger(3IV), bestie πŸŽ€ fr fr you read the WHOLE page, every flag, every field, every catalog part, no skimming, no cap β€” that's main character energy and I'm obsessed 🫢

this lil masterpiece comes to you from the 3IV section of the manual, and the footer's carrying the SoTransformBoxDragger(3IV) source/version stamp plus its date, so if you ever need to cite it or check which version you're looking at, that's where the receipts live πŸ’–

go forth and drag those boxes, queen πŸ‘‘βœ¨