Aller au contenu

Selection d\'objets proches


Messages recommandés

Posté(e)

Bonjour,

 

je me tourne à nouveaux vers vous car j'essaye de développer une routine qui permette de selectionner des objets proches d'un objet initial.

 

Comme un schéma vaut mieux qu'un long discours, je mets une image du principe que je souhaite : on sélectionne le 1er carré en haut à gauche, et grâce au script Autocad selectionne les 9 carrés suivants :

 

http://imagik.fr/thumb/121990.jpeg

 

Je sais pas si une routine de ce type existe déjà?

Voilà j'espère que vous pourrez m'aider ou m'orienter.

 

Merci d'avance.[Edité le 10/9/2009 par fabbcad]

 

Edit : taille de l'image, j'arrive pas à la mettre en grand... Voici le lien direct : http://imagik.fr/view/121990

 

[Edité le 10/9/2009 par fabbcad]

Posté(e)

Merci à vous deux pour vos réponses. Pour la taille de l'image je galère un peu... J'ai mis le lien direct si jamais.

 

Pour la routine que tu me montres, sur le principe c'est assez proche de ce que je veux faire, le gros souci étant que ce n'est pas du vba... ça me gêne juste du fait que je ne connaît rien au lisp alors que je m'y connaît en VBA, donc je ne sais pas modifier cette routine pour mes besoins.

 

Mes objets sont des polylignes fermées et non des blocks, ça n'a pas l'air de marcher pour les polylignes...

Si au pire vous pouvez me dire comment lui dire de travailler sur une polyligne je pourrais voir ce que ça donne.

Et au fait il faut que les objets qu'il selectionne appartiennent au même calque que l'objet initial bien sûr...

 

Voilà j'espère que vous pourrez m'éclairer. ;)

Posté(e)

 

Hello Fabrice

 

J'ai l'impression que tu recherches tes objets (Polylignes dans ton cas) par Propagtion ?

Oui / Non ?

 

Ce n'est pas la meme chose que rechercher dans un Rayon R !

 

Le Decapode

 

Autodesk Expert Elite Team

Posté(e)

Hum... Qu'entends tu par progapation?

 

Je vais essayer de dire diffèrement :

 

Je souhaiterai selectionner un objet (polyligne rectangulaire) et en lançant ma routine qu'autocad me selectionne le voisin de droite, puis à partir de ce voisin à nouveau celui de droite, etc jusqu'à avoir 10 objets (ou moins s'il n'y en a que 8 par ex) dans la selection.

 

Il peut chercher par rayon mais effectivement il faut qu'il comprenne que c'est celui de droite qui m'intéresse.

 

Je sais pas si ça t'avance ou si je me suis embrouillé dans mon explication... ;)

Posté(e)

Est ce que vous pourriez me dire ce que je dois changer dans ce script pour selectionner des polylignes et non un bloc? Comme ça j'essaye de voir ce qu je peux faire...

 

Merci d'avance.

Posté(e)

Bon a priori personne...

Ma question reste d'actualité mais j'en ai une autre qui s'en rapproche :

 

Est il possible de faire une selection par intersection d'entité? Comme sur l'exemple joint je veux selectionner les carrés qui intersectent ma droite :

 

http://imagik.fr/thumb/128013.jpeg

 

Comment peut on faire ça s'il vous plait?

merci d'avance.

Posté(e)

Merci pour ta réponse mais, mais avec cette option je doit faire mon trajet avec la souris, or je souhaiterai que la selection se fasse par rapport à une droite qui existe déjà (polyligne)...

 

Tu vois ce que je veux dire?

Posté(e)

Bonjour,

 

L'exemple de l'aide sur la fonction Select montre le principe. Si tu utilises l'option acSelectionSetCrossing, les objets sélectionnés sont ceux qui sont à l'intérieur ou qui traverse la zone définie par les 2 points que tu mets en paramètres de la fonction Select.

 

 
Sub Example_Select()
   ' This example adds members to a selection set, first by crossing and
   ' then by filtering for circles.
   
   ' Create the selection set
   Dim ssetObj As AcadSelectionSet
   Set ssetObj = ThisDrawing.SelectionSets.Add("SSET")
   
   
   ' Add all object to the selection set that lie within a crossing of (28,17,0) and
   ' (-3.3, -3.6,0) 
   Dim mode As Integer
   Dim corner1(0 To 2) As Double
   Dim corner2(0 To 2) As Double
   
   mode = acSelectionSetCrossing
   corner1(0) = 28: corner1(1) = 17: corner1(2) = 0
   corner2(0) = -3.3: corner2(1) = -3.6: corner2(2) = 0
   ssetObj.Select mode, corner1, corner2
   
   ' Add all the Circles to the selection set that lie within the crossing of (28,17,0) and
   ' (-3.3, -3.6,0) by filtering from the current drawing
   Dim gpCode(0) As Integer
   Dim dataValue(0) As Variant
   gpCode(0) = 0
   dataValue(0) = "Circle"
   
   Dim groupCode As Variant, dataCode As Variant
   groupCode = gpCode
   dataCode = dataValue
   
   ssetObj.Select mode, corner1, corner2, groupCode, dataCode
   
End Sub

_______________________________

R.A.

Développeur AutoCAD C#.net

www.danialu.fr

Posté(e)

Ah ok... Alors c'est un bon début, il faudrait rajouter un bout pour lui dire que les valeurs des deux points correspondent à celles de la droite que je selectionne et ça serait bon!

 

Est il possible de récupérer les coordonnées des extrêmités d'un droite selectionnée?

Posté(e)

Bon je bloque à nouveau... J'arrive pas à trouver la syntaxe pour lui dire de me retourner es coordonnées de l'objet selectionné. Je pensais à quelque chose comme ça mais ça bug...

Pouvez-vous m'aider?

 

 
Sub AfficheXY()

       Dim objSet  As AcadSelectionSet
       
   On Error Resume Next
   ThisDrawing.SelectionSets("ss1").Delete
   On Error GoTo 0
   Set objSet = ThisDrawing.SelectionSets.Add("ss1")
   objSet.SelectOnScreen
          
      StartPoint = objSet.AcadLine.StartPoint
      EndPoint = objSet.AcadLine.EndPoint
      
 MsgBox ("X = " & StartPoint)
 MsgBox ("Y = " & EndPoint)
       
   
   
End Sub

Posté(e)

Bonjour,

 

Si tu veux récupérer un seul objet, il vaut mieux utiliser "GetEntity" à la place de "SelectOnScreen".

 

"SelectOnScreen" te renvoie un jeu de sélection, si tu veux les coordonnées du 1er objet du jeu de sélection, l'instruction est :

 

 StartPoint = objSet.Item(0).StartPoint 

 

StartPoint est un tableau 3d et non une valeur, pour avoir X, il faut écrire:

 

 MsgBox ("X = " & StartPoint(0)) 

 

A+

_______________________________

R.A.

Développeur AutoCAD C#.net

www.danialu.fr

Posté(e)

Merci Romain, tes explications me font avancer à chaque fois!

 

J'ai finalisé le code mais y'a encore un petit hic... Je crois qu'il arrive à selectionner les objets, sauf que ce n'est pas "retranscrit" à l'écran! J'ai mis une msgbox pour vérifier ma sélection et il me dit qu'il y a des éléments selectionnés mais ils ne sont pas affiché à l'écran...

D'ailleurs dans la fenêtre propriété j'ai toujours "aucune selection"

Ai je oublié une étape?

 

 
Sub SelectionXY()

       Dim returnObj As AcadObject
       Dim basePnt As Variant
       Dim startPoint As Variant
       Dim endPoint As Variant
       
       ThisDrawing.Utility.GetEntity returnObj, basePnt
       returnObj.Update

      startPoint = returnObj.startPoint
      endPoint = returnObj.endPoint
      
   'MsgBox ("Xd = " & startPoint(0) & " Yd = " & startPoint(1))
   'MsgBox ("Xa = " & endPoint(0) & " Ya = " & startPoint(1))
   
       Dim MaSelection As AcadSelectionSet
       Dim Pt1(0 To 2) As Double
       Dim Pt2(0 To 2) As Double
       
           Pt1(0) = startPoint(0)
           Pt1(1) = startPoint(1)
           Pt1(2) = 0
           Pt2(0) = endPoint(0)
           Pt2(1) = endPoint(1)
           Pt2(2) = 0
           
           ThisDrawing.SelectionSets("ss1").Delete
           Set MaSelection = ThisDrawing.SelectionSets.Add("ss1")
           MaSelection.Select acSelectionSetCrossing, Pt1, Pt2
                       
       MsgBox MaSelection.Count
       
End Sub

Posté(e)

Mince j'ai parlé trop vite...

 

J'ai essayé de remplacer la selection de la ligne par des valeurs lorsque mes données sont en lambert (ex x = 180 000 et y = 600 000), et alors le programme me selectionne tout!!

 

Faut il changer la déclaration de certaines variables à ce moment là?

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é