Aller au contenu

Messages recommandés

Posté(e)

Salut à tous!

 

Je vais essayer d'être le plus clair possible, j'ai déjà eu un bout de réponse par

patrick_35 en mp, mais ce n'est pas tout à fait ce que je recherche.

 

J'ai une liste de plans (chemin+nom de fichier), dans chacun d'eux se trouve une présentation

(dont nom diffère) un bloc ayant toujours le même nom. Celui est en fait un tableau contenant

des attributs.

Ce que je cherche, c'est pouvoir récolter les valeurs des attributs du bloc insérer dans le

dessin. Afin de ne pas perdre du temps pour rien, je cherche à le faire sans ouvrir le dessin.

 

Patrick m'a renvoyer sur son lisp DUC. j'ai toujours tendance à continuer mes lisp

tout en écrivant, et là, je crois avoir trouvé comment faire.

 

Je mettrai le code à la suite.

 

 

Tous pour lisp, Lisp pour tous!

Avec Revit, cela ne vas trop vite...

Posté(e)

Bon,

Ca marche, mais en partie seulement :( , comme mes blocs sont en espace papier,

je cherche donc dans paperspace. Mais le hic, le vla-get-PaperSpace renvoi les objets de

la présentation active (si le fichier a été sauvegarder en espace papier) ou la dernière présentation

vu avant l'espace objet.

Ce qui fait, que je ne suis pas forcément sur la bonne présentation, et donc je peux rater mon(es) bloc(s).

 

Voici le code (version brut ;) ):

;-------------------------------------;
; nom: ouvrir_dessin_dbx              ;
; role: ouvrir un dessin via ObjectDbx;
; param: dwg => chemin+nom de fichier ;
; retour: un dbx si ouverture réussie ;
;         nil si erreur               ;
; date: inconnue                      ;
; Patrick35 - Cadxp                   ;
;-------------------------------------;
(defun ouvrir_dessin_dbx(dwg / dbx)
(if (< (atoi (substr (getvar "ACADVER") 1 2)) 16)
	(setq dbx (vlax-create-object "ObjectDBX.AxDbDocument"))
	(setq dbx (vlax-create-object (strcat "ObjectDBX.AxDbDocument." (substr (getvar "ACADVER") 1 2))))
) ; if
 
(if (vl-catch-all-error-p (vl-catch-all-apply 'vla-open (list dbx dwg)))
	(progn
		(vlax-release-object dbx)
		nil
	) ; progn

  	dbx
) ; if
) ; ouvrir_dessin_dbx

;--------------------------------------;
; nom: get_val_att_bloc_ds_fichier     ;
; role: ouvre le dessin fichier via    ;
;       ObjectDbx afin de chercher la  ;
;       valeur de tous les attributs   ;
;       pour les blocs de nom bloc_name;
;       présent dans l'espace papier   ;
; param: bloc_name => nom de bloc      ;
;        fichier => chemin+nom         ;
; retour: une liste de liste sous cette;
;         forme:                       ;
;         (                            ;
;          (id_bloc1                   ;
;           presentation_name1         ;
;           (att1_name att1_val)       ;
;           (att2_name att2_val)       ;
;          ...                         ;
;          )                           ;
;          (id_bloc2                   ;
;           presentation_name2         ;
;           (att1_name att1_val)       ;
;           (att2_name att2_val)       ;
;          ...                         ;
;          )                           ;
;         )                            ;
;         nil si erreur                ;
; date: 08/12/2008                     ;
; BLAES Sébastien                      ;
;--------------------------------------;
(defun get_val_att_bloc_ds_fichier( bloc_name fichier );/ fonc_name res dbx obj res_tmp att)
 	(setq fonc_name "get_val_att_bloc_ds_fichier "
      res '()
      dbx (ouvrir_dessin_dbx fichier))

 	(if (/= dbx nil)
  	(progn
	  	; on construit la liste des calques
	  	(vlax-for lay (vla-get-layouts dbx)
			(if (/= (vla-get-Name lay) "Model")
				(progn
				    	; le pointeur BLOCK pointe vers lal iste des entités
				  	; présentent sur la présentation lay
				  	(vlax-for obj (vla-get-Block lay)
					  	;(print (vla-get-objectname obj))
					  	; si c'est un bloc et ayant le bon nom
					  	(if (and (eq (vla-get-objectname obj) "AcDbBlockReference")
							 (= (vla-get-Name obj) bloc_name))
						  	(progn
							  	(setq res_tmp (list (vla-get-ObjectID obj) (vla-get-Name lay)))
							  	; parcourt les attributs
							  	(foreach att (vlax-invoke obj 'getattributes)
								  	; on stocke le nom de l'attribut et sa valeur
									(setq res_tmp (append res_tmp (list (list (vla-get-TagString att) (vla-get-TextString att)))))
								)

							  	; on ajoute au résultat les données pour ce tableau
							  	(setq res (cons res_tmp res))
							); progn
						) ; if
					) ; vlax-for
				) ; progn
			) ; if
		) ; vlax-for
	  	
	  	(vlax-release-object dbx)
	) ; progn
) ; if

 	res
) ; get_val_att_bloc_ds_fichier

 

Comment scanner toutes les présentations ?!

Edit1: boucle sur les présentations => super, j'ai réussi ce que je voulais.

merci patrick et bred :)

 

[Edité le 8/12/2008 par bseb67]

Tous pour lisp, Lisp pour tous!

Avec Revit, cela ne vas trop vite...

Posté(e)

Salut,

Comment scanner toutes les présentations ?!

 

Tu récupères la présentation en vla et tu l'actives en bouclant :

(repeat (setq i (length (layoutlist)))
 (setq pres (vla-item (vla-get-Layouts (vla-get-activedocument (vlax-get-acad-object))) (nth (setq i (1- i)) (layoutlist))))
 (vla-put-ActiveLayout (vla-get-activedocument (vlax-get-acad-object)) pres)

 ... code ...

)

 

 

j'oubliais : dans mon exemple, à la place de (vla-get-activedocument (vlax-get-acad-object))), tu mets le dessin ouvert en "dbx" !...

 

[Edité le 8/12/2008 par Bred]

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

Posté(e)

salut bred,

 

euh, layoutlist je suis d'accord que cela renvoie les présentations du dessin,

mais moi ce n'est pas le dessin encours, mais celui ouvert avec ObjectDbx.

 

(vlax-for lay (vla-get-layouts dbx)
       (if (/= (vla-get-Name lay) "Model")
             (progn
                   ; et là il faut rendre actif la présentation
                   ; et faire ma boucle sur les objets
             ) ; progn
       ) ; if
) ; vlax-for

 

En fait dans cette boucle, il y a un élément qui s'appelle BLOCK, et qui pointe sur les entités

présentes dans la présentation. Donc c'est super, je modifie le lisp. :D

 

[Edité le 8/12/2008 par bseb67]

Tous pour lisp, Lisp pour tous!

Avec Revit, cela ne vas trop vite...

Posté(e)

Bonjour

 

Un petit coup de pouce ;)

 

(setq dbx (vla-get-activedocument (vlax-get-acad-object))) ; Pointer sur le document actif pour les tests

(vlax-for bl (vla-get-blocks dbx) ; Parcourir la table des blocs
 (and  (eq (vla-get-islayout bl) :vlax-true) ; Tester si c'est une présentation
(vl-string-search "*Paper_Space" (vla-get-name bl)) ; Tester si ce n'est pas le Model
   (vlax-for ent bl ; Parcourir les objets qui composent ma présentation
     (Ma_Recherche) ; Ma recherche
   )
 )
)

 

@+

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)
euh, layoutlist je suis d'accord que cela renvoie les présentations du dessin,

Ah oui, désolé, je me suis fait piégé tous seul en oubliant les choses en écrivant....

 

j'avais en fait commencé à écrire le code en passant par le (vlax-for lay (vla-get-layouts dbx)... et je suis revenu en arrière car je trouvais ça plus compliqué que le (layoutlist) car (vla-get-layouts dbx) te compte aussi l'espace objet, et qu'il faut donc le filtrer (je pense avoir compris dans ta demande que tu ne voulais pas l'espace objet.)

Donc fait attention de le faire si tu ne t'en étais pas rendu compte !

 

Edit : Patrick_35 t'as filer une méthode qu'il m'avais déjà donné !!!!.... et je l'avais oublié car elle ne fontionais pas dans l'exemple.... désolé...

 

[Edité le 8/12/2008 par Bred]

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

Posté(e)

Re

 

Je viens de penser à une méthode plus rapide

 

(setq dbx (vla-get-activedocument (vlax-get-acad-object))) ; Pointer sur le document actif pour les tests

(setq saut nil) ; Pour sauter l'objet Model
(vlax-for lay (vla-get-layouts dbx) ; Parcourir la table des présentations
 (and saut
      (setq bl (vla-get-block lay))
      (vlax-for ent bl ; Parcourir les objets qui composent le bloc de ma présentation
 (Ma_Recherche) ; Ma recherche
      )
 )
 (setq saut T)
)

 

@+

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)

Petit oubli de revenir pour donner les performances ;) .

Et bien, il n'y a pas photo :D :

Sur mon panel de test (164 fichiers dwg faisant 450Mo en tout)

- la version brut en ouvrant le dessin pour chercher les infos du bloc prenait 45min

- la nouvelle version grâce à ObjectDbx: 3min :cool:

Tous pour lisp, Lisp pour tous!

Avec Revit, cela ne vas trop vite...

Posté(e)

Bonjour

 

Petit oubli de revenir pour donner les performances ;) .

Et bien, il n'y a pas photo :D :

Sur mon panel de test (164 fichiers dwg faisant 450Mo en tout)

- la version brut en ouvrant le dessin pour chercher les infos du bloc prenait 45min

- la nouvelle version grâce à ObjectDbx: 3min :cool:

 

Ben, plus d'interface graphique. Ceci explique cela.

 

Maintenant, Ce qui serait bien, ce serait de trouver un équivalent à getfiledm de doslib en activex pour être complet.

 

@+

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

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é