コード例 #1
0
ファイル: BezierPatch.cs プロジェクト: sienkiewiczkm/cadio
        protected override void CreateDirectionalSurfaceSampling(
            Func <Point3D, Point3D, double> estimateScreenDistanceWithoutClip,
            Func <int, int, Tuple <int, int> > mapping,
            int subdivisions,
            List <Vertex> vertices,
            List <IndexedLine> lines
            )
        {
            if (vertices.Count > 0)
            {
                return;
            }

            var builder        = new WireframeBuilder();
            var surfaceSampler = new SurfaceConstantParameterLinesBuilder(
                builder
                );

            var bezierPatch = new BernsteinPatch();

            for (var i = 0; i < 16; ++i)
            {
                bezierPatch.ControlPoints[i / 4, i % 4] = ControlPoints[i].Position;
            }
            surfaceSampler.Build(bezierPatch);

            vertices.AddRange(builder.Vertices.ToList());
            lines.AddRange(builder.Lines.ToList());
        }
コード例 #2
0
        /// <summary>
        /// Initializes the objects needed to show a wireframe.
        /// </summary>
        protected void CreateEmptyWireframe()
        {
            _wireframe = new WireframeBuilder(_mainMesh);

            var gm3 = new GeometryModel3D();

            gm3.Geometry  = _wireframe.Wires;
            _wireColor    = Colors.White;
            _wireMaterial = new SolidColorBrush(_wireColor);
            gm3.Material  = new EmissiveMaterial(_wireMaterial);
            _collection.Add(gm3);
        }
コード例 #3
0
ファイル: PolygonCurve.cs プロジェクト: sienkiewiczkm/cadio
        public void UpdateGeometry(
            Func <Point3D, Point3D, double> estimateScreenDistanceWithoutClip,
            Predicate <Point3D> isInsideProjectiveCubePredicate
            )
        {
            var builder = new WireframeBuilder();

            foreach (var cp in ControlPoints)
            {
                builder.Connect(cp, Colors.Red);
            }
            builder.FinishChain();

            Vertices = builder.Vertices.ToList();
            Lines    = builder.Lines.ToList();
        }
コード例 #4
0
        public void UpdateGeometry(
            Func <Point3D, Point3D, double> estimateScreenDistanceWithoutClip,
            Predicate <Point3D> isInsideProjectiveCubePredicate
            )
        {
            var isLooped = ControlPoints.Count / (3 * SegmentsU + 1) !=
                           3 * SegmentsV + 1;

            _surface.SegmentsU     = SegmentsU;
            _surface.SegmentsV     = SegmentsV;
            _surface.ControlPoints = ControlPoints
                                     .Select(t => t.Position)
                                     .ToList();

            var builder = new WireframeBuilder();
            var sampler = new SurfaceConstantParameterLinesBuilder(builder);

            sampler.Build(_surface);

            if (IsPolygonRenderingEnabled)
            {
                var netBuilder = new ControlNetBuilder(builder);
                netBuilder.BuildControlNet(
                    ControlPoints,
                    3 * SegmentsU + 1,
                    isLooped
                    );
            }

            Vertices     = builder.Vertices.ToList();
            Lines        = builder.Lines.ToList();
            MarkerPoints = ControlPoints.Select(t => new Vertex(
                                                    t.Position,
                                                    t.ColorOverride ?? Colors.White
                                                    )).ToList();
            RawPoints = new List <Vertex>();
        }
コード例 #5
0
        public void UpdateGeometry(
            Func <Point3D, Point3D, double> estimateScreenDistanceWithoutClip,
            Predicate <Point3D> isInsideProjectiveCubePredicate
            )
        {
            var dataRowLength = 3 + SegmentsU;
            var dataRowsCount = ControlPoints.Count / dataRowLength;

            var isLooped = dataRowsCount != 3 + SegmentsV;

            var builder = new WireframeBuilder();
            var sampler = new SurfaceConstantParameterLinesBuilder(builder);

            var bsplineSurf = GetParametricSurface();

            sampler.Build(bsplineSurf);

            if (IsPolygonRenderingEnabled)
            {
                var netBuilder = new ControlNetBuilder(builder);
                netBuilder.BuildControlNet(
                    ControlPoints,
                    3 + SegmentsU,
                    isLooped
                    );
            }

            Vertices     = builder.Vertices.ToList();
            Lines        = builder.Lines.ToList();
            MarkerPoints = ControlPoints
                           .Select(t => new Vertex(
                                       t.Position,
                                       t.ColorOverride ?? Colors.White
                                       )).ToList();

            RawPoints = new List <Vertex>();
        }
コード例 #6
0
        public static void DrawGregoryPatchDebugData(
            GregoryPatch gregoryPatch,
            WireframeBuilder builder
            )
        {
            const double cVectorMagnitude = 0.1;
            var          uParams          = new float[] { 0, 0, 1, 1 };
            var          vParams          = new float[] { 0, 1, 0, 1 };
            var          uFlips           = new float[] { 1, 1, -1, -1 };
            var          vFlips           = new float[] { 1, -1, 1, -1 };
            var          neighbours       = new int[, ]
            {
                { 2, 1 },
                { 3, 0 },
                { 0, 3 },
                { 1, 2 },
            };

            for (var i = 0; i < 4; ++i)
            {
                var cornerPos = gregoryPatch.Evaluate(uParams[i], vParams[i]);
                var cornerdU  = gregoryPatch.GetCornerDerivativeU(i);
                var cornerdV  = gregoryPatch.GetCornerDerivativeV(i);

                var uvTwistPos = gregoryPatch.Evaluate(
                    (2 * uParams[i] + uParams[neighbours[i, 0]]) / 3.0,
                    (2 * vParams[i] + vParams[neighbours[i, 0]]) / 3.0
                    );

                var vuTwistPos = gregoryPatch.Evaluate(
                    (2 * uParams[i] + uParams[neighbours[i, 1]]) / 3.0,
                    (2 * vParams[i] + vParams[neighbours[i, 1]]) / 3.0
                    );

                var uvTwist = gregoryPatch.GetCornerTwistVectorUV(i);
                var vuTwist = gregoryPatch.GetCornerTwistVectorVU(i);

                var uvFlip = 1;
                var vuFlip = 1;

                if (i == 2)
                {
                    uvFlip = 1;
                    vuFlip = -1;
                }

                if (i == 3)
                {
                    uvFlip = 1;
                    vuFlip = -1;
                }

                builder.DrawVector(
                    cornerPos,
                    cornerdU * uFlips[i],
                    cVectorMagnitude,
                    Colors.Red
                    );

                builder.DrawVector(
                    cornerPos,
                    cornerdV * vFlips[i],
                    cVectorMagnitude,
                    Colors.Blue
                    );

                builder.DrawVector(
                    uvTwistPos,
                    uvFlip * uvTwist,
                    cVectorMagnitude,
                    Colors.GreenYellow
                    );

                builder.DrawVector(
                    vuTwistPos,
                    vuFlip * vuTwist,
                    cVectorMagnitude,
                    Colors.Magenta
                    );
            }
        }
コード例 #7
0
        public Result Execute(
            ExternalCommandData commandData,
            ref string message,
            ElementSet elements)
        {
            UIApplication uiapp = commandData.Application;
            UIDocument    uidoc = uiapp.ActiveUIDocument;
            Document      doc   = uidoc.Document;


            Reference r = uidoc.Selection.PickObject(ObjectType.Element, "Select Element");

            Options geometryOptions = new Options();

            geometryOptions.ComputeReferences = false;

            GeometryElement geomElem = doc.GetElement(r).get_Geometry(geometryOptions);

            List <NurbSpline> cadSplines = new List <NurbSpline>();

            IList <XYZ>   controlPoints = new List <XYZ>();
            List <double> weights       = new List <double>();
            List <double> knots         = new List <double>();

            if (null != geomElem)
            {
                foreach (var o in geomElem)
                {
                    GeometryInstance gi = o as GeometryInstance;
                    GeometryElement  instanceGeometryElement = gi.GetInstanceGeometry();

                    foreach (GeometryObject instanceObj in instanceGeometryElement)
                    {
                        if (instanceObj.GetType().ToString().Contains("NurbSpline"))
                        {
                            //TaskDialog.Show("r", instanceObj.GetType().ToString());
                            NurbSpline nurb = instanceObj as NurbSpline;
                            cadSplines.Add(nurb);
                            controlPoints = nurb.CtrlPoints;
                            //weights = nurb.Weights;
                            weights = nurb.Weights.Cast <double>().ToList();
                            //knots = nurb.Knots;
                            knots = nurb.Knots.Cast <double>().ToList();
                        }
                        break;
                    }
                }
            }

            double scale = 0.3048;

            #region Test
            //List<XYZ> controlPoints = new List<XYZ>();
            //controlPoints.Add(new XYZ(0 / scale, 0 / scale, 0 / scale));
            //controlPoints.Add(new XYZ(5 / scale, 5 / scale, 2 / scale));
            //controlPoints.Add(new XYZ(10 / scale, 10 / scale, 5 / scale));
            //controlPoints.Add(new XYZ(15 / scale, 10 / scale, 5 / scale));
            //controlPoints.Add(new XYZ(20 / scale, 5 / scale, 4 / scale));
            //controlPoints.Add(new XYZ(25 / scale, 5 / scale, 3 / scale));

            //List<double> weights = new List<double>();
            //weights.Add(1.0);
            //weights.Add(1.0);
            //weights.Add(1.0);
            //weights.Add(1.0);
            //weights.Add(1.0);
            //weights.Add(1.0);

            //List<double> knots = new List<double>();
            //knots.Add(0); //1revit
            //knots.Add(0); //2
            //knots.Add(0); //3
            //knots.Add(0); //4
            //knots.Add(10.76); //5
            //knots.Add(21.51); //6
            //knots.Add(32.27); //7
            //knots.Add(32.27);
            //knots.Add(32.27); //9
            //knots.Add(32.27);//revit
            #endregion

            HermiteSpline hermspline = HermiteSpline.Create(controlPoints, false);

            //Curve nurbSpline = NurbSpline.Create(hermspline);
            Curve nurbSpline = NurbSpline.CreateCurve(3, knots, controlPoints, weights);

            //XYZ startPoint = nurbSpline.GetEndPoint(0);

            Transform nurbsTr = nurbSpline.ComputeDerivatives(0, true);

            XYZ startPoint = nurbsTr.Origin;
            //PrintPoint("a", nurbsTr.Origin);

            #region Test Plane
            //Plane geomPlane = Autodesk.Revit.DB.Plane.CreateByOriginAndBasis(nurbsTr.Origin, nurbsTr.BasisY.Normalize(), nurbsTr.BasisZ.Normalize());
            //Plane geomPlane = Autodesk.Revit.DB.Plane.CreateByOriginAndBasis(nurbSpline.GetEndPoint(0), nurbsTr.BasisY.Normalize(), nurbsTr.BasisZ.Normalize());
            //Frame f = new Frame(nurbSpline.GetEndPoint(0), nurbsTr.BasisY.Normalize(), nurbsTr.BasisZ.Normalize(), nurbsTr.BasisX.Normalize());
            //Plane geomPlane = Autodesk.Revit.DB.Plane.CreateByThreePoints(XYZ.Zero, XYZ.BasisX, XYZ.BasisZ);
            //Plane geomPlane = Plane.CreateByNormalAndOrigin(nurbsTr.BasisX.Normalize(), nurbSpline.GetEndPoint(1)); funziona
            //Plane geomPlane = Plane.CreateByThreePoints(startPoint, startPoint + nurbsTr.BasisX.Normalize(), startPoint + XYZ.BasisZ);
            #endregion
            //XYZ curveDir = controlPoints[1] - controlPoints[0];
            XYZ   curveDir  = nurbsTr.BasisX;
            XYZ   perpDir   = curveDir.CrossProduct(startPoint + XYZ.BasisZ).Normalize();
            Plane perpPlane = Plane.CreateByNormalAndOrigin(curveDir, startPoint);
            //Plane vertPlane = Plane.CreateByThreePoints(startPoint, perpPlane.XVec, XYZ.BasisZ);
            Plane vertPlane = perpPlane;

            //PrintPoint("per", perpDir);

            List <PtCoord> pointsCoordinates = new List <PtCoord>();

            using (var form = new FormAddActiveView("Enter coordinates in clockwise order"))
            {
                form.ShowDialog();

                //if the user hits cancel just drop out of macro
                if (form.DialogResult == System.Windows.Forms.DialogResult.Cancel)
                {
                    return(Result.Cancelled);
                }

                string[] inputs = form.TextString.Split(';');

                foreach (string coord in inputs)
                {
                    string[] xy = coord.Split(',');
                    pointsCoordinates.Add(new PtCoord(Double.Parse(xy[0]) / (scale * 1000), Double.Parse(xy[1]) / (scale * 1000)));
                }
            }

//			List<PtCoord> pointsCoordinates = new List<PtCoord>(){new PtCoord(5,0), new PtCoord(2,2), new PtCoord(-14,0), new PtCoord(2,-2)};

            List <XYZ> pts = VertexPoints(nurbsTr.Origin, pointsCoordinates, vertPlane);

            XYZ pt1 = nurbsTr.Origin;
            XYZ pt2 = pt1 + vertPlane.XVec * 5;
            XYZ pt3 = pt2 + vertPlane.YVec * 2 + vertPlane.XVec * 2;
            XYZ pt4 = pt3 - vertPlane.XVec * 12;
            XYZ pt5 = pt4 - vertPlane.YVec * 2 + vertPlane.XVec * 2;



            Line l1 = Line.CreateBound(pt1, pt2);
            Line l2 = Line.CreateBound(pt2, pt3);
            Line l3 = Line.CreateBound(pt3, pt4);
            Line l4 = Line.CreateBound(pt4, pt5);
            Line l5 = Line.CreateBound(pt5, pt1);
            //
            //			var profileLoop = CurveLoop.Create(new List<Curve>{l1, l2, l3, l4, l5});

            var profileLoop = LoopPoints(pts);

            //double rotAngle = -2.543 * Math.PI / 180;
            double rotAngle  = -15 * Math.PI / 180;
            var    transform = Transform.CreateRotationAtPoint(nurbsTr.BasisX, rotAngle, nurbsTr.Origin);

            profileLoop.Transform(transform);

            var loops = new List <CurveLoop> {
                profileLoop
            };

            var path = CurveLoop.Create(new List <Curve> {
                nurbSpline
            });

            WireframeBuilder builder = new WireframeBuilder();

            builder.AddCurve(nurbSpline);


            //Solid solid = GeometryCreationUtilities.CreateSweptGeometry(path,0,nurbSpline.GetEndParameter(0),loops);
            Solid solid = GeometryCreationUtilities.CreateFixedReferenceSweptGeometry(path, 0, nurbSpline.GetEndParameter(0), loops, XYZ.BasisZ);


            using (Transaction t = new Transaction(doc, "create spline"))
            {
                t.Start();

                ElementId categoryId = new ElementId(BuiltInCategory.OST_Floors);

                DirectShape ds = DirectShape.CreateElement(doc, categoryId);

                ds.SetShape(builder);

                ds.Name = "RhinoSpline";

                SketchPlane sp = SketchPlane.Create(doc, vertPlane);
                uidoc.ActiveView.SketchPlane = sp;

                //uidoc.ActiveView.ShowActiveWorkPlane();

                ModelLine line1 = doc.Create.NewModelCurve(l1, sp) as ModelLine;
                ModelLine line2 = doc.Create.NewModelCurve(l2, sp) as ModelLine;
                ModelLine line3 = doc.Create.NewModelCurve(l3, sp) as ModelLine;
                ModelLine line4 = doc.Create.NewModelCurve(l4, sp) as ModelLine;
                ModelLine line5 = doc.Create.NewModelCurve(l5, sp) as ModelLine;

                List <GeometryObject> gs = new List <GeometryObject>();
                gs.Add(solid);

                //DirectShape directShape = DirectShape.CreateElement(doc, categoryId);
                ds.AppendShape(gs);

                t.Commit();
            }

            return(Result.Succeeded);
        }
コード例 #8
0
        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;

            //WALLS FACES
            List <PlanarFace> wallFaces = new List <PlanarFace>();

            //WALLS
            Reference wallRef = uidoc.Selection.PickObject(ObjectType.Element, "Select a Wall");

            Element wall = doc.GetElement(wallRef);

            LocationCurve lc = wall.Location as LocationCurve;

            Line wallLine = lc.Curve as Line;

            XYZ perpDir = wallLine.Direction.CrossProduct(XYZ.BasisZ);

            Options opt = new Options();

            opt.ComputeReferences        = true;
            opt.IncludeNonVisibleObjects = false;
            opt.View = doc.ActiveView;

            GeometryElement geomElem = doc.GetElement(wallRef).get_Geometry(opt);

            foreach (GeometryObject geomObj in geomElem)
            {
                Solid geomSolid = geomObj as Solid;
                foreach (Face geomFace in geomSolid.Faces)
                {
                    XYZ faceNormal = geomFace.ComputeNormal(new UV(0.5, 0.5));

                    //select only the vertical faces
                    if (faceNormal.CrossProduct(perpDir).IsAlmostEqualTo(XYZ.Zero))
                    {
                        PlanarFace pf = geomFace as PlanarFace;
                        wallFaces.Add(pf);
                    }
                }
            }


            //GET MESH
            Reference meshRef = uidoc.Selection.PickObject(ObjectType.Element, "Select Mesh");
            Element   e       = doc.GetElement(meshRef);

            GeometryElement geomElemSurvey = e.get_Geometry(opt);

            Mesh geomMesh = null;

            foreach (GeometryObject geomObj in geomElemSurvey)
            {
                try
                {
                    GeometryInstance gi = geomObj as GeometryInstance;
                    foreach (GeometryObject element in gi.GetInstanceGeometry())
                    {
                        geomMesh = element as Mesh;
                    }
                }
                catch
                {
                    geomMesh = geomObj as Mesh;
                }
            }


            using (Transaction t = new Transaction(doc, "Find intersection"))
            {
                t.Start();

                List <XYZ>       intPts  = new List <XYZ>();
                WireframeBuilder builder = new WireframeBuilder();

                for (int i = 0; i < geomMesh.NumTriangles; i++)
                {
                    MeshTriangle triangle = geomMesh.get_Triangle(i);
                    XYZ          vertex1  = triangle.get_Vertex(0);
                    XYZ          vertex2  = triangle.get_Vertex(1);
                    XYZ          vertex3  = triangle.get_Vertex(2);

                    Line[] edgeList = new Line[3];

                    try
                    {
                        Line[] edges = new Line[] { Line.CreateBound(vertex1, vertex2), Line.CreateBound(vertex1, vertex3), Line.CreateBound(vertex2, vertex3) };

                        for (int k = 0; k < edgeList.Length; k++)
                        {
                            edgeList[k] = edges[k];
                        }
                    }
                    catch { }


                    //		        Plane facePlane = Plane.CreateByThreePoints(vertex1, vertex2, vertex3);
                    //		        SketchPlane sp = SketchPlane.Create(doc, facePlane);
                    //		        doc.Create.NewModelCurve(edge12, sp);
                    //		        doc.Create.NewModelCurve(edge13, sp);
                    //		        doc.Create.NewModelCurve(edge23, sp);



                    foreach (PlanarFace pf in wallFaces)
                    {
                        XYZ[] pts = new XYZ[2];

                        int count = 0;

                        if (edgeList[0] != null)
                        {
                            foreach (Line edge in edgeList)
                            {
                                IntersectionResultArray intersections = null;
                                SetComparisonResult     scr           = pf.Intersect(edge, out intersections);



                                if (scr == SetComparisonResult.Overlap && intersections.Size == 1)
                                {
                                    for (int j = 0; j < intersections.Size; j++)
                                    {
                                        //TaskDialog.Show("r", intersections.get_Item(i));
                                    }

                                    //TaskDialog.Show("r", intersections.Size.ToString());

                                    IntersectionResult iResult = intersections.get_Item(0);
                                    intPts.Add(iResult.XYZPoint);
                                    pts[count] = iResult.XYZPoint;
                                    count      = 1;

                                    if (pts.Length == 2 && pts[1] != null)
                                    {
                                        //		                TaskDialog.Show("r", String.Format("{0}\n{1}",pts[0], pts[1]));
                                        try
                                        {
                                            Plane       wallPlane = Plane.CreateByNormalAndOrigin(pf.FaceNormal, pf.Origin);
                                            SketchPlane spWall    = SketchPlane.Create(doc, wallPlane); //PROBABLY BETTER TO USE ONLY 1 SKETCHPLANE (THE SAME FOR ALL THE CURVES -> MOVE IT OUT OF THE LOOP)

                                            builder.AddCurve(Line.CreateBound(pts[0], pts[1]));
                                            doc.Create.NewModelCurve(Line.CreateBound(pts[0], pts[1]), spWall);
                                        }
                                        catch { }
                                    }
                                }
                            }
                        }
                    }
                }

                // SINGLE MODEL CURVES OR GROUPED INTO 1 DIRECTSHAPE
                DirectShape ds = DirectShape.CreateElement(doc, new ElementId(BuiltInCategory.OST_GenericModel));
                ds.SetShape(builder);

                t.Commit();
            }

            return(Result.Succeeded);
        }