Aller au contenu

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


fabcad
 Partager

Messages recommandés

 

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

Lien vers le commentaire
Partager sur d’autres sites

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]

Lien vers le commentaire
Partager sur d’autres sites

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+

Lien vers le commentaire
Partager sur d’autres sites

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 -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

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 -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

  • 4 ans après...

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.

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.

Chargement
 Partager

×
×
  • Créer...