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).
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).
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)
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.
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 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 :)
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.
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.
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...
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 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.