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

    .NET

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

    Sheet Set Editing

    753 Views, 14 Replies
    05-03-2012 09:09 AM

    I am working on a project that will create a sheet set, add the number of sheets specified in prompt into the sheet set and edit custom properties.

     

    first I am a beginner so please be patient with me.

     

    second the first issue that I am having is how to pull the number of sheets from the prompt and tell it to add that many sheets.

     

    I would assume that it would start like this

    For Each ??

        sheetset.addnewsheet()

    Next

     Please look at code posted below for prompt I have it as an integer but maybe it should be numerical

     

    Third the second issue that I am having is the editing of custom properties.

    I am using a template that already has the custom properties in, which I want to prompt the user for what the value of the custom proerty should be

    again see code posted below for prompt

     

    any assistance is greatful

     

        'Specifies the command to use
        <CommandMethod("psetup")> _
        Public Sub plansetup()
            Dim doc As Document = Application.DocumentManager.MdiActiveDocument
            Dim ed As Editor = doc.Editor
            'Get a reference to the Sheet Set Manager object
            Dim ssm As IAcSmSheetSetMgr
            ssm = New AcSmSheetSetMgr
            'Sets save location and filename of the sheet set
            Dim ssn As SaveFileDialog = New SaveFileDialog(title:="Save Sheet Set", defaultName:="", dialogName:="Save Sheet Set", extension:="dst", flags:=SaveFileDialog.SaveFileDialogFlags.NoFtpSites)
            ssn.ShowDialog()
            'Create a new sheet set file
            Dim ssdb As AcSmDatabase
            ssdb = ssm.CreateDatabase(ssn.Filename, "M:\CAD Management\CAD Files\Template\Sheetsets\New Sheet Set (1).dst", True)
            'Locks the database
            ssdb.LockDb(ssdb)
            'Sets the name and description
            ssdb.SetName(name:=ssn.Filename.ToString)
            ssdb.SetDesc(desc:="New Sheet Set")
            Dim ss As AcSmSheetSet = ssdb.GetSheetSet
            'Enter the number of sheets
            Dim nos As New PromptIntegerOptions(vbLf & "Enter the Number of Sheets:")
            Dim nor As PromptIntegerResult = ed.GetInteger(nos)
            'Enter the name of the Author
            Dim apn As New PromptStringOptions(vbLf & "Enter Name of Author:")
            Dim apr As PromptResult = ed.GetString(apn)
            For Each i As Integer 
                ss.AddNewSheet()
            Next
            'Unlocks the database
            ssdb.UnlockDb(ssdb)
            'Closes the database
            ssm.Close(ssdb)
        End Sub

     

    Please use plain text.
    *Expert Elite*
    chiefbraincloud
    Posts: 736
    Registered: ‎02-13-2008

    Re: Sheet Set Editing

    05-03-2012 11:52 AM in reply to: bkenyon13

    Not "For each I  as integer"  (you should be seeing a compiler error on that)

    When traversing a collection you use "For Each item as Type in Collection"

    When performing a task a certain number of times you use "For I as Integer = 0 to nos" 

    Or in your case you'd probably do 1 to nos

     

    Try looking at this Through The Interface post:

    http://through-the-interface.typepad.com/through_the_interface/2010/05/populating-a-tree-view-inside...

     

     

    He is reading data from a sheet set as opposed to creating one, but it might help.  (It's in C#, this is a pretty good translator http://www.developerfusion.com/tools/convert/csharp-to-vb/)

     

     

    Dave O.                                                                                Sig-Logos32.png
    Please use plain text.
    Active Contributor
    Posts: 45
    Registered: ‎04-20-2012

    Re: Sheet Set Editing

    05-03-2012 01:20 PM in reply to: chiefbraincloud

    thank you

     

    however would I not want to do

    For i as integer = 1 to nor rather then nos

     

    another thing is that when I put in the above code it says:

    using nor "promptresult can not be converted to integer"

    using nos "promptintegeroptions can not be converted to integer"

     

    I have looked at the through the interface article, but have not had a chance to really go through and analys the code and try to make sense of it

     

    I am also having issues just trying to get a sheet added to the sheet set with out the prompt and it doesn't add the sheet.

     

    I also do not get any errors on it so my only guess is that I am missing something.

     

    here is updated code:

    Imports Autodesk.AutoCAD.Runtime
    Imports Autodesk.AutoCAD.ApplicationServices
    Imports ACSMCOMPONENTS18Lib
    Imports Autodesk.AutoCAD.EditorInput
    Imports Autodesk.AutoCAD.DatabaseServices
    Imports Autodesk.AutoCAD.Windows
    
    Public Class Class1
        'Specifies the command to use
        <CommandMethod("psetup")> _
        Public Sub plansetup()
            Dim doc As Document = Application.DocumentManager.MdiActiveDocument
            Dim ed As Editor = doc.Editor
            'Get a reference to the Sheet Set Manager object
            Dim ssm As IAcSmSheetSetMgr
            ssm = New AcSmSheetSetMgr
            'Sets save location and filename of the sheet set
            Dim ssn As SaveFileDialog = New SaveFileDialog(title:="Save Sheet Set", defaultName:="", dialogName:="Save Sheet Set", extension:="dst", flags:=SaveFileDialog.SaveFileDialogFlags.NoFtpSites)
            ssn.ShowDialog()
            'Create a new sheet set file
            Dim ssdb As AcSmDatabase
            ssdb = ssm.CreateDatabase(ssn.Filename, "M:\CAD Management\CAD Files\Template\Sheetsets\New Sheet Set (1).dst", True)
            'Locks the database
            ssdb.LockDb(ssdb)
            'Sets the name and description
            ssdb.SetName(name:=ssn.Filename.ToString)
            ssdb.SetDesc(desc:="New Sheet Set")
            Dim ss As AcSmSheetSet = ssdb.GetSheetSet
            'Enter the number of sheets
            Dim nos As New PromptIntegerOptions(vbLf & "Enter the Number of Sheets:")
            Dim nor As PromptResult = ed.GetInteger(nos)
            'Enter the initials of the drafter
            Dim apn As New PromptStringOptions(vbLf & "Enter Initials of Drafter:")
            Dim apr As PromptResult = ed.GetString(apn)
            'Enter the project phase
            Dim pp As New PromptStringOptions(vbLf & "Enter the Project Phase:")
            pp.AllowSpaces = True
            Dim ppr As PromptResult = ed.GetString(pp)
            'Enter the Job Date
            Dim jd As New PromptStringOptions(vbLf & "Enter the Job Date:")
            jd.AllowSpaces = True
            Dim jdr As PromptResult = ed.GetString(jd)
            'Enter the Job Number
            Dim jn As New PromptStringOptions(vbLf & "Enter the Job Name:")
            jn.AllowSpaces = True
            Dim jnr As PromptResult = ed.GetString(jn)
            'Enter the job type
            Dim jt As New PromptStringOptions(vbLf & "Enter the Job Type:")
            jt.AllowSpaces = True
            Dim jtr As PromptResult = ed.GetString(jt)
            'Enter the county
            Dim co As New PromptStringOptions(vbLf & "Enter the Name of County:")
            co.AllowSpaces = True
            Dim cor As PromptResult = ed.GetString(co)
            'Enter the township
            Dim twp As New PromptStringOptions(vbLf & "Enter the Name of Municipality:")
            twp.AllowSpaces = True
            Dim twpr As PromptResult = ed.GetString(twp)
            'Enter the owner / developer
            Dim owd As New PromptStringOptions(vbLf & "Enter the Name of Owner / Developer:")
            owd.AllowSpaces = True
            Dim owdr As PromptResult = ed.GetString(owd)
            'Enter the town
            Dim tn As New PromptStringOptions(vbLf & "Enter the Name of Town:")
            tn.AllowSpaces = True
            Dim tnr As PromptResult = ed.GetString(tn)
            'Enter the street
            Dim str As New PromptStringOptions(vbLf & "Enter the Name of Street:")
            str.AllowSpaces = True
            Dim strr As PromptResult = ed.GetString(str)
            Dim sss As AcSmSheet = New AcSmSheet
            For i As Integer = 1 To nos
                ss.AddNewSheet(name:="", desc:="")
            Next
            'Unlocks the database
            ssdb.UnlockDb(ssdb)
            'Closes the database
            ssm.Close(ssdb)
        End Sub
    End Class

     

    Please use plain text.
    *Expert Elite*
    chiefbraincloud
    Posts: 736
    Registered: ‎02-13-2008

    Re: Sheet Set Editing

    05-03-2012 02:55 PM in reply to: bkenyon13

    Yes, I guess I didn't look close enough, at a quick glance I thought nos stood for number of sheets and was an integer. It should be nor.Value.

     

    But before you try to access the value, you should check nor.Status first to make sure the user didn't cancel.

     

    For what it's worth, you are asking for enough user input there that I would probably create a form with textboxes on it to collect the information.

    Dave O.                                                                                Sig-Logos32.png
    Please use plain text.
    *Expert Elite*
    chiefbraincloud
    Posts: 736
    Registered: ‎02-13-2008

    Re: Sheet Set Editing

    05-03-2012 03:30 PM in reply to: bkenyon13

    There appears to be zero documentation of the AcSmComponents library, and in my own code I have only read File/Layout lists from sheet sets for use in several Batch Processing functions that I have, so I can't really be of any help on the issue of creating sheets.

     

    My best stab at it with the limited information in front of me, and zero testing, is that you probably aren't supposed to just addnewsheet.

     

    Maybe something like this, but I could be way off.

     

    Dim lyt As New AcSmAcDbLayoutReference
    lyt.SetFileName(filename)
    lyt.SetName("Layout1")
    Dim newsht As AcSmSheet = ss.ImportSheet(lyt)
    newsht.SetDesc("Description")
    'more properties on newsht object

     

     

    Dave O.                                                                                Sig-Logos32.png
    Please use plain text.
    Active Contributor
    Posts: 45
    Registered: ‎04-20-2012

    Re: Sheet Set Editing

    05-04-2012 04:24 AM in reply to: chiefbraincloud

    Thanks that infromation has helped

     

    to get nor.value to work I had to change the result to promptintegerresult rather then promptresult

    somehow I missed seeing promtpintegerresult the first time through

     

    anyhow adding a sheet is still just beyond my reach and when running the code I get this error:

    System.Runtime.InteropServices.COMException (0x80040203): A syntax error occurred trying to evaluate a query string (Exception from HRESULT: 0x80040203)    at ACSMCOMPONENTS18Lib.AcSmSheetSetClass.AddNewSheet(String name, String desc)    at PlanSetup.Class1.plansetup() in C:\Users\bkenyon\Documents\Visual Studio 2008\Projects\PlanSetup\PlanSetup\Class1.vb:line 34    at Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorker(MethodInfo mi, Object commandObject, Boolean bLispFunction)    at Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorkerWithExceptionFilter(MethodInfo mi, Object commandObject, Boolean bLispFunction)    at Autodesk.AutoCAD.Runtime.PerDocumentCommandClass.Invoke(MethodInfo mi, Boolean bLispFunction)    at Autodesk.AutoCAD.Runtime.CommandClass.CommandThunk.Invoke()

     

    below is the code that I have currently, I think I may be missing something with an initnew somewhere:

    code snippet

            'Enter the number of sheets
            Dim nos As New PromptIntegerOptions(vbLf & "Enter the Number of Sheets:")
            Dim nor As PromptIntegerResult = ed.GetInteger(nos)
            For i As Integer = 1 To nor.Value
                ss.AddNewSheet(name:="Sheet1", desc:="Cover Sheet")
            Next

     I tested this by using a prompt so I know that the for section works properly

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

    Re: Sheet Set Editing

    05-05-2012 08:06 AM in reply to: bkenyon13

    Heard you guys might be looking for documentation and guidance on using the Sheet Set Object API. Here are some that might be useful:


    1. AutoCAD 2012 User's Guide - Work with Sheets in a Sheet Set:
        Online: Link

    2. AutoCAD 2012 - Sheet Set Objects Reference:
        Online: Link

    3. Autodesk University: CP215-2 Filling the Gaps in the Sheet Set Manager:
        Pdf: Download
        Video: Link

    4. Autodesk University: CP318-4 Taking a Look at the Sheet Set Object With VB.NET:
        Online: Link

    5. Autodesk University: CP15-1 Taking a Look at the Sheet Set Object:
        Pdf: Download

    6. Populating a tree view inside AutoCAD with sheet set data using .NET:
        Online: Link

    7. Populating a tree view inside AutoCAD with sheet set data using .NET - Part 2:
        Online: Link


    Number 4 was easily the best for me. You have to join Autodesk University but don't worry it's free!

    Hope this helps somewhat.

     

    Art.

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

    Re: Sheet Set Editing

    05-08-2012 09:29 AM in reply to: Artvegas

    Sorry for the dealy in posting, but I have been busy lately.

     

    Thanks for the information and I did not get a chance to look at all of them, but I did look at number 4 and it shed some light on the issue I am having.

     

    I have not had a chance to redo the code yet, but I have download the sample code that went with that screencast and I should be able to get what I need from there.

     

    I did notice that one thing that I need to do is get the path of where the sheet set is saved, and also set a default dwt file of rhte sheet set that is created.

     

    another thing that was missing was I noticed in the code that after the addnewsheet was a line that had insertcomponent which from the looks of it needs to be added in order for the sheet to be in the sheet set.

     

    again thanks the information is extremely helpful.  I will post the new code once I have a chance to get it changed and tested.

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

    Re: Sheet Set Editing

    05-10-2012 07:17 AM in reply to: bkenyon13

    ok, so revised the code, but still get an error when running it not sure what I am missing.

    I took the code from the sample that you can download from the one screencast thing to see if that is what I was missing, but for some reason it does not like anything that I put in for the name and description of the sheet to be added.

     

    Error:

    System.Runtime.InteropServices.COMException (0x80040203): A syntax error occurred trying to evaluate a query string (Exception from HRESULT: 0x80040203)    at ACSMCOMPONENTS18Lib.AcSmSheetSetClass.AddNewSheet(String name, String desc)    at PlanSetup.Class1.AddSheet(IAcSmComponent component

     

    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)
            'Locks the database
            ssdb.LockDb(ssdb)
            Dim sss As AcSmSheetSet
            sss = ssdb.GetSheetSet
            AddSheet(ssdb)
            '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) As AcSmSheet
            Dim sheet As AcSmSheet
            sheet = component.GetDatabase().GetSheetSet().AddNewSheet(name:="Sheet1", _
                                                                      desc:="Description")
            ' 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(num:="01")
            sheet.SetTitle(title:="Title")
            AddSheet = sheet
        End Function
    End Class

     

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

    Re: Sheet Set Editing

    05-10-2012 10:01 AM in reply to: bkenyon13

    I see the problem.

     

    Before trying to add any new sheets, you need to specify the directory where new sheet drawings will be placed, as well as the template file and its layout name that the sheet will be based on.

     

    Place the following code between the following lines:

    --------------------------------------------------------------------------------------------------------

       sss = ssdb.GetSheetSet

     

            ' Set new sheet directory location.
            Dim fileRef As IAcSmFileReference = sss.GetNewSheetLocation()
            fileRef.SetFileName("E:\Junk")
            sss.SetNewSheetLocation(fileRef)

     

            ' Set new sheet template dwt file and layout name.
            Dim layRef As AcSmAcDbLayoutReference = sss.GetDefDwtLayout()
            layRef.SetFileName("E:\Junk\Template.dwt")
            layRef.SetName("Layout1")
            sss.SetDefDwtLayout(layRef)

     

       AddSheet(ssdb)

    --------------------------------------------------------------------------------------------------------

     

    Obviously the directory, file and layout paths will vary for you, and you will need to place a template file to do this.

     

    Rather than create dst files from scratch, perhaps it might be easier for you to setup an empty sheet set dst file with all of the typical properties already set, and then use this dst file as a template. You can then programatically add anything that you want to change as follows:
     - Create new AcSmDatabase using CreateDatabase(), same as your example;
     - Then use AcSmDatabase.LoadFromFile() and specify your dst template file;
     - Lock the database;
     - Make any changes you want;
     - Unlock the database, specifying the bCommit parameter true to save;
     

    Note: The LoadFromFile() method "copies" the data from the default dst file into your AcSmDatabase object, so that when you save it using Unlock() with bCommit set true, the data will be written to the dst file you specified in CreateDatabase().

     

    Hope this helps - Art

    Please use plain text.