myBlog

IronPython, Silverlight, WPF, XAML, HTML5, ...

IronPythonで、advanced Tile (Gestalt Transformations Pack) を実行する!

2011-07-16 14:59:00 | Animation
ひき続き、WPF/IronPythonで、Gestalt advanced Tile(Transformations Pack)サンプルを実行する。
Gestalt ⇒ samples ⇒ Transformations Pack ⇒ view 2
http://www.visitmix.com/labs/gestalt/samples/
ImageBrush の変換に少し苦労しました。
WPFとSilverlightの違いがわかった。
Silverlightは、ほぼ WPFのサブセットだ。
ぜひ、実行してみてください、ダイナッミクに画面が変わる、おもしろいプログラムです。

Advanced_tile

#
# advanced.tile.py
#   from:transform.advanced.python.html
#
import clr
clr.AddReferenceByPartialName("PresentationFramework")
clr.AddReferenceByPartialName("PresentationCore")
clr.AddReference('WindowsBase')  # for Point, Rect
from System import Convert, Math, Uri
from System.Windows import Window, Application, Rect, Point, Visibility
from System.Windows.Markup import XamlReader
from System.Windows.Controls import Canvas, UserControl
from System.Windows.Media import( ImageBrush, TranslateTransform, AlignmentX, AlignmentY, Stretch,
    CompositionTarget, Brushes, ScaleTransform, RotateTransform, TransformGroup )
from System.Windows.Media.Imaging import BitmapImage
from System.Windows.Shapes import Rectangle

class Tile(Canvas):
    def __init__(self):
        self.targetAngle = 0
        layoutRoot = Canvas()
        self.Children.Add(layoutRoot)
        #self.bkgBrushPosition = TranslateTransform()
        #self.bkgBrushPosition = Point(0, 0)
        #self.bkgBrushPosition.X = 0
        #self.bkgBrushPosition.Y = 0
        self.bkgBrush = ImageBrush(
            ImageSource = BitmapImage(Uri("http://softgarden.lovepop.jp/myBlog/image/pic3.png")))
        self.bkgBrush.AlignmentX = AlignmentX.Left
        self.bkgBrush.AlignmentY = AlignmentY.Top
        self.bkgBrush.Stretch = Stretch.None 
        #self.bkgBrush.Transform = self.bkgBrushPosition
        #self.bkgBrush.Viewport = Rect(0,0,1.0,1.0) # New
 
        self.bkg = Rectangle()
        self.bkg.Width = 30
        self.bkg.Height = 30
        self.bkg.Fill = self.bkgBrush
        self.bkg.RenderTransformOrigin = Point (0.45,0.45)
        layoutRoot.Children.Add(self.bkg)
      
        self.scale = ScaleTransform()
        self.scale.ScaleX = 1.0
        self.scale.ScaleY = 1.0
        self.rotation = RotateTransform()
        self.rotation.Angle = 0
        transformGroup = TransformGroup()
        transformGroup.Children.Add(self.scale)
        transformGroup.Children.Add(self.rotation)
        self.bkg.RenderTransform = transformGroup

        CompositionTarget.Rendering += self.compositionTarget_Rendering
                       
    def compositionTarget_Rendering(self, sender, e):
        self.rotation.Angle = self.rotation.Angle + ( self.targetAngle - self.rotation.Angle) * .13

    def SetBkgBrushXY(self, x, y):
        self.bkgBrush.Viewbox = Rect(x/640.0, y/400.0, 0, 0) # New

    def SetX(self, value):
        self.SetValue(Canvas.LeftProperty, Convert.ToDouble(value))
    def GetX(self):
        return self.GetValue(Canvas.LeftProperty)
    X = property(GetX, SetX)
          
    def SetY(self, value):
        self.SetValue(Canvas.TopProperty, Convert.ToDouble(value))
    def GetY(self):
        return self.GetValue(Canvas.TopProperty)
    Y = property(GetY, SetY)

class TileWindow(Window):
    def __init__(self):
        self.Title = "advanced.tile.py" #"Advanced Python Transforms"
        self.Width = 600
        self.Height= 350
        self.Background = Brushes.Black
        xaml_str="""  
            <UserControl 
                xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:xaml="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
                Width="600" Height="300">
                <Canvas x:Name="LayoutRoot" Background="#222222">
                    <Canvas x:Name="tiles"></Canvas>
                    <Image x:Name="cover" 
                     Source="http://softgarden.lovepop.jp/myBlog/image/cover.png" 
                     Width="600" Height="330" Stretch="Fill" Visibility="Collapsed">
                    </Image>
                </Canvas>
            </UserControl>"""
        userControl = XamlReader.Parse(xaml_str)
        self.layoutRoot = userControl.FindName("LayoutRoot")
        self.tiles = userControl.FindName("tiles")
        self.cover = userControl.FindName("cover")
        self.Content = userControl

        for x in range(0,10):
            for y in range(0, 10):
                s = Tile()
                s.X = 160 + (x * 25)
                s.Y = 25 + (y * 25)
                #s.bkgBrushPosition.X = -s.X - 45;
                #s.bkgBrushPosition.Y = -s.Y - 30;
                s.SetBkgBrushXY(s.X + 40  , s.Y + 25  ) # New
                self.tiles.Children.Add(s)
        self.mouse = Point(0, 0)
        self.layoutRoot.MouseMove += self.LayoutRoot_MouseMove
        self.cover.Visibility = Visibility.Visible
        CompositionTarget.Rendering += self.compositionTarget_Rendering
   
    def LayoutRoot_MouseMove(self,sender, e):
        self.mouse = e.GetPosition(self.layoutRoot)
          
    def compositionTarget_Rendering(self, sender, e):
        for s in self.tiles.Children:
            _y = s.Y - self.mouse.Y
            _x = s.X - self.mouse.X
            distance = Math.Sqrt((_y * _y) + (_x * _x))
            rad = Math.Atan2(_y, _x)
            angle = rad * (180 / Math.PI)
            newScale = .3 + ((distance / 100.0));
            if newScale > 1.2:
                newScale = 1.2
            s.scale.ScaleX = s.scale.ScaleY = newScale
            if distance < 100:
                s.targetAngle = angle - 180
            else: 
                s.targetAngle = 0

if __name__ == "__main__":
    win = TileWindow()
    Application().Run(win)

IronPythonの世界 (Windows Script Programming)
荒井 省三
ソフトバンク クリエイティブ
エキスパートPythonプログラミング
Tarek Ziade
アスキー・メディアワークス
Pythonスタートブック
辻 真吾
技術評論社

最新の画像もっと見る

コメントを投稿