Aller au contenu

Opérations sur l\'ensemble des blocs insérés, les lisp Rins et Ren


atile

Messages recommandés

Bonjour à tous,

 

Je poste ici, dans la rubrique suggestion de développements car je ne sais pas si c'est réalisable...

Et si c'est réalisable peut être que cela intéressera quelqu'un de s'y frotter.

 

Le contexte:

 

J'ai accumulé, récupéré, et créé au fur des années un bon paquet de blocs. Je me suis enfin lancé dans le grand ménage rangement de cette bibliothèque.

 

J'ai donc créée des fichiers Autocad par grande catégorie dans lesquels j'ai inséré tous mes blocs, puis j'ai traité ceux-ci avec le formidable Edit_bloc de gile, afin de les nettoyer.

 

 

Mes souhaits:

 

Je souhaiterais maintenant redéfinir le point d'insertion de ces blocs, le lisp Rins fonctionne très bien, mais il est "manuel", donc sur une énorme quantité de blocs c'est très pratique mais cela reste un peu fastidieux.

 

Je souhaiterais de plus renommer l'ensemble des blocs insérés dans le dessin avec un Préfixe puis une numérotation incrémentale, par exemple "Arbres Hautes Tiges _ 001"

 

Pour résumer est-il possible de:

1- Redéfinir le point d'insertion pour l'ensemble des blocs, comme le point le plus bas en Y et le plus à gauche sur les X

2- Renommer l'ensemble des blocs avec un préfixe plus un numérotation.

 

Si cela est déjà possible mes excuses, j'ai pourtant farfouillé pas mal...

 

@ bientôt.

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Voilà déjà une réponse pour le 1. Essaye dans une copie de fichier, je ne l'ai pas testé en profondeur et ne sais pas si ça répond bien à ta demande.

 

Pour le 2, comment choisir le préfixe : le nom du fichier ou un nom entré par l'utilisateur ou le choix entre les deux ou autre chose ?

 

(defun c:ins-minpt (/ acdoc name minpt maxpt)
 (vl-load-com)
 (setq acdoc (vla-get-ActiveDocument (vlax-get-acad-object)))
 (vlax-for bloc (vla-get-Blocks acdoc)
   (setq name (vla-get-Name bloc))
   (if	(not (wcmatch name "`**_Space*"))
     (progn
(setq ins (vla-insertblock
	    (vla-get-ModelSpace acdoc)
	    (vlax-3d-point '(0 0 0))
	    name
	    1
	    1
	    1
	    0
	  )
)
(vla-getBoundingBox ins 'minpt 'maxpt)
(vla-delete ins)
(vlax-for ent bloc
  (vla-move ent minpt (vlax-3d-point '(0 0 0)))
)
     )
   )
 )
 (princ)
) 

 

[Edité le 16/10/2007 par (gile)]

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

Lien vers le commentaire
Partager sur d’autres sites

Sinon, (gile), pour ton lisp, tu peux redéfinir l'origine du bloc directement dans la table

 

J'ai préféré déplacer les objet dans le bloc pour conserver l'origine en (0 0 0).

Le bloc n'est inséré que pour récupérer les coordonnées du coin inférieur gauche de sa boundingbox.

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

Lien vers le commentaire
Partager sur d’autres sites

Une propostion pour renommer les blocs, l'utilisateur spécifie le préfixe ou fait Entrée pour utiliser le nom de fichier.

 

Si tu veux systématiquement utiliser les deux LISP, il vaudra mieux les regrouper en un seul pour optimiser le traitement.

 

(defun inc-str (str / sub)

 (defun sub (lst)
   (if	(      (if (cadr lst)
(cons 97 (sub (cdr lst)))	
(list 97 97)
     )
     (cons (1+ (car lst)) (cdr lst))
   )
 )

 (vl-list->string (reverse (sub (reverse (vl-string->list str)))))
) 

(defun c:renomtout (/ acdoc old pref ind)
 (vl-load-com)
 (setq	acdoc (vla-get-ActiveDocument (vlax-get-acad-object))
ind   "000"
 )
 (if (not
(setq pref (getstring T "\nEntrez le préfixe :"))
     )
   (setq pref (vl-string-right-trim ".dwg" (getvar "dwgname")))
 )
 (vlax-for bloc (vla-get-Blocks acdoc)
   (if	(not (wcmatch (vla-get-name bloc) "`**_Space*"))
   (vla-put-name bloc (strcat pref "_" (setq ind (inc-str ind))))
     )
 )
 (princ)
) 

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

Lien vers le commentaire
Partager sur d’autres sites

La première "fonction" marche très bien.

Le seul "bug" relevé pour l'instant vient de blocs eux mêmes composés de blocs, c'est donc normal, je n'avais pas fait un tri assez soigneux...

Je me rends compte par contre que je ne m'étais pas forcément très bien exprimé, serait-il envisageable que le point d'insertion soit en fait:

Le point d'accroche 'existant dans le dessin du bloc) le plus bas et le plus à gauche.

 

La deuxième fonction me renvoie une erreur:

 

 

Commande:

RENOMTOUT

Entrez le préfixe < Fichier >:

; erreur: Erreur Automation Entrée incorrecte

 

La méthode utilisée pour la charger:

1-copier coller dans la ligne de commande

2-je tape renomtout dans la ligne, je valide

3- A l'invite je tape le préfixe ou je valide pour utiliser le nom du fichier

 

Je n'arrive pas à faire l'étape 3...

 

Merci encore.

Lien vers le commentaire
Partager sur d’autres sites

Ce que tu demandes pour le point d'insertion est beacoup plus complexe (voire impossible). Cela supposerait de comparer tous les points de toutes les entité constituant le bloc. C'est faisable pour des lignes ou des polylignes composées de segments droits, plus difficiles pour les arcs cercle et polyligne et comment déterminer le point le plus en bas à gauche d'un cercle ?

 

Pour l'erreur avec la deuxième fonction, je pense que c ça vien de la manière dont tu as procédé (copier collé sur la lignes de commande et du fait qu'il y a 2 routines séparées par un saut de ligne qui doit être interprété comme une Entrée.

Essaye de copier coller d'abord de

(defun inc-str ...

à

...(vl-string->list str)))))

)

 

puis de :

(defun c:renomtout ...

à

... (princ)

)

 

ou alors tu copies colles tout dans le bloc-notes l'enregitres avec l'extension .lsp et le fais cglisser déposer dans la fenêtre d'AutoCAD.

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

Lien vers le commentaire
Partager sur d’autres sites

Ce que tu demandes pour le point d'insertion est beacoup plus complexe (voire impossible). Cela supposerait de comparer tous les points de toutes les entité constituant le bloc. C'est faisable pour des lignes ou des polylignes composées de segments droits, plus difficiles pour les arcs cercle et polyligne et comment déterminer le point le plus en bas à gauche d'un cercle ?

 

Ok, je comprends, peut-on envisager alors d'utiliser le point le plus bas et le centre alors?

 

Pour l'erreur avec la deuxième fonction, je pense que c ça vien de la manière dont tu as procédé

 

J'ai essayé les deux méthodes... Je n'y arrive pas, ça marche chez toi, je suppose?

Lorsque je créée le fichier lsp, je peux l'appeler comme je veux?

 

@ plus tard.

Lien vers le commentaire
Partager sur d’autres sites

Ok, je comprends, peut-on envisager alors d'utiliser le point le plus bas et le centre alors?

 

Le problème est exactement le même.

 

J'ai essayé les deux méthodes... Je n'y arrive pas, ça marche chez toi, je suppose?

Lorsque je créée le fichier lsp, je peux l'appeler comme je veux?

 

Oui, ça marche chez moi.

 

Oui tu peux appeler le fichier comme tu veux.

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

Lien vers le commentaire
Partager sur d’autres sites

J'ai bien compris qu'il n'était pas envisageable de replacer le point d'insertion sur un point variable mais spécifique du dessin.

 

Le lisp RBL permet de recentrer le point de d'insertion du bloc, toi tu m'as permis de placer le point d'insertion an bas à gauche. Je pensais qu'il était envisageable de placer le point d'insertion au plus bas des Y et au centre du bloc.

 

Je suis un peu lourd, je me doute, mais ce serait très apprécié ;)

 

Pour "Renomtout" est-il possible que cela fasse appel à une fonction que je n'aurais pas sur Autocad 2007?

 

J'ai bien enregistré ton code en un seul fichier, je voudrais rajouter à la fin une petite phrase qui précise les 2 commandes à taper, est ce que je peux mettre ça? Ou est ce que cela n'est pas comme cela que ça marche, j'ai "pompé" ça sur un lisp qui affichait les commandes à exécuter...

 

(princ "Le lisp de gile pour les blocs chargé. Tapez inc-str pour déplacer le point d'insertion Tapez renomtout pour renommer l'ensemble des blocs")

(princ)

 

 

Merci encore pour le temps passé et tes explications.

 

Lien vers le commentaire
Partager sur d’autres sites

Excuse moi, je n'avais pas bien compris la demande, je pensais que tu voulais toujours le point d'insertion sur un des composant du bloc.

Voilà pour le premier:

 

(defun c:ins-minpt (/ acdoc name minpt maxpt)
 (vl-load-com)
 (setq acdoc (vla-get-ActiveDocument (vlax-get-acad-object)))
 (vlax-for bloc (vla-get-Blocks acdoc)
   (setq name (vla-get-Name bloc))
   (if	(not (wcmatch name "`**_Space*"))
     (progn
(setq ins (vla-insertblock
	    (vla-get-ModelSpace acdoc)
	    (vlax-3d-point '(0 0 0))
	    name
	    1
	    1
	    1
	    0
	  )
)
(vla-getBoundingBox ins 'minpt 'maxpt)
(setq minpt (vlax-safearray->list minpt)
      maxpt (vlax-safearray->list maxpt)
      )
(vla-delete ins)
(vlax-for ent bloc
  (vla-move ent
	    (vlax-3d-point
	      (list (/ (+ (car minpt) (car maxpt)) 2.)
		    (cadr minpt)
		    (caddr minpt)
	      )
	    )
	    (vlax-3d-point '(0 0 0))
  )
)
     )
   )
 )
 (princ)
)
(princ "\nLISP correctement chargé, taper ins-minpt pour lancer la commande.")
(princ) 

 

Pour le second, je l'ai testé sur 2007, pas de problème.

Je te le remet ici mis enforme différemment (une seule routine)

 

(defun c:renomtout (/ inc-str acdoc old pref ind)
 (vl-load-com)

 (defun inc-str (str / sub)

 (defun sub (lst)
   (if	(      (if (cadr lst)
(cons 97 (sub (cdr lst)))	
(list 97 97)
     )
     (cons (1+ (car lst)) (cdr lst))
   )
 )

 (vl-list->string (reverse (sub (reverse (vl-string->list str)))))
)
 
 (setq	acdoc (vla-get-ActiveDocument (vlax-get-acad-object))
ind   "000"
 )
 (if (not
(setq pref (getstring T "\nEntrez le préfixe :"))
     )
   (setq pref (vl-string-right-trim ".dwg" (getvar "dwgname")))
 )
 (vlax-for bloc (vla-get-Blocks acdoc)
   (if	(not (wcmatch (vla-get-name bloc) "`**_Space*"))
   (vla-put-name bloc (strcat pref "_" (setq ind (inc-str ind))))
     )
 )
 (princ)
)
(princ "\nLISP correctement chargé, taper renomtout pour lancer la commande.")
(princ) 

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

Lien vers le commentaire
Partager sur d’autres sites

Excuse moi, je n'avais pas bien compris la demande, je pensais que tu voulais toujours le point d'insertion sur un des composant du bloc.

Voilà pour le premier:

 

Pas de soucis.

 

Merci, cela fonctionne parfaitement.

Je vais conserver les deux, en fonction des séries de blocs, les deux solutions peuvent être utiles.

 

Pour le second, je l'ai testé sur 2007, pas de problème.

Je te le remet ici mis en forme différemment (une seule routine)

 

Cela ne fonctionne toujours pas chez moi, mais sur le poste d'un collègue oui...

Je regarderais ce qui peut bien causer ce dysfonctionnement... Si tu as une idée pour me mettre sur une piste...

 

Merci encore mille fois, tu me simplifie grandement la vie d'Autocadien :)

 

[Edité le 16/10/2007 par atile]

Lien vers le commentaire
Partager sur d’autres sites

Hello,

 

Bon cela marche en fait aussi très bien chez moi sur des fichiers simples avec peu de blocs. Par contre dès que je le lance sur des fichiers un peu plus costaud (avec plus de blocs quoi...) il s'emmêle les pinceaux et me mets une erreur...

 

Je peux te faire parvenir le fichier incriminé (env. 170 ko), si tu as le temps d'y jeter un oeil.

 

@ bientôt.

 

 

 

Lien vers le commentaire
Partager sur d’autres sites

:calim: :calim: :calim:

 

Le problème vient de la routine inc-str que j'ai pris dans ma bibliothèque sans vérifier si c'était bien celle là dont j'avais besoin.

Eh bien non ! C'était pas la bonne... Celle là ne passe pas de "009" à "010".

 

Donc revoilà renomtout avec la bonne routine : inc-numstr

 

(defun c:renomtout (/ inc-str acdoc old pref ind)
 (vl-load-com)

 (defun inc-numstr (str / l)
   (setq l   (strlen str)
  str (itoa (1+ (atoi str)))
   )
   (while (      (setq str (strcat "0" str))
   )
   str
 )

 (setq	acdoc (vla-get-ActiveDocument (vlax-get-acad-object))
ind   "000"
 )
 (if (not
(setq pref (getstring T "\nEntrez le préfixe :"))
     )
   (setq pref (vl-string-right-trim ".dwg" (getvar "dwgname")))
 )
 (vlax-for bloc (vla-get-Blocks acdoc)
   (if	(not (wcmatch (vla-get-name bloc) "`**_Space*"))
     (vla-put-name
bloc
(strcat pref "_" (setq ind (inc-numstr ind)))
     )
   )
 )
 (princ)
)
(princ
 "\nLISP correctement chargé, taper renomtout pour lancer la commande."
)
(princ) 

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

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é