michouka Posté(e) le 10 juin 2010 Posté(e) le 10 juin 2010 Bonjour, Je souhaite pouvoir faire une sélection sur les blocs dymamiques de mon dessin, et pouvoir retranscrire certaines valeurs d'attributs dans un fichier Excel. Pour le moment, je n'ai pas trouvé comment boucler uniquement sur les blocs dynamiques. A défaut, je tourne sur tous les objets du document. Si je pouvais avoir un petit coup de pouce. Merci. Sub quantitatif() Dim blockrefobj As AcadBlockReference Dim nom, proprietes, distance, designation, pkd, pkf Dim activeDoc As AcadDocument Dim varAttributes As Variant Dim Excelobj As Excel.Application Dim ExcelobjSheet As Excel.Worksheet Set Excelobj = New Excel.Application Excelobj.Visible = True Set ExcelobjWorkbook = Excelobj.Workbooks.Add Excelobj.Sheets("Feuil1").Name = "Quantitatifs" Excelobj.Cells(1, 1).Value = "Pk Début" Excelobj.Cells(1, 2).Value = "Pk Fin" Excelobj.Cells(1, 3).Value = "Zone de chantier" Excelobj.Cells(1, 4).Value = "Longueur (m)" Excelobj.Cells(1, 6).Value = "Designation" Excelobj.Cells(1, 7).Value = "Longueur (m)" Excelobj.Cells(1, 9).Value = "Connexes" Excelobj.Cells(1, 10).Value = "Longueur (m)" 'on met la 1ère ligne en gras Excelobj.Rows("1").Font.Bold = True 'on met la colonne C en gras Excelobj.Columns("C").Font.Bold = True 'on centre horizontalement les textes Excelobj.Columns("A:J").HorizontalAlignment = 3 'on modifie le format des colonnes Excelobj.Columns("A:J").NumberFormat = "0" 'on recupere le document actif Set activeDoc = ThisDrawing.Application.ActiveDocument 'on boucle sur les objets du document 'on defini j pour le nombre de blocs dynamique Dim j j = 0 For i = 0 To activeDoc.ModelSpace.Count - 1 Set nom = activeDoc.ModelSpace.Item(i) ' on teste le calque contenant les blocs zone travaux If nom.Layer = "ZONE_TRAVAUX" Then proprietes = nom.GetDynamicBlockProperties distance = proprietes(10).Value * 5 varAttributes = nom.GetAttributes designation = varAttributes(2).TextString pkd = varAttributes(0).TextString pkf = varAttributes(1).TextString Excelobj.Cells(2 + j, 1).Value = pkd Excelobj.Cells(2 + j, 2).Value = pkf Excelobj.Cells(2 + j, 3).Value = designation Excelobj.Cells(2 + j, 4).Value = distance j = j + 1 End If 'fin de boucle Next 'on defini k pour le nombre de blocs dynamique Dim k k = 0 For i = 0 To activeDoc.ModelSpace.Count - 1 Set nom = activeDoc.ModelSpace.Item(i) ' on teste le calque contenant les blocs armement futur If nom.Layer = "ARMEMENT_FUTUR" Then proprietes = nom.GetDynamicBlockProperties distance = proprietes(6).Value * 5 varAttributes = nom.GetAttributes designation = varAttributes(2).TextString Excelobj.Cells(2 + k, 6).Value = designation Excelobj.Cells(2 + k, 7).Value = distance k = k + 1 End If 'fin de boucle Next 'on defini l pour le nombre de blocs dynamique Dim l l = 0 For i = 0 To activeDoc.ModelSpace.Count - 1 Set nom = activeDoc.ModelSpace.Item(i) ' on teste le calque contenant les blocs connexes If nom.Layer = "CONNEXES" Then proprietes = nom.GetDynamicBlockProperties distance = proprietes(4).Value * 5 varAttributes = nom.GetAttributes designation = varAttributes(2).TextString Excelobj.Cells(2 + l, 9).Value = designation Excelobj.Cells(2 + l, 10).Value = distance l = l + 1 End If 'fin de boucle Next 'on créer un filtre Excelobj.Cells.Select Excelobj.Selection.AutoFilter 'on ajuste les colonnes Excelobj.Columns.AutoFit 'retour selection cellule A1 Excelobj.Range("A1").Select End Sub
sacha.m Posté(e) le 10 juin 2010 Posté(e) le 10 juin 2010 Bonjour, Pourquoi n'utilises tu pas une sélection par filtre plus tôt que de sélectionner tous les objets du model space ? Sacha
rom1_am Posté(e) le 11 juin 2010 Posté(e) le 11 juin 2010 Bonjour, Je ne sais pas s'il y a un code DXF pour filtrer la sélection sur les blocs dynamiques (tu peux surement avoir la réponse en postant la question sur le forum lisp) par contre tu peux utiliser la propriété "Bloc.IsDynamicBlock" pour savoir si un bloc est un bloc dynamique ou non. _______________________________R.A.Développeur AutoCAD C#.netwww.danialu.fr
(gile) Posté(e) le 11 juin 2010 Posté(e) le 11 juin 2010 Salut, À ma connaissance il n'y a pas de groupe DXF qui permette de filtrer uniquement les blocs dynamiques.Mais d'après ce que je lis (je peux me tromper, je ne suis pas VBAiste) il est tout à fait possible d'utiliser un filtre combinant : le type d'entité ("INSERT"), l'espace ("Model") les calques ("ZONE_TRAVAUX,ARMEMENT_FUTUR,CONNEXES") et probablement les noms des blocs en ajoutant "`*U*" à la liste pour les blocs anonymes. Je crois savoir que les filtres de sélection ne sont pas très pratiques à élaborer en VBA (ou plus généralement avec l'interface COM), mais en gros c'est 2 variants contenant respectivement un array d'entiers pour les codes de groupe et un array de variants pour les valeurs. Dans ce cas ça pourrait être :Codes de groupe : 0, 410, 8, 2Valeurs : "INSERT", "Model", "ZONE_TRAVAUX,ARMEMENT_FUTUR,CONNEXES", "Nom_Bloc1,Nom_Bloc2,...,`*U*" Ensuite traiter différemment les objets sélectionnés en fonction de leur calque. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
sacha.m Posté(e) le 11 juin 2010 Posté(e) le 11 juin 2010 Bonjour, Faire des filtre en VBA c'est assez simple. exemple de ton filtre en question : Dim BaliseBlock() As IntegerDim DataBlock() As VariantDim VarBaliseBlock As VariantDim VarBlockData As Variant Dim CollBlock As AcadSelectionSet Set CollBlock = ThisDrawing.SelectionSets.Add("CollectionBlock") ReDim BaliseBlock(2)ReDim DataBlock(2)BaliseBlock(0) = 0DataBlock(0) = "INSERT"BaliseBlock(1) = 67DataBlock(1) = 0BaliseBlock(2) = 8DataBlock(2) = "ZONE_TRAVAUX,ARMEMENT_FUTUR,CONNEXES"VarBaliseBlock = BaliseBlockVarBlockData = DataBlock CollBlock.Select acSelectionSetAll, , , VarBaliseBlock, VarBlockData Par contre filtrer sur les anonyme je ne le ferai pas, c'est mieux d'utiliser ce que rom1_am propose c-a-d utilise la propriété IsDynamicBlock. Tu peux bien évidement ajouter des élément dans le filtre sans problème. Sacha
michouka Posté(e) le 14 juin 2010 Auteur Posté(e) le 14 juin 2010 Merci à vous pour votre aide, je mets ça en application dès que possible, en testant avec les filtres.
michouka Posté(e) le 17 juin 2010 Auteur Posté(e) le 17 juin 2010 Sacha, je viens de mettre en application ton exemple de filtre, ça marche impeccable, mais ne connaissant pas le système de filtre, peux-tu m'éclairer sur le choix des valeurs de BaliseBlock(1)=67 ; BaliseBlock(2) =8 etc...Merci d'avance
(gile) Posté(e) le 17 juin 2010 Posté(e) le 17 juin 2010 Salut, Les valeurs utilisées dans les filtres sont les codes de groupe DXF d'un côté et les valeurs correspondantes de l'autre.Tu trouveras les codes de groupe dans l'aide Aux développeurs > Références DXF. sacha, je voulais juste dire que faire un filtre est plus simple en LISP ou .NET. exemple pour filtrer les références de bloc nommés "toto" sur les calques "truc" et "bidule" LISP :(setq filtre '((0 . "INSERT") (2 . "toto") (8 . "truc,bidule"))) .NET (C#) :TypedValue[] filtre = new TypedValue[3] { new TypedValue(0, "INSERT"), new TypedValue(2, "toto"), new TypedValue(0, "INSERT")}; VBA :Dim TypArray() As Integer Dim ValArray() As Variant Dim FiltreType As Variant Dim FiltreValeur As Variant ReDim TypArray(3) ReDim ValArray(3) TypArray(0) = 0 ValArray(0) = "INSERT" TypArray(1) = 2 ValArray(1) = "toto" TypArray(2) = 8 ValArray(2) = "truc,bidule" FiltreType = TypArray FiltreValeur = ValArray Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
michouka Posté(e) le 18 juin 2010 Auteur Posté(e) le 18 juin 2010 Merci pour l'info (Gile). Par contre, une dernière petite question sur le sujet : comment je peux purger mon filtre à la fin de mon programme pour ne pas avoir un bug au cas où je relance ma macro ??
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