BuildingCoder.CmdNewBeamTypeInstance.Execute C# (CSharp) Метод

Execute() публичный Метод

public Execute ( ExternalCommandData commandData, string &message, ElementSet elements ) : System.Result
commandData ExternalCommandData
message string
elements ElementSet
Результат System.Result
        public Result Execute(
            ExternalCommandData commandData,
            ref string message,
            ElementSet elements)
        {
            Result rc = Result.Failed;
              UIApplication app = commandData.Application;
              Document doc = app.ActiveUIDocument.Document;

              // Check whether the family we are interested in is loaded:

            #if _2010
              List<Element> symbols = new List<Element>();
              Filter filterFamily = creApp.Filter.NewFamilyFilter( _family_name );
              doc.get_Elements( filterFamily, symbols );

              // the family filter returns both the symbols and the family itself:

              Family f = null;
              foreach( Element e in symbols )
              {
            if( e is Family )
            {
              f = e as Family;
            }
            else if( e is FamilySymbol )
            {
              FamilySymbol s = e as FamilySymbol;
              Debug.Print( "Family name={0}, symbol name={1}", s.Family.Name, s.Name );
            }
              }
            #endif // _2010

              Family f = Util.GetFirstElementOfTypeNamed(
            doc, typeof( Family ), _family_name ) as Family;

              using ( Transaction t = new Transaction( doc ) )
              {
            t.Start( "Create Beam Type and Instance" );
            // If the family was not already loaded, then do so:

            if ( null == f )
            {
              if ( !doc.LoadFamily( _path, out f ) )
              {
            message = "Unable to load '" + _path + "'.";
              }
            }

            if ( null != f )
            {
              Debug.Print( "Family name={0}", f.Name );

              // Pick a symbol for duplication, any one will do,
              // we select the first:

              FamilySymbol s = null;

              //foreach( FamilySymbol s2 in f.Symbols ) // 2014

              foreach ( ElementId id in f.GetFamilySymbolIds() ) // 2015
              {
            s = doc.GetElement( id ) as FamilySymbol;
            break;
              }

              Debug.Assert( null != s, "expected at least one symbol to be defined in family" );

              // Duplicate the existing symbol:

              ElementType s1 = s.Duplicate( "Nuovo simbolo" );
              s = s1 as FamilySymbol;

              // Analyse the symbol parameters:

              foreach ( Parameter param in s.Parameters )
              {
            Debug.Print( "Parameter name={0}, value={1}", param.Definition.Name, param.AsValueString() );
              }

              // Define new dimensions for our new type;
              // the specified parameter name is case sensitive:

              //s.get_Parameter( "b" ).Set( Util.MmToFoot( 500 ) ); // 2014
              //s.get_Parameter( "h" ).Set( Util.MmToFoot( 1000 ) ); // 2014

              s.LookupParameter( "b" ).Set( Util.MmToFoot( 500 ) ); // 2015
              s.LookupParameter( "h" ).Set( Util.MmToFoot( 1000 ) ); // 2015

              // we can change the symbol name at any time:

              s.Name = "Nuovo simbolo due";

              // insert an instance of our new symbol:

              Autodesk.Revit.Creation.Application creApp = app.Application.Create;
              Autodesk.Revit.Creation.Document creDoc = doc.Create;

              // It is possible to insert a beam,
              // which normally uses a location line,
              // by specifying only a location point:

              //XYZ p = XYZ.Zero;
              //doc.Create.NewFamilyInstance( p, s, nonStructural );

              XYZ p = XYZ.Zero;
              XYZ q = creApp.NewXYZ( 30, 20, 20 ); // feet
              Line line = Line.CreateBound( p, q );

              // Specifying a non-structural type here means no beam
              // is created, and results in a null family instance:

              FamilyInstance fi = creDoc.NewFamilyInstance(
            line, s, null, stBeam );

              // This creates a visible family instance,
              // but the resulting beam has no location line
              // and behaves strangely, e.g. cannot be selected:
              //FamilyInstance fi = doc.Create.NewFamilyInstance(
              //  p, s, q, null, nonStructural );

              //List<Element> levels = new List<Element>();
              //doc.get_Elements( typeof( Level ), levels );
              //Debug.Assert( 0 < levels.Count,
              //  "expected at least one level in model" );
              //Level level = levels[0] as Level;
              //fi = doc.Create.NewFamilyInstance(
              //  line, s, level, nonStructural );

              rc = Result.Succeeded;
            }
            t.Commit();
              }
              return rc;
        }
CmdNewBeamTypeInstance