Aller au contenu

Chevauchement attributs


Messages recommandés

Posté(e)

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

Posté(e)

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 ATTRIBUTS

mais 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

Posté(e)

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

Posté(e)

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.

Posté(e)

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

Posté(e)

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 des

chevauchements 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.

Posté(e)

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/

Posté(e)

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.

 

 

Posté(e)

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

Posté(e)

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

Posté(e)

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.

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é