Aggiungere Attributi a dei blocchi

Principiante87

Utente poco attivo
professione: studente
software: AutoCAD 2011
regione: Toscana
Ciao a tutti!
Sto continuando la mia tesi inerente la personalizzazione di Autocad.. Grand parte del lavoro è già stato svolto, ma con espedienti che hanno poco a che fare con Autocad.. ho fatto cioè ricorso alle mie capacità di programmazione più banali. Sono, a questo punto, a porvi un quesito.
Dovrei aggiungere degli attributi a dei blocchi, nel caso questi ne siano privi.. il codice che ho scritto per l'estrapolazione degli attributi esistenti, è il seguente (e per ora funziona :) ) :

Dim u As AcadBlockReference
Dim p As String
Dim myAttrRef As AutoCAD.AcadAttributeReference
For Each u In ThisDrawing.Blocks(0)
With u
i = 0
c = u.Name
If u.HasAttributes Then
x = (u.GetAttributes())
Set myAttrRef = x(i)
p = p & " " & myAttrRef.TextString
i = i + 1
End If
End With
Next u

Dovrei adesso procedere con la seguente logica: se u.hasattribute= false, allora aggiungi un attributo (che è una stringa) a quel blocco. Qualcuno saprebbe aiutarmi? Grazie mille in anticipo a tutti!
 

RICVBA

Utente Junior
professione: Ingegnere
software: Autocad
regione: Emilia Romagna
Ciao a tutti!
Sto continuando la mia tesi inerente la personalizzazione di Autocad.. Grand parte del lavoro è già stato svolto, ma con espedienti che hanno poco a che fare con Autocad.. ho fatto cioè ricorso alle mie capacità di programmazione più banali. Sono, a questo punto, a porvi un quesito.
Dovrei aggiungere degli attributi a dei blocchi, nel caso questi ne siano privi.. il codice che ho scritto per l'estrapolazione degli attributi esistenti, è il seguente (e per ora funziona :) ) :

Dim u As AcadBlockReference
Dim p As String
Dim myAttrRef As AutoCAD.AcadAttributeReference
For Each u In ThisDrawing.Blocks(0)
With u
i = 0
c = u.Name
If u.HasAttributes Then
x = (u.GetAttributes())
Set myAttrRef = x(i)
p = p & " " & myAttrRef.TextString
i = i + 1
End If
End With
Next u

Dovrei adesso procedere con la seguente logica: se u.hasattribute= false, allora aggiungi un attributo (che è una stringa) a quel blocco. Qualcuno saprebbe aiutarmi? Grazie mille in anticipo a tutti!


usa il metodo AddAttribute
sull'help Autocad c'è qs esempio

Sub Example_AddAttribute()
' This example creates an attribute definition in model space.

Dim attributeObj As AcadAttribute
Dim height As Double
Dim mode As Long
Dim prompt As String
Dim insertionPoint(0 To 2) As Double
Dim tag As String
Dim value As String

' Define the attribute definition
height = 1#
mode = acAttributeModeVerify
prompt = "New Prompt"
insertionPoint(0) = 5#: insertionPoint(1) = 5#: insertionPoint(2) = 0
tag = "NEW_TAG"
value = "New Value"
' Create the attribute definition object in model space
Set attributeObj = ThisDrawing.ModelSpace.AddAttribute(height, mode, prompt, insertionPoint, tag, value)
ZoomAll

End Sub

una domanda: nel tuo esempio tu indaghi/agisci sugli attributi di tutti i riferimenti di blocco del solo 1° blocco ("item(0)"). è quello che vuoi? diversamente devi inserire un ciclo esterno su tutti i blocchi (e conseguente dichiarazione di variabile AcadBlock)

nota: probabilmente il tuo codice è solo una bozza ma ti segnalo:
- usi "with u" ma poi continui ad usare "u" nei successivi riferimenti dentro il with
- il ciclo sulla "i" non è un vero ciclo, per cui alla fine indaghi il solo primo attributo (i=0) per ogni riferimento di blocco "u"
-
- imposti il valore di "c" senza averlo dichiarato nè poi utilizzato
- manca la dichiarazione di "x" e di "i"
di seguito un esempio di come lo imposterei

Dim u As AcadBlockReference
Dim p As String
Dim c As String ' aggiunto
'Dim myAttrRef As AutoCAD.AcadAttributeReference ' non "sprecherei una variabile, visto che lo usi solo una volta
Dim x As Variant ' aggiunto
Dim i As Integer

For Each u In ThisDrawing.blocks(0)
With u
If .HasAttributes Then
x = .GetAttributes
For i = LBound(x) To UBound(x)
c = .name ' ma dove la usi?

' non userei una variabile myAttrRef apposta
' se devi richiamere/usare più volte l'attributo x(i) usa un "with x(i)"
' Set myAttrRef = x(i)
' p = p & " " & myAttrRef.TextString
p = p & " " & x(i).TextString
i = i + 1
Next i
End If
End With
Next u

come debug è ok. ma non l'ho fatto girare!
ciao
 

Principiante87

Utente poco attivo
professione: studente
software: AutoCAD 2011
regione: Toscana
usa il metodo AddAttribute
sull'help Autocad c'è qs esempio

Sub Example_AddAttribute()
' This example creates an attribute definition in model space.

Dim attributeObj As AcadAttribute
Dim height As Double
Dim mode As Long
Dim prompt As String
Dim insertionPoint(0 To 2) As Double
Dim tag As String
Dim value As String

' Define the attribute definition
height = 1#
mode = acAttributeModeVerify
prompt = "New Prompt"
insertionPoint(0) = 5#: insertionPoint(1) = 5#: insertionPoint(2) = 0
tag = "NEW_TAG"
value = "New Value"
' Create the attribute definition object in model space
Set attributeObj = ThisDrawing.ModelSpace.AddAttribute(height, mode, prompt, insertionPoint, tag, value)
ZoomAll

End Sub

una domanda: nel tuo esempio tu indaghi/agisci sugli attributi di tutti i riferimenti di blocco del solo 1° blocco ("item(0)"). è quello che vuoi? diversamente devi inserire un ciclo esterno su tutti i blocchi (e conseguente dichiarazione di variabile AcadBlock)

nota: probabilmente il tuo codice è solo una bozza ma ti segnalo:
- usi "with u" ma poi continui ad usare "u" nei successivi riferimenti dentro il with
- il ciclo sulla "i" non è un vero ciclo, per cui alla fine indaghi il solo primo attributo (i=0) per ogni riferimento di blocco "u"
-
- imposti il valore di "c" senza averlo dichiarato nè poi utilizzato
- manca la dichiarazione di "x" e di "i"
di seguito un esempio di come lo imposterei

Dim u As AcadBlockReference
Dim p As String
Dim c As String ' aggiunto
'Dim myAttrRef As AutoCAD.AcadAttributeReference ' non "sprecherei una variabile, visto che lo usi solo una volta
Dim x As Variant ' aggiunto
Dim i As Integer

For Each u In ThisDrawing.blocks(0)
With u
If .HasAttributes Then
x = .GetAttributes
For i = LBound(x) To UBound(x)
c = .name ' ma dove la usi?

' non userei una variabile myAttrRef apposta
' se devi richiamere/usare più volte l'attributo x(i) usa un "with x(i)"
' Set myAttrRef = x(i)
' p = p & " " & myAttrRef.TextString
p = p & " " & x(i).TextString
i = i + 1
Next i
End If
End With
Next u

come debug è ok. ma non l'ho fatto girare!
ciao

Innanzitutto Grazie, sei stato molto gentile! :) Le var x e c erano state dichiarate, ma mi ero dimenticata di copiare quelle due righe di codice, comunque grazie per le dritte! Proverò subito ad implementare quanto mi hai consigliato.. Ho solo un dubbio, riesco con un else al codice precedente (ovvero se u.hasattribute non è definito) ad aggiungere un attributo proprio a quel blocco? Perchè ieri ho fatto diversi tentativi: l'estrazione di attributi dai blocchi che li posseggono, funziona, ma l'attribuzione ai blocchi che non hanno attributi assegnati no.. Non so se mi sono spiegata bene.. in ogni caso grazie ancora!
 

RICVBA

Utente Junior
professione: Ingegnere
software: Autocad
regione: Emilia Romagna
Innanzitutto Grazie, sei stato molto gentile! :) Le var x e c erano state dichiarate, ma mi ero dimenticata di copiare quelle due righe di codice, comunque grazie per le dritte! Proverò subito ad implementare quanto mi hai consigliato.. Ho solo un dubbio, riesco con un else al codice precedente (ovvero se u.hasattribute non è definito) ad aggiungere un attributo proprio a quel blocco? Perchè ieri ho fatto diversi tentativi: l'estrazione di attributi dai blocchi che li posseggono, funziona, ma l'attribuzione ai blocchi che non hanno attributi assegnati no.. Non so se mi sono spiegata bene.. in ogni caso grazie ancora!

prova così


Dim u As AcadBlockReference
Dim p As String
Dim c As String ' aggiunto
'Dim myAttrRef As AutoCAD.AcadAttributeReference ' non "sprecherei una variabile, visto che lo usi solo una volta
Dim myAttrRef As AutoCAD.AcadAttributeReference
Dim x As Variant ' aggiunto
Dim i As Integer

Dim Height As Double
Dim prompt As String, Tag As String, Value As String
Dim mode As Integer
Dim insertionPoint(0 To 2) As Double

For Each u In ThisDrawing.blocks(0)
With u
If .HasAttributes Then
x = .GetAttributes
For i = LBound(x) To UBound(x)
c = .name ' ma dove la usi?

' non userei una variabile myAttrRef apposta
' se devi richiamere/usare più volte l'attributo x(i) usa un "with x(i)"
' Set myAttrRef = x(i)
' p = p & " " & myAttrRef.TextString
p = p & " " & x(i).TextString
i = i + 1
Next i

Else

' Define the attribute definition
Height = 1# ' vedi tu che dimensioni ti servono , se ti servono
mode = acAttributeModeInvisible ' vedi tu qual'è il modo che fa al caso tuo (vedi help)
prompt = "New Prompt" ' vedi tu cosa ti serve. nota: se metti mode=acAttributeModeConstant, il prompt è disabilitato
insertionPoint(0) = 5#: insertionPoint(1) = 5#: insertionPoint(2) = 0 ' vedi tu come definirlo, magari usando le coordinate di uno dei vertici che ottieni da "boundingbox" o altro

Tag = "NEW_TAG"
Value = "New Value"

Set myAttrRef = .AddAttribute(Height, acAttributeModeInvisible, prompt, insertionPoint, Tag, Value)

End If
End With
Next u

End Sub


al solito, come compilazione funziona, ma di qui in avanti devi sbatterci la testa tu per ottenere il funzionamento che vuoi.
l'Help in linea di Autocad VBA è un buon riferimento. ma la mia esperienza è che spesso devi provare e riprovare per scoprire come realmente funziona un comando o altro. e spesos scopri che certe cose funzionano in modo controintuitivo. a volte scopri anche che non c'è modo di fare una cosa. il fatto che Autocad abbia abbandonato lo sviluppo del VBA è un fatto da tenere sempre presenete
 

Statistiche forum

Discussioni
59,343
Messaggi
506,802
Utenti registrati
111,663
Ultimo utente registrato
GEOSCAN

Utenti online

Nessun utente è online al momento.
Top