Bred Posté(e) le 6 juillet 2006 Posté(e) le 6 juillet 2006 Bonjour à tous.J'ai un gros problème ... que je n'arrive pas à résoudre depuis trééééés longtemps, et donc au bout d'un moment j'ai l'impression de tourner en rond... Je veux réaliser un outils qui me change la couleur d'une fenêtre de présentation... j'y arrive si c'est une fenêtre "simple", mais si c'est une fenêtre polygonale, un problème se pose : la fenêtre polygonale est constitué de 2 objets (fenêtre et polyligne). Donc comment je pourrais faire pour identifier une polyligne qui appartient à une fenêtre polygonale et lui applique la même couleur que l’objet fenêtre de cette même fenêtre polygonale ???... Voici un petit résumé de ce que j’ai commencé à faire : J’arrive à identifier (enget...) une polyligne « normale » d’une polyligne appartenant à une fenêtre polygonale grâce au code de groupe 102 ("{ACAD_REACTORS"). Le code de groupe 340 de l’objet fenêtre d’une fenêtre polygonale comporte le nom de l’entité de la polyligne de la fenêtre polygonale mais je n’arrive pas à sélectionner la polyligne à l’aide de ce code de groupe 340. Je suis bloqué là... il y a peut être d’autre méthodes plus simple pour arriver à mon but. (j'y arrive en script, mais en lisp je suis coincé.ex: ^C^Cselect;\-fenetres v a precedent; changer precedent; proprietes couleur rouge;;) ... merci de votre aide Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
bonuscad Posté(e) le 6 juillet 2006 Posté(e) le 6 juillet 2006 Est ce que ceci pourrait être une piste pour toi, j'ai employé un filtre pour facililiter la chose. ((lambda ( / f_m) (while (null (setq f_m (ssget "_:S:E" '((0 . "VIEWPORT,LWPOLYLINE"))))) (princ "\nN'est pas une fenêtre") ) (if (and (setq first_ent (ssname f_m 0)) (setq snd_ent (ssname f_m 1))) (if (eq (cdr (assoc 0 (setq dxf_ent (entget first_ent)))) "LWPOLYLINE") (princ "\nUne polyligne est associée à la fenêtre") (if (eq (cdr (assoc 0 (setq dxf_ent (entget snd_ent)))) "LWPOLYLINE") (princ "\nUne polyligne est associée à la fenêtre") ) ) (setq dxf_ent nil) ) (if dxf_ent (if (null (assoc 62 dxf_ent)) (entmod (append dxf_ent (list (cons 62 (acad_colordlg 1 nil))))) (entmod (subst (cons 62 (acad_colordlg 1 nil)) (assoc 62 dxf_ent) dxf_ent)) ) ) (prin1) )) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Bred Posté(e) le 7 juillet 2006 Auteur Posté(e) le 7 juillet 2006 Merci Bonuscad, désolé de mon retard de remerciement, mais je suis un peu surchargé en ce moment. Ta manière de faire répond en partie à mon souci, car je veux pouvoir faire une selection de plusieurs fenêtre si j'ai envie ... mais ta manière de faire "me met sur une piste" et donc je pense pouvoir y arriver... je vous tiens au courant sur mon avancement ... Par contre, ta routine m'a permis de connaitre une manière de "filtrer" les entités que je ne connaissais pas le '((0 . "VIEWPORT,LWPOLYLINE")) ... merci encore !!! Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Bred Posté(e) le 7 juillet 2006 Auteur Posté(e) le 7 juillet 2006 Raaaahhh !!!... y'a un truc qui bloc !!!Je ne comprend vraiment pas où est mon erreur : Routine de selection de fenêtre Rectangle ou polygonale (changement en couleur Rouge) ((lambda ( / f_m ) (while (null (setq f_m (ssget '((0 . "VIEWPORT,LWPOLYLINE"))))) (princ "\nN'est pas une fenêtre") ) (setq Index 0 Couleur 1) (if f_m (progn (repeat ( - (sslength f_m) 1) (if (or (= (cdr (assoc 0 (entget (ssname f_m Index)))) "VIEWPORT") (= (cdr (assoc 102 (entget (ssname f_m Index)))) "{ACAD_REACTORS")) (progn (if (null (cdr (assoc 62 (entget (ssname f_m Index))))) (entmod (append (entget (ssname f_m Index)) (list (cons 62 Couleur)))) (entmod (subst (cons 62 Couleur) (assoc 62 (entget (ssname f_m Index))) (entget (ssname f_m Index)))) ) ) ) (setq Index (+ Index 1)) ) ) ) ) ) ... Ce n'est pas tés "propre" car la selection permet les polyligne "simple", mais je ne les traites pas... Donc le problème est que bizarrement, ça ne me prend QUE les fenêtre polygonales ... merci de votre aide ... Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Bred Posté(e) le 7 juillet 2006 Auteur Posté(e) le 7 juillet 2006 J'ai trouvé mieux : Sélection de fenêtre rectangle et Polygonale : (setq f_m (ssget '((-4 . " (0 . "LWPOLYLINE")(102 . "{ACAD_REACTORS") (-4 . "AND>")(-4 . "OR>")))) je ne connaissais pas (-4 . "< OR") et (-4 . "< AND") ... [Edité le 7/7/2006 par Bred] Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Bred Posté(e) le 7 juillet 2006 Auteur Posté(e) le 7 juillet 2006 ... par contre j'ai toujours le même problème : les fenêtre "simple" n'ont pas l'air d'accepter le changement d'entit" (ici '(62 . 1) - couleur Rouge) ... ((lambda ( / f_m ) (while (null (setq f_m (ssget '((-4 . " (0 . "LWPOLYLINE")(102 . "{ACAD_REACTORS") (-4 . "AND>")(-4 . "OR>"))))) (princ "\nN'est pas une fenêtre") ) (setq Index 0 Couleur 1) (if f_m (progn (repeat ( - (sslength f_m) 1) (if (= null (assoc 62 (entget (ssname f_m Index)))) (entmod (append (entget (ssname f_m Index)) (list (cons 62 Couleur)))) [b] (entmod (subst (cons 62 Couleur) (assoc 62 (entget (ssname f_m Index))) (entget (ssname f_m Index))))[/b] ) ) ) (setq Index (+ Index 1)) ) ) ) (en gras ce que je pense ne fonctionnant pas)... personne n'aurait un piste SVP ????...merci d'avance... Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Tramber Posté(e) le 7 juillet 2006 Posté(e) le 7 juillet 2006 Deux trois corrections et ca marche : (lambda ( / f_m ) (while (null (setq f_m (ssget '((-4 . " (-4 . "AND>"))))) (princ "\nN'est pas une fenêtre à contour polygonal") ) (setq Index 0 Couleur 1) (if f_m (progn (repeat (sslength f_m) (if (= null (assoc 62 (entget (ssname f_m Index)))) (entmod (append (entget (ssname f_m Index)) (list (cons 62 Couleur)))) (entmod (subst (cons 62 Couleur) (assoc 62 (entget (ssname f_m Index))) (entget (ssname f_m Index)))) ) (setq Index (+ Index 1)) ) ) ) ) J'ai corrigé le princ dans le whileLa longueur du repeat n'était pas bonne.et j'ai mis le compteur à la bonne place. Tout simplement ! Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
Bred Posté(e) le 8 juillet 2006 Auteur Posté(e) le 8 juillet 2006 Salut,Merci Tramber.... mais....Merci parcequ'en effet mon 'indexeur" était mal mis (il était bien au début, et à force de bidouiller dans le programme on se trompe dans les parenthèse et voilà ce qui arrive...), mon compteur était faux (je me suis fait avoir par le 0 du ssname...) :P Mais : en fait le princ dans While ne sert plus à rien en fait, donc je l'enlève ... et avec tout ça ça ne fonctionne toujours pas !!! (pour info ton code, tramber, n'est pas exploitable : il y manque la double parenthèse de lambda, et les filtres de ssget ont disparus... mais certainement à cause du >, comme je l'ai précedement fait) Donc, corrigé (grâce à Tramber) mais ne fonctionnant toujour pas : ((lambda ( / f_m ) (while (null (setq f_m (ssget '((-4 . "< OR")(0 . "VIEWPORT")(-4 . "< AND") (0 . "LWPOLYLINE")(102 . "{ACAD_REACTORS") (-4 . "AND >")(-4 . "OR >"))))) ) (setq Index 0 Couleur 1) (if f_m (progn (repeat (sslength f_m) (if (= null (assoc 62 (entget (ssname f_m Index)))) (entmod (append (entget (ssname f_m Index)) (list (cons 62 Couleur)))) (entmod (subst (cons 62 Couleur) (assoc 62 (entget (ssname f_m Index))) (entget (ssname f_m Index)))) ) (setq Index (+ Index 1)) ) ) ) ) ) -enlever les espaces avant > ... Au secours !!! :( merci [Edité le 8/7/2006 par Bred] Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Bred Posté(e) le 8 juillet 2006 Auteur Posté(e) le 8 juillet 2006 Mon message précedent est toujour d'actualité, parceque je ne comprend toujours pas pourquoi ça ne fonctionne pas... :casstet: :( Mais, un code + "simple" et qui fonctionne : ;) ((lambda ( / f_m ) (while (null (setq f_m (ssget '((-4 . "< OR")(0 . "VIEWPORT")(-4 . "< AND") (0 . "LWPOLYLINE")(102 . "{ACAD_REACTORS") (-4 . "AND>")(-4 . "OR>"))))) ) (setq Couleur 1) (command "_change" f_m "" "p" "co" Couleur "") ) ) (enlever les espaces après >) Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
(gile) Posté(e) le 8 juillet 2006 Posté(e) le 8 juillet 2006 Salut, Il y a une faute ici : ([surligneur]= null[/surligneur] (assoc 62 (entget (ssname f_m Index)))) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Bred Posté(e) le 8 juillet 2006 Auteur Posté(e) le 8 juillet 2006 merci (gile), en effet, il y avait ENCORE, une faute, que j'ai corrigé comme ceci : (if (= nil (assoc 62 (entget (ssname f_m Index)))) ... mais ça ne me corrige pas mon erreur : maintenant ça me traite bien les fenêtres polygonales, mais ça ne traite pas les fenêtres rectangulaires : on dirait que (entmod (append (entget (ssname f_m Index)) (list (cons 62 Couleur))))ne fonctionne pas (alors que lorque je regarde les entités avec la console, le code (62 . 1) est bien rajouté : ........(79 . 0) (146 . 0.0) (170 . 0) (62 . 1)) ... j'enrage !!!! Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
(gile) Posté(e) le 8 juillet 2006 Posté(e) le 8 juillet 2006 Re, Extrait de l'aide aux développeurs concernant la fonction entmod : You cannot use the entmod function to modify a viewport entity. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 8 juillet 2006 Posté(e) le 8 juillet 2006 Re-re, Je pense que le plus simple est de passer par du vlisp : ((lambda (/ f_m) (while (null (setq f_m (ssget '((-4 . " (0 . "VIEWPORT") (-4 . " (0 . "LWPOLYLINE") (102 . "{ACAD_REACTORS") (-4 . "AND>") (-4 . "OR>") ) ) ) ) ) (setq Index 0 Couleur 1 ) (if f_m (repeat (sslength f_m) (vla-put-color (vlax-ename->vla-object (ssname f_m Index)) Couleur) (setq Index (+ Index 1)) ) ) ) ) [Edité le 8/7/2006 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
bonuscad Posté(e) le 8 juillet 2006 Posté(e) le 8 juillet 2006 Gilles m'a devancer sur la réponse concernat (entmod) et les fenêtres. Donc tout est dit, cependant tu peux améliorer ton filtre comme ceci(0 . "*POLYLINE,SPLINE,ELLIPSE,CIRCLE,REGION")(102 . "{ACAD_REACTORS") Car les fenêtres peuvent être faites à partir de ces objets. Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Bred Posté(e) le 8 juillet 2006 Auteur Posté(e) le 8 juillet 2006 Pffff.... Désolé.... You cannot use the entmod function to modify a viewport entity. Ma 1ère langue étant le français, ma seconde le français (et je n'en ai pas d'autre), j'avoue survoler les explications de l'aide de developpeur...j'imagine que "viewport" est ce que l'on traduit par "fenêtre de présentation"... Merci (gile) pour ta proposition en vl, il faut que j'essaye de m'y mettre plus serieusement (en fait de n'avoir plus "peur" de les utiliser, plus on me donne d'exemple avec, plus je comprend la logique...) Bonuscad : En effet, ton filtre va me faire gagner un temp précieux, car je n'avais pas fait de test avec ce type de fenêtre...... heu par contre j'ai encore un truc bizarre : ça n'accepte pas les fenêtres "cercle" ... alors que j'ai bien comme entité : (0 . "CIRCLE") (5 . "FE5A") (102 . "{ACAD_REACTORS") (330 . ... Alors que ton filtre en tiend compte .... Encore un merci général... :D :D :D [Edité le 8/7/2006 par Bred] Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
bonuscad Posté(e) le 8 juillet 2006 Posté(e) le 8 juillet 2006 ... heu par contre j'ai encore un truc bizarre : ça n'accepte pas les fenêtres "cercle" Effectivement après plusieurs tests, je constate la même chose, ainsi que pour les polylignes anciennes ?!?!? :casstet: Là franchement, je vois pas pourquoi ces entités sont écartés alors qu'elles font partie du filtre.... :o Ca sent le bug avec (ssget) , du moins sous cette forme, avec; (102 . "{ACAD_REACTORS") Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Bred Posté(e) le 9 juillet 2006 Auteur Posté(e) le 9 juillet 2006 Bon... ce bug ne m'arrange pas, mais j'ai une autre idée.... que je n'arrive desespérement pas à mettre en place :J'ai remarqué que pour les objets fenêtres, quand elles sont constitué de 2 éléments (polyligne et viewport, cercle et viewport, etc....) chacun de ces deux éléments à le même point d'insertion, donc le même code dxf (10 .0.00 0.00 0.00).... Je voudrais savoir si il est possible de faire un filtre pour selectionner justement 2 entités qui ont le même point d'insertion....j'ai trouvé le "=", mais je n'arrive pas à le faire fonctionner.... Certainement pourrez vous m'aiguiller... Mais peut être que la solution serait de passer totalement en vl-, même pour la selection, mais là, j'avoue ne pas m'y être penché... parceque l'aide est en anglais.... merci de votre aide en tous cas... Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
(gile) Posté(e) le 9 juillet 2006 Posté(e) le 9 juillet 2006 Salut, Puisque c'est le filtre ssget qui beugue, il suffit de contourner le problème en ne filtrant pas les entités sur la présence du groupe 102 et en testant cette présence dans la boucle : ((lambda (/ f_m Couleur Index) (while (null (setq f_m (ssget '((0 . "VIEWPORT,*POLYLINE,SPLINE,ELLIPSE,CIRCLE,REGION")) ) ) ) ) (setq Couleur 1) (if f_m (repeat (setq Index (sslength f_m)) (setq ent (ssname f_m (setq Index (1- Index)))) (if (or (= (cdr (assoc 0 (entget ent))) "VIEWPORT") (= (cdr (assoc 102 (entget ent))) "{ACAD_REACTORS") ) (vla-put-color (vlax-ename->vla-object ent) Couleur ) ) ) ) (princ) ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
bonuscad Posté(e) le 9 juillet 2006 Posté(e) le 9 juillet 2006 Bien que la façon de Gilles fonctionne, je te donne aussi une autre voie (qui est pratiquement identique à celle de Gilles). Celle-ci s"appuie sur la même astuce mais enlève après coup les entités qui conviennent pas du jeu de sélection f_m. Il peut être interessant de conserver ce jeu de sélection. Mais la boucle de Gilles peut contenir aussi d'autres actions, c'est 'kif-kif' :P Cependant de rajouter le code (67 . 1) dans le filtre peut être une sécurité et rapidité en plus. En tout cas ton problème a permis de mettre le doigt sur un comportement anormal de (ssget) ((lambda ( / f_m l_ent dxf_ent index couleur ent) (vl-load-com) (while (null (setq f_m (ssget '((0 . "*POLYLINE,SPLINE,ELLIPSE,CIRCLE,REGION,VIEWPORT") (67 . 1)) ) ) ) ) (setq l_ent (ssnamex f_m) index -1) (foreach n l_ent (cond ((eq (type (cadr n)) 'ENAME) (setq dxf_ent (entget (cadr n))) (if (and (not (eq (cdr (assoc 0 dxf_ent)) "VIEWPORT")) (null (assoc 102 dxf_ent)) ) (setq f_m (ssdel (cadr n) f_m)) ) ) ) ) (if f_m (progn (setq index -1 couleur (acad_colordlg 1) ) (repeat (sslength f_m) (setq ent (vlax-ename->vla-object (ssname f_m (setq Index (1+ Index))))) (vla-put-color ent couleur) ) ) ) (prin1) )) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Bred Posté(e) le 10 juillet 2006 Auteur Posté(e) le 10 juillet 2006 Et bien un grand marci à tous le monde. :D En plus de m'avoir énorméménr aidé, ce post m'a permis de bien comprendre comment "jouer" avec les entités!!! Par contre, je ne voudrais pas abuser, mais est-ce que quelqu'un pourrait poster un petit exemple avec l'utilisation du "=" en filtren ça pourrait m'être utile un de ces jours... :casstet: En tout cas, je vous présente (encore) me remerciement sincères... ;) ;) ;) Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
bonuscad Posté(e) le 10 juillet 2006 Posté(e) le 10 juillet 2006 C'est relativement simple, tu mets autant d'opérateur que contient le groupe que tu veux tester. Exemple, sélectionner tous les cercles ayant leur centre à 0,0,0 :(ssget "_x" '((0 . "CIRCLE") (-4 . "=,=,=") (10 0.0 0.0 0.0))) Tu peux ignorer le Z en faisant (-4 . "=,=") qui est équivalent en fait à (-4 . "=,=,*") Tu peux employer tous les autres opérateurs sauf "&" et "&=" qui sont destinés plutôt à des test booleen sur des bits (nombre entier dans des listes de paire pointées) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Bred Posté(e) le 10 juillet 2006 Auteur Posté(e) le 10 juillet 2006 merci... :D Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
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