| | |
 | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS |
|
Autor
|
Thema: SW2008 API: Komponentenmuster: Kinder ermitteln (1922 mal gelesen)
|
oeNkraD Mitglied

 Beiträge: 29 Registriert: 30.09.2010
|
erstellt am: 10. Dez. 2010 14:17 <-- editieren / zitieren --> Unities abgeben:         
Hallo zusammen! Ich möchte per API alle referenzierten Komponenten eines Musters in einem Variant-Array speichern. Dazu hab ich es bereits realisiert, dass ich über ".IsPatternInstance" alle Komponenten einer Baugruppe ermittle, die in einem Linearen Komponentenmuster gemustert wurden. Bei den gemusterten Komponenten handelt es sich bei mir um virtuelle Komponenten. Ich kann über den bereits geschriebenen Code eindeutig die Komponenten ermitteln, die die Ursprungskomponente eines Musters sind. Nun möchte ich wie gesagt die davon abstammenden Kopien als Pointer in einem Array speichern. Leider Funktioniert die GetChildren Funktion nicht, bzw. liefert immer nur ein Variant der Länge -1 (also Leer) zurück. Ich hab es momentan so realisiert, dass ich die Namen der Komponenten zur identifizierung der zugehörigkeit einer Komponente zu einer Ursprungskomponente nutze - allerdings ist diese Methode sehr unsicher und liefert mir oftmals im weiteren Verlauf Fehler. Habt ihr eine Idee, wie ich ein Array mit Pointern auf die erzeugten Kopien einer Komponente eines Musters erhalten kann? Gruß
Alex
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
oeNkraD Mitglied

 Beiträge: 29 Registriert: 30.09.2010
|
erstellt am: 15. Dez. 2010 07:26 <-- editieren / zitieren --> Unities abgeben:         
Niemand? Hmm... weiß denn jemand wie ich alle Komponenten einer Baugruppe der Reihe nach durchgehen kann? Mit Features gehts ja mit FirstFeature und NextFeature... bei Baugruppen kenn ich bisher nur die Getchildren Variante, wo man alle Kinder in ungeordneter Reihenfolge in einem Array bekommt... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
StefanBerlitz Guter-Geist-Moderator IT Admin (CAx)

 Beiträge: 8756 Registriert: 02.03.2000 SunZu sagt: Analysiere die Vorteile, die du aus meinem Ratschlag ziehst. Dann gliedere deine Kräfte entsprechend und mache dir außergewöhnliche Taktiken zunutze.
|
erstellt am: 15. Dez. 2010 09:49 <-- editieren / zitieren --> Unities abgeben:          Nur für oeNkraD
Hallo oeNkraD (uPs, jETzt HaB iCH nen KnOtEn in dEN fInGeRn), theoretisch müsstest du auch eine Baugruppe mit FirstFeature/GetNextFeature durchlaufen können. Das hab ich aber noch nicht selbst probiert, bei meinen Aufgaben hat bisher immer das GetChildren gereicht. Zum ersten Beitrag: die Aufgabenstellung hört sich für mich zumindest so speziell an, dass ich keine Lust verspüre mehrere halbe Stunden erst mal darein zu setzen die Umgebung nachzustellen. Vielleicht wäre es in solchen Situationen einfacher, wenn du ein komplettes Testszenario mit Baugruppe, Modellen und Beispielcode hochlädst, damit die potentiellen Helfer einen Anfang haben. Es sei denn, du vertraust auf dein Glück, dass genau das schon mal jemand gemacht hat und direkt sagen kann, wo der Knackpunkt ist  Ciao, Stefan ------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de Stefans SolidWorks Blog Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Hofe Mitglied Werkzeugmacher
 
 Beiträge: 440 Registriert: 12.01.2008 Computer: Aldi Schreibtisch: Ikea Werkbank: Baumarkt Software: 1967-2021, viele Updates und SP's, aber sicher nicht alle, deswegen immer wieder Sicherheitslücken
|
erstellt am: 15. Dez. 2010 09:53 <-- editieren / zitieren --> Unities abgeben:          Nur für oeNkraD
Zitat: Original erstellt von StefanBerlitz: Hallo oeNkraD (uPs, jETzt HaB iCH nen KnOtEn in dEN fInGeRn)
Auch "Alex" genannt Rückwärts ergibt der Nick sogar Sinn. ------------------ Ist mir egal, wer Dein Vater ist; solange ich angle läuft hier keiner übers Wasser! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
oeNkraD Mitglied

 Beiträge: 29 Registriert: 30.09.2010
|
erstellt am: 15. Dez. 2010 11:20 <-- editieren / zitieren --> Unities abgeben:         
Hallo  Also folgendes hab ich mir gedacht: Code: Sub main() Dim swApp As SldWorks.SldWorks Dim swModel As SldWorks.ModelDoc2 Dim swFeatMgr As SldWorks.FeatureManager Dim swConfigMgr As SldWorks.ConfigurationManager Dim swConfig As SldWorks.Configuration Dim swRootComp As SldWorks.Component2
Set swApp = CreateObject("SldWorks.Application") Set swModel = swApp.ActiveDoc If swModel Is Nothing Then MsgBox ("Keine Datei geöffnet") End Else If swModel.GetType() = swDocDRAWING Then MsgBox ("Zeichnungen nicht Unterstützt!") End End If End If Set swFeatMgr = swModel.FeatureManager Set swConfigMgr = swModel.ConfigurationManager Set swConfig = swConfigMgr.ActiveConfiguration Set swConf = swModel.GetActiveConfiguration Set swRootComp = swConf.GetRootComponent swFeatMgr.EnableFeatureTree = False swModel.ClearSelection2 True If Not swModel.GetType() = swDocPART Then TraverseComponent swRootComp End If swModel.ClearSelection2 True swFeatMgr.EnableFeatureTree = True End Sub Sub TraverseComponent(swComp As SldWorks.Component2) Dim swChildComp As SldWorks.Component2 Set swChildComp = swComp.FirstFeature While Not swChildComp Is Nothing
If Not swChildComp.GetModelDoc() Is Nothing Then If swChildComp.GetModelDoc.GetType() = swDocASSEMBLY Then MsgBox ("Assembly") Else MsgBox (swChildComp.Name2()) End If End If swChildComp = swComp.GetNextFeature() Wend MsgBox ("fertig") End Sub
Leider kommt bei dem durchlauf des "traversecomp..." Sub mit first Feature und NextFeature nichts zu stande. Meine Baugruppen haben ein Hauptbaugruppe, eine Unterbaugruppe (Teilweise mit Parts und BG Features), eine weitere Unterbaugruppe (Parts und BG Features) Ich möchte jetz über das Makro jedes Part abrufen und zwar in der Reihenfolge, wie es im Designtree steht. wie schon erwähnt liefert GetChildren dazu nur ein wirres Durcheinander - für mich unbrauchbar... Liebe Grüße
Alex (oeNkraD schreibt sich doch ganz flüssig von der Hand :zwinker  [Diese Nachricht wurde von oeNkraD am 15. Dez. 2010 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
oeNkraD Mitglied

 Beiträge: 29 Registriert: 30.09.2010
|
erstellt am: 15. Dez. 2010 12:15 <-- editieren / zitieren --> Unities abgeben:         
Ok: Darüber bekomm ich alles schön in Reihenfolge des Designtrees. Hervoragend... Code: Sub main() Dim swApp As SldWorks.SldWorks Dim swModel As SldWorks.ModelDoc2 Dim swFeat As SldWorks.Feature
Set swApp = Application.SldWorks Set swModel = swApp.ActiveDoc Set swFeat = swModel.FirstFeature MsgBox (swModel.GetPathName) Do While Not swFeat Is Nothing
If swFeat.GetTypeName2 = "Reference" Then MsgBox (swFeat.Name) End If Set swFeat = swFeat.GetNextFeature Loop End Sub
Aber wie komm ich von einem Feature wieder zu einem Component2-Pointer? Geht das irgendwie direkt oder muss ich da irgendwie, über den Namen, was zurecht basteln?
Gruß
Alex Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |

| |
StefanBerlitz Guter-Geist-Moderator IT Admin (CAx)

 Beiträge: 8756 Registriert: 02.03.2000 SunZu sagt: Analysiere die Vorteile, die du aus meinem Ratschlag ziehst. Dann gliedere deine Kräfte entsprechend und mache dir außergewöhnliche Taktiken zunutze.
|
erstellt am: 15. Dez. 2010 13:19 <-- editieren / zitieren --> Unities abgeben:          Nur für oeNkraD
Hallo Alex (ist doch einfacher, meine Finger werden langsam alt und träge  ), da bist du doch schon gut weiter gekommen. Du kannst dann von da aus weitermachen wie z.B.
Code: Sub main() Dim swApp As Object Dim AssemblyDoc As Object Dim Feature As Object Dim Component As Object Set swApp = CreateObject("SldWorks.Application") Set AssemblyDoc = swApp.ActiveDoc ' dann das erste Feature holen Set Feature = AssemblyDoc.FirstFeature ' und solange noch Featuires da sind Schleife drehen While Not Feature Is Nothing ' mal ein paar Infos rausschreiben Debug.Print Feature.Name, Feature.GetTypeName2 ' hier kann man jetzt alles Mögliche mit dem Feature machen If Feature.GetTypeName2 = "Reference" Then Set Component = Feature.GetSpecificFeature2 Debug.Print Component.GetPathName End If ' auf zum nächsten Feature Set Feature = Feature.GetNextFeature() featcount = featcount + 1 Wend End Sub
Dann noch eine Rekursion einbauen, um automatisch die Unterbaugruppen zu durchforsten und dann auf das nächste Problem warten  Ciao, Stefan ------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de Stefans SolidWorks Blog Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |