Invité Sylvainhinard Posté(e) le 27 mai 2005 Posté(e) le 27 mai 2005 Bonjour, Quelqu'un connait t-il une astuce qui permet de transformer une polyligne en multiligne. Sachant que cette polyligne n'est composé que de segment droit. Merci d'avance...
bonuscad Posté(e) le 27 mai 2005 Posté(e) le 27 mai 2005 Salut, Cela devrait fonctionner sous 2005.... pas tester. Cette fois j'ai pensé à mettre des espace après le "<" dans le filtre de (ssget) PENSER à les enlever après le copier-coller pour que cela fonctionne. (defun c:po2ml ( / jspl nbr ent dxf_ent typent name_layer closed lst l_bub e_next dxf_next oldlayer oldosm key_mod scale_ml) (princ "\nChoix des polylignes à transformer en multilignes: ") (setq jspl (ssget '((-4 . "< OR") (-4 . "< AND") (0 . "POLYLINE") (-4 . "< NOT") (-4 . "&") (70 . 112) (-4 . "NOT>") (-4 . "AND>") (-4 . "< AND") (0 . "LWPOLYLINE") (-4 . "AND>") (-4 . "OR>")) ) nbr 0 ) (cond (jspl (initget "Dessus Nulle dEssous _Top Zero Bottom") (setq key_mod (getkword (strcat "\nEntrez le type de justification [Dessus/Nulle/dEssous] <" (cond ((eq (getvar "cmljust") 0) "Dessus" ) ((eq (getvar "cmljust") 1) "Nulle" ) ((eq (getvar "cmljust") 2) "dEssous" ) ) ">: " ) ) ) (if key_mod (cond ((eq key_mod "Top") (setvar "cmljust" 0)) ((eq key_mod "Zero") (setvar "cmljust" 1)) ((eq key_mod "Bottom") (setvar "cmljust" 2)) ) ) (setq scale_ml (getdist (strcat "\nEntrez l'échelle de la multiligne <" (rtos (getvar "cmlscale")) ">: "))) (if scale_ml (setvar "cmlscale" scale_ml)) (setq oldlayer (getvar "clayer") oldosm (getvar "osmode")) (setvar "osmode" 0) (setvar "cmdecho" 0) (repeat (sslength jspl) (setq typent (cdr (assoc 0 (setq dxf_ent (entget (setq ent (ssname jspl nbr)))))) name_layer (cdr (assoc 8 dxf_ent)) ) (cond ((eq typent "LWPOLYLINE") (setq closed (boole 1 (cdr (assoc 70 dxf_ent)) 1) lst (mapcar '(lambda (x) (trans x ent 1)) (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 10)) dxf_ent))) l_bub (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 42)) dxf_ent)) ) ) ((eq typent "POLYLINE") (setq closed (boole 1 (cdr (assoc 70 dxf_ent)) 1) e_next (entnext ent) ) (while (= "VERTEX" (cdr (assoc 0 (setq dxf_next (entget e_next))))) (if (zerop (boole 1 223 (cdr (assoc 70 dxf_next)))) (setq lst (cons (trans (cdr (assoc 10 dxf_next)) ent 1) lst) l_bub (cons (cdr (assoc 42 dxf_next)) l_bub) ) ) (setq e_next (entnext e_next)) ) (setq lst (reverse lst) l_bub (reverse l_bub) ) ) ) (cond ((and lst (apply 'and (mapcar 'zerop l_bub))) (setvar "clayer" name_layer) (command "_.mline") (foreach n lst (command n)) (if (not (zerop closed)) (command "_close") (command "")) (entdel ent) ) (T (princ "\nLes polylignes comportant des arrondis n'ont pas été traitées!")) ) (setq nbr (1+ nbr) lst nil l_bub nil) ) (setvar "clayer" oldlayer) (setvar "osmode" oldosm) (setvar "cmdecho" 1) ) (T (princ "\nSélection vide")) ) (prin1) ) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Invité Sylvainhinard Posté(e) le 30 mai 2005 Posté(e) le 30 mai 2005 Bonjour Bonus Cad, Merci beaucoup pour ta routine, elle fonctionne à merveille sous Autocad 2005. Ya pu ka bosser maintenant... ;)
Patrick_35 Posté(e) le 30 mai 2005 Posté(e) le 30 mai 2005 Salut BonusPour simplifier tes filtres ;)(ssget "X" (list (cons 0 "*POLYLINE,LWPOLINE") (cons -4 "!=") (cons 70 112))) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
bonuscad Posté(e) le 30 mai 2005 Posté(e) le 30 mai 2005 Salut Patrick35, Merci pour ton bon conseil, mais je vais retenir que la moitié de la solution (groupe 0)Le reste de me convient pas car il n'écarte pas les polylignes maillées, donc je garde le NOT.Je n'ai pas trouver un groupe -4 qui ferait cela d'un seul coup :casstet: Mais déjà il est vrai que cela fait un filtre plus court. A+ Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Patrick_35 Posté(e) le 30 mai 2005 Posté(e) le 30 mai 2005 Je t'ai inclus un not code 70 au bit 112 ? @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
bonuscad Posté(e) le 30 mai 2005 Posté(e) le 30 mai 2005 Ben écoute, j'ai fais l'essai avec ton code(ssget (list (cons 0 "*POLYLINE,LWPOLINE") (cons -4 "!=") (cons 70 112))) et l'ancien modifié avec tes remarques(ssget '((0 . "*POLYLINE,LWPOLINE") (-4 . "< NOT") (-4 . "&") (70 . 112) (-4 . "NOT>"))) Je n'obtiens pas le même jeu de sélection, dans le second les maillages sont écartés Mais déja le filtre est nettement plus court ;) C'est déjà pas mal NB: j'ai mis un espace après le "<" pour éviter une disparition partielle du filtre. Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Patrick_35 Posté(e) le 30 mai 2005 Posté(e) le 30 mai 2005 Ah oui, j'ai oublié le & qui normalement doit te donner la même chose(ssget (list (cons 0 "*POLYLINE,LWPOLINE") (cons -4 "&!=") (cons 70 112))) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant