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()