PDF/DWG-STEP-macrocode bewerken

Ik ben ook aan het drogen! :crazy_face:
Kunt u de macro bewerken, voeg de Execution en Local Variables vensters (zie afbeelding), klik dan net na Sub main() en druk op F8 zodat het bugs?
image

Kortom, verscheur de macro stap voor stap. En controleer in het lokale variabelevenster de waarde van sModelName wanneer deze crasht:


En ook als swModel leeg blijft.

1 like

Ik heb de test gedaan en dit is wat ik kreeg

En ik heb de indruk dat na de regel die in geel is, het direct naar
" Functie GetFilename(strPath als string) als string "

Ik heb net tests opnieuw gedaan door de basiscode te kopiëren en het werkt niet elke keer ...
Ik heb 5 tests gedaan en ik had 2 keer waar het goed werkt, anderen waar ik de PDF / DWG niet heb, of anders start het gewoon niet!

Ik begrijp niet waarom het niet elke keer werkt!

Anders hoef ik in theorie het bestandspad niet meer te wijzigen

Hallo;
@Antoine_Ruelle ,
Als u uw MEP nader bekijkt, lijkt het erop dat u de eigenschap " Revisie  " niet gebruikt. Dat zal de onderstaande fout verklaren:

De " A"- index in uw Europarlementariër lijkt slechts tekst te zijn...

Bovendien zijn uw eigenschappen in uw SLDPRT-bestand in de vorm:
" Tekst: " (Ik denk niet dat het gebruik van " : " gepast is in deze context.

Alleen uw SLDPRT leek een notie van index te hebben, gebruikt u een PDM?
Vriendelijke groeten

Goedenavond
Ja, het gaat naar de functie om de bestandsnaaminformatie te kunnen ophalen door de extensie te verwijderen.
Zoals het er nu uitziet, werkt de code die door @sbadenis wordt aangeboden op SW2022.

1 like

Hallo @tous
Antoine kijkt ondertussen naar deze macro,
Verwijdert regels 4 en 5 na " sub main ".
En wijst de exacte naam van de revisie-eigenschap toe in plaats van " hint "

2 likes

Inderdaad, @Maclane voor het revisiegedeelte heb ik er ook over nagedacht, vandaar de wijziging die ik had voorgesteld met het verwijderen van deze eigenschap en het toevoegen van mappen.
Voor eigenschappen is het inderdaad raar om " : " in de naam van de eigenschap te hebben opgenomen en dit kan inderdaad in sommige gevallen (macro of andere) een probleem zijn.
Voorbeeld woning zonder:

Voor @Antoine_Ruelle bevestig ik dat de macro goed werkt op SW2023 (dus geen reden op 2022) zoals @Cyril_f ook zegt.
Je kunt ook de oplossing van @Lynkoa15 proberen in de hoop dat het probleem deze keer niet optreedt.

1 like

Hallo, bedankt voor deze feedback @Maclane .
Inderdaad, ik gebruik de revisie-eigenschap niet, ik realiseerde het me achteraf, omdat ik voor het opslaan in PDF/DWG dezelfde bestandsnaam heb als het SW-plan. Dus ik heb dit deel verwijderd. En ik heb nog steeds hetzelfde probleem, ik heb geen PDF/DWG

Voor de aanwijzing voerde hij met de hand in tekst een eigenschap van de kamer in die op de plattegrond wordt weergegeven.
En nee, we gebruiken geen PDM

sbadenis - Voor wie is ": " Ik weet niet of dat echt het probleem is, want het werkte goed 2 keer op een rij. Vanmorgen heb ik een test gedaan zonder de ":" en ik kreeg weer de melding dat ik op lijn 118 een blok heb dat niet gedefinieerd is. Kunt u mij deze regel alstublieft uitleggen?
" Stel swModel = swApp.ActivateDoc3(sModelName, True, swOpenDocOptions_Silent, lErrors) in

Ik heb net weer een test gedaan voordat ik je antwoordde en het werkte

@Lynkoa15 Als ik het goed begrepen heb voor het mappad, moet ik ze als variabelen bepalen
Const dxfSubFolder As String = "\dwg"
Const pdfSubFolder As String = "\pdf"
Const stepSubFolder As String = "\step"
Om ze op te roepen in de opnamepaden?

In ieder geval bedankt voor je hulp, ik begin de VBA een beetje beter te begrijpen

Hallo

Met deze regel kunt u een van de geopende documenten activeren in de stille modus (transparant voor de gebruiker).

Ja, het vereenvoudigt de code en roept variabelen aan in plaats van dezelfde tekst n keer in te voeren.
En als u ooit besluit het pad te wijzigen, is het gemakkelijker om slechts één variabele te beheren dan om alle code te controleren.

1 like

Oké, dus waarom loopt de macro in sommige gevallen vast? Is het mogelijk dat het bestand al open is? Of dat hij het niet vindt?

En dus op welk niveau van de code moet ik de padvariabele specificeren om het te vertellen het pad van het betreffende bestand te nemen en "/pdf" toe te voegen om de juiste recordmap te hebben?
Of welk deel van de code van de andere macro moet ik ophalen?

Aangezien ik het onderwerp in uitvoering heb genomen, kunt u de nieuwste versie van uw code delen?

Ik heb net weer een test gedaan en het werkt niet, ik begrijp er niets meer van haha!!
Hier is de code

Option Explicit

Public Enum swDocumentTypes_e
    swDocNONE = 0       ' Used to be TYPE_NONE

    swDocPART = 1       ' Used to be TYPE_PART

    swDocASSEMBLY = 2   ' Used to be TYPE_ASSEMBLY

    swDocDRAWING = 3    ' Used to be TYPE_DRAWING
End Enum
 
Dim swApp                       As SldWorks.SldWorks
Dim swModel                     As SldWorks.ModelDoc2
Dim swDraw                      As SldWorks.DrawingDoc
Dim swView                      As SldWorks.View
Dim swConfig                    As SldWorks.Configuration

Dim vSheetNameArr               As Variant
Dim vSheetName                  As Variant

Dim I                           As Long
Dim nDocType                    As Long
Dim op                          As Long
Dim suppr                       As Long
Dim lErrors                     As Long
Dim lWarnings                   As Long

Dim boolstatus                  As Boolean
Dim bRet                        As Boolean
Dim FileConnu                   As Boolean

Dim nbConnu                     As Integer

Dim sModelName                  As String
Dim sPathName                   As String
Dim TabConnu(10000)             As String
Dim sConfigName                 As String

Const dxfSubFolder As String = "\dwg"
Const pdfSubFolder As String = "\pdf"
Const stepSubFolder As String = "\step"


Sub Main()

Set swApp = Application.SldWorks

boolstatus = swApp.SetUserPreferenceIntegerValue(swStepAP, 214) 'Force la version AP214
boolstatus = swApp.SetUserPreferenceIntegerValue(swStepExportPreference, swAcisOutputGeometryPreference_e.swAcisOutputAsSolidAndSurface) 'Force l'export en format Solid/Surface Geometry

Set swModel = swApp.ActiveDoc
swModel.Extension.SaveAs GetFilename(swModel.GetPathName) & ".pdf", swSaveAsCurrentVersion, swSaveAsOptions_Silent, Nothing, lErrors, lWarnings 'Enregistrement en PDF
swModel.Extension.SaveAs GetFilename(swModel.GetPathName) & ".dwg", swSaveAsCurrentVersion, swSaveAsOptions_Silent, Nothing, lErrors, lWarnings 'Enregistrement en DWG


Call ExportStep ' Appelle le programe d'export STEP


End Sub

Function GetFilename(strPath As String) As String
Dim strTemp As String
strTemp = Mid$(strPath, InStrRev(strPath, "\") + 1)
GetFilename = Left$(strTemp, InStrRev(strTemp, ".") - 1)


End Function
Sub ExportStep()                ' Vérification si c'est une piece ou un assemblage
Set swDraw = swModel
vSheetName = swDraw.GetSheetNames
vSheetNameArr = swDraw.GetSheetNames

For Each vSheetName In vSheetNameArr
        
    bRet = swDraw.ActivateSheet(vSheetName): Debug.Assert bRet
    Set swView = swDraw.GetFirstView 'Sélectionne le fond de plan
    Set swView = swView.GetNextView  'Passe à la vue suivante pour exclure le fond de plan
                
    While Not swView Is Nothing
           
        ' Determine si la vue est une pieces ou un assemblage

        sModelName = swView.GetReferencedModelName

        sModelName = LCase(sModelName)
                        
        sConfigName = swView.ReferencedConfiguration
        
        FileConnu = False
        
        If InStr(sModelName, "sldprt") > 0 Then
            nDocType = swDocPART
        ElseIf InStr(sModelName, "slasm") > 0 Then
            nDocType = swDocASSEMBLY
        Else
            nDocType = swDocNONE
            Exit Sub
        End If
                       
        If nDocType = 1 Then
            For I = 1 To nbConnu
                If UCase(sModelName) & " - " & UCase(sConfigName) = TabConnu(I) Then
                    FileConnu = True
                End If
            Next
            If Not FileConnu Then
                nbConnu = nbConnu + 1
                TabConnu(nbConnu) = UCase(sModelName) & " - " & UCase(sConfigName)
                Call Export
            End If
        End If
        
        Set swView = swView.GetNextView
    Wend

Next vSheetName

End Sub
Sub Export()

Set swModel = swApp.ActivateDoc3(sModelName, True, swOpenDocOptions_Silent, lErrors)
Set swModel = swApp.ActiveDoc
boolstatus = swModel.ShowConfiguration2(sConfigName)
Set swConfig = swModel.GetActiveConfiguration
sPathName = swModel.GetPathName & ".step"
If Dir(sPathName, vbHidden) <> "" Then                                                                'Test l'existence du fichier
    suppr = MsgBox("Le fichier " & sPathName & " existe déjà, voulez vous le supprimer?", vbYesNo)    'Message utilisateur confirmation de suppression oui/non
        If suppr = vbYes Then                                                                         'Réponse Oui
            Kill (sPathName)                                                                          'Suppression du fichier existant
            swModel.SaveAs2 sPathName, 0, True, False                                                 'Enregistrement du fichier
            op = MsgBox("Le fichier a été enregistré sous " & sPathName & vbNewLine)
            Else                                                                                      'Réponse NON
        MsgBox ("Fichier conservé")                                                                   'Message utilisateur
        End If
        Else
        swModel.SaveAs2 sPathName, 0, True, False                                                     'Enregistrement du fichier
        op = MsgBox("Le fichier a été enregistré sous " & sPathName)                                  'Message utilisateur
    End If
swApp.CloseDoc (sModelName)
Set swModel = swApp.ActiveDoc
End Sub

@Antoine_Ruelle ;

Probeer de bestanden te identificeren waarop de macro niet werkt (vooral als ze altijd hetzelfde zijn):

Verschillende wegen:
De 3D en de lay-out bevinden zich niet in dezelfde map.
3D en blauwdruk hebben niet precies dezelfde naam.
Een van de eigenschappen waar de macro naar op zoek is, bestaat niet.
De doelbestanden (pdf/dwg en/of STEP) zijn al open of alleen-lezen...
Bestands- en/of mapnamen hebben speciale tekens (accenten, punten,...)

Wees voorzichtig, ook macro's zijn gevoelig voor PAUZES... d.w.z. (om samen te vatten) ze maken onderscheid tussen kleine letters en hoofdletters) dit geldt voor bestandsnamen, maar ook voor extensies.

het ideaal is om door uw macro te bladeren in stap-voor-stap modi (F8), met het venster met lokale variabelen zichtbaar,
En eventueel met de muis over de variabelen in de regels code gaan om te controleren of ze de gevraagde gegevens ophalen.
(vooral in "debug" node op breakpoints...

Subsidiaire vraag, hoe start je de macro uitvoering? een knop in solidworks of door de play-toets direct in de VBA-editor? Begin je macro altijd met de "Hoofd" routine?

Vriendelijke groeten.

2 likes

Nou, ik keek, maar miste veel dingen om de submappen onder andere te maken.
@Antoine_Ruelle , u had de door @sbadenis voorgestelde code getest (4e antwoord) die naar mijn mening perfect functioneel was?

1 like

@Cyril_f

In Solidworks 2022 werkt de @sbadenis macro perfect... Thuis.

Vriendelijke groeten.

2 likes

Ja, en ik had een bericht overgeslagen, maar als ik je vraag of het werkt, antwoord je me met de vorige macro met de revisies.
Neem de nieuwste versie zoals aangegeven door @Cyril_f en @Maclane en het zou moeten werken.
Aan de andere kant, niet zeker of de code is geoptimaliseerd, wordt het haastig gedaan ten opzichte van die van @Cyril_f .

Ik heb altijd op hetzelfde bestand getest. de tekening van een pet.
De tekening staat in een andere map dan de onderdelen, maar de bestanden hebben dezelfde naam.

Ik heb de code al bekeken door het stap voor stap te doen, en aangezien ik er niet al te veel van weet, weet ik niet hoe ik de problemen correct kan identificeren.

Om de macro te starten heb ik een knop gemaakt en ik heb het ook geprobeerd met de play toets.

Ja, voor de submappen heb ik op dit moment niets anders gedaan dan de 3 te definiëren variabelen plakken.
Omdat ik elke keer probeer de code te laten werken. Ik heb de basiscode genomen zonder enige wijzigingen aan te brengen, behalve om de revisie in de bestandsnaam te verwijderen.

Het werkte een keer, ik verwijderde de gegenereerde bestanden en begon opnieuw en daar had ik de onderstaande fout
image

En nee, ik heb de code van het 4e antwoord nog niet getest @Cyril_f

Ik heb net mijn fout gevonden, mijn knop om de macro uit te voeren was verkeerd geconfigureerd, het werkt prima

Goed nieuws.
Het enige dat overblijft is het valideren van het " Beste antwoord " om deze discussie af te sluiten.
image

En tot ziens voor nieuwe macro's...
In de tussentijd raad ik je aan om verschillende sites te raadplegen (niet altijd in het Frans -Visual Basic- verplicht) maar vaak didactisch om aan de slag te gaan met programmeren:


Vriendelijke groeten.

2 likes

En ook om de macro's vanuit de editor te starten om de juiste te starten! :crazy_face:
En zodra dat werkt, kun je een knop maken.