3045x
001441
23.05.2017

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

La partie 2.2 de la série d'articles sur 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 sur un exemple de barre. Ce quatrième article explique la création d'un outil par l'utilisateur.

Fonctions de base

Nous voulons créer un outil qui crée des appuis nodaux non linéaires sur les nœuds actuellement sélectionnés dans le programme. Pour ce faire, les éléments clés suivants sont requis :

  • Obtenir les nœuds actuellement sélectionnés
  • Création d'appuis nodaux
  • Créer et assigner une non-linéarité
  • Exécution d'un outil dans le programme

Ces points vont maintenant être expliqués. Les parties précédentes de cette série d'articles doivent être connues. Celles-ci ne seront pas décrites à nouveau. Cependant, le code source disponible inclut des commentaires documentant les éléments mentionnés précédemment, comme l'obtention de la structure.

Obtenir le nœud actuellement sélectionné

Vous pouvez modifier les éléments sélectionnés via l'interface COM à l'aide des fonctions déjà connues, telles que IModelData.GetNodes pour les nœuds. Cependant, afin de renvoyer uniquement les éléments sélectionnés, vous devez d'abord modifier la sélection actuelle en entrant IModelData.EnableSelections. Si l'option EnableSelections est définie sur True, IModelData.GetNodes renvoie uniquement les éléments sélectionnés. Voici un exemple spécifique :

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

Une fois les nœuds sélectionnés obtenus, EnableSelections est à nouveau réinitialisé sur false, car cela peut souvent causer des erreurs. Étant donné que l'appui nodal requiert une liste de nœuds comme chaîne de caractères pour la définition, celle-ci est fournie en même temps :

' Créer une liste de nœuds.
Dim nodeList As String
Dim iAsLong
For i = 0 ToUBound(nodes, 1)
   nodeList = nodeList & nodes(i).No & ","
Next i

Création d'appuis nodaux

La non-linéarité, ou le diagramme dans le cas spécifique, est un élément distinct. Il ne peut être assigné à un appui nodal que s'il est déjà disponible dans le système. Vous devez donc d'abord créer le support nodal selon les principes décrits dans les articles précédents :

' Créer des 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éfinir la non-linéarité.
nodSup.SupportNonlinearityZ = WorkingDiagramType

iModDat.PrepareModification
iModDat.SetNodalSupport nodSup
iModDat.FinishModification

Comme vous pouvez le voir dans le code, WorkingDiagramType est spécifié comme une non-linéarité dans la direction z globale.

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

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

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

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

' Créer 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 en deux dimensions. La première dimension correspond à l'ensemble de données, la seconde dimension aux éléments de l'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 deuxième élément, la force en N. L'exemple ci-dessus a donc généré quatre ensembles de données où le troisième point du diagramme à l'emplacement est 30 mm et 0,2 kN, par exemple. Cette non-linéarité va maintenant être assignée à l'appui existant. Pour ce faire, il est nécessaire d'obtenir l'interface pour le support nodal puis pour la non-linéarité :

' Assigner la 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

Dans ce cas, la non-linéarité est le long de l'axe Z, donc AlongAxisZ doit être sélectionné pour obtenir la non-linéarité. La non-linéarité est assignée dans le bloc de modification connu.

Exécution d'un outil dans le programme

Des programmes externes peuvent être intégrés dans RFEM. Pour cela, vous devez modifier le fichier RFEM.ini dans le chemin du programme. Contrairement à la programmation en C# et VB où un fichier exécutable est créé, VBA nécessite Excel pour implémenter l'outil. Excel peut être assigné par un argument lors de l'ouverture d'un fichier à ouvrir. Celui-ci apparaît dans la ligne de commande comme ceci (le fichier Excel se trouve sous C:\temp et Excel est installé en version 32 bits) :
"C:\Program Files (x86)\Microsoft Office\Office15\EXCEL.EXE" C:\temp\table1.xlsm

Ainsi, Excel s'ouvre avec le fichier souhaité. Afin de s'assurer que RFEM ouvre uniquement le programme externe sans les arguments supplémentaires (tels que le nom de fichier derrière EXCEL.EXE dans ce cas), vous devez d'abord créer un fichier de commandes Windows. Ce fichier de texte simple contenant l'extension de fichier « .bat » est traité par Windows comme un fichier EXE exécutable. Vous pouvez donc utiliser l'éditeur pour créer un fichier TXT avec la nouvelle extension de fichier « .bat ». L'option permettant d'afficher l'extension de fichier doit d'abord être définie dans l'Explorateur Windows. Ce fichier de commandes (ci-après EXCEL-Tool.bat) doit alors inclure l'entrée suivante :
"C:\Program Files (x86)\Microsoft Office\Office15\EXCEL.EXE" C:\temp\table1.xlsm
Cela correspond à la commande telle qu'elle serait entrée dans la ligne de commande.

Une fois ce fichier exécutable créé, il peut être entré dans RFEM.ini en tant qu'outil externe. RFEM.ini est inclus dans le chemin de programme de RFEM (chemin par défaut pour RFEM 5.07 64 bits : C:\Program Files\Dlubal\RFEM 5.07). Vous devez y insérer les entrées suivantes :

ModuleName2=EXCEL-Tool
ModuleExeName2="c:\temp\EXCEL-Tool.bat"
ModuleDescription2=Nonlinear member end release

Bien entendu, le fichier de commandes EXCEL-Tool.bat et la macro table1.xlsm doivent également être enregistré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 enregistré dans Workbook.

Nous devons maintenant fermer Excel 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 des cas est intégrée à cet effet. Le projet complet est le suivant :

Private SubWorkbook_Open()

' Le gestionnaire d'erreurs exécute RFEM.
On Error GoTo e

' L'interface avec RFEM est extraite.
Dim iApp AsRFEM5.Application
Set iApp = GetObject(, "RFEM5.Application")

e: ' « RFEM non ouvert » est affiché en cas d'erreur
If Err.Number <> 0 Then
   MsgBox "RFEM not open", , Err.Source
   Exit Sub
End If

' Programme du gestionnaire d'erreurs.
On Error GoTo f

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

' Obtenir l'interface pour le modèle actif.
Dim iModel As RFEM5.model
If iApp.GetModelCount > 0 Then
   Set iModel = iApp.GetActiveModel
Else
' Erreur d'affichage lorsque le nombre de modèles disponibles est insuffisant.
Err.Raise vbObjectError, "LoadModel()", "iApp.GetModelCount < 1"
End If

' Place pour votre propre code source.

f: ' Erreur d'interception du code source.
If Err.Number <> 0 Then
   MsgBox Err.Description, , Err.Source
' Si la licence COM est débloquée, l'accès au programme est à nouveau possible.
   iModel.GetApplication.UnlockLicense
' Cet outil permet à Excel de s'ouvrir en cas d'erreur.
   Exit Sub
End If

' Si la licence COM est débloquée, l'accès au programme est à nouveau possible
iModel.GetApplication.UnlockLicense
' L'outil ferme Excel lorsqu'il est correctement appliqué.
Application.Quit

End Sub

Pour le moment, seule la référence au sous-programme créé précédemment est manquante. Celle-ci se trouve sous « Place pour votre propre code source ». Le code source complet est disponible sur le lien suivant.

Résumé

Cet article sur la création d'un appui nodal non linéaire décrit l'application d'un nouveau module externe. Il complète ainsi les parties précédentes de cette série d'articles. L'intégration est plus simple lorsque vous utilisez des fichiers exécutables, qui sont généralement créés avec VisualStudio et VB ou C#. Le processus complexe avec Excel a donc été décrit.


Auteur

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

Liens
Téléchargements