Aller au contenu

Effacer lignes suivant leur longueur


Messages recommandés

Posté(e)

Je viens juste de me créer une petite routine pour supprimer des lignes ou polylignes optimisées à 2 sommets d'une longueur donnée.

 

Pour mon besoin, elle a bien fonctionnée, mais c'est possible qu'elle ait encore besoin d'ajustement.

 

Voilà si quelqu'un à besoin de ce genre de truc

 

(defun c:del_line_by_dist ( / dis_ref js nb_ent n key ent dxf_ent lst dxf_10 dxf_11 dis_ent)
(initget 69)
(setq dis_ref (getdist "\nSaisir la distance de référence des lignes à supprimer: "))
(initget "Tout Selection _All Select")
(if (eq (getkword "\nAppliquer à [Tout/Selection] < Tout > : ") "Select")
	(setq js (ssget '((0 . "LINE,LWPOLYLINE"))))
	(setq js (ssget "_X" '((0 . "LINE,LWPOLYLINE"))))
)
(cond
	(js
		(setq nb_ent 0  n -1)
		(initget "< <= = > = > ")
		(setq key (getkword "\nChoix du test à appliquer '<' '<=' '=' '> =' '> '? défaut '<=': "))
		(if (not key) (setq key "<="))
		(repeat (sslength js)
			(setq
				ent (ssname js (setq n (1+ n)))
				dxf_ent (entget ent)
			)
			(cond
				((eq (cdr (assoc 0 dxf_ent)) "LINE")
					(setq
						dxf_10 (cdr (assoc 10 dxf_ent))
						dxf_11 (cdr (assoc 11 dxf_ent))
					)
				)
				((and
					(eq (cdr (assoc 0 dxf_ent)) "LWPOLYLINE")
					(eq (cdr (assoc 90 dxf_ent)) 2)
				 )
					(setq
						lst (mapcar '(lambda (x) (trans x ent 1)) (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 10)) dxf_ent)))
						dxf_10 (car lst)
						dxf_11 (cadr lst)
					)
				)
				(T (setq dxf_10 nil dxf_11 nil))
			)
			(if (and dxf_10 dxf_11)
				(progn
					(setq dis_ent (distance (list (car dxf_10) (cadr dxf_10)) (list (car dxf_11) (cadr dxf_11))))
					(if ((eval (read key)) dis_ent dis_ref)
						(progn
							(entdel ent)
							(setq nb_ent (1+ nb_ent))
						)
					)
				)
			)
		)
	)
	(T (princ "\nAucune ligne trouvée!"))
)
(print nb_ent) (princ " Ligne(s) ont été effacées!.")
(prin1)
)

 

Pour que le code fonctionne ENLEVER l'espace après tous les symboles >

 

[Edité le 13/4/2006 par bonuscad]

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

Posté(e)

Bonjour,

 

Je viens de mettre en pratique ton lisp, qui tombe à pic, mais le pb est qu'il me supprime également toutes les lignes et polylignes dont la longueur est inférieure à celle sélectionnée...!! Est-ce normal.. :exclam: :exclam: ??

Si c'est normal ce n'est pas grave car ce peut être également utile...... ;)

Par contre peut-on avoir le même programme qui, lui, ne supprimerai les lignes et polylignes d'une longueur définie. ;) ;) ;)

 

Amicalement,

 

Sylvain

Posté(e)

La ligne originale:

(if (<= dis_ent dis_ref)

; si la distance de l'entité est inférieur ou égal à la distance de référence

 

Tu peux changer le test de condition en plusieurs possibilité

(= dis_ent dis_ref) ; a priori ce qui t'interesse

ou

(< dis_ent dis_ref)

etc...

 

On peut même envisager aussi l'ajout d'une option comme ceci:

(initget 1 "> >= < <= =")
(setq key (getkword "\nChoix du test à appliquer [>/>=/< / < =/=]: "))
(if ((eval (read key)) dis_ent dis_ref)

 

ATTENTION aux espace que j'ai du rajouter pour un affichage correct de " < "

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

Posté(e)

OK merci, ;)

Pour modifier la ligne originale pas de pb je peux faire j'ai vu où ça se passait, par contre mes connaissances en Lisp étant nulles, j'ose te demander où faut-il insérer tes options. Faut-il supprimer des lignes ??? enfin tu vois quoi ...!!!

 

merci

Posté(e)

J'ai modifié le post original

 

Pour les espaces à supprimer essayez de le faire comme il faut, là je ne peux pas vous aider :(

 

C'est l'inconvénient de l'interprétation des signes < et > par le forum.

 

Tatonnez si ça ne fonctionne pas du 1er coup. ;)

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

Posté(e)

Curiosité quand tu nous tiens...

Juste pour savoir quel utilité que vous trouvez dans cet outil... peut être que je n'y ai jamais pensé...

 

merci

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Dans mon cas, j'ai importé un DXF d'un logiciel tiers.

 

Celui ci m'a produit plein de petite marques de repérage verticale sous forme de polyligne optimisée (toutes de même longueur, et il y en avait beaucoup) dont je n'avais aucune utilité.

 

Au lieu de passer beucoup de temps à les efffacer manuellement (Filtre ne propose pas ce genre de chose), j'ai pu faire ça en quelque secondes (pas le programme ;) )

 

En fait ceci est utile pour des dessins générés en automatique et importé par la suite dans Autocad. Mais il peut y avoir d'autres raisons, que je n'ai pas en tête

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

Posté(e)

C'est pas les accords (musicaux) de Yalta, mais ravi de t'avoir rendu heureux. ;)

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

  • 2 semaines après...
Posté(e)

Au lieu de passer beucoup de temps à les efffacer manuellement (Filtre ne propose pas ce genre de chose)

 

Bonjour,

La sélection rapide permet de sélectionner des lignes ou lwpolylignes suivant leur longueur (au moins avec la 2006)

menu Outils >

Sélection rapide >

type d'objet : Ligne >

Propriétés : Longueur >

modifier l'opérateur et la valeur comme désirés.

 

une autre manière pour calculer une distance en vlisp et qui fonctionne aussi bien avec des lignes que des lwpolylignes.:

 

(setq valeurTest (getdist "\nDistance de référence: "))
(if (setq ss (ssget "x" (list (cons 0 "line,lwpolyline"))))
 (progn
   (setq i 0)
   (while (setq ename (ssname ss (setq i (1+ i))))
     (setq objname (vlax-ename->vla-object ename))
     (if (< (vlax-curve-getdistatparam
              objname
              (vlax-curve-getendparam objname)
            )
            valeurTest
         )
       (entdel ename)
     )
   )
 )
)

 

Bruno Toniutti

 

[Edité le 24/4/2006 par BTO]

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é