Cube de visualisation

En lançant le sub main depuis l’éditeur via F8, il m’affiche une erreur projet ou bibliothèque manquante:
image

Et en regardant l’erreur je comprends mieux bibliothèque manquante (SW2023)
Peut-être que tu as le même soucis. Quel version de SW tu as?
image

@m_blt je voulais jeter un œil par curiosité et intérêt puisqu’en général tes macros me subjugue! :crazy_face:

Edit: en décochant ce qui est manquant et en cochant les3 bibliothèque version 2020 cela fonctionne!
Une fois de plus je suis épaté par ce code:

3 « J'aime »

La macro ne fonctionne pas sur une pièce puisqu’elle parcourt l’arbre de construction d’un assemblage. Déjà là, vous devriez avoir ce message:
image

Personnellement, j’ai testé la macro sur plusieurs assemblages, le plus « lourd » comportant 278 pièces, sans constater d’anomalie. Si vous exécutez la macro sans avoir sélectionné d’objets, vous devriez au moins voir s’afficher la fiche UserForm.

Je confirme le soupçon de @sbadenis : le dysfonctionnement est peut-être dû à l’absence de certaines références aux objets de VBA. Voici celles que j’utilise avec la version 2023 de SolidWorks:
image
Vérifiez également que l’affichage des esquisses est bien activé dans l’assemblage, sait-on jamais…

Autre piste: la macro a été écrite avec SW 2023. Peut-être y a-t-il une fonction inexistante si vous utilisez une version plus ancienne. Même si un message d’erreur devrait s’afficher… A en juger par l’illustration de son message, @sbadenis l’a fait fonctionner avec une version 2020
L’assemblage sur lequel vous avez testé la macro aurait-il une particularité qui empêche son bon fonctionnement ? Il faudrait partager un de vos assemblages et préciser quelle version de SW vous utilisez.

2 « J'aime »

@m_blt
Quand je vois ce travail je me dis qu’il était plus que temps que je prenne la tangente qui est parallèle au plan. D’ailleurs un bon plan est toujours apprécié.

C dlt

4 « J'aime »

Bonjour @m_blt & @sbadenis,

J’ai appliqué les modifications des références en cochant les 2022 pour ma version :

Et la macro a bien fonctionné, c’est TOP @m_blt :+1: :

J’ai juste changé les ptLoc de la longueur et profondeur du cube qui pour moi, étaient inversés (ptLoc(4) et (1)), ainsi que la précision afin de ne pas avoir de décimale:

        UserForm1.Label3.Caption = "Longueur du cube : " & Format(longueur(ptLoc(0), ptLoc(4)), "#####0")
        UserForm1.Label4.Caption = "Largeur du cube : " & Format(longueur(ptLoc(0), ptLoc(2)), "#####0")
        UserForm1.Label5.Caption = "Profondeur du cube : " & Format(longueur(ptLoc(0), ptLoc(1)), "#####0")

C’est NICKEL.

Par contre j’aimerai récupérer ces valeurs et les associer à des variables dans touts les configs mais je ne sais pas où et comment (sub, function …) je dois insérer cela :

    Dim i As Integer
    Dim tConfig() As String
    Dim swErrors As Long
    Dim swWarnings As Long
    
    Do
    'récupère le document actif dans SW
    Set swModel = swApp.ActiveDoc
    If Not swModel Is Nothing Then
    
    'Boucle sur toutes les configurations
    tConfig = swModel.GetConfigurationNames
    For i = 0 To UBound(tConfig)
    
    'ajoute un propriété personnalisée "DIM-Lo"
    'Chr(34) permet d'ajouter le caractère "
    bRet = swModel.DeleteCustomInfo2(tConfig(i), "DIM-Lo")
    bRet = swModel.AddCustomInfo3(tConfig(i), "DIM-Lo", swCustomInfoText, Chr(34) & Format(longueur(ptLoc(0), ptLoc(4)), "#####0") & Chr(34))
    
    'ajoute un propriété personnalisée "DIM-La"
    'Chr(34) permet d'ajouter le caractère "
    bRet = swModel.DeleteCustomInfo2(tConfig(i), "DIM-La")
    bRet = swModel.AddCustomInfo3(tConfig(i), "DIM-La", swCustomInfoText, Chr(34) & Format(longueur(ptLoc(0), ptLoc(2)), "#####0") & Chr(34))
    
    'ajoute un propriété personnalisée "DIM-Ha"
    'Chr(34) permet d'ajouter le caractère "
    bRet = swModel.DeleteCustomInfo2(tConfig(i), "DIM-Ha")
    bRet = swModel.AddCustomInfo3(tConfig(i), "DIM-Ha", swCustomInfoText, Chr(34) & Format(longueur(ptLoc(0), ptLoc(1)), "#####0") & Chr(34))
    
    Next i

Est ce que vous auriez une piste pour moi ?

Bonjour @m_blt Bravo et merci pour ta macro. Juste une petite suggestion ; préciser les axes xyz des dimensions indiquées, entre parenthèses par exemple, car largeur longueur profondeur c’est pour le moins relatif.

1 « J'aime »

Bonjour à tous,
Une dernière (?) réponse…

  • les trois dimensions du cube enveloppe sont inscrites en propriétés dans toutes les configs de l’assemblage;
  • pour répondre au souhait de @Sylk :wink:, j’ai ajouté un repère local à l’origine du cube, dont les axes sont alignés sur les arêtes. De façon à identifier les directions X, Y et Z.
    Il me semble que pour @MLG, il s’agit dans l’ordre de la hauteur (X), de la longueur (Y) et de la profondeur (Z).
    Ordre modifiable facilement au niveau des lignes 322 à 334.


Une petite image pour situer les sommets du cube.
Cordialement.
CubeVisuAssembly.swp (223 Ko)

2 « J'aime »

Merci encore @m_blt
Ca fonctionne très bien :ok_hand:

J’ai une différence de précision des résultats entre la boite de dialogue et les variables dans les propriétés (F8) :


la précision est à l’unité (pas de décimale) dans la boite de dialogue


La précision est de 6 décimales

J’ai pourtant appliqué le même FORMAT dans le code entre ce qui s’affiche dans la boite de dialogue et dans les propriétés (F8) :

        Dim valLONG         As Variant
        Dim valLARG         As Variant
        Dim valHAUT         As Variant

    
    Set ptLoc(0) = creationPt(min(0), min(1), min(2))
    Set ptLoc(1) = creationPt(max(0), min(1), min(2))
    Set ptLoc(2) = creationPt(min(0), max(1), min(2))
    Set ptLoc(3) = creationPt(max(0), max(1), min(2))
    Set ptLoc(4) = creationPt(min(0), min(1), max(2))
    Set ptLoc(5) = creationPt(max(0), min(1), max(2))
    Set ptLoc(6) = creationPt(min(0), max(1), max(2))
    Set ptLoc(7) = creationPt(max(0), max(1), max(2))

    For iPt = 0 To 7
        Set ptLoc(iPt) = ptLoc(iPt).MultiplyTransform(RgToCube)
    Next iPt
    
    TraceBox ptLoc
    
    lgAreteCube(0) = CalculLongueur(ptLoc(0), ptLoc(1))
    lgAreteCube(1) = CalculLongueur(ptLoc(0), ptLoc(2))
    lgAreteCube(2) = CalculLongueur(ptLoc(0), ptLoc(4))
    
    UserForm1.Label3.Caption = "DIM-Lo : " & Format((lgAreteCube(2) / 10), "#####0")
    UserForm1.Label4.Caption = "DIM-La : " & Format((lgAreteCube(0) / 10), "#####0")
    UserForm1.Label5.Caption = "DIM-Ha : " & Format((lgAreteCube(1) / 10), "#####0")
    UserForm1.CommandButton3.Enabled = True
    
  
    valLONG = (Format((lgAreteCube(2) / 10), "#####0"))
    valLARG = (Format((lgAreteCube(0) / 10), "#####0"))
    valHAUT = (Format((lgAreteCube(1) / 10), "#####0"))

        
    swConfNames = swModel.GetConfigurationNames             ' Liste des noms de configurations
    For iPt = LBound(swConfNames) To UBound(swConfNames)    ' Boucle sur les configs
        Set swCstPropMgr = swModel.Extension.CustomPropertyManager(swConfNames(iPt))
        
        swCstPropMgr.Add3 "DIM-Lo", swCustomInfoDouble, valLONG, swCustomPropertyReplaceValue
        swCstPropMgr.Add3 "DIM-La", swCustomInfoDouble, valLARG, swCustomPropertyReplaceValue
        swCstPropMgr.Add3 "DIM-Ha", swCustomInfoDouble, valHAUT, swCustomPropertyReplaceValue
    Next iPt

End Sub

Et j’ai testé en modifiant les décimales dans mes paramêtres d’unités de SW, mais ça ne change rien.

Est ce que vous avez une idée d’où vient le soucis ?

1 « J'aime »

Puisque vous ne souhaitez pas de décimales, le plus simple consiste à convertir la variable lgAreteCube de type Double en Integer dans l’instruction de génération des propriétés.
En remplaçant la ligne :

swCstPropMgr.Add3 "CubEnvLongueurY", swCustomInfoNumber, CInt(lgAreteCube(1)), swCustomPropertyReplaceValue

par celle-ci :

swCstPropMgr.Add3 "CubEnvLongueurY", swCustomInfoNumber, CInt(lgAreteCube(1)), swCustomPropertyReplaceValue

A adapter selon vos notations.
Si vous recherchez un format plus fouillé, il faudra en passer par des chaînes de caractères…

2 « J'aime »

Merci encore @m_blt

cela fonctionne très bien.
Je cherche depuis hier sur Codestack si il y a moyen de nommer l’esquisse 3D lors de sa réalisation, ou de récupérer le nom de la derniere esquisse créée dans l’arbre.
Mais je n’ai rien trouvé là dessus.
J’aurais besoin de cela pour ajouter la suppression de l’esquisse 3D à la fin de la macro pour remettre à propre nos assemblage une fois les variables récupérées.

Quand je regarde ce code généré dans Solidworks avec une première suppression d’esquisse 2D puis une suppression d’esquisse 3D, il n’y pas de différence de synthaxe à part le nom de la fonction. Que ce soit 2D ou 3D, c’est « SKETCH » qui apparait :

boolstatus = Part.Extension.SelectByID2("Esquisse3D1", "SKETCH", 0, 0, 0, False, 0, Nothing, 0)
Part.EditDelete
boolstatus = Part.Extension.SelectByID2("Esquisse1", "SKETCH", 0, 0, 0, False, 0, Nothing, 0)
Part.EditDelete

Savez vous comment procéder ?
Merci d’avance

1 « J'aime »

Bonjour,
Sur la fiche UserForm1, il y a un bouton [Effacer] qui supprime l’esquisse 3D et le repère associé au cube. A condition qu’il s’agisse des deux dernières fonctions de l’arbre, donc que rien ne soit ajouté après création du cube.

Quant à récupérer le nom d’une esquisse, la méthode « Name » fait partie de la classe « ISketch » de l’API (« swSketch.Name », cf. ligne 377).

Mais si vous avez une variable pointant sur l’esquisse, comme par exemple à la ligne 363 (« Set swSketch = swModel.SketchManager.ActiveSketch »), la méthode « Select4() » permet la sélection sans avoir à rechercher son nom, par exemple :
« ok = swSketch.Select4(False, Nothing) »
Membres sans doute hérités, ils ne sont pas documentés dans l’aide de la classe « ISketch », mais le sont dans d’autres…

1 « J'aime »

Bonjour @m_blt
Merci une fois de plus pour ton retour.
Je n’avais pas percuté pour le bouton EFFACER effectivement.
Je vais regarder cela de plus prêt pour voir à quel moment ça agit par rapport aux renseignement des variables que j’ai ajouté … et pour enrichir ma pauvreté intellectuelle en VBA :slightly_smiling_face:.

D’ailleurs, en VBA j’ai bricolé cela ce matin…
Un macro qui récupère le nom de la derniere fonction afin de la supprimer.
Comme il y a une esquisse 3D et un trièdre, je double les lignes de commande pour supprimer les 2 fonctions.
Je sais, c’est archaïque :sweat_smile:
Il y a surement moyen de faire plus simple j’imagine …

Option Explicit

Dim swApp As SldWorks.SldWorks
Dim swDoc As SldWorks.ModelDoc2
Dim swAssembly As SldWorks.AssemblyDoc
Dim swFeatureName As SldWorks.Feature


Sub SuppressionDeuxDernieresFonctions()

    Set swApp = Application.SldWorks

    Set swDoc = swApp.ActiveDoc
  
    ' Vérifie que le document SW est ouvert
    If swDoc Is Nothing Then
  
    MsgBox "Aucun document Solidworks ouvert"
    Exit Sub
    
    End If
  
    Set swAssembly = swDoc
  
'''Première passe pour supprimer le trièdre
  
    'Attribution nom dernière fonction
    Set swFeatureName = swDoc.Extension.GetLastFeatureAdded

    'Vérifie la selection de la fonction
    If swFeatureName Is Nothing Then
  
    MsgBox "Sélection fonction impossible"
    swDoc.ClearSelection2 True
    Exit Sub
    
    End If
  
    'Selection du nom
    swFeatureName.Select True
  
    'Suppression de la fonction
    swDoc.EditDelete
  
'''Deuxième passe pour supprimer l'esquisse 3D
  
    'Attribution nom dernière fonction
    Set swFeatureName = swDoc.Extension.GetLastFeatureAdded

    'Vérifie la selection de la fonction
    If swFeatureName Is Nothing Then
  
    MsgBox "Selection fonction Impossible"
    swDoc.ClearSelection2 True
    Exit Sub
    
    End If
  
    'Selection du nom
    swFeatureName.Select True
  
    'Suppression de la fonction
    swDoc.EditDelete
  
End Sub
1 « J'aime »

Bonjour @m_blt

j’ai une petite question concernant la définition du tracé de la boite.
J’ai quelques cas ou elle ne se cale pas totalement au max de ce qui devrait être. Notamment sur des pièces rondes comportant des congés :

J’ai le cas sur les 2 pièces à droite et à gauche :

Mais je n’ai pas le cas sur la pièce du haut :

A quel endroit du code puis-je intervenir afin d’obtenir une bonne tangence ?

En tous cas, la macro fonctionne super bien.
J’y ai apporté mes arrangements et des fonctions en plus et c’est TOP.
Merci beaucoup pour l’aide apportée.

Merci d’avance.

Bonjour,
Difficile de se prononcer sur l’origine du problème que vous soulevez. Quelques remarques:

  • Quelle est l’importance de l’erreur, comparée aux dimensions générales de l’assemblage (en mm par exemple) ?.

  • Dans la mesure où le défaut observé nécessite un zoom important, l’affichage est peut-être en cause…

  • C’est la méthode « GetExtremePoint() » qui détermine la limite extérieure pour chaque pièce. Il s’agit d’un calcul numérique interne aux API de SolidWorks. Est-il rigoureux ? Comme tout calcul numérique, il utilise un critère de qualité pour valider sa recherche, critère inconnu de l’utilisateur.
    Sur ce point, commentaire de l’aide SolidWorks à propos de la fonction « GetBodyBox » qui utilise apparemment la méthode « GetExtremePoint » :
    IMPORTANT : Les valeurs renvoyées sont approximatives et ne doivent pas être utilisées à des fins de comparaison ou de calcul. De plus, la boîte englobante peut varier après la reconstruction du modèle.
    Les contours des « nuages » visibles sur les copies d’écran semblent basés sur des splines. Serait-ce l’origine du pb ?

  • Les seuls calculs à l’intérieur de la macro sont des changements de repères qui utilisent les fonctions vectorielles et matricielles de l’API. Je ne vois pas comment ils peuvent générer le défaut.

Pour conclure: je ne suis pas en mesure d’identifier l’origine du souci. Pouvez-vous partager l’exemple qui pose problème ? Même dégradé, ou par message privé…

Cordialement.

4 « J'aime »

Merci beaucoup pour ces réponses.

Alors l’erreur est variable suivant les assemblages et pièces.
Cela va de 0.5 à 1.5mm.
Dans mon cas cela n’est pas forcément important, car je récupère mes valeurs au cm.

Ma question était surtout dans le but de mieux comprendre le code et d’éventuellement corriger celà si c’était réalisable. Donc rien d’impératif.

Je mets tout de même l’assemblage + pieces avec Esquisse 3D + Syteme coordonnées générés par la macro si vous voulez regarder.

Merci pour les informations :slight_smile:

TEST ENCOMBREMENT.rar (1,1 Mo)

1 « J'aime »

Super travail @m_blt , comme toujours.
Et moi qui pensais ne jamais à avoir à me servir des « BoundingBox » jusqu’à présent…je tombe sur un client disons…Tatillon.
Ta Macro tombe donc à point nommé. Merci :index_pointing_at_the_viewer: :+1: :+1: :index_pointing_at_the_viewer:

2 « J'aime »

Bonjour @Maclane , et merci pour le compliment…
Attention toutefois au problème de précision soulevé par @MLG dans son dernier message.
J’ai constaté l’anomalie, mais je n’ai pas réussi à identifier si c’est SW ou la macro qui est en cause.

3 « J'aime »

Bonjour;
C’est un problème récurent avec les splines, Solidworks ne prend en compte que les points et non la courbe elle-même par conséquent je pense que la fonction « GetExtremePoint() » fait la même chose (comme son nom l’indique d’ailleurs).

De mon coté, je me suis permis de modifier ta macro en ajoutant les propriétés dur le documents avec une option pour les inscrire (ou non) dans toutes les configurations.
En revanche je suis en train de chercher comment ajouter de la cotation sur l’esquisse 3D.

Je n’ai pas encore regardé la notion associée au bouton « Effacer » mais je pense qu’en renommant les fonctions « Esquisse3D » et « Système de Coordonnées » de manière plus explicite (du type « BoundingBox_3D » et « BoundingBox_XYZ »), ce sera plus simple de les effacer, voir de supprimer dans la foulée toutes les fonctions (reliquats) avec les même Noms (+compteur).

Cordialement.

3 « J'aime »

Bonjour @MLG

Peut-être que les valeurs seront plus précises avec tous les réglages de qualité au max, dans les options du document ?

1 « J'aime »

Bonjour à tous,
la différence est vraiment minime mais est présente effectivement.
Ayant des documents cotés à la main et certains utilisant cette macro, on se retrouvait avec des données de sortie différentes, d’où mon interrogation…
Et pour les splines, on évite de travailler avec afin de ne pas avoir ce genre de soucis.

Bonjour tout le monde
HOP, me voici de retour sur ce sujet ! :slight_smile:
La macro fonctionne bien, mais je me retrouve confronté à un soucis.
Explications :

La macro me servait à définir un cube 3D me permettant de récupérer les valeurs d’encombrement de mon assemblage suivant une orientation précise. Pour cela nickel et un GRAND MERCI à @m_blt et à tous ceux qui ont participé à l’avancement de ce post :+1:.

Mes assemblages comportent des sous assemblages de scellement (ci-dessous en bleu) permettant de fixer le produit au sol. Dans ma macro, je supprimais ces sous assemblages afin de n’avoir que la partie au dessus du sol de présent. Hors, j’ai des sous assemblages en scellement direct (ci-sdessous en rouge), c’est a dire qu’il sont présent en dessous et au dessus du niveau 0 (ci-dessous sans pouvoir être scindés/séparés :

Je voudrais savoir si il est possible de pouvoir ajouter au UserForm la sélection du plan de niveau 0 (un plan ou une face de pièce) afin de déterminer la plan le plus bas du cube 3D ? Les sous assemblages en scellement direct (en rouge) ne peuvent supprimés car ils servent à la définition en largeur du cube :

Il faudrait donc que la sélection du plan Niveau 0 définisse le plan BAS du cube et que l’encombrement longueur/largeur/hauteur se définisse uniquement avec tout ce qui se trouve au dessus du Niveau 0 sans tenir compte de ce qu’il y a en dessous.

J’espère que c’est compréhensible car pas simple à expliquer :sweat_smile: