| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS |
| |
| REVOLUTE: Nicht das Rad neu erfunden – aber das Getriebe |
Autor
|
Thema: API - Referenzen (1884 mal gelesen)
|
MartinKirchmayer Mitglied
Beiträge: 79 Registriert: 14.05.2002
|
erstellt am: 20. Apr. 2006 13:34 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, gibt es eine Möglichkeit, per SWX -API dem gerade ativen Dokument die Information zu entlocken, ob es in anderen gerade in SWX geladenen Dokumenten referenziert ist? D.h. gibt es eine Eigenschaft oder Methode wie "IsReferencedInOtherOpenDocs"? Ich möchte mir den Umweg sparen über: a) "i"-Schleife über alle gerade offenen Dokumente b) "j"-Schleife über deren Referenzen und Vergleich des Namens mit dem aktiven Dokument. Gruß, Martin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Kalle Mitglied Student
Beiträge: 706 Registriert: 14.04.2002
|
erstellt am: 20. Apr. 2006 14:04 <-- editieren / zitieren --> Unities abgeben: Nur für MartinKirchmayer
Aheu Martin, ich schätze da wirst Du kein Glück haben. Habe mich in letzter Zeit auch ziemlich viel mit Referenzen und API auseinandergesetzt und diese Funktionalität ist mir noch nicht über den Weg gelaufen. Bis dann, Kalle ------------------ ----------------------------------------- Es gibt immer mehr Lösungen als Probleme. 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: 20. Apr. 2006 14:41 <-- editieren / zitieren --> Unities abgeben: Nur für MartinKirchmayer
Hallo Martin, nein, so etwas kann es nach der Logik von SolidWorks auch nicht geben. Was du suchst ist die Teileverwendung einer Komponente, aber die Komponente besitzt diese Info (absichtlich) nicht. Alle Tools, die so etwas können, angefangen von einfachen Makros über SolidWorks Explorer und PDMWorks bishin zu Monster-PDM-Systemen machen es auch andersherum: man klappert alle Referenzen der Einzelteile, Baugruppen und Zeichnungen ab, merkt sich diese zum Beispiel in einer Datenbank und holt sich dann aus der Datenbank die entsprechende Teileverwendung. Du wirst also über deine beiden Schleifen nicht drumherum kommen Ciao, Stefan ------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de Member of CAD.de BOINC Team - | Seti@Home | CPDN | Einstein@Home Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
clownfisch Mitglied industrial designer
Beiträge: 752 Registriert: 18.01.2006 SWX 2023 und davor Intel XEON W-2125 4,0 GHz 16,00 GB RAM nvidia Quadro RTX 4000 Windows 10 Prof. für Workstation Windows 10 Prof
|
erstellt am: 20. Apr. 2006 14:57 <-- editieren / zitieren --> Unities abgeben: Nur für MartinKirchmayer
Hallo API Spezialisten, ich verstehe ja nun wirklich nichts vom Thema, aber wenn ich in einem Dokument, welches in anderen offenen Dokumenten referenziert z.B. eine Konfiguration umbenennen will, bekomme ich ja auf jeden Fall die Meldung, dass das nicht geht. Kann das nicht nen Ansatz abgeben? Andreas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MartinKirchmayer Mitglied
Beiträge: 79 Registriert: 14.05.2002
|
erstellt am: 20. Apr. 2006 15:02 <-- editieren / zitieren --> Unities abgeben:
Hallo Stefan, Zitat: Original erstellt von StefanBerlitz:
... nein, so etwas kann es nach der Logik von SolidWorks auch nicht geben. Was du suchst ist die Teileverwendung einer Komponente, aber die Komponente besitzt diese Info (absichtlich) nicht. ...
das war mir auch klar, ich wollte ja auch nur eine naja, ich nenne sie mal "Laufzeiteigenschaft" auslesen können. SWX weiss das ja auch irgendwie, nämlich z.B. im o.a. Fall "Konfig umbenennen". Martin
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ABarth Mitglied Ing. Maschinenbau
Beiträge: 23 Registriert: 12.02.2003 SolidWorks 2008
|
erstellt am: 24. Apr. 2006 18:43 <-- editieren / zitieren --> Unities abgeben: Nur für MartinKirchmayer
Hallo Martin, die Idee von clownfisch aufgreifend würde ich folgendes vorschlagen: Per API versuchen jeden Konfigurationsnamen zu ändern und wenn es bei einem nicht klappt ist das Teil / die BG in einer geöffneten BG verbaut! Danach die geglückten Konfigurationsnamensänderungen wieder rückgängig machen!! Nach dem Test ist die Datei allerdings "dirty" und fordert zu Speichern auf (obwohl garnix geändert wurde)! Hier der Code: (klappt auch bei abgeleiteten Konfigurationen) Code:
Dim swApp As ObjectDim Konfig As Object Dim swModel As SldWorks.ModelDoc2 Dim vConfigNameArr As Variant Dim vConfigName As Variant Sub main() Set swApp = Application.SldWorks Set swModel = swApp.ActiveDoc vConfigNameArr = swModel.GetConfigurationNames istVerbaut = False For Each vConfigName In vConfigNameArr Set Konfig = swModel.GetConfigurationByName(vConfigName) Konfig.Name = vConfigName & "xx" If Konfig.Name = vConfigName & "xx" Then 'Diese Konfiguration ist nicht verbaut 'also Konfigurationnamen zurücksetzen Konfig.Name = vConfigName Else istVerbaut = True End If Next '.. '.. '.. '.. If istVerbaut Then MsgBox "Das Teil/BG ist in einer geöffneten BG verbaut" Else MsgBox "Das Teil/BG ist zumindest " & _ "in einer geöffneten BG nicht verbaut" End If End Sub
Bitte nicht steinigen für diesen grausamen Workaround.... Andreas... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
INKN Mitglied Consulant/Softwareentwickler
Beiträge: 277 Registriert: 22.08.2001
|
erstellt am: 25. Apr. 2006 07:42 <-- editieren / zitieren --> Unities abgeben: Nur für MartinKirchmayer
Hallo Martin, wenn Du prüfst, ob die zu änderte Datei in SWX offen ist. Liste der offenen Dokumente SldWorks.EnumDocuments2. Lightweight Komponenten sind nicht geladen und nicht in der Liste. Dann könntest Du über SwDocumentMgr.dll von außen vieles auslesen und ändern. Beschreibung findest Du in Beta 2007 und dann auch offen für alle. ------------------ Gruß Ingo 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: 25. Apr. 2006 09:34 <-- editieren / zitieren --> Unities abgeben: Nur für MartinKirchmayer
Hallo zusammen, Wo ist das Problem das von "oben" aus zu machen, zwei Schleifen sind doch nicht so schwierig:
Code:
' ********************************************************************** ' * Makro überprüft, ob das aktive Dokument in irgendwelchen anderen ' * OFFENEN Dokumenten referenziert ist ' * ' * 25.04.2006 Stefan Berlitz (stefan.berlitz@solidworks.cad.de) ' * http://solidworks.cad.de ' * http://swtools.cad.de ' * ' **********************************************************************Dim SldWorks As Object Dim ModelDoc As Object Dim ModelDocName As String Dim ModelDocReferencedIn As New Collection Dim vReferences As Variant Dim i As Long Dim status As String Dim refname As Variant Sub main() ' an SolidWorks anklinken Set SldWorks = CreateObject("SldWorks.Application") Set ModelDoc = SldWorks.ActiveDoc ' Collection sicherheitshalber löschen Set ModelDocReferencedIn = New Collection ' erst mal den Namen des aktiven Dokumentes holen ModelDocName = GetNamePart(ModelDoc.GetPathName) ' durch alle offenen Dokumente gehen und suchen, ob der Name in ' den Referenzenliste auftaucht. wenn Ja wird eins aufgezählt ' und der Name des referenzierenden Dokumentes in einer Liste eingetragen Set ModelDoc = SldWorks.GetFirstDocument While Not ModelDoc Is Nothing ' vReferences = ModelDoc.GetDependencies2(False, False, False) For i = 0 To (UBound(vReferences) - 1) / 2 ' es steht jetzt jeweils abwechseln nur der Name und der Fullpath ' in der Referenzliste, also vom Fullpath den Namen abschneiden ' und mit unserem Ursprungsmodell vergleichen If ModelDocName = GetNamePart(vReferences(2 * i + 1)) Then ModelDocReferencedIn.Add ModelDoc.GetPathName End If Next i ' und das nächste Dokument Set ModelDoc = ModelDoc.GetNext Wend ' und eine Zusammenfassung ausgeben status = "Dokument " & ModelDocName & vbCrLf status = status & ModelDocReferencedIn.Count & " mal in den offenen Doks refereneziert:" & vbCrLf For Each refname In ModelDocReferencedIn status = status & refname & vbCrLf Next MsgBox status End Sub Private Function GetNamePart(ByVal strPath As String) As String ' Dim intCounter As Integer Dim strTmp As String
' String von hinten bis zum ersten Backslash abklappern For intCounter = Len(strPath) To 1 Step -1 ' dann den String ab der gefundenen Stelle merken If Mid$(strPath, intCounter, 1) <> "\" Then strTmp = Mid$(strPath, intCounter, 1) & strTmp Else Exit For End If Next intCounter ' und zurückgeben GetNamePart = strTmp End Function
Ciao, Stefan ------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de Member of CAD.de BOINC Team - | Seti@Home | CPDN | Einstein@Home Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MartinKirchmayer Mitglied
Beiträge: 79 Registriert: 14.05.2002
|
erstellt am: 25. Apr. 2006 09:38 <-- editieren / zitieren --> Unities abgeben:
|