« C4D C.O.F.F.E.E. Randomクラスを使ってポリゴンやポイントをランダムに選択する。 | トップページ | C4D ユーザスクリプトをR9とR10以降に対応させる… »

C4D ポイントやポリゴンをランダム選択するユーザスクリプト。R10 & R9

前回のスクリプトは、ポリゴンオブジェクトのみにしか対応していませんでしたが、スプラインにも対応させました。

C4D R10タイプのスクリプト

「PointRandomSelect.ZIP」

試しに artist side に投稿してみました。

ただしSDK R11なので、C4D R10以降対応だろうか?
R9は非対応…
R9は、この記事の後半です。

Type SDK R11

/*
ポイントやポリゴンをランダムセレクトします。

Copyright(c)2009.6.20 村人とC4D
*/


class tools_dialog : GeModalDialog
{
  public:
    var seed;
    var rate;

    tools_dialog();
    Init();
    CreateLayout();
    AskClose();
}

tools_dialog::tools_dialog()
{
  super();
  seed = 0;
  rate = 0.5;
}

tools_dialog::Init()
{
  SetInt(1002 , seed , 0 , 2000000000 , 1);
  SetFloat(1004 , rate , 0.0 , 1.0 , 1);
}

tools_dialog::CreateLayout()
{
  SetTitle("ポリゴンオブジェクトの変形");
  AddGroupBeginV(1000 , BFV_SCALEFIT , 2 , "tools group" , 0);
    AddStaticText(1001 , 0 , 0 , 0 , "シード" , 0);
    AddEditNumber(1002, 0, 150, 0);
    AddStaticText(1003 , 0 , 0 , 0 , "選択率" , 0);
    AddEditNumber(1004, 0, 150, 0);
  AddGroupEnd();
  AddDlgGroup(DR_DLGGROUP_OK | DR_DLGGROUP_CANCEL);
}

tools_dialog::AskClose()
{
  seed = GetInt(1002);
  rate = GetFloat(1004);
}

ToolsExecution(obj , rate , seed)
{
  if(!instanceof(obj , PointObject))return;

  var sel;
  var poc;
  var p_sel = new(BaseSelect);
  p_sel->DeselectAll();

  if(IsCommandChecked(12139)){//ポイントモード
    sel = obj->GetPointSelection();
    poc = obj->GetPointCount();
  }else if(IsCommandChecked(12187) && !instanceof(obj , SplineObject)){//ポリゴンモード
    sel = obj->GetPolygonSelection();
    poc = obj->GetPolygonCount();
  }else return;

  if(!sel->GetCount())sel->SelectAll(0 , poc - 1);

  var rnd = new(Random);
  rnd->Init(seed);
  var i;
  var max = sel->GetCount() * rate;
  var number;

  //エレメントの選択
  for(i = 0 ; i < max ; i++){
    do{
      number = int(rnd->Get01() * poc);
    }while(p_sel->IsSelected(number) || !sel->IsSelected(number));
    p_sel->Select(number);
  }

  //選択の適用
  if(IsCommandChecked(12139)){//ポイントモード
    obj->SetPointSelection(p_sel);
  }else if(IsCommandChecked(12187)){//ポリゴンモード
    obj->SetPolygonSelection(p_sel);
  }
}



main(doc , op)
{
  if(!object(0))return;

  var t_dialog = new(tools_dialog);
  t_dialog->Open(-1 , -1);
  if(!(t_dialog->GetResult()))return;

  var i;

  doc->StartUndo();
  for(i = 0 ; object(i) ; i++){
    doc->AddUndo(UNDO_OBJECT_BASEDATA , object(i));

    ToolsExecution(object(i) , t_dialog->rate , t_dialog->seed);
  }
  doc->EndUndo();
}

メニューの状態です。

var i;
ENABLE = FALSE;
for(i = 0 ; object(i) ; i++){
  if(instanceof(object(i) , PointObject))ENABLE = TRUE;
}

ここからが、C4D R9対応です。

Type SDK R9.5

/*
ポイントやポリゴンをランダムセレクトします。

Copyright(c)2009.6.20 村人とC4D
*/


class tools_dialog : GeModalDialog
{
  public:
    var seed;
    var rate;

    tools_dialog();
    Init();
    CreateLayout();
    AskClose();
}

tools_dialog::tools_dialog()
{
  super();
  seed = 0;
  rate = 0.5;
}

tools_dialog::Init()
{
  SetInt(1002 , seed , 0 , 2000000000 , 1);
  SetFloat(1004 , rate , 0.0 , 1.0 , 1);
}

tools_dialog::CreateLayout()
{
  SetTitle("ポリゴンオブジェクトの変形");
  AddGroupBeginV(1000 , BFV_SCALEFIT , 2 , "tools group" , 0);
    AddStaticText(1001 , 0 , 0 , 0 , "シード" , 0);
    AddEditNumber(1002, 0, 150, 0);
    AddStaticText(1003 , 0 , 0 , 0 , "選択率" , 0);
    AddEditNumber(1004, 0, 150, 0);
  AddGroupEnd();
  AddDlgGroup(DR_DLGGROUP_OK | DR_DLGGROUP_CANCEL);
}

tools_dialog::AskClose()
{
  seed = GetInt(1002);
  rate = GetFloat(1004);
}

ToolsExecution(obj , rate , seed)
{
  if(!instanceof(obj , PointObject))return;

  var sel;
  var poc;
  var p_sel = new(BaseSelect);
  p_sel->DeselectAll();

  if(IsCommandChecked(12139)){//ポイントモード
    sel = obj->GetPointSelection();
    poc = obj->GetPointCount();
  }else if(IsCommandChecked(12187) && !instanceof(obj , SplineObject)){//ポリゴンモード
    sel = obj->GetPolygonSelection();
    poc = obj->GetPolygonCount();
  }else return;

  if(!sel->GetCount())sel->SelectAll(0 , poc - 1);

  var rnd = new(Random);
  rnd->Init(seed);
  var i;
  var max = sel->GetCount() * rate;
  var number;

  //エレメントの選択
  for(i = 0 ; i < max ; i++){
    do{
      number = int(rnd->Get01() * poc);
    }while(p_sel->IsSelected(number) || !sel->IsSelected(number));
    p_sel->Select(number);
  }

  //選択の適用
  if(IsCommandChecked(12139)){//ポイントモード
    obj->SetPointSelection(p_sel);
  }else if(IsCommandChecked(12187)){//ポリゴンモード
    obj->SetPolygonSelection(p_sel);
  }
}



main(doc , op)
{
  var obj = GetActiveObject(doc);
  if(!obj)return;
 

  var t_dialog = new(tools_dialog);
  t_dialog->Open(-1 , -1);
  if(!(t_dialog->GetResult()))return;

  var i;

  doc->StartUndo();
  for(; obj ; obj = obj->SearchNext(BIT_AOBJ)){
    doc->AddUndo(UNDO_OBJECT_BASEDATA , obj);

    ToolsExecution(obj , t_dialog->rate , t_dialog->seed);
  }
  doc->EndUndo();
}

メニューの状態です。

var obj = GetActiveObject(doc);
ENABLE = FALSE;
for(; obj ; obj = obj->SearchNext(BIT_AOBJ)){
  if(instanceof(obj , PointObject))ENABLE = TRUE;
}

C4D R9タイプのユーザスクリプトです。

「PointRandomSelect_R9.ZIP」

|

« C4D C.O.F.F.E.E. Randomクラスを使ってポリゴンやポイントをランダムに選択する。 | トップページ | C4D ユーザスクリプトをR9とR10以降に対応させる… »