int EllipseObjCreateCallBack::proc(ViewExp *vpt,int msg, int point, int flags, IPoint2 m, Matrix3& mat ) { if ( ! vpt || ! vpt->IsAlive() ) { // why are we here DbgAssert(!_T("Invalid viewport!")); return FALSE; } Point3 d; #ifdef _3D_CREATE DWORD snapdim = SNAP_IN_3D; #else DWORD snapdim = SNAP_IN_PLANE; #endif if (msg == MOUSE_FREEMOVE) { #ifdef _OSNAP vpt->SnapPreview(m,m,NULL, snapdim); #endif } if (msg==MOUSE_POINT||msg==MOUSE_MOVE) { switch(point) { case 0: sp0 = m; ob->suspendSnap = TRUE; // Get the creation method createType = theEllispeCreateBlock.GetInt(PB_CREATEMETHOD); p0 = vpt->SnapPoint(m,m,NULL,snapdim); p1 = p0 + Point3(.01,.01,.0); ob->GetParamBlockByID(ellipse_params)->SetValue(PB_LENGTH,0,0.f); ob->GetParamBlockByID(ellipse_params)->SetValue(PB_WIDTH,0,0.f); ob->GetParamBlockByID(ellipse_params)->SetValue(PB_THICKNESS, 0, 0.f); if(createType == CREATE_EDGE) mat.SetTrans(float(.5)*(p0+p1)); else mat.SetTrans(p0); break; case 1: { p1 = vpt->SnapPoint(m,m,NULL,snapdim); p1.z = p0.z; d = p1-p0; float w = float(fabs(d.x)); float l = float(fabs(d.y)); if(flags & MOUSE_CTRL) { if(createType == CREATE_EDGE) { float ysign = (d.y < 0.0f) ? -1.0f : 1.0f; mat.SetTrans(float(.5)*(p0+Point3(p1.x,p0.y+ysign*w,0.0f))); } else { mat.SetTrans(p0); w = w * 2.0f; } ob->GetParamBlockByID(ellipse_params)->SetValue(PB_LENGTH,0,w); ob->GetParamBlockByID(ellipse_params)->SetValue(PB_WIDTH,0,w); } else { if(createType == CREATE_EDGE) { mat.SetTrans(float(.5)*(p0+p1)); } else { mat.SetTrans(p0); w = w * 2.0f; l = l * 2.0f; } ob->GetParamBlockByID(ellipse_params)->SetValue(PB_WIDTH,0,w); ob->GetParamBlockByID(ellipse_params)->SetValue(PB_LENGTH,0,l); } theEllipseParamBlock.InvalidateUI(); if (msg == MOUSE_POINT && (Length(m-sp0)<3 || Length(p1-p0)<0.1f)) { ob->suspendSnap = FALSE; return CREATE_ABORT; } break; } case 2 : { ob->GetParamBlockByID(ellipse_params)->GetValue(PB_OUTLINE, 0, EllipseObject::msBuild_outline, ob->ivalid); if(EllipseObject::msBuild_outline) { p2 = vpt->SnapPoint(m,m,NULL,snapdim); float thickness = Length(p2-p0) - Length(p1-p0); ob->GetParamBlockByID(ellipse_params)->SetValue(PB_THICKNESS,0,thickness); if (msg == MOUSE_POINT) { ob->suspendSnap = FALSE; return (Length(m-sp0)<3 || Length(p1-p0)<0.1f) ? CREATE_ABORT: CREATE_STOP; } } else { ob->suspendSnap = FALSE; return (Length(m-sp0)<3 || Length(p1-p0)<0.1f) ? CREATE_ABORT: CREATE_STOP; } break; } } } else if (msg == MOUSE_ABORT) { return CREATE_ABORT; } return TRUE; }