stephan35 Posté(e) le 4 juillet 2007 Posté(e) le 4 juillet 2007 Bonjour à tous ! Voici l'exposé litéraire de mon problème: J'ai environ 600 calques portant un préfixe numérique suivi d'une désignation. (22_LATERAL,22_FORM,22_EXT 23_XXX, 23_YYY etc)Ces calques servent à classer mes entités par folio, le préfixe numérique étant le numéro de folio.La norme dit que mon cartouche devrait être inserer dans un calque **_NEUTRE (** étant la partie numérique de mon folio)Donc si j'ai 150 Folios, j'ai 150 cartouches placés dans le calque ***_NEUTREMes cartouches portent des noms différents suivant leur utilisation (...) Je dois rechercher un bloc pour y lire ou modifier le contenu de ses attributs.Pour ceci: j'ai 2 listes qui contiennent la liste de mes blocs (cartouches)j'ai 1 liste qui contient la liste des folios a analyser (numérique) &Liste_des_folios Ma première boucle foreach scrute chaque folio Ma deuxième boucle foreach effectue un ssget sur ma liste des pdg pour chaque calqueMa deuxieme boucle foreach effectue un ssget sur ma liste cartouches pour chaque calque (foreach #tmp &Liste_des_folios ;Extrait les titres folio (setq &tmp "requete sql : qui fonctionne <0.015 s") (if &tmp (setq $t1 (nth 0 (nth 0 &tmp)) $t2 (nth 1 (nth 0 &tmp)) $ind (nth 2 (nth 0 &tmp))) (progn ; Recherche des données dans le cartouche !!!! ; &L_PDG et &Liste_des_cartouches doit être initialisé (foreach $cartouche &L_PDG (foreach $layer (list "NEUTRE" "ACTIF" "5" "FCOTES" "NOMENCLATURE" "PUISSANCE" "REPERE") (if (ssget "X"(list (cons 8 (strcat (itoa #tmp) "_" $layer)) (cons 2 (nth 0 $cartouche))) ) (progn (print (strcat "\nAnalyse de "(nth 0 $cartouche)" dans " (itoa #tmp) "_" $layer)) ) ) ) ) (foreach $cartouche &Liste_des_cartouches (foreach $layer (list "NEUTRE" "ACTIF" "5" "FCOTES" "NOMENCLATURE" "PUISSANCE" "REPERE") (if (ssget "X" (list(cons 8 (strcat (itoa #tmp) "_" $layer)) (cons 2 (nth 0 $cartouche)))) (progn (print (strcat "\nAnalyse de "(nth 0 $cartouche)" dans " (itoa #tmp) "_" $layer)) ) ) ) ) ) ) ;;; (alert (strcat (itoa #tmp) $t1 $t2 $ind)) (dcl_ListView_AddItem FOLIO (list (itoa #tmp) $t1 $t2 $ind $nua )) ) Mon gros soucis est le temps de traitement de chaque itération sur le SSGET ~ 30 secondes !!! [surligneur] (ssget "X" (list (cons 8 "calque") (cons 2 "bloc"))) n'est pas rapide [/surligneur] Comment accèlerer le process ??? Comment optimises le process ??? Merci
Tramber Posté(e) le 4 juillet 2007 Posté(e) le 4 juillet 2007 Salut, je n'ai plus le temps de regarder les lisp mais tu ne voulais pas dire plutôt : (cons 2 "INSERT") Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
Bred Posté(e) le 4 juillet 2007 Posté(e) le 4 juillet 2007 Salut,Si tu dois passer en revus tous les blocs et qu'ils sont tous différent, je ne vois pas d'autre manière .... Mais imagine le temps si tu devais le faire "à la main" ....30 secondes est un moindre mal (si tu ne dois pas le répéter toutes les minutes bien sûr...) Mais peut-être que si tu faisais une selection plus "générale" (ex : (setq sel "_X" (ssget '((0 . "INSERT" )))) ) et que tu faisais le tri après par un repeat, tu gagnerais un peu de temps.... à tester..... Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
stephan35 Posté(e) le 4 juillet 2007 Auteur Posté(e) le 4 juillet 2007 Merci TRAMBER pour cette précision ! Mais pas très juste ... Effectivement j'entendait par bloc, le nom du bloc (cons 2 "BLOC")Par contre je peux rajouter le type d'entité soit (cons 0 "INSERT") N'est ce pas ??? A+
stephan35 Posté(e) le 4 juillet 2007 Auteur Posté(e) le 4 juillet 2007 Merci BRED ! Je teste et je diffuse ! Je vais rejouter bêtement dans mes while le (not &selection) pour éviter de continuer à scruter quand j'ai trouvé !!! Si quelqu'un se rappelle de la syntaxe pour ajouter des "and" dans le filtre ???ça m'interesse !!! PS: j'ai 14000 entités dans mon dwg :casstet: (Mais je pense qu'il y a pire ...) Merc à vous !
Bred Posté(e) le 4 juillet 2007 Posté(e) le 4 juillet 2007 Re,un exemple récupérer ici que j'ai dans mes archives : ;;; Grippe tous les cercles de rayons supérieur à 30 et inférieur ou égal à 40 ou égal à 50 ((lambda (/ ss) (setq ss (ssget "_X" '((0 . "CIRCLE") (-4 . "[b]< or[/b]") (-4 . "[b]< and[/b]") (-4 . ">") (40 . 30.0) (-4 . "<=") (40 . 40.0) (-4 . "and>") (-4 . "=") (40 . 50.0) (-4 . "or>") ) ) )(enlever espace en gras) Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Tramber Posté(e) le 4 juillet 2007 Posté(e) le 4 juillet 2007 Oh, ben oui, j'ai lu trop vite, c'est bien le code 0. Mais comme tu le dis toi-même, ca sera + rapide avec le code 0, en l'occurence. Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
Patrick_35 Posté(e) le 4 juillet 2007 Posté(e) le 4 juillet 2007 SalutDifficile de te suivre et de tester un lisp incomplet Regarde du coté de vla-get-activeselectionset afin de passer à la puissance vlisp et gagner ainsi quelques secondes Pour le filtre, tu peux aussi faire (non testé)(ssget "x" (list (cons 0 "INSERT") (cons 8 (list "*NEUTRE","*ACTIF","*5","*FCOTES","*NOMENCLATURE","*PUISSANCE","*REPERE")))) Et en regardant ton lisp, si tu peux éviter deux ou trois niveaux de foerach, cela irait plus vite. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
stephan35 Posté(e) le 5 juillet 2007 Auteur Posté(e) le 5 juillet 2007 Salut patrick_35 ! Bien vue pour les caractères génériques ! ça fonctionne : (cons 8 "118_*) Cependant la strucutre des données n'est pas formaté en liste imbriquée donc le (cons 8 (list ***)) devient inopérant :( Mais ça me fait avancer ! donc merci !!!! A+
stephan35 Posté(e) le 5 juillet 2007 Auteur Posté(e) le 5 juillet 2007 Super ! Voilà un problème résolu et optimisé !!!! Il est vrai que je n'avais peut-être pas fourni tous les éléments pour y arriver correctement, soit ! Le principale c'est d'y arriver , et c'est le cas ! Pour conclure: On a supprimé les 2 boucles foreach imbriquées qui multipliait les requêtes ssget inutilement, car, dans tous les cas de figures je n'avais forcément qu'un seul bloc cartouche insérer dans l'un des 13 calques génériques commencant par les caractères générique "folio_****",ce qui revient à dire (ssget "X" (list (cons 8 "222_*"))) pour le folio 122 , donc 13 requêtes de gagnées (multipliée par le reste ...)Puis idem pour les cartouches, il suffisait de construire un filtre and / or pour ajouter des cartouches dans la liste du filtre (cons -4 " [b]<[/b]or")(cons 2 "Cartouch1")(cons 2 "Cartouche2)(cons 2 "Cartouch3")(cons -4 "or [b] >[/b]") ; mélange des méthodes fournies par bred et patrick_35 (cadxp) encore merci à eux ! (setq &filtre (list (cons -4 " (foreach $cartouche &L_PDG (setq &filtre (append &filtre (list (cons 2 (nth 0 $cartouche))))) ) (foreach $cartouche &Liste_des_cartouches (setq &filtre (append &filtre (list (cons 2 (nth 0 $cartouche))))) ) (setq &filtre (append &filtre (list (cons -4 "or>")))) (foreach #tmp &Liste_des_folios ;Extrait les titres folio (setq &tmp (@SQL_& (STRCAT "SELECT TRIM(T1),TRIM(T2),TRIM(IND),TRIM(FOL) FROM TRANCHE WHERE FONC='SOM' and FOL='" (@000 #tmp #nbdigit) "' ")) $t1 "?" $t2 "?" $ind "?" $nua "?" ) (if &tmp (setq $t1 (nth 0 (nth 0 &tmp)) $t2 (nth 1 (nth 0 &tmp)) $ind (nth 2 (nth 0 &tmp))) (progn ; Recherche des données dans le cartouche !!!! ; &L_PDG et &Liste_des_cartouches doit être initialisé (setq &selection (ssget "X" (append (list (cons 8 (strcat (itoa #tmp) "_*"))) &filtre))) (if &selection (prompt (strcat "\nCartouches trouvés pour le folio " (itoa #tmp) " : " (itoa (sslength &selection)))) (prompt (strcat "\nCartouches trouvés pour le folio " (itoa #tmp) " : 0" )) ) ) ) (dcl_ListView_AddItem FOLIO (list (itoa #tmp) $t1 $t2 $ind $nua )) ) Patrick_35, désolé je n'ai pas pris le temps de fournir toutes les fonctions pour tester mon bout de lisp ! Merci à tous ! a+
Patrick_35 Posté(e) le 5 juillet 2007 Posté(e) le 5 juillet 2007 Tu peux encore améliorer ton filtre (cons -4 " [b]<[/b]or")(cons 2 "Cartouch1")(cons 2 "Cartouche2)(cons 2 "Cartouch3")(cons -4 "or [b] >[/b]") en(cons 2 "Cartouch1,Cartouche2,Cartouch3")ou mieux(cons 2 "Cartouch*") le (cons 8 (list ***)) devient inopérantCe qui me parait logique :casstet: Cela revient à sélectionner tous les calques, cette partie du filtre ne sert donc à rien. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
stephan35 Posté(e) le 5 juillet 2007 Auteur Posté(e) le 5 juillet 2007 Tu peux encore améliorer ton filtre Chapeau BAS !, En écriture, éffectivement !Mais Le traitement serat-il plus rapide ???? ou mieux (cons 2 "Cartouch*") Oops, meaculpa, effectivement, mais en fait, ils portent des noms complêtements différents ... citation extraite du message original: le (cons 8 (list ***)) devient inopérant Ce qui me parait logique Cela revient à sélectionner tous les calques, cette partie du filtre ne sert donc à rien. J'ai du mal à m'exprimer correctement !!! Ce que je voulais te dire, c'est que cette syntaxe est fausse pour un filtre ! ,on ne peut imbriquer une liste dans un cons, différe de la base de création des entités, donc refoulée, (pour un filtre bien entendu , je me répète, surement l'âge ...) A+
Patrick_35 Posté(e) le 6 juillet 2007 Posté(e) le 6 juillet 2007 Avec un test de rapidité ([url=http://www.theswamp.org/lilly_pond/mp/lisp/benchmark.txt]Benchmark[/url] (list '(setq a1 (ssget "x" (list (cons 0 "insert") (cons -4 "[b]<[/b]or")(cons 2 "bloc1")(cons 2 "bloc3")(cons 2 "bloc4")(cons -4 "or[b]>[/b]")))) '(setq a2 (ssget "x" (list (cons 0 "insert") (cons 2 "bloc1,bloc3,bloc4")))))) Elapsed milliseconds / relative speed for 64 iteration(s): (SETQ A2 (SSGET "x" (LIST (CONS 0 "i...).....1875 / 1.10 (SETQ A1 (SSGET "x" (LIST (CONS 0 "i...).....2063 / 1.00 Conclusion : Ne pas utiliser les or dans un filtre est donc plus rapide et plus court en écriture. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
stephan35 Posté(e) le 6 juillet 2007 Auteur Posté(e) le 6 juillet 2007 Merci patrick ! J'en profiterai pour tester l'outil benchmark .... A+
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