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 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 azioni che si possono tentare 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.

In alternativa si puo scaricare il file con il codice vlax-ename.lsp e copiare il suo contenuto.

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.

In fase di caricamento del programma, se appare un messaggio simile:

selezionare il pulsante "No"... AutoCAD ci avvisa che una funzione interna sta per essere ridefinita e ci chiede se entrare in una 'loop di interruzione'.

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.



5 commenti:

  1. Dear Domenico,

    I have faced a serious problem and have not found any satisfactory solution.

    This is exactly the mistake you describe in this post. I have tried the first and second suggestions without success.

    I was excited by the third suggestion, but failed to make it happen.

    Difficulties:

    - Error in number of parentheses
    - Apparently in the name of the defun there is an extra space.
    - After the above corrections, upon loading I get an "Assignment to protected symbol" message and any option chosen, I was unsuccessful.

    Any suggestion?

    Thank you very much.

    Ney Paula
    ney.paula@gmail.com

    RispondiElimina
    Risposte
    1. Hi Paula
      actually maybe my post is a little inaccurate. Sorry

      About the errors that you signals the solution should be:

      - [Error in number of parentheses], probably in the copy & paste you didn't select all the code

      - [Apparently in the name of the defun there is an extra space], I noticed that this happens when you use the google translator on the code of the programming languages ​​... from Italian to English and vice versa

      - [After the above corrections, upon loading I get an "Assignment to protected symbol" message and any option chosen, I was unsuccessful] The message appears because AutoCAD warns us that we are redefining or changing an internal function's value. In this case you need to select the "No" button in the alert window.

      It seems very strange to me that you can't load the function even if you choose "No"...
      Try again with the file I sent you and let me know how it goes.

      I will add this information and link to download the LSP to the post to make it more precise.

      Thanks Paula

      Elimina
    2. First of all I would like to congratulate you on your willingness to share your enormous knowledge. Thank you very much. I will leave here some comments that may help other readers.

      As you said the language translation itself was responsible for the following errors in the programming code that I copied:
      - deleted one of the parentheses ')'
      - added extra space in title

      There is still a question: The code you submitted redefines the VLAX-ENAME-> VLA-OBJECT function, however I use several other functions as VLAX-LDATA-PUT VLAX-LDATA-GET etc.

      These other functions would also have to be redefined, correct?

      Would you have any tips where to search the code of these other functions in order to redefine them the same way you did with the VLAX-ENAME-> VLA-OBJECT function?

      Once again I thank you for helping me on this huge problem that I have been facing and that only here I am advancing.

      Greetings.

      Ney Paula

      Elimina
    3. why do you want to redefine the functions VLAX-LDATA-PUT and VLAX-LDATA-GET ???

      I don't know that there are error messages with these functions as it happens with vlax-ename->vla-object.

      Do you use a different CAD than AutoCAD?

      Theoretically VLAX-LDATA-PUT and VLAX-LDATA-GET could be redefined using the Dictionary writing/reading, but you have to be good at entering all the data because there are fields related to the Reactors and the Main dictionary (see dictadd, namedobjdict functions and so on)

      Elimina
  2. Questo commento è stato eliminato dall'autore.

    RispondiElimina