LimsWolf Posté(e) le 27 juin 2012 Posté(e) le 27 juin 2012 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...
bryce Posté(e) le 27 juin 2012 Posté(e) le 27 juin 2012 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. 1 Brice, formateur AutoCAD - Inventor - SolidWorks - ZWCad - DraftSight - SketchUp indépendant
LimsWolf Posté(e) le 28 juin 2012 Auteur Posté(e) le 28 juin 2012 Merci, je vais tester prochainement
LimsWolf Posté(e) le 28 juin 2012 Auteur Posté(e) le 28 juin 2012 J'ai testé, ça ne fonctionne pas j'ai un message d'erreur "l'indice n'appartient pas à la selection"sur la ligne FilterType(1) = 8 ' code DXF du calque de l'objet j'ai regarder là c'est le bon DXF 1
bryce Posté(e) le 28 juin 2012 Posté(e) le 28 juin 2012 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 1 Brice, formateur AutoCAD - Inventor - SolidWorks - ZWCad - DraftSight - SketchUp indépendant
LimsWolf Posté(e) le 28 juin 2012 Auteur Posté(e) le 28 juin 2012 ah non dsl je ne l'avez pas déclarée, bon cette partie la marche mais maintenent c'est la ligne SelectZone.Select acSelectionSetAll, , , FiltersType, FiltersData qui ne fonctionne pas.
LimsWolf Posté(e) le 28 juin 2012 Auteur Posté(e) le 28 juin 2012 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
bryce Posté(e) le 28 juin 2012 Posté(e) le 28 juin 2012 J'allais le dire, ça transformait l'integer en variant...Tu as une ligne inutile en haut du coup. ;) Dim FiltersType, FiltersData As Variant 1 Brice, formateur AutoCAD - Inventor - SolidWorks - ZWCad - DraftSight - SketchUp indépendant
wilboc Posté(e) le 1 septembre 2021 Posté(e) le 1 septembre 2021 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,
Luna Posté(e) le 1 septembre 2021 Posté(e) le 1 septembre 2021 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
wilboc Posté(e) le 1 septembre 2021 Posté(e) le 1 septembre 2021 Non, ça ne fonctionne pas comme un Lisp. J'ai essayé les fonction Or ou And mais ça ne fonctionne pas non plus . J'ai bien compris la différence entre les line, polyline et lwpolyline, merci pour la piqure de rappel. A bientôt !
(gile) Posté(e) le 1 septembre 2021 Posté(e) le 1 septembre 2021 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
wilboc Posté(e) le 1 septembre 2021 Posté(e) le 1 septembre 2021 Je pense que mon ignorance doit intervenir dans la compréhension des types " filterType " et " filterData ". Vous pouvez m'expliquer le fonctionnement de ces fonctions ? En vous remerciant,
(gile) Posté(e) le 1 septembre 2021 Posté(e) le 1 septembre 2021 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
wilboc Posté(e) le 1 septembre 2021 Posté(e) le 1 septembre 2021 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 !
wilboc Posté(e) le 1 septembre 2021 Posté(e) le 1 septembre 2021 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
(gile) Posté(e) le 1 septembre 2021 Posté(e) le 1 septembre 2021 C'est : "LINE,LWPOLYLINE,POLYLINE", pas : "LINE,LWPOLYLIGNE,POLYLIGNE". Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
wilboc Posté(e) le 1 septembre 2021 Posté(e) le 1 septembre 2021 il y a 4 minutes, (gile) a dit : C'est LWPOLYLINE, pas LWPOLYLIGNE. Arf ! MERCI ! MERCI ! Mais ça ne fonctionne pas non plus. 😔
Curlygoth Posté(e) le 14 septembre 2021 Posté(e) le 14 septembre 2021 Bonjour, J'avoue ne pas être "fan" des filtres, mais que souhaitez vous en faire une fois dans votre sélection ? Mon site Web (en cours de construction) : Site DA-CODE de @didier
didier Posté(e) le 15 septembre 2021 Posté(e) le 15 septembre 2021 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 Éternel débutant... Mon site perso : Programmer dans AutoCAD
didier Posté(e) le 15 septembre 2021 Posté(e) le 15 septembre 2021 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 Éternel débutant... Mon site perso : Programmer dans AutoCAD
(gile) Posté(e) le 15 septembre 2021 Posté(e) le 15 septembre 2021 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
Curlygoth Posté(e) le 15 septembre 2021 Posté(e) le 15 septembre 2021 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 Mon site Web (en cours de construction) : Site DA-CODE de @didier
didier Posté(e) le 16 septembre 2021 Posté(e) le 16 septembre 2021 Bonjour @Curlygoth Il est vrai que je suis plus du genre à me "contenter du maximum" ! Le résultat n'est certes pas négociable, mais le "style" est important aussi... Amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
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