Importeer onderdelen in een assemblage met dezelfde oorsprong

Hallo

 

Ik wil twee onderdelen importeren in een assemblage en ervoor zorgen dat hun oorsprong wordt verward met die van de assemblage.

 

Het is iets eenvoudigs handmatig, maar de macro die ik krijg niet...

 

Bedankt voor je hulp

 

Code:

Sub Assemblage()

 

Dossier_dest = "D:\TRAPRO III Project\Macro Test\"

 

Stel swApp = Toepassing.SldWorks in

 

Set Part = swApp.NewDocument("C:\ProgramData\SolidWorks\SolidWorks 2012\templates\Assemblage.asmdot", 0, 0, 0)

swApp.ActivateDoc2 "Assemblage1", False, longstatus

Deel instellen = swApp.ActiveDoc

myModelView dimmen als object

Stel myModelView = Deel.ActiveView in

myModelView.FrameState = swWindowState_e.swWindowMaximized

boolstatus = Part.AddComponent(Dossier_dest & naam & ". SLDPRT", 0, 0, 0)

boolstatus = Part.AddComponent("D:\Project TRAPRO III\TRAPRO DESIGN +\01-Technische Bibliotheekring\Nieuw\Kroonring 25.SLDPRT", 0, 0, 0)

 

Einde sub

Kijk in de API-help (SolidWorks-menu?/API-help)

Zoek naar de opdracht AddComponent5

Er zijn codevoorbeelden die u kunt gebruiken 

3 likes

Ik zie het nut er niet echt van in, want als je importeert en je klikt direct op OK, dan plakt het de oorsprong aan elkaar.

Misschien kun je:

1- Maak de kamer vrij

2- voeg een toevalsbeperking toe aan de oorsprong van de assemblage en aan de oorsprong van het onderdeel door te controleren of de assen zijn uitgelijnd (ik denk in mijn hoofd).

3- Bevestig het onderdeel

4- Verwijder de gecreëerde beperking.

 

Ik wil graag opnieuw ingaan op deze vraag, die niet als opgelost is aangemerkt omdat ik met een soortgelijk probleem sta.

Ik wil onderdelen in een assemblage invoegen door eerst een schets in te voegen (waarvan de lijnen als referentie dienen voor de assemblage van andere onderdelen) en ik kan de twee oorsprongen niet samenlaten vallen (via de functies AddComponent, AddComponent2 of zelfs AddComponent5).

Namelijk dat ik op SolidWorks 2012 zit.

Bedankt voor je hulp

Heb je naar deze link gekeken? http://help.solidworks.com/2012/English/api/sldworksapi/Add_Component_and_Mate_Example_VB.htm

Hallo

Ik had dit verband al eerder gezien, maar mijn pogingen waren helemaal niet doorslaggevend. Ik heb echter mijn code genomen om deze te laten samenvallen met dit voorbeeld, maar er verschijnt een foutmelding:

"Runtime-fout '91':

Variabel obket of variabel blok Met niet gedefinieerd"

Voor lijn 100: matefeature. Naam = MateName

Ik heb mijn code bijgevoegd als het kan helpen om het te begrijpen (maar het is gekoppeld aan een gebruikersformulier)


createass.txt

Goedenavond

In bijlagen vindt u een macro met commentaar waarmee u twee documentdelen kunt plaatsen en een beperking kunt toevoegen aan de oorsprong.

Om het voor u te laten werken, verandert u het pad naar de onderdelen en opent u een nieuwe assemblage.

De macro is becommentarieerd, je zou het vrij gemakkelijk moeten begrijpen.

Goede code.


insertion_pieces.swp
2 likes

Heel erg bedankt, ik denk (hoop ik) dat dit me uit een mooie puinhoop zal halen!

1 like

Hallo

Ja, ik ben het weer, ik kom terug, maar in feite is het probleem niet opgelost. Ik had het al lang geleden opgemerkt, maar ik was ineens gehecht geraakt aan andere functies van mijn programma, het maakte niet uit.

Ondanks dit prachtige programma van Yves T. loop ik altijd tegen hetzelfde probleem aan: mijn stuk staat altijd vast vanaf de invoeging en voegt geen oorsprong aan oorsprong toe. Hoe hard ik ook probeer om het stuk te repareren, te bevrijden, de lijnen in alle richtingen te draaien, niets helpt!

Dank u voor uw hulp.

Ik voeg mijn macro toe, wat zeker niet erg duidelijk is gezien het aantal moficiations en tests dat ik heb gedaan.


createass_v2.txt

Hallo

Hoe geef je de sub-hoofdparameters op?

Sub main (oCabineCode als tekenreeks, GeselecteerdBestand als tekenreeks, TracePath als tekenreeks)

U hebt de parameters niet getest om er zeker van te zijn dat ze een waarde hebben voordat u doorgaat met de code.

Waarom een waarde opnieuw toewijzen aan swApp tijdens het programma?

Zonder enige uitleg van uw kant over wat u dacht te doen met:

Set swApp = _
Application.SldWorks

Set Part = swApp.NewDocument("C:\ProgramData\SolidWorks\SolidWorks 2012\templates\Assemblage.asmdot", 0, 0, 0)
Set swModel = swApp.ActivateDoc2(oCabineCode, False, longstatus)
Set Part = swApp.ActiveDoc
Dim myModelView As Object
Set myModelView = Part.ActiveView
myModelView.FrameState = swWindowState_e.swWindowMaximized

longstatus = Part.SaveAs3(SelectedFile, 0, 2)

Set Part = swApp.ActivateDoc2(oCabineCode, False, errors)
Dim TmpTitle As String
TmpTitle = swApp.ActiveDoc.GetTitle
swApp.CloseDoc TmpTitle

Ik begrijp niet waar het voor is:)

Ik heb je code wat gedetailleerder bekeken. Er zijn nogal wat fouten. Ga terug naar de macro die ik heb gepost. Het werkt in alle gevallen en voor een versie van SW >2010.

Als u al de bestandsnamen hebt die u aan de assembly wilt toevoegen, plaatst u ze in een globale variabele (array of String) of in een eigenschap.

Als u wilt dat de gebruiker kan kiezen welke documenten moeten worden ingevoegd, gebruikt u: swApp.GetOpenFileName(). Hierdoor wordt het SW OpenFileDialog weergegeven, waarvoor u verschillende opties kunt opgeven.

Vermijd het opnieuw ondertekenen van variabelen wanneer ze niet veranderen. Plak zoveel mogelijk geen waarde opnieuw op swApp.

U kunt een waarde opnieuw toewijzen aan de andere variabelen.

Vermijd het doorgeven van parameters aan de Main() procedure  . Het is beter om een tweede procedure te schrijven die door Main wordt aangeroepen en die parameters zal hebben.

Stijl:

Sub Hoofd()

MaakDe Berekening Param1  , Param2,Param3

Einde Sub

Sub FaireLeCalcul( ByVal param1 als blabla, ... )

Einde Sub

Het is leesbaarder en zinvoller. Het stelt je ook in staat om je code beter te schrijven zonder door elkaar te raken, vooral als programmeren nieuw voor je is.

Voor mij werkt uw code niet omdat een variabele niet de verwachte waarde zou moeten hebben. Als u niet test op tekenreeksvariabelen, kan dit gevaarlijk zijn. Een variabele van het type String wordt ingesteld op "String Empty" wanneer deze wordt geïnitialiseerd. Daarom testen we in veel programmeertalen de waarde van een variabele.

In de macro die ik heb gepost, heb ik het niet gedaan omdat je een beetje van je :)

Vriendelijke groeten.

1 like

Hallo

Bedankt voor de feedback. Ik zal beetje bij beetje de verschillende vragen beantwoorden die je hebt geformuleerd (volgens mijn tests en aanpassingen) en mijn programma uitleggen.

Wanneer ik het programma start, heb ik een UF die wordt geopend waarin de itilsator de naam van de assembly invult (oCabineCode), vervolgens de map waarin hij de assembly wil opslaan (SelectedFile) en ten slotte het referentie-element van deze assembly via zijn pad (Tracepath). Met alle uitgevoerde tests weet ik dat ik me geen zorgen hoef te maken over deze verschillende gegevens. door op "Create assembly" te klikken, wordt dit programma gestart en zal daarom een nieuwe assembly openen, deze opslaan om deze de gewenste naam te geven en opslaan in de doeldirectory. Dit is wat dit kleine stukje programma dat je gisteren in je eerste bericht hebt geëxtraheerd, doet. Als ik deze registratie doe, kom ik eigenlijk uit op 2 assemblages "AssemblageX" en "oCabineCode" om problemen te voorkomen, dus sluit ik "AssemblageX".

Ondanks het commando "Set Part = swApp.ActivateDoc2(oCabineCode, False, errors)" anders kom ik toch uit bij "AssemblageX" als actief onderdeel. Dus daarom wijs ik een waarde toe aan swApp. Het is ook "eenvoudiger" voor mij omdat ik mijn assemblage kan identificeren aan de hand van zijn naam, die ik ken, terwijl als het Assemblage"X" is, het ingewikkelder wordt, althans lijkt mij.

Ik zal echter proberen uw aanwijzingen in het tweede bericht te gebruiken om deze kleine tegenslag op te lossen.

Nogmaals bedankt voor uw interesse.

Nou, ik heb het goed gehoord en probeer je advies op te volgen, ik heb veel regels van mijn code herlezen, herzien en verwijderd. Ik heb alle gegevens van mijn String variabelen gecontroleerd, a priori heb ik ook geen fouten aan deze kant. Mijn onderdeel past goed in mijn montage, maar als ik bij de beperking kom, mislukt het weer!

Ik eindig met een foutmelding "438: Eigenschap of methode niet afgehandeld door dit object" en wanneer ik zoek op de SM API-help, kan ik geen hulp vinden voor de functie "AddMate5", maar het is deze regel, en het is de laatste in mijn code, die de fout veroorzaakt. De component wordt vast toegevoegd en ik kan altijd de UnfixComponent-methode uitvoeren, niets te doen.

In het slechtste geval doe ik de manipulatie met de hand, dat is wat ik al sinds het begin doe, maar het is een beetje ... pijnlijk.

Hallo

Heeft u uw 3 plannen zowel in uw kamers als in de montage??? Ik denk dat je oorsprong op het snijpunt van de 3 vlakken ligt!! Waarom kijk je niet met je voor de beperking van de plannen tussen hen, daar zouden je delen dezelfde oorsprong hebben en zouden ze onmiddellijk worden beperkt...

1 like

Mijn excuses, AddMate5 verscheen pas vanaf Sw 2015. Gebruik voor SW 2012 AddMate3.

U kunt alle informatie voor het gebruik van de methode vinden in de Help van de SW-API.

Hallo

Hier ben ik weer met dezelfde zorg:

Ik zit op SW2012 en wanneer ik mijn eerste onderdeel in de assemblage toevoeg, staat het vast, ik slaag erin om beperkingen toe te voegen om de oorsprong en de referentievlakken te laten samenvallen, maar plotseling is het overbelast (het is onmogelijk om de beperkingen te activeren omdat ze worden toegepast op een vast onderdeel). Ik heb de volgende regels aan de code toegevoegd:

Deel.FixComponent of

Deel.UnfixComponent

Het verandert niets.

Ik heb het geprobeerd met de eerste formule, want als ik een macro-opname maak, is het degene die lijkt vrij te geven EN het deel onder SW2012 te repareren.

Ik heb het geprobeerd met de tweede, maar het werkt ook niet.

Op dit moment loopt mijn programma perfect, behalve op dit punt (dus ik neem pauzes om de eerste delen van elke subassemblage die ik maak handmatig los te laten, en ik doe er 7, dus het is een beetje pijnlijk en het programma verliest vloeibaarheid).

Als je een oplossing hebt, zou je me veel helpen.

Bij voorbaat dank en nogmaals!

Hallo Meeuw,

Als de code nog steeds de code is die op pagina 1 van dit onderwerp is bijgevoegd, denk ik dat we in plaats daarvan TraceName & "@" & AssemblyName moeten samenvoegen tot een variabele en deze dan moeten aanroepen.

Ik denk dat dat het probleem kan verklaren. Anders, door een stop in de code te plaatsen en vanaf dit punt stap voor stap naar binnen te scrollen, kunt u controleren of het model is geselecteerd in de FeatureManager.

boolstatus = Part.Extension.SelectByID2(TraceName & "@" & AssemblyName, "COMPONENT", 0, 0, 0, False, 0, Nothing, 0)
Part.UnfixComponent

 

1 like

Het is altijd dezelfde code.

Bedankt Cyril, dit lost mijn probleem op!

het ontbrak meestal de increment in de naam van het element na "TraceName"

boolstatus = Part.Extension.SelectByID2(TraceName & "-1@" & AssemblyName, "COMPONENT", 0, 0, 0, False, 0, Nothing, 0)
Deel.UnfixComponent

Nu werkt het perfect, nogmaals bedankt!