Aller au contenu

Messages recommandés

Posté(e)

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

Posté(e)

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

Posté(e)
(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...

Posté(e)

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

Posté(e)

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

Posté(e)

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

Posté(e)

Salut

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

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

Joseph Joubert, 1754-1824

Posté(e)

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

Posté(e)
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 1

puis

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

Posté(e)

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

Posté(e)

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

Posté(e)
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...

Posté(e)
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...

Posté(e)
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...

Posté(e)

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

Ne 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

Posté(e)

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

Posté(e)

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

Posté(e)

Ben ça marche pas non plus chez toi !

 

Pour moi non plus pour la réponse 9

La 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

Posté(e)

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

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

Posté(e)

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

Posté(e)

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

Posté(e)

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

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é