ソケットインターフェース

neoEBV 起動時にソケットをオープンして neoEBV を操作するコマンドを受け付ける機能を提供します。

実行方法

neoEBV の起動時に --json-rpc-server オプションまたは --json-rpc-unix-server オプションを指定することで GUI を制御するソケットをオープンします。

$ nebv --json-rpc-server=[<host|addr>:]<port>[-<port-max>]

または

$ nebv --json-rpc-unix-server=<unix-domain-socket-path>

オープンしたソケットに対して JSON-RPC 形式でコマンドを送ると neoEBV がコマンドを受信し、コマンドに応じた処理を行った後、結果を送信します。

コマンドのリクエストフォーマット

コマンドは pynebv モジュールのメソッドに一対一で紐づいています。 Section クラスのメソッドと Item クラスのメソッドでリクエストフォーマットが異なり、それぞれ以下となります。

メソッドが Section クラスの場合

{"jsonrpc":"2.0","method":"pynebv.<Class名>.<Method名>","id":<ID値>,"params":{"<key>":<value>, "<key>":<value>...}}
jsonrpc

値は 2.0 固定です。

method

値は pynebv.<Class名>.<Method名> のフォーマットで指定します。

  • <Class名> には 継承先の Section クラス の名前を指定します。
    • 例: MarkList のデータを取得したい場合は pynebv.EbvListSection.items ではなく pynebv.MarkList.items を指定します。
  • <Method名> には当該クラスが持つメソッド名を指します。
id

値はユーザが任意に指定可能です。

params

各メソッドの引数名を <key> に、当該引数の値を <value> に指定します。

メソッドが Item クラスの場合

{"jsonrpc":"2.0","method":"pynebv.<Class名>.<Method名>","id":<ID値>,"params":{"item":<value>, "<key>":<value>, "<key>":<value>...}}
jsonrpc

値は 2.0 固定です。

method

値は pynebv.<Class名>.<Method名> のフォーマットで指定します。

  • <Class名> には 指定したメソッドが定義されたクラスから item で指定されたクラスまでのクラス階層に属する Item クラス の名前を指定します。
    • 例: Mark のプロパティを取得したい場合は pynebv.Mark.propspynebv.MarkListItem.propspynebv.EbvItem.props のいずれかを指定します。
    • 例: Jobdeck ファイルを閉じたい場合は pynebv.Jobdeck.closepynebv.File.close のいずれかを指定します。
    • 例: Jobdeck ファイルのレイヤを取得したい場合は pynebv.Jobdeck.layer を指定します。
  • <Method名> には当該クラスが持つメソッド名を指します。
id

値はユーザが任意に指定可能です。

params
  • メソッドを適用するデータを item または itemList キーの値に指定します。
  • 各メソッドの引数名を <key> に、当該引数の値を <value> に指定します。

メソッドが Module クラスの場合

{"jsonrpc":"2.0","method":"pynebv.<Method名>","id":<ID値>,"params":{"<key>":<value>, "<key>":<value>...}}
jsonrpc

値は 2.0 固定です。

method

値は pynebv.<Method 名> のフォーマットで指定します。

  • <Method 名> にはモジュールクラスのメソッド名を指定します。
id

値はユーザが任意に指定可能です。

params

各メソッドの引数名を <key> に、当該引数の値を <value> に指定します。

コマンドのレスポンスフォーマット

レスポンスフォーマットは以下になります。

メソッドが成功した場合

{"jsonrpc":"2.0","id":<リクエストのID値>,"result":{"<key>":<value>, "<key>":<value>...}}
jsonrpc

値は 2.0 固定です。

id

値は対応するリクエストで指定した値となります。

result

値は対応するリクエストに紐づく pynebv モジュールのメソッドが返す値を Json 形式にした値となります。
メソッドの戻り値がない場合は空のオブジェクトが返ります。

メソッドが失敗した場合

{"jsonrpc":"2.0","id":<リクエストのID値>,"error":{"code":<エラーコード>, "message":"<エラーメッセージ>"}}
jsonrpc

値は 2.0 固定です。

id

値は対応するリクエストで指定した値となります。

error

値にはエラーコードとエラーメッセージが含まれます。

JSON-RPC のコマンド例

簡単なコマンドの例を以下に示します。

ファイルのオープン

リクエスト
{"jsonrpc":"2.0","method":"pynebv.FileList.open","id":1001,"params":{"filePath":"/path/to/sample.oas","opts":{"cellline":"false","chipline":"false","dose-index":"false"}}}
レスポンス
{"jsonrpc":"2.0","id":1001,"result":{"key":"sample.oas@1","klass":"File", "props":{"File/AU [um]":"0.0254", "File/Area [um]": "-88.9,-114.3,4770.12,4693.92", "File/Display Name":"sample"},"attrs": {"area":[-88.9, -114.3, 4770.12, 4693.92], "au":"0.0254", "bold":"False"}}

ファイルのクローズ

リクエスト
{"jsonrpc":"2.0","method":"pynebv.File.close","id":1002,"params":{"item":{"key":"sample.oas@1","klass":"File", "props":{"File/AU [um]":"0.0254", "File/Area [um]": "-88.9,-114.3,4770.12,4693.92", "File/Display Name":"sample"},"attrs": {"area":[-88.9, -114.3, 4770.12, 4693.92], "au":"0.0254", "bold":"False"}}}}
レスポンス
{"jsonrpc":"2.0","id":1002,"result":{}}

マークの作成

リクエスト
{"jsonrpc":"2.0","method":"pynebv.MarkList.add","id":1010,"params":{"point":[10,0]}}
レスポンス
{"jsonrpc":"2.0","id":1010,"result":{"key":"Marks@1|Mark 1@1","props":{"Color":"80000000","Location":"10.0,0.0","Name":"Mark 1","Shape":"Dot"},"attrs":{"cells":{"LineNo.":"1","mark_color":"","mark_group":"","mark_representative":"","mark_shape":"","name":"Mark 1","x":"10.0","y":"0.0"},"color":"80000000","display":"True","is_filter_hit":"True","name":"Mark 1","pos":[10,0],"thumbnail_image_size":"None"},"klass":"Mark"}}

マークのプロパティ取得

リクエスト
{"jsonrpc":"2.0","method":"pynebv.EbvItem.props","id":1011,"params":{"item": {"key":"Marks@1|Mark 1@1","props":{"Color":"80000000","Location":"10.0,0.0","Name":"Mark 1","Shape":"Dot"},"attrs":{"cells":{"LineNo.":"1","mark_color":"","mark_group":"","mark_representative":"","mark_shape":"","name":"Mark 1","x":"10.0","y":"0.0"},"color":"80000000","display":"True","is_filter_hit":"True","name":"Mark 1","pos":[10,0],"thumbnail_image_size":"None"},"klass":"Mark"}}}
レスポンス
{"jsonrpc":"2.0","id":1011,"result":{"Color":"80000000","Location":"10.0,0.0","Name":"Mark 1","Shape":"Dot"}}

neoEBV の終了

リクエスト
{"jsonrpc":"2.0","method":"pynebv.quit","id":1011."params":{"exitCode":"1"}}
レスポンス
{"jsonrpc":"2.0","id":1011,"result":{}}

エラーコマンド (method 名が不正のケース)

リクエスト
{"jsonrpc":"2.0","method":"pynebv.test","id":1001,"params":{"filePath":"/path/to/sample.oas"}}
レスポンス
{"jsonrpc": "2.0", "error": {"code": -32601, "message": "Method not found"}, "id": "1001"}

サンプルコード

実際に neoEBV に接続して JSON-RPC 形式でコマンドを送受信する例を python で示します。

import socket
import json

def sendJsonRpcRequest(socket, method, params, id):
  # create request
  request = {
    "jsonrpc": "2.0",
    "method": method,
    "params": params,
    "id": id
  }

  # convert json string
  request_json = json.dumps(request)
  # send to neoEBV
  socket.sendall(request_json.encode('utf-8'))

def receiveJsonRpcResponse(socket):
  # receive first character from neoEBV
  first_char = socket.recv(1)
  # receive rest message from neoEBV
  socket.setblocking(False)
  response = first_char
  response += socket.recv(8192)
  socket.setblocking(True)
  return json.loads(response.decode('utf-8'))

# check if response has error
def responseHasError(response):
  if "error" in response:
    print("[ERROR] fail to send request: ", response.get("error").get("message"))
    return True
  else:
    return False

def main():
  sock = None
  try:
    # connect to neoEBV
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect(("<server ip>", <port>))

    # request file open command
    sendJsonRpcRequest(sock, "pynebv.FileList.open", {"filePath":"/path/to/sample.oas","opts":{"chipline":"true"}}, 1001)
    response = receiveJsonRpcResponse(sock)

    # get file object
    if responseHasError(response):
      return
    file = response.get("result")

    # request mark add command
    sendJsonRpcRequest(sock, "pynebv.MarkList.add", {"point":[10,10]}, 1002)
    response = receiveJsonRpcResponse(sock)

    # get mark object
    if responseHasError(response):
      return
    mark = response.get("result")

    # request mark delete command
    sendJsonRpcRequest(sock, "pynebv.Mark.delete", {"item": mark}, 1003)
    receiveJsonRpcResponse(sock)

    # request file close command
    sendJsonRpcRequest(sock, "pynebv.File.close", {"item": file}, 1002)
    receiveJsonRpcResponse(sock)

  finally:
    if sock:
      # disconnect from neoEBV
      sock.close()

main()

制限事項

Section Classes または Item Classes で定義されたクラスが持つ Methods に記載されたメソッドのみ使用可能です。Section ClassesItem Classes、使用可能な Methods については pynebv リファレンス を参照してください。

最終更新 24.03.2025