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