bonuscad Posté(e) le 12 avril 2006 Posté(e) le 12 avril 2006 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
yalta Posté(e) le 13 avril 2006 Posté(e) le 13 avril 2006 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
bonuscad Posté(e) le 13 avril 2006 Auteur Posté(e) le 13 avril 2006 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'interesseou(< 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
yalta Posté(e) le 13 avril 2006 Posté(e) le 13 avril 2006 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
bonuscad Posté(e) le 13 avril 2006 Auteur Posté(e) le 13 avril 2006 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
Bred Posté(e) le 13 avril 2006 Posté(e) le 13 avril 2006 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...
bonuscad Posté(e) le 13 avril 2006 Auteur Posté(e) le 13 avril 2006 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
yalta Posté(e) le 13 avril 2006 Posté(e) le 13 avril 2006 :) :) .....une fois les espaces enlevés ça roule j'ai essayé :) :) Merci encore c'est super, Sylvain
yalta Posté(e) le 13 avril 2006 Posté(e) le 13 avril 2006 ...il en faut peu pour être heureux ....peu pour être heureux.....la la la..!!! :P :P :P
bonuscad Posté(e) le 13 avril 2006 Auteur Posté(e) le 13 avril 2006 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
BTO Posté(e) le 24 avril 2006 Posté(e) le 24 avril 2006 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]
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