public override void SolveInstance(IGH_DataAccess DA, out string msg, out GH_RuntimeMessageLevel level) { msg = ""; level = GH_RuntimeMessageLevel.Blank; //var line = new LineCurve(); Brep inSrfc = null; var noIndex = 0; var comment = ""; var rfSrfc = new RFSurface(); var inRFEM = new GH_RFEM(); var rfEdges = new List <RFLine>(); var mod = false; var del = false; var boundList = ""; var geomType = 0; var stiffType = 0; var thickType = 0; var thick = 0.0; var mat = 0; //int intPoints = 4; //int newNo = 0; if (DA.GetData(9, ref inRFEM)) { rfSrfc = new RFSurface((RFSurface)inRFEM.Value); if (DA.GetData(0, ref inSrfc)) { Component_RFSurface.SetGeometry(inSrfc, ref rfSrfc); } if (DA.GetData(6, ref geomType)) { rfSrfc.GeometryType = (SurfaceGeometryType)geomType; if (rfSrfc.GeometryType == SurfaceGeometryType.UnknownGeometryType) { msg = "Surface Geometry Type not supported. "; level = GH_RuntimeMessageLevel.Warning; return; } } if (DA.GetData(2, ref mat)) { rfSrfc.MaterialNo = mat; } if (DA.GetData(3, ref thick)) { rfSrfc.Thickness = thick; } } else if (DA.GetData(0, ref inSrfc)) { if (!(DA.GetData(2, ref mat) && DA.GetData(3, ref thick))) { msg = "Insufficient input parameters. Provide Material Number and Surface thickness. "; level = GH_RuntimeMessageLevel.Warning; return; } if (inSrfc.Edges.Select(x => x.GetLength()).Min() <= 0.001) { level = GH_RuntimeMessageLevel.Warning; msg = "Boundary lines are too short. It may cause import errors."; } else { rfSrfc.MaterialNo = mat; rfSrfc.Thickness = thick; } //DA.GetData(7, ref intPoints); Component_RFSurface.SetGeometry(inSrfc, ref rfSrfc); if (DA.GetData(6, ref geomType)) { rfSrfc.GeometryType = (SurfaceGeometryType)geomType; if (rfSrfc.GeometryType == SurfaceGeometryType.NurbsSurfaceType) { if (inSrfc.Edges.Count != 4) { msg = "Provide a valide NURBS Surface with 4 edge curves. "; level = GH_RuntimeMessageLevel.Warning; return; } Component_RFSurface.SetGeometryNURBS(inSrfc, ref rfSrfc); } if (rfSrfc.GeometryType == SurfaceGeometryType.UnknownGeometryType) { msg = "Surface Geometry Type not supported. "; level = GH_RuntimeMessageLevel.Warning; return; } } } else if (DA.GetData(5, ref boundList)) { rfSrfc.BoundaryLineList = boundList; if (!(DA.GetData(2, ref mat) && DA.GetData(3, ref thick))) { msg = "Insufficient input parameters. Provide Material Number and Surface thickness. "; level = GH_RuntimeMessageLevel.Warning; return; } else { rfSrfc.MaterialNo = mat; rfSrfc.Thickness = thick; } if (DA.GetData(6, ref geomType)) { rfSrfc.GeometryType = (SurfaceGeometryType)geomType; if (rfSrfc.GeometryType == SurfaceGeometryType.UnknownGeometryType || (rfSrfc.GeometryType != SurfaceGeometryType.PlaneSurfaceType && rfSrfc.GeometryType != SurfaceGeometryType.QuadrangleSurfaceType)) { msg = "Surface Geometry Type not supported. "; level = GH_RuntimeMessageLevel.Warning; return; } } //}else //{ // rfSrfc.GeometryType = SurfaceGeometryType.PlaneSurfaceType; //} } else { msg = "Insufficient input parameters. Provide either Input Surface shape, Boundary Lines List or existing RFSurface Object. "; level = GH_RuntimeMessageLevel.Warning; return; } if (DA.GetData(10, ref mod)) { rfSrfc.ToModify = mod; } if (DA.GetData(11, ref del)) { rfSrfc.ToDelete = del; } if (DA.GetData(1, ref noIndex)) { rfSrfc.No = noIndex; } if (DA.GetData(4, ref comment)) { rfSrfc.Comment = comment; } if (DA.GetData(5, ref boundList)) { rfSrfc.BoundaryLineList = boundList; } if (DA.GetData(7, ref thickType)) { rfSrfc.ThicknessType = (SurfaceThicknessType)thickType; if (rfSrfc.ThicknessType == SurfaceThicknessType.UnknownThicknessType) { msg = "Surface Thickness Type not supported. "; level = GH_RuntimeMessageLevel.Warning; return; } } if (DA.GetData(8, ref stiffType)) { rfSrfc.StiffnessType = (SurfaceStiffnessType)stiffType; if (rfSrfc.StiffnessType == SurfaceStiffnessType.UnknownStiffnessType) { msg = "Taper Shape Type not supported. "; level = GH_RuntimeMessageLevel.Warning; return; } } DA.SetData(0, rfSrfc); }
public static void SetGeometry(Brep surface, ref RFSurface rfSurface) { var myBoundaryLines = new List <NurbsCurve>(); foreach (var brepEdge in surface.Edges) { myBoundaryLines.Add(brepEdge.ToNurbsCurve()); } var joinedEdges = Curve.JoinCurves(myBoundaryLines).ToList(); // In case of openings, countours must be sorted if (joinedEdges.Count > 1) { joinedEdges = joinedEdges.OrderByDescending(x => x.GetLength()).ToList(); } var edges = new List <RFLine>(); foreach (var e in joinedEdges[0].DuplicateSegments()) { var myRFLine = new RFLine(); Component_RFLine.SetGeometry(e, ref myRFLine); edges.Add(myRFLine); } rfSurface.Edges = edges.ToArray(); // Openings if (joinedEdges.Count > 1) { var openings = new List <RFOpening>(); for (int i = 1; i < joinedEdges.Count; i++) { var myOpening = new Opening(); myOpening.InSurfaceNo = rfSurface.No; var opEdges = new List <RFLine>(); foreach (var e in joinedEdges[i].DuplicateSegments()) { var myRFLine = new RFLine(); Component_RFLine.SetGeometry(e, ref myRFLine); opEdges.Add(myRFLine); } openings.Add(new RFOpening(myOpening, opEdges.ToArray())); } rfSurface.Openings = openings.ToArray(); } // Check if surface is Planar to assign type if (rfSurface.IsPlanar()) { rfSurface.GeometryType = SurfaceGeometryType.PlaneSurfaceType; } else { rfSurface.GeometryType = SurfaceGeometryType.QuadrangleSurfaceType; //var interpolatedPoints = 4; //// Assign control points //var myControlPoints = new Point3d[interpolatedPoints + 2, interpolatedPoints + 2]; //var srfc = surface.Faces[0]; //var uDomain = srfc.Domain(0); //var vDomain = srfc.Domain(1); //var derivatives = new Vector3d[0]; //for (int i = 0; i < interpolatedPoints + 2; i++) //{ // var u = uDomain.T0 + i * (uDomain.T1 - uDomain.T0) / (interpolatedPoints + 1); // for (int j = 0; j < interpolatedPoints + 2; j++) // { // var v = vDomain.T0 + j * (vDomain.T1 - vDomain.T0) / (interpolatedPoints + 1); // srfc.Evaluate(u, v, 0, out myControlPoints[i, j], out derivatives); // } //} //rfSurface.ControlPoints = myControlPoints; //SetGeometryNURBS(surface, ref rfSurface); } }
public override void SolveInstance(IGH_DataAccess DA, out string msg, out GH_RuntimeMessageLevel level) { msg = ""; level = GH_RuntimeMessageLevel.Blank; //var line = new LineCurve(); Brep inSrfc = null; var noIndex = 0; var comment = ""; var rfSrfc = new RFSurface(); var inRFEM = new GH_RFEM(); var rfEdges = new List <RFLine>(); var mod = false; var del = false; var boundList = ""; var geomType = 0; var stiffType = 0; var thickType = 0; var thick = 0.0; var mat = 0; var ecc = 0.0; //int intPoints = 4; //int newNo = 0; RFEM.SurfaceAxes axes = new RFEM.SurfaceAxes(); var axesDirType = 0; var axesLines = 0; Point3d pt1 = new Point3d(); Point3d pt2 = new Point3d(); int csNo = 0; var rot = 0.0; if (DA.GetData(13, ref inRFEM)) { rfSrfc = new RFSurface((RFSurface)inRFEM.Value); if (DA.GetData(0, ref inSrfc)) { Component_RFSurface.SetGeometry(inSrfc, ref rfSrfc); } if (DA.GetData(6, ref geomType)) { rfSrfc.GeometryType = (SurfaceGeometryType)geomType; if (rfSrfc.GeometryType == SurfaceGeometryType.UnknownGeometryType) { msg = "Surface Geometry Type not supported. "; level = GH_RuntimeMessageLevel.Warning; return; } } if (DA.GetData(2, ref mat)) { rfSrfc.MaterialNo = mat; } if (DA.GetData(3, ref thick)) { rfSrfc.Thickness = thick; } } else if (DA.GetData(0, ref inSrfc)) { if (!(DA.GetData(2, ref mat) && DA.GetData(3, ref thick))) { msg = "Insufficient input parameters. Provide Material Number and Surface thickness. "; level = GH_RuntimeMessageLevel.Warning; return; } if (inSrfc.Edges.Select(x => x.GetLength()).Min() <= 0.001) { level = GH_RuntimeMessageLevel.Warning; msg = "Boundary lines are too short. It may cause import errors."; } else { rfSrfc.MaterialNo = mat; rfSrfc.Thickness = thick; } Component_RFSurface.SetGeometry(inSrfc, ref rfSrfc); if (DA.GetData(6, ref geomType)) { rfSrfc.GeometryType = (SurfaceGeometryType)geomType; if (rfSrfc.GeometryType == SurfaceGeometryType.NurbsSurfaceType) { if (inSrfc.Edges.Count != 4) { msg = "Provide a valide NURBS Surface with 4 edge curves. "; level = GH_RuntimeMessageLevel.Warning; return; } Component_RFSurface.SetGeometryNURBS(inSrfc, ref rfSrfc); } if (rfSrfc.GeometryType == SurfaceGeometryType.UnknownGeometryType) { msg = "Surface Geometry Type not supported. "; level = GH_RuntimeMessageLevel.Warning; return; } } } else if (DA.GetData(5, ref boundList)) { rfSrfc.BoundaryLineList = boundList; if (!(DA.GetData(2, ref mat) && DA.GetData(3, ref thick))) { msg = "Insufficient input parameters. Provide Material Number and Surface thickness. "; level = GH_RuntimeMessageLevel.Warning; return; } else { rfSrfc.MaterialNo = mat; rfSrfc.Thickness = thick; } if (DA.GetData(6, ref geomType)) { rfSrfc.GeometryType = (SurfaceGeometryType)geomType; if (rfSrfc.GeometryType == SurfaceGeometryType.UnknownGeometryType || (rfSrfc.GeometryType != SurfaceGeometryType.PlaneSurfaceType && rfSrfc.GeometryType != SurfaceGeometryType.QuadrangleSurfaceType)) { msg = "Surface Geometry Type not supported. "; level = GH_RuntimeMessageLevel.Warning; return; } } } else { msg = "Insufficient input parameters. Provide either Input Surface shape, Boundary Lines List or existing RFSurface Object. "; level = GH_RuntimeMessageLevel.Warning; return; } if (DA.GetData(14, ref mod)) { rfSrfc.ToModify = mod; } if (DA.GetData(15, ref del)) { rfSrfc.ToDelete = del; } if (DA.GetData(1, ref noIndex)) { rfSrfc.No = noIndex; } if (DA.GetData(4, ref comment)) { rfSrfc.Comment = comment; } if (DA.GetData(5, ref boundList)) { rfSrfc.BoundaryLineList = boundList; } if (DA.GetData(7, ref thickType)) { rfSrfc.ThicknessType = (SurfaceThicknessType)thickType; if (rfSrfc.ThicknessType == SurfaceThicknessType.UnknownThicknessType) { msg = "Surface Thickness Type not supported. "; level = GH_RuntimeMessageLevel.Warning; return; } } if (DA.GetData(8, ref stiffType)) { rfSrfc.StiffnessType = (SurfaceStiffnessType)stiffType; if (rfSrfc.StiffnessType == SurfaceStiffnessType.UnknownStiffnessType) { msg = "Taper Shape Type not supported. "; level = GH_RuntimeMessageLevel.Warning; return; } } if (DA.GetData(9, ref ecc)) { rfSrfc.Eccentricity = ecc; } if (DA.GetData(10, ref axesDirType)) { axes.SurfaceAxesDirection = (SurfaceAxesDirection)axesDirType; switch (axes.SurfaceAxesDirection) { case SurfaceAxesDirection.UnknownSurfaceAxesDirection: msg = "Axes direction not supported."; level = GH_RuntimeMessageLevel.Warning; return; case SurfaceAxesDirection.StandardSurfaceAxesDirection: break; case SurfaceAxesDirection.IdenticalToAxesForInput: msg = "Axes are always paralell to axes for input."; level = GH_RuntimeMessageLevel.Warning; break; case SurfaceAxesDirection.SurfaceAxesParallelToGlobalCS: msg = "Axes direction not supported."; level = GH_RuntimeMessageLevel.Warning; return; case SurfaceAxesDirection.SurfaceAxesParallelToUserCS: msg = "Axes direction not supported."; level = GH_RuntimeMessageLevel.Warning; return; case SurfaceAxesDirection.SurfaceAngularRotation: if (!(DA.GetData(12, ref rot))) { msg = "Insufficient input parameters. Provide Angular rotation."; level = GH_RuntimeMessageLevel.Warning; return; } axes.Rotation = rot; break; case SurfaceAxesDirection.SurfaceAxisXDirectToPoint: msg = "Axes direction not supported."; level = GH_RuntimeMessageLevel.Warning; return; case SurfaceAxesDirection.SurfaceAxisYDirectToPoint: msg = "Axes direction not supported."; level = GH_RuntimeMessageLevel.Warning; return; case SurfaceAxesDirection.SurfaceAxisXParallelToLine: if (!DA.GetData(11, ref axesLines)) { msg = "Insufficient input parameters. Provide Line."; level = GH_RuntimeMessageLevel.Warning; return; } axes.AxesLineList = axesLines.ToString(); break; case SurfaceAxesDirection.SurfaceAxisYParallelToLine: if (!DA.GetData(11, ref axesLines)) { msg = "Insufficient input parameters. Provide Line."; level = GH_RuntimeMessageLevel.Warning; return; } axes.AxesLineList = axesLines.ToString(); break; } rfSrfc.SurfaceAxes = axes; } else if (DA.GetData(12, ref rot) || DA.GetData(11, ref axesLines)) { msg = "Insufficient input parameters. Provide Axes Direction."; level = GH_RuntimeMessageLevel.Warning; return; } DA.SetData(0, rfSrfc); }
public static void SetGeometryNURBS(Brep surface, ref RFSurface rfSurface) { var myNurbsSurface = surface.Faces[0].ToNurbsSurface(); var edgesNURBS = new NurbsCurve[4]; // Get boundary Lines - UNTRIMMED!!! var edge1 = new NurbsCurve(myNurbsSurface.OrderU - 1, myNurbsSurface.Points.CountU); for (int i = 0; i < myNurbsSurface.Points.CountU; i++) { edge1.Points[i] = myNurbsSurface.Points.GetControlPoint(i, 0); } for (int i = 0; i < myNurbsSurface.KnotsU.Count; i++) { edge1.Knots[i] = myNurbsSurface.KnotsU[i]; } var edge2 = new NurbsCurve(myNurbsSurface.OrderV - 1, myNurbsSurface.Points.CountV); for (int i = 0; i < myNurbsSurface.Points.CountV; i++) { edge2.Points[i] = myNurbsSurface.Points.GetControlPoint(0, i); } for (int i = 0; i < myNurbsSurface.KnotsV.Count; i++) { edge2.Knots[i] = myNurbsSurface.KnotsV[i]; } var edge3 = new NurbsCurve(myNurbsSurface.OrderU - 1, myNurbsSurface.Points.CountU); for (int i = 0; i < myNurbsSurface.Points.CountU; i++) { edge3.Points[i] = myNurbsSurface.Points.GetControlPoint(i, myNurbsSurface.Points.CountV - 1); } for (int i = 0; i < myNurbsSurface.KnotsU.Count; i++) { edge3.Knots[i] = myNurbsSurface.KnotsU[i]; } var edge4 = new NurbsCurve(myNurbsSurface.OrderV - 1, myNurbsSurface.Points.CountV); for (int i = 0; i < myNurbsSurface.Points.CountV; i++) { edge4.Points[i] = myNurbsSurface.Points.GetControlPoint(myNurbsSurface.Points.CountU - 1, i); } for (int i = 0; i < myNurbsSurface.KnotsV.Count; i++) { edge4.Knots[i] = myNurbsSurface.KnotsV[i]; } edgesNURBS[0] = edge1; edgesNURBS[1] = edge2; edgesNURBS[2] = edge3; edgesNURBS[3] = edge4; //var myBoundaryLines = new List<NurbsCurve>(); ////Untrim surface //var unTrimmed = surface.Faces[0].DuplicateSurface().ToBrep(); //foreach (var brepEdge in unTrimmed.Edges) //{ // myBoundaryLines.Add(brepEdge.ToNurbsCurve()); //} //var joinedEdges = Curve.JoinCurves(myBoundaryLines).ToList(); //// In case of openings, countours must be sorted //if (joinedEdges.Count > 1) //{ // joinedEdges = joinedEdges.OrderByDescending(x => x.GetLength()).ToList(); //} var edges = new List <RFLine>(); //foreach (var e in joinedEdges[0].DuplicateSegments()) foreach (var e in edgesNURBS) { var myRFLine = new RFLine(); // If line has just 2 points - insert additional one (otherwise it doesnw work in RFEM) //var eNURBS = e.ToNurbsCurve(); if (e.Points.Count <= 2) { var splitted = e.Rebuild(3, e.Degree, true); } Component_RFLine.SetGeometry(e, ref myRFLine); edges.Add(myRFLine); } rfSurface.Edges = edges.ToArray(); //// Openings //if (joinedEdges.Count > 1) //{ // var openings = new List<RFOpening>(); // for (int i = 1; i < joinedEdges.Count; i++) // { // var myOpening = new Opening(); // myOpening.InSurfaceNo = rfSurface.No; // var opEdges = new List<RFLine>(); // foreach (var e in joinedEdges[i].DuplicateSegments()) // { // var myRFLine = new RFLine(); // Component_RFLine.SetGeometry(e, ref myRFLine); // opEdges.Add(myRFLine); // } // openings.Add(new RFOpening(myOpening, opEdges.ToArray())); // } // rfSurface.Openings = openings.ToArray(); //} // Check if surface is Planar to assign type rfSurface.GeometryType = SurfaceGeometryType.NurbsSurfaceType; // Assign Nurbsurface data var utNURBS = surface.Faces[0].DuplicateSurface().ToNurbsSurface(); var myControlPoints = new Point3d[utNURBS.Points.CountU, utNURBS.Points.CountV]; var myWeights = new double[utNURBS.Points.CountU, utNURBS.Points.CountV]; for (int i = 0; i < utNURBS.Points.CountU; i++) { for (int j = 0; j < utNURBS.Points.CountV; j++) { var myPt = new Point3d(); utNURBS.Points.GetPoint(i, j, out myPt); myControlPoints[i, j] = myPt; myWeights[i, j] = utNURBS.Points.GetWeight(i, j); } } // modify formulation -see curve knots!!!!!!!!!!! var countKnotsX = utNURBS.Points.CountU + utNURBS.OrderU; var myKnotX = new double[countKnotsX]; for (int i = 0; i < countKnotsX - 2; i++) { myKnotX[i + 1] = utNURBS.KnotsU[i] / utNURBS.KnotsU[countKnotsX - 3]; } myKnotX[0] = myKnotX[1]; myKnotX[countKnotsX - 1] = myKnotX[countKnotsX - 2]; var countKnotsY = utNURBS.Points.CountV + utNURBS.OrderV; var myKnotY = new double[countKnotsY]; for (int i = 0; i < countKnotsY - 2; i++) { myKnotY[i + 1] = utNURBS.KnotsV[i] / utNURBS.KnotsV[countKnotsY - 3]; } myKnotY[0] = myKnotY[1]; myKnotY[countKnotsY - 1] = myKnotY[countKnotsY - 2]; // Assign nurbs values rfSurface.ControlPoints = myControlPoints; rfSurface.Weights = myWeights; rfSurface.KnotsX = myKnotX; rfSurface.KnotsY = myKnotY; rfSurface.OrderX = utNURBS.OrderU; rfSurface.OrderY = utNURBS.OrderV; }
/// <summary> /// This is the method that actually does the work. /// </summary> /// <param name="DA">The DA object can be used to retrieve data from input parameters and /// to store data in output parameters.</param> protected override void SolveInstance(IGH_DataAccess DA, EvaluationUnit unit) { //var line = new LineCurve(); Brep inSrfc = null; var noIndex = 0; var comment = ""; var rfSrfc = new RFSurface(); var inRFEM = new GH_RFEM(); var rfEdges = new List <RFLine>(); var mod = false; var del = false; var boundList = ""; var geomType = ""; var stiffType = ""; var thickType = ""; var thick = 0.0; var mat = 0; //int intPoints = 4; //int newNo = 0; if (DA.GetData(9, ref inRFEM)) { rfSrfc = new RFSurface((RFSurface)inRFEM.Value); if (DA.GetData(6, ref geomType)) { Enum.TryParse(geomType, out SurfaceGeometryType myGeomType); rfSrfc.GeometryType = myGeomType; } } else if (DA.GetData(0, ref inSrfc)) { if (!(DA.GetData(2, ref mat) && DA.GetData(3, ref thick))) { return; } else { rfSrfc.MaterialNo = mat; rfSrfc.Thickness = thick; } //DA.GetData(7, ref intPoints); if (DA.GetData(6, ref geomType)) { Enum.TryParse(geomType, out SurfaceGeometryType myGeomType); rfSrfc.GeometryType = myGeomType; } Component_RFSurface.SetGeometry(inSrfc, ref rfSrfc); } else { return; } if (DA.GetData(10, ref mod)) { rfSrfc.ToModify = mod; } if (DA.GetData(11, ref del)) { rfSrfc.ToDelete = del; } if (DA.GetData(1, ref noIndex)) { rfSrfc.No = noIndex; } if (DA.GetData(4, ref comment)) { rfSrfc.Comment = comment; } if (DA.GetData(5, ref boundList)) { rfSrfc.BoundaryLineList = boundList; } if (DA.GetData(7, ref thickType)) { Enum.TryParse(thickType, out SurfaceThicknessType myThicknessType); rfSrfc.ThicknessType = myThicknessType; } if (DA.GetData(8, ref stiffType)) { Enum.TryParse(stiffType, out SurfaceStiffnessType myStiffType); rfSrfc.StiffnessType = myStiffType; } DA.SetData(0, rfSrfc); }