Aller au contenu

Calcul de longueur


Messages recommandés

Posté(e)

Bonjour,

 

Bonjour,

 

Voici un petit programme (qui n'est pas de moi) permettant de calculer la somme des lignes dans un layer bien précis (LINO PERIM). Malheureusement, avec la version 2008, celà bug presque à chaque fois !

 

Si quelqu'un peut me dépanner, je l'en remercie d'avance :D

 

Option Explicit

 

Sub ad_TotalLines()

Dim adLine As AcadObject

Dim adTotalLen As Double

Dim adWorkLayer As String

adWorkLayer = "LINO PERIM"

adTotalLen = 0

For Each adLine In ThisDrawing.ModelSpace

If adLine.ObjectName = "AcDbLine" Then

If adLine.Layer = adWorkLayer Then

adTotalLen = adTotalLen + adLine.Length

End If

End If

Next adLine

adTotalLen = Round(adTotalLen, 2)

MsgBox "Total of line segments" & vbCr & _

"on layer " & adWorkLayer & " is:" & vbCr & _

adTotalLen

End Sub

 

Public Function Round(adNum As Double, adPlaces As Integer) As Double

Dim adTmp As Integer

adNum = CDbl(adNum)

adTmp = Fix(adNum)

adNum = CInt((adNum - adTmp) * 10 ^ adPlaces)

Round = adTmp + adNum / 10 ^ adPlaces

End Function

Posté(e)

Didier,

 

Désolé pour cette réponse tardive mais j'ai eu quelques problèmes avec mon PC. Oui, ce n'est pas toujours facile de lire le programme d'un autre. Si tu as quelques choses pour moi en lisp ou en VBA, cela serait avec grand plaisir.

 

Merci d'avance !

 

Azrael

  • 3 semaines après...
Posté(e)

Salut

 

Moi j'ai fait une macro qui permet de calculer la longueur des objets (arcs, lignes ou polylignes)que l'on peut sélectionner, c'est très souple. Celà affiche le résultat dans une Message Box.

Je vous file le code :

 

Sub longueurtotale()
' Create the selection set
Dim sset As Object
'ThisDrawing.SelectionSets("SS1").Delete
Set sset = ThisDrawing.SelectionSets.Add("SS1")

' Prompt the user to select objects
sset.SelectOnScreen


' Define the variable
Dim compteur As Single

' Loop through all entities in the selection
' set and assign the xdata to each entity
Dim obj As AcadEntity
Dim obj2 As AcadObject
Dim Line As AcadLine
Dim arc As AcadArc
Dim poly As AcadLWPolyline

For Each obj In sset
'MsgBox ("type de l'objet : " & obj.EntityType)
If obj.EntityType = 19 Then
Set Line = obj
compteur = compteur + Line.Length
End If
If obj.EntityType = 4 Then
Set arc = obj
compteur = compteur + arc.ArcLength
End If
If obj.EntityType = 24 Then
Set poly = obj
compteur = compteur + poly.Length
End If
Next obj

MsgBox ("longueur totale :" & compteur & "m")
ThisDrawing.SelectionSets("SS1").Delete

End Sub 

 

Bonne utilisation. Toutes les suggestions d'amélioration sont les bienvenues.

J'ai fait la même chose pour les surfaces (hachures et polylignes fermées), et j'ai fait des macros aussi pour calculer des données technique à partir du nombre de blocs sélectionnés...

Si çà intéresse des gens, qu'ils me le disent, je leur donnerai mon code.

 

A++

Posté(e)

Bonjour

 

y a ce code qui est en liaison avec un fichier excel....

Sub Longueur_poly()

Dim Baselect As AcadSelectionSet

Dim BaObjet As Object

Dim length As Long

Dim lengthT As Long

Dim MyXL As Object

Dim feuille As Worksheet

Dim cellule As Range

 

'Adapté par Michel a "multi selection"

 

lengthT = 0

length = 0

Set Baselect = ThisDrawing.SelectionSets.Add("ac")

Call Baselect.SelectOnScreen

For Each BaObjet In Baselect

length = BaObjet.length

lengthT = lengthT + length

Next

' ne pas oublier de créer le fichier excel

Set MyXL = GetObject("d:\Classeur1.XLS")

MyXL.Application.Visible = True

MyXL.Parent.Windows(1).Visible = True

Set feuille = MyXL.Worksheets("Feuil1")

'enregistre dans la cellule B2

feuille.Cells(2, 2).Value = lengthT

'Quitte excel qui demandera un enregistrement éventuel

MyXL.Application.Quit

 

'ThisDrawing.SelectionSets.Item("ac").Delete

MsgBox lengthT

 

End Sub

 

pourrait on l'améliorer....

 

Michel a

Posté(e)

Bonsoir Lili2006

 

Pour ton soucis, il faut que dans l'editeur VBA d'autocad, que tu ailles dans le menu Outils, ensuite Référence, et dans la liste il faut selectionner la librairie qui est en relation avec Excel.

 

Ensuite le code devrais marcher (Normalement)

 

 

@+

MDSV31

 

Dessinateur Indépendant

Posté(e)

Hello,

 

je ne veux pas interpréter le code fourni par Speedy, mais cette avant dernière ligne:

 'ThisDrawing.SelectionSets.Item("ac").Delete

est marquée comme un commentaire donc pas exécutée.

Or elle est censé "détruire" la sélection créée en haut.

Ceci n 'ayant pas été fait, à la nouvelle exécution du code, le jeu de sélection existant déjà, un message d 'erreur est généré.

Posté(e)

Salut

 

si je veux tester ce code, que doi-je rajouter pour que celui-ci fonctionne

 

Enlever l'apostrophe au tout debut de la ligne.

 

 'ThisDrawing.SelectionSets.Item("ac").Delete

 

@+

Posté(e)

Bonsoir

 

tu dois créer un fichier excel ...le nommer comme tu veux à condition de modifier la ligne...

Set MyXL = GetObject("lecteur:\nom_du_fichier.XLS")

 

 

@+

 

Michel a

Posté(e)

Bonjour Lili2006

 

Je reviensà la macro longeurtotale, pour arrondir le récultat on peut faire :

 

MsgBox ("longueur totale :" & Format(compteur, "0.00") & "m") 

 

à la place de :

 

 MsgBox ("longueur totale :" & compteur & "m")

 

c'est plus sympa, non ?

 

D'autre part, voici l'équivalent de "longueurtotale" pour les surfaces (hachures, objets fermés):

 

Sub airetotale()
' Create the selection set
Dim sset As Object
'ThisDrawing.SelectionSets("SS2").Delete
Set sset = ThisDrawing.SelectionSets.Add("SS2")

' Prompt the user to select objects
sset.SelectOnScreen

' Define the variable
Dim compteur As Single
compteur = 0

' Loop through all entities in the selection
' set and assign the xdata to each entity
Dim obj As AcadEntity
Dim Line As AcadLine
Dim arc As AcadArc
Dim poly As AcadLWPolyline
Dim hach As AcadHatch

For Each obj In sset
'MsgBox ("type de l'objet : " & obj.EntityType)
If obj.EntityType = 24 Then
'MsgBox ("polyligne trouvée !!")
Set poly = obj
If poly.Closed = True Then
compteur = compteur + poly.Area
End If
End If
If obj.EntityType = 17 Then
'MsgBox ("hachure trouvée !!")
Set hach = obj
compteur = compteur + hach.Area
End If
Next obj
If compteur <> 0 Then
MsgBox ("aire totale :" & Format(compteur, "0.00") & "m²")
End If
ThisDrawing.SelectionSets("SS2").Delete

End Sub 

 

Voili, voilou...

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é