Aller au contenu

Finir une commande avec une sélection (vb.net)


Lommig

Messages recommandés

Bonjour,

 

Je cherche à terminer une commande avec une sélection d'objets à l'écran (dans le même genre que "sélection rapide" ...). Mes objets peuvent être stockés sous deux formes :

 

- UN JEUX DE SELECTION

Dim Selection As AcadSelectionSet

' La sélection suit un filtre

OU

- UN TABLEAU D'OBJETS

Dim ListeObjets() As AcadEntity

' Si l'objet (point, bloc, polyligne, ...) répond à des critères particuliers, je l'ajoute à la liste...

 

A la fin de ma commande, je souhaite avoir ces objets sélectionnés à l'écran.

(Actuellement, je contourne le problème en créant un groupe, en y ajoutant les objets et en utilisant SendCommand("Select g " & NomDuGroupe) à la fin de ma commande...)

 

Avez-vous une méthode plus "propre" ? sans utiliser "SendCommand" ?

 

Merci d'avance pour vos conseils

AutoCAD, AutoCAD Map3D, AutoCAD Architecture, Revit, COVADIS, InfraWorks 360, ReCap 360, ...

BIM Infrastructure

Lien vers le commentaire
Partager sur d’autres sites

Sur ta commande, tu dois activer le drapeau UsePickSet qui demande à AutoCAD de conserver la sélection courante au démarrage de la commande. Ensuite tu peux accéder à la sélection courante via Editor.SelectImplied. Puis tu peux définir la sélection avec Editor.SetImpliedSelection.

 

Un petit exemple sur l'incontournable blog de Kean : http://through-the-interface.typepad.com/through_the_interface/2006/09/using_the_pickf.html

Maxence DELANNOY

Développement de compléments aux logiciels Autodesk : AutoCAD, Revit, Inventor, Vault, Navisworks... et autres logiciels de CAO

WIIP - http://wiip.fr

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Attention, ce que te propose Maxence utilise l'API .NET, or il semble, d'après ce que tu postes que tu utilises l'API COM.

 

Donc je te donne un petit exemple pour faire un jeu de sélection filtré en .NET (tous les blocs insérés sur le calque "0") et l'afficher.

 

        <CommandMethod("SelectionTest")> _
       Public Sub SelectionTest()
           ' Obtenir l'éditeur du document actif
           Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor

           ' Construire le filtre de sélection (tableau de TypedValue qui sera passé en argument
           ' du constructeur de SelectionFilter
           Dim filter As TypedValue() = {New TypedValue(0, "INSERT"), New TypedValue(8, "0")}

           ' Lancer la sélection sur l'ensemble du dessin
           Dim selResult As PromptSelectionResult = ed.SelectAll(New SelectionFilter(filter))

           ' Si la sélection a échoué (ou est vide), on quitte la procédure
           ' Ceci n'est pas nécessaire dans ce cas, mais c'est une bonne habitude à prendre
           If selResult.Status <> PromptStatus.OK Then
               Return
           End If

           ' Afficher la sélection
           ed.SetImpliedSelection(selResult.Value)
       End Sub

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Très juste Gilles. Mon exemple utilise l'API .NET qui offre beaucoup plus de possibilités.

 

En COM, l'alternative pour sélectionner tes objets sans utiliser un groupe, c'est d'utiliser la fonction AutoLISP handent dans SendCommand pour lui passer le maintien de tes entités :

 

ThisDrawing.SendCommand "_SELECT" & vbCr _
       & "(handent """ & object1.Handle & """)" & vbCr _
       & "(handent """ & object2.Handle & """)" & vbCr _
       [..]
       & vbCr _

 

Mais bon si tu as beaucoup d'entités, tu risques d'atteindre peut être une limite au niveau de la taille de la commande.

Maxence DELANNOY

Développement de compléments aux logiciels Autodesk : AutoCAD, Revit, Inventor, Vault, Navisworks... et autres logiciels de CAO

WIIP - http://wiip.fr

Lien vers le commentaire
Partager sur d’autres sites

Merci pour vos réponses !

Utilisant VBA avant, je ne m'y connais pas en API.NET... Il ne me reste plus qu'à apprendre !

 

Une petite question :

Apparemment "SetImpliedSelection" accepte un jeux de sélection (comme dans l'exemple de (gile)) ou un tableau d'ObjectID. Cette deuxieme méthode m'intéresse pour traiter un tableau d'objets sans passer par une sélection.

En cherchant sur Internet, j'ai réussi à récupérer le tableau des ObjectID avec :

 

Imports Autodesk.AutoCAD.DatabaseServices

Dim TableauID() As ObjectId

' Pour chaque objet AutoCAD dans ma liste

For Each Objet In Liste

' Récupération de l'Handle

Dim hn As Handle = New Handle(Convert.ToInt64(Objet.Handle, 16))

' Conversion en ObjectID

Dim id As ObjectId = db.GetObjectId(False, hn, 0)

' Ajout à mon tableau

TableauID(i) = id

i = i + 1

next Objet

 

' Afficher la sélection

ed.SetImpliedSelection(TableauID)

 

Est-ce la bonne méthode ?

(quitte à commencer avec l'API.NET, autant bien commencer...)

AutoCAD, AutoCAD Map3D, AutoCAD Architecture, Revit, COVADIS, InfraWorks 360, ReCap 360, ...

BIM Infrastructure

Lien vers le commentaire
Partager sur d’autres sites

D'après l'explorateur d'objets, SetImpliedSelection (qui n'est pas documenté) attends un tableau d'ObjectId. Je ne pense pas qu'on puisse lui passer directement un SelectionSet comme dans l'exemple de Gilles.

 

A priori ton code a l'air correct sauf sur le tableau dont tu ne donnes pas la taille et la variable compteur i qui n'est pas initialisée à zéro (en VB.NET ça n'est peut être pas obligatoire cependant). En VB.NET tu n'es pas obligé de répéter Objet au niveau du Next.

Maxence DELANNOY

Développement de compléments aux logiciels Autodesk : AutoCAD, Revit, Inventor, Vault, Navisworks... et autres logiciels de CAO

WIIP - http://wiip.fr

Lien vers le commentaire
Partager sur d’autres sites

En effet mais avoueons que c'est quand même une bonne habitude a prendre surtout quand tu as plusieurs boucles imbriquées ...

 

Les autres langages se passent très bien de cette syntaxe absurde. Je suppose que tu trouves que cette notation te permets de plus facilement rapprocher la fin d'une boucle avec son début, mais il y a déjà l'indentation pour ça.

Maxence DELANNOY

Développement de compléments aux logiciels Autodesk : AutoCAD, Revit, Inventor, Vault, Navisworks... et autres logiciels de CAO

WIIP - http://wiip.fr

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Je ne pense pas qu'on puisse lui passer directement un SelectionSet comme dans l'exemple de Gilles.

Si, SetImpliedSelection est surchargée et accepte comme argument un tableau d'ObjectId ou un SelectionSet (voir dans l'Explorateur d'objets de Visual Studio acmgd > Autodesk.AutoCAD.EditorInput > Editor > SetImpliedSelection).

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Si, SetImpliedSelection est surchargée et accepte comme argument un tableau d'ObjectId ou un SelectionSet (voir dans l'Explorateur d'objets de Visual Studio acmgd > Autodesk.AutoCAD.EditorInput > Editor > SetImpliedSelection).

 

Oui, c'est vrai, j'ai du mal regarder.

Maxence DELANNOY

Développement de compléments aux logiciels Autodesk : AutoCAD, Revit, Inventor, Vault, Navisworks... et autres logiciels de CAO

WIIP - http://wiip.fr

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é