- Mettere in "pausa" autocad

[ Home | Discussioni Attive | Discussioni Recenti | Segnalibro | Msg privati | Sondaggi Attivi | Utenti | Download | Cerca | FAQ ]
Nome Utente:
Password:
Salva Password
Password Dimenticata?

 Tutti i Forum
 Autocad
 VBA - Visual Basic per Autocad
 Mettere in "pausa" autocad
 Nuova Discussione  Rispondi Bookmark this Topic Aggiungi Segnalibro
I seguenti utenti stanno leggendo questo Forum Qui c'è:
Autore Discussione Precedente Discussione Discussione Successiva  

Lucakit
Nuovo Utente


Regione: Piemonte
Prov.: Torino
Città: Torino


17 Messaggi

Inserito il - 29/09/2010 : 00:21:16  Mostra Profilo Invia a Lucakit un Messaggio Privato  Rispondi Quotando
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!

admin
Amministratore



Regione: Veneto
Prov.: TV
Città: Treviso


188 Messaggi

Inserito il - 04/10/2010 : 20:49:32  Mostra Profilo  Visita l'Homepage di admin Invia a admin un Messaggio Privato  Rispondi Quotando
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.
Torna all'inizio della Pagina

Lucakit
Nuovo Utente


Regione: Piemonte
Prov.: Torino
Città: Torino


17 Messaggi

Inserito il - 05/10/2010 : 20:40:36  Mostra Profilo Invia a Lucakit un Messaggio Privato  Rispondi Quotando
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.

Modificato da - Lucakit in data 05/10/2010 20:41:27
Torna all'inizio della Pagina

Lucakit
Nuovo Utente


Regione: Piemonte
Prov.: Torino
Città: Torino


17 Messaggi

Inserito il - 06/10/2010 : 17:19:34  Mostra Profilo Invia a Lucakit un Messaggio Privato  Rispondi Quotando
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...

Modificato da - Lucakit in data 06/10/2010 17:21:23
Torna all'inizio della Pagina

admin
Amministratore



Regione: Veneto
Prov.: TV
Città: Treviso


188 Messaggi

Inserito il - 06/10/2010 : 21:04:12  Mostra Profilo  Visita l'Homepage di admin Invia a admin un Messaggio Privato  Rispondi Quotando
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.
Torna all'inizio della Pagina

Lucakit
Nuovo Utente


Regione: Piemonte
Prov.: Torino
Città: Torino


17 Messaggi

Inserito il - 06/10/2010 : 23:24:38  Mostra Profilo Invia a Lucakit un Messaggio Privato  Rispondi Quotando
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.

Modificato da - Lucakit in data 06/10/2010 23:26:34
Torna all'inizio della Pagina

admin
Amministratore



Regione: Veneto
Prov.: TV
Città: Treviso


188 Messaggi

Inserito il - 08/10/2010 : 21:04:44  Mostra Profilo  Visita l'Homepage di admin Invia a admin un Messaggio Privato  Rispondi Quotando
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.
Torna all'inizio della Pagina

Lucakit
Nuovo Utente


Regione: Piemonte
Prov.: Torino
Città: Torino


17 Messaggi

Inserito il - 18/10/2010 : 23:54:33  Mostra Profilo Invia a Lucakit un Messaggio Privato  Rispondi Quotando
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"

Modificato da - Lucakit in data 18/10/2010 23:56:37
Torna all'inizio della Pagina

admin
Amministratore



Regione: Veneto
Prov.: TV
Città: Treviso


188 Messaggi

Inserito il - 19/10/2010 : 21:41:30  Mostra Profilo  Visita l'Homepage di admin Invia a admin un Messaggio Privato  Rispondi Quotando
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...
Torna all'inizio della Pagina

Lucakit
Nuovo Utente


Regione: Piemonte
Prov.: Torino
Città: Torino


17 Messaggi

Inserito il - 22/10/2010 : 02:52:00  Mostra Profilo Invia a Lucakit un Messaggio Privato  Rispondi Quotando
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?




Modificato da - Lucakit in data 22/10/2010 02:53:19
Torna all'inizio della Pagina
  Discussione Precedente Discussione Discussione Successiva  
 Nuova Discussione  Rispondi Bookmark this Topic Aggiungi Segnalibro
Vai a:
© Torna all'inizio della Pagina
Tradotto Da: Vincenzo Daniele & Luciano Boccellino- www.targatona.it | Distribuito Da: Massimo Farieri - www.superdeejay.net | Powered By: - Snitz Forums 2000 Version 3.4.03

Antidoto.org | Brutto.it | Estela.org | Equiweb.it