Exportation de quantités AutoCAD vers Excel

Signaler
Messages postés
3
Date d'inscription
samedi 20 novembre 2010
Statut
Membre
Dernière intervention
1 mai 2011
-
Messages postés
682
Date d'inscription
vendredi 6 avril 2007
Statut
Membre
Dernière intervention
4 août 2012
-
Bonjour à ceux qui passeront par là !

Voilà j'ai un programme à développer à partir d'Excel en VB, qui consiste à dialoguer avec AutoCAD.
A partir du tableur Excel qui contient les informations suivantes : Unité, Nom du fichier et Nom du calque.
Le code que j'essaie de mettre en place devra en fonction de l'Unité, extraire d'AutoCAD des informations d'un calque.
Pour le moment, mon code fonctionne, choisi le bon fichier, le bon calque, mais lorsque l'Unité choisie est "ml", j'aimerais qu'il comptabilise la longueur des objets du calque choisi (polylignes, lignes, arc, spline, etc...). Par le même principe, lorsque l'Unité est "m²" ou "m³", j'aimerais qu'il me calcule les superficies des hâchures.
Là où j'ai un souci, c'est qu'après multiples tentatives, il ne me compte que le nombre d'objets présent dans le calque (le bon c'est déjà ça) quelque soit l'unité choisi. Les ".Length" devraient fonctionner, mais je dois faire quelque chose qu'AutoCAD ou Excel ne comprend pas ...

Public Sub ExportQuantites()

Dim UniteQuantite As String
Dim CheminFichier As String
Dim CalqueFichier As String
Dim m As Integer
'Dim CalqueActif As AcadLayer
'Dim TousLesCalques As AcadLayers
Dim Selection As AcadSelectionSet
Dim FilterType(0) As Integer
Dim FilterData(0) As Variant
Dim Compteur As String
Dim Longueur As String
Dim Objet As AcadEntity
Dim Line As AcadLine
Dim PLine As AcadLWPolyline
Dim Arc As AcadArc
Dim FiltersType, FiltersData As Variant

    InitialiserExport

    For m = 11 To 30
        UniteQuantite = Worksheets("Travail").Cells(m, 3).Value
        CheminFichier = Worksheets("Travail").Cells(m, 4).Value
        CalqueFichier = Worksheets("Travail").Cells(m, 5).Value

        If Right(CheminFichier, 4) = ".dwg" Then
            OuvrirDessinAutocad (CheminFichier)

            Select Case UniteQuantite
                Case "ml"
                    Set Selection = AcadDoc.SelectionSets.Add("SelectionML")
                    FilterType(0) = 8
                    FilterData(0) = CalqueFichier
                    FiltersType = FilterType
                    FiltersData = FilterData
                    Selection.Select acSelectionSetAll, , , FiltersType, FiltersData
                
                    For Each Objet In Selection
                      If Objet = IAcadLWPolyline2 Then
                      Longueur = Objet.Length
                      Comteur = Compteur + Longueur
                      End If
                    
                    
 'autre essai         'If Objet.ObjectName = AcDbPolyline Then
                      '    Longueur = Objet.Length
                      '    Compteur = Compteur + Longueur
                      'End If
                      '
                      '
                      '
 'autre essai         'If Objet.ObjectName = LWPolyline Then
                      '    Set PLine = Objet
                      '    Compteur = Compteur + PLine.Length
                      'End If
                    Next Objet

                    Worksheets("Travail").Cells(m, 7).Value = Selection.Count
                    AcadDoc.SelectionSets.Item("SelectionML").Delete

                Case "U"
                    ...

                Case "m²"
                    ...

                Case "m³"
                    ...

            End Select
        End If
    Next m

End Sub


Merci d'avance à tous ceux qui pourront m'éclairer un peu !

6 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
70
Salut

Trop spécifique à Autocad. Tout dépend des attributs des objets.
Il n'y a que toi qui ait la doc.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
682
Date d'inscription
vendredi 6 avril 2007
Statut
Membre
Dernière intervention
4 août 2012
6
bonjour
j'ai vite fait deux polyline sur un dessin vierge.
la premiere sur la couche "0" (zero)
la deuxieme sur la couche "defpoint"

puis j'ai écrit ce petit bout de code
Sub test()
    Dim toto As String
    Dim titi As Double
    Dim bidule As Object
    Set bidule = ThisDrawing.ModelSpace
    For Each ACADobj In bidule
        With ACADobj
            If .Layer = "0" Then
                toto = .EntityName
                titi = .Length
            End If
        End With
    Next
End Sub

et cela marche sans problème
il ne voit qu'un objet et me donne son type et sa longueur

j'espère que cela te mettra sur la voie de ton erreur
et aussi de te simplifier la vie car le "SelectionSet" n'a pas d'intérêt si tu prends en compte tout le dessin.

bon dev !

si c'est la solution, penser : REPONSE ACCEPTEE
Messages postés
682
Date d'inscription
vendredi 6 avril 2007
Statut
Membre
Dernière intervention
4 août 2012
6
oups !!!
cette mini macro je l'ai écrite dans le VBA d'autocad
a toi de la modifier pour la faire tourner dans excel si tu le désire.
par contre pour la vitesse d'éxécution je te conseille de mettre tes macros dans autocad, de mettre les résultats dans un array puis de copier le array dans excel c'est des milliers de fois plus rapide
feuille.Range(feuille.cells(1, 1), feuille.cells(UBound(monArray, 1)+1, UBound(monArray, 2) + 1)) = monArray()

si c'est la solution, penser : REPONSE ACCEPTEE
Messages postés
3
Date d'inscription
samedi 20 novembre 2010
Statut
Membre
Dernière intervention
1 mai 2011

Merci de vos réponses.
Pile_poil je suis en train d'essayer avec ton ".EntityName", je crois que c'est ce qu'il me manquait, car en fait il ne me vérifiait pas le type d'objet qu'il sélectionnait, et donc ne faisait pas ce que je voulais par la suite.

Voici ce que j'essaye (je met un peu d'ordre dans mon code et vérifie si ça marche)
            Set Selection = AcadDoc.SelectionSets.Add("SelectionML")
                 FilterType(0) = 8
                 FilterData(0) = CalqueFichier
                 FiltersType = FilterType
                 FiltersData = FilterData
                 Selection.Select acSelectionSetAll, , , FiltersType, FiltersData
                
                 For Each Objet In Selection
                 If Objet.EntityName = AcDbPolyline Then
                 Longueur = Objet.Length
                 Comteur = Compteur + Longueur
                 End If
                 Next Objet


Pour le moment je reste sur un "SelectionSet", mais ta solution me parait aussi valable, j'essaierais ensuite si j'ai le temps !
Messages postés
3
Date d'inscription
samedi 20 novembre 2010
Statut
Membre
Dernière intervention
1 mai 2011

Grâce au "EntityName", j'arrive enfin à lui faire savoir où aller, cependant maintenant il ne veut pas me récupérer mon "Objet.Length" :
Dim Longueur as Double
...
Longueur = Objet.Length

En mettant un espion sur "Objet.Length", il me donne bien la longueur de la polyligne sélectionnée, mais j'ai toujours "Longueur = 0" ...

Pour le fait de mettre mon code sur AutoCAD, ce n'est pas possible car je suis forcé de travailler sur Excel. Je réalise mon programme qui au final sera un fichier d'automatisation d'Avant métrés pour un Bureau d'études. Alors ne connaissant pas trop j'en ai conclu dès le début que j'étais obligé de réaliser mon code directement sur le fichier "xls".
Messages postés
682
Date d'inscription
vendredi 6 avril 2007
Statut
Membre
Dernière intervention
4 août 2012
6
pour le probleme excel/autocad
tu peux en effet tout écrire dans excel ou dans autocad ce n'est pas critique hormis le probleme de temps d'éxécution
si tu vas jeter un oeil dans http://www.behypnos.com/index.php?option=com_content&view=article&id=44&Itemid=8 tu verras à la rubrique edition "Export to Excel" et "import from excel" deux macros qui tournent directement dans autocad et qui permettent de modifier les données dans excel puis de les réimporter dans le dessin et cela jusqu'à 30 000 lignes en moins d'une seconde.
ecrites dans excell il fallait quarante minutes pour faire la meme chose

quand à la longueur = à zéro
si tu as bien mis le dim dans la Sub qui contiend la boucle à l'intérieur de laquelle tu as "Longueur = Objet.Length"
il y a deux raisons possibles
1 change le nom de ton objet (Object est un mot clé de VBA)
2 est tu sûr que ton dessin est propre? (il pourrait y avoir une polyline de longueur nulle fantôme par exemple au départ de la polyline que tu vois dans le dessin. cela peut arriver quand tu travailles avec un accrochage grille par exemple)
autrement si tu n'y arrives pas envoie moi tes deux fichiers et j'y jetterais un oeil pour voir le pourquoi du comment


si c'est la solution, penser : REPONSE ACCEPTEE