Oppure

Loading
07/06/12 4:34
maikarki
Buongiorno a tutti. Da due giorni sto impazzendo a cercare di scrivere in Vb.Net lo snippet di una libreria Open Source per effettuare Polygon clipping.

La libreria è allegata.
Si tratta di una semplice form con un Panel1.

Il codice in c# riportato da Angus (l'autore) è il seguente:

using ClipperLib;
	
	using Polygon = List<IntPoint>;
	using Polygons = List<List<IntPoint>>;
	...
	Polygons subj = new Polygons(2);
	subj.Add (new Polygon(4));
	subj[0].Add(new IntPoint(180, 200));
	subj[0].Add(new IntPoint(260, 200));	
	subj[0].Add(new IntPoint(260, 150));
	subj[0].Add(new IntPoint(180, 150));

	subj.Add(new Polygon(3));
	subj[1].Add(new IntPoint(215, 160));
	subj[1].Add(new IntPoint(230, 190));	
	subj[1].Add(new IntPoint(200, 190));

	Polygons clip = new Polygons(1);
	clip.Add(new Polygon(4));
	clip[0].Add(new IntPoint(190, 210));
	clip[0].Add(new IntPoint(240, 210));	
	clip[0].Add(new IntPoint(240, 130));
	clip[0].Add(new IntPoint(190, 130));

	DrawPolygons(subj, Color.FromArgb(0x16, 0, 0, 0xFF), 
	  Color.FromArgb(0x60, 0, 0, 0xFF));
	DrawPolygons(clip, Color.FromArgb(0x20, 0xFF, 0xFF, 0), 
	  Color.FromArgb(0x30, 0xFF, 0, 0));

	Polygons solution = new Polygons();

	Clipper c = new Clipper();
	c.AddPolygons(subj, PolyType.ptSubject);
	c.AddPolygons(clip, PolyType.ptClip);
	c.Execute(ClipType.ctIntersection, solution, 
	  PolyFillType.pftEvenOdd, PolyFillType.pftEvenOdd);
	DrawPolygons(solution, Color.FromArgb(0x30, 0, 0xFF, 0), 
	  Color.FromArgb(0xFF, 0, 0x66, 0));


Il codice in Vb.Net che sembra non funzionare è il seguente

Imports ClipperLib

Public Class Form1
    Public Polygon As New List(Of IntPoint)
    Public Polygons As New List(Of List(Of IntPoint))

    Public subj = Convert.ToInt64(Polygons(2))
    Public clip = Convert.ToInt64(Polygons(1))
    Public solution = Convert.ToInt64(Polygons)

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        ' creazione del rettangolo
        ReDim Preserve subj(4)
        subj.Add(Polygon(4))
        subj(0) = New IntPoint(180, 200)
        subj(0) = New IntPoint(260, 200)
        subj(0) = New IntPoint(260, 150)
        subj(0) = New IntPoint(180, 150)

        ' creazione del triangolo
        ReDim Preserve subj(3)
        subj.Add(Polygon(3))
        subj(1) = New IntPoint(215, 160)
        subj(1) = New IntPoint(230, 190)
        subj(1) = New IntPoint(200, 190)

        ReDim Preserve clip(4)
        clip.Add(Polygon(4))
        clip(0) = New IntPoint(190, 210)
        clip(0) = New IntPoint(240, 210)
        clip(0) = New IntPoint(240, 130)
        clip(0) = New IntPoint(190, 130)


        Dim c As New Clipper()
        c.AddPolygons(subj, PolyType.ptSubject)
        c.AddPolygons(clip, PolyType.ptClip)

        c.Execute(ClipType.ctIntersection, solution, PolyFillType.pftEvenOdd, PolyFillType.pftEvenOdd)

    End Sub

    Private Sub Panel1_Paint(sender As System.Object, e As System.Windows.Forms.PaintEventArgs) Handles Panel1.Paint
        e.Graphics.DrawPolygon(Pens.AliceBlue, subj)
        e.Graphics.DrawPolygon(Pens.AliceBlue, clip)
        Me.Invalidate()
    End Sub
End Class


L'autore mi ha riferito che presumbilmente l'errore è da ricercare nel data type delle liste che devono essere INT64. Nel codice ho già tentato la conversione ma un errore InvalidOperationException sin dalle prime righe si manifesta nonappena avvio il debug.

Mi potreste dare una mano?

Vi ringrazio in anticipo.:)
Ultima modifica effettuata da maikarki 07/06/12 4:58
aaa
07/06/12 6:46
HeDo
a parte che consiglio sempre di usare il C# in ambiente .NET, ma puoi usare questo converter.telerik.com/ per convertire senza problemi :)
aaa
07/06/12 9:55
maikarki
Innanzi tutto ti ringrazio per aver risposto.

Ho provato a seguire il tuo consiglio (in realtà alcuni tentativi in tal senso erano già stati esperiti) ma senza risultati. In particolare la traduzione da C# a VB.net delle prime istruzioni conduce a:

Imports ClipperLib
Imports Polygon = List(Of IntPoint)
Imports Polygons = List(Of List(Of IntPoint))

Public class Form1
...
End class


Già solo tali istruzioni per VB.net conducono a 3 errori e 2 avvisi relativamente a:

Tipo 'Intpoint' non definito (x 2)
Tipo 'List' non definito (x1)

Qulache idea? :)
Ultima modifica effettuata da maikarki 07/06/12 9:56
aaa
07/06/12 14:10
mattia1481
Presumibilmente gli errori ti vengono segnalati a causa del fatto che nel file VB non hai indicato quali spazi dei nomi stai utilizzando, per risolvere tale problema o li dichiari o scrivi i tipi nella forma completa.

List diventa System.Collection.Generics.List(Of ...)

IntPoint in VB è System.Drawing.Point

Buon lavoro

Ciao
aaa
07/06/12 15:05
maikarki
Ti ringrazio per avere risposto.

Ho provato a scrivere quanto segue ma senza risultati positivi

Imports ClipperLib
Public Class Form1
    Public Polygon = New List(Of System.Drawing.Point)
    Public Polygons = New List(Of List(Of System.Drawing.Point))
    Public subj = (Polygons(2))
    Public clip = (Polygons(1))
    Public solution = (Polygons)

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

...

end sub


Dove sto sbagliando?:noway:
Mi potresti proporre una soluzione per queste dichiarazioni iniziali?

Grazie

aaa
07/06/12 21:14
Ultimo


    Imports ClipperLib
    ' Importa system.drawing.point
    Imports System.Drawing.point

    Public Class Form1
       'Quì dichiari Poligon = ? 
        Public Polygon = New List(Of System.Drawing.Point)
        ' Dovrebbe essere
        Public Polygon As New List(Of  Point) ' puoi saltare system.drawing se lo hai importato.
        'Anche quì ?
        Public Polygons = New List(Of List(Of System.Drawing.Point))
        Public subj = (Polygons(2))
        Public clip = (Polygons(1))
        Public solution = (Polygons)
     
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
     
    ...
     
    end sub


If ok Then GOTO Avanza else GOTO Inizia

08/06/12 9:43
mattia1481
Il type List devi dichiararlo System.Collections.Generic.List altrimenti devi scrivere all'inizio del file:

Imports System.Collections.Generic

Prova così

PS : se non posti il tipo di errore i nostri aiuti saranno sempre approssimativi.
aaa
08/06/12 12:14
maikarki
Ho provato secondo le tue indicazioni ma nulla da fare.

Il tipo di errore è il seguente:

VB.net Express ----------------------------------------------

System.InvalidaOperationException

{"Errore durante la creazione del form. Per informazioni dettagliate vedere Exception.InnerException. Errore: Index non compreso nell'intervallo. Richiesto valore non negativo e minore della dimensione dell'insieme.\r\nNome parametro: index"}

Sharp Develop VB.Net --------------------------------------

Impossibile caricare il designer. Controllare il codice sorgente per eventuali errori sintattici e controllare che siano disponibili tutti i references.

ICSharpCode.FormsDesigner.FormsDesignerLoadException: Could not find InitializeComponent method in any part of the open class.
in ICSharpCode.FormsDesigner.AbstractDesignerGenerator.GetSourceFiles(OpenedFile& designerCodeFile)
in ICSharpCode.FormsDesigner.FormsDesignerViewContent.LoadInternal(OpenedFile file, Stream stream)
in ICSharpCode.SharpDevelop.Gui.AbstractViewContentHandlingLoadErrors.Load(OpenedFile file, Stream stream)

'--------------------------------------------------------------

ed avviene già solo con le prime dichiarazioni come segue:

Imports ClipperLib
Imports System.Drawing.Point
Imports System.Collections.Generic

Public Class Form1

    Public Polygon = New List(Of System.Drawing.Point)
    Public Polygons = New List(Of List(Of System.Drawing.Point))
    Public subj = (Polygons(2))
    Public clip = (Polygons(1))
    Public solution = (Polygons)

End Class

Avendo Visual Basic express 2010 oppure Sharp Develop, scaricando la dll che ho postato nel forum ed aggiungendola come riferimento in un attimo ricrei il "fenomeno"

Nessuna :idea: ?
aaa