foxdevil17
Messages postés3Date d'inscriptionsamedi 20 novembre 2010StatutMembreDernière intervention 1 mai 2011
-
30 avril 2011 à 17:35
pile_poil
Messages postés682Date d'inscriptionvendredi 6 avril 2007StatutMembreDernière intervention 4 août 2012
-
1 mai 2011 à 15:29
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 !
pile_poil
Messages postés682Date d'inscriptionvendredi 6 avril 2007StatutMembreDernière intervention 4 août 20126 1 mai 2011 à 12:39
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.
pile_poil
Messages postés682Date d'inscriptionvendredi 6 avril 2007StatutMembreDernière intervention 4 août 20126 1 mai 2011 à 12:51
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
foxdevil17
Messages postés3Date d'inscriptionsamedi 20 novembre 2010StatutMembreDernière intervention 1 mai 2011 1 mai 2011 à 12:55
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 !
Vous n’avez pas trouvé la réponse que vous recherchez ?
foxdevil17
Messages postés3Date d'inscriptionsamedi 20 novembre 2010StatutMembreDernière intervention 1 mai 2011 1 mai 2011 à 13:18
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".
pile_poil
Messages postés682Date d'inscriptionvendredi 6 avril 2007StatutMembreDernière intervention 4 août 20126 1 mai 2011 à 15:29
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