// Symmetrize Polygons Point Order v0.121
@name "SymPolsPntOrder"
@version 2.5
@warnings
@script modeler
// 一度に対象にする最大ポリゴン数
@define MAX_POLY 100
main
{
selmode(DIRECT);
var i, c, Half, SelPol;
(i,,,,SelPol,) = polycount();
// 90/92/93 はpoint/poly countでUndoバッファを消費する
@if version < 2.2
undo();
@end
@if version > 2.7
undo();
@end
if((i < 2) || (SelPol > MAX_POLY)){
error("
Need Select or Higher than ",MAX_POLY," Quad Polys.");
return;
}
if(i != SelPol){
selmode(USER);
selpolygon(CLEAR, NVLT, 4);
selpolygon(CLEAR, NVGT, 4);
selmode(DIRECT);
}
var SrcPol[5];
var DstPol[5];
var PntIdx[4];
var SrcVec;
var StPnt = 0;
var p = 1;
var x = 1;
Half = SelPol >> 1;
var ModPol[SelPol + 1];
editbegin();
for(i = 1; i <= Half; i++){
@if version == 2.5
SrcPol = polyinfo(polygons[p]);
SrcVec = pointinfo(SrcPol[2]);
@else
SrcVec = pointinfo(polygons[p].points[1]);
@end
SrcVec.x *= -1.0;
p += 1;
DstPol = polyinfo(polygons[p]);
for(c = 2; c <= 5; c++){
if(SrcVec == pointinfo(DstPol[c])){
StPnt = c;
break;
}
}
switch(StPnt){
case 1:
case 2:
// 2だったら同じなので何もしない。
break;
case 3:
PntIdx[1] = DstPol[3];
PntIdx[2] = DstPol[4];
PntIdx[3] = DstPol[5];
PntIdx[4] = DstPol[2];
polypoints(polygons[p], PntIdx);
ModPol[x] = polygons[p - 1];
x += 1;
ModPol[x] = polygons[p];
x += 1;
break;
case 4:
PntIdx[1] = DstPol[4];
PntIdx[2] = DstPol[5];
PntIdx[3] = DstPol[2];
PntIdx[4] = DstPol[3];
polypoints(polygons[p], PntIdx);
ModPol[x] = polygons[p - 1];
x += 1;
ModPol[x] = polygons[p];
x += 1;
break;
case 5:
PntIdx[1] = DstPol[5];
PntIdx[2] = DstPol[2];
PntIdx[3] = DstPol[3];
PntIdx[4] = DstPol[4];
polypoints(polygons[p], PntIdx);
ModPol[x] = polygons[p - 1];
x += 1;
ModPol[x] = polygons[p];
x += 1;
break;
default:
break;
}
p += 1;
StPnt = 0;
}
editend();
if(x != 1){
selmode(USER);
selpolygon(CLEAR, POLYID, ModPol);
i = x >> 1;
info("
Sym PointOrder. Changed [ ", i, " ] Polys.");
// 90/92/93 はeditbegin/end の後のselpoint/polyでUndoバッファを消費する
@if version < 2.2
undo();
@end
@if version > 2.7
undo();
@end
}
}