Voer een macro uit tijdens een opname

Hallo, ik gebruik deze macro om de titel van een Solidworks-document weer te geven in Windows Verkenner. Ik wilde weten of het mogelijk was om de macro tijdens elke opname te activeren (zonder tussenkomst van de gebruiker)? voor zover ik begrijp, zou een invoegtoepassing de beste oplossing zijn, maar aangezien ik worstel met VS Studio, ben ik op zoek naar een alternatief. Bedankt

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim propMgr As CustomPropertyManager
Dim titleValue As String
Dim resolved As String
Dim wasResolved As Boolean

Sub main()
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    If swModel Is Nothing Then
        MsgBox "No document is open!"
        Exit Sub
    End If

    ' Access the custom property manager
    Set propMgr = swModel.Extension.CustomPropertyManager("")

    ' Read current value of custom property "Title"
    wasResolved = propMgr.Get4("Title", False, resolved, titleValue)
    
    If titleValue = "" Then
        MsgBox "Custom property 'Title' is empty!"
        Exit Sub
    End If

    ' Copy to Summary Info Title
    swModel.SummaryInfo(swSumInfoTitle) = titleValue

    ' Optional: read back to verify
    MsgBox "Summary Info Title set to: " & swModel.SummaryInfo(swSumInfoTitle)
End Sub

Hallo en welkom;

Wat bedoel je precies met:

Het is niet erg duidelijk...

En er ontbreken enkele essentiële stukjes informatie:
De Solidworks-versie
De reikwijdte van de macro (alle Solidworks-documenten, alleen onderdelen, onderdelen en assemblages, tekeningen...?)

Wat ik begrijp:
In uw macro extraheert u de waarde van de aangepaste eigenschap " Titel " uit een geopend SolidWorks-document en plaatst u die waarde vervolgens in het veld Titel van de overzichtsinformatie van het document, waarbij u controleert op geen document of lege eigenschapsfouten.

(Opmerking: ik raad u aan om dezelfde eigenschap (de naam van de eigenschap) niet meerdere keren te gebruiken voor verschillende variabelen... (hier " Titel " voor Aangepaste Eigenschappen en " Titel " voor Windows Samenvattende eigenschappen (tabblad: Samenvatting in de informatiesamenvatting van het Solidworks-document)

Ik stel voor dat u uw macro aanpast zodat deze werkt op alle bestanden in een bepaalde map:

Het is aan u om de waarde aan te passen in:
folderPath = "C:\Path\To\Folder"

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim propMgr As CustomPropertyManager
Dim titleValue As String
Dim resolved As String
Dim wasResolved As Boolean
Dim filePath As String
Dim folderPath As String

Sub main()
    Set swApp = Application.SldWorks

    ' Modifier ici pour mettre le chemin du dossier
    folderPath = "C:\Chemin\Vers\Le\Dossier\"
    
    filePath = Dir(folderPath & "*.sld*") ' Trouve les fichiers .sldprt, .sldasm, .slddrw

    Do While filePath <> ""
        ' Ouvre le document
        Set swModel = swApp.OpenDoc6(folderPath & filePath, _
                                     GetDocType(folderPath & filePath), _
                                     0, "", 0, 0)

        If Not swModel Is Nothing Then

            Set propMgr = swModel.Extension.CustomPropertyManager("")
            wasResolved = propMgr.Get4("Title", False, resolved, titleValue)

            If titleValue <> "" Then
                swModel.SummaryInfo(swSumInfoTitle) = titleValue
                swModel.Save
            End If

            swApp.CloseDoc swModel.GetTitle
        Else
            MsgBox "Impossible d'ouvrir : " & filePath
        End If

        filePath = Dir() ' Passe au fichier suivant
    Loop

    MsgBox "Traitement terminé."
End Sub

' Fonction utilitaire pour déterminer le type de document selon l'extension
Function GetDocType(fileName As String) As Long
    Dim ext As String
    ext = LCase$(Mid$(fileName, InStrRev(fileName, ".") + 1))
    Select Case ext
        Case "sldprt"
            GetDocType = 1 ' pièce
        Case "sldasm"
            GetDocType = 2 ' assemblage
        Case "slddrw"
            GetDocType = 3 ' mise en plan
        Case Else
            GetDocType = 0 ' inconnu
    End Select
End Function

Anders is het onderwerp hier al besproken:

Maar het is niet veel vervelend:
=> Het is mogelijk om de Solidworks property manager te gebruiken om een variabele te dupliceren naar de Summary info.
https://help.solidworks.com/2022/french/SolidWorks/sldworks/HelpViewerDS.aspx?version=2022&prod=SolidWorks&lang=french&path=sldworks%2Fc_file_properties.htm&id=5fb9c079433c46d7961143b30be81132

=> het is gemakkelijker met MyCadTools zoals Smartproperties of in het verwerkingsstation met de tools Integration of batchProperties.

1 like

Hallo, bedankt voor het antwoord en de links (erg handig).

Mijn doel is niet om de macro uit te voeren op elk onderdeelrecord (assembly, onderdeel of tekening), maar eerder om de waarde van de eigenschap met de naam Titel op te halen en deze weer te geven in Windows Verkenner zoals op deze opname op elk record, vandaar de opmerking over het feit dat de macro in dit geval niet de beste oplossing is, omdat deze elke keer moet worden uitgevoerd.

op Windows Verkenner

en op SolidWorks

Ik gebruik SW 23 en SW24, ik hoop binnenkort te investeren in een SW25-versie

Is het bijvoorbeeld mogelijk om de macro automatisch te starten tijdens een opname (assemblage, tekening of onderdeel) zonder tussenkomst van de gebruiker? Het lijkt mij dat dit mogelijk is met add-ins, maar niet veilig voor VBA-macro's.

Hallo
Het is mogelijk met VBA, maar je moet de snelkoppeling wijzigen om SW te starten, zodat de macro wordt uitgevoerd zodra SW is geopend.
Je kunt acties onderscheppen in SW, maar je moet de code en de uitgangsdeuren cementeren om te voorkomen dat je gedrag krijgt dat het gebruik blokkeert.
Een andere oplossing is om een opnamemacro te maken die het SW-opnamepictogram vervangt en de Ctrl+S-snelkoppeling erop te zetten zodat deze volledig transparant is voor de gebruiker.

3 likes

Hallo, bedankt voor het antwoord.

Ik heb beide methoden geprobeerd en ze werken allemaal geweldig.

Nog een laatste vraag, ik wil proberen de invoegtoepassing te maken met VS. Ik heb de code, maak de dll aan, maar de invoegtoepassing wordt niet weergegeven op SolidWorks.

Bonjour;
Il faut probablement charger l'add-in via les compléments Solidworks.
Utiliser la méthode ISldWorks::LoadAddIn en passant le nom de l'add-in
puis
Après avoir chargé l'add-in, utilisez ISldWorks::GetAddInObject

Pour une documentation plus globale sur la création d'add-in:

Il devrait maintenant être accessible depuis:
image

Si le code est bien realisé, il devrait être accessible ici:
image

Serait-il possible de nous fournir le code réalisé ?

Dank u voor de documenten.

Ik heb geprobeerd om het maken van VB.NET invoegtoepassing voor SOLIDWORKS opnieuw uit te voeren met behulp van API , maar ik heb alleen SolidWorks die open is wanneer ik de code start zonder de Hello World en de invoegtoepassing is niet aanwezig in het invoegmenu.

Bonjour;

Extrait de l'aide Solidworks:

Wat moet de invoegtoepassing doen?

De DLL voor invoegtoepassingen moet worden gemaakt als een COM-server en moet:

  1. Implementeer een co-createtable object dat SwAddin ondersteunt.
  2. Tijdens de installatie:

Registreer de CLSID van de invoegtoepassing in HKEY_LOCAL_MACHINE\SOFTWARE\SOLIDWORKS\AddIns en stel de volgende registersleutels in:

  • Standaard ingesteld op 1 of 0, waarbij 1 de invoegtoepassing inschakelt in de invoegtoepassingbeheerder, zodat deze wordt geladen wanneer de gebruiker de SOLIDWORKS-software start.
  • Beschrijving naar een tekstbeschrijving van de invoegtoepassing die wordt weergegeven in de invoegtoepassingbeheerder.
  • Titel van een teksttitel van de beschrijving die wordt weergegeven in de invoegtoepassingmanager.
  1. Definieer indien nodig gebeurtenisbehandelaars.

In de implementatie van ISwAddin::ConnectToSW kan de invoegtoepassing:

  1. Roep ISldWorks::SetAddinCallbackInfo aan en geef de instantie-handle van de invoegtoepassing en het object dat de callback-methoden ondersteunt, door. De SOLIDWORKS-software houdt dit object vast en voert callbacks uit.
  2. Roep ISldWorks::AddMenuItem3 aan en geef de terugbelmethode door die aan het menu-item is gekoppeld.
  3. Roep ISldWorks::AddToolbar4 aan en geef de callback-methode door die is gekoppeld aan de werkbalkknop.

On en parle ici aussi:

Et un autre exemple de code ICI:

Dans cet exemple la ligne qui t'intéresse est la création de la clef dans le base de registre pour l'identification de l'add-in dans le menu Solidworks:
Dim keyname As String = « SOFTWARE\SolidWorks\Addins{ » + t.GUID. ToString() + « } »

Mais sans ton code je suis en train de te fournir des documents en vrac sans contexte.

Bovenal moet u het recht hebben om het register te wijzigen.

2 likes

Inderdaad, als u de rechten hebt om het register te wijzigen, wordt de invoegtoepassing die met de SW-tutorial is gemaakt, weergegeven zonder iets anders aan te raken

Hallo, bedankt voor je antwoorden.

Tijdens het starten van de code kreeg ik de volgende foutmelding: Er is een fout opgetreden tijdens het schrijven van de registratiegegevens naar het register. Beheerdersrechten zijn vereist om de geselecteerde opties te gebruiken. Gebruik een beheerdersopdrachtprompt om deze taken uit te voeren. Nu open ik VS in beheerdersmodus, maar het werkt nog steeds niet

Hallo

Ik denk niet dat het probleem de lancering van VS in de admin-modus is.
Het is vooral de schrijftoegang tot het register die het probleem is (betekenis van de foutmelding).
Over het algemeen wordt het register in een beveiligde omgeving vergrendeld door IT om te voorkomen dat iemand deze database wijzigt, wat een werkstation volledig in de steek kan laten, wat leidt tot pure en eenvoudige opmaak.
Om de add-in te implementeren, moet je met de IT zien wie voor de implementatie zal zorgen (als ze het willen doen en als het niet nodig is om verschillende iteraties uit te voeren die opnieuw moeten worden geïmplementeerd).
Daarom geef ik persoonlijk de voorkeur aan VBA, dat veel flexibeler omgaat met IT en ik kan in ieder geval mijn macro's beheren zoals ik dat wil.

3 likes