> Sono disperato! Ho diverse tavole dwg con la stessa esigenza/problema:
> ho disegnato gli argini di un fiume digitalizzando una mappa catastale
> ed ora devo fare delle analisi su delle sezioni che ho tracciato ogni
> tot metri. Sarebbe bello poter esportare in un qualsiasi file di testo,
> word, excel... anche mal formattato, 2 informazioni: ID della linea (o
> polyline) e SOPRATTUTTO lunghezza!
> Sembra impossibile non riuscirci (e non col comando list che esporta
> linee con un ordine casuale) visto che autocad calcola già la
> lunghezza delle singole polyline (vedi proprietà dell'entità).
Perche' non salvi in DXF? Il formato DXF (non binario) e' piuttosto
semplice da leggere: potresti farlo con una routine di VB (al limite VBA) o
anche con un programmino di poghe righe in C.
> Ho provato ad importare le entità da un'altro programma (ma preferivo
> fare tutto in autocad) e le mie linee me le considera come blocchi!
> Bene così tutti gli attributi delle singole linee sono esportabili
> come tabella: oro MA come faccio se voglio farlo direttamente in mondo
> Autocad... se io trasformo una linea in blocco mi perde l'informazione
> della lunghezza e non posso più associare questa info al tag chiamato
> da me lunghezza...
Non mi e' chiaro questo punto... A te non interessa solo estrarre ID e
lunghezza di ogni linea? Perche' devi continuare a lavorare nel "mondo"
autocad?
--
Arch Stenton
ecco:
Sub prova()
Dim i As Integer
Dim Lunghezza As Double
Open "c:\prova.txt" For Output As #1
For i = 0 To ThisDrawing.ModelSpace.Count - 1
With ThisDrawing.ModelSpace(i)
If .ObjectName = "AcDbLine" Then
Lunghezza = .Length
Print #1, Format(Lunghezza, "0.0000")
End If
End With
Next
Close #1
End Sub
Questo mi esporta tutte le lunghezze delle linee e delle polilinee (se
objectname = "AcDbPolyline") del mio disegno...
Occhio: mi ha fatto penare non poco VB perchè ho scoperto ora che è
case sensitive (VB not equal vb)
Ora però:
come faccio a stabilire un ordine di lettura delle mie polilinee?
Cioè, se io ho un fiume ricco di sezioni consecutive dall'alto al
basso queso codice funziona, ma se il fiume biforca ed autocad si trova
con dule linee sulla stessa riga, come facico? Si può assegnare un ID
o ANCOR MEGLIO UN ATTRIBUTO (come per i blocchi) alle singole linee o
polylinee? Questo sarebbe il massimo così potrei esportare in un file
txt 2 colonne: 1.) Sezione nr°. 2.) Larghezza
Tutto questo è utopia?
Siete stati di grandissimo aiuto comunque
grazie
roberto
> sono arrivato al punto di utilizzare Visual Basic come macro
> [CUT]
> Questo mi esporta tutte le lunghezze delle linee e delle polilinee (se
> objectname = "AcDbPolyline") del mio disegno...
> Occhio: mi ha fatto penare non poco VB perchč ho scoperto ora che č
> case sensitive (VB not equal vb)
Io sono rimasto alle versioni che NON lo erano!
> Ora perň:
> come faccio a stabilire un ordine di lettura delle mie polilinee?
> Cioč, se io ho un fiume ricco di sezioni consecutive dall'alto al
> basso queso codice funziona, ma se il fiume biforca ed autocad si trova
> con dule linee sulla stessa riga, come facico? Si puň assegnare un ID
> o ANCOR MEGLIO UN ATTRIBUTO (come per i blocchi) alle singole linee o
> polylinee? Questo sarebbe il massimo cosě potrei esportare in un file
> txt 2 colonne: 1.) Sezione nr°. 2.) Larghezza
>
> Tutto questo č utopia?
Usare il colore? O non hai abbastanza colori? I layer? Ci penso un po'...
--
Arch Stenton
DOVREI RIUSCIRE, IN FASE DI DISEGNO, appena digitalizzata la mia
sezione (linea o polilinea che sia dalla ortofoto) A DARLE UN NOME TIPO
S1, S2, S3... così poi in VB potrei estrarre il nome nella prima
colonna e la lunghezza nella seconda... ma qui si ritorna al discorso
che l'utente deve inserire degli attributi alla linea nel dwg MA penso
non si possa per le singole entità (solo x blocchi)...
Grazie comunque del suggerimento Arch
Aspetto fiducioso una tua risposta
ciao roberto
> I colori son ben tanti ma come faccio a determinare un ordine delle mie
> linee (sezioni) assegnando loro un colore?
In che senso? Cioe' come dire verde=1 giallo=2 etc? Non puoi usare il
codice esadecimale del colore, in VB?
> Forse con i layer: metto la
> linea che determina la sez.1 sul layer 1, quella che det. la sez 2 sul
> layer 2... e così via; ma sembra un lavoraccio...
Certo da fare ora si'!
> DOVREI RIUSCIRE, IN FASE DI DISEGNO, appena digitalizzata la mia
> sezione (linea o polilinea che sia dalla ortofoto) A DARLE UN NOME TIPO
> S1, S2, S3... così poi in VB potrei estrarre il nome nella prima
> colonna e la lunghezza nella seconda... ma qui si ritorna al discorso
> che l'utente deve inserire degli attributi alla linea nel dwg MA penso
> non si possa per le singole entità (solo x blocchi)...
Non ricordo e non ho un AutoCAD sotto mano per verificare. Certo potresti
creare un blocco per ogni linea (che porcata!). Se vuoi che l'utente NON
debba inserire manualmente un ID o qualcosa di simile (ma e' un'operazione
che dovrai ripetere di frequente?), non riesci a stabilire (sempre con VB)
un legame tra posizione della linea e sezione cui appartiene (non ho ben
chiaro come e' fatto il disegno)?
--
Arch Stenton
> Il disegno è un bel "casino" anche se questo è solo di prova... se
> non stresso troppo te lo mando!!!
Ok... non prometto nulla! Despamma la mail...
> Dicevo, sia per i colori che per i layer, che sono buone idee ma non so
> bene come metterle in pratica in VB! Non so neppure come posso fare per
> interagire con l'utente man mano che seleziona o crea il disegno!
Non mi e' chiaro: il lavoro che devi fare e' su un solo disegno una tantum
o devi automatizzare una procedura frequente? Se il caso fosse il primo,
non conviene penare piu' di tanto. E in secondo luogo: perche' preferisci
l'interazione diretta dell'utente durante la creazione delle linee? Non e'
piu' semplice disegnare in maniera tale che poi la tua procedura VB
riconosca le sezioni corrette?
--
Arch Stenton
Nel we ho allargato un pochino il mio VB! Eccolo:
-------------------------------------------------------------------------------------------------------
Sub Sezioni()
Dim i As Integer
Dim j As Integer
Dim kp As Integer
Dim kl As Integer
Dim Lunghezza As Double
Open "C:\Documents and Settings\All Users\Desktop\Output.txt" For
Output As #1
For i = 0 To ThisDrawing.ModelSpace.Count - 1
With ThisDrawing.ModelSpace(i)
If .ObjectName = "AcDbPolyline" And .Layer = "Selezione" Then
Lunghezza = .Length
kp = kp + 1
Print #1, "Polilinea_" & kp & " " & Format(Lunghezza,
"0.0000")
End If
If .ObjectName = "AcDbLine" And .Layer = "Selezione" Then
Lunghezza = .Length
kl = kl + 1
Print #1, "Linea_" & kl & " " & Format(Lunghezza,
"0.0000")
End If
End With
Next
Close #1
End Sub
'Note:
'CICLO CHE CALCOLA LE LUNGHEZZE PARTENDO DAI PUNTI:
'Dim X1 As Double
'Dim Y1 As Double
'Dim X2 As Double
'Dim Y2 As Double
'Dim Var As Variant
'Dim tratto As Double
'Var = .Coordinates
'Lunghezza = 0
'For j = 0 To UBound(Var) - 2 Step 2
' X1 = Var(j)
' Y1 = Var(j + 1)
' X2 = Var(j + 2)
' Y2 = Var(j + 3)
' tratto = Sqr((X1 - X2) ^ 2 + (Y2 - Y1) ^ 2)
' Lunghezza = Lunghezza + tratto
'Next
-----------------------------------------------------------------------------------------------------------
L'unico svantaggio adesso che mi porto dietro con VB è che non riesco
ad interagire con l'utente in modo semplice come autolisp (anche se non
vorrei mai tornare indietro... quel codice proprio non lo capsco...).
SECONDO TE SI RIESCE (e qui avrei concluso il mio operato) a far un
ciclo che chieda all'utente di cliccare su una linea/polilinea e poi di
asseganre a
quella entità un nome sulla proprietà .Hyperlinks (od altro). Tutto
ciò
perchè sarebbe più veloce piottosto che farlo (linea per linea) da
CAD visto
che bisogna dargli anche un "falso" riferimento ipertestuale (ma a me
interessa solo la descrizione)... è un pò una "porcata" ma mi sa che
è l'unico metodo per assegnare un nome/attributo ad una
linea/polilinea e sembrerebbe funzionare ad Hoc... devo solo renderlo
più veloce ed iterattivo con l'utente...e magari riuscire ad inserirlo
nel codice VBa...
Intanto super grazie e buon lavoro
roberto