Newsgroup: it.discussioni.ingegneria
Titolo: Esportare info della lunghezza di una linea da Autocad

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

 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

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

 Tutto questo č utopia?
Usare il colore? O non hai abbastanza colori? I layer? Ci penso un po'...
-- 
Arch Stenton

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

 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!!!
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

 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

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