Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Esportare info della lunghezza di una linea da Autocad

321 views
Skip to first unread message

roberto

unread,
May 23, 2006, 12:28:04 PM5/23/06
to
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à).
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...
Insomma sono disperato
Qualcuno mi aiuti, please

Arch Stenton

unread,
May 24, 2006, 1:24:43 PM5/24/06
to
In data 23 May 2006 09:28:04 -0700, roberto ha scritto:

> 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

roberto

unread,
May 24, 2006, 1:48:15 PM5/24/06
to
sono arrivato al punto di utilizzare Visual Basic come macro

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

Arch Stenton

unread,
May 24, 2006, 3:52:44 PM5/24/06
to
In data 24 May 2006 10:48:15 -0700, roberto ha scritto:

> 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

Roberto

unread,
May 25, 2006, 3:35:41 AM5/25/06
to
I colori son ben tanti ma come faccio a determinare un ordine delle mie
linee (sezioni) assegnando loro un colore? 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...

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

Arch Stenton

unread,
May 25, 2006, 1:30:11 PM5/25/06
to
In data 25 May 2006 00:35:41 -0700, Roberto ha scritto:

> 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

Roberto

unread,
May 25, 2006, 3:24:49 PM5/25/06
to
Il disegno è un bel "casino" anche se questo è solo di prova... se
non stresso troppo te lo mando!!!
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!
Es: l'utente crea o seleziona una linea e il codice gli chiede di un
nome... poi il codice chiede seleziona/crea un'altra linea... poi
inserire il nome... e avanti così...
poi esporto un file con nome e larghezza...
vediamo
ormai domani ora scappo dall'ufficio
ciao e buona serata
grazie

Arch Stenton

unread,
May 25, 2006, 6:08:59 PM5/25/06
to
In data 25 May 2006 12:24:49 -0700, Roberto ha scritto:

> 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

Roberto

unread,
May 29, 2006, 4:34:26 AM5/29/06
to
Ciao. Ti è arrivato il malloppo?

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

0 new messages