예제 #1
0
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            var doc = commandData.Application.ActiveUIDocument.Document;



            //Collect all adaptive component family symbols with more than 1 placement point
            var collector = new FilteredElementCollector(doc);
            var filter    = new ElementClassFilter(typeof(FamilySymbol));

            var adaptiveComponents = from fs in collector.WherePasses(filter).Cast <FamilySymbol>()
                                     where AdaptiveComponentFamilyUtils.IsAdaptiveComponentFamily(fs.Family) &&
                                     AdaptiveComponentFamilyUtils.GetNumberOfPlacementPoints(fs.Family) > 1
                                     select fs;


            //Display dialog and prompt for selection
            FormFamilySymbolSelector selector = new FormFamilySymbolSelector(adaptiveComponents);

            selector.ShowDialog();


            //select edge reference
            Reference hostEdge   = commandData.Application.ActiveUIDocument.Selection.PickObject(ObjectType.Edge, "Select edge:");
            var       selectedId = hostEdge.ElementId;

            Element e = doc.GetElement(selectedId);



            //get the selected family
            var selectedFamilySymbol = selector.SelectedElement();


            //activate familySymbol
            selectedFamilySymbol.Activate();

            using (TransactionGroup transGroup = new TransactionGroup(doc))
            {
                transGroup.Start("Place Dimensions");



                //hack join the element to a wall
                ElementId wallId = null;


                if (e is FamilyInstance & JoinGeometryUtils.GetJoinedElements(doc, e).Count < 1)
                {
                    using (Transaction transaction = new Transaction(doc))
                    {
                        transaction.Start("Create wall");

                        //////setup a failure handler to handle any warnings
                        ////FailureHandlingOptions failOpts = transaction.GetFailureHandlingOptions();
                        ////failOpts.SetFailuresPreprocessor(new WarningSwallower());
                        ////transaction.SetFailureHandlingOptions(failOpts);


                        wallId = Utils.CreateJoinedWall(doc, wallId, e as FamilyInstance);


                        doc.Regenerate();

                        transaction.Commit();
                    }
                }



                using (Transaction transaction = new Transaction(doc))
                {
                    transaction.Start("Create Family");

                    //get number of placement point
                    var numberOfPoints =
                        AdaptiveComponentFamilyUtils.GetNumberOfPlacementPoints(selectedFamilySymbol.Family);
                    double numberOfSpaces = numberOfPoints - 1;

                    //create family
                    var familyInstance =
                        AdaptiveComponentInstanceUtils.CreateAdaptiveComponentInstance(doc, selectedFamilySymbol);


                    //adjust placment point locations
                    var placementPoints =
                        AdaptiveComponentInstanceUtils.GetInstancePlacementPointElementRefIds(familyInstance);

                    for (int i = 0; i < placementPoints.Count; i++)
                    {
                        double interval = i / numberOfSpaces;

                        var location = new PointLocationOnCurve(PointOnCurveMeasurementType.NormalizedCurveParameter,
                                                                interval, PointOnCurveMeasureFrom.Beginning);

                        var pointOnEdge = doc.Application.Create.NewPointOnEdge(hostEdge, location);


                        var p = doc.GetElement(placementPoints[i]) as ReferencePoint;

                        p.SetPointElementReference(pointOnEdge);
                    }



                    transaction.Commit();
                }

                transGroup.Assimilate();
            }

            return(Result.Succeeded);
        }
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            var doc = commandData.Application.ActiveUIDocument.Document;

            //create point list
            List <XYZ> pointList = new List <XYZ>();

            pointList.Add(new XYZ(0, 0, 0));
            pointList.Add(new XYZ(0, 20, 0));


            //Collect all adaptive component family symbols with 2 placement points
            var collector = new FilteredElementCollector(doc);
            var filter    = new ElementClassFilter(typeof(FamilySymbol));

            var adaptiveComponents = from fs in collector.WherePasses(filter).Cast <FamilySymbol>()
                                     where AdaptiveComponentFamilyUtils.IsAdaptiveComponentFamily(fs.Family) &&
                                     AdaptiveComponentFamilyUtils.GetNumberOfPlacementPoints(fs.Family) == 2
                                     select fs;


            //Display dialog and prompt for selection
            FormFamilySymbolSelector selector = new FormFamilySymbolSelector(adaptiveComponents);

            selector.ShowDialog();

            if (selector.DialogResult.Equals(DialogResult.OK))
            {
                //get the selected family
                var selectedFamilySymbol = selector.SelectedElement();

                //activate familySymbol
                selectedFamilySymbol.Activate();


                //create family
                using (Transaction transaction = new Transaction(doc))
                {
                    transaction.Start("Create Family");

                    var familyInstance =
                        AdaptiveComponentInstanceUtils.CreateAdaptiveComponentInstance(doc, selectedFamilySymbol);


                    //adjust placment point locations
                    var placementPoints =
                        AdaptiveComponentInstanceUtils.GetInstancePlacementPointElementRefIds(familyInstance);


                    for (int i = 0; i < placementPoints.Count; i++)
                    {
                        var p = doc.GetElement(placementPoints[i]) as ReferencePoint;

                        p.Position = pointList[i];
                    }

                    transaction.Commit();
                }
            }

            return(Result.Succeeded);
        }