Aller au contenu

La commande DECOMPOSER dans un LISP


Messages recommandés

Posté(e)

Bonjour à Toutes et à Tous,

 

Je suis étonné de ne rien trouver de concluant pour DECOMPOSER des POLYLIGNES via un LISP ?

 

Que ce soit en passant par une BOUCLE LISP ou la commande XPLODE, ça prend un TEMPS fou 30000 POLYLIGNES environ 2 mn... Alors que ce même dessin via une simple MACRO : ^c^c_ai_selall;DECOMPOS; c'est instantané !!!

 

Curieux ?

 

Je vous remercie

 

Christian

 

 

 

 

 

Formateur, Consultant Expert AutoCAD, REVIT MEP, INVENTOR, télécharger , des Outils AutoCAD...

cad123 @ wanadoo.fr (enlever les espaces de part et d'autre de @)

Posté(e)

Salut,

 

Appeler une commande depuis un LISP est en général assez lent et c'est encore plus lent avec la commande _EXPLODE qui est couteuse en elle même et doit être appelée pour chaque entité en LISP (ce que font en interne toutes les commandes qui acceptent un jeu de sélection).

 

Dès qu'on doit traiter une collection importante d'entités, il faut éviter d'appeler les commandes AutoCAD et traiter les entités en "pur autoLISP" avec entmake et/ou entmod ou en "Visual LISP" (interface COM).

Pour décomposer des polylignes, à moins de re-programmer la commande _EXPLODE (créer une ligne ou un arc pour chaque segment avec entmake et effacer la polyligne avec entdel) ce qui risque d'être assez couteux, il faut passer par l'interface COM.

 

(defun c:xplodeplines (/ space ss)
 ;; charger les fonctions Visual LISP
 (vl-load-com)

 ;; démarrer le chrono
 (setq t0 (* 84600 (getvar 'tdusrtimer)))

 ;; créer une variable globale pour le document actif si elle n'existe pas déjà
 (or *acdoc* (setq *acdoc* (vla-get-ActiveDocument (vlax-get-acad-object))))

 ;; sélectionner toutes les polylignes de l'espace courant
 (if (ssget "_X" (list '(0 . "LWPOLYLINE") (cons 410 (getvar 'ctab))))
   (progn
     ;; démarrer un groupe d'annulation
     (vla-StartUndoMark *acdoc*)
     
     ;; pour chaque polyligne sélectionnée
     (vlax-for	pl (setq ss (vla-get-ActiveSelectionSet *acdoc*))
(vla-Explode pl) ; décomposer la polyligne
(vla-Delete pl) ; supprimer la polyligne
     )
     (vla-Delete ss); supprimer le jeu de sélection (libérer les ressources)

     ;; terminer le groupe d'annulation
     (vla-EndUndoMark *acdoc*)
   )
 )

 ;; arréter le chrono et afficher le temps d'exécution
 (setq t1 (* 84600 (getvar 'tdusrtimer)))
 (princ (strcat "\nTemps d'exécution : " (rtos (- t1 t0)) " secondes"))
 (princ)
)

 

Sur mon poste le code ci-dessus met moins de 9 secondes pour décomposer 30000 rectangles.

 

En .NET, il je descends à 2 secondes, ce qui semble à peu près équivalent au temps d'exécution de la commande native (certainement programmée en objectARX/C++).

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é