Aller au contenu

Tentative de pondérer/moyenner 2 polylignes


bonuscad

Messages recommandés

Bonjour,

Ici j'ai essayé en partant de deux polylignes distinctes mais proches de réduire les écarts.Si vous avez par exemple 2 polylignes provenant de 2 sources distinctes et censées représenter la même chose (cheminement ou contour) mais la superposition révèle qu'elles sont différentes, laquelle choisir?Compenser les écarts, cela est généralement fastidieux et long en cas de nombreux sommets!

Ce qui suit ne traite que polylignes légères, (les arcs ne seront pas restitués)Donc les polylignes seront de préférence sans arcs, elles pourront avoir un nombre différent de sommets entre elles et; soit avoir un écart variable entre elles, soit se couper plusieurs fois entre elles. (façon tresse)

Que fait en gros la routine?:Elle cherche d’abord à savoir si elles se coupent, si c'est le cas elle crée des sommets à ces point d'intersection. (cela obligera les futures polylignes à passer par ces points)

Ensuite à chaque sommets de chaque polyligne elle cherche le sommet le plus proche de la polyligne opposée et prendra le milieu entre ces deux sommets pour générer une nouvelle polyligne.

Au final 2 polylignes seront générées en ayant réduit les écarts. suivant le résultat obtenu, vous n'en gardez qu'une seule, ou vous avez encore la possibilité de renouveler la même opération entre ces 2 polylignes nouvellement générées, cela autant de fois que vous jugerez nécessaire pour réduire l'écart, mais au final il faudra toujours en choisir une à conserver.

Le code proposé est encore embryonnaire, mais après quelques tests ça à l'air de fonctionner. Pour par exemple des polylignes d'environ 1000 sommets, j'ai un temps de calcul d'environ 3 sec avant de générer les nouvelles polylignes.Au final les polylignes sources sont griper, soit vous les effacez ou changez ses propriétées dans la palette, soit "Echap" pour ne rien faire et les conserver.

(vl-load-com)
(defun add_vtx (obj add_pt ent_name / bulg)
 (vla-addVertex
obj
(1+ (fix add_pt))
(vlax-make-variant
 	(vlax-safearray-fill
   	(vlax-make-safearray vlax-vbdouble (cons 0 1))
     	(list
       	(car (trans (vlax-curve-getpointatparam obj add_pt) 0 ent_name))
       	(cadr (trans (vlax-curve-getpointatparam obj add_pt) 0 ent_name))
     	)
 	)
)
 )
 (setq bulg (vla-GetBulge obj (fix add_pt)))
 (vla-SetBulge obj
(fix add_pt)
(/
 	(sin (/ (* 4 (atan bulg) (- add_pt (fix add_pt))) 4))
 	(cos (/ (* 4 (atan bulg) (- add_pt (fix add_pt))) 4))
)
 )
 (vla-SetBulge obj
(1+ (fix add_pt))
(/
 	(sin (/ (* 4 (atan bulg) (- (1+ (fix add_pt)) add_pt)) 4))
 	(cos (/ (* 4 (atan bulg) (- (1+ (fix add_pt)) add_pt)) 4))
)
 )
 (vla-update obj)
)
(defun c:vertex_median ( / fst_ob snd_obj vrt_pt pt lst_pt fst_dxf snd_dxf lst1 lst2 lstx ptx)
 (princ "\nSélectionner la 1ère polyligne: ")
 (while (not (setq fst_obj (ssget "_+.:E:S" '((0 . "LWPOLYLINE"))))))
 (princ "\nSélectionner la 2ème polyligne: ")
 (while (not (setq snd_obj (ssget "_+.:E:S" '((0 . "LWPOLYLINE"))))))
 (setq
fst_obj (ssname fst_obj 0)
snd_obj (ssname snd_obj 0)
vrt_pt (vlax-variant-value (vla-IntersectWith (vlax-ename->vla-object fst_obj) (vlax-ename->vla-object snd_obj) 0))
 )
 (if (>= (vlax-safearray-get-u-bound vrt_pt 1) 0)
(progn
 	(setq pt (vlax-safearray->list vrt_pt))
 	(if pt
   	(if (> (length pt) 3)
     	(repeat (/ (length pt) 3)
       	(setq lst_pt (cons (list (car pt) (cadr pt) (caddr pt)) lst_pt) pt (cdddr pt))
     	)
     	(setq lst_pt (cons pt lst_pt))
   	)
 	)
)
 )
 (setq
fst_dxf (entget fst_obj)
snd_dxf (entget snd_obj)
lst1 (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 10)) fst_dxf))
lst2 (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 10)) snd_dxf))
lstx nil
 )
 (if (and lst_pt (listp lst_pt))
(progn
 	(setq obj (vlax-ename->vla-object fst_obj))
 	(foreach el lst_pt
   	(if (not (member T (mapcar '(lambda (x) (equal (list (car el) (cadr el)) x 1E-8)) lst1)))
     	(add_vtx obj (vlax-curve-getparamatpoint obj (vlax-curve-getClosestPointTo obj el)) fst_obj)
   	)
 	)
 	(setq obj (vlax-ename->vla-object snd_obj))
 	(foreach el lst_pt
   	(if (not (member T (mapcar '(lambda (x) (equal (list (car el) (cadr el)) x 1E-8)) lst2)))
     	(add_vtx obj (vlax-curve-getparamatpoint obj (vlax-curve-getClosestPointTo obj el)) snd_obj)
   	)
 	)
)
 )
 (setq
fst_dxf (entget fst_obj)
snd_dxf (entget snd_obj)
lst1 (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 10)) fst_dxf))
lst2 (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 10)) snd_dxf))
lstx nil
 )
 (foreach n lst1
(setq pt (nth (vl-position (apply 'min (setq lst_d (mapcar '(lambda (x) (distance n x)) lst2))) lst_d) lst2))
(setq ptx (list (* 0.5 (+ (car n) (car pt))) (* 0.5 (+ (cadr n) (cadr pt)))))
(setq lstx (cons ptx lstx))
 )
 (entmake
(append
 	(list
   	(cons 0 "LWPOLYLINE")
   	(cons 100 "AcDbEntity")
   	(assoc 67 fst_dxf)
   	(assoc 410 fst_dxf)
   	(assoc 8 fst_dxf)
   	(if (assoc 62 fst_dxf) (assoc 62 fst_dxf) (cons 62 256))
   	(if (assoc 6 fst_dxf) (assoc 6 fst_dxf) (cons 6 "BYLAYER"))
   	(if (assoc 370 fst_dxf) (assoc 370 fst_dxf) (cons 370 -1))
   	(cons 100 "AcDbPolyline")
   	(cons 90 (length lstx))
   	(assoc 70 fst_dxf)
   	(if (assoc 38 fst_dxf)
     	(assoc 38 fst_dxf)
     	(cons 38 0.0)
   	)
   	(if (assoc 39 fst_dxf)
     	(assoc 39 fst_dxf)
     	(cons 39 0.0)
   	)
 	)
 	(apply 'append
   	(mapcar
     	'(lambda (x10)
       	(list
         	(cons 10 x10)
         	'(40 . 0.0)
         	'(41 . 0.0)
         	'(42 . 0.0)
         	'(91 . 0)
       	)
     	)
     	lstx
   	)
 	)
 	(list (assoc 210 fst_dxf))
)
 )
 (setq lstx nil)
 (foreach n lst2
(setq pt (nth (vl-position (apply 'min (setq lst_d (mapcar '(lambda (x) (distance n x)) lst1))) lst_d) lst1))
(setq ptx (list (* 0.5 (+ (car n) (car pt))) (* 0.5 (+ (cadr n) (cadr pt)))))
(setq lstx (cons ptx lstx))
 )
 (entmake
(append
 	(list
   	(cons 0 "LWPOLYLINE")
   	(cons 100 "AcDbEntity")
   	(assoc 67 snd_dxf)
   	(assoc 410 snd_dxf)
   	(assoc 8 snd_dxf)
   	(if (assoc 62 snd_dxf) (assoc 62 snd_dxf) (cons 62 256))
   	(if (assoc 6 snd_dxf) (assoc 6 snd_dxf) (cons 6 "BYLAYER"))
   	(if (assoc 370 snd_dxf) (assoc 370 snd_dxf) (cons 370 -1))
   	(cons 100 "AcDbPolyline")
   	(cons 90 (length lstx))
   	(assoc 70 snd_dxf)
   	(if (assoc 38 snd_dxf)
     	(assoc 38 snd_dxf)
     	(cons 38 0.0)
   	)
   	(if (assoc 39 snd_dxf)
     	(assoc 39 snd_dxf)
     	(cons 39 0.0)
   	)
 	)
 	(apply 'append
   	(mapcar
     	'(lambda (x10)
       	(list
         	(cons 10 x10)
         	'(40 . 0.0)
         	'(41 . 0.0)
         	'(42 . 0.0)
         	'(91 . 0)
       	)
     	)
     	lstx
   	)
 	)
 	(list (assoc 210 snd_dxf))
)
 )
 (sssetfirst nil (ssadd snd_obj (ssadd fst_obj (ssadd))))
 (prin1)
)

 

 

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

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é