Cadiste Posté(e) le 9 novembre 2015 Posté(e) le 9 novembre 2015 Bonjour, Je reviens vers vous, je dois copier des propriétés d'objets (rotation, longueur)et je ne trouve pas comment faire en AutoLisp. Même en me documentant sur le LISP, je n'y arrive toujours pas. J'avais une première problématique résolue, pour copier des coordonnées X Y dans ces mêmes tables depuis des blocs, grâce au forum .. ;-) (ici le bloc HYDRAN dans le calque AEP_HYDRAN)Voici le code: ((lambda ( / js ent pt) (setq js (ssget '((0 . "INSERT") (2 . "AEP_HYDRAN") (8 . "AEP_HYDRAN")))) (repeat (setq n (sslength js)) (setq ent (ssname js (setq n (1- n))) pt (cdr (assoc 10 (entget ent))) ) (ade_odsetfield ent "HYDRANT" "X" 0 (car pt)) (ade_odsetfield ent "HYDRANT" "Y" 0 (cadr pt)) ) )) Je sais que je peux repartir sur la base de ce code pour renseigner: > la longeur d'objets liénaires (tronçons, branchements)> la rotation d'objets ponctuels (bloc vanne, bloc raccord) Comment je pourrais faire? Citer
Patrick_35 Posté(e) le 9 novembre 2015 Posté(e) le 9 novembre 2015 Salut Pour faire au plus simple et comprendre Sélection d'une ligne(setq ent (entget (car (entsel))))Longueur de la ligne(distance (cdr (assoc 10 ent)) (cdr (assoc 11 ent))) Sélection d'un bloc(setq ent (entget (car (entsel))))Angle de rotation du bloc (conversion des radians en degrées)(* 180.0 (/ (cdr (assoc 50 ent)) pi)) @+ Citer Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Cadiste Posté(e) le 9 novembre 2015 Auteur Posté(e) le 9 novembre 2015 merci pour les infos, Je viens "d'adapter" la routine pour le calcul automatique d'une longueur de polyligne avec une table d'objets "TRONCON" sur le calque "AEP_TRONCON", je me rapproche mais par contre ça me renvoi ceci: ((lambda ( / js ent pt) (setq js (ssget '((0 . "LWPOLYLIGNE") (8 . "AEP_TRONCON")))) (repeat (setq n (sslength js)) (setq ent (entget (car (entsel)) (distance (cdr (assoc 10 ent)) (cdr (assoc 11 ent)) (ade_odsetfield ent "TRONCON" "LONGUEUR" 0 (car pt)) ) ) ) ) )); erreur: type d'argument incorrect: lselsetp nil Il ne trouve pas ma (mes) polyligne(s). la variable retourne non renseignée mais je n'ai pas de lselsetp ?? A quoi cela correspond'il? Citer
bonuscad Posté(e) le 9 novembre 2015 Posté(e) le 9 novembre 2015 Bonjour, Une erreur sur le filtre ssget: ce n'est pas LWPOLYLIGNE mais LWPOLYLINEJe ne comprend pas pourquoi tu fais appel à (entsel)distance entre 10 et 11 est valable pour une ligne, mais pas une polyligne. Essayes avec cette syntaxe? pas testé... ((lambda ( / js ent lg) (setq js (ssget '((0 . "LWPOLYLINE") (8 . "AEP_TRONCON")))) (repeat (setq n (sslength js)) (setq ent (ssname js (setq n (1- n)))) (setq lg (vlax-curve-getDistAtPoint ent (vlax-curve-getEndPoint ent))) (ade_odsetfield ent "TRONCON" "LONGUEUR" 0 lg) ) )) Citer Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Cadiste Posté(e) le 9 novembre 2015 Auteur Posté(e) le 9 novembre 2015 de la bombe.... ;) ça fonctionne super... merci beaucoup... "Je ne comprend pas pourquoi tu fais appel à (entsel)" Parce que je ne maîtrise pas LISP, et j'avance par tâtonnement.. <_< maintenant, je vais essayé de faire qqe chose pour le renseignement du champ rotation pour des blocs ... Citer
Cadiste Posté(e) le 9 novembre 2015 Auteur Posté(e) le 9 novembre 2015 voilà ce que j'ai pu faire :((lambda ( / js ent pt) (setq js (ssget '((0 . "INSERT") (2 . "AEP_RACCORD") (8 . "AEP_RACCORD")))) 'def blocs (repeat (setq n (sslength js)) (setq ent (ssname js (setq n (1- n)))) (setq lg (* 0.9 (cdr (assoc 50 ent)))) ' conversion grades en degrés décimaux (ade_odsetfield ent "RACCORD" "ROTATION" 0 lg) 'remplissage du champ ))) par contre, j'ai un problème de syntaxe avec ce message d'erreur : ; erreur: type d'argument incorrect: listp <Nom d'entité: 7ffffb2e590> Est ce qu'il y a une variable à définir? Citer
bonuscad Posté(e) le 9 novembre 2015 Posté(e) le 9 novembre 2015 (modifié) (assoc 50 ent)Tu as soumis un non d'entité à (assoc), ce n'est pas ce qu'il attend (d'ou le retour d'erreur: type d'argument incorrect: listp <Nom d'entité: 7ffffb2e590>) Assoc attend une liste pour extraire de celle ci le code associé.cette liste de définition tu l'obtiens avec (enget <le nom de l'entité>)donc;(assoc 50 (entget ent))devrait aller beaucoup mieux... ATTENTION: la valeur retournée par (assoc 50)est une TOUJOURS une valeur en RADIAN. (quelque soit le système utilisé dans ton dessin).L'origine est toujours l'axe des X (Est) et la rotation dans le sens mathématique.Donc fais la conversion adéquate radians vers système souhaité. Modifié le 9 novembre 2015 par bonuscad Citer Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Cadiste Posté(e) le 9 novembre 2015 Auteur Posté(e) le 9 novembre 2015 Il me retourne T (true), ce qui est bon signe mais par contre le champ rotation me donne une valeur étrange. voici ce que j'ai lancé :((lambda ( / js ent pt) (setq js (ssget '((0 . "INSERT") (2 . "AEP_RACCORD") (8 . "AEP_RACCORD")))) (repeat (setq n (sslength js)) (setq ent (ssname js (setq n (1- n)))) (setq lg (* 0.9 (cdr (assoc 50 (entget ent))))) (ade_odsetfield ent "RACCORD" "ROTATION" 0 lg) ))) il me retourne 0.7205 ... pour une rotation de 49.0329g ??Le projet CAD est en grades et je souhaite le convertir en degrés décimaux.. Sauf erreur 49.0329g = 44.12961°D ?? Citer
bonuscad Posté(e) le 9 novembre 2015 Posté(e) le 9 novembre 2015 Relis mon message du dessus (que j'avais modifié)Il faut que tu fasse une conversion de radian en degré Si l'origine des angles est à l'Est et que ton sens de rotation des angles est dans le sens trigo, tu n'a rien d'autre à faire.(setq lg (* 0.9 (cdr (assoc 50 (entget ent)))))doit devenir(setq lg (* 180.0 (/ (cdr (assoc 50 (entget ent))) pi)))comme l'avait souligné patrick_35 Citer Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Cadiste Posté(e) le 9 novembre 2015 Auteur Posté(e) le 9 novembre 2015 En effet .... c'est beaucoup mieux .. :) Pardon, je n'avais pas vu ta modif.. je comprends mieux maintenant pourquoi Patrick_35 me parlait de radian .. j'étais parti dans des recherches de conversion.. C'est parfait je vais pouvoir m'en donner à cœur joie de mettre à jour tout le monde.. Merci beaucoup pour votre aide Bonuscad et Patrick_35 !! Je comprends déjà mieux comment AutoLISP fonctionne.. Merci pour tout ;) Citer
Messages recommandés