Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de
  AutoCAD VBA
  Layout löschen

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


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

Beiträge: 26
Registriert: 01.07.2004

erstellt am: 15. Jul. 2004 11:50    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,

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



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

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

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


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

Beiträge: 26
Registriert: 01.07.2004

erstellt am: 16. Jul. 2004 07:52    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 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



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

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

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


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

Beiträge: 26
Registriert: 01.07.2004

erstellt am: 16. Jul. 2004 08:48    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

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

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)2025 CAD.de | Impressum | Datenschutz