MStatus marqueeContext::doRelease( MEvent & event ) // // Selects objects within the marquee box. { if (fsDrawn) { #if CUSTOM_XOR_DRAW xorDraw XORdraw(&view); XORdraw.beginXorDrawing(); #else view.beginXorDrawing(); #endif // Redraw the marquee at its old position to erase it. drawMarqueeGL(); #if CUSTOM_XOR_DRAW XORdraw.endXorDrawing(); #else view.endXorDrawing(); #endif } doReleaseCommon( event ); return MS::kSuccess; }
MStatus marqueeContext::doDrag( MEvent & event ) // // Drag out the marquee (using OpenGL) // { #if CUSTOM_XOR_DRAW xorDraw XORdraw(&view); XORdraw.beginXorDrawing(); #else view.beginXorDrawing(); #endif if (fsDrawn) { // Redraw the marquee at its old position to erase it. drawMarqueeGL(); } fsDrawn = true; // Get the marquee's new end position. event.getPosition( last_x, last_y ); // Draw the marquee at its new position. drawMarqueeGL(); #if CUSTOM_XOR_DRAW XORdraw.endXorDrawing(); #else view.endXorDrawing(); #endif return MS::kSuccess; }
MStatus lassoTool::doDrag( MEvent & event ) // Add to the growing lasso { view.beginXorDrawing(true, true, 1.0f, M3dView::kStippleDashed); if (!firstDraw) { // Redraw the old lasso to clear it. draw_lasso(); } else { firstDraw = false; } coord currentPos; event.getPosition( currentPos.h, currentPos.v ); append_lasso( currentPos.h, currentPos.v ); // Draw the new lasso. draw_lasso(); view.endXorDrawing(); return MS::kSuccess; }
MStatus lassoTool::doRelease( MEvent & /*event*/ ) // Selects objects within the lasso { MStatus stat; MSelectionList incomingList, boundingBoxList, newList; if (!firstDraw) { // Redraw the lasso to clear it. view.beginXorDrawing(true, true, 1.0f, M3dView::kStippleDashed); draw_lasso(); view.endXorDrawing(); } // We have a non-zero sized lasso. Close the lasso, and sort // all the points on it. append_lasso(lasso[0].h, lasso[0].v); qsort( &(lasso[0]), num_points, sizeof( coord ), (int (*)(const void *, const void *))xycompare); // Save the state of the current selections. The "selectFromSceen" // below will alter the active list, and we have to be able to put // it back. MGlobal::getActiveSelectionList(incomingList); // As a first approximation to the lasso, select all components with // the bounding box that just contains the lasso. MGlobal::selectFromScreen( min.h, min.v, max.h, max.v, MGlobal::kReplaceList ); // Get the list of selected items from within the bounding box // and create a iterator for them. MGlobal::getActiveSelectionList(boundingBoxList); // Restore the active selection list to what it was before we // the "selectFromScreen" MGlobal::setActiveSelectionList(incomingList, MGlobal::kReplaceList); // Iterate over the objects within the bounding box, extract the // ones that are within the lasso, and add those to newList. MItSelectionList iter(boundingBoxList); newList.clear(); bool foundEntireObjects = false; bool foundComponents = false; for ( ; !iter.isDone(); iter.next() ) { MDagPath dagPath; MObject component; MPoint point; coord pt; MObject singleComponent; iter.getDagPath( dagPath, component ); if (component.isNull()) { foundEntireObjects = true; continue; // not a component } foundComponents = true; switch (component.apiType()) { case MFn::kCurveCVComponent: { MItCurveCV curveCVIter( dagPath, component, &stat ); for ( ; !curveCVIter.isDone(); curveCVIter.next() ) { point = curveCVIter.position(MSpace::kWorld, &stat ); view.worldToView( point, pt.h, pt.v, &stat ); if (!stat) { stat.perror("Could not get position"); continue; } if ( point_in_lasso( pt ) ) { singleComponent = curveCVIter.cv(); newList.add (dagPath, singleComponent); } } break; } case MFn::kSurfaceCVComponent: { MItSurfaceCV surfCVIter( dagPath, component, true, &stat ); for ( ; !surfCVIter.isDone(); surfCVIter.next() ) { point = surfCVIter.position(MSpace::kWorld, &stat ); view.worldToView( point, pt.h, pt.v, &stat ); if (!stat) { stat.perror("Could not get position"); continue; } if ( point_in_lasso( pt ) ) { singleComponent = surfCVIter.cv(); newList.add (dagPath, singleComponent); } } break; } case MFn::kMeshVertComponent: { MItMeshVertex vertexIter( dagPath, component, &stat ); for ( ; !vertexIter.isDone(); vertexIter.next() ) { point = vertexIter.position(MSpace::kWorld, &stat ); view.worldToView( point, pt.h, pt.v, &stat ); if (!stat) { stat.perror("Could not get position"); continue; } if ( point_in_lasso( pt ) ) { singleComponent = vertexIter.vertex(); newList.add (dagPath, singleComponent); } } break; } case MFn::kMeshEdgeComponent: { MItMeshEdge edgeIter( dagPath, component, &stat ); for ( ; !edgeIter.isDone(); edgeIter.next() ) { point = edgeIter.center(MSpace::kWorld, &stat ); view.worldToView( point, pt.h, pt.v, &stat ); if (!stat) { stat.perror("Could not get position"); continue; } if ( point_in_lasso( pt ) ) { singleComponent = edgeIter.edge(); newList.add (dagPath, singleComponent); } } break; } case MFn::kMeshPolygonComponent: { MItMeshPolygon polygonIter( dagPath, component, &stat ); for ( ; !polygonIter.isDone(); polygonIter.next() ) { point = polygonIter.center(MSpace::kWorld, &stat ); view.worldToView( point, pt.h, pt.v, &stat ); if (!stat) { stat.perror("Could not get position"); continue; } if ( point_in_lasso( pt ) ) { singleComponent = polygonIter.polygon(); newList.add (dagPath, singleComponent); } } break; } default: #ifdef DEBUG cerr << "Selected unsupported type: (" << component.apiType() << "): " << component.apiTypeStr() << endl; #endif /* DEBUG */ continue; } } // Warn user if zie is trying to select objects rather than components. if (foundEntireObjects && !foundComponents) { MGlobal::displayWarning("lassoTool can only select components, not entire objects."); } // Update the selection list as indicated by the modifier keys. MGlobal::selectCommand(newList, listAdjustment); // Free the memory that held our lasso points. free(lasso); lasso = (coord*) 0; maxSize = 0; num_points = 0; return MS::kSuccess; }