Aller au contenu

Coord. Bloc Imbri.


Messages recommandés

Posté(e)

Salut,

Je cherche à ressortir les coordonnées d'un bloc imbriqué précis dans un bloc par rapport au SCU ou au SCG...

 

Je réussis à ressortir en autolisp les entités d'un bloc imbriqué grâce à "tblsearch"... ... pour me rendre compte que le point d'insertion est donné par rapport au bloc de base (ou alors il y a quelque chose que je ne sais pas faire...)

 

Je me suis dit que peut être en vl les coordonnées serait donné par rapport au SCG... (???)

 

[surligneur] (gile)[/surligneur] m'a montré la procédure en vl pour ressortir les propriétés d'un objet grâce à (vlax-dump-object obj), mais je suis encore incapable de ressortir les propriétés d'un bloc imbriqué contenu dans cet objet... donc je ne sais même pas si je suis dans le bon chemin...

 

... si vous pouvez encore me guider....

 

.... merci d'avance.

 

 

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

Posté(e)

Salut,

 

Effectivement les coordonnées des entités composant une définition de bloc (ce que retourne tblsearch) sont définies par rapport au point de base du bloc.

 

Pour avoir ces coordonnées dans une référence du bloc (insérée dans le dessin) il suffit d'ajouter les coordonnées de l'entité dans le bloc aux coordonnées du point d'insertion de la référence de bloc.

 

Pour ajouter les coordonnées de deux points on fait :

 

(mapcar '+ pt1 pt2)

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

Posté(e)

il suffit d'ajouter les coordonnées de l'entité dans le bloc aux coordonnées du point d'insertion de la référence de bloc.

 

Encore une fois je suis allé un peu vite en besogne, ceci n'est valable que si la rotation est nulle et les échelles en X, Y et Z égales à 1.

 

Pour prendre en compte ces paramètres c'est un peu moins simple, exemple :

 

(setq ref (car (entsel))) ;_ Réference de bloc
(setq b_lst (entget ref)) ;_ Liste entget de la référence
(setq ins (cdr (assoc 10 b_lst))) ;_ Point d'insertion de la référence

(setq bloc (tblsearch "block" (cdr (assoc 2 b_lst)))) ;_ Définition du bloc

;; On parcourt les entités composant le bloc
;; pour trouver le bloc "sub_bloc" dans bloc
(setq ent (cdr (assoc -2 bloc)))
(while ent
 (setq e_lst (entget ent))
 (if (= (cdr (assoc 2 e_lst)) "sub_bloc")
   (setq coord (cdr (assoc 10 (entget ent)))) ;_ coordonnées de "sub_bloc" dans bloc
 )
 (setq ent (entnext ent))
)

;; Prise en compte des échelles en X, Y et Z
(setq coord (mapcar '* coord
		 (list (cdr (assoc 41 b_lst))
		       (cdr (assoc 42 b_lst))
		       (cdr (assoc 43 b_lst))
		 )
	 )
     )

;; Prise en compte de la rotation
(setq coord (polar '(0 0 0)
	   (+ (cdr (assoc 50 b_lst))
	      (angle '(0 0 0) coord)
	      )
	   (distance '(0 0 0) coord)
	   )
     )

;; Coordonnées du point d'insertion de "sub_ent" dans le SCG
(setq coord (mapcar '+ ins coord)) 

 

Attention ceci ne fonctionne que dans un SCU parallèle au SCG -code 210 = (210 0.0 0.0 1.0)- pour un fonctionnement en 3D, je tatonne encore.

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

Posté(e)

Attention ceci ne fonctionne que dans un SCU parallèle au SCG -code 210 = (210 0.0 0.0 1.0)- pour un fonctionnement en 3D, je tatonne encore.

 

Alors, là, tu exagères!!!... :cool:

tu pourrais être un peu plus serviable et m'aider un peu plus !!!... ;)

 

Serieusement :

merci...

pour arranger la chose, je bosse évidemment avec des blocs 3D....

 

encore merci de ton aide en tout cas...

 

 

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

Posté(e)

Bon voilà,

 

Il faut remplacer la dernière ligne de code :

;; Coordonnées du point d'insertion de "sub_ent" dans le SCG
(setq coord (mapcar '+ ins coord)) 

 

par :

;; Coordonnées du point d'insertion de "sub_ent" dans le SCG
(setq coord (mapcar '+
	    (trans ins (cdr (assoc 210 b_lst)) 0)
	    (trans coord (cdr (assoc 210 b_lst)) 0)
    )
)

 

qu'on peut écrire aussi :

(setq coord (mapcar '+
	    (trans ins ref 0)
	    (trans coord ref 0)
    )
) 

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

Posté(e)

Pour comparaison, la même chose en VisualLISP.

 

À noter, l'utilisation de VLAX-GET : (vlax-get ref 'InsertionPoint) retourne directement une liste contrairement à (vla-get-InsertionPoint ref) qui retourne un variant voir ce sujet.

 

(setq ref (vlax-ename->vla-object (car (entsel)))) ;_ Réference de bloc
(setq ins (vlax-get ref 'InsertionPoint)) ;_ Point d'insertion de la référence (SCG)

;; On parcourt les entités composant la définition de bloc
;; pour trouver la référence de bloc "sub_bloc" insérérée dans le bloc
(vlax-for obj (vla-item (vla-get-blocks
	      (vla-get-ActiveDocument (vlax-get-acad-object))
	    )
	    (vla-get-name ref)
  )
 (if (and
(= (vla-get-ObjectName obj) "AcDbBlockReference")
(= (vla-get-name obj) "sub_bloc")
)
   (setq coord (vlax-get obj 'InsertionPoint)) ;_ Point d'insertion de "sub_bloc" dans le bloc
   )
 )

;; Prise en compte des échelles en X, Y et Z
(setq coord (mapcar '* coord
		 (list (vlax-get ref 'XScaleFactor)
		       (vlax-get ref 'YScaleFactor)
		       (vlax-get ref 'ZScaleFactor)
		 )
	 )
     )

;; Prise en compte de la rotation
(setq coord (polar '(0 0 0)
	   (+ (vla-get-Rotation ref)
	      (angle '(0 0 0) coord)
	      )
	   (distance '(0 0 0) coord)
	   )
     )

;; Coordonnées du point d'insertion de "sub_ent" dans le SCG
(setq coord (mapcar '+
	    ins
	    (trans coord (vlax-get ref 'Normal) 0)
    )
) 

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

Posté(e)

Salut (gile)... :D

merci pour toutes tes réponses,je vais étudier tout ça avec attention....

(je n'ai pas eu le temp de m'y pencher aujourd'hui....)

Je te tiens au courant de tous mes tests et des problèmes (eventuels) que je rencontrerais.

 

merci encore.

Salutations.

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

Posté(e)

Salut...

Alors, j'ai testé, tripatouillé, etc.... (la version autolisp)

J'ai un souci : ça fonctionne pour les blocs imbriqué au 1 niveau... et je n'arrive pas à le faire fonctionner pour le bloc reférence à "X" niveau...

En fait (et c'est logique) il me donne les coordonnées d'après le bloc insérer, quand le bloc "sub_ent" et en 1er niveau, cela fonctionne.... donc il faut que je prenne comme point de référence le premier bloc, quelque soit le niveau d'imbrication...... je pense.... je cherche...

 

pour info voilà ou j'en suis, mais je crois que je ne suis pas bon du tout !!!... (mon sous-prog doit lister le point de ref du bloc quelque-soit le niv d'imbrication, et je ne sais pas comment faire!!!!...) :

 

 ;;;; sous-prog  [b] (mise en liste du ou des blocs ref)[/b]

(defun Tri_list (sel) 
   (setq index 0)
   (setq Nom_ent (ssname sel index)) 
   (while Nom_ent       
      (while Nom_ent     
   (if (or (equal (cdr (assoc 2 (entget Nom_ent))) "bloc_ref1") 
    (equal (cdr (assoc 2 (entget Nom_ent))) "bloc_ref2"))   

     ; si bon met dans liste
     (progn (setq list_d (append (list (cdr (car (entget Nom_ent)))) list_diag))
(setq Nom_ent (entnext Nom_ent))
)      
     ; si pas bon cherche sous-bloc
     (progn
(setq bloc (tblsearch "BLOCK" (cdr (assoc 2 (entget Nom_ent)))))
  (setq Nom_ent (cdr (assoc -2 bloc))) ; = 
) ))      
     (setq index (1+ index))
     (setq Nom_ent (ssname sel index))  )
)

 

  [b] mise en listes des coordonnées de  "sub_ent" (SCG)[/b]

(defun c:ttt ()
   (setq sel (ssget "_X" '((0 . "INSERT"))))
   (Tri_list sel) ; liste

   (setq compt 0)    
   
     (repeat (length list_d)

(setq Di (nth compt list_d)) 
(setq comp (1+ compt))	 
(setq ref (entget Di)) 
(setq ins (cdr (assoc 10 ref)))

;; On parcourt les entités composant le bloc
;; pour trouver le bloc "sub_ent" dans bloc 
(setq bloc (tblsearch "block" (cdr (assoc 2 ref)))) ;_ Définition du bloc
(setq ent (cdr (assoc -2 bloc))) ; ent = entité  (-2)

(while ent
  (setq e_lst (entget ent))
  (if (= (cdr (assoc 2 e_lst)) "sub_ent")
    (progn
      (setq coord (cdr (assoc 10 (entget ent))))
      (setq coord (mapcar '* coord (list (cdr (assoc 41 ref))
					 (cdr (assoc 42 ref))
					 (cdr (assoc 43 ref)))));; Prise en compte des échelles en X, Y et Z
      (setq coord (polar '(0 0 0)
			 (+ (cdr (assoc 50 ref))
			    (angle '(0 0 0) coord))(distance '(0 0 0) coord)));; Prise en compte de la rotation
      (setq coord (mapcar '+ (trans ins (cdr (assoc 210 ref)) 0)
			  (trans coord (cdr (assoc 210 ref)) 0)))
      (setq list_coord (append (list (cdr (assoc 10 (entget ent)))) list_coord))) ; liste coordonnées de "sub_ent" dans bloc
    )
  (setq ent (entnext ent))
  ) ; fin de while

) ; fin de repeat
   )

 

 

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

Posté(e)

Bon... je n'y arrive pas donc je jette (encore) une bouteille à la mer... car peut-être (certainement) je n'utilise pas une bonne méthode :

 

Ce que j'ai :

- Une multitude de "blocs" ou "wblocs" insérer, certain ayant plusieurs niveau d'imbrication...

- Dans ces blocs peut se trouver certains blocs ( bloc de référence) auxquel je doit faire un "test d'insertion" c'est à dire qu'il faut que je regarde comme il sont placé les uns par rapport aux autres car certaines configuration ne sont pas possible...

 

Ce que je voudrais faire :

- j'ai créér un cloc "Z_test" que j'ai insérer dans les blocs que je doit tester (2 blocs "Z_test" par bloc de référence).

- Ce bloc ("Z_test") est placé dans les " blocs de référence" de manière à ce que si ces blocs de références ne sont pas mis dans la bonne position l'un par rapport à l'autre, l'un des blocs "Z_test" de chaques " bloc de référence" ont le même point d'insertion (il se "chevauche"),... ce qui me permetrait d'y insérer un bloc permétant de désigner le problème "visuellement" ...

-... et pour "simplifier : ce sont des blocs 3D ...

 

... la proposition de (gile) - merci encore- ci-dessus permet de ressortir les point d'insertion de ces blocs "Z_Test" par rapport au " bloc de réference" ... mais si le bloc de référence est compris lui-même dans un bloc (à x niveau d'imbrication), ça fausse le résultat ... et je n'arrive pas à touver la solution ...

 

... mais je le répete, peut-être je n'utilise pas une bonne méthode, et une manière + simple permétrait de tester la position d'un bloc par rapport aux autres ...

 

merci

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

Posté(e)

Salut,

 

Je n'ai, en ce moment, qu'un accès limité à internet, je ne peux donc pas suivre les sujets comme d'habitude.

 

Voici une routine qui retourne une liste contenant le nom tous les blocs dans lesquels est inséré le bloc spécifié (argument de la routine) quelque soit le niveau d'imbrication.

 

Chaque élément de la liste est une liste contenant le nom du bloc parent et les coordonnées du bloc enfant dans le bloc parent.

 

;;; 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 / parent ent temp_lst final_lst)
 ;; On boucle sur chaque bloc de la table pour chercher si le bloc "Enfant" fait
 ;; parti des composants (imbrication niveau 1). Si c'est le cas, le bloc "Parent"
 ;; et les coordonnées de "Enfant" dans "Parent" sont ajoutés à la liste.
 (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))) enfant)
  )
(setq temp_lst (cons
		 (cons (cdr (assoc 2 parent))
		       (cdr (assoc 10 (entget ent)))
		 )
		 temp_lst
	       )
)
     )
     (setq ent (entnext ent))
   )
   (setq parent (tblnext "BLOCK"))
 )
 ;; On boucle sur chaque élément de la liste pour chercher dans chaque bloc de la table
 ;; si le bloc "Parent" fait parti de ses composants. Si c'est le cas, le bloc "Aïeul"
 ;; est ajouté en fin de liste et sera traité à son tour ceci pour trouver tous les
 ;; aïeuls (imbrication tous niveaux).
 ;; Les coordonnées du bloc "Parent" dans le bloc "Aïeul" sont ajoutées à celles
 ;; associées au bloc "Parent"
 (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 des nouveaux blocs "aïeuls" trouvés en fin de liste
  (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)
   )
 )
 final_lst
)

;;; La liste retounée peut être utilisée comme une liste associative (respecter la casse).
;;; Pour retrouver les coordonnées du bloc nommé "Enfant" dans le bloc nommé "Parent" :

(cdr (assoc "Parent" (nested_coord "Enfant")))

;;; Si le bloc "Enfant" est inséré plusieurs fois dans le bloc "Parent", il y a une occurence
;;; dans la liste pour chaque insertion (quelque soit le niveau d'imbrication).
;;; Pour récupérer les coordonnées de toutes les insertions de "Enfant" dans "Parent" :

(mapcar	'cdr
(vl-remove-if-not
  '(lambda (x) (= (car x) "Parent"))
  (nested_coord "Enfant")
)
) 

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

Posté(e)

merci (gile) de ta réponse, je vais regarder ça...

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

Posté(e)

Re,

 

La même, en plus élégant :

 

 ;;; 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)))
)

 

Pour récupérer les coordonnées du point d'insertion du bloc "Enfant" dans une référence

du bloc "Parent" insérée dans le dessin (ref_parent), on intègre d'abord les paramètres

d'insertion de ref_parent (échelle et rotation) puis on traduit la somme du point d'insertion

de ref_parent dans le dessin et du point de base de "Enfant" dans "Parent".

 

;; Coordonnées du point de base de "Enfant" dans le SCO de "Parent"

(setq coord (cdr (assoc "Parent" (nested_coord "Enfant"))))

;; Traduction du point de base de "Enfant" en fonction des paramètres d'insertion de "Parent".

(setq coord (list (* (car coord) (cdr (assoc 41 (entget ref_parent))))
	  (* (cadr coord) (cdr (assoc 42 (entget ref_parent))))
	  (* (caddr coord) (cdr (assoc 43 (entget ref_parent))))
    )
     coord (polar '(0 0 0)
	   (+ (angle '(0 0 0) coord)
	      (cdr (assoc 50 (entget ref_parent)))
	   )
	   (distance '(0 0 0) coord)
    )
)

;; Coordonnées du point de base de "Enfant" dans le SCU courant.

(setq scu_coord	(trans (mapcar '+
		       (cdr (assoc 10 (entget ref_parent)))
		       coord
	       )
	       ref_parent
	       1
	)
)

;; Coordonnées du point de base de "Enfant" dans le SCG.

(setq scg_coord	(trans (mapcar '+
		       (cdr (assoc 10 (entget ref_parent)))
		       coord
	       )
	       ref_parent
	       0
	)
)

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

Posté(e)

Re-merci (pas eu encore le temp de m'y pencher aujourd'hui), je regarderais tout-ça ce soir....

 

... heu, (gile), tant que j'y suis... j'abuse... :, j'ai lancer un post aussi ici

http:// http://www.cadxp.com/sujetXForum-11109.htm

 

... et je n'arrive pas à trouver de solution.... :mad: :casstet:

c'est dans le même genre que précedement ....

 

... merci...

 

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

Posté(e)

Re-Salut....

 

j'ai un doute : le resultat de ta routine me parait "bizarre" :

(j'appelerais bloc "de base" le bloc "parent" qui contient directement en 1er niveau d'imbrication le bloc "enfant")

 

- quand j'ai un bloc "de base" je n'ai en retour que les coordonnées des bloc "enfant" d'UN SEUL bloc "de base" (le premier insérer).... malgré plusieur bloc "de base" insérer ....

 

- par contre, lorque j'ai un bloc imbriqué contenant plusieurs bloc "de base", il me retourne bien la liste avec les coordonnées de tout les blocs "enfants" contenu dans le "parent", mais si ce bloc est copié ou insérer une seconde fois, il me donne toujours uniquement les coordonnées du 1er bloc imbriqué précedement ....

 

En fait, pour que ça fonctionne, il faut que je transforme la totalité du dessin en bloc.....

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

Posté(e)

Salut (gile)

J'ai testé ta routine et ça ne fonctionne pas. J'ai copie un bloc et j'ai créé un rectangle autour. Je transforme le tout en bloc nommé 1 en transformant les entités en bloc. J'ajoute un rectangle, je recréé un bloc nommé 2, je continu pour un faire un troisième.

Je fais un (setq a (tblsearch "block" "3")), puis un (setq b (entget (entnext (cdr (assoc -2 a))))), histoire de voir que tout se passe bien, puis un (entnext (cdr (assoc -1 b))) juste pour voir le b loc imbriqué et je trouve la réponse en nil ?

C'est ce qui me fait dire que ça ne fonctionne pas

 

@+

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)

Re-Salut Patrick,

j'essaye de répondre à la place de (gile) ;

 

Je fais un (setq a (tblsearch "block" "3")), puis un (setq b (entget (entnext (cdr (assoc -2 a))))), histoire de voir que tout se passe bien, puis un (entnext (cdr (assoc -1 b))) juste pour voir le b loc imbriqué et je trouve la réponse en nil ?

 

je ne connais pas (entnext (cdr (assoc -1 b))), personnellement je fais :

 

 (while (= sel nil)	(setq sel (ssget "_:S:E" '((0 . "INSERT")))))
(setq Nom_ent (ssname sel index))
(setq Def_bloc (tblsearch "BLOCK"  (cdr (assoc 2 (entget Nom_ent)))))
  
(setq Nom_ent_SSb (cdr (assoc -2 Def_bloc)))

;;; et plusieurs fois :
(entget (setq Nom_ent_SSb (entnext Nom_ent_SSb))) ;; = décomposition du bloc imbriqué

 

tu auras "petits à petits" toutes les pièces constituant ce bloc dans Nom_ent_SSb ...

... et c'est ce que fait (gile)

... mais tu dois le savoir.... mais je tente de répondre quand même ...

 

 

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

Posté(e)

Salut à vous,

 

L'algorythme me semblait plus simple en partant du bloc "enfant" et en recherchant tous le blocs dans lequel il est inséré (quelque soit le niveau d'imbrication). Cela permet à chaque fois que l'on trouve un bloc "parent" contenant le bloc "enfant" (comme composant direct ou comme comme composant imbriqué, d'ajouter les coordonnées.

 

Pour Bred,

 

Les coordonnées retournées par :

(setq coord (cdr (assoc "Parent" (nested_coord "Enfant"))))

sont les coordonnées du point de base de "Enfant" dans la définition du bloc "Parent".

Pour avoir les coordonnées de ce point dans chaque référence de "Parent" insérée dans le dessin, il faut les "traduire" en fonction de paramètres d'insertion de "Parent" et les ajouter au point d'insertion de la référence (voir réponse 11).

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

Posté(e)

Si j'ai bien compris la question première de Bred, la routine suivante retourne, dans la fenêtre de texte d'AutoCAD, les coordonnées dans le SCU des points d'insertion du "sous-bloc" spécifié dans la référence de bloc parent sélectionnée. Si le bloc "enfant" est imbriqué plusieurs fois dans le bloc "parent", les différentes insertions sont retournées.

 

(defun c:NestedInRef (/ nest n_lst ref)
 (setq nest "")
 (while (not (tblsearch "Block" nest))
   (setq nest (getstring "\nEntrez le nom du bloc recherché: "))
 )
 (prompt
   (strcat
     "\nSélectionnez la référence de bloc dans laquelle on recherche \""
     nest
     "\"."
   )
 )
 (while (not (setq ref (ssget "_:S:E" '((0 . "INSERT"))))))
 (setq	ref   (ssname ref 0)
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 "\" 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)
) 

 

PS : pour ne pas avoir de souci avec la casse du nom de bloc entré, il suffit de remplacer, dans NESTED_COORD la ligne :

 

(= (cdr (assoc 2 (entget ent))) (caar temp_lst))

 

par :

 

(= (strcase (cdr (assoc 2 (entget ent)))) (strcase (caar temp_lst)))

 

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

Posté(e)

Salut (gile)

merci pour ta proposition, je met dessus le plus vite possible !!!....

 

 

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

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é