Aller au contenu

Activer Sélection ?


Bred

Messages recommandés

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

Lien vers le commentaire
Partager sur d’autres sites

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 Patrick

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

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

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 -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

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 Patrick

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

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

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: test

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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 :o

Pire, je refais un (vla-get-count sel) qui me retrouve le même nombre :o

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

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

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

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é