ソケットインターフェース
実行方法
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
を指定します。
- 例: MarkList のデータを取得したい場合は
<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.props
、pynebv.MarkListItem.props
、pynebv.EbvItem.props
のいずれかを指定します。 - 例: Jobdeck ファイルを閉じたい場合は
pynebv.Jobdeck.close
、pynebv.File.close
のいずれかを指定します。 - 例: Jobdeck ファイルのレイヤを取得したい場合は
pynebv.Jobdeck.layer
を指定します。
- 例: Mark のプロパティを取得したい場合は
<Method名>
には当該クラスが持つメソッド名を指します。
id
値はユーザが任意に指定可能です。
params
- メソッドを適用するデータを
item
またはitemList
キーの値に指定します。 - 各メソッドの引数名を
<key>
に、当該引数の値を<value>
に指定します。
item
キー、itemList
キー、EbvItem
型、EbvItemList
型の値の指定について
- 別のメソッドの戻り値として受け取った
EbvItem
またはEbvItemList
の Json オブジェクトを指定します。 EbvItemList
の Json オブジェクトはEbvItem
の Json オブジェクトを配列にしたものです。
メソッドが 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 Classes
、Item Classes
、使用可能な Methods
については pynebv リファレンス を参照してください。