// 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 } }