BuildingCoder.CmdWallLayers.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)
        {
            UIApplication app = commandData.Application;
              UIDocument uidoc = app.ActiveUIDocument;
              Document doc = app.ActiveUIDocument.Document;

              // Retrieve selected walls, or all walls,
              // if nothing is selected:

              List<Element> walls = new List<Element>();

              if( !Util.GetSelectedElementsOrAll(
            walls, uidoc, typeof( Wall ) ) )
              {
            Selection sel = uidoc.Selection;
            message = ( 0 < sel.GetElementIds().Count )
              ? "Please select some wall elements."
              : "No wall elements found.";
            return Result.Failed;
              }

              //int i; // 2011
              int n;
              double halfThickness, layerOffset;
              //Creator creator = new Creator( doc );
              XYZ lcstart, lcend, v, w, p, q;

              using( Transaction tx = new Transaction( doc ) )
              {
            tx.Start( "Draw wall layer sepearation lines" );

            foreach( Wall wall in walls )
            {
              string desc = Util.ElementDescription( wall );

              LocationCurve curve
            = wall.Location as LocationCurve;

              if( null == curve )
              {
            message = desc + ": No wall curve found.";
            return Result.Failed;
              }

              // Wall centre line and thickness:

              lcstart = curve.Curve.GetEndPoint( 0 );
              lcend = curve.Curve.GetEndPoint( 1 );
              halfThickness = 0.5 * wall.WallType.Width;
              v = lcend - lcstart;
              v = v.Normalize(); // one foot long
              w = XYZ.BasisZ.CrossProduct( v ).Normalize();
              if( wall.Flipped ) { w = -w; }

              p = lcstart - 2 * v;
              q = lcend + 2 * v;
              Creator.CreateModelLine( doc, p, q );

              q = p + halfThickness * w;
              Creator.CreateModelLine( doc, p, q );

              // Exterior edge

              p = lcstart - v + halfThickness * w;
              q = lcend + v + halfThickness * w;
              Creator.CreateModelLine( doc, p, q );

              //CompoundStructure structure = wall.WallType.CompoundStructure; // 2011
              CompoundStructure structure = wall.WallType.GetCompoundStructure(); // 2012

              if( null == structure )
              {
            message = desc + ": No compound structure "
              + "found. Is this a stacked wall?";

            return Result.Failed;
              }

              //CompoundStructureLayerArray layers = structure.Layers; // 2011
              IList<CompoundStructureLayer> layers = structure.GetLayers(); // 2012

              //i = 0; // 2011
              //n = layers.Size; // 2011
              n = layers.Count; // 2012

              Debug.Print(
            "{0} with thickness {1}"
            + " has {2} layer{3}{4}",
            desc,
            Util.MmString( 2 * halfThickness ),
            n, Util.PluralSuffix( n ),
            Util.DotOrColon( n ) );

              if( 0 == n )
              {
            // Interior edge

            p = lcstart - v - halfThickness * w;
            q = lcend + v - halfThickness * w;
            Creator.CreateModelLine( doc, p, q );
              }
              else
              {
            layerOffset = halfThickness;
            foreach( CompoundStructureLayer layer
              in layers )
            {
              Debug.Print(
                "  Layer {0}: function {1}, "
                + "thickness {2}",
                //++i, // 2011
                layers.IndexOf( layer ), // 2012
                layer.Function,
                Util.MmString( layer.Width ) );

              //layerOffset -= layer.Thickness; // 2011
              layerOffset -= layer.Width; // 2012

              p = lcstart - v + layerOffset * w;
              q = lcend + v + layerOffset * w;
              Creator.CreateModelLine( doc, p, q );
            }
              }
              tx.Commit();
            }
              }
              return Result.Succeeded;
        }
CmdWallLayers