Il Bar dell'Ingegneria

Votes taken by afazio

  1. .
    CITAZIONE (francoschi @ 25/11/2019, 10:47) 
    Grazie mille.
    Credo che prima che io riesca a postare un qualcosa di utile passerà un bel po' di tempo.... purtroppo non ho molte conoscenze di programmazione excel, e ancora meno in tema di Classi, per questo seguo con interesse.

    Tornando sul tema, vorrei capire più esattamente cosa intenti "Classizzare":
    1) vuoi creare una specie di scatola nera, che prende i dati grezzi (nodi, aste, carichi)e genera il grafico senza scrivere i dati sui fogli di appoggio, gestendo i parametri di visualizzazione all'interno della "scatola nera" stessa;
    2) oppure solo un qualcosa che automatizza le funzioni e rende più veloce e reattivo il tutto?

    Mi scuso in anticipo per le mie domande da ignornte.... ma non posso fingere di sapere più di quel che conosco.

    Una classe è in pratica un "oggetto".
    Come definiamo l'oggetto in un programma? Il concetto di scatola nera è efficace.

    Questa scatola possiede delle caratteristiche (naturalmente saremo noi a stabilire quali caratteristiche deve possedere).

    Le caratteristiche vengono chiamate proprietà.

    Nell'esempio della "scatola nera" potremmo pensare di attribuire la proprietà del "colore" e volendo farla anche diventare "bianca". In questo caso l'oggetto diventerebbe solo "la scatola" e una delle proprietà sarebbe il suo colore.
    Le proprietà di un oggetto si richiamano o si impostano facendo seguire al nome dell'oggetto la sua proprietà separata da un puntino.
    Nell'esempio della scatola potremmo farle cambiare colore con una semplice istruzione:

    scatola.colore=bianca

    Deve poi pensarci l'oggetto scatola a cambiare di colore attraverso delle istruzioni interne alla scatola e a noi non accessibili che le fanno cambiare colore.

    Le istruzioni interne vengono chiamate "metodi" dell'oggetto e i metodi possono anche essere visti dall'esterno della scatola.

    Potremmo anche pensare di farle cambiare le dimensioni o la forma, definendo altre proprietà, scatola.forma e scatola.dimensioni

    dall'esterno basterebbe scrivere:

    Scatola.forma=cubo
    Scatola.dimensioni= L

    Poi i metodi interni penseranno a fare il loro dovere facendo cambiare forma alla scatola e le sue dimensioni.

    Infine vogliamo che a cambiare forma non sia una istruzione specifica ma sia il generarsi di un evento.
    Un evento elementare molto intuitivo potrebbe essere "il verificarsi del doppio click in una zona dello schermo". Al verificarsi di questo evento l'oggetto deve cambiare forma assumendo la forma cubica.

    L'oggetto deve avere quindi incorporato un sistema di rilevamento dell'evento. In realtà è l'ambiente che trasmette l'evento all'oggetto e questi se possiede i metodi (perchè glieli abbiamo dotati noi) allora attiverà quella parte di codice deputata a far cambiare forma.
    Ma l'evento può essere qualsiasi non per forza qualcosa di fisico e meccanico come la pressione del dito sul mouse, come per esempio il verificarsi della variazione di una variabile. Ma in questo caso dobbiamo essere noi a creare un evento "modificatavariabile" e sarà poi l'ambiente a trasmettere questo evento con un messaggio tipo "ohè, scatola, ved iche qui è accaduto che la variabile x è cambiata, se devi fare qualcosa fallo altrimenti passa l'evento al tuo genitore".

    Se nemmeno il genitore è in grado di gestire quell'evento, allora l'evento ritorna al mittente e l'evento cade nel nulla.

    L'accenno al "genitore" dell'oggetto non è a caso. I effetti gli oggetti sono come delle matrioske. All'interno della bambola si trova altra bambolina che ne contiene altra e cosi via.
    In genere nella programmazione ad oggetti si parte da una serie di oggetti genitori che vengono definiti a monte e che fanno parte del corredo genetico dell'ambiente di programmazione. Volendo creare noi un oggetto, ci appoggiamo ad uno degli oggetti predefiiti che però facciano al nostro scopo. Da questo oggetto genitore ereditiamo le proprietà (tutte o solo quelle che ci interessano) ne definiamo altre specifiche, ereditiamo anche i metodi (tutti o una parte) e ne definiamo altri, ereditiamo gli eventi (tutti o una parte) e ne definiamo altri.
    La caratteristica di un oggetto deve essere quindi l'ereditarietà.
    Altra caratteristica fondamentale dell'oggetto è il polimorfismo, ossia la possibilità che un oggetto generi figli diversi che sfruttano in maniera diversa una caratteristica del padre.

    Da qui in poi possiamo sbizzarrirci con le più svariate proprietà, metodi ed eventi.
  2. .
    CITAZIONE (unoinpiu @ 17/11/2019, 15:54) 
    se creiamo un named range "ListaNamedRangeDaEsportare" in cui elenchi i nomi dei named range da esportare, il codice diventa

    CODICE
    Dim cell As Range
    For Each cell In Range("ListaNamedRangeDaEsportare")
       CopyAttempt objWord, Range(cell.Value2)
    Next

    Ok.
    Modificato il codice in tal senso e continua a funzionare

    CODICE
    Sub Word()
     
     Dim objWord As Word.Application
     If Not GetWordApplication(objWord) Then Exit Sub ' Cattura un'istanza di Word. Se non c'è, creane una nuova. Se non ci riesci, esci...

     With objWord ' "referenzia" l'oggetto Word
         .Documents.Add ' aprine un documento nuovo
         .Visible = True ' rendi Word visibile
     End With
     
    MsgBox "GENERAZIONE DOCUMENTO WORD"
    Dim cell As Range
    For Each cell In Range("ElencoStampe")
      CopyAttempt objWord, Range(cell.Value2)
    Next

    '    CopyAttempt objWord, Range("SCHEMA") 'r1 'nm.RefersToRange  'questo è un range statico
    '    CopyAttempt objWord, Range("Tab_Mat") 'r1 'nm.RefersToRange  'questo è un range statico
    '    CopyAttempt objWord, Range("Tab_Sez") 'r1 'nm.RefersToRange  'questo è un range statico
    '    CopyAttempt objWord, Range("Tab_Nodi") 'r1 'nm.RefersToRange  'questo è un range statico
    '    CopyAttempt objWord, Range("Tab_Aste") 'r1 'nm.RefersToRange  'questo è un range statico
    '    CopyAttempt objWord, Range("Tab_Aste") 'r1 'nm.RefersToRange  'questo è un range statico
       
       For i = 1 To Range("N_Aste").Value
           CopyAttempt objWord, Range("KLoc_" & Format(i, "00")) 'r1 'nm.RefersToRange  'questo è un range statico
           CopyAttempt objWord, Range("KRot_" & Format(i, "00")) 'r1 'nm.RefersToRange  'questo è un range statico
           CopyAttempt objWord, Range("KRigG_" & Format(i, "00")) 'r1 'nm.RefersToRange  'questo è un range statico
       Next
    MsgBox "DOCUMENTO WORD CREATO"
    End Sub


    La tabella denominata "ElencoStampe" è cosi formata:

    SUissnb



    Vorrei poter ciclare le tabelle il cui nome presenta un numeretto accanto, partendo da 1 fino al numero degli elementi indicati in seconda colonna.
    Inoltre penso sia possibile accodare alla dicitirua "figura n .." che poi appare in Word, anche il testo presente in terza colonna

    Infine, per evitare la creazione di altrettanti nomi di range che includano anche le intestazioni (cioè le due o tre o quattro righe che stanno sopra la tabella indicanti di che grandezza si tratta e la sua u.m) come si potrebbe fare ricorrendo ad un ridimensionamento al volo del range e magari per stabilire di quanto off-settare in alto prevedere ulteriore colonna?
  3. .
    Esportare i dati da Telaio3d.xlsm a Word

    Leggendo gli sviluppi del topic "aiuto VBA" mi è venuto in mente la possibilità di poter applicare quelle procedure li descritte anche nel foglio che sto componendo.

    Dopo aver aggiunto un pulsante dedicato, ho quindi fatto la prova con l'esportazione del solo schema e la cosa funziona.

    Ma nel file Telaio3d non vi sono named range col nome semplificato tale da poter mettere in un ciclo e inoltre la maggior parte dei range sono di tipo dinamico e con questi la sub va in errore.

    Ho quindi pensato di mettere in un foglio di servizio l'elenco dei range che voglio esportare in Word e nella sequenza che desidero, magari accompagnata da altra colonna riportante il testo da fare scrivere insieme a "figura n° .... - Schema unifilare".
    Sarebbe quindi possibile esportare una bozza di relazione di calcolo.

    Non riesco però a gestire i named range dinamici.

    Edited by afazio - 17/11/2019, 15:01
  4. .
    CITAZIONE (quattropassi @ 15/11/2019, 10:55) 
    Però... però bisognerebbe trovare un modo per far segnalare che se qualcosa va storto, è perché probabilmente quell'etichetta non è disponibile nel Normal.dot di cui si avvale il WORD dell'utente.

    Come potrei fare l'indagine sulla disponibilità?

    Per l'indagine basta porre un ON ERROR RESUME NEXT nel rigo che precede la chiamata alla funzione di mettere etichetta, se quell'istruzione provoca un errore allora vuol dire che l'etichetta non è disponibile e lo gestisci subito dopo, se invece è disponibile non si manifesta errore e puoi continuare felicemente.

    Se però quella parte di codice è gia pieno di Try di On Error e via dicendo e questo nuovo OERN è di difficile gestione all'interno di esso, allora potresti provare ad indagare esternamente a quel TRY definendo una variabile, per esempio Disponibile as Boolean farla settare a VERO o a FALSO (magari con una funzione dedicata) e utilizzare il valore di questa variabile all'interno della tua sub

    CODICE
    If disponibile then
      .Selection.InsertCaption Label:="Figura", TitleAutoText:="InserisciDidascalia1", Title:="", Position:=wdCaptionPositionBelow, ExcludeLabel:=0
    end if
    codice.
  5. .
    CITAZIONE (quattropassi @ 12/11/2019, 22:37) 
    Lo studierò afazio
    Vediamo se riesco a trasporticchiare il tuo (quanto mi manca!) PickPoints.

    Ricorda che se vuoi interagire con excel devi attivare le relative librerie:

    PYrY7gj
  6. .
    Sistemate le ultime cosette, pubblico la versione attuale:

    Telaio3D-07-6401.rar
  7. .
    Lo schema che ho risolto è il seguente:

    84Bttx0



    Allego la versione in avanzamento.

    unoinpiu
    Vedrai che l'inversione della matrice avviene in un battibaleno mentre per la formazione delle matrici di rigidezza locali e globali e la matrice di rigidezza globale della struttura impiega qualche decina di secondi.

    Gli errori che ho scovato sono stati nella sostanza:
    - un paio di errori nei segni dei termini della matrice di rigidezza locale dell'asta, Questi comportavano la comparsa di quei valori delle reazioni pari a 7 e 3 volte di quelli attesi.
    - errore di impostazione della sub che costruiva le matrici di rigidezza. In sostanza la trasposizione della matrice di rotazione e il doppio prodotto matriciale non produceva i risultati attesi. Questo comportava lo scambio delle posizioni sia delle reazioni e sia degli spostamenti.
    Ho risolto costruendo la matrice di rigidezza globale direttamente sul foglio "aste estese" e quindi copiandola mediante sub nel foglio "RigidezzeAste"
    - errore nell'impostazione delle matrici di rotazione (trasformazione) sia nel caso generale e sia nel caso particolare di asta in verticale.
    Risolto rivendendo l'intero processo e facendo chiarezza sul foglio.

    Edited by afazio - 6/11/2019, 19:53
  8. .
    Da qualche tempo volevo iniziare ad approfondire il concetto di Classe in VBA, ma in verità non avendo stimoli particolari ho sempre rinviato. Proprio qualche settimana fà quando componevo il foglio per le travature reticolari mi era balenata l'idea di ricorrere ad un oggetto "asta" da scrivere però in Lazarus, e poi operando su excel avevo pensato se potevo fare la stessa cosa ricorrendo ad una classe in VBA. Ma l'intenzione era rimasta appesa ad una delle aste del traliccio.

    Quella voce di menu "aggiungi modulo di classe" appare sempre quando si vuole creare un nuovo modulo di codice, ma non la avevo mai scelta.

    Con l'occasione dell'ingresso al bar di Unoinpiù, che ha mostrato conoscenza della questione, ho infine deciso di aprire il presente topic nel quale voglio raccogliere notizie, informazioni tecniche regole e trucchi per creare e manipolare una classe in VBA per Excel.
  9. .
    Prove di disegno di forze su nodi vari in prospettiva

    z9PTW9j



    Il piccolo motore grafico che ho implementato fino ad adesso sembra funzionare. Vedremo quando si tratterà di disegnare la deformata.
  10. .
    CITAZIONE (unoinpiu @ 28/10/2019, 07:56) 
    quale codice stai usando?
    e posta un immagine di come viene e come vorresti che venisse

    unoinpiu Sei diventato una risorsa del bar.
  11. .
    Esplorando NanoCad ho provato ad aprire alcuni miei vecchi file cercando quelli più affollati.
    No Problem.
  12. .
    Nei giorni scorsi volevo aprire un file che mi ha inviato uno studente con lo schema di un esercizio, ma essendo stato creato da una versione più recente, Autocad2008 si è rifiutato di aprirlo.

    Eo5sfe4

    Per riuscire a visualizzare il contenuto dovrei usare qualche viewer Autocad o scaricare il trueConverter. Lo avevo cestinato facendomi inviare una versione del filein formato Autocad 2004.
    Facendo le prove con Nanocad, ho ripreso dal cestino il flie incriminato e l'ho aperto con Nanocad, che non si è rifiutato di aprirlo.

    kUagg6K

    Praticamente per aprire files dwg creati da versioni recenti utilizzando versioni vecchie di Autocad, è necessario ricorrere alla concorrenza.
    Ma questo ha senso?
  13. .
    Come usare excel per ottenere le caratteristiche geometriche di una lamiera grecata?

    Avevo reso pubblico un foglio di calcolo con tutta una serie di algoritmi di tipo geometrico e tra questi c'erano anche le funzioni utili per la determinazione di tutte le caratteristiche geometriche di qualsiasi sezione fornita attraverso le coordinate dei suoi vertici.
    Determinazione area, coordinate del baricentro, momenti statici rispetto agli assi coordinati, momenti di inerzia rispetto agli assi coordinati, momenti principali, giratori d'inerzia, ellisse principale di inerzia, nocciolo centrale.

    Da quel foglio abbastanza affollato ho poi estratto solo quella parte relativa esclusivamente al calcolo delle caratteristiche geometriche di una sezione.

    Inserendovi le coordinate dei vertici della lamiera grecata prodotta da Marcegaglia e denominata EGB 1200-8, ottengo quanto segue:

    cE70nnc

    La sezione è stata ottenuta disegnando in autocad la polilinea relativa al profilo, quindi offsettandola dello spessore di 0.8 mm e leggendo le coordinate dei vertici mediante altro mio programma. Quindi le coordinate sono state salvate in excel e riportate sul foglio per il calcolo delle caratteristiche.

    Mi sono chiesto quindi, se con questa procedura avevo per caso commesso qualche errore ottenendo valori diversi da quelli riportate nella scheda tecnica.
    In effetti cosi facendo si commettono svariati svarioni, afferibili a:
    - considerando il piccolo spessore, il ripasso con una polilinea in autocad della forma importata non può essere preciso:
    - non si conosce se quella polilinea rappresenta l'insiene dei punti medi dello spessore e pertanto non si sà se offsettare da un lato o dall'altro o metà e metà.

    Ma vediamo cosa riporta la scheda tecnica relativa alla lamiera grecata EGB1200-8:

    u736o9m

    Qui c'è da dire che nella scheda sono riportati i valori riferiti ad un metro di lamiera, quindi dovremmo dividere perla lunghezza del singolo modulo (pari a 570 mm) quelli del mio foglio. Cosi facendo e riportando poi alle stesse unità di misura, i risultati del mio foglio si avvicinano a quelli della scheda, ma non risultano essere uguali.

    Per esempio considerando l'area:
    il mio foglio calcola una are pari a:
    A=829 mm²
    che diviso per 0.57 fornisce una area pari a
    A=1454 mm²/m -> A=14.54 cm²/m

    La scheda invece riporta una area pari a:
    A=16.68 cm²/m
    Quest'ultima però tiene conto dell'area dei tondini da 8 mm disposti in ogni nervatura, cioè di A=0.5*3/0.57 =2.63 cm²/m

    Sommando l'area dei tondini all'area determinata col foglio di calcolo si ottiene

    Foglio di calcolo:
    A=14.54+2.63=17.17 cm²/m
    Scheda:
    A= 16.68 cm²/m

    Un po più complicato risulta il confronto tra le inerzie o tra i moduli resistenti, che tralascio.

    Conclusione:
    Occorre porre molta attenzione nel cercare di ricavare le caratteristiche geometriche della lamiera col la tecnica del ripasso con polilinea del contorno della sezione.

    Ho anche provato a far calcolare le caratteristiche attraverso altro mio programmino in autocad: ecco il risultato:

    Edited by afazio - 27/9/2019, 12:51
  14. .
    Allego il file in formato word con raccolti tutti i messaggi del topic.

    Semplice Telaio 2D in Excel
  15. .
    Ecco invece lo schema delle aste:
260 replies since 29/6/2012
.