Visualisatie Kubus

Bij het starten van de hoofdsub vanuit de editor via F8, toont het me een ontbrekende project- of bibliotheekfout:
image

En als ik naar de fout kijk, begrijp ik de ontbrekende bibliotheek beter (SW2023)
Misschien heb jij hetzelfde probleem. Welke versie van SW heb je?
image

@m_blt ik wilde een kijkje nemen uit nieuwsgierigheid en interesse, omdat je macro's me over het algemeen boeien! :crazy_face:

Edit: door uit te vinken wat er ontbreekt en de 3 bibliotheken versie 2020 te controleren werkt het!
Opnieuw ben ik verbaasd over deze code:

3 likes

De macro werkt niet op een onderdeel omdat het door de build-boom van een assembly reist. Als je er al bent, zou je dit bericht moeten hebben:
image

Persoonlijk heb ik de macro op verschillende assemblages getest, waarvan de " zwaarste " 278 onderdelen heeft, zonder enige anomalie op te merken. Als u de macro uitvoert zonder objecten te selecteren, moet u ten minste de UserForm-kaart zien.

Ik bevestig het vermoeden van @sbadenis : de storing kan te wijten zijn aan het ontbreken van bepaalde verwijzingen naar VBA-objecten. Dit zijn degene die ik gebruik met de 2023-versie van SolidWorks:
image
Controleer ook of de schetsweergave is geactiveerd in de montage, je weet maar nooit...

Nog een aanwijzing: de macro is geschreven met SW 2023. Misschien is er een niet-bestaande functie als u een oudere versie gebruikt. Ook al zou je een foutmelding moeten zien... Afgaande op de illustratie van zijn boodschap, heeft @sbadenis het laten werken met een versie uit 2020
Heeft de assemblage waarop je de macro hebt getest een eigenaardigheid waardoor deze niet goed werkt? U moet een van uw assemblages delen en aangeven welke versie van SW u gebruikt.

2 likes

@m_blt
Als ik dit werk zie, zeg ik tegen mezelf dat het meer dan tijd was om de raaklijn te nemen die evenwijdig is aan het vlak. Trouwens, een goede deal wordt altijd gewaardeerd.

C dlt

4 likes

Hallo @m_blt & @sbadenis,

Ik heb de wijzigingen in de referenties toegepast door de 2022 te controleren voor mijn versie:

En de macro werkte goed, het is TOP @m_blt :+1: :

Ik heb zojuist de ptLoc van de lengte en diepte van de kubus veranderd, die voor mij omgekeerd waren (ptLoc(4) en (1)), evenals de precisie om geen decimaal te hebben:

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

Het is PERFECT.

Aan de andere kant zou ik deze waarden willen ophalen en ze associëren met variabelen in alle configuraties, maar ik weet niet waar en hoe (sub, functie ...) ik dit moet invoegen:

    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

Hebben jullie een aanwijzing voor mij?

Hallo @m_blt Bravo en bedankt voor je macro. Even een kleine suggestie; Geef de xyz-assen van de aangegeven afmetingen op, bijvoorbeeld tussen haakjes, omdat de breedte, lengte, diepte op zijn zachtst gezegd relatief is.

1 like

Hoi allemaal
Nog een laatste (?) antwoord...

  • De drie dimensies van de envelopkubus worden geschreven als eigenschappen in alle configuraties van de assemblage;
  • Om aan de wens van @Sylk :wink:te voldoen, heb ik aan de oorsprong van de kubus een lokaal coördinatensysteem toegevoegd, waarvan de assen zijn uitgelijnd met de randen. Om de X-, Y- en Z-richtingen te identificeren.
    Het lijkt mij dat het voor @MLG in volgorde van hoogte (X), lengte (Y) en diepte (Z) is.
    De bestelling kan eenvoudig worden gewijzigd op de lijnen 322 tot 334.


Een kleine afbeelding om de hoekpunten van de kubus te lokaliseren.
Vriendelijke groeten.
CubeVisuAssembly.swp (223 kB)

2 likes

Nogmaals bedankt @m_blt
Het werkt heel goed :ok_hand:

Ik heb een verschil in de precisie van de resultaten tussen het dialoogvenster en de variabelen in de eigenschappen (F8):


De precisie is in eenheden (geen decimalen) in het dialoogvenster


De nauwkeurigheid is 6 cijfers achter de komma

Ik heb echter dezelfde FORMAT toegepast in de code tussen wat wordt weergegeven in het dialoogvenster en in de eigenschappen (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

En ik heb getest door de decimalen in de instellingen van mijn SW-eenheid te wijzigen, maar het verandert niets.

Heb je enig idee waar het probleem vandaan komt?

1 like

Aangezien u geen decimalen wilt, is de eenvoudigste manier om de variabele lgAreteCube te converteren van het type Dubbel naar Geheel getal in de instructie voor het genereren van eigenschappen.
Vervangen van de lijn:

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

Door het:

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

Aan te passen op basis van uw beoordelingen.
Als u op zoek bent naar een gedetailleerder formaat, moet u tekenreeksen gebruiken...

2 likes

Nogmaals bedankt @m_blt

Het werkt heel goed.
Ik ben sinds gisteren op Codestack aan het kijken of er een manier is om de 3D-schets een naam te geven wanneer deze is gemaakt, of om de naam van de laatste schets die in de boom is gemaakt op te halen.
Maar ik kon er niets over vinden.
Ik zou dit nodig hebben om de verwijdering van de 3D-schets aan het einde van de macro toe te voegen om onze assemblages op te schonen zodra de variabelen zijn opgehaald.

Als ik kijk naar deze code die in Solidworks is gegenereerd met een eerste 2D-schets verwijderen en vervolgens een 3D-schets verwijderen, is er geen synthaxis verschil behalve de functienaam. Of het nu 2D of 3D is, het is " SKETCH " die verschijnt:

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

Weet jij hoe je te werk moet gaan?
Bij voorbaat dank

1 like

Hallo
Op de UserForm1-record bevindt zich een knop [Wissen] waarmee de 3D-schets en het coördinatensysteem dat aan de kubus is gekoppeld, worden verwijderd. Mits dit de laatste twee functies van de boom zijn, zodat er niets wordt toegevoegd nadat de kubus is gemaakt.

Wat betreft het ophalen van de naam van een schets, de " Naam " methode maakt deel uit van de " ISketch " klasse van de API ("swSketch.Name  ", zie regel 377).

Maar als je een variabele hebt die naar de schets verwijst, zoals regel 363 ("Set swSketch = swModel.SketchManager.ActiveSketch "), dan maakt de " Select4() " methode selectie mogelijk zonder dat je naar de naam hoeft te zoeken, bijvoorbeeld: 
ok = swSketch.Select4(Onwaar, Niets) "
Waarschijnlijk geërfde leden, ze zijn niet gedocumenteerd in de hulp van de " ISketch " -klasse, maar zijn gedocumenteerd in andere...

1 like

Hallo @m_blt
Nogmaals bedankt voor uw feedback.
Ik had eigenlijk niet op de DELETE-knop gedrukt.
Ik zal dit eens nader bekijken om te zien wanneer het werkt in relatie tot de informatie van de variabelen die ik heb toegevoegd ... en om mijn intellectuele armoede te verrijken in VBA :slightly_smiling_face:.

Trouwens, in VBA heb ik er vanmorgen mee gesleuteld...
Een macro die de naam van de laatste functie ophaalt om deze te verwijderen.
Omdat er een 3D-schets en een drievlakker is, verdubbel ik de opdrachtregels om de 2 functies te verwijderen.
Ik weet het, het is archaïsch :sweat_smile:
Er is zeker een manier om het eenvoudiger te maken, denk ik ...

Option Explicit

Dim swApp As SldWorks.SldWorks
Dim swDoc As SldWorks.ModelDoc2
Dim swAssembly As SldWorks.AssemblyDoc
Dim swFeatureName As SldWorks.Feature


Sub SuppressionDeuxDernieresFonctions()

    Set swApp = Application.SldWorks

    Set swDoc = swApp.ActiveDoc
  
    ' Vérifie que le document SW est ouvert
    If swDoc Is Nothing Then
  
    MsgBox "Aucun document Solidworks ouvert"
    Exit Sub
    
    End If
  
    Set swAssembly = swDoc
  
'''Première passe pour supprimer le trièdre
  
    'Attribution nom dernière fonction
    Set swFeatureName = swDoc.Extension.GetLastFeatureAdded

    'Vérifie la selection de la fonction
    If swFeatureName Is Nothing Then
  
    MsgBox "Sélection fonction impossible"
    swDoc.ClearSelection2 True
    Exit Sub
    
    End If
  
    'Selection du nom
    swFeatureName.Select True
  
    'Suppression de la fonction
    swDoc.EditDelete
  
'''Deuxième passe pour supprimer l'esquisse 3D
  
    'Attribution nom dernière fonction
    Set swFeatureName = swDoc.Extension.GetLastFeatureAdded

    'Vérifie la selection de la fonction
    If swFeatureName Is Nothing Then
  
    MsgBox "Selection fonction Impossible"
    swDoc.ClearSelection2 True
    Exit Sub
    
    End If
  
    'Selection du nom
    swFeatureName.Select True
  
    'Suppression de la fonction
    swDoc.EditDelete
  
End Sub
1 like

Hallo @m_blt

Ik heb een kleine vraag over de definitie van de lay-out van de doos.
Ik heb een paar gevallen waarin het niet helemaal past bij het maximum van wat zou moeten zijn. In het bijzonder op ronde delen met filets:

Ik heb het hoesje op de 2 stukken aan de rechter- en linkerkant:

Maar ik heb niet de behuizing op het bovenste stuk:

Waar in het wetboek kan ik ingrijpen om een goede tangency te verkrijgen?

De macro werkt in ieder geval prima.
Ik heb mijn arrangementen en extra functies meegenomen en het is GEWELDIG.
Hartelijk dank voor de geboden hulp.

Bij voorbaat dank.

Hallo
Het is moeilijk te zeggen wat de oorzaak is van het probleem dat u aan de orde stelt. Een paar opmerkingen:

  • Wat is de grootte van de fout, vergeleken met de algemene afmetingen van de assemblage (in mm bijvoorbeeld)?

  • Voor zover het waargenomen defect een aanzienlijke zoom vereist, kan het scherm de schuldige zijn...

  • De " GetExtremePoint() " methode bepaalt de buitenlimiet voor elk onderdeel. Dit is een numerieke berekening die intern is in de SolidWorks API's. Is het rigoureus? Zoals elke numerieke berekening, gebruikt het een kwaliteitscriterium om zijn zoekopdracht te valideren, een criterium dat onbekend is voor de gebruiker.
    Op dit punt geeft SolidWorks Help commentaar op de " GetBodyBox " -functie die blijkbaar de " GetExtremePoint " -methode gebruikt:
    BELANGRIJK: De geretourneerde waarden zijn bij benadering en mogen niet worden gebruikt voor vergelijkings- of berekeningsdoeleinden. Bovendien kan het begrenzingsvak variëren nadat het model opnieuw is opgebouwd.
    De contouren van de " wolken" die zichtbaar zijn in de schermafbeeldingen lijken gebaseerd te zijn op splines. Zou dit de oorsprong van het pb kunnen zijn?

  • De enige berekeningen in de macro zijn wijzigingen in het coördinatensysteem die gebruikmaken van de vector- en rasterfuncties van de API. Ik zie niet in hoe ze het defect kunnen genereren.

Tot slot: ik ben niet in staat om de oorzaak van het probleem te achterhalen. Kunt u het voorbeeld delen dat problematisch is? Zelfs als het wordt gedegradeerd, of via een privébericht...

Vriendelijke groeten.

4 likes

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: