Invité Patrick Posté(e) le 30 novembre 2004 Posté(e) le 30 novembre 2004 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:
Serge Posté(e) le 30 novembre 2004 Posté(e) le 30 novembre 2004 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
Invité Patrick Posté(e) le 30 novembre 2004 Posté(e) le 30 novembre 2004 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...
Pako Posté(e) le 30 novembre 2004 Posté(e) le 30 novembre 2004 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
Serge Posté(e) le 30 novembre 2004 Posté(e) le 30 novembre 2004 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
Invité Patrick Posté(e) le 30 novembre 2004 Posté(e) le 30 novembre 2004 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?
Tramber Posté(e) le 30 novembre 2004 Posté(e) le 30 novembre 2004 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 ./__\. (.°=°.)
Serge Posté(e) le 30 novembre 2004 Posté(e) le 30 novembre 2004 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", UserR1End 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
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