PDA

View Full Version : [VB6] Creare un software che traccia delle linee(un piccolo cad)


mayor
02-04-2008, 22:32
Salve a tutti sono uno studente di ingegneria e mi e' stato chiesto di creare un software che permetta di far tracciare delle rette all'utente.

Questo software deve essere un piccolo cad ma nn mi interessa esportare in nessun formato proprietario.

Potete darmi una dritta sul linguaggio + conveniente e su eventuali librerie free?

Grazie

variabilepippo
02-04-2008, 22:37
Puoi farlo in qualsiasi linguaggio general-purpose (C#/Java/Delphi/C++/Python/...), ovviamente ti conviene scegliere quello che conosci meglio.

Per ogni linguaggio esistono delle librerie per lo sviluppo di applicazioni CAD-like, ma credo che lo scopo del progetto sia quello di sfruttare al più i framework del linguaggio prescelto. Altrimenti è troppo semplice... :D

mayor
02-04-2008, 23:07
effettivamente nn ho specificato, sono uno studente di ingegneria civile, quindi devo fare questo software il + semplicemente possibile!

Pensavo di farlo in Visual basic ma nn conosco le librerie + appropriate

variabilepippo
03-04-2008, 00:10
Specifica i requisiti dettagliati del progetto (=cosa deve fare) e non dimenticare di dire "perché"/"per chi" devi svilupparlo.

Esistono poche librerie open-source per VB6, un tempo fioriva un mercato di controlli commerciali per tale linguaggio.

mayor
03-04-2008, 00:36
Devo esattamente creare un software che calcola il centro di taglio di una sezione generica disegnata da ki usa il programma.

Per l'algoritmo che calcola il centro di taglio nn ho problemi, l'unico problema sta nel creare la grafica

banryu79
03-04-2008, 08:49
Per l'algoritmo che calcola il centro di taglio nn ho problemi, l'unico problema sta nel creare la grafica


Anche io consiglio VB: creazione rapida e semplice dell'interfaccia utente; poi per disegnare nella finestra non credo che ci siano problemi.

L'unica è che tu ti studi come funzionano e come sono gestiti "i contesti grafici" (e come ci si disegna) nel linguaggio che sceglierai per realizzare il tuo progetto.

Una curiosità: che tipo di entità geometriche devi gestire: solo linee o anche archi, cerchi, altri tipi di coniche?


@EDIT:
Devi anche dare la possibilità di salvare il file su cui si lavora? (sì, lo so, domanda stupida forse)
In tale caso ti interessa riuscire a produrre un file dxf? (il formato file dxf R12 è uno standard diffuso per l'interscambio dati in ambiente tecnico CAD e CAM)

mayor
03-04-2008, 11:07
Devo gestire inizialmente solo linee ma se poi riuscissi a implementare anche gli archi di circonferenza sarebbe interessante.

Ma quindi mi consigliate di utilizzare le system.drawing?

nn esiste qualche libreria che mi possa agevolare il compito?

banryu79
03-04-2008, 11:16
Hai già tutto quello che ti serve, devi solo documentarti e usarlo.
In fin dei conti devi solo disegnare linee (e forse archi di cerchio, e non credo siano un problema).

Prova a consultare queste risorse e a farti un'idea più precisa:

-> guide introduttive alla programmazione grafica (http://msdn2.microsoft.com/it-it/library/da0f23z7(VS.80).aspx)
-> System.drawings (http://msdn2.microsoft.com/it-it/library/system.drawing(VS.80).aspx)
-> Graphics: membri e metodi (http://msdn2.microsoft.com/it-it/library/system.drawing.graphics_members(VS.80).aspx)
-> Classe Pen (http://msdn2.microsoft.com/it-it/library/system.drawing.pen(VS.80).aspx)

mayor
03-04-2008, 11:22
Sapresti consigliarmi anche un libro che tratta questo argomento?

mayor
03-04-2008, 12:26
Purtroppo sono alle prime armi con la programmazione ad oggetti quindi anche se visual basic e' mooolto semplice mi sto trovando in difficoltà!

Attualmente il mio problema e' il seguente:

Sto utilizzando le librerie System.Drawing
e mi interessa creare una linea che si sposta quando si ridimensiona la finestra e che appaia quando si lancia il programma

con questa Sub sono riuscito a far apparire la linea:

Private Sub Panel1_Paint(ByVal sender As System.Object,ByVal e As System.Windows.Forms.PaintEventArgs) Handles Panel1.Paint
dim Asse As Graphics = e.Graphics
Asse.DrawLine(Pens.Black,Me.Panel1.Location.X+20,Me.Size.Height-70,Me.Panel1.Location.X+70,Me.Size.Height-70)
End Sub

Solo che mi interessa che questa linea si possa spostare quando si ridimensiona la finestra.
Sapete come posso gestire una linea che ho dichiarato all'inteno di una Sub?

banryu79
03-04-2008, 13:18
-> Sistemi di coordinate e trasformazioni (http://msdn2.microsoft.com/it-it/library/3zxbwxch(VS.80).aspx)

Che tipo di esperienza di programmazione hai alle spalle? Scusa se te lo chiedo, ma se ci specifichi che linguaggio conosci (VB6 o VB.NET?), in che ambiente stai lavorando (presumo Visual Studio, ma quale versione?) eccetera, probabilmente rusciamo a darti consigli più pertinenti e appropriati.

Nota che se parti da zero, non solo come ambito tecnologico (programmazione grafica) ma anche come ambiente (VB.NET 200X) allora non puoi improvvisare e buttarti subito a scrivere codice, devi mettere in preventivo un ragionevole lasso di tempo per acquisire le competenze che ti servono.

Potresti cominciare a spiegare in dettaglio che conoscenze hai, e cosa devi fare (il software)

mayor
03-04-2008, 14:59
Per quanto riguarda le mie competenze: sono un appassionato di programmazione ho iniziato a scuola a programmare in pascal,poi sono passato al flash,c++,visual basic ma sempre a livello amatoriale quindi so giochicchiare con un bel pò di linguaggi ma nn li conosco bene in particolare nn ho mai approfondito la programmazione ad oggetti anche se concettualmente l'ho capita.

Devo : (come avevo scritto prima) programmare un piccolissimo cad che deve tracciare delle linee per ottenere una figura geometrica.
Tutto questo per poi scrivere un algoritmo che a partire dalla figura geometrica che l'utente ha disegnato calcoli in centro di taglio della sezione.

L'algoritmo in questione nn mi sarà difficile da scrivere perchè rientra nelle mie competenze.

Quindi il mio problema è solo la parte dell'interfaccia utente

Spero che adesso il quadro sia + chiaro.
grazie

71104
03-04-2008, 17:15
mi intrometto per dire la mia (scusatemi ma ho dato una letta molto rapida al thread, potrei ripetere cose già dette :p).

ho qui Visual Basic 2008 Express (mai usato :asd: ), l'ho aperto e ho creato un nuovo progetto; il wizard mi fa scegliere tra alcuni templates tra cui vedo "Windows Forms Application"; lo scelgo e l'hard disk parte a frullare, e dopo qualche secondo mi salta fuori un confortevole ambiente RAD per disegnare interfacce grafiche basate su Windows Forms. direi che la questione dell'interfaccia utente non è eccessivamente complessa :)

mayor
03-04-2008, 23:38
Si infatti per questo ho deciso di utilizzare visual basic perchè e' molto semplice creare i form. Soltanto che dare la possibilità all'utente di disegnare un numero n di linee nn e' così semplice (almeno per le mie competenze)

banryu79
04-04-2008, 08:50
Mayor, prima devi "fare amicizia" con l'interfaccia a GDI+ per sapere come disegnare le tue entità, eseguire trasformazioni affini (se devi rototraslare e scalare il disegno: utile per implementare funzioni di zoom/zoom finestra, per esempio [se ti è noto AutoCAD sai di che parlo]) eccetera: ma per disegnarle, le tue entità prima devono essere istanziate e memorizzate...

Il che ci porta alla questione + complessa:
- come farà il tuo utente a costruire le linee? (per ora supponiamo di dover gestire solo le linee).

Prova a descivere come l'utente si interfaccia al cad per creare le sue entità geometriche, e vediamo che implicazioni saltano fuori :D

Ah, domandina importante:
Ma il tuo software deve permettere la creazione di qualsiasi forma [percorso chiuso] (basata su linee) o ti basta gestire solo un piccolo set di forme geometriche?

Chiedo perchè in un caso [nel primo] hai proprio bisogno di un cad, cioè devi far disegnare all'utente le entità geometriche che definiscono la forma (percorso chiuso), viceversa nell'altro caso [il secondo] potresti evitare di far disegnare all'utente la forma geometrica: gli metti invece a disposizione una "libreria" di forme geometriche predefinite parametriche: l'utente si limita a dimensionare le varie entità della forma, senza la necessità di tracciarle.
Non so se ho spiegato in modo chiaro la cosa.

mayor
04-04-2008, 10:10
Sisi 6 stato chiarissimo!
L'operatore deve disegnare un generico percorso chiuso e per farlo pensavo di creare (sempre se ci riesco) un comando tipo polilinea (se hai presente autocad penso che hai capito :))

banryu79
04-04-2008, 13:24
Allora proviamo a immaginare uno scenario di partenza da fissare come possibile obbiettivo:

1 - creare un'applicazione dotata di un'unica finestra;

2 - dentro la finestra si sfrutterà tutto lo spazio client della stessa per la definizione delle entità geometriche (solo linee) e la loro rappresentazione grafica;

Ci sono tante cose da stabilire:

* che convenzione utilizzerai per rappresentare il tuo modello di piano cartesiano nell'applicazione? Il piano cartesiano canonico ha l'asse delle ascisse che si estende con verso positivo verso destra, e l'asse delle ordinate che si estende con verso positivo verso l'alto; ma nei contesti grafici delle finestre in cui devi poi disegnare le tue entità, il punto di origine è l'angolo in alto a sinistra, l'asse delle ascisse si estende con verso positivo verso destra mentre quello delle ordinate si estende con verso positivo verso il basso.

Quindi mentre a livello di "modello" potresti rappresentare le tue entità con coordinate basate sulle convenzioni del piano cartesiano "canonico", poi a livello di rappresentazione grafica (disegno nella finestra) e cattura degli eventi del mouse (click con i tasti, trascinamento, rilascio ecc... che dovrai gestire se vuoi permettere all'utente di tracciare le entità con appunto il mouse) dovrai rimappare le coordinate per disegnarle dove ti aspetti.
Altre trasformazioni delle coordinate avverranno per la funzione di zoom: sarà infatti praticamente necessario mettere a disposizione dell'utente questa funzionalità perchè egli sia in grado tracciare le forme che preferisce in modo agevole (sarai ovviamente tu poi a valutare e decidere)

*come rappresenterai le tue entita-linea nell'applicazione? Possiamo definire una linea in diversi modi, ad esempio tramite due punti [segmento] oppure anche come due valori double, uno per il coefficente angolare (m) e l'altro per l'intercetta (q) [retta].

Potrebbe essere ragionevole partire definendo un entità-geometrica Punto (due double: x e y), definire poi un'entità-geometrica Linea (composta da due entità Punto) magari dotata di metodi che sappiano calcolare e restituirci il suo coefficente angolare e la sua intercetta (se queste informazioni ti tornano utili nell'applicazione).

Ma pensare di partire a progettare la tua applicazione e realizzarla senza prima avere le conoscenze tecniche necessarie a implementare queste funzionalità è assurdo.

Tanto per elencarne alcune che ti serviranno:
- programmazione OOP per strutturare i tuoi oggetti e le relazioni tra loro nella tua applicazione;
- conoscenza della sintassi e delle meccaniche (almeno quelle di base) del linguaggio VB.NET (e nota che essendo OOP la cosa qui va di pari passo col punto precedente)
- conoscenza degli oggetti e dell'ambiente che VB.NET, tramite appunto il framework .NET, mette a disposizione per la grafica, tra cui:
- sistema di coordinate
- trasformazioni affini e almeno le due principali trasformazioni di Scale e Translate (lasciando stare lo Shear)
- System.Drawing e la superfice di disegno GDI+ rappresentata da Graphics.


Come vedi ci sono vari campi di conoscenza di cui appropriarsi prima di cimentarsi nello stendere l'implementazione del tuo programma.
Dato che, se non ho capito male, non sei completamente a digiuno di programmazione, la cosa sarebbe anche fattibile con tanto impegno e il ragionevole lasso di tempo (di cui sopra in un mio post precedente) per acquisire queste competenze, in particolare il discorso sull'OOP e Graphics.

Ciao :)

variabilepippo
04-04-2008, 13:38
Non è facile creare un "piccolo" CAD partendo da zero, bisogna tenere in considerazione un numero notevole di problematiche...

Se ti interessa prendere spunto, puoi partire da progetti(ni) tipo Open-S CAD (http://www.codeproject.com/KB/cs/OpenS-CAD.aspx).

dupa
04-04-2008, 15:28
sì ma non è che può usare come "model" una bitmap.

bisogna prima modelllizzare gli oggetti...
classe astratta Forma con ad esempio coordinate x,y

classe Linea che estende Forma..
classe Curva ecc.

ognuna con le sue proprietà..

L'applicazione gestirà in pratica una List<Forma> e refresha la bitmap in base al modello...

non è che potete disegnare direttamente senza tener traccia da nessuna parte del modello dei dati.

Poi eviterei assolutamente almeno inizialmente di gestire l'inserimento della forme iin modo "grafico".
mettere delle semplici form dove posso inserire forme dando le loro coordinate x,y, e altri parametri, lunghezze diametro ecc. in base al tipo di forma.. e un click sul bottone carica nel model questi dati..
e poi magari una lista con ttute le forme attualmente definite con la possibilità di cancellarle dal model.

banryu79
04-04-2008, 15:57
Poi eviterei assolutamente almeno inizialmente di gestire l'inserimento della forme in modo "grafico".
mettere delle semplici form dove posso inserire forme dando le loro coordinate x,y, e altri parametri, lunghezze diametro ecc. in base al tipo di forma.. e un click sul bottone carica nel model questi dati..
e poi magari una lista con ttute le forme attualmente definite con la possibilità di cancellarle dal model


Quoto, questo sarebbe molto più semplice e veloce da realizzare, l'input grafico si può aggiugere successivamente senza problemi.

Anzi, forse è proprio meglio partire con un cosa del genere, per poter poi verificare se l'implementazione di quel che si è fatto è corretta, dove va riveduta/modificata ecc...

Poi si valuta se implementare (e come) un interfaccia con l'utente via eventi del mouse anche per la definzione delle entità.

mayor
05-04-2008, 00:07
Inanzi tutto vi ringrazio per i post mi sono di grandissimo aiuto sto studiando un pò di guide su visual basic e GDI+

Per quanto riguarda il piccolo cad deve essere molto molto piccolo quindi spero di farcela piano piano magari con qualche vostra dritta. Ad esempio sono riuscito a tracciare le linee e a dare la possibilità di crearne n. Insomma ho creato un array di linee a dimensione variabile.

Adesso ho un problema ho visto che esiste il metodo clean che "pulisce" tutta la regione in cui si disegna, ma esiste un metodo che permette di cancellare un singolo oggetto ad esempio una singola linea ?

Grazie mille anticipatamente

^TiGeRShArK^
05-04-2008, 06:45
in basic ai tempi avevo fatto qualcosa di simile, tutto con la programmazione procedurale e il salvataggio su file memorizzando le coordinate dell'oggetto e/o salvando il frame buffer in Quick Basic....
quindi per essere fattibile è fattibile senza conoscere la programmazione ad oggetti...ma ti uscirà una porcata a livello di eleganza di codice :p
Per cancellare la linea *presumo* che devi prima calcolarti l'intersezione con altre linee, quindi disegnare una linea con le stesse coordinate di quella da cancellare ma col colore uguale al colore di sfondo (oppure, se è possibile, vai in XOR) e quindi devi disegnare un punto del colore giusto nei punti di intersezione con le altre linee, altrimenti ti verranno "tagliate"

dupa
05-04-2008, 12:00
Inanzi tutto vi ringrazio per i post mi sono di grandissimo aiuto sto studiando un pò di guide su visual basic e GDI+

Per quanto riguarda il piccolo cad deve essere molto molto piccolo quindi spero di farcela piano piano magari con qualche vostra dritta. Ad esempio sono riuscito a tracciare le linee e a dare la possibilità di crearne n. Insomma ho creato un array di linee a dimensione variabile.

Adesso ho un problema ho visto che esiste il metodo clean che "pulisce" tutta la regione in cui si disegna, ma esiste un metodo che permette di cancellare un singolo oggetto ad esempio una singola linea ?

Grazie mille anticipatamente

leggi quello che ti ho scritto.
tu devi definire
- un modello dei dati (cioè le forme)
- un metodo che dato il modello lo disegna su una "bitmap"
- dei controlli di input per aggiungere forme, togliere forme.

NON agire direttamente sul disegno... è una cosa complessa e inizialmente è meglio partire da quello che ti ho scritto