| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Purge Befehl (3333 mal gelesen)
|
veydan Mitglied
Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 10. Feb. 2010 15:01 <-- editieren / zitieren --> Unities abgeben:
Hallo! Ich mache in meiner Zeichnung ein Purge, um am Ende alles sauber zu haben. Aber es bleibt immer 1 Layer übrig, auf dem keien Elemente liegen.(In der Schnellauswahl, Layer ausgewählt, dann bestätigt er dass 0 Elemente auf dem Layer liegen) Rufe ich das Purge manuell über Autocad auf funktioniert es. Er Fragt mich ob ich den Layer bereinigen will, nach dem Bestätigen ist er weg. Hier der Code wie ich es mache: Es ist dann egal ob ich 5 oder 10 einstelle in der Schleife, der Layer bleibt da. 5 benötige ich aber um es so weit sauber zu bekommen.
Code:
Public Function PurgeAll() Dim doc As Document = Application.DocumentManager.MdiActiveDocument Dim acaddoc As AcadDocument = Nothing acaddoc = CType(doc.AcadDocument, AcadDocument) For i = 0 To 5 acaddoc.PurgeAll() Next acaddoc = Nothing End Function
folgenden Code habe ich in einem Beispiel gefunden, diese Verstehe ich aber nicht, was sie genau macht. was steht in der RegAppTable ? Code:
Public Sub PurgeCurrentDocument() Dim doc As Document = Application.DocumentManager.MdiActiveDocument Dim db As Database = doc.Database Dim ed As EditorInput.Editor = doc.Editor Dim count As Integer = PurgeDatabase(db) ' ed.WriteMessage(vbLf & "Purged {0} object{1} from " & "the current database.", count, If(count = 1, "", "s")) End Sub Private Function PurgeDatabase(ByVal db As Database) As Integer Dim idCount As Integer = 0 Dim tr As Transaction = db.TransactionManager.StartTransaction() Using tr ' Create the list of objects to "purge" Dim idsToPurge As New ObjectIdCollection() ' Add all the Registered Application names Dim rat As RegAppTable = DirectCast(tr.GetObject(db.RegAppTableId, OpenMode.ForRead), RegAppTable) For Each raId As ObjectId In rat If raId.IsValid Then idsToPurge.Add(raId) End If Next ' Call the Purge function to filter the list db.Purge(idsToPurge) Dim doc As Document = Application.DocumentManager.MdiActiveDocument Dim ed As EditorInput.Editor = doc.Editor ' ed.WriteMessage(vbLf & "Registered applications being purged: ") ' Erase each of the objects we've been ' allowed to For Each id As ObjectId In idsToPurge Dim obj As DBObject = tr.GetObject(id, OpenMode.ForWrite) ' Let's just add to me "debug" code ' to list the registered applications ' we're erasing Dim ratr As RegAppTableRecord = TryCast(obj, RegAppTableRecord) If ratr IsNot Nothing Then ed.WriteMessage("""{0}"" ", ratr.Name) End If obj.[Erase]() Next ' Return the number of objects erased ' (i.e. purged) idCount = idsToPurge.Count tr.Commit() End Using Return idCount End Function
mfg Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Ehrenmitglied V.I.P. h.c. 良い精神
Beiträge: 21533 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 10. Feb. 2010 15:07 <-- editieren / zitieren --> Unities abgeben: Nur für veydan
|
Ex-Mitglied
|
erstellt am: 10. Feb. 2010 15:12 <-- editieren / zitieren -->
Hi, >> Ich mache in meiner Zeichnung ein Purge, um am Ende alles sauber zu haben. >> Aber es bleibt immer 1 Layer übrig Bitte Zeichnung, in der dieses reproduzierbar ist, sonst raten wir uns 70 Runden lang durch und nicht mal dann ist ein Erfolg sichergestellt. >> auf dem keien Elemente liegen.(In der Schnellauswahl, Layer ausgewählt, >> dann bestätigt er dass 0 Elemente auf dem Layer liegen)
Die Schnellauswahl zeigt nicht alles, z.B. Elemente in einer BlockDEFINITION (BlockTableRecord), die einen Layer verwenden, aber auch Bemassungsstil, .... Layer können an vielen Stellen verwendet sein, nicht nur durch Elemente im Modellbereich/Papierbereich(e). >> was steht in der RegAppTable
Schau mal unter XData, da wirst Du darauf treffen, dass (strukturiert arbeitende) Applikationen für jede EED-Application einen Eintrag in dieser RegAppTable machen. - alfred -
------------------ www.hollaus.at |
veydan Mitglied
Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 10. Feb. 2010 15:32 <-- editieren / zitieren --> Unities abgeben:
|
Ex-Mitglied
|
erstellt am: 10. Feb. 2010 20:24 <-- editieren / zitieren -->
Hi, wenn ich Deine Zeichnung mit Deinem ersten Code bearbeite (COM-basiertem .PurgeAll), dann bleiben keine Layer über, welche ich dann über den händischen Befehl: _PURGE bereinigen könnte (Probiert mit AutoCAD 2010) Welcher Layer wird Deiner Meinung nach nicht bereinigt und sollte aber zu bereinigen sein? - alfred - ------------------ www.hollaus.at |
veydan Mitglied
Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 11. Feb. 2010 09:57 <-- editieren / zitieren --> Unities abgeben:
Bei mir bleibt Bemaßung (ISO) übrig. Habe einen Screen angehängt. Ich konvertiere meine Zeichnung (Elemente umlegen auf andere Layer) Am Ende starte ich dann die Funktion die ich gepostet habe. Das Ergebnis ist wie im Screenshot. mfg Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 11. Feb. 2010 10:08 <-- editieren / zitieren -->
Hi, bleibt bei mir nicht über, wobei ich zugebe (geht auch grad nicht anders), dass ich das mit AutoCAD 2010 gemacht habe. Zumindest kann ich damit mal bestätigen, dass Dein Code richtig geschrieben ist. Offen bleibt: handelt es sich jetzt um eine Ungereimtheit von '2009' (statt 2010) oder liegt's ev. an dem Umstand, dass bei Dir 'Mechanical' als Applikation aktiv ist (statt purem AutoCAD). Ich kenne von Civil, dass ich es 'als AutoCAD' starten kann, also damit alle Civil-spezifischen Module nicht ins AutoCAD geladen werden und sich damit auch nicht in eigene Programmabläufe einmischen. Wenn es sowas auch mit Mechanical gibt, wäre das durchaus eine erfolgversprechende Variante. - alfred - ------------------ www.hollaus.at |
veydan Mitglied
Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 11. Feb. 2010 11:16 <-- editieren / zitieren --> Unities abgeben:
|
| |
Ex-Mitglied
|
erstellt am: 11. Feb. 2010 11:26 <-- editieren / zitieren -->
Hi, danke vorerst für die Rückmeldung, Rückschluss zu dem ganzen ist dann wohl, dass ein Mechanical-Modul sich den Layer krallt. Jetzt würde mir noch einfallen, dass Du es ev. mit SendCommand machst (es scheint ja, dass der Befehlsaufruf anderes bewirkt als die API-Funktion), schön ist das keinesfalls, aber wenn's dann geht? Da ich nix Mechanical bin (zumindest nicht mit dem Produkt), bin ich an dieser Stelle leider out. - alfred - ------------------ www.hollaus.at |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|