Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Codice C# in VB.net 2010
Forum - C# / VB.NET - Codice C# in VB.net 2010

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
maikarki (Normal User)
Newbie


Messaggi: 9
Iscritto: 10/09/2011

Segnala al moderatore
Postato alle 6:34
Giovedì, 07/06/2012
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:

Codice sorgente - presumibilmente C++

  1. using ClipperLib;
  2.        
  3.         using Polygon = List<IntPoint>;
  4.         using Polygons = List<List<IntPoint>>;
  5.         ...
  6.         Polygons subj = new Polygons(2);
  7.         subj.Add (new Polygon(4));
  8.         subj[0].Add(new IntPoint(180, 200));
  9.         subj[0].Add(new IntPoint(260, 200));   
  10.         subj[0].Add(new IntPoint(260, 150));
  11.         subj[0].Add(new IntPoint(180, 150));
  12.  
  13.         subj.Add(new Polygon(3));
  14.         subj[1].Add(new IntPoint(215, 160));
  15.         subj[1].Add(new IntPoint(230, 190));   
  16.         subj[1].Add(new IntPoint(200, 190));
  17.  
  18.         Polygons clip = new Polygons(1);
  19.         clip.Add(new Polygon(4));
  20.         clip[0].Add(new IntPoint(190, 210));
  21.         clip[0].Add(new IntPoint(240, 210));   
  22.         clip[0].Add(new IntPoint(240, 130));
  23.         clip[0].Add(new IntPoint(190, 130));
  24.  
  25.         DrawPolygons(subj, Color.FromArgb(0x16, 0, 0, 0xFF),
  26.           Color.FromArgb(0x60, 0, 0, 0xFF));
  27.         DrawPolygons(clip, Color.FromArgb(0x20, 0xFF, 0xFF, 0),
  28.           Color.FromArgb(0x30, 0xFF, 0, 0));
  29.  
  30.         Polygons solution = new Polygons();
  31.  
  32.         Clipper c = new Clipper();
  33.         c.AddPolygons(subj, PolyType.ptSubject);
  34.         c.AddPolygons(clip, PolyType.ptClip);
  35.         c.Execute(ClipType.ctIntersection, solution,
  36.           PolyFillType.pftEvenOdd, PolyFillType.pftEvenOdd);
  37.         DrawPolygons(solution, Color.FromArgb(0x30, 0, 0xFF, 0),
  38.           Color.FromArgb(0xFF, 0, 0x66, 0));



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

Codice sorgente - presumibilmente VB.NET

  1. Imports ClipperLib
  2.  
  3. Public Class Form1
  4.     Public Polygon As New List(Of IntPoint)
  5.     Public Polygons As New List(Of List(Of IntPoint))
  6.  
  7.     Public subj = Convert.ToInt64(Polygons(2))
  8.     Public clip = Convert.ToInt64(Polygons(1))
  9.     Public solution = Convert.ToInt64(Polygons)
  10.  
  11.     Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
  12.         ' creazione del rettangolo
  13.         ReDim Preserve subj(4)
  14.         subj.Add(Polygon(4))
  15.         subj(0) = New IntPoint(180, 200)
  16.         subj(0) = New IntPoint(260, 200)
  17.         subj(0) = New IntPoint(260, 150)
  18.         subj(0) = New IntPoint(180, 150)
  19.  
  20.         ' creazione del triangolo
  21.         ReDim Preserve subj(3)
  22.         subj.Add(Polygon(3))
  23.         subj(1) = New IntPoint(215, 160)
  24.         subj(1) = New IntPoint(230, 190)
  25.         subj(1) = New IntPoint(200, 190)
  26.  
  27.         ReDim Preserve clip(4)
  28.         clip.Add(Polygon(4))
  29.         clip(0) = New IntPoint(190, 210)
  30.         clip(0) = New IntPoint(240, 210)
  31.         clip(0) = New IntPoint(240, 130)
  32.         clip(0) = New IntPoint(190, 130)
  33.  
  34.  
  35.         Dim c As New Clipper()
  36.         c.AddPolygons(subj, PolyType.ptSubject)
  37.         c.AddPolygons(clip, PolyType.ptClip)
  38.  
  39.         c.Execute(ClipType.ctIntersection, solution, PolyFillType.pftEvenOdd, PolyFillType.pftEvenOdd)
  40.  
  41.     End Sub
  42.  
  43.     Private Sub Panel1_Paint(sender As System.Object, e As System.Windows.Forms.PaintEventArgs) Handles Panel1.Paint
  44.         e.Graphics.DrawPolygon(Pens.AliceBlue, subj)
  45.         e.Graphics.DrawPolygon(Pens.AliceBlue, clip)
  46.         Me.Invalidate()
  47.     End Sub
  48. 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.:)


maikarki ha allegato un file: clipper_library.zip (17042 bytes)
Clicca qui per scaricare il file

Ultima modifica effettuata da maikarki il 07/06/2012 alle 6:58
PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 8:46
Giovedì, 07/06/2012
a parte che consiglio sempre di usare il C# in ambiente .NET, ma puoi usare questo http://converter.telerik.com/ per convertire senza problemi :)

PM Quote
Avatar
maikarki (Normal User)
Newbie


Messaggi: 9
Iscritto: 10/09/2011

Segnala al moderatore
Postato alle 11:55
Giovedì, 07/06/2012
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:

Codice sorgente - presumibilmente VB.NET

  1. Imports ClipperLib
  2. Imports Polygon = List(Of IntPoint)
  3. Imports Polygons = List(Of List(Of IntPoint))
  4.  
  5. Public class Form1
  6. ...
  7. 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 il 07/06/2012 alle 11:56
PM Quote
Avatar
mattia1481 (Member)
Pro


Messaggi: 84
Iscritto: 03/11/2008

Segnala al moderatore
Postato alle 16:10
Giovedì, 07/06/2012
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

PM Quote
Avatar
maikarki (Normal User)
Newbie


Messaggi: 9
Iscritto: 10/09/2011

Segnala al moderatore
Postato alle 17:05
Giovedì, 07/06/2012
Ti ringrazio per avere risposto.

Ho provato a scrivere quanto segue ma senza risultati positivi

Codice sorgente - presumibilmente VB.NET

  1. Imports ClipperLib
  2. Public Class Form1
  3.     Public Polygon = New List(Of System.Drawing.Point)
  4.     Public Polygons = New List(Of List(Of System.Drawing.Point))
  5.     Public subj = (Polygons(2))
  6.     Public clip = (Polygons(1))
  7.     Public solution = (Polygons)
  8.  
  9. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
  10.  
  11. ...
  12.  
  13. end sub



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

Grazie


PM Quote
Avatar
Ultimo (Member)
Guru


Messaggi: 877
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 23:14
Giovedì, 07/06/2012

Codice sorgente - presumibilmente VB.NET

  1. Imports ClipperLib
  2.     ' Importa system.drawing.point
  3.     Imports System.Drawing.point
  4.  
  5.     Public Class Form1
  6.        'Quì dichiari Poligon = ?
  7.         Public Polygon = New List(Of System.Drawing.Point)
  8.         ' Dovrebbe essere
  9.         Public Polygon As New List(Of  Point) ' puoi saltare system.drawing se lo hai importato.
  10.         'Anche quì ?
  11.         Public Polygons = New List(Of List(Of System.Drawing.Point))
  12.         Public subj = (Polygons(2))
  13.         Public clip = (Polygons(1))
  14.         Public solution = (Polygons)
  15.      
  16.     Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
  17.      
  18.     ...
  19.      
  20.     end sub



If ok Then GOTO Avanza else GOTO Inizia

PM Quote
Avatar
mattia1481 (Member)
Pro


Messaggi: 84
Iscritto: 03/11/2008

Segnala al moderatore
Postato alle 11:43
Venerdì, 08/06/2012
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.

PM Quote
Avatar
maikarki (Normal User)
Newbie


Messaggi: 9
Iscritto: 10/09/2011

Segnala al moderatore
Postato alle 14:14
Venerdì, 08/06/2012
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:

Codice sorgente - presumibilmente VB.NET

  1. Imports ClipperLib
  2. Imports System.Drawing.Point
  3. Imports System.Collections.Generic
  4.  
  5. Public Class Form1
  6.  
  7.     Public Polygon = New List(Of System.Drawing.Point)
  8.     Public Polygons = New List(Of List(Of System.Drawing.Point))
  9.     Public subj = (Polygons(2))
  10.     Public clip = (Polygons(1))
  11.     Public solution = (Polygons)
  12.  
  13. 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: ?

PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 16:09
Venerdì, 08/06/2012

bello vedere qualcuno che programma senza avere la minima cognizione di causa.
secondo te una lista appena creata ha degli elementi o è vuota?

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo