IronPython: создание и добавление массива точек в GraphicsPath - PullRequest
0 голосов
/ 31 мая 2010

Приветствие;

У меня возникли некоторые проблемы с правильным созданием массива экземпляров System.Drawing.Point, а затем добавлением массива точек в экземпляр GDI + GraphicsPath с использованием IronPython в приложении WinForms. Следующий код компилируется или собирается правильно под SharpDevelop 3.2 с 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()

Исходя из кода выше, я ожидал увидеть две перпендикулярные синие линии с маленьким эллипсом в конце каждой линии. Используя приведенный выше код сценария, выводится ошибка времени выполнения GDI + красный X. Что я пропускаю или делаю неправильно? Кроме того, существует ли более простой или более краткий способ создания массива значений System.Drawing.Point?

Заранее спасибо за ваше время и помощь ...

1 Ответ

1 голос
/ 21 июня 2010

Честно говоря, я должен сказать, что я не «ответил на свой вопрос» и не решил эту проблему самостоятельно, но смог получить помощь извне как от Мэтта Уорда, так и от Майкла Фурда. Я искренне благодарю Мэтта и Майкла за их время, помощь и терпение, и я очень благодарен им за то, что они написали свои исправления.

Основной проблемой, которая помешала запуску сценария MainForm.py, было упущение с моей стороны импорта класса Color из пространства имен System.Drawing и перечислений SmoothingMode и LineJoin из пространства имен System.Drawing.Drawing2D. Хотя мой сценарий напрямую не создает экземпляры каких-либо дополнительных перечислений или классов, они все равно должны загружаться и ссылаться на их соответствующие сборки .NET DLR, чтобы сделать их доступными и применимыми в моем сценарии. (Примечание: еще раз, спасибо Мэтту за то, что он указал мне на это; если в объяснении есть какие-либо ошибки, они мои, а не Мэтта.)

Исходное создание экземпляров Array экземпляров GDI + Point было правильным, но более сжатый подход показан в исправленном сценарии ниже. (Примечание: еще раз, моя благодарность Майклу за то, что он указал на альтернативу создания экземпляра Array.)

Исправленный и работающий скрипт 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()
...