| |
 | 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
 
 Beiträge: 189 Registriert: 02.07.2001 SWX 2015 SP4.0
|
erstellt am: 05. Nov. 2007 14:24 <-- editieren / zitieren --> Unities abgeben:         
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
  
 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 / zitieren --> Unities abgeben:          Nur für Thomas Rolf
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.AnnotationoSwApp = 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
 
 Beiträge: 189 Registriert: 02.07.2001 SWX 2015 SP4.0
|
erstellt am: 05. Nov. 2007 15:47 <-- editieren / zitieren --> Unities abgeben:         
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
  
 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 / zitieren --> Unities abgeben:          Nur für Thomas Rolf
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
  
 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 / zitieren --> Unities abgeben:          Nur für Thomas Rolf
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 ObjectoSwApp = 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
 Beiträge: 6 Registriert: 13.02.2008
|
erstellt am: 13. Feb. 2008 10:43 <-- editieren / zitieren --> Unities abgeben:          Nur für Thomas Rolf
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
 
 Beiträge: 189 Registriert: 02.07.2001 SWX 2015 SP4.0
|
erstellt am: 13. Feb. 2008 11:33 <-- editieren / zitieren --> Unities abgeben:         
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
 Beiträge: 6 Registriert: 13.02.2008
|
erstellt am: 04. Mrz. 2008 15:55 <-- editieren / zitieren --> Unities abgeben:          Nur für Thomas Rolf
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
 Beiträge: 6 Registriert: 13.02.2008
|
erstellt am: 05. Mrz. 2008 10:24 <-- editieren / zitieren --> Unities abgeben:          Nur für Thomas Rolf
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 |