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