Visualisierungs-Würfel

Hallo zusammen!

Hier eine Anfrage für den VISUALISIERUNGSWÜRFEL...

Ich habe Baugruppen in verschiedenen Formen und Größen.

Im Anhang finden Sie ein Dokument, um das Problem zu verstehen:
STÜCK - WÜRFEL-VISUALISIERUNG. SLDPRT (88.9 KB)

Die Vorschau des Stücks:

Das Zimmer mit dem Top-Plan:


Ich muss einen Visualisierungswürfel parallel zu einem Raum generieren.
Bisher keine Sorge mit der Option " Benutzerdefinierter Plan":

Solidworks generiert einen Visualisierungswürfel parallel zur ausgewählten Ebene, aber er ist nicht parallel zur obersten Ebene (normal für die Standard-SW-Funktion, die optimiert):


Also würde ich gerne wissen, ob es eine andere Methode (Makro etc ...) gibt, um einen Visualisierungswürfel generieren zu können, der von 2 ausgewählten Ebenen angetrieben wird?

Das heißt, immer parallel zur oberen Ebene zu sein und eine andere Parallelitätsebene entsprechend der Ausrichtung der Baugruppe auswählen zu können?

Vielen Dank im Voraus :+1:

Wenn ich mich nicht irre, reicht eine einzige Referenzebene aus, um einen Visualisierungswürfel zu erzeugen, da die anderen Flächen automatisch parallel oder senkrecht zur ausgewählten Fläche sind, das Hinzufügen einer zusätzlichen Ebene ist kontraproduktiv.

Fühlen Sie sich frei, mich wieder auf den richtigen Weg zu bringen, wenn ich falsch liege. Ich benutze diese Funktion selten.

2 „Gefällt mir“

Hallo @romain_becdelievre ,

Die Funktion sollte es mir ermöglichen, die Abmessungen der Grundfläche meines fertigen Produkts (Baugruppe, die aus Unterbaugruppen besteht) zu generieren.

Also senkrecht zur oberen Ebene (Boden) und parallel zu einer der vertikalen Ebenen meiner Baugruppe, um eine Orientierung zu erhalten, die durch eine unserer Unterbaugruppen definiert wird, die allen unseren fertigen Produkten gemeinsam ist.

Und der Visualisierungswürfel würde es mir ermöglichen, diese Variablen abzurufen (damit ich sie in meinen PDM-Maps abbilden kann):

Hallo

Mir scheint, dass der Visualisierungswürfel folgendermaßen funktioniert: Sobald die Referenzebene ausgewählt ist, orientiert er sich so, dass er so nah wie möglich an den Volumen ist.
Dies ermöglicht es Ihnen, das minimale Volumen des Ganzen zu haben, das ist es, was wir auf Ihrem letzten Screenshot beobachten und das ist seine Funktion...

Abgesehen von der Entwicklung eines Makros, wenn es nicht schon existiert, scheint es mir mit dem Visualisierungswürfel unmöglich...

Viel Glück.

3 „Gefällt mir“

Und durch Ändern des X,Y,Z-Koordinatensystems?

1 „Gefällt mir“

Hallo

Ein Trick wäre vielleicht, wenn sich der Würfel nach der Generierung nicht mehr ändert (?), ein Volumen zu positionieren (oder eine temporäre Erweiterung auf den Körper zu extrudieren), das die obere rechte Ecke Ihres letzten Bildes begrenzen würde (also höchstens rechts mit dem rechten Rand des blauen Bereichs ausgerichtet und oben mit der oberen Spitze des weißen Bereichs ausgerichtet gestapelt, um einen temporären Rahmen zu schaffen, den dieser Zusatz erzwingen wird.
Es funktioniert übrigens mit jeder Ecke.

1 „Gefällt mir“

Eine kleine Präventionsbotschaft am Rande:

" Trinken oder bauen, du musst dich entscheiden!"  :crazy_face:

:stuck_out_tongue_winking_eye:

4 „Gefällt mir“

Hallo @a.eriaud
Ich habe dieses Makro, das gut funktioniert, indem es sich nach XYZ orientiert:

Dim swApp As SldWorks.SldWorks

Sub main()

    Set swApp = Application.SldWorks
    Dim swPart As SldWorks.PartDoc
    
    Set swPart = swApp.ActiveDoc
    
    If Not swPart Is Nothing Then
            
        Dim vBBox As Variant
    
        vBBox = GetPreciseBoundingBox(swPart)
     
        DrawBox swPart, CDbl(vBBox(0)), CDbl(vBBox(1)), CDbl(vBBox(2)), CDbl(vBBox(3)), CDbl(vBBox(4)), CDbl(vBBox(5))
        
        Debug.Print "Width: " & CDbl(vBBox(3)) - CDbl(vBBox(0))
        Debug.Print "Length: " & CDbl(vBBox(5)) - CDbl(vBBox(2))
        Debug.Print "Height: " & CDbl(vBBox(4)) - CDbl(vBBox(1))
        
    Else
        
        MsgBox "Please open part"
        
    End If
    
End Sub

Function GetPreciseBoundingBox(part As SldWorks.PartDoc) As Variant
    
    Dim dBox(5) As Double
    
    Dim vBodies As Variant
    vBodies = part.GetBodies2(swBodyType_e.swSolidBody, True)
        
    Dim minX As Double
    Dim minY As Double
    Dim minZ As Double
    Dim maxX As Double
    Dim maxY As Double
    Dim maxZ As Double
        
    If Not IsEmpty(vBodies) Then
    
        Dim i As Integer
        
        For i = 0 To UBound(vBodies)
        
            Dim swBody As SldWorks.Body2
    
            Set swBody = vBodies(i)
            
            Dim x As Double
            Dim y As Double
            Dim z As Double
            
            swBody.GetExtremePoint 1, 0, 0, x, y, z
            
            If i = 0 Or x > maxX Then
                maxX = x
            End If
            
            swBody.GetExtremePoint -1, 0, 0, x, y, z
            
            If i = 0 Or x < minX Then
                minX = x
            End If
            
            swBody.GetExtremePoint 0, 1, 0, x, y, z
            
            If i = 0 Or y > maxY Then
                maxY = y
            End If
            
            swBody.GetExtremePoint 0, -1, 0, x, y, z
            
            If i = 0 Or y < minY Then
                minY = y
            End If
            
            swBody.GetExtremePoint 0, 0, 1, x, y, z
            
            If i = 0 Or z > maxZ Then
                maxZ = z
            End If
            
            swBody.GetExtremePoint 0, 0, -1, x, y, z
            
            If i = 0 Or z < minZ Then
                minZ = z
            End If
            
        Next
    
    End If
    
    dBox(0) = minX: dBox(1) = minY: dBox(2) = minZ
    dBox(3) = maxX: dBox(4) = maxY: dBox(5) = maxZ
    
    GetPreciseBoundingBox = dBox
    
End Function

Sub DrawBox(model As SldWorks.ModelDoc2, minX As Double, minY As Double, minZ As Double, maxX As Double, maxY As Double, maxZ As Double)

    model.ClearSelection2 True
            
    model.SketchManager.Insert3DSketch True
    model.SketchManager.AddToDB = True
    
    model.SketchManager.CreateLine maxX, minY, minZ, maxX, minY, maxZ
    model.SketchManager.CreateLine maxX, minY, maxZ, minX, minY, maxZ
    model.SketchManager.CreateLine minX, minY, maxZ, minX, minY, minZ
    model.SketchManager.CreateLine minX, minY, minZ, maxX, minY, minZ

    model.SketchManager.CreateLine maxX, maxY, minZ, maxX, maxY, maxZ
    model.SketchManager.CreateLine maxX, maxY, maxZ, minX, maxY, maxZ
    model.SketchManager.CreateLine minX, maxY, maxZ, minX, maxY, minZ
    model.SketchManager.CreateLine minX, maxY, minZ, maxX, maxY, minZ
    
    model.SketchManager.CreateLine minX, minY, minZ, minX, maxY, minZ
    model.SketchManager.CreateLine minX, minY, maxZ, minX, maxY, maxZ
    
    model.SketchManager.CreateLine maxX, minY, minZ, maxX, maxY, minZ
    model.SketchManager.CreateLine maxX, minY, maxZ, maxX, maxY, maxZ
    
    model.SketchManager.AddToDB = False
    model.SketchManager.Insert3DSketch True
    
End Sub

Meine Baugruppen sind immer parallel zu den oberen Ebenen, also senkrecht zu Y, aber nicht unbedingt parallel zu X (oder Z).
Ich weiß nicht, ob VBA-Makrofunktionen es ermöglichen würden, im Voraus die Fläche auszuwählen, die die Orientierungsreferenz wäre, um eine gut ausgerichtete 3D-Skizze zu generieren ...
Wenn jemand eine Idee hat, wie man das im Makro macht, bin ich interessiert :smirk:

Hallo

In der Tat könnte es etwas mit diesem Makro zu tun haben...
Aber ich weiß nicht genug darüber, um anzufangen...

Ich denke, Sie müssten sich mit der Funktion " GetExtremePoint " befassen, um den Extrempunkt zu finden, während Sie parallel zu einer Ebene bleiben.

Es ist nur eine Idee...

Ich denke, dass es in diesem Forum Makro-Profis gibt, einige haben mir schon sehr geholfen...

Ich wünsche Ihnen ein schönes Wochenende im Voraus.

2 „Gefällt mir“

Hallo @MLG ,
Wenn wir die Idee eines " Hüllwürfels " (in Wirklichkeit ein rechteckiger Quader) beibehalten, sind die drei erzeugenden Ebenen senkrecht. Ist die erste gewählt, so genügt es dann, in dieser Ebene eine Richtung anzugeben, damit der Trieder vollständig eingeengt wird.
Ausgehend von dem von @MLG vorgeschlagenen Codestack-Makro, das für ein Teil gedacht ist, denken wir, dass wir es nur an eine Baugruppe anpassen müssen, indem wir die Teile des Konstruktionsbaums durchziehen und die Projektionsrichtungen erzwingen.
Einfach im Aussehen, aber aus den wenigen Momenten, die man sich vorstellen kann, werden Stunden. Zum Glück war das Wetter trübe...
Das Ergebnis ist im angehängten Makro verfügbar. Gebrauchsanweisung:

  • Eine Baugruppe muss in SolidWorks geöffnet werden.
  • Eine Ebene und eine Richtung (Gerade oder Skizzensegment) werden in dieser Reihenfolge im Grafikbereich ausgewählt.
  • Das Makro wird ausgeführt.

Befund:

  • Der Hüllwürfel wird als 3D-Skizze in der Baugruppe angezeigt.
  • Die Ränder des Würfels werden in einem UserForm angegeben.

Die Schwäche gegenüber dem SolidWorks " Visualisierungswürfel " besteht darin, dass der Hüllwürfel zum Zeitpunkt seiner Erstellung auf der Geometrie eingefroren ist. Eine Weiterentwicklung der Formen der Baugruppe wird nicht berücksichtigt.

Wie immer Makro ohne Schutzmaßnahmen, ohne Ergebnisgarantie, speziell an großen Baugruppen zu testen.
Herzliche Grüße.
Modifiziertes Makro, das unten heruntergeladen werden kann...

5 „Gefällt mir“

Hallo @m.blt

Ich bin den Code durchgegangen und es gibt noch viel zu tun!! GUT GEMACHT :clap:

Auf der anderen Seite habe ich an einer meiner Baugruppen getestet, aber es passiert nichts.
Keine Fehlermeldung, auch wenn ich sie erzwinge, indem ich das Makro auf einer Münze starte.
Was, nach dem, was ich im Code sehen konnte, ein Warnfenster für mich generieren sollte.

Haben Sie eine Idee, was ich tun kann?

1 „Gefällt mir“

Beim Starten des Haupt-Subs aus dem Editor über F8 wird mir ein fehlender Projekt- oder Bibliotheksfehler angezeigt:
image

Und wenn ich mir den Fehler anschaue, verstehe ich die fehlende Bibliothek (SW2023) besser.
Vielleicht haben Sie das gleiche Problem. Welche Version von SW haben Sie?
image

@m.blt Ich wollte aus Neugier und Interesse einen Blick darauf werfen, da mich Ihre Makros im Allgemeinen faszinieren! :crazy_face:

Bearbeiten: Durch Deaktivieren dessen, was fehlt, und Überprüfen der 3 Bibliotheken Version 2020 funktioniert es!
Wieder einmal bin ich von diesem Code begeistert:

3 „Gefällt mir“

Das Makro funktioniert nicht für ein Teil, da es die Build-Struktur einer Baugruppe durchläuft. Bereits dort sollten Sie diese Meldung haben:
image

Ich persönlich habe das Makro an mehreren Baugruppen getestet, wobei die " schwerste " mit 278 Teilen ist, ohne eine Anomalie zu bemerken. Wenn Sie das Makro ausführen, ohne Objekte auszuwählen, sollte zumindest die Karte UserForm angezeigt werden.

Ich bestätige @sbadenis Vermutung : Die Fehlfunktion kann auf das Fehlen bestimmter Verweise auf VBA-Objekte zurückzuführen sein. Hier sind diejenigen, die ich mit der Version 2023 von SolidWorks verwende:
image
Überprüfen Sie auch, ob die Skizzenanzeige in der Baugruppe aktiviert ist, man weiß ja nie...

Ein weiterer Hinweis: Das Makro wurde mit SW 2023 geschrieben. Vielleicht gibt es eine nicht vorhandene Funktion, wenn Sie eine ältere Version verwenden. Auch wenn Sie eine Fehlermeldung sehen sollten... Der Illustration seiner Botschaft nach zu urteilen, hat @sbadenis es mit einer Version von 2020 geschafft
Weist die Baugruppe, an der Sie das Makro getestet haben, eine Besonderheit auf, die verhindert, dass sie ordnungsgemäß funktioniert? Sie sollten eine Ihrer Assemblys freigeben und angeben, welche SW-Version Sie verwenden.

2 „Gefällt mir“

@m.blt
Wenn ich diese Arbeit sehe, sage ich mir, dass es mehr als Zeit für mich war, die Tangente zu nehmen, die parallel zur Ebene ist. Außerdem wird ein gutes Angebot immer geschätzt.

C dlt

3 „Gefällt mir“

Hallo @m.blt & @sbadenis,

Ich habe die Änderungen auf die Referenzen angewendet, indem ich das Jahr 2022 für meine Version überprüft habe:

Und das Makro hat gut funktioniert, es ist TOP @m.blt :+1: :

Ich habe gerade die ptLoc der Länge und Tiefe des Würfels geändert, die für mich invertiert wurden (ptLoc(4) und (1)), sowie die Genauigkeit, um keine Dezimalzahl zu haben:

        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")

Es ist perfekt.

Auf der anderen Seite möchte ich diese Werte abrufen und sie mit Variablen in allen Konfigurationen verknüpfen, aber ich weiß nicht, wo und wie (Sub, Funktion ...) ich muss dies einfügen:

    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

Haben Sie einen Lead für mich?

Hallo @m.blt Bravo und vielen Dank für Ihr Makro. Nur ein kleiner Vorschlag; Geben Sie die xyz-Achsen der angegebenen Abmessungen an, z. B. in Klammern, da die Breite und die Tiefe gelinde gesagt relativ ist.

1 „Gefällt mir“

Hallo ihr alle
Eine letzte (?) Antwort...

  • Die drei Dimensionen des Hüllwürfels werden als Eigenschaften in alle Konfigurationen der Assembly geschrieben.
  • Um @Sylk :wink:Wunsch zu erfüllen, habe ich am Ursprung des Würfels ein lokales Koordinatensystem hinzugefügt, dessen Achsen an den Kanten ausgerichtet sind. Um die Richtungen X, Y und Z zu identifizieren.
    Es scheint mir, dass es für @MLG in der Reihenfolge von Höhe (X), Länge (Y) und Tiefe (Z) ist.
    Die Reihenfolge kann auf den Linien 322 bis 334 einfach geändert werden.


Ein kleines Bild, um die Eckpunkte des Würfels zu lokalisieren.
Herzliche Grüße.
CubeVisuAssembly.swp (223 KB)

2 „Gefällt mir“

Nochmals vielen Dank @m.blt
Es funktioniert sehr gut :ok_hand:

Ich habe einen Unterschied in der Genauigkeit der Ergebnisse zwischen dem Dialogfeld und den Variablen in den Eigenschaften (F8):


Die Genauigkeit wird im Dialogfeld in Einheiten (keine Dezimalstellen) angegeben


Die Genauigkeit beträgt 6 Dezimalstellen

Ich habe jedoch das gleiche FORMAT im Code zwischen dem, was im Dialogfeld angezeigt wird, und in den Eigenschaften (F8) angewendet:

        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

Und ich habe getestet, indem ich die Dezimalstellen in meinen SW-Einheiteneinstellungen geändert habe, aber es ändert sich nichts.

Haben Sie eine Idee, woher das Problem kommt?

1 „Gefällt mir“

Da Sie keine Dezimalzahlen wünschen, ist es am einfachsten, die Variable lgAreteCube vom Typ Double in der Anweisung zur Eigenschaftsgenerierung vom Typ Double in Integer zu konvertieren.
Ersetzen der Leitung:

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

Von ihm:

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

Zur Anpassung an Ihre Bewertungen.
Wenn Sie nach einem detaillierteren Format suchen, müssen Sie Zeichenfolgen verwenden...

2 „Gefällt mir“

Nochmals vielen Dank @m.blt

Es funktioniert sehr gut.
Ich schaue seit gestern auf Codestack, ob es eine Möglichkeit gibt, die 3D-Skizze zu benennen, wenn sie erstellt wird, oder den Namen der zuletzt erstellten Skizze im Baum abzurufen.
Aber ich konnte nichts darüber finden.
Ich würde dies benötigen, um das Löschen der 3D-Skizze am Ende des Makros hinzuzufügen, um unsere Baugruppen zu bereinigen, sobald die Variablen abgerufen wurden.

Wenn ich mir diesen Code ansehe, der in Solidworks mit einer ersten 2D-Skizze und dann einer 3D-Skizze generiert wurde, gibt es außer dem Funktionsnamen keinen Unterschied zwischen der Synthaxis. Ob 2D oder 3D, es ist " SKETCH ", das erscheint:

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

Wissen Sie, wie Sie vorgehen müssen?
Vielen Dank im Voraus

1 „Gefällt mir“