// Morph Modfy AnyAxiz 0.625 // 選択軸の値を操作する。 @name "MorphModAnyAxiz" @version 2.5 @warnings @script modeler @define DESCRIPT "Morph Modify AnyAxiz" @define MODE_RELATED 1 @define MODE_ABSOLUTE 2 @define MODE_MULTI 3 var cX,cY,cZ, dX,dY,dZ, pX,pY,pZ; main { selmode(DIRECT); var SelPts = pointcount(); // 90/92/93 はpoint/poly countでUndoバッファを消費する @if version < 2.2 undo(); @end @if version > 2.7 undo(); @end if(!SelPts){ error("
Need Select Pts"); return; } var vmap = VMap(VMMORPH); if(vmap == nil){ error("
Not Found MORPH"); return; } var VMapNames; while(vmap && vmap.type == VMMORPH){ VMapNames += vmap.name; vmap = vmap.next(); } var RecentMap; @if version == 2.5 RecentMap = recall("RecentMap", "--None--"); @else vmap = VMap(VMMORPH,0); if(vmap == nil) RecentMap = recall("RecentMap", "--None--"); else RecentMap = vmap.name; @end var RecentType = recall("RecentType", 1); var ListIdx = 1; var MapCnt = VMapNames.size(); for(i = 1; i <= MapCnt; i++){ if(RecentMap == VMapNames[i]){ ListIdx = i; break; } } reqbegin(DESCRIPT); reqsize(300,142); tx1 = ctltext("","% only for Multi"); ctlposition(tx1,210,87); tx2 = ctltext("","Sym"); ctlposition(tx2, 68,87); c0 = ctlpopup("", ListIdx, VMapNames); ctlposition(c0, 0, 2); m0 = ctlchoice("", RecentType, @"Related","Absolute"," Multi"@, true); ctlposition(m0, 0, 25, 63); cX = ctlchoice("", 2,@"X","-"@, false); ctlposition(cX, 88, 25, 40); cY = ctlchoice("", 2,@"Y","-"@, false); ctlposition(cY, 88, 45, 40); cZ = ctlchoice("", 2,@"Z","-"@, false); ctlposition(cZ, 88, 65, 40); cC = ctlchoice("", 2,@"*","-"@, false); ctlposition(cC, 88, 85, 40); rX = ctlcheckbox("", true); ctlposition(rX, 69, 25, 22); rY = ctlcheckbox("", false); ctlposition(rY, 69, 45, 22); rZ = ctlcheckbox("", false); ctlposition(rZ, 69, 65, 22); dX = ctldistance("", 0.0); ctlposition(dX, 129, 25); dY = ctldistance("", 0.0); ctlposition(dY, 129, 45); dZ = ctldistance("", 0.0); ctlposition(dZ, 129, 65); pX = ctlpercent("", 1.0); ctlposition(pX, 200, 25); pY = ctlpercent("", 1.0); ctlposition(pY, 200, 45); pZ = ctlpercent("", 1.0); ctlposition(pZ, 200, 65); c2 = ctlbutton("-", 22, "changeDec"); ctlposition(c2, 135,85, 20); c3 = ctlbutton("0", 21, "changeReset"); ctlposition(c3, 157,85, 20); c4 = ctlbutton("+", 21, "changeInc"); ctlposition(c4, 179,85, 20); ctlactive( m0, "maskVal", dX,dY,dZ,c2,c3,c4); ctlactive( m0, "maskPer", pX,pY,pZ); ctlrefresh(cC, "changeActDeact"); return if !reqpost(); var ModType = getvalue(m0); var SelIdx = getvalue(c0); var XRev = getvalue(rX); var YRev = getvalue(rY); var ZRev = getvalue(rZ); var XOn = ( getvalue(cX) - 1) ^ 1; var YOn = ((getvalue(cY) - 1) ^ 1) * 2; var ZOn = ((getvalue(cZ) - 1) ^ 1) * 4; var DistX = getvalue(dX); var DistY = getvalue(dY); var DistZ = getvalue(dZ); var PercX = getvalue(pX); var PercY = getvalue(pY); var PercZ = getvalue(pZ); reqend(); var SelAxiz = XOn + YOn + ZOn; if(SelAxiz == 0){ error("
Not Select Axis."); return; } vmap = VMap(VMMORPH, VMapNames[SelIdx]); var SrcVal[SelPts][3]; var NewVal[SelPts][3]; var SrcPos[SelPts]; var Val[3]; editbegin(); for(i = 1; i <= SelPts; i++){ if(vmap.isMapped(points[i])) Val = vmap.getValue(points[i]); else Val = @0.0,0.0,0.0@; SrcVal[i] = Val; SrcPos[i] = pointinfo(points[i]); } var RevFlag = XRev + YRev + ZRev; switch(ModType){ case MODE_RELATED: if(RevFlag != 0){ for(i = 1; i <= SelPts; i++){ if(XRev && (SrcPos[i].x < 0.0)) NewVal[i][1] = SrcVal[i][1] - DistX; else NewVal[i][1] = SrcVal[i][1] + DistX; if(YRev && (SrcPos[i].y < 0.0)) NewVal[i][2] = SrcVal[i][2] - DistY; else NewVal[i][2] = SrcVal[i][2] + DistY; if(ZRev && (SrcPos[i].z < 0.0)) NewVal[i][3] = SrcVal[i][3] - DistZ; else NewVal[i][3] = SrcVal[i][3] + DistZ; } }else{ for(i = 1; i <= SelPts; i++){ NewVal[i][1] = SrcVal[i][1] + DistX; NewVal[i][2] = SrcVal[i][2] + DistY; NewVal[i][3] = SrcVal[i][3] + DistZ; } } break; case MODE_ABSOLUTE: if(RevFlag != 0){ var DistXr = DistX * -1.0; var DistYr = DistY * -1.0; var DistZr = DistZ * -1.0; for(i = 1; i <= SelPts; i++){ if(XRev && (SrcPos[i].x < 0.0)) NewVal[i][1] = DistXr; else NewVal[i][1] = DistX; if(YRev && (SrcPos[i].y < 0.0)) NewVal[i][2] = DistYr; else NewVal[i][2] = DistY; if(ZRev && (SrcPos[i].z < 0.0)) NewVal[i][3] = DistZr; else NewVal[i][3] = DistZ; } }else{ for(i = 1; i <= SelPts; i++){ NewVal[i][1] = DistX; NewVal[i][2] = DistY; NewVal[i][3] = DistZ; } } break; case MODE_MULTI: for(i = 1; i <= SelPts; i++){ NewVal[i][1] = SrcVal[i][1] * PercX; NewVal[i][2] = SrcVal[i][2] * PercY; NewVal[i][3] = SrcVal[i][3] * PercZ; } break; default : break; } switch(SelAxiz){ case 1: for(i = 1; i <= SelPts; i++){ SrcVal[i][1] = NewVal[i][1]; Val = SrcVal[i]; vmap.setValue(points[i], Val); } break; case 2: for(i = 1; i <= SelPts; i++){ SrcVal[i][2] = NewVal[i][2]; Val = SrcVal[i]; vmap.setValue(points[i], Val); } break; case 3: for(i = 1; i <= SelPts; i++){ NewVal[i][3] = SrcVal[i][3]; Val = NewVal[i]; vmap.setValue(points[i], Val); } break; case 4: for(i = 1; i <= SelPts; i++){ SrcVal[i][3] = NewVal[i][3]; Val = SrcVal[i]; vmap.setValue(points[i], Val); } break; case 5: for(i = 1; i <= SelPts; i++){ NewVal[i][2] = SrcVal[i][2]; Val = NewVal[i]; vmap.setValue(points[i], Val); } break; case 6: for(i = 1; i <= SelPts; i++){ NewVal[i][1] = SrcVal[i][1]; Val = NewVal[i]; vmap.setValue(points[i], Val); } break; case 7: for(i = 1; i <= SelPts; i++){ Val = NewVal[i]; vmap.setValue(points[i], Val); } break; default: break; } editend(); if(RecentMap != vmap.name) store("RecentMap", vmap.name); if(RecentType != ModType) store("RecentType", ModType); } // -------------------------- maskVal: v { return(v != 3); } maskPer: v { return(v > 2); } changeActDeact: v { // LS25のctlchoiceへ外部からsetvalueする時は0,1,2 // LS26のctlchoiceへ外部からsetvalueする時は1,2、3 @if version == 2.5 v -= 1; @end setvalue(cX, v); setvalue(cY, v); setvalue(cZ, v); } changeInc { setvalue(dX, getvalue(dX) + 0.001); setvalue(dY, getvalue(dY) + 0.001); setvalue(dZ, getvalue(dZ) + 0.001); } changeDec { setvalue(dX, getvalue(dX) - 0.001); setvalue(dY, getvalue(dY) - 0.001); setvalue(dZ, getvalue(dZ) - 0.001); } changeReset { setvalue(dX, 0.0); setvalue(dY, 0.0); setvalue(dZ, 0.0); }