Aller au contenu

Selection avec filtre


LimsWolf

Messages recommandés

Bonjour,

 

Mon petit bout de code permet à l'utilisateur de choisir une zone en créant son contour par polyligne.

Tout les objets dans la zone et touchant la zone sont exporté en Wblock, le Wblock s'ouvre, le block se décompose.

Mais je souhait maintement selectionner la polyligne que l'utilisateur à créée pour effectuer la fonction EXTRIM d'autocad et aussi supprimer cette polyligne, enfin cela je sais le faire.

 

voici quelques semaines que je désespère à l'idée de pouvoir selectionner cette simple polyligne, qui se trouve seul dans le calque 0. j'ai esseyé le filtre mais, ça ne fonctionne pas. Où est mon erreur.

 

Je souhait remplacer les commentaire par la selection de cette polyligne : Calque "0".

 

Sub ChoixDeZoneMultiReseaux_Click()

''''''''''''''''''''''''''''''''''''''''''''' ZONES MULTI R2SEAUX '''''''''''''''''''''''''''''''''''''''''''''''''
Dim FilterType(0) As Integer
Dim FilterData(0) As Variant
Dim FiltersType, FiltersData As Variant
Dim G0 As String
Dim memtp As String

Dim NewZone As String
Dim Nzone As String
Nzone = Right(ComboBox1, 2)

NewZone = ThisWorkbook.Path & "\Zones\" & Nzone & "_" & TextBox1 & ".dwg"
Sheets("Divers").Unprotect
Sheets("Divers").Range("I3") = TextBox1
Sheets("Divers").Protect
If Par_zone = True Then
memtp = Sheets("Travail").TextBox2.Value
   Set AcadDoc = GetObject(, "Autocad.application").Documents(memtp)
   Set AcadObj = GetObject(, "Autocad.application")
   
   Call SetForegroundWindow(FindWindowA(vbNullString, AcadObj.Caption))
   AcadDoc.SendCommand ("(load " & (Chr(34)) & "cps" & (Chr(34)) & ") ")
   AcadDoc.SendCommand ("_pline ")
   AcadDoc.SendCommand ("cps d  ")
   AcadDoc.SendCommand ("_pselect p " & (Chr(27)))
   Set objSelSet = AcadDoc.ActiveSelectionSet
   
   AcadDoc.Wblock NewZone, objSelSet

   OuvrirDessinAutocad (NewZone)
   
   
   Set AcadDoc = GetObject(, "Autocad.application").ActiveDocument
   Set AcadObj = GetObject(, "Autocad.application")
   
'    CheminFichier = NewZone
'    CalqueFichier = "0"
'
'    Set SelectZone = AcadObj.ActiveDocument.SelectionSets.Add("SelectZone")
'
'        FilterType(0) = 8
'        FilterData(0) = NewZone
'        FiltersType = FilterType
'        FiltersData = FilterData
'    SelectZone.SelectOnScreen acSelectionSetAll, , , FiltersType, FiltersData
'

   AcadDoc.SendCommand ("extrim ")

End If
End Sub

 

Merci. si vous avez une idée...

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Je ne m'y connais pas vraiment en VBA, mais je dirais qu'il faudrait remplacer :

 

FilterType(0) = 8
FilterData(0) = NewZone

 

par quelque chose comme ça :

 

FilterType(0) = 0  ' code DXF du type de l'objet
FilterData(0) = "LWPOLYLINE"  ' type de l'objet
FilterType(1) = 8  ' code DXF du calque de l'objet 
FilterData(1) = "0"  ' nom du calque

pour ne garder que les polylignes appartenant au calque 0.

  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

Je ne sais pas si les array sont dynamiques ou pas en VBA...

Si la réponse est non, il faut peut être redimensionner les 2 array FilterType() et FilterData() ?

Peut-être qu'il suffit de déclarer le 2e élément (indice 1) des tableaux, comme tu l'as fait au début du code pour les 1ers (indice 0) ?

 

Dim FilterType(1) As Integer
Dim FilterData(1) As Variant

  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

Oh ça marche !!

 

Merci Beaucoup. c'est FilterType et pas FiltresType, ainsi que FiltreData et non pas FiltresData

 

Sub ChoixDeZoneMultiReseaux_Click()

''''''''''''''''''''''''''''''''''''''''''''' ZONES MULTI R2SEAUX '''''''''''''''''''''''''''''''''''''''''''''''''
Dim FilterType(1) As Integer
Dim FilterData(1) As Variant
Dim FiltersType, FiltersData As Variant
Dim G0 As String
Dim memtp As String

Dim NewZone As String
Dim Nzone As String
Nzone = Right(ComboBox1, 2)

NewZone = ThisWorkbook.Path & "\Zones\" & Nzone & "_" & TextBox1 & ".dwg"
Sheets("Divers").Unprotect
Sheets("Divers").Range("I3") = TextBox1
Sheets("Divers").Protect
If Par_zone = True Then
memtp = Sheets("Travail").TextBox2.Value
   Set AcadDoc = GetObject(, "Autocad.application").Documents(memtp)
   Set AcadObj = GetObject(, "Autocad.application")
   
   Call SetForegroundWindow(FindWindowA(vbNullString, AcadObj.Caption))
   AcadDoc.SendCommand ("(load " & (Chr(34)) & "cps" & (Chr(34)) & ") ")
   AcadDoc.SendCommand ("_pline ")
   AcadDoc.SendCommand ("cps d  ")
   AcadDoc.SendCommand ("_pselect p " & (Chr(27)))
   Set objSelSet = AcadDoc.ActiveSelectionSet
   
   AcadDoc.Wblock NewZone, objSelSet

   OuvrirDessinAutocad (NewZone)
   
   
   Set AcadDoc = GetObject(, "Autocad.application").ActiveDocument
   Set AcadObj = GetObject(, "Autocad.application")
   
   CheminFichier = NewZone
   CalqueFichier = "0"
   
   Set SelectZone = AcadObj.ActiveDocument.SelectionSets.Add("SelectZone")
   
   FilterType(0) = 0  ' code DXF du type de l'objet
   FilterData(0) = "LWPOLYLINE"  ' type de l'objet
   FilterType(1) = 8  ' code DXF du calque de l'objet
   FilterData(1) = "0"  ' nom du calque
   
   SelectZone.Select acSelectionSetAll, , , FilterType, FilterData

   AcadDoc.SendCommand ("_pselect p  ")
   AcadDoc.SendCommand ("extrim -999999,-999999 ")

End If
End Sub

Lien vers le commentaire
Partager sur d’autres sites

  • 9 ans après...

Bonjour,

Je débute dans le VBA autocad et j'essaie d'amélioré un code existant.

J'ai une sélection par filtre qui ne sélectionne que des types d'objet "LINE".

Je souhaiterai également ajouter un type "POLYLINE" dans ma sélection.

Citation

" Set SS_SelectLignesRappel = ThisDrawing.SelectionSets.Add("LignesRappel")
    filterType(0) = 0
    filterData(0) = "LINE" And "POLYLINE" 'Comme ajouter une fonction pour que les lignes et le polylignes sont sélectionné?
    filterType(1) = 67
    filterData(1) = 0

En vous remerciant,

Cordialement,

Lien vers le commentaire
Partager sur d’autres sites

Coucou,

Si cela fonctionne comme en AutoLISP, je te suggère ceci :

Set SS_SelectLignesRappel = ThisDrawing.SelectionSets.Add("LignesRappel")
    filterType(0) = 0
    filterData(0) = "LINE,POLYLINE" 'Comme ajouter une fonction pour que les lignes et le polylignes sont sélectionné?
    filterType(1) = 67
    filterData(1) = 0

Attention à la différence entre LWPOLYLINE (correspond à la commande "_PLINE" ou "POLYLIGN") et POLYLINE (correspond aux polylignes 3D ou anciennes polylignes 2D), qui ne correspondent pas au même type d'objet.

Bisous,
Luna

Lien vers le commentaire
Partager sur d’autres sites

il y a 32 minutes, wilboc a dit :

Non, ça ne fonctionne pas comme un Lisp.

Mais ça fonctionne bien "comme en AutoLISP" comme le dit @Luna (et comme en ObjectARX ou .NET).

La différence est uniquement dans les structures utilisées (les types (codes de groupe DXF) et les données sont identiques) :
- des "paires pointées" en LISP : ((0 . "LINE,LWPOLYLINE") (67 . 0))
- des tableaux pour les types et les valeurs en VBA : filterType = Array(0, 67) filterData = Array("LINE,LWPOLYLINE", 0)
- des "TypedValue" en .NET : { TypedValue(0, "LINE,LWPOLYLINE"), TypedValue(67, 0) }

il y a 32 minutes, wilboc a dit :

J'ai essayé les fonction Or ou And mais ça ne fonctionne pas non plus .

Dans tous les cas on peut utiliser les opérateurs "OR" et "AND"
- LISP : ((-4 . "<AND") (-4 . "<OR") (0 . "LINE") (0 . "LWPOLYLINE") (-4 . "OR>") (67 . 0) (-4 . "AND"))
- VBA : filterType = Array(-4, -4, 0, 0, -4, 67, -4) filterData = Array("<AND", "<OR", "LINE", "LWPOLYLINE", "OR>", 0, "AND>")

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

Lien vers le commentaire
Partager sur d’autres sites

Comme expliqué dans la documentation : "Les listes de filtres sont composées de paires d'arguments.
Le premier argument identifie le type de filtre (par exemple, un objet), et le second argument spécifie la valeur sur laquelle vous filtrez (par exemple, des cercles). Le type de filtre est un code de groupe DXF qui spécifie le filtre à utiliser.
"

En VBA ces "paires" sont transposées dans deux tableaux (array), un pour les types (filterType), l'autre (filterData) pour les valeurs correspondantes.
Par exemple, pour filtrer tous les cercles sur le calque "toto" dont le rayon est égal à 10, on a besoin de 3 "paires : une pour le type d'entité (code de groupe DXF = 0, valeur = "CIRCLE"), une pour le calque (code de groupe DXF = 8, valeur = "toto") et une pour le rayon (code de groupe DXF = 40, valeur = 10.0). Les 2 tableaux auront donc 3 éléments chacun, celui des types (filterType) contiendra (0, 8, 40) ; celui des valeurs (filterData) contiendra ("CIRCLE", "toto", 10.0).
 

Dim filterType(2) As Integer
Dim filterData(2) As Variant

filterType(0) = 0
filterData(0) = "CIRCLE"

filterType(1) = 8
filterData(1) = "toto"

filterType(2) = 40
filterData(2) = 10.0

Ce qui devrait aussi pouvoir s'écrire aussi comme ça (non garanti, je ne connais pas bien le VBA).

Dim filterType As Variant
Dim filterData As Variant

filterType = Array(0, 8, 40)
filterData = Array("CIRCLE", "toto", 10.0)

 

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

Lien vers le commentaire
Partager sur d’autres sites

il y a 45 minutes, (gile) a dit :

Comme expliqué dans la documentation : "Les listes de filtres sont composées de paires d'arguments.
Le premier argument identifie le type de filtre (par exemple, un objet), et le second argument spécifie la valeur sur laquelle vous filtrez (par exemple, des cercles). Le type de filtre est un code de groupe DXF qui spécifie le filtre à utiliser.
"

En VBA ces "paires" sont transposées dans deux tableaux (array), un pour les types (filterType), l'autre (filterData) pour les valeurs correspondantes.
Par exemple, pour filtrer tous les cercles sur le calque "toto" dont le rayon est égal à 10, on a besoin de 3 "paires : une pour le type d'entité (code de groupe DXF = 0, valeur = "CIRCLE"), une pour le calque (code de groupe DXF = 8, valeur = "toto") et une pour le rayon (code de groupe DXF = 40, valeur = 10.0). Les 2 tableaux auront donc 3 éléments chacun, celui des types (filterType) contiendra (0, 8, 40) ; celui des valeurs (filterData) contiendra ("CIRCLE", "toto", 10.0).
 

Dim filterType(2) As Integer
Dim filterData(2) As Variant

filterType(0) = 0
filterData(0) = "CIRCLE"

filterType(1) = 8
filterData(1) = "toto"

filterType(2) = 40
filterData(2) = 10.0

Ce qui devrait aussi pouvoir s'écrire aussi comme ça (non garanti, je ne connais pas bien le VBA).

Dim filterType As Variant
Dim filterData As Variant

filterType = Array(0, 8, 40)
filterData = Array("CIRCLE", "toto", 10.0)

 

Merci Gile !

Lien vers le commentaire
Partager sur d’autres sites

Après plusieurs essais, ça ne fonctionne pas.

Citation

Dim filterType As Variant
Dim filterData As Variant

Set SS_SelectLignesRappel = ThisDrawing.SelectionSets.Add("LignesRappel")
filterType = Array(0, 67, 8)
filterData = Array("LINE,LWPOLYLIGNE,POLYLIGNE", 0, CALQUE_LIGNERAPPEL)
SS_SelectLignesRappel.Select acSelectionSetAll, , , filterType, filterData

Il ne me sélectionne aucun objet (ni ligne, ni polyligne).

Si j'ai que le type ligne, c'est bon !

 

Citation

Dim filterType (0 to 2) As Integer
Dim filterData (0 to 2) As Variant

Set SS_SelectLignesRappel = ThisDrawing.SelectionSets.Add("LignesRappel")

filterType (0) = 0
filterData (0) = "LINE"

filterType (1) = 67
filterData (2) = 0

filterType (2) = 8
filterData (2) = CALQUE_LIGNERAPPEL

SS_SelectLignesRappel.Select acSelectionSetAll, , , filterType, filterData

Tu as une idée ?

Merci

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

Bonjour @wilboc

Il serait intéressant, pour les gens qui cherchent à vous aider, d'être un peu plus explicite,
car écrire "
Mais ça ne fonctionne pas non plus" est quelque peu lapidaire.

  • Qu'est-ce qui ne fonctionne pas ?
  • Quel est le message d'erreur ?
  • Est-ce que c'est le filtre qui ne réagit pas ?
  • Ou le jeu de sélection qui refuse de se créer ?

Sachant que si la routine bloque sur un jeu de sélection existant, et donc impossible à créer, c'est différent d'un filtre inopérant.

Merci de votre réponse pour avancer dans la résolution du souci

Amicalement

Lien vers le commentaire
Partager sur d’autres sites

Bonjour @wilboc @Curlygoth

Pas fan des filtres ? Sans doute parce que le besoin ne s'est pas présenté.
Car le filtre est un gain de temps non négligeable lorsqu'on a à travailler sur une grande série de données ou d'entités.

L'alternative est de faire une sélection globale puis de contrôler dans le jeu de sélection le type ou la propriété de l'entité avant de lui appliquer un traitement.

Par exemple si on sait que dans l'appartement il y a une boîte d'allumettes on peut :

  • Lancer un filtre de recherche sur les "allumettes" et ne mettre que ces dernières dans le jeu de sélection puis les traiter
  • Sélectionner l'appartement et analyser le jeu de sélection en ne traitant pas les fourchettes, les brosses à dents, le canapé ...

Chacun fait comme il veut, je suis partisan de la première solution, mais ne suis pas détenteur de la vérité universelle pour autant.

Amicalement

Lien vers le commentaire
Partager sur d’autres sites

De plus, lors d'une sélection par l'utilisateur (SelectOnScreen), le filtre de sélection permet de ne mettre en surbrillance que les entités concernées.

Sinon, je conçois que les filtres de sélection ne sont pas d'un accès très intuitifs dans les langages qui ne sont pas aussi familiers avec les codes DXF qu'AutoLISP, et plus particulièrement avec le VBA à cause de la transposition de la liste de paires en une paire de listes.

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

Lien vers le commentaire
Partager sur d’autres sites

Il y a 2 heures, didier a dit :

Pas fan des filtres ? Sans doute parce que le besoin ne s'est pas présenté.
Car le filtre est un gain de temps non négligeable lorsqu'on a à travailler sur une grande série de données ou d'entités.

Bonjour @didier

En effet, le besoin ne s'est jamais présenté...

mais si tu souhaites "jouer" avec les entités filtrée, il faut boucler sur les objets de ta sélection.

pour conclure,je préfère travaillé sur des plans "léger" et épuré.

Par expérience avec mes programmes, j'ai rarement le résultats attendu en plus de 2 secondes donc ça me va largement...

Citation

mais ne suis pas détenteur de la vérité universelle pour autant.

et moi encore moins ^-^'

Du moment que ça me donne ce que je veux sans attendre ça me va

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é