Aller au contenu

Angle entre deux lignes


Invité Patrick

Messages recommandés

Posté(e)

Comment calculer l'angle entre deux segments consécutifs d'une même polyligne? En LISP il y a une petite fonction qui va bien, et en VBA? :casstet:

Posté(e)

Patrick,

 

J'imagine que tu connais au moins 3 points, le deuxième étant le sommet.

 

Voici un exemple simple que tu peux adapter.

 

Sub Example_AngleFromXAxis()

' This example finds the angle, in radians, between the X axis

' and an axis defined by two points.

 

Dim pt1(0 To 2) As Double

Dim pt2(0 To 2) As Double

Dim retAngle As Double

 

pt1(0) = 2: pt1(1) = 5: pt1(2) = 0

pt2(0) = 5: pt2(1) = 2: pt2(2) = 0

 

' Return the angle

retAngle = ThisDrawing.Utility.AngleFromXAxis(pt1, pt2)

 

' Display the angle found

MsgBox "The angle in radians between the X axis and the 2 points is " & retAngle, , "AngleFromXAxis Example"

 

End Sub

 

 

Serge

Posté(e)

Merci, mais il n'y a pas de fonction VBA pour directement trouver l'angle entre deux lignes comme cela existe en LISP? C'est surprenant. Le code que tu me donnes trouve l'angle par rapport à l'axe des X. Est-ce que l'angle entre deux lignes est la différence arithmétique entre les deux angles par rapport à l'axe des X? Je n'en suis pas sûr...

Posté(e)

Pour un objet AcadLine est existe une propriété ANGLE, mais pour un AddPolyline inéxistant dans ces propriétée !

 

exemple pour AcadLine :

Sub Example_Angle()

 

Dim lineObj As AcadLine

Dim startPoint(0 To 2) As Double, endPoint(0 To 2) As Double

 

startPoint(0) = 1: startPoint(1) = 1: startPoint(2) = 0

endPoint(0) = 5: endPoint(1) = 5: endPoint(2) = 0

 

Set lineObj = ThisDrawing.ModelSpace.AddLine(startPoint, endPoint)

 

ThisDrawing.Application.ZoomAll

MsgBox "The angle of the new Line is: " & lineObj.angle

 

End Sub

l'ACADien ! http://img124.exs.cx/img124/7999/start.gif

Posté(e)

Patrick,

 

Je ne connais pas de fonction en Lisp qui accepte 2 lignes et lui trouve l'angle. La fonction angle reçoit 2 points.

 

Pour l'exemple précédent, il y a 2 bémols.

 

1) Si les lignes forment un plan tridimentionnel, on pourra toujours utiliser le calculateur en lisp via les formules "ang(sommet,p1,p2,p3)" et "ang(sommet,p1,p2)" où tous ces 4 paramètres sont des points 3d

 

2) En 2D, si la ligne 1 est à 10 degrés et la ligne 2 à 350 degrées, la différence sera de 340 degrés, ce qui n'est pas faux mais pas exact non plus. On peut alors faire

(rem (- (+ (* 2 pi) ang1) ang2) (* 2 pi))

c'est à dire, on ajoute un tour complet à l'angle 1, on lui soustrait l'angle 2, et si on est toujours au desus de 2 pi, on soustrait ce 2 pi.

 

En VBA, on peut donc appliquer le même algorithme (si on est en 2D)

 

Serge

Posté(e)

Tu as raison, je confondais avec la fonction ang de la calculatrice géométrique, avec laquelle il est possible de connaitre l'angle entre deux lignes. La calculatrice géométrique serait-elle utilisable en VBA?

Posté(e)
2) En 2D, si la ligne 1 est à 10 degrés et la ligne 2 à 350 degrées, la différence sera de 340 degrés, ce qui n'est pas faux mais pas exact non plus. On peut alors faire

(rem (- (+ (* 2 pi) ang1) ang2) (* 2 pi))

c'est à dire, on ajoute un tour complet à l'angle 1, on lui soustrait l'angle 2, et si on est toujours au desus de 2 pi, on soustrait ce 2 pi.

 

...ca fait des années que je me tape toujours un ou une série de COND pour traiter le modulo PI.

 

faudra que j'essaie o't'chose, de c'que je vois ici !

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Posté(e)

Patrick,

 

Tu peux toujours exécuter un SendCommand avec l'idée d'utiliser la varaiable système USERR1 comme tampon (tu sauvegarde la valeur initiale au préalable). L'ennui est que tu auras toujours un écho sur la ligne de commande. Est-ce que tes lignes sont en 3D ?

 

Exemple d'utilisation de CAL depuis VBA:

 

Sub test()

Dim commande As String

Dim UserR1 As Double

Dim MyValue As Double

 

loadArx "geomcal.arx" ' S'assurer d'avoir chargé le arx

UserR1 = ThisDrawing.GetVariable("userr1")

 

commande = "(setvar " & Chr(34) & "userr1" & Chr(34) & " (cal " & Chr(34) & _

"1.1+1.2" & Chr(34) & "))" & vbCr

ThisDrawing.SendCommand commande

 

MyValue = ThisDrawing.GetVariable("userr1")

Debug.Print "Userr1: " & CDbl(MyValue)

ThisDrawing.SetVariable "userr1", UserR1

End Sub

 

Sub loadArx(arxFileName As String)

Dim appList As Variant

appList = ThisDrawing.Application.ListArx

 

If VarType(appList) <> vbEmpty Then

Dim I As Integer

For I = LBound(appList) To UBound(appList)

If StrComp(appList(I), arxFileName, vbTextCompare) = 0 Then Exit Sub

Next

End If

ThisDrawing.Application.loadArx (arxFileName)

End Sub

 

 

Serge

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é