// Select By AnyMap 0.444 @name "Select By AnyMap" @version 2.5 @warnings @script modeler @define DESCRIPT "Select By AnyMap" @define MAP_WEIGHT 1 @define MAP_MORPH 2 @define MODE_SELECT 1 // LS25のctlchoiceへ外部からsetvalueする時は0,1,2 // LS26のctlchoiceへ外部からsetvalueする時は1,2、3 @if version == 2.5 @define CHOICE_INIT_1 0 @define CHOICE_INIT_2 1 @else @define CHOICE_INIT_1 1 @define CHOICE_INIT_2 2 @end var s0; main { var WmapNames, MmapNames; var vmap = VMap(VMWEIGHT); if(vmap != nil){ while(vmap && vmap.type == VMWEIGHT){ if(vmap.name != "Edge Weight") WmapNames += vmap.name; vmap = vmap.next(); } }else{ WmapNames = @"--None--"@; } WmapNames += "SubPatch Weight"; vmap = VMap(VMMORPH); if(vmap != nil){ while(vmap && vmap.type == VMMORPH){ MmapNames += vmap.name; vmap = vmap.next(); } }else{ MmapNames = @"--None--"@; } var RecentType, RecentWMap, RecentMMap; @if version == 2.5 RecentType = recall("RecentType", MAP_WEIGHT); RecentWMap = recall("RecentWMap", "--None--"); RecentMMap = recall("RecentMMap", "--None--"); @else i = 0; vmap = VMap(VMWEIGHT, 0); if(vmap == nil){ RecentWMap = recall("RecentWMap", "--None--"); }else{ if(vmap.name == "base") RecentWMap = "SubPatch Weight"; if(vmap.name != "Edge Weight"){ RecentWMap = vmap.name; i = 1; }else{ RecentWMap = recall("RecentWMap", "--None--"); info("Edge Weight is NO MEAN ;-p Recall Recent WeightMap"); } } vmap = VMap(VMMORPH, 0); if(vmap == nil){ RecentMMap = recall("RecentMMap", "--None--"); }else{ RecentMMap = vmap.name; i -= 1; } if(i == 1){ RecentType = MAP_WEIGHT; }else if(i == -1){ RecentType = MAP_MORPH; }else{ RecentType = recall("RecentType", MAP_WEIGHT); } @end var WListIdx = 1; var MapCnt = WmapNames.size(); for(i = 1; i <= MapCnt; i++){ if(RecentWMap == WmapNames[i]){ WListIdx = i; break; } } var MListIdx = 1; MapCnt = MmapNames.size(); for(i = 1; i <= MapCnt; i++){ if(RecentMMap == MmapNames[i]){ MListIdx = i; break; } } reqbegin(DESCRIPT); reqsize(314,100); s0 = ctlchoice("", RecentType, @" << Weight >>"," << Morph >>"@, false); ctlposition(s0, -2, 1,310); p0 = ctlpopup("", WListIdx, WmapNames); ctlposition(p0, -2, 21,158); p1 = ctlpopup("", MListIdx, MmapNames); ctlposition(p1,150, 21,158); s1 = ctlchoice("", 1, @" Select","Deselect"@, false); ctlposition(s1,178, 42,130); tt = ctlchoice("", 2, @">=","=","<="@, false); ctlposition(tt, -2, 42, 65); tv = ctlpercent("", 0.0); ctlposition(tv, 63, 42, 74); ts = ctlcheckbox("", false); ctlposition(ts,160, 42, 22); ctlactive(ts, "switchThres", tv, tt); ctlrefresh(p0, "setSelMapTypeW"); ctlrefresh(p1, "setSelMapTypeM"); return if !reqpost(); var SelMapType = getvalue(s0); WListIdx = getvalue(p0); MListIdx = getvalue(p1); var SelType = getvalue(s1); var ThrVal = getvalue(tv); var ThrType = getvalue(tt); var ThrSw = getvalue(ts); reqend(); var InfoName; switch(SelMapType){ case MAP_WEIGHT: if(WmapNames[WListIdx] == "--None--"){ error("
not selected WeightMap"); return; } if(WmapNames[WListIdx] == "SubPatch Weight"){ vmap = VMap(VMSUBPATCH); InfoName = "WEIGHT : [ SubPatch Weight"; }else{ vmap = VMap(VMWEIGHT,WmapNames[WListIdx]); InfoName = "WEIGHT : [ " + vmap.name; } break; case MAP_MORPH: if(MmapNames[MListIdx] == "--None--"){ error("
not selected MorphMap"); return; } vmap = VMap(VMMORPH,MmapNames[MListIdx]); InfoName = "MORPH : [ " + vmap.name; break; default: break; } selmode(DIRECT); var SelPts = pointcount(); // 90/92/93 はpoint/poly countでUndoバッファを消費する @if version < 2.2 undo(); @end @if version > 2.7 undo(); @end selmode(USER); // 明示的にポイントモードに以降 selpoint(CLEAR, VOLUME, <9999.999999,9999.999999,9999.999999>,<9999.999999,9999.999999,9999.999999>); // 追加且つ選択中の点があれば選択状態を反転し、非選択状態の点を確定 if((SelType == MODE_SELECT) && (SelPts != 0)) selinvert(); editbegin(); var StoredPts; i = 1; // ウェイト且つ閾値有り if((SelMapType == MAP_WEIGHT) && ThrSw){ switch(ThrType){ // >= case 1: foreach(p, points){ if(vmap.isMapped(p)){ (c) = vmap.getValue(p); if(c >= ThrVal) StoredPts[i++] = p; } } break; // == case 2: foreach(p, points){ if(vmap.isMapped(p)){ (c) = vmap.getValue(p); if(c == ThrVal) StoredPts[i++] = p; } } break; // <= case 3: foreach(p, points){ if(vmap.isMapped(p)){ (c) = vmap.getValue(p); if(c <= ThrVal) StoredPts[i++] = p; } } break; default : break; } // モーフ且つ閾値有り }else if((SelMapType == MAP_MORPH) && ThrSw){ // == if(ThrType == 2){ foreach(p, points){ if(vmap.isMapped(p)){ c = vmap.getValue(p); if((c[1] == 0.0) && (c[2] == 0.0) && (c[3] == 0.0)) StoredPts[i++] = p; } } }else{ // != foreach(p, points){ if(vmap.isMapped(p)){ c = vmap.getValue(p); if((c[1] != 0.0) || (c[2] != 0.0) || (c[3] != 0.0)) StoredPts[i++] = p; } } } }else{ // 閾値無し。タイプ問わず foreach(p, points){ if(vmap.isMapped(p)) StoredPts[i++] = p; } } editend(); // 90/92/93 は変化の無いeditbeginでもUndoバッファを消費する @if version < 2.2 undo(); @end @if version > 2.7 undo(); @end // 選択状態を元に戻す if((SelType == MODE_SELECT) && (SelPts != 0)) selinvert(); // 指定条件に適う点がある場合 if(StoredPts != nil){ if(SelType == MODE_SELECT){ selpoint(SET, POINTID, StoredPts); info("
Selected ",InfoName," ] "); }else{ selpoint(CLEAR, POINTID, StoredPts); info("
Deselected ",InfoName," ] "); } // 90/92/93 はeditbegin/end の後のselpoint/polyでUndoバッファを消費する @if version < 2.2 undo(); @end @if version > 2.7 undo(); @end }else{ info("
not assign ",InfoName," ] "); } if(RecentType != SelMapType) store("RecentType", SelMapType); if(SelMapType == MAP_WEIGHT){ if(RecentWMap != WmapNames[WListIdx]){ store("RecentWMap", WmapNames[WListIdx]); store("RecentMMap", RecentMMap); } }else{ if(RecentMMap != MmapNames[MListIdx]){ store("RecentWMap", RecentWMap); store("RecentMMap", MmapNames[MListIdx]); } } } // ------------------------------ switchThres: v { return(v); } setSelMapTypeW: v { setvalue(s0, CHOICE_INIT_1); } setSelMapTypeM: v { setvalue(s0, CHOICE_INIT_2); }