| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS | | | | HEDELIUS Hausmesse 2024 |
Autor
|
Thema: Komponenteneigenschaften mit Makro auslesen (4527 mal gelesen)
|
Zoltan Mitglied z
Beiträge: 9 Registriert: 27.03.2005 SolidWorks Premium 2007 SP0.0; P4 3,0GHz; Radeon 9800 XXL;
|
erstellt am: 03. Nov. 2007 21:29 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich versuche mehrere Körper mit Hilfe eines Maktos in eine Baugruppe einzubauen. Die Körper müssen nach dem importieren jeweils mit dem vorhergehenden Körper verknüpft werden, sprich es entsteht eine Kette (Fahrradkette). Ich habe es mittlerweile geschafft einen Körper per Makro zu importieren und ihn global auszurichten.
Code: ' Importieren der Datei swModel.AddComponent "E:\WORK\BaugruppeKettenElement.SLDASM", 0, 0, 0 ...
Mein Problem ist nun, wie ich die Kennungs-Nummer des Körpers bekomme, denn für die Auswahl der Ebene für das spätere Ausrichten benötige ich einen String mit diese Nummer. Siehe unten: Code: swModel.Extension.SelectByID2("Ebene vorne", "PLANE", 0, 0, 0, True, 1, Nothing, 0) swModel.Extension.SelectByID2("Ebene rechts@BaugruppeKettenElement-24@Baugruppe_Test1", "PLANE", 0, 0, 0, True, 1, Nothing, 0)' Verknuepfung erstellen swModel.AddMate 0, swMateCOINCIDENT, 0, 0.01, 0.5235987755983
Der String "Ebene rechts@BaugruppeKettenElement-24@Baugruppe_Test1" enthält die besagte Kennnungs-Nummer (die 24), der sich nach jedem weiteren Import erhöht. Nun weiß ich nicht welchen Befehl ich verwenden muss, um diese Nummer zu bekommen, und wie ich das in ein String packen kann. Wäre super, wenn mir jemand diesbezüglich unter die Arme greifen könnte. Danke und Gruß Zoltan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Baumjäger Mitglied CAD/PDM Administrator
Beiträge: 339 Registriert: 21.06.2006 SW2017 - S5.0 AutoCAD Mechanical 2018 Win10 Intel Xeon E3-1240 V2 3,4GHz 16GB RAM NVIDIA Quadro 4000
|
erstellt am: 05. Nov. 2007 08:28 <-- editieren / zitieren --> Unities abgeben: Nur für Zoltan
ich habe mir mit einem anderen Makro mal so geholfen: Eine Varibale erstellt. Nach jedem einfügen die Variable um eins erhöt. So zählt die Variable sozusagen mit und du hast so immer die richtige Nummer. Ist zwar sicher nicht der tollste Weg und kann auch zu Problemen führen, dafür aber einfach und recht unkompliziert.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
nahe Ehrenmitglied
Beiträge: 1747 Registriert: 18.01.2001 arbeite mit: Dell Precision 7750 i7 2,6 GHz 6 Kerne 32GB RAM 512GB SSD NVIDIA Quadro RTX 4000 ------------------------ SWX-2020 SP5.0 EPDM ---------------- Windows 10 ---------------- VB.net VB VBA ein wenig Swift am Mac
|
erstellt am: 05. Nov. 2007 08:50 <-- editieren / zitieren --> Unities abgeben: Nur für Zoltan
Hallo Zoltan ich würde statt "AddComponent" "AddComponent4" verwenden, dann bekommst Du als Ergebnis der Methode einen Verweis auf die eingefügte Komponente und brauchst Dich nicht um die Kennungs-Nummern zu kümmern. ------------------ Grüße Heinz Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Zoltan Mitglied z
Beiträge: 9 Registriert: 27.03.2005 SolidWorks Premium 2007 SP0.0; P4 3,0GHz; Radeon 9800 XXL;
|
erstellt am: 06. Nov. 2007 19:43 <-- editieren / zitieren --> Unities abgeben:
Hallo allerseits, Danke für die Beiträge. Ich hab das Problem vorerst wie Baumjäger es empfohlen hatte gelöst. Also einfach mit Hilfe eines Zählers. Bevor ich überhaupt zum Testen des "AddComponent4" Befehls gekommen bin, ist schon ein anderes Problem aufgetaucht: Beim Verknüpfen von den Kettengleidern richtet SW ab und zu die Teile verkehrt herum aus. Dadurch kommt es zu einer Überbestimmung. Die Überbestimmung kann man ja durch den ErrorFlag der addMate3() Funktion erkennen und darauf reagieren. Leider schaffe ich es aber nicht, dass er die andere (also die richtige) Richtung verwendet. So sieht mein Code dazu aus: Code:
'################################################################################################ ' Punkt aus Skizze in Baugruppe_Kettenglied mit Leitkurve verbinden '################################################################################################ ' boolstatus = swModel.Extension.SelectByID2("", "FACE", 2.170130490265, -0.3143101344735, 0.234660132546, False, 0, Nothing, 0) swApp.ActiveDoc.ActiveView.FrameState = 1 ' Ray origin and direction Dim SelParams(7) As Double ' Selection Ray definitions ' Origin X location SelParams(0) = 1 ' Origin Y location SelParams(1) = 0# ' Origin Z location SelParams(2) = 0# ' Direction X component SelParams(3) = 0# ' Direction Y component SelParams(4) = -1# ' Direction Z component SelParams(5) = 1# ' Intersection radius SelParams(6) = 2 retval = swModel.SelectByRay((SelParams), swSelFACES) swModel.SelectTangency boolstatus = swModel.Extension.SelectByID2("Point30@Skizze12@Baugruppe_Kettenglied-" & I & "@Baugruppe_Test1/KetteGussteil-1@Baugruppe_Kettenglied", "EXTSKETCHPOINT", 0, 0, 0, True, 1, Nothing, 0) Set swMate = swModel.AddMate3(swMateType_e.swMateCAMFOLLOWER, swMateAlign_e.swMateAlignANTI_ALIGNED, True, 0, 0, 0, 0, 0, 0, 0, 0, False, longstatus) If (longstatus = swAddMateError_OverDefinedAssembly) Then 'Text Ausgabe MsgBox "Konnte nicht ausgereichtet werden!" swModel.EditUndo 1 swModel.ClearSelection2 True retval = swModel.SelectByRay((SelParams), swSelFACES) swModel.SelectTangency boolstatus = swModel.Extension.SelectByID2("Point30@Skizze12@Baugruppe_Kettenglied-" & I & "@Baugruppe_Test1/KetteGussteil-1@Baugruppe_Kettenglied", "EXTSKETCHPOINT", 0, 0, 0, True, 1, Nothing, 0) Set swMate = swModel.AddMate3(swMateType_e.swMateCAMFOLLOWER, swMateAlign_e.swMateAlignALIGNED, False, 0, 0, 0, 0, 0, 0, 0, 0, False, longstatus) End If 'boolstatus = swModel.EditRebuild3 swModel.ClearSelection2 True '################################################################################################
Ich habe bereits alle möglichen Varianten der "Flip" Flags sowie die Konstanten swMateAlignALIGNED, swMateAlignANTI_ALIGNED, ... durchprobiert, alles ohne Ergebnis. Ich habe daher den Makro mit den Baugruppen hier reingestellt (Test_Kettenaufbau_001.zip - (2MB)). Falls jemand den Makro testen möchte, dann muss man noch darauf achten, dass die drei Verzeichnisse am Anfang anzupassen sind. Code: Const CompName1 As String = "E:\SOLIDWORKS\WORK\Test\Baugruppe_Kettenglied.SLDASM" Const CompName2 As String = "E:\SOLIDWORKS\WORK\Test\Baugruppe_KettenVerbinder.SLDASM" Const CompName3 As String = "E:\SOLIDWORKS\WORK\Test\Baugruppe_Test1.SLDASM"
Danach einfach die Baugruppe_Test1.SLDASM öffnen und den Makro Macro_Kettenaufbau_Test_001.swp ausführen. Nach dem Aufbau des vierten Kettengleides sollte die erste Fehlermeldung erscheinen: "Konnte nicht ausgereichtet werden!" Gruß Zoltan
PS.: So sollte das ganze normalerweise aussehen:
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
nahe Ehrenmitglied
Beiträge: 1747 Registriert: 18.01.2001 arbeite mit: Dell Precision 7750 i7 2,6 GHz 6 Kerne 32GB RAM 512GB SSD NVIDIA Quadro RTX 4000 ------------------------ SWX-2020 SP5.0 EPDM ---------------- Windows 10 ---------------- VB.net VB VBA ein wenig Swift am Mac
|
erstellt am: 07. Nov. 2007 08:30 <-- editieren / zitieren --> Unities abgeben: Nur für Zoltan
Hallo Zoltan das mit dem hochzählen hat einen "Haken", wenn Du nämlich das Makro ausführst, dann z.B.: 3 Teile einfügst, dann manuell die eingefügten Teile löscht, und das Makro wieder ausführst, startet der Zähler des Makros wahrscheinlich wieder bei 1, ein neu eingefügtes Teil bekommt aber die nächste Kennungsnummer also 4. Zu Deinem Problem, ich denke dazu gibt es (meiner Meinung nach) schon einen Ansatz, aber es wäre nett, wenn Du mal Dein Profil vervollständigen würdest und etwas "virtuelle" Anerkennung für die bekommen Tipps ausdrücken würdest ;-) LG Heinz
------------------ Grüße Heinz Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Zoltan Mitglied z
Beiträge: 9 Registriert: 27.03.2005 SolidWorks Premium 2007 SP0.0; P4 3,0GHz; Radeon 9800 XXL;
|
erstellt am: 08. Nov. 2007 09:47 <-- editieren / zitieren --> Unities abgeben:
Hallo Heinz, ich bin sehr gespannt auf Deinen Ansatz. Ich habe weiter Probiert das Makro stabil zum Laufen zu bekommen, jedoch ohne Erfolg.
Meine Diagnose: Das Problem entsteht beim Verbinden des Kettenelementes mit der Leitkurve bzw. Leitebene: Das Kettenelement befindet sich bereits vor dem Verknüpfen mit Leitkurve beihnahe an der späteren Soll-Position (+-1 mm). Dennoch versucht SW den Kettenlement mit einer viel weiter entfernten Fläche(ca. 1000 mm entfernt) zu verknüpfen. Da das Kettenlement bereits mit dem Rest der Kette durch ein Drehgelenk Verknüpft ist, kommt es dabei verständlicherweise zu einem Fehler.
Der Handel auf das AddMate3() erzeugte Verknüpfung SW zeigt nach der Ausführung des Makros immer die Ausrichtungsoption swMateAlignCLOSEST, unabhängig davon ob swMateAlign_ALIGNED, oder swMateAlignANTI_ALIGNED im Makro angegeben wurde. Und obwohl immer swMateAlignCLOSEST da steht, Verknüpft (wie oben beschreiben) SW die Teile mit der viel weiter entfernten Fläche. Nachdem das Kettenelement fehlerhaft aufgebaut wurde, läßt sich in SW die Orientierung jedoch manuell ändern, indem man mit der Maus die entsprechnde Ausrichtungsoption beim Kurventrieb wählt. Nur mit dem Makro geht es nicht. Gruß Zoltan
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
nahe Ehrenmitglied
Beiträge: 1747 Registriert: 18.01.2001 arbeite mit: Dell Precision 7750 i7 2,6 GHz 6 Kerne 32GB RAM 512GB SSD NVIDIA Quadro RTX 4000 ------------------------ SWX-2020 SP5.0 EPDM ---------------- Windows 10 ---------------- VB.net VB VBA ein wenig Swift am Mac
|
erstellt am: 08. Nov. 2007 12:26 <-- editieren / zitieren --> Unities abgeben: Nur für Zoltan
Hallo Zoltan ich hab mal ein Makro geschrieben, dass autom. eine Baugruppe erstellt. Mein Ansatz damals war, dass ich in den Einzelteilen Referenzgeometrien erstellt habe, vor allem Achsen, und einzelne Kanten, Flächen usw. benannt habe, um die Ausrichtung in einer definierten Richtung zu erhalten und einfach darauf zugreifen zu können. Diese Referenzgeometrien und benannten Elemente habe ich dann zum Erstellen der Abhängigkeiten genommen. Weiters halte ich es für gut zuerst die Referenzen zu verknüpfen die die Ausrichtung eindeutig definieren und erst zum Schluss Abhängigkeiten wie, Punkte, tangentialitäten usw. bei denen die Richtung autom. ev. schwierig zu definieren ist. Anbei als Beispiel eine Funktion um eine benannte Kante zu selektieren Public Function SelectComponentEdgeByName(ByVal Comp As SldWorks.Component2, ByVal FaceName As String) As SldWorks.edge Dim Body As Object Dim Face As SldWorks.Face2 Dim edges As Variant Dim edge1 As SldWorks.edge Dim CurFaceName As String Const swSelCOMPONENTS = 20 Set Body = Comp.GetBody() ' Get the Component Body Set Face = Body.GetFirstFace Comp.DeSelect ' Traverse thru all body faces Do While Not Face Is Nothing CurFaceName = assdoc.GetEntityName(Face) edges = Face.GetEdges For i = 0 To Face.GetEdgeCount - 1 Set edge1 = edges(i) If (assdoc.GetEntityName(edge1) = FaceName) Then edge1.Select (0) ' Select the face Set Body = Nothing Set SelectComponentEdgeByName = edge1 Exit Do End If Next Set Face = Face.GetNextFace Loop End Function LG Heinz
------------------ Grüße Heinz Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Zoltan Mitglied z
Beiträge: 9 Registriert: 27.03.2005 SolidWorks Premium 2007 SP0.0; P4 3,0GHz; Radeon 9800 XXL;
|
erstellt am: 09. Nov. 2007 09:47 <-- editieren / zitieren --> Unities abgeben:
Es hat nun geklappt! Dein Beispiel mit der Auswahl der Fläche hat mich auf die Idee gebracht, wenn eine Überbestimmung auftritt die Auswahl der Leitebenen des Kurvengelenks zu verändern. Bisher wird mit Hilfe der Funktion .SelectByRay(SelParams, swSelFACES) ein Flächenstück der Leitebenen ausgewählt. Anschließend wählt .SelectTangency die restlichen Flächenstücke aus der Leitebene aus. Danach folgt die Auswahl des Punktes auf dem Kettengleid. Code:
' Ray origin and direction Dim SelParams(7) As Double ' Selection Ray definitions ' Origin X location SelParams(0) = 1 ' Origin Y location SelParams(1) = 0# ' Origin Z location SelParams(2) = 0# ' Direction X component SelParams(3) = 0# ' Direction Y component SelParams(4) = -1# ' Direction Z component SelParams(5) = 1# ' Intersection radius SelParams(6) = 2 retval = swModel.SelectByRay((SelParams), swSelFACES) swModel.SelectTangency boolstatus = swModel.Extension.SelectByID2("Point30@Skizze12@Baugruppe_Kettenglied-" & I & "@Baugruppe_Test1/KetteGussteil-1@Baugruppe_Kettenglied", "EXTSKETCHPOINT", 0, 0, 0, True, 1, Nothing, 0)
Ich habe mir auf die schnelle so beholfen, dass für die Funktion .SelectByRay(SelParams, swSelFACES) die Strahlrichtung ändere, und dadurch ein anderes erstes Flächenstück am Anfang auswähle.
Code:
If (longstatus = swAddMateError_OverDefinedAssembly) Then 'Ray origin and direction Dim SelParams(7) As Double
' Selection Ray definitions ' Origin X location SelParams(0) = 1 ' Origin Y location SelParams(1) = 0# ' Origin Z location SelParams(2) = 0# ' Direction X component SelParams(3) = 0# ' Direction Y component SelParams(4) = SelParams(4)*-1# ' Direction Z component SelParams(5) = 1# ' Intersection radius SelParams(6) = 2 retval = swModel.SelectByRay((SelParams), swSelFACES) swModel.SelectTangency boolstatus = swModel.Extension.SelectByID2("Point30@Skizze12@Baugruppe_Kettenglied-" & I & "@Baugruppe_Test1/KetteGussteil-1@Baugruppe_Kettenglied", "EXTSKETCHPOINT", 0, 0, 0, True, 1, Nothing, 0) ....... End If
Gruß Zoltan
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Jan Mitglied Dipl.-Ing.
Beiträge: 1270 Registriert: 23.12.2000 Dienstl. Lenovo 64GB, nVidia, Win10, SW 2019, 2021 u. 2022 Priv. Dell M7740 16GB, nVidia , Win10, SW 2012, SW 2021 und SW 2022 Prem.
|
erstellt am: 09. Nov. 2007 18:12 <-- editieren / zitieren --> Unities abgeben: Nur für Zoltan
|
Zoltan Mitglied z
Beiträge: 9 Registriert: 27.03.2005 SolidWorks Premium 2007 SP0.0; P4 3,0GHz; Radeon 9800 XXL;
|
erstellt am: 11. Nov. 2007 21:35 <-- editieren / zitieren --> Unities abgeben:
|
GWS Ehrenmitglied V.I.P. h.c. Konstrukteur Sondermaschinenbau
Beiträge: 2401 Registriert: 23.07.2001 Nach drei Jahren Inventor wieder zurück zu SolidWorks: SWX 23 SP4, PDM Professionell.
|
erstellt am: 11. Nov. 2007 23:19 <-- editieren / zitieren --> Unities abgeben: Nur für Zoltan
Hallo zoltan ! Schade, arcor mag das nicht, wenn sich zu viele Leute dein File runterziehen... Schade, hätte mich interessiert (und wenns nur um nen Benchmark ist *grins*) Grüße Günter [edit:] Der Link funktioniert wieder. Ich werd mich heute Abend hinhocken und das makro ausprobieren. DANKE ------------------ Wie man Fragen richtig stellt [Diese Nachricht wurde von GWS am 12. Nov. 2007 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|