| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Layout Position verschieben (2578 mal gelesen)
|
veydan Mitglied
Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 07. Feb. 2012 16:19 <-- editieren / zitieren --> Unities abgeben:
Hallo! Ist es möglich die Position eines Layouts per Code zu ändern? Ich habe nur das Property Tabindex gefunden, ändern des Wertes bewirkt aber in der Zeichnung leider nichts. Gibts da sonst noch etwas anderes? Ich will quasi den automatischen Weg den ich über Drag und Drop eines Layouts auch erreichen kann. mfg Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Ehrenmitglied V.I.P. h.c. Maschinenbaukonstrukteur
Beiträge: 13508 Registriert: 30.11.2003 ACAD 2004DX Mechanical PP
|
erstellt am: 07. Feb. 2012 17:08 <-- editieren / zitieren --> Unities abgeben: Nur für veydan
|
veydan Mitglied
Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 08. Feb. 2012 06:48 <-- editieren / zitieren --> Unities abgeben:
Ah tut mir leid, ich meinte das Property TabOrder. Bei mir zeigt es jedenfalls keine Wirkung... Hintergrund: Ich lösche gewisse Layouts aus einer Zeichnung. Lösche ich auch das Layout mit index 1, und mache ein Commit, hat die Zeichnung dann Fehler beim öffnen und muss recovered werden. Dann erhält sie ein Leeres Layout an der Stelle 1. Mache ich allerdings kein Commit, sind andere Layouts weg die ich lösche, Layout 1 bleibt aber in der Zeichnung. Somit dachte ich mir ich verschiebe einfach ein anderes an Stelle 1 und das Problem sollte gelöst sein. Das Property wird zwar gesetzt, ändern tut es aber nichts. mfg Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 08. Feb. 2012 09:06 <-- editieren / zitieren --> Unities abgeben: Nur für veydan
Hallo veydan, nur mal so eine Idee: Ein Layout ist doch auch nur ein BlockTablerecord. Wenn du in den darin enthaltenen Elementen einfach die OwnerId eines anderen Layots einträgst .. sollten die doch auf einem anderen Layout angezeigt werden. Dann noch die Layoutnamen tauschen und fertig ist's. Gib mal eine Info, ob du diesen Weg gegangen bist und wenn ja, mit welchem Ergebnis. Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
veydan Mitglied
Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 08. Feb. 2012 09:24 <-- editieren / zitieren --> Unities abgeben:
Hallo, das ist im Prinzip keine schlechte Idee, nur habe ich das Gefühl für mein Ursprüngliches vorhaben artet das etwas aus. Ich probiers mal. Zum Problem: Grundsätzlich will ich aus einer Zeichnung mit X Layouts jedes einzelne mit dem Modellbereich in eine eigene Zeichnung exportieren. Ich weiß nicht ob es da eine bessere Lösung gibt, aber jetzt mache ich in einer Schleife nach Anzahl der Layouts ein Database.Wblock, das war bis jetzt der einzige Weg wo ich eine "Kopie" der Datenbank erhielt ohne eine Referenz auf die Ursprüngliche. Das zurückgegebene Database Objekt durchlaufe ich und lösche alle Layouts bis ich eines finde das noch nicht exportiert wurde, dass behalte ich und den Modellbereich. Speichern der Datenbank mit Saveas und fertig. Der erste Weg war, die aktuelle Datenbank zu manipulieren und vor dem tr.Commit die Datenbank zu speichern (SaveAs) ist die Transaction aber noch aktiv geht das nicht, bestätige ich sie, sind die Layouts gelöscht und ich kann den Vorgang nicht für die restlichen Layouts wiederholen. Erzeuge ich vorher ein Objekt Database TmpDatabase = ActiveDocument.Database und modifiziere die TmpDatabase, sind die Änderungen auch in der Originalen vorhanden... darum der Schritt mit dem Wblock, der mir aber auch schon nicht wirklich gefällt... mfg
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 08. Feb. 2012 09:32 <-- editieren / zitieren --> Unities abgeben: Nur für veydan
... andere Idee: Du machst eine neue Zeichnung auf, und kopierts dir aus der Zeichnung (aus der du bei deinem Lösungsansatz gerade die WBlöcke machst) den Modellbereich und das (gewünschte) Layout rein und speicherst diese Zeichung dann ab. Das ganze natürlich in einer Schleife. Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
veydan Mitglied
Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 08. Feb. 2012 09:36 <-- editieren / zitieren --> Unities abgeben:
hatte ich auch schon probiert, da kam ich aber nicht ans Ziel, genügt es da wenn ich den Modell BlocktableRecord und den Layout Blocktablerecord mit wblockCloneObjects kopiere oder brauche ich die Objekte in den Layouts auch in der IdCollection für das WBlockCloneObjects? mfg [Diese Nachricht wurde von veydan am 08. Feb. 2012 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 08. Feb. 2012 09:40 <-- editieren / zitieren --> Unities abgeben: Nur für veydan
... hast du es denn mal mit den Objekten probiert? Ja, du brauchst die Objekte beim Modellbereich auf jeden Fall, beim Layout ... keine Ahnung. Beim Layout würde ich aber auch die Objekte nehmen, und diese auf das vorhandenen Layout1 kopieren und dann das Layout 1 umbenennen. Grüße Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
veydan Mitglied
Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 08. Feb. 2012 10:15 <-- editieren / zitieren --> Unities abgeben:
ja die Funktion läuft durch, aber ich kann die Zeichnungen dann nicht öffnen, bekomme den Fehler: INTERNAL ERROR: !dbAnnoScaleCompositionReactori.cpp@1409: eInvalidIndex acDwg ist die aktive Zeichnung und Templatedrawing eine .dwt Datei Code:
Code:
public void ExportLayouts(Document acDwg, string TemplateDrawing) { DocumentLock acDocLock = null; int i = 0; Database acDB = null; Transaction acTrans = null; BlockTable acBT = null; BlockTableRecord acBTR = null; SymbolTableEnumerator acBTRE = null; Layout acLayout = null; string sLayoutToExport = ""; List<String> liExportedLayouts = new List<string>(); FileInfo fiDrawing = new FileInfo(acDwg.Name); ObjectIdCollection acModelSpaceObjectIds = new ObjectIdCollection(); Boolean bLayoutFound = false; try { acDB = HostApplicationServices.WorkingDatabase; acTrans = acDB.TransactionManager.StartTransaction(); using (acTrans) { acBT = (BlockTable)(acTrans.GetObject(acDB.BlockTableId,OpenMode.ForRead)); acBTRE = acBT.GetEnumerator(); while (acBTRE.MoveNext()) { if (acBTRE.Current.IsErased == false) { acBTR = (BlockTableRecord)(acBTRE.Current.GetObject(OpenMode.ForRead)); if (acBTR.IsLayout) { acLayout = (Layout)(acBTR.LayoutId.GetObject(OpenMode.ForRead)); if (acLayout.ModelType == true) { acModelSpaceObjectIds.Add(acLayout.BlockTableRecordId); foreach (ObjectId acObjId in acBTR) { acModelSpaceObjectIds.Add(acObjId); } } else { i += 1; } } } } } ObjectIdCollection acLayoutBlockIdsToCopy = new ObjectIdCollection(); for (int j = 1; j <= i; j++) { foreach (ObjectId acObjId in acModelSpaceObjectIds) { acLayoutBlockIdsToCopy.Add(acObjId); } Database acTmpDatabase = null; Document acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.Add(TemplateDrawing); acTmpDatabase = acDoc.Database; acDocLock = acDoc.LockDocument(); acTrans = acDB.TransactionManager.StartTransaction(); using (acTrans) { acBT = (BlockTable)(acTrans.GetObject(acDB.BlockTableId, OpenMode.ForRead)); acBTRE = acBT.GetEnumerator(); while (acBTRE.MoveNext()) { if (acBTRE.Current.IsErased == false) { acBTR = (BlockTableRecord)(acTrans.GetObject(acBTRE.Current, OpenMode.ForRead)); if (acBTR.IsLayout) { acLayout = (Layout)(acTrans.GetObject(acBTR.LayoutId, OpenMode.ForRead)); if (acLayout.ModelType == false) { if (liExportedLayouts.Contains(acLayout.LayoutName) == false) { bLayoutFound = true; sLayoutToExport = acLayout.LayoutName; liExportedLayouts.Add(sLayoutToExport); acLayoutBlockIdsToCopy.Add(acLayout.BlockTableRecordId); foreach (ObjectId acObjId in acBTR) { acLayoutBlockIdsToCopy.Add(acObjId); } break; } } } } } } if (bLayoutFound) { IdMapping acIdMap = new IdMapping(); acDB.WblockCloneObjects(acLayoutBlockIdsToCopy, acTmpDatabase.BlockTableId, acIdMap, DuplicateRecordCloning.Replace, false); acDocLock.Dispose(); acDocLock = null; if (sLayoutToExport != "") { if (File.Exists(fiDrawing.Directory.FullName + "\\" + sLayoutToExport + fiDrawing.Extension) == false) acTmpDatabase.SaveAs(fiDrawing.Directory.FullName + "\\" + sLayoutToExport + fiDrawing.Extension, DwgVersion.AC1024); else acTmpDatabase.SaveAs(fiDrawing.Directory.FullName + "\\" + sLayoutToExport + sTimeStamp + fiDrawing.Extension, DwgVersion.AC1024); } else { acTmpDatabase.SaveAs(fiDrawing.Directory.FullName + "\\" + Path.GetFileNameWithoutExtension(fiDrawing.FullName) + fiDrawing.Extension, DwgVersion.AC1024); } } acDoc.CloseAndDiscard(); } } catch (Exception ex) {} finally { if (acDocLock != null) { acDocLock.Dispose(); } } }
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Ehrenmitglied V.I.P. h.c. Maschinenbaukonstrukteur
Beiträge: 13508 Registriert: 30.11.2003 ACAD 2004DX Mechanical PP
|
erstellt am: 08. Feb. 2012 10:21 <-- editieren / zitieren --> Unities abgeben: Nur für veydan
|
veydan Mitglied
Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 08. Feb. 2012 10:29 <-- editieren / zitieren --> Unities abgeben:
Rein vom Logischen tut es das was ich will, nur wie sieht das im Detail aus wenn man das Ganze in .Net macht. Wenn ich in C# aus einer Zeichnung alle Layouts lösche bis auf den Modellbereich und ein Layout das nicht an Position Taborder 1 ist, gibt es Probleme beim nächsten Öffnen. Wenn ich das Property TabOrder auf 1 setze bei dem Layout das nicht gelöscht wird, erziele ich keine Besserung. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
veydan Mitglied
Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 08. Feb. 2012 10:59 <-- editieren / zitieren --> Unities abgeben:
Um dem Ganzen gründlich auf die Spur zu gehen hier die andere Variante mit dem Wblock und ändern der TabOrder Seht euch den Unterschied an wenn man tr.Commit() auskommentiert und drinnen lässt... habe es in der Funktion beschrieben was passiert. Ich habe das mit einer ganz neuen Zeichnung getestet und mit vorhandenen. // Kommentiert man die Zeile aus, bleibt immer das erste Layout in der Zeichnung + dem Layout was eigentlich exportiert werden soll. // ist die Zeile aktiv, habe ich immer 28 Fehler in der neuen Zeichnung und zusätzlich ein leeres "neues" Layout1... public void ExportLayoutsToNewFile3(Document acDwg) { DocumentLock acDocLock = null; int i = 0; Database acDB = null; Transaction acTrans = null; BlockTable acBT = null; BlockTableRecord acBTR = null; SymbolTableEnumerator acBTRE = null; Layout acLayout = null; Layout acLayoutToExport = null; List<String> liExportedLayouts = new List<string>(); FileInfo fiDrawing = new FileInfo(acDwg.Name); try { acDocLock = acDwg.LockDocument(); acDB = HostApplicationServices.WorkingDatabase;
acBT = (BlockTable)(acDB.BlockTableId.GetObject(OpenMode.ForRead)); acBTRE = acBT.GetEnumerator(); while (acBTRE.MoveNext()) { if (acBTRE.Current.IsErased == false) { acBTR = (BlockTableRecord)(acBTRE.Current.GetObject(OpenMode.ForRead)); if (acBTR.IsLayout) { acLayout = (Layout)(acBTR.LayoutId.GetObject(OpenMode.ForRead)); if (acLayout.ModelType == false) { i += 1; } } } } LayoutManager.Current.CurrentLayout = "Model"; for (int j = 1; j <= i; j++) { Database acTmpDatabase = new Database(false, true); acLayoutToExport = null; acTmpDatabase = acDB.Wblock(); acTrans = acTmpDatabase.TransactionManager.StartTransaction(); using (acTrans) { acBT = (BlockTable)(acTrans.GetObject(acTmpDatabase.BlockTableId, OpenMode.ForRead)); acBTRE = acBT.GetEnumerator(); while (acBTRE.MoveNext()) { if (acBTRE.Current.IsErased == false) { acBTR = (BlockTableRecord)(acTrans.GetObject(acBTRE.Current, OpenMode.ForRead)); if (acBTR.IsLayout) { acLayout = (Layout)(acTrans.GetObject(acBTR.LayoutId, OpenMode.ForWrite)); if (acLayout.ModelType == false) { if (acLayoutToExport == null) { if (liExportedLayouts.Contains(acLayout.LayoutName) == false) { acLayout.TabOrder = 1; acLayoutToExport = acLayout; liExportedLayouts.Add(acLayout.LayoutName); acLayout.DowngradeOpen(); continue; } else { acLayout.Erase(); } } else { acLayout.Erase(); } } } } } acTrans.Commit(); //Kommentiert man diese Zeile aus, bleibt immer das erste Layout in der Zeichnung + dem Layout was eigentlich exportiert werden soll. // ist die Zeile aktiv, habe ich immer 28 Fehler in der neuen Zeichnung und zusätzlich ein leeres "neues" Layout1... } acTmpDatabase.CloseInput(true); if (acLayoutToExport != null) { if (File.Exists(fiDrawing.Directory.FullName + "\\" + acLayoutToExport.LayoutName + fiDrawing.Extension) == false) acTmpDatabase.SaveAs(fiDrawing.Directory.FullName + "\\" + acLayoutToExport.LayoutName + fiDrawing.Extension, DwgVersion.AC1024); else acTmpDatabase.SaveAs(fiDrawing.Directory.FullName + "\\" + acLayoutToExport.LayoutName + sTimeStamp + fiDrawing.Extension, DwgVersion.AC1024); } else { acTmpDatabase.SaveAs(fiDrawing.Directory.FullName + "\\" + Path.GetFileNameWithoutExtension(fiDrawing.FullName) + fiDrawing.Extension, DwgVersion.AC1024); } acTmpDatabase.CloseInput(true); } } catch (Exception ex) { } finally { if (acDocLock != null) { acDocLock.Dispose(); } } } Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Ehrenmitglied V.I.P. h.c. Maschinenbaukonstrukteur
Beiträge: 13508 Registriert: 30.11.2003 ACAD 2004DX Mechanical PP
|
erstellt am: 08. Feb. 2012 11:16 <-- editieren / zitieren --> Unities abgeben: Nur für veydan
|
veydan Mitglied
Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 08. Feb. 2012 11:57 <-- editieren / zitieren --> Unities abgeben:
ich lösche auch nicht alle...Modellbereich und ein Layoutbereich bleiben auch übrig, aber die Zeichnung ist dann Fehlerhaft, oder beinhaltet ein Layout das nicht da sein soll. probiert die Funktion aus mit Tr.Commit() und ohne, dann werdet ihr sehen was ich meine. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Plotter Mitglied
Beiträge: 267 Registriert: 11.02.2004
|
erstellt am: 20. Mrz. 2012 14:29 <-- editieren / zitieren --> Unities abgeben: Nur für veydan
Zitat: Original erstellt von CADmium: ist zwar intern Lisp, aber pack die zip mal aus und zieh dir die vlx per Drag and Drop aus dem Explorer in die aktuelle Zeichnung und rufe das Programm mit LAYOUTORDER in der Befehlszeile auf.Wenn es das tut, was du willst ..... da wird im Grunde immer nur die Property TABORDER gesetzt
Habe gerade dies "geile" Programm gefunden! Wir haben ein Projekt bekommen, beim dem viele Layouts hin und her geschoben werden müssen. Dauert sonst ewig, weil die Dateien so groß sind. Nun die Frage, ob man da noch die Moglichkeit einbauen könnte (vielleicht mit Rechtsklick?) die Layouts in dem Menü auch noch umzubenennen!? Würde uns ne Menge Tipp- und Klickarbeit ersparen :-) ------------------ - Plotter - ------------------ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Ehrenmitglied V.I.P. h.c. Maschinenbaukonstrukteur
Beiträge: 13508 Registriert: 30.11.2003 ACAD 2004DX Mechanical PP
|
erstellt am: 20. Mrz. 2012 14:33 <-- editieren / zitieren --> Unities abgeben: Nur für veydan
|