Aller au contenu

Récupérer le point d\'insertion d\'un block dans un block


Messages recommandés

Posté(e)

Bonjour,.

 

Je cherche le moyen de savoir comment récupérer le point d'insertion d'un block

qui est déjà dans un block lui même.

 

ex: j'ai un block qui s'appèle "X" et dans ce block j'ai un block qui s'appèle "Y".

 

j'aimerais savoir le point d'insertion du block "Y"...

 

voilà.....je ne sais plus où chercher..

Posté(e)

C'est drôle, je viens tout juste de voir cette question sur un site anglophone.

 

Mais restons en France : ici.

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Posté(e)

Salut...

 

He oui,...en fait je suis le même que l'autre site...

je viens juste de m'enregistrer..

 

cependant, je ne suis pas cappable de savoir comment capturer l'information...

 

Voici exactement ce que je cherche.

 

j'ai un block Y contenu dans un block X

je cherche le point d'insertion du block Y SANS FAIRE AUCUNE SÉLECTION !

 

voilà.

 

(entsel) ;;;On doit faire une sélection...

(nentsel);;;On doit faire une sélection...

 

si (tblsearch) est cappable de trouver le block.....pourquoi faut-il redemander encore ou se trouve le block avec un ssget ? n'est-il pas cappable de nous dire qu'il est dans un autre block et que ce block est ....!!?

 

Je pensais à qqchoses de plus simple.

autrement il va falloir faire un un filtre de sélection de block pour ensuite vérifier dans chaqu'uns de ces block si il y a un autre block....c'est un peu con.

mais bon....si ya pas d'autres moyen....j'vais y aller comme ca et...

étant donné que je suis vraiment ignorant dans les commande VLAX.....VLA etc..

j'apprend avec les exemples qu'on veux bien me donner.

 

Si je serai cappable de trouver comment dir que TEL block est dans TEL autre...

Je pourrai m'arranger tu-seul .

 

:exclam:

 

[Edité le 8/1/2007 par CADy]

Posté(e)

(defun dxf (code elist)    (cdr (assoc code elist))  )

(defun ptipto ( / );
 (setq ED (entget (tblobjname "BLOCK" "tonbloc")) ENT (dxf -2 ED) )

 (setq pti(dxf 10 (entget (tblobjname "BLOCK" "tonbloc"))))
 
 (setq ED(entget ENT) pto nil)
 
 (while (/= ENT nil)
   (setq ED (entget ENT))
   (if (= (dxf 0 ED) "INSERT"); si le dernier sous-bloc
     (setq pto(dxf 10 (entget (tblobjname "BLOCK" (dxf 2 ED)))))
     )
   (setq ENT (entnext ENT))
   )

 (if pto(mapcar '- pto pti))
 )

 

 

Ou quelque chose comme ca ?

 

Si ca ne fonctionne pas, alors il faut relire le bon sujet vers lequel je t'avais envoyé. Surtout en cas d'échelle et de rotation. Les moyens dépendent des problèmes.

 

[Edité le 8/1/2007 par Tramber]

 

[Edité le 8/1/2007 par Tramber]

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Posté(e)

Salut,

 

Sans faire aucune sélection, tu ne peux que récupérer des informations sur les définitions de bloc, par exemple, le point d'insertion du bloc Y dans le bloc X (c'est à dire par rapport au point de base du bloc X).

 

;; La "table" de la definition de bloc "X"
(setq def (tblsearch "BLOCK" "X"))

;; La première entité composant le bloc
(setq ent (cdr (assoc -2 def)))

;; On boucle sur tous les composants du bloc pour trouver le bloc imbriqué
(while ent
 (setq elst (entget ent))
 (if (and (= (cdr (assoc 0 elst)) "INSERT")
   (= (cdr (assoc 2 elst)) "Y")
     )
   (setq ins (cdr (assoc 10 elst)))
 )
 (setq ent (entnext ent))
)

;; Les coordonnées de "Y" dans "X"
ins 

 

Si tu veux connaître les coordonnées du point d'insertion de Y imbriqué dans une référence de X insérée dans le dessin, il faut ajouter les coordonnées du point d'insertion de X dans Y (voir plus haut) aux coordonnées du point d'insertion de la référence de X, et ces coordonnées tu ne peux les avoir qu'en faisant une sélection.

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

Posté(e)

tu ne peux les avoir qu'en faisant une sélection.

Pas forcement. ;)

En vlisp, en parcourant la table des blocks et en regardant si islayout est vrai, tu as tout le dessin

Regarde dans (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) 0) et tu remarqueras que c'est l'espace objet :o

le (vla-item .... 1) corresponds au premier onglet, etc...

 

@+

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)
Pas forcement.

En vlisp, en parcourant la table des blocks et en regardant si islayout est vrai, tu as tout le dessin

 

C'est vrai, mais parcourrir le dessin pour y trouver une (ou des ) référence de bloc revient au même que que parcourrir un jeu de sélection type (ssget "_X" '((0 . "INSERT"))) et c'est ce que CADy semblait vouloir éviter (de plus il dit ne pas être familier avec les fonctions vla-).

 

Sinon, avec intervention de l'utilisateur le plus simple me semble être :

 

(last (caddr (nentsel)))

 

[Edité le 8/1/2007 par (gile)]

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

Posté(e)
Pas forcement.

En vlisp, en parcourant la table des blocks et en regardant si islayout est vrai, tu as tout le dessin

 

C'est vrai, mais parcourrir le dessin pour y trouver une (ou des ) référence de bloc revient au même que que parcourrir un jeu de sélection type (ssget "_X" '((0 . "INSERT"))) et c'est ce que CADy semblait vouloir éviter (de plus il dit ne pas être familier avec les fonctions vla-).

 

Sinon, avec intervention de l'utilisateur le plus simple me semble être :

 

(last (caddr (nentsel)))[Edité le 8/1/2007 par (gile)]

 

WoO !!.. merci à tous de vouloir me donner un coup de main..

cependant, le problème c'est que le block " Y " en question peut se retrouver dans des block de noms différents......donc il faudrait savoir comment faire pour savoir à quel nom de block " Y " s'est-il caché..

 

exemple shématique:

 

1) Voir si le block " Y " existe

2) Dans quel block se retouve-t-il ?

3) Capturer les données de ce block contenant le block " Y "

4) filtrer chaque item pour y retrouver " Y " et y extraire le point d'insertion.

 

Est-ce faisable ?

 

Dans le fond,....c'est chercher une femme en ceinte pour y extraire les informations au sujet de son futur bébé...

 

[Edité le 8/1/2007 par CADy]

Posté(e)

Salut,

 

Vite fait à partir des routines du lien donné par Tramber.

 

Taper test, puis entrer le nom du bloc enfant à rechercher.

 

Je n'aurais pas le temps dans la journée de modifier ces LISP, mais d'autres s'en chargeront peut-être.

 

;;; Nested_coord Retourne une liste dont chaque élément est du type :
;;; (Nom_du_parent Coordonnées_l'enfant_dans_le_parent)
;;;
;;; L'argument est le nom du bloc dont on recherche les coordonnées dans les
;;; blocs dans lequels il est imbriqué (quelque soit le niveau d'imbrication).
;;;
;;; L'exécution du LISP peut prendre un peu de temps si la collection est fournie.

(defun nested_coord (enfant / temp_lst parent ent final_lst)
 ;; Dans un premier temps, la liste est constituée d'un seul élément :
 ;; le nom du bloc enfant et les coordonnées de son point de base.
 (setq	temp_lst
 (cons
   (cons enfant (cdr (assoc 10 (tblsearch "BLOCK" enfant))))
   temp_lst
 )
 )
 ;; On boucle sur chaque élément de la liste pour chercher dans chaque bloc de la table
 ;; si le bloc fait partie de ses composants. Si c'est le cas, le bloc parent est ajouté
 ;; en fin de liste et sera traité à son tour.
 (while temp_lst
   (setq parent (tblnext "BLOCK" T))
   (while parent
     (setq ent (cdr (assoc -2 parent)))
     (while ent
(if (and (= (cdr (assoc 0 (entget ent))) "INSERT")
	 (= (cdr (assoc 2 (entget ent))) (caar temp_lst))
    )
  ;; Ajout du nouveau bloc "parent" en fin de liste
  ;; Addition des coordonnées du point d'insertion du bloc enfant dans le
  ;; bloc parent et des coordonnées associées au bloc enfant
  (setq	temp_lst
	 (reverse
	   (cons
	     (cons
	       (cdr (assoc 2 parent))
	       (mapcar '+
		       (cdr (assoc 10 (entget ent)))
		       (cdar temp_lst)
	       )
	     )
	     (reverse temp_lst)
	   )
	 )
  )
)
(setq ent (entnext ent))
     )
     (setq parent (tblnext "BLOCK"))
   )
   (setq final_lst (cons (car temp_lst) final_lst)
  temp_lst  (cdr temp_lst)
   )
 )
 ;; Suppression de l'élément "enfant" de la liste
 (reverse (cdr (reverse final_lst)))
)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defun c:test (/ nest ss n ref r_lst n_lst)
 (setq nest "")
 (while (not (tblsearch "Block" nest))
   (setq nest (getstring "\nEntrez le nom du bloc recherché: "))
 )
 (if (setq ss (ssget "_A" '((0 . "INSERT"))))
   (repeat (setq n (sslength ss))
     (setq ref	  (ssname ss (setq n (1- n)))
    r_lst (entget ref)
    n_lst (nested_coord nest)
     )
     (if (assoc (cdr (assoc 2 r_lst)) n_lst)
(progn
  (setq
    c_lst (mapcar
	    'cdr
	    (vl-remove-if-not
	      '(lambda (x) (= (car x) (cdr (assoc 2 r_lst))))
	      n_lst
	    )
	  )
    c_lst (mapcar '(lambda (x)
		     (setq x (list
			       (* (car x) (cdr (assoc 41 r_lst)))
			       (* (cadr x) (cdr (assoc 42 r_lst)))
			       (* (caddr x) (cdr (assoc 43 r_lst)))
			     )
			   x (polar '(0 0 0)
				    (+ (angle '(0 0 0) x)
				       (cdr (assoc 50 r_lst))
				    )
				    (distance '(0 0 0) x)
			     )
			   x (trans (mapcar '+
					    (cdr (assoc 10 r_lst))
					    x
				    )
				    ref
				    1
			     )
		     )
		   )
		  c_lst
	  )
  )
  (princ (strcat "\nLe bloc \"" nest "\" imbriqué dans \"" (cdr (assoc 2 r_lst)) "\" est inséré en : "))
  (mapcar 'print c_lst)
)
(prompt	(strcat	"\nAucne imbrication du bloc \""
		nest
		"\" dans le bloc \""
		(cdr (assoc 2 r_lst))
		"\"."
	)
)
     )
   )
 )
 (textscr)
 (princ)
) 

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

Posté(e)

Salut

Une autre manière de faire ;)

 

(defun c:rin(/ bl bls ins js lay lst lstbl nom_bloc pt tot)
 (defun pts (bl)
   (vlax-for ent bl
     (if (eq (vla-get-ObjectName ent) "AcDbBlockReference")
       (progn
         (if (eq
               (if (vlax-property-available-p ent 'EffectiveName)
                 (vla-get-EffectiveName ent)
                 (vla-get-Name ent)
               )
               nom_bloc
             )
           (setq lst (append lst (list (mapcar '+ (trans pt 1 0) (vlax-get ent 'InsertionPoint)))))
         )
         (pts (vla-item bls (vla-get-name ent)))
       )
     )
   )
 )

 (if (setq nom_bloc (getstring T "\nVeuillez entrer le nom d'un bloc : "))
   (if (tblsearch "block" nom_bloc)
     (progn
       (vl-load-com)
       (setq nom_bloc (strcase nom_bloc) bls (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) pt '(0.0 0.0 0.0) tot 0 lstbl (list nom_bloc))
       (princ (strcat "\nRecherche des imbrications du bloc " nom_bloc))(princ)
       (acet-ui-progress-init "Avancement" (vla-get-count bls))
       (vlax-for bl bls
         (if (eq (vla-get-islayout bl) :vlax-false)
           (pts bl)
         )
         (if lst
           (setq lstbl (cons (vla-get-name bl) lstbl) lst nil)
         )
         (setq tot (1+ tot))
         (acet-ui-progress-safe tot)
       )
       (acet-ui-progress-done)
       (if (cdr lstbl)
         (progn
           (princ (strcat "\nLe bloc " nom_bloc " a été trouvé dans le(s) blocs(s)"))
           (foreach ent (cdr (reverse lstbl))
             (princ (strcat "\n" ent))
           )
           (setq tot 0)
           (setq ent (strcat (car lstbl) (apply 'strcat (mapcar '(lambda(x) (strcat "," x)) (cdr lstbl)))))
           (if (setq js (ssget "x" (list (cons 0 "INSERT") (cons 2 ent))))
             (progn
               (princ (strcat "\nRecherche des coordonnées du bloc " nom_bloc))(princ)
               (acet-ui-progress-init "Avancement" (sslength js))
               (while (setq ent (ssname js tot))
                 (setq ent (entget ent) pt (trans (cdr (assoc 10 ent)) 1 0))
                 (pts (vla-item bls (cdr (assoc 2 ent))))
                 (setq tot (1+ tot))
                 (acet-ui-progress-safe tot)
               )
               (setq liste_ins lst)
               (acet-ui-progress-done)
               (princ "\nFaites !liste_ins pour retrouver les coordonnées du bloc")
             )
             (princ "\nLe bloc n'a pas été inseré dans le dessin")
           )
         )
         (princ (strcat "\nLe bloc " nom_bloc " n'est pas imbriqué dans d'autres blocs"))
       )
     )
     (princ (strcat "\nLe bloc " nom_bloc " n'est pas dans le dessin."))
   )
 )
 (princ)
)

 

@+

 

[Edité le 9/1/2007 par Patrick_35]

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é