Aller au contenu

Messages recommandés

Posté(e)

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 ***_NEUTRE

Mes 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 calque

Ma 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

 

Posté(e)

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

 

./__\.
(.°=°.)
Posté(e)

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...

Posté(e)

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+

Posté(e)

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 !

Posté(e)

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...

Posté(e)

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

 

./__\.
(.°=°.)
Posté(e)

Salut

Difficile 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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

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+

Posté(e)

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+

Posté(e)

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érant

Ce qui me parait logique :casstet:

Cela revient à sélectionner tous les calques, cette partie du filtre ne sert donc à rien.

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

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+

 

 

Posté(e)

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

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é