Interface COM en VBA | 3 Création d’un outil

Article technique

L'article 2.2 de la série consacrée à l'interface COM décrit la création et la modification d'appuis nodaux, de charges, de cas de charge, de combinaisons de charges et de combinaisons de résultats en s'appuyant sur l'exemple d'une barre. Ce quatrième article explique la création d'un outil par l'utilisateur.

Figure 01 - Outil EXCEL créé par l'utilisateur dans RFEM

Notions de base

L'objectif est de créer un outil qui génère des appuis nodaux non linéaires sur les nœuds actuellement sélectionnés dans le programme. Les éléments essentiels suivants sont requis pour réaliser cette opération :

  • Obtenir les nœuds actuellement sélectionnés
  • Créer des appuis nodaux
  • Créer et assigner la non-linéarité
  • Lancer l'outil dans le programme

Ces différentes étapes sont détaillées dans le présent article. Les articles précédents de cette série doivent cependant avoir été consultés au préalable, car les informations qu'ils contiennent ne seront pas rappelées ici. Le code source ci-dessous inclut toutefois des commentaires expliquant des éléments mentionnés précédemment, tels que l'élaboration de la structure.

Obtention du nœud sélectionné

Vous pouvez modifier les éléments sélectionnés via l'interface COM à l'aide des fonctions déjà connues, telles qu'IModelData.GetNodes pour les nœuds. Pour renvoyer uniquement les éléments sélectionnés, vous devez cependant d'abord modifier la sélection en cours en entrant IModelData.EnableSelections. Si la fonction EnableSelections est définie sur True, la fonction IModelData.GetNodes renvoie uniquement les éléments sélectionnés. Voici un exemple :

' Obtention des nœuds sélectionnés 
iModDat.EnableSelections True ' pour travailler uniquement avec les objets sélectionnés
Dim nodes() As RFEM5.Node
nodes = iModDat.GetNodes
iModDat.EnableSelections False pour travailler à nouveau avec tous les objets 

La fonction EnableSelections est réinitialisée sur false dès que les nœuds sélectionnés ont été obtenus, car ce paramètre peut souvent provoquer des erreurs. L'appui nodal requiert une liste de nœuds sous la forme de chaîne de signes pour la définition, fournie en même temps :

' Création d'une liste de nœuds
Dim nodeList As String
DimAs Long
For i = 0 To UBound(nodes, 1)
nodeList = nodeList & nodes(i).No & ","
Next i

Création des appuis nodaux

La non-linéarité, ou le diagramme dans le cas traité, est un élément séparé. Il peut être assigné à un appui nodal uniquement s'il est déjà disponible dans le système. Il est donc nécessaire de créer l'appui nodal en premier, selon les principes expliqués dans les articles précédents :

' Création d'appuis nodaux
Dim nodSup As RFEM5.NodalSupport
nodSup.No = 100
nodSup.IsColumn = False
nodSup.IsValid = True
nodSup.nodeList = nodeList
nodSup.ReferenceSystem = GlobalSystemType

nodSup.RestraintConstantX = 0.01
nodSup.RestraintConstantY = 0.01
nodSup.RestraintConstantZ = 0.01

nodSup.SupportConstantX = -1
nodSup.SupportConstantY = -1
nodSup.SupportConstantZ = -1

' Définition d'une non-linéarité
nodSup.SupportNonlinearityZ = WorkingDiagramType

iModDat.PrepareModification
iModDat.SetNodalSupport nodSup
iModDat.FinishModification

La fonction WorkingDiagramType est spécifiée comme non-linéarité dans la direction z globale, comme l'indique le code.

Création et attribution d'un support non linéaire

Après avoir préparé le support nodal pour la non-linéarité WorkingDiagramType, il doit être créé :

' Création d'une non-linéarité 
Dim nldgrm As RFEM5.NonlinearityDiagram

nldgrm.ForceType = StiffnessDiagramForceType.NoneStiffnessForce
nldgrm.PositiveZoneType = DiagramAfterLastStepType.StopDiagramType
nldgrm.Symmetric = True

Création d'un diagramme
ReDim nldgrm.PositiveZone(3, 1)
nldgrm.PositiveZone(0, 0) = 0#
nldgrm.PositiveZone(0, 1) = 0#

nldgrm.PositiveZone(1, 0) = 0.01
nldgrm.PositiveZone(1, 1) = 100

nldgrm.PositiveZone(2, 0) = 0.03
nldgrm.PositiveZone(2, 1) = 200

nldgrm.PositiveZone(3, 0) = 0.05
nldgrm.PositiveZone(3, 1) = 300

Le diagramme est constitué d'un tableau à deux dimensions. La première dimension correspond à l'ensemble de données et la seconde aux éléments de cet ensemble de données. Dans ce cas, le premier élément de l'ensemble de données est le déplacement en m et le second élément est l'effort en N. L'exemple ci-dessus a ainsi généré quatre ensembles de données où le troisième point du diagramme est à l'emplacement 30 mm pour 0,2 kN, par exemple. Cette non-linéarité doit être affectée à l'appui existant. Pour ce faire, il est nécessaire de disposer de l'interface pour l'appui nodal, puis pour la non-linéarité :

' Assignation d'une non-linéarité

Dim iNodSup As RFEM5.INodalSupport
Set iNodSup = iModDat.GetNodalSupport(100, ItemAt.AtNo)
Dim iNldiag As RFEM5.INonlinearityDiagram
Set iNldiag = iNodSup.GetNonlinearity(AlongAxisZ)

iModDat.PrepareModification
iNldiag.SetData nldgrm
iModDat.FinishModification

La non-linéarité se situe ici le long de l'axe Z et la fonction AlongAxisZ doit donc être sélectionnée pour obtenir la non-linéarité voulue. La non-linéarité est assignée dans le bloc Modification connu.

Exécution de l'outil dans le programme

Il est possible d'intégrer des programmes externes à RFEM. Pour ce faire, il faut modifier le fichier RFEM.ini dans le chemin d'accès du programme. Contrairement à la programmation en C # et VB où un fichier exécutable est créé. VBA requiert Excel pour implémenter l'outil. Excel peut être assigné par un argument lors du lancement d'un fichier à ouvrir. La ligne de commande affiche les lignes suivantes :
« C:\Program Files (x86)\Microsoft Office\Office15\EXCEL.EXE" C:\temp\tabelle1.xlsm
Le fichier Excel correspondant se trouve sous C:\temp et la version 32 bits d'Excel est installée.

Excel s'ouvre avec le fichier souhaité. Un fichier de commandes Windows doit être créé pour que RFEM ouvre le programme externe uniquement sans les arguments supplémentaires (tels que le suffixe EXCEL.EXE, dans le cas traité ici). Ce fichier texte simple contenant l'extension «.bat» est géré par Windows comme un fichier EXE exécutable. Ainsi, vous pouvez utiliser l'éditeur pour créer un fichier TXT qui inclut la nouvelle extension de fichier «.bat». L'option d'affichage de l'extension de fichier doit d'abord être définie dans l'Explorateur Windows. Ce fichier batch (ci-après EXCEL-Tool.bat) doit alors contenir l'entrée suivante :
« C:\Program Files (x86)\Microsoft Office\Office15\EXCEL.EXE » C:\temp\tabelle1.xlsm

Ceci correspond à la commande telle qu'elle serait insérée dans la ligne de commande.

Après avoir créé ce fichier exécutable, vous pouvez l'insérer dans RFEM.ini en tant qu'outil externe. RFEM.ini se trouve dans le chemin d'accès au programme de RFEM (le chemin par défaut de RFEM 5.07 64 bits est C:\Program Files\Dlubal\RFEM 5.07). Les entrées suivantes doivent y être ajoutées :

ModuleName2=EXCEL-Werkzeug
ModuleExeName2="c:\temp\EXCEL-Werkzeug.bat"

ModuleDescription2= Libération finale de barre non-linéaire

Le fichier batch EXCEL-Tool.bat et la macro table1.xlsm doivent évidemment être stockés sous C:/temp/.

Pour exécuter la macro automatiquement, vous devez démarrer le sous-programme dans le sous-programme exécuté automatiquement par Excel lors de l'ouverture du fichier. Ce sous-programme s'appelle Workbook_Open et doit être stocké dans le classeur.

Figure 02 - Programme Workbook_Open dans Workbook

Excel doit alors être à nouveau fermé après avoir été exécuté avec succès. Si une erreur se produit ou si RFEM ne s'ouvre pas, vous pouvez modifier la macro. Une distinction de cas est alors intégrée. Le modèle complet est le suivant :

Private Sub Workbook_Open()

' Procédure de traitement des erreurs à l'ouverture de RFEM.
On Error GoTo e

' Récupération de l'interface avec RFEM 
Dim iApp As RFEM5.Application
Set iApp = GetObject(, "RFEM5.Application" )

e: ' en cas d'erreur, le message "RFEM n'est pas ouvert" s'affiche 
If Err.Number <> 0 Then
MsgBox "RFEM not open" , , Err.Source
Exit Sub
End If

Procédure de traitement des erreurs du programme 
On Error GoTo f

' La licence COM et l'accès au programme sont bloqués.
iApp.LockLicense

' Obtention de l'interface pour le modèle actif 
Dim iModel As RFEM5.model
If iApp.GetModelCount > 0 Then
Set iModel = iApp.GetActiveModel
Else
' Affichage de l'erreur lorsqu'il n'y a pas assez de modèles disponibles.
Err.Raise vbObjectError, "LoadModel()" , "iApp.GetModelCount < 1"
End If

' Emplacement pour votre propre code source.

f: ' Interception de l'erreur provenant du code source.
If Err.Number <> 0 Then
MsgBox Err.Description, , Err.Source
' Licence COM déverrouillée, programme de nouveau accessible. iModel.GetApplication.UnlockLicense
' L'outil ouvre Excel lorsque l'erreur survient.
Exit Sub
End If

Licence COM déverrouillée, programme de nouveau accessible. 
iModel.GetApplication.UnlockLicense
' L'outil ferme Excel lorsqu'il est appliqué correctement.
Application .Quit

End Sub

Seule la référence à la sous-routine précédemment créée est alors manquante. Elle se trouve sous « Emplacement pour votre propre code source ». Le code source complet est disponible dans la section Liens ci-dessous.

Résumé

Cet article sur la création d'un appui nodal non-linéaire décrit l'application d'un nouveau module externe et complète ainsi les articles précédents de cette série. L'utilisation de fichiers exécutables, généralement créés à l'aide de VisualStudio et VB ou C#, facilite l'intégration. Le processus complexe avec Excel a donc été décrit à cette fin.

Téléchargements

Liens

Contactez-nous

Contactez-nous

Des questions sur nos produits ? Besoin de conseils sur un projet ?
Contactez notre assistance technique gratuite par e-mail, via le chat Dlubal ou sur notre forum international. N'hésitez pas à consulter les nombreuses solutions et astuces de notre FAQ.

+33 1 78 42 91 61

info@dlubal.fr

RFEM Logiciel principal
RFEM 5.xx

Programme de base

Logiciel de calcul de structures aux éléments finis (MEF) pour les structures 2D et 3D composées de plaques, voiles, coques, barres (poutres), solides et éléments d'assemblage

Prix de la première licence
3 540,00 USD
RFEM Autres
RF-COM 5.xx

Module additionnel

Interface programmable (API) basée sur la technologie COM

Prix de la première licence
580,00 USD