| |
 | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS |
| |
 | SOLIDWORKS Visualize Grundlagen Schulung, ein Seminar am 08.09.2025
|
Autor
|
Thema: API: Zeichnungsblatt einer Blockinstanz ermitteln (2193 mal gelesen)
|
tbd Mitglied Teamleiter
  
 Beiträge: 825 Registriert: 26.01.2006 Dell Percision T5400 Intel(R) Xeon(R) CPU X5460 @ 3.16GHz 3,25 GB RAM Nvidia Quadro FX 4600 ----- Win XP Prof SP 3 SW 2008 SP 5.0 PARTsolutions 8.1.08 Cideon SAP PLM 5.103.5.17 Visual Studio 2008
|
erstellt am: 29. Jul. 2009 11:57 <-- editieren / zitieren --> Unities abgeben:         
Hallo Zusammen, folgende Ausgangssituation: In einer SolidWorks 2008 Zeichnung sind mehrere Zeichnungsblätter enthalten. Zudem sind in dieser Zeichnung verschiedene Blockdefinitionen mit mehreren –instanzen vorhanden. Diese zu ermitteln ist natürlich kein Problem (SketchManager.GetSketchBlockDefinitions; SketchBlockDefinition.GetInstances) Woran ich jedoch verzweifle ist herauszufinden auf welchem Zeichnungsblatt sich eine Blockinstanz befindet. Ich kann über den Mathpoint (SketchBlockInstance.InstancePosition) zwar die Position der Instanz ermitteln, aber leider nicht auf welches Blatt sich diese Position bezieht. Nun hoffe ich, dass jemand schon mal ein ähnliches Problem hatte oder mir jemand einen Tipp geben kann.
------------------ Mfg Daniel www.MySldWorks.de - SolidWorks API Snippets Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
u.clemens Mitglied Konstrukteur
  
 Beiträge: 964 Registriert: 04.07.2000 engineer's law o cheap o fast o good check only two !
|
erstellt am: 29. Jul. 2009 13:06 <-- editieren / zitieren --> Unities abgeben:          Nur für tbd
wenn du die Blockinstanz hast, hast du auch die dazugehörige Sketch ( SketchBlockInstance::GetSketch), jede Sketch gehört zu einem View. Hast du den View, hast du auch das Sheet ( View::Sheet
). Nun scheint es aber keine Methode zu geben, die den View zu einer Sketch ermittelt ... (sowas wie Sketch::GetView) Wie wäre es, wenn du folgenden Umweg gehst: Je Sketch hat einen Namen (Sketch.Name) - den ermittelst du von deiner Blockinstance-Sketch. Nun gehst du auf allen Sheets alle Views durch, ermittelst die "underlying Sketch" (View::GetSketch) und deren Namen. Die beiden Namen vergleichst du - solange bis du die Übereinstimmung gefunden hast.
------------------ mfg uc Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Baumjäger Mitglied CAD/PDM Administrator
 
 Beiträge: 339 Registriert: 21.06.2006 SW2017 - S5.0 AutoCAD Mechanical 2018 Win10 Intel Xeon E3-1240 V2 3,4GHz 16GB RAM NVIDIA Quadro 4000
|
erstellt am: 29. Jul. 2009 13:23 <-- editieren / zitieren --> Unities abgeben:          Nur für tbd
Hi, Wenn du den Block mit SelectbyID2 auswählst, müsste ja eigentlich das Sheet dazu auch aktiv sein, dann kannst du vllt. mit View = View.Sheet die aktive Seite auslesen. vielleicht ist das ja ein Ansatzpunkt. viele Grüße Andy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tbd Mitglied Teamleiter
  
 Beiträge: 825 Registriert: 26.01.2006 Dell Percision T5400 Intel(R) Xeon(R) CPU X5460 @ 3.16GHz 3,25 GB RAM Nvidia Quadro FX 4600 ----- Win XP Prof SP 3 SW 2008 SP 5.0 PARTsolutions 8.1.08 Cideon SAP PLM 5.103.5.17 Visual Studio 2008
|
erstellt am: 29. Jul. 2009 14:35 <-- editieren / zitieren --> Unities abgeben:         
Hallo Clemens & Andy, danke für die Hinweise. Die Idee mit der Sketch ist sehr gut und meiner Meinung am sichersten. Ich werde da mal was basteln und ausprobieren. Wenn es die ersten Ergebnisse gibt, lasse ich es euch wissen. Danke an euch! ------------------ Mfg Daniel www.MySldWorks.de - SolidWorks API Snippets Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tbd Mitglied Teamleiter
  
 Beiträge: 825 Registriert: 26.01.2006 Dell Percision T5400 Intel(R) Xeon(R) CPU X5460 @ 3.16GHz 3,25 GB RAM Nvidia Quadro FX 4600 ----- Win XP Prof SP 3 SW 2008 SP 5.0 PARTsolutions 8.1.08 Cideon SAP PLM 5.103.5.17 Visual Studio 2008
|
erstellt am: 30. Jul. 2009 08:59 <-- editieren / zitieren --> Unities abgeben:         
Guten Morgen. leider funktionieren beide Vorschläge nicht. Idee mit den Skizzen: Eine View liefert immer nur eine Skizze zurück, eben die der View für Schnittlinien und ähnliches. Wenn man diese Skizze nach Ihren Blockinstanzen fragt (Sketch.GetSketchBlockInstances) bekommt man Nothing zurück, irgendwie auch logisch, da diese ja kein Block ist. Idee mit der Selektion: Wenn ich die Blockinstanz selektiere steht im Selektionsmanager keine View (SelectionMgr.GetSelectedObjectsDrawingView2). Deshalb ist mein Problem leider immer noch nicht gelöst. Wie bekomme ermittele ich das Zeichnungsblatt auf dem sich die Blockinstanz befindet?
------------------ Mfg Daniel www.MySldWorks.de - SolidWorks API Snippets Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
u.clemens Mitglied Konstrukteur
  
 Beiträge: 964 Registriert: 04.07.2000 engineer's law o cheap o fast o good check only two !
|
erstellt am: 30. Jul. 2009 11:08 <-- editieren / zitieren --> Unities abgeben:          Nur für tbd
Zitat: Original erstellt von tbd: Guten Morgen. leider funktionieren beide Vorschläge nicht.Wenn man diese Skizze nach Ihren Blockinstanzen fragt (Sketch.GetSketchBlockInstances) bekommt man Nothing zurück, irgendwie auch logisch, da diese ja kein Block ist.
... kann ich so nicht bestätigen! Allerdings scheint die Methode SketchBlockInstance::GetSketch fehlerhaft zu sein. Bei mir liefert sie die Skizze des Blattes (nicht Template!) und nicht einer Zeichenansicht zurück - obwohl die Blockinstance definitiv auf einer Ansicht eingefügt ist. Aber: Sketch.GetSketchBlockInstances liefert mir schon Blockinstancen zurück - und damit ist eigentlich alles klar für dein Problem (denk ich ...) Ich hab da mal was quick&dirty zusammengestrickt. Den Anfang mußt du dir für deine Verhältnisse anpassen. Bei mir läuft es sauber durch und gibt genau 1 Fund-Meldung aus. Für mehrere Blätter mußt du das noch entsprechend erweitern, aber wird für dich kein Problem sein ... Code:
Sub main()Set swApp = Application.SldWorks Set DrawingDoc = swApp.ActiveDoc Set SelMgr = DrawingDoc.SelectionManager swApp.ActiveDoc.ActiveView.FrameState = 1 'schnell eine Blockinstance holen boolstatus = DrawingDoc.ActivateView("Zeichenansicht5") boolstatus = DrawingDoc.Extension.SelectByID2("metall_BT_innen-1", "SUBSKETCHINST", 0.1685468639222, 0.2710635114504, 0, False, 0, Nothing, 0) Set swBlockInst = SelMgr.GetSelectedObject6(1, 0) 'BlockInstance-Namen holen swBlockInstName = swBlockInst.Name 'Lt. API: This method gets the sketch in which this block instance is present Set swBlockInstSketch = swBlockInst.GetSketch ' stimmt aber nicht! - Name der Skizze stimmt nicht swBlockInstSketchName = swBlockInstSketch.Name 'BlockDefinition-Namen holen Set swBlockDef = swBlockInst.Definition Set swBlockDefSketch = swBlockDef.GetSketch swBlockDefSketchName = swBlockDefSketch.Name 'alle Ansichten durchklappern Set View = DrawingDoc.GetFirstView While Not View Is Nothing 'Ansichtsname holen swViewName = View.Name 'Skizze der Ansicht holen Set swViewSketch = View.GetSketch 'Name der Skizze swViewSketchName = swViewSketch.Name 'Anzahl der Blöcke in der Skizze blockanzahl = swViewSketch.GetSketchBlockInstanceCount If blockanzahl > 0 Then 'alle BlockInstancen in der Skizze vBlockInst = swViewSketch.GetSketchBlockInstances For i = 0 To UBound(vBlockInst) 'Name der BlockInstance swViewBlockInstName = vBlockInst(i).Name 'wenn Namensübereinstimmung, dann Erfolgsmeldung If swBlockInstName = swViewBlockInstName Then retval = swApp.SendMsgToUser2(swBlockInstName & " gefunden in " & swViewName, swMbInformation, swMbOk) End If Next i End If Set View = View.GetNextView Wend End Sub
------------------ mfg uc Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tbd Mitglied Teamleiter
  
 Beiträge: 825 Registriert: 26.01.2006 Dell Percision T5400 Intel(R) Xeon(R) CPU X5460 @ 3.16GHz 3,25 GB RAM Nvidia Quadro FX 4600 ----- Win XP Prof SP 3 SW 2008 SP 5.0 PARTsolutions 8.1.08 Cideon SAP PLM 5.103.5.17 Visual Studio 2008
|
erstellt am: 30. Jul. 2009 11:27 <-- editieren / zitieren --> Unities abgeben:         
Hallo Clemens, danke für dein ausführliches Beispiel. Mein Problem wird sein, das mein Block auf dem Blattformat positioniert ist. Die View des Blattformats liefert mir leider keine Blockinstanzen. Ich habe mir aber anders geholfen. Ich ermittel die Skizze meiner Blockinstanz und somit das Feature dieser Skizze. Dann kann ich mich durch die Featureabhänigkeiten mit Feature.GetOwnerFeature nach oben arbeiten. Als letztes Feature habe ich dann das Blatt, oder das Blattformat. Durch einen Vergleich der Namen weis ich nun endlich wo sich meine Blockinstanz befindet. Hier der Code:
Code:
oSwFeature = CType( _ oSwSketchBlockInstance.GetSketch, sldworks.Feature) Do While oSwFeature.GetOwnerFeature IsNot Nothing oSwFeature = oSwFeature.GetOwnerFeature Loop 'Das letzte Feature ist das Blattformat oder das Blatt If oSwSheet.GetSheetFormatName = oSwFeature.Name Then Return True End If If oSwSheet.Name = oSwFeature.Name Then Return True End If
Danke nochmals für deine Unterstützung! Der Tipp mit der Skizze hat mich zu meiner Lösung gebracht! ------------------ Mfg Daniel www.MySldWorks.de - SolidWorks API Snippets [Diese Nachricht wurde von tbd am 30. Jul. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
u.clemens Mitglied Konstrukteur
  
 Beiträge: 964 Registriert: 04.07.2000 engineer's law o cheap o fast o good check only two !
|
erstellt am: 30. Jul. 2009 11:36 <-- editieren / zitieren --> Unities abgeben:          Nur für tbd
Zitat: Original erstellt von tbd:
Mein Problem wird sein, das mein Block auf dem Blattformat positioniert ist.
Na das hättest du mal eher sagen sollen ... Das macht doch alles viiiiiiel einfacher! Wenn du das sicher weißt, kannst du die dazugehörige Skizze mit Sheet.GetTemplateSketch holen - und dort findest du dann auch die Blockinstancen ...
------------------ mfg uc Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tbd Mitglied Teamleiter
  
 Beiträge: 825 Registriert: 26.01.2006 Dell Percision T5400 Intel(R) Xeon(R) CPU X5460 @ 3.16GHz 3,25 GB RAM Nvidia Quadro FX 4600 ----- Win XP Prof SP 3 SW 2008 SP 5.0 PARTsolutions 8.1.08 Cideon SAP PLM 5.103.5.17 Visual Studio 2008
|
erstellt am: 30. Jul. 2009 11:39 <-- editieren / zitieren --> Unities abgeben:         
|