| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS | | | | Engineering in der Cloud: Link-Sharing von Konstruktionsdaten |
Autor
|
Thema: Makro -abgeleitete Zeichnungen mit Eltern Verknüpfen (3201 mal gelesen)
|
remtc Mitglied
Beiträge: 34 Registriert: 18.09.2017 Solidworks Prof. 2023SP3 x64 auf Win 10
|
erstellt am: 18. Sep. 2017 15:33 <-- editieren / zitieren --> Unities abgeben:
Hallo liebe Gemeinde, ich finde das Forum hier ist super um sich neue Anregungen für diverse Makros zu holen. Jedoch befinde ich mich nun auf Kriegsfuß mit SW und den Makros. Zu meinem Problem, da man immer vom 1/100tel ins 1/1000tel kommt und hier und dort noch Verbesserungsideen bekommt möchte ich ein Makro schreiben, dass in einer Zeichnung: a) Die Referenzkonfigurationen von den abgeleiteten Ansichten auf "mit Eltern verknüpfen" stellt - in allen Blättern b) sämtliche Blätter durchgeht und alle Ansichten wie die "Eltern Ansicht" aussieht. und c) die Namen der einzelnen Blätter geändert werden - in fortlaufende Nummer, Name der Ansicht und Blatt format. Ich habe mit dem "einfachen Teil" angefangen und den Punkt c) dank dem Makro Mania lösen können. zu b) Ebenso habe ich über "DisplayMode3" in groben Zügen versucht die Ansichten auf "verdeckte Kanten ausblenden" umzustellen. Dabei erhielt ich das erste Problem: Nur wenn ich bei allen Ansichten (auf den unterschiedlichen Blättern) die Anzeige "Schattiert" auswähle erhalte ich das Ergebnis was ich haben möchte (in Allen Ansichten sind die Kanten ausgeblendet), aber wenn ich bsp. "Schattiert mit Kanten" oder "verdeckte Kanten sichtbar" auswähle ignoriert es das Makro vollständig... und zu a) bin ich wirklich ratlos in meiner Not wende ich mich an euch und bitte um Hilfe - oder zu mindest um Hilfe zur Selbsthilfe. zu meinem System: Solidworks Prof. 2017SP3 x64 auf Win 7 Bitte um Hilfe - anbei die Schribsel die ich mit ach und krach auf die Reihe bekommen habe Vielen Dank im Vorraus remtc
Code: Option ExplicitDim swApp As Object Dim DrawingDoc As Object Dim Sheet As Object Dim Viewname As String Dim View As Object Dim ConfigName As String Dim ConfigName1 As String Dim Size As String Dim i As Long Dim AnzahlBl As Long Dim SheetNames As Variant Dim SheetProp As Variant Dim vTemplateSizes As Variant Dim swModel As SldWorks.ModelDoc2 Dim swModelDocExt As SldWorks.ModelDocExtension Dim swDrawing As SldWorks.DrawingDoc Dim swView As SldWorks.View Dim fileName As String Dim errors As Long Dim warnings As Long Dim status As Boolean Sub main() ' ********************************************************************** ' * Makro benennt alle Blätter einer Zeichnung um, dazu wird der ' * Konfigurationsname des Modells in der Zeichenansicht genutzt, die ' * auch für die benutzerdefinierten Eigenschaften in den ' * Blatteigenschaften eingestellt ist ' * ' * 22.05.2007 Stefan Berlitz (stefan.berlitz@solidworks.cad.de) ' * http://solidworks.cad.de ' * http://swtools.cad.de ' * ' **********************************************************************
' Konstante aus swconst.bas Const swDocDRAWING = 3
'*Sub main() Set swApp = CreateObject("SldWorks.Application") ' an SolidWorks anhängen Set swApp = CreateObject("SldWorks.Application") ' prüfen, ob überhaupt ein Dokument offen ist ... Set DrawingDoc = swApp.ActiveDoc If DrawingDoc Is Nothing Then MsgBox "Kein Dokument offen" Exit Sub End If ' ... und ob das auch eine Zeichnung ist If (DrawingDoc.GetType <> swDocDRAWING) Then MsgBox "Nur für Zeichnungen sinnvoll" Exit Sub End If ' einen Loop über alle Blätter, dazu die Anzahl der Blätter holen, ' und dann in der Schleife eines nach dem anderen abklappern AnzahlBl = DrawingDoc.GetSheetCount SheetNames = DrawingDoc.GetSheetNames For i = 0 To AnzahlBl - 1 ' das nächste Blatt aktivieren If DrawingDoc.ActivateSheet(SheetNames(i)) Then ' aktuelles Blatt holen Set Sheet = DrawingDoc.GetCurrentSheet Set View = DrawingDoc.GetFirstView ' solange es noch eine Ansicht gibt While Not View Is Nothing ' überprüfen, ob der View überhaupt facettiert (= Entwurfsmodus) ist ' If View.GetFacettedHlrDisplay = True Then ' dann den aktuelle Anzeigeart holen DisplayMode = View.GetDisplayMode ' und überprüfen, ob die Kanten bei schattierter Ansicht dargestellt werden displayEdgesInShadedMode = View.GetDisplayEdgesInShadedMode ' ' die Ansicht auf hohe Qualität setzen '* displayUseParentDisplayMode = View.GetUseParentDisplayMode Set DisplayMode = 2 ' swSHADED_EDGES displayEdgesInShadedMode = True View.SetDisplayMode3 displayUseParentDisplayMode, DisplayMode, False, displayEdgesInShadedMode Set swModel = swApp.OpenDoc6(fileName, swDocDRAWING, swOpenDocOptions_Silent, "", errors, warnings) Set swDrawing = swModel Set swModelDocExt = swModel.Extension ' Make the projected view the active view status = swDrawing.ActivateView("Drawing View2") status = swModelDocExt.SelectByID2("Drawing View2", "DRAWINGVIEW", 0.4426278247583, 0.3837831481976, 0, False, 0, Nothing, 0) Set swView = swDrawing.ActiveDrawingView ' Determine whether the projected view is linked to the ' parent configuration Call LinkConfiguration ' Link the projected view to the parent ' configuration swView.LinkParentConfiguration = True ' Determine whether the projected view is linked to the ' parent configuration Call LinkConfiguration '*End If ' ... und die nächste Ansicht Set View = View.GetNextView Wend SheetProp = Sheet.GetProperties Size = "" If SheetProp(0) = 7 Then Size = "A4" If SheetProp(0) = 8 Then Size = "A3" If SheetProp(0) = 9 Then Size = "A2" If SheetProp(0) = 10 Then Size = "A1" If SheetProp(0) = 11 Then Size = "A0" ' Namen zurücksetzen ConfigName = "???" ' den Viewnamen aus den Blatteigenschaften auslesen Viewname = Sheet.CustomPropertyView ' dann den passenden View suchen,d er erste View ist immer das Blatt selbst Set View = DrawingDoc.GetFirstView ' wenn der Viewname "Standard" ist wird der erste View genommen If Viewname = "Standard" Then ' also die Konfig aus dem Modell des ersten Views holen Set View = View.GetNextView ConfigName = View.ReferencedConfiguration Else ' ansonsten die View suchen, deren Namen angegeben ist While Not View Is Nothing If View.GetName2 = Viewname Then ConfigName = View.ReferencedConfiguration End If Set View = View.GetNextView Wend End If '*Name mit Blattnummer und Groesse ConfigName1 = Format(i + 1, "00") & "/" & ConfigName & "/" & Size ' So, jetzt haben wir den Namen der Konfiguration, die jetzt in ' den Blattnamen eintragen ' eigentlich müsste hier noch geprüft werden, ob es schon ein Blatt ' mit diesem Namen gibt, denn sonst klappt das Umbenennen nicht Sheet.SetName (ConfigName1) End If Next i End Sub Private Sub LinkConfiguration() ' Print to the Immediate window whether ' the projected view is linked to the parent ' configuration status = swView.LinkParentConfiguration If status Then Debug.Print "Projected view now linked to parent configuration." swModel.EditRebuild3 Else Debug.Print "Projected view not linked to parent configuration." End If End Sub
[Diese Nachricht wurde von remtc am 19. Sep. 2017 editiert.] [Diese Nachricht wurde von remtc am 19. Sep. 2017 editiert.] [Diese Nachricht wurde von remtc am 19. Sep. 2017 editiert.] [Diese Nachricht wurde von remtc am 19. Sep. 2017 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CAD-Maler Mitglied Konstrukteur / CAD-Admin / Mädchen für alles
Beiträge: 720 Registriert: 17.01.2007 SWX 2019 SP5 AutoCAD 2019 Win 10 pro 64 bit Intel(R) Xeon(R) CPU E5-1650 v4 @ 3.60GHz 64GB RAM Nvidia Quadro M5000 SWx EPDM
|
erstellt am: 18. Sep. 2017 15:52 <-- editieren / zitieren --> Unities abgeben: Nur für remtc
Das ist einer der besten, wenn nicht gar der beste erste Post im WBF , den ich seit langem gesehen hab. Dafür gibt es direkt mal 10 Üs... Trotzdem kann ich dir leider mangels Erfahrung mit Zeichnungs-Makros nicht helfen.
Gruß, Jens ------------------ CSWA, CSWP, CSWPA-SM & -SU =) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2675 Registriert: 06.11.2000 SolidWorks Start 1999 ** CSWP 01/2008 ** ------------------ Zuletzt beruflich: - SWX2020 SP5; - SAP/PLM+ECTR; - DriveWorks Pro; - Programmierung: VBA, aktuell Visual Studio 2022/VB.Net ------------------ ab 2024 (privat): Onshape und anderes
|
erstellt am: 18. Sep. 2017 16:41 <-- editieren / zitieren --> Unities abgeben: Nur für remtc
Hi, Code-mäßig kann ich mich damit gerade aus Zeitgründen nicht beschäftigen. Mir ist nur zu deiner letzten Bemerkung im Code was eingefallen: Code: '*Name mit Blattnummer und Groesse ConfigName1 = Format(i + 1, "00") & "/" & ConfigName & "/" & Size ' So, jetzt haben wir den Namen der Konfiguration, die jetzt in ' den Blattnamen eintragen ' eigentlich müsste hier noch geprüft werden, ob es schon ein Blatt ' mit diesem Namen gibt, denn sonst klappt das Umbenennen nicht Sheet.SetName (ConfigName1)
Entweder deine neue Blattbenennung ist maßgeblich- dann hieße das ja, dass ein schon vorhandenes Blatt mit einem solchen Namen falsch benannt wäre und so nicht stehen bleiben darf. Um das zu verhindern würde ich erst mal am Anfang allen Blättern einen Dummy-Namen geben (z.B. "~temp01..~temp99" oder so) und dann erst die richtige Benennung vornehmen. Oder es können gleiche Blattnamen entstehen- aber das hast du ja eigentlich schon verhindert, indem du den Zähler i als Prefix vor den Blattnamen gesetzt hast. ------------------ Klaus http://www.alko-tech.com | mein Gästebuch Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
jörg.jwd Ehrenmitglied V.I.P. h.c. CAD-PDM Administrator
Beiträge: 3109 Registriert: 05.11.2003
|
erstellt am: 19. Sep. 2017 07:45 <-- editieren / zitieren --> Unities abgeben: Nur für remtc
...OT wäre es nicht möglich so einen Code als Anhang zu posten? Dann wäre das Ganze etwas übersichtlicher und man müsste nicht ständig kilometerweit scollen. ------------------ Grüße Jörg man hat nie Zeit es richtig zu machen, aber immer genug Zeit es nochmals zu machen Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
remtc Mitglied
Beiträge: 34 Registriert: 18.09.2017 Solidworks Prof. 2023SP3 x64 auf Win 10
|
erstellt am: 19. Sep. 2017 07:53 <-- editieren / zitieren --> Unities abgeben:
Hallo, @Jörg - natürlich ist es auch möglich die Datei hochzuladen - anbei ist Sie. Eine Änderung zum vorherigen Code: ich habe versucht den DisplayMode mit Set. zu setzen. @Jens - Vielen Dank ich geb mir Mühe @Klaus - eben durch die fortlaufende Nummerierung ist eine Doppelbennenung unmöglich [Diese Nachricht wurde von remtc am 19. Sep. 2017 editiert.] [Diese Nachricht wurde von remtc am 19. Sep. 2017 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
jörg.jwd Ehrenmitglied V.I.P. h.c. CAD-PDM Administrator
Beiträge: 3109 Registriert: 05.11.2003
|
erstellt am: 19. Sep. 2017 07:57 <-- editieren / zitieren --> Unities abgeben: Nur für remtc
Zitat: Original erstellt von remtc: Hallo, @Jörg - natürlich ist es auch möglich die Datei hochzuladen - anbei ist Sie.
...hier braucht niemand mehr diese Datei. Das war für die Zukunft gedacht. Du bist nicht der Einzige der kilometerlange Codes im Text postet also künftig daran denken ------------------ Grüße Jörg man hat nie Zeit es richtig zu machen, aber immer genug Zeit es nochmals zu machen 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: 19. Sep. 2017 09:03 <-- editieren / zitieren --> Unities abgeben: Nur für remtc
Hallo remtc, und herzlich willkommen im SolidWorks-Brett auf CAD.de Zu deinem Punkt a: du hast im Makro ja schon den Loop über alle Blätter und darauf auch den Loop über alle Zeichenansichten. Dann kannst du bei den passenden Views mit View::LinkParentConfiguration die Konfiguration mit der Elternansicht verknüpfen. Dazu gibt es auch ein Beispiel in der API Hilfe ("Link Projected View to Parent Configuration (VBA)") Ciao, Stefan PS @Jörg: ist schon interessant, ich finde es viel besser, wenn ich den kilometerlangen Code direkt im Beitrag lesen kann, ich lade mir solche Anhänge nämlich nicht runter , um Sie mir dann auf meinem Handy oder Tablet oder auch am PC im Notepad anzuschauen. Vorher konnte ich schnell alles direkt im Browser lesen, jetzt würde ich den Post ignorieren. Aber so ist das eben, man kann es nicht allen Recht machen ------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
jörg.jwd Ehrenmitglied V.I.P. h.c. CAD-PDM Administrator
Beiträge: 3109 Registriert: 05.11.2003
|
erstellt am: 19. Sep. 2017 09:10 <-- editieren / zitieren --> Unities abgeben: Nur für remtc
Zitat: Original erstellt von StefanBerlitz:
PS @Jörg: ist schon interessant, ich finde es [b]viel besser, wenn ich den kilometerlangen Code direkt im Beitrag lesen kann, ich lade mir solche Anhänge nämlich nicht runter , um Sie mir dann auf meinem Handy oder Tablet oder auch am PC im Notepad anzuschauen. Vorher konnte ich schnell alles direkt im Browser lesen, jetzt würde ich den Post ignorieren. Aber so ist das eben, man kann es nicht allen Recht machen
Hallo Stefan, bitte nicht missverstehen. Das war nur ein Vorschlag. Meinetwegen kann der Post sein so lange er will. ------------------ Grüße Jörg man hat nie Zeit es richtig zu machen, aber immer genug Zeit es nochmals zu machen [Diese Nachricht wurde von jörg.jwd am 19. Sep. 2017 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2675 Registriert: 06.11.2000 SolidWorks Start 1999 ** CSWP 01/2008 ** ------------------ Zuletzt beruflich: - SWX2020 SP5; - SAP/PLM+ECTR; - DriveWorks Pro; - Programmierung: VBA, aktuell Visual Studio 2022/VB.Net ------------------ ab 2024 (privat): Onshape und anderes
|
erstellt am: 19. Sep. 2017 09:50 <-- editieren / zitieren --> Unities abgeben: Nur für remtc
|
remtc Mitglied
Beiträge: 34 Registriert: 18.09.2017 Solidworks Prof. 2023SP3 x64 auf Win 10
|
erstellt am: 19. Sep. 2017 10:04 <-- editieren / zitieren --> Unities abgeben:
Hallo und danke für den Hilfreichen Tipp zum Code von hier Code: Option ExplicitDim swApp As SldWorks.SldWorks Dim swModel As SldWorks.ModelDoc2 Dim swModelDocExt As SldWorks.ModelDocExtension Dim swDrawing As SldWorks.DrawingDoc Dim swView As SldWorks.View Dim fileName As String Dim errors As Long Dim warnings As Long Dim status As Boolean Sub main() Set swApp = Application.SldWorks ' Open drawing document that has a projected view '*fileName = "C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS\samples\tutorial\advdrawings\foodprocessor.slddrw" Set swModel = swApp.OpenDoc6(fileName, swDocDRAWING, swOpenDocOptions_Silent, "", errors, warnings) Set swDrawing = swModel Set swModelDocExt = swModel.Extension ' Make the projected view the active view status = swDrawing.ActivateView("Drawing View2") status = swModelDocExt.SelectByID2("Drawing View2", "DRAWINGVIEW", 0.4426278247583, 0.3837831481976, 0, False, 0, Nothing, 0) Set swView = swDrawing.ActiveDrawingView ' Determine whether the projected view is linked to the ' parent configuration Call LinkConfiguration ' Link the projected view to the parent ' configuration swView.LinkParentConfiguration = True ' Determine whether the projected view is linked to the ' parent configuration Call LinkConfiguration End Sub Private Sub LinkConfiguration() ' Print to the Immediate window whether ' the projected view is linked to the parent ' configuration status = swView.LinkParentConfiguration If status Then Debug.Print "Projected view now linked to parent configuration." swModel.EditRebuild3 Else Debug.Print "Projected view not linked to parent configuration." End If End Sub
bekomme ich in der Fett gedruckten Zeile bereits einen Laufzeitfehler 91 hätte jemand eine Anregung? @ Stefan ich habe bisher noch keinen Code mit dem dopppelten Doppelpunkt gesehen - wie kann ich den richtig anweden (View::LinkParentConfiguration)? Danke Michael 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: 19. Sep. 2017 11:54 <-- editieren / zitieren --> Unities abgeben: Nur für remtc
Hallo remtc, der Laufzeitfehler 91 bedeutet "Object variable not set (Error 91)", in diesem Fall wird deine swmodel nicht gesetzt sein. Das kommt daher, dass die in der Zeile oben drüber durch das swApp.OpenDoc6 zugewiesen wird, darin benutzt du als Pfad zu der zu öffnenden Datei die Variable filename, die hast du aus dem Beispiel geholt und in deinem Makro auskommentiert. Ergo ist filename ein Leerstring, das OpenDoc6 kann nichts laden (und den Fehlercode dazu wirst du in errors und warnings finden), deswegen ist swmodel dann Nothing und wenn du von diesem nicht vorhandenen Objekt dann die ModelDocExtension holen willst macht das Makro die Grätsche - "Objekt Variable nicht gesetzt" Also entweder nicht das swmodel durch OpenDoc6 setzen, sondern durch Set swmodel = swApp.ActiveDoc oder einen gültigen Pfad in filename eintragen. Zu der anderen Frage: die Schreibweise mit dem Doppelpunkt ist die allgemeine Objektschreibweise, wie sie in der API-Hilfe genutzt wird. Für VB/VBA machst du aus dem Doppelpunkt praktisch einfach nur einen Punkt, so ist die Objekt-Methoden-Schreibweise da. Schau dir das mal in der API Hilfe an, da wirst du diese Arten der Schreibweise immer wieder finden. Ciao, Stefan ------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
remtc Mitglied
Beiträge: 34 Registriert: 18.09.2017 Solidworks Prof. 2023SP3 x64 auf Win 10
|
erstellt am: 19. Sep. 2017 13:58 <-- editieren / zitieren --> Unities abgeben:
Hallo nochmal, ich merke das die Stolperfallen nicht kleiner werden... in der APIHilfe steht: Code: Dim instance As IView Dim value As System.Boolean instance.LinkParentConfiguration = value value = instance.LinkParentConfiguration
also das Value 1 ist wenn der Link zwischen Elternansicht und Abgeleiteter Ansicht existiert und 0 wenn nicht -und instance ist der Zeiger dahin? in "meinem" Programm hat sich die Fehlermeldung zwar von der Zeile her verschoben jedoch nicht vom Inhalt: Code: Option ExplicitDim swApp As SldWorks.SldWorks Dim swModel As SldWorks.ModelDoc2 Dim swModelDocExt As SldWorks.ModelDocExtension Dim swDrawing As SldWorks.DrawingDoc Dim swView As SldWorks.View Dim fileName As String Dim errors As Long Dim warnings As Long Dim status As Boolean Dim instance As IView Sub main()
Set swApp = Application.SldWorks ' Open drawing document that has a projected view Set swModel = swApp.ActiveDoc Set swDrawing = swModel Set swModelDocExt = swModel.Extension ' Make the projected view the active view status = swDrawing.ActivateView("Drawing View2") status = swModelDocExt.SelectByID2("Drawing View2", "DRAWINGVIEW", 0.4426278247583, 0.3837831481976, 0, False, 0, Nothing, 0) Set swView = swDrawing.ActiveDrawingView ' Determine whether the projected view is linked to the ' parent configuration Call LinkConfiguration ' Link the projected view to the parent ' configuration swView.LinkParentConfiguration = True ' Determine whether the projected view is linked to the ' parent configuration Call LinkConfiguration End Sub Private Sub LinkConfiguration() ' Print to the Immediate window whether ' the projected view is linked to the parent ' configuration status = swView.LinkParentConfiguration If status Then Debug.Print "Projected view now linked to parent configuration." swModel.EditRebuild3 Else Debug.Print "Projected view not linked to parent configuration." End If End Sub
Mein Plan wäre sobald das Makro auf einem Blatt funktioniert in die While Schleife mit aufzunehmen - jedoch hab ich wohl ein Problem mit dem "swView.LinkParentConfiguration" oder "instance.LinkParentConfiguration" muss ich dafür eine Bibliothek noch zusätzlich laden oder liegt es an SW oder ist da eine Falle die ich noch nicht gesehen habe (Rechtschreibfehler oä.)? Ich habe eine Zeichnung mit einem Blatt und zwei Ansichten (Blattformat1, Ansicht1 und abgeleitete Ansicht2) Danke Michael Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
remtc Mitglied
Beiträge: 34 Registriert: 18.09.2017 Solidworks Prof. 2023SP3 x64 auf Win 10
|
erstellt am: 19. Sep. 2017 15:03 <-- editieren / zitieren --> Unities abgeben:
ein weiterer Stein in meinem anfänglich funktionierendem Code ist die Frage ob ich Code: Viewname = Sheet.CustomPropertyView
durch einen alternativen Namen ersetzen kann. Dieses CustomPropertyView bezieht sich auf den Konfigurationsnamen, der ist aber häufig "Standard" und es wird ein Stücklisten Name vergeben. Wie kann ich den erreichen? oder sind die benutzerdefinierten Eigenschaften ein Array? und wenn ja wie komme ich daran? Vielen Dank Michael 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. Sep. 2017 08:27 <-- editieren / zitieren --> Unities abgeben: Nur für remtc
Hallo Michael, Ich finde es schön, dass du dich da durchbeißen willst - Makroprogrammierung von SolidWorks ist gerade am Anfang nicht ganz trivial weil man sowohl etwas von Programmierung (vorzugsweise VB/VBA) als auch von SolidWorks verstehen muss. Bei deinen Fragen und Fehlern bei der Ausführung deines Codes fällt mir auf, dass du noch in einer grundlegenden Fehleinschätzung verhaftet bist, die gerade Programmieranfänger passiert: die Codes machen nicht das, was du gerne möchtest oder dir vorstellst, sondern genau das, was du in deinem Code vorgibst und die Rahmenbedingungen hergeben. Ich vergleich das manchmal mit einem blinden, tauben, überaus dämlichen, aber absolut gehorsamen und wirklich starken Roboter, den du mit einer brennenden Fackel durch einen Pulverbunker navigieren willst, um den Raum dahinter auszulechten Deswegen ist das wichtig zu verstehen, was dein Code macht, Schritt für Schritt, wie die Rahmenbedingungen in dem Moment sind, bei dem der Schritt gemacht wird und was der Robot tut und nicht das was man gerne möchte, dass er macht. Dafür gibt es im Makroeditor zum Testen bzw. zur Fehleranalyse einfache Hilfsmittel wie das Debuggen im Einzelschritt, Haltepunkte, Direktfenster usw. (siehe Screenshots). Damit sollte sich jeder Anfänger erst mal auseinander setzen, um das Werkzeug kennen zu lernen. Du solltest bei einem Auto auch die Bremse und die Kupplung kennen, bevor du auf's Gas drückst In diesem Sinne zu deinem letzten Code ein paar Hinweise: du bekommst jetzt unten bei swView.LinkParentConfiguration wieder der Laufzeitfehler 91. So weit so gut, wie oben schon deutet das darauf hin, das swView Nothing ist (also nicht gesetzt). Das kann am Context liegen (das es also z.B. eine lokale Variable ist), aber da swView im Headerbereich deklariert wurde ist es eine Modulvariable und im ganzen Context des Moduls gültig. Kann es also nur noch die Zuweisung sein. Die hast du wieder aus dem Beispielcode der API-Hilfe kopiert:
Code: status = swDrawing.ActivateView("Drawing View2") status = swModelDocExt.SelectByID2("Drawing View2", "DRAWINGVIEW", 0.4426278247583, 0.3837831481976, 0, False, 0, Nothing, 0) Set swView = swDrawing.ActiveDrawingView
Da versuchst du also eine Zeichenansicht namens "Drawing View 2" zu aktivieren, diese zu selektieren und weist dann dem swView diese Ansicht zu. Da es hinteher einen Fehler 91 gibt bin ich mir recht sicher, dass du in deiner Zeichnung keinen "Drawing View 2" hast, sondern vielleicht eine "Zeichenansicht2" oder so. Um das Makro einfach nur zu probieren willstdu aber ja einfach nur eine Zeichenansicht aktiv haben, also reicht die eine fett markierte Zeile aus und selektierst deine gewünschte Zeichenansicht in der Zeichnung einfach vor dem Starten. So viel mal in erster Lesung, zu dem anderen später vielleicht noch was Ciao, Stefan ------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
remtc Mitglied
Beiträge: 34 Registriert: 18.09.2017 Solidworks Prof. 2023SP3 x64 auf Win 10
|
erstellt am: 20. Sep. 2017 10:20 <-- editieren / zitieren --> Unities abgeben:
Hallo und vielen Dank das du so geduldig mit mir bist ja wenn ich gut programmieren könnte hätte ich auch Informatiker werden können Das LinkParentConfig funktioniert tatsächlich für ein Blatt und die "Zeichenansicht2" jetzt der Kniff - wie kann ich es machen das nicht nur Konstant Zeichenansicht2 geprüft wird sondern jede abgeleitete Ansicht auf dem Blatt? Code: Set swModel = swApp.ActiveDoc Set swDrawing = swModel Set swModelDocExt = swModel.Extension status = swDrawing.ActivateView("Zeichenansicht2") '* Make the projected view the active view - hier müsste die abgeleitete Ansicht als variable rein?Set swView = swDrawing.ActiveDrawingView ' Determine whether the projected view is linked to the parent configuration Call LinkConfiguration
Ebenso zu meinem nächsten Bug(?) Ich denke das ich den nötigen Befehl gefunden habe (CustomInfo) jedoch bekomme ich noch nicht den passenden Namen rein. Wo wird der definiert? Ist das der Name in der Tabelle der Benutzerdefinierten Eigenschaften? Ich weiß das es bei einem Block unter $PRPVIEW:{Stücklistenname} finde - Ist das zufällig der gleiche Name? Wenn ja dann bin doch auf dem falschen Dampfer mit dem CustomInfo Code: ConfigName = "???" '* Namen zurücksetzen Set Model = swApp.ActiveDoc 'Set MyPropMan = MyExt.CustomPropertyManager("") 'Wenn Konfigurationsspezifisch, dann hier eintragen 'Viewname = Sheet.CustomPropertyView 'Viewname = Sheet.Model.ViewAlternateNameInBOM Viewname = Model.CustomInfo("Stücklistenname") '* variable im Array? 'Viewname = Sheet.Model.CustomPropertyManager("Stücklistenname") 'ActiveConfig.AlternateName '* den Viewnamen aus den Blatteigenschaften auslesen Set View = DrawingDoc.GetFirstView '* dann den passenden View suchen,d er erste View ist immer das Blatt selbst
Die Einzelschritte nutze ich bereits - aber das man mit der Maus über den Variablen stehen bleiben kann und dann den Inhalt sieht ist neu für mich Vielen Dank für die konstruktive Hilfe bisher Michael 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. Sep. 2017 10:56 <-- editieren / zitieren --> Unities abgeben: Nur für remtc
Hallo Michael, Zitat: Original erstellt von remtc: Das LinkParentConfig funktioniert tatsächlich für ein Blatt und die "Zeichenansicht2" jetzt der Kniff - wie kann ich es machen das nicht nur Konstant Zeichenansicht2 geprüft wird sondern jede abgeleitete Ansicht auf dem Blatt?
Na ja, du musst einen Loop über alle Ansichten (Views) des Blattes machen, das hast du ja aber im allerersten Makro aus der MakroMania oben schon drin. Da heißt die Objektvariable, in der die Ansichten durchlaufen werden, eben einfach nur View und nicht swView. Aus deinem Beitrag oben also den Codeschnipsel bereinigen, so dass es so aussieht: Code: ' solange es noch eine Ansicht gibt While Not View Is Nothing ' Link the projected view to the parent configuration View.LinkParentConfiguration = True ' ... und die nächste Ansicht Set View = View.GetNextView Wend
Bei dem zweiten Teil der Frage bin ich mir nicht so sicher, worauf du hinaus willst. Was willst du denn letztlich haben, willst du den Namen der referenzierten Konfiguration aus dem Elternview haben? Oder die referenzierte Konfiguration der Ansicht, die in den Blatteigenschaften angegeben ist, dazu brauchst du dann dieses Sheet.CustomPropertyView. Das gibt dir nicht irgeneine Konfiguration! Sondern das gibt dir eben zurück, was in den Blatteigenschaften dort als Ansicht eingetragen, von der dann das Modell und die entsprechende referenzierte Konfiguration egenutzt wird, wenn auf Dateieigenschaften des Modells verlinkt wird. "Standard" bedeutet in dem Zusammenhang nicht eine Konfiguration "Standard", sondern das Standardverhalten von SolidWorks, wenn nicht explizit eine Zeichenansicht angegeben wird. Dann wird die erste ins Blatt eingefügte Zeichenansicht dafür genutzt, egal wie die heißt. Deswegen in dem Ursprungscode auch die unterscheidung nach "Standard" oder direkt angegebener Zeichenansicht. In beiden Fällen hast du nur den Namen der Ansicht. Die musst du dir dann auf irgendeinem Weg holen (z.B. in dem Loop die Namen vergleichen), davon das Modell, was darin dargestellt wird ( View::GetReferencedModelName ), die referenzierte Konfiguration ( View::ReferencedConfiguration ) und davon dann das passende ModelDoc mit der Konfiguration holen und über den PropertyManager die Dateieigenschaften auslesen. Als Programmierer musst du wie in diesem Fall oft sehr viele kleine Schritte selbst machen, die in SolidWorks interaktiv vom Benutzer mit einem Klick erledigt sind ... Ciao, Stefan ------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
remtc Mitglied
Beiträge: 34 Registriert: 18.09.2017 Solidworks Prof. 2023SP3 x64 auf Win 10
|
erstellt am: 20. Sep. 2017 12:03 <-- editieren / zitieren --> Unities abgeben:
Hallo WUHU! die Verlinkung zu den Eltern Konfigs passt schon blöd wenn man zu viel Code drin hat ^^ DANKE!!!!! zum zweiten Punkt: Im 3D Teil wird dem Bauteil ein Stücklistenname zugewiesen. Dieser muss ja auslesbar sein - in dem Moment wenn sich die Ansicht auf der zeichnung befindet - dazukommt, dass alle Ansichten die selben Konfigurationen besitzen - daher können keine unterschiedlichen Stücklistennamen pro Blatt vorhanden sein. Auf diesen Stücklistennamen (im Foto "Grundkörper...") möchte ich mich nun beziehen. bei dem Code Code: Viewname = Sheet.CustomPropertyView
hast du recht erhalte ich den Blatteigenschaften Namen. Ich möchte aber gerne Stücklistennamen aus dem Modell der Ansicht - da alle Ansichten mit der Elternansicht Verknüpft sind ist es mir sogar Wurst wie häufig der (viewname) mit dem selben Namen (Stücklistenname) überschrieben wird bis er letztendlich ausgegeben wird - wichtig ist nur das es sich dabei um die Ansicht des Teils handelt und nicht vom Blattrahmen. Deswegen habe ich mit verschiedenen Ansätzen rumexperimentiert - wenn auch wie ein Grobmotoriker... Code: ConfigName = "???" '* Namen zurücksetzen Set Model = swApp.ActiveDoc 'Set MyPropMan = MyExt.CustomPropertyManager("") 'Wenn Konfigurationsspezifisch, dann hier eintragen 'Viewname = Sheet.CustomPropertyView 'Viewname = Sheet.Model.ViewAlternateNameInBOM 'Viewname = Model.CustomInfo("Stücklistenname") '* variable im Array? Viewname = Sheet.Model.CustomPropertyManager("Stücklistenname") 'ActiveConfig.AlternateName '* den Viewnamen aus den Blatteigenschaften auslesen Set View = DrawingDoc.GetFirstView '* dann den passenden View suchen,d er erste View ist immer das Blatt selbst If Viewname = "Standard" Then '* wenn der Viewname "Standard" ist wird der erste View genommen Set View = View.GetNextView '* also die Konfig aus dem Modell des ersten Views holen ConfigName = View.ReferencedConfiguration Else '* ansonsten die View suchen, deren Namen angegeben ist While Not View Is Nothing If View.GetName2 = Viewname Then ConfigName = View.ReferencedConfiguration End If Set View = View.GetNextView Wend End If
hier ist wieder der Fehler - aber ich bin mir nicht sicher wie genau ich daran komme. Vielen Dank nochmal Michael
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: 21. Sep. 2017 08:44 <-- editieren / zitieren --> Unities abgeben: Nur für remtc
Hallo Michael, da kommen wir der Sache ja langsam näher Zitat: Original erstellt von remtc: Im 3D Teil wird dem Bauteil ein Stücklistenname zugewiesen.
[Klug******ermodus AN] Da habe ich beim ersten Lesen an die Konfigurationseigenschaft in den Stücklistenoptionen gedacht, aber du meinst eine Dateieigenschaft namens "Stücklistenname", oder? [Klug******ermodus AUS] Zitat: Original erstellt von remtc: Dieser muss ja auslesbar sein - in dem Moment wenn sich die Ansicht auf der zeichnung befindet - dazukommt, dass alle Ansichten die selben Konfigurationen besitzen - daher können keine unterschiedlichen Stücklistennamen pro Blatt vorhanden sein. Auf diesen Stücklistennamen (im Foto "Grundkörper...") möchte ich mich nun beziehen.
Okay, bei den Rahmenbedingungen brauchst du das Geraffel mit dem Umweg über die in den Blatteigenschaften eingetragene Zeichenansicht ja nicht machen, sondern nimmst dir einfach die erste "ecjte" Zeichensicht, also den zweiten View des Blattes. Davon holst du dir wie oben beschrieben das referenzierte Modell, merkst dir den Namen der referenzierten Konfiguration und holst dir von diesem Modell in der Konfiguration den Wert deiner Dateieigenschaft. Eh voilá. In Code gegossen sieht das dann so aus: Code: ' ****************************************************************************** ' Makro soll eine konfigurationsspezifische Dateieigenschaft vom Modell aus ' der ersten Zeichensicht im Blatt ermitteln werden. ' In diesem Beispiel heißt die Dateieigenschaft "StüLiText" ' ******************************************************************************Dim swApp As Object Dim DrawingDoc As Object Dim View As Object Dim ModelDocFromDrawingView As Object Dim ConfigNameFromDrawingView As String Dim FilePropValue As String Sub main() ' SolidWorks ansprechen und das aktuelle Dokument holen, sollte ' eine Zeichnung mit mindestens einer Zeichenansicht sein Set swApp = Application.SldWorks Set DrawingDoc = swApp.ActiveDoc ' der Name der Konfiguration des Modell der ersten Zeichenansicht ' wird jetzt ermittelt ConfigNameFromDrawingView = "???" ' der erste View eines Blattes ist immer das Blatt selbst, also brauchen ' wir den "zweiten" View, das ist die erste eingefügte Zeichenansicht Set View = DrawingDoc.GetFirstView Set View = View.GetNextView ' jetzt von diesem View das Modell und die darin referenzierte ' Konfiguration ermitteln ConfigNameFromDrawingView = View.ReferencedConfiguration Debug.Print ConfigNameFromDrawingView ' das ModelDoc des Modells aus dieser Zeichenansicht holen Set ModelDocFromDrawingView = View.ReferencedDocument ' von diesem ModelDoc dann von der referenzierten Konfiguration ' die gewünschet Dateieigenschaft auslesen, in diesem Fall mit ' der alten Methode ohne CustomPropertyManager FilePropValue = ModelDocFromDrawingView.CustomInfo2(ConfigNameFromDrawingView, "StüLiText") Debug.Print FilePropValue End Sub
Wie du siehst versuche ich meine Codes a) sauber zu halten und b) habe ich in der Regeln mehr Kommentare als eigentliche Codezeilen drin, damit ich (und ggf. andere Leute ) auch in 5 Jahren noch nachvollziehen können, warum das so gemacht war bzw. wie es gedacht war. Ich hoffe, du kannst nachvollziehen und verstehen, wie das funktioniert, warum es funktioniert, wo die Fallstricke sind (die hier natürlich nicht abgefangen werden) und wo die Ansätze sind, die du in dein Gesamtmakro jetzt übertragen musst. Und ich hoffe, dass du damit weiter kommst und damit vielleicht sogar etwas Spaß an der Sache bekommst. Ciao, Stefan PS: Allein mit dem Hin und Her und Schreiben und Probieren usw. haben wir beide sicherlich viel mehr Zeit verbracht, als hätte ich oder jemand anderes einfach ein fertiges Makro geschrieben oder als hättest du es beauftragt. Aber so haben hoffentlich wir und auch noch einige Andere eine paar Anregungen bekommen, die helfen. Falls also mal keine Zeit für so was ist ... ------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
remtc Mitglied
Beiträge: 34 Registriert: 18.09.2017 Solidworks Prof. 2023SP3 x64 auf Win 10
|
erstellt am: 21. Sep. 2017 09:51 <-- editieren / zitieren --> Unities abgeben:
Hallo Stefan - hallo Mitleser um es mit den Worten von Dr. Frankenstein zu sagen: "ES LEEEEEEEEEBT!!!!!!!" VIELEN DANK! Die Frage warum der Code so funktioniert sollte natürlich nebendem Fakt das es funktioniert im Vordergrund stehen. Jedoch verstehe ich nicht warum bei deinem Code Code: ConfigNameFromDrawingView = View.ReferencedConfiguration
die Zeile funktioniert und bei meinen Versuchen nicht... ebenso versteh ich die Zeile Code: Debug.Print ConfigNameFromDrawingView
nicht. Trotzdem bin ich sehr dir sehr dankbar! Grüße Michael 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: 21. Sep. 2017 11:41 <-- editieren / zitieren --> Unities abgeben: Nur für remtc
Zitat: Original erstellt von remtc: ebenso versteh ich die Zeile Code: Debug.Print ConfigNameFromDrawingView
nicht.
Das kann ich noch schnell eben klären, das dient nur der Ausgabe im Direktfenster, damit man auch mal während des Testens gucken kann, ob denn die angenommenen Daten zurückgeliefert werden oder wo man gerade im Quellcode ist oder oder oder. Debug.print ist vermutlich immer noch das am häufigsten benutze Fehleranalysetool Den Direktbereich kannst du im Makroeditor mit STRG-G oder im Ansichtmenu/Direktbereich aufmachen. Alles, was du dann im Quellcode mit Debug.Print ausgibst landet dort. Für das eigentlich Makro hat es keinen Zusatznutzen und könnte weggelassen werden. Ciao, Stefan ------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|