Newsgroup: it.discussioni.ingegneria.civile
Titolo: Esportare info 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

Dovrebbe essere semplicissimo con un lisp.
O perdi tempo (ma guadagni in preparazione)
studiandoti il manuale lisp on line o ti fai
aiutare in it.comp.software.cad 

 Insomma sono disperato
Registra i disegni in formato DXF.
Poi basta un semplice texteditor.
Al limite ti scrivi uno script (magari con un linguaggio come Python)
per recuperare i dati che ti servono.
-- 
Ciao da Francesco B.

come faccio ad accedere in it.comp.software.cad se non sono utente
tiscali?
il problema è che so programmare un pochino in C++, Fortran... ma non
ho mai usato lisp & C... ad oggetii credo? Comunque ci proverò! Come
faccio poi a richiamare un codice in lisp da CAD?
Idee/suggerimenti per il codice?
ciao e grazie
roberto

Ci proverò!
bell'idea
grazie
rob


Tools-->Macro-->VBA Manager
usa il VBA è molto più facile, crea una procedura del tipo...
Sub prova()
         Dim i As Integer
         Open "c:\prova.txt" For Output As #1
         For i = 0 To ThisDrawing.ModelSpace.Count - 1
                 Print #1, ThisDrawing.ModelSpace(i).ObjectName
         Next
         Close #1
end Sub
-- 
Ciao, Nobody
[cit.]...Le strutture non cadono mai,
ma quando cadono fanno un gran casino!
mail:   indirizzomail Toglimi chiocciola gmail punto com


Utilizzando un newsreader qualsiasi (come Outlook Express) e un news 
server free, come ad esempio
- diesel 
http://news.cu.mi.it/
- x-privat 
http://www.x-privat.org/
 (ogni tanto emettono dei codici di 
invito qui) 
http://www.x-privat.org/freecode.php
- oppure chiedi al tuo referente 
http://www.garr.it/
I newsgroup non sono gestiti dagli Internet Service Provider (per 
fortuna).
Per il tuo quesito un'altra risorsa è cadlandia e il suo forum
http://www.cadlandia.com/
-- 
Ciao, DOCstone

Belloooo!
funzione!!!
ora sto scrivendo il nome dell'oggetto in un txt ma per scriverne la
sua lunghezza???
grazie nobody
rob


....basta chiederlo! :-)
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
Sfrutta un po' l' "intelli sense"....ti ritorna le proprietà degli oggetti.


... il fatto è che ci avevo già provato....
ora ho riprovato e riprovato MA perchè a te funziona ed a me NO...
i miei oggetti modelspace(i) non contengono la proprietà .length
quando scrivo thisdrawing.modelspace(i). non mi esce alcuna proprietà
utile come lenght or polylength
con le linee riesco ma io ho solo polilinee e poi proprio non capisco
perche VB non mi fa l'elenco delle proprietà di un oggetto! insomma
perchè se io scrivo ...modelspace(3). non mi compare la possibilità
di lenght? Idee
insomma sono proprio imbranato nel programmare in VB!
come si fa ad usare l'elenco degli oggetti (F2) in VB... come faccio a
capire che, per es, la proprietà .length è associabile a TOT oggetti
(se me lo elencasse sarebbe facile perchè li leggo sempre tutti)
ciao a tutti

 .... il fatto è che ci avevo già provato....

In effetti l' "intelli sense" non funziona al 100%.....l'associazione
all'oggetto è "tardiva", per esplorare le proprietà metti un breakpoint
sul rigo "With ThisDrawing.ModelSpace(i)" (....premi F9)
quindi avvia la macro e quando incontra il breakpoint seleziona
"ThisDrawing.ModelSpace(i)"...deve diventare VERDE e
premi SHIFT+F9 quindi "Add" ti uscirà una finestra con tutte le proprietà
dell'oggetto....per le polilinee in effetti non c'è lenght, ma c'è una
proprietà  ".Coordinates" che ritorna un array delle coordinate dei
pt.....ed è facile quindi ricavare la lunghezza del singolo tratto...e
quindi sommare....in modo sbrigativo da "pivello" qui ho dichiarato n.
variabili Xi e Yi....sarebbe più corretto ciclare su gli n. elementi
con "passo 2"  (0,2,4 etc... sono le X  1,3,5 etc...le Y)
prova questa......
Sub prova()
         Dim i As Integer
         Dim Lunghezza As Double
         Dim varLElenco As Variant
         Dim X1 As Double
         Dim Y1 As Double
         Dim X2 As Double
         Dim Y2 As Double
         ' ....etc
         Open "c:\prova.txt" For Output As #1
         For i = 0 To ThisDrawing.ModelSpace.Count - 1
                 With ThisDrawing.ModelSpace(i)
                     If .ObjectName = "AcDbPolyline" Then
                         'Lunghezza = .Length
                         varLElenco = .Coordinates
                         X1 = varLElenco(0)
                         Y1 = varLElenco(1)
                         X2 = varLElenco(2)
                         Y2 = varLElenco(3)
                         ' ...etc
                         Print #1, Format(X1, "0.0000")
                     End If
                 End With
         Next
         Close #1
End Sub


Questo shift+F9 non l'avevo mai provato... grazie!
Ora però son lanciato e mi sto scervellando da ieri notte su come dare
una sequenza alle mie linee. Ho riprovato a passare in lisp ma mi son
ribloccato (anche se con questo prg riesco ad assegnare il nome ad ogni
linea) e voglio assolutamente ripassare al basic che è più
accessibile (sotto il prg in lisp. riusciresti a fargli fare queste
cose in VB tu? riusciresti a tradurlo?).
Il mio scopo è estrapolare dal mio dwg (essenzialmente 2 lunghe
polilinee che det. il bordo del canale [che può anche biforcare] e
mille e più sezioni da analizzare] più info possibili su lunghezze ed
aree! So che ti stò stressando all'inverosimile ma se potessi mandarti
in allegato il dwg, mi potresti dare delle dritte?
Il problema più grosso in VB per me è ancora quello di riuscire a
selezonare tutte le linee ed esportare un file con 2 colonne: 1.)nome
linea/sezione, 2.)lunghezza linea/sezione....
Sarebbe il massimo poter dare un nome ad ogni sezione al momento della
sua creazione sul dwg (ovviamente con qualche processo sbrigativo tipo
ciclo che: click --> inserisci nome; click--> inserisci nome (della
seconda)...) ma non riesco con VB...
Se sei arrivato fin qui a leggere sei anche troppo bravo a sopportarmi
a questa maniera... alla prox mail ti mando il titolo della mia
tesi....
Grazie, io son di Riva e faccio l'istruttore di vela... giretto in
barca? cena al lago? insomma come potrò mai sdebitarmi
ciao ciao
roberto
Lisp Code:
 (defun c:Scrivi ()
(setvar "cmdecho" 0)
(setq NomeFile (getfiled "Salva file di Lunghezze" "" "csv" 1))
(setq Separatore ";")
(princ "\n Seleziona le Polilinee...")
(setq gruppoDist(ssget (list (cons -4 "<OR")(cons 0 "POLYLINE")(cons 0
"LWPOLYLINE")(cons -4 "OR>"))))
(if gruppoDist (progn
        (setq i 0)
        (setq ListaProgr nil)
        (repeat (sslength gruppoDist)
                (setq poli(ssname gruppoDist i))
                (command "_area" "_o" poli)
                (if (assoc -3(entget poli '("SEZ")))
                  (setq nome(cdr(car(cdr(car(cdr(assoc -3 (entget  poli
'("SEZ")))))))))
                  (setq nome(strcat "Anonima_" (itoa i)))
                )
                (setq ListaProgr(cons (list nome (rtos(getvar
"perimeter") 2 2))
ListaProgr))
                (setq i(1+ i))
        )
        (setq ListaProgr(vl-sort ListaProgr (function (lambda (e1 e2)
(< (car
e1) (car e2))))))
        (setq i 0)
        (setq FF(open NomeFile "a"))
        (repeat (length ListaProgr)
                (write-line (strcat (nth 0 (nth i ListaProgr))
Separatore (nth 1 (nth
i ListaProgr))) FF)
                (setq i(1+ i))
        )
        (close FF)
        (princ "\n Creato il file:")(princ NomeFile)
        )
)
  (princ)
)
;;;
(defun c:Nome ()
        (if (not (tblsearch "appid" "SEZ"))(regapp "SEZ"))
        (if nome (princ (strcat "\n<Nome precedente: " nome "> ")))
        (setq nome(getstring " Nome sezione corrente: "))
        (setq pq1(append (entget (car (entsel))) (list (list -3 (list
"SEZ"
(cons 1000 nome))))))
        (entmod pq1)
        (princ)
)
;;;
(princ "\n <Copyright: ing. Claudio Granuzzo - 2006>")
(princ "\n Digitare SCRIVI per scrivere nel file CSV")
(princ "\n Digitare NOME per dare il nome alla sezione")
(princ)
allegato dwg:
solo dopo tuo consenso
ciao ancora
rob


il programma in Lisp fa all'incirca questo.....
Sub prova()
         Dim i As Integer
         Dim Lunghezza As Double
         Dim varLElenco As Variant
         Dim X1 As Double
         Dim Y1 As Double
         Dim X2 As Double
         Dim Y2 As Double
         Dim Li As Double
         Dim intLJ As Integer
         Dim intLContatore As Integer
         intLContatore = 0
         ' ....etc
         Open "c:\prova.txt" For Output As #1
         For i = 0 To ThisDrawing.ModelSpace.Count - 1
                 With ThisDrawing.ModelSpace(i)
                     If .ObjectName = "AcDbPolyline" Then
                         If .Layer = "LayerSelezione" Then
                         varLElenco = .Coordinates
                         Li = 0
                         Lunghezza = 0
                         For intLJ = 0 To UBound(varLElenco) - 2 Step 2
                                 X1 = varLElenco(intLJ)
                                 Y1 = varLElenco(intLJ + 1)
                                 X2 = varLElenco(intLJ + 2)
                                 Y2 = varLElenco(intLJ + 3)
                                 Li = Sqr((X1 - X2) ^ 2 + (Y2 - Y1) ^ 2)
                                 Lunghezza = Lunghezza + Li
                         Next
                         intLContatore = intLContatore + 1
                         Print #1, "Linea_" & intLContatore & "  " &
Format(Lunghezza, "0.0000")
                         End If
                     End If
                 End With
         Next
         Close #1
End Sub
Nota: benché il VB sia la mia seconda lingua dopo l'italiano :-) non
sono molto pratico in VBA per Autocad...sicuramente ci sarà qualche modo
per prendere solo le linee selezionate....ma non ho trovato alcuna
proprietà.....un metodo molto veloce "per non sapere ne leggere e ne
scrivere" :-) è quello di impostare una proprietà per discriminare le
linee....ho creato un Layer "LayerSelezione"....quindi in vece di
selezionare le linee gli cambi layer (...lo so che è una porcata...ma è
veloce veloce!!!) tutte le linee di questo layer verranno processate, le
altre no.....eventualmente altre informazioni potresti darle tramite il
colore...es quelle con colore 1 sono linee del ramo 1..quelle con 2
sezioni del remo 2 etc.....
Non è possibile dare altri attributi alle linee...una possibilità
(forzatura) è quello di sfruttare il campo Descrizione di "HyperLinks"
e poi accedere a tale proprietà tramite
.Hyperlinks.Item(0).URLDescription  ...se è vuoto va in
errore...pertanto scrivi
Dim Descrizione as string
on error resume next
Descrizione =.Hyperlinks.Item(0).URLDescription
Print #1, Descrizione  & " Linea_" & intLContatore & "  " &


Ok, veloce, sicuro e come sempre preciso nelle tue risposte. Grazie.
Ora capisco meglio ciò che faceva il mio buon CAD sotto lisp... quel
codice è veramente incomprensibile per me... grazie ancora.
Cmq sono tornato indietro sui tuoi passi della sett. scorsa perchè mi
sembra un po stupido far tutto questo ciclo che si calcola la distansa
tra i due estremi quando VBa mette a disposizione il suo bel .length
sia per le polinlinee che per le linee...
L'unico svantaggio adesso che mi porto dietro chn VB è che non riesco
ad interagire con l'utente in modo semplice come autolisp.
SECONDO TE SI RIESCE (e qui avrei concluso il mio operato) a far un
ciclo che ti chieda di cliccare su una linea/polilinea e poi assegni a
quella entità un nome sulla proprietà  .Hyperlinks. Tutto ciò
perchè sarebbe più veloce che farlo (linea per linea) da CAD visto
che bisogna dargli anche un "falso" riferimento ipertestuale (ma a me
interessa solo la descrizione)... è una "porcata" come dici tu però
funziona ad Hoc... devo solo renderlo più veloce ed iterattivo con
l'utente...Ovviamente vorrei riuscir a rimanere in VB così lo metto
nella stessa macro...
Intanto super grazie e buon lavoro
roberto


Ma allora non vuoi fare proprio niente!!! :-)
Seleziona PRIMA le entità e POI avvia la macro.....a tutte le entità
selezionate verrà attribuito il colore giallo=2 e un HyperLink.....
Sub Example_Select()
     Dim ssetObj As AcadSelectionSet
     Dim intLi As Integer
     Dim objLinea  As AcadEntity
     Dim strLDescrizione As String
     On Error Resume Next
     ThisDrawing.SelectionSets.Item("Selezione").Delete
     Set ssetObj = ThisDrawing.SelectionSets.Add("Selezione")
     strLDescrizione = InputBox("Descrizione")
     ssetObj.Select acSelectionSetPrevious
     For intLi = 0 To ssetObj.Count - 1
         Set objLinea = ssetObj.Item(intLi)
         Call objLinea.Hyperlinks.Add(strLDescrizione, strLDescrizione)
         objLinea.Color = 2
     Next
End Sub


Nobody ha scritto:
