chris_mtp Posté(e) le 23 août 2008 Posté(e) le 23 août 2008 Bonjour à tous, Existe til un moyen de changer l'attribut d'un calque si celui ci chevauche avec un autre ?Le but serait en fait non pas de supprimer les attributs qui se chevauchent mais les intégrer dans un calque afin de le geler lors de l'impression et d'avoir à l'arrivée un plan lisible. Merci par avance.John
(gile) Posté(e) le 23 août 2008 Posté(e) le 23 août 2008 Salut, Pour modifier une définition d'attribut : commande BATTMAN > Editer > onglet Propriétés ou avec l'éditeur de bloc (MODIFBLOC). Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
chris_mtp Posté(e) le 24 août 2008 Auteur Posté(e) le 24 août 2008 Merci gile pour ces infos mais le problème est que j'ai milliers d'attributs sur des blocs points topo. Le but serait en fait d'avoir un outil qui me permettrait de changer les attributs d'un bloc qui se chevauchent avec les autres lorsqu'on modifie l'échelle . Le principe en fait serait de : Sélectionner l'attribut du bloc en question qui chevauche (attribut matricule d'un bloc point)Indiquer une largeur de texte autour duquel aucun attribut ne doit se chevaucher (5 mm)Choisir le calque origine des attributs (origine)Choisir le calque de destintation des attributs à transférer (destination)Exécuter la commande. (les attributs qui se chevauchent seront dans le calque destination) Cet outil est semblable à celui de covadis édition NON CHEVAUCHEMENT ATTRIBUTSmais n'ayant pas covadis, ca pose problème. Depuis maintenant, je faisais tout çà à la main mais ca me prend un temps fou. J'ai trouvé je crois un lisp qui va dans le bon sens mais il faudrait le modifier (defun c:layatt (/ att elst name lay ent tag loop)(while(not(and (setq att (car (nentsel "\nSélectionnez l'attribut: ")))(setq elst (entget att))(= (cdr (assoc 0 elst)) "ATTRIB")(setq name (cdr (assoc 2 (entget (cdr (assoc 330 elst))))))))(princ "\nEntité non valide."))(while(not(and (setq lay (getstring T "\nSpécifiez le nom du calque: "))(tblsearch "LAYER" lay)))(princ (strcat "\nLe calque \"" lay "\" n'existe pas.")))(setq ent (cdr (assoc -2 (tblsearch "BLOCK" name)))tag (cdr (assoc 2 elst)))(while ent(setq elst (entget ent))(if (or(and (= (cdr (assoc 0 elst)) "ATTDEF")(= (cdr (assoc 2 elst)) tag))(= (cdr (assoc 0 elst)) "POINT"))(entmod (subst (cons 8 lay) (assoc 8 elst) elst)))(setq ent (entnext ent)))(command "_attsync" "_n" name)(princ)) Si tu peux m'aider, merci par avance.John
(gile) Posté(e) le 24 août 2008 Posté(e) le 24 août 2008 Salut, Je ne comprends pas bien en quoi les méthodes que j'ai donné ou ce LISP (que j'ai peut-être écrit) ne sont pas suffisantes. Si tu as des milliers de bloc "Point_Topo" insérérés, changer le calque d'un attribut de ce bloc avec une des méthodes sus-citée agira sur la définition du bloc, donc les milliers de références insérées seront modifiées. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
chris_mtp Posté(e) le 24 août 2008 Auteur Posté(e) le 24 août 2008 Désolé gile ne pas avoir été clair.Lorsque j'ai un plan au 2000ème et que je modifie la taille de mes blocs points avec attributs de 1 à 5, la taille de mon bloc et des attributs augmente.Jusque là pas de problème. Mais pour avoir un plan lisible à l'impression, je veux geler un calque dans lequel se trouvent les attributs chevauchant et n'afficher sur mon plan que certaines côtes. Ceci dans le but dans un plan clair et lisible et non un plan illisible. Je ne veux transférer d'un calque à un autre la totalité des attributs mais seulement ceux qui se chevauchent. C'est le même principe que la fonciton de covadis édition 'non chevauchement d'attribut' sauf que dans mon cas je n'ai pas covadis.Le lisp que j'ai trouvé sur un forum est bien de toi. Je ne sais pas si ce que je demande est facile à programmer sinon laisse tomber.Dis moi du moins si j'ai été assez clair et merci par avance de ton aide.Amicalement. John.
(gile) Posté(e) le 24 août 2008 Posté(e) le 24 août 2008 Re, Je ne connais pas Covadis donc la comparaison ne me parle pas. je modifie la taille de mes blocs points avec attributs de 1 à 5 mais seulement ceux qui se chevauchent Tu ne modifies pas l'échelle de toutes les références du bloc ? Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
chris_mtp Posté(e) le 24 août 2008 Auteur Posté(e) le 24 août 2008 Si bien sûr, je modifie la taille de tous mes blocs points. En fait, quand tu as 5 points topo (de 1 à 5) pris à 1m d'intervalle en ligne droite, si tu augmente la taille de ces blocs points de 1 à 5, tu vas avoir deschevauchements entre les attributs altitudes. Le but du lisp serait de changer de calque les attributs des points 1,2,4 et 5 de façon à n'afficher que le point 3 sur le plan.Mais surtout en ne supprimant pas les attributs des points 1,2 4 et 5, seulement en les changeant de calque.D'où l'idée de définir un intervalle entre les attributs.
lili2006 Posté(e) le 24 août 2008 Posté(e) le 24 août 2008 Bonjour à toutes et tous, chris_mtp, pourrais-tu mettre un fichier en ligne, depuis ce site par exemple ?(Si volumineux, préfère celui-ci) Je comprend bien ton problème car je le connais aussi, mais pas tous ici sont des spécialistes de topo qui possèdent covadis,... Effectivement, en fonction de l'echelle de sortie, la quantité de détail et de renseignements diffère. Si je n'ai pas covadis et que je veux règler le problème, je passe par l'éditeur de blocs, met tous les attributs dans le calque 0, bref, comme n'importe quel bloc. Ensuite j'affecte ces blocs à un seul calque. Ensuite, je les copie (COPYTOLAYER) sur un calque au 1/200, 1/500,..suivant les besoins ! Comme ceux-ci sont bien rangés dans un calque, je l'isole (_layiso) et j'assure un "filtrage" manuel, c'est à dire que je change la densification des points à afficher sur le plan. C'est d'ailleurs un peu l'esprit de ce qu'automatise covadis,... Le "filtrage" reste le choix du dessinateur ! Un exemple traité ici ! Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
chris_mtp Posté(e) le 24 août 2008 Auteur Posté(e) le 24 août 2008 Merci lili pour ta réponse.Jusqu'à maintenant, je choisis moi même un à un les attributs que j'intégre dans un calque gelé à l'impression pour rendre le plan lisible. J'arrive pas à intégrer même une image sur ce forum.Je suis nouveau en fait. Par contre, j'ai pu télécharger le fichier exemple. Mais pour le principe, si tu augmente à 10 la taille de tes blocs points dans ton fichier, ca provoque des chevauchements d'où ma question sur ce lisp. Est il possible d'avoir un lisp qui trie les attributs d'un dessin lorsque ceux ci chevauche de manière à les intégrer dans un calque différent de celui d'origine ? Je vais à nouveau essayer d'intégrer un fichier exemple.Merci tout de même.
lili2006 Posté(e) le 24 août 2008 Posté(e) le 24 août 2008 Re, Pour insérer un fichier, tu choisis les balises URL (la terre en icône ci-dessus) et tu colles l'adresse de ton fichier entre ces balises ! A consulter ! Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
lili2006 Posté(e) le 24 août 2008 Posté(e) le 24 août 2008 Re, Tu peux déjà réduire la hauteur de texte et son emplacement par rapport au point ! Eventuellement, aussi, changer de police. Sinon, il y a bonuscad qui propose des routines pas mal ici et notament "PtDef-XYZ_Field.lsp" , dans ton cas,... Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
(gile) Posté(e) le 24 août 2008 Posté(e) le 24 août 2008 Salut, J'avais tout compris de travers : je pensais que le changement d'échelle faisait se chevaucher les attributs au sein du même bloc. J'ai essayé un truc, l'utilisateur sélectionne un attribut et tout le blocs dont l'attribut chevauche d'autres attributs (dans la vue de dessus) sont placés sur un calque dont le nom est le nom du bloc avec le suffixe "_cache", ce calque est gelé. (defun c:cachatt (/ mxv AttBox Inside GetAtt att alst tag blst blk ss first lst) (defun mxv (m v) (mapcar (function (lambda (r) (apply '+ (mapcar '* r v)))) m ) ) (defun AttBox (att / elst box ref rot plst mat) (setq elst (entget att) box (textbox elst) ref (cdr (assoc 10 elst)) rot (cdr (assoc 50 elst)) mat (list (list (cos rot) (- (sin rot)) 0) (list (sin rot) (cos rot) 0) '(0 0 1) ) ) (mapcar (function (lambda (p) (mapcar '+ (mxv mat p) (list (car ref) (cadr ref))) ) ) box ) ) (defun inside (b1 b2) (or (and ( (or ( ( ) ) (and ( (or ( ( ) ) ) ) (defun getatt (blk tag / loop att val elst) (setq loop T att (entnext blk) ) (while loop (setq elst (entget att)) (if (= (cdr (assoc 2 elst)) tag) (setq loop nil) (setq att (entnext att)) ) ) att ) (if (and (setq att (car (nentsel "\nSélectionnez un attribut: "))) (setq alst (entget att)) (= (cdr (assoc 0 alst)) "ATTRIB") ) (progn (setq tag (cdr (assoc 2 alst)) blst (entget (cdr (assoc 330 alst))) blk (cdr (assoc 2 blst)) ss (ssget "_X" (list '(0 . "INSERT") (cons 2 blk) '(410 . "Model")) ) lst (mapcar (function (lambda (x) (cons (cadr x) (attbox (getatt (cadr x) tag)) ) ) ) (ssnamex ss) ) ) (while lst (setq first (cdar lst) lst (cdr lst) ) (foreach n lst (if (inside first (cdr n)) (progn (setq elst (entget (car n)) lst (vl-remove n lst) ) (entmod (subst (cons 8 (strcat blk "_cache")) (assoc 8 elst) elst ) ) ) ) ) ) ((lambda (l) (entmod (subst '(70 . 1) (assoc 70 l) l)) ) (entget (tblobjname "LAYER" (strcat blk "_cache"))) ) ) ) (princ) ) [Edité le 24/8/2008 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 24 août 2008 Posté(e) le 24 août 2008 Dans le même genre en prenant en compte l'emprise du bloc (defun c:hideblk (/ inside b-box blk doc lay name ss first lst) (vl-load-com) (defun inside (b1 b2) (or (and ( (or ( ( ) ) (and ( (or ( ( ) ) ) ) (defun b-box (obj) (vla-getboundingbox obj 'll 'ur) (mapcar 'vlax-safearray->list (list ll ur)) ) (if (and (setq blk (car (entsel "\nSélectionnez un bloc: "))) (setq blk (vlax-ename->vla-object blk)) (= (vla-get-ObjectName blk) "AcDbBlockReference") ) (progn (setq doc (vla-get-ActiveDocument (vlax-get-acad-object)) name (vla-get-Name blk) lay (strcat name "_hide") ) (vla-put-freeze (vla-add (vla-get-Layers doc) lay) :vlax-true) (vla-StartUndoMark doc) (ssget "_X" (list '(0 . "INSERT") (cons 2 name))) (vlax-for b (setq ss (vla-get-ActiveSelectionSet doc)) (setq lst (cons (cons b (b-box b)) lst)) ) (vla-delete ss) (while lst (setq first (cdar lst) lst (cdr lst) ) (foreach n lst (if (inside first (cdr n)) (progn (setq lst (vl-remove n lst)) (vla-put-Layer (car n) lay) ) ) ) ) (vla-EndUndoMark doc) ) ) (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
chris_mtp Posté(e) le 25 août 2008 Auteur Posté(e) le 25 août 2008 Merci gile encore une fois pour cê lisp qui va certainement en aider plus d'un.Ca fait déjà un bon gros tri.Les deux lisp sont en fait complémentaires. Par contre, si dans le second on pourrait définir une marge autour des blos de 5mm espace papier ou même entrer une distance manuelle de façon à agrandir l'emprise des blocs à prendre en compte, ce serait idéal mais sérieux bravo. John.
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