« そう言えば…C4D PluginIDの取得の時に検索した… | トップページ | C.O.F.F.E.E.プラグイン「ThreePointsToArc」-不具合を修正するためのスクリプトテスト »

C.O.F.F.E.E.プラグイン「ThreePointsToArc」-不具合を修正するための考察

プラグイン「ThreePointsToArc」-不具合である、閉じてるスプラインでセグメント有/無にかかわらず、始点/終点を含む3点を選択した時の対応は、どうすれば良いのだろう…

メニュープラグインとして作成しました。
実行の条件は、
・アクティブオブジェクトが有るか。
・選択されたオブジェクトがスプラインオブジェクトであり、スプラインプリミティブオブジェクトではない事。
・オブジェクトのポイント数が3点以上あるか。
・選択されているポイントが3点であるか。
・その選択された3点は連続しているか。
・さらに3点は同じセグメント中にあるか。

これを満たしていればMenuPlugin::GetState()からCMD_ENABLEDを返します。

では、スプラインが閉じている場合、始点/終点を含む3点が選択されている時、見た目には連続していますが、ポイント番号順では非連続になります。
スプラインのポイント数が4点以上の場合、始点/終点を含む3点は、2点までが連続で残りの1点が非連続になります。

Treepointstoarc_8

この条件を満たすには…

セグメントが無い場合
・最初のポイントと、最後のポイントが選択されているか。
・さらに、始点の隣、または終点の隣が選択されているか。
で良いでしょう。
セグメントが有る場合は…
選択されているポイントのセグメント番号を取得してセグメントの始点終点を取得したあと、セグメントが無い場合と同じように条件を満たすか判断する。

では、仮にこの条件をクリアして、MenuPlugin::Execute(doc)を実行できたとして、非連続のポイントにどう処理したら良いのだろう。
できれば修正は簡単なほうがいいなぁ。

修正前(現在)の大まかな手順は、
・ポイント配列/ハンドル(タンジェント)配列を取得。
・円弧を適用するポイント3点の先頭のポイント番号を取得。
・先頭のポイント番号、先頭番号 + 1の番号、先頭番号 + 2の番号のポイントに対応するハンドルを修正。
ちょっと大まかすぎですか?

Treepointstoarc_9

これは連続している事を前提としています。
始点/終点を含む非連続の状態でこの処理に通すと…
円弧を適用する先頭の番号を取得する段階で、始点が選択されているので、始点から始まる3点に適用することになります。

どうしようか…

3点を別配列に格納して(ハンドル配列も別配列)、それに円弧を適用して戻す。
別配列にするのは簡単だけど、言葉では「戻す」と一言ですむけど、戻すのは大変だなぁ。しかも3点で補間できないとポイントが増やさないといけないし…
ところで配列のインデックス数を増やすにはどうするんだろう?
何かそれらしい関数あったかなぁ?
インデックス数を増やした新しい変数を宣言して、それに移し変えるのかな?どうなんだろう?

それともスプラインの3点分を切り出し新しいスプラインオブジェクトを内部的に用意して適用して元のスプラインにマージする?それも良いかも。ハンドルの調整パートもポイントの追加パートも変更しなくてすみそうだし。
切り出して別のスプラインにしたり、マージするのはSendModelingCommand()でできそうな…

ん?SendModelingCommand()使うなら「始点を設定」でポイント順を変えて選択ポイント番号が連続するようにするだけで他のコードを変えることなく修正が終了できそうな…
どうせスプラインは閉じてるんだし。
多分SendModelingCommand()使って「始点を設定」を適用したら自動的にハンドルの順番も変更してくれると思うが…

それとも、自前でセグメント中のポイント順とハンドル順をループシフトするコードを書くか?切って貼ってよりループシフトの方が簡単かも…
あ、でも始点は処理後、戻したほうが良いよね…

ん?よく考えてみると、切り出して処理して戻す方法でもポイントの順番を変えないといけないですね。

|

« そう言えば…C4D PluginIDの取得の時に検索した… | トップページ | C.O.F.F.E.E.プラグイン「ThreePointsToArc」-不具合を修正するためのスクリプトテスト »

コメント

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