| 
        
          | 
              
                | V I S U A L I Z Z A    D I S C U S S I O N E |  
                | Max | Inserito il - 18/05/2008 : 22:35:15 Ciao Lucio e ciao a tutti
 Da un po di tempo non scrivevo niente ed ora che riprovo mi trovo un bel pò arrugginito (cioè più di prima)
 Ho un problema di approccio. Devo aprire, da VB, delle tavole in dwg che possono contenere, oltre a segmenti, testo e quanto altro, anche riferimenti esterni (immagini e/o dwg): devo determinare le coordinate dell'angolo in basso a sx della finestra minima che contiene il tutto. Naturalmente si tratta di tavole in due dimensioni.
 Che faccio? Scorro tutti gli oggetti, determino le coordinate di ognuno, memorizzo ogni volta quella più in basso e quella più a sx o posso contare su qualche scorciatoia? o un modo più elegante?
 Grazie sin da ora
 Max
 
 |  
                | 7   U L T I M E    R I S P O S T E    (in alto le più recenti) |  
                | Max | Inserito il - 02/12/2008 : 09:01:42 Ciao Lucio
 Per la verità ho già fatto qualche correzione: un conto è far lavorare il codice su due o tre oggetti di prova, un altro lavorare con tavole pesanti ed entità di disegno qualsiasi: ad esempio quando interseco con testo o blocchi ( devo vedere quali e perchè ) la routine da errore, che al momento ho risolto senza problemi con un resume next. Ancora una correzione anche perchè la routine risulta lenta quindi ho ottimizzato (si fa per dire) il  posizionamento iniziale delle rette di scansione.
 Fra qualche giorno penso di girare una versione con poche correzioni ma più efficiente.
 Tra l'altro con i righi iniziali non riesco ad avviare autocad: devo prima avviarlo a mano!
 Saluti
 Massimo
 |  
                | admin | Inserito il - 01/12/2008 : 20:07:00 Ciao Max,
 spero tu abbia qualche giorno di pazienza,
 devo rileggermi quello che ci avevamo detto e capire il codice che mi hai passato.
 |  
                | Max | Inserito il - 29/11/2008 : 03:20:50 Ciao
 Qualcosa mi sono inventato, non è molto elegante ma efficace.
 La casistica è varia ed ho avuto un problema con IntersectWith() che non funziona bene quando gli elementi
 del disegno sono paralleli agli assi.
 Genero un segmento quasi verticale e trovo l'incrocio con l'elemento più a sx e trovo la x.
 Genero un segmento quasi orizzontale e trovo la y.
 Poi muovo tutto per lasciare spazio al cartiglio.
 Sicuramente si può fare di meglio ma al momento....sembra funzionare a modo.
 Rimango in attesa di suggerimenti
 Un caro saluto
 
 Sub muovetutto()
 Dim x As Long, y As Long, newSSet As AcadSelectionSet
 Dim P1(0 To 2) As Double, P2(0 To 2) As Double, i As Integer
 x = Max_intersezione("x")
 y = Max_intersezione("y")
 Set newSSet = ThisDrawing.SelectionSets.Add("newSelSet")
 newSSet.Select acSelectionSetAll
 P1(0) = x:    P1(1) = y: P1(2) = 0
 P2(0) = 210: P2(1) = 0: P2(2) = 0
 For i = 0 To newSSet.count - 1
 newSSet.Item(i).Move P1, P2
 Next i
 ThisDrawing.SelectionSets.Item("newSelSet").Delete
 End Sub
 
 Public Function Max_intersezione(retta As String)
 Dim lineObj As AcadLine, startPt(0 To 2) As Double, x As Double, salto As Integer
 Dim endPt(0 To 2) As Double, intPoints As Variant, pass As Integer, mododiestensione As Integer
 Dim newSSet As AcadSelectionSet, incrociato As Boolean, ssobj As AcadEntity
 Dim i As Integer, j As Integer, assex As Boolean, incremento As Double
 Dim count As Integer, index As Integer, coordx As Long
 assex = False: test = True: x = 0:  pass = 0
 Set newSSet = ThisDrawing.SelectionSets.Add("newSelSet")
 newSSet.Select acSelectionSetAll
 incremento = 1: salto = 0
 While test
 incrociato = False:   pass = pass + 1
 If pass > 32000 Then
 x = -10000
 pass = 1
 End If
 Select Case retta
 Case "x"
 startPt(0) = x: startPt(1) = 0: startPt(2) = 0
 endPt(0) = x - 1: endPt(1) = 1000: endPt(2) = 0
 mododiestensione = 1
 Case "y"
 startPt(0) = 0: startPt(1) = x: startPt(2) = 0
 endPt(0) = 1000: endPt(1) = x - 1: endPt(2) = 0
 mododiestensione = 1
 End Select
 Set lineObj = ThisDrawing.ModelSpace.AddLine(startPt, endPt)
 For Each ssobj In newSSet
 intPoints = lineObj.IntersectWith(ssobj, mododiestensione)
 For i = LBound(intPoints) To UBound(intPoints)
 If pass > 1 Then
 assex = True
 If retta = "x" Then Max_intersezione = Int(intPoints(j)) - 1
 If retta = "y" Then Max_intersezione = Int(intPoints(j + 1)) - 1
 incrociato = True
 Exit For
 Else
 salto = salto + 100
 x = x - salto
 incrociato = True
 pass = 0
 Exit For
 End If
 Next
 If incrociato Then
 Exit For
 End If
 Next  'ho scorso tutti gli oggetti
 lineObj.Delete  ' Cancello la riga di test
 If assex Then
 test = False
 End If
 x = x + incremento
 Wend
 ThisDrawing.SelectionSets.Item("newSelSet").Delete
 End Function
 |  
                | Max | Inserito il - 20/05/2008 : 14:14:43 Ciao
 non so dove possono essere posizionati gli oggettiù: quindi (sicuramente) in tutti i quadranti.
 L'idea del crossing mi piace.
 Pensavo anche di scorrere ( o cercare intersezioni ) con due rette,
 ad esempio x=0 e y=0
 poi incrementare, o ridurre, nel caso non si trovino, o non si trovino, intersezioni.
 Ora inizio a vedere cosa viene fuori, e se sono capace di far venir fuori qualcosa.
 Un saluto
 A presto.
 Massimo
 |  
                | admin | Inserito il - 20/05/2008 : 13:34:55 Ciao,
 se per caso hai tutti gli oggetti al di sopra dello 0,0, pensavo che si potrebbe eseguire una selezione con il crossing ed incrementarla di 1mm alla volta finchè trovo uno o più oggetti, trovati i primi oggetti vado a verificare quale ha il punto più in basso.
 Altrimenti credo proprio sia da scorrere tutti gli oggetti e verificarne il punto di inserimento.
 Questa è la mia risposta al momento, comunque provo a cercare se c'è qualcosa che mi dia già questo famoso "punto".
 Se nel frattempo riesci te a trovare qualcosa sarò ben lieto di saperne di più.
 Ciao!
 |  
                | Max | Inserito il - 19/05/2008 : 21:32:00 Praticamente hai centrato il problema.
 Devo aprire tavole che possono contenere qualsiaso oggetto autocad, compresi immagini (lavoriamo con raster design) spostare il tutto, qualunque cosa sia, ed inserire il cartiglio a regola (norma) d'arte.
 Il cartiglio potrebbe eseere compreso nell'immagine collegata, non esserci o esere a destra in basso a sx.
 Ho concluso che non mi importa se c'è e dov'è!
 Al peggio ce ne saranno due ma quello che metto io deve essere in basso a sx con tutte le informazioni del caso.
 L'idea era: trovo il punto in basso a sx, lo sposto in (210,0) e in (0,) ci metto un bel blocco con tutti gli attributi del caso, con gli argomenti letti da una tabella.
 Mi chiedevo se qualche funzione che non conosco, poteva aiutarmi.
 Se vado a cercare ogni oggetto ho paura di perdere la strada!
 Grazie e saluti Massimo
 
 
 
 |  
                | admin | Inserito il - 19/05/2008 : 09:06:34 Ciao,
 so che non si risponde con una domanda, ma per caso non è che hai dei cartigli così basta cercarli e trovare i punti di 2 oggetti solo??? Troppo facile sarebbe, vero??
 |  |  
 |