LISP

arbtlm
Contributor
Contributor

LISP

arbtlm
Contributor
Contributor

Bonjour, j'aimerais une fonction permettant de tourner automatiquement l'attribut ALT du bloc TCPOINT parallele à la polyligne la plus proche.

Covadis permet la rotation suivant une polyligne unique et non pas la polyligne la plus proche avec un rayon de recherche.

 

1) selection des objets par une capture

2) Valider

3) la rotation de tous les attributs se fait automatiquement

 

Merci d'avance

 

En pièce jointe un extrait de mon fichier

0 J'aime
Répondre
Solutions acceptées (1)
1 397 Visites
11 Réponses
Replies (11)

CADaSchtroumpf
Advisor
Advisor

Bonjour,

 

Bien que je ne crois pas trop à ce genre de fonction magique!

Pour le fun j'ai fais cela rapidement pour te monter que le résultat souhaité risque d'être pire que l'initial.

Après le code est sommaire, voir si tu te sens de l'améliorer, pour ma part je juge inutile d'aller plus loin. Il faudrait construire des algos décisionnels et c'est une autre paire de manches...

 

Pour essayer tu copie-colles directement le code en ligne de commande.

((lambda ( / js d_ray n ent pt_ins js_pl nb ent_pl l_pl l_near l_d ent_near param deriv alpha)
  (setq js (ssget '((0 . "INSERT") (2 . "TCPOINT"))))
  (cond
    (js
      (initget 1)
      (setq d_ray (getdist (getvar "VIEWCTR") "\nDistance de recherche?: "))
      (repeat (setq n (sslength js))
        (setq
          ent (ssname js (setq n (1- n)))
          pt_ins (trans (cdr (assoc 10 (entget ent))) 0 1)
          js_pl (ssget "_C" (mapcar '- pt_ins (list d_ray d_ray 0.0)) (mapcar '+ pt_ins (list d_ray d_ray 0.0)) '((0 . "LWPOLYLINE")))
        )
        (cond
          (js_pl
            (repeat (setq nb (sslength js_pl))
              (setq
                ent_pl (ssname js_pl (setq nb (1- nb)))
                l_pl (cons ent_pl l_pl)
                l_near (cons (vlax-curve-getClosestPointTo ent_pl pt_ins T) l_near)
                l_d (mapcar '(lambda (x) (distance pt_ins x)) l_near)
                ent_near (nth (vl-position (apply 'min l_d) l_d) l_pl)
              )
            )
            (cond
              (ent_near
                (setq
                  param (vlax-curve-getParamAtPoint ent_near (vlax-curve-getClosestPointTo ent_near pt_ins T))
                  deriv (vlax-curve-getfirstderiv ent_near param)
                  alpha (atan (cadr deriv) (car deriv))
                )
                (vlax-put (vlax-ename->vla-object ent) 'Rotation alpha)
              )
            )
          )
        )
        (setq l_pl nil l_near nil l_d nil ent_near nil)
      )
    )
  )
))

arbtlm
Contributor
Contributor
Bonjour,

Merci pour le lisp, effectivement le résultat n’est pas celui attendu.
0 J'aime

patrick.emin
Alumni
Alumni

Bonjour,

Avez vous pu avancer de votre coté vers une solution?


Patrick Emin animateur de la communauté francophone


Vous avez trouvé un message utile? Alors donnez un "J'aime" à ce message!
Votre question a eu une réponse satisfaisante? Voulez vous avoir l'amabilité de cliquer sur le bouton
 APPROUVER LA SOLUTION  en bas de la réponse qui apporte une solution?
Signez notre Livre d'Or
0 J'aime

arbtlm
Contributor
Contributor

Non je suis toujurs dans l'attente d'une solution.

Cordialement

0 J'aime

patrick.emin
Alumni
Alumni
Le LISP posté ici vous donne-t-il une idée de ce qu'il faudrait faire?

Patrick Emin animateur de la communauté francophone


Vous avez trouvé un message utile? Alors donnez un "J'aime" à ce message!
Votre question a eu une réponse satisfaisante? Voulez vous avoir l'amabilité de cliquer sur le bouton
 APPROUVER LA SOLUTION  en bas de la réponse qui apporte une solution?
Signez notre Livre d'Or
0 J'aime

arbtlm
Contributor
Contributor

Non pas du tout, cela dépasse mes compétences.

 

0 J'aime

O_Eckmann
Mentor
Mentor

Bonjour,

 

dans le dessin, tous les blocs ont la même rotation, mais les attributs ont été tournés à l'intérieur. Or le Lisp proposé applique une rotation aux blocs donc les rotations relatives internes des attributs ne permettent pas d'aligner les attributs sur les polylignes.

2 solutions:

- BATTMAN pour synchroniser les attributs, ce qui réinitialise les rotations donc les attributs se retrouvent bien parallèle à la ligne la plus proche, mais ça réinitialise également la position des attributs sur les blocs non proches

- modifier le Lisp pour faire tourner les attributs au lieu du bloc

Autre solution, ça ressemble à des points topo issus de Covadis. Si c'est un levé codé, modifier la table de géocodification pour appliquer une rotation au points topo et les aligner sur la ligne la plus proche dès le traitement.

 

Olivier

Olivier Eckmann

EESignature

arbtlm
Contributor
Contributor

Les points sont bien généré avec Covadis mais ce n'est pas une codification Covadis donc pas possibilité d'avoir cette option lors de la génération.

Cordialement

0 J'aime

arbtlm
Contributor
Contributor

Pourquoi le lisp ne fonctionne pas sur ce fichier ?

LISP puis fonction BATTMAN

 

Cordialement

0 J'aime

O_Eckmann
Mentor
Mentor
Solution acceptée

Bonjour,

 

le lisp ne recherche que les polylignes allégées (LWPOLYLINE) or le dessin ne contient que des polyligne 2D (POLYLINE), donc il faut convertir les anciennes poly en nouvelle avec la commande CONVERT puis option P  puis option T

 

Dans ce dessin, les points topo sont codés (voir si table de codif bien adaptée)

 

Olivier

Olivier Eckmann

EESignature

patrick.emin
Alumni
Alumni

@arbtlm Bonjour,

Votre problème a-t-il été résolu? Si oui, pouvez vous nous indiquer de quelle façon pour que cela profite à la communauté, si non, pouvez vous nous dire si vous avez pu essayer les suggestions qui vous ont été faites?

Si une des réponses à votre question résout votre problème, vous a permis de le comprendre ou contribue significativement à sa résolution, voulez vous avoir l'amabilité de cliquer sur le bouton "Accepter comme solution" en bas de la réponse? Merci.


Patrick Emin animateur de la communauté francophone


Vous avez trouvé un message utile? Alors donnez un "J'aime" à ce message!
Votre question a eu une réponse satisfaisante? Voulez vous avoir l'amabilité de cliquer sur le bouton
 APPROUVER LA SOLUTION  en bas de la réponse qui apporte une solution?
Signez notre Livre d'Or
0 J'aime