Cube de visualisation

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:

Bonjour MLG,

Un an plus tard, retour sur le cube… :wink:
image

Le principe du traitement de la macro est basé sur le parcours de l’arbre de l’assemblage pour trouver les composants limitant les dimensions du cube. Prendre en compte un plan qui coupe certains composants pour en exclure une partie semble compliqué a priori.

Sauf si…
Une piste : Ce doit être possible si ce plan « Niveau0 » est le plan de référence de la création du cube (premier plan sélectionné dans la macro), ou au pire parallèle à l’une faces du futur cube.
Il faut sélectionner ce plan « limitant » (Niveau 0) en plus des deux entités permettant d’orienter les faces du cube, et ne pas considérer ce qui est en dessous (quel côté le dessous ?).
Acceptable ?

4 « J'aime »

De retour, désolé, j’ai lancé le sujet et je me suis échappé sur autre chose comme un malpoli !!!

@m_blt , on avait en sélection une face d’onnant une orientation du cube et une arrete donnant la verticalité.
Est il possible d’avoir en plus en première sélection un plan qui serait le niveau 0 et ainsi tout ce qui serait sous ce plan ne serait pas pris en compte dans la définition du cube ?

1 « J'aime »

Bonjour;

Je relance le sujet, et en particulier @m_blt , parce que j’ai beau essayer mes tentatives se soldent par des échecs…
Je cherchai le moyen d’ajouter de la cotation sur la boite englobante générée par la macro ci-dessus…(sur le repére local)

cote n°1 => du point n°0 au point n°1 (selon axe X_local)
cote n°3 => du point n°0 au point n°2 (selon axe Y_local)
cote n°2 => du point n°0 au point n°4 (selon axe Z_local)

Des idées à me soumettre sur la façon de procéder ?

1 « J'aime »

Je n’ai trouvé que ces informations anciennes, je ne pensais pas que se soit possible dans le but de le piloter. Si non c’est possible en habillage en 3d je pense en 2D c’est sur. Enfin sur la version 2018 voir liens
Coter un cube de visualisation - Plan 2D / Mise en plan - Forum myCAD (visiativ.com)

J’ai déjà trouvé comment ajouter la cotation sur le 2D, mais ce que j’aurai souhaité serait de la cotation pilotée directement dans l’esquisse 3D.
L’objectif est que mes ingénieurs puissent voir directement les dimensions du « Bounding box » sous Edrawing ou pour faire des captures écran directement dans le 3D…
Ils (mes ingénieurs) ne sont pas toujours hyper doués avec leur souris, et encore moins avec la cotation sous Edrawing autant leur mâcher le travail. :yum:

1 « J'aime »

J’avais compris pour la cotation l’obectif étant de maitriser ton cube.
A l’origine le but de ce cube était de définir des débits, donc il s’adapte à l’éxistant si vous souhaiter maitriser les cotes il va falloir en créer un vous-même. Et plus compliqué suivant l’orientation mais pas impossible

des ingénieurs sur Edraw!! c’est déjà du luxe :stuck_out_tongue_winking_eye: :grin:

2 « J'aime »

Ben, non c’est tout le contraire, je n’ai pas besoin de cotes pilotantes, je cherche juste le moyen de faire apparaitre, visuellement, les 3 Dimension sous forme de cotes (pilotées donc) dans l’esquisse 3D du Cube (et orientées sur son nouveau repére orthonormé).
C’est tout de même dingue que je n’arrive pas à adapter le code de @m_blt … il fournis pourtant 98% des informations nécessaires… :crazy_face:

okOK
Dans le lien que je t’ai mis la personne arrivait à côté (manuellement !) mais de temps en temps il n’y arrivait pas sans raison.

Bah !
Coter manuellement, autant le faire sans passer par la macro, après tout il ne s’agit que de trois dimensions à ajouter sur un cube.
Naïvement je pensait pouvoir les ajouter facilement directement dans le code de la macro, mais soit je m’y prend très mal (c’est fort possible), soit ajouter de la cotation dans une esquisse 3D via les API n’est pas si simple que cela.
Pourtant le code de @m_blt donne toutes les informations nécessaire (voir plus).
=> J’ai le Nom des points
=> J’ai le Nom de l’esquisse
=> J’ai le nom du repére
et j’ai même des distances des 3 coordonnées X,Yet Z…
Et avec tout ceci … ben j’y arrive pô… :melting_face: :crazy_face:

Bonjour @Maclane ,

Désolé de cette réponse tardive…
Pas simple effectivement de coter une esquisse 3D dans une macro.
La prise de tête, c’est de définir précisément la position de la cote. On se contente en général de laisser faire SW, et ensuite on retouche « à la main ».

Dans la macro du « cube de visualisation », c’est la fonction Sub TraceBox(ptLoc() As MathVector) qui trace la boite. Je lui ai ajouté quelques lignes :

  • pour placer au mieux les trois cotes de longueur des arêtes de la boite issues du point origine P0.
  • pour appliquer une contrainte « Fixe » aux huit sommets de la boite, de façon à figer l’esquisse.
  • pour créer des points de référence aux sommets de la boite, utiles en mode debug pour identifier ces sommets. Partie de code à mettre en commentaire en mode standard.

Le résultat :

Il suffit en principe :rofl: de remplacer la fonction TraceBox d’origine par celle ci-dessous.

Sub TraceBox(ptLoc() As MathVector)

        Dim swFeat          As Feature
        Dim swRefPt         As RefPoint
        Dim swFeatMgr       As FeatureManager
        Dim matProps(8)     As Double
        Dim skSegment(11)   As SketchSegment
        Dim swSketch        As Sketch
        Dim posCote(2)      As Double
        Dim noPt            As Long
        Dim boolStatus      As Boolean
        Dim vRefPoint       As Variant
        Dim bInputDimPref   As Boolean
        Dim swDisplayDim    As DisplayDimension
        Dim i               As Long

    swModel.SketchManager.Insert3DSketch True
    swModel.SketchManager.AddToDB = True
    
    Set skSegment(0) = traceLigne(ptLoc, 0, 1)
    Set skSegment(1) = traceLigne(ptLoc, 0, 2)
    Set skSegment(2) = traceLigne(ptLoc, 2, 3)
    Set skSegment(3) = traceLigne(ptLoc, 1, 3)
    
    Set skSegment(4) = traceLigne(ptLoc, 4, 5)
    Set skSegment(5) = traceLigne(ptLoc, 4, 6)
    Set skSegment(6) = traceLigne(ptLoc, 6, 7)
    Set skSegment(7) = traceLigne(ptLoc, 5, 7)
    
    Set skSegment(8) = traceLigne(ptLoc, 0, 4)
    Set skSegment(9) = traceLigne(ptLoc, 1, 5)
    Set skSegment(10) = traceLigne(ptLoc, 3, 7)
    Set skSegment(11) = traceLigne(ptLoc, 2, 6)
    
    ' Contrainte "Fixe" des sommets de la boite
    For noPt = LBound(ptLoc) To UBound(ptLoc)
        boolStatus = swModel.Extension.SelectByID2("", "SKETCHPOINT", ptLoc(noPt).ArrayData(0), ptLoc(noPt).ArrayData(1), ptLoc(noPt).ArrayData(2), False, 0, Nothing, 0)
        If boolStatus Then
            swModel.SketchAddConstraints "sgFIXED"      ' Sommet fixé
        End If
    Next noPt
    
    ' Cotation des arêtes de la boite
    bInputDimPref = swApp.GetUserPreferenceToggle(swUserPreferenceToggle_e.swInputDimValOnCreate)
    swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swInputDimValOnCreate, False
    
    ' Cote de l'arête / X
    swModel.ClearSelection2 True
    For i = 0 To 2
        posCote(i) = ptLoc(0).ArrayData(i) * 3 / 4 + ptLoc(1).ArrayData(i) / 2 - ptLoc(4).ArrayData(i) / 4
    Next i
'    swModel.SketchManager.CreatePoint posCote(0), posCote(1), posCote(2)
    skSegment(8).Select4 False, Nothing
    skSegment(9).Select4 True, Nothing
    Set swDisplayDim = swModel.AddDimension2(posCote(0), posCote(1), posCote(2))

    ' Cote de l'arête / Y
    swModel.ClearSelection2 True
    For i = 0 To 2
        posCote(i) = ptLoc(0).ArrayData(i) * 3 / 4 + ptLoc(2).ArrayData(i) / 2 - ptLoc(4).ArrayData(i) / 4
    Next i
'    swModel.SketchManager.CreatePoint posCote(0), posCote(1), posCote(2)
    skSegment(8).Select4 False, Nothing
    skSegment(11).Select4 True, Nothing
    Set swDisplayDim = swModel.AddDimension2(posCote(0), posCote(1), posCote(2))

    ' Cote de l'arête / Z
    swModel.ClearSelection2 True
    For i = 0 To 2
        posCote(i) = ptLoc(0).ArrayData(i) * 3 / 4 + ptLoc(4).ArrayData(i) / 2 - ptLoc(1).ArrayData(i) / 4
    Next i
'    swModel.SketchManager.CreatePoint posCote(0), posCote(1), posCote(2)
    skSegment(0).Select4 False, Nothing
    skSegment(4).Select4 True, Nothing
    Set swDisplayDim = swModel.AddDimension2(posCote(0), posCote(1), posCote(2))

    swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swInputDimValOnCreate, bInputDimPref
    swModel.ClearSelection2 True
    
    ' Réactualiser l'affichage
    swModel.ClearSelection2 True
    swModel.GraphicsRedraw2
    
    Set swSketch = swModel.SketchManager.ActiveSketch
    swModel.SketchManager.AddToDB = False
    swModel.SketchManager.Insert3DSketch True
    
    
'''    ' Création de points de référence aux sommets de la boite
'''    Set swFeatMgr = swModel.FeatureManager
'''    For noPt = LBound(ptLoc) To UBound(ptLoc)
'''        boolStatus = swModel.Extension.SelectByID2("", "EXTSKETCHPOINT", ptLoc(noPt).ArrayData(0), ptLoc(noPt).ArrayData(1), ptLoc(noPt).ArrayData(2), False, 0, Nothing, 0)
'''        If boolStatus Then
'''            vRefPoint = swFeatMgr.InsertReferencePoint(swRefPointSketchPoint, 0, 0.01, 1)       ' Création d'un point de référence
'''            Set swFeat = vRefPoint(0)
'''            swFeat.Name = "Pt" & CStr(noPt)
'''        End If
'''    Next noPt
    
    
    Set swFeat = swModel.FeatureByPositionReverse(0)
    matProps(0) = 0#: matProps(1) = 162# / 255#: matProps(2) = 175# / 255#     'Couleur turquoise
    matProps(3) = 1: matProps(4) = 1: matProps(5) = 0.5
    matProps(6) = 0.4: matProps(7) = 0: matProps(8) = 0
    swFeat.SetMaterialPropertyValues2 matProps, swThisConfiguration, Empty
    UserForm1.Show
    swModel.ForceRebuild3 True
    swModel.ClearSelection2 (True)
        
    swModel.Extension.SelectByID2 "", "EXTSKETCHPOINT", ptLoc(0).ArrayData(0), ptLoc(0).ArrayData(1), ptLoc(0).ArrayData(2), False, 1, Nothing, 0
    swModel.Extension.SelectByID2 skSegment(0).GetName & "@" & swSketch.Name, "EXTSKETCHSEGMENT", 0#, 0#, 0#, True, 2, Nothing, 0
    swModel.Extension.SelectByID2 skSegment(1).GetName & "@" & swSketch.Name, "EXTSKETCHSEGMENT", 0#, 0#, 0#, True, 4, Nothing, 0
    swModel.FeatureManager.InsertCoordinateSystem False, False, False

End Sub

1 « J'aime »

Arrrgggghhhhh !

=> fixer les points … !!! FIXER LES POINTS !!!
… pfff , mais bon sang, je savais bien que j’étais sur la bonne voie. :sob:

bon j’avais aussi oublié le:

swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swInputDimValOnCreate, False

alors cela marchait beaucoup moins bien forcément. :crazy_face:
Merci @m_blt et chapeau bas.
(pas si simple la cotation par macro hein ? :sweat_smile:)

1 « J'aime »

Il faut surtout avoir à proximité du clavier une feuille de papier et un stylo pour enrichir les représentations de SW… :disguised_face: :nerd_face: :sunglasses:

image

C’est tout de même plus complet et plus esthétique que ça :

3 « J'aime »