PhilBat Posté(e) le 9 novembre 2012 Posté(e) le 9 novembre 2012 Bonjour,comment détecter le point commun de deux lignes contigues et linéaires (sur un même plan et pas en 3D)la fonction "IntersectWith" ne semble pas fonctionner.MerciA+Phil
Maxence DELANNOY Posté(e) le 9 novembre 2012 Posté(e) le 9 novembre 2012 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 DELANNOYDéveloppement de compléments aux logiciels Autodesk : AutoCAD, Revit, Inventor, Vault, Navisworks... et autres logiciels de CAOWIIP - http://wiip.fr
(gile) Posté(e) le 9 novembre 2012 Posté(e) le 9 novembre 2012 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
PhilBat Posté(e) le 13 novembre 2012 Auteur Posté(e) le 13 novembre 2012 Merci pour vos réponsesConcernant la fonction IntersectWith, elle ne semble pas marcher pour la cas suivant :ligne A : startpoint 69.5,183 et endpoint 131.5,183ligne B : startpoint 131.5,183 et endpoint 198,183Si 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
bazoul Posté(e) le 14 novembre 2012 Posté(e) le 14 novembre 2012 En meme temps si les segments sont continu peut on dire qu'il y a intersection?Dans ce cas rajouter comme indiqué un test sur le point de départ et d'arrivée ou alors se faire un algo maison :D
(gile) Posté(e) le 20 novembre 2012 Posté(e) le 20 novembre 2012 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
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