Aller au contenu

[résolu] Lisp convertir texte en lignes de repère


Messages recommandés

Posté(e)

Bonjour à tous,

 

n'ayant pas le temps et surtout les compétences nécessaires afin de réaliser le lisp dont je décris la fonction plus bas,

 

je me permet de demander si un pro du lisp pourrais me coder ce dont j'ai besoin ;)

 

Situation :

 

Je réalise actuellement un plan de réseaux d'évacuations d'eau usée enterrés sur un gros bâtiment.

Pour info, le réseau est réalisé en polyligne.

 

- J'utilise un lisp "zfe" (et j'en profite au passage pour remercier son auteur "joch04" d'avoir partagé le fruit de son travail) qui calcule les fils d'eau du réseau à chaque sommet de la polyligne (après avoir renseigné le fil d'eau de départ, et la pente du réseau)

- Ce lisp ajoute (sur un calque "ZFE" qu'il crée ) un texte (pas un Mtext) contenant le fil d'eau calculé. Le point d'insertion "Bas Gauche" de ce texte est situé sur le sommet calculé de la polyligne.

 

Ma demande :

 

- Serait-il possible d'avoir un lisp qui, quand on cliquerait sur un de ces textes, transformerait ce dernier en ligne de repère (en utilisant le style de ligne de repère "courant" du plan)

- La pointe de la flèche étant positionnée au point d'insertion du texte sélectionné.

- le petit plus (mais pas forcément nécessaire) serait que le lisp demande où positionner le texte de la ligne de repère en cliquant sur un point du dessin

 

Voilà, j'espère que quelqu'un aura la gentillesse, le temps et la motivation pour réaliser ce lisp qui me soulagerait d'une tâche relativement fastidieuse.

 

Merci ;)

Raph.

Celui qui pose une question est bête 5 minutes, celui qui n'en pose pas l'est toute sa vie !

Posté(e)

Salut,

 

(defun c:text2leader (/ ent elst txt p0 p1)
 (and
   (setq ent (car (entsel "\nSélectionnez le texte: ")))
   (setq elst (entget ent))
   (= (cdr (assoc 0 elst)) "TEXT")
   (setq txt (cdr (assoc 1 elst)))
   (setq p0 (trans (cdr (assoc 10 elst)) ent 1))
   (setq p1 (getpoint p0 "\nEntrez le point suivant: "))
   (command "_.leader" p0 p1 "" txt "" "_erase" ent "")
 )
 (princ)
)

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Je te remercie beaucoup (gile) c'est exactement ce que je recherchais wink.gif

 

je vais en profiter pour étudier ça afin de comprendre comment tu as procédé cool.gif

 

Nota : J'ai changé "_.leader" en "_.mleader" ce qui correspond plus à mes attentes.

 

Une question : pourquoi avoir mis une fonction AND au début ?

Raph.

Celui qui pose une question est bête 5 minutes, celui qui n'en pose pas l'est toute sa vie !

Posté(e)

Salut

 

La fonction And (tant que ...) permet de tester si toutes les conditions sont remplies afin de lancer la commande.

 

La lecture du lisp

Si tu fais une sélection (non nil)

Je récupère les codes dxf dans un setq, la valeur est forcement non nil

Si c'est un texte (valeur vraie)

Je définies des variables, les valeurs sont forcement non nil

Alors je fais ma commande

 

En résumé (and (non nil) (non nil) T (non nil) (non nil) (non nil) Ma_commande)

 

@+

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

Posté(e)

blink.gif

 

 

 

Patrick tu ma tuer laugh.gif

 

 

 

Va vraiment falloir que je potasse le cours lisp de rebcao qui dors chez moi depuis pas mal de temps.

Raph.

Celui qui pose une question est bête 5 minutes, celui qui n'en pose pas l'est toute sa vie !

Posté(e)

Avec mleader, je modifierais un peu la commande pour paramétrer le nombre de points à 2 dans les options. Si la valeur courante est différente la commande plantera.

 

L'utilisation du (and ...) permet juste un code plus concis mais pas forcément plus compréhensible. C'est un peu dévoyer la finalité d'opérateur logique du and (qui retourne T ou nil) pour n'utiliser que "l'évaluation de court-circuit" (l'évaluation s'arrête et retourne nil dès qu'une expression retourne nil).

 

Plus conventionnellement, on écrirait :

 

(defun c:text2mleader (/ ent elst txt p0 p1)
 (if (setq ent (car (entsel "\nSélectionnez le texte: ")))
   (progn
     (setq elst (entget ent))
     (if (= (cdr (assoc 0 elst)) "TEXT")
       (progn
         (setq txt (cdr (assoc 1 elst)))
         (setq p0 (trans (cdr (assoc 10 elst)) ent 1))
         (setq p1 (getpoint p0 "\nEntrez le point suivant: "))
         (command "_.mleader" "_Options" "_Maxpoints" 2 "_eXit" p0 p1 txt "_erase" ent "")
       )
       (prompt "\nL'objet sélectionné n'est pas un texte.")
     )
   )
   (prompt "\nAucun object sélectionné.")
 )
 (princ)
)

 

Mais les opérateurs logiques permettent aussi d'alerter l'utilisateur en cas de saisie incorrecte. Comme and, or retourne T dès qu'une des expressions qui lui sont passées retourne une valeur non nil ou nil si elles sont toutes nil.

(defun c:text2mleader (/ ent elst txt p0 p1)
 (and
   (or
     (setq ent (car (entsel "\nSélectionnez le texte: ")))
     (prompt "\nAucun objet sélectionné.")
   )
   (setq elst (entget ent))
   (or
     (= (cdr (assoc 0 elst)) "TEXT")
     (prompt "\nL'objet sélectionné n'est pas un texte.")
   )
   (setq txt (cdr (assoc 1 elst)))
   (setq p0 (trans (cdr (assoc 10 elst)) ent 1))
   (setq p1 (getpoint p0 "\nEntrez le point suivant: "))
   (command "_.mleader" "_Options" "_Maxpoints" 2 "_eXit" p0 p1 txt "_erase" ent "")
 )
 (princ)
)

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

tout simplement génial ... merci encore les gars ;)

Raph.

Celui qui pose une question est bête 5 minutes, celui qui n'en pose pas l'est toute sa vie !

  • 7 ans aprè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 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é