2010-05-31 1 views
0

Приветствия;IronPython: создание и добавление массива точек в GraphicsPath

У меня возникли проблемы с созданием экземпляра 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() 

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

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

ответ

1

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

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

Исходный экземпляр экземпляров 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() 
Смежные вопросы