grosseel Posté(e) le 27 septembre 2005 Posté(e) le 27 septembre 2005 Bonjour à tous, Je viens de trouver cette routine sur le net mais je n'arrive pas à l'adapter à mes besoins et selon mes applications déja existante (je travaille avec différents Lisp qui me permettent de passer d'un calque à un autre - Un calque = un folio). Le probléme est que la routine détruit bien ma nomenclature puis il géle ou libére le calque voulue puis elle plante. -> erreur: type d'argument incorrect: lselsetp nil Please, j'au besoin d'aide. ;; ------------------------------------------------------------------------------------------------------------------------ ;; Fonction pour Création de la nomenclature (defun c:NMC_FOL (/) (if (not V_NMC_FOL) (progn (prompt (strcat "\n - Nomenclature automatique -\n" ) ) (setq V_NMC_FOL "") ) ) ;; Destruction de l'ancienne nomenclature ;; initialisation des paramètres utiles au traitement (af "001") (setq FOL_DEP (getvar "clayer") FOL_NMC (getvar "clayer") V_ATTDIA (getvar "attdia") V_CMDECHO (getvar "cmdecho") i1 0 SEL (ssadd) ) (setvar "regenmode" 0) (setvar "attdia" 0) (setvar "attreq" 1) (setvar "cmdecho" 0) (setq FLC (atoi (getvar "clayer"))) ;; destruction de l'ancienne nomenclature (setq LST (list (cons -4 "and>"))) (setq LST (cons (cons 0 "insert") LST)) (setq LST (cons (cons -4 "or>") LST)) (setq LST (cons (cons 2 "REC_FOL") LST)) (setq LST (cons (cons 2 "GR_FOL") LST)) (setq LST (cons (cons -4 " (setq LST (cons (cons -4 " (setq SEL (ssget "X" LST)) (if SEL (progn (repeat (sslength SEL) (entdel (ssname SEL i1)) (setq i1 (1+ i1)) ) ) ) ;; Remplissage automatique de la nomenclature des folios ;; sélection dans la base de donnée de tous les blocs "CARTO" (setq SEL (ssget "X" (list (cons 0 "insert") (cons 2 "CARTO") ;; (cons 2 "FDP01") ) ) ) ;; sélection dans la base de donnée de tous les blocs "IND_FOL" (setq JS2 (ssget "X" (list (cons 0 "insert") (cons 2 "IND_FOL") ) ) ) ;; transfert de "JS2" dans "SEL" (setq I1 (sslength js2)) (while (/= 0 I1) (setq I1 (- I1 1)) (ssadd (ssname JS2 I1) SEL) ) ;; balayage du tableau "layer" (tblnext "layer" T) (while (setq NFOL (cdadr (tblnext "layer"))) (progn ;; initialisation par défaut du commentaire à insérer dans la nomencl. (setq REPF " " STLF " " IND " " ) ;; recherche du cartouche par balayage du jeu de sélection (setq LONG (sslength SEL)) (while (/= 0 LONG) (progn (setq NBLOC (ssname SEL (- LONG 1)) NPLAN (cdr (assoc 8 (entget NBLOC))) X1 "" ) ;; si cartouche existant alors mémorisation des divers ;; renseignement (if (EQUAL NFOL NPLAN) (progn (setq NATTR (entnext NBLOC)) (while (/= "SEQEND" (cdr (assoc 0 (setq LATTR (entget NATTR))))) (progn (if (= (strcat "REP_FONC") (cdr (assoc 2 LATTR))) (setq REPF (cdr (assoc 1 LATTR))) ) (if (= "" REPF) (setq REPF " ") ) (if (= (strcat "STYLE_FOL") (cdr (assoc 2 LATTR))) (setq STLF (cdr (assoc 1 LATTR))) ) (if (= (strcat "IND") (cdr (assoc 2 LATTR))) (progn (setq X1 (cdr (assoc 1 LATTR))) (if (> X1 IND) (setq IND X1)) ) ) (if (= "" IND) (setq IND "") ) (ssdel NBLOC SEL) ) (setq NATTR (entnext NATTR)) ) ) ) ) (setq LONG (- LONG 1)) ) ;; procédure de calcul des coordonnées de la position d'insertion du bloc (setq OPI1 (distof NFOL)) (if OPI1 (progn (setq OPI2 (* (- (/ OPI1 52) (setq OPI3 (float (fix (/ OPI1 52)))) ) 52 ) ) (setq OPI4 (* (- (/ OPI3 2) (float (fix (/ OPI3 2))) ) 2 ) ) (if (= 1 OPI4) (setq X 200) (setq X 15)) (setq Y (- 260 (* 5 OPI2))) (setq COORD (list X Y)) ;; calcul du folio d'insertion (if (> (+ (atoi NFOL) 1) (* 104 (+ (- FLC (atoi FOL_DEP)) 1)) ) (progn (setq FOL_NMC (itoa (+ (atoi FOL_DEP) (/ (atoi NFOL) 104)))) (if (/= (itoa FLC) FOL_NMC) (progn (setq FLC (atoi FOL_NMC)) (command "_insert" "W:\\TECHNIQUE\\AUTOCAD\\Symboles DAO 2003\\Aide\\GR_FOL" (list 0 0) "" "" "" ) ;; récupération du bloc gr_fol inséré (setq N_ENT8 (entlast) L_ATT8 (entget N_ENT8) ) (setq L_ATT8 (subst (cons 8 FOL_NMC) (assoc 8 L_ATT8) L_ATT8 ) ) (entmod L_ATT8) (entupd N_ENT8) ) ) ) ) (if (= nfol "1") (command "_insert" "W:\\TECHNIQUE\\AUTOCAD\\Symboles DAO 2003\\Aide\\GR_FOL" (list 0 0) "" "" "" "_insert" "W:\\TECHNIQUE\\AUTOCAD\\Symboles DAO 2003\\Aide\\REC_FOL" (list 15 260) "" "" "" "0" ind "PDG" "PAGE DE GARDE" " " ) ) (command "_insert" "W:\\TECHNIQUE\\AUTOCAD\\Symboles DAO 2003\\Aide\\REC_FOL" COORD "" "" "" nfol ind repf stlf " ") ;; récupération du bloc gr_fol inséré (setq N_ENT8 (entlast)) (setq L_ATT8 (entget N_ENT8)) (setq L_ATT8 (subst (cons 8 FOL_NMC) (assoc 8 L_ATT8) L_ATT8 ) ) (entmod L_ATT8) (entupd N_ENT8) ) ) ) ) (setvar "attdia" V_ATTDIA) (setvar "cmdecho" V_CMDECHO) (setvar "regenmode" 1) (prin1) ) ;; ------------------------------------------------------------------------------------------------------------------------ ;; Fonction pour Destruction de l'ancienne nomenclature (defun AF (FOLIO / FLC OPT) (setq FLC (getvar "clayer")) (if (/= NIL FOLIO) (SETQ FOLIO (STRCASE FOLIO)) ) (setq OPT "_thaw") (if (/= FLC FOLIO) (progn (if (= FOLIO "000") (setq OPT "_F")) (command "_-layer" "_thaw" FOLIO "_set" FOLIO "_F" FLC OPT "000" "_thaw" "0" "" ) ) ) (princ) )
zebulon_ Posté(e) le 27 septembre 2005 Posté(e) le 27 septembre 2005 ça m'a l'air vachement compliqué... et douteux. (setq LST (list (cons -4 "and>")))(setq LST (cons (cons 0 "insert") LST))(setq LST (cons (cons -4 "or>") LST))(setq LST (cons (cons 2 "REC_FOL") LST))(setq LST (cons (cons 2 "GR_FOL") LST))(setq LST (cons (cons -4 "(setq LST (cons (cons -4 "(setq SEL (ssget "X" LST))(if SEL(progn(repeat (sslength SEL)(entdel (ssname SEL i1))(setq i1 (1+ i1))) On aurait envie de remplacer par quelque chose comme : (setq SEL (ssget "_X" '( (0 . "INSERT") (-4 . " c'est censé être un (-4 . " suivi d'un signe inférieur, suivi d'un or, suivi d'un guillement et d'une parenthèse, mais ça ne s'affiche pas (2 . "REC_FOL") (2 . "GR_FOL") (-4 . "or>") ) ) ) (if SEL (progn (repeat (sslength SEL) (entdel (ssname SEL i1)) (setq i1 (1+ i1)) Bon moi j'aurais mis une simple commande _erase, plutôt que entdel dans une boucle while, mais ça ne fait pas très LISP et je vais me faire taper sur les doigts par les puristes. Plus loin,c'est pareil (setq SEL(ssget "X"(list(cons 0 "insert")(cons 2 "CARTO");; (cons 2 "FDP01")))) pourrait donner (setq SEL (ssget "_X" '((0 . "INSERT") (2 . "CARTO")) ) etc ... Commence déjà par simplifier le code pour y voir plus clair. Amicalement Zebulon_ C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
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