Aller au contenu

Copier des propriétés dans une table d'objets


Messages recommandés

Posté(e)

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?

Posté(e)

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))

 

@+

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)

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?

Posté(e)

Bonjour,

 

Une erreur sur le filtre ssget: ce n'est pas LWPOLYLIGNE mais LWPOLYLINE

Je 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)
)
))

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

de la bombe.... ;) ça fonctionne super... merci beaucoup... :rolleyes:

 

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

Posté(e)

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?

Posté(e) (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é par bonuscad

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

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 ??

post-62691-0-71334400-1447082755_thumb.png

Posté(e)

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

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

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 ;)

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • 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é