ウィジットの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つの値を返していることになります。

この記事のURLとタイトルをコピーする
Translate »