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