Macro maken voor lagen

Hoi allemaal
Ik heb nog nooit een macro gecodeerd en ik wil het graag leren omdat ik tegen een probleem aanloop:

Momenteel ben ik op zoek naar een " eenvoudige " oplossing om solidworks-onderdelen tijdens het tekenen in een laag te plaatsen (op dit moment is de enige manier in de software om de delen die ik niet wil te verbergen, dan de delen die overblijven, ze een voor een te selecteren en ze vervolgens aan een laag toe te wijzen. Het volstaat te zeggen dat het vervelend is).
De andere manier is om het plan met kleuren te exporteren en vervolgens in de 2D-software zoals Autocad de lagen toe te wijzen op basis van de kleuren.
Kortom, een hel... Ik blader door alle forums en sites in het Engels en Frans, maar ik kan niets vinden... Het lijkt mij echter dat ik niet de enige ben die zich in deze impasse bevindt.

Dus, weet je alsjeblieft een macro die in staat is om onderdelen rechtstreeks aan lagen te koppelen? (Namelijk dat mijn assemblages hetzelfde zijn met allemaal dezelfde onderdelen, en weinig onderdelen. Maar bij een lancering van 200 assemblages kan het even duren om elk stuk te sorteren).

Anders, weet je waar ik op het net kan leren, de basis om te coderen in VBA? Omdat ik denk dat het de enige mogelijke oplossing zal zijn.

Bij voorbaat dank
Vriendelijke groeten
Axel

Hallo;

Wees voorzichtig, Solidworks beheert geen lagen zoals Autocad dat zou doen...
Het is mogelijk om een projectiebestand te maken voor het opnemen van tekeningen in DWG en DXF (file-> opslaan als DWG/DXF en vervolgens " Option ")

image

→ de optie " Projectie niet weergeven bij elke opname " uitschakelen om toegang te krijgen tot de instellingen om aan te passen: (Voorbeeld)


https://help.solidworks.com/2022/french/Solidworks/slddxf/t_map_entities_on_export_to_dwg.htm?rid=131218

Maar over het algemeen verwerkt Solidworks alleen lijntypen (en sommige lijnkleuren), maar geen 3D-componenten...

Wat betreft macro's, hier zijn enkele sites om vertrouwd te raken met VB-programmering...

en meer in het algemeen (Excel-georiënteerde VBA maar nog steeds nuttig):

en Solidworks API-helpers.

Opmerking: om te beginnen raad ik automatische macro-opname en generatieve kunstmatige intelligentie niet aan (hoewel er enige vooruitgang is opmerkelijk bij sommige " AI's "...)

En natuurlijk dit Forum...

Vriendelijke groeten.

3 likes

Bedankt voor het antwoord :slight_smile:
Ik ken inderdaad ook de exportmethode, maar het is niet precies wat ik zoek.
Het is me gelukt om handmatig een laag op een onderdeel of een heel onderdeel te plaatsen, dus ik zeg tegen mezelf dat het geautomatiseerd kan worden, het is meer in deze richting dat ik blokkeer.
Bedankt voor de links, :slight_smile: ik heb het gevoel dat de hersenen een beetje zullen roken

Hoeveel gemakkelijker zou het zijn om het wijzigen van de laag van een component te "automatiseren " met een macro?
Tenzij de component(en) in kwestie nog steeds hetzelfde zijn (bibliotheekcomponenten?) zul je altijd de " Selectie " -fase van het onderdeel of de assemblage moeten doorlopen, en dan, waarschijnlijk, de keuze van de laag waarnaar je ze wilt exporteren...
Opmerking: Zorg ervoor dat u de regelstijl, het lettertype van de lijn en de lagen niet verwart...

2 likes

Hier is een voorbeeld dat wordt gegeven door de Solidworks API's te gebruiken:
https://help.solidworks.com/2022/english/api/sldworksapi/Put_Assembly_Components_in_Drawing_View_on_Different_Layers_Example_VB.htm?verRedirect=1

… De API-helpcode met enkele aanvullende opmerkingen:

Option Explicit

' Cette sous-procédure modifie le calque d'un composant dans un document de dessin SolidWorks
Private Sub ChangeComponentLayer(swApp As SldWorks.SldWorks, swDraw As SldWorks.DrawingDoc, swDrawComp As SldWorks.DrawingComponent, sLayerName As String)

    Dim bRet As Boolean

    ' Former un nom de calque valide en remplaçant les symboles 
    ' barre oblique (/) et arobase (@) par des traits de soulignement (_)
    sLayerName = Replace(sLayerName, "/", "_")
    sLayerName = Replace(sLayerName, "@", "_")

    ' Créer un calque avec le nom formé et ajouter une assertion de débogage
    bRet = swDraw.CreateLayer(sLayerName, "layer for " & sLayerName, 0, swLineCONTINUOUS, swLW_NORMAL, True): Debug.Assert bRet
    
    ' Définir le calque du composant de dessin sur le nouveau calque
    swDrawComp.Layer = sLayerName

End Sub

' Cette sous-procédure traite un composant de dessin, modifie son calque, 
' et traite récursivement tous ses composants enfants
Sub ProcessDrawingComponent(swApp As SldWorks.SldWorks, swDraw As SldWorks.DrawingDoc, swDrawComp As SldWorks.DrawingComponent, sPadStr As String)

    Dim vDrawCompChildArr As Variant
    Dim vDrawCompChild As Variant
    Dim swDrawCompChild As SldWorks.DrawingComponent

    ' Afficher le nom du composant dans la fenêtre de débogage
    Debug.Print sPadStr & swDrawComp.Name
    
    ' Changer le calque du composant actuel
    ChangeComponentLayer swApp, swDraw, swDrawComp, swDrawComp.Name

    ' Obtenir tous les composants enfants du composant actuel
    vDrawCompChildArr = swDrawComp.GetChildren
    
    ' Vérifier s'il y a des enfants et les traiter récursivement
    If Not IsEmpty(vDrawCompChildArr) Then
        For Each vDrawCompChild In vDrawCompChildArr
            Set swDrawCompChild = vDrawCompChild
            ' Appel récursif pour traiter chaque composant enfant
            ProcessDrawingComponent swApp, swDraw, swDrawCompChild, sPadStr + "  "
        Next
    End If

End Sub

' Cette procédure principale initialise les objets SolidWorks nécessaires 
' et commence à traiter les composants de dessin sélectionnés
Sub main()

    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swDraw As SldWorks.DrawingDoc
    Dim swSelMgr As SldWorks.SelectionMgr
    Dim swView As SldWorks.View
    Dim swDrawComp As SldWorks.DrawingComponent
    Dim bRet As Boolean

    ' Obtenir l'instance active de SolidWorks
    Set swApp = Application.SldWorks
    
    ' Obtenir le document actif (qui devrait être un dessin)
    Set swModel = swApp.ActiveDoc
    Set swDraw = swModel
    
    ' Obtenir le gestionnaire de sélection et la vue sélectionnée
    Set swSelMgr = swModel.SelectionManager
    Set swView = swSelMgr.GetSelectedObject6(1, -1)
    
    ' Obtenir le composant de dessin racine de la vue sélectionnée
    Set swDrawComp = swView.RootDrawingComponent

    ' Afficher le nom du fichier et la vue sélectionnée dans la fenêtre de débogage
    Debug.Print "File = " & swModel.GetPathName
    Debug.Print "  " & swView.Name & "  [" & swView.Type & "]"

    ' Commencer le traitement du composant de dessin racine
    ProcessDrawingComponent swApp, swDraw, swDrawComp, "    "

End Sub

En wat uitleg over de verschillende procedures:

  • Sub-procedure ChangeComponentLayer :
  • Transformeer de naam van de laag om ongeldige tekens te voorkomen en het maken van de laag in het tekendocument te voorkomen.
  • Sub-procedure ProcessDrawingComponent :
  • Recursieve verwerking van tekeningcomponenten en laagwisseling voor elke component, evenals het weergeven van foutopsporingsinformatie.
  • Het hoofdgeding main :
  • Initialiseer de benodigde SolidWorks-objecten, selecteer de weergave en componenten en start het verwerkingsproces van componenten.
3 likes

… en een kleine tutorial voor de uitvoering van deze macro op een Solidworks-tekening...
Wees voorzichtig, op een kopie van een Europarlementariër... Je test nooit een macro op de originele bestanden met het risico alles te verliezen... (het komt zelden voor dat je terug kunt gaan met een MAcro).

Stap 1: Bereid de omgeving voor

  1. Open SolidWorks
    Start SolidWorks en open een tekeningdocument (Drawing) dat u met de macro wilt verwerken.
  2. Onderdelen en weergaven verifiëren
    Zorg ervoor dat de tekening onderdelen en weergaven bevat die u wilt bewerken. De macro werkt in op de tekeningcomponenten en hun lagen (layers).

Stap 2: Open de VBA-macro-editor

  1. Open de macro-editor
    Ga in SolidWorks naar het menu Extra > Macro > Nieuw om een nieuwe macro te maken of Uitvoeren om een bestaande macro te openen.
  2. Een nieuwe macro maken
  • Als u ervoor kiest om een nieuwe macro te maken, zal SolidWorks u vragen het bestand op te slaan met een .swp.
  • Geef uw macro een naam, zoals ChangeLayerMacro.swp, en sla deze op een gemakkelijk toegankelijke plaats op.

Stap 3: Kopieer VBA-code naar de editor

  1. De VBA-editor (Visual Basic for Applications) openen
    Zodra het macrobestand is gemaakt, opent SolidWorks de VBA-editor.
  2. VBA-code plakken
  • Kopieer de VBA-code (hierboven weergegeven) naar de VBA-editor.
  • Plak het in de lege macromodule die automatisch is gemaakt.
  • Zorg ervoor dat alle code correct is geplakt, inclusief declaraties Option Explicit en alle subprocedures.

Stap 4: Opslaan en sluiten VBA Editor

  • Klik op Bestand > Opslaan of gebruik de snelkoppeling Ctrl + S om de macro op te slaan.
  • Sluit de VBA-editor zodra de macro is opgeslagen.

Stap 5: Voer de macro uit in SolidWorks

  1. Selecteer een weergave in de tekening
    Voordat u de macro uitvoert, moet u ervoor zorgen dat u een tekeningweergave selecteert in het huidige document, omdat de macro verwacht dat u een weergave hebt geselecteerd om de onderdelen ervan te verwerken.
  2. Voer de macro uit
    Ga terug naar het menu Extra > Macro > Uitvoeren.
  • Blader door uw bestanden en selecteer de macro .swp die u eerder hebt opgeslagen.
  • Klik op Openen om de macro uit te voeren.

Opmerking: Persoonlijk geef ik er de voorkeur aan om de macro rechtstreeks vanuit de VBA-editor te starten met behulp van de stap-voor-stap-modus (F8) en de acties en resultaten te analyseren in het uitvoeringsvenster van de editor, terwijl ik het venster met lokale variabelen in de gaten houd

Stap 6: Controleer de resultaten

  • Nadat de macro is uitgevoerd, worden in het venster Immediate in de VBA-editor (indien geopend) of de SolidWorks Output Console de resultaten van de macro weergegeven, inclusief de namen van de verwerkte componenten en hun nieuwe lagen.
  • Controleer in de SolidWorks-tekening of de componenten zoals verwacht naar de nieuwe lagen zijn verplaatst.

Punten om te controleren en problemen op te lossen

  • Versiecompatibiliteit : Zorg ervoor dat uw versie van SolidWorks het uitvoeren van VBA-macro's ondersteunt. Afhankelijk van de versie kunnen er enkele beperkingen van toepassing zijn.
  • Macrobeveiliging : Als SolidWorks een macrobeveiligingswaarschuwing weergeeft, zorg er dan voor dat u de macrobeveiligingsinstellingen hebt ingesteld om uitvoering toe te staan.
  • Foutmeldingen : Als u fouten tegenkomt, controleer dan of u een geldige weergave hebt geselecteerd en of de tekening correct is geconfigureerd met componenten.

Samenvatting

Door deze stappen te volgen, kunt u de VBA-macro gebruiken om de lagen van componenten in een SolidWorks-tekening op een geautomatiseerde en efficiënte manier te wijzigen. Deze macro is met name handig voor het ordenen van complexe tekeningen met meerdere componenten door automatisch lagen te maken en toe te wijzen op basis van componentnamen.

4 likes

Heel erg bedankt voor deze elementen, het is erg aardig.
Dus ik heb eigenlijk deze macro geprobeerd (de eerste op de site, niet degene die je hebt gekopieerd). Het punt is dat het één laaglijn per stuk creëert. Dus ik eindig met veel lagen, wat oncomfortabel en onbruikbaar is, maar het is al een begin.

In je vorige vraag over wat makkelijker zou zijn met automatisering, is het dat ik eigenlijk eindig met dezelfde onderdelen x keer herhaald. Je kunt dus net zo goed alles groeperen met een macro, in plaats van deze elementen handmatig te selecteren en ze vervolgens in de respectievelijke lagen te plaatsen.

In feite moet ik een CAPM opzetten, maar met behoud van deze huidige praktijk van het bedrijf om 2D-lagen te gebruiken voor klantexports (archi, of BE). En het doel is om geen onnodige tijd te verspillen die mijn collega's zal afschrikken wanneer ik het project aan iedereen ga opleveren.
Momenteel gebruik ik de Swood-software op Solidworks en hoef ik me geen zorgen te maken over de codering, het is heel eenvoudig, zelfs met complexe componenten.
Maar de tekening moet ook goed toegankelijk zijn voor mijn collega's.

Ik zal blijven werken aan het probleem met uw elementen!!
Nogmaals bedankt voor je tijd, het is super leuk
Fijne dag

Anders is er dit hulpprogramma in de MyCADTools-suite op Visiativ als u problemen ondervindt bij het ontwikkelen van uw macro:

Uiteindelijk kun je het in een proefversie testen om te zien of je kunt krijgen wat je wilt.
In het bijzonder is het mogelijk om een onderdeel naar een bepaalde laag te verplaatsen volgens een eigenschap:
image

3 likes

:slight_smile: Hallo Heel erg bedankt, ik zal proberen te zien hoe het gaat!! Dat lijkt de bedoeling te zijn. Bedankt voor de tip:wink:

1 like