| | |  | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS |
|
Autor
|
Thema: Neues Einzelteil in Unterbaugruppe einfügen per Makro. (2129 mal gelesen)
|
bk.sc Ehrenmitglied V.I.P. h.c. Konstrukteur Sondermaschinenbau

 Beiträge: 2795 Registriert: 18.07.2012 -Solid Works 2019 SP5 -Pro Engineer WF 3
|
erstellt am: 06. Aug. 2012 14:38 <-- editieren / zitieren --> Unities abgeben:         
Hallo zusammen, habe mir folgenden Code zusammengebastelt. Code: Option ExplicitDim swApp As SldWorks.SldWorks Dim swModel As SldWorks.ModelDoc2 Dim swAssy As SldWorks.AssemblyDoc Dim sFullpath As String Dim sFilename As String Dim sDirectory As String Dim sExtension As String Dim sFilenameWithoutExtension As String Dim sNewPartName As String 'Neuer Dateiname Dim sNewPartNameChecked As String 'Neuer Dateiname unzulässige Zeichen entfernt Dim sChecked As String 'Prüfvariable Dim sAssyNameActiv As String 'Unterbaugruppenname mit Trennzeichen "^" Dim sAssyNameActivUnderline As String 'Unterbaugruppenname mit Trennzeichen "_" Dim sAssyNameActivWithoutCount As String 'Unterbaugruppenname ohne Zähler ("-1") Dim sPlaneNameInsertComponent As String 'Einfügebene für die Komponente Dim sPlaneNameInsertSketch As String 'Einfügebene für die Skizze Dim i As Integer Dim boolstatus As Boolean Dim longstatus As Long Dim longwarnings As Long Sub main() Set swApp = Application.SldWorks Set swModel = swApp.ActiveDoc Set swAssy = swModel sFullpath = swModel.GetPathName 'Prüfen ob Datei schon gespeichert wurde If sFullpath = "" Then boolstatus = MsgBox("Bitte Baugruppe erst speichern", 49, "Speicheraufforderung") Exit Sub Else 'Dateipfad zerlegen in.... 'Verzeichnis sDirectory = Left(sFullpath, InStrRev(sFullpath, "\") - 1) 'Dateiname mit Extension sFilename = Mid(sFullpath, InStrRev(sFullpath, "\") + 1, Len(sFullpath)) 'Extension (Dateityp) sExtension = Right(sFullpath, Len(sFullpath) - InStrRev(sFullpath, ".")) 'Dateiname ohne Extension sFilenameWithoutExtension = Replace(sFilename, "." & sExtension, "") 'Abfrage des neuen Einzelteilnamens (Z.-Nr. zB. 25-25897-1) sNewPartName = InputBox("Bitte neue Zeichnungsnummer eingeben", "Eingabeaufforderung") 'verbotene Zeichen \ / : * ? " < > | + , . löschen sChecked = "" For i = 1 To Len(sNewPartName) Select Case Mid(sNewPartName, i, 1) Case "\" Case """" Case "/" Case ":" Case "*" Case "?" Case "<" Case ">" Case "|" Case "+" Case "," Case "." Case Else sChecked = sChecked + Mid(sNewPartName, i, 1) End Select Next i sNewPartNameChecked = sChecked 'Name der Aktiven Baugruppe bzw. Unterbaugruppe ermitteln sAssyNameActiv = swAssy.GetEditTargetComponent.Name2 sAssyNameActivUnderline = Replace(sAssyNameActiv, "^", "_") sAssyNameActivWithoutCount = Replace(sAssyNameActiv, "-1", "") 'Ebenennamen erzeugen sPlaneNameInsertComponent = "Ebene vorne@" & sAssyNameActiv & "@" & sFilenameWithoutExtension sPlaneNameInsertSketch = "Ebene oben@" & sAssyNameActiv & "@" & sFilenameWithoutExtension & "/" & sNewPartNameChecked & "^" & sAssyNameActivUnderline & "@" & sAssyNameActivWithoutCount 'Neues Teil einfügen boolstatus = swModel.Extension.SelectByID2(sPlaneNameInsertComponent, "PLANE", 0, 0, 0, False, 0, Nothing, 0) Dim mySelection As Object longstatus = swModel.InsertNewPart2(sDirectory & "\" & sNewPartNameChecked & ".SLDPRT", mySelection) swModel.SketchManager.InsertSketch True boolstatus = swModel.Extension.SelectByID2(sPlaneNameInsertSketch, "PLANE", 0, 0, 0, False, 0, Nothing, 0) swModel.SketchManager.InsertSketch True swModel.ShowNamedView2 "*Oben", 5 End If End Sub
Nun habe ich folgendes Problem, dass mir nach folgender Zeile Code: longstatus = swModel.InsertNewPart2(sDirectory & "\" & sNewPartNameChecked & ".SLDPRT", mySelection)
entwerder SWX abstürzt, der Debugger startet mit der Fehlermeldung siehe Bild oder eben nichts passiert und das Makro einfach Problemlos durchläuft. In allen 3 Fällen wird auch ein Einzelteil erzeugt und im Pfad des Bauteiles abgespeichert. An was könnte dies liegen? Randnotizen: Es handelt sich um eine virtuelle Unterbaugruppe in der das Makro gesartet wird. Die Funktion "Keine externe Referenzen" ist aktiviert. Danke im voraus und Gruß Bernd ------------------ --- Man muß nicht alles wissen, man muß nur wissen wo es steht --- Staatlich anerkannte Deutschniete  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: 06. Aug. 2012 15:45 <-- editieren / zitieren --> Unities abgeben:          Nur für bk.sc
Hallo Bernd, wenn ich die Bescrheibung in der API Hilfe von AssemblyDoc::InsertNewPart2 richtig verstehe gibst du als zweiten Parameter ja die Fläche doer Referenzebene mit, auf der die neue Komponente platziert werden soll. In deinem Code ist dies das Objekt "mySelection", was du aber direkt in der Zeile davor erst deklarierst und überhaupt nicht belegst. Dadurch übergibst du dem Befehl vermutlich einen Zeiger auf ein Objekt, was gar nicht da ist und hast vielleicht nur manchmal einfach Glück, dass da was drinsteht, was (halbwegs) passt. Du selektierst ja kurz vorher die Referenzebene, ich würde mal versuchen mit "Set mySelection = SelectionManager.GetSelectedObjectType3(1,0)" die Selektion vorzubelegen. Und dann steht noch irgendwas in den Bemerkungen davon, dass man IFeature::GetSpecificFeature2 vorher aufrufen soll, um eine eindeutige Referenzzu bekommen. Vielleicht hilft das schon mal weiter, ich hab es alelrdings jetzt nicht probiert. Ciao, Stefan ------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bk.sc Ehrenmitglied V.I.P. h.c. Konstrukteur Sondermaschinenbau

 Beiträge: 2795 Registriert: 18.07.2012 -Solid Works 2019 SP5 -Pro Engineer WF 3
|
erstellt am: 06. Aug. 2012 18:10 <-- editieren / zitieren --> Unities abgeben:         
Hallo Stefan, danke für den Tip, hab geschaut und in "mySelection" stand wirklich "Nothing" daher hat er wahrscheinlich wie beim klick ins leere die Urspünge und Ebenen übereinander gelegt. Nun habe ich Code: Set mySelection = swSelMgr.GetSelectedObject6(1, -1) If Not swSelMgr.GetSelectedObjectType3(1, -1) = swSelDATUMPLANES Then longstatus = MsgBox("keine Ebene selectiert", vbOKOnly) End If
ergänzt um zu prüfen ob auch eine Ebene selectiert ist, da keine MsgBox erscheint gehe ich nun davon aus das dies der Fall ist. Nur wird mir jetzt kein Teil mehr eingefügt . Vielleicht fällt ja jemandem spontan irgendetwas auf, wenn nicht vielleicht hab ich ja noch einen Geistesblitz im jetzt wohl verdientem Feierabend . Danke nochmal und Gruß Bernd ------------------ --- Man muß nicht alles wissen, man muß nur wissen wo es steht --- Staatlich anerkannte Deutschniete  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: 07. Aug. 2012 07:48 <-- editieren / zitieren --> Unities abgeben:          Nur für bk.sc
Hallo Bernd, wenn jetzt schon mal keine Abstürze mehr stattfinden ist doch schon was gewonnen  Was bekommst du denn als Rückgabewert beim InsertNewPart2 zurück? Da gibt es nicht einfach nur true/false sondern eine ganze Latte an Rückgabewerten, siehe swInsertNewPartErrorCode_e. Im Moment wertest du das nicht aus, aber vielleicht gibt dir das einen Hinweis. Ciao, Stefan ------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de 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: 07. Aug. 2012 08:17 <-- editieren / zitieren --> Unities abgeben:          Nur für bk.sc
Hallo nochmal, ich hab das mal bei mir versucht, es klappt, wenn ich die folgenden Ergänzungen mit reinnehme: also zum einen den Selectionsmanager auch deklarieren (das hast du aber vermutlich ja gemacht), zum anderen wie in der API Hilfe beschrieben für das Objekt der Referenzebene per GetSpecificFeature2 eben das spezifische Ebenenobjekt holen. So klappt es bei mir, ohne das spezifische Feature bekamn ich beim Insert einen Rückgabewert von 6 (also swInsertNewPartError_FilePathEmpty + swInsertNewPartError_FolderDoesNotExist). Code: [...] Dim swSelMgr As SldWorks.SelectionMgr Sub main() Set swApp = Application.SldWorks Set swModel = swApp.ActiveDoc Set swAssy = swModel Set swSelMgr = swModel.SelectionManager [...] 'Neues Teil einfügen boolstatus = swModel.Extension.SelectByID2(sPlaneNameInsertComponent, "PLANE", 0, 0, 0, False, 0, Nothing, 0) Dim mySelection As Object Dim swPlane As Object Set mySelection = swSelMgr.GetSelectedObject6(1, -1) If Not swSelMgr.GetSelectedObjectType3(1, -1) = swSelDATUMPLANES Then longstatus = MsgBox("keine Ebene selectiert", vbOKOnly) End If Set swPlane = mySelection.GetSpecificFeature2 longstatus = swModel.InsertNewPart2(sDirectory & "\" & sNewPartNameChecked & ".SLDPRT", swPlane) Debug.Print longstatus swModel.SketchManager.InsertSketch True boolstatus = swModel.Extension.SelectByID2(sPlaneNameInsertSketch, "PLANE", 0, 0, 0, False, 0, Nothing, 0) swModel.SketchManager.InsertSketch True swModel.ShowNamedView2 "*Oben", 5 End If End Sub
So klappt es bei mir jetzt mit dem einfügen des neuen Teils.HTH, Stefan ------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bk.sc Ehrenmitglied V.I.P. h.c. Konstrukteur Sondermaschinenbau

 Beiträge: 2795 Registriert: 18.07.2012 -Solid Works 2019 SP5 -Pro Engineer WF 3
|
erstellt am: 07. Aug. 2012 14:15 <-- editieren / zitieren --> Unities abgeben:         
Hallo Stefan, vielen dank, hatte es mit der GetSpecificFeature2 Methode zwar versucht, nur wenn mann es falsch anwendet bring es halt nichts . Nun nur noch zwei Verständnissfragen. Die GetSelectedObject6 Methode gibt mir doch das selectierte Objekt zurück unabhängig davon welche art von Object es ist? Was macht die GetSpecificFeature2 Methode nun daraus? Gefühlsmässig würde ich tippen das sie die Information hinzufügt um welches spezifische Object es sich genau handelt bzw. ob es ein spezifiziertes Object dazu gibt, also in meinem Fall ob es sich auch um eine Ebene bzw. Planare Fläche handelt. Danke nochmal und Gruß Bernd ------------------ --- Man muß nicht alles wissen, man muß nur wissen wo es steht --- Staatlich anerkannte Deutschniete  [Diese Nachricht wurde von bk.sc am 07. Aug. 2012 editiert.] [Diese Nachricht wurde von bk.sc am 07. Aug. 2012 editiert.] 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: 07. Aug. 2012 15:04 <-- editieren / zitieren --> Unities abgeben:          Nur für bk.sc
Hallo Bernd, Zitat: Original erstellt von bk.sc: Die GetSelectedObject6 Methode gibt mir doch das selectierte Objekt zurück unabhängig davon welche art von Object es ist? Was macht die GetSpecificFeature2 Methode nun daraus?
Jein, das GetSelectedObject6 gibt dir zwar das selektierte Objekt zurück, dass kann aber je nach Selektionskriterium ein spezifisches oder ein mehr allgemeines Objekt sein. Was du genau zurückbekommst findest du in der API Hilfe. Bei GetSelectedObject6 steht unter Remarks (die man unbedingt immer bei allen API Befehlen lesen sollte), dass du ein Objekt zurückbekommst, wie es in der swSelectType_e Enumeration festgelegt ist. Einen kurzen Klick darauf und runterscrollen zu den remarks ( ! ) zeigt, dass bei deinem Selektionskriterium "PLANE" das GetSelectedObject6 ein Objekt vom allgemeinen Typ Feature zurückgibt; bei der Bemerkung der Bemerkung steht dann wieder der Hinweis auf GetSpecificFeature2, um das spezifische Objekt zu bekommen, was eben für das InsertNewPart2 gebraucht wird. Ich hoffe, ich hab das nicht zu hinterrum erklärt und du verstehst, wie es gedacht ist  Ciao, Stefan PS: die API Hilfe ist dein Freund und eine wirklich gute Infoquelle, wenn man sich erst mal an den Aufbau gewöhnt hat ... ------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bk.sc Ehrenmitglied V.I.P. h.c. Konstrukteur Sondermaschinenbau

 Beiträge: 2795 Registriert: 18.07.2012 -Solid Works 2019 SP5 -Pro Engineer WF 3
|
erstellt am: 07. Aug. 2012 15:29 <-- editieren / zitieren --> Unities abgeben:         
Hallo nochmal Stefan, achso, jetzt hab ich es auch verstanden und wieder was gelernt . Ich nutze die API und VB-Hilfe zu genüge, sonst würde ich wohl nicht mal einen Strich zu stande bringen und natürlich lese ich dort dann auch die Remarks oder schau mir die Beispiele an, nur ob ich diese dann auch verstehe steht auf einem anderen Blatt . Leider ist die API-Hilfe ja auch noch auf Englisch was das Verstehen für mich leider nicht einfacher macht  Danke jedenfalls nochmals für deine Mühen  Gruß Bernd PS: Wieder einen zufriedener Kunde bedient ------------------ --- Man muß nicht alles wissen, man muß nur wissen wo es steht --- Staatlich anerkannte Deutschniete  [Diese Nachricht wurde von bk.sc am 07. Aug. 2012 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
 |