Aller au contenu

vla-InsertBlock: message ligne de cd


Messages recommandés

Posté(e)

Salut,

Lorsque j'utilise

 (vla-InsertBlock (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))
vlax-3d-point pt) chem 1 1 1 0)

à l'insertion du bloc, j'ai à chaque fois le message sur la ligne de commande :

Définition à double du bloc xxxxxxxx ignorée.

... malgré cmdecho sur 0 ...

 

y a t'il un moyen du supprimer ces messages ???

 

...merci d'avance.

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

Posté(e)

Je pense qu'il faut fixer la variable "EXPERT" au minimun à 2 ou plus.

 

Regarde l'aide pour les différentes valeurs possibles

 

[Edité le 18/7/2006 par bonuscad]

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

merci bonuscad, mais je viens de tester et ça n'a pas l'air d'être ça....

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

Posté(e)

Ça a peut-être rapport avec ce sujet

 

Juste une suggestion où NOM est le nom du bloc et CHEM le chemin complet d'un wbloc

 

(vla-insertblock (vla-get-paperspace (vla-get-activedocument (vlax-get-acad-object)))
(vlax-3d-point pt)
(if (vla-item (vla-get-Blocks (vla-get-activedocument (vlax-get-acad-object))) NOM)
NOM
CHEM
)
1
1
1
0
) 

 

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

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

Posté(e)

Salut (gile) et merci,

non, ça ne fonctionne pas : je l'ai tester avec mon lisp de remplacement de bloc en -vl, je le copie ci-dessous :

(j'ai changé le "vla-get-paperspace " en "vla-get-modelspace " sinon j'avais une erreur...)

 

 (defun c:bbb (/ bloc_sel bloc_R)
 (princ "\n------------------------------\n Sélection du Bloc à Remplacer :")  
 (while (= bloc_sel nil)
     (setq bloc_sel (ssget "_:S:E" '((0 . "INSERT")))))
 
 (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-put-layer (vla-insertblock (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))
(vlax-3d-point (cdr (assoc 10 (entget (ssname bloc_sel 0)))))
	   (if (vla-item (vla-get-Blocks (vla-get-activedocument (vlax-get-acad-object)))bloc_R)
	   (findfile (strcat bloc_R ".dwg" )))
	   (cdr (assoc 41 (entget (ssname bloc_sel 0))))
	   (cdr (assoc 42 (entget (ssname bloc_sel 0))))
   		   (cdr (assoc 43 (entget (ssname bloc_sel 0))))
   		   (cdr (assoc 50 (entget (ssname bloc_sel 0)))))
   		(cdr (assoc 8 (entget (ssname bloc_sel 0)))))
 (entdel (ssname bloc_sel 0))    
   )

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

Posté(e)

C'est mon côté "maniaque", mais je préfère les codes où ne sont pas mélangés les styles.

 

Si tu te mets au vlisp, oublie les entget, récupérer les propriétés d'un objet est beaucoup plus évident en vlisp.

 

Il faut d'abord transformer le nom d'entité (ename) en vla-object :

 

(setq obj (vlax-ename->vla-object ent))

 

En faisant un (vlax-dump-object obj) tu pourras voir toutes les propriétés accessible pour l'objet. tu peux récupérer ces propriétes aves un (vla-get-property obj) ou les modifier avec un (vla-put-property obj [arg ...])

 

Si tu fais (vlax-dump-object obj T) tu auras aussi toutes les "méthodes" applicables à l'objet avec un (vla-method [arg...])

 

Le test sur la présence ou non du bloc dans la collection ne me semble pas utile vla-Insert fonctionne aussi bien avec un nom de bloc (si le bloc est dans la collection) ou un chemin complet (si le chemin est valide):

 

(if (vla-item (vla-get-Blocks

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

)

bloc_R

)

(findfile (strcat bloc_R ".dwg"))

)

 

 

Volà ce que ça pourrait donner :

 

(defun c:bbb (/ bloc_sel bloc_R)
 (princ
   "\n------------------------------\n Sélection du Bloc à Remplacer :"
 )
 (while (= bloc_sel nil)
   (setq bloc_sel (ssget "_:S:E" '((0 . "INSERT"))))
 )

 ;; Changement du nom d'entité en vla-object
 (setq obj (vlax-ename->vla-object (ssname bloc_sel 0)))

 (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-put-layer
   (vla-insertblock
     (vla-get-modelspace
(vla-get-activedocument (vlax-get-acad-object))
     )
     (vla-get-InsertionPoint obj)
     Bloc_R
     (vla-get-XScaleFactor obj)
     (vla-get-YScaleFactor obj)
     (vla-get-ZScaleFactor obj)
     (vla-get-rotation obj)
   )
   (vla-get-layer obj)
 )
 (vla-delete obj)
) 

 

EDIT : remplacé (vla-delete bloc) par (vla-delete obj).

 

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

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

Posté(e)

Alors là, merci pour ce petit cours de vl !!!

 

Juste pour info, je viens de tester ta proposition et elle ne fonctionne pas si le bloc n'est pas déjà dans le dessin (mais je pense qu'il faut juste marquer le chemin de recherche du bloc pour que ça fonctionne), par contre, le bloc remplacé ne s'efface pas....

 

j'édite :

je confirme, pour remplacer le bloc avec un bloc ne se trouvant pas dans le dessin, remplacer bloc_R par (findfile (strcat bloc_R ".dwg" )) (à l'insertion en fin de lisp)

 

 

[Edité le 18/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)

le bloc remplacé ne s'efface pas...

L'erreur est réparée voir EDIT au dessus.

 

Il faut effectivement spécifier le chemin complet si le bloc n'est pas dans la collection du dessin.

 

Il est possible de faire un test pour savoir si le bloc est présent dans la collection, mais attention, (vla-item ...) ne retourne pas nil mais une erreur si l'item n'est pas trouvé, il faut donc utiliser les fonctions vl-catch-all-error-p et vl-catch-all-apply. Si le bloc n'est pas dans la colection on peut chercher son chemin avec (findfile bloc_R) :

 

(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
      )
    )
  )
(setq bloc_R (findfile bloc_R))
     ) 

 

Dans ce cas bloc_R doit avoir été spécifié avec l'extension .dwg et être dans un dossier du chemin de recherche d'AutoCAD.

 

Il peut être prudent de faire ce test avant le (vla-put-layer (vla-InsertBlock ...)) et même de ne lancer celui-ci qu'après un (if bloc_R ...)

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

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é