AutoCAD .net Side使用ReadDwgFile加载dwg,然后绘图

时间:2015-10-01 15:45:03

标签: c# autocad

我使用示例here 将dwgs加载到内存中,并结合Plot From Model Space的示例here。我得到的东西工作,除了图表不尊重图层是否冷冻和印刷好像他们都解冻了。来自dwg的数据是正确的。我可以在调试时迭代图层并验证正确的图层是冻结还是解冻。另外,如果我只是将dwg保存为一个新名称,它会匹配关于图层状态的原始文件。任何想法?

[CommandMethod("PlotLayout")]
    public static void PlotLayout()
    {
        // Get the current document and database, and start a transaction
        Document acDoc = Active.Document;
        Database acCurDb = Active.Database;
        Editor ed = Active.Editor;
        var collection = new List<string>() { "C:\\Test\\440001A.dwg", "C:\\Test\\440001B.dwg", "C:\\Test\\440001C.dwg", "C:\\Test\\440001D.dwg" };
        for (int i = 0; i < collection.Count; i++)
        {
            var dwg = collection[i];
            var dir = Path.GetDirectoryName(dwg);
            var fn = Path.GetFileNameWithoutExtension(dwg);
            var filePath = Path.Combine(dir, fn + "-" + i.ToString() + ".pdf");
            Database oldDb = HostApplicationServices.WorkingDatabase;
            using (Database db = new Database(false, true))
            {
                db.ReadDwgFile(dwg, FileOpenMode.OpenForReadAndAllShare, false, null);
                db.CloseInput(true);


                using (Transaction acTrans = db.TransactionManager.StartTransaction())
                    try
                    {
                        HostApplicationServices.WorkingDatabase = db;

                        LayoutManager acLayoutMgr = LayoutManager.Current;

                        // Get the current layout and output its name in the Command Line window
                        Layout acLayout = acTrans.GetObject(acLayoutMgr.GetLayoutId(acLayoutMgr.CurrentLayout),
                                                            OpenMode.ForRead) as Layout;

                        // Get the PlotInfo from the layout
                        using (PlotInfo acPlInfo = new PlotInfo())
                        {
                            acPlInfo.Layout = acLayout.ObjectId;

                            // Get a copy of the PlotSettings from the layout
                            using (PlotSettings acPlSet = new PlotSettings(acLayout.ModelType))
                            {
                                acPlSet.CopyFrom(acLayout);

                                // Update the PlotSettings object
                                PlotSettingsValidator acPlSetVdr = PlotSettingsValidator.Current;

                                // Set the plot type
                                acPlSetVdr.SetPlotType(acPlSet, Autodesk.AutoCAD.DatabaseServices.PlotType.Extents);

                                // Set the plot scale
                                acPlSetVdr.SetUseStandardScale(acPlSet, true);
                                acPlSetVdr.SetStdScaleType(acPlSet, StdScaleType.ScaleToFit);

                                // Center the plot
                                acPlSetVdr.SetPlotCentered(acPlSet, true);

                                // Set the plot device to use
                                acPlSetVdr.SetPlotConfigurationName(acPlSet, "DWF6 ePlot.pc3", "ANSI_B_(11.00_x_17.00_Inches)");

                                // Set the plot info as an override since it will
                                // not be saved back to the layout
                                acPlInfo.OverrideSettings = acPlSet;

                                // Validate the plot info
                                using (PlotInfoValidator acPlInfoVdr = new PlotInfoValidator())
                                {
                                    acPlInfoVdr.MediaMatchingPolicy = MatchingPolicy.MatchEnabled;
                                    acPlInfoVdr.Validate(acPlInfo);

                                    // Check to see if a plot is already in progress
                                    if (PlotFactory.ProcessPlotState == ProcessPlotState.NotPlotting)
                                    {
                                        using (PlotEngine acPlEng = PlotFactory.CreatePublishEngine())
                                        {
                                            // Track the plot progress with a Progress dialog
                                            using (PlotProgressDialog acPlProgDlg = new PlotProgressDialog(false, 1, true))
                                            {
                                                using ((acPlProgDlg))
                                                {
                                                    // Define the status messages to display 
                                                    // when plotting starts
                                                    acPlProgDlg.set_PlotMsgString(PlotMessageIndex.DialogTitle, "Plot Progress");
                                                    acPlProgDlg.set_PlotMsgString(PlotMessageIndex.CancelJobButtonMessage, "Cancel Job");
                                                    acPlProgDlg.set_PlotMsgString(PlotMessageIndex.CancelSheetButtonMessage, "Cancel Sheet");
                                                    acPlProgDlg.set_PlotMsgString(PlotMessageIndex.SheetSetProgressCaption, "Sheet Set Progress");
                                                    acPlProgDlg.set_PlotMsgString(PlotMessageIndex.SheetProgressCaption, "Sheet Progress");

                                                    // Set the plot progress range
                                                    acPlProgDlg.LowerPlotProgressRange = 0;
                                                    acPlProgDlg.UpperPlotProgressRange = 100;
                                                    acPlProgDlg.PlotProgressPos = 0;

                                                    // Display the Progress dialog
                                                    acPlProgDlg.OnBeginPlot();
                                                    acPlProgDlg.IsVisible = true;

                                                    // Start to plot the layout
                                                    acPlEng.BeginPlot(acPlProgDlg, null);

                                                    // Define the plot output
                                                    acPlEng.BeginDocument(acPlInfo, acDoc.Name, null, 1, true, "c:\\myplot");

                                                    // Display information about the current plot
                                                    acPlProgDlg.set_PlotMsgString(PlotMessageIndex.Status, "Plotting: " + acDoc.Name + " - " + acLayout.LayoutName);

                                                    // Set the sheet progress range
                                                    acPlProgDlg.OnBeginSheet();
                                                    acPlProgDlg.LowerSheetProgressRange = 0;
                                                    acPlProgDlg.UpperSheetProgressRange = 100;
                                                    acPlProgDlg.SheetProgressPos = 0;

                                                    // Plot the first sheet/layout
                                                    using (PlotPageInfo acPlPageInfo = new PlotPageInfo())
                                                    {
                                                        acPlEng.BeginPage(acPlPageInfo, acPlInfo, true, null);
                                                    }

                                                    acPlEng.BeginGenerateGraphics(null);
                                                    acPlEng.EndGenerateGraphics(null);

                                                    // Finish plotting the sheet/layout
                                                    acPlEng.EndPage(null);
                                                    acPlProgDlg.SheetProgressPos = 100;
                                                    acPlProgDlg.OnEndSheet();

                                                    // Finish plotting the document
                                                    acPlEng.EndDocument(null);

                                                    // Finish the plot
                                                    acPlProgDlg.PlotProgressPos = 100;
                                                    acPlProgDlg.OnEndPlot();
                                                    acPlEng.EndPlot(null);
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }

                    }
                    catch (System.Exception ex)
                    {

                        ed.WriteMessage(ex.ToString());
                    }
                HostApplicationServices.WorkingDatabase = oldDb;
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

不理想,但我找到了解决方法。如果我迭代LayerTable,检查是否已冻结,然后使IsPlottable为false,它会正确打印。如果有更好的灵魂,请告诉我。感谢

 LayerTable _LayerTable = acTrans.GetObject(db.LayerTableId, OpenMode.ForRead) as LayerTable;
                         foreach (ObjectId _LayerTableId in _LayerTable)
                         {
                             LayerTableRecord _LayerTableRecord =
                                        (LayerTableRecord)acTrans.GetObject(_LayerTableId,
                                                            OpenMode.ForWrite);
                             if (_LayerTableRecord.IsFrozen)
                             {
                                 _LayerTableRecord.IsPlottable = false;
                             }
                         }