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; }