Lommig Posté(e) le 16 août 2012 Posté(e) le 16 août 2012 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 SELECTIONDim Selection As AcadSelectionSet' La sélection suit un filtreOU- UN TABLEAU D'OBJETSDim 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
Maxence DELANNOY Posté(e) le 16 août 2012 Posté(e) le 16 août 2012 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 DELANNOYDéveloppement de compléments aux logiciels Autodesk : AutoCAD, Revit, Inventor, Vault, Navisworks... et autres logiciels de CAOWIIP - http://wiip.fr
(gile) Posté(e) le 16 août 2012 Posté(e) le 16 août 2012 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
Maxence DELANNOY Posté(e) le 17 août 2012 Posté(e) le 17 août 2012 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 DELANNOYDéveloppement de compléments aux logiciels Autodesk : AutoCAD, Revit, Inventor, Vault, Navisworks... et autres logiciels de CAOWIIP - http://wiip.fr
Lommig Posté(e) le 17 août 2012 Auteur Posté(e) le 17 août 2012 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.DatabaseServicesDim TableauID() As ObjectId' Pour chaque objet AutoCAD dans ma listeFor Each Objet In Liste' Récupération de l'HandleDim hn As Handle = New Handle(Convert.ToInt64(Objet.Handle, 16))' Conversion en ObjectIDDim id As ObjectId = db.GetObjectId(False, hn, 0)' Ajout à mon tableauTableauID(i) = idi = i + 1next Objet ' Afficher la sélectioned.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
Maxence DELANNOY Posté(e) le 17 août 2012 Posté(e) le 17 août 2012 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 DELANNOYDéveloppement de compléments aux logiciels Autodesk : AutoCAD, Revit, Inventor, Vault, Navisworks... et autres logiciels de CAOWIIP - http://wiip.fr
bazoul Posté(e) le 17 août 2012 Posté(e) le 17 août 2012 En VB.NET tu n'es pas obligé de répéter Objet au niveau du Next. En effet mais avoueons que c'est quand même une bonne habitude a prendre surtout quand tu as plusieurs boucles imbriquées ...
Maxence DELANNOY Posté(e) le 17 août 2012 Posté(e) le 17 août 2012 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 DELANNOYDéveloppement de compléments aux logiciels Autodesk : AutoCAD, Revit, Inventor, Vault, Navisworks... et autres logiciels de CAOWIIP - http://wiip.fr
(gile) Posté(e) le 17 août 2012 Posté(e) le 17 août 2012 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
Maxence DELANNOY Posté(e) le 20 août 2012 Posté(e) le 20 août 2012 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 DELANNOYDéveloppement de compléments aux logiciels Autodesk : AutoCAD, Revit, Inventor, Vault, Navisworks... et autres logiciels de CAOWIIP - http://wiip.fr
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