phil_vsd Posté(e) le 25 août 2008 Posté(e) le 25 août 2008 Bonjour tous, J'ai fait une petite routine lisp pour mettre à jours les champs dynamiques : (setvar "fieldeval" 0)(command "mettreajourchamp" "tout" "") j'ai mis la variable fieldeval à zéro car j'ai des champs dyn dans mes X-ref qui se mettent à zéro si je fait un regen avec fieldeval à 31. Ces champs dans les X-ref se mettent aussi à zéro quand on imprime... Alors j'ai mis Fieleval sur 0. Par contre ma routine prend en compte tous les objets du dessin, je voudrais éparger les X-ref mais je ne sais pas encore fouiner les vla-get et autres choses en ce genre... J'ai voulu passer au travers en faisant : (command "-xref" "recharger" "tout" "") Cela aurait rechargé les X-ref qui se mettent à zéro mais si j'ai une X-ref "introuvable" ça bloque le process et sort de la fonction en cours... Questions : 1 - Comment exclure les X-ref lors de la routine "mettre à jour les champs" ?2 - Comment passer par dessus les X-ref introuvables pour que toutes les X-refs soient rechargées ? Merci d'avance. "La ligne droite est le plus court chemin entre deux points, à condition que les deux points soient bien en face l'un de l'autre" P. Desproges.
(gile) Posté(e) le 25 août 2008 Posté(e) le 25 août 2008 Salut, Je vais essayer de répondre aux question en "pur AutoLISP" (sans fonctions vla-*) 1) On fait un jeu de sélection avec tous les mtext et blocs de l'espace objet, puis pour chaque entité de jeu de sélection on teste si c'est une xref (setq ss (ssget "_X" '((410 . "Model")))) ; sélection de toutes les entités de l'espace Objet (setq n 0) ; compteur à 0 (while (setq ent (ssname ss n)) ; boucle sur chaque élément du jeu de sélection (setq elst (entget ent)) ; liste des données DXF de l'entité ;; si l'entité n'est pas... (if (not (and (= (cdr (assoc 0 elst)) "INSERT") ; ... un bloc... ( (cdr (assoc 70 (tblsearch "BLOCK" (cdr (assoc 2 elst))))) ) ) ) (command "_updatefield" ent "") ) (setq n (1+ n)); on ajoute 1 au compteur ) 2 - On peut boucler sur chaque objet de la table des blocs, chercher xrefs, tester si leur chemin est valide, et si c'est le cas on recharge. (while (setq blk (tblnext "BLOCK" (not blk))) (if ( (if (setq path (findfile (cdr (assoc 1 blk)))) ; ...si son chemin est valide... (command "_-xref" "_reload" (vl-filename-base path)) ; ...on le rcharge ) ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
phil_vsd Posté(e) le 25 août 2008 Auteur Posté(e) le 25 août 2008 Super ! Encore merci. Je me suis servi de ton cours sur l'Editeur. Bon courage pour tes tutos ! "La ligne droite est le plus court chemin entre deux points, à condition que les deux points soient bien en face l'un de l'autre" P. Desproges.
lili2006 Posté(e) le 25 août 2008 Posté(e) le 25 août 2008 Bonsoir à toutes et tous, Et ça donne quoi au final ? Merci d'avance, Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
phil_vsd Posté(e) le 25 août 2008 Auteur Posté(e) le 25 août 2008 Salut Lili2006, Ca passe en revue tous les Mtext et bloc qui contiennet des champs dynamiques et ça met à jour les champs. Et ça recharge les X-ref. J'utilise un bloc contenant un champs qui se met à jour selon la position sur l'axe des Y. Quand je fait des coupes de bâtiments je place un peu partout ces blocs là (Sur le TN, Planchers finis, étages...) ils me donnent l'altitude par rapport au SCU à condition de considérer le SGU comme le niveau de la mer. Je posterai une image demain. Tu me diras qu'en mettant Fieldeval à 31, on fait un coup de regen ou de Save et les champs se mettent à jour tous seuls mais les champs dyn des Xref se mettent à 00.00. Donc du coup il faut les recharger. Et comme j'ai plein d'Xref batardes qui traînent de fichiers extérieurs, il fallait une routine pour recharger seulement celles qui ont un chemin valide. Même si on met Fieldeval = 0, et que l'on fait "mettreajourchamp", on sélectionne en suite les blocs contenant des champs dynamiques à mettre à jour. On fait Regen, hé ben les champs dyn des X-ref se mettent à 00.00. Même si on les a pas touché d'un poil de souris.Un vrai casse tête ! Tu m'as compris ? (Parce q ue moi je me comprend pas à la relecture...) A++++ "La ligne droite est le plus court chemin entre deux points, à condition que les deux points soient bien en face l'un de l'autre" P. Desproges.
lili2006 Posté(e) le 25 août 2008 Posté(e) le 25 août 2008 Re, Tu m'as compris ? Sans problème, c'est même plutôt agréable à lire,.. Merci pour le développement de la réponse, ... Je n'avais jamais remarqué cette histoire de "champs dyn des Xref se mettent à 00.00" ??!! Bug ou variable ? Merci encore, Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
lovecraft Posté(e) le 25 août 2008 Posté(e) le 25 août 2008 Bonsoir, je n'ai pas autocad sous la main, as tu essayé des decharger les xrefs , de faire la mise à jour des champs , puis ensuite de recharger les xrefs ? Est ce que les champs dyn des xrefs sont mises à zéro apres cette opération.Autrement bravo Gile pour cette description de lisp. cela nous permet de mieux comprendre et par la même occasion d'apprendre. @plus LB http://www.youtube.com/user/CADMINATOR?feature=mhee
phil_vsd Posté(e) le 26 août 2008 Auteur Posté(e) le 26 août 2008 Hello, Salut Lovecraft, ta solution peut être bonne quand on n'a pas trop d'X-ref je pense. Mais faudra que j'essaie. Voilà ce que cela donne : http://images.imagehotel.net/78s0boiot2.jpg Sur cette image on voit mon grand "bassin" à droite qui est fait d'entité classiques (Pline, hachures...) et à gauche un petit puits qui est une X-ref. Dans cette X-ref il y a aussi mes petit bloc pour renseigner le lecteur sur l'alti. Le champ dynamique, pour avoir une pseudo altitude (pour ceux qui ne travaille qu'en 2D), est renseigné par la position Y : http://images.imagehotel.net/ffft780nbx.jpg En fait, il faut créer un petit bloc (Un point par exemple) que l'on appelera A et que l'on place dans un autre bloc B. B ressemble chez moi à une flêche et dans B il y a un champ Dyn qui donne la position Y du petit bloc A. Quand on créé le champ Dyn on prend "Objet" puis dans mon image numéro 2, au milieu en haut il nous demande de sélectionner un objet, c'est là que l'on doit choisir le bloc A. Faut penser à ne prendre que la valeur Y. A++ "La ligne droite est le plus court chemin entre deux points, à condition que les deux points soient bien en face l'un de l'autre" P. Desproges.
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