//選択頂点内からランダムに非選択 0.323
@name "RndDeSelPts"
@version 2.5
@warnings
@script modeler
main
{
selmode(GLOBAL);
var AllPts = pointcount();
selmode(DIRECT);
var SelPts = pointcount();
// 90/92/93 はpoint/poly countでUndoバッファを消費する
@if version < 2.2
undo();
undo();
@end
@if version > 2.7
undo();
undo();
@end
// 念の為に明示的にポイント選択モードに移行する。
selmode(USER);
selpoint(CLEAR, VOLUME, <9999.999999,9999.999999,9999.999999>,<9999.999999,9999.999999,9999.999999>);
reqbegin("Random Sel/DeSel Pts");
reqsize(190,80);
t0 = ctltext("","Changing to ------>");
ctlposition(t0, 4, 3);
c0 = ctlinteger("",SelPts);
ctlposition(c0,110, 1);
t1 = ctltext("","FG Layer Total Pts : "+ AllPts);
ctlposition(t1, 4, 22);
return if !reqpost();
var ReqCnt = getvalue(c0);
reqend();
if(ReqCnt == SelPts){
error("
Your select are equal to initial select.");
return;
}
if(ReqCnt > AllPts){
info("
You set : ",ReqCnt,". but Clipped : ",AllPts);
ReqCnt = AllPts;
}
var OvrFlag;
// 要求するポイントが選択済み頂点より多い時
if(ReqCnt > SelPts){
// 追加する数
ReqCnt = ReqCnt - SelPts;
// 選択を反転した時の数
SelPts = AllPts - SelPts;
// 選択を反転した時の数から追加する数を引くと、実際に間引くべき数になる。
ReqCnt = SelPts - ReqCnt;
OvrFlag = true;
}else{
OvrFlag = false;
}
var TempBuff[SelPts];
// SelPtsは間引かれる対象の数。 1〜SelPtsの入った配列を作り
for(i = 1; i <= SelPts; i++) TempBuff[i] = i;
// 配列を必要数間引く。
x = 0;
while(ReqCnt > x){
i = random(1, SelPts);
if(TempBuff[i] != nil){
TempBuff[i] = nil;
x++;
}
}
TempBuff.pack();
ReqCnt = TempBuff.count();
if(OvrFlag) selinvert();
var StoredPts[ReqCnt];
editbegin();
for(i = 1; i <= ReqCnt; i++) StoredPts[i] = points[TempBuff[i]];
editend();
// 90/92/93 は変化の無いeditbeginでもUndoバッファを消費する
@if version < 2.2
undo();
@end
@if version > 2.7
undo();
@end
selpoint(CLEAR, POINTID, StoredPts);
if(OvrFlag) selinvert();
// 90/92/93 はeditbegin/end の後のselpoint/polyでUndoバッファを消費する
@if version < 2.2
undo();
@end
@if version > 2.7
undo();
@end
}