Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  SolidWorks
  Löschen von Blockdefinition per API

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
  
Visiativ Blog | Tipps & Tricks rund um SOLIDWORKS und 3DEXPERIENCE. , ein Kurs
Autor Thema:  Löschen von Blockdefinition per API (1662 mal gelesen)
Thomas Rolf
Mitglied
Dipl.-Ing. / CAD-Admin


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

Beiträge: 189
Registriert: 02.07.2001

SWX 2015 SP4.0

erstellt am: 05. Nov. 2007 14:24    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;
Ich habe extreme Schwierigkeiten, in SWX2007 eine Blockdefinition per API zu löschen.
inzwischen habe ich die Definition als Objekt in "swBlockDef" und kann auch mit
CurBlockDefFilename=swBlockDef.FileName dem Dateinamen der Blockdefinition feststellen.
Jetzt versuch ich die Definition zu löschen, kann sie aber noch nicht einmal selektieren.
"retval = swDrawingDoc.Extension.SelectByID2(CurBlockDefFilename, "BLOCKDEF", 0, 0, 0, False, 0, Nothing, swSelectOptionDefault)"
bringt kein Ergebnis.

PS.: Muß ich vielleicht vorher alle Blockinstanzen löschen? Wenn Ja, wie geht das denn?

Gruß und Dank imvoraus
Th.Rolf

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: 05. Nov. 2007 14:34    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 Thomas Rolf 10 Unities + Antwort hilfreich

Hallo Thomas,

anbei eine Funktion die in einer Zeichnung alle Blöcke durchsucht und die gewünschte Blockinstanz durch einen Vergleich des Blocknamens löscht. Dort könnte man naturlich auch den Filename abfragen.
Selektiert und gelöscht wird der Block mit Hilfe des Annotation Objekt. Ich hoffe die Funktion hilft dir weiter.

Code:

Dim oSwApp As SldWorks.SldWorks
Dim oSwModel As SldWorks.ModelDoc2
Dim oSwDrawing As SldWorks.DrawingDoc
Dim oSwView As SldWorks.View
Dim oSwBlock As SldWorks.BlockInstance
Dim oSwAktBlock As SldWorks.BlockInstance
Dim oSwBlockDef As SldWorks.BlockDefinition
Dim oSwAnno As SldWorks.Annotation

oSwApp = CType(GetObject(, "SldWorks.Application"), SldWorks.SldWorks)
oSwModel = CType(oSwApp.ActiveDoc, SldWorks.ModelDoc2)
oSwDrawing = CType(oSwModel, SldWorks.DrawingDoc)
oSwView = CType(oSwDrawing.GetFirstView, SldWorks.View)

oSwAktBlock = oSwView.GetFirstBlockInstance
oSwModel.ClearSelection2(True)

Do While Not oSwAktBlock Is Nothing
  oSwBlock = oSwAktBlock
  oSwAktBlock = oSwBlock.GetNext
  oSwBlockDef = oSwBlock.Definition
  Debug.Print(oSwBlockDef.Name)
  If oSwBlockDef.Name = "???" Then
      oSwAnno = oSwBlock.GetAnnotation
      oSwAnno.Select(False)
      oSwModel.DeleteSelection(True)
  End If
Loop


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

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Thomas Rolf
Mitglied
Dipl.-Ing. / CAD-Admin


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

Beiträge: 189
Registriert: 02.07.2001

SWX 2015 SP4.0

erstellt am: 05. Nov. 2007 15:47    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 Daniel;

(Fast) genau da liegt mein Problem.
Hast Du schon mal dieses Prog unter SolidWorks2007 versucht?

Ab 2007 werden nämlich viele dieser Befehle (z.B. GetFirstBlockInstance) nicht mehr unterstützt.

Stattdessen läuft vieles über der ScetchManager.

Außerdem: Wenn ich alle Instanzen gelöscht habe, wie bekomme ich dann die Blockdefinition selbst gelöscht?

Trotzdem Danke für Deine Bemühungen
mfg Thomas

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: 05. Nov. 2007 15:55    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 Thomas Rolf 10 Unities + Antwort hilfreich

Leider kann ich es im Moment nicht testen, da ich in WinX64 unterwegs bin und dort nur Sw2006 installiert habe. Hatte gedacht das ich diese Funktion für Sw2007 geschrieben hatte. Werde es mir mal anschauen wenn ich wieder unter WinX86 unterwegs bin.

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

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: 05. Nov. 2007 16:42    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 Thomas Rolf 10 Unities + Antwort hilfreich

Hallo Thomas,

habe da eine .net Funktion gefunden welche alle Blöcke und deren Instanzen ermittelt.
Selektieren und Löschen sollte wie in der Funktion für Sw2006 über das Annotation Objekt funktionieren, ist in den Schleifen dieses Codeschnipsel allerdings nicht vorhanden und müsste halt noch eingefügt und getestet werden.

Code:

'SolidWorks 2007 und 2008
Dim oSwApp As SldWorks.SldWorks
Dim oSwModel As SldWorks.ModelDoc2
Dim oSwDrawing As SldWorks.DrawingDoc
Dim oSwSketchManager As SldWorks.SketchManager
Dim oSwBlockDef As SldWorks.SketchBlockDefinition
Dim oSwBlockInst As SldWorks.SketchBlockInstance
Dim oDummyObjektDefinition() As Object
Dim oDummyObjektInstance() As Object

oSwApp = CType(GetObject(, "SldWorks.Application"), SldWorks.SldWorks)
oSwModel = CType(oSwApp.ActiveDoc, SldWorks.ModelDoc2)
oSwDrawing = CType(oSwModel, SldWorks.DrawingDoc)
oSwSketchManager = oSwDrawing.SketchManager

'Alle Blöcke der Zeichnung ermitteln
oDummyObjektDefinition = CType(oSwSketchManager.GetSketchBlockDefinitions, [Object]())
For iBloecke  As Integer = 0 To oDummyObjektDefinition.GetUpperBound(0) Step 1
    'Blockdefinition Objekt
    oSwBlockDef = CType(oDummyObjektDefinition(iBloecke), SldWorks.SketchBlockDefinition)
    'Alle Instanzen dieses Blocks
    oDummyObjektInstance = CType(oSwBlockDef.GetInstances, [Object]())
    For iInstanzen As Integer = 0 To oDummyObjektInstance.GetUpperBound(0) Step 1
        'Blockinstanz Objekt
        oSwBlockInst = CType(oDummyObjektInstance(iInstanzen), SldWorks.SketchBlockInstance)
    Next iInstanzen
Next iBloecke 


[Edit]
Habe gerade in der API-Hilfe nachgelesen das man eine Blockinstanz direkt selektieren kann.

Code:
Retval = SketchBlockInstance.Select ( Append, Data)

[/Edit]
------------------
Mfg Daniel

   

[Diese Nachricht wurde von tbd am 05. Nov. 2007 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Alllroad
Mitglied


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

Beiträge: 6
Registriert: 13.02.2008

erstellt am: 13. Feb. 2008 10:43    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 Thomas Rolf 10 Unities + Antwort hilfreich

Hallo
Für das Einfügen und Ausfüllen von Blöcken habe ich den folgenden Code geschrieben. Dieser Code funktioniert bis zu der SolidWorks Version 2006 einwandfrei. Ab der Version 2007 wird alles über den so genannten ScetchManager bearbeitet und der Code funktioniert nicht mehr.
Habe versucht mit Hilfe der Hilfe von SolidWorks und über diverse Foreneinträge diesen Code anzupassen. Habe es aber noch nicht geschafft, weil die Infos zu den einzelnen Codezeilen in der Solidworks-Hilfe eher mager sind und weil in den Foren immer nur andere Anwendungen bearbeitet wurden.
Vielleicht hat jemand schon Erfahrung mit Einfügen und Ausfüllen von Blöcken ab der Version 2007 und kann mir weiterhelfen. Wäre echt super wenn mir jemand weiterhelfen könnte.

  •  
    Private Sub FillPEDInformation(ByRef objSWDrawing As Object, ByVal strBlocksDirectPath As String, _
          ByVal sngXPos As Single, ByVal sngYPos As Single, ByVal sngScale As Single, ByVal strLanguage As String)
      '* Purpose  :  Insert PED information
      '* Accepts  :  objSWDrawing - SolidWorksDrawing
      '*            strBlocksPath - Path of SolidWorks blocks
      '*            sngXPos - Required position (X coordinate) on drawing
      '*            sngYPos - Required position (Y coordinate) on drawing
      '*            strLanguage - Language of drawing
     
    If gc_DevelopmentMode = False Then On Error GoTo PROC_ERR
     
     
      Dim strBlockName As String
      Dim objBlockDefinition As Object
      Dim objBlockInstance As Object
      Dim strFluidIsGaseous As String
      Dim strFluidIsNotGaseous As String
      Dim strXMLRoot As String
      Dim vntReturnValue As Variant
     
     
      '* Define root in XML file
      strXMLRoot = "Project/Mixer/PED/"
     
            strFluidIsNotGaseous = ""
         
     
        strXMLRoot = "Project/Mixer/PED/"
     
      Select Case ReadXML(strXMLRoot & "Module")
     
      Case "A", "--", "", " ", "-", "Art3Abs3"
      strBlocksDirectPath = "G:\MRT\MRT_WT\Order_Processing\Konstruktion\CAD\Solidworks\Blocks\Designtables\"
      '* Define file for PED table, depending on language
      Select Case strLanguage
       
        Case "German": strBlockName = strBlocksDirectPath & "Tabelle_PED_A_DE.SLDBLK"
         
         
        '*  Case Else: strBlockName = strBlocksPath & "ped_e.SLDBLK"
      End Select
     
      '* Insert PED table into the drawing
      Set objBlockInstance = objSWDrawing.InsertBlock(strBlockName, sngXPos - 0.2, sngYPos, 0, sngScale)
      Set objBlockDefinition = objBlockInstance.definition
     
      '* Fill data from XML file into the PED table
      With objBlockInstance
         
          vntReturnValue = .SetAttributeValue("Designcode", ReadXML(strXMLRoot & "DesignCode"))
         
         
      End With
     
     
    PROC_EXIT:
      Exit Sub
     
    PROC_ERR:
      Call ShowError(m_strModuleName, "FillPEDInformation", Err.Number, Err.Description)
      GoTo PROC_EXIT
     
    End Sub


  • Freundliche Grüsse

    Rudolf

    Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

  • Thomas Rolf
    Mitglied
    Dipl.-Ing. / CAD-Admin


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

    Beiträge: 189
    Registriert: 02.07.2001

    SWX 2015 SP4.0

    erstellt am: 13. Feb. 2008 11:33    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 Allroad;

    Inzwischen, nach mehreren Versuchen, kann ich nur davor warnen, mit SolidWorks-2007 per ARI ein Einfügen von Blöcken zu versuchen.

    Die folgenden Nachteile habe ich entdeckt und auch mit der Hotline diskutiert:

    1. Die "neuen" Blöcke unterscheiden sich SolidWorks-intern gravierend von den alten (obwohl sie "von außen" gleich aussehen).
        Wenn man einen Vor-2007-Block durch einen 2007-Block per API ersetzt, MUSS man lt. SolidWorks das Dokument speichern, schließen und neu aufrufen !!
        Ansonsten kann (und wird) es zu Abstürzen von SolidWorks kommen.

    2. Beim Löschen eines Blockes per API dürfen auf keinen Fall vorher die Instanzen gelöscht werden! Es sollte beim Löschen des Blockes immer min. 1 Instanz vorhanden sein.

    Auch wenn man Pkt. 1 und 2 beachtet, kann es zu einem Einfrieren des Bildschirminhalts kommen. Grund noch unbekannt.

    Außerdem kann es sein, dass beim API-Einfügen eines Blockes nur die Textelemente und nicht die Linienelemente des Blockes eingefügt werden.
    ACHTUNG: Danach kann die Datei nicht mehr gespeichert werden, ohne vorher die Blöcke manuell wieder zu löschen. Meldung:"Kann Datei nicht speichern!"

    Also: Besser vorerst die Finger davon lassen.
    Lt. Hotline sind die Bugs in der 2008 eliminiert. Ich habs jedoch noch nicht mit 2008 getestet.

    Gruß
    Thomas

    Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

    Alllroad
    Mitglied


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

    Beiträge: 6
    Registriert: 13.02.2008

    erstellt am: 04. Mrz. 2008 15:55    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 Thomas Rolf 10 Unities + Antwort hilfreich

    Hallo Thomas

    Erst einmal vielen Dank für die Antwort und sorry das ich so lange nicht darauf reagiert habe.

    Habe jemanden getroffen der sich schon seit längerem mit der Problematik SW07 und VB beschäftigt. Die von Dir beschriebenen Punkte konnte er mir alle bestätigen. Für die meisten Probleme fanden sie Lösungen mit denen dann auch mit dem SW07 gearbeitet werden kann, hängt auch ein wenig davon ab welches Service-Pack von SW07 verwendet wird.

    Gruss

    Rudolf

    Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

    Alllroad
    Mitglied


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

    Beiträge: 6
    Registriert: 13.02.2008

    erstellt am: 05. Mrz. 2008 10:24    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 Thomas Rolf 10 Unities + Antwort hilfreich

    Hallo

    Die Sache mit den Blöcken habe ich in den Griff bekommen. Jetzt habe ich ein neues Problem. Der nachfolgende Code verändert eine Skizzenlinienlänge auf einer Zeichnung.

    .Parameter("D13@Skizze22@" & strSWDrawing).Value = (ReadXML(strXMLRoot & "S"))

    In der Version 2007 funktioniert dieser Code nicht mehr. Es scheint als ob die benannte Skizze nicht gefunden wird. Ein Laufzeitfehler wird angezeigt. Der selbe Code, angewendet für die Änderung einer Skizzenlänge in einem Part, funktioniert in SW07 einwandfrei. 

    .Parameter("F@Skizze1@" & strSWPart).Value = rst.Fields("f")


    Hat jemand eine Idee an was es liegen könnte?

    Gruss

    Rudolf

    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