diff --git a/waypoint_manager/scripts/devel_GUI.py b/waypoint_manager/scripts/devel_GUI.py index a1224fd..8bf650c 100755 --- a/waypoint_manager/scripts/devel_GUI.py +++ b/waypoint_manager/scripts/devel_GUI.py @@ -33,9 +33,15 @@ self.bind_all("", self.menu_saveas_clicked) self.master.config(menu=self.menu_bar) # 大元に作成したメニューバーを設定 + ## 右クリックしたときに表示するポップアップメニューを作成 + self.popup_menu = tk.Menu(self, tearoff=tk.OFF) + self.popup_menu.add_command(label="add waypoint", command=self.add_waypoint) + self.right_click_coord = None # 右クリックしたときの座標を保持する変数 + ## map.pgm, map.yaml, waypoints.yaml の読み込み 3つの変数は再代入禁止 self.__map_img_pil, self.__map_yaml = self.get_map_info() self.__waypoints = self.get_waypoints() + self.current_waypoints = self.__waypoints # 編集中のウェイポイント情報を保持する ## canvasを配置 self.canvas = tk.Canvas(self.master, background="#a0a0a0") # 画像を描画するcanvas @@ -45,7 +51,7 @@ ## 画像をcanvasのサイズにフィッティングして描画 self.canv_w = self.canvas.winfo_width() # canvasの幅を取得 self.canv_h = self.canvas.winfo_height() # canvasの高さを取得 - self.mat_affine = np.eye(3) + self.mat_affine = np.eye(3) # 同次変換行列の初期化 scale = 1 offset_x = 0 offset_y = 0 @@ -58,28 +64,27 @@ scale = self.canv_w / self.__map_img_pil.width offset_y = (self.canv_h - self.__map_img_pil.height*scale) / 2 - self.mat_affine = self.scale_mat(scale, self.mat_affine) - self.mat_affine = self.translate_mat(offset_x, offset_y, self.mat_affine) - self.draw_img_tk = self.draw_image(self.mat_affine) + self.scale_mat(scale) # 同次変換行列を更新 + self.translate_mat(offset_x, offset_y) # 同次変換行列を更新 + self.draw_img_tk = ImageTk.PhotoImage(image=self.__map_img_pil) # 描画する画像を保持する変数を初期化 + self.draw_image() # 画像を描画 - ## 右クリックしたときに表示するポップアップメニューを作成 - self.popup_menu = tk.Menu(self, tearoff=tk.OFF) - self.popup_menu.add_command(label="add waypoint", command=self.add_waypoint) - self.right_click_coord = None # 右クリックしたときの座標を保持する変数 - - ## マウスイベントを設定 - self.master.bind("", self.mouse_wheel) - self.master.bind("", self.left_click_move) - self.master.bind("", self.left_click) - self.master.bind("", self.right_click) - - ## ウィンドウに関するコールバック - self.master.bind("", self.window_resize_callback) - + ## map.yamlから原点と解像度を取得し、地図上に原点を示す円を描画 origin = self.__map_yaml['origin'] # originは地図上の原点から画像の左下までの距離[x,y](m) resol = self.__map_yaml['resolution'] self.img_origin = [-origin[0]/resol, self.__map_img_pil.height+origin[1]/resol, 1] self.plot_origin() + + ## waypoints.yamlからウェイポイント情報を取得し、画像にポイントを描画 + self.plot_waypoints() + + ## マウスイベントに対するコールバックを設定 + self.master.bind("", self.mouse_wheel) + self.master.bind("", self.left_click_move) + self.master.bind("", self.left_click) + self.master.bind("", self.right_click) + ## ウィンドウに関するコールバック + self.master.bind("", self.window_resize_callback) return @@ -124,7 +129,7 @@ # 円を描画できる位置かどうか判別 if (x0 < 0) or (y0 < 0) or (x1 > self.canv_w) or (y1 > self.canv_h): return - elif self.canvas.find_withtag("origin"): # 既に円を描画済み + elif self.canvas.find_withtag("origin"): # 既に円を描画済みの場合、位置を変える self.canvas.itemconfig("origin", x0=x0, y0=y0, x1=x1, y1=y1) else: # 初めて円を描画する self.canvas.create_oval(x0, y0, x1, y1, tags="origin", fill='cyan', outline='blue') @@ -133,6 +138,14 @@ """ + +++++ 地図上にウェイポイントを示す円を描画する +++++ + """ + def plot_waypoints(self): + return + + + + """ +++++ マウスを左クリックしながらドラッグしたときのコールバック関数 +++++ """ def left_click_move(self, event): @@ -224,42 +237,44 @@ """ +++++ 引数の同次変換行列(mat_affine)にx,yの平行移動を加えた同次変換行列を返す +++++ """ - def translate_mat(self, x, y, mat_affine): + def translate_mat(self, x, y): mat = np.eye(3) mat[0, 2] = float(x) mat[1, 2] = float(y) - return np.dot(mat, mat_affine) + self.mat_affine = np.dot(mat, self.mat_affine) + return """ +++++ 引数のmat_affineにscale倍のリサイズを加えた同次変換行列を返す +++++ """ - def scale_mat(self, scale, mat_affine): + def scale_mat(self, scale): mat = np.eye(3) mat[0, 0] = scale mat[1, 1] = scale - return np.dot(mat, mat_affine) + self.mat_affine = np.dot(mat, self.mat_affine) + return """ +++++ 元画像をaffne変換して描画、その画像を返す +++++ """ - def draw_image(self, mat_affine): - mat_inv = np.linalg.inv(mat_affine) + def draw_image(self): + mat_inv = np.linalg.inv(self.mat_affine) img = self.__map_img_pil.transform( (self.canv_w, self.canv_w), Image.Transform.AFFINE, tuple(mat_inv.flatten()), Image.Resampling.NEAREST, fillcolor = 160 ) - tk_img = ImageTk.PhotoImage(image=img) + self.draw_img_tk = ImageTk.PhotoImage(image=img) # 描画する画像を変数に保持 if not self.canvas.find_withtag("map_image"): # 初めて画像を描画するとき - self.canvas.create_image(0, 0, anchor='nw', image=tk_img, tags="map_image") # 画像の描画 + self.canvas.create_image(0, 0, anchor='nw', image=self.draw_img_tk, tags="map_image") # 画像の描画 else: - self.canvas.itemconfig("map_image", image=tk_img) # 既に描画された画像を差し替える - return tk_img + self.canvas.itemconfig("map_image", image=self.draw_img_tk) # 既に描画された画像を差し替える + return