Het legen van de eigenschappen van een virtuele (door macro?)

Hallo
Ik ben op zoek naar een automatische oplossing (d.w.z. onzichtbaar voor de gemiddelde gebruiker) om de gegevenskaart van een virtueel onderdeel/assemblage in een andere assemblage op te schonen.
Inderdaad, als ik een onderdeel virtueel passeer in een assembly, behoudt het zijn Solidworks-eigenschappen, met name het onderdeelnummer dat een conflict kan veroorzaken met het originele onderdeel (omdat het onderdeelnummer een PDM-variabele is die uniek moet zijn in de kluis).
Ik dacht met name aan het maken van een vba macro onder SW die zou zorgen voor de verwijdering van de SW eigenschap in kwestie.
Ik heb een aantal vragen:

  • Wanneer en hoe start ik deze macro automatisch? Op een archiveringsactie? Opname? Tijdens een verandering van staat?
  • Wat is de syntaxis voor het uitpakken/controleren van een bestand in VBA SW?
  • Is er een eenvoudigere oplossing? (ingesteld onder SW hoe wordt een virtuele beheerd ?

Alvast bedankt voor je ideeën!

Hallo
Voor de macrokant kun je het niet automatisch starten, je moet een invoegtoepassing doorlopen en met de evenementen werken. Dus om in een .NET taal te programmeren
Daarna weet ik niet of er een eenvoudigere oplossing is

En is lanceren tijdens een PDM-statusverandering haalbaar?

De macro moet al gestart zijn om te reageren op een verandering in PDM status, dit wordt event management genoemd. Een methode abonneert zich op een gebeurtenis en wanneer de gebeurtenis wordt geactiveerd, wordt de methode uitgevoerd. Dus komen we terug bij de invoegdoos.

OK, ik moet graven in de add-in onderwerp, ik weet niet wat het is.

Hallo
Zonder noodzakelijkerwijs een invoegtoepassing te doorlopen, kunt u ook de link wijzigen die naar de SW-exe verwijst om de lancering van een macro bij het opstarten toe te voegen.
Dit zou het gebruik van SW- en PDM-evenementen mogelijk maken. Nadeel van deze methode is dat u op alle werkstations moet ingrijpen om deze link te wijzigen en vergeet niet om dit elke keer te doen wanneer de SW-versie wordt gewijzigd.
Zouden uw gebruikers anders echt tegen het toevoegen van een pictogram om op te klikken om een actie te starten?

1 like

Ze zouden er niet tegen zijn, maar ze zouden het ook niet :slight_smile: lanceren.
Het probleem is onzichtbaar voor hen, de blokkering wordt later gedaan wanneer een statuswijziging verkeerd wordt gemaakt omdat deze variabel is in tweevoud.

Dat is het probleem :slight_smile:
Er is dus nog steeds de add-in of slagen in het wijzigen van de exe launch link om te kunnen injecteren een macro wanneer SW wordt gelanceerd.
Ik zou anders hebben voorgesteld dispatch om de controle tijdens het archiveren uit te voeren, maar het lijkt mij dat aan de PDM-kant de virtuele bestanden niet echt worden beheerd, dus dispatch kon ze niet interpreteren omdat het geen fysieke bestanden zijn.
Aan de andere kant, met de macro die handmatig moet worden gestart, voegt u gewoon een eigenschap toe aan het bestand en controleert u of deze aanwezig is tijdens het inchecken. Indien niet aanwezig, weiger dan de archivering

Bedankt voor je feedback.
Wat betekent een invoegtoepassing? Een coplement een beetje coderen zoals MyPDMTools?
De .exe het is een goed idee, behalve dat u de macro liever start na de wijzigingen, niet bij de opening :slight_smile: . Maar ik zou het ook alleen kunnen uitvoeren op de automaat die onze neutrale bestanden genereert... Ik moet dieper graven.
Dispatch is ook een oplossing, zelfs als dat betekent dat het op alle bestanden moet worden uitgevoerd zonder targeting.

Laatste vraag: als je aan het einde van je bericht "archivering weigeren" zegt, lijkt het meer op het weigeren van de verandering van staat, nietwaar? Het leek me niet dat we een archief konden blokkeren.

Je kunt een archief blokkeren, ik doe het bijvoorbeeld op een Word-bestand dat niet het juiste frame gebruikt.
Voor de macro die bij de opening wordt gelanceerd, is het gewoon een macro die op de achtergrond wordt uitgevoerd en de SW-gebeurtenissen onderschept om verwerking toe te passen op basis van de beoogde gebeurtenis.
Een add-in is een uitvoerbaar bestand, maar ook daar moet het worden gestart.

Dus voorlopig wil ik weten hoe ik een archief kan blokkeren van een bestand dat (bijvoorbeeld) niet het juiste frame heeft, omdat ik op dit moment weet hoe ik dat alleen moet doen door de statuswijziging te blokkeren. Maakt u gebruik van variabele waardering wanneer het juiste frame wordt gebruikt?
Voor zover ik weet heb ik alleen deze opties om een archief te blokkeren:
2023-11-03 14_40_47-Window

En mogelijk aan de variabele kant, dit selectievakje, maar het controleert niet de waarde, alleen het bestaan ervan:
2023-11-03 14_45_36-Clipboard

Ik doe het met verzending.

Niet getest op SW, maar werkt in ieder geval heel goed op Word (het annuleert het archiefverzoek en opent het bestand opnieuw)

2 likes

Hallo

Iets dat kan helpen bij het implementeren van een macro: in Solidworks bevatten alle virtuele bestanden het ^-teken gevolgd door de naam van het bestand waarin het virtuele bestand is opgeslagen (NB: In het geval van subniveau hebben we naast het ^-teken ook _-tekens in de naam van het virtuele bestand, maar het zou geen enkele impact moeten hebben).
Het is dus op bestanden die dit ^-teken bevatten dat u uw macro moet uitvoeren (het moet voorkomen dat de streng in niet-virtuele bestanden wordt geplaatst).
Omdat virtuele bestanden tijdelijk zijn, moet de macro worden gestart op een open assembly. in de normale werkmodus zou het moeten werken, maar als een slimme kerel plezier heeft met het archiveren / overzetten van een bestand dat virtueel is via Windows, is het dood (tenzij je het bestand geforceerd opent in Solidworks voordat je aan het opruimen van de eigenschap werkt).

Voor het macrogedeelte is het zeker onze vriend @Cyril_f die het slimst zal zijn.

1 like

Dank u beiden, ik moet me verdiepen in uw voorstellen.
Voor het feit dat het bestand moet worden geopend, kan het haalbaar zijn omdat juist bij het openen van de asm op een PLC om neutrale bestanden te genereren het archiveringsprobleem ontstaat (en vreemd genoeg niet wanneer het de ontwerper is die archiveert...). Dus ik kon de macro op de automaat uitvoeren vóór de generatie.

Hallo allemaal, en een gelukkig nieuwjaar! Ik kom terug op mijn onderwerp van het opschonen van eigenschappen in virtuele bestanden.
Voordat ik me bezighoud met het gedeelte "automatisch een macro starten", zou ik eerst proberen een macro te maken die ik als beheerder handmatig zou kunnen starten op een geblokkeerd bestand.
Kan iemand van jullie me begeleiden bij het schrijven van een macro die de volgende acties zou doen:

  • Op een assemblage die al open is, scant u alle assemblages en onderliggende onderdelen
  • Als de naam van het kind het teken "^" bevat, open deze dan
  • Open het eigenschappenvenster voor dit virtuele bestand
  • verwijder de eigenschap "Referentie" in het tabblad "Aanpassen" en in alle configuraties die aanwezig zijn in het tabblad "Configuratiespecifiek"
  • Sluit het venster Eigenschappen
  • Als het geopende virtuele bestand zelf een assembly is, lus dan op dezelfde manier op de onderliggende bestanden
  • Sla het virtuele bestand op
  • Ga door naar het volgende kind
  • Vastgespen tot het laatste kind
  • Geef een pop-up weer als het klaar is.

Het is duidelijk dat wat ik beschrijf de opeenvolging van acties via Windows is, er is zeker een manier om dit alles te vereenvoudigen via functies, maar ik ben een grote noob van SW-macro's. Aan de andere kant ben ik klaar om te leren als ik me laat leiden door voorbeelden van bestaande macro's, ik vraag niet om een kant-en-klare :slight_smile: baan.
Ik heb het geprobeerd via de functie "Macro opnemen", maar het werkt niet in het venster Eigenschappen.

Tegelijkertijd zal ik proberen te kijken of ik de BatchProperties tool van myCADTools kan gebruiken.

Hallo

Code niet per se geoptimaliseerd, maar voorziet deels in de behoefte.
Voor de loopback op een virtuele ASM heb ik nog geen tijd gehad om te kijken (als het iemand anders inspireert om de code af te maken, want niet per se meer tijd om er op dit moment aan te besteden).

Option Explicit
Dim swApp           As SldWorks.SldWorks
Dim doc             As SldWorks.ModelDoc2
Dim swModel         As SldWorks.ModelDoc2
Dim asm             As SldWorks.AssemblyDoc
Dim compDoc         As SldWorks.ModelDoc2
Dim swModelDocExt   As ModelDocExtension
Dim swCustProp      As CustomPropertyManager
Dim swConfig        As SldWorks.Configuration
Dim swConfMgr       As SldWorks.ConfigurationManager
Dim comp            As SldWorks.Component2

Dim components      As Variant
Dim vComp           As Variant
Dim pathChain       As Variant
Dim titleChain      As Variant
Dim vPath           As Variant
Dim vConfigNameArr  As Variant
Dim vConfigName     As Variant
Dim vPropNames      As Variant
Dim vPropTypes      As Variant
Dim vPropValues     As Variant
Dim resolved        As Variant
Dim linkProp        As Variant

Dim nDocType        As Long
Dim nErrors         As Long
Dim nWarnings       As Long
Dim nNbrProps       As Long
Dim lRetVal         As Long
Dim j               As Long
Dim i               As Long

Dim bResult3        As Boolean
Dim boolstatus      As Boolean
Dim wasResolved     As Boolean
Dim linkToProp      As Boolean

Dim ValOut          As String
Dim ResolvedValOut  As String
Dim sCustProp       As String
Dim sConfig         As String
Sub main()

    Set swApp = Application.SldWorks
    Set doc = swApp.ActiveDoc
    If doc Is Nothing Then Exit Sub
    If doc.GetType <> swDocASSEMBLY Then Exit Sub
    Set asm = doc
    components = asm.GetComponents(False)   ' Get all components
    
    If IsArray(components) Then
        For Each vComp In components
            Set comp = vComp
            Set compDoc = comp.GetModelDoc2
            If Not compDoc Is Nothing Then
                bResult3 = compDoc.Extension.IsVirtualComponent3(pathChain, titleChain)
                If bResult3 <> False Then
                    For Each vPath In pathChain
                        If vPath <> doc.GetPathName Then
                            If InStr(LCase(vPath), "sldprt") > 0 Then
                                nDocType = swDocPART
                            ElseIf InStr(LCase(vPath), "sldasm") > 0 Then
                                nDocType = swDocASSEMBLY
                            ElseIf InStr(LCase(vPath), "slddrw") > 0 Then
                                nDocType = swDocDRAWING
                            Else
                                ' Probably not a SOLIDWORKS file
                                nDocType = swDocNONE
                                ' So cannot open the file
                                Exit Sub
                            End If
                        Set swModel = swApp.OpenDoc6(vPath, nDocType, swOpenDocOptions_Silent, "", nErrors, nWarnings)
                        Set swModelDocExt = swModel.Extension
                        Set swCustProp = swModelDocExt.CustomPropertyManager("")
                        nNbrProps = swCustProp.Count
                        lRetVal = swCustProp.GetAll3(vPropNames, vPropTypes, vPropValues, resolved, linkProp)
                        For j = 0 To nNbrProps - 1
                            For i = 0 To UBound(vPropNames)
                                sCustProp = vPropNames(i)
                                boolstatus = swModel.DeleteCustomInfo2("", sCustProp)
                            Next i
                        Next j
                        Set swConfMgr = swModel.ConfigurationManager
                        Set swConfig = swConfMgr.ActiveConfiguration
                        vConfigNameArr = swModel.GetConfigurationNames
                        For Each vConfigName In vConfigNameArr
                            Set swCustProp = swModelDocExt.CustomPropertyManager(vConfigName)
                            nNbrProps = swCustProp.Count
                            lRetVal = swCustProp.GetAll3(vPropNames, vPropTypes, vPropValues, resolved, linkProp)
                            For j = 0 To nNbrProps - 1
                                sConfig = vConfigName
                                For i = 0 To UBound(vPropNames)
                                    sCustProp = vPropNames(i)
                                    boolstatus = swModel.DeleteCustomInfo2(sConfig, sCustProp)
                                Next i

                            Next j
                        Next
                    End If
                    Next
                End If
            End If
        Next
    End If
End Sub

Wauw, maar dat is geweldig! En het werkt :slight_smile:
Heel hartelijk bedankt!
Ik zal daar voorlopig tevreden mee zijn, het sluit eigenlijk niet op asm child, maar ik kan het opnieuw opstarten nadat ik het asm kind in kwestie heb gehad, het is prima voor :stuck_out_tongue: mij!
Ik zal nog steeds kijken of ik een extra lus kan nesten als nDocType = dwDocASSEMBLY.
Nogmaals bedankt

1 like