Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  SolidWorks
  API: Zeichnungsblatt einer Blockinstanz ermitteln

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
  
SOLIDWORKS Visualize Grundlagen Schulung, ein Seminar am 08.09.2025
Autor Thema:  API: Zeichnungsblatt einer Blockinstanz ermitteln (2193 mal gelesen)
tbd
Mitglied
Teamleiter


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

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 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 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


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

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 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 tbd 10 Unities + Antwort hilfreich

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


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

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 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 tbd 10 Unities + Antwort hilfreich

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


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

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 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 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


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

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 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

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


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

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 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 tbd 10 Unities + Antwort hilfreich

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


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

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 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 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


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

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 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 tbd 10 Unities + Antwort hilfreich

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


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

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 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

Zitat:
Original erstellt von u.clemens:
Das macht doch alles viiiiiiel einfacher!

Und wie du da recht hast!

------------------
Mfg Daniel

www.MySldWorks.de - SolidWorks API Snippets

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