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()); }
/// <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); }
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(); }
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>(); }
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>(); }
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 ); } }
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); }
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); }