rebcao Posté(e) le 14 février 2014 Posté(e) le 14 février 2014 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 @)
(gile) Posté(e) le 14 février 2014 Posté(e) le 14 février 2014 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
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