Danielm103 Posted 49 minutes ago Posted 49 minutes ago (edited) import wx import random from pyrx import Ap, Db, Ed, Gs class TestDialog(wx.Dialog): def __init__(self, parent, size, pos): wx.Dialog.__init__(self) self.Create(parent, wx.ID_ANY, "", pos, size, style=wx.BORDER_NONE) self.width = size.GetWidth() self.height = size.GetHeight() self.static_bitmap = None self.image = None self.raw_data = None self.offsets = [0] * self.width self.bg_r = 0 self.bg_g = 0 self.bg_b = 0 self.timer = wx.Timer(self) self.Bind(wx.EVT_TIMER, self.on_melt_tick, self.timer) def setImage(self, img: wx.Image): self.image = img self.raw_data = bytearray(self.image.GetData()) if len(self.raw_data) >= 3: self.bg_r = self.raw_data[0] self.bg_g = self.raw_data[1] self.bg_b = self.raw_data[2] bmp = wx.Bitmap(self.image) if not self.static_bitmap: self.static_bitmap = wx.StaticBitmap(self, wx.ID_ANY, bmp, pos=(0, 0)) else: self.static_bitmap.SetBitmap(bmp) self.static_bitmap.Bind(wx.EVT_LEFT_DOWN, self.on_click) self.timer.Start(33) def on_melt_tick(self, event): stride = self.width * 3 melted_anything = False for x in range(self.width): if self.offsets[x] < self.height: increment = random.randint(2, 8) self.offsets[x] = min(self.height, self.offsets[x] + increment) melted_anything = True offset = self.offsets[x] if offset == 0: continue x_offset = x * 3 for y in range(self.height - 1, offset - 1, -1): target_idx = (y * stride) + x_offset source_idx = ((y - offset) * stride) + x_offset self.raw_data[target_idx] = self.raw_data[source_idx] self.raw_data[target_idx + 1] = self.raw_data[source_idx + 1] self.raw_data[target_idx + 2] = self.raw_data[source_idx + 2] for y in range(offset): bg_idx = (y * stride) + x_offset self.raw_data[bg_idx] = self.bg_r self.raw_data[bg_idx + 1] = self.bg_g self.raw_data[bg_idx + 2] = self.bg_b if not melted_anything: self.timer.Stop() return self.image.SetData(bytes(self.raw_data)) self.static_bitmap.SetBitmap(wx.Bitmap(self.image)) def on_click(self, event): self.timer.Stop() self.EndModal(wx.ID_OK) @Ap.Command() def doit(): doc = Ap.curDoc() db = doc.database() wxDoc: wx.Window = doc.getWxWindow() sz = wxDoc.GetSize() pos = wxDoc.GetScreenPosition() img: wx.Image = Gs.Core.getBlockImage(db.modelSpaceId(), sz.GetWidth(), sz.GetHeight(), 1.0) dlg = TestDialog(wxDoc, size=sz, pos=pos) dlg.setImage(img) dlg.ShowModal() dlg.Destroy() Edited 49 minutes ago by Danielm103 Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.