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