Ptitony72 Posté(e) le 13 juin 2008 Posté(e) le 13 juin 2008 Bonjour, Depuis un petit bout de temps, je cherche à faire une légende automartique à partir d'un ancien lisp qu'on utilisais avant, mais je bloque sur plusieurs points.Ce lisp sert à faire automatiquement nos légende a partir des blocs présents sur le plan.Tous les blocs de notre bibliothèque on un attribut DESIGNATION, TYPE, LIGNE, QUANTITE et CATEGORIE. Certains blocs ont des attributs en plus. Mes problèmes :- Lorsque j'ai 2 blocs identiques sur un plan, il me les insert deux fois dans la légende. Je cherche un moyen de faire du tris dans la variable sel_bloc afin d'enlever les doublons.- Je ne parviens pas à extraire la valeur de l'attribut DESIGNATION pour le mettre dans la variable "designation" Petite cerise sur le gateau (je peux m'en passer mais bon), lorsque je fais Echap, serait-il possible de remettre l'OSMODE en os_courant? Voici le lips en question : ;;;------------------------------------------------------------------------------------------------------------- ;;; LISTE DES VARIABLES ;;;------------------------------------------------------------------------------------------------------------- ;;; ;;; ;;; os_courant --> accrochage aux objets courant ;;; sel_bloc --> liste des blocs sélectionnés ;;; nom_bloc --> nom du bloc courant ;;; compteur --> compteur ;;; ptd --> point de départ ;;; pt1 --> point de départ éclairage ;;; pt2 --> point de départ commande ;;; pt3 --> point de départ courants forts ;;; pt4 --> point de départ éclairage de sécurité ;;; pt5 --> point de départ incendie ;;; pt6 --> point de départ appel malade ;;; pt7 --> point de départ courants faibles ;;; pt8 --> point de départ ;;; designation --> désignation du bloc courant ;;;------------------------------------------------------------------------------------------------------------- ;;; PROGRAMME ;;;------------------------------------------------------------------------------------------------------------- (defun c:legende () (princ "Version 10/06/08") (command "_insert" "Calque=" "0,0" "" "" "" ) ;_ Insertion des calques (setvar "clayer" "0") ;_ Défini le calque "0" courant (setvar "cmdecho" 0) ;_ Désactive l'affichage à l'écran --> mettre à 1 (setvar "attreq" 0) ;_ Définit les attributs des blocs par défaut (setq os_courant (getvar "osmode")) ;_ Enregistre l'accrochage aux objets courant dans os_courant (setvar "osmode" 0) ;_ Désactive l'accrochage aux objets (setq ptd (getpoint "\nEntrer le point de départ : ")) ;_ Défini le point de départ par l'utilisateur (setq pt1 (polar ptd 0 0)) ;_ Défini le point 1 en fonction du point de départ (setq pt2 (polar ptd 0 9.5)) ;_ Défini le point 2 en fonction du point de départ (setq pt3 (polar ptd 0 19)) ;_ Défini le point 3 en fonction du point de départ (setq pt4 (polar ptd 0 28.5)) ;_ Défini le point 4 en fonction du point de départ (setq pt5 (polar ptd 0 38)) ;_ Défini le point 5 en fonction du point de départ (setq pt6 (polar ptd 0 47.5)) ;_ Défini le point 6 en fonction du point de départ (setq pt7 (polar ptd 0 57)) ;_ Défini le point 7 en fonction du point de départ (setq pt8 (polar ptd 0 66.5)) ;_ Défini le point 8 en fonction du point de départ (setq sel_bloc (ssget (list (cons 0 "insert")))) ;_ Sélectionne les blocs et les mets dans la variable sel_bloc (setq compteur -1) ;_ Initialise le compteur à -1 (car indexation dans un jeu de sélection commence à 0) (repeat (sslength sel_bloc) ;_ Répète la boucle autant de fois qu'il y'a de blocs (setq nom_bloc (cdr (assoc 2 (entget (ssname sel_bloc (setq compteur (+ compteur 1))))))) ;_ Met dans la variable nom_bloc le bloc courant et l'enlève du jeu de sélection sel_bloc (print nom_bloc) (print designation) (progn (command "_insert" nom_bloc pt1 "1" "1" "0") (command "changer" "d" "" "pr" "cal" "- ETCO - Détection incendie -" "") (command "_insert" "*Cadre simple" pt1 "" "") (command "-style" "Romans" "romans.shx" "0.1" "1" "0" "" "" "") (command "texte" "j" "mg" (polar pt1 0 0.95) "0" designation) (setq pt1 (polar pt1 (* 3 (/ pi 2)) 0.4)) ) ) ;_ Fin de la boucle (setvar "osmode" os_courant) ;_ Redéfinit l'accrochage aux objets courant ) Si possible, pouvez-vous bien détailler vos routines que je puisse un peu comprendre comment ca marche?Merci d'avance.
Patrick_35 Posté(e) le 13 juin 2008 Posté(e) le 13 juin 2008 Salut Pour t'aider dans ton lisp, j'avais fait celui-ci qui dénombre les blocs et qui différencie ceux qui portent le même nom avec le premier attribut.C'est pour les luminaires type 1, type 2, etc... qui ont le même nom de bloc, mais une valeur d'attribut différent. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Ptitony72 Posté(e) le 16 juin 2008 Auteur Posté(e) le 16 juin 2008 Merci Patrick_35 Pour le moment, je ne comprends pas tout (voir pas grand chose) à la routine mais je vais l'essayer par morceaux pour en extraire ceux qui m'interessent. Une petite question, les commandes qui commance par vla, c'est du lisp aussi? Je ne les connais pas celles là. Ps : Juste une petite remarque, ton lisp marche très bien sous autocad 2007 mais pas sous 2008, il met l'erreur suivante : no function definition: VLAX-GET-ACAD-OBJECT. Encore une fois, merci.
Bred Posté(e) le 16 juin 2008 Posté(e) le 16 juin 2008 Salut,les commandes qui commance par vla, c'est du lisp aussi?C'est du "visual lisp", une parallèle entre les commande vba d'autocad et le lisp.Plus performant que le lisp (peut-être pas pour le fonctions "entmake"...) sous 2008, il met l'erreur suivante : no function definition: VLAX-GET-ACAD-OBJECT.En début du lisp, met(vl-load-com) Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Ptitony72 Posté(e) le 16 juin 2008 Auteur Posté(e) le 16 juin 2008 C'est encore moi. J'ai trouvé ce code sur internet : (defun c:lsp () (if (setq ent(entsel "\n Select a Block: ")) ;- Let the user select a block (progn (setq en(car ent)) ;- Get the entity name of the block (setq enlist(entget en)) ;- Get the DXF group codes (setq blkType(cdr(assoc 0 enlist))) ;- Save the type of entity (if (= blkType "INSERT") ;- If the entity type is an Insert entity (progn (if(= (cdr(assoc 66 enlist)) 1) ;- See if the attribute flag equals one (if so, attributes follow) (progn (setq en2(entnext en)) ;- Get the next sub-entity (setq enlist2(entget en2)) ;- Get the DXF group codes (while (/= (cdr(assoc 0 enlist2)) "SEQEND") ;- Start the while loop and keep ;- looping until SEQEND is found. (princ "\n ") ;-Print a new line (princ enlist2) ;- Print the attribute DXF group codes (setq en2(entnext en2)) ;- Get the next sub-entity (setq enlist2(entget en2)) ;- Get the DXF group codes ) ) ) ;- Close the if group code 66 = 1 statement ) ) ;- Close the if block type = "ATTRIB" statement ) ) ;- Close the if an Entity is selected statement ) En l'exécutant sur un de mes bloc, il me donne ça : ((-1 . ) (0 . ATTRIB) (330 . ) (5 . 319) (100 . AcDbEntity) (67 . 0) (410 . Model) (8 . 0) (100 . AcDbText) (10 4.25494 3.98196 0.0) (40 . 0.075) (1 . 1) (50 . 0.0) (41 . 1.0) (51 . 0.0) (7 . ROMANS) (71 . 0) (72 . 0) (11 0.0 0.0 0.0) (210 0.0 0.0 1.0) (100 . AcDbAttribute) (2 . QUANTITE) (70 . 9) (73 . 0) (74 . 0) (280 . 0)) ((-1 . ) (0 . ATTRIB) (330 . ) (5 . 31A) (100 . AcDbEntity) (67 . 0) (410 . Model) (8 . 0) (100 . AcDbText) (10 4.25494 4.28196 0.0) (40 . 0.075) (1 . Bloc d'éclairage de sécurité au plafond - Evacuation) (50 . 0.0) (41 . 1.0) (51 . 0.0) (7 . ROMANS) (71 . 0) (72 . 0) (11 0.0 0.0 0.0) (210 0.0 0.0 1.0) (100 . AcDbAttribute) (2 . DESIGNATION) (70 . 9) (73 . 0) (74 . 0) (280 . 0)) ((-1 . ) (0 . ATTRIB) (330 . ) (5 . 31B) (100 . AcDbEntity) (67 . 0) (410 . Model) (8 . 0) (100 . AcDbText) (10 4.25494 4.13196 0.0) (40 . 0.075) (1 . ECLAIRAGE DE SECURITE) (50 . 0.0) (41 . 1.0) (51 . 0.0) (7 . ROMANS) (71 . 0) (72 . 0) (11 4.25494 4.10696 0.0) (210 0.0 0.0 1.0) (100 . AcDbAttribute) (2 . CATEGORIE) (70 . 9) (73 . 0) (74 . 1) (280 . 0)) ((-1 . ) (0 . ATTRIB) (330 . ) (5 . 31C) (100 . AcDbEntity) (67 . 0) (410 . Model) (8 . 0) (100 . AcDbText) (10 4.24256 3.71673 0.0) (40 . 0.1) (1 . ) (50 . 0.0) (41 . 1.0) (51 . 0.0) (7 . ARIAL BLACK) (71 . 0) (72 . 4) (11 4.24256 3.71673 0.0) (210 0.0 0.0 1.0) (100 . AcDbAttribute) (2 . TYPE) (70 . 4) (73 . 0) (74 . 0) (280 . 0)) ((-1 . ) (0 . ATTRIB) (330 . ) (5 . 31D) (100 . AcDbEntity) (67 . 0) (410 . Model) (8 . 0) (100 . AcDbText) (10 4.22315 3.86677 0.0) (40 . 0.1) (1 . ) (50 . 0.0) (41 . 1.0) (51 . 0.0) (7 . ARIAL) (71 . 0) (72 . 4) (11 4.24256 3.86673 0.0) (210 0.0 0.0 1.0) (100 . AcDbAttribute) (2 . LIGNE) (70 . 4) (73 . 0) (74 . 0) (280 . 0)) ((-1 . ) (0 . ATTRIB) (330 . ) (5 . 31E) (100 . AcDbEntity) (67 . 0) (410 . Model) (8 . 0) (100 . AcDbText) (10 4.20023 3.47226 0.0) (40 . 0.1) (1 . S) (50 . 0.0) (41 . 1.0) (51 . 0.0) (7 . TECHNIC BOLD) (71 . 0) (72 . 4) (11 4.24256 3.52204 0.0) (210 0.0 0.0 1.0) (100 . AcDbAttribute) (2 . SYMBOLE) (70 . 4) (73 . 0) (74 . 0) (280 . 0))((-1 . ) (0 . "SEQEND") (330 . ) (5 . "31F") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "- ETCO - Eclairage de sécurité -") (-2 . )) Ma question : Comment mettre chacunne des 2 valeurs en gras dans une variable?
Patrick_35 Posté(e) le 16 juin 2008 Posté(e) le 16 juin 2008 Re, il met l'erreur suivante : no function definition: VLAX-GET-ACAD-OBJECT.Le (vl-load-com). Un des éternels oublis de notre part ;) je ne comprends pas tout (voir pas grand chose)Je vais te décomposer la routineL'appel à la routine InputBox fait afficher une boite de dialogue pour filtrer éventuellement le nom des blocsTu peux simplifier en utilisant (setq js (ssget "x" '((0 . "INSERT"))))La routine rechercher_nom donne le nom du bloc (gare au blocs dynamiques) avec la valeur du premier attribut s'il existe.Exemple : ("BLOC3" "ATT3") Le vlax-map-collection parcours le jeu de sélection et créé une liste contenant les noms des blocs avec leurs éventuels attributs.Par exemple dans la variable tbl : (("BLOC3" "ATT3") ("BLOC1" "ATT1") ("BLOC5") ("BLOC3" "ATT3"))L'équivalent en autolisp juste sur le nom du bloc.(setq n 0) (while (setq ent (ssname js n)) (setq tbl (cons (list (cdr (assoc 2 (entget ent)))) tbl) n (1+ n) ) ) La boucle while permet de dénombrer les blocs qui sont identiques et crée une autre liste.Par exemple dans la variable lst : (("2" "BLOC3" "ATT3") ("1" "BLOC1" "ATT1") ("1" "BLOC5"))L'astuce est de compter le nombre d'éléments dans la liste, de prendre le premier et la fonction vl-remove permet d'enlever dans la liste tous les éléments correspondant au premier. On recompte les éléments de la liste et la différence permet de savoir combien il y en avait, puis de construire en parallèle une autre liste avec le décompte.ps : cette boucle est dite itérative. Il ne reste plus qu'à faire une boucle foreach pour afficher le résultat.Tu remarqueras qu'il est aussi utilisé un vl-sort pour trier par ordre alphabétique.Le trie se fait sur le 2em et 3em éléments de la liste (le nom du bloc, puis son attribut), le premier étant le nombre de blocs. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Bred Posté(e) le 16 juin 2008 Posté(e) le 16 juin 2008 citation extraite du message original:les commandes qui commance par vla, c'est du lisp aussi? C'est du "visual lisp", une parallèle entre les commande vba d'autocad et le lisp:casstet: J'ai tapé trop vite... désoléAu lieu de "visual lisp" , il faut lire "ActiveX", qui est une sorte d'interface entre Autocad et le VBA. Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Ptitony72 Posté(e) le 18 juin 2008 Auteur Posté(e) le 18 juin 2008 Merci pour cette explication patrick. Je vais voir si j'arrive à en tirer quelque chose.
Bred Posté(e) le 18 juin 2008 Posté(e) le 18 juin 2008 Merci pour cette explication patrick.Et moi, mes réponses à tes questions, c'est du boudin ? Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Patrick_35 Posté(e) le 19 juin 2008 Posté(e) le 19 juin 2008 Salut Bred Je compatis.Tu n'es malheureusement pas le premier, et sans doute pas le dernier non plus. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Ptitony72 Posté(e) le 24 juin 2008 Auteur Posté(e) le 24 juin 2008 Excuse moi Bred, merci à toi aussi. J'étais un peu à fond le lisp de Patrick. Malgré l'explication, j'ai quand même du mal à l'exploiter.En partant du Lisp que j'ai mis plus haut, j'ai réussi à en extraire les 2 attributs qui m'interressent : (defun c:lsp () (if (setq ent(entsel "\n Select a Block: ")) (progn (setq en(car ent)) (setq enlist(entget en)) (setq blkType(cdr(assoc 0 enlist))) (if (= blkType "INSERT") (progn (if(= (cdr(assoc 66 enlist)) 1) (progn (setq en2(entnext en)) (setq enlist2(entget en2)) (while (/= (cdr(assoc 0 enlist2)) "SEQEND") (if (= (cdr(assoc 2 enlist2)) "DESIGNATION")(setq designation (cdr(assoc 1 enlist2)))) (if (= (cdr(assoc 2 enlist2)) "CATEGORIE")(setq categorie (cdr(assoc 1 enlist2)))) (setq en2(entnext en2)) (setq enlist2(entget en2)) ) ) ) ) ) ) ) (princ (strcat "\nNom du bloc ----> " nom_bloc "")) (princ (strcat "\nCatégorie ----> " categorie "")) (princ (strcat "\nDésignation ----> " designation "")) ) ) Maintenant, je ne vois pas trop par quoi remplacer la ligne (if (setq ent(entsel "\n Selectionner un Bloc : ")) pour qu'il me prenne en compte le bloc courant (celui qui est dans la variable Nom_bloc) et pas le bloc sélectionné. En faite, je ne vois pas comment changer le Nom du bloc en Entité.
Bred Posté(e) le 24 juin 2008 Posté(e) le 24 juin 2008 Salut,En faite, je ne vois pas comment changer le Nom du bloc en Entité. Si je comprends bien tes attributs sont constants, donc quelque soit le bloc choisis, si il a le même nom, les attributs sont les même. pour récupérer un bloc par son nom tu as cette manière : récupération de tous les blocs portant le nom dans variable Nom_bloc(setq sel (ssget "_X" (list (cons 2 Nom_bloc)))) puis tu en récupère un (ici le premier) :(setq bloc (ssname sel 0)) Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Patrick_35 Posté(e) le 24 juin 2008 Posté(e) le 24 juin 2008 Malgré l'explication, j'ai quand même du mal à l'exploiter.Si je n'ai pas été assez clair, dis-moi où tu as du mal. ps : lsp est déjà une commande dans Autocad @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Ptitony72 Posté(e) le 24 juin 2008 Auteur Posté(e) le 24 juin 2008 @ Patrick_35 :Ton explication est claire dans le fonctionnement du lisp. En faite, mon problème est que dans le visual lisp, les commandes sont pas les mêmes que dans le lisp "normal". Même si je ne les connais pas en lisp "normal", je les retrouve facilement dans l'aide d'Autocad, alors qu'en visual lisp, je ne sais pas trop ou chercher. Sinon pour la commande lsp, ça n'en est pas une sur mon PC. Ca vient peut être de ma version autocad, c'est un autocad 2008 Map 3D (qui n'est pas tout à fait identique à un autocad 2008 complet aparament) @ Bred :Merci pour ces 2 lignes, maintenant ma légende marche dans son ensemble. Me reste plus qu'a insérer un symbole de chaque type et non pas autant de symboles qu'il y en a sur le plan. Faut juste que je fasse du tri dans la variable sel_bloc. En cherchant un peu, je devrais y arriver. Merci beaucoup.
Patrick_35 Posté(e) le 25 juin 2008 Posté(e) le 25 juin 2008 Salut Comme tu as un peu de mal, je te propose une version qui créée une légende uniquement avec les blocs qui ont comme première étiquette d'attribut DESIGNATION et comme seconde CATEGORIE.Il reste la mise en forme à bien définir. Comme le lisp est en vl car j'utilise les tableaux, dis-moi tes besoins. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Ptitony72 Posté(e) le 25 juin 2008 Auteur Posté(e) le 25 juin 2008 Merci Patrick. Grace aux quelques lignes de Bred, ma légende est sur le point de fonctionner.Me manque juste une petite ligne. En faite, je cherche à comparer la variable Nom_bloc avec la liste Bloc_insere afin d'exécuter un programe si Nom_bloc ne s'y trouve pas. En gros : (if "Nom_bloc pas dans Bloc_insere"(progn...)) Ce qu'il me manque, c'est ce qu'il va après le if ou, tout du moin, la façon de comparer une variable avec une liste. Ma liste est de la forme (BS DM PC HUB_PORTE 6213 . 0) Une autre question qui me viens a l'esprit, comment on vide la liste?La seule méthode que j'ai trouvé, c'est de faire (setq Bloc_insere 0), d'ou le . 0 à la fin. Merci d'avance.
Bred Posté(e) le 25 juin 2008 Posté(e) le 25 juin 2008 Salut,je cherche à comparer la variable Nom_bloc avec la liste Bloc_insere afin d'exécuter un programe si Nom_bloc ne s'y trouve pas. (setq Bloc_insere (list "AAA" "BBB" "CCC" "DDD")) (setq Nom_bloc "CCC") (if ([b]member[/b] Nom_bloc Bloc_insere) (princ "\n OK !!!!") (princ "\n Et non !!!!")) Une autre question qui me viens a l'esprit, comment on vide la liste?(setq Bloc_insere [b]nil[/b]) Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Ptitony72 Posté(e) le 30 juin 2008 Auteur Posté(e) le 30 juin 2008 Merci beaucoup bred. Ca m'a permis de rendre fonctionnel ma légende automatique.Je laisse le code en dessous si ça intéresse du monde, je mettrais les fichiers qui vont avec dès que j'aurais trouvé comment faire. Y'a des trucs qui servent a rien pour le moment mais je compte l'améliorer un peu plus tard. ;;;----------------------------------------------------------------------------------------------------------------------------- ;;; LISTE DES VARIABLES ;;;----------------------------------------------------------------------------------------------------------------------------- ;;; ;;; ;;; os_courant --> accrochage aux objets courant ;;; sel_bloc --> liste des blocs sélectionnés ;;; nom_bloc --> nom du bloc courant ;;; bloc_insere --> liste blocs déjà inséré ;;; compteur --> compteur ;;; ptd --> point de départ ;;; pt1 --> point de départ éclairage ;;; pt2 --> point de départ commande ;;; pt3 --> point de départ courants forts ;;; pt4 --> point de départ éclairage de sécurité ;;; pt5 --> point de départ incendie ;;; pt6 --> point de départ appel malade ;;; pt7 --> point de départ courants faibles ;;; pt8 --> point de départ ;;; designation --> désignation du bloc courant ;;; categorie --> catégorie du bloc courant ;;; quantite --> quantité du bloc courant ;;;----------------------------------------------------------------------------------------------------------------------------- ;;; Routine principale ;;;----------------------------------------------------------------------------------------------------------------------------- (defun c:legende () (princ "Version 10/06/08") (command "_insert" "Calque=" "0,0" "" "" "" ) ;_ Insertion des calques (setvar "clayer" "0") ;_ Défini le calque "0" courant (setvar "cmdecho" 0) ;_ Désactive l'affichage à l'écran --> mettre à 1 (setvar "attreq" 0) ;_ Définit les attributs des blocs par défaut (setq os_courant (getvar "osmode")) ;_ Enregistre l'accrochage aux objets courant dans os_courant (setvar "osmode" 0) ;_ Désactive l'accrochage aux objets (setq bloc_insere nil) (setq ptd (getpoint "\nEntrer le point de départ : ")) ;_ Défini le point de départ par l'utilisateur (setq pt1 (polar ptd 0 0)) ;_ Défini le point 1 en fonction du point de départ (setq pt2 (polar ptd 0 9.5)) ;_ Défini le point 2 en fonction du point de départ (setq pt3 (polar ptd 0 19)) ;_ Défini le point 3 en fonction du point de départ (setq pt4 (polar ptd 0 28.5)) ;_ Défini le point 4 en fonction du point de départ (setq pt5 (polar ptd 0 38)) ;_ Défini le point 5 en fonction du point de départ (setq pt6 (polar ptd 0 47.5)) ;_ Défini le point 6 en fonction du point de départ (setq pt7 (polar ptd 0 57)) ;_ Défini le point 7 en fonction du point de départ (setq pt8 (polar ptd 0 66.5)) ;_ Défini le point 8 en fonction du point de départ (setq sel_bloc (ssget (list (cons 0 "insert")))) ;_ Sélectionne les blocs et les mets dans la variable sel_bloc (setq compteur -1) ;_ Initialise le compteur à -1 (car indexation dans un jeu de sélection commence à 0) (repeat (sslength sel_bloc) ;_ Répète la boucle autant de fois qu'il y'a de blocs (setq nom_bloc (cdr (assoc 2 (entget (ssname sel_bloc (setq compteur (+ compteur 1))))))) ;_ Met dans la variable nom_bloc le bloc courant et l'enlève du jeu de sélection sel_bloc (setq selection (ssget "_X" (list (cons 2 nom_bloc)))) (setq en (ssname selection 0)) (if (member nom_bloc bloc_insere) (princ (strcat "\nBloc déjà inséré")) (progn (setq bloc_insere (cons nom_bloc bloc_insere)) (setq enlist(entget en)) ;_ Récupère le groupe de codes DXF (setq blocType(cdr(assoc 0 enlist))) ;_ Enregistre le type d'entité (if (= blocType "INSERT")(progn ;_ Si le Type d'entité est une entité "Insert" (if(= (cdr(assoc 66 enlist)) 1)(progn ;_ --> See if the attribute flag equals one (if so, attributes follow) (setq en2(entnext en)) ;_ Récupère la prochaine sous-entité (setq enlist2(entget en2)) ;_ Récupère le groupe de codes DXF (while (/= (cdr(assoc 0 enlist2)) "SEQEND") ;_ --> Start the while loop and keep ;- looping until SEQEND is found. (if (= (cdr(assoc 2 enlist2)) "DESIGNATION")(setq designation (cdr(assoc 1 enlist2)))) ;_ Si l'étiquette de l'attribut est "DESIGNATION", mettre la valeur de cet attribut dans la variable "designation" (if (= (cdr(assoc 2 enlist2)) "CATEGORIE")(setq categorie (cdr(assoc 1 enlist2)))) ;_ Si l'étiquette de l'attribut est "CATEGORIE", mettre la valeur de cet attribut dans la variable "categorie" (if (= (cdr(assoc 2 enlist2)) "QUANTITE")(setq quantite (cdr(assoc 1 enlist2)))) ;_ Si l'étiquette de l'attribut est "QUANTITE", mettre la valeur de cet attribut dans la variable "quantite" (setq en2(entnext en2)) ;_ Récupère la prochaine sous-entité (setq enlist2(entget en2)) ;_ Récupère le groupe de codes DXF ) )) )) (princ (strcat "\nNom du bloc ----> " nom_bloc "")) (princ (strcat "\nCatégorie ----> " categorie "")) (princ (strcat "\nDésignation ----> " designation "")) (princ "\n ") (progn (if (and (= categorie "ECLAIRAGE")(/= (substr nom_bloc 1 1) "5"))(progn (command "_insert" nom_bloc pt1 "1" "1" "0") (command "changer" "d" "" "pr" "cal" "- ETCO - Luminaires -" "") (command "_insert" "*Cadre luminaire simple" pt1 "" "") (command "-style" "Romans" "romans.shx" "0.1" "1" "0" "" "" "") (command "texte" "j" "mg" (polar pt1 0 1.35) "0" designation) (setq pt1 (polar pt1 (* 3 (/ pi 2)) 0.4)) )) (if (and (= categorie "ECLAIRAGE")(= (substr nom_bloc 1 1) "5"))(progn (setq pt1 (polar pt1 (* 3 (/ pi 2)) 0.2)) (command "_insert" nom_bloc pt1 "1" "1" "0") (command "changer" "d" "" "pr" "cal" "- ETCO - Luminaires -" "") (command "_insert" "*Cadre luminaire double" pt1 "" "") (command "-style" "Romans" "romans.shx" "0.1" "1" "0" "" "" "") (command "texte" "j" "mg" (polar pt1 0 1.35) "0" designation) (setq pt1 (polar pt1 (* 3 (/ pi 2)) 0.6)) )) (if (= categorie "COMMANDE")(progn (command "_insert" nom_bloc pt2 "1" "1" "0") (command "changer" "d" "" "pr" "cal" "- ETCO - Courants forts -" "") (command "_insert" "*Cadre simple" pt2 "" "") (command "-style" "Romans" "romans.shx" "0.1" "1" "0" "" "" "") (command "texte" "j" "mg" (polar pt2 0 0.95) "0" designation) (setq pt2 (polar pt2 (* 3 (/ pi 2)) 0.4)) )) (if (= categorie "COURANT FORT")(progn (command "_insert" nom_bloc pt3 "1" "1" "0") (command "changer" "d" "" "pr" "cal" "- ETCO - Courants Forts -" "") (command "_insert" "*Cadre simple" pt3 "" "") (command "-style" "Romans" "romans.shx" "0.1" "1" "0" "" "" "") (command "texte" "j" "mg" (polar pt3 0 0.95) "0" designation) (setq pt3 (polar pt3 (* 3 (/ pi 2)) 0.4)) )) (if (= categorie "COURANT FAIBLE")(progn (command "_insert" nom_bloc pt4 "1" "1" "0") (command "changer" "d" "" "pr" "cal" "- ETCO - Courants Faibles -" "") (command "_insert" "*Cadre simple" pt4 "" "") (command "-style" "Romans" "romans.shx" "0.1" "1" "0" "" "" "") (command "texte" "j" "mg" (polar pt4 0 0.95) "0" designation) (setq pt4 (polar pt4 (* 3 (/ pi 2)) 0.4)) )) (if (= categorie "ECLAIRAGE DE SECURITE")(progn (command "_insert" nom_bloc pt5 "1" "1" "0") (command "changer" "d" "" "pr" "cal" "- ETCO - Eclairage de sécurité -" "") (command "_insert" "*Cadre simple" pt5 "" "") (command "-style" "Romans" "romans.shx" "0.1" "1" "0" "" "" "") (command "texte" "j" "mg" (polar pt5 0 0.95) "0" designation) (setq pt5 (polar pt5 (* 3 (/ pi 2)) 0.4)) )) (if (= categorie "ALARME INCENDIE")(progn (command "_insert" nom_bloc pt6 "1" "1" "0") (command "changer" "d" "" "pr" "cal" "- ETCO - Détection incendie -" "") (command "_insert" "*Cadre simple" pt6 "" "") (command "-style" "Romans" "romans.shx" "0.1" "1" "0" "" "" "") (command "texte" "j" "mg" (polar pt6 0 0.95) "0" designation) (setq pt6 (polar pt6 (* 3 (/ pi 2)) 0.4)) )) (if (and(/= categorie "ECLAIRAGE") (/= categorie "COMMANDE") (/= categorie "COURANT FORT") (/= categorie "COURANT FAIBLE") (/= categorie "ECLAIRAGE DE SECURITE") (/= categorie "ALARME INCENDIE") )(progn (command "_insert" nom_bloc pt8 "1" "1" "0") (command "changer" "d" "" "pr" "cal" "- ETCO - Remarques -" "") (command "_insert" "*Cadre simple" pt8 "" "") (command "-style" "Romans" "romans.shx" "0.1" "1" "0" "" "" "") (command "texte" "j" "mg" (polar pt8 0 0.95) "0" designation) (setq pt8 (polar pt8 (* 3 (/ pi 2)) 0.4)) )) ) ) )) ) ;_ Fin de la boucle (setvar "osmode" os_courant) ;_ Redéfinit l'accrochage aux objets courant ) Encore une fois, merci à tous ceux qui m'ont aidés.
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