2010-05-31 2 views
0

인사말;IronPython : GraphicsPath에 점의 배열 생성 및 추가

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에 의해 각 어셈블리에서로드되고 참조되어야합니다. (참고 : Matt에게 감사드립니다. 설명에 오류가있는 경우 매트가 아닌 내 것이됩니다.)

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