22 agosto 2018

vlax-ename->vla-object : undefined function

Un errore che a volte impedisce di utilizzare i programmi AutoLISP. Vediamo praticamente come risolverlo.


Se si sta utilizzando un programma Lisp (proprio o prelevato dal Web) in AutoCAD ed appare questo messaggio di errore:
”errore: no function definition: vlax-ename->vla-object” 

significa che nella memoria non è disponibile la funzione vlax-ename->vla-object che è richiamata all'interno del programma Lisp che si sta eseguendo.

L’assenza di questa funzione genera un errore che interrompe l’esecuzione del programma... e questo è un grosso problema.

Personalmente ho riscontrato che l’errore generato dall'assenza della funzione si presenta da parecchie versioni di AutoCAD e, nonostante gli anni trascorsi, Autodesk non sembra avere trovato il modo per impedire che si ripresenti su alcuni PC.

Perché accade

Non è ancora chiaro perche a volte si manifesta. Sembra che in fase di aggiornamento con una nuova release di AutoCAD qualcosa vada storto nella scrittura dei registri.

Alcuni valori delle chiavi di registro (che si riferiscono ad un modulo software da caricare: vl16.tbl) sono corrotte. La contemporanea presenza di anti virus e anti male-were potrebbe contribuire al verificarsi dell’evento cosi come l’uso di utility di ‘pulizia’ di Windows ( Clean-up tools ).

In un post di Autodesk è descritta per intero la chiave di registro che memorizza il percorso del file. Teoricamente, si potrebbe anche correggere a mano, ma è bene che questa operazione venga fatta da utenti esperti. Il file vl16.tbl si trova nella stessa cartella dell’eseguibile di AutoCAD (acad.exe).

L'editor dei registi di windows  e le 2 chiavi che puntano al file VL16.TBL

Come risolvere

Sono 3 le potenziali azioni da compiere per risolvere questo problema:

1 -  Forzare il caricamento

Questa prima azione, in verità, non è legata al bug ma a quanto accadeva in precedenti versioni di AutoCAD dove le funzioni estese non venivano caricate di default ma andavano caricate dal programmatore esplicitamente (per questioni di velocità e gestione della memoria).

Provare a caricare queste funzioni estese - tra cui c’è vlax-ename->vla-object  -  digitando sulla linea di comando:

(vl-load-com) 
premere invio, e poi scrivere :

!vlax-ename->vla-object
Premere invio. Se si ottiene in risposta sulla linea di comando un messaggio tipo:

#<SUBR @000000002db0dc28 vlax-ename->vla-object>
significa che la funzione è stata caricata, si può eseguire il file Lisp.
In caso contrario passare al punto 2.

2 - Reinstallare AutoCAD

Provate a riparare l’installazione di  AutoCAD o a reinstallarlo avendo cura di disabilitare - momentaneamente – l’antivirus o anti malware.

Per riparare o reinstallare avviare il “Pannello di controllo” e selezionare “Programmi e funzionalità”, poi l’icona di AutoCAD.
Nella finestra che appare selezionare ”Ripara o reinstalla”.

da pannello di controllo, l'interfaccia del programma di disinstallatone/riparazione di AutoCAD

Da esperienze dirette di miei clienti non sempre questa tecnica funziona, ma è comunque da provare.

3 - Ridefinire la funzione

Si può definire (creare) una funzione che abbia lo stesso nome di quella mancante e dia lo stesso risultato (output).

La bellezza del Lisp è (anche) che permette di ridefinire le funzioni interne con del codice scritto da noi.

Copiare il codice seguente ed incollarlo in testa al file lisp che si sta caricando.

(defun VLAX-ENAME->VLA-OBJECT ( n )
  (vla-handletoobject 
    (vla-get-activedocument 
        (vlax-get-acad-object)) 
 (cdr (assoc 5 (entget n))))
)

Salvare il file e ricaricarlo con il comando Appload.

Nel caso in cui il programma AutoLISP sia in formato non sorgente (quindi .VLX o .FAS) allora bisogna copiare il codice in un file dal nome ACADDOC.LSP .
Se il file non si trova nella cartella principale di AutoCAD bisogna crearlo con un editor di testi.
Usare il comando APPLOAD per caricare il suddetto file e rendere disponibile la funzione.

Brevemente, questa è la spiegazione del codice AutoLisp mostrato sopra:
la funzione vlax-ename->vla-object ha il compito di trasformare un ename - il numero identificativo di un oggetto del disegno – in un formato utilizzabile da delle funzioni VisualLisp basate sul modello ActiveX, si  ottiene lo stesso risultato utilizzando un'altra funzione che restituisca lo stesso tipo di dato.

Un’altra funzione che restituisce il risultato identico a vlax-ename->vla-object  è :
vla-handletoobject.
Come argomento necessita dell’HANDLE di un oggetto , cioè un numero esadecimale che identifica in maniera univoca l’oggetto nel disegno.

Se dopo questi 3 tentativi il problema persiste non resta che mettere mano nei registi di sistema (solo per utenti esperti !) come descritto nel post di Autodesk.



Nessun commento:

Posta un commento