Öffnen und Aktualisieren der Teilefamilie über ein Makro

Hallo

Ich habe ein Makro, das eine Dimension erfordert. Anschließend möchte ich meine Teilefamilie automatisch öffnen und die Werte mit dieser Bemaßung aktualisieren.

Wüssten Sie , wie Sie eine Teilefamilie öffnen und den Inhalt einer Zelle mit einem Wert ändern können?

Vielen Dank für Ihr Feedback

1 „Gefällt mir“

Hallo

Mit diesen beiden Links zur API-Hilfe finden Sie meiner Meinung nach die Lösung.

http://help.solidworks.com/2020/english/api/sldworksapi/get_or_set_whether_edits_update_design_table_example_vb.htm

http://help.solidworks.com/2020/english/api/sldworksapi/get_design_table_example_vb.htm

Über den zweiten Link müssen Sie nur einen Befehl wie swDesTable.SetEntryValue hinzufügen, der auf die zu ändernde Spalte und Zeile abzielt.

1 „Gefällt mir“

Hallo Cyril

Vielen Dank. Makro 1 eignet sich hervorragend, um zu überprüfen, ob die Komponentenfamilie vorhanden ist.

Ich habe den Code aus Makro 2 verwendet, um die Raumfamilie zu öffnen. Die Excell-Datei  öffnet sich gut, die angegebenen Werte sind korrekt, aber das 3D wird nicht aktualisiert. Sie wird erneut aktualisiert, wenn ich die Teilefamilie erneut öffne.

 

Hier ist der Code von Makro 2, den ich angegeben habe:

 

Set swDesTable = swModel.GetDesignTable
bRet = swDesTable.Attach
Debug.Assert bRet
swDesTable.Detach
Teil.ForceRebuild

Ich gebe zu, dass ich nicht wirklich verstehe, wozu diese Zeilen gut sind... Wenn du es weißt, bin ich an den Infos interessiert

Können Sie mir sagen, wie man die Rekonstruktion erzwingen kann, ohne in der Teilefamilie wieder auf das Handwerk zurückgreifen zu müssen?

Ein großes Dankeschön im Voraus

Hallo

In dem Codeausschnitt, den Sie geben, erhalten Sie die Tabelle des Objekts "swModel", aber Sie bitten um eine Rekonstruktion des Objekts "Part", versuchen Sie, indem Sie "swModel.ForceRebuild" anstelle von "Part.ForceRebuild" einfügen.

Herzliche Grüße

1 „Gefällt mir“

Hallo

Für swDesTable.Detach gebe ich zu, dass ich nicht genau weiß, wofür es ist, aber in der Hilfe: Trennen Sie die Designtabelle von der Microsoft Excel-Tabelle.

Im Falle der gewünschten Verwendung halte ich das nicht für notwendig.

swDesTable.Attach hingegen wird verwendet, um die Tabelle zu aktivieren.

Debug.assert ist ein bedingter Haltepunkt, wenn ich keinen Fehler mache, wenn der boolesche Bret falsch ist, stoppt das Makro in dieser Zeile (im Grunde, wenn die Tabelle nicht geöffnet wird).

Um die Vorlage zu aktualisieren, müssen Sie swDesTable.UpdateTable 2, True verwenden .

Weitere Informationen zur Methode: 

IDesignTable-Schnittstellenelemente - 2020 - SOLIDWORKS API-Hilfe

swDesignTableUpdateOptions_e Aufzählung - 2020 - SOLIDWORKS API-Hilfe

1 „Gefällt mir“

Vielen Dank an euch beide für eure Antworten. Es funktioniert. Ich habe immer noch die excell-Anwendung (ich vermute wegen der Teilefamilie), die offen bleibt. Wäre es möglich, es zu schließen und am Ende des Makros wieder in 3D zu gelangen? Vielen Dank im Voraus für Ihr Feedback

Normalerweise schließt die Zeile swDesTable.UpdateTable 2, True die Teilefamilie und damit Excel in der Theorie.

 

Ich bestätige, dass diese Funktion die Teilefamiliendatei schließt, aber nicht die Excel-Anwendung...

 

Es muss etwas anderes im Makro vorhanden sein, das das Schließen von Excel blockiert. Ich für meinen Teil habe Excel, das aus den aktiven Prozessen verschwindet, sobald das Makro endet (aber ich habe nur einen Codeausschnitt, der die Tabelle öffnet, einen Wert aktualisiert, die Tabelle schließt und das 3D aktualisiert).

Es würde den vollständigen Code benötigen, um festzustellen, ob es eine andere Funktion gibt, die blockiert.

1 „Gefällt mir“

Hier sind die Zeilen...

Ich habe einen Mix mit den eingesandten Modellen gemacht....

Vielen Dank für Ihre Expertise!

Dimmen swApp als Objekt

Teil als Objekt dimmen
Dim boolstatus als boolescher Wert
Dim longstatus As Long, longwarnings As Long

Sub main()

Legen Sie swApp = Application.SldWorks fest

Set Part = swApp.ActiveDoc
myModelView als Objekt dimmen
Festlegen von myModelView = Part.ActiveView

myModelView.FrameState = swWindowState_e.swWindowMaximized


'-----------------------------------
(') Voraussetzungen:
' 1. Öffnen Sie ein Teiledokument, das eine Konstruktionstabelle enthält.
' 2. Stellen Sie sicher, dass das Teiledokument eine Konstruktion enthält.
   '-Tabelle, indem Sie Tabellen im ConfigurationManager erweitern.
' 3. Öffnen Sie das Direktfenster.
'
' Postbedingungen:
' 1. Ruft ab, ob die Design-Tabelle aktualisiert werden kann, bevor
   ' Ausführen des Makros.
' 2. Legt fest, dass die Design-Tabelle nicht aktualisiert werden kann, wenn sie
   ' aktualisierbar oder umgekehrt.
' 3. Untersuchen Sie das Direktfenster.
'-----------------------------------
Explizite Option
'Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDesignTable As SldWorks.DesignTable
Dim boolstatus als boolescher Wert
Dimmen Sie den letzten Zustand als Variante
 Dim swDesTable              As SldWorks.DesignTable
 Doppelte Höhe dimmen
 
 

    Legen Sie swApp = Application.SldWorks fest
    Festlegen von swModel = swApp.ActiveDoc
    Setze swDesignTable = swModel.GetDesignTable()
    " Änderungen an den Merkmalen der
    ' Design-Tabelle
    swDesignTable.EditFeature
    ' Ermitteln Sie, ob die Designtabelle aktualisierbar ist
    laststate = swDesignTable.Aktualisierbar
    Debug.Print "Design-Tabelle aktualisierbar: " & CStr(laststate)
    ' Wenn die Design-Tabelle aktualisierbar ist, dann setzen Sie sie
    " auf nicht aktualisierbar oder umgekehrt
    swDesignTable.Updatable = Nicht letzter Zustand
    ' Aktualisieren Sie dieses Merkmal der Design-Tabelle
    boolstatus = swDesignTable.UpdateFeature()
    ' Ermitteln Sie, ob die Designtabelle aktualisierbar ist
    laststate = swDesignTable.Aktualisierbar
    Debug.Print "Design-Tabelle aktualisierbar: " & CStr(laststate)

Height = InputBox("Bitte geben Sie die Förderhöhe an.... ")
'swModel.GetEquationMgr.Value("Höhe") = Höhe
    Set swDesTable = swModel.GetDesignTable
    bRet = swDesTable.Attach
    
'Debug.Assert bRet           'Haltepunkt, wenn die Tabelle nicht geöffnet wird, wenn bret falsch ist   
    swDesTable.UpdateTable 2, Wahr
    swDesTable.Detach
    swModel.ForceRebuild        ' zum Neuerstellen eines Part.ForceRebuild
    
   Legen Sie swApp = Application.SldWorks fest
   
  
Ende Sub
 

Hallo

Das Gleiche gilt für mich, Excel schließt gut und verschwindet aus der Liste der Prozesse am Ende des Makros, aber es gibt eine kleine Zeitspanne, bevor dies erledigt ist, ein Zeitrahmen, der kürzer ist, indem die letzte Zeile "Set swApp = Application.SldWorks" gelöscht wird, die nutzlos ist, da diese swApp-Variable bereits am Anfang Ihres Makros definiert ist.

Ich habe bereits bemerkt, dass der Excel-Prozess manchmal Probleme beim Schließen von Makros hat und dass wir oft in den Debug-Modus gehen, insbesondere wenn das Makro während der Ausführung einfriert...

Herzliche Grüße

Vielen Dank, Roger. Haben Sie mindestens einen Trick, um das aktive Solidworks-Fenster anzuzeigen, weil ich dieses verdammte Excel-Fenster habe, das übernimmt.... Ich möchte nur zumindest mein Makro vervollständigen, indem ich das Sldworks-Fenster anzeige... Vielen Dank

Auf dem Code sehe ich nichts Besonderes, ich für meinen Teil habe immer noch keine Spur von Excel am Ende des Makros.

SW wieder in den Vordergrund zu rücken, es sei denn, ich irre mich, es ist 

bret = swapp.visible

Nach dem Problem selbst ist es entweder ein Absturz von Excel oder es ist ein Fehler in der Solidworks-Version.

Ist die Raumfamilie in einem anderen Fenster geöffnet oder ist sie in SW geöffnet?

Eine weitere etwas barbarische Lösung sind die Shell-Befehle, um den Excel-Prozess zu beenden:

Shell "taskkill /f /im excel.exe", vbHide

 

Sonst eine andere Idee, es kann von der automatischen Aktualisierung der Tabelle beim Öffnen kommen, vielleicht wartet SW im Hintergrund auf etwas (Fenster, das in den Hintergrund gewechselt wäre) und blockiert plötzlich das Schließen von Excel.

Sie sollten den Code mit der Deaktivierung der automatischen Aktualisierung der Tabelle testen, aus dem Speicher befindet er sich in einem der beiden Codes der Hilfe meiner ersten Antwort.

1 „Gefällt mir“

Hallo Cyril,

Ich habe die 1. Option ausprobiert... Es hat nicht funktioniert. Also, ich habe den 2. ausprobiert und er funktioniert perfekt

Ein großes Dankeschön an Sie

Habt eine gute Woche

Hallo
Thema ausgraben,
Ich werde versuchen, es klar zu sagen.
Dieses Makro funktioniert hervorragend, außer dass...
1- Ich ändere eine Skizze
2- Ich führe das Makro aus (was gut läuft), aber am Ende sperrt es alle Dimensionen der Skizzen, so dass es seit SW nicht mehr möglich ist, einen Wert zu ändern.
3- Ich führe das Makro erneut aus und habe dort Zugriff, um die Skizzen erneut aus dem SW zu ändern.
Zusammenfassend lässt sich sagen, dass ich, wenn ich das Makro nach dem Ändern eines Sketches starte, es ein zweites Mal ausführen muss, um einen Wert erneut ändern zu können.
Egal, wie viel ich herumbastle, ich finde nicht warum.
wenn mich jemand aufklären kann.
Möge die Macht mit euch sein.

1 „Gefällt mir“

Hallo
Ich bin mir nicht sicher, ob ich das Problem richtig verstanden habe.
Ich kann mich in einer Skizze befinden oder direkt mit einem Doppelklick auf die Funktion bearbeiten, aber ich habe keine Bemaßungssperre.
Auf der anderen Seite, da es einen starken Umbau gibt, finden wir uns unweigerlich außerhalb der Skizze wieder.

Hallo
Hier finden Sie ein Erklärvideo.
Ich erkläre, was passiert.
1-Sie können sehen, dass ich einen Wert nach Belieben ändern kann.
2-Ich führe das Makro aus, um das Teil zu aktualisieren
3- Ich möchte denselben Wert erneut ändern, aber es ist unmöglich, ihn zu ändern.
4-Ich führe das Makro erneut aus und habe dort wieder Bearbeitungszugriff.
Warum muss ich das Makro erneut ausführen, um Zugriff auf die Bearbeitung zu haben???
Möge die Macht mit dir sein

Hallo
Ich habe es gerade verstanden.
Tatsächlich müssen Sie diesen Teil des Codes entfernen, der das Aktualisierungsverhalten der Tabelle ändert.

    Set swDesignTable = swModel.GetDesignTable()
    ' Allow changes to the characteristics of the
    ' design table
    swDesignTable.EditFeature
    ' Get whether design table is updatable
    laststate = swDesignTable.Updatable
    Debug.Print "Design table updatable: " & CStr(laststate)
    ' If design table is updatable, then set it
    ' to not updatable or vice versa
    swDesignTable.Updatable = Not laststate
    ' Update this characteristic of the design table
    boolstatus = swDesignTable.UpdateFeature()
    ' Get whether design table is updatable
    laststate = swDesignTable.Updatable
    Debug.Print "Design table updatable: " & CStr(laststate)

Er wechselt von "Das Aktualisieren der Komponentenfamilie durch Modelländerungen zulassen" zu "Modelländerungen nicht zulassen, die die Komponentenfamilie aktualisieren würden".
Beim ersten Mal wechselt es in den zweiten Modus, beim zweiten Start macht es das Gegenteil.

2 „Gefällt mir“

@Cyril.f
Du bist ein Champion, mein Champion.
Es ist ein großes Dankeschön für diese effektive Lösung.
Möge die Macht mit euch sein.

2 „Gefällt mir“