Topheur Posté(e) le 5 janvier 2016 Posté(e) le 5 janvier 2016 Bonjour à tous :) N'étant pas très doué en programmation mais sachant me servir de Goo... :P je cherche pour un projet autocad la possibilité d'importer/exporter vers excel les attributs de bloc autocad. J'ai trouvé un code qui fonctionne très bien MAIS je voudrais importer/exporter UN SEUL bloc que je choisirais au préalable. Pour info, mon autocad contient plusieurs folio avec des cartouches sous forme de bloc avec attribut et quand j'importe les attributs, j'ai les blocs de mes folios mais également celle de mes symboles et je me retrouve avec un tableau indigeste. L'idée et de pouvoir choisir mon bloc par un clic OU nommé le bloc dans le VBA Excel pour avoir un tableau excel avec les attributs de ce seul bloc. Ci dessous les codes de mes deux boutons VBA Excel (trouvé sur la toile) Dim DrawingFile As String Sub EnvoyerVersAutoCAD() Dim AcadApp As AutoCAD.AcadApplication Dim BlocRef As AcadBlockReference Dim Row, i, Column As Integer Application.ScreenUpdating = False Application.Calculation = xlCalculationManual ' Connexion avec AutoCAD (on le lance si il n'est pas en cours d'exécution) On Error Resume Next Set AcadApp = GetObject(, "AutoCAD.Application") On Error GoTo 0 If AcadApp Is Nothing Then Set AcadApp = New AutoCAD.AcadApplication End If AcadApp.Visible = True ' Si le chemin du fichier n'est pas spécifié, on suppose qu'il est dans le même répertoire que le classeur Dim Filename As String If InStr(Cells(1, 1).Text, "\") <> 0 Then Filename = Cells(1, 1).Text Else Filename = ThisWorkbook.Path & "\" & Cells(1, 1).Text End If ' On ouvre le fichier DWG dans AutoCAD ou on l'active si il est déjà ouvert Dim Opened As Boolean Opened = False Dim Dwg As AcadDocument For Each Dwg In AcadApp.Documents If StrComp(Dwg.FullName, Filename, vbTextCompare) = 0 Then Dwg.Activate Opened = True End If Next If Not Opened Then AcadApp.Documents.Open (Filename) End If Row = 4 ' On commence à la ligne N°4 Dim Handle As String While Not IsEmpty(Cells(Row, 2)) ' On s'arrête quand on tombe sur une cellule handle vide ' On retrouve l'insertion de bloc à l'aide du handle mémorisé dans la feuille de calcul et de la ' méthode HandleToObject de l'objet document AutoCAD Handle = Cells(Row, 2) Set BlocRef = AcadApp.ActiveDocument.HandleToObject(Handle) ' Si le bloc a des attributs... If BlocRef.HasAttributes Then ' ... on les récupère Attributes = BlocRef.GetAttributes ' On parcourt le tableau For i = LBound(Attributes) To UBound(Attributes) ' Pour chaque attribut, on cherche une colonne dont l'entête correspond à l'étiquette ' de l'attribut Column = 3 While Not IsEmpty(Cells(3, Column)) If Cells(3, Column).Text = Attributes(i).TagString Then Attributes(i).TextString = Cells(Row, Column).Text End If Column = Column + 1 ' On passe à la colonne suivante Wend Next ' PROPDYN Attributes = BlocRef.GetDynamicBlockProperties On Error Resume Next ' On parcourt le tableau For i = LBound(Attributes) To UBound(Attributes) ' Pour chaque attribut, on cherche une colonne dont l'entête correspond à l'étiquette ' de l'attribut Column = 3 While Not IsEmpty(Cells(3, Column)) If Cells(3, Column).Text = Attributes(i).PropertyName Then Attributes(i).Value = Cells(Row, Column).Value End If Column = Column + 1 ' On passe à la colonne suivante Wend Next BlocRef.Update End If Row = Row + 1 ' On passe à la ligne suivante Wend Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic MsgBox "Les données ont été transférées vers AutoCAD avec succès." End Sub Public Sub ExtraireAttributs() Dim AcadApp As AutoCAD.AcadApplication Dim SelSet As AutoCAD.AcadSelectionSet Dim FilterType(0) As Integer Dim FilterData(0) As Variant Dim FiltersType, FiltersData As Variant Dim i, Row, j, Column As Integer Dim Entity As AcadEntity Dim BlocRef As AcadBlockReference Dim Attributes As Variant Dim ColumnExist As Boolean Application.ScreenUpdating = False Application.Calculation = xlCalculationManual ' Efface toutes les données contenues dans la feuille Range("1:65536").ClearContents ' On demande le nom du fichier à ouvrir Dim Filename As Variant Filename = Application.GetOpenFilename("Dessins AutoCAD (*.dwg), *.dwg") If Filename = False Then Exit Sub End If Cells(1, 1).Value = Filename ' Connexion avec AutoCAD (on le lance si il n'est pas en cours d'exécution) On Error Resume Next Set AcadApp = GetObject(, "AutoCAD.Application") On Error GoTo 0 If AcadApp Is Nothing Then Set AcadApp = New AutoCAD.AcadApplication End If ' On ouvre le fichier DWG dans AutoCAD ou on l'active si il est déjà ouvert Dim Opened As Boolean Opened = False Dim Dwg As AcadDocument For Each Dwg In AcadApp.Documents If StrComp(Dwg.FullName, Cells(1, 1).Text, vbTextCompare) = 0 Then Dwg.Activate Opened = True End If Next If Not Opened Then AcadApp.Documents.Open (Cells(1, 1).Text) End If ' On remets Excel au premier plan (le lancement d'AutoCAD désactive la fenêtre Excel) Application.Visible = True ' Remplissage de l'entête du tableau Cells(3, 1).Value = "Nom du bloc" Cells(3, 2).Value = "Handle" Row = 4 ' 1ère ligne du tableau ' On crée un jeu de sélection ou on le récupère si il existe déjà On Error Resume Next Set SelSet = AcadApp.ActiveDocument.SelectionSets.Add("SELSET") If Err <> 0 Then Set SelSet = AcadApp.ActiveDocument.SelectionSets.Item("SELSET") SelSet.Clear End If ' On prépare un filtre de sélection sur les insertions de bloc FilterType(0) = 0 FilterData(0) = "INSERT" FiltersType = FilterType FiltersData = FilterData ' Sélection des entités SelSet.Select acSelectionSetAll, , , FiltersType, FiltersData ' On balaye le jeu de sélection For i = 0 To SelSet.Count - 1 Set Entity = SelSet.Item(i) ' Si l'objet est une insertion de bloc If Entity.ObjectName = "AcDbBlockReference" Then ' On précise le type de l'objet pour pouvoir accéder à ses propriétés et ' ses méthodes spécifiques Set BlocRef = Entity ' Si il a des attributs If BlocRef.HasAttributes Then Cells(Row, 1).Value = BlocRef.Name Cells(Row, 2).Value = "'" & BlocRef.Handle ' On les récupére Attributes = BlocRef.GetAttributes ' On parcourt le tableau For j = LBound(Attributes) To UBound(Attributes) ' On recherche si une colonne existe déjà pour cette étiquette d'attribut Column = 3 ColumnExist = False While Not IsEmpty(Cells(3, Column)) If Cells(3, Column).Text = Attributes(j).TagString Then ' Une colonne existe, on la remplit avec la valeur de l'atribut Cells(Row, Column).Value = Attributes(j).TextString ColumnExist = True End If Column = Column + 1 ' On passe à la colonne suivante Wend If Not ColumnExist Then ' Aucune colonne n'existe, on en crée une et on la remplit Cells(3, Column).Value = Attributes(j).TagString Cells(Row, Column).Value = Attributes(j).TextString End If Next ' Attribut suivant ' PROP DYN Attributes = BlocRef.GetDynamicBlockProperties ' On parcourt le tableau For j = LBound(Attributes) To UBound(Attributes) ' On recherche si une colonne existe déjà pour cette étiquette d'attribut Column = 3 ColumnExist = False While Not IsEmpty(Cells(3, Column)) If Cells(3, Column).Text = Attributes(j).PropertyName Then ' Une colonne existe, on la remplit avec la valeur de l'atribut Cells(Row, Column).Value = Attributes(j).Value ColumnExist = True End If Column = Column + 1 ' On passe à la colonne suivante Wend If Not ColumnExist Then ' Aucune colonne n'existe, on en crée une et on la remplit Cells(3, Column).Value = Attributes(j).PropertyName Cells(Row, Column).Value = Attributes(j).Value End If Next ' Propriété dyn suivante Row = Row + 1 ' Ligne suivante End If End If Next Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic MsgBox "Les attributs du dessin " & Cells(1, 1).Text & " ont été extraits avec succès." End Sub En remercient par avance le génie qui pourra m'aider à avancer :P
lili2006 Posté(e) le 5 janvier 2016 Posté(e) le 5 janvier 2016 Bonne Année à toutes et tous, Ouh là, j'y connais pas grand chose en prog. VBA, mais cela ne me parait pas "simple", d'autant qu'il existe des fonctions comme "ATTIN/ATTOU" des express Tools qui te font ça trés bien dans la mesure ou ton bloc est renseigné par un attribut,... Si besoin de plus de "confort" (gile) à développer une ".dll" qui permet ce que tu demandes et bien plus encore,.. Il me semblait que le VBA était mort sous AutoCAD, non ?:blink: Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
philsogood Posté(e) le 6 janvier 2016 Posté(e) le 6 janvier 2016 hellopareil que LiliUtilise ce qui existe sous CAD ça amrche bien:ATTIN/ATTOUT des Xpress ToolsouEXTRACTDONNEES qui amrche bien aussi, ya un peu de paramètrage au début mais après c'est assez facile à réemployer@+Phil Projeteur Revit Indépendant - traitement des eaux/CVC
Lommig Posté(e) le 6 janvier 2016 Posté(e) le 6 janvier 2016 Bonjour, Il existe déjà la commande AutoCAD "EXTRACTDONNEES" qui permet d'extraire n'importe quelles informations vers Excel. Avec cette commande et un peu de paramétrage, il est possible d'extraire seulement les attributs des blocs portant un certain nom. Par contre, il n'est pas possible de ré-importer les attributs modifiés de Excel vers AutoCAD... Comme l'a indiqué "lili2006", il existe aussi ce programme développé par (gile). Cette DLL permet d'extraire des attributs des blocs dans Excel et de ré-importer les valeurs modifiées dans AutoCAD. Guillaume AutoCAD, AutoCAD Map3D, AutoCAD Architecture, Revit, COVADIS, InfraWorks 360, ReCap 360, ...BIM Infrastructure
COME Posté(e) le 6 janvier 2016 Posté(e) le 6 janvier 2016 Bonjour, On peut aussi prendre la question dans l'autre sens et demander à Excel de faire le tri qui nous convient (automatiquement ou manuellement selon les cas), effectuer les modifications souhaitées puis d'exporter vers Autocad les nouvelles données. Pour éviter des manipulations fastidieuses et répétitives on crée une page Excel "modèle" avec les fonctionnalités souhaitées que l'on copie dans chaque nouveau fichier de données issu d'Autocad. Belle journée, COME La vie sans musique est tout simplement une erreur, une fatigue, un exil. »Friedrich Nietzsche
rebcao Posté(e) le 6 janvier 2016 Posté(e) le 6 janvier 2016 Bonjour, J'avais fait Christian Formateur, Consultant Expert AutoCAD, REVIT MEP, INVENTOR, télécharger , des Outils AutoCAD...cad123 @ wanadoo.fr (enlever les espaces de part et d'autre de @)
Topheur Posté(e) le 6 janvier 2016 Auteur Posté(e) le 6 janvier 2016 Tous d'abord merci pour ces nombreuses réponse ;) Par contre j'avais omis un détail important (et qui répondra à lili2006), le code VBA est sur Excel et non Autocad. En fait, j'ouvre mon classeur excel, je clique sur importer et j'ai tous les blocs en import dans excel.Quand je clique sur export, cela envoi les modifs d'attributs dans autocad.(moi je voudrais choisir le bloc à importer) Mon tableur regroupant d'autres informations, l'idée est de dessiner sur autocad le jour 1, remplir mes paramètres dans excel le jour 2, faire mon import toujours sur excel et exporter ensuite. Comme ça je me sert UNIQUEMENT de mon tableur Excel et mon autocad et renseigné sans que je revienne dessus. Si je n'ai d'autre choix que d'utiliser autocad, je le ferais mais si quelqu'un arrivé à modif mon code VBA EXCEL pour la sélection de mon bloc se serais merveilleux :(rires forts): J'oubliais, je ne peux pas installer les express tools car je ne possède pas de CD d'installation car les PC de l'entreprise sont configurer au siège et que l'on a pas la main pour modifier quoi que se soit. En espérent que quelqu'un trouvera une astuce pour modifier ce code :D
Lommig Posté(e) le 8 janvier 2016 Posté(e) le 8 janvier 2016 Bonjour Il me semblait que le VBA était mort sous AutoCAD, non ?:blink:Pour répondre à lili2006, il est toujours possible de développer en VBA sous AutoCAD.Il est nécessaire de télécharger/installer le module VBA. @Topheur- As-tu testé ce programme décrit dans mon message précédent ? Il semble correspondre à ce que tu demandes.- Ta question concerne plus le language VBA qu'AutoCAD 2012. A l'avenir, je te conseille d'utiliser le forum VBA. (peut-être qu'un admin peut déplacer ce sujet...)- Après une recherche sur ce forum justement, j'ai trouvé ce sujet où je donne une réponse adaptée à ta question. Voici un extrait de ton code : Dim FilterType(0) As IntegerDim FilterData(0) As Variant[...]FilterType(0) = 0FilterData(0) = "INSERT"FiltersType = FilterTypeFiltersData = FilterData L'extrait précédent permet de définir un filtre de sélection.Actuellement, la commande sélectionne toutes les références de blocs (objet de type "INSERT").Pour sélectionner seulement les blocs nommés "Repère", tu dois modifier le code par : Dim FilterType(1) As IntegerDim FilterData(1) As Variant[...]FilterType(0) = 0FilterData(0) = "INSERT"FilterType(1) = 2FilterData(1) = "Repère"FiltersType = FilterTypeFiltersData = FilterData Guillaume AutoCAD, AutoCAD Map3D, AutoCAD Architecture, Revit, COVADIS, InfraWorks 360, ReCap 360, ...BIM Infrastructure
Topheur Posté(e) le 8 janvier 2016 Auteur Posté(e) le 8 janvier 2016 Bonjour Pour répondre à lili2006, il est toujours possible de développer en VBA sous AutoCAD.Il est nécessaire de télécharger/installer le module VBA. @Topheur- As-tu testé ce programme décrit dans mon message précédent ? Il semble correspondre à ce que tu demandes.- Ta question concerne plus le language VBA qu'AutoCAD 2012. A l'avenir, je te conseille d'utiliser le forum VBA. (peut-être qu'un admin peut déplacer ce sujet...)- Après une recherche sur ce forum justement, j'ai trouvé ce sujet où je donne une réponse adaptée à ta question. Voici un extrait de ton code : Dim FilterType(0) As IntegerDim FilterData(0) As Variant[...]FilterType(0) = 0FilterData(0) = "INSERT"FiltersType = FilterTypeFiltersData = FilterData L'extrait précédent permet de définir un filtre de sélection.Actuellement, la commande sélectionne toutes les références de blocs (objet de type "INSERT").Pour sélectionner seulement les blocs nommés "Repère", tu dois modifier le code par : Dim FilterType(1) As IntegerDim FilterData(1) As Variant[...]FilterType(0) = 0FilterData(0) = "INSERT"FilterType(1) = 2FilterData(1) = "Repère"FiltersType = FilterTypeFiltersData = FilterData Guillaume Salut Guillaume ;) Tous d'abord, je tiens à te dire JE T'AIME !!! :(rires forts): Je savais que c'était dans ce bout de code et j'ai touché la réponse du bout du doigt !J'ai chercher sur le net en vain et j'ai même essayé le nom de bloc mais sans la ligneFilterType(0) = 0 à 2 ça n'importer rien ! Pour répondre à ta question concernant ton message précédent j'avoue qu'attendant un heureux évènement :P , en ce moment je suis plus dans la réno de chambre et les forums de bricolage que sur le forum CAD, toutefois, j'avais regardé ton topic mais les liens de téléchargement sont morts :( . En tous cas, JE T'AIME, JE T'AIME, JE T'AIME ! Grâce à toi je vais gagner un temps fou sur mes nomenclatures. Un GRAND MERCI !
Lommig Posté(e) le 8 janvier 2016 Posté(e) le 8 janvier 2016 Salut, Si tu souhaites en apprendre un peu plus sur les filtres de sélection VBA :About Using Filter Lists to Define Selection Set Rules (VBA/ActiveX) Je suis heureux d'avoir aidé un futur papa à libérer du temps pour préparer la chambre.Tu n'as plus d'excuse pour ne pas être prêt à temps !Bon courage pour la suite. Guillaume AutoCAD, AutoCAD Map3D, AutoCAD Architecture, Revit, COVADIS, InfraWorks 360, ReCap 360, ...BIM Infrastructure
lili2006 Posté(e) le 8 janvier 2016 Posté(e) le 8 janvier 2016 Bonne Année à toutes et tous, il est toujours possible de développer en VBA sous AutoCAD. Merci pour cette précision Lommig,;) Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
JMBZ38 Posté(e) le 3 mars 2021 Posté(e) le 3 mars 2021 Bonjour à tous, je reprends ce post car je cherche à exporter des paramètres dimensionnels et des attributs de blocs dynamiques afin de les renseigner sous Excel avant de les réinjecter dans AutoCAD (2019). Je tente d'utiliser l'excellent ExcelAttribut de Gile mais seuls les attributs sont exportés ! Je pensais également pouvoir récupérer les paramètres. Y-a-t-il une manip particulière pour se faire ? (Le lien de Rebcao semble HS...)merci pour votre aide !
rebcao Posté(e) le 4 mars 2021 Posté(e) le 4 mars 2021 Bonjour, Le lien est corrigé ! Pour les paramètres, il suffit d'ajouter des ATTRIBUTS aux quels on ajoute les valeurs des paramètres dans la valeur par défaut, via insérer un champs, OBJETS... Christian Formateur, Consultant Expert AutoCAD, REVIT MEP, INVENTOR, télécharger , des Outils AutoCAD...cad123 @ wanadoo.fr (enlever les espaces de part et d'autre de @)
Steven Posté(e) le 4 mars 2021 Posté(e) le 4 mars 2021 Salut JMBZ38, Pour faire ce que tu souhaites, il faut utiliser le lisp ATTIN / ATTOUT amélioré par Brice.Il faut que tu ais les Expresstools d'installé pour pouvoir l'utiliser.ATTIN_ATTOUT_DYN.zip Steven________________________________________ Pour le taf; Windows (et ses emmerdes) sinon pas d'AutoCAD. Pour le perso Linux Mint et pas de problèmes. Mais pas d'AutoCAD. En rêve; AutoCAD sous Linux.
JMBZ38 Posté(e) le 4 mars 2021 Posté(e) le 4 mars 2021 Merci beaucoup, ce Lisp est vraiment exceptionnel et surtout très util !
PLS-AppliCAD Posté(e) le 28 avril 2022 Posté(e) le 28 avril 2022 Bonjour En rapport à votre conversation, nous proposons une solution Un logiciel autonome d’outils DWG téléchargeable gratuitement ( pas besoin de version spécifique d’AutoCAD ), pour effectuer des imports / export Excel DWG. N’hésitez à l’essayer et à nous donner votre avis C’est ici : https://plugins-cad.com/
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