Aller au contenu

sélection blocs dynamiques


Messages recommandés

Posté(e)

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



 

 

Posté(e)

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#.net

www.danialu.fr

Posté(e)

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, 2

Valeurs : "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

Posté(e)

Bonjour,

 

Faire des filtre en VBA c'est assez simple.

 

exemple de ton filtre en question :

 

Dim BaliseBlock() As Integer

Dim DataBlock() As Variant

Dim VarBaliseBlock As Variant

Dim VarBlockData As Variant

 

Dim CollBlock As AcadSelectionSet

 

Set CollBlock = ThisDrawing.SelectionSets.Add("CollectionBlock")

 

ReDim BaliseBlock(2)

ReDim DataBlock(2)

BaliseBlock(0) = 0

DataBlock(0) = "INSERT"

BaliseBlock(1) = 67

DataBlock(1) = 0

BaliseBlock(2) = 8

DataBlock(2) = "ZONE_TRAVAUX,ARMEMENT_FUTUR,CONNEXES"

VarBaliseBlock = BaliseBlock

VarBlockData = 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

Posté(e)

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

Posté(e)

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

Posté(e)

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 ??

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é