How to Handle Handles

On 21/02/2013 at 09:05, xxxxxxxx wrote:

User Information:
Cinema 4D Version:   13 
Platform:    Mac  ;  
Language(s) :     C++  ;

---------
Hello all, 
I've been experimenting with the Rounded Tube example plugin and I've been trying to figure out how handles work and I think I have a basic understanding of them now.  I'm getting stuck thought trying to make a handle that can move on the X and Z axis independently of each other.  I swapped the rounded tube out with a plane and I want to control the height and width with a handle in the corner.  Which I can do, but it always moves the same on both axises.

I think it has to do with changing something on these two lines in GetHandle(), but I'm not to sure what I need to change.

  
info.direction = Vector(1.0, 0.0, 0.0);  
info.type = HANDLECONSTRAINTTYPE_LINEAR;  

Any hints would be useful.  Thanks!

Dan

On 21/02/2013 at 13:17, xxxxxxxx wrote:

Here are the Handle methods that I use in one of my plugins.  Not that the UNFURL_UNFURL_AMOUNT goes from 0.0 to 1.0 (0% to 100%).

// ObjectData.Draw  
//*---------------------------------------------------------------------------*  
DRAWRESULT UnfurlObj::Draw(BaseObject* op, DRAWPASS drawpass, BaseDraw* bd, BaseDrawHelp* bh)  
//*---------------------------------------------------------------------------*  
{  
  if (!(op && bd && bh))                return DRAWRESULT_DRAWN;  
  
  if (drawpass == DRAWPASS_HANDLES)  
  {  
      LONG        hitid = op->GetHighlightHandle(bd);  
      HandleInfo    info;  
  
      bd->SetPen(GetViewColor(VIEWCOLOR_ACTIVEPOINT));  
      bd->SetMatrix_Matrix(op, bh->GetMg());  
      GetHandle(op, 0L, info);  
      if (hitid == 0L)    bd->SetPen(GetViewColor(VIEWCOLOR_SELECTION_PREVIEW));  
      else                bd->SetPen(GetViewColor(VIEWCOLOR_ACTIVEPOINT));  
      bd->DrawHandle(info.position, DRAWHANDLE_BIG, 0L);  
  
      GetHandle(op, 1L, info);  
      bd->SetPen(GetViewColor(VIEWCOLOR_ACTIVEPOINT));  
      bd->DrawLine(info.position, Vector(0.0), 0L);  
      bd->SetMatrix_Matrix(NULL, Matrix());  
      if (hit == 0L)    bd->SetPen(GetViewColor(VIEWCOLOR_SELECTION_PREVIEW));  
      else            bd->SetPen(GetViewColor(VIEWCOLOR_ACTIVEPOINT));  
      bd->DrawHandle(GetHandle(op, 0L),DRAWHANDLE_BIG,0L);  
      // Line from center to Handle  
      bd->SetPen(GetViewColor(VIEWCOLOR_ACTIVEPOINT));  
      bd->DrawLine(GetHandle(op, 1L),m.off,0L);  
  }  
  return SUPER::Draw(op, drawpass, bd, bh);  
}  
// ObjectData.GetHandle  
//*---------------------------------------------------------------------------*  
void UnfurlObj::GetHandle(BaseObject* op, LONG i, HandleInfo& info)  
//*---------------------------------------------------------------------------*  
{  
  BaseContainer* data =    op->GetDataInstance();  
  if (!data)                return;  
  
  info.position.x =        data->GetReal(UNFURL_UNFURL_AMOUNT)*125.0;  
  info.direction.x =        1.0;  
  info.type =                HANDLECONSTRAINTTYPE_LINEAR;  
}  
// ObjectData.DetectHandle  
//*---------------------------------------------------------------------------*  
LONG UnfurlObj::DetectHandle(BaseObject* op, BaseDraw* bd, LONG x, LONG y, QUALIFIER qualifier)  
//*---------------------------------------------------------------------------*  
{  
  HandleInfo    info;  
  GetHandle(op, 0L, info);  
  return (bd->PointInRange(info.position*op->GetMg(),x,y))?0L:NOTOK;  
}  
// ObjectData.MoveHandle  
//*---------------------------------------------------------------------------*  
Bool UnfurlObj::MoveHandle(BaseObject* op, BaseObject* undo, const Vector& mouse_pos, LONG hit_id, QUALIFIER qualifier, BaseDraw* bd)  
//*---------------------------------------------------------------------------*  
{  
  BaseContainer*    dst =    op->GetDataInstance();  
  if (!dst)                return TRUE;  
  HandleInfo        info;  
  Real            val =    mouse_pos.x;  
  GetHandle(op, hit_id, info);  
  
  if (bd)  
  {  
      Matrix mg =        op->GetUpMg() * undo->GetMl();  
      Vector pos =    bd->ProjectPointOnLine(info.position * mg, info.direction ^ mg, mouse_pos.x, mouse_pos.y);  
      val =            (pos * !mg) * info.direction;  
  }  
  
  if (hit_id != 0L)        return TRUE;  
  dst->SetReal(UNFURL_UNFURL_AMOUNT,FCut01(val*0.008));  
  return TRUE;  
}  

On 06/03/2013 at 10:45, xxxxxxxx wrote:

Thanks a ton Robert, I got distracted by some other projects, cause for the every late response.

Dan