Import Pagesetups from .dwg file

Import Pagesetups from .dwg file

SRSDS
Advisor Advisor
603 Views
5 Replies
Message 1 of 6

Import Pagesetups from .dwg file

SRSDS
Advisor
Advisor

Hi,

 

I would like a command that imports all pagesetups (?plotsettings?) from an existing drawing to the current one.

 

I found this code but, TBH, I can't follow it and it throws an exception on the line:    cpl.CopyFrom(pl)

 

 

    Public Sub ClonePlotSettings(FilePath As String)
        Dim DestDb As Database = Application.DocumentManager.MdiActiveDocument.Database
        Dim SourceDb As New Database(False, True)
        Using docLock As DocumentLock = Application.DocumentManager.MdiActiveDocument.LockDocument()
            Try
                SourceDb.ReadDwgFile(FilePath, System.IO.FileShare.ReadWrite, False, Nothing)
                Using currentTransaction As Transaction = CurrentDatabase.TransactionManager.StartTransaction
                    Using sourceTransaction As Transaction = SourceDatabase.TransactionManager.StartTransaction
                        Dim sourcePlotDic As DBDictionary = SourceDatabase.PlotSettingsDictionaryId.GetObject(OpenMode.ForRead)
                        Dim objID As ObjectId
                        For Each item As DBDictionaryEntry In sourcePlotDic
                            objID = sourcePlotDic.GetAt(item.Key)
                            Dim pl As PlotSettings = objID.GetObject(OpenMode.ForRead)
                            Try
                                Dim cpl As New PlotSettings(False)
                                cpl.CopyFrom(pl)
                                cpl.AddToPlotSettingsDictionary(CurrentDatabase)
                            Catch ex As Exception
                                'MsgBox("Exception in ClonePlotSettings:" + ex.Message)
                            End Try
                        Next
                        currentTransaction.Commit()
                    End Using
                End Using
        End Using
        SourceDb.Dispose()
    End Sub

 

Can someone help me out? I've found similar posts but are either unanswered or are copying layouts rather than plot settings.

 

 

 

 

0 Likes
604 Views
5 Replies
Replies (5)
Message 2 of 6

fieldguy
Advisor
Advisor

I believe plotsettings.copyfrom(source should be a layout).

0 Likes
Message 3 of 6

SENL1362
Advisor
Advisor
        public static void LoadPlotStyles(Database db, string plotSettingsPathname)
        {
            if (db == null)
                return;

            if (!File.Exists(plotSettingsPathname))
                return;

            DeletePlotSettings(db);

  
            using (Database sourceDb = new Database())
            {
                sourceDb.ReadDwgFile(plotSettingsPathname, FileOpenMode.OpenForReadAndReadShare, true, null);

                using (Transaction trSource = sourceDb.TransactionManager.StartTransaction())
                {
                    using (Transaction tr = db.TransactionManager.StartTransaction())
                    {
                        DBDictionary sourcePlotSettingsDict = (DBDictionary)trSource.GetObject(sourceDb.PlotSettingsDictionaryId, OpenMode.ForRead);
                        foreach (DBDictionaryEntry sourcePlotSettingsDictEntry in sourcePlotSettingsDict)
                        {
                            PlotSettings sourcePlotSettings = (PlotSettings)trSource.GetObject(sourcePlotSettingsDictEntry.Value, OpenMode.ForRead);
                            PlotSettings plotSettings = new PlotSettings(sourcePlotSettings.ModelType);
                            plotSettings.CopyFrom(sourcePlotSettings);
                            plotSettings.AddToPlotSettingsDictionary(db);
                            tr.AddNewlyCreatedDBObject(plotSettings, true);
                        }
                        tr.Commit();
                    }
                    trSource.Commit();
                }
            }
        }

 

 

 

        public static void DeletePlotSettings(Database db)
        {
            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                DBDictionary plotSettingsDict = (DBDictionary)tr.GetObject(db.PlotSettingsDictionaryId, OpenMode.ForRead);

                ObjectIdCollection psIdsToRemove = new ObjectIdCollection();
                foreach (DBDictionaryEntry plotSettingsDictEntry in plotSettingsDict)
                    psIdsToRemove.Add(plotSettingsDictEntry.Value);

                foreach (ObjectId psId in psIdsToRemove)
                {
                    PlotSettings plotSettings = (PlotSettings)tr.GetObject(psId, OpenMode.ForWrite);
                    plotSettings.Erase();
                }
                tr.Commit();
            }
        }
Message 4 of 6

Anonymous
Not applicable

Here is what I use....

 

 Public Sub ImportPageSetups(ByVal FromFile As String)
        Dim myDB As Database = Application.DocumentManager.MdiActiveDocument.Database
        Using myTrans As Transaction = myDB.TransactionManager.StartTransaction()
            Dim myDbPsDict As DBDictionary = TryCast(myTrans.GetObject(myDB.PlotSettingsDictionaryId, OpenMode.ForRead), DBDictionary)
            For Each myDbPs As System.Collections.DictionaryEntry In myDbPsDict
                myTrans.GetObject(myDbPs.Value, OpenMode.ForWrite).Erase()
            Next

            Dim sourceDB As Database = New Database(False, True)
            sourceDB.ReadDwgFile(FromFile, System.IO.FileShare.ReadWrite, False, Nothing)

            Dim HostMap As New DatabaseServices.IdMapping
            Using sourceTrans As Transaction = sourceDB.TransactionManager.StartTransaction()
                Dim dwtDbPsDict As DBDictionary = TryCast(sourceTrans.GetObject(sourceDB.PlotSettingsDictionaryId, OpenMode.ForRead), DBDictionary)
                Dim psIds As New ObjectIdCollection()
                For Each psDbPs As System.Collections.DictionaryEntry In dwtDbPsDict
                    psIds.Add(DirectCast(psDbPs.Value, ObjectId))
                Next
                If psIds.Count = 0 Then
                    Return
                End If
                myDB.WblockCloneObjects(psIds, myDB.PlotSettingsDictionaryId, HostMap, DuplicateRecordCloning.Ignore, False)
                sourceTrans.Commit()
            End Using
            RenameAnonymousPageSetups(HostMap)
            myTrans.Commit()
        End Using
    End Sub

    Private Sub RenameAnonymousPageSetups(plotSettingsIdMap As IdMapping)
        Dim db As Database = plotSettingsIdMap.DestinationDatabase
        Using tr As Transaction = db.TransactionManager.StartTransaction()
            Dim psDict As DBDictionary = TryCast(tr.GetObject(db.PlotSettingsDictionaryId, OpenMode.ForWrite, False), DBDictionary)
            If psDict Is Nothing Then
                Return
            End If
            For Each psIdPair As IdPair In plotSettingsIdMap
                Dim id As ObjectId = psIdPair.Value
                Dim ps As PlotSettings = TryCast(tr.GetObject(id, OpenMode.ForWrite, False), PlotSettings)
                If ps Is Nothing Then
                    Continue For
                End If
                If psDict.Contains(ps.PlotSettingsName) Then
                    Dim existingPsId As ObjectId = psDict.GetAt(ps.PlotSettingsName)
                    If existingPsId <> ObjectId.Null Then
                        psDict.Remove(existingPsId)
                    End If
                End If
                Dim anonymousName As String = psDict.NameAt(id)
                psDict.SetName(anonymousName, ps.PlotSettingsName)
            Next
            tr.Commit()
        End Using
    End Sub

I've got another program for setting a specific profile as default..

Message 5 of 6

jeff
Collaborator
Collaborator

What is your error? eWrongObjectType?
If file contains PlotSettings that are model space then you need to pass true to PlotSettings Constructor.
http://www.theswamp.org/index.php?topic=46566.msg515764#msg515764

 

Here is example that works for me that prompts you to select a file then imports all the page setups into current drawing

 

Public Class Commands

    <CommandMethod("CpyPltSettings")> _
    Public Sub CpyPltSettings()
        Dim opts As New PromptOpenFileOptions(vbLf & "Enter File")
        opts.PreferCommandLine = False
        opts.DialogName = "Select File"
        opts.Filter = "dwg files (*.dwg)|*.dwg"
        opts.DialogName = "Plot Settings"
        opts.DialogCaption = "Plot Settings"

        Dim pfr As PromptFileNameResult = Application.DocumentManager.MdiActiveDocument.Editor.GetFileNameForOpen(opts)
        If pfr.Status <> PromptStatus.OK Then
            Return
        End If

        AddPlotSettings(pfr.StringResult)
    End Sub

    Sub AddPlotSettings(ByVal PlotSettingsFile As String)

        Dim CurrentDatabase As Database = HostApplicationServices.WorkingDatabase
        Dim layName As String = Nothing
        Using SourceDatabase As New Database(False, True)
            SourceDatabase.ReadDwgFile(PlotSettingsFile, FileOpenMode.OpenForReadAndAllShare, True, "")
            Using currentTransaction As Transaction = CurrentDatabase.TransactionManager.StartTransaction

                Using sourceTransaction As Transaction = SourceDatabase.TransactionManager.StartTransaction
                    Dim sourcePlotDic As DBDictionary = SourceDatabase.PlotSettingsDictionaryId.GetObject(OpenMode.ForRead)

                    For Each item As DBDictionaryEntry In sourcePlotDic
                        Dim pl As PlotSettings = sourcePlotDic.GetAt(item.Key).GetObject(OpenMode.ForRead)
                        Dim cpl As New PlotSettings(pl.ModelType)
                        cpl.CopyFrom(pl)
                        cpl.AddToPlotSettingsDictionary(CurrentDatabase)
                    Next

                    sourceTransaction.Commit()
                End Using
                currentTransaction.Commit()
            End Using

        End Using


    End Sub
End Class
You can also find your answers @ TheSwamp
Message 6 of 6

SRSDS
Advisor
Advisor

Thankyou all so much. 

 

It was almost there. Jeff's code showed a small difference.

 

Instead of:

Dim cpl As New PlotSettings(False)

I changed it to..

    Dim cpl As New PlotSettings(pl.ModelType)

 

And it appears to be working fine now.

0 Likes