CADy Posté(e) le 8 janvier 2007 Posté(e) le 8 janvier 2007 Bonjour,. Je cherche le moyen de savoir comment récupérer le point d'insertion d'un blockqui 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..
Tramber Posté(e) le 8 janvier 2007 Posté(e) le 8 janvier 2007 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 ./__\. (.°=°.)
CADy Posté(e) le 8 janvier 2007 Auteur Posté(e) le 8 janvier 2007 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 Xje 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]
Tramber Posté(e) le 8 janvier 2007 Posté(e) le 8 janvier 2007 (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 ./__\. (.°=°.)
(gile) Posté(e) le 8 janvier 2007 Posté(e) le 8 janvier 2007 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
Patrick_35 Posté(e) le 8 janvier 2007 Posté(e) le 8 janvier 2007 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 dessinRegarde dans (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) 0) et tu remarqueras que c'est l'espace objet :ole (vla-item .... 1) corresponds au premier onglet, etc... @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 8 janvier 2007 Posté(e) le 8 janvier 2007 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
CADy Posté(e) le 8 janvier 2007 Auteur Posté(e) le 8 janvier 2007 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 " existe2) 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]
(gile) Posté(e) le 9 janvier 2007 Posté(e) le 9 janvier 2007 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
Patrick_35 Posté(e) le 9 janvier 2007 Posté(e) le 9 janvier 2007 SalutUne 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant