Bred Posté(e) le 6 juin 2008 Auteur Posté(e) le 6 juin 2008 Salut,(gile), en fait, en approfondissant ton code en réponse 10 qui marche, je me suis aperçu qu'en fait il ne réponds pas à mon problème !tu n'active pas une sélection, récupérable par vla-get-ActiveSelectionSet !Tu boucles sur une sélection enregistré dans une variable....(vlax-for o sel1 (vla-put-Color o 3)) Tes précédents codes correspondait plus à ma demande (mais ne fonctionnais pas...) Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Patrick_35 Posté(e) le 6 juin 2008 Posté(e) le 6 juin 2008 Re, Le traitement des listes est largement plus commode que celui des SelectionSet en vlisp et semble aussi plus rapide.Pour ce qui est de l'utilisation des listes, je suis d’accord, c'est le plus simple.Mais en ce qui concerne la rapidité, je mettrai un bémol par rapport à tes tests car il faut quand même faire une boucle pour convertir la sélection en liste. Ce qui n'apparaît pas. Et pour éviter de redéfinir une variable locale dans chacune des routines, j'y met l'expression :(or *acdoc* (setq *acdoc* (vla-get-ActiveDocument (vlax-get-acad-object))))Faire un test pour éviter de re-déclarer une variable globale, pourquoi pas.Un test du benchmark démontre qu'on est gagnant, mais cela doit jouer à la milliseconde.Elapsed milliseconds / relative speed for 16384 iteration(s): (OR *ACDOC* (SETQ *ACDOC* (vla-get-A...).....1016 / 1.35 <fastest> (SETQ *ACDOC* (vla-get-ActiveDocumen...).....1375 / 1.00 <slowest> Dur à maitriser le vla, suivant les versions le comportement est différent :casstet:Je ne trouve pas. Il y a parfois des choses surprenantes mais on aime se "prendre la tête". Cela m'incite pas trop à l'utiliser malgré ses performances. Cela se comprend, mais es-tu motivé pour passer au vlisp ;)Sans oublier que l'on peut jouer avec les activex, et là, on peut faire des choses :D @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 6 juin 2008 Posté(e) le 6 juin 2008 Re, Mais en ce qui concerne la rapidité, je mettrai un bémol par rapport à tes tests car il faut quand même faire une boucle pour convertir la sélection en liste. Ce qui n'apparaît pas. S'il s'agit de traiter le jeu de sélection courant, bien sûr que j'utilise ActiveSelectionSet. Mais j'avais cru comprendre que Bred voulait activer un jeu de sélection qui n'était plus le jeu courant, comme ça ne fonctionnait pas bien avec sssetfirst, j'avais pensé à ajouter à la collection des SelectionSets le jeu après le ssget (réponses 10 et 16) et pour remplir ce jeu de sélection enregistré, il faut aussi faire une boucle plus un vla-addItems... Faire un test pour éviter de re-déclarer une variable globale, pourquoi pas. Un test du benchmark démontre qu'on est gagnant, mais cela doit jouer à la milliseconde. En fait, c'est surtout quand je travaille à la console VisualLISP, *acad* *acdoc* étant chargées au démarrage, ça m'évite de taper trop souvent (vla-get-activeSelectionSet (vlax-get-acad-object)).Je crois me souvenir avoir trouvé cette idée chez un des "cador" sur TheSwamp. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 6 juin 2008 Posté(e) le 6 juin 2008 Re, De mon coté, je me suis amusé à convertir un jeu de sélection classique dans l'activeselectionset (defun vl_ssget(js / lst n sel) (setq sel (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object))) n 0 ) (vla-clear sel) (while (ssname js n) (setq lst (cons (vlax-ename->vla-object (ssname js n)) lst) n (1+ n)) ) (vlax-invoke sel 'additems lst) ) (setq js1 (ssget)) (setq js2 (ssget)) (vl_ssget js1) (vla-get-count (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object)))) (vl_ssget js2) (vla-get-count (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object)))) Maintenant, son intérêt... :P Je pense comme (gile) qu'il est plus simple de rester sur des listes.Ou alors d'utiliser vraiment le vlisp et de créer ses propres jeux de sélections. Plus de bidouiller entre autolisp et vlisp Un exemple qui ne sélectionne à l'écran que du texte.(setq sel (vla-get-selectionsets (vla-get-activedocument (vlax-get-acad-object)))) (setq filtre_dxf (vlax-make-safearray vlax-vbinteger '(0 . 0))) (setq filtre_type (vlax-make-safearray vlax-vbvariant '(0 . 0))) (vlax-safearray-fill filtre_dxf '(0)) (vlax-safearray-fill filtre_type '("TEXT,MTEXT")) (if js (vla-clear js) (setq js (vla-add sel "JS")) ) (vla-selectOnScreen js filtre_dxf filtre_type)Moins simple q'un ssget ;) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Bred Posté(e) le 6 juin 2008 Auteur Posté(e) le 6 juin 2008 merci patrick !Mais désolé, chez moi, ça ne fonctionne pas...j'ai mis ton second code en commande, avec retour des valeurs trouvé :(defun c:test () (setq js1 (ssget)) (setq js2 (ssget)) (vl_ssget js1) (setq n1 (vla-get-count (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object))))) (vl_ssget js2) (setq n2 (vla-get-count (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object))))) [b] (list n1 n2)[/b] ) ... et ça ne me retourne en fait deux fois la valeur de la seconde selection (js2).... Commande: testChoix des objets: Spécifiez le coin opposé: 4 trouvé(s)Choix des objets:Choix des objets: Spécifiez le coin opposé: 2 trouvé(s)Choix des objets:(2 2)Commande: [Edité le 6/6/2008 par Bred] Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Patrick_35 Posté(e) le 8 juin 2008 Posté(e) le 8 juin 2008 Re gruuumf :casstet: J'avais testé et ça fonctionnait.J'ai du me mélanger les pinceaux dans mes tests.Je regarde demain @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Bred Posté(e) le 8 juin 2008 Auteur Posté(e) le 8 juin 2008 merci !pour info je suis en déplacement toutes cette semaine, je ne pourrais sans doute pas suivre...Donc, rendez-vous dans 5 jours ! Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Patrick_35 Posté(e) le 9 juin 2008 Posté(e) le 9 juin 2008 Re, J'ai compris d'où vient mon erreur.(setq sel (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object)))) (vla-clear sel)Maintenant un (vla-get-count sel) me retourne 0.Si je fais, pour vérifier un (vla-get-count (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object)))), je trouve un nombre différent de 0 :oPire, je refais un (vla-get-count sel) qui me retrouve le même nombre :oConclusion, un (vla-clear sel) n'est qu'une illusion car il ne m'efface pas réellement le jeu de sélection.Il ne reste plus qu'à utiliser une autre solution que j'ai donné un peu avant qui est de faire une sélection en pure vl, sans ssget. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Bred Posté(e) le 14 juin 2008 Auteur Posté(e) le 14 juin 2008 Salut,Merci pour vos recherches et votre aide.Je vais faire autrement, sans utiliser l' "activeselection"..... Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
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