// Simple Split 0.221 // 面選択を省けるだけのSplit @name "SimpleSplit" @version 2.5 @warnings @script modeler @define MAX_POINT 20 main { selmode(DIRECT); var SelPts = pointcount(); // 1行内で2つのdefineは効かない?↓ if((SelPts <= 1) || (SelPts >= MAX_POINT)){ error("
Lower than 2 or Higher than ",MAX_POINT,". now [",SelPts,"] Pts"); return; } editbegin(); // 頂点を含むポリのリスト作成 var TempBuf, StockPol, StorePol; var StockSize = 1; for(i = 1; i <= SelPts; i++){ TempBuf = points[i].polygon(); if(TempBuf == nil){ error("
Found 0 pt Poly"); return; } // 可変数配列のTempBufは使い回し。nilを含みうる為size()でなくcount()を使う x = TempBuf.count(); for(c = 1; c <= x; c++){ StockPol[StockSize] = TempBuf[c]; StockSize++; } } editend(); StockPol.sortA(); // (*1)で最後に重複判定を失敗させる為の終端 StockPol[StockSize] = 0; var Flag = false; // 比較の基点用 i = 1; // 格納配列用 c = 1; // 重複する(構成頂点の2点以上が選択されてる)ポリだけを抽出(*1) while(i < StockSize){ for(x = i + 1; x <= StockSize; x++){ // 基点と重複していたらフラグ if(StockPol[i] == StockPol[x]){ Flag = true; }else{ // してなければ、過去に重複していたか判定。重複ありなら格納 if(Flag){ StorePol[c] = StockPol[i]; c++; Flag = false; } // IDでソートされている為、直下に重複が無ければ基点をずらして次の重複チェックへ i = x; break; } } } selmode(USER); selpolygon(SET, POLYID, StorePol); splitpols(); selpolygon(CLEAR); selpoint(CLEAR); }