Bred Posté(e) le 5 juin 2008 Posté(e) le 5 juin 2008 Salut,J'ai une sélection sous forme " < Selection set: xxxx > " Je voudrais récupérer cette selection par un vla-get-activeselectionset Donc je voudrais "activer" < Selection set: xxxx >... c'est possible ? mon code n'est pas montrable (trop long et trop brouillon) :Je fais une boucle dans lequel je récupère et traite une sélection en passant par vla-get-activeselectionset, et en gérant une option "undo", je supprime les objets nouvellement créer pour récupérer l'ancienne sélection dans une liste, et donc quand je reviens au début de ma boucle, vla-get-activeselectionset ne récupérés rien.... Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
(gile) Posté(e) le 5 juin 2008 Posté(e) le 5 juin 2008 Salut, Si tu fais : (setq ss1 (ssget))(setq ss2 (ssget)) ActiveSelectionSet correspond à ss2 (celui qui est actif). Si tu veux activer ss1, fais : (sssetfirst nil ss1) et ActiveSelectionSet correspondra à ss1. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Bred Posté(e) le 5 juin 2008 Auteur Posté(e) le 5 juin 2008 (sssetfirst nil ss1) et ActiveSelectionSet correspondra à ss1. Sûr ?je l'ai déjà fait et ça ne semblais pas marcher....je vais re-rester. merci, en tous cas ! Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Bred Posté(e) le 5 juin 2008 Auteur Posté(e) le 5 juin 2008 Ben je confirme, ça ne semble pas fonctionner ! (setq s1 (ssget) s2 (ssget)) (sssetfirst nil s1) (setq sel (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object)))) (vlax-for ent sel (vla-delete ent)) ; erreur: Erreur Automation Echec de l'appel AddItems d'une méthode sur une interface IAcadSelectionSet Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
(gile) Posté(e) le 5 juin 2008 Posté(e) le 5 juin 2008 Re, Ça fonctionne chez moi, mais j'ai déjà eu ce type de message avec vla-get-activeselectionset, il me semble que c'était dû à des annulation (undo).Essaye dans un nouveau dessin, peut-être est-il prudent de faire un (vla-delete sel) avant le (sssetfirst nil s1) ? (setq s1 (ssget)) (setq s2 (ssget)) (setq sel (vla-get-ActiveSelectionSet *acdoc*)) (vlax-for o (setq sel (vla-get-ActiveSelectionSet *acdoc*)) (vla-put-Color o 2) ) (vla-delete sel) (sssetfirst nil s1) (vlax-for o (setq sel (vla-get-ActiveSelectionSet *acdoc*)) (vla-put-Color o 3) ) (sssetfirst nil) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Bred Posté(e) le 5 juin 2008 Auteur Posté(e) le 5 juin 2008 Re,En effet, j'ai changé de dessin test et ça fonctionne mieux... mais ça fonctionne pas ! Ton code, il me transforme les objets en vert, mais c'est la seconde sélection qu'il transforme ! (s2)Pour le mien, il supprime le 2 (alors que le 1 est bien "gliphé") Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Patrick_35 Posté(e) le 5 juin 2008 Posté(e) le 5 juin 2008 SalutJe ne suis pas certain de bien comprendre. Un exemple pour parcourir et créer une liste des objets de la sélection active. (la liste n'est pas obligatoire, c'est juste pour la démo)(vlax-for ent (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object))) (setq lst (cons ent lst)))Ou(vlax-map-collection (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object))) '(lambda(ent)(setq lst (cons ent lst)))) Dans ta boucle, en vlisp, tu peux attribuer une variable à un objet crééex : (setq new (vla-add ...))Et ensuite mettre cette variable dans une liste qui sera facile à gérer. @+ 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 5 juin 2008 Posté(e) le 5 juin 2008 Ton code, il me transforme les objets en vert, mais c'est la seconde sélection qu'il transforme ! (s2) :casstet: Chez moi, les objets de s1 sont transformés en vert (3) et ceux de s2 en jaune (2)... Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Bred Posté(e) le 5 juin 2008 Auteur Posté(e) le 5 juin 2008 Chez moi, les objets de s1 sont transformés en vert (3) et ceux de s2 en jaune (2)...Attends, y'a un truc qui va pas....en effet, j'ai bien un changement de couleur (jaune puis vert), mais que sur s2 !et j'ai testé sur 2006,2007,2008 et 2009 !!!! Patrick :Traiter une "activeselectionset" avec vlax-for je sais faire. (gile) à compris ce que je voudrais, et son lisp est parlant (mais ne fonctionne pas chez moi) : Selection 1puisSelection 2 => je veux rendre actif selection1 pour le récupérer avec vla-get-activeselectionset.... Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
(gile) Posté(e) le 5 juin 2008 Posté(e) le 5 juin 2008 Et comme ça avec des cercles et des polylignes dans l'espace objet, tous les cercles devraient être changés en vert et toutes les polylignes en jaune. (setq s1 (ssget "_X" '((410 . "Model") (0 . "CIRCLE")))) (setq s2 (ssget "_X" '((410 . "Model") (0 . "LWPOLYLINE")))) (setq sel (vla-get-ActiveSelectionSet *acdoc*)) (vlax-for o (setq sel (vla-get-ActiveSelectionSet *acdoc*)) (vla-put-Color o 2) ) (vla-delete sel) (sssetfirst nil s1) (vlax-for o (setq sel (vla-get-ActiveSelectionSet *acdoc*)) (vla-put-Color o 3) ) (vla-delete sel) (sssetfirst nil) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 5 juin 2008 Posté(e) le 5 juin 2008 Ou encore, en ajoutant un jeu de sélection à la collection, peut être moins élé gant mais ça devrait fonctionner. (setq s1 (ssget "_X" '((410 . "Model") (0 . "CIRCLE")))) (setq sel1 (vla-add (vla-get-SelectionSets *acdoc*) "sel1")) (vlax-for obj (vla-get-ActiveSelectionSet *acdoc*) (setq lst (cons obj lst)) ) (vlax-invoke sel1 'addItems lst) (setq s2 (ssget "_X" '((410 . "Model") (0 . "LWPOLYLINE")))) (vlax-for o (setq sel (vla-get-ActiveSelectionSet *acdoc*)) (vla-put-Color o 2) ) (vlax-for o sel1 (vla-put-Color o 3)) (vla-delete sel) (vla-delete sel1) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Bred Posté(e) le 5 juin 2008 Auteur Posté(e) le 5 juin 2008 tous les cercles devraient être changés en vert et toutes les polylignes en jaune.Hé ben non ! :casstet: y'a que les polylignes qui change de couleur (jaune, puis finis vert).... Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Bred Posté(e) le 5 juin 2008 Auteur Posté(e) le 5 juin 2008 Ou encore, en ajoutant un jeu de sélection à la collection, peut être moins élé gant mais ça devrait fonctionner.là oui !....Mais faut que je vois si je peux gérer ça dans mon lisp. merci ! (Mais c'est bizarre que les versions précédente fonctionne chez toi et pas chez moi...personne d'autre pour tester ?) Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
lili2006 Posté(e) le 5 juin 2008 Posté(e) le 5 juin 2008 Bonsoir à toutes et tous, personne d'autre pour tester ? Je veux bien tenter mais je ne sais pas comment m'y prendre,... :cool: Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
Bred Posté(e) le 5 juin 2008 Auteur Posté(e) le 5 juin 2008 Je veux bien tenter mais je ne sais pas comment m'y prendre,... Tu dessines deux groupes d'objets queqluonques. Tu copie ce lisp de (gile) en mémoire : (defun c:test () (vl-load-com) (setq *acdoc* (vla-get-activedocument (vlax-get-acad-object))) (setq s1 (ssget)) (setq s2 (ssget)) (setq sel (vla-get-ActiveSelectionSet *acdoc*)) (vlax-for o (setq sel (vla-get-ActiveSelectionSet *acdoc*)) (vla-put-Color o 2) ) (vla-delete sel) (sssetfirst nil s1) (vlax-for o (setq sel (vla-get-ActiveSelectionSet *acdoc*)) (vla-put-Color o 3) ) (sssetfirst nil) (princ) ) Et tu le cole dans la ligne de commande et tu valides. Si tu tapes "test", tu dois selectionner ton premier groupre d'objet, tu valides, puis tu dois selectionner l'autre groupe d'objet, tu valides... Qu'est passa ? :casstet: [Edité le 5/6/2008 par Bred] Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
lili2006 Posté(e) le 5 juin 2008 Posté(e) le 5 juin 2008 Re, Ok Bred Alors pour le premier groupe d'objet (à gauche), il ne s'est rien passé.Pour le second groupe (à droite), la couleur est passé de noir à vert => (V2008 pleine !) http://images0.hiboox.com/images/2308/6f1e8cde2c071043b6a647800963e39f.jpg Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
(gile) Posté(e) le 5 juin 2008 Posté(e) le 5 juin 2008 Ben ça marche pas non plus chez toi ! Le premier jeu de sélection devrait être passé en vert, le second en jaune. Pour Bred,là où tu ferais (setq s1 (ssget)) en AutoLISP, tu peux faire : (if (ssget) (progn (vlax-for obj (vla-get-ActiveSelectionSet *acdoc*) (setq lst (cons obj lst)) ) (setq s1 (vla-add (vla-get-SelectionSets *acdoc*) "sel1")) (vlax-invoke s1 'addItems lst) ) ) La variable s1 contient un jeu de sélection vlisp utilisable avec vlax-for ou vlax-map-collectionNe pas oublier un (vla-delete s1) pour le supprimer de la collection. Mais je pense qu'il serait plus pratique d'avoir une liste de vla-object à traiter par la suite, les jeux de sélection étant surtout utiles avec les command en AutoLISP. [Edité le 5/6/2008 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Bred Posté(e) le 5 juin 2008 Auteur Posté(e) le 5 juin 2008 Merci lili2006 pour le test. Merci (gile) pour ta proposition, je vais m'y pencher. Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
(gile) Posté(e) le 5 juin 2008 Posté(e) le 5 juin 2008 J'avais fait quelques LISP avec une option "annUler" je pense les avoir traiter le plus souvent avec une (ou des ) liste(s).Je n'en retrouve qu'un, (ici), et pas le plus facile à déchiffrer. Il y a une routine : segmentundo qui met à jour 2 listes et un compteur, la routine définissant la commande (c:3dpolyarc) concerne quasi exclusivement les entrées utilisateur dans des boucles imbriquées. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
bonuscad Posté(e) le 5 juin 2008 Posté(e) le 5 juin 2008 Ben ça marche pas non plus chez toi ! Pour moi non plus pour la réponse 9La 10, par contre fonctionne. Ceci sous une 2008 Je regarde de plus près, si je trouve quelque chose. [Edité le 6/6/2008 par bonuscad] Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Patrick_35 Posté(e) le 6 juin 2008 Posté(e) le 6 juin 2008 Bonjour Le réponse n°9 de (gile) fonctionne parfaitement sur ma A2006.Il ne faut pas oublier de déclarer (setq *acdoc* (vla-get-activedocument (vlax-get-acad-object))) @+ 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 Salut,merci Bonuscad et Patrick pour les test. Patrick : j'ai testé la réponse 9 sur 2006, et chez moi ça ne fonctionne pas... Je ne sais pas si tu bosses avec l'éditeur Autocad, mais voilà le retour que la console me fait, si tu as une différence, on peut peut-être déceler le bug en passant par là : < Selection set: 14 > < Selection set: 16 > #< VLA-OBJECT IAcadSelectionSet 0ad982b4 > nil nil (nil < Selection set: 14 >) nil nil (nil) Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
(gile) Posté(e) le 6 juin 2008 Posté(e) le 6 juin 2008 Le réponse n°9 de (gile) fonctionne parfaitement sur ma A2006. Ça me rassure de voir qu'il n'y a pas que chez moi (A2007) que ça marche :cool: En tout état de cause, je persiste à penser que plus judicieux, si le jeu de sélection n'est pas traité tout de suite après le ssget avec vla-get-ActiveSelectionSet, c'est de conserver son contenu dans une liste de vla-object créée avec vla-get-ActiveSelectionSet.Le traitement des listes est largement plus commode que celui des SelectionSet en vlisp et semble aussi plus rapide. Avec le bout de code donné réponse 16 on crée une liste (lst) et un jeu de sélection (s1) contenant les mêmes vla-object. J'ai fait un petit benchmark avec 4 fonctions utilisant respectivement foreach, mapcar, vlax-for et vlax-map-collection : (defun test1 (lst / col) (foreach o lst (setq col (vla-get-Color o)) (vla-put-Color o 1) (vla-put-Color o col) ) ) (defun test2 (lst / col) (mapcar '(lambda (o) (setq col (vla-get-Color o)) (vla-put-Color o 1) (vla-put-Color o col) ) lst ) ) (defun test3 (sel / col) (vlax-for o sel (setq col (vla-get-Color o)) (vla-put-Color o 1) (vla-put-Color o col) ) ) (defun test4 (sel / col) (vlax-map-collection s1 '(lambda (o) (setq col (vla-get-Color o)) (vla-put-Color o 1) (vla-put-Color o col) ) ) ) _$ (benchmark '((test1 lst) (test2 lst) (test3 s1) (test4 s1)))Benchmarking .........Elapsed milliseconds / relative speed for 64 iteration(s): (TEST2 LST).....1281 / 1.12 (TEST1 LST).....1297 / 1.11 (TEST4 S1)......1421 / 1.01 (TEST3 S1)......1438 / 1.00 Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
bonuscad Posté(e) le 6 juin 2008 Posté(e) le 6 juin 2008 Je viens d'essayer au boulot sous Map 2008 Même constatation, sauf que ici j'ai du prendre en compte la remarque de patrick_35 pour faire fonctionner les 2 codes, à savoir: (setq *acdoc* (vla-get-activedocument (vlax-get-acad-object))) Sous une 2008 simple je n'avais pas eu besoin de faire cette déclaration... Dur à maitriser le vla, suivant les versions le comportement est différent :casstet: Cela m'incite pas trop à l'utiliser malgré ses performances. Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
(gile) Posté(e) le 6 juin 2008 Posté(e) le 6 juin 2008 Salut Bonuscad, Sous une 2008 simple je n'avais pas eu besoin de faire cette déclaration... *acdoc* est une variable globale que j'utilise désormais systématiquement en vlisp pour éviter d'avoir à entrer (vla-get-ActiveDocument (vlax-get-acad-object)) quand je fais des test. 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)))) Tu devais donc avoir chargé une routine contenant cette expression dans ton AutoCAD 2008. 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