« C4D Python R12 テスト:ポリゴンオブジェクトのN-gonsってどうなってるの? | トップページ | C4D Python R12 テスト:任意のポイントやポリゴンの隣接ポリゴンを取得するc4d.utils.Neighborを試してみた。 »

C4D Python R12 テスト:ポリゴンオブジェクトのエッジ試してみる。

エッジもCOFFEEでは扱われていないんだよね…

C4D Python SDK Documentを読んでみたけど…
エッジの実体も詳しく書いていない。

ポリゴンはc4d.CPolygonとして定義されている。
エッジは定義されていないようだ。まだ勉強不足だから断定はできないけど。

考えられる事は…
2つのポイント番号で構成されるのか、ポリゴンの辺ab:0、bc:1、cd:2、da:3という事だろうか?

PolygonObjectクラスには、エッジの選択GetEdgeS()メソッドがあるので、実際にポリゴンオブジェクトを使って選択してみて試してみる。

こんなポリゴンオブジェクトを使ってみる。

Edge_01

エッジモードにし、ポリゴンオブジェクトの全てのエッジを選択してスクリプトを実行してみる。

Edge_02

Python
import c4d

def main():
    sel = op.GetEdgeS()
    print sel.GetCount()

if __name__=='__main__':
    main()
24

結果は24…

エッジの数は12本なのに…倍の24

始終点の2つのポイントならば12本×2で24と言うことだろうか…
それとも、6ポリゴン×4エッジで24と言う事だろうか?

Python
import c4d

def main():
    sel = op.GetEdgeS()
    print sel.GetCount()
    for c in xrange(24):
        print c, ':', sel.IsSelected(c)

if __name__=='__main__':
    main()
24
0 : True
1 : True
2 : True
3 : True
4 : True
5 : True
6 : True
7 : True
8 : True
9 : True
10 : True
11 : True
12 : True
13 : True
14 : True
15 : True
16 : True
17 : True
18 : True
19 : True
20 : True
21 : True
22 : True
23 : True

全てのエッジが選択されていて、24個のTrue…

ポリゴン0の全てのエッジを選択して試してみた。

Edge_03

8
0 : True
1 : True
2 : True
3 : True
4 : True
5 : False
6 : False
7 : False
8 : False
9 : False
10 : False
11 : False
12 : False
13 : False
14 : True
15 : False
16 : False
17 : False
18 : False
19 : True
20 : False
21 : True
22 : False
23 : False

ポリゴン1の全てのエッジを選択して実行してみる。

Edge_04

8
0 : False
1 : False
2 : True
3 : False
4 : True
5 : True
6 : True
7 : True
8 : True
9 : False
10 : False
11 : False
12 : False
13 : False
14 : False
15 : False
16 : False
17 : False
18 : True
19 : False
20 : False
21 : False
22 : True
23 : False

6枚のそれぞれのポリゴンのエッジを選択して実行してみた結果。

ポリゴン0 ポリゴン1 ポリゴン2 ポリゴン3 ポリゴン4 ポリゴン5
0 : True
1 : True
2 : True
3 : True
4 : True
5 : False
6 : False
7 : False
8 : False
9 : False
10 : False
11 : False
12 : False
13 : False
14 : True
15 : False
16 : False
17 : False
18 : False
19 : True
20 : False
21 : True
22 : False
23 : False
0 : False
1 : False
2 : True
3 : False
4 : True
5 : True
6 : True
7 : True
8 : True
9 : False
10 : False
11 : False
12 : False
13 : False
14 : False
15 : False
16 : False
17 : False
18 : True
19 : False
20 : False
21 : False
22 : True
23 : False
0 : False
1 : False
2 : False
3 : False
4 : False
5 : False
6 : True
7 : False
8 : True
9 : True
10 : True
11 : True
12 : True
13 : False
14 : False
15 : False
16 : False
17 : True
18 : False
19 : False
20 : False
21 : False
22 : False
23 : True
0 : True
1 : False
2 : False
3 : False
4 : False
5 : False
6 : False
7 : False
8 : False
9 : False
10 : True
11 : False
12 : True
13 : True
14 : True
15 : True
16 : True
17 : False
18 : False
19 : False
20 : True
21 : False
22 : False
23 : False
0 : False
1 : True
2 : False
3 : False
4 : False
5 : True
6 : False
7 : False
8 : False
9 : True
10 : False
11 : False
12 : False
13 : True
14 : False
15 : False
16 : True
17 : True
18 : True
19 : True
20 : False
21 : False
22 : False
23 : False
0 : False
1 : False
2 : False
3 : True
4 : False
5 : False
6 : False
7 : True
8 : False
9 : False
10 : False
11 : True
12 : False
13 : False
14 : False
15 : True
16 : False
17 : False
18 : False
19 : False
20 : True
21 : True
22 : True
23 : True

どうやら下の様な関係が成り立っているようだ…

ID ポリゴンのEdge 隣接ポリゴンのEdge
0 ポリゴン0:ab ポリゴン3:cd
1 ポリゴン0:bc ポリゴン4:da
2 ポリゴン0:cd ポリゴン1:ab
3 ポリゴン0:da ポリゴン5:bc
4 ポリゴン1:ab ポリゴン0:cd
5 ポリゴン1:bc ポリゴン4:cd
6 ポリゴン1:cd ポリゴン2:ab
7 ポリゴン1:da ポリゴン5:cd
8 ポリゴン2:ab ポリゴン1:cd
9 ポリゴン2:bc ポリゴン4:bc
10 ポリゴン2:cd ポリゴン3:ab
11 ポリゴン2:da ポリゴン5:da
12 ポリゴン3:ab ポリゴン2:cd
13 ポリゴン3:bc ポリゴン4:ab
14 ポリゴン3:cd ポリゴン1:ab
15 ポリゴン3:da ポリゴン5:ab
16 ポリゴン4:ab ポリゴン3:bc
17 ポリゴン4:bc ポリゴン2:bc
18 ポリゴン4:cd ポリゴン1:bc
19 ポリゴン4:da ポリゴン0:bc
20 ポリゴン5:ab ポリゴン3:da
21 ポリゴン5:bc ポリゴン0:da
22 ポリゴン5:cd ポリゴン1:da
23 ポリゴン5:da ポリゴン2:da

ポリゴン0のポイントa,b間のエッジは、隣接するポリゴン3のポイントc,d間のエッジを共有しているので、GUIでポリゴン0:abを選択しPythonでEdgeのBaseSelectを取得すると、ID:0と14がTrueになるようだ。

先ほどの図にエッジを書き込んでみた…
最高に見づらい図になってしまった…図というよりもゴミか…

Edge_05

BaseSelectのIDとN番目のポリゴンエッジの関係は下の図です。

Edge_06

三角ポリゴンの場合は次の様になります。

Edge_07

最後に選択ポリゴンの全てのエッジを選択するスクリプトを作ってみる。
深く考えていないので、完成度はかなり低いよ…

Python
import c4d
from c4d import documents

def main():
    if not isinstance(op, c4d.PolygonObject): #選択オブジェクトがポリゴンオブジェクト以外は終了
        return
    if doc.GetMode() != c4d.Mpolygons: #ポリゴンモード以外は終了
        return
    #ポリゴン用BaseSelectとポリゴンとポリゴン数の取得
    poly_sel = op.GetPolygonS()
    if not poly_sel.GetCount(): #ポリゴンがなにも選択されていなければ終了
        return
    poly_cnt = op.GetPolygonCount()
    poly = op.GetAllPolygons()

    #エッジ用のBaseSelectの取得と選択解除
    edge_sel = op.GetEdgeS()
    edge_sel.DeselectAll()

    #ポリゴンの捜査
    for c in xrange(poly_cnt):
        if poly_sel.IsSelected(c): #選択されたポリゴンのエッジを選択
            edge_sel.Select(c*4)
            edge_sel.Select(c*4+1)
            if poly[c].c != poly[c].d: #三角ポリゴンの場合は3番目のエッジは選択対象外
                edge_sel.Select(c*4+2)
            edge_sel.Select(c*4+3)

    doc.SetMode(c4d.Medges) #エッジモードへ変更


if __name__=='__main__':
    main()
    c4d.EventAdd()

Edge_08

結果は、「選択範囲を変換」のポリゴンからエッジに似ている。

Edge_09

選択されたポリゴンの隣接ポリゴンのエッジは処理していません。
ポリゴンオブジェクトのポリゴンの隣接取得するならばc4d.utils.Neighborを使用するといいようだ。

まだまだ勉強不足だ…

|

« C4D Python R12 テスト:ポリゴンオブジェクトのN-gonsってどうなってるの? | トップページ | C4D Python R12 テスト:任意のポイントやポリゴンの隣接ポリゴンを取得するc4d.utils.Neighborを試してみた。 »

コメント

コメントを書く



(ウェブ上には掲載しません)




« C4D Python R12 テスト:ポリゴンオブジェクトのN-gonsってどうなってるの? | トップページ | C4D Python R12 テスト:任意のポイントやポリゴンの隣接ポリゴンを取得するc4d.utils.Neighborを試してみた。 »