ModelCurve CreateModelCurve(
            Curve curve,
            XYZ origin,
            XYZ normal)
        {
            Plane plane = _creapp.NewPlane(normal, origin);

            SketchPlane sketchPlane = SketchPlane.Create(
                _doc, plane);

            return(_credoc.NewModelCurve(
                       curve, sketchPlane));
        }
        SketchPlane CreateSketchPlane(
            Document doc,
            XYZ normal,
            XYZ origin)
        {
            //Plane geometryPlane = doc.Application.Create.NewPlane( normal, origin ); // 2016
            Plane geometryPlane = Plane.CreateByNormalAndOrigin(
                normal, origin); // 2017

            //return doc.Create.NewSketchPlane( geometryPlane ); // 2013

            return(SketchPlane.Create(doc, geometryPlane)); // 2014
        }
        public static void NewLine_withoutTransaction(this Document doc, Line line)
        {
            var dir    = line.Direction;
            var origin = line.Origin;
            var norm   = default(XYZ);

            norm = dir.getRandomNorm();

            var plan        = Plane.CreateByNormalAndOrigin(norm, origin);
            var sketchplane = SketchPlane.Create(doc, plan);

            doc.Create.NewModelCurve(line, sketchplane);
        }
Exemple #4
0
        /// <summary>
        /// Credits: Grevit
        /// Creates a new Sketch Plane from a Curve
        /// https://github.com/grevit-dev/Grevit/blob/3c7a5cc198e00dfa4cc1e892edba7c7afd1a3f84/Grevit.Revit/Utilities.cs#L402
        /// </summary>
        /// <param name="document">Active Document</param>
        /// <param name="curve">Curve to get plane from</param>
        /// <returns>Plane of the curve</returns>
        public static SketchPlane NewSketchPlaneFromCurve(Document document, Autodesk.Revit.DB.Curve curve)
        {
            XYZ startPoint = curve.GetEndPoint(0);
            XYZ endPoint   = curve.GetEndPoint(1);

            // If Start end Endpoint are the same check further points.
            int i = 2;

            while (startPoint == endPoint && endPoint != null)
            {
                endPoint = curve.GetEndPoint(i);
                i++;
            }

            // Plane to return
            Plane plane;

            // If Z Values are equal the Plane is XY
            if (startPoint.Z == endPoint.Z)
            {
                plane = CreatePlane(document, XYZ.BasisZ, startPoint);
            }
            // If X Values are equal the Plane is YZ
            else if (startPoint.X == endPoint.X)
            {
                plane = CreatePlane(document, XYZ.BasisX, startPoint);
            }
            // If Y Values are equal the Plane is XZ
            else if (startPoint.Y == endPoint.Y)
            {
                plane = CreatePlane(document, XYZ.BasisY, startPoint);
            }
            // Otherwise the Planes Normal Vector is not X,Y or Z.
            // We draw lines from the Origin to each Point and use the Plane this one spans up.
            else
            {
                CurveArray curves = new CurveArray();
                curves.Append(curve);
                curves.Append(Autodesk.Revit.DB.Line.CreateBound(new XYZ(0, 0, 0), startPoint));
                curves.Append(Autodesk.Revit.DB.Line.CreateBound(endPoint, new XYZ(0, 0, 0)));
#if (Revit2015 || Revit2016 || Revit2017)
                plane = document.Application.Create.NewPlane(curves);
#else
                plane = Plane.CreateByThreePoints(startPoint, new XYZ(0, 0, 0), endPoint);
#endif
            }


            // return new Sketchplane
            return(SketchPlane.Create(document, plane));
        }
Exemple #5
0
        ModelCurve CreateModelCurve(
            Curve curve,
            XYZ origin,
            XYZ normal)
        {
            //Plane plane = _creapp.NewPlane( normal, origin ); // 2016
            Plane plane = Plane.CreateByNormalAndOrigin(normal, origin); // 2020

            SketchPlane sketchPlane = SketchPlane.Create(
                _doc, plane);

            return(_credoc.NewModelCurve(
                       curve, sketchPlane));
        }
Exemple #6
0
        public static IList <Solid> CreateSolid(Document doc, FamilyInstance familyInstance, Transform transform)
        {
            IList <Solid> solids = new List <Solid>();

            try
            {
                Curve    curve      = GetCurvemaxfamily(familyInstance);
                Element  ele        = doc.GetElement(familyInstance.Id);
                string[] parameters = new string[]
                {
                    "DIM_WWF_YY",
                    "DIM_LENGTH"
                };
                Parameter   pa          = LookupElementParameter(ele, parameters);
                double      lengthcurve = pa.AsDouble();
                XYZ         starpointfa = new XYZ(lengthcurve / 2, 0, 0);
                XYZ         endpointfa  = new XYZ(-lengthcurve / 2, 0, 0);
                XYZ         startpoint  = transform.OfPoint(starpointfa);
                XYZ         endpoint    = transform.OfPoint(endpointfa);
                XYZ         norm        = new XYZ((startpoint.X - endpoint.X), (startpoint.Y - endpoint.Y), (startpoint.Z - endpoint.Z));
                Plane       plane       = Plane.CreateByNormalAndOrigin(norm, startpoint);
                Transaction newtran     = new Transaction(doc, "ss");
                newtran.Start();
                SketchPlane stk       = SketchPlane.Create(doc, plane);
                XYZ         pt1       = startpoint.Add(0.01 * plane.XVec).Add(0.01 * plane.YVec);
                XYZ         pt2       = startpoint.Add(0.01 * plane.YVec);
                XYZ         pt3       = startpoint.Add(-0.01 * plane.YVec);
                XYZ         pt4       = startpoint.Add(0.01 * plane.XVec).Add(-0.01 * plane.YVec);
                XYZ         pt5       = (-1) * norm;
                Line        lineleft  = Line.CreateBound(pt1, pt2);
                Line        linetop   = Line.CreateBound(pt2, pt3);
                Line        lineright = Line.CreateBound(pt3, pt4);
                Line        linebot   = Line.CreateBound(pt4, pt1);
                CurveLoop   profile   = new CurveLoop();
                profile.Append(lineleft);
                profile.Append(linetop);
                profile.Append(lineright);
                profile.Append(linebot);
                IList <CurveLoop> listloop1 = new List <CurveLoop>();
                listloop1.Add(profile);
                Solid solid = GeometryCreationUtilities.CreateExtrusionGeometry(listloop1, pt5, lengthcurve);
                newtran.Commit();
                solids.Add(solid);
            }
            catch
            {
                solids = null;
            }
            return(solids);
        }
Exemple #7
0
        /// <summary>
        ///     Creates a new sketch plane.
        /// </summary>
        /// <param name="doc"></param>
        /// <param name="line"></param>
        /// <returns></returns>
        public static SketchPlane CreateSketchPlane(this Document doc, Line line)
        {
            if (doc is null)
            {
                throw new ArgumentNullException(nameof(doc));
            }

            if (line is null)
            {
                throw new ArgumentNullException(nameof(line));
            }

            return(SketchPlane.Create(doc, line.CreatePlane()));
        }
Exemple #8
0
        /// <summary>
        ///     Creates a new sketch plane.
        /// </summary>
        /// <param name="doc"></param>
        /// <param name="pt"></param>
        /// <returns></returns>
        public static SketchPlane CreateSketchPlane(this Document doc, XYZ pt)
        {
            if (doc == null)
            {
                throw new ArgumentNullException(nameof(doc));
            }

            if (pt == null)
            {
                throw new ArgumentNullException(nameof(pt));
            }

            return(SketchPlane.Create(doc, pt.CreatePlane()));
        }
Exemple #9
0
        /// <summary>
        ///     Creates a new sketch plane.
        /// </summary>
        /// <param name="doc"></param>
        /// <param name="plane"></param>
        /// <returns></returns>
        public static SketchPlane CreateSketchPlane(this Document doc, Plane plane)
        {
            if (doc == null)
            {
                throw new ArgumentNullException(nameof(doc));
            }

            if (plane == null)
            {
                throw new ArgumentNullException(nameof(plane));
            }

            return(SketchPlane.Create(doc, plane));
        }
Exemple #10
0
        private static ElementId createModelCurve(Document document, Curve curve, SketchPlane sp = null)
        {
            Line          line     = curve as Line;
            Arc           arc      = curve as Arc;
            Ellipse       ellipse  = curve as Ellipse;
            HermiteSpline spline   = curve as HermiteSpline;
            NurbSpline    nbSpline = curve as NurbSpline;

            if (line != null && null == sp)
            {
                XYZ normal = getVertVec(line.Direction).Normalize();
                XYZ origin = line.GetEndPoint(0);
                sp = SketchPlane.Create(document, Plane.CreateByNormalAndOrigin(normal, origin));
            }
            else if (arc != null && null == sp)
            {
                XYZ normal = arc.Normal;
                sp = SketchPlane.Create(document, Plane.CreateByNormalAndOrigin(normal, arc.Center));
            }
            else if (ellipse != null && null == sp)
            {
                XYZ normal = ellipse.Normal;
                sp = SketchPlane.Create(document, Plane.CreateByNormalAndOrigin(normal, ellipse.Center));
            }
            else if (spline != null && null == sp)
            {
                Transform tran   = spline.ComputeDerivatives(0, false);
                XYZ       normal = getVertVec(tran.BasisX).Normalize();
                XYZ       origin = spline.GetEndPoint(0);
                sp = SketchPlane.Create(document, Plane.CreateByNormalAndOrigin(normal, origin));
            }
            else if (nbSpline != null && null == sp)
            {
                Transform tran   = nbSpline.ComputeDerivatives(0, false);
                XYZ       normal = getVertVec(tran.BasisX).Normalize();
                XYZ       origin = nbSpline.GetEndPoint(0);
                sp = SketchPlane.Create(document, Plane.CreateByNormalAndOrigin(normal, origin));
            }

            if (sp == null)
            {
                throw new ArgumentException("Not valid sketchplane to create curve:" + curve.GetType().Name);
            }
            //
            // create model line with curve and the specified sketch plane.
            ModelCurve mCurve = document.Create.NewModelCurve(curve, sp);

            return((null != mCurve) ? mCurve.Id : ElementId.InvalidElementId);
        }
Exemple #11
0
        /// <summary>
        /// Create a sketch plane via given normal and origin points.
        /// </summary>
        /// <param name="normal">The vector for normal of sketch plane.</param>
        /// <param name="origin">The vector for origin of sketch plane.</param>
        /// <returns>The new sketch plane created by specific normal and origin.</returns>
        internal SketchPlane CreateSketchPlane(Autodesk.Revit.DB.XYZ normal, Autodesk.Revit.DB.XYZ origin)
        {
            // First create a Geometry.Plane which need in NewSketchPlane() method
            Plane geometryPlane = Plane.CreateByNormalAndOrigin(normal, origin);

            // Then create a sketch plane using the Geometry Plane
            Transaction createSketchPlane = new Transaction(m_document.Document, "Create a sketch plane.");

            createSketchPlane.Start();
            SketchPlane plane = SketchPlane.Create(m_document.Document, geometryPlane);

            createSketchPlane.Commit();

            return(plane);
        }
Exemple #12
0
        public static void NewLine(this Document doc, Line line)
        {
            var dir    = line.Direction;
            var origin = line.Origin;
            var norm   = default(XYZ);

            norm = dir.getRandomNorm();

            #region oldFun

            //if (dir.IsParallel(XYZ.BasisX))
            //{
            //    norm = dir.CrossProduct(XYZ.BasisY).Normalize();
            //    //MessageBox.Show("X");
            //}
            //else if (dir.IsParallel(XYZ.BasisY))
            //{
            //    norm = dir.CrossProduct(XYZ.BasisX).Normalize();
            //    //MessageBox.Show("Y");
            //}
            //else if (dir.IsParallel(XYZ.BasisZ))
            //{
            //    norm = dir.CrossProduct(XYZ.BasisX);
            //    //MessageBox.Show("Z");
            //}
            //else
            //{
            //    norm = dir.CrossProduct(XYZ.BasisX);
            //}

            #endregion

            var plan = default(Plane); // Plane.CreateByNormalAndOrigin(norm, origin);

#if Revit2016
            plan = new Plane(norm, origin);
#endif
#if Revit2019
            plan = Plane.CreateByNormalAndOrigin(norm, origin);
#endif


            doc.Invoke(m =>
            {
                var sketchplane = SketchPlane.Create(doc, plan);
                doc.Create.NewModelCurve(line, sketchplane);
            }, "aa");
        }
Exemple #13
0
        public void PickPoint(UIDocument uidoc, Application app)
        {
            View        activeView = uidoc.ActiveView;
            SketchPlane sketch     = activeView.SketchPlane;

            ObjectSnapTypes snapTypes = ObjectSnapTypes.Points | ObjectSnapTypes.Nearest | ObjectSnapTypes.Perpendicular;
            XYZ             startPoint;
            XYZ             endPoint;

            Plane geometryPlane = Plane.CreateByNormalAndOrigin(XYZ.BasisZ, XYZ.Zero);

            sketch = SketchPlane.Create(uidoc.Document, geometryPlane);

            uidoc.Document.ActiveView.SketchPlane = sketch;
            uidoc.Document.ActiveView.ShowActiveWorkPlane();

            try //Выбор точек
            {
                startPoint = uidoc.Selection.PickPoint(snapTypes, "Select start point");
                endPoint   = uidoc.Selection.PickPoint(snapTypes, "Select end point");
            }

            catch (Autodesk.Revit.Exceptions.OperationCanceledException oc)
            {
                Console.WriteLine(oc.Message);
                return;
            }
            catch (Autodesk.Revit.Exceptions.InvalidOperationException oe)
            {
                Console.WriteLine(oe.Message);
                TaskDialog.Show("Revit", "No work plane set in current view.");
                return;
            }
            catch (Autodesk.Revit.Exceptions.ArgumentNullException n)
            {
                Console.WriteLine(n.Message);
                return;
            }

            double dist = startPoint.DistanceTo(endPoint);

            string distance  = "Distance is " + dist.ToString();
            string strCoords = "Selected start point is " + startPoint.ToString() + "\nSelected end point is " + endPoint.ToString() + distance;
            Line   line      = Line.CreateBound(startPoint, endPoint);

            CreateLinearDimension1(uidoc.Document, startPoint, endPoint, sketch, app);
            // TaskDialog.Show("Revit", strCoords);
        }
Exemple #14
0
        private Result SetWorkPlaneFromAnyFace(UIDocument uiDoc, Document doc)
        {
            // 先在界面中选择一个平面
            Element elem;
            Face    fc;
            var     refe = Selector.SelectFace(uiDoc, out elem, out fc);

            //
            if (refe != null)
            {
                using (Transaction transDoc = new Transaction(doc, "设置工作平面"))
                {
                    try
                    {
                        transDoc.Start();
                        View v = uiDoc.ActiveView;

                        // 将原工作平面删除
                        SketchPlane sp = v.SketchPlane;
                        if (sp != null && sp.IsValidObject)
                        {
                            // doc.Delete(sp.Id);
                            // 不能删除上面的工作平面,因为有一些模型线是依附于工作平面对象绘制出来的,
                            // 当将工作平面删除后,那些依附在其上的模型线等对象也会被删除。
                        }

                        // 构造一个平面
                        Plane plane = new Plane(norm: fc.ComputeNormal(refe.UVPoint), origin: refe.GlobalPoint);

                        // 将得到的平面定义为新的工作平面
                        sp            = SketchPlane.Create(doc, plane);
                        v.SketchPlane = sp;

                        // 显示工作平面
                        v.ShowActiveWorkPlane();

                        transDoc.Commit();
                        return(Result.Succeeded);
                    }
                    catch (Exception ex)
                    {
                        transDoc.RollBack();
                        return(Result.Failed);
                    }
                }
            }
            return(Result.Succeeded);
        }
Exemple #15
0
        /// <summary>
        /// Draw the trapezoid wire-frame with Revit Model curves.
        /// It's for debug use, to help developer see the exact location.
        /// </summary>
        /// <param name="revitDoc">Revit DB Document</param>
        public void Draw(Document revitDoc)
        {
            XYZ topDir      = (Top.GetEndPoint(1) - Top.GetEndPoint(0)).Normalize();
            XYZ verticalDir = (Vertical.GetEndPoint(0) - Vertical.GetEndPoint(1)).Normalize();
            XYZ normal      = topDir.CrossProduct(verticalDir);

            SketchPlane sketchplane = SketchPlane.Create(revitDoc, new Plane(normal, Vertical.GetEndPoint(0)));

            CurveArray curves = new CurveArray();

            curves.Append(Top.Clone());
            curves.Append(Vertical.Clone());
            curves.Append(Bottom.Clone());
            curves.Append(Slanted.Clone());
            revitDoc.Create.NewModelCurveArray(curves, sketchplane);
        }
        private static void CreateRevitElementInRevit(Autodesk.Revit.DB.Curve geomLine)
        {
            // var OriginShit = geomLine.ComputeDerivatives(0, true);
            //var normal = OriginShit.BasisZ;
            // var origin = OriginShit.Origin;
            // XYZ origin = new XYZ(0, 0, 0);
            // XYZ normal = new XYZ(0, 1, 0);
            var Origin = geomLine.GetEndPoint(0);

            Plane geomPlane = Plane.CreateByNormalAndOrigin(XYZ.BasisZ, Origin);
            // Create a sketch plane in current document
            SketchPlane sketch = SketchPlane.Create(Command.uidoc.Document, geomPlane);

            // Create a ModelLine element using the created geometry line and sketch plane
            var line = Command.uidoc.Document.Create.NewModelCurve(geomLine, sketch);
        }
Exemple #17
0
        private void drawLines(Document doc, List <Line> lines)
        {
            var defaultNoteTypeId = doc.GetDefaultElementTypeId(ElementTypeGroup.TextNoteType);

            bool isReset = false;
            var  counter = 0;

            for (int i = 0; i < lines.Count; i++)
            {
                var line = lines[i];

                var plane       = new Plane(XYZ.BasisY.Negate(), line.GetEndPoint(0));
                var sketchPlane = SketchPlane.Create(doc, plane);

                var noteOptions = new TextNoteOptions()
                {
                    HorizontalAlignment = HorizontalTextAlignment.Center,
                    TypeId = defaultNoteTypeId
                };

                var no = TextNote.Create(doc,
                                         doc.ActiveView.Id,
                                         line.GetEndPoint(0) + line.Direction * line.Length / 2,
                                         counter.ToString(),
                                         noteOptions);

                no.Width = no.Width / 2;

                var direction = TextNote.Create(doc,
                                                doc.ActiveView.Id,
                                                line.GetEndPoint(1) - line.Direction * line.Length * 0.05,
                                                "X",
                                                noteOptions);

                doc.Create.NewModelCurve(line, sketchPlane);

                if (counter == 3 && !isReset)
                {
                    counter = 0;
                    isReset = true;
                }
                else
                {
                    counter++;
                }
            }
        }
Exemple #18
0
        /// <summary>
        /// Return a sketch plane through the given origin
        /// point with the given normal, either by creating
        /// a new one or reusing an existing one.
        /// </summary>
        static SketchPlane GetSketchPlane(
            Document doc,
            XYZ origin,
            XYZ normal)
        {
            string s = "reusing";

            // If we could reliably set the sketch plane Name
            // property or find some other relaible marker
            // that is reflected in a parameter, we could
            // replace the sketchPlane.Name.Equals check in
            // SketchPlaneMatches by a parameter filter in
            // the filtered element collector framework
            // to move the test into native Revit code
            // instead of post-processing in .NET, which
            // would give a 50% performance enhancement.

            SketchPlane sketchPlane
                = new FilteredElementCollector(doc)
                  .OfClass(typeof(SketchPlane))
                  .Cast <SketchPlane>()
                  .FirstOrDefault <SketchPlane>(x =>
                                                SketchPlaneMatches(x, origin, normal));

            if (null == sketchPlane)
            {
                //Plane plane = new Plane( normal, origin ); // 2016

                Plane plane = Plane.CreateByNormalAndOrigin(
                    normal, origin); // 2018

                sketchPlane = SketchPlane.Create(doc, plane);

                //sketchPlane.Name = string.Format(
                //  "{0} {1}", _sketch_plane_name_prefix,
                //  _sketch_plane_creation_counter++ );

                ++_sketch_plane_creation_counter;

                s = "created";
            }
            Debug.Print("GetSketchPlane: {0} '{1}' ({2})",
                        s, sketchPlane.Name,
                        _sketch_plane_creation_counter);

            return(sketchPlane);
        }
        public Result Execute(
            ExternalCommandData commandData,
            ref string message,
            ElementSet elements)
        {
            UIApplication uiapp = commandData.Application;
            UIDocument    uidoc = uiapp.ActiveUIDocument;
            Application   app   = uiapp.Application;
            Document      doc   = uidoc.Document;

            List <RG.Point3d> pts = new List <RG.Point3d> {
                new RG.Point3d(0, 0, 0), new RG.Point3d(5, 10, 0), new RG.Point3d(15, 0, 0), new RG.Point3d(20, 0, 0)
            };


            RG.PolylineCurve pc = new RG.PolylineCurve(pts);


            RG.NurbsCurve nurb = pc.ToNurbsCurve();

            nurb.IncreaseDegree(3);

            var knots         = ToDoubleArray(nurb.Knots, nurb.Degree);
            var controlPoints = ToXYZArray(nurb.Points, 1);
            var weights       = nurb.Points.ConvertAll(x => x.Weight);

            XYZ normal = new XYZ(0, 0, 1);
            XYZ origin = new XYZ(0, 0, 0);

            Plane rvtPlane = Plane.CreateByNormalAndOrigin(normal, origin);

            //var plane = sketchPlane.GetPlane().ToPlane();
            Curve rvtN = NurbSpline.CreateCurve(nurb.Degree, knots, controlPoints);

            using (Transaction t = new Transaction(doc, "a"))
            {
                t.Start();
                SketchPlane sketchPlane = SketchPlane.Create(doc, rvtPlane);
                ModelCurve  mc          = doc.Create.NewModelCurve(rvtN, sketchPlane);
                TaskDialog.Show("r", mc.Id.ToString());
                t.Commit();
            }



            return(Result.Succeeded);
        }
Exemple #20
0
        /// <summary>
        /// Метод исполнения команды
        /// </summary>
        /// <param name="listElements">Лист с элементами элементов</param>
        public void DoWork(List <ElementModel> listElements)
        {
            var curveRefDict = GetEdges(listElements).Where(t => t != default).ToList();

            var trName = Language.GetFunctionLocalName(ModPlusConnector.Instance);

            if (string.IsNullOrEmpty(trName))
            {
                trName = "CreateElevations";
            }

            using (var tr = new Transaction(_doc, trName))
            {
                tr.Start();

                _activeView.SketchPlane = SketchPlane.Create(
                    _doc, Plane.CreateByNormalAndOrigin(_activeView.ViewDirection, _activeView.Origin));

                // Выберите точку конца
                var endPoint = _uiDoc.Selection.PickPoint(
                    ObjectSnapTypes.WorkPlaneGrid | ObjectSnapTypes.Centers | ObjectSnapTypes.Endpoints |
                    ObjectSnapTypes.Midpoints | ObjectSnapTypes.Points | ObjectSnapTypes.Perpendicular,
                    Language.GetItem("h3"));

                var zList = new List <double>();

                foreach (var(curve, reference) in curveRefDict)
                {
                    if (!zList.Contains(Math.Round(curve.GetEndPoint(0).Z, 4)))
                    {
                        zList.Add(Math.Round(curve.GetEndPoint(0).Z, 4));
                        var startPoint = curve.GetEndPoint(1);
                        var bendPoint  = curve.GetEndPoint(1);
                        _doc.Create.NewSpotElevation(
                            _doc.ActiveView,
                            reference,
                            startPoint,
                            bendPoint,
                            endPoint,
                            endPoint,
                            true);
                    }
                }

                tr.Commit();
            }
        }
Exemple #21
0
        /// <summary>
        /// Credits: Grevit
        /// Creates a new Sketch Plane from a Curve
        /// https://github.com/grevit-dev/Grevit/blob/3c7a5cc198e00dfa4cc1e892edba7c7afd1a3f84/Grevit.Revit/Utilities.cs#L402
        /// </summary>
        /// <param name="curve">Curve to get plane from</param>
        /// <returns>Plane of the curve</returns>
        private SketchPlane NewSketchPlaneFromCurve(DB.Curve curve, Document doc)
        {
            XYZ startPoint = curve.GetEndPoint(0);
            XYZ endPoint   = curve.GetEndPoint(1);

            // If Start end Endpoint are the same check further points.
            int i = 2;

            while (startPoint == endPoint && endPoint != null)
            {
                endPoint = curve.GetEndPoint(i);
                i++;
            }

            // Plane to return
            DB.Plane plane;

            // If Z Values are equal the Plane is XY
            if (startPoint.Z == endPoint.Z)
            {
                plane = CreatePlane(XYZ.BasisZ, startPoint);
            }
            // If X Values are equal the Plane is YZ
            else if (startPoint.X == endPoint.X)
            {
                plane = CreatePlane(XYZ.BasisX, startPoint);
            }
            // If Y Values are equal the Plane is XZ
            else if (startPoint.Y == endPoint.Y)
            {
                plane = CreatePlane(XYZ.BasisY, startPoint);
            }
            // Otherwise the Planes Normal Vector is not X,Y or Z.
            // We draw lines from the Origin to each Point and use the Plane this one spans up.
            else
            {
                CurveArray curves = new CurveArray();
                curves.Append(curve);
                curves.Append(DB.Line.CreateBound(new XYZ(0, 0, 0), startPoint));
                curves.Append(DB.Line.CreateBound(endPoint, new XYZ(0, 0, 0)));

                plane = DB.Plane.CreateByThreePoints(startPoint, new XYZ(0, 0, 0), endPoint);
            }

            return(SketchPlane.Create(doc, plane));
        }
Exemple #22
0
 private void CreateModelLine(Document doc, XYZ p1, XYZ p2)
 {
     using (var line = Line.CreateBound(p1, p2))
     {
         using (var skPlane = SketchPlane.Create(doc, this.ToPlane(p1, p2)))
         {
             if (doc.IsFamilyDocument)
             {
                 doc.FamilyCreate.NewModelCurve(line, skPlane);
             }
             else
             {
                 doc.Create.NewModelCurve(line, skPlane);
             }
         }
     }
 }
        public static List <ModelLine> DrawLines(Document doc, IEnumerable <Line> lines)
        {
            List <ModelLine> modelLines = new List <ModelLine>();

            SubTransaction st = new SubTransaction(doc);

            st.Start();

            XYZ lastNormal = new XYZ(999, 992, 200); // random

            Plane       p  = null;
            SketchPlane sp = null;

            foreach (Line ln in lines)
            {
                if (ln.Length < (1.0 / 24.0 / 12.0))
                {
                    continue;                                  // too short for Revit!
                }
                // see what the plane is
                XYZ vector = ln.Direction;
                XYZ normal = null;
                if (vector.Normalize().IsAlmostEqualTo(XYZ.BasisZ) == false)
                {
                    normal = vector.CrossProduct(XYZ.BasisZ);
                }
                else
                {
                    normal = vector.CrossProduct(XYZ.BasisX);
                }

                if (lastNormal.IsAlmostEqualTo(normal) == false)
                {
                    p      = Plane.CreateByNormalAndOrigin(normal, ln.GetEndPoint(0));
                    sp     = SketchPlane.Create(doc, p);
                    normal = lastNormal;
                }

                ModelCurve curve = doc.Create.NewModelCurve(ln, sp);
                modelLines.Add(curve as ModelLine);
            }

            st.Commit();

            return(modelLines);
        }
Exemple #24
0
        /// <summary>
        /// Create line element
        /// </summary>
        /// <param name="app">revit application</param>
        /// <param name="ptA">start point</param>
        /// <param name="ptB">end point</param>
        /// <returns></returns>
        public static ModelCurve MakeLine(UIApplication app, Autodesk.Revit.DB.XYZ ptA, Autodesk.Revit.DB.XYZ ptB)
        {
            Document doc = app.ActiveUIDocument.Document;
            // Create plane by the points
            Line line = Line.CreateBound(ptA, ptB);

            Autodesk.Revit.DB.XYZ norm = ptA.CrossProduct(ptB);
            if (norm.GetLength() == 0)
            {
                norm = Autodesk.Revit.DB.XYZ.BasisZ;
            }
            Plane       plane   = app.Application.Create.NewPlane(norm, ptB);
            SketchPlane skplane = SketchPlane.Create(doc, plane);
            // Create line here
            ModelCurve modelcurve = doc.FamilyCreate.NewModelCurve(line, skplane);

            return(modelcurve);
        }
Exemple #25
0
        public ModelCurve MakeLine(Document doc, XYZ ptA, XYZ ptB)
        {
            Autodesk.Revit.ApplicationServices.Application app = doc.Application;
            // Create plane by the points
            Line line = Line.CreateBound(ptA, ptB);
            XYZ  norm = ptA.CrossProduct(ptB);

            if (norm.IsZeroLength())
            {
                norm = XYZ.BasisZ;
            }
            Plane       plane   = app.Create.NewPlane(norm, ptB);
            SketchPlane skplane = SketchPlane.Create(doc, plane);
            // Create line here
            ModelCurve modelcurve = doc.FamilyCreate.NewModelCurve(line, skplane);

            return(modelcurve);
        }
Exemple #26
0
        //创建模型线
        private void CreateModelLine(List <XYZ> points, ExternalCommandData commandData)
        {
            for (int i = 0; i < points.Count - 1; i += 1)
            {
                UIDocument uiDoc = commandData.Application.ActiveUIDocument;           //取得当前活动文档

                XYZ PointStart = points[i];
                XYZ PointEnd   = points[i + 1];
                //直线向量
                XYZ vector = new XYZ(PointStart.X - PointEnd.X, PointStart.Y - PointEnd.Y, PointStart.Z - PointEnd.Z);
                //向量和Z向量叉乘,从而获得一个必定与向量垂直的向量,并以此创建一个平面
                XYZ         normal      = vector.CrossProduct(XYZ.BasisZ);
                Plane       plane       = Plane.CreateByNormalAndOrigin(normal, PointStart);
                SketchPlane sketchPlane = SketchPlane.Create(uiDoc.Document, plane);

                uiDoc.Document.Create.NewModelCurve(Line.CreateBound(PointStart, PointEnd), sketchPlane);
            }
        }
Exemple #27
0
        public void setCurrentViewAsWorkPlan(UIDocument uiDoc)
        {
            Document doc = uiDoc.Document;

            using (Transaction trans = new Transaction(doc, "WorkPlane"))
            {
                trans.Start();

                //Plane plane = new Plane( uiDoc.Document.ActiveView.ViewDirection, uiDoc.Document.ActiveView.Origin);

                Plane plane = Plane.CreateByNormalAndOrigin(uiDoc.Document.ActiveView.ViewDirection, uiDoc.Document.ActiveView.Origin);


                SketchPlane sp = SketchPlane.Create(doc, plane);
                uiDoc.Document.ActiveView.SketchPlane = sp;
                trans.Commit();
            }
        }
Exemple #28
0
 private void CreateModelCurveArray(CurveArray curveArray, XYZ normal, XYZ point)
 {
     if (curveArray.Size > 0)
     {
         Transaction transaction2 = new Transaction(doc);
         transaction2.Start("绘制模型线");
         try
         {
             SketchPlane     modelSketch = SketchPlane.Create(doc, app.Create.NewPlane(normal, point));
             ModelCurveArray modelLine   = doc.Create.NewModelCurveArray(curveArray, modelSketch);
         }
         catch
         {
         }
         transaction2.Commit();
         curveArray.Clear();
     }
 }
    public Result Execute(
        ExternalCommandData commandData,
        ref string message,
        ElementSet elements)
    {
        UIApplication uiapp = commandData.Application;
        UIDocument    uidoc = uiapp.ActiveUIDocument;
        Application   app   = uiapp.Application;
        Document      doc   = uidoc.Document;

        Selection  sel1    = uidoc.Selection;
        List <XYZ> tempXYZ = new List <XYZ>(1);
        XYZ        p1      = sel1.PickPoint();
        XYZ        p2      = null;


        //tempXYZ.Add(p3);

        ModelCurve visualLine = null;

        using (TransactionGroup tGroup = new TransactionGroup(doc))
        {
            tGroup.Start();

Redraw:
            using (Transaction t = new Transaction(doc))
            {
                t.Start("Step 1");

                Line line = Line.CreateBound(p1, getP3(uidoc));

                Plane       geomPlane = Plane.CreateByNormalAndOrigin(doc.ActiveView.ViewDirection, doc.ActiveView.Origin);
                SketchPlane sketch    = SketchPlane.Create(doc, geomPlane);
                visualLine = doc.Create.NewModelCurve(line, sketch) as ModelCurve;
                doc.Regenerate();
                uidoc.RefreshActiveView();
                goto Redraw;

                t.Commit();
            }
            tGroup.Commit();
        }
        return(Result.Succeeded);
    }
        internal static bool PickPointOnFace(UIDocument doc, string prompt, out XYZ point, ObjectSnapTypes snapSettings = DefaultSnapTypes)
        {
            point = null;

            if (doc.ActiveView.ViewType != ViewType.ThreeD)
            {
                try { point = doc.Selection.PickPoint(snapSettings, prompt + "Please pick a point on the current work plane"); }
                catch (OperationCanceledException) { }
            }
            else
            {
                var reference = doc.Selection.PickObject(Autodesk.Revit.UI.Selection.ObjectType.Face, prompt + "Please select a face to define a work plane");
                if (doc.Document.GetElement(reference.ElementId) is Element element)
                {
                    if (element.GetGeometryObjectFromReference(reference) is Face face)
                    {
                        if (Keyboard.IsKeyDown(Key.LeftCtrl))
                        {
                            point = face.Evaluate(reference.UVPoint);
                        }
                        else
                        {
                            var plane = Autodesk.Revit.DB.Plane.CreateByNormalAndOrigin(face.ComputeNormal(reference.UVPoint), face.Evaluate(reference.UVPoint));

                            using (var transaction = new Transaction(doc.Document))
                            {
                                transaction.Start("PickPointOnFace");

                                doc.ActiveView.SketchPlane = SketchPlane.Create(doc.Document, plane);
                                doc.ActiveView.ShowActiveWorkPlane();

                                try { point = doc.Selection.PickPoint(snapSettings, prompt + "Please pick a point on the defined work plane"); }
                                catch (OperationCanceledException) { }

                                transaction.RollBack();
                            }
                        }
                    }
                }
            }

            return(null != point);
        }