Macro om pdf- en dxf-bestanden op de juiste schaal te maken

Hallo
Ik ben een beginner op het forum en ik heb veel informatie gevonden over macro's om bepaalde taken te automatiseren.
Ik heb echter een verzoek dat volgens mij tot nu toe door niemand is behandeld.
Ik zou graag in staat zijn om dxf-exports automatisch te maken vanuit een tekening, maar volgens criteria:
1- Als er een uitgevouwen weergave is, moet de dxf-export worden uitgevoerd, rekening houdend met de schaal van de uitgevouwen weergave voor een conversie naar schaal 1
2- Als er geen uitgevouwen weergave is (eenvoudig lasergesneden deel) dan houden we rekening met de schaal van het plan en niet met een specifieke weergave.

Ik weet niet of het mogelijk is om dat te doen.
Het zou ook nodig zijn om de pdf- en dxf-bestanden met hun revisie-index in de bestandsnaam te kunnen opslaan. En het beste zou ook zijn om het bestand te hebben waarin elke export wordt vastgelegd.

Bij voorbaat dank aan alle VBA-experts op dit forum voor uw hulp

Hallo @ediatta
Als u meer details kunt geven,
1 Hoeveel weergaven in het werkblad
2 Handmatige (automatische) selectie van de te exporteren weergave
Exports van 3 weergaven in dezelfde of verschillende werkmappen (als er meerdere weergaven in het werkblad bestaan)
4 Als de weergave een uitvouwen is (of niet) met een schaal van 1/2, het blad met een schaal van 1/5, wat is dan de uitgangsschaal voor elk geval.
5 revisie-index is een PRP in de kamer, in het blad of in een tabel,

Hallo @Lynkoa15,
Bedankt voor het beantwoorden van mijn onderwerp.
Dus voor meer details:
1 hoeveel weergaven in het blad => 1 alleen, over het algemeen zal het een kamer een plan zijn

2 Handmatige (automatische) selectie van de te exporteren weergave => idealiter automatische selectie van de weergave, maar misschien is het gemakkelijker om een handmatige selectie te beheren. Als algemene regel zullen er 2 gevallen zijn, ofwel is het een gevouwen plaatwerk en de uitgevouwen weergave op een andere schaal dan de weergaven van het afgewerkte onderdeel, of het is een eenvoudig lasergesneden onderdeel en alle aanzichten hebben dezelfde schaal die al dan niet identiek is aan die van de plaat. In geval 1 is de schaal die in aanmerking moet worden genomen de uitgevouwen weergave en in geval 2 de schaal van een van de weergaven. Aan de andere kant is het de tekening die ik wil exporteren, maar niet systematisch rekening houdend met de schaal van het vel om het om te zetten en een uitvoerschaal 1 van mijn DXF te hebben.

3 Weergave exporteren in dezelfde of verschillende werkmappen (als er meerdere weergaven in het blad zijn) => we zouden moeten kunnen kiezen naar welke werkmap we exporteren (via msgbox of andere)

4 als de weergave een uitvouwen is (of niet) met een schaal van 1/2, het blad met een schaal van 1/5, wat is dan de uitvoerschaal voor elk geval => de uitvoerschaal moet altijd 1/1 zijn

5 revisie-index is een PRP in de kamer, in het blad of in een tabel => het is een eigenschap in de kamer

Hallo;

Zou het niet het eenvoudigst zijn als al uw aanzichten in overeenstemming zijn met de schaal van uw tekening?
Dit is vooral het geval als u slechts één weergave per MEP-blad hebt.

Op deze manier kunnen al je exports in 1:1 naar DXF-formaat worden geconverteerd via de Solidworks-instellingen (Exports).

Solidworks exporteert uw gegevens in de "Object"-ruimte, die altijd op een schaal van 1:1 moet zijn. De 2D-conventie is dat alleen de 'Papier'-ruimte een schaalfactor accepteert...
Het is des te praktischer om kansen te nemen.

Vriendelijke groeten.

Hallo @Maclane,

Ik stelde me voor dat ik deed wat je zegt. Er zijn echter verschillende weergaven op hetzelfde blad en als de afmetingen van de kamer groot zijn, is het nog steeds erg praktisch om gedifferentieerde schalen te hebben.
Voorbeeld:
Een deel met meerdere lagen kan veel lager afgewerkte zijkanten hebben dan die van het uitgevouwen deel dat een factor 3, 4 of + groter kan zijn. En dus is het interessant om op de weegschaal te spelen.
Het nadeel is dat het uitgeklapte wordt gebruikt voor lasersnijden en als het op een andere schaal is dan het plan, zullen de afmetingen van de dxf-export niet kloppen. Met andere woorden, als de aanzichten van het voltooide onderdeel op een schaal van 1/5 zijn en die van het uitgevouwen op 1/10, zal de export in dxf worden geconverteerd van de 1/5 schaal => de afmetingen van het uitgevouwen onderdeel dat wordt gebruikt voor lasersnijden zullen onjuist zijn.
Anders zou de enige optie zijn om steeds grotere planformaten te nemen om altijd alle weergaven op dezelfde schaal te hebben... En dat is best jammer

@ediatta, lost deze code het laddergedeelte op?

'-------------------------------------------------------------------------
Option Explicit
    Dim swApp                   As SldWorks.SldWorks
    Dim swModel                 As SldWorks.ModelDoc2
    Dim swdrawing               As DrawingDoc
    Dim sPathName               As String
    Dim nErrors                 As Long
    Dim nWarnings               As Long
    Dim bRet                    As Boolean

Sub main()

    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    Set swdrawing = swModel
    sPathName = swModel.GetPathName
    sPathName = Left(sPathName, Len(sPathName) - 6)
    sPathName = sPathName + "dxf"
    swApp.SetUserPreferenceIntegerValue swUserPreferenceIntegerValue_e.swDxfOutputNoScale, 1
    Dim swview As View
    Set swview = swdrawing.GetFirstView
    Set swview = swview.GetNextView
    Do While Not swview Is Nothing
        If swview.IsFlatPatternView Then
            swApp.SetUserPreferenceDoubleValue swDxfOutputScaleFactor, swview.ScaleRatio(1) / swview.ScaleRatio(0)
            Exit Do
        End If
        Set swview = swview.GetNextView
    Loop
    bRet = swModel.Extension.SaveAs(sPathName, swSaveAsCurrentVersion, swSaveAsOptions_Silent, Nothing, nErrors, nWarnings)
    If bRet = False Then
        swApp.SendMsgToUser2 "Problems saving file.", swMbWarning, swMbOk
    End If

End Sub

Hallo @Lynkoa15,

Ja, ik heb het getest en het lost het schaalprobleem op.
Ik begreep de code niet per se (vooral waarom gaan we door naar de volgende weergave aan het begin van de lus "zolang als", lopen we niet het risico een weergave te missen?) maar hoe dan ook, het werkt. Hartelijk dank.
Het enige wat ik nu nog moet doen, is vanuit dezelfde code kunnen zeggen dat als het uitgevouwen beeld niet bestaat, we de schaal van het plan moeten nemen. En geef vervolgens de mogelijkheid om zowel de onderdeelrevisie als het registratiebestand toe te voegen.

Hallo @tous
Er is inderdaad geen risico bij het overslaan van een weergave, omdat de eerste weergave terugkeerde en het blad actief was,
Bijgevoegd is een code die moet overeenkomen met de hoofdlijnen.
Uitgevouwen weergaveschaal of vel, indien uitgevouwen, bestaat niet
Implementeren van de revisie (standaard eigenschapsnaam "revisie"
Mogelijkheid om het repertoire te kiezen.
Merk op dat ik de factorparameter heb gebruikt die verouderd is, aangezien sw op dit moment geen optie biedt

Als gevolg hiervan is het nodig om meer diepgaande tests te doen dan dab (aan mijn kant werkt het voor 2018 en 2022)


'----------------------------------------------------------------------------
Option Explicit
    Dim swApp                   As SldWorks.SldWorks
    Dim swModel                 As SldWorks.ModelDoc2
    Dim swdrawing               As DrawingDoc
    Dim spathname               As String
    Dim nErrors                 As Long
    Dim nWarnings               As Long
    Dim bRet                    As Boolean

Sub main()

    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    Set swdrawing = swModel
    
    swApp.SetUserPreferenceIntegerValue swUserPreferenceIntegerValue_e.swDxfOutputNoScale, 1
    swApp.SetUserPreferenceDoubleValue swDxfOutputScaleFactor, getScaleFactor()
    
    Dim path As String, name As String, revision As String
    name = getPathName(swModel)(0)
    path = getPathName(swModel)(1)
    revision = getRevision()
    
    Dim newPath As String
    Select Case MsgBox("Saving folder is : " + Chr(10) + path + Chr(10) + "press yes to save , no to browse for path or cancel to abort", vbYesNoCancel)
    Case 7
        path = browseFolder(path)
    Case 2
        End
    End Select
    Dim spathname As String
    spathname = path + "\" + name + "_" + revision
    savedrawingasdxf spathname
    savedrawingaspdf spathname

End Sub

Sub savedrawingasdxf(path As String)
    bRet = swModel.Extension.SaveAs(path + ".dxf", swSaveAsCurrentVersion, swSaveAsOptions_Silent, Nothing, nErrors, nWarnings)
    If bRet = False Then
        swApp.SendMsgToUser2 "Problems saving file as dxf.", swMbWarning, swMbOk
    End If
End Sub

Sub savedrawingaspdf(path As String)
    Dim expdata As ExportPdfData
    Set expdata = swApp.GetExportFileData(1)
    bRet = swModel.Extension.SaveAs(path + ".pdf", swSaveAsCurrentVersion, swSaveAsOptions_Silent, expdata, nErrors, nWarnings)
    If bRet = False Then
        swApp.SendMsgToUser2 "Problems saving file as pdf.", swMbWarning, swMbOk
    End If
End Sub

Function getScaleFactor() As Double
    Dim sview As View
    Dim scalfactor As Double
    Set sview = swdrawing.GetFirstView
    scalfactor = sview.ScaleRatio(1) / sview.ScaleRatio(0)
    Set sview = sview.GetNextView
    Do While Not sview Is Nothing
        If sview.IsFlatPatternView Then
            scalfactor = sview.ScaleRatio(1) / sview.ScaleRatio(0)
            Exit Do
        End If
        Set sview = sview.GetNextView
    Loop
    getScaleFactor = scalfactor
End Function

Function getPathName(model As ModelDoc2) As Variant
    Dim pathname(1) As String
    Dim spathname As String
    spathname = model.getPathName
    If spathname = "" Then
        swApp.SendMsgToUser2 "Please save file then retry.", swMbStop, swMbOk
        End
    End If
    spathname = Left(spathname, Len(spathname) - 7)
    pathname(0) = Right(spathname, Len(spathname) - InStrRev(spathname, "\", -1, vbTextCompare))
    pathname(1) = Left(spathname, InStrRev(spathname, "\", -1, vbTextCompare) - 1)
    getPathName = pathname
End Function

Function getRevision(Optional prp As String = "revision") As String
    Dim ssheet As Sheet
    Set ssheet = swdrawing.GetCurrentSheet()
    Dim prpsheet As String
    prpsheet = ssheet.CustomPropertyView
    Dim sview As View
    Set sview = swdrawing.GetFirstView
    If prpsheet = "Par défaut" Then
        Set sview = sview.GetNextView
    Else
        Set sview = sview.GetNextView
        Do While Not sview Is Nothing
            If sview.GetName2() = prpsheet Then
                Exit Do
            End If
            Set sview = sview.GetNextView
        Loop
    End If
    Dim srefmodel As ModelDoc2
    Set srefmodel = sview.ReferencedDocument
    Dim scustomprpmgr As CustomPropertyManager
    Set scustomprpmgr = srefmodel.Extension.CustomPropertyManager(sview.ReferencedConfiguration)
    Dim svOut As String
    Dim sWRout As Boolean
    Dim sLPout As Boolean
    Dim srevision As String
    scustomprpmgr.Get6 prp, False, svOut, srevision, sWRout, sLPout
    getRevision = srevision
End Function

Function browseFolder(defpath As String) As String
    browseFolder = defpath
    Dim obgShell As Object
    Dim obgFolder As Object
    Set obgShell = CreateObject("shell.application")
    Set obgFolder = obgShell.browseforfolder(0, "", 0)
    If Not obgFolder Is Nothing Then
        browseFolder = obgFolder.self.path
    End If
    Set obgShell = Nothing
End Function



1 like

Hallo @Lynkoa15 ,
Sorry voor het late antwoord, de feestdagen zijn er geweest...
Bedankt voor je feedback en deze code.
Aan de andere kant werkt het helaas niet voor mij, ik heb een fout op de volgende regel:
scustomprpmgr. Get6 prp, Onwaar, svOut, srevisie, sWRout, sLPout
Ik weet de bron van de fout niet...
Aan de andere kant, een verduidelijking, mijn aangepaste eigenschap voor de revisie heet "Index", misschien komt het daar vandaan? Zo ja, waar moet ik de code aanpassen?

Werkt deze macro dan om pdf en dxf te maken? En maakt het de pdf/dxf van de verschillende folio's afzonderlijk.
Nogmaals bij voorbaat dank voor uw hulp

Hallo
Voor het probleem met betrekking tot de naam van het onroerend goed moet u hier wijzigen

Revisie wijzigen op basis van index

1 like

@Cyril_f het werkt niet veel beter.
Ik krijg dezelfde foutmelding op dezelfde lijn

Hallo ediata en veel succes met de terugkeer naar het werk

Wat betreft de export pdf en dxf, het is ja.
Wat de multifolio betreft, exporteert de macro alleen het actieve blad, maar vult het op verschillende bladen en haalbaar,
Voorlopig zullen we moeten uitzoeken wat er mis is.
Voor de mogelijke "revisie" eigenschap van de gedeclareerde zoals aangegeven door cyril, door het wijzigen van de standaardnaam, anders indie de naam hier

Wat de fout betreft, zou ik zeggen dat je een versie lager hebt dan 2018, is dit het geval? (een screenshot van deze foutmelding is welkom)

1 like

Ja, ik ben inderdaad op SW2017.
Hieronder staan de screenshots:
image

Op het eerste gezicht is de Get6 compatibel vanaf SW2018.
Gebruik deze regel om de regel per ongeluk te vervangen, als ik het niet mis heb, zou het beter moeten zijn, tenzij andere functies in hetzelfde geval zijn (niet compatibel met SW2017)

scustomprpmgr.Get5 prp, False, svOut, srevision, sWRout
2 likes

Bedankt @sbadenis , het werkte prima.
Laatste vraag @Lynkoa15, zou het mogelijk zijn om het mogelijk te maken om de pdf en de dxf in verschillende mappen op te slaan?

Zou er een regel of een eenvoudige code moeten worden toegevoegd om als stap te kunnen exporteren?

Hieronder vindt u een code die geschikt zou moeten zijn,
De submappen dwg, pdf en step in relatie tot de werkmap worden hier gedeclareerd, met prp-revisie
Capture08

De prp-revisie en configuratie voor de stap kwamen daar vandaan
Capture07
Het blad kan dus verschillende componenten aan (anders nodig ik je uit om een nieuw station voor de stap te openen)

Aan mijn kant voor de plaatwerksneden voeg ik altijd een dimensie toe, zodat mijn nestende collega eventuele schaalfouten kan controleren en aan mij kan rapporteren (weet nooit)

'----------------------------------------------------------------------------
Option Explicit
    Dim swApp                   As SldWorks.SldWorks
    Dim swModel                 As SldWorks.ModelDoc2
    Dim swdrawing               As DrawingDoc
    Dim spathname               As String
    Dim nErrors                 As Long
    Dim nWarnings               As Long
    Dim bRet                    As Boolean
    Const dxfSubFolder As String = "\dwg"
    Const pdfSubFolder As String = "\pdf"
    Const stepSubFolder As String = "\step"
    Const prpRevision As String = "indice"
    
Sub main()

    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    Set swdrawing = swModel
    
    swApp.SetUserPreferenceIntegerValue swUserPreferenceIntegerValue_e.swDxfOutputNoScale, 1
    swApp.SetUserPreferenceDoubleValue swDxfOutputScaleFactor, getScaleFactor()
    
    Dim path As String, name As String, configuration As String, revision As String
    Dim model As ModelDoc2
    getParameters model, configuration, revision, prpRevision
    name = getPathName(swModel)(0)
    name = name + "_" + revision
    path = getPathName(swModel)(1)

    Dim newPath As String
    Select Case MsgBox("Saving folder is : " + name + Chr(10) + "Export configuration for STEP is : " + configuration + Chr(10) + "working folder is : " + path + Chr(10) + Chr(10) + "press yes to save , no to browse for path or cancel to abort", vbYesNoCancel)
    Case 7
        path = browseFolder(path)
    Case 2
        End
    End Select
    
    createpath path + dxfSubFolder
    savedrawingasdxf path + dxfSubFolder + "\" + name
    
    createpath path + pdfSubFolder
    savedrawingaspdf path + pdfSubFolder + "\" + name
    
    createpath path + stepSubFolder
    savedrawingasstep model, configuration, path + stepSubFolder + "\" + name

    swApp.SendMsgToUser2 "Finish", swMbInformation, swMbOk
End Sub

Sub createpath(path As String)
    Dim fold As Variant
    Dim cpath As String
    For Each fold In Split(path, "\", -1, vbTextCompare)
        cpath = cpath + CStr(fold) + "\"
        If Len(Dir(cpath, vbDirectory)) = 0 Then MkDir cpath
    Next fold
End Sub


Sub savedrawingasdxf(path As String)
    bRet = swModel.Extension.SaveAs(path + ".dwg", swSaveAsCurrentVersion, swSaveAsOptions_Silent, Nothing, nErrors, nWarnings)
    If bRet = False Then
        swApp.SendMsgToUser2 "Problems saving file as dxf.", swMbWarning, swMbOk
    End If
End Sub

Sub savedrawingaspdf(path As String)
    Dim expdata As ExportPdfData
    Set expdata = swApp.GetExportFileData(1)
    expdata.SetSheets 2, Nothing
    bRet = swModel.Extension.SaveAs(path + ".pdf", swSaveAsCurrentVersion, swSaveAsOptions_Silent, expdata, nErrors, nWarnings)
    If bRet = False Then
        swApp.SendMsgToUser2 "Problems saving file as pdf.", swMbWarning, swMbOk
    End If
End Sub

Sub savedrawingasstep(model As ModelDoc2, conf As String, path As String)
    If model Is Nothing Then Exit Sub
    Set model = swApp.ActivateDoc3(model.getPathName, False, 1, nErrors)
    model.ShowConfiguration2 conf
    bRet = model.Extension.SaveAs(path + ".step", swSaveAsCurrentVersion, swSaveAsOptions_Silent, Nothing, nErrors, nWarnings)
    If bRet = False Then
        swApp.SendMsgToUser2 "Problems saving file as step.", swMbWarning, swMbOk
    End If
    swApp.CloseDoc model.GetTitle
End Sub

Function getScaleFactor() As Double
    Dim sview As View
    Dim scalfactor As Double
    Set sview = swdrawing.GetFirstView
    scalfactor = sview.ScaleRatio(1) / sview.ScaleRatio(0)
    Set sview = sview.GetNextView
    Do While Not sview Is Nothing
        If sview.IsFlatPatternView Then
            scalfactor = sview.ScaleRatio(1) / sview.ScaleRatio(0)
            Exit Do
        End If
        Set sview = sview.GetNextView
    Loop
    getScaleFactor = scalfactor
End Function

Function getPathName(model As ModelDoc2) As Variant
    Dim pathname(1) As String
    Dim spathname As String
    spathname = model.getPathName
    If spathname = "" Then
        swApp.SendMsgToUser2 "Please save file then retry.", swMbStop, swMbOk
        End
    End If
    spathname = Left(spathname, Len(spathname) - 7)
    pathname(0) = Right(spathname, Len(spathname) - InStrRev(spathname, "\", -1, vbTextCompare))
    pathname(1) = Left(spathname, InStrRev(spathname, "\", -1, vbTextCompare) - 1)
    getPathName = pathname
End Function

Sub getParameters(ByRef model As ModelDoc2, ByRef configuration As String, ByRef revision As String, Optional prp As String = "revision")
    Dim ssheet As Sheet, csheet As Sheet
    Set csheet = swdrawing.GetCurrentSheet()
    Set ssheet = csheet
    Dim prpDoc As Boolean
    prpDoc = ssheet.GetProperties2()(7)
    If prpDoc = True Then
            swdrawing.ActivateSheet swdrawing.GetSheetNames()(0)
            Set ssheet = swdrawing.GetCurrentSheet()
    End If
    Dim prpsheet As String
    prpsheet = ssheet.CustomPropertyView
    Dim sview As View
    If prpsheet = "Par défaut" Then
        Set sview = swdrawing.GetFirstView
        Set sview = sview.GetNextView
    Else
        Dim views As Variant
        Dim found As Boolean
        found = False
        views = swdrawing.GetViews()
        Dim i As Long
        For i = 0 To UBound(views)
            If UBound(views(i)) = 0 Or found = True Then Exit For
            Dim j As Long
            For j = 1 To UBound(views(i))
                Set sview = views(i)(j)
                If sview.GetName2() = prpsheet Then
                    found = True
                    Exit For
                End If
            Next j
        Next i
    End If
    swdrawing.ActivateSheet csheet.GetName
    If sview Is Nothing Then Exit Sub
    Set model = sview.ReferencedDocument
    Dim scustomprpmgr As CustomPropertyManager
    configuration = sview.ReferencedConfiguration
    If sview.IsFlatPatternView Then
        Dim confvf As configuration
        Set confvf = model.GetConfigurationByName(configuration)
        Set confvf = confvf.GetParent()
        configuration = confvf.name
    End If
    Set scustomprpmgr = model.Extension.CustomPropertyManager(configuration)
    Dim svOut As String
    Dim sWRout As Boolean
    Dim sLPout As Boolean
    Dim srevision As String
    'scustomprpmgr.Get6 prp, False, svOut, srevision, sWRout, sLPout
    scustomprpmgr.Get5 prp, False, svOut, srevision, sWRout
    revision = srevision
End Sub

Function browseFolder(defpath As String) As String
    browseFolder = defpath
    Dim obgShell As Object
    Dim obgFolder As Object
    Set obgShell = CreateObject("shell.application")
    Set obgFolder = obgShell.browseforfolder(0, "", 0)
    If Not obgFolder Is Nothing Then
        browseFolder = obgFolder.self.path
    End If
    Set obgShell = Nothing
End Function

1 like

Dank je wel @Lynkoa15 .
De macro werkt goed om de verschillende mappen aan te maken. Het is geweldig!
Aan de andere kant wordt de index (revisie) van het onderdeel niet toegevoegd aan de naam van de bestanden (pdf/dxf/step). Zou het kunnen zijn omdat de macro het niet kan vinden? Normaal gesproken zit de aanwijzing in de aangepaste eigenschappen van het onderdeel dat wordt getekend (de 3D).