雑記帳

ブログを使わずにArrangeNoteで作っている公開雑記帳

Aug 28, 2007 - .NET Framework 3.5のWPF

Tech・Edで川西さんのセッションに .NET Framework 3.5でのWPFの拡張の説明がありました。 この中のUIElement3Dって、もしかして3Dでボタンなどの部品を表示出来るのか!?と思ったのですが、 WPF3D Team Blogによるとそうではありませんでした。

3Dでボタンなどの部品を表示するときは、Viewport2DVisual3Dというクラスを使います。 使い方はModelVisual3Dと同様で、Visualプロパティにボタンやパネルなどを指定します。


from wpf import *
from System.Windows.Media.Media3D import *
from System.Windows.Media.Imaging import *
import math

rotX = lambda x: AxisAngleRotation3D( Vector3D( 1, 0, 0 ), x )
rotY = lambda x: AxisAngleRotation3D( Vector3D( 0, 1, 0 ), x )
rotZ = lambda x: AxisAngleRotation3D( Vector3D( 0, 0, 1 ), x )

class Control3D(Window):
    def __init__( self, cx, rot, bg, fov=40, transparent=True, **keywords ):
        self.canvas = Canvas( Width=cx, Height=cx, Background=bg )
        self.rotation = rot
        
        # ウィンドウの初期処理
        Window.__init__( self, **keywords )
        self.Width = self.Height = cx * 2
        if transparent:
            self.WindowStyle = WindowStyle.None
            self.Background = Brushes.Transparent
            self.AllowsTransparency = True
        
        # 3Dビューの初期化
        view = Viewport3D()
        view.ClipToBounds = False
        view.Camera = self.__getCamera( fov )
        view.Children.Add( ModelVisual3D( Content=AmbientLight( Colors.White ) ) )
        view.Children.Add( self.__getModel() )
        self.Content = view
    
    # カメラ設定の取得
    def __getCamera( self, fov ):
        cam = PerspectiveCamera( LookDirection=Vector3D(0,0,-1), UpDirection=Vector3D(0,1,0) )
        cam.Position = Point3D( 0, 0, 1 + 1/math.tan(math.radians(fov)*.5) )
        cam.FieldOfView = fov
        cam.NearPlaneDistance = 0.5
        cam.FarPlaneDistance = 100
        return cam
    
    # 物体の取得
    def __getModel( self ):
        material = DiffuseMaterial( Color=Color.FromArgb( 255,255,255,255 ) )
        geometry = MeshGeometry3D()
        for (x,y,z) in ((-1,1,0), (-1,-1,0), (1,-1,0), (1,1,0)):
            geometry.Positions.Add( Point3D( x, y, z ) )
        
        for i in (0, 1, 2, 0, 2, 3):
            geometry.TriangleIndices.Add( i )
        
        for (x,y) in ((0,0), (0,1), (1,1), (1,0)):
            geometry.TextureCoordinates.Add( Point( x, y ) )
        
        model = Viewport2DVisual3D( Material=material, Geometry=geometry )
        model.Transform = RotateTransform3D( self.rotation )
        model.SetIsVisualHostMaterial( material, True )
        model.Visual = self.canvas
        
        return model
    
    # ウィンドウのドラッグ処理
    def OnMouseLeftButtonDown( self, *args ):
        self.DragMove()
    
    # Canvasに要素を追加
    def add( self, el, x, y ):
        Canvas.SetLeft( el, x )
        Canvas.SetTop( el, y )
        self.canvas.Children.Add( el )

上記ソースを「control3d.py」という名前で保存してください。 ちなみに、↑でimportしているwpf.pyは私が独自に作ったモジュールです。

コマンドプロンプトでipy.exeを実行し、対話操作で次のようにコマンドを入力すると、スクリーンショットのような画面ができます。win.rotation.Angleプロパティの値を変えると、パネルの向きが変わります。

>>> from control3d import *
>>> win = Control3D( 250, rotY(60), Brushes.Green )
>>> win.Show()
>>> win.add( Label( Content='テキストを入力してください(_T):' ), 10, 0 )
>>> win.add( TextBox( Width=230, Height=200, AcceptsReturn=True ), 10, 20 )
>>> win.add( Button( Content='OK' ), 220, 220 )
>>> win.rotation.Angle=45

Perforatorで確認したところ、.NET 3.5であるにも関わらず、Windows XPの場合レイヤーウィンドウはソフトウェアレンダリングしていました。Vistaではちゃんとハードウェアでレンダリングされます。

Aug 25, 2007 - Tech・Ed 2007 Yokohama 終了

暑かったせいか、荷物が重たかったせいか、30代後半になるとパシフィコ横浜を右往左往するだけの体力が続かないのか分かりませんが、今年は非常に疲れました。

昨年のTech・Edは全く勉強していなかったVistaや.NET Framework3.0の話を聞くことができたので苦労しても参加することに意義があったのですが、 今年はLINQの情報も含めてMS社員のブログや一般の方のブログを追いかけていれば入手できそうな情報ばかり。(LINQスペシャルセッションのEDMとかはなるほどと思いましたが。)

Visual Studio 2008やWindows Server 2008、Expression Blendを使った説明も製品紹介に終始していたような気がします。まあそれはいつものことですね。ツールの重要性は分かるんだけど。

10年前、ActiveXで戦略的に開発者に技術アピールしていた頃はもっとSDKやAPI寄りの話が多かったと思います。COM/DCOMとか。Tech・EdというよりはPDCだったかもしれません。 それらの影響を受けてPlatform SDKを常時使う開発スタイルが身に付いた(それ故私が公開しているソフトはどれもMFCや.NETなどのランタイムが不要)のですが、 今のTech・Edではプラットフォームに深く突っ込んだ話はしなくなってしまったんでしょうか。

例えばVistaのDWMのAPI解説みたいなセッションがあれば、 話を聞いているうちにそれを使ってソフトを作ってみたくなったりするんですけど...

今はWebによってMSDNや一般開発者などがそういった情報をたくさん発信しているから、 Tech・Edみたいなイベントではもう扱わないのかもしれませんね。

Tech・Edはもう参加しなくていいかな。PDCみたいなイベントを開催してほしいなあ。

ああでも金沢(または羽咋)から出張する手間をかけるまでもなくMSDNマガジンでも読んでいれば事足りそうだ。

Aug 07, 2007 - VGN-TZ90S

結局買ってしまったVAIO type T (TZ) orz

ワンセグもSSDも光学ドライブも無しで、2.5インチHDD 160GBのみを搭載し、 だけどVisual Studio 2005やWindows SDK、.NET Framework 3.0など最新のソフト開発環境を揃えました。

ちなみに買って初めて気づいたのですが、ACアダプタを本体に挿す際、反対側の電源スイッチをうっかり押さえてしまうという問題があります。ある意味致命的。orz

記事の一覧

Copyright © 2007 Koichi Yamamoto