Il Bar dell'Ingegneria

Progetto Sovratensioni e tracciamento ISOBARE in autocad

« Older   Newer »
 
  Share  
.
  1.     +1   +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,163
    Reputation
    +294

    Status
    Offline
    Segnalo altri topic che riguardano VBA ed AutoCad
    ___________________________________________________________________________
    - VBA e Autocad. Primi passi
    - VBA e Autocad. Ancora primi passi
    - VBA e AutoCad- Le primitive: la polilinea
    - VBA e AutoCAd Le primitive- IL cerchio
    - VBA Autocad --->Excel
    - VBA e AutoCad - Pick Points
    - PickPoints: salvare i dati da Autocad in Excel
    - VBA e Autocad. Il controllo del controllo
    - VBA e AutoCAD- Un esempio pronto all'uso

    - VBA AutoCad - Disegnare ellisse e nocciolo con un clik
    - Spirali logaritmiche in AutoCad
    - Disegno segmento in Autocad attraverso macro VBA Excel
    - Avviare una macro Autocad da Macro Excel
    - Progetto Sovratensioni e tracciamento ISOBARE in autocad
    - VBA E aUTOcAD- La numerazione automatica
    - VBA e AutoCad - La fotonumerazione
    - Autocad e VBA
    - Tower
    ___________________________________________________________________________

    JSvi6vq


    Qualche tempo fa avevo mostrato una immagine, prelevata da un mio lavoro, che riportava un bulbo delle pressioni (isobare) ricavato attraverso l'uso di una serie di funzioni e procedure scritte in VBA per excel. Ricordo che in quella occasione, Quattropassi mostrò meraviglia ed interesse. Avevo scritto quelle procedure sfruttando qualche codice trovato in rete e riadattato ai miei scopi integrato con altro codice personale appositamente scritto.

    Purtroppo a causa dei troppo frequenti aggiornamenti di sistemi operativi (da Windows XP a Windows 7 a 32 bit) e delle applicazioni (passaggio da excel 2003 a excel 2007) quel programma "Non funziona più", ed a nulla sono serviti circa tre mesi di ricerche per adattare il programma alle nuove richieste del sistema. Niente da fare. Tuttavia mi cullavo del fatto che a casa avevo comunque installata la versione 2003 di excel e che in casi estremi avrei potuto farne ricorso.
    Ma proprio in questi giorni il mio pc casalingo è andato in crash (per mia dabbenaggine). Sono riuscito a recuperare tutti i dati ma ho dovuto acquistare copia del seven a 32 bit (per necessità legate ai vari software che uso) ed installare copia di excel 2007. Pertanto ho dato l'addio definitivo al programma "isobare.xls" che mi era costato tanto sudore.
    Pazienza.

    Adesso mi ripropongo, sfruttando parte del codice che avevo scritto in VBA per excel ed altro che ho trovato in rete (e di cui darò giusta citazione al momento opportuno), di scrivere un piccolo programmino in VBA per Autocad che compie le stesse cose (magari per adesso un po meno) che facevo con excel.
    Ovviamente spero che un qualche frequentatore interessato ed anche esperto di VBA per Autocad o anche di Autolisp per Autocad o comunque di algoritmi finalizzati al disegno di curve di livello da semina di punti disposti secondo una griglia regolare possa dare un qualche contributo o suggerimento.

    Alla prossima

    Edited by afazio - 15/9/2019, 11:47
     
    Top
    .
  2.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,163
    Reputation
    +294

    Status
    Offline
    Posizione del problema.

    Dato un semispazio indefinito sulla cui superficie di separazione agiscono una serie di nastri di carico indefiniti, si deve determinare l'incremento delle tensioni verticali (e volendo anche le orizzontali o/e le tangenziali o in generale le tensioni pricipali minime e massime e le direzioni associate) in ogni punto di una definita regione del semispazio.

    Fissato un sistema di coordinate x, z, atto a descrivere ogni punto del semispazio ed i punti di applicazione dei carichi, si ottiene lo schema sotto raffigurato.

    uno1i

    L'incremento delle tensioni nel generico punto P (x,z) dovuto all'insieme dei carichi presenti sulla superficie limite del semispazio risulta essere la somma degli incrementi dovuti ai singoli carichi.

    Per la determinazione dell'incremento tensionale dovuto ad un sistema di carico ci viene in aiuto Boussinnesq.
    Ecco due immagini che riassumono la soluzione di Boussinnesq nel caso di nastro di carico uniforme o nel caso di nastro di carico a distribuzione triangolare.

    qcostante

    qtriang

    Il caso di carico trapezio altro non è che la somma delle due soluzioni.
    Resterebbe da definire il caso del carico triangolare decrescente, che è ottenibile considerando al posto del punto P(x,z) il punto P'(x',z) speculare rispetto al centro del tratto di applicazione del carico triangolare.

    Edited by afazio - 31/7/2012, 16:03
     
    Top
    .
  3.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,163
    Reputation
    +294

    Status
    Offline
    Mediante l'applicazione delle soluzioni di Boussinesq siamo in grado di calcolare l'incremento delle tensioni in qualsiasi punto P(x,z). Indichiamo con sigma il valore della tensione nel generico punto.

    Possiamo pensare il punto come dotato delle tre coordinate (x,z,sigma) riconducendo il problema grafico del tracciamento delle curve di pari incremento tensionale (isobare) al tipico problema topografico di tracciamento delle curve di livello (isoipse) a partire da un piano quotato, cioè da un insieme più o meno sparpagliato di punti di cui abbiamo rilevato le coordinate planimetriche e la quota.
    Lo scopo del presente 3d è quello di riuscire a tracciare proprio queste curve di livello (Isobare) per ottenere qualcosa di simile a quanto rappresentato nella figura che segue:

    esempiok

    Nella versione che avevo scritto per Excel, sfruttando una funzione trovata in rete ero riouscito ad adattarla per rendere colorato il "bulbo delle pressioni" ottenendo quanto segue:

    esempiocol

    Per chi fosse interessato, ho preso spunto dal seguente link
    https://digilander.libero.it/foxes/Plot/Isol_plot.htm

    in particolare il foglio Isol.xls di Simoluca Santoro e la macro Mapper sviluppata da Robert de Levie ( www.bowdoin.edu/~rdelevie/excellaneous/ )

    Nel sito di Simonluca è anche disponibile un documento in pdf che illustra un algoritmo di calcolo per la determinazione di curve di livello a partire da una griglia regolare di punti. https://digilander.libero.it/foxes/Plot/Iso...llo_Appunti.pdf

    Edited by afazio - 31/7/2012, 20:18
     
    Top
    .
  4.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,163
    Reputation
    +294

    Status
    Offline
    Cominciamo a scrivere un po' di codice.
    Certamente ci servirà una funzione che ricevendo i dati relativi ad un carico (coordinate del punto dove vogliamo calcolata la sovratensione, ascissa iniziale e ascissa finale del tratto di applicazione del carico, intensità iniziale ed intensità finale del carico) ci restituisca il valore della tensione indotta nel punto.

    Una tale funzione avrà pertanto la struttura tipo:

    CODICE
    Public Function sigmaZ(X As Double, z As Double, xi As Double, xf As Double, qi As Double, qf As Double) As Double

    ' calcola la tensione indotta in un punto di coordinate x,z
    ' dovuto ad un carico a distribuzione uniforme, triangolare o trapezia

    End Function


    Volendo prendere in considerazione la possibilita che il carico sia applicato ad una quota z0 diversa dalla superficie limite, dovremmo pensare di aggiungere il relativo parametro nell'intestazione della funzione:

    CODICE
    Public Function sigmaZ(X As Double, z As Double, xi As Double, xf As Double, qi As Double, qf As Double, zo as double) As Double

    ' calcola la tensione indotta in un punto di coordinate x,z
    ' dovuto ad un carico a distribuzione uniforme, triangolare o trapezia
    ' applicato a quota zo rispetto alla superficie limite.

    End Function


    In questo modo abbiamo anche stabilito la struttura di composizione del singolo carico.
    Il singolo carico sarà pertanto definito dai seguenti valori:

    xi
    qi

    xf
    qf

    zo

    Definisco pertanto un tipo di variabile come segue:

    CODICE
    'Record tipo del carico
    Public Type CaricoType
       xi As Double
       qi As Double
       xf As Double
       qf As Double
       z0 As Double
    End Type


    stabilisco anche un numero massimo di carichi consentiti attraverso una costante che posso sempre modificare:

    Public Const MaxCarichi = 12

    e quindi posso inizializzare la variabile destinata a contenere i carichi:

    Public Carichi(MaxCarichi) As CaricoType

    per richiamarmi un valore dell'iesimo carico farò ricorso alla forma:

    valorexi= Carichi(i).xi
    valoreqi=Carichi(i).qi
    e cosi via per gli altri campi del record

    mentre se voglio attribuire i valori ai vari campi del record del k-esimo carico farò ruicorso alla forma

    Carichi(k).xi= valorexi
    Carichi(k).zo= valorezo

    Edited by afazio - 31/7/2012, 16:59
     
    Top
    .
  5.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,163
    Reputation
    +294

    Status
    Offline
    Alla funzione sigmaZ() arriva la coppia dei valori qi e qf. Vediamo i casi che possono presentarsi.

    Primo caso:
    qf = qi ricadiamo nel caso di carico a distribuzione uniforme e non abbiamo problemi

    Secondo caso:
    qf > qi . in questo caso il diagramma può decomporsi in un primo diagramma a distribuzione uniforme di intensita pari a qi ed un secondo diagramma a distribuzione triangolare crescente con intesita massima pari a (qf-qi). In questo caso operiamo la somma delle due soluzioni riportate sopra.

    caso2

    Terzo caso:
    qf < qi Anche in questo caso il diagramma può decomporsi in un primo diagramma a distribuzione uniforme di intensita pari a qf ed un secondo diagramma a distribuzione triangolare ma stavolta decrescente con intensita massima pari a (qi-qf). E' proprio in questo caso che nascerebbe la necessita di dover considerare il punto speculare come prima accennato.
    Possiamo però pensare di decomporre il diagramma di carico trapezio secondo lo schema che segue:

    caso3b

    Possiamo notare che la pare triangolare sarebbe negativa dato che la differenza (qf-qi) in questo caso è negativa e che per essa è possibile continuare ad applicare la formula di Boussinesq relativa al carico a distribuzione triangolare senza dover per forza considerare il punto speculare.

    Edited by afazio - 31/7/2012, 22:28
     
    Top
    .
  6.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,163
    Reputation
    +294

    Status
    Offline
    Ed allora ecco pronta la prima bozza della funzione che dovremo comunque rivedere per considerare i casi particolari in cui il relativo codice puo' andare in errore.
    CODICE
    Public Function sigmaZ(X As Double, z As Double, xi As Double, xf As Double, qi As Double, qf As Double, zo As Double) As Double

    ' calcola la tensione indotta in un punto di coordinate x,z
    ' dovuto ad un carico a distribuzione lineare qualsiasi (costante, triangolare o trapezia)
    ' applicata alla quota zo dal piano limite


    Dim alFa As Double
    Dim bEta1 As Double
    Dim betA2 As Double
    Dim pi As Double

    pi = 4 * Atn(1)

      ' determino gli angoli
           bEta1 = Atn((X - xf) / (z - zo))
           betA2 = Atn((X - xi) / (z - zo))
           alFa = betA2 - bEta1

       ' parte rettangolare
           sigmaZ = qi * (alFa + Sin(alFa) * Cos(alFa + 2 * bEta1)) / pi

       ' parte triangolare
           sigmaZ = sigmaZ + (qf - qi) * ((X - xi) * alFa / (xf - xi) - 0.5 * Sin(2 * bEta1)) / pi

    End Function


     
    Top
    .
  7.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,163
    Reputation
    +294

    Status
    Offline
    La prima fonte di errore potrebbe essere la divisione per zero nel calcolo degli angoli beta1 e beta2. Infatti per z=zo si ha divisione per zero.
    bEta1 = Atn((X - xf) / (z - zo)) divisione per zero
    betA2 = Atn((X - xi) / (z - zo)) divisione per zero

    Ma cosa succede quando z=zo?
    Guardiamo lo schema relativo al carico a distribuzione rettangolare postato qualche post sopra.
    L'angolo beta va a 90° o a 270° nei casi in cui il punto si trova a destra o a sinistra della stesa del carico ed anche quando si trova tra le estremita della distribuzione.
    L'angolo alfa va a zero nei casi in di punti esterni alla stesa e a 180° per punti interni alla stesa di carico.

    quindi avremo:
    punti a destra della stesa: beta1 =90, alfa= 0
    il valore di sigmaZ è
    sigmaZ = qi * (alFa + Sin(alFa) * Cos(alFa + 2 * bEta1)) / pi
    sigmaZ = qi * (0 + 0 * Cos(0 + 2 * 90)) / pi --> risultato zero

    punti a sinistra della stesa: beta1 =270, alfa= 0
    il valore di sigmaZ è
    sigmaZ = qi * (alFa + Sin(alFa) * Cos(alFa + 2 * bEta1)) / pi
    sigmaZ = qi * (0 + 0 * Cos(0 + 2 * 270)) / pi --> risultato zero

    punti compresi: beta1 =90° (o 270°), alfa= 180°
    il valore di sigmaZ è
    sigmaZ = qi * (alFa + Sin(alFa) * Cos(alFa + 2 * bEta1)) / pi
    sigmaZ = qi * (pi + 0 * Cos(pi + 2 * 90)) / pi --> risultato qi

    Interessante: praticamente nei punti esterni alla stesa di carico e posti sullo stesso piano di applicazione del carico, l'incremento tensionale è nullo, mentre nei punti interni, estremi compresi, l'incremento tensionale è pari proprio all'intensità del carico.

    Possiamo quindi correggere il codice inserendo quanto abbiamo qui riscontrato (e che si saremmo anche aspettati da logica).

    E' ragionevole aspettarsi che accada la stessa cosa nel caso di carico triangolare e cioè:
    - nei punti esterni alla stesa del carico l'incremento tensionale è nullo
    - nei punti interni alla stesa di carico l'incrementot ensionale è pari al valore dell'intensita del carico agente nel punto. Quindi nel caso del carico triangolare (ed anche trapezio) dobbiamo procedere ad interpolazione. Abbastanza semplice.

    In fase di correzione del codice, per evitare di incorrere nell'errore di divisione per zero, conviene condurre il controllo di uguaglianza delle quote z e zo a monte di tutto.

    Edited by afazio - 3/8/2012, 09:14
     
    Top
    .
  8.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,163
    Reputation
    +294

    Status
    Offline
    Altra fonte di errore, sempre "division by zero" è presente nella parte di calcolo delle tensioni da stesa a distribuzione triangolare:

    sigmaZ = sigmaZ + (qf - qi) * ((X - xi) * alFa / (xf - xi) - 0.5 * Sin(2 * bEta1)) / pi

    in particolare quando la differenza (xf - xi) è pari a zero si verifica inesorabilmente l'errore e la procedura si blocca perdendo tutto quanto.

    Questo si verifica quando xf=xi cioè stesa di carico di lunghezza nulla. E' chiaro che questo errore si può manifestare solo se in fase di input dei carichi non si pone attenzione ai numeri dati in input. Possiamo evitarlo semplicemente mediante un minimo di controllo in fase di inserimento dei carichi. Tuttavia è sempre bene "mai dire mai" e cautelarci in ogni caso inserendo un controllo anche nella presente funzione.

    Puo anche accadere il caso di stesa di carico negativa cioè xf<xi. In questo caso è come se mettessimo un carico negativo su stesa positiva. E' chiaro che dobbiamo evitare queste aberrazioni dei cui risultati non abbiamo certezza. Questo dobbiamo farlo in sede di input dei carichi.
     
    Top
    .
  9.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,163
    Reputation
    +294

    Status
    Offline
    Mettendo sotto forma di codice quanto sopra scritto, perveniamo finalmente alla prima versione della funzione sigmaZ()

    CODICE
    Public Function sigmaZ(X As Double, z As Double, xi As Double, xf As Double, qi As Double, qf As Double, zo As Double) As Double

    ' calcola la tensione indotta in un punto di coordinate x,z
    ' dovuto ad un carico a distribuzione lineare (costante, triangolare o trapezia
    ' ed applicata a quota zo rispetto alla superficie limite

    Dim alFa As Double
    Dim bEta As Double
    Dim betA2 As Double
    Dim pi As Double

    pi = 4 * Atn(1)

    If z = zo Then 'cotrollo l'uguagliana tra le quote z e zo
       If X < xi Or X > xf Then
           ' il punto è esterno alla stesa di carico
           sigmaZ = 0
       Else
           ' il punto è interno alla stesa di carico. Interpolazione tra qi e qf
           sigmaZ = qi + (qf - qi) * (X - xi) / (xf - xi)
       End If
    Else
       ' le quote z e zo non sono uguali, posso quindi calcolare gli angoli senza incorrere
       ' nell'errore di divisione per zero
       ' ----
       ' inoltre devo limitare il calcolo al solo caso in cui la stesa di carico sia positiva
       ' cioè xf>xi
       If xf - xi > 0 Then
           bEta = Atn((X - xf) / (z - zo))
           betA2 = Atn((X - xi) / (z - zo))
           alFa = betA2 - bEta
           ' parte rettangolare del carico
           sigmaZ = qi * (alFa + Sin(alFa) * Cos(alFa + 2 * bEta)) / pi
           ' parte triangolare del carico
           sigmaZ = sigmaZ + (qf - qi) * ((X - xi) * alFa / (xf - xi) - 0.5 * Sin(2 * bEta)) / pi
       End If
    End If
    End Function


    Resta ancora da capire cosa succede quando è z<zo, cioe in punti posti al di sopra della quota di applicazione del carico. Mi aspetterei di trovare valori negativi delle tensioni, ma per decidere se apportare modifiche al codice ed eventualmente quali, mi riservo di condurre dei test numerici sulla funzione sfruttando excel.

    to be continued...
     
    Top
    .
  10.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,163
    Reputation
    +294

    Status
    Offline
    Test numerico di funzionamento della funzione sigmaZ()

    E' sufficiente aprire un nuovo foglio di excel, entrare in modalità progettazione, creare un nuovo modulo e copincollare il codice precedente.
    Torniamo sul foglio, troveremo tra le funzioni personalizzate proprio la funzione testè incollata, predisponiamoci un format di input di un carico di prova ed altra sezione con l'inserimento delle coordinate di un punto e la determinazione della sigmaZ.
    Divertiamoci a cambiare le coordinate del punto ed anche i valori dei carichi per vederne il funzionamento

    testnumerico

    Nella immagine precedente sono riportati i test con carico avente cordinate xf>xi e con punti posti a quota zo a quota inferiore ed a quota superiore
    Le ascisse dei punti sono tali da essere sia esterni sia interni e sia concidenti con gli estremi della stesa di carico.
    Ho anche condotto test con xf<xi ed hanno dato valori delle tensioni nulle cosi come previsto nella funzione.
    Come atteso per valori di z sovrastanti il piano di applicazione del carico, le tensioni sono negative con valore praticamente opposto a quello del punto speculare rispetto alla quota z.
    Occorrerebbe meglio comprendere il significato fisico di ciò e capire se è sensato o meno, per intanto non pongo alcuna limitazione riservandomi di apportarla se necessario in seguito


    Le cose sembrano funzionare perfettamente, ma provando numerosi casi ecco imbattermi nell'errore che farebbe arrestare il programma.

    testnumericoerrorjpg

    L'errore si verifica quando xi=xf e z=zo ed è ubicato in questa parte del codice:

    CODICE
    If z = zo Then 'cotrollo l'uguagliana tra le quote z e zo
       If X <= xi Or X >= xf Then
           ' il punto è esterno alla stesa di carico
           sigmaZ = 0
       Else
           ' il punto è interno alla stesa di carico. Interpolazione tra qi e qf
           sigmaZ = qi + (qf - qi) * (X - xi) / (xf - xi)
       End If
    Else
       ' le q.......

    Manca il controllo If xf - xi >0 che invece ho inserito nella successiva parte di codice.

    Correggo. Ed ecco la versione finale corretta.

    CITAZIONE
    Public Function sigmaZ(X As Double, z As Double, xi As Double, xf As Double, qi As Double, qf As Double, zo As Double) As Double

    ' calcola la tensione indotta in un punto di coordinate x,z
    ' dovuto ad un carico a distribuzione lineare (costante, triangolare o trapezia
    ' ed applicata a quota zo rispetto alla superficie limite

    Dim alFa As Double
    Dim bEta As Double
    Dim betA2 As Double
    Dim pi As Double

    pi = 4 * Atn(1)
    sigmaZ=0
    If z = zo Then 'cotrollo l'uguagliana tra le quote z e zo
    If xf - xi > 0 Then
    If X <= xi Or X >= xf Then
    ' il punto è esterno alla stesa di carico
    sigmaZ = 0
    Else
    ' il punto è interno alla stesa di carico. Interpolazione tra qi e qf
    sigmaZ = qi + (qf - qi) * (X - xi) / (xf - xi)
    End If
    End If
    Else
    ' le quote z e zo non sono uguali, posso quindi calcolare gli angoli senza incorrere
    ' nell'errore di divisione per zero
    ' ----
    ' inoltre devo limitare il calcolo al solo caso in cui la stesa di carico sia positiva
    ' cioè xf>xi
    If xf - xi > 0 Then
    bEta = Atn((X - xf) / (z - zo))
    betA2 = Atn((X - xi) / (z - zo))
    alFa = betA2 - bEta
    ' parte rettangolare del carico
    sigmaZ = qi * (alFa + Sin(alFa) * Cos(alFa + 2 * bEta)) / pi
    ' parte triangolare del carico
    sigmaZ = sigmaZ + (qf - qi) * ((X - xi) * alFa / (xf - xi) - 0.5 * Sin(2 * bEta)) / pi
    End If
    End If
    End Function

    Questa sarà ritoccata solo per escludere, se ne risulterà necessità, il caso di punti posti al di sopra del piano di applicazione del carico.

    saluti



    Edited by afazio - 4/8/2012, 09:40
     
    Top
    .
  11.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,163
    Reputation
    +294

    Status
    Offline
    Alla ricerca dell'algoritmo

    Nei giorni scorsi sono stato alla ricerca di algoritmi e codici vari collegati in qualche modo alla costruzione di curve di livello da piano quotato o da semina di punti (x,y,z). In questa ricerca ho avuto modo di approfondire la questione della triangolarizzazione, della costruzione di un modello digitale del terreno (DTM) e dellla costruzione di curve di livello.

    Per chi fosse interessato riporto una serie di link utili:

    - Autocurve ed Autosez
    Programmi in lisp per autocad di Gian Paolo Cattaneo, reperibili presso il forum Cad3d.it con i quali è possibile far disegnare ad autocad curve di livello a partire da un modello DTM del terreno costituito da primitive 3Dface di autocad e da questo estrarre anche sezioni con le relative finche. Direi che il programma è davvero notevole e che almeno limitatamente alla funzione che svolge non ha proprio nulla da invidiare ai programmi commerciali.
    www.cad3d.it/forum1/showthread.php?t=15092 (autocurve)
    www.cad3d.it/forum1/showthread.php?t=17601 (Autosez2)

    Purtroppo (per me) il codice è scritto in lisp, roba che non mastico.

    - DTM
    DTM - Digital Terrain Model - crea 3Dfaces in autocad da una semina di punti (x,y,Z)
    ( originally by Daniele Piazza, enhanced by CAD Studio - www.cadstudio.cz )
    Anche questo, in linguaggio lisp, è un bel programma ed è stato spunto di parecchie discussioni nei forum dedicati alla scrittura di codice lisp relativo alla triangolarizzazione.
    per esempio qui www.theswamp.org/index.php?topic=9042.15

    - Algoritmo di Delaunay per la triangolazione
    Per la costruzione del modello digitale del terreno DTM, l'algoritmo fondamentale su cui si basano i vari programmi dedicati al problema della triangolarizzazione di un dominio (quindi anche il problema della mesh di un elemento piastra o anche di un elemento 3d) è quello proposto da Delaunay. Vedere wikipedia per conoscere i fondamenti dell'algoritmo.
    Molte discussioni sui forum dedicati sviluppano codici finalizzati alla costruzione di un DTM. Tra questi segnalo il blog di Kean Walmsley del team Autodesk

    http://through-the-interface.typepad.com/t...-using-net.html

    Ecco altro codice lisp di Evgeniy ELpanov che esegue la triangolazione Delauney
    http://elpanov.com/index.php?id=6

    Dal link che segue potete copiare il codice Lisp di Mihai Popescu he converte loriginario codice di Paul Burke scritto in Fortran77, per la triangolazione di una serie sparsa di punti mediante l'algoritmo di Delaunay
    http://paulbourke.net/papers/triangulate/tri.lisp

    -ConRec
    Una pagina che riporta l'algoritmo ( di Paul Bourke) per la generazione di curve di livello da un piano quotato di tipo regolare, cioe da una griglia di punti disposti regolarmente. DA notare che è praticamente simile a quello del documento che abbiamo visto nel sito di Simonluca Santoro.
    http://paulbourke.net/papers/conrec/
    Sempre da questa pagina è possibile scaricare i codici che traducono l'algoritmo in vari linguaggi (dal fortran77 al visual basic)
    In particolare, ero interessato ad un codice in VisualBasic ed ho scaricato il seguente. http://paulbourke.net/papers/conrec/conrec_vb.txt
    Dopo averlo studiato mi sono reso conto che con qualche modifica era utilizzabile allo scopo che mi ero proposto e cioe al disegno delle ISOBARE. Pertanto cosi come scaricato, lho preso e copincollato su un modulo del progetto VBA per le isobare.

    Parecchio interessante è anche questa pagina http://paulbourke.net/geometry/.

    Edited by afazio - 1/8/2012, 21:37
     
    Top
    .
  12.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,163
    Reputation
    +294

    Status
    Offline
    Volendo sfruttare il codice VB copiato dal link che ho dato ( http://paulbourke.net/papers/conrec/conrec_vb.txt ), occorre capire cosa accetta in input la funzione per poter organizzare i dati del nostro programma pronti ad essere ricevuti dalla funzione (o sub).

    i dati richiesti sono:

    una matrice Z(#,#) con indici zero-based, contenente le quote dei punti ed organizzata per righe e colonne.
    Se per esempio, nella discretizzazione del semispazio ove costruire le isobare, abbiamo stabilito una griglia composta da 25 linee orizzontali e 40 linee verticali, e se nel punto di intersezione tra la sesta riga e la ottava colonna la quota è pari a 100, l'elemento Z(5,7) conterrà proprio la quota 100

    un vettore X(#) con indice inferiore pari a ilb ed indice superiore pari a iub, contenente le ascisse delle rette verticali di suddivisione della griglia

    un vettore Y(#) con indice inferiore pari a jlb ed indice superiore pari a jub, contenente le ordinate delle rette orizzontale di suddivisione della griglia

    un intero nc contenente il numero delle isobare da disegnare

    un vettore contour(#) contenenti le quote delle curve isobare da disegnare.

    Dovremo tenere presente di questa organizzazione e cercare di organizzare i nostri dati in maniera similare.

    Edited by afazio - 2/8/2012, 20:24
     
    Top
    .
  13.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,163
    Reputation
    +294

    Status
    Offline
    A questo punto arrivati, iniziamo a costruirci l'interfaccia in VBA per autocad.
    Apriamo un nuovo disegno, accediamo all'ambiente di progettazione, inseriamo due nuovi form chiamati rispettivamente:
    - main dove metteremo tutti i controlli che ci necessiteranno per la gestione dei carichi, della griglia di punti e delle isobare
    - "InputCarichi" che ci servirà per poter inserire i dati relativi al singolo carico

    Inseriamoa nche tre moduli che chiameremo rispettivamente:
    - "gestione" dove depositeremo il codice che ci permette di gestire i form
    - "interpolazione" dove depositiamo per adesso il codice che abbiamo prelavato dal web
    - "sovratensione" dove depositeremo la funzione sigmaZ() che abbiamo gia scritto

    isobare001

    Adesso apriamo il form "main" ed inseriamo un controllo "Pagine". Click sulla prima pagina e diamo come caption della pagina "dati", click sulla seconda linguetta e diamo come caption "Punti"
    Questa seconda pagina ci servirà in fase di sviluppo del codice a depositarvi i dati elaborati per controllo di correttezza.

    Nella pagina "dati" inseriamo tre "cornici" dedicate rispettivamente a:
    - cornice "Discretizzazione sottosuolo" per la gestione della griglia di calcolo
    - cornice "carichi" per la gestione dei carichi
    - cornice "Isobare" per la gesrtione delle isobare.

    Inseriamo fin da adesso il pulsante di uscita "esci" alla pressione del quale legare il codice:
    CODICE
    Private Sub Btn_Esci_Click()
       Me.Hide
    End Sub

    Questo ci consente di poter uscire dalla finestra senza danni.
    Inoltre, nel modulo "gestione" inseriamo il codice di ingresso alla finestra:
    CODICE
    Sub avvia()
       
       Main.Show
    End Sub


    Iniziamo a prender di mira la gestione dei carichi.
     
    Top
    .
  14.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,163
    Reputation
    +294

    Status
    Offline
    Nella gestione dei carichi vogliamo poter fare:
    - inserire un nuovo carico
    - editare un carico gia inserito
    - eliminare un carico inserito
    Inoltre vogliamo poter vedere la lista dei carichi via via inseriti

    Utilizziamo pertanto i tre bottoni "Aggiungi Carico", "Edita", "Elimina" ed una casella di riepilogo che chiamamo "BoxCarichi"

    boxcarichi

    Per poter editare o cancellare un carico della lista occorre che ogni elemento della stessa sia selezionabile (solo uno per volta).
    Inoltre la lista dovra contenere per ciascun carico immesso le seguenti informazioni:

    xi, ascissa inizio carico
    qi, intensità di inizio carico
    xf, ascissa fine carico
    qf, intensità di fine carico
    zo, profondità di applicazione del carico.

    Pertanto il "boxCarichi" dovrà cpossedere 5 colonne, la proprietà listStyle impostata a "fmListStyleoption" e la proprietà multiselect a "fmMultiselctSingle". Inoltre impostiamo, anche in funzione della larghezza del controllo, la larghezza di tutte le colonne a 60 punti. Il tutto è illustrato nella immagine precedente
     
    Top
    .
  15.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,163
    Reputation
    +294

    Status
    Offline
    Alla pressione del tasto "Aggiungi carico" dovrà apparire il dialogo dedicato all'input dei dati del carico:

    inputcarichi01

    Ovviamente il dialogo "InputCarichi" lo avremo gia predisposto. La sua compilazione è abbastanza semplice e contiene oltre alle etichette, i campi editabili e due bottoni "Annulla" e "Conferma" con ovvio significato e con ovvia diversa funzione.

    Per richiamare il dialogo di input dei carichi leghiamo all'evento On_clik del pulsante "aggiungi carico" del dialogo principale il seguente codice:

    CODICE
    Private Sub CArichi_New_Click()

    If Num_tot_caRichi = MaxCarichi Then
       MsgBox (" raggiunto il numero massimo dei carichi" & "(max " & MaxCarichi & ")")
    else
       InputCarichi.Show
    End If

    End Sub

    In questo codice sono:
    - CArichi_New il nome del pulsante "Aggiungi Carico"
    - MaxCarichi il numero massimo dei carichi che possiamo aggiungere
    - Num_tot_caRichi il numero dei carichi inseriti

    Queste 'ultime due variabili devono essere pubbliche e definite nel modulo "gestione" prima della chiamata della sub "avvia". Avevo gia definito all'inizio di questo 3d la variabile MaxCarichi.
     
    Top
    .
37 replies since 30/7/2012, 22:08   4646 views
  Share  
.