Blabla Posté(e) le 2 février 2015 Posté(e) le 2 février 2015 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
-Olivier- Posté(e) le 2 février 2015 Posté(e) le 2 février 2015 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
Blabla Posté(e) le 2 février 2015 Auteur Posté(e) le 2 février 2015 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
VDH-Bruno Posté(e) le 2 février 2015 Posté(e) le 2 février 2015 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
Patrick_35 Posté(e) le 2 février 2015 Posté(e) le 2 février 2015 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
VDH-Bruno Posté(e) le 2 février 2015 Posté(e) le 2 février 2015 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 .A+ Apprendre => Prendre => Rendre
Patrick_35 Posté(e) le 2 février 2015 Posté(e) le 2 février 2015 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 .Tu as tord car c'est pour tous les niveaux, même très bon. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Blabla Posté(e) le 2 février 2015 Auteur Posté(e) le 2 février 2015 Merci à vous deux :) Je teste tout cela demain et reviendrai vers vous. Bonne soirée, Blabla
VDH-Bruno Posté(e) le 2 février 2015 Posté(e) le 2 février 2015 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
-Olivier- Posté(e) le 2 février 2015 Posté(e) le 2 février 2015 Désolé je n'ai pas eu le temps de te répondre mais je vois que d'autres bien plus qualifié que moi t'on répondu. ;) Olivier
Blabla Posté(e) le 4 février 2015 Auteur Posté(e) le 4 février 2015 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
VDH-Bruno Posté(e) le 4 février 2015 Posté(e) le 4 février 2015 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
dealaus Posté(e) le 2 février 2017 Posté(e) le 2 février 2017 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.
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