« C.O.F.F.E.E.プラグイン「ThreePointsToArc」-不具合を修正するための考察 | トップページ | C.O.F.F.E.E.での配列変数のテスト-3 »

C.O.F.F.E.E.プラグイン「ThreePointsToArc」-不具合を修正するためのスクリプトテスト

早速SendModelingCommand()を使ったスクリプトをテストしてみよう。
使うものは…
閉じたスプラインとスクリプトマネージャ。
それと、このブログの以前のネタ
それでは、スクリプトを…

SendModelingCommand()で「始点を設定」を使ってスプラインのポイント順番を変更する。
ところでSendModelingCommand()は、どう使うんだっけ?
やはり、このブログの以前のネタを復習するか。

SendModelingCommand(command , document , object , container , mode)

使う定数は…

MCOMMAND_SPLINE_REORDER 始点を設定

commandが、MCOMMAND_SPLINE_REORDER
documentを指定するとUndoが記録されると。NULLだと記録しないと。
objectは、今回スプラインだからopでいいね。
containerは記載されていないから空のcontainerでいいのかな。
modeは、選択されたポイントに適用か、全部のポイントに適用か。MODIFY_POINTSELECTION / MODIFY_ALL
始点を設定の時はどうするんだろうね。

で始点はどうやって指定するんだ?
modeで選択したポイントにするのか決めるのか?
これだと、ポイントを実際に選択状態にしないといけないのか?

とりあえず適当にスクリプトを打ってみよう。

/*
SendModelingComand()で始点を設定
2009.1.7
*/


if(!instanceof(op , SplineObject))return;//スプラインでなければ処理を中止。

var ct = new(BaseContainer);//空のコンテナ

SendModelingCommand(MCOMMAND_SPLINE_REORDER , NULL , op , ct , MODIFY_POINTSELECTION);//始点の設定

ん?意外とすっきりした3行しかないスクリプトになった。
では実行。その前にスプラインの始点以外のポイントのどれかを選択してからね。

結果は、確かに選択したポイントが始点になりました。

Sendmodelingcommand1

ポイントを複数選択すると、一番若い番号が始点に設定されました。

Sendmodelingcommand2

modeの定数、MODIFY_POINTSELECTION / MODIFY_ALLを変えてみよう。

どちらも変わりなく選択したポイントが始点になりました。
ちょっと待てよ、始点と終点をまたいで複数選択したら、このコマンドはどうなるんだ?

なんと、変化なし。始点の位置は変わらず…
あ、そうだよね。複数選択された場合は一番若い番号なんだから、もともとの始点が始点になるんだね。

そうすると始点/終点をまたいだ選択の場合は…
次のスクリプトを試してみよう。

/*
SendModelingComand()で始点を設定
始点/終点をまたいだ選択時の処理
2009.1.7
*/


if(!instanceof(op , SplineObject))return;//スプラインでなければ処理を中止。
if(!(op#SPLINEOBJECT_CLOSED))return;//スプラインが閉じていなければ処理を中止

var ptc = op->GetPointCount();//ポイント数の取得
var sel = op->GetPointSelection();//ポイント選択状況を取得
var i = 0;//カウンター用

if(sel->IsSelected(0) && sel->IsSelected(ptc - 1)){//始点と終点が選択状態か?
  for(i = ptc - 1 ; i > 0 ; i--){//終点から始点への逆ループ
    if(sel->IsSelected(i) != sel->IsSelected(i - 1))break;//前のポイントの選択状態が違えば、そこが選択状態の端。ループを中断
  }
  sel->DeselectAll();//全てを選択解除
  sel->Select(i);//ループカウンターが停止した番号を選択
  op->SetPointSelection(sel);//選択状況をオブジェクトに適用
}

var ct = new(BaseContainer);//SendModelingCommand()のための空のコンテナ

SendModelingCommand(MCOMMAND_SPLINE_REORDER , NULL , op , ct , MODIFY_ALL);//始点の設定

Sendmodelingcommand3

これで、選択状態が始点/終点がまたがっていても始点の設定が可能になります。
後は、セグメントに対応させれば、問題が解決だね。

|

« C.O.F.F.E.E.プラグイン「ThreePointsToArc」-不具合を修正するための考察 | トップページ | C.O.F.F.E.E.での配列変数のテスト-3 »

コメント

この記事へのコメントは終了しました。