Aller au contenu

IntersectWith


PhilBat

Messages recommandés

En .NET, on peut tester les extrémités :

 

l1.StartPoint.IsEqualTo(l2.StartPoint) || l1.StartPoint.IsEqualTo(l2.EndPoint) || l1.EndPoint.IsEqualTo(l2.StartPoint) || l1.EndPoint.IsEqualTo(l2.EndPoint)

 

IsEqualTo permet de faire une comparaison approximative des coordonnées, en ignorant les erreurs d'arrondis du à l'utilisation du type double.

Maxence DELANNOY

Développement de compléments aux logiciels Autodesk : AutoCAD, Revit, Inventor, Vault, Navisworks... et autres logiciels de CAO

WIIP - http://wiip.fr

Lien vers le commentaire
Partager sur d’autres sites

Salut,

IntersectWith fonctionne très bien, je ne comprends pas ton problème.

 

Si tu as deux objets graphiques de type Line (line1 et line2), tu peux utiliser la méthode Entity.IntersectWith().

Extrait de l'aide :

Public unsafe Function IntersectWith(
   entityPointer As Entity, 
   intersectType As Autodesk.AutoCAD.DatabaseServices.Intersect, 
   points As Point3dCollection, 
   thisGraphicSystemMarker As IntPtr, 
   otherGraphicSystemMarker As IntPtr
) As void

 

Tu appelles la méthode sur line1 par exemple en lui passant comme arguments :

- line2 (l'autre ligne)

- un membre de l'énumération Intersect suivant que tu souhaites étendre les deux lignes, uniquement la première, uniquement la seconde ou aucune.

- une instance de Point3dcollection qui contiendra le point d'intersection s'il existe

- un pointeur vers le marqueur graphique de l'entité sur laquelle est appelée la méthode, toujours 0 pour une ligne (les versions d'AutoCAD plus récentes considèrent le type Int64 comme obsolète et conseillent l'utilisation du type IntPtr, dans ce cas : New IntPtr(0) mais 0 est encore toléré avec A2013)

- idem ci-dessus pour l'entité passée en argument

 

Exemple pour la recherche d'une intersection sur les segments (aucune extension), si pts.Count = 0 c'est qu'il n'y a pas d'intersection, sinon, pour deux lignes, pts.Count sera égal à 1 et pts contiendra le point d'intersection.

Dim pts As objectIdcollection = new ObjectIdCollection
line1.IntersectWith(line2, Intersect.OnBothOperand, pts, 0, 0)

 

Une autre méthode consiste à utiliser des objets géométriques (non graphiques) est moins "gourmande" que celle ci-dessus. En règle générale pour les opérations purement géométriques, il est préférable d'utiliser les objets géométriques correspondant aux objets graphiques quand ils existent.

Dans ce cas, on peut utiliser des objets dérivant de Autodesk.AutoCAD.Geometry.LinearEntity3d (ou LinearEntity2d) qui ont aussi une méthode IntersectWith().

Extrait de l'aide :

Public Function IntersectWith(
   line As LinearEntity3d
) As Point3d()

 

On utilisera les types Line3d ou LineSegment3d selon qu'on veut étendre ou non une ou les deux lignes.

La méthode retourne un tableau (Array) de Point3d ou null (Nothing) si aucune intersection n'a été trouvée.

 

Exemple pour rechercher l'intersection entre le segment line1 et la droite (extension) porté par line2 :

Dim ls3d As LineSegment3d = New LineSegment3d(line1.StartPoint, line1.EndPoint)
Dim l3d As Line3d = New Line3d(line2.StartPoint, line2.EndPoint)
Dim pts As Point3d() = ls3d.IntersectWith(l3d)

Il va sans dire que si tu connais les points de départ et de fin des lignes sans avoir à ouvrir (ou créer) les objets graphiques de type Line, cette méthode est celle à utiliser.

 

Nota: en interne, l'API utilise la seconde méthode quand on appelle la première mais seulement après avoir déterminé le type d'objet graphique compatible en fonction du type d'entité et du mode d'intersection, d'où le "coût" plus cher de la première méthode.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Merci pour vos réponses

Concernant la fonction IntersectWith, elle ne semble pas marcher pour la cas suivant :

ligne A : startpoint 69.5,183 et endpoint 131.5,183

ligne B : startpoint 131.5,183 et endpoint 198,183

Si j'utilise le code suivant :

Public Function CollPt3d_Intersection(db As Database, IdA As ObjectId, IdB As ObjectId) As Point3dCollection
       Dim pt As Point3d
       Dim CollPt3d As New Point3dCollection()
       Using tr As Transaction = db.TransactionManager.StartTransaction()
           Dim EntA As Entity = TryCast(tr.GetObject(IdA, OpenMode.ForRead), Entity)
           Dim EntB As Entity = TryCast(tr.GetObject(IdB, OpenMode.ForRead), Entity)
           'Verifie si les 2 entitees s'intersectent
           EntA.IntersectWith(EntB, Autodesk.AutoCAD.DatabaseServices.Intersect.OnBothOperands, CollPt3d, IntPtr.Zero, IntPtr.Zero)
           ed.WriteMessage(vbLf & "Nombre d'intersection trouvé: " + CollPt3d.Count.ToString)
           tr.Commit()
       End Using
       Return CollPt3d
   End Function

Le nombre d'intersection trouvé est 0 ce qui est dommage.

Pour pallier à ceci, faire un teste des extrémités en complément est une solution.

A+

Phil

Lien vers le commentaire
Partager sur d’autres sites

La méthode Autodesk.AutoCAD.Geometry.LinearEntity3d.IntersectWith() retourne bien un point en cas en cas de lignes contigües et colinéaires (idem pour LinearEntity2d.IntersectWith().

 

        Public Sub Test()
           Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor
           Dim ls1 As New LineSegment2d(New Point2d(69.5, 183.0), New Point2d(131.5, 183.0))
           Dim ls2 As New LineSegment2d(New Point2d(131.5, 183.0), New Point2d(198.0, 183.0))
           Dim pts As Point2d() = ls1.IntersectWith(ls2)
           If pts Is Nothing Then
               ed.WriteMessage(vbLf & "Aucune intersection")
           Else
               ed.WriteMessage(vbLf & pts(0).ToString())
           End If
       End Sub

 

Ta fonction CollPt3d_Intersection() pourrait être :

 

        Private Function CollPt3d_Intersection(db As Database, IdA As ObjectId, IdB As ObjectId) As Point3dCollection
           Dim CollPt3d As New Point3dCollection()
           Using tr As Transaction = db.TransactionManager.StartTransaction()
               Dim line1 As Line = TryCast(tr.GetObject(IdA, OpenMode.ForRead), Line)
               If line1 Is Nothing Then
                   Throw New System.ArgumentException("Pas une ligne")
               End If
               Dim line2 As Line = TryCast(tr.GetObject(IdB, OpenMode.ForRead), Line)
               If line1 Is Nothing Then
                   Throw New System.ArgumentException("Pas une ligne")
               End If
               Dim ls1 As LineSegment3d = New LineSegment3d(line1.StartPoint, line1.EndPoint)
               Dim ls2 As LineSegment3d = New LineSegment3d(line2.StartPoint, line2.EndPoint)
               Dim pts As Point3d() = ls1.IntersectWith(ls2)
               If pts IsNot Nothing Then
                   CollPt3d.Add(pts(0))
               End If
               tr.Commit()
           End Using
           Return CollPt3d
       End Function

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

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é