Aller au contenu

Débuggage lisp légende automatique


Ptitony72

Messages recommandés

Un ancien collègue a créé un lisp afin de faire une légende automatique à partir des blocs insérés sur nos plans (en utilisant les attributs je crois) et ce lisp bug depuis peu. Ne connaissant pas grand chose à ce système de programation (je m'y mets petit à petit mais pas facile), je fais appel à vous pour me dire d'ou peut venir ce bug.

 

Le problème est que lorsque je n'ai que peu de blocs sur un plan, le lisp ne les voient pas tous (j'ai fais un essai avec 7 blocs différents et il en met que 4 dans la légende)

 

Voici le lisp en question :

(defun c:legende ()

(prompt "\nVersion du 21-10-06")

(command "inserer" "Calque=" "0,0" "" "" "" ) ;_ Insertion des calques

(setvar "clayer" "0") ;_ Défini le calque "0" courant

(setvar "cmdecho" 0) ;_ Désactive l'affichage à l'écran

 

 

(setq sad (SSGET "X" (list (cons 0 "insert") (cons 2 "1"))) )

(setq chrono 0) ;_ Met le chrono à zéro

(if (/= sad nil)

(progn

(setq ead (ssname sad chrono))

(while

(/= ead nil)

(prompt "\nBloc n° ")

(princ (+ chrono 1))

(command "decompos" ead )

(setq chrono (+ chrono 1))

(setq ead (ssname sad chrono))

)

)

)

 

 

(command "purger" "bl" "*" "n") ;_ Purge les blocs inutilisés

(setq os (getvar "osmode"))

(setvar "osmode" 0)

(setq pd (getpoint "\nEntrer le point de départ : "))

(setq p1 (polar pd 0 0))

(setq p2 (polar pd 0 9.5))

(setq p3 (polar pd 0 19))

(setq p4 (polar pd 0 28.5))

(setq p5 (polar pd 0 38))

(setq p6 (polar pd 0 47.5))

(setq p7 (polar pd 0 57))

(setq p8 (polar pd 0 66.5))

 

(setq s_bloc (ssget (list (cons 0 "insert"))))

(setq ch1 0)

(setq n_bloc (ssname s_bloc ch1))

 

(while (/= n_bloc nil)

(setq b_name (cdr (assoc 2 (entget n_bloc))) )

(setq test (ssget "x" (list (cons 2 b_name))))

(if (/= test nil) (setq nbre (sslength test)) )

(if (and (/= n_bloc nil) (/= test nil)) (search_des))

(if (and (/= test nil) (/= LIBELLE nil) (/= CATEGOR nil)) (progn

 

(setvar "attreq" 0)

 

(if (and (/= (substr (cdr (assoc 2 (entget n_bloc))) 1 1) "5") (= CATEGOR "ECLAIRAGE")) (progn

(command "inserer" (cdr (assoc 2 (entget n_bloc))) (setq p1 (polar p1 (* 3 (/ pi 2)) 0.4)) "1" "1" "0")

(command "changer" "d" "" "pr" "cal" "- ETCO - Luminaires -" "")

(command "inserer" "*Cadre luminaire simple" p1 "" "")

(command "-style" "ROMANS" "romans.shx" "0.1" "1" "0" "" "" "")

(command "texte" "j" "mg" (polar p1 0 1.2) "0" libelle)

)

)

 

(if (and (= (substr (cdr (assoc 2 (entget n_bloc))) 1 1) "5") (= CATEGOR "ECLAIRAGE")) (progn

(command "inserer" (cdr (assoc 2 (entget n_bloc))) (setq p1 (polar p1 (* 3 (/ pi 2)) 0.6)) "1" "1" "0")

(command "changer" "d" "" "pr" "cal" "- ETCO - Luminaires -" "")

(command "inserer" "*Cadre luminaire double" p1 "" "")

(command "-style" "ROMANS" "romans.shx" "0.1" "1" "0" "" "" "")

(command "texte" "j" "mg" (polar p1 0 1.2) "0" libelle)

(setq p1 (polar p1 (* 3 (/ pi 2)) 0.2))

)

)

 

(if (or (= CATEGOR "COMMANDE") (= CATEGOR "COMANDE")) (progn

(command "inserer" (cdr (assoc 2 (entget n_bloc))) (setq p2 (polar p2 (* 3 (/ pi 2)) 0.4)) "1" "1" "0")

(command "changer" "d" "" "pr" "cal" "- ETCO - Courants forts -" "")

(command "inserer" "*Cadre simple" p2 "" "")

(command "-style" "ROMANS" "romans.shx" "0.1" "1" "0" "" "" "")

(command "texte" "j" "mg" (polar p2 0 0.8) "0" libelle)

)

)

(if (= CATEGOR "ECLAIRAGE DE SECURITE") (progn

(command "inserer" (cdr (assoc 2 (entget n_bloc))) (setq p3 (polar p3 (* 3 (/ pi 2)) 0.4)) "1" "1" "0")

(command "changer" "d" "" "pr" "cal" "- ETCO - Eclairage de sécurité -" "")

(command "inserer" "*Cadre simple" p3 "" "")

(command "-style" "ROMANS" "romans.shx" "0.1" "1" "0" "" "" "")

(command "texte" "j" "mg" (polar p3 0 0.8) "0" libelle)

)

)

(if (= CATEGOR "APPAREILLAGE") (progn

(command "inserer" (cdr (assoc 2 (entget n_bloc))) (setq p4 (polar p4 (* 3 (/ pi 2)) 0.4)) "1" "1" "0")

(command "changer" "d" "" "pr" "cal" "- ETCO - Courants forts -" "")

(command "inserer" "*Cadre simple" p4 "" "")

(command "-style" "ROMANS" "romans.shx" "0.1" "1" "0" "" "" "")

(command "texte" "j" "mg" (polar p4 0 0.8) "0" libelle)

)

)

(if (= CATEGOR "COURANT FAIBLE") (progn

(command "inserer" (cdr (assoc 2 (entget n_bloc))) (setq p5 (polar p5 (* 3 (/ pi 2)) 0.4)) "1" "1" "0")

(command "changer" "d" "" "pr" "cal" "- ETCO - Courants faibles -" "")

(command "inserer" "*Cadre simple" p5 "" "")

(command "-style" "ROMANS" "romans.shx" "0.1" "1" "0" "" "" "")

(command "texte" "j" "mg" (polar p5 0 0.8) "0" libelle)

)

)

(if (= CATEGOR "APPEL MALADE") (progn

(command "inserer" (cdr (assoc 2 (entget n_bloc))) (setq p6 (polar p6 (* 3 (/ pi 2)) 0.4)) "1" "1" "0")

(command "changer" "d" "" "pr" "cal" "- ETCO - Courants faibles -" "")

(command "inserer" "*Cadre simple" p6 "" "")

(command "-style" "ROMANS" "romans.shx" "0.1" "1" "0" "" "" "")

(command "texte" "j" "mg" (polar p6 0 0.8) "0" libelle)

)

)

(if (= CATEGOR "ALARME INCENDIE") (progn

(command "inserer" (cdr (assoc 2 (entget n_bloc))) (setq p7 (polar p7 (* 3 (/ pi 2)) 0.4)) "1" "1" "0")

(command "changer" "d" "" "pr" "cal" "- ETCO - Détection incendie -" "")

(command "inserer" "*Cadre simple" p7 "" "")

(command "-style" "ROMANS" "romans.shx" "0.1" "1" "0" "" "" "")

(command "texte" "j" "mg" (polar p7 0 0.8) "0" libelle)

)

)

(if (= CATEGOR "CONTROLE ACCES") (progn

(command "inserer" (cdr (assoc 2 (entget n_bloc))) (setq p8 (polar p8 (* 3 (/ pi 2)) 0.4)) "1" "1" "0")

(command "changer" "d" "" "pr" "cal" "- ETCO - Courants faibles -" "")

(command "inserer" "*Cadre simple" p8 "" "")

(command "-style" "ROMANS" "romans.shx" "0.1" "1" "0" "" "" "")

(command "texte" "j" "mg" (polar p8 0 0.8) "0" libelle)

)

)

 

(setvar "attreq" 1)

)

)

 

 

(setq s_b (ssget "x" (list (cons 2 b_name))))

(setq ch2 0)

(setq e_b (ssname s_b ch2))

(while (/= e_b nil)

(ssdel e_b s_bloc)

(setq ch2 (+ ch2 1) )

(setq e_b (ssname s_b ch2))

)

 

(setq ch1 (+ ch1 1))

(setq n_bloc (ssname s_bloc ch1))

)

 

(command "inserer" "Chemin de câbles" (setq p4 (polar p4 (* 3 (/ pi 2)) 0.4)) "1" "1" "0")

(setvar "osmode" os)

(command "purger" "to" "*" "n")

)

 

 

(defun search_des ()

(setq libelle nil)

(setq categor nil)

; (setq test (car (entsel)))

(setq test (ssname test 0))

(while (or (= libelle nil) (= categor nil))

; (prompt "\n- -")

; (princ (cdr (assoc 2 (entget test))))

(if (= (cdr (assoc 2 (entget test))) "CATEGORIE") (setq CATEGOR (cdr (assoc 1 (entget test)))))

(if (= (cdr (assoc 2 (entget test))) "DESIGNATION") (setq LIBELLE (cdr (assoc 1 (entget test)))))

(setq test (entnext test))

)

(prompt "\nLib -->")

(princ LIBELLE)

(prompt "\nCategorie --> ")

(princ categor)

(prompt "\nQuantité --> ")

(princ nbre)

)

 

Si vous voulez les fichiers utilisés par le lisp pour faire des essais(les cadres et le ficier calques), envoyez moi un MP et je vous les enverais.

 

Merci d'avance.

Lien vers le commentaire
Partager sur d’autres sites

Comme c'est marqué à coté, je suis ceinture blanche (et pas que sur le forum). Je voudrais donc savoir ce que tu entends par "'internationaliser les commandes" ? Passer toutes les commandes en anglais ?

 

Pour ce qui est de l'exemple de légende, je suis en train d'y regarder. Il marche très bien avec les blocs joints mais pas avec les miens, faut que je regarde pourquoi.

Lien vers le commentaire
Partager sur d’autres sites

Passer toutes les commandes en anglais ?

Oui, ainsi que les paramètres des commandes.

 

je suis ceinture blanche

Ce n'est qu'une histoire de bavardage. Certaines ceintures qui ne sont pas de couleur noire sont d'un très bon niveau.

 

@+

Les Lisps de Patrick

Le 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

Je suis en train d'essayer le script par morceaux et j'ai trouvé un problème. Lorsque j'exécute :

 

(defun c:legende ()

 

 

(Princ "Version 08/06/07")

(command "_insert" "Calque=" "0,0" "" "" "" )

(setvar "clayer" "0")

(setvar "cmdecho" 0)

 

(setq sad (SSGET "X" (list (cons 0 "insert") (cons 2 "1"))) )

)

 

j'ai l'erreur "Trop d'objets sélectionnés pour INTERSECT" qui apparait. J'ai donc recherché à quoi correspondait ce "INTERSET" et je me suis rendu compte que ca buggait avec les blocs qui sont supperposés.

 

Je m'y connais pas encore assez pour savoir comment régler ce problème, donc si quelqu'un voit une solution pour régler ce problème (que j'espere unique), je suis prenneur.

 

Ps : pour ce qui est de ta légende Patrick_35, elle est bien faite mais pas adaptée à l'utilisation que j'en ai.

 

Merci d'avance.

 

[EDIT] : En passant, vous pouvez m'expliquer cette ligne : (setq sad (SSGET "X" (list (cons 0 "insert") (cons 2 "1"))) ) . J'ai pas tout compris dedans.

 

[Edité le 22/6/2007 par Ptitony72]

Lien vers le commentaire
Partager sur d’autres sites

j'ai l'erreur "Trop d'objets sélectionnés pour INTERSECT"

Je ne comprends pas, et à la lecture de la partie du code, je ne vois pas

Le plus simple est que tu mettes à disposition un exemple avec ton lisp afin que l'on puisse regarder

 

Ps : pour ce qui est de ta légende Patrick_35, elle est bien faite mais pas adaptée à l'utilisation que j'en ai.

Elle est proposé pour ceux qui veulent. Après chacun fait ce qu'il veut ;)

 

(setq sad (SSGET "X" (list (cons 0 "insert") (cons 2 "1"))) )

Le setq, je pense que tu connais

Un ssget "x" sert à faire la sélection dans tout le dessin, ensuite tu peux ajouter des filtres et le tien ne sélectionne que les blocs (cons 0 "INSERT") et qui se nomment 1 (cons 2 "1")

Pour connaire l'origine des chiffres (dans le cas présent, le 0 et le 2), regarde dans l'aide sur les codes dxf

 

@+

Les Lisps de Patrick

Le 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

Merci pour cette petite explication patrick.

 

Une autre petite question :

 

(setq sel_bloc (ssget (list (cons 0 "insert"))))

 

Que contient la variable sel_bloc dans ce cas? une liste des noms des blocs nan? si ce n'est pas le cas, comment je peux obtenir une liste contenant tous les noms des blocs a partir d'une sélection?

 

Le plus simple est que tu mettes à disposition un exemple avec ton lisp afin que l'on puisse regarder

Ou puis-je héberger le fichier zip contenant des symboles et un exemple de légende?

Lien vers le commentaire
Partager sur d’autres sites

Une autre petite question :

 

Pour inserer le premier bloc de ma liste au point X=0 Y=0, je dois mettre quoi dans la ligne :

(setq nom_bloc ...)

pour cette partie de lisp :

(setq sel_bloc (ssget (list (cons 0 "insert"))))

(while

(/= sel_bloc nil)

(setq nom_bloc ...)

(command "_insert" (getvar "nom_bloc") "0,0" "1" "1" "0")

(setq sel_bloc (cdr sel_bloc))

)

 

Le fonctionnement de cette parite :

;_ Sélectionne les blocs et les mets dans la variable sel_bloc

;_ Ouvre la boucle "tant que sel_bloc n'est pas nul"

;_ Extrait le nom du premier bloc de la liste

;_ Insert ce bloc au point X=0 Y=0

;_ Enlève ce bloc de la liste sel_bloc

 

Sinon je repose ma question, la variable sel_bloc contient quoi?

 

Merci de me répondre, je nage dans le brouillard là.

Lien vers le commentaire
Partager sur d’autres sites

Salut

 

(setq sel_bloc (ssget (list (cons 0 "insert"))))
(setq n -1)
(repeat (sslength sel_bloc)
(setq nom_bloc (cdr (assoc 2 (entget (ssname sel_bloc (setq n (1+ n)))))))
(print nom_bloc)
)

 

Sel_bloc contient un JEU DE SELECTION

On initialise un compteur (ici -1 car indexation dans un jeu de sélection commence à 0)

On répète pour le nombre d'élément contenu dans le jeu de sélection.

-------- On récupère le nom du bloc, en extrayant les données DXF (entget) du nom de l'entité

-------- (ssname) extrait du jeu de sélection par incrémentation du compteur (1+)

 

--------- avec le nom du bloc, tu fais ce que tu veux (ici j'ai fait un (print))

 

On termine la boucle de répétition.

 

 

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

J'ai mis du temps à comprendre le lisp mais c'est exactement ce que je voulais.

Je repasserais un peu plus tard car un autre problème va se poser à moi mais j'essais d'avancer un peu avant de vous l'exposer.

 

Merci bonuscad.

 

[Edit] : Me revoila bloqué.

 

Tous mes blocs ont un attribut désignation et je voudrais mettre la valeur de cet attribut dans la variable DESIGNATION pour l'exploiter après. Je ne trouve rien sur les attributs alors si quelqu'un veut bien m'écrire ces quelques lignes pour me débloquer, ça serait cool ;)

 

Histoire de compliquer (quoique, je sais pas si ca complique), je veux insérer ces lignes dans la boucle du repeat afin d'avoir la désignation du bloc courant.

 

Merci d'avance.

 

[Edité le 6/7/2007 par Ptitony72]

Lien vers le commentaire
Partager sur d’autres sites

Encore une autre question. La-dedans :

 

(defun c:legende ()

(princ "Version 08/06/07")

(command "_insert" "Calque=" "0,0" "" "" "" )

(setvar "clayer" "0")

(setvar "cmdecho" 0)

(setvar "attreq" 0)

(setq os_courant (getvar "osmode"))

(setvar "osmode" 0)

 

 

(setq ptd (getpoint "\nEntrer le point de départ : "))

(setq pt1 (polar ptd 0 0))

(setq pt2 (polar ptd 0 9.5))

(setq pt3 (polar ptd 0 19))

(setq pt4 (polar ptd 0 28.5))

(setq pt5 (polar ptd 0 38))

(setq pt6 (polar ptd 0 47.5))

(setq pt7 (polar ptd 0 57))

(setq pt8 (polar ptd 0 66.5))

 

 

(setq sel_bloc (ssget (list (cons 0 "insert"))))

(setq compteur -1)

 

(repeat (sslength sel_bloc)

(setq nom_bloc (cdr (assoc 2 (entget (ssname sel_bloc (setq compteur (+ compteur 1)))))))(print nom_bloc)

(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))

)

)

 

 

(setvar "osmode" os_courant))

(alert "Légende terminée !")

)

 

le message d'alerte "Légende terminée !" s'affiche quand? A la fin nan? Si oui, voyez vous une raison pour qu'il s'affiche au début de mon lisp?

Lien vers le commentaire
Partager sur d’autres sites

Si oui, voyez vous une raison pour qu'il s'affiche au début de mon lisp?

 

Tu as une parenthèse en trop à l'avant dernière ligne

(setvar "osmode" os_courant) )

 

et pour finir proprement sans écho tu peux rajouter un (prin1) après ta ligne (alert "blabla")

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

Bien vu Bonuscad. J'ai cherché tout l'après midi sans rien trouver :s

 

Sinon, vous connaissez pas un sujet où la gestion des attributs dans un lisp est bien expliquée? J'arrive pas a trouver quelque chose qui puisse règler mon problème des sujets précédents.

 

Et encore, merci pour tout Bonuscad.

Lien vers le commentaire
Partager sur d’autres sites

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité