オブジェクトを含むの配列はソート出来ない
むー
まぁ、ふつうに考えれば、ソートしようにも
何でソートするかが判定できないのだな
比較可能な情報が特定できない、もしくはないので比較できない
それじゃ、たとえば、配列に入れたオブジェクトを
名前順に入れ替えるにはどうすればいいのだろう
実直に、名前を回収して
ソートをすればいいのかもしれないが
Maxはオブジェクト名を重複して持つことが出来る
なぜ出来るかといえば、Maxはオブジェクトの管理にinodeを使っているからだ
つまりは管理番号があるのサ
ちなみに、オブジェクト名で選択する記事
http://www.sakaiden.com/?p=1612
その番号を知るには $.inode.handle といった感じで
ってことは、名前だけ回収して、配列に入れ直すと
重複していた場合に誤作動となるわけだな
では、どうやってソートするか
ここで登場するのが
stricmp と qsort
stricmp は文字列の並びの大小を比較し
qsort は配列のソートルールを任意に決められるモノだぞ
stricmpについては、たとえば
stricmp “a” “b”
とした場合、bはaよりも文字は後にくるモノだから、これを数値に置き直し
-1というリザルトが出てくる
最初の文字を0として、どれくらい前または後に出てくる文字なのかを
数字で教えてくれるのサ、stricmp “a” “c”ならば-2だぞ
ちなみに、文字列の比較しても頭文字でしか判断はしてくれないので注意
一応、日本語名の比較もいけるみたいだぞ
ではでは、オブジェクト名でソートするやつをどうぞ
[as3]
selObj = selection as Array;
print selObj;
fn nameStringSort_Fn s1 s2 =
(
–名前の文字列を比較した結果を代入
local a = (stricmp s1.name s2.name);
–比較結果から仕分けを行う
case of
(
(a < 0.): -1
(a > 0.): 1
default: 0
);–case end
);–fn end
–任意のルール(nameStringSort_Fn)で名前順にソートする
qsort selObj nameStringSort_Fn
print selObj
/*以下は実行結果のリザルト
ソート前
$Box:Box04 @ [58.229515,68.666962,0.000000]
$Cylinder:Cylinder01 @ [228.840652,-183.777267,0.000000]
$GeoSphere:GeoSphere01 @ [-34.308987,-0.816744,0.000000]
$Tube:Tube01 @ [-144.798553,14.125756,0.000000]
$Teapot:Teapot02 @ [79.235031,-106.924255,0.000000]
$平面:Plane01 @ [40.678776,-134.332596,0.000000]
$Pyramid:Pyramid01 @ [25.698250,-65.091812,0.005000]
$Box:Box01 @ [-51.889168,-33.249371,0.000000]
$Box:Box02 @ [145.889282,-85.260338,0.000000]
$Box:Box03 @ [55.511215,-16.000343,0.000000]
$Sphere:Sphere01 @ [82.172897,-162.063416,0.000000]
$Torus:Torus01 @ [105.171730,-95.666649,0.000000]
$Cone:Cone01 @ [234.447601,-149.137039,0.000000]
$Torus:Torus02 @ [-165.573486,124.228073,0.000000]
$Teapot:Teapot01 @ [154.617615,-183.855530,0.000000]
ソート後
$Box:Box01 @ [-51.889168,-33.249371,0.000000]
$Box:Box02 @ [145.889282,-85.260338,0.000000]
$Box:Box03 @ [55.511215,-16.000343,0.000000]
$Box:Box04 @ [58.229515,68.666962,0.000000]
$Cone:Cone01 @ [234.447601,-149.137039,0.000000]
$Cylinder:Cylinder01 @ [228.840652,-183.777267,0.000000]
$GeoSphere:GeoSphere01 @ [-34.308987,-0.816744,0.000000]
$平面:Plane01 @ [40.678776,-134.332596,0.000000]
$Pyramid:Pyramid01 @ [25.698250,-65.091812,0.005000]
$Sphere:Sphere01 @ [82.172897,-162.063416,0.000000]
$Teapot:Teapot01 @ [154.617615,-183.855530,0.000000]
$Teapot:Teapot02 @ [79.235031,-106.924255,0.000000]
$Torus:Torus01 @ [105.171730,-95.666649,0.000000]
$Torus:Torus02 @ [-165.573486,124.228073,0.000000]
$Tube:Tube01 @ [-144.798553,14.125756,0.000000]
*/
[/as3]
こんなところだ
実行後はちゃんと名前順に並んでいるぞ
途中の平面は、元々名前がPlaneなので、そっちで比較されているのだ
よし、また一つ勉強になった
一応、アップしておこう