2380x
001659
13.10.2020

Mise à jour et ajustement des données des variantes d'une structure à l'aide de l'interface COM

De nombreuses structures doivent être calculées dans différentes situations. Ainsi, on peut analyser une plateforme élévatrice dans sa position au sol, à moitié élevée et à son extension maximale. Il faut donc créer plusieurs modèles, qui sont relativement similaires. La possibilité de mettre à jour de tels modèles d'un seul clic allège donc considérablement la charge de travail.

Cet article technique implique que des connaissances de base sur l'interface COM. Nous vous recommandons de consulter la section Liens pour accéder à des articles sur les principes de base de la programmation.

Méthode

Le logiciel est supposé ajuster automatiquement les données de la structure (nœuds, lignes, les barres, etc.) lorsqu'on clique sur un bouton. Par exemple, les coordonnées du nœud 1 doivent être transférées à partir d'un modèle principal vers d'autres modèles secondaires ou des versions alternatives. Cependant, seules les valeurs précédemment définies comme libres par l'utilisateur peuvent être transférées.

Modèle d'exemple

Une plate-forme élévatrice simple a été modélisée pour illustrer le fonctionnement du logiciel dans ce cas. Ce modèle est considéré comme le modèle principal.

Cette plateforme élévatrice n'est pas paramétré et existe en trois variantes : complètement déployée, repliée au sol et en position intermédiaire. La version entièrement déployée est définie comme le modèle principal, celle en position intermédiaire comme la variante 1 et celle repliée au sol comme la variante 2.

Remarques préliminaires

Un type de fichier de configuration ou une interface graphique permettant de définir les modèles à comparer sont nécessaires.

L'élément correspondant doit être commenté si l'on veut définir librement ou de manière variable les coordonnées d'un nœud. Le programme recherche normalement une chaîne spécifique dans le commentaire et modifie ou conserve les coordonnées correspondantes si cette chaîne est effectivement trouvée. En outre, il est utile de créer de nouveaux éléments automatiquement dans tous les sous-modèles. La structure doit donc être conçue de sorte que l'utilisateur puisse activer le modèle souhaité dans RFEM (à modifier directement) et que les modèles requis puissent être ouverts dans le logiciel, puis comparés avec ce modèle principal.

Interface graphique

La conception simple analysée ici a été sélectionnée pour l'interface graphique.

L'utilisateur peut insérer ou saisir un chemin dans la zone de texte par copier-coller. La commande « Add New Model» permet de l'ajouter à la liste des modèles à ajuster. Le bouton « Remove Selected Model » sert à supprimer un modèle sélectionné dans la liste. Le bouton « Modify Models » lance alors le programme.

Principales étapes avec le programme

Le programme ne dispose d'abord que des chemins des modèles secondaires et des variantes. La première étape consiste donc à le connecter à RFEM. Une fois la connexion avec RFEM établie, une boucle doit être exécutée sur les modèles secondaires. Étant donné que le programme doit également créer des éléments, un ordre doit être respecté. Par conséquent, les nœuds sont d'abord comparés, puis les lignes, les matériaux, les sections et enfin les barres. Les nœuds constituent une exception, car les directions x, y et z doivent être reprises ou conservées. Tous les autres éléments sont soit repris intégralement, soit laissés tels quels. Cependant, la création de nouveaux éléments doit être la même pour tous les types d'éléments.

Structure du programme

La méthode appliquée lorsqu'on utilise la commande « Modify Models » est structurée comme suit :

private void button_mod_click(object sender, EventArgs e)
{
 // RFEM
 //##############################
 Dlubal.RFEM5.IModel3 iModel_org = null;
 Dlubal.RFEM5.IApplication iApp = null;
 try
 { 
  // get interface to application and open model
  iApp = Marshal.GetActiveObject("RFEM5.Application") as Dlubal.RFEM5.IApplication;
  iApp.LockLicense();
  iModel_org = iApp.GetActiveModel() as Dlubal.RFEM5.IModel3;
  
  // loop over found models
  Dlubal.RFEM5.IModel iModel_cpy = null;
  
  for (int i = 0; i < listBox_models.Items.Count; ++i)
  {
   // open model
   iModel_cpy = iApp.OpenModel(listBox_models.Items[i].ToString());
   
   // get structural data
   Dlubal.RFEM5.IModelData2 iModData_org
    = iModel_org.GetModelData() as Dlubal.RFEM5.IModelData2;
   Dlubal.RFEM5.IModelData2 iModData_cpy
    = iModel_cpy.GetModelData() as Dlubal.RFEM5.IModelData2;
   
   //  compare/change nodes
   //  compare/change lines
   //  compare/change materials
   //  compare/change cross sections
   //  compare/change members
  }
  
 }
 catch (Exception ex)
 {
  MessageBox.Show(ex.Message, ex.Source);
 }
 finally
 {
  if (iApp != null)
  {
   iApp.UnlockLicense();
   
   // Releases COM object - not needed anymore
   // Marshal.ReleaseComObject(iApp);
   iApp = null;
  }
  
  iModel_org = null;
  
  // Cleans Garbage Collector for releasing all COM interfaces and objects.
  System.GC.Collect();
  System.GC.WaitForPendingFinalizers();
 }
}

La connexion à RFEM est d'abord établie à l'aide de la commande GetActiveObject (« RFEM5.Application »). Une connexion au modèle en cours de traitement est ensuite établie via GetActiveModel(). Afin de pouvoir effectuer la comparaison, les sous-modèles et leurs données structurelles (GetModelData()) sont ouverts les uns après les autres en boucle via les entrées de la « List-Box ». À ce stade, toutes les données géométriques sont disponibles et peuvent être comparées.

En cas de problème (si un modèle ne peut pas être ouvert, par exemple), l'erreur est détectée par le bloc try-catch, signalée et le programme est déverrouillé.

Comparaison des nœuds

On procède comme suit pour comparer les nœuds du modèle principal et du modèle secondaire.

Tout d'abord, tous les nœuds du modèle principal sont récupérés et une boucle leur est appliquée. Cette boucle sert d'abord à obtenir les données du nœud avec le même numéro du modèle secondaire. Si cette opération échoue car le nœud n'existe pas, l'erreur est détectée avec un autre bloc try-catch et un nœud avec les données du modèle principal est créé dans le modèle secondaire.

Si le nœud existe, son commentaire est lu et divisé à l'aide du séparateur « ; ». S'il est composé de moins de trois parties, les données sont extraites du modèle principal. S'il est constitué trois parties ou plus, ces parties sont analysées. Un « f » correspond à une valeur fixe qui ne doit pas être écrasée. Sinon, la valeur est écrasée par la valeur du modèle principal.

Prenons l'exemple de la chaîne « f;;f1;kkl » dans le commentaire d'un nœud. Après division, on a ainsi les chaînes « f », « », « f1 » et « kkl ». La valeur x est ainsi conservée pour le nœud tandis que les valeurs y et z sont écrasées, car la chaîne pour y est vide et « f1 » pour z et non « f ».

//  compare/change nodes
Dlubal.RFEM5.Node[] nodes_org = iModData_org.GetNodes();
for(int j=0; j < nodes_org.Length; ++j)
{
 try
 {
  Dlubal.RFEM5.INode iNode = iModData_cpy.GetNode(nodes_org[j].No, Dlubal.RFEM5.ItemAt.AtNo);
  Dlubal.RFEM5.Node node = new Dlubal.RFEM5.Node();
  node = iNode.GetData();
  
  // check, if there are fixed components
  List<string> defs = (node.Comment).Split(';').ToList<string>();
  
  if (defs.Count >= 3)
  {
   if (defs[0] != "f")
    node.X = nodes_org[j].X;
   
   if (defs[1] != "f")
    node.Y = nodes_org[j].Y;
    
   if (defs[2] != "f")
    node.Z = nodes_org[j].Z;
  }
  else
  {
   node.X = nodes_org[j].X;
   node.Y = nodes_org[j].Y;
   node.Z = nodes_org[j].Z;
  }
  
  // set node
  iModData_cpy.PrepareModification();
  iNode.SetData(node);
  iModData_cpy.FinishModification();
  
 }
 catch (Exception ex)
 {
  // if nodes doesn't exist, create it;
  iModData_cpy.PrepareModification();
  iModData_cpy.SetNode(nodes_org[j]);
  iModData_cpy.FinishModification();
 }
 
}

Comparaisons des lignes, matériaux et autres éléments

La procédure de comparaison des autres éléments est légèrement différente de celle des nœuds.

//  compare/change lines
Dlubal.RFEM5.Line[] lines_org = iModData_org.GetLines();
for (int j = 0; j < lines_org.Length; ++j)
{
 try
 {
  Dlubal.RFEM5.ILine iLine = iModData_cpy.GetLine(lines_org[j].No, Dlubal.RFEM5.ItemAt.AtNo);
  Dlubal.RFEM5.Line line = new Dlubal.RFEM5.Line();
  line = iLine.GetData();
  
  // check, if the line is fixed
  List<string> defs = (line.Comment).Split(';').ToList<string>();
  
  if (defs[0] != "f")
  {
   line = lines_org[j];
  }
  
  // set line
  iModData_cpy.PrepareModification();
  iLine.SetData(line);
  iModData_cpy.FinishModification();
  
 }
 catch (Exception ex)
 {
  // if nodes doesn't exist, create it;
  iModData_cpy.PrepareModification();
  iModData_cpy.SetLine(lines_org[j]);
  iModData_cpy.FinishModification();
 }
 
}

Contrairement à la comparaison de nœuds, l'élément est complètement écrasé si aucun « f » n'est trouvé dans le commentaire décomposé (par des « ; »). Les autres éléments sont créés et comparés exactement de la même manière. Le code source est disponible dans le projet Visual Studio au bas de cet article.

Évaluation

Le programme peut implémenter les modifications souhaitées dans les modèles secondaires. La vidéo accompagnant cet article technique explique le déroulement de cette opération. Actuellement, le principal problème réside dans le fait que les entrées incorrectes ne sont pas ou rarement identifiées.

Résumé et perspectives

Le programme présenté ici permet de mettre à jour des modèles secondaires à partir d'un modèle principal. Les modifications des nœuds et des barres sont transférées selon un ordre précis.

Néanmoins, des procédures permettant de détecter les entrées incorrectes peuvent encore être ajoutées. La possibilité de fermer des modèles secondaires et donc d'arrêter le traitement en arrière-plan correspondant constitue une autre piste d'amélioration. L'ajout d'autres données structurelles (charges, combinaisons, etc.) peut également s'avérer utile.


Auteur

M. Günthel fournit une assistance technique aux clients de Dlubal Software.

Liens
Téléchargements