Aller au contenu

Polyligne


Messages recommandés

Posté(e)

Bonsoir, bonne et heureuse année à toutes et à tous.

(Encore avec une heure d'avance environ ;) )

 

Mon problème est le suivant :

Comment en sélectionnant une polyligne (via GetEntity) qui a au minimum 3 sommets, connaitre les n° de sommets qui correspondent aux extrémités du segment de droite de l'endroit cliqué ?

Ex :

Une figure en forme de "V", sommet A,B et C. Le sommet B étant celui qui se trouve en bas. AB=100 : BC=10.

Je clique sur le segment AB mais proche du sommet B. Si je demande les 2 sommets les plus proches pour avoir les extrémités du segment, ce sera faux car le sommet C est plus proche que le sommet B, et il ne fait pas partie de mon segment

:( . Comment puis-je faire ?

Merci de votre aide

Nous n’ héritons pas de la terre de nos ancêtres.Nous l’empruntons à nos enfants.

Posté(e)

Bonsoir.

 

Pour ma part je pense qu'il s'agit de situer le sommet le plus proche du point de sélection de la polyligne.

J'ai tenté une bidouille que voici :

 

Public Sub bidouille()
Dim objetselection As AcadEntity
Dim polyligne As AcadLWPolyline
Dim pointdeselection As Variant
Dim coordodeselection(0 To 2) As Double
Dim sommets As Variant
Dim coordosommet(0 To 2) As Double
Dim distance As Double
Dim cercle() As AcadCircle

'Récupère la polyligne
ThisDrawing.Utility.GetEntity objetselection, pointdeselection, "Sélectionnez la polyligne !"
Set polyligne = objetselection

'Récupère les coordonnées du point de sélection
coordodeselection(0) = pointdeselection(0): coordodeselection(1) = pointdeselection(1)

'Récupère les sommets de la polyligne
sommets = polyligne.Coordinates

'Crée un tableau pour un nombre de cercles correspondant
ReDim cercle(UBound(sommets))

'Calcule pour chaque sommet la distance par rapport au point de sélection
'basé sur le carré de l'hypothénus!
For tour = LBound(sommets) To UBound(sommets)
coordosommet(0) = sommets(tour): coordosommet(1) = sommets(tour + 1)
distance = Abs((coordodeselection(0) - coordosommet(0)) * (coordodeselection(0) - coordosommet(0))) _
       + Abs((coordodeselection(1) - coordosommet(1)) * (coordodeselection(1) - coordosommet(1)))
distance = Sqr(distance)

'crée un cercle de centre point de sélection, et rayon valant le vecteur
Set cercle(tour) = ThisDrawing.ModelSpace.AddCircle(pointdeselection, distance)
cercle(tour).color = acRed
tour = tour + 1

Next

'Le plus petit cercle passe par le sommet le plus près du point de sélection
'partant de la, le sommet est récupérable...

End Sub 

J'espère ne pas être trop à côté...

 

nazemrap

Posté(e)

Bonsoir,

Tu as tout compris Didier :D

Merci nazemrap, vais étudier ton code

Nous n’ héritons pas de la terre de nos ancêtres.Nous l’empruntons à nos enfants.

Posté(e)

Re Re

 

J'ai décidé de retenter ma chance.

Cette fois j'insère un point aux extrémités du segment concerné.

Je veux bien qu'on me donne une correction sur mes tentatives.

 

Public Sub bidouille2()

Dim objetselection As AcadEntity
Dim polyligne As AcadLWPolyline
Dim pointdeselection As Variant
Dim coordodeselection(0 To 2) As Double
Dim explosepoly As Variant
Dim point, point1, point2 As AcadPoint
Dim intpoints As Variant
Dim ligne As AcadLine


'Met les points en croix
ThisDrawing.SetVariable "pdmode", 3

'NB l'accrochage "proche" doit être utilisé pendant la sélection
'Récupère la polyligne
ThisDrawing.Utility.GetEntity objetselection, pointdeselection, "Sélectionnez la polyligne !"
Set polyligne = objetselection

'Récupère les coordonnées du point de sélection
coordodeselection(0) = pointdeselection(0): coordodeselection(1) = pointdeselection(1)

'Insère un point
Set point = ThisDrawing.ModelSpace.AddPoint(pointdeselection)

explosepoly = polyligne.Explode

'Boucle sur les objets résultants
Dim I As Integer
For I = 0 To UBound(explosepoly)
If explosepoly(I).ObjectName = "AcDbLine" Then
Set ligne = explosepoly(I)
'Teste l'intersection avec le point
intpoints = ligne.IntersectWith(point, acExtendNone)
   If VarType(intpoints) <> vbEmpty Then
   If UBound(intpoints) = 2 Then
   'met les points aux extrémités
   Set point1 = ThisDrawing.ModelSpace.AddPoint(ligne.StartPoint)
   Set point2 = ThisDrawing.ModelSpace.AddPoint(ligne.EndPoint)
   End If
   End If
End If
ligne.Delete
Next

End Sub

 

nazemrap

 

[Edité le 2/1/2006 par nazemrap]

Posté(e)

Rebonsoir nazemrap,

D'abord, merci de m'aider, ça fait chaud au coeur en ces temps où on se gèle ...tout :P

Un truc qui cloche enfin.......à mon avis.

On peux pas demander l'intersection d'un nodal avec la ligne, vu que le nodal ne croise pas la ligne.

Je pensais passer par un chemin similaire au tien mais, mais.. le prob c'est que j'ai pas réussi à faire un double GetEntity, je m'explique :

1er GetEntity = Selection de la poly

on l'explose

second GetEntity mais automatique, l'utilisateur n'a pas à "bosser" (normalement ça va selectionner la ligne qui est la plus proche)

on demande le StartPoint et EndPoint de la ligne

Et le tour est joué :D

Mais malheureusement, soit je m'y prend mal ou cette solution ne marche pô :( .......second GetEntity="" apparemment

Je continu mes recherches :cool:

Nous n’ héritons pas de la terre de nos ancêtres.Nous l’empruntons à nos enfants.

Posté(e)

Bonjour.

 

Si si, j'insiste, le point crée une intersection avec la ligne.

Dans la mesure ou la sélection de la polyligne a été faite avec un accrochage actif "proche", le point est sur la polyligne.

 

nazemrap.

Posté(e)

Je suis vraiment désolé,

accrochage actif avec proche, mais ça m'insère qu'un nodal au point cliqué :(

Nous n’ héritons pas de la terre de nos ancêtres.Nous l’empruntons à nos enfants.

Posté(e)

Oups ! Désolé, j'avais mal compris le

accrochage actif "proche"
.

Effectivement ça marche. Bon ben vu que t'as fais le plus gros du taf (pour pas dire tout), vais quand même tenter de faire en sorte qu'on ait pas à déclenché le " proche" ;)

En tout cas merci, mais je comprends toujours pas comment on peut trouver une intersection dans un cas comme celui-là :casstet:

Nous n’ héritons pas de la terre de nos ancêtres.Nous l’empruntons à nos enfants.

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é