MStatus customAttrCtx::doPress( MEvent & event ) // // Description // This method is called when a mouse button is pressed while this context is // the current context. // { // Let the parent class handle the event first in case there is no object // selected yet. The parent class will perform any necessary selection. MStatus stat = MPxSelectionContext::doPress( event ); // If an object has been selected, then process the event. Otherwise, // ignore it as there is nothing to do. if ( !isSelecting() ) { if (event.mouseButton() == MEvent::kMiddleMouse) { setCursor(MCursor::handCursor); view = M3dView::active3dView(); // Create an instance of the customAttrCmd tool command and initialize // its delta value to 0. As the mouse drags, the delta value will change. // when the mouse is lifted, a final command will be constructed with the // most recently set delta value and axis specifications. cmd = (customAttrCmd *)newToolCommand(); cmd->setDelta(0.0); event.getPosition( startPos_x, startPos_y ); // Determine the channel box attribute which will be operated on by the // dragging motion and set the state of the command accordingly. unsigned int i; MStringArray result; MGlobal::executeCommand( "channelBox -q -selectedMainAttributes $gChannelBoxName", result); for (i=0; i<result.length(); i++) { if (result[i] == customAttributeString) { cmd->setDragX(); break; } } } } return stat; }
MStatus moveContext::doPress( MEvent & event ) { MStatus stat = MPxSelectionContext::doPress( event ); MSpace::Space spc = MSpace::kWorld; // If we are not in selecting mode (i.e. an object has been selected) // then set up for the translation. // if ( !isSelecting() ) { event.getPosition( startPos_x, startPos_y ); view = M3dView::active3dView(); MDagPath camera; stat = view.getCamera( camera ); if ( stat != MS::kSuccess ) { cerr << "Error: M3dView::getCamera" << endl; return stat; } MFnCamera fnCamera( camera ); MVector upDir = fnCamera.upDirection( spc ); MVector rightDir = fnCamera.rightDirection( spc ); // Determine the camera used in the current view // if ( fnCamera.isOrtho() ) { if ( upDir.isEquivalent(MVector::zNegAxis,kVectorEpsilon) ) { currWin = TOP; } else if ( rightDir.isEquivalent(MVector::xAxis,kVectorEpsilon) ) { currWin = FRONT; } else { currWin = SIDE; } } else { currWin = PERSP; } // Create an instance of the move tool command. // cmd = (moveCmd*)newToolCommand(); cmd->setVector( 0.0, 0.0, 0.0 ); } return stat; }
MStatus SelectRingContext2::doRelease( MEvent &event ) { // Get the mouse release position event.getPosition( releaseX, releaseY ); // Didn't select a single point if( abs(pressX - releaseX) > 1 || abs(pressY - releaseY) > 1 ) { MGlobal::displayWarning( "Click on a single edge" ); return MS::kFailure; } // Set the selection surface area int halfClickBoxSize = clickBoxSize / 2; pressX -= halfClickBoxSize; pressY -= halfClickBoxSize; releaseX = pressX + clickBoxSize; releaseY = pressY + clickBoxSize; // Get the current selection MSelectionList curSel; MGlobal::getActiveSelectionList( curSel ); //MGlobal::displayInfo( MString("Dim: ") + start_x + " " + start_y + " " + last_x + " " + last_y ); // Change to object selection mode MGlobal::setSelectionMode( MGlobal::kSelectObjectMode ); MGlobal::setComponentSelectionMask( MSelectionMask( MSelectionMask::kSelectObjectsMask ) ); // Select the object under the selection area MGlobal::selectFromScreen( pressX, pressY, releaseX, releaseY, MGlobal::kReplaceList); MGlobal::executeCommand( "hilite" ); // Change selection mode to mesh edges MGlobal::setSelectionMode( MGlobal::kSelectComponentMode ); MGlobal::setComponentSelectionMask( MSelectionMask( MSelectionMask::kSelectMeshEdges ) ); // Select the edges MGlobal::selectFromScreen( pressX, pressY, releaseX, releaseY, MGlobal::kReplaceList ); // Get the list of selected edges MSelectionList origEdgesSel; MGlobal::getActiveSelectionList( origEdgesSel ); // Only use the first edge in the selection MItSelectionList selIter( origEdgesSel, MFn::kMeshEdgeComponent ); if( !selIter.isDone() ) { MDagPath dagPath; MObject component; selIter.getDagPath( dagPath, component ); SelectRingToolCmd2 &cmd = *(SelectRingToolCmd2 *) newToolCommand(); cmd.setCurrentSelection( curSel ); cmd.setSelectedEdgeObject( dagPath ); cmd.setSelectedEdgeComponent( component ); cmd.setListAdjust( listAdjust ); cmd.setSelEdges( selEdges ); cmd.setSelFaces( selFaces ); cmd.setSelVertices( selVertices ); cmd.setSelType( SelectRingToolCmd2::SelType(selType) ); cmd.redoIt(); cmd.finalize(); } return MS::kSuccess; }
MStatus grabUVContext::doDrag ( MEvent & event, MHWRender::MUIDrawManager& drawMgr, const MHWRender::MFrameContext& context) { if (event.mouseButton() != MEvent::kLeftMouse || !event.isModifierNone() ) return MS::kFailure; MPxTexContext::doDrag(event, drawMgr, context); short x, y; event.getPosition( x, y ); fLastScreenPoint = fCurrentScreenPoint; fCurrentScreenPoint = MPoint( x, y ); double xView, yView; portToView(x, y, xView, yView); // pos at viewrect coordinate fLastPoint = fCurrentPoint; fCurrentPoint = MPoint( xView, yView, 0.0 ); if( fDragMode == kBrushSize ) { double dis = fCurrentScreenPoint.distanceTo( fLastScreenPoint ); if ( fCurrentScreenPoint[0] > fLastScreenPoint[0] ) setSize( size() + float(dis) ); else setSize( std::max( size() - float(dis), 0.01f ) ); } else { fBrushCenterScreenPoint = MPoint( x, y ); MFloatArray uUVsExported; MFloatArray vUVsExported; const MVector vec = fCurrentPoint - fLastPoint; if (!fCommand) { fCommand = (UVUpdateCommand *)(newToolCommand()); } if (fCommand) { MFnMesh mesh(fDagPath); MString currentUVSetName; mesh.getCurrentUVSetName(currentUVSetName); int nbUVs = mesh.numUVs(currentUVSetName); MDoubleArray pinData; MUintArray uvPinIds; MDoubleArray fullPinData; mesh.getPinUVs(uvPinIds, pinData, ¤tUVSetName); int len = pinData.length(); fullPinData.setLength(nbUVs); for (unsigned int i = 0; i < nbUVs; i++) { fullPinData[i] = 0.0; } while( len-- > 0 ) { fullPinData[uvPinIds[len]] = pinData[len]; } MFloatArray uValues; MFloatArray vValues; float pinWeight = 0; for (unsigned int i = 0; i < fCollectedUVs.length(); ++i) { float u, v; MStatus bGetUV = mesh.getUV(fCollectedUVs[i], u, v, ¤tUVSetName); if (bGetUV == MS::kSuccess) { pinWeight = fullPinData[fCollectedUVs[i]]; u += (float)vec[0]*(1-pinWeight); v += (float)vec[1]*(1-pinWeight); uValues.append( u ); vValues.append( v ); } } fCommand->setUVs( mesh.object(), fCollectedUVs, uValues, vValues, ¤tUVSetName ); } } return MS::kSuccess; }