How to crop the rectangles in the image when adding them, I am using FloatCanvas.
import wx
import wx.aui
from wx.lib.floatcanvas import NavCanvas,FloatCanvas,GUIMode
from src.utils.shape import Shape
from src.utils.NavCanvasCustom import NavCanvasCustom
from wx.lib.floatcanvas.Utilities import GUI
from PIL import Image
class App(wx.Frame):
def __init__(self):
super().__init__(None, title="Sistema VSIA", size=(1300, 800))
self.mgr = wx.aui.AuiManager(self)
self.Maximize()
self.SetMinSize((1300, 800))
# ------------------------------------------------
self.toolbar = self.CreateToolBar()
self.toolbar.AddTool(wx.ID_NEW, "Novo", wx.ArtProvider.GetBitmap(wx.ART_NEW, wx.ART_TOOLBAR, (25, 25)))
self.toolbar.AddTool(wx.ID_SAVE, "Salvar", wx.ArtProvider.GetBitmap(wx.ART_FILE_SAVE, wx.ART_TOOLBAR, (25, 25)))
self.toolbar.AddSeparator()
self.toolbar.AddTool(wx.ID_EXIT, "Sair", wx.ArtProvider.GetBitmap(wx.ART_ERROR, wx.ART_TOOLBAR, (25, 25)))
self.toolbar.Realize()
#----------------------------
self.canvas = NavCanvasCustom(self,
height=1500,
width=1500,
color="white")
self.Rects: list[FloatCanvas.Rectangle] = []
self.RBBoxMode = GUI.RubberBandBox(self.NewRect)
self.canvas.Canvas.SetMode(self.RBBoxMode)
tb = self.canvas.ToolBar
tb.AddSeparator()
ClearButton = wx.Button(tb, wx.ID_ANY, "Clear")
tb.AddControl(ClearButton)
ClearButton.Bind(wx.EVT_BUTTON, self.Clear)
DrawButton = wx.Button(tb, wx.ID_ANY, "StopDrawing")
tb.AddControl(DrawButton)
DrawButton.Bind(wx.EVT_BUTTON, self.SetDraw)
self.DrawButton = DrawButton
printE = wx.Button(tb, wx.ID_ANY, "Logs")
tb.AddControl(printE)
printE.Bind(wx.EVT_BUTTON, self.Logs)
tb.Realize()
self.canvas.Canvas.ZoomToBB()
self.mgr.AddPane(self.canvas, wx.aui.AuiPaneInfo().CenterPane().Caption("Painel de Imagem"))
#------------------------------
left_panel = wx.Panel(self)
left_sizer = wx.BoxSizer(wx.VERTICAL)
self.tree = wx.TreeCtrl(left_panel, style=wx.TR_DEFAULT_STYLE)
self.il = wx.ImageList(16, 16)
self.folder_icon = self.il.Add(wx.ArtProvider.GetBitmap(wx.ART_WX_LOGO, wx.ART_OTHER, (16, 16)))
self.file_icon = self.il.Add(wx.ArtProvider.GetBitmap(wx.ART_ADD_BOOKMARK, wx.ART_OTHER, (16, 16)))
self.file_icon_t = self.il.Add(wx.ArtProvider.GetBitmap(wx.ART_EXECUTABLE_FILE, wx.ART_OTHER, (16, 16)))
self.tree.AssignImageList(self.il)
root = self.tree.AddRoot("Programa", self.folder_icon)
self.tree.SetItemData(root, 0) # ID = 0
item1 = self.tree.AppendItem(root, "Nova IA", self.file_icon_t)
self.tree.SetItemData(item1, 1) # ID = 1
item2 = self.tree.AppendItem(root, "Configuração de modelo", self.file_icon)
self.tree.SetItemData(item2, 2) # ID = 2
child = self.tree.AppendItem(root, "Geometrias", self.folder_icon)
self.tree.SetItemData(child, 3) # ID = 3
item3 = self.tree.AppendItem(child, "Retangulo", self.file_icon)
self.tree.SetItemData(item3, 4) # ID = 4
item4 = self.tree.AppendItem(child, "Circulo", self.file_icon)
self.tree.SetItemData(item4, 5) # ID = 5
child2 = self.tree.AppendItem(root, "Cores", self.folder_icon)
self.tree.SetItemData(child2, 6) # ID = 6
item5 = self.tree.AppendItem(child2, "Criar programa", self.file_icon)
self.tree.SetItemData(item5, 7) # ID = 7
item6 = self.tree.AppendItem(child2, "Ajuste de posição", self.file_icon)
self.tree.SetItemData(item6, 8) # ID = 8
self.tree.Expand(root)
self.tree.Expand(child)
self.tree.Expand(child2)
left_sizer.Add(self.tree, 1, wx.EXPAND | wx.ALL, 5)
left_panel.SetSizer(left_sizer)
self.mgr.AddPane(left_panel, wx.aui.AuiPaneInfo().Left().Caption("Ferramentas").BestSize((300, -1)))
# ----------------------------------------
task_panel = wx.Panel(self)
task_sizer = wx.BoxSizer(wx.VERTICAL)
task_sizer.Add(wx.Button(task_panel, label="Programa"), 0, wx.ALL, 5)
task_sizer.Add(wx.Button(task_panel, label="Programa"), 0, wx.ALL, 5)
task_panel.SetSizer(task_sizer)
self.mgr.AddPane(task_panel, wx.aui.AuiPaneInfo().Left().Caption("Painel de Ajustes").BestSize((300, -1)))
#----------------------------------------
notebook = wx.aui.AuiNotebook(self)
notebook.AddPage(wx.TextCtrl(notebook), "Logs")
self.mgr.AddPane(notebook, wx.aui.AuiPaneInfo().Bottom().Caption("Logs de sistema").PaneBorder(True).BestSize((-1, 100)))
self.mgr.Update()
self.Bind(wx.EVT_TOOL, self.OnToolClick)
self.Bind(wx.EVT_CLOSE, self.OnClose)
self.tree.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnTreeItemSelected)
self.shapes = []
self.Show()
def Logs(self, event:wx.CommandEvent):
for i, rect in enumerate(self.Rects):
bounding_box = rect.XY
testaaa = rect.WH
print(bounding_box)
print(testaaa)
def SetDraw(self, event=None):
label = self.DrawButton.GetLabel()
if label == "Draw":
self.DrawButton.SetLabel("StopDrawing")
self.canvas.Canvas.SetMode(self.RBBoxMode)
elif label == "StopDrawing":
self.DrawButton.SetLabel("Draw")
self.canvas.Canvas.SetMode(GUIMode.GUIMouse())
else: # huh?
pass
def Clear(self, event=None):
self.Rects = []
self.canvas.Canvas.ClearAll()
self.canvas.Canvas.Draw()
def NewRect(self, rect):
rect = FloatCanvas.Rectangle(*rect, LineWidth=2,LineColor="Green",InForeground=True)
self.canvas.Canvas.AddObject(rect)
self.Rects.append(rect)
self.canvas.Canvas.Draw(Force=True)
def OnTreeItemSelected(self, event):
item = event.GetItem()
if item:
item_text = self.tree.GetItemText(item)
item_id = self.tree.GetItemData(item)
def OnToolClick(self, event):
tool_id = event.GetId()
if tool_id == wx.ID_NEW:
self.OnNewImage()
elif tool_id == wx.ID_EXIT:
self.Close()
def OnNewImage(self):
with wx.FileDialog(self, "Escolha uma imagem", wildcard="Image files (*.png;*.jpg;*.jpeg;*.bmp)|*.png;*.jpg;*.jpeg;*.bmp",
style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) as fileDialog:
if fileDialog.ShowModal() == wx.ID_OK:
filepath = fileDialog.GetPath()
print(filepath)
self.LoadImage(filepath)
def LoadImage(self, filepath):
self.image = wx.Image(filepath, wx.BITMAP_TYPE_ANY)
bitmap = self.image.ConvertToBitmap()
float_bitmap = FloatCanvas.ScaledBitmap(bitmap, (0, 0),Height=100,InForeground = True)
self.canvas.Canvas.AddObject(float_bitmap)
self.canvas.Canvas.ZoomToBB()
self.canvas.Canvas.Draw()
def OnClose(self, event):
self.mgr.UnInit()
self.Destroy()
if name == “main”:
app = wx.App(False)
App()
app.MainLoop()