Aller au contenu

amélioration lisp expb


ahbv

Messages recommandés

Bonjour,

 

j'ai voulu tester un lisp qu'avait proposé patrick35 ici "http://cadxp.com/topic/13905-selection-et-exploser-toutes-les-references-de-bloc/Mon lien" dont je voulais l'utiliser pour selectionner "certains" blocs (j'ai rajouté "el-*,5???_*,*u????" pour ne prendre que cela) et les exploser (en finalité je voudrais aussi puger le plan mais ca je peux le faire manuellement) mais le lisp ne fonctionne pas et je ne sais pas pourquoi étant toujours novice en lisp ???

 

voici le lisp:

---------------

(defun c:expb ( / x n)

 (while (setq n (ssget "_X" '((0 . "INSERT") (2 . "el-*,5???_*,*u????"))))

   (setq x 0)

   (repeat (sslength n)

   (vla-explode (vlax-ename->vla-object (ssname n x)))

   (vla-delete (vlax-ename->vla-object (ssname n x)))

   (setq x (+ x 1)))

 )

 (princ)
)

---------------------------

cependant lorsque je l’exécute j'ai ceci:

 

Command: expb

 

Cannot invoke (command) from *error* without prior call to (*push-error-using-command*).

Converting (command) calls to (command-s) is recommended.

Command:

 

quelqu'un pourrait résoudre ce problème ???

Merci infiniment d'avance.

AHG

Lien vers le commentaire
Partager sur d’autres sites

Salut.

 

Je vais peut-être dire une co**erie, mais si tu ajoute (vl-load-com) après la première ligne du LISP ?

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Salut.

 

Je vais peut-être dire une co**erie, mais si tu ajoute (vl-load-com) après la première ligne du LISP ?

 

je viens d'essayer mais non, merci pour la réponse.

 

j'ai modifié comme cela

(defun c:expb ( / x n)

 (vl-load-com)

 (while (setq n (ssget "_X" '((0 . "INSERT") (2 . "el-*,5???_*,*u????"))))

Lien vers le commentaire
Partager sur d’autres sites

Dommage...

 

C'est curieux qu'il te parle de (command) alors qu'il n'y en a pas...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Je pense que le problème vient de l'utilisation des caractères génériques dans le filtre de sélection.

Tu peux utiliser la fonction wcmath dans la console de l'éditeur Visual LISP (ou en ligne commande) pour faire des tests.

 

"el-*" prendra tous les blocs dont le nom commence par "el-" (ou "El-", "eL-", "EL-", contrairement à wcmatch les filtres de sélection sur les noms de blocs, de calque, de styles, etc ne sont pas sensibles à la casse).

exemples : "el-", "el-123", "el-abcd", "el-?

 

"5???_*" prendra tous les blocs dont le nom commence par 5 suivi de 3 caractères quelconques et d'un underscore.

exemples : "5123_", "5abc_123", "5..._abc"

 

"*u????" prendra tous les blocs dont le nom se termine par "u" (ou "U") suivi de 4 caractères quelconques.

exemples : "*U1234", mais aussi : "uabcd", "pataugera", "-----u----"

 

Pour les deux premiers modèles, je ne pourrais dire s'ils sont valides ne connaissant pas les noms des blocs recherché.

Mais le dernier semble vouloir récupérer les blocs anonymes dont les "noms" commencent par "*U" suivi de un ou plusieurs chiffres. Comme l'astérisque (*) est un caractère générique, si on recherche précisément ce caractère, il faut le faire précéder de caractère d’échappement pour ces caractères génériques : l'accent grave (Alt Gr + 7) et comme l'astérisque est un caractère réservé à AutoCAD pour les noms de blocs, un nom de bloc commençant par une astérisque est forcément un bloc anonyme On n'a donc pas à s'iquiéter du nombre de caractères après le U. Le modèle couramment utilisé pour filtrer les blocs anonymes issus de blocs dynamiques est :

"`*U*"

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

Lien vers le commentaire
Partager sur d’autres sites

Salut.

 

Je vais peut-être dire une co**erie, mais si tu ajoute (vl-load-com) après la première ligne du LISP ?

 

j'ai redemarré autocad et relancé le lisp et là cela fonctionne donc merci à DENISH et (gile) pour les explications !

(quelle commande dois je rajouter pour purger les blocs apres la fin du lisp,svp ?)

AHG

Lien vers le commentaire
Partager sur d’autres sites

cependant lorsque je l’exécute j'ai ceci:

 

Command: expb

 

Cannot invoke (command) from *error* without prior call to (*push-error-using-command*).

Converting (command) calls to (command-s) is recommended.

Command:

 

quelqu'un pourrait résoudre ce problème ???

Merci infiniment d'avance.

AHG

 

Ce problème semble venir d'une redéfinition de la fonction *error*. Ça vient très certainement d'un autre LISP chargé dans le dessin qui redéfinit *error* (en utilisant la fonction command dans la redéfinition) sans déclarer localement cette redéfinition.

Il faut que tu cherches dans les LISP chargés.

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

Lien vers le commentaire
Partager sur d’autres sites

Je ne sais pas ce que sont "les blocs de type réseau", c'est toi qui, connaissant les noms possibles des blocs, qui doit ton construire ton modèle (pattern) le plus précisément possible pour n'écarter aucun bloc que tu veux sélection mais aussi pour être sûr d'écarter ceux que tu ne veux pas.

 

Le modèle "*u????" sélectionnera les blocs dynamiques dont le nom commence par "*U" suivi de 4 chiffres (ex: "*U1234").

Pour éviter ça, il faut ajouter un critère pour accepter n'importe quoi devant le "u" sauf le caractère "*" :

"*[~`*]u????"

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

Lien vers le commentaire
Partager sur d’autres sites

Je ne sais pas ce que sont "les blocs de type réseau", c'est toi qui, connaissant les noms possibles des blocs, qui doit ton construire ton modèle (pattern) le plus précisément possible pour n'écarter aucun bloc que tu veux sélection mais aussi pour être sûr d'écarter ceux que tu ne veux pas.

 

Le modèle "*u????" sélectionnera les blocs dynamiques dont le nom commence par "*U" suivi de 4 chiffres (ex: "*U1234").

Pour éviter ça, il faut ajouter un critère pour accepter n'importe quoi devant le "u" sauf le caractère "*" :

"*[~`*]u????"

 

la commande "RESEAU (ou ARRAY)" permet de crée une copie paramétrable en x,y,z de l'objet et donc l'identification (ou le nom) du "réseau" est *U123 (par exemple)

l'info lambda de l'entité donne ceci

(-1 . <Entity name: 7ffff78aa10>)
(0 . "INSERT")
(5 . "6E241")
(102 . "{ACAD_REACTORS")
(330 . <Entity name: 7ffff78aac0>)
(102 . "}")
(330 . <Entity name: 7ffff7039f0>)
(100 . "AcDbEntity")
(67 . 0)
(410 . "Model")
(8 . "0")
(100 . "AcDbBlockReference")
(2 . "*U238")
(10 28789.0 37936.3 0.0)
(41 . 1.0)
(42 . 1.0)
(43 . 1.0)
(50 . 0.0)
(70 . 0)
(71 . 0)
(44 . 0.0)
(45 . 0.0)
(210 0.0 0.0 1.0)

 

donc pour pouvoir sélectionner automatiquement les blocs (ou entités) provenant de la commande reseau je selectionne ceci

"(2 . "*U???"), par contre si il existe une autre méthode plus sûr et fiable je suis partant..

Lien vers le commentaire
Partager sur d’autres sites

Le modèle "*u????" sélectionnera les blocs dynamiques dont le nom commence par "*U" suivi de 4 chiffres (ex: "*U1234").

Salut (gile)

 

Je pense que pour sélectionner des blocs anonymes type "*U....", j'utiliserai le quote inversé devant l'astérix, sinon cela indique tous les blocs se finissant par "U...."

 

@+

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

juste encore pour info, la commande qselect (je suis sur un autocad 2015 Anglais) permet de trouver/selectionner les ARRAY (reseau en fr) mais pas la commande filter (filtre) qui elle donne un nom de bloc "*Uxxx" après selection de l'objet , vraiment bizarre !!! (donc il doit bien exister un moyen de ne selectionner que les "array" indépendamment des blocs dynamiques (qui ont 2 noms un principal et un anonyme) mais comment ???

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é