// Merge Points No Requester3 0.103 // 頂点とポリを選択して実行するとモーフマップの辻褄を合わせてMergepointする // 選択中のポリゴンに属する頂点のモーフを保持 // 頂点としか選択されてない場合、単純にマージを呼んで終了 @name "MergeNoReq3" @version 2.5 @warnings @script modeler main { @if version != 2.5 // モデラでモーフ選択があったらストップ var vmap = VMap(VMMORPH, 0); if(vmap != nil){ error("Plz Deselect Morph Map"); return; } @end // undogroupbegin()〜undogroupend()で括った範囲がUndo1回分になるようになる。 // とか、そんな感じだったはず。非公式無保証コマンド。9対策の最後の手段と思うべし @if version < 2.2 undogroupbegin(); @end @if version > 2.7 undogroupbegin(); @end selmode(DIRECT); var SelPts = pointcount(); // 90/92/93 はpoint/poly countでUndoバッファを消費する if(SelPts < 2){ @if version < 2.2 undogroupend(); @end @if version > 2.7 undogroupend(); @end info("
Need 2pts or more."); return; } var SelPoly; (SelPoly) = polycount(); // 90/92/93 はpoint/poly countでUndoバッファを消費する if(SelPts && SelPoly){ // 辻褄合わせモード // モーフマップリスト作成 vmap = VMap(VMMORPH); if(vmap == nil){ error("
not found Moprh Map, I can't help you"); return; } var VMaps; while(vmap && vmap.type == VMMORPH){ VMaps += vmap; vmap = vmap.next(); } var VMapCnt = VMaps.size(); editbegin(); // 選択ポリゴンの頂点を取得 var PolPts, PolCnt, TempBuf; for(i = 1, PolCnt = 1; i <= SelPoly; i++){ var x = polygons[i].pointCount; @if version == 2.5 TempBuf = polyinfo(polygons[i]); for(c = 2, x += 1; c <= x; c++) PolPts[PolCnt++] = TempBuf[c]; @else for(c = 1; c <= x; c++) PolPts[PolCnt++] = polygons[i].points[c]; @end } PolPts.sortA(); PolPts.reduce(); PolCnt = PolPts.size(); // 選択ポリゴンの頂点と選択頂点を照合。マッチ>基準点、非マッチ>変更対象 var SrcPts, SrcCnt, DstPts, DstCnt; var Flag = false; for(i = 1, SrcCnt = 0, DstCnt = 0; i <= SelPts; i++){ for(c = 1; c <= PolCnt; c++){ if(points[i] == PolPts[c]){ SrcPts[++SrcCnt] = points[i]; Flag = true; break; } } if(!Flag) DstPts[++DstCnt] = points[i]; else Flag = false; } // 位置照合用の座標取得 var DstVec[DstCnt]; for(i = 1; i <= DstCnt; i++) DstVec[i] = pointinfo(DstPts[i]); // 位置比較とマップ状態の変更 var Val[3]; var SrcVec; for(i = 1; i <= SrcCnt; i++){ SrcVec = pointinfo(SrcPts[i]); for(c = 1; c <= DstCnt; c++){ if(SrcVec == DstVec[c]){ for(x = 1; x <= VMapCnt; x++){ if(VMaps[x].isMapped(SrcPts[i])){ Val = VMaps[x].getValue(SrcPts[i]); VMaps[x].setValue(DstPts[c], Val); }else if(VMaps[x].isMapped(DstPts[i])){ VMaps[x].setValue(DstPts[c], nil); } } } } } editend(); } selmode(USER); // mergepoints()はポイントモード時のみ作用 selpoint(CLEAR, VOLUME, <999.999999,999.999999,999.999999>,<999.999999,999.999999,999.999999>); mergepoints(); @if version < 2.2 undogroupend(); @end @if version > 2.7 undogroupend(); @end }