2010-05-31 22 views
0

Salutations;IronPython: Création et ajout d'un tableau de points à un GraphicsPath

J'ai un peu de mal à instancier correctement une instance de System.Drawing.Point, puis à ajouter le tableau de points à une instance GDI + GraphicsPath en utilisant IronPython dans une application WinForms. Le code suivant compile ou construit correctement sous SharpDevelop 3.2 avec IronPython 2.6:

import System.Drawing 
import System.Drawing.Drawing2D 
import System.Windows.Forms 

from System import Array 
from System.Drawing import Pen, Point 
from System.Drawing.Drawing2D import GraphicsPath, CustomLineCap 
from System.Windows.Forms import * 

class MainForm(Form): 
    def __init__(self): 
     self.InitializeComponent() 

    def InitializeComponent(self): 
     self.SuspendLayout() 
     # 
     # MainForm 
     # 
     self.ClientSize = System.Drawing.Size(284, 264) 
     self.Name = "MainForm" 
     self.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen 
     self.Text = "GDI Lines" 
     self.Paint += self.MainFormPaint 
     self.ResumeLayout(False) 

    def MainFormPaint(self, sender, e): 
     graphicContext = e.Graphics 
     bluePen = Pen(Color.Blue, 1) 

     points = Array.CreateInstance(Point, 9) 
     points[0] = Point(10, 10) 
     points[1] = Point(15, 10) 
     points[2] = Point(20, 15) 
     points[3] = Point(20, 20) 
     points[4] = Point(15, 25) 
     points[5] = Point(10, 25) 
     points[6] = Point(5, 20) 
     points[7] = Point(5, 15) 
     points[8] = Point(10, 10) 

     graphicsPath = GraphicsPath() 
     graphicsPath.AddLines(points) 
     graphicContext.SmoothingMode = SmoothingMode.AntiAlias 

     lineCap = CustomLineCap(nil, graphicsPath) 
     lineCap.BaseInset = 0 
     lineCap.WidthScale = 1 
     lineCap.StrokeJoin = LineJoin.Miter 

     bluePen.CustomStartCap = lineCap 
     bluePen.CustomEndCap = lineCap 

     graphicContext.DrawLine(bluePen, 50, 150, 200, 150) 
     graphicContext.DrawLine(bluePen, 150, 50, 150, 200) 

     lineCap.Dispose() 
     graphicsPath.Dispose() 
     bluePen.Dispose() 

Basé sur le code ci-dessus, je me attendais à voir deux perpendicualr lignes bleues tirés, avec une petite ellipse à la fin de chaque ligne. En utilisant le code de sciption actuel ci-dessus, l'erreur d'exécution GDI + rouge X est dessinée. Qu'est-ce que je manque ou fais mal? En outre, existe-t-il une manière plus simple ou plus concise d'instancier une valeur Array of System.Drawing.Point?

Nous vous remercions d'avance pour votre temps et votre aide ...

Répondre

1

En toute justice, je dois dire que je ne l'ai pas « répondre à ma propre question » ou résoudre ce problème moi-même, mais a pu recevoir l'aide extérieure de Matt Ward et Michael Foord. Mes sincères remerciements à Matt et à Michael pour leur temps, leur aide et leur patience, et j'apprécie vraiment qu'ils écrivent avec leurs corrections. Le problème principal qui empêchait le script MainForm.py de s'exécuter était l'omission de ma part d'importer la classe Color de l'espace de noms System.Drawing, et les SmoothingMode et LineJoin Enumerations de l'espace de noms System.Drawing.Drawing2D. Bien que mon script n'instancie pas directement les énumérations ou classes supplémentaires, elles doivent toujours être chargées et référencées à partir de leurs assemblys respectifs par le .NET DLR pour les rendre accessibles et utilisables dans mon script. (Note: Encore une fois, merci à Matt de m'avoir fait remarquer: s'il y a des erreurs dans l'explication, elles sont à moi et non à Matt.)

L'instanciation Array d'origine des instances du point GDI + était correcte, mais approche plus succincte est montré dans le script corrigé ci-dessous. (Note:. Encore une fois, mes remerciements à Michael pour souligner l'alternative Array instanciation)

Le script MainForm.py travail corrigé et est la suivante:

import System.Drawing 
import System.Drawing.Drawing2D 
import System.Windows.Forms 

from System import Array 
from System.Drawing import Pen, Point, Color 
from System.Drawing.Drawing2D import GraphicsPath, CustomLineCap, SmoothingMode, LineJoin 
from System.Windows.Forms import * 

class MainForm(Form): 
    def __init__(self): 
     self.InitializeComponent() 

    def InitializeComponent(self): 
     self.SuspendLayout() 
     # 
     # MainForm 
     # 
     self.ClientSize = System.Drawing.Size(284, 264) 
     self.Name = "MainForm" 
     self.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen 
     self.Text = "GDI+ CustomLineCaps" 
     self.Paint += self.MainFormPaint 
     self.ResumeLayout(False) 

    def MainFormPaint(self, sender, e): 
     graphics = e.Graphics 
     bluePen = Pen(Color.Blue, 1) 

     points = Array[Point] \ 
     ((Point(10, 10), Point(15, 10), Point(20, 15), \ 
      Point(20, 20), Point(15, 25), Point(10, 25), \ 
      Point(5, 20), Point(5, 15), Point(10, 10))) 

     graphicsPath = GraphicsPath() 
     graphicsPath.AddLines(points) 
     graphics.SmoothingMode = SmoothingMode.AntiAlias 

     lineCap = CustomLineCap(None, graphicsPath) 
     lineCap.BaseInset = 0 
     lineCap.WidthScale = 1 
     lineCap.StrokeJoin = LineJoin.Miter 

     bluePen.CustomStartCap = lineCap 
     bluePen.CustomEndCap = lineCap 

     graphics.DrawLine(bluePen, 50, 150, 200, 150) 
     graphics.DrawLine(bluePen, 150, 50, 150, 200) 

     lineCap.Dispose() 
     graphicsPath.Dispose() 
     bluePen.Dispose()