Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  SolidWorks
  API Material auslesen und stutzen

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
  
Engineering in der Cloud: PLM in der Cloud für effektive Prozesse
Autor Thema:  API Material auslesen und stutzen (1578 mal gelesen)
Press play on tape
Ehrenmitglied
Konstrukteur und sonst nix!


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

Beiträge: 1945
Registriert: 30.04.2007

Creo Elements Direct Modeling 17

erstellt am: 19. Aug. 2009 04:01    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,

ich habe an Stefans Schriftfeldmakro herumgebastelt, und es funktioniert aber ich glaube es ist etwas unvorteilhaft. Das ganze habe ich über die Hilfe in anderer Form gefunden und in diese Prozedur eingefügt. Die folgende Prozedur ist in einer Userform, mein flickwerkmurks steht dann im Zitat, ist in dieser Prozedur enthalten. Ich habe halt eine Textfeld als variable missbraucht und doppelt verwendet ich glaub das ist nicht sogut.

Wie kann ich das besser machen?

Code:
Sub berSfStandardwerteAusfüllen()
    ' Diese Funktion ist nur zur Demonstration gedacht und füllt die
    ' EDIT-Felder einfach mit ein paar Defaultwerten. Hier kann
    ' natürlich richtig gezaubert werden. Als Beispiel wird mal einfach nur
    ' je nach Dokumentart was anderes eingetragen.
    '
    ' This function is only for demonstration. The only job is to fill the
    ' edit-widget with some default values.
   
    Dim swApp As Object
    Dim Model As Object
 
    Set swApp = CreateObject("SldWorks.Application")
    swApp.Visible = True      'falls nicht sichtbar
    Set Model = swApp.ActiveDoc
   
    If Model Is Nothing Then
        Call MsgBox("Keine Datei geöffnet", vbOKOnly, "Information")
        Exit Sub
    End If
    '
    ' Beispiel: Unterscheiden nach Dokumentenart
    ' Example:  do something different for various document types
    If (Model.gettype() = swDocDRAWING) Then
        ' Benennung = Dokumenttitel (Name des Files in Solidworks)
        '            documet title (as shown in the Titlebar in Solidworks)
        txtSfTitel.Text = Model.GetTitle()
        txtSfSachnummer.Text = "Drawing DocName"
    Else
        txtSfTitel.Text = "no drawing"
        txtSfSachnummer.Text = "Model (Part or Assembly)"
       
    End If
     
    Dim test As Variant
     
    txtSfWerkstoff = Model.MaterialIdName
    test = Split(txtSfWerkstoff, "|")
    txtSfWerkstoff = test(1)
   
    txtSfTechnischeReferenz.Text = "Heiko D."
    txtSfErstelltDurch.Text = "Heiko D."
    txtSfGenehmigtVon.Text = "Heiko D."
    cmbSfAenderungsindex.Text = "neu"
    txtSfDatum.Text = Date
 
End Sub

Zitat:
     
    Dim test As Variant
     
    txtSfWerkstoff = Model.MaterialIdName
    test = Split(txtSfWerkstoff, "|")
    txtSfWerkstoff = test(1)

gruß Heiko

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Piet
Mitglied
Konstruktionsleiter & Konstrukteur


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

Beiträge: 661
Registriert: 20.11.2001

SWx 2021

erstellt am: 19. Aug. 2009 12:33    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 Press play on tape 10 Unities + Antwort hilfreich

Mit txtSfWerkstoff = test(1) greifst du auf ein Array zu, test ist aber nicht als solches definiert. Also ohne das "(1)".

MaterialIDName ist ein Attribut des Teils, nicht der Zeichnung. Um darauf zugreifen zu können, musst du erst das von der Zeichnung referenzierte Teil aktivieren.

Mir ist nicht klar, was du mit dem Split-Command vorhast. Ich hab mal auf die Schnelle eine Routine geschrieben, welche den Materialnamen vom Teil holt und den Namen der Bibliothek darin entfernt.

Gruß,
Piet

Dim swApp As Object
Dim Model As Object
Dim oldname As String
Dim nErrors As Long
Dim reference As Object

Sub main()

Set swApp = CreateObject("SldWorks.Application")
swApp.Visible = True      'falls nicht sichtbar
Set Model = swApp.ActiveDoc

If Model Is Nothing Then
    Call MsgBox("Keine Datei geöffnet", vbOKOnly, "Information")
    Exit Sub
End If

Call getreftype
Dim test As Variant
Dim txtsfwerkstoff As String
Dim pos As Integer

    txtsfwerkstoff = reference.MaterialIdName
    pos = InStrRev(txtsfwerkstoff, "|")
    txtsfwerkstoff = Right(txtsfwerkstoff, Len(txtsfwerkstoff) - pos)          ' Materialname ohne Bibliotheksname

    ' Zeichnung wieder zum aktuellen Dokument machen / activates drawing again
    Set Model = swApp.ActivateDoc2(oldname, True, nErrors)

End Sub
Sub getreftype()                            ' ermittelt das in einer Zeichnung refenzierte Modell / gets the referenced model in a drawing
    Dim view As Object                      ' und dessen Namen incl. Pfad / and it's filename and path
    Dim bRetval As Boolean
    Dim nWarnings As Long
    Dim retval As Object
    Dim nDocType As Long
    Dim refname As String
    Dim RefModelName As String
    Dim reftype As Long

    ' Hier wird geprüft, ob das aktive Dokument eine Zeichnung ist (GetType=3)
    ' Wenn Model eine Zeichnung ist, wird das von der Zeichnung referenzierte
    ' Dokument aktiviert
    If Model.GetType = swDocDRAWING Then
        oldname = Model.GetPathName()      ' Pfadnamen auslesen / get path name
        Set retval = Model.GetFirstView    ' FirstView ist das Blatt
        Set view = retval.GetNextView      ' Dies ist die erste Ansicht
       
        If view Is Nothing Then
            Exit Sub
        End If
        ' Name des referenzierten Modells holen / gets referenced model's name
        RefModelName = view.GetReferencedModelName
   
        ' Typ des referenzierten Docs anhand der Endung erkennen
        If InStr(LCase(RefModelName), "sldprt") > 0 Then    ' LCase wandelt string in Kleinbuchstaben um
            nDocType = swDocPART                            ' InStr gibt die Position des Suchtextes zurück
        ElseIf InStr(LCase(RefModelName), "sldasm") > 0 Then
            nDocType = swDocASSEMBLY
        ElseIf InStr(LCase(RefModelName), "slddrw") > 0 Then
            nDocType = swDocDRAWING
        Else
            ' Probably not a SolidWorks file...
            nDocType = swDocNONE
            MsgBox ("Referenzdatei kann nicht geöffnet werden")
            Exit Sub
        End If

        ' Referenziertes Modell zum aktiven Dokument machen / activates referenced model
        Set reference = swApp.OpenDoc6(RefModelName, nDocType, swOpenDocOptions_Silent, "", nErrors, nWarnings)
        refname = reference.GetPathName()
        reftype = reference.GetType
        If (reftype < 1 Or reftype > 2) Then
            MsgBox ("Kein Referenztyp gefunden")
        End If
    End If

End Sub

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Piet
Mitglied
Konstruktionsleiter & Konstrukteur


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

Beiträge: 661
Registriert: 20.11.2001

SWx 2021

erstellt am: 20. Aug. 2009 08:34    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 Press play on tape 10 Unities + Antwort hilfreich

Wie ich inzwischen gelernt hab, gibt der Split-Befehl ein Array zurück, daher ist dein text(1) doch richtig.

Piet

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP



Konstrukteur / Technischer Zeichner (m/w/d)

Wir sind ein international tätiges Unternehmen im Bereich der Elektronenstrahltechnologie mit Standorten in Deutschland, Ungarn, China und den USA. In unseren Werken werden Serien- sowie auch Sonder­maschinen zum Schweißen und Behandeln von Oberflächen für die Automobil-, Luft- und Raumfahrttechnik hergestellt.

  • Tauchen Sie mit uns gemeinsam in die hoch komplexe Welt der Anlagen- und Sondermaschinen ein....
Anzeige ansehenTechnischer Zeichner, Bauzeichner
Press play on tape
Ehrenmitglied
Konstrukteur und sonst nix!


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

Beiträge: 1945
Registriert: 30.04.2007

Creo Elements Direct Modeling 17

erstellt am: 20. Aug. 2009 12: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

Hi Piet,

erstmal danke für die Antwort, ich hatte gestern schon eine Antwort geschrieben aber die hat das Netz verschlungen .

Also der Split Befehl trennt mir den Materialnamen aus dem Model.MaterialIdName heraus. Also das was Du mit:

Code:
pos = InStrRev(txtsfwerkstoff, "|")
txtsfwerkstoff = Right(txtsfwerkstoff, Len(txtsfwerkstoff) - pos)

gemacht hast.

Was ich noch sagen wollte, ich habe das ganze nicht für die Zeichnung gemacht, sondern für Teil,Baugruppe. Das schriftfeld wird dann über die Modeleigenschaften des Teils, Baugruppe gefüllt. Hab sogar noch etwas hinbekommen daß geprüft wird ob Zeichnung oder Model und bei Zeichnung beendet.

Code:
Private Sub UserForm_Initialize()
    ' als Beispiel die Combobox mit ein paar Standardwerten ausfüllen
    ' as example fill combobox for the engineer with some values
    cmbSfAenderungsindex.AddItem "neu"
    cmbSfAenderungsindex.AddItem "A"
    cmbSfAenderungsindex.AddItem "B"
    ' zu Beginn erstmal die Werte auslesen, damit die Felder gefüllt werden
    ' just at the very beginning read in the document values
   
    Dim swApp As Object
    Dim Model As Object
    Set swApp = CreateObject("SldWorks.Application")
    swApp.Visible = True
    Set Model = swApp.ActiveDoc
   
    If Model Is Nothing Then
        Call MsgBox("Keine Datei geöffnet", vbOKOnly, "Information")
        Exit Sub
    End If
   
    If (Model.gettype() = swDocDRAWING) Then
       
        Call MsgBox("Schriftfeld Makro geht nur in Teilen und Baugruppen, Makro wird beendet", vbOKOnly, "Information")
       
        End
       
    Else
       
        berSfAuslesen
             
    End If
   
End Sub

das scheint mir sogar ausreichend in meiner variante. Es gibt bei mir jetzt aber noch zwei Probleme, das eine ist daß ich ein Textfeld der USer Form als variable nehme, da ich nicht in der lage war eine variable zu definieren , und das ander ist, daß ich wenn ein Teil kein Material zugewiesen bekommen hat einen Fehler bekomme, ich nehme an es liegt am fehlen des Trennzeichens (Split Befehl) ich muß also vorher noch abprüfen ob ein Material definiert ist aber wie. Hier nochmal die Prozedur wie sie im moment ist, was vielleicht noch wichtig sein könnte ist, das alles in der User Form steht.

Code:
Sub berSfStandardwerteAusfüllen()
    ' Diese Funktion ist nur zur Demonstration gedacht und füllt die
    ' EDIT-Felder einfach mit ein paar Defaultwerten. Hier kann
    ' natürlich richtig gezaubert werden. Als Beispiel wird mal einfach nur
    ' je nach Dokumentart was anderes eingetragen.
    '
    ' This function is only for demonstration. The only job is to fill the
    ' edit-widget with some default values.
   
    Dim swApp As Object
    Dim Model As Object
 
    Set swApp = CreateObject("SldWorks.Application")
    swApp.Visible = True      'falls nicht sichtbar
    Set Model = swApp.ActiveDoc
   
    If Model Is Nothing Then
        Call MsgBox("Keine Datei geöffnet", vbOKOnly, "Information")
        Exit Sub
    End If
    '
    ' Beispiel: Unterscheiden nach Dokumentenart
    ' Example:  do something different for various document types
    If (Model.gettype() = swDocPART) Then
       
        txtSfDokumentart.Text = "Fertigungszeichnung"
    Else
        txtSfDokumentart.Text = "Zusammenbauzeichnung"
             
    End If
     
    If (Model.gettype() = swDocPART) Then
   
    Dim Ergebnis As Variant
         
    txtSfWerkstoff = Model.MaterialIdName  'txtSfWerkstoff ist ein Textfeld in der User Form
   
    'warum kann ich die txtSfWerkstoff als variable nutzen, und warum kann ich keine definieren
    'hatte versucht: DIM variable As String, da kommt immer ein Fehler

     
    Ergebnis = Split(txtSfWerkstoff, "|")
    txtSfWerkstoff = Ergebnis(1)
   
    Else
    txtSfWerkstoff.Text = ""
    End If
   
   
    txtSfTechnischeReferenz.Text = "Heiko"
    txtSfErstelltDurch.Text = "Heiko"
    txtSfGenehmigtVon.Text = "Heiko"
    cmbSfAenderungsindex.Text = "neu"
    txtSfSprache.Text = "de"
    txtSfVerantwAbtl.Text = "SpaceInvadors"
    txtSfDatum.Text = Date
 
End Sub

Ich habe noch nicht geprüft ob bei deiner varinte des trennens des aterialnamens kein Fehler kommt. Auch den rest noch nicht, da mir gerade die Zeit davonläuft (morgen gehts nach Schweden) wenn ich zurück bin teste ich es mal ob es damit geht bzw. ob ich damit klar komme mit meinen Kenntnissen (ja da fehlts natürlich ordentlich)

gruß Heiko

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