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