Impossibile eseguire componenti aggiuntivi all'interno di ProjectAbbiamo organizzato molti script in un componente aggiuntivo per la nostra azienda.Il componente aggiuntivo risponde ma gli script non verranno eseguiti se richiamati all'interno di "Progetto".È qualcosa che può essere risolto tramite lo scripting aggiuntivo o lo script stesso deve essere contenuto separatamente all'interno del progetto?
ScriptingRi: Impossibile eseguire componenti aggiuntivi all'interno di ProjectOgni progetto in JMP ha il proprio elenco globale e spazio dei nomi. Ciò vale anche per la parte non progettuale di JMP. Quindi, se crei un global:a al di fuori di un progetto, non sarà visibile in nessun progetto. E se crei un global:b all'interno di Project01, non sarà visibile al di fuori di quel progetto o in qualsiasi altro progetto. Inoltre, se crei uno spazio dei nomi "A" all'esterno di un progetto, non sarà visibile (per nome, come in A:symbol) all'interno di alcun progetto. E simile per la creazione di uno spazio dei nomi in un progetto. Questo viene fatto per mantenere i progetti isolati l'uno dall'altro e dai non progetti. E consente di eseguire più copie dello stesso script su più progetti senza che entrino in collisione tra loro anche se usano i globali.
Se è necessario comunicare tra progetti o tra non progetti e progetti, il modo migliore è lo spazio dei nomi root (::: o sintassi As Root). I simboli in questo spazio dei nomi sono univoci nell'istanza JMP in esecuzione.
Quindi, come suggerito da Craig, potresti assegnare uno spazio dei nomi a un simbolo nello spazio dei nomi radice. Quindi usa quello spazio dei nomi per simbolo, come As Root(myNsSym):x, invece che per nome.
Se hai solo bisogno di risposte a voci di menu e pulsanti, allora il suggerimento sopra per ritardare l'inizializzazione del componente aggiuntivo fino a quando ognuno di questi è una buona opzione. Quindi, il componente aggiuntivo verrà inizializzato in ogni progetto quando viene utilizzato per la prima volta. E puoi usare un global per verificare l'inizializzazione precedente. L'ho fatto per diversi componenti aggiuntivi in passato. Tuttavia, significa che i tuoi script di avvio e di uscita devono essere piuttosto spogli perché non stai facendo molto quando JMP si avvia/chiude. Anche questo non funziona se hai bisogno di qualcosa oltre alle risposte ai menu o se devi comunicare tra progetti. In questi casi, lo spazio dei nomi root sarebbe probabilmente il migliore.
Infine, puoi anche utilizzare lo script Project OnOpen o lo script Workspace Startup per inizializzare le cose. Vedere https://www.jmp.com/support/help/en/16.0/index.shtml#page/jmp/write-a-project-on-open-script-2.shtml E https://www.jmp.com/support/help/en/16.0/index.shtml#page/jmp/run-startup-scripts-to-control-workspaces.shtml#ww632187 per ulteriori informazioni su quelli. Se già non fai molto nei tuoi script di avvio/uscita per il tuo componente aggiuntivo, potresti anche solo provare Try(Get Addin("...")<<
Ri: Impossibile eseguire componenti aggiuntivi all'interno di ProjectNon sono sicuro; @aaron_andersen saprà la risposta corretta. Il mio rapido test suggerisce che avrai bisogno di un global variabile detenere uno spazio dei nomi; le varie funzioni dello spazio dei nomi (e le funzioni di classe) appaiono cieche agli spazi dei nomi al di fuori del progetto. Quello che ho fatto sembra che funzionerà: dall'esterno del progetto, assegna un global. Ho usato ::: ma penso che sia speciale solo in un progetto.
:::myNameSpace = namespace("myNameSpace"); // "globalize" a namespaceDall'interno del progetto, :::myNameSpace sembra funzionare.
Non sono sicuro di quando viene eseguito lo script OnOpen del progetto e in quale contesto viene eseguito, ma potrebbe far parte della soluzione. Potrebbe eventualmente eseguire il componente aggiuntivo per ricreare le funzioni all'interno dell'ambito del progetto. (Ci ho giocato prima e sembrava che potesse essere utile per organizzare le finestre quando il progetto è stato aperto. non ne avevo bisogno.)
Capisco il motivo per mantenere le funzioni JSL isolate in uno spazio dei nomi senza creare una variabile globale. Spero che ci sia un modo per continuare a farlo funzionare. (Ovviamente i nomi degli spazi dei nomi sono un altro spazio globale... e suppongo che sia ciò che il progetto potrebbe combattere.)
Ri: Impossibile eseguire componenti aggiuntivi all'interno di ProjectCiao Craig,
Ho scritto i componenti aggiuntivi che Lynn sta usando nella sua domanda.Ho creato uno spazio dei nomi per ogni componente aggiuntivo per evitare collisioni variabili.Questi spazi dei nomi esistono solo nell'ambito globale non del progetto?C'è un modo per creare spazi dei nomi all'interno dell'ambito globale ":::"?
Grazie molto,
John
Ri: Impossibile eseguire componenti aggiuntivi all'interno di ProjectL'idea di Craige è anche la prima cosa che esaminerei. (Se non funziona, avrei bisogno di vedere l'adin-in, o almeno di saperne di più su cosa fa, per dare ulteriori suggerimenti).
Aa
Ri: Impossibile eseguire componenti aggiuntivi all'interno di ProjectHo trovato questo:
https://www.jmp.com/support/help/en/16.0/?os=win&source=application&utm_source=helpmenu&utm_medium=application#page/jmp/running-scripts-in-a-project.shtml
"JMP può averne diversi progetto s aperto allo stesso tempo, così come gli elementi non aperti in nessuno progetto.Ogni progetto ha il suo globale ambito, che previene i conflitti causati da variabili con lo stesso nome in differenti progetto S. Nel raro caso in cui desideri condividere variabili specifiche tra tutti i file aperti progetto s, usa il ::: operatore root."
Penso che se il tuo componente aggiuntivo carica gli script che desideri utilizzare da un progetto, ::: potrebbe essere ciò di cui hai bisogno. Non l'ho provato.
@aaron_andersen
Ri: Impossibile eseguire componenti aggiuntivi all'interno di ProjectImmagino che il tuo componente aggiuntivo si basi su variabili globali definite quando il componente aggiuntivo viene caricato e a cui viene fatto riferimento in seguito quando viene richiamata la funzionalità del componente aggiuntivo.Nei progetti, il contesto globale è diverso rispetto ad altri progetti e nel resto di JMP e tutto ciò che è definito dal modulo aggiuntivo non è accessibile dall'interno del progetto.Per combattere questo è possibile impostare tutte le opzioni di menu per aprire file o eseguire script che includono un controllo se il componente aggiuntivo è già caricato (es: controlla se esistono globali appropriati) e se non è caricato, per ricaricare il componente aggiuntivo. In questo modo lo spazio dei nomi e le variabili del componente aggiuntivo vengono caricati la prima volta che l'utente richiama il componente aggiuntivo all'interno di un progetto.
Se non fai affidamento su variabili globali nel tuo componente aggiuntivo, puoi fornire maggiori dettagli su quale funzionalità non funziona?
Re: Impossibile eseguire i componenti aggiuntivi nel progettoNamespace e progetti: purtroppo più complicati di quanto discusso qui...
Ho pensato che sarebbe stata una buona idea creare le funzioni dalla Recall Function Library come funzioni personalizzate e caricarle tramite un AddIn quando JMP si avvia. In questo modo la funzionalità è ben documentata tramite l'indice di scripting e nessun utente deve preoccuparsi di includere la libreria nel proprio AddIn o progetto: è già lì.
Poi ho capito che lo spazio dei nomi originale era stato creato solo nello spazio dei nomi globale di JMP e che dovevo globalizzare lo spazio dei nomi tramite
:::myNameSpace = namespace("myNameSpace"); // "globalize" a namespace
Sfortunatamente, ho riscontrato ulteriori problemi che ho documentato qui:
Spazi dei nomi e progetti
Re: Impossibile eseguire i componenti aggiuntivi nel progettoUn trucco fantastico, grazie @Jasean :
localizzare lo spazio dei nomi radice per utilizzarlo nei progetti
myVar = :::myNs
myVar:x // success
Perché il mio problema non è stato discusso nel 2021?
Qualcuno ha una licenza che funziona con JMP16 e versioni precedenti e potrebbe verificare se c'era un problema nel 2021?
oppure hai usato il trucco di @Jasean "di default" ...