public void ShowSample()
        {
            Database db = GetDatabase();
            Editor   ed = GetEditor();

            ed.WriteMessage("Adding a new property set definition contains a formula property to calculate wall volume.\n");
            // we need to add all the automatic properties prior to the formula property
            PropertySetDefinition psd = CreateWallPropertySetDefinition();
            // then we add the property set definition to the dictionary to make formula property work properly
            DictionaryPropertySetDefinitions dict = new DictionaryPropertySetDefinitions(db);

            using (Transaction trans = db.TransactionManager.StartTransaction())
            {
                dict.AddNewRecord("SampleWallPropertySetDefinition", psd);
                trans.AddNewlyCreatedDBObject(psd, true);
                // now we can create the formula property
                PropertyDefinitionFormula formula = new PropertyDefinitionFormula();
                formula.SetToStandard(db);
                formula.SubSetDatabaseDefaults(db);
                formula.Name = "Wall Volume";
                formula.UseFormulaForDescription = true;
                // before setting formula string to the formula property, we need to make sure
                // that the property definition is added to the property set definition (which has an object id)
                psd.Definitions.Add(formula);
                // so we can set the formula string now
                formula.SetFormulaString("[Length]*[Height]*[Width]");
                // and here we change the sample values of the referenced properties
                formula.DataItems[0].Sample = 1;
                formula.DataItems[1].Sample = 2;
                formula.DataItems[2].Sample = 3;
                trans.Commit();
            }
            ed.WriteMessage("A new property set definition \"SampleWallPropertySetDefinition\" is created.\n");
            ed.WriteMessage("It contains a formula definition named \"Wall Volume\".\n");
        }
        public static ObjectId CreateStairPropertySetDefinition(string psdName)
        {
            ObjectId psdId;

            Database db = Application.DocumentManager.MdiActiveDocument.Database;
            Editor   ed = Application.DocumentManager.MdiActiveDocument.Editor;

            Autodesk.AutoCAD.DatabaseServices.TransactionManager tm = db.TransactionManager;

            DictionaryPropertySetDefinitions dict = new DictionaryPropertySetDefinitions(db);


            // Check for existing propert set definition ... If so just return its ObjectId.
            psdId = GetPropertySetDefinitionIdByName(psdName);

            if (psdId != ObjectId.Null)
            {
                ed.WriteMessage("\n Property set definition {0} exist", psdName);
                return(psdId);
                // check version and correctness not implemented
            }
            else
            {
                // Create the new property set definition;
                PropertySetDefinition psd = new PropertySetDefinition();
                psd.SetToStandard(db);
                psd.SubSetDatabaseDefaults(db);
                psd.AlternateName = psdName;
                psd.IsLocked      = true;
                psd.IsVisible     = false;
                psd.IsWriteable   = true;

                // Setup an array of objects that this property set definition will apply to
                System.Collections.Specialized.StringCollection appliesto = new System.Collections.Specialized.StringCollection
                {
                    "AcDb3dSolid"
                };
                psd.SetAppliesToFilter(appliesto, false);

                // Add the property set definition to the dictionary to make formula property work correctly
                using (Transaction tr = tm.StartTransaction())
                {
                    dict.AddNewRecord(psdName, psd);
                    tr.AddNewlyCreatedDBObject(psd, true);

                    // Invisible Properties (managed by app)
                    PropertyDefinition def;

                    def = new PropertyDefinition();
                    def.SetToStandard(db);
                    def.SubSetDatabaseDefaults(db);
                    def.Name        = "_tread";
                    def.DataType    = Autodesk.Aec.PropertyData.DataType.Real;
                    def.DefaultData = 0.32;
                    def.IsVisible   = false;
                    psd.Definitions.Add(def);

                    def = new PropertyDefinition();
                    def.SetToStandard(db);
                    def.SubSetDatabaseDefaults(db);
                    def.Name        = "_riser";
                    def.DataType    = Autodesk.Aec.PropertyData.DataType.Real;
                    def.DefaultData = 0.15;
                    def.IsVisible   = false;
                    psd.Definitions.Add(def);

                    def = new PropertyDefinition();
                    def.SetToStandard(db);
                    def.SubSetDatabaseDefaults(db);
                    def.Name        = "_landing";
                    def.DataType    = Autodesk.Aec.PropertyData.DataType.Real;
                    def.DefaultData = 1.1;
                    def.IsVisible   = false;
                    psd.Definitions.Add(def);

                    def = new PropertyDefinition();
                    def.SetToStandard(db);
                    def.SubSetDatabaseDefaults(db);
                    def.Name        = "_width";
                    def.DataType    = Autodesk.Aec.PropertyData.DataType.Real;
                    def.DefaultData = 2.00;
                    def.IsVisible   = false;
                    psd.Definitions.Add(def);


                    def = new PropertyDefinition();
                    def.SetToStandard(db);
                    def.SubSetDatabaseDefaults(db);
                    def.Name        = "_slope";
                    def.DataType    = Autodesk.Aec.PropertyData.DataType.Real;
                    def.DefaultData = 0.02;
                    def.IsVisible   = false;
                    psd.Definitions.Add(def);

                    def = new PropertyDefinition();
                    def.SetToStandard(db);
                    def.SubSetDatabaseDefaults(db);
                    def.Name        = "_steps";
                    def.DataType    = Autodesk.Aec.PropertyData.DataType.Integer;
                    def.DefaultData = 5;
                    def.IsVisible   = false;
                    psd.Definitions.Add(def);

                    // Visable properties (exposed to user)

                    def = new PropertyDefinition();
                    def.SetToStandard(db);
                    def.SubSetDatabaseDefaults(db);
                    def.Name        = "name";
                    def.DataType    = Autodesk.Aec.PropertyData.DataType.Text;
                    def.DefaultData = "Stair - ";
                    def.IsVisible   = true;
                    psd.Definitions.Add(def);

                    // Visable read only properties (exposed to user)

                    PropertyDefinitionFormula formula;

                    // Property definition need to be added to the property set definition before setting formula string to the formula property

                    // steps
                    formula = new PropertyDefinitionFormula();
                    formula.SetToStandard(db);
                    formula.SubSetDatabaseDefaults(db);
                    formula.Name = "steps";
                    psd.Definitions.Add(formula);
                    formula.SetFormulaString("[_steps]");

                    // riser
                    formula = new PropertyDefinitionFormula();
                    formula.SetToStandard(db);
                    formula.SubSetDatabaseDefaults(db);
                    formula.Name = "riser";
                    psd.Definitions.Add(formula);
                    formula.SetFormulaString("[_riser]");

                    // tread
                    formula = new PropertyDefinitionFormula();
                    formula.SetToStandard(db);
                    formula.SubSetDatabaseDefaults(db);
                    formula.Name = "tread";
                    psd.Definitions.Add(formula);
                    formula.SetFormulaString("[_tread]");

                    // landing
                    formula = new PropertyDefinitionFormula();
                    formula.SetToStandard(db);
                    formula.SubSetDatabaseDefaults(db);
                    formula.Name = "landing";
                    psd.Definitions.Add(formula);
                    formula.SetFormulaString("[_landing]");

                    // width
                    formula = new PropertyDefinitionFormula();
                    formula.SetToStandard(db);
                    formula.SubSetDatabaseDefaults(db);
                    formula.Name = "width";
                    psd.Definitions.Add(formula);
                    formula.SetFormulaString("[_width]");

                    // slope
                    formula = new PropertyDefinitionFormula();
                    formula.SetToStandard(db);
                    formula.SubSetDatabaseDefaults(db);
                    formula.Name = "slope";
                    psd.Definitions.Add(formula);
                    formula.SetFormulaString("[_slope]");

                    tr.Commit();

                    psdId = psd.ObjectId;
                    return(psdId);
                }
            }
        }