2010-05-31 65 views
0

问候;IronPython:创建图形路径并将点阵添加到图形路径

我正在实例化一个System.Drawing.Point实例的数组,然后在WinForms应用程序中使用IronPython将点数组添加到GDI + GraphicsPath实例中,有点麻烦。下面的代码编译或IronPython的2.6的SharpDevelop 3.2下正确地构建:

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

基于上述代码中,我期待看到两个perpendicualr蓝色线画出,在每个线的端部的小椭圆。使用上面的当前scipting代码,绘制GDI +运行时错误红色X.我错过了什么或做错了什么?另外,是否有更简单或更简洁的实例化System.Drawing.Point值数组的方法?

预先感谢您的时间和帮助......

回答

1

平心而论,我必须说,我没有“回答我的问题”,或解决我自己的这个问题,但能接受来自Matt Ward和Michael Foord的外部帮助。我非常感谢马特和迈克尔在他们的时间,帮助和耐心,我真的很感谢他们写下他们的更正。

保持MainForm.py脚本运行的主要问题是在我从System.Drawing命名空间导入Color类以及从System.Drawing.Drawing2D命名空间导入SmoothingMode和LineJoin枚举时遗漏了部分内容。虽然我的脚本没有直接实例化任何其他枚举或类,但它们仍然必须由.NET DLR从它们各自的程序集加载和引用,以使它们在我的脚本中可访问和可用。 (注意:再次感谢马特指出这一点;如果解释中有任何错误,他们是我的,而不是马特的。)

GDI + Point实例的原始数组实例化是正确的,但是下面更正的脚本中显示了更简洁的方法。 (注:同样,我感谢迈克尔指出阵列实例替代)

校正和工作MainForm.py脚本如下:

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