V I S U A L I Z Z A D I S C U S S I O N E |
Lucakit |
Inserito il - 29/09/2010 : 00:21:16 Ciao a tutti! Mi rifugio ancora una volta in questo forum per sapere se è possibile realizzare una soluzione come vorrei... Allora, sto usando una macro che si compone di diverse fasi. Per velocizzare il lavoro sto aggiungendo una parte dedicata alla stampa e al salvataggio automatici ma, prima di compiere queste operazioni, spesse volte sono necessarie piccole rifiniture da fare a mano. Il mio desiderio è quello di trovare il modo di "mettere in pausa" la macro, in modo che mi permetta di fare le operazioni straordinarie (una o più di una, spostare o ruotare o scalare...e altre), per poi riprendere quando voglio e completare con salvataggi e stampe.
Avete suggerimenti? Grazie in anticipo! |
9 U L T I M E R I S P O S T E (in alto le più recenti) |
Lucakit |
Inserito il - 22/10/2010 : 02:52:00 Ciao! Allora...passi avanti, ma non troppi.
Ragiono per semplicità solo sul comando "Move"; questo è il codice:
With ThisDrawing.SelectionSets While .Count > 0 .Item(0).Delete Wend Set Selezione = .Add("$MoveTest$") End With Selezione.SelectOnScreen punto = ThisDrawing.Utility.GetPoint(, "Clicca il punto DA cui spostare: ") punto1(0) = punto(0) - ThisDrawing.ActiveUCS.origin(0) punto1(1) = punto(1) - ThisDrawing.ActiveUCS.origin(1) dist = ThisDrawing.Utility.GetDistance(punto1, "seleziona dove:")
Fino a qua sembra che la soluzione sia ottimale: l'ultima riga permette di tracciare la linea virtuale (senza l'anteprima della selezione) che unisce il punto iniziale (punto1, già definito) con quello finale (ancora da cliccare). Comunque è già gran cosa!!! La traslazione è solo perchè non sto lavorando in WCS e, senza, la linea non partirebbe dal punto1.
Il problema è che dist è una semplice lunghezza, un banale valore assoluto!! Il comando "move" richiede due punti, mentre in questo modo io avrei un punto e una distanza. Ho provato ad annidare due comandi per fare tutto con un solo click, ma niente!
' punto = ThisDrawing.Utility.GetPoint(ThisDrawing.Utility.GetDistance(punto1), "Clicca il punto A cui spostare: ") 'punto2 = ThisDrawing.Utility.GetPoint(, "Clicca il punto A cui spostare: ") 'ThisDrawing.SendCommand "_Move" & vbCr For Each EntitàSelezione In Selezione 'EntitàSelezione.Move punto1, ThisDrawing.Utility.GetDistance(punto1, "seleziona dove:") EntitàSelezione.Move punto1, punto2 Next ThisDrawing.Regen (True)
Mi è poi venuto in mente di usare gli XData oppure un With...ma la mente a quest'ora si rifiuta di andar oltre, anche perchè son strumenti che non ho mai usato (XData) o usato con poche conoscenze (With). Secondo te posso essere su una strada fattibile o è un vicolo cieco? Ti ho solleticato delle idee?
|
admin |
Inserito il - 19/10/2010 : 21:41:30 Non ne sono sicuro, ma mi sembra che ci sia la possibilità di far fare l'anteprima in VBA come nei comandi manuali... non lo so ma mi sembra di aver già letto na roba del genere. Ricordarsi dove però.... proverò a indagare su internet, ma ora al lavoro sono preso con le bombe e a casa... |
Lucakit |
Inserito il - 18/10/2010 : 23:54:33 Questo weekend passato è stato generoso di idee... Anche questo problema sembra aver preso una piega buona...e soprattutto insperata!
Ti giro il codice che sto mettendo a punto...l'idea è molto semplice: un loop che ripete la richiesta delle azioni da fare fino a quando non decido di salvare e stampare. All'interno del loop, un bel select case che sfrutto a seconda delle esigenze e che contiene le azioni che di solito ritengo di usare per quei piccoli ritocchi necessari prima della stampa definitiva.
Il problema a cui devo ancora trovare una soluzione è quello di gestire il codice nell'esatto modo con cui si usano i comandi in autocad (sperando che sia possibile!); ad esempio, lo scale, la rotation e il move mostrano, durante il loro uso tramite mouse, l'anteprima della modifica che si sta per fare. Tramite VBA invece mi viene richiesto esattamente il punto dello spostamento, l'angolo di cui ruotare o il coefficiente per cui ingrandire/rimpicciolire. Questo problema mi porta quindi ad andare "a tentoni"...ti sei già per caso imbattuto nella questione?
Intanto ti posto il codice della quasi totale soluzione:
Do Dim chiavi As String chiavi = "M R S Z P V" 'muovi ruota zoom zoomprecedente Sì No" ThisDrawing.Utility.initializeuserinput 128, chiavi Dim scelta As String scelta = "" scelta = ThisDrawing.Utility.GetKeyword("Cosa vuoi fare? (Muovi/Ruota/Scala/Zoom/zoomPrecedente/salVa_stampa): ") Dim Selezione As AcadSelectionSet Dim EntitàSelezione As AcadEntity Dim punto1, punto2 As Variant Select Case scelta Case "M" 'muovi With ThisDrawing.SelectionSets While .Count > 0 .Item(0).Delete Wend Set Selezione = .Add("$MoveTest$") End With Selezione.SelectOnScreen punto1 = ThisDrawing.Utility.GetPoint(, "Clicca il punto DA cui spostare: ") punto2 = ThisDrawing.Utility.GetPoint(, "Clicca il punto A cui spostare: ") For Each EntitàSelezione In Selezione EntitàSelezione.Move punto1, punto2 Next ThisDrawing.Regen (True) Case "R" 'ruota With ThisDrawing.SelectionSets While .Count > 0 .Item(0).Delete Wend Set Selezione = .Add("$MoveTest$") End With Selezione.SelectOnScreen punto1 = ThisDrawing.Utility.GetPoint(, "Clicca il punto DA cui spostare: ") punto2 = ThisDrawing.Utility.GetPoint(, "Clicca il punto A cui spostare: ") For Each EntitàSelezione In Selezione EntitàSelezione.rotation Next ThisDrawing.Regen (True) Case "S" 'scala
Case "Z" 'zoom punto1 = ThisDrawing.Utility.GetPoint(, "Specifica il primo angolo: ") punto2 = ThisDrawing.Utility.GetPoint(, "Specifica il secondo angolo: ") ZoomWindow punto1, punto2 Case "P" 'zoomprecedente ZoomPrevious 'Case "V" 'salva_stampa" End Select Set Selezione = Nothing Loop Until scelta = "V" |
admin |
Inserito il - 08/10/2010 : 21:04:44 Ciao, ma quando fai lo stop non c'è nessun codice in lavorazione, giusto? Se è così con hide non ci sono problemi secondo me, l'unica è che devi dichiarare le variabili nel globale oppure quando stoppi salvare tali variabili per esemio in un file txt per poi andare a rileggerle. E' ovvio che se si blocca Autocad quando sei in pausa e quindi devi riavviarlo perdi tutte le variabili, ma credo che si possa risolvere appunto scrivendole in un file di appoggio. Con hide non scarichi l'applicazione ma nascondi il form, infatti se dopo hide puoi anche far continuare elaborazioni. E' tipo un riduci ad icona. |
Lucakit |
Inserito il - 06/10/2010 : 23:24:38 Ma, per quel poco che so, HIDE setta la proprietà Visible su off, ma non ferma la compilazione del codice. Mi sembra di dover far seguire all'hide un comando che fermi il tutto...altrimenti lui esegue l'hide (ossia fa scomparire il form) e poi continua. O sbaglio?
Ti spiego in altro modo quest'applicazione, perchè non so se son riuscito a rendere l'idea. Fino a poco tempo fa, la macro consisteva nell'acquisire un tot di punti dati dall'utente (comando Getpoint, che peraltro mette l'applicazione in attesa delle coordinate x un tempo illimitato ma senza poter far altro); dopodichè parte il corpo serio dell'applicazione (durante il quale non si può interagire) che si occupa di tirar linee, calcolare distanze e angoli, esportare i risultati e archiviare in layer le varie entità. Stop! Ora, per ottimizzare i tempi, ho deciso di automatizzare stampa e salvataggio...quindi dopo lo stop c'è dell'altro codice. Avviando il tutto,la macro arriva fino a questa nuova fase senza che io possa intromettermi. A causa di quelle imperfezioni di cui detto, io VOGLIO intromettermi (nel punto del precedente stop) per correggerle ma senza perdere i dati che mi servono x la fase finale e che sono forniti da me all'avvio della macro (con un form). Ti ho raccontato di nuovo tutta la favola perchè, da come mi scrivevi, mi sembrava avessi capito che la macro vada avanti "a tratti"...cioè per me non ha senso quel "se sei fermo alla 5^"! Perchè non sarò mai fermo in un punto del codice...è un unico flusso che io voglio mettere in pausa in quel punto, diciamo per passare alla modalità manuale e poi tornare al pilota automatico.
|
admin |
Inserito il - 06/10/2010 : 21:04:12 Non c'è differenza. Si può nascondere il form con nomeform.hide Io ho un'applicazione che avvio tramite pulsante la quale recupera dei dati da database, richiamo una funzione in lisp (che avevo già fatto da anni), nascondo il form e se ripremo il tasto che avvia l'applicazione mi ricompare come prima. C'è da dire però che quello che doveva fare in VBA era finito.
Ma scusa... tu alla fine non la blocchi mentre sta elaborando, termina qualcosa prima di volerla stopparla. Se è così credo che con il semplice HIDE risolvi il problema. Esempio: l'applicazione deve eseguire 10 funzioni, di cui magari 3 su un colpo, poi ne fai fare altre 2 etc... quindi credo con più comandi da parte dell'utente. Se sei fermo alla 5^, premi un tasto per far eseguire l'HIDE e quando ripremi il pulsante che avvia l'aplicazione, dovresti proprio ritrovarti al punto di stop, quindi riprendi dalla 6^ funzione.
|
Lucakit |
Inserito il - 06/10/2010 : 17:19:34 Ripensando alla domanda, mi viene da chiederti se c'è differenza per le istruzioni usate per una macro avviata da pulsante piuttosto che per una avviata da tastiera...
E, per quanto riguarda il riavvio da parte dell'utente, avevo pensato a due soluzioni: - un semplice form con tasto di riavvio, però dubito che si possa agire sul disegno avendo in mostra il form stesso - un comando da tastiera, del tipo "Vuoi riprendere l'esecuzione (Sì/No)?", che compare allo stop della macro e rimane fino al termine delle operazioni manuali, momento in cui l'utente risponderà Sì+INVIO
La seconda delle due mi pare migliore, anche se non ho trovato il comando adeguato in vba...
Resto in attesa di consigli... |
Lucakit |
Inserito il - 05/10/2010 : 20:40:36 Ciao! Sì...intendo tempo, in linea teorica, illimitato. Ovviamente mantenendo in memoria tutte le variabili che la macro ha già allocate, per usufruirne dopo la pausa.
La macro è avviata da tastiera (Alt+F8, etc...). Prima o poi il dettaglio dell'avvio tramite pulsante arriverà, ma per ora è uno sfizio (se però hai suggerimenti anche su questo, son ben accetti)...
Spiego nel dettaglio l'uso della pausa...La macro svolge una serie di operazioni tra cui disegno, esportazione in excel di risultati e archiviazione in layer; prima della fase di salvataggio e stampa (tutto sempre tramite macro, senza interazione dell'utente), spesso c'è bisogno di qualche ritocchino: rototraslazione di blocchi non perfettamente allineati, linee da correggere leggermente e via dicendo. La mia richiesta era, appunto, in merito a un pezzo di codice da inserire nella macro in modo che, prima della sub di salvataggio e stampa, stoppi il flusso per poter fare queste correzioni (quindi si parla di qualche secondo/minuto) e poi permetta, sotto "restart" dell'utente, di riprendere l'ultima parte del lavoro automatico, per il quale ha già in memoria i dati necessari. |
admin |
Inserito il - 04/10/2010 : 20:49:32 Ciao, quindi intendi anche pause per qualche minuto, giusto? è una macro che avvii tramite pulsante o tramite tastiera? Se tramite pulsante credo basti aggiungerne uno per la pausa/riprendi. |
|
|