From dbb0e72f5bdebdf0f49b57a79ccebe2342e847de Mon Sep 17 00:00:00 2001 From: Paolo Cignoni cignoni Date: Wed, 1 Apr 2009 13:50:51 +0000 Subject: [PATCH] Implemented selection of visible only faces. --- .../edit_select/edit_select.cpp | 63 ++++++++++-------- src/meshlabplugins/edit_select/edit_select.h | 3 + .../edit_select/edit_select.qrc | 3 + .../edit_select/images/sel_rect.png | Bin 294 -> 277 bytes .../edit_select/images/sel_rect_eye.png | Bin 0 -> 462 bytes .../edit_select/images/sel_rect_minus.png | Bin 231 -> 295 bytes .../edit_select/images/sel_rect_minus_eye.png | Bin 0 -> 478 bytes .../edit_select/images/sel_rect_plus.png | Bin 245 -> 333 bytes .../edit_select/images/sel_rect_plus_eye.png | Bin 0 -> 514 bytes 9 files changed, 40 insertions(+), 29 deletions(-) create mode 100644 src/meshlabplugins/edit_select/images/sel_rect_eye.png create mode 100644 src/meshlabplugins/edit_select/images/sel_rect_minus_eye.png create mode 100644 src/meshlabplugins/edit_select/images/sel_rect_plus_eye.png diff --git a/src/meshlabplugins/edit_select/edit_select.cpp b/src/meshlabplugins/edit_select/edit_select.cpp index 988a013e8..2e580dfb3 100644 --- a/src/meshlabplugins/edit_select/edit_select.cpp +++ b/src/meshlabplugins/edit_select/edit_select.cpp @@ -43,13 +43,27 @@ const QString ExtraMeshEditPlugin::Info() { return tr("Interactive selection of faces inside a dragged rectangle in screen space"); } +void ExtraMeshEditPlugin::keyReleaseEvent (QKeyEvent *, MeshModel &/*m*/, GLArea *gla) +{ + gla->setCursor(QCursor(QPixmap(":/images/sel_rect.png"),1,1)); +} -void ExtraMeshEditPlugin::mousePressEvent(QMouseEvent * event, MeshModel &m, GLArea * gla) +void ExtraMeshEditPlugin::keyPressEvent (QKeyEvent *event, MeshModel &/*m*/, GLArea *gla) +{ + + if(QApplication::keyboardModifiers() == Qt::AltModifier) gla->setCursor(QCursor(QPixmap(":/images/sel_rect_eye.png"),1,1)); + if(QApplication::keyboardModifiers() == Qt::ControlModifier) gla->setCursor(QCursor(QPixmap(":/images/sel_rect_plus.png"),1,1)); + if(QApplication::keyboardModifiers() == Qt::ShiftModifier) gla->setCursor(QCursor(QPixmap(":/images/sel_rect_minus.png"),1,1)); + if(QApplication::keyboardModifiers() == (Qt::AltModifier+Qt::ControlModifier)) gla->setCursor(QCursor(QPixmap(":/images/sel_rect_plus_eye.png"),1,1)); + if(QApplication::keyboardModifiers() == (Qt::AltModifier+Qt::ShiftModifier)) gla->setCursor(QCursor(QPixmap(":/images/sel_rect_minus_eye.png"),1,1)); +} + +void ExtraMeshEditPlugin::mousePressEvent(QMouseEvent * event, MeshModel &m, GLArea *) { LastSel.clear(); - if(event->modifiers() == Qt::ControlModifier || - event->modifiers() == Qt::ShiftModifier ) + if((event->modifiers() & Qt::ControlModifier) || + (event->modifiers() & Qt::ShiftModifier) ) { CMeshO::FaceIterator fi; for(fi=m.cm.face.begin();fi!=m.cm.face.end();++fi) @@ -58,8 +72,11 @@ void ExtraMeshEditPlugin::mousePressEvent(QMouseEvent * event, MeshModel &m, GLA } selMode=SMClear; - if(event->modifiers()==Qt::ControlModifier) selMode=SMAdd; - if(event->modifiers()==Qt::ShiftModifier) selMode=SMSub; + if(event->modifiers() & Qt::ControlModifier) selMode=SMAdd; + if(event->modifiers() & Qt::ShiftModifier) selMode=SMSub; + + if(event->modifiers() & Qt::AltModifier) selectFrontFlag=true; + else selectFrontFlag=false; start=event->pos(); cur=start; @@ -149,40 +166,26 @@ void ExtraMeshEditPlugin::mousePressEvent(QMouseEvent * event, MeshModel &m, GLA if(wid.x()<0) wid.setX(-wid.x()); if(wid.y()<0) wid.setY(-wid.y()); - /* CMeshO::FaceIterator fi; - for(fi=m.cm.face.begin(),fpi=NewSel.begin();fpi!=NewSel.end();++fi) - if(!(*fi).IsD()) { - if(&(*fi)!=*fpi) (*fpi)->ClearS(); - else { - (*fpi)->SetS(); - ++fpi; - } - } - - for(;fi!=m.cm.face.end();++fi) - if(!(*fi).IsD()) (*fi).ClearS(); - -*/ - - CMeshO::FaceIterator fi; - for(fi=m.cm.face.begin();fi!=m.cm.face.end();++fi) - if(!(*fi).IsD()) (*fi).ClearS(); - glPushMatrix(); glMultMatrix(m.cm.Tr); - GLPickTri::PickFace(mid.x(), mid.y(), m.cm, NewSel, wid.x(), wid.y()); + if(selectFrontFlag) GLPickTri::PickFaceVisible(mid.x(), mid.y(), m.cm, NewSel, wid.x(), wid.y()); + else GLPickTri::PickFace(mid.x(), mid.y(), m.cm, NewSel, wid.x(), wid.y()); + qDebug("Pickface: rect %i %i - %i %i",mid.x(),mid.y(),wid.x(),wid.y()); qDebug("Pickface: Got %i on %i",int(NewSel.size()),int(m.cm.face.size())); glPopMatrix(); - switch(selMode) + tri::UpdateSelection::ClearFace(m.cm); + switch(selMode) { - case SMSub : // Subtract mode + case SMSub : // Subtract mode : The faces in the rect must be de-selected if(connectedMode) { for(fpi=NewSel.begin();fpi!=NewSel.end();++fpi) (*fpi)->SetS(); - NewSel.clear(); tri::UpdateSelection::FaceConnectedFF(m.cm); + + CMeshO::FaceIterator fi; + NewSel.clear(); for(fi=m.cm.face.begin();fi!=m.cm.face.end();++fi) if(!(*fi).IsD() && (*fi).IsS()) NewSel.push_back(&*fi); } @@ -219,5 +222,7 @@ void ExtraMeshEditPlugin::StartEdit(MeshModel &m, GLArea *gla ) connect(this, SIGNAL(setSelectionRendering(bool)),gla,SLOT(setSelectionRendering(bool)) ); setSelectionRendering(true); - m.updateDataMask(MeshModel::MM_FACEFACETOPO); + + if(connectedMode) + m.updateDataMask(MeshModel::MM_FACEFACETOPO); } diff --git a/src/meshlabplugins/edit_select/edit_select.h b/src/meshlabplugins/edit_select/edit_select.h index c4adb5c2d..5b01c69cb 100644 --- a/src/meshlabplugins/edit_select/edit_select.h +++ b/src/meshlabplugins/edit_select/edit_select.h @@ -47,6 +47,8 @@ public: virtual void mousePressEvent(QMouseEvent *event, MeshModel &/*m*/, GLArea * ); virtual void mouseMoveEvent(QMouseEvent *event, MeshModel &/*m*/, GLArea * ); virtual void mouseReleaseEvent(QMouseEvent *event, MeshModel &/*m*/, GLArea * ); + virtual void keyReleaseEvent (QKeyEvent *, MeshModel &/*m*/, GLArea *); + virtual void keyPressEvent (QKeyEvent *, MeshModel &/*m*/, GLArea *); QPoint start; QPoint cur; @@ -61,6 +63,7 @@ signals: private: typedef enum {SMAdd, SMClear,SMSub} SelMode; SelMode selMode; + bool selectFrontFlag; void DrawXORRect(GLArea * gla, bool doubleDraw); }; diff --git a/src/meshlabplugins/edit_select/edit_select.qrc b/src/meshlabplugins/edit_select/edit_select.qrc index 71e8f4cf6..71b4b6fb9 100644 --- a/src/meshlabplugins/edit_select/edit_select.qrc +++ b/src/meshlabplugins/edit_select/edit_select.qrc @@ -4,7 +4,10 @@ images/select_face_connected.png images/select_vertex.png images/sel_rect.png + images/sel_rect_eye.png images/sel_rect_plus.png images/sel_rect_minus.png + images/sel_rect_plus_eye.png + images/sel_rect_minus_eye.png diff --git a/src/meshlabplugins/edit_select/images/sel_rect.png b/src/meshlabplugins/edit_select/images/sel_rect.png index a2a28a25f27714687b8fbeafa4f65bb687b355ed..2fa9b838789b85b43d2a303f964027f1fe3beac0 100644 GIT binary patch delta 249 zcmVFh_w4QN z_e9n)+Pu2TzM2k92c`pfQ{ckwnQN)J_dW-H%t^honlnON00000NkvXXu0mjfbmDAc delta 267 zcmV+m0rdWr0;U3xB!32COGiWi{{a60|De66lK=n!32;bRa{vGf6951U69E94oEQKA z00(qQO+^RS0vQ(%1$w2B_W%F@vq?ljR9M69mO&1LAPhxci5K7ooS5sfo4V17$&4eK zmL?OL5LfaazkUmDUad81tpJo#$bUK85Nx9FHM$)i)^@Z5 zK->U2A=DM%h7*1OqaZHhHjM?AkqRz$=NKvmiI-%gFS;AsnXvC(589mT^^ za1b RO8@`>07*qoLJp!m2N#gA^26hXisBQ&puI-p9z|JC-;PPa< zN&ppekk}-UgTyX@t4Z7dur!uF2{@RtE#=bs)R;#ApserqAM;ZIL!#3bIPelS=THI! z4}qNumoicUR%ZA)Rk&Gjt3XZ?7B|Hgu6l3|+Z3=_jsu^?_X5lduUNH_*sZ+7Ar0%S zEcL>gXTJmZi~aPL_>*@xeVA|u_2nFyP@Eg)0UV5uKFo_l^;ZF_m_9^&SJ!n>f8BKo zmhfTKmv?4Bkvrlk!{)JzLBIzA^i;qcqitIoM-E3CgHi1t1<-lZG+LAj&?4CPy}pwl z?VJ)8l%rk5Lz zG^V#_>HbtM?^W!>)aZ6Ox;^inl?LZ_?hz~Yuy|2# z6?*q+eS3$L_JwPxb-q$N+`sZ=`c3b?w9B!Y4onB81Nf)Fh1*%XQnU7d4(#AP$Gac@ S11JCh002ovP6b4+LSTZt4|xm# delta 203 zcmV;+05t!n0_OpcB!8|+L_t(oh3%Ew4uBvGLp#I&|8jj1<7ETXIgFu+F+rhc12&K( zI%)!do)8HDL|Td*~c&O*AaI zFD}2`+#~0yYkAFUs)VOiZU*9cu0{q%21W+@R>GlQX$Bit$Gaiu{R{vA002ovPDHLk FV1k0bSI7VW diff --git a/src/meshlabplugins/edit_select/images/sel_rect_minus_eye.png b/src/meshlabplugins/edit_select/images/sel_rect_minus_eye.png new file mode 100644 index 0000000000000000000000000000000000000000..0724e7a7c1fceca6cfd9ce1454ec370c19586f80 GIT binary patch literal 478 zcmV<40U`d0P)}QfVfIwN6N}v3HNxA-!?ekB9lGJpuq_e%FMs z9|}ld>fs6;cnO_TlmNj)U{{4*87Towuv<~X_zOm)pKi{{SSP|^4Z(s8z*O8jk`tlrH_nj*))s;I2f%Rj9Z54 z?*dja{D`<#RaNoz{i!BcVh)XgH6y6V1^z8!<9Lc*0D1xRssJ0(G>!EmhO&*pPqlw5 zfYa4=tw~t{YB;;D(>3|%$!XY=(6>Z~aasjb0D@Cu z#XFYx0=SRh+8bfausAW1bLs1ey`Q6tdlh{(Ia)KfQxr*)t<{nwhHrEK&;LLLZr*Gf U)X?-LV*mgE07*qoM6N<$f*l~x5&!@I literal 0 HcmV?d00001 diff --git a/src/meshlabplugins/edit_select/images/sel_rect_plus.png b/src/meshlabplugins/edit_select/images/sel_rect_plus.png index 26d6ccac4f9f30261841b080b6f8b4c7ec6eb3e1..66e5b9f58b19e7f29c966b21d59c69676de8adaa 100644 GIT binary patch delta 307 zcmV-30nGmO0nGxCBYy!DNkl6bQ43 z7N7z=0nr8cHN<(>p7ukCC#HW1m+e2aD*%X6evE0oRFD^(w}8Z?%6ZVrbpRl7o;Y=Z zA4=Tqt91bILb=VDKiP$|6faA85~9?dnS0jo?=X)uVogjEZ|pt8Y@C#L_9YE*`7@L< zkJw`OM?7nv*(|s^OI+;^><;V>;7mam%%k*4ZQK8K-~%2W(X)@vre^>E002ovPDHLk FV1hiIjd}n8 delta 218 zcmV<0044v;0`&oqBYyzANklv3`9G||NrIL7bK|A!tRL4hDnG;0zJKe zk)-vD#gJ$-GaG>zI01*TL18}pY01gDwi2nT!;6UUx zrK$i91WXip2;e|SeeT#sllc7)&Ua){^Ue&+LLpi%wRtej%27 zeO4m!1-={-d3+Pd-sK3CWw}Hm)^*IbjA$Yp0oayEpmTPwWm7L(9SAIu06}cVQO-s* z2>}5Xmku#ry@1@KkJgxN^sba91dx|{9D8+6eo+Dm671SegY~k{Spo?X*&wNeB!MGH zEE4!_5~sQGOfN$J#gvzDx91P+fB-;QAE(!M1+)zhkAPsY&TZ13x+6evTi8#*ew1w3 zQ@SG{K*N|JA324S2G^||NkZdpk%g=K?Z`g2fK75d_{6?sVBYZTeZo1B*v$CwlG-{m zp@G@u>F>aYxUWG-sC;_$q09}YuijzhN{coR;9!)ynU_Y3dx2F9A0ozFE|=o|{pD1! zgp3m#KD98B8|+(_&SMvy0CWNvOaVGpUDw)<9IkB)`e~07KzCJDxuTo^PZ-;_bw2sy zI;WyLp>54+^V}3L0W5UQ4IOqVimf{*&QlZMEx7q=SNlf474LBI1~87`{KXvfwSx5J zZcps~o_IUlNEqhu{&Nc=}O>y#ofd|mrr{sR;E0US*v%=c0D8vp