Aller au contenu

problème d'évaluation de (vlax-curve-getparamatpoint)


bonuscad

Messages recommandés

Bonjour,

 

Quelqu'un aurait t-il une idée pour que le retour de (vlax-curve-getparamatpoint) soit bien évalué dans ce bout de code suivant:

 

(setq
vlaobj (vlax-ename->vla-object (car (setq ent (entsel))))
pt
(vlax-curve-getClosestPointTo
	vlaobj
	(trans (cadr ent) 1 0)
)
param (vlax-curve-getparamatpoint vlaobj pt)
)

 

Pour moi j'ai un souci d'évaluation, nil m'est retourné alors que logiquement il devrait me renvoyer un résultat.

 

Le cas ce produit dans un système de coordonnée élevée (mantisse des nombres importante) par exemple du Lambert RGF93

Si je dessine simplement une ligne en 2D dans ce système, le code peut me renvoyer nil suivant le point de sélection (c'est très aléatoire, des fois ça fonctionne)

Si je déplace ma ligne vers 0,0 , je n'ai plus ce dysfonctionnement.

 

Comment feriez vous pour contourner ce problème (sans faire un kilomètre de code)?

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

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

J'ai rencontré ce genre de problème en faisant un programme de simulation de sortie de route sur des circuits automobile (ce n'était pas en LISP mais je pense que le problèmes est le même).

Pour contourner ce problème, j'ai déplacé les courbes vers l'origine, fait mon traitement, puis re-déplacé les courbes et les nouveaux objets créés dans l'autre sens.

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

Lien vers le commentaire
Partager sur d’autres sites

Bonjour (gile)

 

Pour contourner ce problème, j'ai déplacé les courbes vers l'origine, fait mon traitement, puis re-déplacé les courbes et les nouveaux objets créés dans l'autre sens.

 

Mouais, j'aurais bien voulu éviter cette acrobatie...

 

Et en passant par une matrice de déplacement (ce serait plus élégant), tu penses que le résultat serait évalué?

Tu y a peut être déjà réfléchi ?

 

Ça serait peut être une solution générale à appliquer, dès que les coordonnées sont importantes, on passe systématiquement les données à une matrice de déplacement en aller-retour.

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

Lien vers le commentaire
Partager sur d’autres sites

Si c'est juste un déplacement de coordonnées, pas besoin de matrice, il suffit d'ajouter ou soustaire un vecteur au point avec mapcar.

Mais si tu veux utiliser les fonctions vlax-curve, il faut déplacer les courbes avec vla-Move (ou vla-TransformBy et une matrice, mais c'est un peu compliquer les choses à mon avis).

 

Je n'ai pas d'autre idée. Pour ce problème d'imprécision avec les coordonnées ayant une grande mantisse, le déplacement près de l'origine mes semble le "moins pire".

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

Lien vers le commentaire
Partager sur d’autres sites

Mais si tu veux utiliser les fonctions vlax-curve, il faut déplacer les courbes avec vla-Move (ou vla-TransformBy et une matrice, mais c'est un peu compliquer les choses à mon avis).

 

Oui tu as raison! il faut que l'objet reste identifié pour les fonctions vlax-curve, donc vla-move reste la solution la plus simple. Enfin j'espère... car ce bout de code n'était qu'une partie, il faut que je vois l'incidence sur l'ensemble. Je pense être obligé de construire des jeux de sélection pour les entités crées ultérieurement afin de les déplacer en fin d'exécution.(c'est un peu pour ça que je pensais à une matrice, pour les créer directement au bon endroit, enfin je vais voir...)

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

Lien vers le commentaire
Partager sur d’autres sites

Bon, ça à l'air de fonctionner.

Le code que j'ai appliqué pour ceux que ça pourrait intéresser , ramené à l'exemple ça donne ceci (je ne fais le déplacement que si >1E6)

 

((lambda ( / ent vlaobj mkv vector pt param)
 (setq vlaobj (vlax-ename->vla-object (car (setq ent (entsel)))))
 (if (or (> (fix (car (trans (cadr ent) 1 0))) 1E6) (> (fix (cadr (trans (cadr ent) 1 0))) 1E6))
   (setq mkv T vector (trans (cadr ent) 0 0 T))
   (setq mkv nil vector '(0.0 0.0 0.0))
 )
 (if mkv (vla-move vlaobj (vlax-3d-point (trans (cadr ent) 1 0)) (vlax-3d-point '(0.0 0.0 0.0))))
 (setq
   pt
   (vlax-curve-getClosestPointTo
     vlaobj
     (if mkv '(0.0 0.0 0.0) (trans (cadr ent) 1 0))
   )
   param (vlax-curve-getparamatpoint vlaobj pt)
 )
 (if mkv (vla-move vlaobj (vlax-3d-point '(0.0 0.0 0.0)) (vlax-3d-point vector)))
 param
))

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

Lien vers le commentaire
Partager sur d’autres sites

Hello Bruno

 

Desole de ne pas pouvoir t'aider car je suis NUL en Lisp/VLisp

mais pour Info, j'ai des problemes comparables avec cette excellente routine de Gilles ...

 

C fou de voir comme ca marche mieux en etant proche du 0,0 !?

 

Bye, lecrabe

 

Je viens de regarder la routine et essayer avec des coordonnées très élevées, mais je n'ai pas rencontré de problème avec celle-ci (Je n'ai pas fait de tests très poussé non plus!). D'ailleurs aucun appel a (vlax-curve-getparamatpoint) n'est fait dans celle-ci.

 

Avec quel type d'entité as tu des problème, 2D, 3D?

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

Lien vers le commentaire
Partager sur d’autres sites

Bonjour

Il me semble me souvenir que j'avais des problèmes avec ces fonctions quand les coordonnées (z en particulier) n'étaient pas tout à fait nulles (genre 1.23E-17), ce qui peut arriver avec trans.

D'autre part rien à voir mais vlax-ename->vla-object n'est pas nécessaire je crois (les ename marchent aussi)

Lien vers le commentaire
Partager sur d’autres sites

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é