Aller au contenu

besoin de vos conseils pour un lisp


Messages recommandés

Posté(e)

Bonjour à tous,

Je travail actuellement sur un grand projet ou les plans on été retouché par beaucoup de personne différente pour qui l'expression "chartre graphique" ne veut pas dire grand chose...

Bref, je me retrouve avec des plans A3 disposant d'un cartouche qui est un bloc avec des attributs. Hélas ce "bloc cartouche" suivant les plans que j'ouvre n'a pas le même nom. Un coup il s'appelle u0gba030 et sur d'autre plans il s'appelle X-U0GBA030-A01 alors qu'il s'agit du même bloc. Pour le bloc cartouche de la page de garde j'ai le même problème c'est a dire que sois il s'appelle u0gba007 sois il s'appelle X-u0gba007-A01 alors qu'ils ont les même caractéristique.

Dans ce bloc cartouche je dois récupérer la valeur de 2 attributs (attribut "numéro du plan" et "numéro du folio") et en faire la concaténation suivante vers un 3ème attribut:

"numéro du plan"_F"numero du folio"

J'ai donc crée le lisp suivant mais je n'en suis pas très satisfait. En effet je suis obligé de taper A1 puis A2 puis A3 puis A4 pour être sur d'avoir appliquer le lisp au bon nom du bloc cartouche se qui est fastidieux. En plus je me dis que cela dois être possible mais je ne sais pas s'il vaut mieux utilisé la commande "if" ou "cond".

 

(defun c:A1 (/ ss1 bb1 vv1 bn1 s11 dd11 dd21 dd31 dd41 dd51 dd61 s21 new ent ancliste conliste nouvliste)
(setq ss1 (ssget "_X" '((0 . "TEXT,MTEXT,DIMENSION,INSERT") (2 . "X-u0gba007-A01"))))
(setq bb1 (ssname ss1 0))
(setq vv1 (entnext bb1))
(setq bn1 (entget vv1))
(setq s11 (cdr (assoc '1 bn1)))
(setq dd11 (entnext vv1))
(setq dd21 (entnext dd11))
(setq dd31 (entnext dd21))
(setq dd41 (entnext dd31))
(setq dd51 (entnext dd41))
(setq dd61 (entnext dd51))
(setq ent (entget dd61))
(setq s21 (cdr (assoc '1 (entget dd61))))
(setq new (strcat s11 "_F001"))
(command "zoom" "objet" dd61 "")
(setq ancliste (assoc 1 ent))
(setq conliste (cons (car ancliste) new))
(setq nouvliste (subst conliste ancliste ent))
(entmod nouvliste)
)
(defun c:A2 (/ ss bb vv bn s1 dd1 dd2 s2 new dd3 ent ancliste conliste nouvliste)
(setq ss (ssget "_X" '((0 . "TEXT,MTEXT,DIMENSION,INSERT") (2 . "u0gba030"))))
(setq bb (ssname ss 0))
(setq vv (entnext bb))
(setq bn (entget vv))
(setq s1 (cdr (assoc '1 bn)))
(setq dd1 (entnext vv))
(setq dd2 (entnext dd1))
(setq s2 (cdr (assoc '1 (entget dd2))))
(setq new (strcat s1 "_F" s2))
(setq dd3 (entnext dd2))
(setq ent (entget dd3))
(command "zoom" "objet" dd3 "")
(setq ancliste (assoc 1 ent))
(setq conliste (cons (car ancliste) new))
(setq nouvliste (subst conliste ancliste ent))
(entmod nouvliste)
)
(defun c:A3 (/ ss2 bb2 vv2 bn2 s12 ddd11 ddd21 ddd31 ddd41 ddd51 ddd61 s21 new ent ancliste conliste nouvliste)
(setq ss2 (ssget "_X" '((0 . "TEXT,MTEXT,DIMENSION,INSERT") (2 . "u0gba007"))))
(setq bb2 (ssname ss2 0))
(setq vv2 (entnext bb2))
(setq bn2 (entget vv2))
(setq s12 (cdr (assoc '1 bn2)))
(setq ddd11 (entnext vv2))
(setq ddd21 (entnext ddd11))
(setq ddd31 (entnext ddd21))
(setq ddd41 (entnext ddd31))
(setq ddd51 (entnext ddd41))
(setq ddd61 (entnext ddd51))
(setq ent (entget ddd61))
(setq s21 (cdr (assoc '1 (entget ddd61))))
(setq new (strcat s12 "_F001"))
(command "zoom" "objet" ddd61 "")
(setq ancliste (assoc 1 ent))
(setq conliste (cons (car ancliste) new))
(setq nouvliste (subst conliste ancliste ent))
(entmod nouvliste)
)
(defun c:A4 (/ ss3 bb3 vv3 bn3 s13 de1 de2 s51 new de3 ent ancliste conliste nouvliste)
(setq ss3 (ssget "_X" '((0 . "TEXT,MTEXT,DIMENSION,INSERT") (2 . "X-U0GBA030-A01"))))
(setq bb3 (ssname ss3 0))
(setq vv3 (entnext bb3))
(setq bn3 (entget vv3))
(setq s13 (cdr (assoc '1 bn3)))
(setq de1 (entnext vv3))
(setq de2 (entnext de1))
(setq s51 (cdr (assoc '1 (entget de2))))
(setq new (strcat s13 "_F" s51))
(setq de3 (entnext de2))
(setq ent (entget de3))
(command "zoom" "objet" de3 "")
(setq ancliste (assoc 1 ent))
(setq conliste (cons (car ancliste) new))
(setq nouvliste (subst conliste ancliste ent))
(entmod nouvliste)

 

Merci pour vos suggestions. :)

Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson

Posté(e)

Salut bigsyke,

 

mes remarques :

- tu peux créer une commande AA qui elle appelle A1, A2, A3 et A4

 

- tu peux créer une fonction A0 ayant un paramètre qui est le nom du bloc, ainsi A1, A2, A3 et A4 n'ont juste qu'a appeler A0 avec le bon paramètre

 

- tu n'as pas eu de plantage sur des appels ? car si le ssget renvoie nil, un ssname plante...

 

- faire un filtre sur le code DXF 2 ne marche pas sur les TEXT, MTEXT. pour la DIMENSION cela représente autre chose que le nom

 

- tu peux réunir le filtre sur le nom en mettant (2 . "X-u0gba007-A01,....")

 

- si tu veux garder tous tes setq séparés, un cond en testant chaque setq me plaît bien

 

En fait j'ai tendance à faire du cond pour valider des choses

(cond
 	((= (setq toto ... ) nil)
 	; erreur
)

((= (setq titi ...) nil)
 	; erreur
)

...

(t
 	; si tout c'est bien passé on arrive içi
)
) ; cond

Tous pour lisp, Lisp pour tous!

Avec Revit, cela ne vas trop vite...

Posté(e)

Merci pour tes remarques

 

« - tu peux créer une commande AA qui elle appelle A1, A2, A3 et A4 »

J’aimerais savoir comment crée une seule et même commande. La seule chose qui me viens à l’esprit serai ce genre de commande :

 
(defun c :AA ()
(command A1)
(command A2)
(command A3)
(command A4)
)

« tu peux créer une fonction A0 ayant un paramètre qui est le nom du bloc, ainsi A1, A2, A3 et A4 n'ont juste qu'a appeler A0 avec le bon paramètre »

Ben c’est ce que je cherche a faire…je veux crée un defun d’opération générique que j’appellerai en changeant l’argument (enfin si c’est possible à faire)

 

« - tu n'as pas eu de plantage sur des appels ? car si le ssget renvoie nil, un ssname plante... »

Il faut croire que j’ai eu la chance que ssget renvoie autre chose que nil. Il me faut donc faire face a cette éventualité dans le lisp sans quoi le lisp plantera

 

« -faire un filtre sur le code DXF 2 ne marche pas sur les TEXT, MTEXT. pour la DIMENSION cela représente autre chose que le nom ».

Tu as raison…en plus seul INSERT m’intéresse puisque je recherche un bloc

 

« - tu peux réunir le filtre sur le nom en mettant (2 . "X-u0gba007-A01,....") »

Là j’avoue que je ne t’ai pas bien compris

 

« - si tu veux garder tous tes setq séparés, un cond en testant chaque setq me plaît bien »

Je vais étudier cette idée. Mon but étant que suivant le nom du bloc trouvé lors de ssget une serie de commande s’exécute.

 

En tout cas merci pour tes précieux conseils et pour toutes ces pistes. Je vais tacher d’en faire bonne usage et je te soumettrai très bientôt le fruit de mon travail

 

Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson

Posté(e)

Re,

 

Pour appeler une commande définie en lisp, c'est tout simple

(defun c:A1()
  (setq a 1)

) ; c:A1

(defun c:A2()
  (setq a 2)

) ; c:A2

(defun c:A3()
  (setq a 3)

) ; c:A3

(defun c:A4()
  (setq a 4)

) ; c:A4

(defun c:A5()
  (setq a 5)

) ; c:A5

(defun c:AA()
 	; il suffit simplement d'appeler les commandes par (c:nom_de_la_commande)
 	(c:A1)
 	(c:A2)
 	(c:A3)
 	(c:A4)
 	(c:A5)
) ; c:AA

 

Pour le filtre sur le (2 . "....,...") c'est exactement le même principe que tu as mis sur le (0 . "...,")

A savoir que tu peux faire un ssget en donnant une liste de nom de blocs.

 

bonne continuation ;)

Tous pour lisp, Lisp pour tous!

Avec Revit, cela ne vas trop vite...

Posté(e)

Merci pour cette information précieuse :D j'ignorais qu'on pouvais faire ça.

Par contre peux tu m'expliquer comment faire ssget avec une liste de nom de bloc?

Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson

Posté(e)

Par contre peux tu m'expliquer comment faire ssget avec une liste de nom de bloc?

 

En séparant les noms par des virgules et/ou en utilisant les caractères génériques.

 

Exemple :

(ssget "_X" '((0 . "INSERT") (2 . "BL*,TOTO")))

Sélectionne tous les blocs nommés "TOTO" ou dont le nom commence par "BL".

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Merci beaucoup pour toutes ces precisions bien utile :D

 

Dommage que dans le ssget on ne puisse faire une liste de nom de bloc qu'avec des ET et pas de OU car j'aurais fait un ssget avec X-u0gba007-A01ou u0gba007 et un autre avec X-U0GBA030-A01ou u0gba030.

J'essais d'integré dans mon lisp une condition mais je ne vois pas trop de difference entre "cond" et "if".

Quelqu'un pourrais m'expliquer? ;)

Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson

Posté(e)

didier t'as induit en erreur bigsyke,

 

Le ssget de (gile) cherche tous les blocs dont le nom :

- soit commence par BL

- soit se nomme TOTO

 

donc si tu as des blocs par exemple BLO, BLI, TOTO, BIBI, dans ton dessin,

le ssget ne prendra que BLO, BLI et TOTO.

 

En parlant de "ET", je pense que bigsyke a compris quelque chose d'impossible :

qu'un bloc s'appelle TOTO et commence par BL... :P

 

donc pour moi, ce n'est pas ET ni OU mais OU/ET (donc ornicar :cool: )

Tous pour lisp, Lisp pour tous!

Avec Revit, cela ne vas trop vite...

Posté(e)

Pas évident la subtilité :P

 

Après le "et/ou" de Gile, le "et " de Didier voici le "ou/et" de bseb67 :D :D :D

Je pense néanmoins avoir compris le truc et l'exemple de bseb67 m'y a beaucoup aidé

Si on part de l'exemple de Gile le ssget recherchera et ne sélectionnera que les blocs dont le nom de bloc est TOTO ou/et de la forme BLA BLI BLO.

Après c'est au niveau du ssname qu'on retrouve ces petits....

Je comprends donc mieux l'idée de bseb67 pour ce qui est de, je cite "réunir le filtre sur le nom en mettant (2 . "X-u0gba007-A01,....")"

 

En tout cas j'ai vraiment beaucoup appris grâce a vous :)

 

Mille merci

Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson

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é