Aller au contenu

Correspondre les sommets d\'une polyligne ou plusieurs polylignes cible d\'après une autre polyligne


Messages recommandés

Posté(e)

 

Je réitère mon souhait de faire correspondre les sommets d'une polyligne ou plusieurs polylignes cible d'après une autre polyligne source en ajoutant les sommets manquants ou en supprimant les sommets en trop.

 

J'ajoute que mon travail se situe dans le domaine du SIG et donc il n'y a pas de segments arcs dans mes polylignes.

 

Mon algorithme serait le suivant :

1 Sélectionnez une ou plusieurs polylignes cible :

2 Sélectionnez une polyligne source :

 

Traitement sur chaque polyligne source, soit par la fonction pedit ou alors directement en modifiant les sommets par SUBST et ASSOC.

 

 

3 Continuer les points manquants : oui/non :

 

4 Supprimer les points manquants : oui/non :

 

 

Merci pour vos développements,

 

A plus

Posté(e)

hello,

 

je n'ai pas de réponse plus satisfaisante à te faire

que lors de ton message initial.

 

Ta polyligne Source, qu'est ce qu'elle a de spécial ?

Ta polyligne Cible, que doit elle "piquer" à la Source ?

 

je cherche à comprendre..

 

ps: j'ai répondu comme (Gile) mais je l'avais pas envoyé (hihihi)

 

amicalement

 

 

[Edité le 16/1/2008 par didier]

Posté(e)

ah la la,

 

Modifier les coordonnées xy des sommets de polylignes d'après les coordonnées xy d'une polyligne source.

 

Cas d'ajout de sommets :

polyligne source --> polylignes cibles

PT1 = PT1

PT2 = PT2

PT3 = PT3

PT4 = PT4

PT5 = PT5

PT6 = PT6

PT7 = PT7

PT8 = PT8

PT9 = PT9

PT10 = PT10

PT11 = ajout point

PT12 = ajout point

PT13 = ajout point

PT14 = ajout point

PT15 = ajout point

PT16 = ajout point

 

Cas de suppression de sommets de sommets :

polyligne source --> polylignes cibles

PT1 = PT1

PT2 = PT2

PT3 = PT3

PT4 = PT4

PT5 = PT5

PT6 = PT6

PT7 = PT7

PT8 = PT8

PT9 = PT9

PT10 = PT10

Pas de sommet = PT11 = suppression du point

Pas de sommet = PT12 = suppression du point

Pas de sommet = PT13 = suppression du point

Pas de sommet = PT14 = suppression du point

Pas de sommet = PT15 = suppression du point

Pas de sommet = PT16 = suppression du point

 

Sinon j'essayerai d'illustrer par une image.

 

A+

Posté(e)

Voilà un essai, ça correspond à ce qu'il me semble avoir compris

 

EDIT : corrigé un bug

 

(defun tempcross (pt / l)
 (setq l (/ (getvar "VIEWSIZE") 40.0))
 (grvecs
   (list
     (polar pt (* pi 1.25) l)
     (polar pt (* pi 0.25) l)
     (polar pt (* pi 0.75) l)
     (polar pt (* pi 1.75) l)
   )
 )
)

(defun c:correspline (/ ajouter supprimer source cible l1 l2 l3 vec nor)

 (defun ajouter ()
   (tempcross (trans (cdar l1) nor 1))
  (initget "Oui Non")
  (if (= "Non"
	 (getkword "\nAjouter le sommet [Oui/Non] ? [b]<[/b]Oui>: ")
      )
    (setq l1 (cdr l1))
    (progn
      (setq l3 (cons (cons 10 (mapcar '+ (cdar l1) vec)) l3)
	    l1 (cdr l1)
      )
      (entmod
	(append	(subst (cons 90 (+ (length l3) (length l2)))
		       (assoc 90 cible)
		       cible
		)
		(reverse l3)
		l2
	)
      )
    )
  )
  (redraw)
   )

 (defun supprimer ()
   (tempcross (trans (cdar l2) nor 1))
  (initget "Oui Non")
  (if (= "Non"
	 (getkword "\nSupprimer le sommet [Oui/Non] ? [b]<[/b]Oui>: ")
      )
    (setq l3 (cons (car l2) l3)
	  l2 (cdr l2)
    )
    (progn
      (setq l2 (cdr l2))
      (entmod
	(append	(subst (cons 90 (+ (length l3) (length l2)))
		       (assoc 90 cible)
		       cible
		)
		(reverse l3)
		l2
	)
      )
    )
  )
  (redraw)
   )
   
 (while
   (not
     (and
(setq source (car (entsel "\nSélectionnez la polyligne source: ")))
(setq source (entget source))
(= (cdr (assoc 0 source)) "LWPOLYLINE")
     )
   )
    (princ "Entité non valide.")
 )
 (while
   (not
     (and
(setq cible (car (entsel "\nSélectionnez la polyligne cible ")))
(setq cible (entget cible))
(= (cdr (assoc 0 cible)) "LWPOLYLINE")
     )
   )
    (princ "Entité non valide.")
 )
 (setq	l1    (vl-remove-if-not
	(function (lambda (x) (= (car x) 10)))
	source
      )
l2    (vl-remove-if-not
	(function (lambda (x) (= (car x) 10)))
	cible
      )
cible (vl-remove-if
	(function (lambda (x) (member (car x) '(10 40 41 42))))
	cible
      )
vec   (mapcar '- (cdar l2) (cdar l1))
nor   (cdr (assoc 210 cible))
 )
 (while (and l1 l2)
   (if	(equal (cdar l2) (mapcar '+ (cdar l1) vec))
     (setq l3 (cons (car l2) l3)
    l1 (cdr l1)
    l2 (cdr l2)
     )
     (if (or (member (cons 10 (mapcar '+ (cdar l1) vec)) l2)
      (null (cdr l2))
      )
(supprimer)
(ajouter)
     )
   )
 )
 (and l1 (while l1 (ajouter)))
 (and l2 (while l2 (supprimer)))
 (princ)
) 

[Edité le 16/1/2008 par (gile)]

[Edité le 17/1/2008 par (gile)]

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

Posté(e)

Bravo Gile c'est exactement ce que je souhaitais.

 

Je pense que tu pourras l'ajouter à ta liste de fonctions.

 

Merci encore, je vais pouvoir faire mes filaires de voies plus facilement.

 

Fabrice

 

Posté(e)

Salut,

 

Je suis content que ça corresponde à ce que tu voulais, même si je n'ai aucune idée de l'utilité de ce code, c'était un exercice plaisant.

 

PS : J'ai edité le code, les options par défaut ("Oui") pour supprimer ou ajouter avaient disparu.

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

  • 4 ans après...
Posté(e)

Bonjour,

 

J'utilise beaucoup cette fonction, et je me demandais si on pouvait éviter les Oui ou Non en ajoutant une option "Identique à l'original".

 

Afin d'éviter de rentrer oui ou non.

 

C'est peut-être complexe.

 

Bonne journée,

 

Cordialement,

 

Fabcad le sigiste

post-80-0-06448900-1332423117_thumb.jpg

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é