Aller au contenu

Récupérer le nombre de polyligne qui passe sur une autre polyligne


AzRoDoRzA

Messages recommandés

Hello,

 

Petite question, est-ce que c'est possible de récupérer le nombre de polyligne situé sur une polyligne avec une plus grosse épaisseur ? Exemple: Multiple polyligne

 

J'aimerai récupérer le chiffre "3" car il y a 3 polylignes qui passent sur la polyligne orange.

 

Merci bye!

 

Salut,

 

comment cela récupérer "3" ? Avec un lisp ? En valeur ? En... je sais pas ! Quel est le but final ? blink.gif

COME

 

La vie sans musique est tout simplement une erreur, une fatigue, un exil. »

Friedrich Nietzsche

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Tu peux facilement obtenir la liste des points de ta polyligne avec ceci

 

;Retourne la liste des points 2d (coordonnées SCO) des sommets de la polyligne sélectionnée. 
(defun massoc (key alst)
 (if (setq alst (member (assoc key alst) alst))
   (cons (cdar alst) (massoc key (cdr alst)))
 )
)

 

puis l'utiliser comme ceci

 

(- (sslength (ssget "_F" (massoc 10 (entget (car (entsel "\n Sélectionnez une polyligne: ")))))) 1)

Lien vers le commentaire
Partager sur d’autres sites

Salut Fraid,

 

J'avais pensé à cet idée, mais le problème c'est que même si ma polyligne est énorme, elle n'a que 2 sommet au centre des extrémité de celle-ci et donc avec ton programme, il me retourne 1 car il n'y a qu'une polyligne qui passe par ses sommets, il faudrait trouver un moyen de pouvoir lui dire "ce sommet la et ses alentours", exemple:

 

Le sommet de ma polyligne est (25.8524 82.6763) et mon autre polyligne à son sommet en (25.7399 82.461), est-ce que c'est possible de comparer ces valeurs avec un arrondi fournis ? Du style à 0.2 près ?

Lien vers le commentaire
Partager sur d’autres sites

Comme le montre la photo, mes polylignes ne se superposent pas (elle superposent uniquement la polyligne orange mais elle ne la "croise" pas car elle est juste plus épaisse et l'épaisseur n'est que graphique). Du coup oui j'aimerai donc sélectionner des polylignes très proches, la solution de sélection rectangulaire n'est pas bête, je vais tester ça merci!

Lien vers le commentaire
Partager sur d’autres sites

Comme le montre la photo

je n'avais pas vu ton image ....

 

en effet j’étais à coté

 

je te propose cette petite fonction

 

;nbpolep : Renvois le nombre de polylignes passant sur la largeur de la polyligne sélectionnée, nil si échoue.
(defun nbpolep ( / oldosmode pol pt pt1 pt2 ep in nb)
   (setq   oldosmode (getvar 'osmode)
    pol (entget (car (entsel "\n Sélectionnez une polyligne: ")))
           pt (cdr (assoc 10 pol));premier point
           ep (cdr (assoc 43 pol));largeur
   )
   (setvar 'osmode 0)
   (if (> ep 0)
       (setq   in (+ (/ ep 2) (/ ep 100));incrément légèrement supérieur à la moitié de la largeur
               pt1 (mapcar '(lambda (x) (- x in)) pt)
               pt2 (mapcar '(lambda (x) (+ x in)) pt)
               nb (- (sslength (ssget "_C" pt1 pt2 )) 1)
       )
   (princ "\nLa polyligne doit avoir une largeur")
   )
   (setvar 'osmode oldosmode)
   nb
)

Lien vers le commentaire
Partager sur d’autres sites

Bon bah voila le code qui permet d'obtenir le nombre de polyligne situé sur une polyligne (en largeur):

 

;nbpolep : Renvois le nombre de polylignes passant sur la largeur de la polyligne sélectionnée, nil si échoue.
(defun nbpolep ( / oldosmode pol pt pt1 pt2 ep in nb)
   (setq   oldosmode (getvar 'osmode)
           pol (entget (car (entsel "\n Sélectionnez une polyligne: ")))
           pt (cdr (assoc 10 pol));premier point
           ep (cdr (assoc 43 pol));largeur
   )
   (setvar 'osmode 0)
   (if (> ep 0)
       (setq   in (+ (/ ep 2) (/ ep 100));incrément légèrement supérieur à la moitié de la largeur
               pt1 (mapcar '(lambda (x) (- x in)) pt)
               pt2 (mapcar '(lambda (x) (+ x in)) pt)
               listPoly (ssget "_C" pt1 pt2 )
       )
   (princ "\nLa polyligne doit avoir une largeur")
   )
   (setq i 0)
   (setq nb 0)
   (while(< i (sslength listPoly))
       (setq isPoly (entget(ssname listPoly i)))
       (if(= (cdr (nth 1 isPoly)) "LWPOLYLINE")
           (setq nb (+ nb 1))
           (prin1 "Pas une polyligne")
       )
       (setq i (+ i 1))
   )
   (setq nb (- nb 1))
   (setvar 'osmode oldosmode)
   nb
)

 

Désolé pour la propreté je débute en Lisp :rolleyes:

Lien vers le commentaire
Partager sur d’autres sites

Désolé pour la propreté je débute en Lisp

 

il ne faut pas, nous sommes tous des débutant, depuis plus ou moins longtemps...

 

tu fait des efforts, et c'est cela qui compte.

 

sans vouloir te décourager, il y avais juste à rajouter un filtre au ssget comme cela

 

nb (- (sslength (ssget "_C" pt1 pt2 '((0 . "LWPOLYLINE")))) 1)

 

et bravo

Lien vers le commentaire
Partager sur d’autres sites

Non non pas de problème je suis là pour apprendre!

 

Justement, j'avais vu que je pouvais le faire avec ça mais j'ai essayé mais ça me mettait "nombre d'arguments trop importants" quand je rajoutait ce petit bout de code et donc j'ai cherché une autre solution.

 

Et là je viens de retester et ça fonctionne, c'est à n'y rien comprendre, peut-être que j'avais oublié la double parenthèse :huh:

 

Merci en tout cas!

Lien vers le commentaire
Partager sur d’autres sites

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • 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é