• Industries
  • Products
  • Buy
  • Services & Support
  • Communities
  • Discussion Groups

    .NET

    Reply
    Active Contributor
    Posts: 45
    Registered: ‎04-20-2012

    Re: Sheet Set Editing

    05-15-2012 06:28 AM in reply to: Artvegas

    Ok, yes, I also found that coding in the sample that I got from the screencast you suggested.

     

    I think I have everything working and now I just need to work out a couple small things to make it perfect.

     

    I will post the code that I have below here.  One thing that I noticed is that when I hadd sheets to the sheet set for example I create a sheet set with 2 sheets in it, everything will come up and work and the sheets will be added however I have created a dialog box that comes up and asks for information (works fine), but the first sheet that I put in will be listed below the second(e.g. I want sheet1, sheet2 but it lists as sheet2, sheet1) is there a way to change the order of the sheets so that if you add 4 sheets the dialog box I created will appear 4 times, once for each sheet.

     

    so when the dialog box appears if I add the sheets in backwards it will come out as I want, but I want to add them in order which means the sheet set will have them in backwards.

     

    also the other issue that I seen is that it did not add the custom proerty Total Sheets to the sheet set for some reason and I am not sure why, other then it was not a text value.

     

    thanks for all the help.

     

    Code:

    Imports Autodesk.AutoCAD.Runtime
    Imports ACSMCOMPONENTS18Lib
    Imports Autodesk.AutoCAD.Windows
    Imports Autodesk.AutoCAD.EditorInput
    Imports Autodesk.AutoCAD.DatabaseServices
    Imports Autodesk.AutoCAD.ApplicationServices
    
    Public Class Class1
        'Specifies the command to use
        <CommandMethod("psetup")> _
        Public Sub plansetup()
            'Get a reference to the Sheet Set Manager object
            Dim ssm As New AcSmSheetSetMgr
            'Selects the save location of the sheet set
            Dim sfd As New SaveFileDialog(title:="Save Location", defaultName:="", dialogName:="Save Location", extension:="dst", flags:=SaveFileDialog.SaveFileDialogFlags.NoFtpSites)
            sfd.ShowDialog()
            'Create a new sheet set file
            Dim ssdb As AcSmDatabase
            ssdb = ssm.CreateDatabase(sfd.Filename, "", True)
            Dim info As SheetSetInfo = New SheetSetInfo
            info.ShowDialog()
            Dim ssf As String
            ssf = Mid(ssdb.GetFileName, 1, InStrRev(ssdb.GetFileName, "\"))
            'Locks the database
            ssdb.LockDb(ssdb)
            SetSheetSetDefaults(ssdb, sfd.Filename, "Description", ssf, "C:\Users\bkenyon\Documents\lrgsht1a.dwt", "01 INDEX PLAN")
            'Get the sheet set
            Dim sss As AcSmSheetSet
            sss = ssdb.GetSheetSet
            'Set Custom Properties of the sheet set
            SetCustomProperty(sss, "Author", info.AuthorTxt.Text, PropertyFlags.CUSTOM_SHEETSET_PROP)
            SetCustomProperty(sss, "County", info.CountyTxt.Text, PropertyFlags.CUSTOM_SHEETSET_PROP)
            SetCustomProperty(sss, "Job Date", info.JobDateTxt.Text, PropertyFlags.CUSTOM_SHEETSET_PROP)
            SetCustomProperty(sss, "Job Name", info.JobNameTxt.Text, PropertyFlags.CUSTOM_SHEETSET_PROP)
            SetCustomProperty(sss, "Job Number", info.JobNumberTxt.Text, PropertyFlags.CUSTOM_SHEETSET_PROP)
            SetCustomProperty(sss, "Job Type", info.JobTypeTxt.Text, PropertyFlags.CUSTOM_SHEETSET_PROP)
            SetCustomProperty(sss, "Owner / Developer", info.OwnerTxt.Text, PropertyFlags.CUSTOM_SHEETSET_PROP)
            SetCustomProperty(sss, "Street", info.StreetTxt.Text, PropertyFlags.CUSTOM_SHEETSET_PROP)
            SetCustomProperty(sss, "Total Sheets", info.TotalSheetNum.Value, PropertyFlags.CUSTOM_SHEETSET_PROP)
            SetCustomProperty(sss, "Town", info.TownTxt.Text, PropertyFlags.CUSTOM_SHEETSET_PROP)
            SetCustomProperty(sss, "Township", info.MunicipalityTxt.Text, PropertyFlags.CUSTOM_SHEETSET_PROP)
            'Adds sheets to the sheet set
            Dim sheetinfo As SheetProps = New SheetProps
            For i As Integer = 1 To info.TotalSheetNum.Value
                sheetinfo.ShowDialog()
                AddSheet(ssdb, sheetinfo.SheetName.Text, sheetinfo.SheetDesc.Text, sheetinfo.SheetNum.Text, sheetinfo.SheetName.Text)
            Next
            'Unlocks the database
            ssdb.UnlockDb(ssdb)
            'Closes the database
            ssm.Close(ssdb)
        End Sub
        ' Used to add a sheet to a sheet set or subset
        ' Note: This function is dependent on a Default Template and Storage location
        ' being set for the sheet set or subset.
        Private Function AddSheet(ByVal component As IAcSmComponent, ByVal name As String, ByVal desc As String, ByVal number As String, ByVal title As String) As AcSmSheet
            Dim sheet As AcSmSheet
            
            sheet = component.GetDatabase().GetSheetSet().AddNewSheet(name, _
                                                                      desc)
            ' Add the sheet as the first one in the sheet set
            component.GetDatabase().GetSheetSet().InsertComponent(sheet, Nothing)
            ' Set the number and title of the sheet
            sheet.SetNumber(number)
            sheet.SetTitle(title)
            AddSheet = sheet
        End Function
        ' Set the default properties of a sheet set
        Private Sub SetSheetSetDefaults(ByVal sheetSetDatabase As AcSmDatabase, _
                                        ByVal name As String, _
                                        ByVal description As String, _
                                        Optional ByVal newSheetLocation As String = "", _
                                        Optional ByVal newSheetDWTLocation As String = "", _
                                        Optional ByVal newSheetDWTLayout As String = "", _
                                        Optional ByVal promptForDWT As Boolean = False)
    
            ' Set the Name and Description for the sheet set
            sheetSetDatabase.GetSheetSet().SetName(name)
            sheetSetDatabase.GetSheetSet().SetDesc(description)
    
            ' Check to see if a Storage Location was provided
            If newSheetLocation <> "" Then
                ' Get the folder the sheet set is stored in
                Dim sheetSetFolder As String
                sheetSetFolder = Mid(sheetSetDatabase.GetFileName(), 1, _
                                     InStrRev(sheetSetDatabase.GetFileName(), "\"))
    
                ' Create a reference to a File Reference object
                Dim fileReference As IAcSmFileReference
                fileReference = sheetSetDatabase.GetSheetSet().GetNewSheetLocation()
    
                ' Set the default storage location based on the location of the sheet set
                fileReference.SetFileName(sheetSetFolder)
    
                ' Set the new Sheet location for the sheet set
                sheetSetDatabase.GetSheetSet().SetNewSheetLocation(fileReference)
            End If
    
            ' Check to see if a Template was provided
            If newSheetDWTLocation <> "" Then
                ' Set the Default Template for the sheet set
                Dim layoutReference As AcSmAcDbLayoutReference
                layoutReference = sheetSetDatabase.GetSheetSet().GetDefDwtLayout()
    
                ' Set the template location and name of the layout 
                ' for the Layout Reference object
                layoutReference.SetFileName(newSheetDWTLocation)
                layoutReference.SetName(newSheetDWTLayout)
    
                ' Set the Layout Reference for the sheet set
                sheetSetDatabase.GetSheetSet().SetDefDwtLayout(layoutReference)
            End If
    
            ' Set the Prompt for Template option of the subset
            sheetSetDatabase.GetSheetSet().SetPromptForDwt(promptForDWT)
        End Sub
        ' Set/create a custom sheet or sheet set property
        Private Sub SetCustomProperty(ByVal owner As IAcSmPersist, _
                                      ByVal propertyName As String, _
                                      ByVal propertyValue As Object, _
                                      ByVal sheetSetFlag As PropertyFlags)
    
            ' Create a reference to the Custom Property Bag
            Dim customPropertyBag As AcSmCustomPropertyBag
    
            ' Create a reference to a Custom Property Value
            Dim customPropertyValue As AcSmCustomPropertyValue = New AcSmCustomPropertyValue()
    
            If owner.GetTypeName() = "AcSmSheet" Then
                Dim sheet As AcSmSheet = owner
                customPropertyBag = sheet.GetCustomPropertyBag()
                customPropertyValue.InitNew(sheet)
            Else
                Dim sheetSet As AcSmSheetSet = owner
                customPropertyBag = sheetSet.GetCustomPropertyBag()
                customPropertyValue.InitNew(sheetSet)
            End If
    
            ' Set the flag for the property
            customPropertyValue.SetFlags(sheetSetFlag)
    
            ' Set the value for the property
            customPropertyValue.SetValue(propertyValue)
    
            ' Create the property
            customPropertyBag.SetProperty(propertyName, customPropertyValue)
        End Sub
    End Class

     

    Please use plain text.
    Active Contributor
    Posts: 45
    Registered: ‎04-20-2012

    Re: Sheet Set Editing

    05-15-2012 08:12 AM in reply to: bkenyon13

    ok, so I have figured out the order thing.

     

    I changed the insertcomponent to insertcomponentafter which fixes the order of the sheets that I was having issues with.

     

    also I added the tostring for the total sheets custom property whcih added that to the sheet set.

     

    another issue I forgot to mention is:

    Is there a way to have the first sheet use a dwt then the other sheets use a different dwt file?

    Please use plain text.
    Distinguished Contributor
    Artvegas
    Posts: 104
    Registered: ‎04-21-2011

    Re: Sheet Set Editing

    05-15-2012 08:49 PM in reply to: bkenyon13

    This is how I understand the sheet set manager to work with locations and templates...

     

    When you add a new sheet, the sheet set manager will:

    1. Look at the parent (i.e. sheet-set or subset).
    2. Get the parent properties (i.e. "New Sheet Location" and "Sheet Creation Template").
    3. Create a new dwg file based on the properties.

     

    So if you add a new sheet into the root sheet-set it will be based on the root sheet-set properties, but if you add a new sheet into a subset it will be based on the sub-set properties. Also note that when you add a new subset, by default it will copy the properties from the parent - i.e. from the sheet-set (or subset in the case of a nested subset).

     

    So to answer your question... I'd say no you can't specify a different template for the first sheet.

     

    I'm not sure exactly what you are trying to achieve with the first sheet, but here are some options I can think of:

     

    1. For the sheet-set or subset, you can specify the "Prompt for Template" property to be "Yes". This will mean that when the user adds a sheet, AutoCAD will prompt you with a dialog to select a template and layout. I haven't tested it, but my guess is that adding a sheet programatically would ignore this property anyways.

    2. You can import a dwg (not a dwt) as the first sheet. Unlike adding a new sheet, this won't actually create a dwg file so it may not suit your purposes. Refer to the ImportASheet method for a sample of how to do this programatically.

    3. You can create a seperate subset for the first sheet (with a different template assigned).

    4. If I was doing this programatically:- I would set the template file, then add the first sheet, then change the template file for all subsequent sheets added.

     

    Hope this helps.

     

    Art

    Please use plain text.
    Active Contributor
    Posts: 45
    Registered: ‎04-20-2012

    Re: Sheet Set Editing

    05-16-2012 05:23 AM in reply to: Artvegas

    yes, that helps me understand a little more.

    The way I have it setup is that when you run the command a dialog shows and you put in your information including how many sheets you want in the sheet set.

    based on that number it will then prompt you for a number, name and description for each sheet, so if you specified you want 4 sheets that dialog would show four times.

     

    The reason that I want to change templates is that we have one for our 1st sheet (cover sheet) of plans that we do and then we have another template we use for all the other sheets. This is not a major thing, but would be nice to do to save some time deleting things from the sheets 2 and on.

     

    I may seem very ambishous with this, but I am also trying to set xreferences to all the sheets.  I can post the code if needed.  I have it worked out that when each sheet is added it will open it, then I want to add the xreferences based on dwgs selected before then close and save the dwg.  I think the only thing that I have not gotten figured out is how to set the newly opened dwg to be the active one.

     

    again thanks for all your help.

    Please use plain text.
    Active Contributor
    Posts: 45
    Registered: ‎04-20-2012

    Re: Sheet Set Editing

    05-18-2012 02:08 PM in reply to: bkenyon13

    Everything with the sheet set command is now working how I would like it.

     

    below is the resulting code:

    Imports Autodesk.AutoCAD.Runtime
    Imports ACSMCOMPONENTS18Lib
    Imports Autodesk.AutoCAD.Windows
    Imports Autodesk.AutoCAD.EditorInput
    Imports Autodesk.AutoCAD.DatabaseServices
    Imports Autodesk.AutoCAD.ApplicationServices
    Imports Autodesk.AutoCAD.Interop
    Imports Autodesk.AutoCAD.Geometry
    
    Public Class Class1
        'Specifies the command to use
        <CommandMethod("psetup")> _
        Public Sub plansetup()
            Dim doc As DocumentCollection = Application.DocumentManager
            Dim db As New Database(False, False)
            'Get a reference to the Sheet Set Manager object
            Dim ssm As New AcSmSheetSetMgr
            'Selects the save location of the sheet set
            Dim sfd As New SaveFileDialog(title:="Save Location", defaultName:="", dialogName:="Save Location", extension:="dst", flags:=SaveFileDialog.SaveFileDialogFlags.NoFtpSites)
            sfd.ShowDialog()
            'Create a new sheet set file
            Dim ssdb As AcSmDatabase
            ssdb = ssm.CreateDatabase(sfd.Filename, "", True)
            Dim info As SheetSetInfo = New SheetSetInfo
            info.ShowDialog()
            Dim ssf As String
            ssf = Mid(ssdb.GetFileName, 1, InStrRev(ssdb.GetFileName, "\"))
            'Locks the database
            ssdb.LockDb(ssdb)
            'Get the sheet set
            Dim sss As AcSmSheetSet
            sss = ssdb.GetSheetSet
            'Set Custom Properties of the sheet set
            SetCustomProperty(sss, "Author", info.AuthorTxt.Text, PropertyFlags.CUSTOM_SHEETSET_PROP)
            SetCustomProperty(sss, "County", info.CountyTxt.Text, PropertyFlags.CUSTOM_SHEETSET_PROP)
            SetCustomProperty(sss, "Job Date", info.JobDateTxt.Text, PropertyFlags.CUSTOM_SHEETSET_PROP)
            SetCustomProperty(sss, "Job Name", info.JobNameTxt.Text, PropertyFlags.CUSTOM_SHEETSET_PROP)
            SetCustomProperty(sss, "Job Number", info.JobNumberTxt.Text, PropertyFlags.CUSTOM_SHEETSET_PROP)
            SetCustomProperty(sss, "Job Type", info.JobTypeTxt.Text, PropertyFlags.CUSTOM_SHEETSET_PROP)
            SetCustomProperty(sss, "Owner / Developer", info.OwnerTxt.Text, PropertyFlags.CUSTOM_SHEETSET_PROP)
            SetCustomProperty(sss, "Street", info.StreetTxt.Text, PropertyFlags.CUSTOM_SHEETSET_PROP)
            SetCustomProperty(sss, "Total Sheets", info.TotalSheetNum.Value.ToString, PropertyFlags.CUSTOM_SHEETSET_PROP)
            SetCustomProperty(sss, "Town", info.TownTxt.Text, PropertyFlags.CUSTOM_SHEETSET_PROP)
            SetCustomProperty(sss, "Township", info.MunicipalityTxt.Text, PropertyFlags.CUSTOM_SHEETSET_PROP)
            Dim efd As New OpenFileDialog(title:="Existing Xref File", defaultName:="", dialogName:="Select Existing Xref", extension:="dwg", flags:=OpenFileDialog.OpenFileDialogFlags.NoFtpSites)
            Dim pfd As New OpenFileDialog(title:="Proposed Xref File", defaultName:="", dialogName:="Select Proposed Xref", extension:="dwg", flags:=OpenFileDialog.OpenFileDialogFlags.NoFtpSites)
            Dim xrefd As New Xrefdia
            xrefd.ShowDialog()
            Dim sheetinfo As SheetProps = New SheetProps
            If xrefd.DialogResult = Windows.Forms.DialogResult.Yes Then
                efd.ShowDialog()
                pfd.ShowDialog()
                For i As Integer = 1 To info.TotalSheetNum.Value
                    sheetinfo.ShowDialog()
                    If sheetinfo.SheetNum.Text = "1" Then
                        SetSheetSetDefaults(ssdb, sfd.Filename, "Description", ssf, "C:\Users\Barclay\Documents\lrgsht1a.dwt", "01 INDEX PLAN")
                    Else
                        If sheetinfo.SheetNum.Text = "CS-01" Then
                            SetSheetSetDefaults(ssdb, sfd.Filename, "Description", ssf, "C:\Users\Barclay\Documents\lrgsht1a.dwt", "01 INDEX PLAN")
                        Else
                            SetSheetSetDefaults(ssdb, sfd.Filename, "Description", ssf, "C:\Users\Barclay\Documents\lrgsht2.dwt", "01 INDEX PLAN")
                        End If
                    End If
                    AddSheet(ssdb, sheetinfo.SheetName.Text, sheetinfo.SheetDesc.Text, sheetinfo.SheetNum.Text, sheetinfo.SheetName.Text)
                    db.ReadDwgFile(ssf & sheetinfo.SheetName.Text & ".dwg", FileOpenMode.OpenForReadAndAllShare, False, "")
                    Dim xrefid As ObjectId = db.OverlayXref(efd.Filename, efd.Filename)
                    Dim xrefid2 As ObjectId = db.OverlayXref(pfd.Filename, pfd.Filename)
                    Using trans As Transaction = db.TransactionManager.StartTransaction()
                        Dim bt As BlockTable = TryCast(db.BlockTableId.GetObject(OpenMode.ForRead), BlockTable)
                        Dim btr As BlockTableRecord = TryCast(bt(BlockTableRecord.ModelSpace).GetObject(OpenMode.ForWrite), BlockTableRecord)
                        Dim bref As New BlockReference(Point3d.Origin, xrefid)
                        Dim bref2 As New BlockReference(Point3d.Origin, xrefid2)
                        btr.AppendEntity(bref)
                        btr.AppendEntity(bref2)
                        trans.AddNewlyCreatedDBObject(bref, True)
                        trans.AddNewlyCreatedDBObject(bref2, True)
                        trans.Commit()
                    End Using
                    db.SaveAs(ssf & sheetinfo.SheetName.Text & ".dwg", DwgVersion.Current)
                    db.CloseInput(True)
                    db.Dispose()
                Next
            Else
                For i As Integer = 1 To info.TotalSheetNum.Value
                    sheetinfo.ShowDialog()
                    If sheetinfo.SheetNum.Text = "1" Then
                        SetSheetSetDefaults(ssdb, sfd.Filename, "Description", ssf, "C:\Users\Barclay\Documents\lrgsht1a.dwt", "01 INDEX PLAN")
                    Else
                        If sheetinfo.SheetNum.Text = "CS-01" Then
                            SetSheetSetDefaults(ssdb, sfd.Filename, "Description", ssf, "C:\Users\Barclay\Documents\lrgsht1a.dwt", "01 INDEX PLAN")
                        Else
                            SetSheetSetDefaults(ssdb, sfd.Filename, "Description", ssf, "C:\Users\Barclay\Documents\lrgsht2.dwt", "01 INDEX PLAN")
                        End If
                    End If
                    AddSheet(ssdb, sheetinfo.SheetName.Text, sheetinfo.SheetDesc.Text, sheetinfo.SheetNum.Text, sheetinfo.SheetName.Text)
                Next
            End If
            'Unlocks the database
            ssdb.UnlockDb(ssdb)
            'Closes the database
            ssm.Close(ssdb)
        End Sub
        ' Used to add a sheet to a sheet set
        ' Note: This function is dependent on a Default Template and Storage location
        ' being set for the sheet set
        Private Function AddSheet(ByVal component As IAcSmComponent, ByVal name As String, ByVal desc As String, ByVal number As String, ByVal title As String) As AcSmSheet
            Dim sheet As AcSmSheet
            
            sheet = component.GetDatabase().GetSheetSet().AddNewSheet(name, _
                                                                      desc)
            ' Add the sheet as the first one in the sheet set
            component.GetDatabase().GetSheetSet().InsertComponentAfter(sheet, Nothing)
            ' Set the number and title of the sheet
            sheet.SetNumber(number)
            sheet.SetTitle(title)
            AddSheet = sheet
        End Function
        ' Set the default properties of a sheet set
        Private Sub SetSheetSetDefaults(ByVal sheetSetDatabase As AcSmDatabase, _
                                        ByVal name As String, _
                                        ByVal description As String, _
                                        Optional ByVal newSheetLocation As String = "", _
                                        Optional ByVal newSheetDWTLocation As String = "", _
                                        Optional ByVal newSheetDWTLayout As String = "", _
                                        Optional ByVal promptForDWT As Boolean = False)
    
            ' Set the Name and Description for the sheet set
            sheetSetDatabase.GetSheetSet().SetName(name)
            sheetSetDatabase.GetSheetSet().SetDesc(description)
    
            ' Check to see if a Storage Location was provided
            If newSheetLocation <> "" Then
                ' Get the folder the sheet set is stored in
                Dim sheetSetFolder As String
                sheetSetFolder = Mid(sheetSetDatabase.GetFileName(), 1, _
                                     InStrRev(sheetSetDatabase.GetFileName(), "\"))
    
                ' Create a reference to a File Reference object
                Dim fileReference As IAcSmFileReference
                fileReference = sheetSetDatabase.GetSheetSet().GetNewSheetLocation()
    
                ' Set the default storage location based on the location of the sheet set
                fileReference.SetFileName(sheetSetFolder)
    
                ' Set the new Sheet location for the sheet set
                sheetSetDatabase.GetSheetSet().SetNewSheetLocation(fileReference)
            End If
    
            ' Check to see if a Template was provided
            If newSheetDWTLocation <> "" Then
                ' Set the Default Template for the sheet set
                Dim layoutReference As AcSmAcDbLayoutReference
                layoutReference = sheetSetDatabase.GetSheetSet().GetDefDwtLayout()
    
                ' Set the template location and name of the layout 
                ' for the Layout Reference object
                layoutReference.SetFileName(newSheetDWTLocation)
                layoutReference.SetName(newSheetDWTLayout)
    
                ' Set the Layout Reference for the sheet set
                sheetSetDatabase.GetSheetSet().SetDefDwtLayout(layoutReference)
            End If
    
            ' Set the Prompt for Template option of the subset
            sheetSetDatabase.GetSheetSet().SetPromptForDwt(promptForDWT)
        End Sub
        ' Set/create a custom sheet or sheet set property
        Private Sub SetCustomProperty(ByVal owner As IAcSmPersist, _
                                      ByVal propertyName As String, _
                                      ByVal propertyValue As Object, _
                                      ByVal sheetSetFlag As PropertyFlags)
    
            ' Create a reference to the Custom Property Bag
            Dim customPropertyBag As AcSmCustomPropertyBag
    
            ' Create a reference to a Custom Property Value
            Dim customPropertyValue As AcSmCustomPropertyValue = New AcSmCustomPropertyValue()
    
            If owner.GetTypeName() = "AcSmSheet" Then
                Dim sheet As AcSmSheet = owner
                customPropertyBag = sheet.GetCustomPropertyBag()
                customPropertyValue.InitNew(sheet)
            Else
                Dim sheetSet As AcSmSheetSet = owner
                customPropertyBag = sheetSet.GetCustomPropertyBag()
                customPropertyValue.InitNew(sheetSet)
            End If
    
            ' Set the flag for the property
            customPropertyValue.SetFlags(sheetSetFlag)
    
            ' Set the value for the property
            customPropertyValue.SetValue(propertyValue)
    
            ' Create the property
            customPropertyBag.SetProperty(propertyName, customPropertyValue)
        End Sub
    End Class

     

    Please use plain text.