Esempio n. 1
0
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;
}