NVUtil.py
Go to the documentation of this file.
00001 #!/usr/bin/env python
00002 # -*- coding: euc-jp -*- 
00003 
00004 ##
00005 # @file NVUtil.py
00006 # @brief NameValue and NVList utility functions
00007 # @date $Date: 2007/09/11$
00008 # @author Noriaki Ando <n-ando@aist.go.jp> and Shinji Kurihara
00009 # 
00010 # Copyright (C) 2006-2008
00011 #     Noriaki Ando
00012 #     Task-intelligence Research Group,
00013 #     Intelligent Systems Research Institute,
00014 #     National Institute of
00015 #         Advanced Industrial Science and Technology (AIST), Japan
00016 #     All rights reserved.
00017 
00018 import sys
00019 import traceback
00020 from omniORB import any
00021 
00022 import OpenRTM_aist
00023 import SDOPackage, SDOPackage__POA
00024 
00025 
00026 ##
00027 # @if jp
00028 #
00029 # @brief NameValue を生成する
00030 #
00031 # このオペレーションはNameValueを作成する。
00032 #
00033 # @param name NameValue の name
00034 # @param value NameValue の value
00035 #
00036 # @return NameValue
00037 #
00038 # @else
00039 #
00040 # @brief Create NameVale
00041 #
00042 # This operation creates NameVale.
00043 #
00044 # @param name name of NameValue
00045 # @param value value of NameValue
00046 #
00047 # @return NameValue
00048 #
00049 # @endif
00050 def newNV(name, value):
00051   try:
00052     any_val = any.to_any(value)
00053   except:
00054     print "ERROR  NVUtil.newNV : Can't convert to any. ", type(value)
00055     raise
00056 
00057     
00058   nv = SDOPackage.NameValue(name, any_val)
00059   return nv
00060 
00061 
00062 ##
00063 # @if jp
00064 #
00065 # @brief Properties を NVList へコピーする
00066 #
00067 # このオペレーションは Properties を NVList へコピーする。
00068 # NVList の value は全て CORBA::string 型としてコピーする。
00069 #
00070 # @param nv Properties の値を格納する NVList
00071 # @param prop コピー元の Properties
00072 #
00073 # @else
00074 #
00075 # @brief Copy to NVList from Proeprties
00076 #
00077 # This operation copies Properties to NVList.
00078 # Created NVList's values are CORBA::string.
00079 #
00080 # @param nv NVList to store Properties values
00081 # @param prop Properties that is copies from
00082 #
00083 # @endif
00084 # void copyFromProperties(SDOPackage::NVList& nv, const coil::Properties& prop);
00085 def copyFromProperties(nv, prop):
00086   keys = prop.propertyNames()
00087   keys_len = len(keys)
00088   nv_len = len(nv)
00089   if nv_len > 0:
00090     for i in range(nv_len):
00091       del nv[-1]
00092 
00093   for i in range(keys_len):
00094     nv.append(newNV(keys[i], prop.getProperty(keys[i])))
00095 
00096 
00097 ##
00098 # @if jp
00099 #
00100 # @brief NVList を Properties へコピーする
00101 #
00102 # このオペレーションは NVList を Properties へコピーする。
00103 #
00104 # @param prop NVList の値を格納する Properties
00105 # @param nv コピー元の NVList
00106 #
00107 # @else
00108 #
00109 # @brief Copy to Proeprties from NVList
00110 #
00111 # This operation copies NVList to Properties.
00112 #
00113 # @param prop Properties to store NVList values
00114 # @param nv NVList that is copies from
00115 #
00116 # @endif
00117 # void copyToProperties(coil::Properties& prop, const SDOPackage::NVList& nv);
00118 def copyToProperties(prop, nvlist):
00119   for nv in nvlist:
00120     try:
00121       val = str(any.from_any(nv.value, keep_structs=True))
00122       prop.setProperty(str(nv.name),val)
00123     except:
00124       print OpenRTM_aist.Logger.print_exception()
00125       pass
00126 
00127 
00128 
00129 ##
00130 # @if jp
00131 # @class to_prop
00132 # @brief NVList → Properties 変換用ファンクタ
00133 # @endif
00134 class to_prop:
00135   def __init__(self):
00136     self._prop = OpenRTM_aist.Properties()
00137     
00138   def __call__(self, nv):
00139     self._prop.setProperty(nv.name, nv.value)
00140 
00141 
00142 
00143 ##
00144 # @if jp
00145 #
00146 # @brief NVList を Properties へ変換する
00147 #
00148 # このオペレーションは NVList を Properties へ変換する。
00149 #
00150 # @param nv 変換元の NVList
00151 #
00152 # @return 変換結果Property
00153 #
00154 # @else
00155 #
00156 # @endif
00157 # coil::Properties toProperties(const SDOPackage::NVList& nv);
00158 def toProperties(nv):
00159   p = OpenRTM_aist.CORBA_SeqUtil.for_each(nv, to_prop())
00160   return p._prop
00161 
00162 
00163 
00164 ##
00165 # @if jp
00166 # @class nv_find
00167 # @brief NVList 検索用ファンクタ
00168 # @endif
00169 class nv_find:
00170   """
00171   """
00172 
00173   def __init__(self, name):
00174     self._name = name
00175 
00176   def __call__(self, nv):
00177     return str(self._name) == str(nv.name)
00178 
00179 
00180 ##
00181 # @if jp
00182 #
00183 # @brief NVList から name で指定された value を返す
00184 #
00185 # このオペレーションは name で指定された value を Any 型で返す。
00186 # 指定した名称の要素が存在しない場合は例外を発生させる。
00187 #
00188 # @param nv 検索対象の NVList
00189 # @param name 検索する名前
00190 #
00191 # @return 検索結果
00192 #
00193 # @else
00194 #
00195 # @brief Get value in NVList specified by name
00196 #
00197 # This operation returns Any type of value specified by name.
00198 # Created NVList's values are CORBA::string.
00199 #
00200 # @param nv NVList to be searched
00201 # @param prop name to seartch in NVList
00202 #
00203 # @endif
00204 def find(nv, name):
00205   index = OpenRTM_aist.CORBA_SeqUtil.find(nv, nv_find(name))
00206 
00207   if index < 0:
00208     raise "Not found."
00209 
00210   return nv[index].value
00211 
00212 
00213 ##
00214 # @if jp
00215 #
00216 # @brief name で指定された要素のインデックスを返す
00217 #
00218 # このオペレーションは name で指定された要素が格納されている位置の
00219 # インデックスを返す。
00220 #
00221 # @param nv 検索対象の NVList
00222 # @param name 検索する名前
00223 #
00224 # @return 検索対象のインデックス
00225 #
00226 # @else
00227 #
00228 # @endif
00229 def find_index(nv, name):
00230   return OpenRTM_aist.CORBA_SeqUtil.find(nv, nv_find(name))
00231 
00232 
00233 ##
00234 # @if jp
00235 #
00236 # @brief 指定された name の value の型が string であるか検証する
00237 #
00238 # このオペレーションは name で指定された value の型が CORBA::string
00239 # かどうかを bool 値で返す。
00240 #
00241 # @param nv 検索対象の NVList
00242 # @param name 検索する名前
00243 #
00244 # @return string検証結果(string:true、それ以外:false)
00245 #
00246 # @else
00247 #
00248 # @endif
00249 def isString(nv, name):
00250   try:
00251     value = find(nv, name)
00252     val = any.from_any(value, keep_structs=True)
00253     return type(val) == str
00254   except:
00255     return False
00256 
00257 
00258 ##
00259 # @if jp
00260 #
00261 # @brief 指定された name の value の型が指定した文字列と一致するか検証する
00262 #
00263 # このオペレーションは name で指定された value の型が CORBA::string
00264 # かどうかを判断し、  CORBA::string である場合には指定した文字列と一致するか
00265 # をbool 値で返す。
00266 #
00267 # @param nv 検索対象の NVList
00268 # @param name 検索する名前
00269 # @param value 比較対象文字列
00270 #
00271 # @return 検証結果(文字列と一致:true、非一致:false)
00272 #
00273 # @else
00274 #
00275 # @endif
00276 def isStringValue(nv, name, value):
00277   if isString(nv, name):
00278     if toString(nv, name) == value:
00279       return True
00280   return False
00281 
00282 
00283 ##
00284 # @if jp
00285 #
00286 # @brief 指定された name の NVList を string として返す。
00287 #
00288 # このオペレーションは name で指定された NVList の値を string で返す。
00289 # もし、name で指定した value の値が CORBA::string でなければ、
00290 # 空の文字列のstringを返す。
00291 #
00292 # @param nv 検索対象の NVList
00293 # @param name 検索する名前
00294 #
00295 # @return name に対応する値のstring型の値
00296 #
00297 # @else
00298 #
00299 # @brief Get string value in NVList specified by name
00300 #
00301 # This operation returns string value in NVList specified by name.
00302 # If the value in NVList specified by name is not CORBA::string type
00303 # this operation returns empty string value.
00304 #
00305 # @param nv NVList to be searched
00306 # @param name name to to serach
00307 #
00308 # @return string value named by name
00309 #
00310 # @endif
00311 def toString(nv, name=None):
00312   if not name:
00313     str_ = [""]
00314     return dump_to_stream(str_, nv)
00315 
00316   str_value = ""
00317   try:
00318     ret_value = find(nv, name)
00319     val = any.from_any(ret_value, keep_structs=True)
00320     if type(val) == str:
00321       str_value = val
00322   except:
00323     print OpenRTM_aist.Logger.print_exception()
00324     pass
00325   
00326   return str_value
00327 
00328 
00329 ##
00330 # @if jp
00331 #
00332 # @brief 指定された文字列を NVList の要素に追加する。
00333 #
00334 # このオペレーションは name で指定された要素に value で指定された文字列を
00335 # 追加する。
00336 # name で指定した要素に既に value の値が設定されている場合には何もしない。
00337 # name で指定した要素に value の値が設定されていない場合は、 「,」区切りで
00338 # value の値を追加する。
00339 # 指定された値を設定する。
00340 # name で指定した要素が存在しない場合は、 NVList の最後に新たな要素を追加し、
00341 # 指定された値を設定する。
00342 #
00343 # @param nv 検索対象の NVList
00344 # @param name 追加対象要素名
00345 # @param value 追加する文字列
00346 #
00347 # @return 追加操作結果
00348 #
00349 # @else
00350 #
00351 # @endif
00352 def appendStringValue(nv, name, value):
00353   index = find_index(nv, name)
00354   if index >= 0:
00355     tmp_str = nv[index].value.value()
00356     values = OpenRTM_aist.split(tmp_str,",")
00357     find_flag = False
00358     for val in values:
00359       if val == value:
00360         find_flag = True
00361 
00362     if not find_flag:
00363       tmp_str += ", "
00364       tmp_str += value
00365       nv[index].value = any.to_any(tmp_str)
00366   else:
00367     OpenRTM_aist.CORBA_SeqUtil.push_back(nv, newNV(name, value))
00368 
00369   return True
00370 
00371 
00372 ##
00373 # @if jp
00374 #
00375 # @brief NVList に要素を追加する。
00376 #
00377 # このオペレーションは dest で指定された NVList に src で指定された要素を
00378 # 追加する。
00379 #
00380 # @param dest 追加される NVList
00381 # @param src 追加する NVList
00382 #
00383 # @else
00384 #
00385 # @endif
00386 def append(dest, src):
00387   for i in range(len(src)):
00388     OpenRTM_aist.CORBA_SeqUtil.push_back(dest, src[i])
00389 
00390 
00391 ##
00392 # @if jp
00393 # @brief NVList に設定されている内容を文字列として出力する。
00394 # @else
00395 # @brief Print information configured in NVList as a string type
00396 # @endif
00397 # std::ostream& dump_to_stream(std::ostream& out, const SDOPackage::NVList& nv)
00398 def dump_to_stream(out, nv):
00399   for i in range(len(nv)):
00400     val = any.from_any(nv[i].value, keep_structs=True)
00401     if type(val) == str:
00402             out[0] += (nv[i].name + ": " + str(nv[i].value) + "\n")
00403     else:
00404             out[0] += (nv[i].name + ": not a string value \n")
00405 
00406   return out[0]
00407 
00408 
00409 ##
00410 # @if jp
00411 #
00412 # @brief NVList に設定されている内容を文字列として出力する。
00413 #
00414 # 指定された NVList に設定された内容を文字列として出力する。
00415 # なお、設定されている要素が文字列型以外の場合には、その旨(文字列ではない)を
00416 # 出力する。
00417 #
00418 # @param nv 出力対象 NVList
00419 #
00420 # @else
00421 #
00422 # @endif
00423 def dump(nv):
00424   out = [""]
00425   print dump_to_stream(out, nv)


openrtm_aist_python
Author(s): Shinji Kurihara
autogenerated on Thu Aug 27 2015 14:17:28