Aller au contenu

[Résolu] Insérer un bloc par rapport à l'attribut d'un autre bloc


Blabla

Messages recommandés

Bonjour,

 

Utilisateur de l'ombre depuis plusieurs années, je me suis enfin créé un profil car j'ai là une question dont je n'ai pas trouvé la réponse dans l'immensité de ce forum.

 

Je suis sous AutoCAD "classique" 2011 et dispose actuellement de plusieurs relevés topographiques comportant seulement des points sous forme de blocs avec attributs renseignés en XYZ.

Le premier attribut indique le numéro du point, le second indique l'altitude et le dernier indique un code correspondant au nom d'un bloc (par exemple: "EP-Grille", "EU-Regard", etc...) du gabarit que j'utilise habituellement.

 

Ma question est la suivante : comment puis-je insérer les blocs correspondant aux noms indiqués dans ce troisième attribut ?

 

Je pense qu'il va me falloir passer par un script mais mes connaissances sont beaucoup trop limités sur le sujet, c'est pour cela que j'ai besoin de votre aide ;)

 

Merci par avance,

 

Blabla

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Blabla et bienvenu sur le forum,

 

Il va falloir est un peu plus précis sur le mode de fonctionnement que tu souhaite.

Je résume ce que j'ai compris.

 

1/ Sélection du bloc A contenant les informations

 

- Sélection par clic, un par un.

- Sélection de tous les blocs de même noms dans le dessin (préciser le noms si toujours le même)

 

2/ Emplacement bloc à insérer B

 

- Déjà dans le dessin

- Emplacement spécifique ?

 

3/ Position du bloc insérer B

 

- Position du bloc A

- Position donnée par un ou des attribut(s) du bloc A quel nom(s) sous quelle forme ?

- Cliqué par l'utilisateur

 

A+

Olivier

Lien vers le commentaire
Partager sur d’autres sites

Merci de ta réponse -Olivier- et merci de l'accueil

 

Dans le fichier topo, j'ai tout mon relevé sous forme de références de blocs qui s'appellent tous "SRVPNO2" (Bloc A)

Ils comportent trois attributs :

  • "PT#" qui indique le numéro du point
  • "ELEV2" qui indique son altitude
  • "DESC2" qui indique le nom du bloc qui doit être inséré (par exemple: "EP-AVALOIR" ou "EP-REGARD-RG")

 

Mes blocs à insérer (Bloc B ) sont déjà présent dans le fichier, à des coordonnées différentes mais connus (dans le cas de "EP-AVALOIR" en X=244.8866, Y=145.0699, Z=0.0000 et dans celui de "EP-REGARD-RG" en X=244.8866, Y=147.0699, Z=0.0000).

 

Je souhaite que mon bloc B soit inséré aux mêmes coordonnées de chaque bloc A qui comporte le nom du bloc B dans ses attributs.

 

J'espère que mes explications t'en apprennent plus sur mes besoins.

 

Cordialement,

 

Blabla

Lien vers le commentaire
Partager sur d’autres sites

Bonjour et bienvenu

 

Rapidement à la lecture de ton énoncé, un petit lisp à tester...

Tape insDesc2 pour l'exécuter une fois le lisp chargé.

(defun c:insDesc2 (/ ss i e valDesc2 e-dxf ptins rot zdir)

 ;; GetAttribs (gile)
 ;; Retourne une liste de paire pointées (TAG . Value) par attribut contenus dans le bloc
 ;;
 ;; Argument
 ;; ent : le nom d'entité (ENAME) de la référence de bloc
 (defun GetAttribs (ent / elst lst)
   (setq ent (entnext ent))
   (while (= "ATTRIB" (cdr (assoc 0 (setq elst (entget ent)))))
     (setq lst (cons (cons (cdr (assoc 2 elst)) (cdr (assoc 1 elst))) lst)
           ent (entnext ent)
     )
   )
   (reverse lst)
 )

 ;; insertion du bloc (retourne le ENAME)
 (defun insblk (bname ins ang zdir)
   (entmakex
     (list
       '(0 . "INSERT")
       (cons 2 bname)
       (cons 10 ins)
       (cons 50 ang)
       (cons 210 zdir)
     )
   )
 )

 
;; Programme principal
 (setq ss (ssget "_X" '((0 . "INSERT") (2 . "SRVPNO2"))))                   
 
 (repeat (setq i (if ss (sslength ss) 0))
   (setq e        (ssname ss (setq i (1- i)))
         valDesc2 (cdr (assoc "DESC2" (getattribs e)))
         e-dxf    (entget e)
         ptins    (cdr (assoc 10 e-dxf))
         rot      (cdr (assoc 50 e-dxf))
         zdir     (cdr (assoc 210 e-dxf))
   )
   (if (and valDesc2 (tblsearch "block" valDesc2))
     (insblk valDesc2 ptins rot zdir)
   )
 )
 (princ)
)

A+

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

Salut

 

Par exemple en vlisp

(defun c:blo(/ blo doc esp sel)
 (setq doc (vla-get-activedocument (vlax-get-acad-object)))
 (vla-startundomark doc)
 (and (ssget (list (cons 0 "insert") (cons 2 "SRVPNO2") (cons 66 1)))
   (progn
     (if (eq (getvar "cvport") 1)
(setq esp (vla-get-paperspace doc))
(setq esp (vla-get-modelspace doc))
     )
     (vlax-for blo (setq sel (vla-get-activeselectionset doc))
(foreach att (vlax-invoke blo 'getattributes)
  (and  (eq (vla-get-tagstring att) "DESC2")
	(tblsearch "block" (vla-get-textstring att))
    (vla-insertblock esp
		     (vla-get-insertionpoint blo)
		     (vla-get-textstring att)
		     (vla-get-xScalefactor blo)
		     (vla-get-yScalefactor blo)
		     (vla-get-zScalefactor blo)
		     (vla-get-rotation blo)
    )
  )
)
     )
     (vla-delete sel)
   )
 )
 (vla-endundomark doc)
 (princ)
)

 

Bruno : J'ai vu que tu traînais tes guêtres un peu partout dans les forum lisps ;)

 

@+

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

Lien vers le commentaire
Partager sur d’autres sites

Bruno : J'ai vu que tu traînais tes guêtres un peu partout dans les forum lisps ;)

T'inquiète ça va pas durer, disons que je profite de ce début d'année pour me refaire un peu la main (j'ai peu lispé sur l'année 2013 et 2014).

Tu es bien visible également, il me semble même t'apercevoir à l'international, moi j'y suis pas :rolleyes: .

A+

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

T'inquiète ça va pas durer, disons que je profite de ce début d'année pour me refaire un peu la main (j'ai peu lispé sur 2013 et 2014).

Je suis comme toi, j'en profite en ce moment :D

 

Tu es bien visible également, il me semble même t'apercevoir à l'international, moi j'y suis pas :rolleyes: .

Tu as tord car c'est pour tous les niveaux, même très bon.

 

@+

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

Lien vers le commentaire
Partager sur d’autres sites

Merci à vous deux :)

Je teste tout cela demain et reviendrai vers vous.

Il n'y a pas de quoi, l'énoncé était clair, bon teste à toi.

 

Tu as tord car c'est pour tous les niveaux, même très bon.

J'en suis convaincu, mais les traducteurs automatiques me fatiguent, j'ai une compréhension très partiel des questions, ce qui me relègue au rang de spectateur, comme c'est frustrant de ne pouvoir échanger, j'y suis rarement. Mais j'ai beaucoup de plaisir à vous y voir toi et quelques autres de CADxp.

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

Messieurs,

 

J'ai fait un premier test avec le lisp de VDH-Bruno et il marche terriblement bien :)

Je verrai ce que ça donne sur mes autres fichiers mais je ne me fais plus de soucis ;)

 

Encore merci à tous ceux qui ont participé à ce topic.

 

Amicalement,

 

Blabla

Lien vers le commentaire
Partager sur d’autres sites

J'ai fait un premier test avec le lisp de VDH-Bruno et il marche terriblement bien :)

 

Merci du retour, si tu avais également testé celui de Patrick_35, tu te serais peut être aperçu, qu'il prenait en compte l'échelle d'insertion des blocs.

 

Ci-dessous une version mise à jour du code au cas ou l'échelle d'insertion aurait son importance.

 

(defun c:insDesc2 (/ ss i e valDesc2 e-dxf)
 
 ;; GetAttribs (gile)
 ;; Retourne une liste de paire pointées (TAG . Value) par attribut contenus dans le bloc
 ;;
 ;; Argument
 ;; ent : le nom d'entité (ENAME) de la référence de bloc
 (defun GetAttribs (ent / elst lst)
   (setq ent (entnext ent))
   (while (= "ATTRIB" (cdr (assoc 0 (setq elst (entget ent)))))
     (setq lst (cons (cons (cdr (assoc 2 elst)) (cdr (assoc 1 elst))) lst)
           ent (entnext ent)
     )
   )
   (reverse lst)
 )
 
 ;; Programme principal
 (setq ss (ssget "_X" '((0 . "INSERT") (2 . "SRVPNO2"))))
 (repeat (setq i (if ss
                   (sslength ss)
                   0
                 )
         )
   (setq e        (ssname ss (setq i (1- i)))
         valDesc2 (cdr (assoc "DESC2" (getattribs e)))
         e-dxf    (entget e)
   )
   (if (and valDesc2 (tblsearch "block" valDesc2))
     (entmakex (list '(0 . "INSERT")
                     (cons 2 valDesc2)
                     (cons 10 (cdr (assoc 10 e-dxf)))
                     (cons 41 (cdr (assoc 41 e-dxf)))
                     (cons 42 (cdr (assoc 42 e-dxf)))
                     (cons 43 (cdr (assoc 43 e-dxf)))
                     (cons 50 (cdr (assoc 50 e-dxf)))
                     (cons 210 (cdr (assoc 210 e-dxf)))
               )
     )
   )
 )
 (princ)
)

 

A+

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

  • 1 an après...

Bonjour,

J'espère avoir la bonne démarche en continuant ce topic, mon projet étant similaire , si ce n'est pas le cas je m'en excuse par avance.

 

Voilà mon idée :

Sur un plan d'implantation d'un niveau j'ai plusieurs modules d'entrée/sorties sur lesquels je connecte d'autres équipements.

J'ai créé le bloc du module avec des attributs pour chacunes des entrées qui s'appellent voie1, voie2,voie 3... Jusqu'à voie8.

Les blocs des équipements que j'y connecte ont aussi des attributs : le code de l'équipement, le local où il est implanté, le code du local et d'autres caractéristiques.

Tous ces blocs sont sur le même dessin.

Dans un premier temps j'ai renseigné

les codes des équipements dans les attributs du module voie1,voie2...

Mon idée est de trouver un Lisp qui me permettra en "cliquant" sur le module de générer un petit schéma constitué des mêmes blocs que dans le dessin où seront représentés le module et tous les équipements qui y sont connectés en rappatriant aussi les valeurs des attributs de chacun. Une polyligne symbolisera la liaison entre le module et les équipements.

Au final je copierai collerai ce schéma vers un autre dessin ce qui permettra de ne pas faire de doublons.

 

J'espère avoir été assez clair et vous remercie pour votre aide.

Lien vers le commentaire
Partager sur d’autres sites

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é