| |  | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte | | |  | PNY wird von NVIDIA zum Händler des Jahres gewählt – zum dritten Mal in Folge, eine Pressemitteilung
|
Autor
|
Thema: Plotten von mehreren Layouts, seltsamer Fehler bei pe.BeginPage (2522 mal gelesen)
|
veydan Mitglied
 
 Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 28. Jul. 2011 14:21 <-- editieren / zitieren --> Unities abgeben:         
Hallo! Es gibt zwar schon ein paar Plot Threads, aber die beziehen sich auf etwas anderes. Ich habe hier eine Funktion die mir alle Layouts drucken soll. doch bei manchen Layouts bekomme ich an der stelle pe.BeginPage(ppi,pi,(numSheet == layoutsToPlot.Count),null); den Fehler eInvalidPlotInfo, und ich weiß nicht warum... Wenn die Zeichnung nur 1 Layout enthält funktioniert das ganze wunderbar. Ich hätte schon ein Try Catch drüber gelegt, aber da kommt kein gültiger PDF raus.Ich hätte damit leben können, dass das eine Layout halt nicht im PDF ist. Die Ursache würde mich aber trotzdem interessieren. Mit dem try catch stürzt zwar Acad noch nicht ab, aber sobald ich in den Druckdialog gehe oder in den Seiteneinrichtungsmanager und die Vorschau für das Layout starte das vorher einen Fehler hatte. kommt noch kurz der Dialog wo die vorschau generiert wird, dann schmiert ACAD vollkommen ab... woran liegt das? welches Objekt habe ich da in der Plotfunktion noch nicht sauber entfernt/disposed? Code:
public static void MultiSheetPlot(String Exportpath, String NewFileNameWithoutExtension) { Object AcadVarBackgroundPlot = 0; Document doc; Editor ed; Database db; DocumentLock doclock; Boolean PltError = false; try { AcadVarBackgroundPlot = Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("BACKGROUNDPLOT"); Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("BACKGROUNDPLOT", 0); doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument; ed = doc.Editor; db = doc.Database; doclock = doc.LockDocument(); Transaction tr = db.TransactionManager.StartTransaction(); using (tr) { BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead); PlotInfoValidator piv = new PlotInfoValidator(); piv.MediaMatchingPolicy = MatchingPolicy.MatchEnabled; if (PlotFactory.ProcessPlotState == ProcessPlotState.NotPlotting) { PlotEngine pe = PlotFactory.CreatePublishEngine(); using (pe) { PlotProgressDialog ppd = new PlotProgressDialog(false, 1, true); using (ppd) { ObjectIdCollection layoutsToPlot = new ObjectIdCollection(); foreach (ObjectId btrId in bt) { BlockTableRecord btr = (BlockTableRecord)tr.GetObject(btrId, OpenMode.ForRead); if (btr.IsLayout && btr.Name.ToUpper() != BlockTableRecord.ModelSpace.ToUpper()) { layoutsToPlot.Add(btrId); } } int numSheet = 1; foreach (ObjectId btrId in layoutsToPlot) { PlotInfo pi = new PlotInfo(); BlockTableRecord btr = (BlockTableRecord)tr.GetObject(btrId, OpenMode.ForRead); Layout lo = (Layout)tr.GetObject(btr.LayoutId, OpenMode.ForRead); PlotSettings ps = new PlotSettings(lo.ModelType); ps.CopyFrom(lo); PlotSettingsValidator psv = PlotSettingsValidator.Current; psv.SetPlotType(ps, Autodesk.AutoCAD.DatabaseServices.PlotType.Extents); psv.SetUseStandardScale(ps, true); psv.SetStdScaleType(ps, StdScaleType.ScaleToFit); psv.SetPlotCentered(ps, true); psv.SetPlotConfigurationName(ps, lo.PlotConfigurationName , lo.CanonicalMediaName ); pi.Layout = btr.LayoutId; LayoutManager.Current.CurrentLayout = lo.LayoutName; pi.OverrideSettings = ps; piv.Validate(pi); if (numSheet == 1) { ppd.set_PlotMsgString(PlotMessageIndex.DialogTitle, "Custom Plot Progress"); ppd.set_PlotMsgString(PlotMessageIndex.CancelJobButtonMessage, "Cancel Job"); ppd.set_PlotMsgString(PlotMessageIndex.CancelSheetButtonMessage, "Cancel Sheet"); ppd.set_PlotMsgString(PlotMessageIndex.SheetSetProgressCaption, "Sheet Set Progress"); ppd.set_PlotMsgString(PlotMessageIndex.SheetProgressCaption, "Sheet Progress"); ppd.LowerPlotProgressRange = 0; ppd.UpperPlotProgressRange = 100; ppd.PlotProgressPos = 0; ppd.OnBeginPlot(); ppd.IsVisible = true; pe.BeginPlot(ppd, null); pe.BeginDocument(pi, doc.Name, null, 1, true, Exportpath + NewFileNameWithoutExtension); } ppd.StatusMsgString = "Drucke " + doc.Name.Substring(doc.Name.LastIndexOf("\\") + 1) + " - Blatt " + numSheet.ToString() + " von " + layoutsToPlot.Count.ToString(); ppd.OnBeginSheet(); ppd.LowerSheetProgressRange = 0; ppd.UpperSheetProgressRange = 100; ppd.SheetProgressPos = 0; PlotPageInfo ppi = new PlotPageInfo(); try { pe.BeginPage(ppi, pi, (numSheet == layoutsToPlot.Count), null); pe.BeginGenerateGraphics(null); ppd.SheetProgressPos = 50; pe.EndGenerateGraphics(null); // Finish the sheet pe.EndPage(null); } catch (System.Exception ex) { PltError = true; MessageBox.Show("Fehler beim Drucken von Layout:" + lo.LayoutName + "\n" + ex.Message); } ppd.SheetProgressPos = 100; ppd.OnEndSheet(); numSheet += 1; lo = null; btr = null; } if (PltError == false) { pe.EndDocument(null); ppd.PlotProgressPos = 100; ppd.OnEndPlot(); pe.EndPlot(null); } else pe.Destroy(); } } } else { ed.WriteMessage("\n Es wird gerade ein Druck ausgeführt."); } } } catch (System.Exception ex) { MessageBox.Show(ex.Message + "\n" + ex.StackTrace); } finally { doclock = null; Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("BACKGROUNDPLOT", AcadVarBackgroundPlot); } }
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 28. Jul. 2011 21:46 <-- editieren / zitieren -->
Hi, ich hab den Code jetzt nicht probiert, aber überflogen. Und was mir als erstes auffällt (und ich würde mal meinen, wir hatten das doch schon mal) wäre dass sowohl TransAction als auch DocLock beim Plotten aktiv ist. Probier das mal zu vermeiden, also vor dem plotten diese mit .dispose zu vertschüssen. - alfred - ------------------ www.hollaus.at |
veydan Mitglied
 
 Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 29. Jul. 2011 06:59 <-- editieren / zitieren --> Unities abgeben:         
Hi, ich glaube nicht, dass es an dem liegt. hier merke ich mir die Layouts vorher und dann laufe ich erst die Layouts durch zum Plotten. Aber es ist der gleiche Fehler. Das erste Layout das er nimmt läuft problemlos durch und beim Nächsten gibts dem Error an der Stelle Code:
pe.BeginPage(ppi, pi, (numSheet == layoutsToPlot.Count), null);
muss ich vorher noch etwas freigeben vom Layout? oder eines der Layout Plot Objekte (pi,ppi,..?) disposen? Code:
public static void MultiSheetPlot(String Exportpath, String NewFileNameWithoutExtension) { Object AcadVarBackgroundPlot = 0; Document doc; Editor ed; Database db; DocumentLock doclock; Boolean PltError = false; System.Collections.ArrayList Layouts = new ArrayList(); try { AcadVarBackgroundPlot = Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("BACKGROUNDPLOT"); Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("BACKGROUNDPLOT", 0); doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument; ed = doc.Editor; db = doc.Database; doclock = doc.LockDocument(); Transaction tr = db.TransactionManager.StartTransaction(); BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead); PlotInfoValidator piv = new PlotInfoValidator(); piv.MediaMatchingPolicy = MatchingPolicy.MatchEnabled; if (PlotFactory.ProcessPlotState == ProcessPlotState.NotPlotting) { PlotEngine pe = PlotFactory.CreatePublishEngine(); using (pe) { PlotProgressDialog ppd = new PlotProgressDialog(false, 1, true); using (ppd) { ObjectIdCollection layoutsToPlot = new ObjectIdCollection(); foreach (ObjectId btrId in bt) { BlockTableRecord btr = (BlockTableRecord)tr.GetObject(btrId, OpenMode.ForRead); if (btr.IsLayout && btr.Name.ToUpper() != BlockTableRecord.ModelSpace.ToUpper()) { Layout lo = (Layout)tr.GetObject(btr.LayoutId, OpenMode.ForRead); Layouts.Add(lo); } } int numSheet = 1; tr.Dispose(); doclock.Dispose(); foreach (Layout lo in Layouts) { PlotInfo pi = new PlotInfo(); PlotSettings ps = new PlotSettings(lo.ModelType); ps.CopyFrom(lo); PlotSettingsValidator psv = PlotSettingsValidator.Current; psv.SetPlotType(ps, Autodesk.AutoCAD.DatabaseServices.PlotType.Extents); psv.SetUseStandardScale(ps, true); psv.SetStdScaleType(ps, StdScaleType.ScaleToFit); psv.SetPlotCentered(ps, true); psv.SetPlotConfigurationName(ps, lo.PlotConfigurationName , lo.CanonicalMediaName ); pi.Layout = lo.Id; LayoutManager.Current.CurrentLayout = lo.LayoutName; pi.OverrideSettings = ps; piv.Validate(pi); if (numSheet == 1) { ppd.set_PlotMsgString(PlotMessageIndex.DialogTitle, "Custom Plot Progress"); ppd.set_PlotMsgString(PlotMessageIndex.CancelJobButtonMessage, "Cancel Job"); ppd.set_PlotMsgString(PlotMessageIndex.CancelSheetButtonMessage, "Cancel Sheet"); ppd.set_PlotMsgString(PlotMessageIndex.SheetSetProgressCaption, "Sheet Set Progress"); ppd.set_PlotMsgString(PlotMessageIndex.SheetProgressCaption, "Sheet Progress"); ppd.LowerPlotProgressRange = 0; ppd.UpperPlotProgressRange = 100; ppd.PlotProgressPos = 0; ppd.OnBeginPlot(); ppd.IsVisible = true; pe.BeginPlot(ppd, null); pe.BeginDocument(pi, doc.Name, null, 1, true, Exportpath + NewFileNameWithoutExtension); } ppd.StatusMsgString = "Drucke " + doc.Name.Substring(doc.Name.LastIndexOf("\\") + 1) + " - Blatt " + numSheet.ToString() + " von " + layoutsToPlot.Count.ToString(); ppd.OnBeginSheet(); ppd.LowerSheetProgressRange = 0; ppd.UpperSheetProgressRange = 100; ppd.SheetProgressPos = 0; PlotPageInfo ppi = new PlotPageInfo(); try { pe.BeginPage(ppi, pi, (numSheet == layoutsToPlot.Count), null); pe.BeginGenerateGraphics(null); ppd.SheetProgressPos = 50; pe.EndGenerateGraphics(null); pe.EndPage(null); } catch (System.Exception ex) { MessageBox.Show("Fehler beim Drucken von Layout:" + lo.LayoutName + "\n" + ex.Message); } ppd.SheetProgressPos = 100; ppd.OnEndSheet(); numSheet += 1; } pe.EndDocument(null); ppd.PlotProgressPos = 100; ppd.OnEndPlot(); pe.EndPlot(null); } } } else { ed.WriteMessage("\n Es wird gerade ein Druck ausgeführt."); } } catch (System.Exception ex) { MessageBox.Show(ex.Message + "\n" + ex.StackTrace); } finally { doclock = null; Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("BACKGROUNDPLOT", AcadVarBackgroundPlot); } }
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 29. Jul. 2011 08:20 <-- editieren / zitieren -->
Hi, ich hab jetzt: - mit AutoCAD 2010 - einer neuen Zeichnung mit 2 Layouts, die beide auf DWFxxx.PC3 eingestellt sind - Deine Funktion ablaufen lassen. Dabei: - keine Exception bemerken können (war keine da) - keine Dateien wurde erzeugt - in der Plotfortschrittsanzeige steht z.b. 'Drucke xx.dwg - Blatt 2 von 0' ... ich wundere mich hier hauptsächlich wegen der 0, bin dem aber jetzt auch aus Zeitgründen nicht nachgegangen. Es kann natürlich jetzt sein, dass es: - mit 2010 nicht auftritt - meine Zeichnungseinstellungen so gewählt sind, dass ich nicht Deine Situtation vorfinde Sorry wegen kurzer Angebundenheit, die Zeit - alfred - ------------------ www.hollaus.at |
veydan Mitglied
 
 Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 29. Jul. 2011 08:58 <-- editieren / zitieren --> Unities abgeben:         
interessant, jetzt weiß ich an was es liegt. Wenn ich bei DWG To PDF.pc3 bei 2 verschiedenen Layouts 2 verschiedene Papierformate wähle, kommt der Fehler. jedes einzeln funktioniert mit jedem Papierformat, oder mehrere Layouts mit gleichem Papierformat funktionieren auch! es muss an der Funktion
Code: pe.BeginPage(ppi,pi,(numsheet == LayoutsToPlot.Count),null);
liegen. Die verkraftet anscheinend nur 1 Papierformat, oder mann muss es irgendwie löschen /freigeben beim Nächsten Blatt aber dass kann ich mir jetzt nicht erklären.. [Diese Nachricht wurde von veydan am 29. Jul. 2011 editiert.] 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: 01. Aug. 2011 08:00 <-- editieren / zitieren --> Unities abgeben:         
|

| |
Ex-Mitglied
|
erstellt am: 01. Aug. 2011 13:33 <-- editieren / zitieren -->
Hi, ja, ich konnte den Fehler nachvollziehen und IMHO ist es ein Gedankenfehler in der API, denn in dieser Zeile: pe.BeginDocument(pi, doc.Name, null, 1, true, Exportpath + NewFileNameWithoutExtension); Gibt man beim Plotbeginn des Documents(!) die Variable <pi> mit. Die enthält aber (unter anderem) die Seiteneinstellungen des ersten Layouts. Und so lange das so ist, fürchte ich um Fehler in der API. Ausweg wäre wohl, die Seiten in einzelne Files zu plotten und dann über eine PDF-API zu einem Doc zusammenhängen. Sorry, - alfred - PS: nachdem der Code von Kean Walmsley stammt ==> frag Ihn doch direkt! ------------------ www.hollaus.at |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
 |