Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  SolidWorks
  Neues Einzelteil in Unterbaugruppe einfügen per Makro.

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
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



Sehen Sie sich das Profil von bk.sc an!   Senden Sie eine Private Message an bk.sc  Schreiben Sie einen Gästebucheintrag für bk.sc

Beiträge: 2795
Registriert: 18.07.2012

-Solid Works 2019 SP5
-Pro Engineer WF 3

erstellt am: 06. Aug. 2012 14:38    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities


laufzeitfehler.PNG

 
Hallo zusammen,

habe mir folgenden Code zusammengebastelt.

Code:
Option Explicit

Dim 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)



Sehen Sie sich das Profil von StefanBerlitz an!   Senden Sie eine Private Message an StefanBerlitz  Schreiben Sie einen Gästebucheintrag für StefanBerlitz

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für bk.sc 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von bk.sc an!   Senden Sie eine Private Message an bk.sc  Schreiben Sie einen Gästebucheintrag für bk.sc

Beiträge: 2795
Registriert: 18.07.2012

-Solid Works 2019 SP5
-Pro Engineer WF 3

erstellt am: 06. Aug. 2012 18:10    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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)



Sehen Sie sich das Profil von StefanBerlitz an!   Senden Sie eine Private Message an StefanBerlitz  Schreiben Sie einen Gästebucheintrag für StefanBerlitz

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für bk.sc 10 Unities + Antwort hilfreich

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)



Sehen Sie sich das Profil von StefanBerlitz an!   Senden Sie eine Private Message an StefanBerlitz  Schreiben Sie einen Gästebucheintrag für StefanBerlitz

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für bk.sc 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von bk.sc an!   Senden Sie eine Private Message an bk.sc  Schreiben Sie einen Gästebucheintrag für bk.sc

Beiträge: 2795
Registriert: 18.07.2012

-Solid Works 2019 SP5
-Pro Engineer WF 3

erstellt am: 07. Aug. 2012 14:15    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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)



Sehen Sie sich das Profil von StefanBerlitz an!   Senden Sie eine Private Message an StefanBerlitz  Schreiben Sie einen Gästebucheintrag für StefanBerlitz

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für bk.sc 10 Unities + Antwort hilfreich


24421_objekttyp-bei-getselectedobject.png

 
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



Sehen Sie sich das Profil von bk.sc an!   Senden Sie eine Private Message an bk.sc  Schreiben Sie einen Gästebucheintrag für bk.sc

Beiträge: 2795
Registriert: 18.07.2012

-Solid Works 2019 SP5
-Pro Engineer WF 3

erstellt am: 07. Aug. 2012 15:29    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2024 CAD.de | Impressum | Datenschutz