(gile) Posté(e) le 27 avril 2014 Posté(e) le 27 avril 2014 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
GEGEMATIC Posté(e) le 28 avril 2014 Posté(e) le 28 avril 2014 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 fibresEst-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 (commandil 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.frBlog: http://g-eaux.over-blog.com
(gile) Posté(e) le 28 avril 2014 Auteur Posté(e) le 28 avril 2014 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
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant