| |  | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte | | |  | PNY: der unverzichtbare Partner für umfassende KI-Lösungen von Workstations bis zu Edge Computing und KI-Cluster-Bereitstellung, eine Pressemitteilung
|
Autor
|
Thema: Layout löschen (3355 mal gelesen)
|
rkl3011 Mitglied CAD-System- und Anwendungsunterstützung

 Beiträge: 26 Registriert: 01.07.2004
|
erstellt am: 15. Jul. 2004 11:50 <-- editieren / zitieren --> Unities abgeben:         
Hallo, ich möchte programmgesteuert alle Layouts einer Zeichnung löschen, die nicht benutzt werden, d.h. in denen es keine Ansichtsfenster gibt. Es gibt eine Prozedur (hier nicht gezeigt, da unwichtig), die alle Blöcke einer Zeichnung durchläuft und den Block (sowie die Zeichnung selbst) an die folgende Prozedur übergibt. Public Function DeleteLayoutIfEmpty(ByRef objBlock As AcadBlock, ByRef objDWG As AcadDocument) As String Dim objAcadEntity As AcadEntity Dim lngViewports As Long lngViewports = 0 'Ein Layout muss mind. vorhanden sein If objDWG.Layouts.Count > 2 Then If objBlock.IsLayout Then 'Model Space wird auch als Layout gezählt, daher... If InStr(1, objBlock.Name, "*Paper_Space") > 0 Then For Each objAcadEntity In objBlock lngViewports = lngViewports + IsViewport(objAcadEntity) Next objAcadEntity If lngViewports = 1 Then 'Problem: Das funktioniert nicht!!! objDWG.Blocks.Item(objBlock.Name).Delete End If End If End If End If Set objAcadEntity = Nothing End Function Die Funktion IsViewport überprüft, ob das übergebene Blockelement ein Ansichtsfenster ist oder nicht. Sie gibt 1 zurück, wenn das Element ein Ansichtsfenster ist, andernfalls 0. Private Function IsViewport(ByRef objAcadEntity As AcadEntity) As Long If objAcadEntity.ObjectName = "AcDbViewport" Then IsViewport = 1 Else IsViewport = 0 End If End Function Jetzt das Problem: Das leere Layout lässt sich nicht löschen. Es tritt ein Laufzeitfehler auf mit der Meldung "Kann nicht von Caller gelöscht werden." Hat jemand eine Idee, woran es liegen könnte, bzw. hat jemand schon einmal Layouts programmgesteuert gelöscht? Vielen Dank für die Hilfe im Voraus. MfG rkl3011 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mapcar Mitglied CADmin

 Beiträge: 1250 Registriert: 20.05.2002 Die Phönizier haben das Geld erfunden - aber warum so wenig? (Johann Nepomuk Nestroy)
|
erstellt am: 16. Jul. 2004 01:18 <-- editieren / zitieren --> Unities abgeben:          Nur für rkl3011
Hi Namenlos, dein Code ist ein wenig schwer nachvollziehbar, weil ich nicht weiss, was du da wirklich übergibst. Kann dir also nicht sagen, woher der Fehler kommt. Aber das Problem liegt irgendwo bei dir und nicht im System, denn das hier geht ohne Problem: Code:
Public Sub Test() Dim n_layouts As Integer Dim oLayout As Object, oBlock As Object, oEntity As Object Dim bKeep As Boolean n_layouts = ThisDrawing.Layouts.Count For Each oLayout In ThisDrawing.Layouts bKeep = False If oLayout.ModelType = False Then Set oBlock = oLayout.Block For Each oEntity In oBlock If oEntity.ObjectName = "AcDbViewport" Then bKeep = True End If Next oEntity If bKeep <> True Then If n_layouts > 2 Then oLayout.Delete n_layouts = n_layouts - 1 End If End If End If Next oLayout End Sub
Man sollte nur das innere Foreach (Entities) durch einen geeigneteren Iterator ersetzen, der abbricht, sobald ein VPORT gefunden wird. Das könnte bei dicken Zeichnungen echt von Vorteil sein. So wir hier läuft das eben ohne Sinn bis zum bitteren Ende weiter:-( Gruß, Axel Strube-Zettler ------------------ Meine AutoLisp-Seiten Meine private Homepage Mein Angriff auf dein Zwerchfell Mein Lexikon der Fotografie Mein gereimtes Gesülze Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkl3011 Mitglied CAD-System- und Anwendungsunterstützung

 Beiträge: 26 Registriert: 01.07.2004
|
erstellt am: 16. Jul. 2004 07:52 <-- editieren / zitieren --> Unities abgeben:         
Hallo mapcar. danke für den Tipp. So habe ich es letztendlich auch umgesetzt. Was ich ursprünglich mit meiner Prozedur erreichen wollte, ist die Übergabe eines Blockes (nicht eines Layouts) an diese Prozedur (Public Function DeleteLayoutIfEmpty(ByRef objBlock As AcadBlock, ...) - nur lässt sich dieser Block, wenn er ein Layout ist, nicht löschen. In meinem Fall müssen alle Entities des Blocks durchlaufen werden, da ich wissen möchte, wie viele Ansichtsfenster in dem Layout vorhanden sind, denn nur die, die keine Ansichtsfenster haben (also leere Layouts) müssen gelöscht werden. Danke und Gruß, Ronny Klinder (mein Name) [Diese Nachricht wurde von rkl3011 am 16. Jul. 2004 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mapcar Mitglied CADmin

 Beiträge: 1250 Registriert: 20.05.2002 Die Phönizier haben das Geld erfunden - aber warum so wenig? (Johann Nepomuk Nestroy)
|
erstellt am: 16. Jul. 2004 08:41 <-- editieren / zitieren --> Unities abgeben:          Nur für rkl3011
Zitat: Original erstellt von rkl3011: In meinem Fall müssen alle Entities des Blocks durchlaufen werden, da ich wissen möchte, wie viele Ansichtsfenster in dem Layout vorhanden sind, denn nur die, die keine Ansichtsfenster haben (also leere Layouts) müssen gelöscht werden.
Öh, Ronny, du hast offensichtlich nicht verstanden, was ich meinte. Es ist doch egal, wie viele Ansichtsfenster drin sind. Wenn du 1 gefunden hast, kannst du schon abbrechen, oder? Um zu prüfen, dass in einem See Wasser drin ist, reicht's doch, wenn du einen Finger reinsteckst. Nicht gleich leertrinken;-) Gruß, Axel Strube-Zettler
------------------ Meine AutoLisp-Seiten Meine private Homepage Mein Angriff auf dein Zwerchfell Mein Lexikon der Fotografie Mein gereimtes Gesülze Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkl3011 Mitglied CAD-System- und Anwendungsunterstützung

 Beiträge: 26 Registriert: 01.07.2004
|
erstellt am: 16. Jul. 2004 08:48 <-- editieren / zitieren --> Unities abgeben:         
Brat mir einer 'n Stoch, du hast Recht. Danke für den Tipp. Wird belohnt. Gruß, Ronny Klinder Anmerkung: Das Layout selbst wird auch als "Viewport" gezählt, d.h. wenn es insgesamt zwei sind, dann ist ein "richtiges" Ansichtsfenster im Layout. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
 |