Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de
  AutoCAD ObjectARX und .NET
  Plotten von mehreren Layouts, seltsamer Fehler bei pe.BeginPage

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



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

Beiträge: 252
Registriert: 29.05.2008

AutoCAD/Mechanical 2009, Inventor 2009

erstellt am: 28. Jul. 2011 14:21    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!
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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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



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

Beiträge: 252
Registriert: 29.05.2008

AutoCAD/Mechanical 2009, Inventor 2009

erstellt am: 29. Jul. 2011 06:59    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

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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



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

Beiträge: 252
Registriert: 29.05.2008

AutoCAD/Mechanical 2009, Inventor 2009

erstellt am: 29. Jul. 2011 08:58    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

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



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

Beiträge: 252
Registriert: 29.05.2008

AutoCAD/Mechanical 2009, Inventor 2009

erstellt am: 01. Aug. 2011 08:00    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

kann diesen Fehler jemand nachvollziehen?
sonst kopier ich nochmal den aktuellen code rein.

mfg

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP



Anzeige:Infos zum Werbeplatz >>

Qscape CAD APP für Landschaft, Landschaftsarchitektur

Intuitive Landscape Architecture software. Hardworks, softworks, planting plans, keys, plant schedules and cost estimates.


Ex-Mitglied

erstellt am: 01. Aug. 2011 13:33    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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

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