int SegRefineMouseProc::proc( HWND hwnd, int msg, int point, int flags, IPoint2 m ) { ViewExp *vpt = ip->GetViewport(hwnd); int res = TRUE; switch ( msg ) { case MOUSE_PROPCLICK: ip->SetStdCommandMode(CID_OBJMOVE); break; case MOUSE_POINT: if(HitTest(vpt,&m,HITTYPE_POINT,0) ) { HitLog &hits = vpt->GetSubObjHitList(); HitRecord *rec = hits.First(); HitRecord *bestRec = rec; DWORD best = rec->distance; while(rec) { rec = rec->Next(); if(rec) { if(rec->distance < best) { best = rec->distance; bestRec = rec; } } } ShapeHitData *hit = ((ShapeHitData *)bestRec->hitData); es->DoSegRefine(vpt, hit->shape, hit->poly, hit->index, m); } res = FALSE; break; case MOUSE_FREEMOVE: vpt->SnapPreview(m,m,NULL, SNAP_IN_3D); if ( HitTest(vpt,&m,HITTYPE_POINT,HIT_ABORTONHIT) ) { SetCursor(GetTransformCursor()); } else { SetCursor(LoadCursor(NULL,IDC_ARROW)); } break; } if ( vpt ) ip->ReleaseViewport(vpt); return res; }
int TrimMouseProc::proc( HWND hwnd, int msg, int point, int flags, IPoint2 m ) { ViewExp *vpt = ip->GetViewport(hwnd); int res = TRUE; // IntersectPt fromPt, toPt; BOOL extend = FALSE; switch ( msg ) { case MOUSE_PROPCLICK: ip->SetStdCommandMode(CID_OBJMOVE); break; case MOUSE_POINT: if(HitTest(vpt,&m,HITTYPE_POINT,0) ) { HitLog &hits = vpt->GetSubObjHitList(); HitRecord *rec = hits.First(); HitRecord *bestRec = rec; DWORD best = rec->distance; while(rec) { rec = rec->Next(); if(rec) { if(rec->distance < best) { best = rec->distance; bestRec = rec; } } } ShapeHitData *hit = ((ShapeHitData *)bestRec->hitData); es->HandleTrimExtend(vpt, hit, m, SHAPE_TRIM); } res = FALSE; break; case MOUSE_FREEMOVE: if ( HitTest(vpt,&m,HITTYPE_POINT,HIT_ABORTONHIT) ) { SetCursor(GetTransformCursor()); } else { SetCursor(LoadCursor(NULL,IDC_ARROW)); } break; } if ( vpt ) ip->ReleaseViewport(vpt); return res; }
int BooleanMouseProc::proc( HWND hwnd, int msg, int point, int flags, IPoint2 m ) { ViewExp *vpt = ip->GetViewport(hwnd); int res = TRUE; static int poly2 = -1; switch(msg) { case MOUSE_PROPCLICK: ip->SetStdCommandMode(CID_OBJMOVE); break; case MOUSE_POINT: if(poly2 >= 0) if(ValidBooleanPolygon(es->ip, es->boolShape->splines[poly2])) es->DoBoolean(poly2); res = FALSE; break; case MOUSE_MOVE: case MOUSE_ABORT: res = FALSE; break; case MOUSE_FREEMOVE: poly2 = -1; if ( HitTest(vpt,&m,HITTYPE_POINT,HIT_ABORTONHIT) ) { HitLog &hits = vpt->GetSubObjHitList(); HitRecord *rec = hits.First(); ShapeHitData *hit = ((ShapeHitData *)rec->hitData); Spline3D *spline = hit->shape->splines[hit->poly]; if(spline->Closed() && hit->shape == es->boolShape && hit->poly != es->boolPoly1) { poly2 = hit->poly; SetCursor(GetTransformCursor()); break; } } SetCursor(LoadCursor(NULL,IDC_ARROW)); break; } if ( vpt ) ip->ReleaseViewport(vpt); return res; }
int CrossInsertMouseProc::proc( HWND hwnd, int msg, int point, int flags, IPoint2 m ) { ViewExp *vpt = ip->GetViewport(hwnd); int res = TRUE; switch ( msg ) { case MOUSE_PROPCLICK: ip->SetStdCommandMode(CID_OBJMOVE); break; case MOUSE_POINT: if(HitTest(vpt,&m,HITTYPE_POINT,0) ) { HitLog &hits = vpt->GetSubObjHitList(); HitRecord *rec = hits.First(); ShapeHitData *h1 = (ShapeHitData *)rec->hitData; rec = rec->Next(); assert(rec); ShapeHitData *h2 = (ShapeHitData *)rec->hitData; assert(h1->shape == h2->shape); es->DoCrossInsert(vpt, h1->shape, h1->poly, h1->index, h2->poly, h2->index, m); } res = FALSE; break; case MOUSE_FREEMOVE: if ( HitTest(vpt,&m,HITTYPE_POINT,0) ) { SetCursor(GetTransformCursor()); } else { SetCursor(LoadCursor(NULL,IDC_ARROW)); } break; } if ( vpt ) ip->ReleaseViewport(vpt); return res; }
int VertConnectMouseProc::proc( HWND hwnd, int msg, int point, int flags, IPoint2 m ) { ViewExp *vpt = ip->GetViewport(hwnd); int res = TRUE; static BezierShape *shape1 = NULL; static int poly1, vert1, poly2, vert2; static IPoint2 anchor, lastPoint; switch ( msg ) { case MOUSE_PROPCLICK: ip->SetStdCommandMode(CID_OBJMOVE); break; case MOUSE_POINT: switch(point) { case 0: if(HitAnEndpoint(vpt, &m, NULL, -1, -1, &shape1, &poly1, &vert1)) res = TRUE; else res = FALSE; anchor = lastPoint = m; XORDottedLine(hwnd, anchor, m); // Draw it! break; case 1: XORDottedLine(hwnd, anchor, lastPoint); // Erase it! if(HitAnEndpoint(vpt, &m, shape1, poly1, vert1, NULL, &poly2, &vert2)) es->DoVertConnect(vpt, shape1, poly1, vert1, poly2, vert2); res = FALSE; break; default: assert(0); } break; case MOUSE_MOVE: // Erase old dotted line XORDottedLine(hwnd, anchor, lastPoint); // Draw new dotted line XORDottedLine(hwnd, anchor, m); lastPoint = m; if(HitAnEndpoint(vpt, &m, shape1, poly1, vert1, NULL, NULL, NULL)) SetCursor(GetTransformCursor()); else SetCursor(LoadCursor(NULL,IDC_ARROW)); break; case MOUSE_FREEMOVE: if ( HitTest(vpt,&m,HITTYPE_POINT,HIT_ABORTONHIT) ) { HitLog &hits = vpt->GetSubObjHitList(); HitRecord *rec = hits.First(); ShapeHitData *hit = ((ShapeHitData *)rec->hitData); Spline3D *spline = hit->shape->splines[hit->poly]; if(!spline->Closed()) { int hitKnot = hit->index / 3; if(hitKnot == 0 || hitKnot == (spline->KnotCount() - 1)) { SetCursor(LoadCursor(hInstance,MAKEINTRESOURCE(IDC_TH_SELCURSOR))); break; } } } SetCursor(LoadCursor(NULL,IDC_ARROW)); break; case MOUSE_ABORT: // Erase old dotted line XORDottedLine(hwnd, anchor, lastPoint); break; } if ( vpt ) ip->ReleaseViewport(vpt); return res; }