LUDWIG Posté(e) le 19 janvier 2005 Partager Posté(e) le 19 janvier 2005 Rebonjour, Patrick_35 m'avait gentiment transmis un programme pour "normaliser" chaques entités constituant chaques blocs d'un dessin. (defun c:bl(/ i n tot) (setq i (tblnext "block" t) tot 1) ; RECHERCHE LA PREMIERE ENTREE DANS LA TABLE DES BLOCS (while i (setq n (cdr (assoc -2 i))); SELECTIONNE LA PREMIERE ENTITE QUI COMPOSE LE BLOC (while n (setq n (entget n)); RECUPERE LES VALEURS DES ENTITES QUI COMPOSE LE BLOC (if (/= (cdr (assoc 8 n)) "0") (progn (setq n (subst (cons 8 "0") (assoc 8 n) n)) ;SI L'ENTITE N'EST PAS SUR 0, LA DEPLACE SUR 0 (entmod n) ) ) (setq n (entnext (cdr (assoc -1 n)))) ;ENTITE SUIVANTE ) (setq i (tblnext "block") tot (1+ tot)) ;BLOC SUIVANT ) (princ (strcat "\nTraitement de " (itoa tot) " bloc(s)")) (princ) ) Je l'ai modifié pour que les entités soient également nomalisées en couleur dubloc : (defun c:bl2(/ i n tot) (setq i (tblnext "block" t) tot 1) ; RECHERCHE LA PREMIERE ENTREE DANS LA TABLE DES BLOCS (while i (setq n (cdr (assoc -2 i))); SELECTIONNE LA PREMIERE ENTITE QUI COMPOSE LE BLOC (while n (setq n (entget n)); RECUPERE LES VALEURS DES ENTITES QUI COMPOSE LE BLOC (if (/= (cdr (assoc 8 n)) "0") (progn (setq n (subst (cons 8 "0") (assoc 8 n) n)) ;SI L'ENTITE N'EST PAS SUR 0, LA DEPLACE SUR 0 (entmod n) ) ) [b] (if (/= (cdr (assoc 62 n)) 0) (progn (setq n (subst (cons 62 0) (assoc 62 n) n)) ;SI L'ENTITE N'EST PAS de couleur 0, la change en 0 (couleur 0 =dubloc) (entmod n) ) )[/b](setq n (entnext (cdr (assoc -1 n)))) ;ENTITE SUIVANTE ) (setq i (tblnext "block") tot (1+ tot)) ;BLOC SUIVANT ) (princ (strcat "\nTraitement de " (itoa tot) " bloc(s)")) (princ) ) Ca marche, sauf pour les entités qui sont définies en couleur Ducalque : elles restent en couleur Ducalque. J'ai essayé de rajouter : (if (/= (cdr (assoc 62 n)) "256") ; et aussi dubloc ; "dubloc" ; bylayer ; "bylayer" ; nil ; "nil"... (progn (setq n (subst (cons 62 0) (assoc 62 n) n)) (entmod n) ) ) Mais rien n'y fait. Je ne comprends pas d'où vient mon erreur. Quelqu'un pourrait-il m'aider ? Merci d'avance... Autocad 2021 - Revit 2022 - Windows 10 Lien vers le commentaire Partager sur d’autres sites More sharing options...
rebcao Posté(e) le 19 janvier 2005 Partager Posté(e) le 19 janvier 2005 Salut Ludwig, tu sais Patrick_35 ne pourra pas te répondre, il est au stade des devinette. Il passe par un grand SPLINE.... Pour ton problème, il me semble que le code 62 est inexistant lorsque l'objet est en DUCALQUE. me semble-je ! Christian Formateur, Consultant Expert AutoCAD, REVIT MEP, INVENTOR, télécharger , des Outils AutoCAD...cad123 @ wanadoo.fr (enlever les espaces de part et d'autre de @) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Tramber Posté(e) le 19 janvier 2005 Partager Posté(e) le 19 janvier 2005 Tout bêtement, alors il faut faire un ENTMAKE du APPEND ENTGET pour insérer le nouveau CONS ? Tiens-nous au courant [Edité le 19/1/2005 par Tramber] Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.) Lien vers le commentaire Partager sur d’autres sites More sharing options...
LUDWIG Posté(e) le 19 janvier 2005 Auteur Partager Posté(e) le 19 janvier 2005 il est au stade des devinette. Il passe par un grand SPLINE. --> Je ne comprends pas trop ce que cela signifie... mais bon ! J'ai effectivement l'impression que le code 62 est inexistant quand la couleur est bylayer, c'est pour cela que j'ai testé : (if (/= (cdr (assoc 62 n)) nil)... mais bon, ça ne marche pô ! Autocad 2021 - Revit 2022 - Windows 10 Lien vers le commentaire Partager sur d’autres sites More sharing options...
rebcao Posté(e) le 19 janvier 2005 Partager Posté(e) le 19 janvier 2005 citation extraite du message original:il est au stade des devinette. Il passe par un grand SPLINE. --> Je ne comprends pas trop ce que cela signifie... mais bon ! voici le message de Patrick_35...http://www.cadxp.com/sujetXForum-4605.htm Christian Formateur, Consultant Expert AutoCAD, REVIT MEP, INVENTOR, télécharger , des Outils AutoCAD...cad123 @ wanadoo.fr (enlever les espaces de part et d'autre de @) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Patrick_35 Posté(e) le 19 janvier 2005 Partager Posté(e) le 19 janvier 2005 Si le code 62 n'existe pas, cela veut dire que la couleur est ducalque. Si on souhaite la changer en dublock, il faut lui ajouter(setq n (append n (cons 62 "Byblock"))) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824 Lien vers le commentaire Partager sur d’autres sites More sharing options...
bonuscad Posté(e) le 19 janvier 2005 Partager Posté(e) le 19 janvier 2005 J'allais le dire Patrick_35 ;) (cond ((/= (cdr (assoc 62 n)) 0) (setq n (subst (cons 62 0) (assoc 62 n) n)) (entmod n) ) ((null (assoc 62 n)) (setq n (append (cons 62 0) n)) (entmod n) ) ) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius Lien vers le commentaire Partager sur d’autres sites More sharing options...
LUDWIG Posté(e) le 20 janvier 2005 Auteur Partager Posté(e) le 20 janvier 2005 Malgré tous mes efforts (!), ça ne veut pas marcher ! (defun c:bl(/ i n tot) (setq i (tblnext "block" t) tot 1) ; RECHERCHE LA PREMIERE ENTREE DANS LA TABLE DES BLOCS (while i (setq n (cdr (assoc -2 i))); SELECTIONNE LA PREMIERE ENTITE QUI COMPOSE LE BLOC (while n (setq n (entget n)); RECUPERE LES VALEURS DES ENTITES QUI COMPOSE LE BLOC (if (/= (cdr (assoc 8 n)) "0") (progn (setq n (subst (cons 8 "0") (assoc 8 n) n)) ;SI L'ENTITE N'EST PAS SUR 0, LA DEPLACE SUR 0 (entmod n) ) ) [b] (cond ((/= (cdr (assoc 62 n)) 0);SI L'ENTITE N'EST PAS DE COULEUR 0, LA CHANGE EN 0 (=DuBloc) (setq n (subst (cons 62 0) (assoc 62 n) n)) (entmod n) ) ((null (assoc 62 n));SI L'ENTITE N'A PAS LE CODE DXF 62 (=DuCalque), LE CREE ET LUI AFFECTE LA VALEUR 0 (=DuBloc) (setq n (append (cons 62 0) n)) (entmod n) ))[/b](setq n (entnext (cdr (assoc -1 n)))) ;ENTITE SUIVANTE ) (setq i (tblnext "block") tot (1+ tot)) ;BLOC SUIVANT ) (princ (strcat "\nTraitement de " (itoa tot) " bloc(s)")) (princ) ) Autocad 2021 - Revit 2022 - Windows 10 Lien vers le commentaire Partager sur d’autres sites More sharing options...
LUDWIG Posté(e) le 20 janvier 2005 Auteur Partager Posté(e) le 20 janvier 2005 Aîe ! Aîe ! Aîe ! En plus, je viens de remarquer que :- AVEC EDITREF : un bloc avec attributs peut avoir tous ces éléments constituants sur le calque 0- AVEC L'EDITEUR D'ATTRIBUTS ETENDU : les étiquettes sont en fait définies sur un autre calque... Par exemple, 1 dessin avec 1 seul bloc inséré en 0 et constitué de 1 seul attribut défini sur le calque 0. Normalement, après avoir purgé, il ne doit rester que le calque 0. Or quand on double clique sur le bloc pour ouvrir l'éditeur d'attributs étendu, on s'aperçoit que l'étiquette du bloc est définie sur un autre calque qui, du coup n'est pas purgé... Vous connaissez ce problème ? Comment le résoudre dans mon code de "normalisation" des blocs ? Autocad 2021 - Revit 2022 - Windows 10 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Patrick_35 Posté(e) le 20 janvier 2005 Partager Posté(e) le 20 janvier 2005 SalutDéjà pour solutionner la couleur dubloc(if (not (assoc 62 n)) (setq n (append n (list (cons 60 0)))) (if (/= (cdr (assoc 62 n)) 0) (setq n (subst (cons 62 0) (assoc 62 n) n)) ) ) (entmod n) Ensuite, pour ce qui est des attibutsSi le code 66 pour un bloc est présent, c'est que des attributs suiventDand ce cas par exemple(setq sel (ssget "x" (list (cons 0 "INSERT")))) (setq j 0) (while (ssname sel j) (setq n (entget (ssname sel j) (if (assoc 66 n) (progn (setq i (entget (entnext (cdr (assoc -1 n))))) (while (/= (cdr (assoc 0 i)) "SEQEND") (setq i (subst (assoc 8 n) (assoc 8 i) i)) ; mettre l'attribut sur le même calque que celui du bloc par exemple (entmod i) ; modifier l'entité (entupd (cdr (assoc -1 i))) ; mettre à jour sur l'écran l'entité (setq i (entget (entnext (cdr (assoc -1 i))))) ) ) ) (setq j (1+ j)) )Nb : la sélection doit se faire cette fois ci dans tout le dessin et non plus dans la table des blocs. Ce n'est valable que pour des blocs qui sont déjà insérés dans le dessin @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824 Lien vers le commentaire Partager sur d’autres sites More sharing options...
LUDWIG Posté(e) le 20 janvier 2005 Auteur Partager Posté(e) le 20 janvier 2005 (setq n (append n (list (cons 60 0)))) ça marche ! sauf que c list (cons 6 20)))) Pour ce qui est des attributs, je testerai plus tard.. Merci Patrick_35... Est-ce que ces réponses te viennent instinctivement ? Le Lisp est-il ta langue maternelle ? Autocad 2021 - Revit 2022 - Windows 10 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Patrick_35 Posté(e) le 20 janvier 2005 Partager Posté(e) le 20 janvier 2005 Ah exact, tu as gagné 10 pts pour ce bug ;) Le lisp n'est pas ma langue maternelle mais j'ai commencé sur autocad V12, ce qui fait presque 9 ans déjà. Et comme j'ai développé plein d'outils pour mon boulot, ça aide, malgré que ce ne soit pas mon métier. J'en apprends tous les jours, même avec tes lisps comme la fonction sssetfirst dont je ne me suis jamais servi. Il est toujours utile de regarder ce que font les autres, quelle est leur logique et de quelles fonctions ils se servent. Ca rafraîchi parfois la mémoire ou ça permet de faire plus court et plus simple. :cool: Tu sais, une fois que tu as bien compris comment fonctionne la programmation, le reste n'est plus qu'un jeu et une question d'interprétation. Un ordinateur est bête, si on lui dit un plus un, il répond deux. Maintenant, si le résultat est de trois, c'est qu'il y a un bug, une chose qui n'a pas été comprise, ou pire encore, un virus qui met son grain de sel. :mad2: @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824 Lien vers le commentaire Partager sur d’autres sites More sharing options...
LUDWIG Posté(e) le 21 janvier 2005 Auteur Partager Posté(e) le 21 janvier 2005 Et voici donc la version finale (j'espère) du programme que vous m'avez aider à constituer. J'espère que ça servira à d'autres... ;**************************************** ;- NORMALISER BLOCS - ;**************************************** ;Patrick_35 de CadXP modifié par Ludwig (defun c:bl (/ i n tot) ;Normalisation des blocs dans la table des blocs ;----------------------------------------------- (setq i (tblnext "block" t) tot 1); RECHERCHE LA PREMIERE ENTREE DANS LA TABLE DES BLOCS (while i (setq n (cdr (assoc -2 i))); SELECTIONNE LA PREMIERE ENTITE QUI COMPOSE LE BLOC (while n (setq n (entget n)); RECUPERE LES VALEURS DES ENTITES QUI COMPOSE LE BLOC (if (/= (cdr (assoc 8 n)) "0") (progn (setq n (subst (cons 8 "0") (assoc 8 n) n));SI L'ENTITE N'EST PAS SUR 0, LA DEPLACE SUR 0 (entmod n) ) ) (if (not (assoc 62 n));SI L'ENTITE N'A PAS LE CODE DXF 62 (=DuCalque), LE CREE ET LUI AFFECTE LA VALEUR 0 (=DuBloc) (setq n (append n (list (cons 62 0)))) (if (/= (cdr (assoc 62 n)) 0);SI L'ENTITE N'EST PAS DE COULEUR 0, LA CHANGE EN 0 (=DuBloc) (setq n (subst (cons 62 0) (assoc 62 n) n)) ) ) (entmod n) (setq n (entnext (cdr (assoc -1 n))));ENTITE SUIVANTE ) (setq i (tblnext "block") tot (1+ tot));BLOC SUIVANT ) ;Normalisation des étiquettes d'attributs de blocs dans le dessin (car une étiquette peut avoir des valeurs de calque, couleur, etc. différentes de l'attribut) ;----------------------------------------------- (setq sel (ssget "x" (list (cons 0 "INSERT")))) (setq j 0) (while (ssname sel j) (setq n (entget (ssname sel j))) (if (assoc 66 n) (progn (setq i (entget (entnext (cdr (assoc -1 n))))) (while (/= (cdr (assoc 0 i)) "SEQEND") (setq i (subst (cons 8 "0") (assoc 8 i) i)) ; mettre l'attribut sur le même calque que celui du bloc par exemple (setq i (subst (cons 62 0) (assoc 62 i) i)) ; mettre l'attribut sur le même calque que celui du bloc par exemple (entmod i) ; modifier l'entité (entupd (cdr (assoc -1 i))) ; mettre à jour sur l'écran l'entité (setq i (entget (entnext (cdr (assoc -1 i))))) ) ) ) (setq j (1+ j)) ) ;Résultat ;----------------------------------------------- (princ (strcat "\nTraitement de " (itoa (+ tot j)) " bloc(s) (" (itoa tot) " dans la table des blocs et " (itoa j) " étiquettes d'attributs de blocs dans le dessin")) (princ) ) (prompt "\bl : Normaliser les blocs du dessin (calque 0 - Couleur Dubloc") Autocad 2021 - Revit 2022 - Windows 10 Lien vers le commentaire Partager sur d’autres sites More sharing options...
bonuscad Posté(e) le 21 janvier 2005 Partager Posté(e) le 21 janvier 2005 Bravo Ludwig, Je l'ai essayé, ça fonctionne, sauf dans un cas (je suis tombé dessus).:( Pour ton info:Si le bloc est sur un calque verrouillé, la procédure s'execute sans aucune erreur, mais rien ne se passe après un "regen" . C'est ce qui est le plus pénible en programmation, envisager tout les cas de figure.En tout cas tu as déjà fait un joli boulot Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius Lien vers le commentaire Partager sur d’autres sites More sharing options...
LUDWIG Posté(e) le 21 janvier 2005 Auteur Partager Posté(e) le 21 janvier 2005 ah oui il faut que je rajoute : - extraction du nom du calque sur lequel est inséré le bloc- deverouillage de ce calque s'il était verrouillé- traitement- reverrouillage s'il était verrouillé Sinon, je dirais que c'est surtout du code "Patrick_35" Autocad 2021 - Revit 2022 - Windows 10 Lien vers le commentaire Partager sur d’autres sites More sharing options...
BIM G CO Posté(e) le 28 janvier 2005 Partager Posté(e) le 28 janvier 2005 (command "_-LAYER" "_state" "_save" "ParDéfaut" "" "" "") ; Sauve l'état de tes calques (command "_-LAYER" "L" "*"" "") ; déverrouille tout tes calques ..... ton lisp (command "_-LAYER" "_state" "_restore" "ParDéfaut" "" ""); restaure l'état de tes calques ;) Dessinateur AutoCAD, Modeleur BIM, consultant informatique logiciels métier Lenovo ThinkStation P330 i9 9900K 32Gb RAM 512 SSD + 1To GstarCAD, Fisa-CAD, Revit, FisaBIM CVC, Microsoft Office PlaquetteDeplianteMars2024.pdf Lien vers le commentaire Partager sur d’autres sites More sharing options...
Oli553 Posté(e) le 2 février 2006 Partager Posté(e) le 2 février 2006 Et voici donc la version finale (j'espère) du programme que vous m'avez aider à constituer. J'espère que ça servira à d'autres... Oh oui, je viens de redéfinir tous ma bibliothéque de bloc. Sa marche super même avec les blocs paramétriques. :D L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai. "Il vaut mieux mobiliser son intelligence sur des conneries, que sa connerie sur des choses intelligentes" - Devise Shadok. "ceux qui ne se souviennent pas du passé sont condamnés à le revivre" George Santayana Ma bibliothèque de blocs électrique :symbole elec.dwg Lien vers le commentaire Partager sur d’autres sites More sharing options...
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