Ce document établit les limitations actuelles des associations par lignes.
L'utilisateur peut définir des associations multiples au moyen de deux fonctions :
int associateOpenedLine (Edge* mstart, Edges& mline, Shape* gstart, double pstart, Shapes& gline, double pend); int associateClosedLine (Vertex* mfirst, Edge* mstart, Edges& mline, Shape* gstart, double pstart, Shapes& gline); |
Ces deux fonctions
appellent la même fonction interne :
int associateLine (Vertex* vfirst, Edge* mstart, Edges& mline, Shape* gstart, double pstart, Shapes& gline, double pend); |
Cette fonction effectue les contrôles généraux réalisables par le modèle, trie les edges puis passe la main à une fonction d'interface avec Cascade :
int associateCascade (Edges& mline, int msens[], Shape* gstart, Shapes& gline, double pstart, double pend, bool clos); |
Les arguments sont :
Edges& mline : liste triée des edges
int msens[] : indicateur (V_AMON ou V_AVAL) donnant le sens de chaque edge.
Shape* gstart : Forme associée au premier edge.
Shapes& gline : Formes associées aux autres edges (peut être vide).
double pstart : Paramètre indiquant le point de départ de la première forme. Si la ligne est ouverte, pstart est compris entre 0 et 1. Si la ligne est fermée, seules les valeurs 0 ou 1 sont acceptées.
double pend : Paramètre indiquant le point de départ de la dernière forme. Vaut 1 si la ligne est fermée.
bool clos : indique si la ligne est ouverte ou fermée.
Fonctionnement du programme associateCascade :
Ordonner les edges (fait dans associateLine)
Transformer les Hexa::Shapes en lignes (TopoDS_Edge) : elles sont rangées dans tabg_line [nblines].
Créer des courbes (type BrepAdaptor_Curve*) à partir des lignes, c'est le moyen de calculer le point situé à une certaine abscisse curviligne. Les courbes sont rangées dans tabg_curve[nblines].
Mémoriser le longueur réelle de chaque courbe et la mémoriser dans tabg_length[nblines].
Définir les points extrêmes de chaque courbe (type gp_Pnt) et l'enregistrer dans tabg_point [2*nblines].
Ordonner (et contrôler) les lignes/coubes au moyen de la fonction vertexInLine, laquelle met à jour les tableaux tabg_orig (donne le sens de chaque ligne) et shape_posit (donne le classement des lignes).
Si la ligne globale est continue (les courbes sont jointives deux à deux), on peut procéder à l'association ligne/eddge.
Le premier point (défini par tab_gcurve[0] et pstart est associé au premier vertex (défini par mline[0]->getVertex (msens[0]).
Il
faut ensuite définir la (les) portion(s) de courbe associée(s) à
chaque edge.
Chaque
portion de courbe est définie par la représentation brep de la
ligne associée et les paramètres de début et fin.
Une
première tentative fut d'utiliser les abscisses curvilignes
relatives de chaque type de ligne. Cette tentative fut rejetée d'une
part car elle ne convenait pas à la bielle (voir dessin en annexe) et
d'autre part l'idée d'établir une abscisse curviligne sur le modèle de
bloc contredisait l'idée selon laquelle les coordonnées du modele de
bloc n'ont pas d'importance.
On se contente d'établir une relation entre les n lignes (de la CAO) et les m edges (du modèle) (voir figure 1) :
soit sm1 la position relative du premier vertex du ième edge : on prend sm1 = i/nbedges
soit sm2 la position relative du second vertex du ième edge. On a donc : sm2 = (i+1) /nbedges;
soit sg1 la position relative du premier vertex de la jème ligne. On prend : sg1 = j/nblignes
soit sg2 la position relative du second vertex de la jème ligne : sg2 = (j+1)/nblignes.
Le ième edge et la jème ligne s'intersectent si : sg1 < sm2 et sg2 > sm1.
On doit alors déclarer qu'une portion de la ligne est associée à l'edge.
La portion de la ligne est délimitée par les paramètres normalisés (compris entre 0 et 1) :
para_deb = sg1 < sm1 ? (sm1-sg1)/(sg2-sg1) : 0.0; para_fin = sg2 > sm2 ? (sm2-sg1)/(sg2-sg1) : 1.0; |
Le second vertex de l'edge est associé si : sg1 <= sm2 <= sg2