//選択頂点内からランダムに非選択 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
}