// Weight Val Modifier 0.324
// 値を足したり引いたり掛けたり割ったり、コピーしたり。
@name "WValModifier"
@version 2.5
@warnings
@script modeler
@define DESCRIPT "Weight Val Modifier"
@define OVERWRITE false
var l0;
var VMapNames;
var MapNum;
var RecentMap;
var AllBlock, InitBlock, CurBlock, RBlock;
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 Point Select");
return;
}
var vmap = VMap(VMWEIGHT);
if(vmap == nil){
error("
Not Found Map");
return;
}
var i = 1;
while(vmap && vmap.type == VMWEIGHT){
if(vmap.name != "Edge Weight"){
VMapNames += vmap.name;
AllBlock[i] = i;
i++;
}
vmap = vmap.next();
}
MapNum = VMapNames.size();
RecentMap = recall("RecentMap", "--None--");
var RecentType = recall("RecentType", 2);
var RNames = parse(",", RecentMap);
var RNum = RNames.size();
var x = 1;
for(c = 1; c <= RNum; c++){
for(i = 1; i <= MapNum; i++){
if(RNames[c] == VMapNames[i]){
RBlock[x++] = i;
break;
}
}
}
RBlock.sortA();
RBlock.reduce();
InitBlock = RBlock;
@if version != 2.5
vmap = VMap(VMWEIGHT, 0);
if(vmap != nil){
if(vmap.name != "Edge Weight"){
for(i = 1; i <= MapNum; i++) if(vmap.name == VMapNames[i]) break;
CurBlock[1] = i;
if(RBlock != nil){
i = RBlock.size() + 1;
InitBlock[i] = CurBlock[1];
InitBlock.sortA();
InitBlock.reduce();
}
}
}
@end
reqbegin(DESCRIPT);
reqsize(285,278);
l0 = ctllistbox("Weight Maps",160, 242, "lb_Count", "lb_Name");
ctlposition(l0, 3, 3);
l1 = ctlbutton(" Select All", 78, "lb_AllSelect");
ctlposition(l1,190,203);
l2 = ctlbutton("DeSelect All", 78, "lb_AllDeselect");
ctlposition(l2,190,223);
@if version != 2.5
l3 = ctlbutton("Current", 50, "lb_CurrentMap");
ctlposition(l3,190,163);
l4 = ctlbutton("Add", 28, "lb_CurrentMapAdd");
ctlposition(l4,240,163);
@end
l5 = ctlbutton("Recent", 50, "lb_RecentMap");
ctlposition(l5,190,183);
l6 = ctlbutton("Add", 28, "lb_RecentMapAdd");
ctlposition(l6,240,183);
c1 = ctlcheckbox("overwrite", OVERWRITE);
ctlposition(c1,190, 5, 78);
c0 = ctlchoice("", RecentType, @" Absolute"," Add / Sub"," Multiple"," Divide"," Copy"@, true);
ctlposition(c0,184, 28, 84);
v1 = ctlpercent("",1.0);
ctlposition(v1,185,134, 74);
v2 = ctlnumber("", 1.0);
ctlposition(v2,185,134, 74);
d0 = ctlsep(0,78);
ctlposition(d0,190,129);
d1 = ctlsep(0,78);
ctlposition(d1,190,157);
ctlactive( c0, "maskInputPerVal", v1);
ctlactive( c0, "maskInputNumVal", v2);
ctlvisible(c0, "maskInputPerVal", v1);
ctlvisible(c0, "maskInputNumVal", v2);
ctlactive( d0, "lb_InitMap", d1);
return if !reqpost();
var SelMap = getvalue(l0);
var SelType = getvalue(c0);
var OvMode = getvalue(c1);
var PerVal = getvalue(v1);
var NumVal = getvalue(v2);
reqend();
if(SelMap == nil){
error("
Not Select");
return;
}
var SelNum = SelMap.size();
var Val;
editbegin();
switch(SelType){
// SET
case 1:
if(OvMode){
for(c = 1; c <= SelNum; c++){
vmap = VMap(VMWEIGHT, VMapNames[SelMap[c]]);
for(i = 1; i <= SelPts; i++) vmap.setValue(points[i], PerVal);
}
}else{
for(c = 1; c <= SelNum; c++){
vmap = VMap(VMWEIGHT, VMapNames[SelMap[c]]);
for(i = 1; i <= SelPts; i++) if(vmap.isMapped(points[i])) vmap.setValue(points[i], PerVal);
}
}
break;
// ADD SUB
case 2:
for(c = 1; c <= SelNum; c++){
vmap = VMap(VMWEIGHT, VMapNames[SelMap[c]]);
for(i = 1; i <= SelPts; i++){
if(vmap.isMapped(points[i])){
(Val) = vmap.getValue(points[i]);
Val += PerVal;
vmap.setValue(points[i], Val);
}else if(OvMode){
vmap.setValue(points[i], PerVal);
}
}
}
break;
// MULTI
case 3:
if(NumVal == 0.0){
for(c = 1; c <= SelNum; c++){
vmap = VMap(VMWEIGHT, VMapNames[SelMap[c]]);
for(i = 1; i <= SelPts; i++) if(vmap.isMapped(points[i])) vmap.setValue(points[i], 0.0);
}
}else{
for(c = 1; c <= SelNum; c++){
vmap = VMap(VMWEIGHT, VMapNames[SelMap[c]]);
for(i = 1; i <= SelPts; i++){
if(vmap.isMapped(points[i])){
(Val) = vmap.getValue(points[i]);
Val *= NumVal;
vmap.setValue(points[i], Val);
}
}
}
}
break;
// DIVIDE
case 4:
if(NumVal == 0.0){
editend(ABORT);
error("
Ooops! 0 Divide.");
return;
}
for(c = 1; c <= SelNum; c++){
vmap = VMap(VMWEIGHT, VMapNames[SelMap[c]]);
for(i = 1; i <= SelPts; i++){
if(vmap.isMapped(points[i])){
(Val) = vmap.getValue(points[i]);
Val /= NumVal;
vmap.setValue(points[i], Val);
}
}
}
break;
// COPY
case 5:
if(OvMode){
for(c = 1; c <= SelNum; c++){
vmap = VMap(VMWEIGHT, VMapNames[SelMap[c]]);
if(vmap.isMapped(points[1])){
(Val) = vmap.getValue(points[1]);
for(i = 2; i <= SelPts; i++) vmap.setValue(points[i], Val);
}else{
for(i = 2; i <= SelPts; i++) vmap.setValue(points[i], nil);
}
}
}else{
for(c = 1; c <= SelNum; c++){
vmap = VMap(VMWEIGHT, VMapNames[SelMap[c]]);
if(vmap.isMapped(points[1])){
(Val) = vmap.getValue(points[1]);
for(i = 2; i <= SelPts; i++) if(vmap.isMapped(points[i])) vmap.setValue(points[i], Val);
}
}
}
break;
default:
break;
}
editend();
var CurrentMap;
CurrentMap = VMapNames[SelMap[1]];
for(i = 2; i <= SelNum; i++) CurrentMap = CurrentMap + "," + VMapNames[SelMap[i]];
if(RecentMap != CurrentMap) store("RecentMap", CurrentMap);
if(RecentType != SelType) store("RecentType", SelType);
}
// ----------------------------
maskInputPerVal: v
{
if(v <= 2) return(true);
else return(false);
}
maskInputNumVal: v
{
if((v >= 3)&&(v != 5)) return(true);
else return(false);
}
@if version != 2.5
lb_CurrentMap
{ if(CurBlock != nil) setvalue(l0, CurBlock); }
lb_CurrentMapAdd
{
var TempBlock;
if(CurBlock != nil){
TempBlock = getvalue(l0);
if(TempBlock == nil){
setvalue(l0, CurBlock);
}else{
i = TempBlock.size() + 1;
TempBlock[i] = CurBlock[1];
TempBlock.sortA();
TempBlock.reduce();
setvalue(l0, TempBlock);
}
}
}
@end
lb_RecentMap
{ if(RBlock != nil) setvalue(l0, RBlock); }
lb_RecentMapAdd
{
var TempBlock;
if(RBlock != nil){
TempBlock = getvalue(l0);
if(TempBlock == nil){
setvalue(l0, RBlock);
}else{
c = TempBlock.size() + 1;
for(i = 1; i <= RBlock.size(); i++){
TempBlock[c] = RBlock[i];
c++;
}
TempBlock.sortA();
TempBlock.reduce();
setvalue(l0, TempBlock);
}
}
}
lb_InitMap: v
{ if(InitBlock != nil) setvalue(l0, InitBlock); }
lb_Count
{ return(MapNum); }
lb_Name: Index
{ return(VMapNames[Index]); }
lb_AllSelect
{ setvalue(l0, AllBlock); }
lb_AllDeselect
{ setvalue(l0, nil); }