Beispiel #1
0
int main (int argc, char** argv) {

    // Initialize Inventor and Win
    HWND myWindow = SoWin::init(argv[0]);
    if (myWindow == NULL) exit(1);

    // Knoten zum Selektieren der angehängten Objekte
    rootSelection = new SoSelection;
    rootSelection->ref();
    rootSelection->addSelectionCallback(selectionCallback, NULL);
    rootSelection->addDeselectionCallback(deselectionCallback, NULL);

    SoSeparator *root = new SoSeparator;
    rootSelection->addChild(root);

    // This function contains our code fragment.
    root->addChild(make_brett());

    SoWrapperKit *myWrapperKit = new SoWrapperKit;

    // Figur mit Wrapper verbinden
    root->addChild(myWrapperKit);
    myWrapperKit->setPart("contents", (make_brett()));
    myWrapperKit->set((char *)"transform { translation 0 0 0 }");

    // create the manipulators
    SoHandleBoxManip *myHandleBox = new SoHandleBoxManip;
    myHandleBox->ref();
    SoTranslate2Dragger *myTranslater = new SoTranslate2Dragger;

    // Get the draggers and add callbacks to them. Note
    // that you don't put callbacks on manipulators. You put
    // them on the draggers which handle events for them. 
    SoDragger *myDragger;
    myDragger = myHandleBox->getDragger();
    myDragger->addStartCallback(dragStartCallback);
    myDragger->addFinishCallback(dragFinishCallback);

    SoWinExaminerViewer *myViewer = new SoWinExaminerViewer(myWindow);
    myViewer->setSceneGraph(rootSelection);
    myViewer->setGLRenderAction(new SoBoxHighlightRenderAction);
    myViewer->setTitle("Schachbrett");
    myViewer->show();
    myViewer->viewAll();

    SoWin::show(myWindow);
    SoWin::mainLoop();

    return 0;
}
bool ViewProviderMirror::setEdit(int ModNum)
{
    if (ModNum == ViewProvider::Default) {
        // get the properties from the mirror feature
        Part::Mirroring* mf = static_cast<Part::Mirroring*>(getObject());
        Base::BoundBox3d bbox = mf->Shape.getBoundingBox();
        float len = (float)bbox.CalcDiagonalLength();
        Base::Vector3d base = mf->Base.getValue();
        Base::Vector3d norm = mf->Normal.getValue();
        Base::Vector3d cent = bbox.GetCenter();
        base = cent.ProjToPlane(base, norm);

        // setup the graph for editing the mirror plane
        SoTransform* trans = new SoTransform;
        SbRotation rot(SbVec3f(0,0,1), SbVec3f(norm.x,norm.y,norm.z));
        trans->rotation.setValue(rot);
        trans->translation.setValue(base.x,base.y,base.z);
        trans->center.setValue(0.0f,0.0f,0.0f);

        SoMaterial* color = new SoMaterial();
        color->diffuseColor.setValue(0,0,1);
        color->transparency.setValue(0.5);
        SoCoordinate3* points = new SoCoordinate3();
        points->point.setNum(4);
        points->point.set1Value(0, -len/2,-len/2,0);
        points->point.set1Value(1,  len/2,-len/2,0);
        points->point.set1Value(2,  len/2, len/2,0);
        points->point.set1Value(3, -len/2, len/2,0);
        SoFaceSet* face = new SoFaceSet();
        pcEditNode->addChild(trans);
        pcEditNode->addChild(color);
        pcEditNode->addChild(points);
        pcEditNode->addChild(face);

        // Now we replace the SoTransform node by a manipulator
        // Note: Even SoCenterballManip inherits from SoTransform
        // we cannot use it directly (in above code) because the
        // translation and center fields are overridden.
        SoSearchAction sa;
        sa.setInterest(SoSearchAction::FIRST);
        sa.setSearchingAll(FALSE);
        sa.setNode(trans);
        sa.apply(pcEditNode);
        SoPath * path = sa.getPath();
        if (path) {
            SoCenterballManip * manip = new SoCenterballManip;
            manip->replaceNode(path);

            SoDragger* dragger = manip->getDragger();
            dragger->addStartCallback(dragStartCallback, this);
            dragger->addFinishCallback(dragFinishCallback, this);
            dragger->addMotionCallback(dragMotionCallback, this);
        }
        pcRoot->addChild(pcEditNode);
    }
    else {
        ViewProviderPart::setEdit(ModNum);
    }

    return true;
}