Component herpositioneren op API-macro

Hallo

 

Sinds vanmorgen ben ik op zoek naar een oplossing voor mijn probleem, maar onmogelijk te vinden. Ik wil graag componenten invoegen en ze in een assemblage verplaatsen volgens de oorsprong van de assemblage of een bepaald punt, punt 1, punt 2 ...

 

Het lukt me om automatisch een assembly aan te maken, al mijn bestanden te openen en ze zelfs in mijn assembly in te voegen. Het eerste onderdeel is niet eens bij de oorsprong van de assemblage ingevoegd en ik weet niet hoe je het hele ding op de oorsprong of op punten kunt herpositioneren.

Als iemand deze twee kleine regels code kent, zijn hier de regels code die interessant zijn: 

'Ouverture de l'assemblage
Set Part = swApp.OpenDoc6(ActiveSheet.Range("H100"), 2, 0, "", longstatus, longwarnings)
swApp.ActivateDoc2 ActiveSheet.Range("H100"), False, longstatus

'--------------------------------------------
'assemblage des plans
boolstatus = Part.AddComponent(ActiveSheet.Range("H101"), ActiveSheet.Range("E101"), ActiveSheet.Range("F101"), ActiveSheet.Range("G101"))
boolstatus = Part.AddComponent(ActiveSheet.Range("H102"), ActiveSheet.Range("E102"), ActiveSheet.Range("F102"), ActiveSheet.Range("G102"))

 

 

Ik heb alleen meer lijnen nodig tussen elke invoeging om het positioneringspunt van elk onderdeel/set te definiëren.

 

Hallo

Kijk hier om te zien  of het je kan helpen.

Bedankt voor je snelle antwoord, maar ik wilde de code direct lijnen en mijn hersens niet pijnigen :'(

 

Serieuzer, het lukt me om mijn onderdelen in te voegen die ik na het invoegen wil verplaatsen. Ik kan de baan niet vinden. 

Is er een manier om het onderdeel rechtstreeks in de assemblage te laden zonder het vooraf te laden, om terug te kaatsen op uw werkstation?

Hallo

Er is waarschijnlijk wat je wilt in deze discussie.

Vriendelijke groeten

Hallo aan jou d.roger.

Allereerst wil ik je bedanken voor je antwoord, je hebt gepost direct nadat ik de "mate" -functie had gevonden, realiseerde ik me dat je nog steeds macro's met de "hand" kon doen om te vergelijken en te ontgrendelen.

Dus ik bedenk zoiets als dit:

'assemblage des plans
boolstatus = Part.AddComponent(ActiveSheet.Range("H101"), ActiveSheet.Range("E101"), ActiveSheet.Range("F101"), ActiveSheet.Range("G101"))
    'positionnement de la pièce
            'suppression du "fixe" sur la première pièce
            boolstatus = Part.Extension.SelectByID2("K101", "COMPONENT", 0, 0, 0, False, 0, Nothing, 0)
            Part.unFixComponent
    Part.ClearSelection2 True
    boolstatus = Part.Extension.SelectByID2("J100", "EXTSKETCHPOINT", 0, 0, 0, False, 1, Nothing, 0)
    boolstatus = Part.Extension.SelectByID2("J101" & "K101", "EXTSKETCHPOINT", 0, 0, 0, True, 1, Nothing, 0)
   ' Dim swMate As Mate2
    Set swMate = Part.AddMate5(20, -1, False, 0.824524202641418, 0.001, 0.001, 0.001, 0.001, 0.5235987755983, 0.5235987755983, 0.5235987755983, False, False, 0, longstatus)
    Part.ClearSelection2 True
    boolstatus = Part.Extension.SelectByID2("K101", "COMPONENT", 0, 0, 0, False, 0, Nothing, 0)
    Part.FixComponent
    Part.ClearSelection2 True

 

Mijn probleem is dat het niet mijn component selecteert die wordt vermeld als "K101", dus geen beperking of iets ingesteld. Wat een macro, vol met regels voor niets :'(

 

Bedankt voor je hulp, ik wacht nog steeds op de juiste link of een oplossing.

Waar komen uw "J100", "J101" en "K101" mee overeen?

Gezien het stukje code ga ik ervan uit dat dit waarden zijn die zijn overgenomen uit cellen in een Excel-bestand, maar respecteren deze waarden de noodzakelijke naamgeving?

Zoals wat:

- voor "K101", als het een component is met de naam "Part1" die deel uitmaakt van een assembly met de naam "Assembly2", moet het "Part1-1@Assemblage2" zijn.

- voor "J100", als het de oorsprong van Assemblage2 is, moet het "Point1@Origine@Assemblage2" zijn.

- voor "J101", als het de oorsprong is van deel 1, moet het "Point1@Origine@Pièce1-1@Assemblage2" zijn.

Zet de regel "MsgBox (longstatus)" achter de regel "Set swMate = Part.AddMate5(20, -1, False, 0.824524202641418, 0.001, 0.001, 0.001, 0.001, 0.523598775983, 0.523598775983, 0.523598755983, False, False, 0, longstatus)", hierdoor kunt u de foutcode ophalen, om hiermee te vergelijken.

En natuurlijk, zoals vermeld in de andere discussie, controleer of je onderdelen in de opgeloste modus staan in Solidworks, anders werkt het niet...

Vriendelijke groeten

2 likes

Hallo

 

Ik heb al sorry voor dit wachten voordat ik antwoord, ik heb net teruggekeken naar mijn onderwerp en dit is wat eruit kwam:

Mijn macro opent al mijn onderdelen/assemblage goed, voordat ik de hoofdassemblage open en de verschillende componenten insteek, zal ik waarschijnlijk een manier moeten vinden om ze om de beurt te openen en te sluiten, anders wordt het zwaar.

 

Bij het invoegen van mijn verschillende componenten in mijn assemblage zijn ze goed opgelost, maar zijn ze ondanks mijn swMate allemaal op hun zwaartepunt gepositioneerd. Dus ik ben op dit moment geblokkeerd.

 

Dank u voor uw antwoord d.roger. De vakken waarnaar wordt verwezen, zijn normaal gesproken goed gevuld. Ik heb de MsgBox-regel (longstatus) ingevoegd, deze retourneert het bericht 4 = Onjuiste selecties voor mate. Dus ik concludeer dat mijn dozen niet goed gevuld zijn.

In J plaats ik mijn referentiepunten 'Point1@Origine@'. Voor de oorsprong van de assemblage heb ik alleen 'Point1@Origine'

In K noem ik mijn componenten 'Part1-1@assemblage1'

Dit deel moet daar worden herwerkt, ik wil gewoon mijn bewerking laten werken, maar met mijn twee regels code:

boolstatus = Part.Extension.SelectByID2("J100", "EXTSKETCHPOINT", 0, 0, 0, False, 1, Nothing, 0)
boolstatus = Part.Extension.SelectByID2("J101" & "K101", "EXTSKETCHPOINT", 0, 0, 0, True, 1, Nothing, 0)

 

Normaal gesproken heb ik geen fouten, toch?

 

Als laatste, mijn componenten repareren niet in mijn assemblage na mijn macro, maar ik heb deze drie regels:

    boolstatus = Part.Extension.SelectByID2("K101", "COMPONENT", 0, 0, 0, False, 0, Nothing, 0)
    Part.FixComponent
    Part.ClearSelection2 True

 

 

Bedankt, ik houd je op de hoogte van mijn vorderingen.

Hallo

Je selecties zijn dus niet goed, aangezien Solidworks op zoek is naar elementen met de naam "J100", "J101" en "K101" in je onderdelen en assemblages, je moet de waarden van de cellen  in Excel ophalen en ze vervolgens doorgeven aan tekenreeksvariabelen die je vervolgens toewijst aan je SelectByID2-functies.

Dim FirstSelection As String
FirstSelection = 'valeur de la cellule Excel (attention ce n'est pas le numéro de la cellule)'
Dim SecondSelection As String
SecondSelection = 'valeur de la cellule Excel (attention ce n'est pas le numéro de la cellule)'
        
Part.ClearSelection2 True
boolstatus = swAssemblyDoc.Extension.SelectByID2(FirstSelection, "EXTSKETCHPOINT", 0, 0, 0, False, 1, Nothing, 0)
boolstatus = swAssemblyDoc.Extension.SelectByID2(SecondSelection, "EXTSKETCHPOINT", 0, 0, 0, True, 1, Nothing, 0)

Vriendelijke groeten

Hallo

 

Inderdaad het retourneren van de J100 of J101 waarde was geen goed idee, beginnersfout of iemand die niet gewend is aan VBA. Dus ik nam wat er in het voorstation was om vooruit te komen, zo ziet het eruit:

 

        For i = 101 To 103
boolstatus = Part.AddComponent(ActiveSheet.Range("H" & i), 0, 0, 0)

Dim CompInsert As String
CompInsert = ActiveSheet.Range("E" & i) & "-1@" & ActiveSheet.Range("E100")
Dim FirstSelection As String
FirstSelection = "Point1@Origine@" & CompInsert
Dim SecondSelection As String
SecondSelection = "Point1@Origine"

    'positionnement de la pièce
            'suppression du "fixe" sur la première pièce
            boolstatus = Part.Extension.SelectByID2(CompInsert, "COMPONENT", 0, 0, 0, False, 0, Nothing, 0)
            Part.unFixComponent

Part.ClearSelection2 True
boolstatus = Part.Extension.SelectByID2(FirstSelection, "EXTSKETCHPOINT", 0, 0, 0, False, 1, Nothing, 0)
boolstatus = Part.Extension.SelectByID2(SecondSelection, "EXTSKETCHPOINT", 0, 0, 0, True, 1, Nothing, 0)
            
Set swMate = Part.AddMate5(20, -1, False, 0, 0.001, 0.001, 0.001, 0.001, 0.5235987755983, 0.5235987755983, 0.5235987755983, False, False, 0, longstatus)

 

Op dit moment slaagt mijn macro erin om deze bewerkingen uit te voeren:

Open alle componenten een voor een, om de onopgeloste modus te vermijden, zal ik later een minder omslachtige oplossing bedenken.

Het opent mijn hoofdassemblage of plaatst de componenten.

Het maakt de component "gratis". (Variabele "CompInsert" ok)

Het plaatst mijn oorsprong/oorsprong componenten en repareert ze.

 

Bedankt voor je hulp, nu moet ik een manier vinden om mijn componenten direct in mijn assemblage te openen en ze op te lossen.

Het is niet nodig om alle componenten te openen om ze op opgelost te zetten, maak gewoon een lijst van de threads van de assembly die in Solidworks is geladen met behulp van de functie "GetRootComponent3" en zet ze vervolgens in de opgeloste modus met behulp van de functie "SetComponentDelete".

Vriendelijke groeten