18. (注意)
def onInput_onStart(self):
# We create TabletService here in order to avoid
# problems with connections and disconnections of the tablet during the life of the application
tabletService = self._getTabletService()
if tabletService:
try:
url = self.getParameter("ImageUrl")
if url == '':
self.logger.error("URL of the image is empty")
if not url.startswith('http'):
url = self._getAbsoluteUrl(url)
tabletService.showImage(url)
except Exception as err:
self.logger.error("Error during ShowImage : %s " % err)
self.onStopped()
else:
self.logger.warning("No ALTabletService, can't display the image.")
self.onStopped()
このままRunしても
self._getTabletService()内で取得しようとするALTabletServiceが見つからなくてエラーになる
Copyright @ html5j Robot Organization. All right reserved.
19. self.frameManager.getBehaviorPath(self.behaviorId) によって得られた、
Show Imageボックスが所属するビヘイビアのパスを利用いるが、
ビヘイビアがプロジェクトファイルの最上位にないと、ここで想定しているURLが取得できず、画像
の表示に失敗してしまいます。
def _getAppName(self):
import os
if self.frameManager:
behaviorPath = os.path.normpath(self.frameManager.getBehaviorPath(self.behaviorId))
appsFolderFragment = os.path.join("PackageManager", "apps")
if not (appsFolderFragment in behaviorPath):
self.logger.error("appsFolderFragment is not in behaviorPath")
fragment = behaviorPath.split(appsFolderFragment, 1)[1]
return fragment.lstrip("/")
else:
self.logger.warning("No ALFrameManager")
def _getAbsoluteUrl(self, partial_url):
import os
subPath = os.path.join(self._getAppName(), os.path.normpath(partial_url).lstrip("/"))
# We create TabletService here in order to avoid
# problems with connections and disconnections of the tablet during the life of the application
return "http://%s/apps/%s" %(self._getTabletService().robotIp(), subPath.replace(os.path.sep, "/"))
Copyright @ html5j Robot Organization. All right reserved.
21. 方法2
「Show Image」ボックスのPythonコードに以下のようなコードを挿入する。
def _getAppName(self):
import os
if self.frameManager:
behaviorPath = os.path.normpath(self.frameManager.getBehaviorPath(self.behaviorId))
appsFolderFragment = os.path.join("PackageManager", "apps")
if not (appsFolderFragment in behaviorPath):
self.logger.error("appsFolderFragment is not in behaviorPath")
fragment = behaviorPath.split(appsFolderFragment, 1)[1]
# 以下の1行を追加
fragment = fragment.split('/')[1]
return fragment.lstrip("/")
else:
self.logger.warning("No ALFrameManager")
def _getAbsoluteUrl(self, partial_url):
import os
subPath = os.path.join(self._getAppName(), os.path.normpath(partial_url).lstrip("/"))
# We create TabletService here in order to avoid
# problems with connections and disconnections of the tablet during the life of the application
return "http://%s/apps/%s" %(self._getTabletService().robotIp(), subPath.replace(os.path.sep, "/"))
Copyright @ html5j Robot Organization. All right reserved.
22. def onInput_onStart(self):
# 追加コード
import time
# We create TabletService here in order to avoid
# problems with connections and disconnections of the tablet during the life of the application
tabletService = self._getTabletService()
if tabletService:
try:
url = self.getParameter("ImageUrl")
if url == '':
self.logger.error("URL of the image is empty")
if not url.startswith('http'):
url = self._getAbsoluteUrl(url)
# 追加コード
url += "?" + str(time.time())
tabletService.showImage(url)
(注意2)
画像表示のアプリを複数回実行すると、タブレットのWebブラウザが画像をキャッシュしてしまい、
タブレットの内容が更新されないという現象が発生します。
これを回避するために実行時の時間をURLのクエリに含めてあげる方法が有効です。
Copyright @ html5j Robot Organization. All right reserved.
46. def _getAppName(self):
import os
if self.frameManager:
behaviorPath =
os.path.normpath(self.frameManager.getBehaviorPath(self.behaviorId))
appsFolderFragment = os.path.join("PackageManager", "apps")
if not (appsFolderFragment in behaviorPath):
self.logger.error("appsFolderFragment is not in behaviorPath")
fragment = behaviorPath.split(appsFolderFragment, 1)[1]
# 追加コード: ここから
fragment = fragment.split('/')[1]
return fragment.lstrip("/")
else:
self.logger.warning("No ALFrameManager")
パス問題回避のため、おなじみの「Show Image」の_getAppNameメソッドに以下のコード
を追加
Copyright @ html5j Robot Organization. All right reserved.