Пример #1
0
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)
Пример #2
0
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()
Пример #3
0
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()))
Пример #4
0
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)
Пример #5
0
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 + " を出力しました。")
Пример #6
0
 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))
Пример #7
0
    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で直接指定モード
Пример #8
0
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
Пример #9
0
def _activetrain():
    """現在アクティブなVRMTrainオブジェクトを返す。"""
    lst = [x for x in vrmapi.LAYOUT().GetTrainList() if x.IsActive()]
    if lst:
        return lst[0]
    return None
Пример #10
0
_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
Пример #11
0
__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      # 手ブレの累積量
Пример #12
0
def setPowerAll(sw):
    # 編成リストを取得
    tList = vrmapi.LAYOUT().GetTrainList()
    # 編成ごとに処理
    for tra in tList:
        setPower(tra, sw)