Kostka wizualizacji

Witam wszystkich!

Oto prośba o KOSTKĘ WIZUALIZACJI...

Posiadam zespoły o różnych kształtach i rozmiarach.

W załączeniu znajduje się dokument wyjaśniający problem:
KAWAŁEK - WIZUALIZACJA SZEŚCIANU. SLDPRT (88.9 KB)

Zapowiedź utworu:

Pokój z najwyższym planem:


Muszę wygenerować kostkę wizualizacji równoległą do pomieszczenia.
Jak dotąd nie ma obaw z opcją " Plan niestandardowy ":

Solidworks generuje sześcian wizualizacji równoległy do wybranej płaszczyzny, ale nie jest on równoległy do górnej płaszczyzny (normalne dla standardowej funkcji oprogramowania, która optymalizuje):


Chciałbym więc wiedzieć, czy istnieje inna metoda (makro itp...), aby móc wygenerować kostkę wizualizacji, która jest sterowana przez 2 wybrane płaszczyzny?

To znaczy, że zawsze równolegle do górnej płaszczyzny i być w stanie wybrać inną płaszczyznę równoległości zgodnie z orientacją zespołu?

Z góry dziękuję :+1:

O ile się nie mylę, wystarczy jedna płaszczyzna odniesienia do wygenerowania kostki wizualizacji, ponieważ pozostałe powierzchnie są automatycznie równoległe lub prostopadłe do wybranej, dodanie dodatkowej płaszczyzny przynosi efekt przeciwny do zamierzonego.

Nie krępuj się, aby skierować mnie z powrotem na właściwe tory, jeśli się mylę. Rzadko korzystam z tej funkcji.

2 polubienia

Witaj @romain_becdelievre ,

Funkcja powinna pozwolić mi na wygenerowanie wymiarów powierzchni podłogi mojego gotowego produktu (zespołu złożonego z podzespołów).

Czyli normalna do górnej płaszczyzny (podłogi) i równoległa do jednej z płaszczyzn pionowych mojego zespołu, aby dać orientację zdefiniowaną przez jeden z naszych podzespołów wspólnych dla wszystkich naszych gotowych produktów.

A kostka wizualizacji pozwoliłaby mi pobrać te zmienne (tak, abym mógł je odwzorować w moich mapach PDM):

Witam

Wydaje mi się, że kostka wizualizacji działa w następujący sposób: po wybraniu płaszczyzny odniesienia orientuje się ona tak, aby znajdowała się jak najbliżej objętości.
Pozwala to na posiadanie minimalnej objętości całości, to jest to, co obserwujemy na Twoim ostatnim zrzucie ekranu i to jest jego funkcja...

Pomijając opracowanie makra, jeśli jeszcze nie istnieje, wydaje mi się to niemożliwe z kostką wizualizacji...

Powodzenia.

3 polubienia

A zmieniając układ współrzędnych X,Y,Z?

1 polubienie

Witam

Być może sztuczką, jeśli raz wygenerowany sześcian już się nie zmienia (?), byłoby umieszczenie objętości (lub wytłoczenie tymczasowego przedłużenia na korpusie), która ograniczałaby prawy górny róg na ostatnim obrazie (czyli co najwyżej wyrównany w prawo z prawą krawędzią niebieskiego obszaru i stos wyrównany u góry z górnym końcem białego obszaru, tak, aby stworzyć tymczasowe ramy, które ten dodatek wymusi wymusić.
Nawiasem mówiąc, działa z każdym rogiem.

1 polubienie

Przy okazji mała wiadomość prewencyjna:

" Pij lub buduj, musisz wybrać!"  :crazy_face:

:stuck_out_tongue_winking_eye:

4 polubienia

Witam @a_eriaud
Mam takie makro, które działa dobrze, orientując się zgodnie z XYZ:

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

Moje zespoły są zawsze równoległe do górnych płaszczyzn, a więc normalne do Y, ale niekoniecznie równoległe do X (lub Z).
Nie wiem, czy funkcje makr VBA pozwoliłyby, wybierając z góry twarz, która byłaby odniesieniem do orientacji, na wygenerowanie dobrze zorientowanego szkicu 3D...
Jeśli ktoś ma pomysł, jak to zrobić w makro, jestem zainteresowany :smirk:

Witam

Rzeczywiście, może być coś wspólnego z tym makro...
Ale nie wiem o tym wystarczająco dużo, żeby zacząć...

Myślę, że musiałbyś zagłębić się w funkcję " GetExtremePoint ", aby znaleźć punkt skrajny, pozostając równoległym do płaszczyzny.

To tylko pomysł...

Myślę, że na tym forum są profesjonaliści makro, niektórzy już mi bardzo pomogli...

Miłego weekendu z wyprzedzeniem.

2 polubienia

Witaj @MLG ,
Jeśli zachowamy ideę " sześcianu obwiedniowego " (w rzeczywistości prostokątnego równoległościanu), trzy płaszczyzny generujące są prostopadłe. Po wybraniu pierwszego z nich wystarczy podać kierunek w tej płaszczyźnie, aby trójścian był całkowicie związany.
Wychodząc od makra Codestack zaproponowanego przez @MLG i przeznaczonego dla części, uważamy, że po prostu musimy dostosować je do montażu, zamiatając części drzewa konstrukcyjnego i wymuszając kierunki rzutowania.
Prosty z wyglądu, ale kilka przewidywanych chwil zamienia się w godziny. Na szczęście pogoda była ponura...
Wynik jest dostępny w załączonym makrze. Sposób użycia:

  • Złożenie musi zostać otwarte w SolidWorks.
  • Płaszczyzna i kierunek (prosta krawędź lub segment szkicu) są wybierane w tej kolejności w obszarze graficznym.
  • Makro zostanie wykonane.

Wyniki:

  • Sześcian otoczki jest wyświetlany jako szkic trójwymiarowy (3D) w zespole.
  • krawędzie modułu są określone w formularzu UserForm.

Słabością w porównaniu z " kostką wizualizacji " SolidWorks jest to, że sześcian obwiedni jest zamrożony na geometrii w momencie jej tworzenia. Dalsza ewolucja form montażu nie będzie brana pod uwagę.

Jak zawsze, makro bez zabezpieczeń, bez gwarancji wyników, do testowania zwłaszcza na dużych zespołach.
Pozdrowienia.
Zmodyfikowane makro, do pobrania poniżej...

5 polubień

Witam @m_blt

Przeszedłem przez kod i jest praca do wykonania!! DOBRA ROBOTA :clap:

Z drugiej strony testowałem na jednym z moich montaży, ale nic się nie dzieje.
Brak komunikatu o błędzie, nawet jeśli wymuszę to, uruchamiając makro na monecie.
Co z tego co udało mi się zobaczyć w kodzie powinno mi wygenerować okienko z ostrzeżeniem.

Masz pomysł, co robić?

1 polubienie

Podczas uruchamiania głównego suba z edytora za pomocą F8 pokazuje mi błąd brakującego projektu lub biblioteki:
image

A patrząc na błąd lepiej rozumiem brakującą bibliotekę (SW2023)
Może masz ten sam problem. Którą wersję oprogramowania posiadasz?
image

@m_blt Chciałem rzucić okiem z ciekawości i zainteresowania, ponieważ ogólnie rzecz biorąc, twoje makra mnie urzekają! :crazy_face:

Edit: odznaczając czego brakuje i sprawdzając 3 biblioteki w wersji 2020 działa!
Po raz kolejny jestem zdumiony tym kodem:

3 polubienia

Makro nie działa na części, ponieważ przechodzi przez drzewo budowania złożenia. Już tam powinien być ten komunikat:
image

Osobiście testowałem makro na kilku złożeniach, z których " najcięższy " miał 278 części, nie zauważając żadnej anomalii. Jeśli makro zostanie uruchomione bez wybierania żadnych obiektów, powinna być przynajmniej widoczna karta UserForm.

Potwierdzam podejrzenia @sbadenis : usterka może być spowodowana brakiem pewnych odniesień do obiektów VBA. Oto te, których używam z wersją 2023 SolidWorks:
image
Sprawdź również, czy wyświetlacz szkicu jest aktywowany w złożeniu, nigdy nie wiadomo...

Kolejna wskazówka: makro zostało napisane za pomocą SW 2023. Być może nie ma żadnej funkcji, jeśli używasz starszej wersji. Nawet jeśli powinien zostać wyświetlony komunikat o błędzie... Sądząc po ilustracji jego przesłania, @sbadenis sprawiło, że zadziałało to w wersji z 2020 roku
Czy zespół, na którym testowałeś makro, ma jakąś cechę, która uniemożliwia jego poprawne działanie? Powinieneś udostępnić jeden ze swoich zestawów i określić, której wersji oprogramowania używasz.

2 polubienia

@m_blt
Kiedy widzę tę pracę, mówię sobie, że nadszedł czas, abym wziął tangens, który jest równoległy do płaszczyzny. Poza tym dobra oferta jest zawsze mile widziana.

C dlt

4 polubienia

Witaj @m_blt @sbadenis,

Zastosowałem zmiany w referencjach, sprawdzając 2022 dla mojej wersji:

A makro działało dobrze, jest TOP @m_blt :+1: :

Właśnie zmieniłem ptLoc długości i głębokości sześcianu, które dla mnie były odwrócone (ptLoc(4) i (1)), a także precyzję, aby nie mieć ułamka dziesiętnego:

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

Jest IDEALNY.

Z drugiej strony chciałbym pobrać te wartości i skojarzyć je ze zmiennymi we wszystkich konfiguracjach, ale nie wiem gdzie i jak (sub, funkcja ...) Muszę wstawić to:

    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

Czy masz dla mnie jakiś trop?

Witam @m_blt Bravo i dziękuję za makro. Tylko mała sugestia; Określ osie xyz wskazanych wymiarów, na przykład w nawiasach, ponieważ szerokość i długość, głębokość jest co najmniej względna.

1 polubienie

Cze wszystkim
Ostatnia (?) odpowiedź...

  • Trzy wymiary sześcianu obwiedni są zapisywane jako właściwości we wszystkich konfiguracjach złożenia;
  • Aby spełnić życzenie @Sylk:wink:, dodałem lokalny układ współrzędnych w początku sześcianu, którego osie są wyrównane z krawędziami. W celu identyfikacji kierunków X, Y i Z.
    Wydaje mi się, że dla @MLG jest to kolejność wysokości (X), długości (Y) i głębokości (Z).
    Kolejność można łatwo zmienić na liniach od 322 do 334.


Mały obraz do zlokalizowania wierzchołków sześcianu.
Pozdrowienia.
Plik CubeVisuAssembly.swp (223 KB)

2 polubienia

Jeszcze raz dziękuję @m_blt
Działa bardzo dobrze :ok_hand:

Mam różnicę w dokładności wyników między oknem dialogowym a zmiennymi we właściwościach (F8):


Precyzja jest podawana w jednostkach (bez miejsc dziesiętnych) w oknie dialogowym


Dokładność wynosi 6 miejsc po przecinku

Jednak zastosowałem ten sam FORMAT w kodzie między tym, co jest wyświetlane w oknie dialogowym i we właściwościach (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

Testowałem, zmieniając ułamki dziesiętne w ustawieniach mojego modułu programowego, ale to nic nie zmienia.

Czy masz pojęcie, skąd bierze się problem?

1 polubienie

Ponieważ nie chcesz ułamków dziesiętnych, najprostszym sposobem jest przekonwertowanie zmiennej lgAreteCube z typu Double na Integer , w instrukcji generowania właściwości.
Wymiana linii:

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

Według niego:

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

Do dostosowania zgodnie z Twoimi ocenami.
Jeśli szukasz bardziej szczegółowego formatu, będziesz musiał użyć ciągów...

2 polubienia

Jeszcze raz dziękuję @m_blt

Działa bardzo dobrze.
Od wczoraj szukam na Codestack, czy istnieje sposób na nazwanie szkicu 3D po jego wykonaniu, lub na pobranie nazwy ostatniego szkicu utworzonego w drzewie.
Ale nic na ten temat nie mogłem znaleźć.
Potrzebowałbym tego, aby dodać usunięcie szkicu 3D na końcu makra, aby wyczyścić nasze zespoły po pobraniu zmiennych.

Kiedy patrzę na ten kod wygenerowany w Solidworks z pierwszym usunięciem szkicu 2D, a następnie usunięciem szkicu 3D, nie ma żadnej różnicy w syntezie, z wyjątkiem nazwy funkcji. Niezależnie od tego, czy jest to 2D, czy 3D, pojawia się " SZKIC ":

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

Czy wiesz, jak postępować?
Z góry dziękuję

1 polubienie