Aller au contenu

Différence wbloc et bloc ???


Messages recommandés

Posté(e)

Salut,

Suite à mes derniers sujets concernant un lisp de Remplacement de bloc, et de la proposition de (gile), quelque chose m'echappe :

Ce lisp :

 (defun Replace_Bloc (/ bloc_sel obj Group_bloc_sel Quest index bloc_R)  
 (princ "\n------------------------------\n Sélection du Bloc à Remplacer:")
 (while (= bloc_sel nil)	(setq bloc_sel (ssget "_:S:E" '((0 . "INSERT")))))
 (setq obj (vlax-ename->vla-object (ssname bloc_sel 0))) ;
 (vla-Highlight obj 1) ;;;surbrillance
 (initget "Oui Non")
 (setq Quest (getkword "\n Choix Multiple (Oui/Non)?  "))
 (if (= Quest "Oui")
   (progn
   	(setq Group_bloc_sel (ssget (list '(0 . "INSERT")(assoc 2 (entget (ssname bloc_sel 0))))))
 	(ssadd (ssname bloc_sel 0) Group_bloc_sel)
   	(setq bloc_sel Group_bloc_sel)))

 (setq bloc_R (getstring "\n Entrez le nom du bloc Remplaçant ou : "))
 (if (= bloc_R "")
   (progn (while (= bloc_R "")
(setq bloc_R (ssget "_:S:E" '((0 . "INSERT")))))
(setq bloc_R (cdr (assoc 2 (entget (ssname bloc_R 0)))))))
 
 (vla-Highlight obj 0) ;;;fin de surbrillance

 (setq index 0)
 (repeat (sslength bloc_sel)    

   (setq obj (vlax-ename->vla-object (ssname bloc_sel index)))
   (vla-put-layer	(vla-insertblock 	(vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))
		     			(vla-get-InsertionPoint obj)
		     			(findfile (strcat bloc_R ".dwg" ))
					(vla-get-XScaleFactor obj)
					(vla-get-YScaleFactor obj)
					(vla-get-ZScaleFactor obj)
					(vla-get-rotation obj))
     			(vla-get-layer obj))
   (vla-delete obj)
   (setq index (1+ index)))


 (if (> (sslength bloc_sel) 1)
 	(princ (strcat "\n ---------------------------------- \n" " "(rtos (sslength bloc_sel)) " objets remplacés."))
   	(princ (strcat "\n ---------------------------------- \n"  " "(rtos (sslength bloc_sel)) " objet remplacé.")))
 (prin1)
)

... ne fonctionne que pour les wblocs...

pourtant, quand je fais un (vlax-dump-object obj) entre un bloc et un wbloc, je ne vois pas de différence....

 

merci de vos lumières....

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Faire un Wbloc c'est de créer un fichier externe (DWG) d'un bloc nommé, d'une sélection ou même d'un dessin complet.

Pour réinsérer ce fichier ainsi créé, on peut l'inséré en bloc (Menu Insertion Bloc) ou en Référence externe.

 

Wbloc n'est donc pas une entité mais une commande permettant de créer des fichiers à partir du plan en cours.

Dessinateur AutoCAD, Modeleur BIM, consultant informatique logiciels métier

Lenovo ThinkStation P330 i9 9900K 32Gb RAM 512 SSD + 1To

GstarCAD, Fisa-CAD, Revit, FisaBIM CVC, Microsoft Office

 

PlaquetteDeplianteMars2024.pdf

Posté(e)

Heu... merci Maximilien... mais peut-être que je n'utilisa pas le bon vocabulaire.... :casstet:

un "Wbloc" est pour moi un bloc créé avec la commande "wbloc"

un "bloc" est pour moi un bloc créé avec la commande "bloc" ...

 

et donc ma question est : dans le traitement en lisp écrit en sujet, quel est la "différence lisp" entre un bloc et un wbloc qui fait que ce lisp ne fonctionne pas pour les "blocs" ????

 

 

 

[Edité le 21/7/2006 par Bred]

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Salut,

 

je t'avais donné une piste ici.

 

Il s'agit, à la spécification du nom du bloc remplaçant, si celui-ci est entré au clavier, de vérifier si le bloc est déjà dans la collection. Si le bloc n'y est pas (c'est un wbloc = fichier .dwg), il faut spécifier le chemin vers le fichier. Une fois ce wbloc inséré dans le dessin, il sera dans la collection et on pourra l'insérer en spécifiant uniquement son nom.

 

(setq bloc_R (getstring "\n Entrez le nom du bloc Remplaçant ou : "))

(if (= bloc_R "")

 ;; Si sélection à l'écran (le bloc est forcément dans la collection) :
 (progn (while	(= bloc_R "")
   (setq bloc_R (ssget "_:S:E" '((0 . "INSERT"))))
 )
 (setq bloc_R (cdr (assoc 2 (entget (ssname bloc_R 0)))))
 )

 ;; Si un nom a été entré au clavier :
 (if (vl-catch-all-error-p
(vl-catch-all-apply
  'vla-item
  (list	(vla-get-Blocks
	  (vla-get-ActiveDocument (vlax-get-acad-object))
	)
	bloc_R
  )
)
     )

   ;; Si le bloc n'est pas trouvé dans la collection :
   (setq bloc_R (findfile (strcat bloc_R ".dwg" )))
 )
) 

 

Par sécurité, il vaut mieux faire en suite :

 

(if bloc_R ...)

 

au cas ou (findfile ...) n'aurait pas trouvé le fichier, bloc_R serait nil.

 

[Edité le 21/7/2006 par (gile)]

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

Posté(e)

(if (vl-catch-all-error-p

(vl-catch-all-apply

'vla-item

(list (vla-get-Blocks

(vla-get-ActiveDocument (vlax-get-acad-object))

)

bloc_R

)

)

)

 

Salut

Un peu plus simple avec un (tblsearch "block" bloc_R)

 

@+

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)

Heu.... en fait je crois mieux comprendre maintenant... et c'est pour ça que je n'avais pas compris la proposition que tu cites...! :P

En effet, il est logique que le lisp ne fonctionne pas, vu que je fais un (findfile (strcat bloc_R ".dwg" ) quoi qu'il arrive... et comme un bloc (simple) n'a pas de chemin, le lisp se met à rigoler et se moque de moi en m'envoyant une erreur !!!....

 

... pffff.... :exclam:

 

merci

 

edit.

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

et merci à Patrick, qui avait cité son exemple aussi... je n'avais vraiment rien compris.....

 

[Edité le 21/7/2006 par Bred]

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Tu as raison sur le principe, mais je ne pense pas que Bred (excuse-moi Bred) saisisse toutes les subtilités

 

Il faut déjà comprendre qu'un (vla-item (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object))) Bloc_R) retourne en vla le bloc de la table du document actif (donc le dessin courant) s'il existe

Ensuite comprendre le vl-catch-all-apply ainsi que sa syntaxe

Pour ce qui est du vl-catch-all-error-p, je pense que c'est plus facile ;)

 

@+

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)

mais je ne pense pas que Bred (excuse-moi Bred) saisisse toutes les subtilités

 

... en fait je comprend de mieux en mieux vu que (gile) m'explique à chaque fois sa logique, et en faisant des tests sur ce qu'il me propose (une centaines de tests par proposition...) et en lisant les réaction dans la console, je comprend ce qu'il se passe au bout d'un moment...

 

mais il est vrais que je met de côté pas mal de chose en me disant que j'y reviendrais plus tard... et je me contente d'une version autolisp...

 

d'ailleurs, je comprends quand (gile) dit qu'il n'aime pas trop mélanger les genres (vl et auto), mais est-ce véritablement justifié au point de vue programmation ???... si c'est plus "rapide", pourquoi s'en priver ???

 

merci dans tout les cas à vous deux.

 

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Pour ce qu'il en est du "mélange des genres", je n'ai jamais (durant ma courte vie de lispeur) remarqué le moindre dysfonctionnement, mais je ne peux oublier les quelques messages de Serge Camiré (développeur émérite) disant qu'il est préférable de ne pas mélanger les (command ...) avec les (entmake ...) (entmod ...) ou les (vla-add ...), voir ce sujet

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

Posté(e)

Cette discussion est l'occasion de rappeler l'importance de la langue et de la terminologie. Familièrement, on dit "créer un Wbloc", il a été dit pourquoi cette expression est impropre, tout simplement parce qu'un objet Wbloc n'existe pas...

 

Il existe dans AutoCAD trois notions liées aux blocs: les blocs internes, les références (ou instances) de blocs et les fichiers AutoCAD. Les blocs internes sont aussi appelés "définitions de blocs", ils sont stockés dans la table des blocs (pour partie), interne à un dessin. Les références de blocs sont les blocs "visibles" si l'on peut dire, c'est un exemplaire d'une définition de bloc sur lequel on peut cliquer. Les fichiers AutoCAD sont ce que l'on appelle familièrement des "Wbloc", mais ce sont tout simplement des fichiers dessins.

 

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é