Aller au contenu

Polyligne vers multiligne


Invité Sylvainhinard

Messages recommandés

Invité Sylvainhinard
Posté(e)

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...

Posté(e)

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)

Bonjour Bonus Cad,

 

Merci beaucoup pour ta routine, elle fonctionne à merveille sous Autocad 2005. Ya pu ka bosser maintenant... ;)

Posté(e)

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

Posté(e)

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

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é