00001 #!/usr/bin/env python 00002 # -*- coding: euc-jp -*- 00003 00004 ## 00005 # @file Factory.py 00006 # @brief RTComponent factory class 00007 # @date $Date: 2006/11/06 01:28:36 $ 00008 # @author Noriaki Ando <n-ando@aist.go.jp> and Shinji Kurihara 00009 # 00010 # Copyright (C) 2003-2008 00011 # Task-intelligence Research Group, 00012 # Intelligent Systems Research Institute, 00013 # National Institute of 00014 # Advanced Industrial Science and Technology (AIST), Japan 00015 # All rights reserved. 00016 00017 import OpenRTM_aist 00018 00019 00020 ## 00021 # @if jp 00022 # 00023 # @brief brief RTコンポーネント破棄用関数 00024 # 00025 # RTコンポーネントのインスタンスを破棄するための関数。 00026 # 引数にて指定したRTコンポーネントのインスタンスを、終了処理を呼び出して 00027 # 破棄する。 00028 # 00029 # @param rtc 破棄対象RTコンポーネントのインスタンス 00030 # 00031 # @else 00032 # 00033 # @endif 00034 def Delete(rtc): 00035 del rtc 00036 00037 00038 00039 ## 00040 # @if jp 00041 # 00042 # @class FactoryBase 00043 # @brief FactoryBase 基底クラス 00044 # 00045 # RTコンポーネント生成用ファクトリの基底クラス。 00046 # 実際の各種ファクトリクラスを実装する場合は、本クラスを継承する形で実装する。 00047 # 実際の生成、削除処理は具象サブクラスにて実装する必要がある。 00048 # 00049 # @since 0.2.0 00050 # 00051 # @else 00052 # 00053 # @class FactoryBase 00054 # @brief FactoryBase base class 00055 # 00056 # RTComponent factory base class. 00057 # 00058 # @since 0.2.0 00059 # 00060 # @endif 00061 class FactoryBase: 00062 """ 00063 """ 00064 00065 ## 00066 # @if jp 00067 # 00068 # @brief コンストラクタ 00069 # 00070 # コンストラクタ。 00071 # 00072 # @param self 00073 # @param profile コンポーネントのプロファイル 00074 # 00075 # @else 00076 # 00077 # @brief Constructor. 00078 # 00079 # Constructor. 00080 # 00081 # @param profile component profile 00082 # 00083 # @endif 00084 def __init__(self, profile): 00085 ## self._Profile Component profile 00086 self._Profile = profile 00087 ## self._Number Number of current component instances. 00088 self._Number = -1 00089 00090 pass 00091 00092 00093 ## 00094 # @if jp 00095 # 00096 # @brief コンポーネントの生成(サブクラス実装用) 00097 # 00098 # RTComponent のインスタンスを生成するための関数。<BR> 00099 # 実際の初期化処理は、各具象クラス内にて記述する。 00100 # 00101 # @param self 00102 # @param mgr マネージャオブジェクト 00103 # 00104 # @return 生成したコンポーネント 00105 # 00106 # @else 00107 # 00108 # @brief Create component 00109 # 00110 # @param mgr pointer to RtcManager 00111 # 00112 # @endif 00113 def create(self, mgr): 00114 pass 00115 00116 00117 ## 00118 # @if jp 00119 # 00120 # @brief コンポーネントの破棄(サブクラス実装用) 00121 # 00122 # RTComponent のインスタンスを破棄するための関数。<BR> 00123 # 実際の初期化処理は、各具象クラス内にて記述する。 00124 # 00125 # @param self 00126 # @param comp 破棄対象 RTコンポーネント 00127 # 00128 # @else 00129 # 00130 # @brief Destroy component 00131 # 00132 # @param comp pointer to RtcBase 00133 # 00134 # @endif 00135 def destroy(self, comp): 00136 pass 00137 00138 00139 ## 00140 # @if jp 00141 # 00142 # @brief コンポーネントプロファイルの取得 00143 # 00144 # コンポーネントのプロファイルを取得する 00145 # 00146 # @param self 00147 # 00148 # @return コンポーネントのプロファイル 00149 # 00150 # @else 00151 # 00152 # @brief Get component profile 00153 # 00154 # Get component profile. 00155 # 00156 # @endif 00157 def profile(self): 00158 return self._Profile 00159 00160 00161 ## 00162 # @if jp 00163 # 00164 # @brief 現在のインスタンス数の取得 00165 # 00166 # コンポーネントの現在のインスタンス数を取得する。 00167 # 00168 # @param self 00169 # 00170 # @return コンポーネントのインスタンス数 00171 # 00172 # @else 00173 # 00174 # @brief Get number of component instances 00175 # 00176 # Get number of current component instances. 00177 # 00178 # @endif 00179 def number(self): 00180 return self._Number 00181 00182 00183 00184 00185 ## 00186 # @if jp 00187 # @class FactoryPython 00188 # @brief FactoryPython クラス 00189 # 00190 # Python用コンポーネントファクトリクラス。 00191 # 00192 # @since 0.4.1 00193 # 00194 # 00195 # @else 00196 # 00197 # @class FactoryPython 00198 # @brief FactoryPython class 00199 # 00200 # RTComponent factory class for Python. 00201 # 00202 # @endif 00203 class FactoryPython(FactoryBase): 00204 """ 00205 """ 00206 00207 ## 00208 # @if jp 00209 # 00210 # @brief コンストラクタ 00211 # 00212 # コンストラクタ。 00213 # 生成対象コンポーネントのプロファイル、コンポーネント生成用関数、 00214 # コンポーネント破棄用関数、コンポーネント生成時の命名ポリシーを引数に取り、 00215 # Python で実装されたコンポーネントのファクトリクラスを生成する。 00216 # 00217 # @param self 00218 # @param profile コンポーネントのプロファイル 00219 # @param new_func コンポーネント生成用関数 00220 # @param delete_func コンポーネント破棄用関数 00221 # @param policy コンポーネント生成時の命名ポリシー(デフォルト値:None) 00222 # 00223 # @else 00224 # 00225 # @brief Constructor. 00226 # 00227 # Constructor. 00228 # Create component factory class with three arguments: 00229 # component profile, function pointer to object create function and 00230 # object delete function. 00231 # 00232 # @param profile Component profile 00233 # @param new_func Pointer to component create function 00234 # @param delete_func Pointer to component delete function 00235 # @param policy Pointer to component delete function 00236 # 00237 # @endif 00238 def __init__(self, profile, new_func, delete_func, policy=None): 00239 FactoryBase.__init__(self, profile) 00240 00241 if policy is None: 00242 self._policy = OpenRTM_aist.DefaultNumberingPolicy() 00243 else: 00244 self._policy = policy 00245 00246 self._New = new_func 00247 00248 self._Delete = delete_func 00249 00250 00251 ## 00252 # @if jp 00253 # 00254 # @brief コンポーネントの生成 00255 # 00256 # RTComponent のインスタンスを生成する。 00257 # 00258 # @param self 00259 # @param mgr マネージャオブジェクト 00260 # 00261 # @return 生成したコンポーネント 00262 # 00263 # @else 00264 # 00265 # @brief Create component 00266 # 00267 # Create component implemented in Python. 00268 # 00269 # @param mgr 00270 # 00271 # @endif 00272 def create(self, mgr): 00273 try: 00274 rtobj = self._New(mgr) 00275 if rtobj == 0: 00276 return None 00277 00278 self._Number += 1 00279 00280 rtobj.setProperties(self.profile()) 00281 00282 instance_name = rtobj.getTypeName() 00283 instance_name += self._policy.onCreate(rtobj) 00284 rtobj.setInstanceName(instance_name) 00285 00286 return rtobj 00287 except: 00288 print OpenRTM_aist.Logger.print_exception() 00289 return None 00290 00291 00292 ## 00293 # @if jp 00294 # 00295 # @brief コンポーネントの破棄 00296 # 00297 # RTComponent のインスタンスを破棄する。 00298 # 00299 # @param self 00300 # @param comp 破棄対象 RTComponent 00301 # 00302 # @else 00303 # 00304 # @brief Destroy component 00305 # 00306 # Destroy component instance 00307 # 00308 # @param comp 00309 # 00310 # @endif 00311 def destroy(self, comp): 00312 self._Number -= 1 00313 self._policy.onDelete(comp) 00314 self._Delete(comp)