CADxp: Compatibilité AutoCAD 2015 - CADxp

Aller au contenu

Page 1 sur 1
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

Compatibilité AutoCAD 2015 Fonction command-s

#1 L'utilisateur est hors-ligne   (gile) 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 10687
  • Inscrit(e) : 02-septembre 05

Posté 27 avril 2014 - 18:23

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 -
Développements sur mesure pour AutoCAD
Image IPB
0

#2 L'utilisateur est hors-ligne   GEGEMATIC 

  • ceinture noire 1er dan
  • Groupe : Membres
  • Messages : 661
  • Inscrit(e) : 04-novembre 05

Posté 28 avril 2014 - 12:45

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

Voir le message(gile), le 27 avril 2014 - 18:23 , dit :

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.

Citation

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

Citation

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
---------------------------------------------------------------------- PowerClic sur http://www.g-eaux.com
0

#3 L'utilisateur est hors-ligne   (gile) 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 10687
  • Inscrit(e) : 02-septembre 05

Posté 28 avril 2014 - 14:39

Citation

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.


Citation

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 -
Développements sur mesure pour AutoCAD
Image IPB
0

Partager ce sujet :


Page 1 sur 1
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

1 utilisateur(s) en train de lire ce sujet
0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)