Newsgroup: it.discussioni.ingegneria.civile
Titolo: Aiutino per completare il mio codice (Warning: msg lunghetto)...

Ragazzi vi chiedo un aiuto per sviluppare un codicino semplice semplice
che mi aiuti nel mio lavoro di tesi.
IO HO UN BEL DWG CON UNA SERIE DI LINEE, POLILINEE E POLIGONI/REGIONI
(O SEMPLICEMENTE POLILINEE CHIUSE) E MI PIACEREBBE ASSEGNARE AD ESSE UN
NOME ED ESPORTARNE LE CARATTERISTICHE PRINCIPALI come LUNGHEZZA (ok),
PERIMETRO, AREA...
Fin oggi ho stressato un po' di amici nel ng e mi hanno dato delle
dritte fenomenali ma ora cerco un supporto finale per concludere il mio
progettino e lasciar rilassare Nobody, Claudio & C (1000 grazie). Sono
proprio duro di testa! Non riesco a mettere insieme tante belle Sub
perchè ho dimenticato tutto del VB e, sotto AutoCAD, sembra non
volermi ascoltare...
Fin ora riesco a:
- SELEZIONARE CIO' CHE VOGLIO NOMINARE
                        On Error Resume Next
                       ThisDrawing.SelectionSets.Item("NewSet").Delete
                        Set Selezione =
ThisDrawing.SelectionSets.Add("NewSet")
                        Selezione.SelectOnScreen
- DARE UN NOME ALLE ENTITA' SELEZIONATE (forse qui dovrei investigare
se l'entità in analisi è una polilinea, linea o area ed assegnare un
xData con questa info)
                        For Each Entità In Selezione
                        If Entità.EntityType = acPolylineLight Or
Entità.EntityType = acLine Then
                        Colore = Entità.color
                        Entità.Update
                        Testo = InputBox("Nome Sezione?")
                        DataType(0) = 1001
                        data(0) = "SEZ"
                        DataType(1) = 1000
                        data(1) = Testo
                        Call Entità.SetXData(DataType, data)
                        Entità.color = Colore
                        Entità.Update
                        End If
                        Next Entità
- ORA DEVO CERCAR DI ESPORTARE IN UN TXT UNA TABELLA DEL TIPO:
Print #1, "Entità     |     NOME     |     LUNGHEZZA     |
AREA     |     ALTRO"DOVE ENTITA' MI DICE SE è LINEA, POLILINEA, AREA
OD ALTRO
NOME è QUELLO CHE HO INSERITO IO PRIMA OD ALTRIMENTI ANONIMO MA MI
SCONTRO CON PROBLEMI DI DICHIARAZIONI DELLE VARIABILI (DIM, PRIVATE O
PUBLIC. DENTRO O FUORI DALLA SUB...) PERCHè NON RIESCO A PASSARE E
RITROVARE TUTTI GLI ATTRIBUTI DI OGNI SINGOLA ENTITA':
FIN ORA IL CODICE DICE:
                        seleziona le entità da analizzare
                        For Each ent In SsSet
                        Print #2, RecuperaXData(ent, 1) & ";" &
Format(ent.Length, "0.0000")
                        Next ent
                        Close #2
                        End Sub
                        Public Function RecuperaXData(sez As Object, i
As Integer) As String
                        Call sez.GetXData("", DataType, data)
                        RecuperaXData = data(i)
                        End Function
MA SE VOLESSI UNIRE LA SUB E LA FUNCTION SOPRA COSA DEVO FARE CON LE
MIE VARIABILI? E PER CHIEDERE AREA, PERIMETRO E NOME? IO PENSAVO
(sempre troppo) DI FARE QUALCOSA TIPO:
                        For Each Entità In Selezione
                        call entità.getxdata(A,B,C)
                        Info1 = A
                        Info2 = DataType(0)
                        Info3 = DataValue(B)
                        Info4 = data(0)
                        Info5 = data(1)
                        Lungh = Entità.Length
                        Print #1, Info1 &";"& Info2 & ";" Lungh &....&
Info5
                        Next Entità
                        Close #1
End Sub
MA NON GIRA E NON MI COMPLETA LA TABELLA SOPRA! CHE SBAGLIO? SE NON VI
SIETE ANCOR STANCATI DI LEGGERE QUESTO PAPIRO, VI RINGRAZIO. AVETE GIA'
FATTO TANTO. SE VOLETE DARMI UNA MANO PER CONTINUARE QUESTA IMPRESA,
SON DISPOSTO A TUTTO...NON PENSIATE CHA DALL'UNIVERSITA' NON POSSANO
USCIRE INFO INTERESSANTI (FORTRAN, RINGRAZIAMENTI IN TESI, PIZZE....)
SCHERZI A PARTE VE NE SAREI GRATISSIMO...
P.S. SPERO POSSA ESSERE UTILE ANCHE AD ALTRI!!!!
SE SIETE CURIOSI/INTERESSATI AD ALTRI STRALCI DI CODICE SCRIVETEMI IN
MAIL CHE VI SPEDISCO LA MIA INTERA BANCA DATI... PER ESEMPIO MI
PIACEREBBE FARE UNA SUB CHE MI RESTITUISCA IL NOME DELLA SEZIONE SE CI
CLICCO SOPRA, OPPURE UNA SUB CHE SCRIVA IN UNA CASELLA DI TESTO VICINA
ALL'ENTITà IL SUO NOME (e/o le altre info)... insomma tutte le idee
per interagire con la testa del mio professore sono ben accette...
CIAO A TUTTI
GRAZIE A TUTTI
ROBERTO

 P.S. SPERO POSSA ESSERE UTILE ANCHE AD ALTRI!!!!
Può darsi, però nulla impedisce a chi è interessato di fare queste 
discussioni su news:it.comp.software.cad
Se scrivi nel newsgroup giusto tu hai più probabilità di trovare 
interlocutori, e gli altri frequentatori non subiscono l'OT (significa 
off topic, ossia non inerente l'argomento del newsgroup così come 
definito dai partecipanti all'interno del manifesto)
Inoltre non si scrive tutto in maiuscolo, ameno che uno non voglia far 
intendere di voler alzare la voce.
-- 
Ciao, DOCstone

Perdonate la mia invasione... è già la seconda volta che sconfino qui
senza capir che nessuno risponde perchè sono completamente fuori tema.
Susate ma son ancora nuovo di ng!
DOCstone ha scritto:


 End Sub
???? non è chiaro cosa vuoi fare con questa funzione....
entità.getxdata(A,B,C)???
-- 
Ciao, Nobody
[cit.]...Le strutture non cadono mai,
ma quando cadono fanno un gran casino!
mail:   indirizzomail Toglimi chiocciola gmail punto com

 intendere di voler alzare la voce.
Quoto


calcolo strutturale.
Io non utilizzo Autocad perché costava (ma credo che costa tuttora)
troppo, ma utilizzo DesignCAD dal 1992 (costa meno di 100 dollari e lo
trovavo allora meglio di Autocad) che grazie al suo linguaggio
BasicCAD ho automatizzato quasi ogni aspetto del disegno tecnico e
strutturale collegandolo con FElt (il FEM freeware ed open source). E'
ormai *l'unico programmi* che mi tenga legato a Windows.
Volevo solo confermare il fatto che grazie a questi linguaggi di
estensione è possibile trasformare il CAD da strumento di disegno a
quello di progettazione, compresa quella strutturale.
jk

 1,3,5.... per il valore
Ed io come faccio a gestire questa cosa? ("scrivo piccolo ma stò
urlando con VBa")
Mi fa impazzire perchè a me piacerebbe semplicemente avere un bel
vettore ricco delle mie info da attaccare alla mia entità MA
probabilmete, come dici tu, Setto male questi xData:
Io vorrei:
Ancor prima di inserire i dati leggere gli xData già eventualmente
presenti da una precedente analisi così da aggiornare le caselle di un
form che mi chiede di rinominare le entità! questo è anche un
controllo (oltre al file in uscita) x vedere se ogni entità ha
veramente i suoi xdata! [N.B. come si fanno a cancellare gli xData da
una entità?]
Io scrivo dunque all'inizio del codice:
     For each Entità In Selezione
     Call Entità.GetXData("", DataTypeOut, DataOut)
     if VarType(DataOut) = 0 Then
        interfaccia.txtnome.text = "anonima"
        interfaccia.txtcanale.text = "nessuno"
     else
        interfaccia.txtnome.text = DataOut(1)
        interfaccia.txtcanale.text = dataOut(2)
     end if
Poi acdendo il form e chiedo all'utente di riaggiornare (se necessario)
il nome delle entità.
ORA FINALMENTE HO IL NOME NUOVO E DOVREI INSERIRLO NEGLI XDATA MA
SECONDO ME SBAGLIO QUALCOSA. Faccio:
     select case entità.entitytype
        case "24"
           datatype(0) =1001: data(0) = "polilinea"
        case "19"
           datatype(0) =1001: data(0) = "linea"
     end select
     DataType(1) = 1000: data(1) = interfaccia.txtnome.text
     DataType(2) = 1000: data(2) = interfaccia.txtcanale.text
     CALL ENTITA'.SETXDATA(DATATYPE, DATA)
next entità
- Uffa, cosa stò sbagliando ancora?
- Dove e come devo definire le variabili DataType, Data, DataTypeOut,
DataOut? (private, public, nella sub, fuori dalla sub sotto option
explicit?)
- Che significato hanno quei numerini 1001, 1000? Se io voglio inserire
una seconda (tstcanale) proprietà devo riinserirlo in 1000 o devo
chiamarla in altro modo?
Insomma sembra impossibile ma non mi funziona ancor niente...
Ciao a tutti Roberto

>
Sinceramente non l'ho capito al 100% neanche io...sull'Help sembrerebbe
dall'esempio che serva per assegnare il tipo di attributo 1000 e 1001
per le stringhe, le altre per i numerici etc....ma non è spiegato in
modo molto chiaro....ma non so perché se metto due volte il 1000 va in
errore....boh!
Ti allego un programma molto semplice è necessario creare un form con
due pulsanti e due caselle di testo, uno che assegna le proprietà e un
altro che legge la proprietà cercata....un programma senza molte
pretese......e anche un po' capriccioso....la selezione al primo avvio
va in errore, basta ignorare e andare avanti....
(se trappi l'errore di Selezione.SelectOnScreen con on error resume next
il programma non funziona...comunque non ho perso troppo tempo..anzi se
riesci a risolvere il problema fammi sapere.....)
Private Sub CommandButton1_Click()
             Call SetXData(TextBox1.Text, TextBox2.Text)
End Sub
Private Sub CommandButton2_Click()
Dim strAtrributo As String
         Call GetXData(TextBox1.Text, strAtrributo)
         TextBox2.Text = strAtrributo
End Sub
' passa il nome dell'attributo e ritorna per RIFERIMENTO il valore
dell'attributo cercato
Public Sub GetXData(ByVal Nome As String, _
                     ByRef Attributo As String)
Dim Selezione As AcadSelectionSet
Dim objItem As AcadEntity
Dim xdataOut As Variant
Dim xtypeOut As Variant
Dim intLI As Integer
     On Error Resume Next
     ThisDrawing.SelectionSets.Item("NewSet").Delete
     Set Selezione = ThisDrawing.SelectionSets.Add("NewSet")
     On Error GoTo 0
     Selezione.SelectOnScreen
     If Selezione.Count > 0 Then
         Set objItem = Selezione.Item(0)
         Call objItem.GetXData("", xtypeOut, xdataOut)
         Attributo = vbNullString
         If Not IsEmpty(xdataOut) Then
         For intLI = 0 To UBound(xdataOut) Step 2
             If Nome = xdataOut(intLI) Then
                Attributo = xdataOut(intLI + 1)
                Exit For
             End If
         Next
         End If
     End If
End Sub
Public Sub SetXData(ByRef Nome As String, _
                    ByRef Attributo As String)
Dim Selezione As AcadSelectionSet
Dim objItem As AcadEntity
Dim DataType(0 To 1) As Integer
Dim Data(0 To 1) As Variant
      Application.Visible = acTrue
      DoEvents
     On Error Resume Next
     ThisDrawing.SelectionSets.Item("NewSet").Delete
     Set Selezione = ThisDrawing.SelectionSets.Add("NewSet")
     On Error GoTo 0
     Selezione.SelectOnScreen
     For Each objItem In Selezione
         If objItem.EntityType = acPolylineLight Or _
             objItem.EntityType = acLine Then
             With objItem
                 DataType(0) = 1001
                 DataType(1) = 1000
                 Data(0) = Nome
                 Data(1) = Attributo
                 Call objItem.SetXData(DataType, Data)
                 .Update
             End With
         End If
     Next
End Sub


Nobody ha scritto:
