def sendStateFile(): dir = vrmapi.SYSTEM().GetLayoutDir() if (os.path.exists(dir + "\\send") == False): vrmapi.LOG(dir + "\\send フォルダがありません。") return s = list() # 編成リストを新規編成リストに格納 tList = vrmapi.LAYOUT().GetTrainList() # 新規編成リストから編成を繰り返し取得 for t in tList: # ダミー編成は除外 if t.GetDummyMode() == False: s.append('t\t{0}\t{1:.1f}\n'.format(t.GetID(), t.GetVoltage())) s.append('\n') # 新規ポイントリストを作成 pList = list() # ポイントリストを新規ポイントリストに格納 vrmapi.LAYOUT().ListPoint(pList) # 新規ポイントリストからポイントを繰り返し取得 for p in pList: # 頭文字「dummy」は対象外 if p.GetNAME()[0:5] != 'dummy': s.append('p\t{0}\t{1}\n'.format(p.GetID(), p.GetBranch())) #s.append('\n') # 結合 text = ''.join(s) # ファイル出力 timeText = datetime.now().strftime('%Y%m%d%H%M%S%f') path_w = dir + "\\send\\" + timeText + '.txt' with open(path_w, mode='w') as f: f.write(text)
def drawFrame(): global __title__ # ImGui定義 gui = vrmapi.ImGui() gui.Begin("powerunit", __title__) if vrmapi.ImGui().TreeNode("pwtrain", "編成リスト"): # 編成リストを新規編成リストに格納 tList = vrmapi.LAYOUT().GetTrainList() # 編成一覧を参照 for obj in tList: # ダミー編成以外 if obj.GetDummyMode() == False: # 車両数が0以上(連結消失で発生) if len(obj.GetCarList()) > 0: imguiMakeTrain(gui, obj) gui.TreePop() gui.Separator() # アクティブ編成が選択されている、かつ0車両以上 global _activeTrainObj if _activeTrainObj is not None and len(_activeTrainObj.GetCarList()) > 0: if vrmapi.ImGui().TreeNode("pwcar", "{0} [{1}] {2}".format(_activeTrainObj.GetTrainNumber(), _activeTrainObj.GetID(), _activeTrainObj.GetNAME())): # 車両ごとに処理 for obj in _activeTrainObj.GetCarList(): imguiMakeCar(gui, obj) gui.Text("HL:ヘッドライト TL:テールライト RS:方向幕 LE:LED RL:ルームライト CA:運転台室内灯") gui.Text("SC:入換標識灯 EG:EG灯 SM:蒸気機関車煙 HM:ヘッドマーク PA:パンタグラフ OP:オプション 離:切り離し") gui.TreePop() gui.Separator() if vrmapi.ImGui().TreeNode("pwpoint", "ポイントリスト"): # ポイントリストを取得 pList=list() vrmapi.LAYOUT().ListPoint(pList) # ポイント一覧を参照 gui.Text(" 直/曲 ポイント名 [ID]") for obj in pList: # ダミーは対象外(名前判断) if obj.GetNAME()[0:5] != 'dummy': imguiMakePoint(gui, obj) gui.TreePop() gui.Separator() if vrmapi.ImGui().TreeNode("pwsignal", "信号リスト"): # ポイントリストを取得 sList=list() vrmapi.LAYOUT().ListSignal(sList) # 信号一覧を参照 gui.Text(" 信号名 [ID]") for obj in sList: # ダミーは対象外(名前判断) if obj.GetNAME()[0:5] != 'dummy': imguiMakeSignal(gui, obj) gui.TreePop() gui.End()
def init(): # 編成リストを新規リストに格納 tList = vrmapi.LAYOUT().GetTrainList() # 編成リストから編成を繰り返し取得 for obj in tList: # ダミー編成以外 if obj.GetDummyMode() == False: # 編成オブジェクト内に表示用タグ作成 di = obj.GetDict() di['pw_ch1'] = [0] di['pw_ch2'] = [0] di['pw_drl'] = [0] di['pw_drr'] = [0] di['pw_msg'] = '' # 音の初期値を入力 if obj.GetSoundPlayMode() == 2: di['pw_ch2'] = [1] else: vrmapi.LOG("{0} [{1}] ダミースキップ".format(obj.GetNAME(), obj.GetID())) # ポイントリストを新規リストに格納 pList=list() vrmapi.LAYOUT().ListPoint(pList) # ポイントリストからポイントを繰り返し取得 for obj in pList: # 頭文字「dummy」は対象外 if obj.GetNAME()[0:5] != 'dummy': # ポイントオブジェクトに表示用タグ作成 di = obj.GetDict() # 初期値設定 di['pw_r'] = [obj.GetBranch()] else: vrmapi.LOG("{0} [{1}] ダミースキップ".format(obj.GetNAME(), obj.GetID())) # 信号リストを新規リストに格納 sList=list() vrmapi.LAYOUT().ListSignal(sList) # ポイントリストからポイントを繰り返し取得 for obj in sList: # 頭文字「dummy」は対象外 if obj.GetNAME()[0:5] != 'dummy': # ポイントオブジェクトに表示用タグ作成 di = obj.GetDict() # 初期値設定 di['pw_s0'] = [obj.GetStat(0)] di['pw_s1'] = [obj.GetStat(1)] else: vrmapi.LOG("{0} [{1}] ダミースキップ".format(obj.GetNAME(), obj.GetID()))
def readFileLine(line): # 種別T=列車オブジェクト if line[0] == "T": #vrmapi.LOG(line[1]) train = vrmapi.LAYOUT().GetTrain(int(line[1])) if line[2] == "AutoSpeedCTRL": #vrmapi.LOG(line[2]) train.AutoSpeedCTRL(int(line[3]), float(line[4])) elif line[2] == "Turn": train.Turn() elif line[2] == "PlayHorn": train.PlayHorn(int(line[3])) elif line[2] == "SplitTrain": spl = train.SplitTrain(int(line[3])) vrmapi.LOG("Train[{}].SplitTrain({})->Train[{}]".format( line[1], line[3], spl)) elif line[2] == "SetPower": setPower(train, int(line[3])) # 種別P=ポイントオブジェクト elif line[0] == "P": #vrmapi.LOG(line[1]) # 向き d = int(line[3]) # アンダーバーで複数あり(カンマは運転盤のcheckbox.Nameでエラーのため使えず) if ('_') in line[1]: # アンダーバーで分割 pAry = line[1].split('_') # 複数ポイント処理 for p in pAry: pid = int(p) # 負数の場合 if pid < 0: # 整数に戻す pid = -pid # 方向反転 if d == 0: d = 1 else: d = 0 # ID検索 point = vrmapi.LAYOUT().GetPoint(pid) vrmapi.LOG("SetBranch:" + str(pid) + " " + str(d)) if line[2] == "SetBranch": point.SetBranch(d) else: # ID検索 point = vrmapi.LAYOUT().GetPoint(int(line[1])) if line[2] == "SetBranch": point.SetBranch(d)
def sendSettingFile(): dir = vrmapi.SYSTEM().GetLayoutDir() if (os.path.exists(dir + "\\send") == False): vrmapi.LOG(dir + "\\send フォルダがありません。") return s = list() # 編成リストを新規編成リストに格納 tList = vrmapi.LAYOUT().GetTrainList() # 新規編成リストから編成を繰り返し取得 for t in tList: pos = t.GetPosition() s.append( 't\t{0}\t{1}\t{2}\t{3:.0f}\t{4:.0f}\t{5:.0f}\t{6:.0f}\t{7}'.format( t.GetID(), t.GetNAME(), t.GetTrainNumber(), pos[0], pos[2], pos[1], t.GetRotate(), len(t.GetCarList()))) if t.GetDummyMode() == True: s.append('\tdummy\n') else: s.append('\n') s.append('\n') # 新規ポイントリストを作成 pList = list() # ポイントリストを新規ポイントリストに格納 vrmapi.LAYOUT().ListPoint(pList) # 新規ポイントリストからポイントを繰り返し取得 for p in pList: pos = p.GetPosition() s.append( 'p\t{0}\t{1}\t{2}\t{3:.0f}\t{4:.0f}\t{5:.0f}\t{6:.0f}\n'.format( p.GetID(), p.GetNAME(), p.GetBranch(), pos[0], pos[2], pos[1], p.GetRotate())) #s.append('\n') # 結合 text = ''.join(s) # ファイル出力 timeText = datetime.now().strftime('%Y%m%d%H%M%S%f') path_w = dir + "\\send\\" + timeText + '.txt' with open(path_w, mode='w') as f: f.write(text) vrmapi.LOG(path_w + " を出力しました。")
def addmember(self, obj, rev=False, delay=0.0): """踏切部品を追加 Args: obj: 踏切オブジェクトまたはそのID rev (bool, optional): 方向表示機を逆転するときTrue, デフォルトはFalse delay (float, optional): 閉じるときの動作を遅延するときの時間 [秒] """ if type(obj) == vrmapi.VRMCrossing: pass elif type(obj) == type(0): obj = vrmapi.LAYOUT().GetCrossing(obj) else: raise TypeError('objは踏切オブジェクトかそのID(int)でなければなりません。') if delay < 0.0: raise ValueError('delay(動作遅延時間)は0以上の実数値でなければなりません。') self.members.append((obj, rev, delay))
def __init__(self, res, src=0): vrmsprite = vrmapi.LAYOUT().CreateSprite() if src: vrmsprite.LoadTrainTexture(src, res) else: vrmsprite.LoadSystemTexture(res) self.vrmsprite = vrmsprite self.uv = None #: UV座標のタプル (u0, v0, u1, v1) self.pos = None #: 表示座標のタプル (sx0,sy0, sx1,sy1, sx2,sy2, sx3,sy3) self.org = None #: 演算指定モードでの基準サイズ (dx, dy) self.zoom = (1.0, 1.0) #: 拡大縮小の倍率 (rx, ry) self.pivot = (0.0, 0.0) #: 回転中心(x,y) self.rot = 0.0 #: 回転角 self.trans = (0.0, 0.0) #: 移動量(x,y) self.color = None #: スプライトのカラー(r,g,b,a). 0.0<=r,g,b,a<=1.0. self.dispdirect = True #: Trueで直接指定モード
def execvrmapi(command): """コマンド文字列を解釈し、vrmapiのメソッドを呼ぶ。 パターンに'.*'が含まれるので長いパターンから短いパターンの順に探す。 値を返すコマンドのときはvrmapiのメソッドの戻り値を文字列にして返す。 """ m = _pat4.search(command) if m: cmd = f'{m.group(1)}().{m.group(3)}().{m.group(5)}().{m.group(7)}()' vrmapi.LOG(f'サーバー未実装: {command}') return None m = _pat3.search(command) if m: cmd = f'{m.group(1)}().{m.group(3)}().{m.group(5)}()' if cmd == 'LAYOUT().GetATS().ClearUserEventFunction()': if m.group(2) != '': return None ats = int(m.group(4)) if m.group(6) != '': return None vrmapi.LAYOUT().GetATS(ats).ClearUserEventFunction() return None elif cmd == 'LAYOUT().GetATS().SetUserEventFunction()': if m.group(2) != '': return None ats = int(m.group(4)) name = m.group(6)[1:-1] vrmapi.LAYOUT().GetATS(ats).SetUserEventFunction(name) return None elif cmd == 'LAYOUT().GetPoint().GetBranch()': if m.group(2) != '': return '' point = int(m.group(4)) if m.group(6) != '': return '' return str(vrmapi.LAYOUT().GetPoint(point).GetBranch()) elif cmd == 'LAYOUT().GetPoint().SetBranch()': if m.group(2) != '': return None point = int(m.group(4)) branch = int(m.group(6)) vrmapi.LAYOUT().GetPoint(point).SetBranch(branch) return None elif cmd == 'LAYOUT().GetPoint().SwitchBranch()': if m.group(2) != '': return None point = int(m.group(4)) if m.group(6) != '': return None vrmapi.LAYOUT().GetPoint(point).SwitchBranch() return None elif cmd == 'LAYOUT().GetTrain().AutoSpeedCTRL()': if m.group(2) != '': return None train = int(m.group(4)) lst = m.group(6).split(',') distance = float(lst[0].strip()) voltage = float(lst[1].strip()) vrmapi.LAYOUT().GetTrain(train).AutoSpeedCTRL(distance, voltage) return None elif cmd == 'LAYOUT().GetTrain().GetDirection()': if m.group(2) != '': return '' train = int(m.group(4)) if m.group(6) != '': return '' return str(vrmapi.LAYOUT().GetTrain(train).GetDirection()) elif cmd == 'LAYOUT().GetTrain().GetVoltage()': if m.group(2) != '': return '' train = int(m.group(4)) if m.group(6) != '': return '' return str(vrmapi.LAYOUT().GetTrain(train).GetVoltage()) elif cmd == 'LAYOUT().GetTrain().SetTimerVoltage()': if m.group(2) != '': return None train = int(m.group(4)) lst = m.group(6).split(',') sec = float(lst[0].strip()) voltage = float(lst[1].strip()) vrmapi.LAYOUT().GetTrain(train).SetTimerVoltage(sec, voltage) return None elif cmd == 'LAYOUT().GetTrain().SetTrainCode()': if m.group(2) != '': return None train = int(m.group(4)) code = int(m.group(6)) vrmapi.LAYOUT().GetTrain(train).SetTrainCode(code) return None elif cmd == 'LAYOUT().GetTrain().SetTrainNumber()': if m.group(2) != '': return None train = int(m.group(4)) number = m.group(6)[1:-1] vrmapi.LAYOUT().GetTrain(train).SetTrainNumber(number) return None elif cmd == 'LAYOUT().GetTrain().SetVoltage()': if m.group(2) != '': return None train = int(m.group(4)) voltage = float(m.group(6)) vrmapi.LAYOUT().GetTrain(train).SetVoltage(voltage) return None elif cmd == 'LAYOUT().GetTrain().Turn()': if m.group(2) != '': return None train = int(m.group(4)) if m.group(6) != '': return None vrmapi.LAYOUT().GetTrain(train).Turn() return None vrmapi.LOG(f'サーバー未実装: {command}') return None m = _pat2.search(command) if m: cmd = f'{m.group(1)}().{m.group(3)}()' vrmapi.LOG(f'サーバー未実装: {command}') return None m = _pat1.search(command) if m: cmd = f'{m.group(1)}()' if cmd == 'AutoSpeedCTRL()': lst = m.group(2).split(',') distance = float(lst[0].strip()) voltage = float(lst[1].strip()) train = _activetrain() if train is None: return None train.AutoSpeedCTRL(distance, voltage) return None elif cmd == 'GetDirection()': if m.group(2) != '': return '' train = _activetrain() if train is None: return '' return str(train.GetDirection()) elif cmd == 'GetVoltage()': if m.group(2) != '': return '' train = _activetrain() if train is None: return '' return str(train.GetVoltage()) elif cmd == 'GetID()': if m.group(2) != '': return '' train = _activetrain() if train is None: return '' return str(train.GetID()) elif cmd == 'SetTimerVoltage()': lst = m.group(2).split(',') sec = float(lst[0].strip()) voltage = float(lst[1].strip()) train = _activetrain() if train is None: return None train.SetTimerVoltage(sec, voltage) return None elif cmd == 'SetVoltage()': voltage = float(m.group(2)) train = _activetrain() if train is None: return None train.SetVoltage(voltage) return None elif cmd == 'Turn()': if m.group(2) != '': return None train = _activetrain() if train is None: return None train.Turn() return None vrmapi.LOG(f'サーバー未実装: {command}') return None
def _activetrain(): """現在アクティブなVRMTrainオブジェクトを返す。""" lst = [x for x in vrmapi.LAYOUT().GetTrainList() if x.IsActive()] if lst: return lst[0] return None
_servercommandsocket.setblocking(False) _servercommandsocket.bind(_commandsocketaddress) _servercommandsocket.listen(1) _clientcommandsocket = None _clientcommandstream = None # ノンブロッキングモードのイベント用ソケットを用意して接続受付開始 _servereventsocket = socket.socket() _servereventsocket.setblocking(False) _servereventsocket.bind(_eventsocketaddress) _servereventsocket.listen(1) _clienteventsocket = None _clienteventstream = None # VRM-NXにframeイベントの発生を依頼 vrmapi.LAYOUT().SetEventFrame() vrmapi.LOG(f'{__name__} : ### Startup ###') def _closecommandsocket(): global _clientcommandsocket, _clientcommandstream if _clientcommandsocket: _clientcommandsocket.close() _clientcommandsocket = None _clientcommandstream = None def _closeeventsocket(): global _clienteventsocket, _clienteventstream
__author__ = "AKAGI" try: import vrmapi LOG = vrmapi.LOG except ModuleNotFoundError: print('VRMAPIが見つかりません。VRMNXシステムでしか動作しません。') raise from math import sin,cos,tan,sqrt, pi, pow, ceil,floor from random import triangular import json import os.path DEBUG = False LAYOUT = vrmapi.LAYOUT() NXSYS = vrmapi.SYSTEM() IMGUI = vrmapi.ImGui() DIRECTORY, BASE = os.path.split(NXSYS.GetLayoutPath()) #LOG(BASE) # フレームイベントの設定は activate イベントハンドラでinitのタイミングに移動 _PARENT = None # 親オブジェクト #_gcam = [] # 地上カメラのリスト _toruos = [] # 撮る夫くんたちのリスト _childid = [0] _systime = 0.0 # 前フレームの時刻を記録 _shakemode = [False] # Trueで手ブレON _guidisp = 1 # TrueでGUI操作盤を表示 _shake_vt = 0.0 # 手ブレの累積量
def setPowerAll(sw): # 編成リストを取得 tList = vrmapi.LAYOUT().GetTrainList() # 編成ごとに処理 for tra in tList: setPower(tra, sw)