// Multi Keying Numeric 0.851 @name "MultiKeyingNumeric" @version 2.5 @warnings @script generic @define DESCRIPT "Multi Keying Numeric Panel" @define MODE_SET 1 @define MODE_COPY 2 @define MODE_ADD 3 @define MODE_EX_ADD 4 @define MODE_SEQ_ADD 5 @define MODE_SEQ_COPY 6 @define MODE_PAIR_COPY 7 // 回転制限反映スイッチの初期状態 true/false @define DEFAULT_LIMIT true // Copy時の自己書き換えスイッチの初期状態 true/false @define DEFAULT_SELFWRITE false // minisliderでの入力可能範囲フレーム数 @define FRAME_MIN -100 @define FRAME_MAX 1000 // getLimitRot(Item):ItemのLimitRotationをVal[6](Hmin,Pmin,Bmin,Hmax,Pmax,Bmax)で返す。Limit有効なら値、無効ならNil // searchKeyIDOrder(Channel, SrcTime):Channel内からSrcTimeのKeyを探して返す。在ればKey番号(Key[]用)、無ければNil // getKeyIDRange(Channel, StTime, EdTime):Channel内のStTime〜EdTime間に納まるKey番号の始点番号と終点番号を返す // Keyが1個なら1と0、0個なら1と-2が返る。 終点-始点+1すると有効な数が判る // testValMinMax(Value, Min, Max):ValueがMinより小さければMinを、Maxより大きければMaxを返す。範囲内ならValueを返す // 変更/反転フラグとctl.OA用 var ChgFlag[9]; var RevFlag[9]; var f1,f2,f3,f4,f5,f6,f7,f8,f9; var c0,cA,cB; var MaxChan; var CurScene; generic { //debug(); CurScene = Scene(); var CurItems = CurScene.getSelect(); if(CurItems == nil) return; var ItemNum = CurItems.size(); var CurTime = CurScene.currenttime; var CurFrame = CurTime / (1.0 / CurScene.fps); // 1をFPSで割った値が1Frame辺りの秒数 // Channel数確定 if(CurItems[1].isCamera() || CurItems[1].isLight()) MaxChan = 6; else MaxChan = 9; ChgFlag[] = false; RevFlag[] = false; // 基本値の取得 var Val; var CurVal[9]; var CurKeyCurv[9]; var CurChan = CurItems[ItemNum].firstChannel(); for(i = 1; i <= MaxChan; i++){ // .value()はラジアン、.getKeyValueでは度数 CurVal[i] = CurChan.value(CurTime); if((KeyID = CurChan.keyExists(CurTime)) != nil){ // LS2.5だと配列に.get〜()メソッドで値を入れるとLSCoreが壊れる?。LS2.7〜では平気 Val = CurChan.getKeyCurve(KeyID); CurKeyCurv[i] = Val; } CurChan = CurItems[ItemNum].nextChannel(); } // .value()で得たラジアンを度数に変換 CurVal[4] = deg(CurVal[4]); CurVal[5] = deg(CurVal[5]); CurVal[6] = deg(CurVal[6]); if(MaxChan == 6){ CurVal[7] = 1.0; CurVal[8] = 1.0; CurVal[9] = 1.0; } // --------------------------- reqbegin(DESCRIPT); reqsize(380,200); m0 = ctlchoice("", 1, @" Set"," Copy"," Add"," ExAdd","SeqAdd","SeqCopy","PairCopy"@, false); ctlposition(m0, 0, 2,372); // 現在or対象Frame c0 = ctlminislider("Frame", CurFrame, FRAME_MIN, FRAME_MAX); ctlposition(c0, 58, 23, 80); p0 = ctlbutton("", 16, "setPreStFrame"); ctlposition(p0,162, 23); // 終端Frame cA = ctlminislider("-", CurFrame, FRAME_MIN, FRAME_MAX); ctlposition(cA,181, 23, 55); pA = ctlbutton("", 16, "setPreEdFrame"); ctlposition(pA,260, 23); // シフトFrame cB = ctlminislider("Shift", 0, FRAME_MIN, FRAME_MAX); ctlposition(cB,278, 23, 72); lt = ctlcheckbox("LimitRotate", DEFAULT_LIMIT); ctlposition(lt,104,148); ov = ctlcheckbox("SelfWback", DEFAULT_SELFWRITE); ctlposition(ov, 10,148); // セパレータ s0 = ctlsep(); ctlposition(s0, 0, 49); tp = ctltext("","Position"); ctlposition(tp, 39,122); fp = ctlbutton("", 16, "changeFlagPos"); ctlposition(fp, 104,123); // pos X tpx = ctltext("","X"); ctlposition(tpx, 5, 58); r1 = ctlstate("", false, 16, "changeFlagRevPX"); ctlposition(r1, 16, 55); c1 = ctldistance("",CurVal[1]); ctlposition(c1, 32, 55); f1 = ctlstate("", false, 16, "changeFlagPXT"); ctlposition(f1, 104, 55); // pos Y tpy = ctltext("","Y"); ctlposition(tpy, 5, 80); r2 = ctlstate("", false, 16, "changeFlagRevPY"); ctlposition(r2, 16, 77); c2 = ctldistance("",CurVal[2]); ctlposition(c2, 32, 77); f2 = ctlstate("", false, 16, "changeFlagPYT"); ctlposition(f2, 104, 77); // pos Z tpz = ctltext("","Z"); ctlposition(tpz, 5,102); r3 = ctlstate("", false, 16, "changeFlagRevPZ"); ctlposition(r3, 16, 99); c3 = ctldistance("",CurVal[3]); ctlposition(c3, 32, 99); f3 = ctlstate("", false, 16, "changeFlagPZT"); ctlposition(f3, 104, 99); tr = ctltext("","Rotation"); ctlposition(tr, 159,122); fr = ctlbutton("", 16, "changeFlagRot"); ctlposition(fr, 247,123); // rot H trh = ctltext("","H"); ctlposition(trh,125, 58); r4 = ctlstate("", false, 16, "changeFlagRevRH"); ctlposition(r4, 136, 55); c4 = ctlangle("",CurVal[4]); ctlposition(c4, 152, 55); f4 = ctlstate("", false, 16, "changeFlagRHT"); ctlposition(f4, 247, 55); // rot P trp = ctltext("","P"); ctlposition(trp,125, 80); r5 = ctlstate("", false, 16, "changeFlagRevRP"); ctlposition(r5, 136, 77); c5 = ctlangle("",CurVal[5]); ctlposition(c5, 152, 77); f5 = ctlstate("", false, 16, "changeFlagRPT"); ctlposition(f5, 247, 77); // rot B trb = ctltext("","B"); ctlposition(trb,125,102); r6 = ctlstate("", false, 16, "changeFlagRevRB"); ctlposition(r6, 136, 99); c6 = ctlangle("",CurVal[6]); ctlposition(c6, 152, 99); f6 = ctlstate("", false, 16, "changeFlagRBT"); ctlposition(f6, 247, 99); ts = ctltext("","Scale"); ctlposition(ts, 290,122); fs = ctlbutton("", 16, "changeFlagScl"); ctlposition(fs, 355,123); // Scl X tsx = ctltext("","SX"); ctlposition(tsx,268, 58); c7 = ctlnumber("",CurVal[7]); ctlposition(c7, 282, 55); f7 = ctlstate("", false, 16, "changeFlagSXT"); ctlposition(f7, 355, 55); // Scl Y tsy = ctltext("","SY"); ctlposition(tsy,268, 80); c8 = ctlnumber("",CurVal[8]); ctlposition(c8, 282, 77); f8 = ctlstate("", false, 16, "changeFlagSYT"); ctlposition(f8, 355, 77); // Scl Z tsz = ctltext("","SZ"); ctlposition(tsz,268,102); c9 = ctlnumber("",CurVal[9]); ctlposition(c9, 282, 99); f9 = ctlstate("", false, 16, "changeFlagSZT"); ctlposition(f9, 355, 99); // Item名表示用枠 n0 = ctlstring("1st", CurItems[ItemNum].name); ctlposition(n0, 200,148,170); // セパレータをトリガにしてItem欄をマスク ctlactive( s0, "maskItemSlot", n0); // セパレータをトリガにしてカメラ&ライト時にスケール欄をマスクする為 ctlactive( s0, "maskScales", c7,c8,c9); ctlvisible(s0, "maskScales", f7,f8,f9,fs); ctlactive( m0, "maskEndFrame", cA, pA); ctlactive( m0, "maskInputVal6", c1,c2,c3,c4,c5,c6); ctlactive( m0, "maskInputVal9", c7,c8,c9); ctlactive( m0, "maskInputVal", c1,c2,c3,c4,c5,c6,c7,c8,c9); ctlactive( m0, "maskShiftFrame",cB); ctlactive( m0, "maskSelfWback", ov); ctlrefresh(c0, "changeFlagCurTime"); ctlrefresh(cA, "changeFlagEndTime"); ctlrefresh(c1, "changeFlagPX"); ctlrefresh(c2, "changeFlagPY"); ctlrefresh(c3, "changeFlagPZ"); ctlrefresh(c4, "changeFlagRH"); ctlrefresh(c5, "changeFlagRP"); ctlrefresh(c6, "changeFlagRB"); ctlrefresh(c7, "changeFlagSX"); ctlrefresh(c8, "changeFlagSY"); ctlrefresh(c9, "changeFlagSZ"); return if !reqpost(); var SelType = getvalue(m0); CurFrame = getvalue(c0); var EndFrame = getvalue(cA); var ShtFrame = getvalue(cB); CurVal[1] = getvalue(c1); CurVal[2] = getvalue(c2); CurVal[3] = getvalue(c3); CurVal[4] = getvalue(c4); CurVal[5] = getvalue(c5); CurVal[6] = getvalue(c6); CurVal[7] = getvalue(c7); CurVal[8] = getvalue(c8); CurVal[9] = getvalue(c9); var LimitType = getvalue(lt); var SelfWType = getvalue(ov); reqend(); if((SelType == MODE_SEQ_COPY)&&(CurFrame == EndFrame)){ info("
Start Frame equal End Frame, Changed Single COPY mode"); SelType = MODE_COPY; } if((SelType == MODE_SEQ_ADD)&&(CurFrame == EndFrame)){ info("
Start Frame equal End Frame, Changed Single ADD mode"); SelType = MODE_ADD; } // フレームに応じた時間の生成。 var EndTime, ShtTime; CurTime = CurFrame / CurScene.fps; EndTime = EndFrame / CurScene.fps; if(ShtFrame != 0) ShtTime = ShtFrame / CurScene.fps; else ShtTime = 0.0; // --------------------------- var SrcKeyNum, TempItemNum, KeyID; var KeyBlock; var StKeyOrder, EdKeyOrder; var LimitRot[6]; switch(SelType){ case MODE_SET: for(i = 1; i <= ItemNum; i++){ if(LimitType && (ChgFlag[4] || ChgFlag[5] || ChgFlag[6])) LimitRot = getLimitRot(CurItems[i]); CurChan = CurItems[i].firstChannel(); for(c = 1; c <= MaxChan; c++){ if(ChgFlag[c]){ // LimitRotは1-3がHPBmin、4-6がHPBmax。中身(1&3〜)がNilなら無効 if((4 <= c)&&(c <= 6)&&(LimitType)&&(LimitRot[c] != nil)){ Val = testValMinMax(CurVal[c], LimitRot[c - 3], LimitRot[c]); }else{ Val = CurVal[c]; } if((KeyID = CurChan.keyExists(CurTime)) != nil) CurChan.setKeyValue(KeyID, Val); else CurChan.createKey(CurTime, Val); } CurChan = CurItems[i].nextChannel(); } } break; // --------------------------- case MODE_COPY: if((!SelfWType)&&(ItemNum == 1)){ error("
Normal COPY mode Need 2 or more Items"); break; } // フラグに応じて±反転 for(i = 1; i <= 6; i++) if(RevFlag[i]) CurVal[i] *= -1.0; // 第一選択は末尾(ItemNum) if(SelfWType) TempItemNum = ItemNum; else TempItemNum = ItemNum - 1; for(i = 1; i <= TempItemNum; i++){ if(LimitType && (ChgFlag[4] || ChgFlag[5] || ChgFlag[6])) LimitRot = getLimitRot(CurItems[i]); CurChan = CurItems[i].firstChannel(); for(c = 1; c <= MaxChan; c++){ if(ChgFlag[c]){ if((4 <= c)&&(c <= 6)&&(LimitType)&&(LimitRot[c] != nil)){ Val = testValMinMax(CurVal[c], LimitRot[c - 3], LimitRot[c]); }else{ Val = CurVal[c]; } if((KeyID = CurChan.keyExists(CurTime)) != nil) CurChan.setKeyValue(KeyID, Val); else KeyID = CurChan.createKey(CurTime, Val); if(CurKeyCurv[c] != nil) CurChan.setKeyCurve(KeyID, CurKeyCurv[c]); } CurChan = CurItems[i].nextChannel(); } } break; // --------------------------- case MODE_ADD: for(i = 1; i <= ItemNum; i++){ if(LimitType && (ChgFlag[4] || ChgFlag[5] || ChgFlag[6])) LimitRot = getLimitRot(CurItems[i]); CurChan = CurItems[i].firstChannel(); for(c = 1; c <= MaxChan; c++){ if(ChgFlag[c]){ if((4 <= c)&&(c <= 6)&&(LimitType)&&(LimitRot[c] != nil)){ Val = testValMinMax(deg(CurChan.value(CurTime)) + CurVal[c], LimitRot[c - 3], LimitRot[c]); }else{ Val = CurChan.value(CurTime) + CurVal[c]; } if((KeyID = CurChan.keyExists(CurTime)) != nil) CurChan.setKeyValue(KeyID, Val); else CurChan.createKey(CurTime, Val); } CurChan = CurItems[i].nextChannel(); } } break; // --------------------------- case MODE_EX_ADD: var MultiVal = 1; // 選択順は降順だから末尾(先頭)から処理 for(i = ItemNum; i >= 1; i--){ if(LimitType && (ChgFlag[4] || ChgFlag[5] || ChgFlag[6])) LimitRot = getLimitRot(CurItems[i]); CurChan = CurItems[i].firstChannel(); for(c = 1; c <= MaxChan; c++){ if(ChgFlag[c]){ if((4 <= c)&&(c <= 6)&&(LimitType)&&(LimitRot[c] != nil)){ Val = testValMinMax(deg(CurChan.value(CurTime)) + (CurVal[c] * MultiVal), LimitRot[c - 3], LimitRot[c]); }else{ Val = CurChan.value(CurTime) + (CurVal[c] * MultiVal); } if((KeyID = CurChan.keyExists(CurTime)) != nil) CurChan.setKeyValue(KeyID, Val); else CurChan.createKey(CurTime, Val); } CurChan = CurItems[i].nextChannel(); } MultiVal++; } break; // --------------------------- case MODE_SEQ_ADD: for(i = 1; i <= ItemNum; i++){ if(LimitType && (ChgFlag[4] || ChgFlag[5] || ChgFlag[6])) LimitRot = getLimitRot(CurItems[i]); CurChan = CurItems[i].firstChannel(); for(c = 1; c <= MaxChan; c++){ if(ChgFlag[c]){ (StKeyOrder, EdKeyOrder) = getKeyIDRange(CurChan, CurTime, EndTime); // LimitRot[j]は1-3でHPBmin、[c]は4-6でHPBmaxとなる。無効なら中身(1&3〜)がNil if((4 <= c)&&(c <= 6)&&(LimitType)&&(LimitRot[c] != nil)){ j = c - 3; for(x = StKeyOrder; x <= EdKeyOrder; x++){ Val = testValMinMax(CurChan.getKeyValue(CurChan.keys[x]) + CurVal[c], LimitRot[j], LimitRot[c]); CurChan.setKeyValue(CurChan.keys[x], Val); } }else{ for(x = StKeyOrder; x <= EdKeyOrder; x++){ Val = CurChan.getKeyValue(CurChan.keys[x]) + CurVal[c]; CurChan.setKeyValue(CurChan.keys[x], Val); } } } CurChan = CurItems[i].nextChannel(); } } break; // --------------------------- case MODE_SEQ_COPY: if((!SelfWType)&&(ItemNum == 1)){ error("
Normal SEQUENCE COPY mode Need 2 or more Items"); break; } // Get MODE_SEQ_COPY CurChan = CurItems[ItemNum].firstChannel(); for(c = 1; c <= MaxChan; c++){ if(ChgFlag[c]){ (StKeyOrder, EdKeyOrder) = getKeyIDRange(CurChan, CurTime, EndTime); SrcKeyNum[c] = EdKeyOrder - StKeyOrder + 1; // キー読出し位置は不定、配列への格納はx=1から x = 1; for(i = StKeyOrder; i <= EdKeyOrder; i++){ Val = CurChan.getKeyTime(CurChan.keys[i]); KeyBlock[c][x][1] = Val; Val = CurChan.getKeyValue(CurChan.keys[i]); KeyBlock[c][x][2] = Val; Val = CurChan.getKeyCurve(CurChan.keys[i]); KeyBlock[c][x][3] = Val; x++; } // フラグに応じて±反転 if(RevFlag[c]){ for(x = 1; x <= SrcKeyNum[c]; x++){ Val = KeyBlock[c][x][2]; KeyBlock[c][x][2] = Val * -1.0; } } // 時間シフト if(ShtFrame != 0){ for(x = 1; x <= SrcKeyNum[c]; x++){ Val = KeyBlock[c][x][1]; KeyBlock[c][x][1] = Val + ShtTime; } } } CurChan = CurItems[ItemNum].nextChannel(); } if(SelfWType) TempItemNum = ItemNum; else TempItemNum = ItemNum - 1; // Set MODE_SEQ_COPY for(i = 1; i <= TempItemNum; i++){ if(LimitType && (ChgFlag[4] || ChgFlag[5] || ChgFlag[6])) LimitRot = getLimitRot(CurItems[i]); CurChan = CurItems[i].firstChannel(); for(c = 1; c <= MaxChan; c++){ if(ChgFlag[c]){ (StKeyOrder, EdKeyOrder) = getKeyIDRange(CurChan, CurTime + ShtTime, EndTime + ShtTime); for(x = EdKeyOrder; x >= StKeyOrder; x--) CurChan.deleteKey(CurChan.keys[x]); // LimitRot[j]は1-3でHPBmin、[c]は4-6でHPBmaxとなる。無効なら中身(1&3〜)がNil if((4 <= c)&&(c <= 6)&&(LimitType)&&(LimitRot[c] != nil)){ j = c - 3; for(x = 1; x <= SrcKeyNum[c]; x++){ Val = testValMinMax(KeyBlock[c][x][2], LimitRot[j], LimitRot[c]); KeyID = CurChan.createKey(KeyBlock[c][x][1], Val); CurChan.setKeyCurve(KeyID, KeyBlock[c][x][3]); } }else{ for(x = 1; x <= SrcKeyNum[c]; x++){ KeyID = CurChan.createKey(KeyBlock[c][x][1], KeyBlock[c][x][2]); CurChan.setKeyCurve(KeyID, KeyBlock[c][x][3]); } } } CurChan = CurItems[i].nextChannel(); } } break; // --------------------------- case MODE_PAIR_COPY: if(ItemNum == 1){ error("
Pair COPY mode Need 2,4,6.. or more Pair Items"); break; } // 第一選択は末尾(ItemNum) TempItemNum = ItemNum >> 1; i = ItemNum; for(x = 1; x <= TempItemNum; x++){ // Srcから読み込み CurChan = CurItems[i].firstChannel(); for(c = 1; c <= MaxChan; c++){ // .value()はラジアン、.getKeyValueでは度数 CurVal[c] = CurChan.value(CurTime); if((KeyID = CurChan.keyExists(CurTime)) != nil){ // LS2.5だと配列に.get〜()メソッドで値を入れるとLSCoreが壊れる?。LS2.7〜では平気 Val = CurChan.getKeyCurve(KeyID); CurKeyCurv[c] = Val; } CurChan = CurItems[i].nextChannel(); } // .value()で得たラジアンを度数に変換 CurVal[4] = deg(CurVal[4]); CurVal[5] = deg(CurVal[5]); CurVal[6] = deg(CurVal[6]); // フラグに応じて±反転 for(c = 1; c <= 6; c++) if(RevFlag[c]) CurVal[c] *= -1.0; i--; // Destへ書き込み if(LimitType && (ChgFlag[4] || ChgFlag[5] || ChgFlag[6])) LimitRot = getLimitRot(CurItems[i]); CurChan = CurItems[i].firstChannel(); for(c = 1; c <= MaxChan; c++){ if(ChgFlag[c]){ if((4 <= c)&&(c <= 6)&&(LimitType)&&(LimitRot[c] != nil)){ Val = testValMinMax(CurVal[c], LimitRot[c - 3], LimitRot[c]); }else{ Val = CurVal[c]; } if((KeyID = CurChan.keyExists(CurTime)) != nil) CurChan.setKeyValue(KeyID, Val); else KeyID = CurChan.createKey(CurTime, Val); if(CurKeyCurv[c] != nil) CurChan.setKeyCurve(KeyID, CurKeyCurv[c]); } CurChan = CurItems[i].nextChannel(); } i--; } info(ItemNum); break; default: break; } // 選択順を維持する為に末尾(=先頭)から選択。LimitTypeでLimitを見に行ってなければ再選択は不要 if(LimitType && (ChgFlag[4] || ChgFlag[5] || ChgFlag[6]) && (ItemNum > 1)){ SelectItem(CurItems[ItemNum].id); for(i = ItemNum - 1; i >= 1; i--) AddToSelection(CurItems[i].id); } Refresh(); return; } // -------------------------------------- getKeyIDRange: Channel, StTime, EdTime { var StTmpKey, EdTmpKey; var MakeStFlag = false; var MakeEdFlag = false; // 指定時間にキーが存在しない場合ダミーキーを打つ if((StTmpKey = Channel.keyExists(StTime)) == nil){ StTmpKey = Channel.createKey(StTime, 0.0); MakeStFlag = true; } if((EdTmpKey = Channel.keyExists(EdTime)) == nil){ EdTmpKey = Channel.createKey(EdTime, 0.0); MakeEdFlag = true; } var StKeyOrder = searchKeyIDOrder(Channel,StTime); var EdKeyOrder = searchKeyIDOrder(Channel,EdTime); // ダミーキーを打っていたらそれを削除 if(MakeStFlag){ Channel.deleteKey(StTmpKey); EdKeyOrder--; } if(MakeEdFlag){ Channel.deleteKey(EdTmpKey); EdKeyOrder--; } return(StKeyOrder, EdKeyOrder); } searchKeyIDOrder: Channel, SrcTime { // 二分検索 var st = 1; var ed = Channel.keyCount; // 丸め値で評価しないと見えない誤差のせいで誤判定する(1.66667 > 1.66667等が成立してしまう) var RTime = round(SrcTime, 6); while(st <= ed){ // ビットシフトにしてみた(右= x/2 切り捨て) // var KeyNum = ceil((st + ed) * 0.5); var KeyNum = (st + ed) >> 1; if(RTime < round(Channel.getKeyTime(Channel.keys[KeyNum]), 6)){ ed = KeyNum - 1; }else if(RTime > round(Channel.getKeyTime(Channel.keys[KeyNum]), 6)){ st = KeyNum + 1; }else{ return(KeyNum); } } return(nil); } testValMinMax: Value, MinRot, MaxRot { if(Value < MinRot) return(MinRot); else if(Value > MaxRot) return(MaxRot); return(Value); } getLimitRot: Item { var v[6]; SelectItem(Item.id); LimitH(); LimitP(); LimitB(); v = Item.limits(ROTATION); LimitH(); LimitP(); LimitB(); return(v); // LW7.5のLimit_H/P/B()は(第一)選択アイテム単体にのみ作用、LW8/9は選択中アイテム全て // そのまま.limits()した場合、有効だとNilが返り、無効だと値が返る // 一度反転させる事で有効(値)、無効(Nil)として取れるようになる // Limit有効な所は値、無効な所はNilの配列 Val[6]を返す } changeFlagCurTime: v { var EndF = getvalue(cA); if(v > EndF) setvalue(cA, v); } changeFlagEndTime: v { var StartF = getvalue(c0); if(StartF > v) setvalue(c0, v); } maskItemSlot: v { return(false); } maskEndFrame: v { return(v == 5 || v == 6); } maskShiftFrame: v { return(v == 6); } maskSelfWback: v { return((v == 2)||(v == 6)); } maskInputVal6: v { return(v <= 5); } maskInputVal9: v { if(MaxChan == 6) return(false); else return(v <= 5); } maskInputVal: v { return(v != 7); } maskScales: v { if(MaxChan == 6) return(false); else return(true); } setPreStFrame { setvalue(c0, CurScene.previewstart); } setPreEdFrame { setvalue(cA, CurScene.previewend); } changeFlagPX: v { ChgFlag[1] = true; setvalue(f1, true); } changeFlagPY: v { ChgFlag[2] = true; setvalue(f2, true); } changeFlagPZ: v { ChgFlag[3] = true; setvalue(f3, true); } changeFlagRH: v { ChgFlag[4] = true; setvalue(f4, true); } changeFlagRP: v { ChgFlag[5] = true; setvalue(f5, true); } changeFlagRB: v { ChgFlag[6] = true; setvalue(f6, true); } changeFlagSX: v { ChgFlag[7] = true; setvalue(f7, true); } changeFlagSY: v { ChgFlag[8] = true; setvalue(f8, true); } changeFlagSZ: v { ChgFlag[9] = true; setvalue(f9, true); } changeFlagPXT: v { ChgFlag[1] = v; } changeFlagPYT: v { ChgFlag[2] = v; } changeFlagPZT: v { ChgFlag[3] = v; } changeFlagRHT: v { ChgFlag[4] = v; } changeFlagRPT: v { ChgFlag[5] = v; } changeFlagRBT: v { ChgFlag[6] = v; } changeFlagSXT: v { ChgFlag[7] = v; } changeFlagSYT: v { ChgFlag[8] = v; } changeFlagSZT: v { ChgFlag[9] = v; } changeFlagRevPX: v { RevFlag[1] = v; ChgFlag[1] = v; setvalue(f1, v); } changeFlagRevPY: v { RevFlag[2] = v; ChgFlag[2] = v; setvalue(f2, v); } changeFlagRevPZ: v { RevFlag[3] = v; ChgFlag[3] = v; setvalue(f3, v); } changeFlagRevRH: v { RevFlag[4] = v; ChgFlag[4] = v; setvalue(f4, v); } changeFlagRevRP: v { RevFlag[5] = v; ChgFlag[5] = v; setvalue(f5, v); } changeFlagRevRB: v { RevFlag[6] = v; ChgFlag[6] = v; setvalue(f6, v); } changeFlagPos { ChgFlag[1] ^= 1; ChgFlag[2] ^= 1; ChgFlag[3] ^= 1; setvalue(f1, ChgFlag[1]); setvalue(f2, ChgFlag[2]); setvalue(f3, ChgFlag[3]); } changeFlagRot { ChgFlag[4] ^= 1; ChgFlag[5] ^= 1; ChgFlag[6] ^= 1; setvalue(f4, ChgFlag[4]); setvalue(f5, ChgFlag[5]); setvalue(f6, ChgFlag[6]); } changeFlagScl { ChgFlag[7] ^= 1; ChgFlag[8] ^= 1; ChgFlag[9] ^= 1; setvalue(f7, ChgFlag[7]); setvalue(f8, ChgFlag[8]); setvalue(f9, ChgFlag[9]); }