| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: WBLOCK mit VBA (1297 mal gelesen)
|
wklemens Mitglied Systemingenieur
Beiträge: 383 Registriert: 02.09.2002
|
erstellt am: 27. Feb. 2003 16:09 <-- editieren / zitieren --> Unities abgeben:
Hallo! Möchte mit VBA eingefügte Blöcke einer Zeichnung mit WBLOCK speichern. Mit ThisDrawing.Wblock Filename Auswahlsatz kann ich doch nur neue Blöcke erstellen. Die Blöcke existieren bereits in der Zeichnung. Vielen Dank! ------------------ Grüße aus Linz Willi Klemens MCDS Datensystem GmbH www.mcds.net Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RoSiNiNo Mitglied Konstrukteur
Beiträge: 1126 Registriert: 09.10.2002 Autodesk Building Design Suite Premium 2021 Windows 10 Pro 64bit HP Workstation Z620, 24GB GeForce GTX 970
|
erstellt am: 28. Feb. 2003 09:42 <-- editieren / zitieren --> Unities abgeben: Nur für wklemens
|
wklemens Mitglied Systemingenieur
Beiträge: 383 Registriert: 02.09.2002
|
erstellt am: 28. Feb. 2003 11:32 <-- editieren / zitieren --> Unities abgeben:
@Roland: Ich habe eben kein SelectionSet. Die Blöcke sind in der Zeichnung bereits eingefügt. Ich will alle Blöcke aber als WBLOCK exportieren - und das in VBA. In LISP ist das eh kein Problem. Meine jetzige Möglichkeit ist über SendCommand "._wblock" ...., aber das ist nicht gerade eine saubere Lösung. Als entweder ich bekomme ein SelectionSet von einem Block nur über den Blocknamen oder ???? ------------------ Grüße aus Linz Willi Klemens MCDS Datensystem GmbH www.mcds.net Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bernd Cuder Mitglied Selbständig
Beiträge: 692 Registriert: 10.07.2002 AutoCAD 2002/2004/2005 unter Windows 2000 Professional SP3 PIV 3.4GHz 1024MB NVIDIA GeForce FX Go5700
|
erstellt am: 28. Feb. 2003 11:49 <-- editieren / zitieren --> Unities abgeben: Nur für wklemens
|
wklemens Mitglied Systemingenieur
Beiträge: 383 Registriert: 02.09.2002
|
erstellt am: 28. Feb. 2003 20:09 <-- editieren / zitieren --> Unities abgeben:
|
wklemens Mitglied Systemingenieur
Beiträge: 383 Registriert: 02.09.2002
|
erstellt am: 03. Mrz. 2003 09:12 <-- editieren / zitieren --> Unities abgeben:
@Bernd: Habe einen Auswahlsatz mit dem Blockobjekten gemacht, über Thisdrawing.blocks(BLOCKNAME).item hat aber nicht so recht funktioniert. Hast Du vielleicht ein Beispiel? Danke!
------------------ Grüße aus Linz Willi Klemens MCDS Datensystem GmbH www.mcds.net Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bernd Cuder Mitglied Selbständig
Beiträge: 692 Registriert: 10.07.2002 AutoCAD 2002/2004/2005 unter Windows 2000 Professional SP3 PIV 3.4GHz 1024MB NVIDIA GeForce FX Go5700
|
erstellt am: 03. Mrz. 2003 10:25 <-- editieren / zitieren --> Unities abgeben: Nur für wklemens
Public Sub Wblock() Dim ss As AcadSelectionSet Dim bs As AcadSelectionSet Dim iz, uz, vz As Integer Dim entity As AcadEntity Dim entitys As Variant Dim name As String Dim path As String On Error GoTo Ende Set ss = ThisDrawing.SelectionSets.Add("Blocks") Set bs = ThisDrawing.SelectionSets.Add("Wblocks") ss.SelectOnScreen iz = ss.Count For uz = 0 To iz - 1 Set entity = ss.Item(uz) If entity.ObjectName = "AcDbBlockReference" Then name = entity.name path = "D:/" & name & ".dwg" entitys = entity.Explode bs.AddItems entitys ThisDrawing.Wblock path, bs bs.Delete bs.Clear End If Next Ende: ss.Clear ss.Delete End Sub
------------------ Bernd Cuder Cad&Co makes CAD easy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
wklemens Mitglied Systemingenieur
Beiträge: 383 Registriert: 02.09.2002
|
erstellt am: 03. Mrz. 2003 10:43 <-- editieren / zitieren --> Unities abgeben:
Hallo Bernd! Vielen Dank! Aber das mit Ursprung und so ist recht gut, aber meine Blöcke haben auch Attribute, die ich noch brauch. Es sollte auch nicht die Zeichnung verändert werden. Es muß irgendwie auch ohne Ursprung gehen. ------------------ Grüße aus Linz Willi Klemens MCDS Datensystem GmbH www.mcds.net Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bernd Cuder Mitglied Selbständig
Beiträge: 692 Registriert: 10.07.2002 AutoCAD 2002/2004/2005 unter Windows 2000 Professional SP3 PIV 3.4GHz 1024MB NVIDIA GeForce FX Go5700
|
erstellt am: 03. Mrz. 2003 10:53 <-- editieren / zitieren --> Unities abgeben: Nur für wklemens
|
Bernd Cuder Mitglied Selbständig
Beiträge: 692 Registriert: 10.07.2002 AutoCAD 2002/2004/2005 unter Windows 2000 Professional SP3 PIV 3.4GHz 1024MB NVIDIA GeForce FX Go5700
|
erstellt am: 03. Mrz. 2003 10:55 <-- editieren / zitieren --> Unities abgeben: Nur für wklemens
|
wklemens Mitglied Systemingenieur
Beiträge: 383 Registriert: 02.09.2002
|
erstellt am: 03. Mrz. 2003 11:05 <-- editieren / zitieren --> Unities abgeben:
|
RoSiNiNo Mitglied Konstrukteur
Beiträge: 1126 Registriert: 09.10.2002 Autodesk Building Design Suite Premium 2021 Windows 10 Pro 64bit HP Workstation Z620, 24GB GeForce GTX 970
|
erstellt am: 05. Mrz. 2003 09:43 <-- editieren / zitieren --> Unities abgeben: Nur für wklemens
Hallo Willi, hier noch der Code mit dem du nur Blöcke wählen kannst.
Code: Dim SS As AcadSelectionSet Dim FltTypes(0) As Integer Dim FltData(0) As Variant ' Frage nach den zu bearbeitenden Blöcken Set SS = CreateSelectionSet("LinienlängeAuswahl") FltTypes(0) = 0: FltData(0) = "INSERT" ' Selectionset erstellen, Benutzer fragen und Filter anwenden SS.SelectOnScreen FltTypes, FltData
und hier die Funktion CreateSelectionSet, sie ist recht praktisch, Fehlermeldungen werden abgefangen.
Code: Public Function CreateSelectionSet(Optional ssName As String = "SS") As AcadSelectionSet Dim SS As AcadSelectionSet On Error Resume Next Set SS = ThisDrawing.SelectionSets(ssName) If Err Then Set SS = ThisDrawing.SelectionSets.Add(ssName) SS.Clear Set CreateSelectionSet = SSEnd Function
Wenn du nämlich die Blöcke gleich gefiltert auswählst ersparst du dir die Abfrage ob die gewählten Elemente Blöcke sind und kannst daraus gleich den WBlock erstellen. [Diese Nachricht wurde von RoSiNiNo am 05. März 2003 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
wklemens Mitglied Systemingenieur
Beiträge: 383 Registriert: 02.09.2002
|
erstellt am: 05. Mrz. 2003 09:53 <-- editieren / zitieren --> Unities abgeben:
@Roland: Vielen Dank! Das Filtern der Blöcke ist kein Problem. Ich möchte eigentlich nur bereits in der Blocktabelle abgelegte, in der Zeichnung aber nicht eingefügte Blöcke als WBLOCK über VBA speichern. Der Umweg über den eingefügten Block mit Ursprung ist zwar eine Lösung, die Gut funktioniert, aber einen Auswahlsatz direkt aus der Blocktabelle wäre super. Vielleicht geht das auch nicht und ich habe einfach einen Denkfehler. Aber in Lisp geht es ja auch mit (command "._wblock" filename Blockname). Grüße nach Wien
------------------ Grüße aus Linz Willi Klemens MCDS Datensystem GmbH www.mcds.net Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RoSiNiNo Mitglied Konstrukteur
Beiträge: 1126 Registriert: 09.10.2002 Autodesk Building Design Suite Premium 2021 Windows 10 Pro 64bit HP Workstation Z620, 24GB GeForce GTX 970
|
erstellt am: 05. Mrz. 2003 12:58 <-- editieren / zitieren --> Unities abgeben: Nur für wklemens
Erst mal schöne Grüße nach Linz, bin gestern vorbeigefahren, war nämlich in Windischgarsten auf Kurzurlaub. Hier nocheinmal die Prozedur, schreibt alle Blöcke aus der Zeichnung in ein Verzeichnis. Code: Public Sub BlöckeAusZeichnung() Dim Blöcke As AcadBlocks Dim BlObj As AcadBlock Dim BlRef As AcadBlockReference Dim SS As AcadSelectionSet Dim Entitys As Variant Dim Name As String Dim Path As String Set Blöcke = ThisDrawing.Blocks If Blöcke.Count = 0 Then Exit Sub Set SS = CreateSelectionSet("Blöcke") For Each BlObj In Blöcke If Not (BlObj.IsLayout Or BlObj.IsXRef) Then Name = BlObj.Name Set BlRef = ThisDrawing.ModelSpace.InsertBlock(Point3D(0, 0, 0), Name, 1, 1, 1, 0) Path = "D:/" & Name & ".dwg" Entitys = BlRef.Explode SS.AddItems Entitys ThisDrawing.Wblock Path, SS SS.Erase SS.Clear End If Next BlObj ENDE: SS.DeleteEnd Sub
------------------ Roland Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RoSiNiNo Mitglied Konstrukteur
Beiträge: 1126 Registriert: 09.10.2002 Autodesk Building Design Suite Premium 2021 Windows 10 Pro 64bit HP Workstation Z620, 24GB GeForce GTX 970
|
erstellt am: 11. Mrz. 2003 08:12 <-- editieren / zitieren --> Unities abgeben: Nur für wklemens
Hallo Willi, bin auf ein paar Fehler draufgekommen, hab sie nun bereinigt. Bevor du die Blöcke erstellst solltest du aber ins WKS wechseln (ganz WICHTIG). Leider muß man dann die Zeichnungen noch einmal öffnen und "plan" eingeben, nach dem speichern ist dann auch ein Vorschaubild zu sehen. Code: Public Sub BlöckeAusZeichnung() Dim Blöcke As AcadBlocks Dim BlObj As AcadBlock Dim BlRef As AcadBlockReference Dim ss As AcadSelectionSet Dim Entitys As Variant Dim Name As String Dim Path As String Set Blöcke = ThisDrawing.Blocks If Blöcke.Count = 0 Then Exit Sub Set ss = CreateSelectionSet("Blöcke") For Each BlObj In Blöcke If Not (BlObj.IsLayout Or BlObj.IsXRef) Then Name = BlObj.Name If InStr(Name, "*") > 0 Then GoTo NextObj Set BlRef = ThisDrawing.ModelSpace.InsertBlock(Point3D(0, 0, 0), Name, 1, 1, 1, 0) Path = "D:/_Buero/Zeichnungen/_Test/" & Name & ".dwg" Entitys = BlRef.Explode ss.AddItems Entitys On Error Resume Next ThisDrawing.Wblock Path, ss If Err Then Err.Clear MsgBox "Block """ & Name & """ kann nicht gespeichert werden!" End If BlRef.Delete ss.Erase ss.Clear End If NextObj: Next BlObj ENDE: ss.DeleteEnd Sub
------------------ Roland Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
molo Mitglied Dipl. Ing. Versorgungstechnik
Beiträge: 384 Registriert: 16.07.2002 Windows 7 64 bit, AutoCAD MEP 2012
|
erstellt am: 12. Jun. 2003 13:27 <-- editieren / zitieren --> Unities abgeben: Nur für wklemens
Moin, ich habe mich noch nie mit VBA auseinandergesetzt. Bisher habe ich immer Lisp-Dateien für extra Aufgaben genommen. Da ich auch alle Blöcke aus einer Zeichnung als Wblock augeben möchte, habe ich Versucht den letzten VBA-Code von RoSiNo zum laufen zu bringen. Also Text in den Zwischenspeicher -> rein in den Visual Basic Editor 8hatte das Ding zum ersten mal in meien Leben auf) -> den Pfad anpassen (und gleich meine erste Änderung in einen VBA-Code!) -> das ganze speichern -> vbaausf eingeben -> auf ausführen drücken -> Fehlermeldung empfangen Folgende Fehlermeldung: Fehler beim Kompilieren: Sub oder Function nicht definiert CreateSelectionSet ist Blau hinterlegt, die oberste Zeile ist gelb, Was habe ich bloss wieder falsch gemacht?
------------------ Schöne Grüsse aus dem Norden Molo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bernd Cuder Mitglied Selbständig
Beiträge: 692 Registriert: 10.07.2002 AutoCAD 2002/2004/2005 unter Windows 2000 Professional SP3 PIV 3.4GHz 1024MB NVIDIA GeForce FX Go5700
|
erstellt am: 12. Jun. 2003 13:46 <-- editieren / zitieren --> Unities abgeben: Nur für wklemens
|
molo Mitglied Dipl. Ing. Versorgungstechnik
Beiträge: 384 Registriert: 16.07.2002 Windows 7 64 bit, AutoCAD MEP 2012
|
erstellt am: 12. Jun. 2003 14:13 <-- editieren / zitieren --> Unities abgeben: Nur für wklemens
Ok, das habe ich verstanden. Sämtliche Unterprogramme müssen in einem Projekt eingebunden sein. Dafür läuft es jetz bis zu Set BlRef = ThisDrawing.ModelSpace.InsertBlock(Point3D(0, 0, 0), Name, 1, 1, 1, 0) Point3D ist wieder hinterlegt. Ihr braucht mir jetzt nicht Programm stück für Stück mit mir durchgehen. Wenn es eben nicht bei mir Funktioniert habe ich eben Pech gehabt. Aber auf jeden Fall habe ich erstmal gelernt, wie man überhaupt VBA-Programme läd. Weiss jemand eine gut Internetseite zum VBA-lernen, ähnlich der von Axel für lisp. ------------------ Schöne Grüsse aus dem Norden Molo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RoSiNiNo Mitglied Konstrukteur
Beiträge: 1126 Registriert: 09.10.2002 Autodesk Building Design Suite Premium 2021 Windows 10 Pro 64bit HP Workstation Z620, 24GB GeForce GTX 970
|
erstellt am: 12. Jun. 2003 14:18 <-- editieren / zitieren --> Unities abgeben: Nur für wklemens
|
molo Mitglied Dipl. Ing. Versorgungstechnik
Beiträge: 384 Registriert: 16.07.2002 Windows 7 64 bit, AutoCAD MEP 2012
|
erstellt am: 12. Jun. 2003 14:27 <-- editieren / zitieren --> Unities abgeben: Nur für wklemens
|