Тема: Печать файла DWG после прочтения его методом acDB.ReadDWGFile

        Application.SetSystemVariable("BACKGROUNDPLOT", 0)
        Dim ed As Editor

        For Each ViewFiles In DataGridViewFiles.Rows
            If ViewFiles.cells(3).Value Then
                Dim FileName As String
                Dim acDocMgr As DocumentCollection = Application.DocumentManager
                Dim acDoc As Document
                Dim medias As StringCollection
                Dim acCurDb As Database


                FileName = ViewFiles.cells(4).Value.ToString




                acCurDb = New Database(False, True)
                acDoc = Application.DocumentManager.MdiActiveDocument
                ed = acDoc.Editor
                Using acCurDb

                    Try
                        acCurDb.ReadDwgFile(FileName, System.IO.FileShare.Read, False, "")
                    Catch 'ex = System.Exception
                        ed.WriteMessage("\nUnable to read drawing file.")
                        Return
                    End Try

                    Dim Orient As PlotRotation
                    Dim PlotBound As Extents2d

                    If Not ViewFiles.cells(5).Value Then
                        Orient = PlotRotation.Degrees090
                    Else
                        Orient = PlotRotation.Degrees000
                    End If

                    Using acLckDoc As DocumentLock = acDoc.LockDocument()
                        Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
                            Dim acLayoutMgr As LayoutManager
                            Dim bt As DBDictionary
                            LayoutManager.Create(acCurDb.UnmanagedObject, True)
                            acLayoutMgr = LayoutManager.Current

                            bt = acTrans.GetObject(acCurDb.LayoutDictionaryId, OpenMode.ForRead)
                            Dim acLayout As Layout
                            If Not ViewFiles.cells(6).Value Then
                                For Each LayEnt As DBDictionaryEntry In bt
                                    If LayEnt.Key = "Model" Then
                                        acLayout = acTrans.GetObject(LayEnt.Value, OpenMode.ForRead)
                                    End If
                                Next
                                PlotBound = New Extents2d(acCurDb.Extmin.X, acCurDb.Extmin.Y, acCurDb.Extmax.X, acCurDb.Extmax.Y)
                            Else
                                For Each LayEnt As DBDictionaryEntry In bt
                                    If LayEnt.Key = "list" Then
                                        acLayout = acTrans.GetObject(LayEnt.Value, OpenMode.ForRead)
                                        PlotBound = New Extents2d(acLayout.Database.Pextmin.X, acLayout.Database.Pextmin.Y, acLayout.Database.Pextmax.X, acLayout.Database.Pextmax.Y)
                                    End If
                                Next
                            End If


                            Dim acPlInfo As PlotInfo = New PlotInfo()
                            acPlInfo.Layout = acLayout.ObjectId


                            LayoutManager.Current.CurrentLayout = acLayout.LayoutName


                            Dim acPlSet As PlotSettings = New PlotSettings(acLayout.ModelType)
                            acPlSet.CopyFrom(acLayout)

                            Dim acPlSetVdr As PlotSettingsValidator = PlotSettingsValidator.Current

                            acPlSetVdr.SetPlotConfigurationName(acPlSet, ComboBoxPrinter.Text, Nothing)
                            acPlSetVdr.SetUseStandardScale(acPlSet, True)
                            acPlSetVdr.SetStdScaleType(acPlSet, StdScaleType.ScaleToFit)
Nothing)
                            acPlSetVdr.SetPlotWindowArea(acPlSet, PlotBound)
                            acPlSetVdr.SetPlotType(acPlSet, Autodesk.AutoCAD.DatabaseServices.PlotType.Window)
                            acPlSetVdr.SetPlotRotation(acPlSet, Orient)
                            acPlSetVdr.SetPlotCentered(acPlSet, True)

                            Try
                                If acCurDb.PlotStyleMode = True Then
                                    acPlSetVdr.SetCurrentStyleSheet(acPlSet, Microsoft.VisualBasic.Left(ComboBoxStyle.Text, Len(ComboBoxStyle.Text) - 3) & "ctb") 'Left(ComboBoxStyle.Text, len(ComboBoxStyle.Text)-3) & "ctb"len(ComboBoxStyle.Text)
                                Else
                                    acPlSetVdr.SetCurrentStyleSheet(acPlSet, Microsoft.VisualBasic.Left(ComboBoxStyle.Text, Len(ComboBoxStyle.Text) - 3) & "stb")
                                End If
                            Catch
                                acPlSetVdr.SetCurrentStyleSheet(acPlSet, Nothing)
                            End Try

                            medias = acPlSetVdr.GetCanonicalMediaNameList(acPlSet)

                            acPlSetVdr.SetCanonicalMediaName(acPlSet, medias.Item(ComboBoxFormat.SelectedIndex))

                            acPlInfo.OverrideSettings = acPlSet

                            Dim acPlInfoVdr As PlotInfoValidator = New PlotInfoValidator()
                            acPlInfoVdr.MediaMatchingPolicy = MatchingPolicy.MatchEnabled
                            acPlInfoVdr.Validate(acPlInfo)' РУБИТЬСЯ ЗДЕСЬ СО словом "eLayoutNotCurrent"


                            If PlotFactory.ProcessPlotState = Autodesk.AutoCAD.PlottingServices.ProcessPlotState.NotPlotting Then
                                Using acPlEng As PlotEngine = PlotFactory.CreatePublishEngine()


                                    Dim acPlProgDlg As PlotProgressDialog = New PlotProgressDialog(False, 1, True)

                                    Using (acPlProgDlg)

                                        acPlProgDlg.PlotMsgString(PlotMessageIndex.DialogTitle) = "Plot Progress"
                                        acPlProgDlg.PlotMsgString(PlotMessageIndex.CancelJobButtonMessage) = "Cancel Job"
                                        acPlProgDlg.PlotMsgString(PlotMessageIndex.CancelSheetButtonMessage) = "Cancel Sheet"
                                        acPlProgDlg.PlotMsgString(PlotMessageIndex.SheetSetProgressCaption) = "Sheet Set Progress"
                                        acPlProgDlg.PlotMsgString(PlotMessageIndex.SheetProgressCaption) = "Sheet Progress"
                                        acPlProgDlg.LowerPlotProgressRange = 0
                                        acPlProgDlg.UpperPlotProgressRange = 100
                                        acPlProgDlg.PlotProgressPos = 0


                                        acPlProgDlg.OnBeginPlot()

                                        acPlProgDlg.IsVisible = False
                                        acPlEng.BeginPlot(acPlProgDlg, Nothing)
                                        acPlEng.BeginDocument(acPlInfo, _
                                                        acDoc.Name, _
                                                        Nothing, _
                                                        NumberCopy.Value, _
                                                        PrinToFile, _
                                                        ViewFiles.cells(1).Value.ToString & "\" & ViewFiles.cells(0).Value.ToString & ".pdf")
                                        acPlProgDlg.PlotMsgString(PlotMessageIndex.Status) = _
                                                                "Plotting: " & acDoc.Name & _
                                                                " - " & acLayout.LayoutName


                                        acPlProgDlg.OnBeginSheet()
                                        acPlProgDlg.LowerSheetProgressRange = 0
                                        acPlProgDlg.UpperSheetProgressRange = 100
                                        acPlProgDlg.SheetProgressPos = 0
                                        Dim acPlPageInfo As PlotPageInfo = New PlotPageInfo()
                                        acPlEng.BeginPage(acPlPageInfo, _
                                                    acPlInfo, _
                                                    True, _
                                                    Nothing)

                                        acPlEng.BeginGenerateGraphics(Nothing)
                                        acPlEng.EndGenerateGraphics(Nothing)
                                        acPlEng.EndPage(Nothing)
                                        acPlProgDlg.SheetProgressPos = 100
                                        acPlProgDlg.OnEndSheet()
                                        acPlEng.EndDocument(Nothing)
                                        acPlProgDlg.PlotProgressPos = 100
                                        acPlProgDlg.OnEndPlot()
                                        acPlEng.EndPlot(Nothing)
                                    End Using
                                End Using
                            End If
                        End Using
                    End Using

                End Using
                acCurDb.Dispose()
            End If
        Next

По коду добавил комментарий на какой стадии рубиться! Просьба помочь разобраться, возможна ли вообще печать при таком подходе к открытию файла?

Re: Печать файла DWG после прочтения его методом acDB.ReadDWGFile

Можно попробовать сохранить файл временно с другим именем,
распечатать копию и потом удалить, нету принтера на моем компе,
проверить не могу, только идея...

Re: Печать файла DWG после прочтения его методом acDB.ReadDWGFile

Смысл в том что используется метод "ReadDWGFile"(при этом файл читается без проблем и все нужные данные я из него получаю) т.е. Мы читаем базу данных файла на показывая его на экран, этот метод удобен т.к. работает быстрее чем полностью открывать файл в автокаде. Вопрос состоит в том, что можно ли его распечатать открывая таким методом?

Re: Печать файла DWG после прочтения его методом acDB.ReadDWGFile

Alex Usa пишет:

Вопрос состоит в том, что можно ли его распечатать открывая таким методом?

Нет. И по коду ошибки видно: eLayoutNotCurrent означает, что лист не текущий, а текущим лист может быть только если чертеж загружен в редактор AutoCAD.

Re: Печать файла DWG после прочтения его методом acDB.ReadDWGFile

Нет. И по коду ошибки видно: eLayoutNotCurrent означает, что лист не текущий, а текущим лист может быть только если чертеж загружен в редактор AutoCAD.

Большое спасибо за ответ!