Aller au contenu

Messages recommandés

Posté(e)

Salut,

 

J'ai découvert un problème de compatibilité de certaines expressions LISP avec AutoCAD 2015.

 

Depuis la version 2012, en plus des fonctions command et vl-cmdf, il existe une nouvelle fonction pour appeler les commandes : command-s.

 

Cette fonction n'apparaît dans l'aide qu'à partir de la version 2014.

D'après l'aide, cette fonction permet une exécution deux fois plus rapide que la fonction command mais ne peux être appelée qu'avec des arguments définis (pas de pause ou d'appel aux fonctions get*** dans les arguments).

 

Avec la version 2015, il y a un changement majeur dans l'architecture interne d'AutoCAD avec l'abandon de la technologie des fibres (ne me demandez pas plus de détails, je serai incapable d'en donner). D'après ce que j'ai compris, cette technologie créée pour faciliter la gestion de documents multiples (MDI) pour les applications mono-thread a ensuite été dépréciée par Microsoft depuis quelques temps et finalement abandonnée par AutoCAD avec la version 2015.

 

L'abandon de cette technologie modifie complètement le contexte d'exécution des commandes. Si c'est invisible pour l'utilisateur final, cela a des conséquences en programmation (surtout en .NET et ObjectARX, mais aussi un peu en LISP).

Toujours d'après ce que j'ai pu comprendre, avant 2015, globalement, quand on appelait la fonction command, l'interpréteur LISP passait la main à l'éditeur d'AutoCAD pour l'exécution de la commande, puis la reprennait pour la suite de l'exécution du code. Avec la technologie utilisée par AutoCAD 2015 on aurait deux contextes d'exécution des commandes : coroutine et subroutine.

 

Les fonctions LISP command et vl-cmdf utilisent l'approche coroutine qui est proche du comportement précédent, elles permettent d'utiliser des 'pauses' ou des appels de fonctions get*** et de décomposer la commande en plusieurs appels.

 

(command "_.pline")
(while (< 0 (getvar 'cmdactive))
 (command pause)
)

 

(vl-cmdf "_.circle"
 (getpoint "\nCentre: ")
 (getdist (getvar "lastpoint") "\nRayon: ")
)

 

La fonction command-s utilise l'approche subroutine qui exécute la commande un peu comme une sous routine sans rendre la main à l'éditeur d'AutoCAD. Elle requiert donc que tous les arguments soient définis et intégrés dans une seule expression appelant command-s.

 

Or, il m'est apparu que certains appels à la fonction command (ou vl-cmdf) ne fonctionnaient plus avec AutoCAD 2015, provoquant une "erreur interne" (VVC: Internal Error).

C'est le cas lorsqu'on appelle command dans la fonction passée en argument à mapcar (que ce soit une fonction lambda ou un defun).

Par exemple, l'expression suivante qui crée des cercles d'après les centres et les rayons contenus dans deux listes fonctionne sans problème jusqu'à AutoCAD 2014.

(mapcar
 '(lambda (c r) (command "_.circle" "_non" c r))
 '((0 0) (24 0) (36 0) (42 0) (45 0))
 '(16 8 4 2 1)
)

 

Pour AutoCAD 2015, il faut absolument remplacer command par command-s:

(mapcar
 '(lambda (c r) (command-s "_.circle" "_non" c r))
 '((0 0) (24 0) (36 0) (42 0) (45 0))
 '(16 8 4 2 1)
)

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Salut,

Encore des problèmes de migration en perspective ...

 

Avec la version 2015, il y a un changement majeur dans l'architecture interne d'AutoCAD avec l'abandon de la technologie des fibres

Est-ce qu'on pourrait espérer une amélioration des performances ?

j'ai vu que le C++ implémente Parallel.Invoke, et d'autre fonctions assez simples pour ajouter du parallèle au programmes c++. mon Autocad 2012 reste désespérément monotache.

 

Depuis la version 2012, en plus des fonctions command et vl-cmdf, il existe une nouvelle fonction pour appeler les commandes : command-s.

sous la 2012, la commande existe, mais elle provoque un blocage est une erreur :

(command-s "_circle" "5,4" "_d" 2.75)

; erreur: une exception s'est produite: 0xC0000005 (Violation d'accès)

; avertissement: fonction unwind ignorée exception

 

Pour AutoCAD 2015, il faut absolument remplacer command par command-s:

(mapcar
 '(lambda (c r) (command-s "_.circle" "_non" c r))
 '((0 0) (24 0) (36 0) (42 0) (45 0))
 '(16 8 4 2 1)
)

 

En fait command-s est un retour à la vieille command: dans les versions < 2000, on ne pouvait faire appel à des (getxxx) dans un (command

il fallait faire:

(command "_line")

(setq pt1 (getpoint))

(setq pt2 (getpoint p2))

(command pt1 pt2 "")

 

au final, la question est : par quoi remplacer les "(command" existant, qui contiennent des pauses et des getxxx : vl-cmdf ou command-s ?

 

Gérald

----------------------------------------------------------------------

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

Posté(e)
Est-ce qu'on pourrait espérer une amélioration des performances ?

j'ai vu que le C++ implémente Parallel.Invoke, et d'autre fonctions assez simples pour ajouter du parallèle au programmes c++. mon Autocad 2012 reste désespérément monotache.

Non, je ne pense pas. AutoCAD est toujours monotache, mais on peut toujours exécuter certains traitements en parallèle. Parallel.Invoke comme AsParallel sont utilisables (il faut au moins le Framework 4.0) pour traiter des objets géométriques (Autodesk.AutoCAD.Geometry) par exemple, parce que ce sont des objets "extérieurs" à la base de données d'AutoCAD.

 

 

au final, la question est : par quoi remplacer les "(command" existant, qui contiennent des pauses et des getxxx : vl-cmdf ou command-s ?

D'après l'aide pour command-s, appeler command-s avec PAUSE ou (getXXX ...) n'est pas valide. pour que command-s puisse s'exécuter dans un contexte "subroutine", il faut que tous les arguments soient définis avant.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité