Vlax-curve-getparam

les paramètres !


Il y a toute une série de fonctions VLAX à base de "paramètres".
Certaines fonctions renvoient un "paramètre" d'autres utilisent ce "paramètre" pour renvoyer autre chose.
Franchement, honnêtement, résolument, ouvertement... je ne savais pas grand chose sur ces paramètres mais j'ai creusé, j'ai dessiné, j'ai mesuré, j'ai recommencé...et je vais partager ici ce que j'ai compris, admis, appris ...car les explications sur ces paramètres sont disparates et souvent partielles.
Pour illustration voici une copie de "l'aide" émanant du propre site AutoDesk :

Y'a pas à dire, ça aide beaucoup de savoir que c'est un "paramètre" qui est renvoyé par ce genre de fonction !!...
Mais qu'est-ce donc que ce "paramètre" ??? je vais vous en parler ...


Au premier abord les fonctions VLAX semblent compliquées à taper dans le code (toutefois dans l'environnement IDE il y a des aides de saisie), mais vous noterez comme j'ai eu l'occasion de le remarquer que les concepteurs du logiciel ont pris l'heureuse initiative de déposer judicieusement des lettres capitales dans le nom de la commande, elle ne sont pas obligatoires mais aident fortement à la lecture du nom de la fonction, comme on le voit ici :
getDistAtParam est quelque peu plus lisible que getdistatparam, non ?


Tout d'abord de quelles fonctions parle-t'on ? Elles sont six :

vlax-curve-getStartParam
vlax-curve-getEndParam
vlax-curve-getParamAtPoint
vlax-curve-getPointAtParam
vlax-curve-getDistAtParam
vlax-curve-getParamAtDist

J'ai cherché (et trouvé) dans presque tous les cas d'entités,
il me reste à plancher car je bute encore
sur le cas particulier de la SPLINE,
vos éventuelles pistes de recherches sont les bienvenues.


vlax-curve-getStartParam
vlax-curve-getEndParam

Syntaxe : (vlax-curve-getStartParam Entite)
Argument : Entite est de la forme : Objet VLA ou ename

LIGNE

Le Startparam est 0.00
L'Endparam est la longueur de la ligne.

Image Vlax-curve-get-StartParam

Avec les lignes de code qui suivent vous serez en mesure d'obtenir ces variables :
ParamDeb : début et ParamFin : fin

1
2
3
4
5
6
7
(vl-load-com)
(setq ent (car (entsel "\nSélection d'une entité ...\n")))
(setq entvla (vlax-ename->vla-object ent))
 
(setq ParamDeb (vlax-curve-getstartparam entvla)
      ParamFin (vlax-curve-getEndparam entvla)
)

Remarque : ces fonctions acceptent aussi un argument sous forme de nom d'entité (ename) la qualité Objet VLA <VLA-OBJECT ...> n'est pas obligatoire en tant qu'argument.

C'est un bon début, mais il nous en reste à voir et à apprendre...


ARC

Le StartParam est l'angle en radians mesuré depuis l'axe des X du SCG dans le sens antihoraire depuis le centre jusqu'au point de départ
l'EndParam est l'angle en radians mesuré depuis l'axe des X du SCG dans le sens antihoraire depuis le centre jusqu'au point final de l'arc.

Attention :
Si l'arc croise l'axe des X (zéro radian) le paramètre de fin devient l'angle de fin (du centre au point final) plus "deux PI" ( 6.283185....) car les paramètres doivent toujours être croissants le long d'une entité.

CERCLE et ELLIPSE fermée

Le StartParam est 0.00
l'EndParam est 6.28319... soit la valeur de pi multiplié par deux.

Comme pour l'arc ce sont des valeurs d'angles mesurées depuis l'axe des X dans le sens trigonométrique (anti-horaire).
Les valeurs renvoyées sont des nombres réels (real) exprimant une valeur angulaire en radians


Polyligne

Ce qui suit pour ces fonctions se vérifie avec les trois types de polylignes :

Désignation Valeur code DXF 0
Polyligne 2D actuelle (0 . "LWPOLYLINE")
Polyligne 2D ancienne version (0 . "POLYLINE")
Polyligne 3D (0 . "POLYLINE")

Polyligne (Segments droits et courbes) :
Le StartParam est 0.0
L'EndParam est le nombre de sommets moins un (puisque le premier est 0)
S'il y a des raccordements courbes dans la polyligne (bulge) les points de début et fin de l'arc sont comptabilisés.
Par analogie c'est le nombre de segments, courbes ou droits, les "vertex" je dis par analogie car ce n'est pas tout à fait ça

J'entends bien ceux qui posent la question :
Si c'est un nombre de sommets POURQUOI donc est-ce un nombre réel (real) qui est renvoyé et pas un nombre entier (integer) ?
On ne peut pas avoir une fraction de sommets que je sache ? ...
Je dis que c'est une bonne question et je remercie ceux qui la posent à juste titre.
Je ne vais pas en parler ici mais la réponse viendra plus tard lors du décorticage de la fonction  vlax-curve-getParamAtPoint

Polyligne lissée :
Le StartParam est 0.0
L'EndParam  est toujours le nombre de sommets moins un.
il varie suivant le "niveau" de lissage car AutoCAD rajoute des sommets et des vertex pour assurer le lissage et en ajoute de plus en plus en augmentant le niveau de lissage.

C'est en fini des explications pour vlax-curve-getStartParam et vlax-curve-getEndParam, je souhaite avoir été complet et explicatif, dans le cas contraire vous savez que vous avez un formulaire de contact pour en discuter... ICI


vlax-curve-getParamAtPoint

Syntaxe : (vlax-curve-getParamAtPoint Entite Point)
Arguments :
Entite
est de la forme : Objet VLA ou ename
Point
est de la forme : liste de trois valeurs (x y z)

Cette fonction va renvoyer un "paramètre" en fonction du point cliqué sur l'entité et là aussi je vais tenter d'expliquer ce que j'ai compris de ce paramètre.

ATTENTION
Il faut que le point donné en argument soit SUR l'entité, il est donc conseillé d'utiliser un accrochage objet pour le cliquer à l'écran ou un (osnap) dans le (getpoint)
Tout point situé EN DEHORS de l'entité (si minime que soit l'écart) sera rejeté et un joli (mais frustrant) nil sera renvoyé

LIGNE

La valeur renvoyée par vlax-curve-getParamAtPoint est la longueur depuis le début de la ligne.

1
2
3
4
5
(setq ent (car(entsel"\nentité...\n")))
(setq pt (getpoint "\npoint de passage\n"))
(setq entvla (vlax-ename->vla-object ent)
      pass (vlax-curve-getparamatpoint entvla pt)
)

La variable "pass" contiendra le "paramètre", ceci est valable pour les autres entités décrites ci-après bien que ce fameux "paramètre" ne décrive pas toujours une chose identique, vous le verrez en lisant...

ARC et CERCLE

La valeur renvoyée par vlax-curve-getParamAtPoint est l'angle en radians mesuré depuis l'axe des X dans le sens antihoraire depuis le centre de l'arc  jusqu'au point cliqué et donné en argument.
Même addition de "deux pi" (6.283185...) s'il y a croisement de l'axe des X par l'arc pour conserver un accroissement dans les paramètres.

POLYLIGNE

Même domaine d'application que EndParam et StartParam.

La valeur renvoyée par vlax-curve-getParamAtPoint est une valeur en nombre réel (real).
Ceux qui se posaient la question dans le chapitre EndParam et StartParam vont trouver leurs réponses maintenant.
Ce nombre a une particularité, la partie entière est le numéro du vertex et la mantisse est le ratio de la distance du point depuis le dernier sommet par rapport à la longueur du vertex sur lequel est situé le point.
Suis-je clair ?, un dessin vous aiderait d'après ce que j'entends comme rumeurs dans la classe... le voici :

Donc une valeur de paramètre renvoyée de 0.75955 signifie qu'on est dans le premier vertex de la polyligne car on est entre le sommet 0.00 et le sommet 1.00 et la mantisse de 75955 signifie que le point est à 75.955 % du vertex.
L'utilisation des réels (real) est donc justifiée par l'économie en mémoire car un seul nombre comprend deux renseignements, ils sont très forts chez AutoCAD !.

C'est le même schéma de fonctionnement avec les polylignes lissées "simples" mais aussi les lissages de "second ordre" et de "troisième ordre".
pour le cas spécifique de ces lissages il ne faut pas confondre les "points de contrôle" qu'on retrouve dans les "propriétés" d'AutoCAD et les extrémités de "vertex".
C'est de ces dernières (les extrémités de "vertex") qu'il est question dans les valeurs renvoyées par  vlax-curve-getParamAtPoint.

Sur cette image on a une polyligne lissée (troisième ordre) et pour faire ce lissage  AutoCAD a rajouté plein des sommets que j'ai repéré par des lignes verticales qui définissent le début et la fin de chaque vertex.
Ce sont eux qui sont utilisés pour le "paramètre" renvoyé par vlax-curve-getParamAtPoint.
La valeur de 2.5 signifie que c'est le troisième vertex et qu'on est au milieu de celui-ci. 2.5 est entre deux et trois donc deuxième vertex (partie entière du réel renvoyé comme "paramètre" et 50, la mantisse signifie qu'on est à 50 % du vertex donc le milieu.

Les petits carrés "bleu dur" ce sont les "points de contrôles" qu'on trouve dans les "propriétés"

ELLIPSE

Alors là ! avec l'ellipse on entre dans du "compliqué", j'ai eu beaucoup de mal à déterminer ce qu'est le "paramètre" dans vlax-curve-getParamAtPoint mais j'y suis finalement parvenu à force de ténacité et de remise en cause.
Voici où m'ont mené mes digressions sur les angles dans les ellipses :


Tout d'abord quelques bases pour mémoire :

L'ellipse est une courbe plane, c'est l'intersection d'un cône et d'un plan mais le web fourmille d'explications aussi je ne m'étends pas là-dessus.
Une ellipse a deux axes perpendiculaires, un centre, deux foyers, un demi-grand axe et un demi-petit axe, un coefficient d'excentricité et tout ça est nécessaire à l'existence de cette courbe.

1 - Les deux axes, on connait on va dire que horizontalement c'est l'axe des X et verticalement l'axe des Y.

2 - Le centre est l'endroit d'où les angles sont mesurés et c'est ce qui est renvoyé comme "paramètre" lors de l'appel des fonctions
vlax-curve-getParamatPoint,
vlax-curve-getParamatStartPoint
vlax-curve-getParamatEndPoint.

3 - Les foyers sont ne sont pas pris en compte dans cet article mais je vous expliquerai comment les retrouver et les situer par la géométrie, pour mémoire l'ellipse est l'ensemble des points dont la somme des distances à deux points fixes (les foyers) est constante, j'en reparlerai avec des illustrations.

4 - Excentricité est le rapport de la distance c sur a.
Avec c qui est la distance du centre à un des foyers et a qui est la longueur du demi grand axe.
Ce coefficient est compris entre 0 et 1,
- plus il tend vers 0 plus l'ellipse s'approche du cercle
- plus il tend vers 1 plus l'ellipse est "plate"
Quelque soit la position de M sur l'ellipse les distances MF + MF' = 2a

Exercice amusant et illustrant ce propos :
Dessin d'un cercle (rayon quelconque), transformation de ce cercle en bloc, insertion de ce bloc, changer l'échelle Y de ce bloc inséré puis décomposer ce bloc (échelles différentes) et on constate quoi en demandant les propriétés de ce nouvel objet ? c'est une ellipse... CQFD.


Revenons aux paramètres, quand on mesure les angles renvoyés par ces trois fonctions sur un arc elliptique, c'est à dire une portion d'ellipse, on ne retrouve jamais sur le dessin les valeurs retournées par les fonctions, alors qu'avec les autres entités on s'y retrouve à peu-près.
J'ai expliqué dans le cas des arcs et des cercles que ces paramètres sont les angles depuis le centre jusqu'au point cliqué, c'est aussi le cas pour l"ellipse bien ce soit moins facilement vérifiable au premier abord.
Pour comprendre comment y parvenir il faut imaginer les deux cercles qui "supportent" l'ellipse, en tireté gris dans l'animation, ces deux cercles sont concentriques avec l'ellipse, le centre étant l'intersection des deux axes, et ont pour diamètres :
- Grand cercle -> la longueur du grand axe.
- Petit cercle -> la longueur du petit axe.
La valeur angulaire est toujours exprimée par rapport au grand axe que j'ai illustré horizontalement mais une rotation de l'ensemble ne changera pas les valeurs.
En rose l'arc elliptique, trois paramètres à trouver, départ fin et point de passage, je focalise sur le point de départ mais les deux autres respectent les mêmes règles.
Du point recherché (départ, fin ou passage)  :
- Élever une droite dans le sens des Y qui va croiser le grand cercle
- Tracer une droite dans le sens des X qui va croiser le petit cercle
- Relier ces deux points d'intersections entre les droites et les cercles et le prolongement vous mène au centre de l'ellipse.
C'est l'angle de cette droite en radians dans le sens anti-horaire par rapport à l'axe horizontal qui est renvoyé en tant que "paramètre".
OUF
!!! je vais reprendre une aspirine et je reviens vers vous ...

Animation explicative :

Comme je disais précédemment j'ai mis l'axe des X horizontal.
Transformez "verticale" par parallèle à l'axe des Y et "horizontale" par parallèle à l'axe des X en cas de rotation de l'ellipse par rapport au SCG.


vlax-curve-getPointAtParam

Syntaxe : (vlax-curve-getPointAtParam Entite Param)
Arguments :
Entite
est de la forme : Objet VLA ou ename
Param
est de la forme nombre entier (integer) ou réel (real)

Les noms de ces fonctions VLAX ont le mérite de la clarté et ce qui est sous-entendu dans celle-ci est bel et bien ce qui est renvoyé à savoir un point, sous la forme d'une liste (list) de trois réels (real) le long de l'entité sélectionnée et comme le paramètre est donné en argument, le point est situé à "param" sur l'entité sélectionnée.
Je donne ces explications maintenant car pour savoir ce que sont les "paramètres" en fonction du type de l'entité il est nécessaire d'avoir lu la partie précédente.

LIGNE

Le "param" étant la distance depuis le début de la ligne, le code suivant va renvoyer les coordonnées du point situé à ce que vous répondrez à la question "Valeur du paramètre pour trouver le point ..." comme toujours il faut se méfier de l'utilisateur et vérifier si la réponse est cohérente avec la longueur de la ligne.

1
2
3
4
5
6
7
8
9
(setq ent (car(entsel"\nentité...\n")))
(setq entvla (vlax-ename->vla-object ent)
      paramfin (vlax-curve-getEndParam entvla)
)
(setq par (getreal "\nValeur du paramètre pour trouver le point ...\n"))
(if (< par paramfin)
   (setq ptatparam (vlax-curve-getPointAtParam entvla par))
   (alert "le paramètre est trop grand pour cette entité")
)

la variable "ptatparam" va contenir une liste de trois réels dans ce genre :
(67.0671 9.29863 0.0) ou (72.022 2.82377 1.11803) si la ligne est en "3D".

ARC, CERCLE, ELLIPSE

C'est le point situé sur l'angle donné comme paramètre en argument qui sera renvoyé

POLYLIGNE

C'est le point situé sur la polyligne donné comme paramètre en argument qui sera renvoyé
Fort de ce qu'on vient de lire on peut donc écrire :

1
(setq ptparam (vlax-curve-getPointAtParam entvla param))

Et en admettant que la valeur de la variable param soit de 0.75 et entvla une polyligne sous forme de (ename )ou d'objet VLA, la variable ptparam contiendra la valeur du point situé sur le premier vertex aux 3/4 de ce dernier.
Et, a fortiori, si on demande tous les points de la polyligne aux paramètres des sommets on obtient la liste de tous les sommets de la polyligne.
Si cette dernière contient des arcs (bulge) les points de début et fin sont pris en compte mais pas la valeur de bulge.

Exemple en image :

vlax-curve-getDistAtParam

Comme pour la précédente fonction c'est assez clair et je ne vais pas en faire des pages et des pages...

Cette fonction renvoie la distance depauis le point de départ de l'entité en fonction du "paramètre" renseigné en argument


vlax-curve-getParamAtDist

Cette fonction renvoie le "paramètre" en fonction de la distance, depuis le point de départ de l'entité, renseignée en argument.


07 Octobre 2019