Aller au contenu

Renommer simplement un bloc anonyme


Messages recommandés

Posté(e)

J’utilise beaucoup la commande COLLERBLOC (ou PASTEBLOCK), pour esquisser des trucs vite fait.

 

Le problème, c’est que si je veux ensuite renommer un de ces blocs proprement, je suis obligé d’identifier son nom, du genre A$C349C231D et de lancer la commande RENOMMER.

 

Je fais une nouvelle fois appel aux talents des lispeurs pour voir si quelqu’un saurait écrire le LISP qui fait ça en un clin d’œil ;-)

 

Posté(e)

...chacun ses goûts. Et dans le cas dont je parle, je n'exporte rien vers un autre fichier, je me contente de sélectionner des entités dans un dessin, des les copier/coller en tant que bloc.

Posté(e)

Salut,

 

Et dans le cas dont je parle, je n'exporte rien vers un autre fichier, je me contente de sélectionner des entités dans un dessin, des les copier/coller en tant que bloc.

 

Pourquoi ne pas faire tout simplement un bloc ? voire un groupe...

Tu nommerais ton bloc (ou ton groupe) dès le départ et tu n'aurais pas besoin d'un LISP.

 

Il est connu qu'il vaut mieux utiliser les commandes AutoCAD que les commandes Windows (Copier, Coller, etc.) qui sont souvent source de tracas...

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

Posté(e)

@ (gile) et lili2006

 

Merci pour vos réponses.

 

En fait ma manip est à base de commandes AutoCad (COPYBASE, PASTEBLOCK), donc je ne crois pas mélanger commandes AutoCad et Windows – quels seraient les risques, d'ailleurs ?

 

Perso, je trouve ce moyen hyper-pratique pour travailler rapidement. Quand je dessine pendant une heure, il m'arrive de créer des dizaines de blocs anonymes que j'explose le plus souvent quelques secondes après les avoir créés (juste le temps de les manipuler, ou d'effacer ce qui me gêne autour d'entités que je veux conserver, ou juste pour garder une trace d'une version obsolète et que j'envoie dans un calque non tracé, etc.....), donc la procédure de création de blocs serait bien fastidieuse.

 

Mais il arrive parfois qu'un bloc anonyme me plaise bien et que je décide de lui faire l'honneur de le baptiser. Et là c'est un peu galère. Mais pas trop quand même. Mais bon, un lisp qui permettrait juste de cliquer sur un bloc et de lui donner un nouveau nom, je trouverais ça cool ;-)

 

Posté(e)

Salut,

 

Il s'agit bien de ce que j'appelle (peut-être improprement) "commandes Windows", à savoir des commandes qui utilisent le presse-papier Windows.

 

Dans AutoCAD, ces commandes ne sont pas aussi fiables que les commandes AutoCAD (voir les nombreux sujets concernant divers problèmes directement liés à l'utilisation de ces commandes.

 

Tu dis que ce moyen te permet de travailler rapidement, mais il te faudrait par la suite corriger certaines choses à l'aide d'un LISP...

 

Comme le dit Patrick_35, ce n'est pas difficile à programmer, c'est donc une bonne occasion pour se lancer. Tu trouveras très certainement de l'aide.

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

Posté(e)

@patrick_35

 

Merci pour tes encouragements à me lancer dans la programmation en LISP : OK, je relève le défi, et j'essaie donc d'écrire mon premier LISP, qui permettra de renommer au clavier un bloc désigné à la souris.

Problème : je n'ai jamais fait de programmation (bon, pour être honnête, si : en LSE en....1979-80...).

 

Donc j'imagine qu'il faut que ça commence du genre comme ça :

 

; LISP rb pour renommer un bloc désigné graphiquement

 

(defun c:rb ()

(setq bloc (ssget))

(princ "\nDésigner le bloc à renommer :")

)

 

Jusque là, ça marche, mais après, je ne sais pas récupérer le nom du bloc à partir du jeu de sélection créé, ni comment on peut renommer un bloc en LISP...

Autant dire que je viens de passer plus de temps à me gratter la tête et à chercher des antisèches dans les recoins du web que tout le temps que me fera économiser ce LISP dans le reste de ma carrière... Mais pour la beauté du geste, je m'obstine !

 

Et j'ai donc besoin d'aide : A L'AIDE !!!

 

Merci.

 

Posté(e)

C'est bien :D

Maintenant, tu as dans la variable bloc une sélection.

Il faut donc la parcourir via une boucle

 

Regarde les fonctions ssname, while, entget, sslength, repeat

 

@+

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

Posté(e)

Merci pour ta réponse, mais je ne sais pas où regarder pour avancer.

Quand j'examine les LISPs que j'utilise déjà, je ne comprends pas la syntaxe ni l'utilité de telle ou telle fonction...

Posté(e)

Tu vas dans l'aide

 

F1 --> AutoLISP, Visual LISP et DXF --> AutoLISP Reference

 

Et tu choisis la fonction.

 

Je t'ai indiqué lesquelles regarder. Mais si tu as besoin de plus d'explications, ce sera avec plaisir.

 

@+

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

Posté(e)

Salut,

 

Comme le dit Patrick_35, les références AutoLISP de l'aide aux développeurs d'AutoCAD est l'endroit où tu retrouveras le plus souvent dans tes débuts en LISP (et même après).

Un truc : depuis l'éditeur Visual Lisp, tu sélectionnes une fonction par double clic et Ctrl+F1 t'ouvre directement l'aide à la page de cette fonction.

 

En ce qui concerne la syntaxe AutoLISP, j'ai fait un petit topo ici. Il est peut-être un peu abrupt, mais veut poser clairement les bases de la syntaxe et du fonctionnement de ce langage.

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

Posté(e)

@ Patrick

 

Merci pour ta sollicitude.

 

Le coup de la boucle, ça me décourage un peu, je n'y comprends pas grand chose...

L'idée c'est de compter le nombre d'entités dans la sélection et de faire tourner la boucle jusqu'à atteindre ce nombre ?

Pour un début, je me contenterais bien d'un LISP qui fonctionne pour un bloc unique, tant pis si l'utilisateur a le mauvais goût d'en sélectionner davantage, sauf si la boucle est indispensable ?

 

Donc, pour un bloc unique, j'arrive à faire marcher le LISP suivant :

 

(defun c:rb ()

(princ "\nDésigner le bloc à renommer :")

(setq bloc (ssget))

(setq EN (ssname BLOC 0))

)

 

Mais maintenant qu'AutoCad me retourne le message : je ne sais pas comment récupérer le nom du bloc...

A ce stade, ma bonne volonté s'émousse...

 

 

@ Gilles

 

Merci aussi.

 

J'avais repéré tes posts, mais j'avoue que c'est trop théorique pour moi (un peu comme essayer d'apprendre une langue étrangère avec un dico + une grammaire).

Bon allez, je m'accroche.

 

 

[Edité le 29/7/2010 par gloub]

Posté(e)

Salut,

 

Je te conseille d'utiliser l'éditeur Visual LISP et de ne pas hésiter à évaluer successivement les expressions qui constituent ton code de manière à bien comprendre pratiquement comment agissent les fonction et voir ce qu'elles retourne.

 

Tu as raison, commençons avec une seule entité à la fois, d'autant plus qu'il est impossible de renommer plusieurs bloc en une seule fois (chacun devant avoir un nom qui n'existe pas déjà).

 

La fonction entsel permet fait une pause dans l'exécution du programme pour permettre à l'utilisateur de sélectionner une entité :

 

(setq ent (entsel "\nSélectionnez un bloc"))

 

Si tu testes l'expression ci dessus, tu verras qu'elle affiche le message d'invite en ligne de commande et modifie l'aspect du curseur tant que l'utilisateur n'a pas sélectionné (ou cliqué).

 

Tu verras aussi ce que l'expression retourne : une liste contenant 2 éléments le nom d'entité de l'entité sélectionnée et une liste de 3 nombres réel, le point cliqué par l'utilisateur.

 

Ce qui t'intéresse est le premier élément de la liste on y accède avec la fonction car ou nth

 

Une fois que tu as réussi à extraire le nom d'entité (ENAME) de l'entité sélectionnée (et à le stocker dans une variable), tu accèdes aux données DXF de cette entité avec la fonction entget.

 

(setq elst (entget (car ent)))

 

Cette fonction retourne ce qu'on appelle une liste d'association : chaque élément de la liste est une sous-liste, souvent d'un type particulier (paire pointée). Dans chaque sous-liste, le premier élément est un "code de groupe". Ceci permet d'atteindre un élément de la liste sans tenir compte du nombre ni de l'ordre des éléments de la liste.

La fonction assoc, retourne la sous-liste dont le premier élément correspond au premier argument passé à la fonction.

Le code de groupe DXF pour le nom d'un bloc est 2, l'expression suivante retourne le groupe DXF correspondant :

 

(assoc 2 elst)

sous la forme d'une paire pointée : (2 . "NomDuBloc"), pour récupérer le nom du bloc, on utilise la fonction cdr.

 

(cdr (assoc 2 elst))

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

Posté(e)

ÇA MAAAAAAAAAAAAARCHE ! (à lire à voix haute en imitant le cri de Tarzan).

 

Merci beaucoup pour ton aide (à ce degré-là, ce n'est plus de l'aide, c'est du tutorat genre chien d'aveugle) et le temps que tu y as passé.

 

Pour que ça profite à tout le monde (du moins ceux que ça pourrait intéresser), voici, mesdames et messieurs, un LISP qui permet de renommer un bloc après l'avoir désigné par un clic de souris :

 

;**** RENOMMER UN BLOC DESIGNE GRAPHIQUEMENT
(defun c:rb ()
(setq blocx (entsel "\nSélectionnez un bloc"))
(setq nomblocx (entget (car blocx)))
(cdr(assoc 2 nomblocx))
(command "-rename" "_b" (cdr(assoc 2 nomblocx)) pause)
) 

 

Un de ces jours, j'essaierai d'ajouter une belle boîte de dialogue, mais je ne sais pas encore comment on fait...

 

Merci à gile à qui je dois tout, merci à Patrick pour ses encouragements, etc...

  • 1 mois après...
Posté(e)

AU SECOURS LISP NE FONCTIONNANT PAS CHEZ MOI

DAO: AutoCAD(2D & 3D), Covadis

CAO: 3D's MAX, Rhinoceros 3D, REVIT

GeoModeliSation: AutoCAD MEP, RhinoTerrain

Rendu: Vray for Rhino, Keyshot, Lumion

Programmation: Grasshopper, Dynamo, VisualStudio

 

C.V.

Profil LinkedIn

Book

Site web

 

http://nsa37.casimages.com/img/2016/09/26/160926023334168603.jpg

Posté(e)

Tout simplement comme gile le dit _renommer.

Désolé les sport m'a tué aujourd'hui...

 

DAO: AutoCAD(2D & 3D), Covadis

CAO: 3D's MAX, Rhinoceros 3D, REVIT

GeoModeliSation: AutoCAD MEP, RhinoTerrain

Rendu: Vray for Rhino, Keyshot, Lumion

Programmation: Grasshopper, Dynamo, VisualStudio

 

C.V.

Profil LinkedIn

Book

Site web

 

http://nsa37.casimages.com/img/2016/09/26/160926023334168603.jpg

Posté(e)

Désolé pour cette erreur de débutant en LISP (je travaille sur une version anglaise...et légale – pas de mauvais esprit siouplait).

 

Voilà la version modifiée pour que le LISP marche sur une version française ou anglaise :

 

;**** RENOMMER UN BLOC DESIGNE GRAPHIQUEMENT

 

(defun c:rb ()

(setq blocx (entsel "\nSélectionnez un bloc"))

(setq nomblocx (entget (car blocx)))

(cdr(assoc 2 nomblocx))

(command "_-rename" "_b" (cdr(assoc 2 nomblocx)) pause)

)

 

Bon, c'est du fait main, ça tient avec du scotch, donc il peut y avoir des messages système un peu bizarres, mais, bon an mal an, ça marche.

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é