Visualisatie Kubus

Hartelijk dank voor deze antwoorden.

De fout varieert dus afhankelijk van de assemblages en onderdelen.
Dit varieert van 0,5 tot 1,5 mm.
In mijn geval is dit niet per se belangrijk, omdat ik mijn waarden terugbreng naar de cm.

Mijn vraag was vooral om de code beter te begrijpen en eventueel te corrigeren als dat haalbaar was. Niets dwingends dus.

Ik zet nog steeds de assemblage + onderdelen met 3D Sketch + Systeem coördinaten gegenereerd door de macro als je wilt kijken.

Bedankt voor de informatie :slight_smile:

TEST ENCOMBREMENT.rar (1.1 MB)

1 like

Geweldig werk @m_blt , zoals altijd.
En ik dacht dat ik tot nu toe nooit de " BoundingBox " zou hoeven te gebruiken... Ik kom een klant tegen, laten we zeggen... Kieskeurig.
Uw Macro komt dus op het juiste moment. Bedankt :index_pointing_at_the_viewer: :+1: :+1: :index_pointing_at_the_viewer:

2 likes

Hallo @Maclane , en bedankt voor het compliment...
Pas echter op voor het probleem van precisie dat @MLG in zijn laatste boodschap aan de orde stelde.
Ik merkte de anomalie, maar ik kon niet identificeren of het SW of de macro die de schuld heeft.

3 likes

Hallo;
Dit is een terugkerend probleem met splines, Solidworks houdt alleen rekening met de punten en niet met de curve zelf, dus ik denk dat de " GetExtremePoint() " functie hetzelfde doet (zoals de naam al doet vermoeden).

Van mijn kant ben ik zo vrij geweest om uw macro aan te passen door de eigenschappen aan het document toe te voegen met een optie om ze (of niet) in alle configuraties te registreren.
Aan de andere kant ben ik op zoek naar hoe ik maatvoering kan toevoegen aan de 3D-schets.

Ik heb nog niet gekeken naar het begrip dat hoort bij de knop " Verwijderen ", maar ik denk dat door de functies " 3Dsketch " en " Coördinatensysteem " op een meer expliciete manier te hernoemen (zoals " BoundingBox_3D " en " BoundingBox_XYZ "), het gemakkelijker zal zijn om ze te verwijderen, of zelfs om alle functies (restjes) met dezelfde namen (+teller) te verwijderen.

Vriendelijke groeten.

3 likes

Hallo @MLG

Misschien zullen de waarden nauwkeuriger zijn met alle kwaliteitsinstellingen maximaal, in de documentopties?

1 like

Hoi allemaal
Het verschil is echt minimaal, maar is wel degelijk aanwezig.
Met documenten die met de hand werden vermeld en sommige met behulp van deze macro, eindigden we met verschillende uitvoergegevens, vandaar mijn vraag...
En voor splines vermijden we ermee te werken om dit soort problemen niet te hebben.

Hallo allemaal
HOP, hier ben ik weer terug op dit onderwerp! :slight_smile:
De macro werkt goed, maar ik merk dat ik voor een probleem sta.
Uitleg:

De macro werd gebruikt om een 3D-kubus te definiëren, waardoor ik de voetafdrukwaarden van mijn assemblage kon ophalen volgens een nauwkeurige oriëntatie. Voor deze stuiver en een GROTE DANK aan @m_blt en aan iedereen die heeft bijgedragen aan de vooruitgang van dit bericht :+1:.

Mijn assemblages hebben afdichtende subassemblages (hieronder in blauw) om het product op de vloer te bevestigen. In mijn macro heb ik deze subassemblages verwijderd, zodat ik alleen het deel boven de grond van aanwezig had. Ik heb echter subassemblages in directe afdichting (hieronder in rood), d.w.z. ze zijn aanwezig onder en boven niveau 0 (hieronder zonder dat ze kunnen worden gesplitst/gescheiden):

Ik zou graag willen weten of het mogelijk is om aan de UserForm de selectie van het niveau 0-vlak (een vlak of een deelvlak) toe te voegen om het laagste vlak van de 3D-kubus te bepalen? Subassemblages in directe afdichting (in rood) kunnen niet worden verwijderd omdat ze worden gebruikt om de breedte van de kubus te definiëren:

De selectie van het plan van niveau 0 zou daarom het LOW-vlak van de kubus moeten definiëren en de voetafdruk van lengte/breedte/hoogte zou alleen moeten worden gedefinieerd met alles boven niveau 0 zonder rekening te houden met wat eronder is.

Ik hoop dat het begrijpelijk is, want het is niet gemakkelijk uit te leggen :sweat_smile:

Hallo MLG,

Een jaar later, terug naar de kubus... :wink:
image

Het principe van macroverwerking is gebaseerd op het doorkruisen van de assemblageboom om de componenten te vinden die de afmetingen van de kubus beperken. Rekening houden met een plan dat bepaalde componenten schrapt om sommige ervan uit te sluiten, lijkt op het eerste gezicht ingewikkeld.

Tenzij...
Een aanwijzing: Het zou mogelijk moeten zijn als dit " Niveau 0 " vlak het referentievlak is van de creatie van de kubus (eerste vlak geselecteerd in de macro), of in het slechtste geval evenwijdig aan één vlak van de toekomstige kubus.
U moet dit " beperkende " vlak (niveau 0) selecteren naast de twee entiteiten die worden gebruikt om de vlakken van de kubus te oriënteren, en niet overwegen wat eronder zit (welke kant is eronder?).
Aanvaardbaar?

4 likes

Thuis, sorry, ik begon het onderwerp en ontsnapte aan iets anders als een onbeschofte man!!

@m_blt hadden we in de selectie een zijde van de onnant, een oriëntatie van de kubus en een rand die de verticaliteit aangaf.
Is het mogelijk om in de eerste selectie een vlak te hebben dat niveau 0 zou zijn en dus alles wat zich onder dit vlak zou bevinden niet in aanmerking zou worden genomen bij de definitie van de kubus?

1 like

Hallo;

Ik blaas het onderwerp weer tot leven, en in het bijzonder @m_blt , want hoe hard ik ook probeer, mijn pogingen eindigen in mislukking...
Ik zocht een manier om een citaat toe te voegen aan het begrensende vak dat door de macro hierboven wordt gegenereerd... (op de lokale bord)

Dimensie N°1 => Van Punt N°0 tot Punt N°1 (volgens As X_local)
Dimensie N°3 => Van Punt N°0 tot Punt N°2 (volgens As Y_local)
Dimensie N°2 => Van Punt N°0 tot Punt N°4 (volgens As Z_local)

Heb je ideeën om aan mij te sturen over hoe ik verder kan gaan?

1 like

Ik vond alleen deze oude informatie, ik dacht niet dat het mogelijk was om het te besturen. Zo niet, dan is het mogelijk in 3D-dressing, ik denk in 2D, dat is zeker. Tot slot, over de versie van 2018, zie links
Dimensioneren van een visualisatiekubus - 2D Plan / Tekening - myCAD Forum (visiativ.com)

Ik heb al uitgezocht hoe ik de afmetingen op de 2D kan toevoegen, maar wat ik graag had gewild was dat de afmetingen direct in de 3D-schets werden aangestuurd.
Het doel is dat mijn engineers de afmetingen van de " Bounding box " direct onder Edrawing kunnen zien of screenshots direct in de 3D kunnen maken...
Zij (mijn ingenieurs) zijn niet altijd erg goed met hun muis, en nog minder met de beoordeling onder Edrawing, dus je kunt het werk net zo goed voor hen opsnoepen. :yum:

1 like

Ik had begrepen dat het doel van het citaat was om je kubus te beheersen.
Oorspronkelijk was het doel van deze kubus om stromen te definiëren, zodat hij zich aanpast aan het bestaande; als je de dimensies wilt beheersen, moet je er zelf een creëren. En ingewikkelder afhankelijk van de geaardheid, maar niet onmogelijk

engineers op Edraw!! Het is al een luxe :stuck_out_tongue_winking_eye: :grin:

2 likes

Nou, nee, het is juist het tegenovergestelde, ik heb geen aandrijfdimensies nodig, ik zoek alleen een manier om de 3 dimensies visueel te laten verschijnen in de vorm van dimensies (gepiloteerd) in de 3D-schets van de kubus (en georiënteerd op het nieuwe orthonormale coördinatensysteem).
Het is nog steeds gek dat ik de code van @m_blt niet kan aanpassen ... Toch levert het 98% van de benodigde informatie... :crazy_face:

okOK
In de link die ik bij jou heb geplaatst, kwam de persoon handmatig naast je aan, maar af en toe lukte het hem zonder reden.

Bah!
Om handmatig te dimensioneren, kun je dat net zo goed doen zonder de macro te doorlopen, het zijn tenslotte maar drie dimensies die aan een kubus toegevoegd moeten worden.
Naïef dacht ik dat ik ze makkelijk direct in de macrocode kon toevoegen, maar ofwel doe ik het heel verkeerd (dat is heel goed mogelijk), of het toevoegen van afmetingen in een 3D-schets via de API's is niet zo eenvoudig.
De @m_blt code geeft echter alle benodigde informatie (of meer).
=> Ik heb de Puntnaam
=> Ik heb de Sketch Name
=> Ik heb de naam van de marker
en ik heb zelfs afstanden tot de 3 X, maar Z-coördinaten...
En met dit alles... nou, ik kom er voor ... :melting_face: :crazy_face:

Hallo @Maclane ,

Sorry voor deze late reactie...
Het is niet eenvoudig om een 3D-schets in een macro te dimensioneren.
De hoofdpijn is om precies de positie van de kansen te definiëren. We laten SW het meestal gewoon doen, en daarna werken we het " met de hand " bij.

In de macro " visualisatiekubus " tekent de Sub TraceBox(ptLoc() As MathVector) functie de box. Ik heb er een paar regels aan toegevoegd:

  • om de drie zijden van de lengte van de randen van de doos vanaf het oorsprongspunt P0 zo goed mogelijk te plaatsen.
  • om een " Vaste " beperking toe te passen op de acht hoekpunten van de doos, zodat de schets bevriest.
  • om referentiepunten te creëren naar de hoekpunten van de doos, handig in debugmodus om deze knopen te identificeren. Onderdeel van de code om in standaardmodus te reageren.

Het resultaat:

In principe :rofl: is het voldoende om de oorspronkelijke TraceBox-functie te vervangen door de onderstaande functie.

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 like

Arrrgggghhhhh!

=> zet de punten... !! DE !! PUNTEN OPLOSSEN
… pfff, maar verdorie, ik wist dat ik op het juiste spoor zat. :sob:

nou, ik was ook vergeten dat het volgende

swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swInputDimValOnCreate, False

Dus het werkte minder goed. :crazy_face:
Dank je wel @m_blt en petje af.
(niet zo'n simpele macrocitaat, hè?):sweat_smile:

1 like

Bovenal heb je een vel papier en een pen bij het toetsenbord nodig om de weergaven van SW te verrijken... :disguised_face: :nerd_face: :sunglasses:

image

Het is nog steeds completer en esthetischer dan dat:

3 likes