ウィジットのwindow.external.setScriptの戻り値で、複数の値を返したい
ウィジットのwindow.external.setScriptの戻り値で複数の値を返したい場合は、
いったんJSON形式のデータを作成し、それを文字列に変換します。
Python部の記述 (getShapeInfo.py)
ウィジット実装時のPython部で、最終的にresultに文字列を返します。
ここで返した文字列をウィジットのJavaScriptで戻り値として取得できます。
import json
# 選択形状の名前、形状の種類、ポイント数を取得.
scene = xshade.scene()
shape = scene.active_shape()
retArray = {"Name" : "", "Type" : 0, "Points" : 0}
retArray["Name"] = shape.name
retArray["Type"] = shape.type
retArray["Points"] = shape.total_number_of_control_points
# JSON文字列に変換.
# 第二引数の指定で、日本語のマルチバイト文字列はそのまま渡される.
result = json.dumps(retArray, ensure_ascii=False)
この場合は「{“Points”: 114, “Type”: 7, “Name”: “ポリゴンメッシュ”}」のような3つの要素が入ったJSON文字列が返されます。
「json.dumps」については、「JSON形式とは ?」をご参照くださいませ。
このPython部を「getShapeInfo.py」としてファイル保存しました。
HTML部(JavaScript)の記述 (index.html)
ウィジットのindex.htmlでのJavaScript部では、window.external.setScriptを使ってPython部を呼び出し、
戻り値を文字列として取得しています。
ここではJSON文字列が返されるため、「JSON.parse」を使って連想配列の形に変換しています。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<script src="./readExternalFile.js"></script>
<script type="text/javascript">
function getShapeInfo () {
py_src = readFileToString('./getShapeInfo.py');
retStr = window.external.setScript(py_src);
if (retStr != "") {
// JSON文字列を連想配列に変換.
retV = JSON.parse(retStr);
nameStr = retV["Name"];
type = retV["Type"];
points = retV["Points"];
window.alert("[" + nameStr + "] type = " + type.toString() + " points = " + points.toString());
}
}
</script>
</head>
<body>
<form>
<input type="button" value="Push" onClick="getShapeInfo()" />
</form>
</body>
</html>
「readFileToString」関数については、「ウィジット実装時にPythonのソースとHTMLを分離したい」をご参照くださいませ。
これをウィジットとして実行し、ウィジット上のボタンを押すとShade3Dのブラウザで選択された形状の、
名前/種類/ポイント数が表示されます。
この場合は「window.external.setScript」を使ったPython実行で、3つの値を返していることになります。