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 ?
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
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.
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?
Ze zouden er niet tegen zijn, maar ze zouden het ook niet 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 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 . 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:
En mogelijk aan de variabele kant, dit selectievakje, maar het controleert niet de waarde, alleen het bestaan ervan:
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.
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 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.
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 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 mij! Ik zal nog steeds kijken of ik een extra lus kan nesten als nDocType = dwDocASSEMBLY. Nogmaals bedankt