[VB6] Programma per calcolo circuito con resistenze

di il
16 risposte

[VB6] Programma per calcolo circuito con resistenze

Orsù dunque ragazzuoli,
sto facendo un programma che permetta di disegnare graficamente un circuito elettrico e poi ne calcoli la resistenza totale.
Volevo alcuni consigli da voi, in primis: come far disegnare il circuito? Con continui cicli for che disegnano col metodo PSet(), o meglio usare delle PictureBox che sarebbero più facilmente gestibili graficamente? (Intendo che si possono spostare meglio, perché intendo "centrarle" nello spazio, diciamo che i rami del circuito devono essere equidistanti).
Ecco iniziamo con questo consiglio, poi veniamo agli altri

Su forza, voglio tanti commenti e opinioni!!
Ehi tu che stai leggendo!! Su rispondi anche tu dai

16 Risposte

  • Re: [VB6] Programma per calcolo circuito con resistenze

    Se hai intenzione di smartellarti i maroni allora usa pure il pset....
    Come minimo usa l'api SetPixel.
    Perchè poi continui cicli for?
    con 8 linee disegni una bellissima resistenza.
    Il tutto deve essere gestito ad hoc in strutture linkate.
    
    
    Private Type T_DRAW
        x as Long
        y as Long
        w as long
        h as long
        color as long
        type as long
    End Type
    
    Private Type T_RESISTENZA
        draw as T_DRAW
        in() As Long
        out() as Long
        value as long
    End Type
    
    
    cosi sarà piu semplice calcolare il valore finale.
  • Re: [VB6] Programma per calcolo circuito con resistenze

    Si si va bene, quindi consigli di disegnare così le resistenze. Il problema è che non c'è un numero stabilito di resistenze o di rami. L'utente può (almeno teoricamente) aggiungerne infiniti. Quindi facciamo l'esempio si disegni il primo ramo. Finito questo si passa a disegnare il secondo, e già andrebbe modificato il disegno, perché vorrei che i rami fossero equidistanti dal centro. E poi il terzo ramo, il quarto e così via. Ogni volta andrebbero ridisegnati. Perciò avevo pensato alle PictureBox: disegni una volta e poi sposti solamente, no? Non so se mi sono spiegato bene, ma tu mi consigli comunque di disegnarle ogni volta?
  • Re: [VB6] Programma per calcolo circuito con resistenze

    Cosa ti fa credere che usando un PictureBox dovresti risolvere?


    A mio avviso, se ho capito bene, dato che tu vuoi
    disegnare graficamente un circuito elettrico
    Allora devi per prima cosa crearti una libreria con gli elementi grafici di base,
    poi ti serve un toolbar che contenga tutti gli elementi, e da qui l'utente seleziona un elemento e con doppio clic lo aggiunge al circuito, infine lo trascina con il Drag&Drop dove vuole.

    Solo in un secondo tempo dovrai scrivere il codice per posizionare, allineare l'elemento quando termina il trascinamento. Per questo devi 'prevedere' una sorta di rettangolo 'calamitato' in modo che gli elementi vengano posizionati in maniera corretta e logica.
  • Re: [VB6] Programma per calcolo circuito con resistenze

    Innanzitutto (e ho dimenticato nel precedente messaggio) grazie per essere qui ad aiutarmi. E voglio ringraziare anche tutti quelli che si aggiungeranno alla discussione.

    Dunque quello che dice vbextreme è di creare la funzione che va a disegnare la resistenza, che viene suggerito anche da gibra.

    gibra ha scritto:


    Allora devi per prima cosa crearti una libreria con gli elementi grafici di base,
    poi ti serve un toolbar che contenga tutti gli elementi, e da qui l'utente seleziona un elemento e con doppio clic lo aggiunge al circuito, infine lo trascina con il Drag&Drop dove vuole.
    La toolbar l'ho già creata con gli elementi da inserire (che sono resistori o maglie).

    Si mi avete convinto, s'ha da fare in questo modo! Ma poi, dopo aver creato la libreria, dopo aver iniziato a disegnare il circuito, come sistemare i rami del circuito? Questo è che non ho capito.

    gibra ha scritto:


    Solo in un secondo tempo dovrai scrivere il codice per posizionare, allineare l'elemento quando termina il trascinamento. Per questo devi 'prevedere' una sorta di rettangolo 'calamitato' in modo che gli elementi vengano posizionati in maniera corretta e logica.
  • Re: [VB6] Programma per calcolo circuito con resistenze

    In che senso come sistemare i rami del circuito?
    Forse non ho capito esattamente quello che vuoi fare.
  • Re: [VB6] Programma per calcolo circuito con resistenze

    Voglio che i rami siano equidistanti fra loro. E non ho ben capito come dovrei fare per disegnare i rami.
  • Re: [VB6] Programma per calcolo circuito con resistenze

    Line????
    bho?? fai un disegno a mano e postalo.
  • Re: [VB6] Programma per calcolo circuito con resistenze

    veigh ha scritto:


    Voglio che i rami siano equidistanti fra loro. E non ho ben capito come dovrei fare per disegnare i rami.
    Non ti seguo.
    Perchè i rami dovrebbero essere equidistanti? Cosa significa?
    Forse per 'rami' intendi qualcosa di strano che noi non conosciamo?
    Eppure un circuito... è un circuito. Non è che vi sono tante alternative...

    Scusa, ma hai capito di cosa stiamo parlando?
    Te lo ripeto, magari non ti fosse chiaro:
    Abbiamo già detto che devi creare gli elementi grafici di base, è scontato che tra questi elementi devono esserci anche anche i 'rami'.


    Idee confuse?
  • Re: [VB6] Programma per calcolo circuito con resistenze

    Un ramo in un circuito è una parte del circuito stesso racchiuso fra i poli del generatore. Guardate l'immagine:

    Il tratto fra quei punti (detti nodi) ai capi delle resistenze formano un ramo. O meglio il ramo parte dal punto a, attraversa la resistenza R1 e arriva al punto b. Così per tutte le altre resistenze.
  • Re: [VB6] Programma per calcolo circuito con resistenze

    Appunto!

    Il 'ramo' è un simbolo grafico di base, devi usare un simbolo per ogni 'tipo' utilizzabile (R1, R2, C1, C2, ...).

    Se invece vuoi usare un simbolo grafico 'generico', ma personalizzabile allora potresti creare un controllo utente che preveda le proprietà specifiche e modificabili dall'utente, tra cui il simbolo (tipo) grafico da mostrare.

    Come il controllo Shape (tanto per fare un es. generico), in cui puoi impostare:
    posizione, dimensione, colore, bordo, ecc.

    Il tuo controllo utente dovrebbe avere anche le proprietà:
    . Text o Caption (es. R1, R2,... C1, C2, ...)
    - Orientamento (orizzontale/verticale)
    - Trasparente (Si/No)
    - ecc...

    Alcuni dettagli sui simboli grafici:
    http://www.electronicszone.it/symbols.ph (contenuti teorici molto interessanti)
    http://it.wikipedia.org/wiki/Resistor

    Quindi, in sostanza, o decidi di usare più 'elementi' raffiguranti i simboli grafici 'predefiniti', oppure un controllo utente generico che in base al Tipo (impostato dall'utente) mostri il simbolo grafico corrispondente.

    Non vorrei essere brutale, ma realizzare quello che vuoi tu non è certo una passeggiata.

    Inoltre, considerando che esistono già software di questo genere, per di più gratuiti e/o opensource, ti consiglio di documentarti prima e di rifletterci bene.
    Se proprio vuoi reinventare la ruota per la soddisfazione legittima di dire:
    "Questo l'ho fatto io!"
    allora ok, tirati su le maniche e comincia!

    Nel frattempo che rifletti, dai un'occhiata qui:
    http://www.matematicamente.it/software_matematico

    tra cui ti consiglio di dare un'occhiata a questo (preso a caso):
    DIA: https://live.gnome.org/Di
    https://live.gnome.org/Dia/Example

    In particolar modo all'Object Sheet Editor:
    https://live.gnome.org/Dia/Screenshot
  • Re: [VB6] Programma per calcolo circuito con resistenze

    Option Explicit
    
    Private Const RES_LINE As Long = 5
    Private Const RES_HEIGHT As Long = 100
    Private Const RES_WIDTH As Long = 30
    Private Const RES_CRE As Long = 7
    Private Const RES_SPACE As Long = 100
    Private Const RES_TOP As Long = 30
    Private Const RES_MAX As Long = 4
    
    Private Type RESISTENZA
        x As Long
        y As Long
        Value As Long
    End Type
    
    Dim RS() As RESISTENZA
    
    Private Sub DrawPista(ByVal x0 As Long, ByVal y0 As Long, ByVal x1 As Long, ByVal y1 As Long, ByVal infinite As Boolean)
        If infinite Then
            Me.DrawStyle = 2
            Me.Line (x0, y0)-(x0 + (x1 - x0) / 2, y1), vbBlack
            x0 = x0 + (x1 - x0) / 2
            Me.DrawStyle = 0
        End If
        Me.Line (x0, y0)-(x1, y1), vbBlack
    End Sub
    
    Private Sub DrawRes(ByVal x As Long, ByVal y As Long)
        Dim iy As Long, x1 As Long
        Dim STH As Long
        
        Dim flipflop As Boolean
        
        STH = (RES_HEIGHT - RES_LINE * 2) / (RES_CRE + 2)
        
        Me.Line (x, y)-(x, y + RES_LINE), vbBlack
        x1 = x + RES_WIDTH / 2
        y = y + RES_LINE
        Me.Line (x, y)-(x1, y + STH), vbBlack
        x = x1
        x1 = x - RES_WIDTH
        
        For iy = 1 To RES_CRE
            
            y = y + STH
            Me.Line (x, y)-(x1, y + STH), vbBlack
            
            If flipflop Then
                x = x + RES_WIDTH
                x1 = x1 - RES_WIDTH
            Else
                x = x - RES_WIDTH
                x1 = x1 + RES_WIDTH
            End If
            
            flipflop = Not flipflop
        Next
        
        y = y + STH
        x1 = x1 - RES_WIDTH / 2
        Me.Line (x, y)-(x1, y + STH), vbBlack
        Me.Line (x1, y + STH)-(x1, y + STH + RES_LINE), vbBlack
        
    End Sub
    
    Private Sub AddResistenza(ByVal Value As Long)
        Dim c As Long
        
        On Error Resume Next
            c = UBound(RS)
        If Err.Number = 0 Then
            c = c + 1
            ReDim Preserve RS(c) As RESISTENZA
            RS(c).x = RS(c - 1).x + RES_SPACE
        Else
            ReDim RS(c) As RESISTENZA
            RS(c).x = RES_SPACE / 2
            Err.Clear
        End If
        On Error Resume Next
        
        RS(c).y = RES_TOP
        RS(c).Value = Value
    End Sub
    
    Private Sub PrintfVal()
        Dim k As Long
        Dim u As Double
        
        If UBound(RS) = 0 Then
            MsgBox "Resistenza totale:" & RS(0).Value
            Exit Sub
        End If
        
        For k = 0 To UBound(RS)
            u = u + 1 / RS(k).Value
        Next
        u = 1 / u
        MsgBox "Resistenza totale:" & u
    End Sub
    
    
    Private Sub Form_Load()
        Me.ScaleMode = 3
        Me.BackColor = vbWhite
        Me.AutoRedraw = True
        
        Show
        DoEvents
        
        Dim tmp As String
        Dim val As Long
        Dim c As Long
        
        c = 1
        Do
            tmp = InputBox("Resistenza Numero:" & c & vbCrLf & "-1 to exit", "Value Resistenza")
            If IsNumeric(tmp) Then
                c = c + 1
                val = CLng(tmp)
                If val > 0 Then
                    AddResistenza val
                Else
                    Exit Do
                End If
            End If
        Loop
        
        If UBound(RS) > RES_MAX - 1 Then
            tmp = "A"
            val = RES_MAX - 2
        Else
            tmp = ""
            val = UBound(RS)
            If val > 0 Then val = val - 1
        End If
        
        For c = 0 To val
            DrawRes RS(c).x, RS(c).y
            If UBound(RS) > 0 Then
                DrawPista RS(c).x, RS(c).y, RS(c + 1).x, RS(c + 1).y, False
                DrawPista RS(c).x, RS(c).y + RES_HEIGHT, RS(c + 1).x, RS(c + 1).y + RES_HEIGHT, False
            End If
        Next
        
        If UBound(RS) > 0 Then
            DrawRes RS(c).x, RS(c).y
        End If
        
        If tmp = "A" Then
            DrawPista RS(c).x, RS(c).y, RS(c + 1).x, RS(c + 1).y, True
            DrawPista RS(c).x, RS(c).y + RES_HEIGHT, RS(c + 1).x, RS(c + 1).y + RES_HEIGHT, True
            DrawRes RS(c + 1).x, RS(c + 1).y
        End If
        
        PrintfVal
        
    
    End Sub
    
    mo basta,non chiedermi anche come si fanno le frecce o la lettera "V"
    Scusate per il codice ma in 10 minuti non sono riuscito a far di meglio.
  • Re: [VB6] Programma per calcolo circuito con resistenze

    Grazie a entrambi ragazzi. Allora rispondo prima a gibra.
    Non vorrei essere brutale, ma realizzare quello che vuoi tu non è certo una passeggiata.
    So che non si tratta di una cosa semplice, per questo ho scelto di farla
    Devo fare l'esame di maturità e voglio fare questo "programmino" per stupire un poco (e rubare 10-15 minuti ). D'altronde i programmi fatti in classe non mi soddisfacevano, e ho voluto farne uno per conto mio. Quindi questo risolve il tuo dubbio: anche se ci sono molti softaware in giro, devo farlo io
    L'unica limitazione che ho è il linguaggio, che, come si può notare, non ricordo benissimo

    E credo di aver risposto anche a vbextreme: grazie per il codice, grazie per l'impegno, a cui darò sicuramente un'occhiata. Ma non mi va di fare un banale copia-incolla, per i motivi detti sopra.
    In questo forum non cercavo qualcuno che mi scrivesse il codice, ma cercavo solo consigli.
  • Re: [VB6] Programma per calcolo circuito con resistenze

    No no non copiarlo perchè è orrendo.
    Volevo solo farti intravedere una possibile imlementazione.
  • Re: [VB6] Programma per calcolo circuito con resistenze

    Allora ho creato una prima libreria grafica, dove mi disegna con 8 tratti di linee una resistenza. Con una sub va bene no? Non mi deve restituire nessun valore quindi...
    Mi resta ora da mettere a posto un po' di cose ma poi arriverò a questo punto: i valori delle resistenze conviene salvarli su un database (e su file quindi) o salvo tutto in una variabile interna al programma?
Devi accedere o registrarti per scrivere nel forum
16 risposte