Kostka wizualizacji

Bardzo dziękuję za te odpowiedzi.

Tak więc błąd różni się w zależności od zespołów i części.
Waha się to od 0,5 do 1,5 mm.
W moim przypadku niekoniecznie jest to ważne, ponieważ moje wartości wracają do cm.

Moje pytanie dotyczyło głównie lepszego zrozumienia kodu i ewentualnego poprawienia go, jeśli było to wykonalne. Więc nic koniecznego.

Nadal umieszczam zespół + części ze szkicem 3D + współrzędnymi systemu wygenerowanymi przez makro, jeśli chcesz spojrzeć.

Dzięki za informację :slight_smile:

ENCOMBREMENT.rar TESTOWY (1.1 MB)

1 polubienie

Świetna robota @m_blt , jak zawsze.
I myślałem, że nigdy nie będę musiał używać " BoundingBox " aż do teraz... Trafiam na klienta, powiedzmy... Wybredny.
Twoje makro jest więc na czasie. Dziękuję :index_pointing_at_the_viewer: :+1: :+1: :index_pointing_at_the_viewer:

2 polubienia

Witam @Maclane i dziękuję za komplement...
Zwróćcie jednak uwagę na problem precyzji, który poruszył @MLG w swoim ostatnim przesłaniu.
Zauważyłem anomalię, ale nie mogłem zidentyfikować, czy to SW, czy makro jest winne.

3 polubienia

Witam;
Jest to powtarzający się problem ze splajnami, Solidworks bierze pod uwagę tylko punkty, a nie samą krzywą, więc myślę, że funkcja " GetExtremePoint() " robi to samo (jak sugeruje jej nazwa).

Ze swojej strony pozwoliłem sobie zmodyfikować Twoje makro, dodając właściwości do dokumentu z opcją ich zarejestrowania (lub nie) we wszystkich konfiguracjach.
Z drugiej strony szukam sposobu na dodanie wymiarowania do szkicu 3D.

Nie przyjrzałem się jeszcze pojęciu związanemu z przyciskiem " Usuń ", ale myślę, że zmieniając nazwy funkcji " 3Dsketch " i " Układ współrzędnych " w bardziej wyraźny sposób (np. " BoundingBox_3D " i " BoundingBox_XYZ "), łatwiej będzie je usunąć, a nawet usunąć wszystkie funkcje (pozostałości) o tych samych nazwach (+licznik).

Pozdrowienia.

3 polubienia

Witam @MLG

Być może wartości będą dokładniejsze, gdy wszystkie ustawienia jakości zostaną wymaksowane, w opcjach dokumentu?

1 polubienie

Cze wszystkim
Różnica jest naprawdę minimalna, ale rzeczywiście jest obecna.
Mając ręcznie wymienione dokumenty, a niektóre z nich korzystały z tego makra, otrzymaliśmy różne dane wyjściowe, stąd moje pytanie...
A w przypadku splajnów unikamy pracy z nimi, aby nie mieć tego rodzaju problemów.

Cześć wszystkim
HOP, oto wracam do tego tematu! :slight_smile:
Makro działa dobrze, ale napotykam problem.
Wyjaśnienia:

Makro zostało użyte do zdefiniowania sześcianu 3D, co pozwoliło mi na pobranie wartości footprintów mojego zespołu zgodnie z precyzyjną orientacją. Za ten grosz i WIELKIE PODZIĘKOWANIA dla @m_blt oraz dla wszystkich, którzy przyczynili się do powstania tego postu :+1:.

Moje zespoły mają podzespoły uszczelniające (poniżej w kolorze niebieskim) do mocowania produktu do podłogi. W moim makrze usunąłem te podzespoły tak, że miałem tylko część nad ziemią teraźniejszości. Mam jednak podzespoły w uszczelnieniu bezpośrednim (poniżej na czerwono), tzn. występują poniżej i powyżej poziomu 0 (poniżej bez możliwości podziału/rozdzielenia:

Chciałbym wiedzieć, czy możliwe jest dodanie do formularza użytkownika wyboru płaszczyzny poziomu 0 (płaszczyzny lub powierzchni części) w celu określenia najniższej płaszczyzny sześcianu 3D? Podzespoły w uszczelnieniu bezpośrednim (w kolorze czerwonym) nie mogą zostać usunięte, ponieważ są używane do definiowania szerokości sześcianu:

Wybór planu poziomu 0 musiałby zatem zdefiniować niską płaszczyznę sześcianu, a ślad długości/szerokości/wysokości musiałby być zdefiniowany tylko dla wszystkiego powyżej poziomu 0, bez uwzględnienia tego, co znajduje się poniżej.

Mam nadzieję, że jest to zrozumiałe, bo nie jest łatwo to wytłumaczyć :sweat_smile:

Witaj MLG,

Rok później, wracając do sześcianu... :wink:
image

Zasada przetwarzania makr opiera się na przechodzeniu przez drzewo złożenia w celu znalezienia komponentów, które ograniczają wymiary sześcianu. Uwzględnienie planu, który wycina pewne komponenty, aby wykluczyć niektóre z nich, wydaje się skomplikowane na pierwszy rzut oka.

Chyba że...
Wskazówka: Powinno to być możliwe, jeśli ta płaszczyzna " Poziomu 0 " jest płaszczyzną odniesienia do tworzenia sześcianu (pierwsza płaszczyzna wybrana w makrze), lub w najgorszym razie równoległą do jednej ściany przyszłego sześcianu.
Musisz wybrać tę " ograniczającą " płaszczyznę (Poziom 0) oprócz dwóch elementów używanych do orientowania ścian sześcianu, a nie brać pod uwagę tego, co jest pod spodem (która strona jest poniżej?).
Zadowalające?

4 polubienia

Po powrocie do domu, przepraszam, rozpocząłem temat i uciekłem na coś innego, jak niegrzeczny facet!!

@m_blt , mieliśmy w wyborze bok cebuli, orientację sześcianu i krawędź nadającą pionowość.
Czy możliwe jest posiadanie dodatkowo w pierwszym zaborze płaszczyzny, która byłaby na poziomie 0 i tym samym wszystko, co znajdowałoby się pod tą płaszczyzną , nie byłoby brane pod uwagę w definicji sześcianu?

1 polubienie

Cześć;

Ożywiam ten temat, a szczególnie @m_blt , bo bez względu na to, jak bardzo się staram, moje próby kończą się porażką...
Szukam sposobu, by dodać trochę cudzysłowu do ramki ograniczającej generowanej przez powyższe makro... (na lokalnym znaczniku)

Wymiar n°1 => od punktu n°0 do punktu n°1 (zgodnie z osią X_local)
Wymiar n°3 => od punktu n°0 do punktu n°2 (zgodnie z osią Y_local)
Wymiar n°2 => od punktu n°0 do punktu n°4 (zgodnie z osią Z_local)

Macie jakieś pomysły, jak dalej postępować?

1 polubienie

Znalazłem tylko tę starą informację, nie sądziłem, że to możliwe, by ją pilotować. Jeśli nie, to jest to możliwe w trójwymiarowym stroju, myślę, że w 2D, to na pewno. Na koniec w wersji z 2018 roku zobacz linki
Wymiarowanie kostki wizualizacyjnej - Plan 2D / Rysunek - myCAD Forum (visiativ.com)

Już wymyśliłem, jak dodać wymiarowanie w 2D, ale chciałbym, żeby wymiarowanie było bezpośrednio sterowane w szkicu 3D.
Celem jest, aby moi inżynierowie mogli zobaczyć wymiary " ramki ograniczającej" bezpośrednio pod Edrawing lub robić zrzuty ekranu bezpośrednio w 3D...
Moi inżynierowie nie zawsze są dobrzy w obsłudze myszy, a tym mniej w ocenie pod Edrawing, więc możesz im się tym przydać. :yum:

1 polubienie

Zrozumiałem, że celem w tym cytacie jest opanowanie swojej kostki.
Pierwotnie celem tej kostki było definiowanie przepływów, więc dostosowuje się do istniejącego, jeśli chcesz kontrolować wymiary, będziesz musiał samodzielnie stworzyć taki sam. I bardziej skomplikowane w zależności od orientacji, ale nie niemożliwe

inżynierowie na Edraw!! To już luksus :stuck_out_tongue_winking_eye: :grin:

2 polubienia

No nie, jest wręcz przeciwnie, nie potrzebuję wymiarów sterujących, szukam tylko sposobu, by 3 wymiary pojawiły się wizualnie w formie wymiarów (pilotowanych) w trójwymiarowym szkicu Sześcianu (i zorientowanych na jego nowy ortonormalny układ współrzędnych).
Wciąż to szalone, że nie potrafię dostosować kodeksu @m_blt ... a jednak dostarcza 98% niezbędnych informacji... :crazy_face:

okOK
W linku, który ci dałem, osoba pojawiła się obok ciebie (ręcznie!), ale od czasu do czasu nie udało jej się tego zrobić bez powodu.

Bah!
Aby wymiarować ręcznie, równie dobrze można to zrobić bez przechodzenia przez makro, w końcu do sześcianu dodano tylko trzy wymiary.
Naiwnie myślałem, że łatwo dodam je bezpośrednio do kodu makro, ale albo robię to bardzo źle (co jest całkiem możliwe), albo dodanie wymiarowania w szkicu 3D przez API nie jest takie proste.
Jednak kod @m_blt zawiera wszystkie niezbędne informacje (lub więcej).
=> Mam Nazwę Punktu
=> Mam Nazwę Szkicu
=> Mam nazwę markera
a nawet mam odległości od współrzędnych 3 X, a jednak Z...
A przy tym wszystkim... no cóż, zbliżam się do tego dla ... :melting_face: :crazy_face:

Witaj @Maclane ,

Przepraszam za późną odpowiedź...
Nie jest łatwo wyznaczyć szkic 3D w makrze.
Problemem jest precyzyjne określenie pozycji kursów. Zazwyczaj pozwalamy SW to robić, a potem poprawiamy to " ręcznie ".

W makrze "  visualization cube" funkcja Sub TraceBox (ptLoc() As MathVector) rysuje ramkę. Dodałem do niego kilka linijek:

  • aby najlepiej umieścić trzy boki długości krawędzi pudełka od punktu początkowego P0.
  • aby zastosować "stałe " ograniczenie do ośmiu wierzchołków pudełka, aby zamrozić szkic.
  • do tworzenia punktów odniesienia do wierzchołków pudełka, co jest przydatne w trybie debugowania do identyfikacji tych wierzchołków. Część kodu polega na komentowaniu w trybie standardowym.

Efekt:

W zasadzie :rofl: wystarczy zastąpić oryginalną funkcję TraceBox tą poniżej.

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 polubienie

Arrrgggghhhhh!

=> ustalić punkty... !! NAPRAWIANIE PUNKTÓW !!
… pfff, ale kurczę, wiedziałem, że idę w dobrym kierunku. :sob:

no cóż, zapomniałem też:

swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swInputDimValOnCreate, False

Więc nie działało to tak dobrze. :crazy_face:
Dziękuję @m_blt i szacunek z głowy.
(nie takie proste makro cytaty, co? :sweat_smile:)

1 polubienie

Przede wszystkim potrzebujesz kartki papieru i długopisu przy klawiaturze, aby wzbogacić przedstawienia SW... :disguised_face: :nerd_face: :sunglasses:

image

To wciąż bardziej kompletne i bardziej estetyczne:

3 polubienia