public Bending(Bending previousB) { Orientation = previousB.Orientation; Index = previousB.Index; Direction = previousB.Direction; Angle = previousB.Angle; Radius = previousB.Radius; Length = previousB.Length; }
private void DrawUnfoldGroup(BendingGroup bends) { renderViewDraw.ClearScene(); #region 绘制底面 TopoShape baseShape = GlobalInstance.BrepTools.FillFace(bends.Vertexes); SceneManager sceneMgr = renderViewDraw.SceneManager; SceneNode root = GlobalInstance.TopoShapeConvert.ToSceneNode(baseShape, 0.1f); sceneMgr.AddNode(root); #endregion #region 逆时针方向依次折弯 Queue <Vector3> vertexQueue = new Queue <Vector3>(bends.Vertexes); for (int i = 0; i < vertexQueue.Count(); i++) { var sPt = vertexQueue.Dequeue(); var ePt = vertexQueue.Peek(); vertexQueue.Enqueue(sPt); var line = GlobalInstance.BrepTools.MakeLine(sPt, ePt); var face = baseShape; var groupEdge = from m in bends.Bendings where m.Orientation == Math.Round(((ePt - sPt).Y >= 0 ? (ePt - sPt).AngleBetween(Vector3.UNIT_X) : (360 - (ePt - sPt).AngleBetween(Vector3.UNIT_X))), 3) orderby m.Index select m; foreach (var bending in groupEdge) { if (face == null || line == null) { return; } if (face.GetShapeType() != EnumTopoShapeType.Topo_FACE || line.GetShapeType() != EnumTopoShapeType.Topo_EDGE) { break; } BendHelper helper = new BendHelper(); var temp = new Bending(bending); temp.Length += temp.Radius * temp.Angle * Math.PI / 180; temp.Angle = 0; helper = BendUp(face, line, temp); ElementId id = new ElementId(bending.Index); SceneNode node = GlobalInstance.TopoShapeConvert.ToSceneNode(helper.Sweep, 0.1f); node.SetId(id); sceneMgr.AddNode(node); face = helper.EdFace; line = helper.EdLine; } } #endregion renderViewDraw.FitAll(); renderViewDraw.RequestDraw(EnumRenderHint.RH_LoadScene); }
public void Add(Bending bending) { #region 总体编号 if (Bendings.Count() == 0) { bending.Index = 0; } else { bending.Index = Bendings.Last().Index + 1; } Bendings.Add(bending); #endregion #region 方向分别编号 //switch (bending.Orientation) //{ // case EnumEdge.Edge_1: // var group1 = from bend in Bendings // where bend.Orientation == EnumEdge.Edge_1 // select bend; // if (group1.Count() == 0) // { // bending.Index = 0; // } // else // { // bending.Index = group1.Last().Index + 1; // } // Bendings.Add(bending); // break; // case EnumEdge.Edge_2: // var group2 = from bend in Bendings // where bend.Orientation == EnumEdge.Edge_2 // select bend; // if (group2.Count() == 0) // { // bending.Index = 0; // } // else // { // bending.Index = group2.Last().Index + 1; // } // Bendings.Add(bending); // break; // case EnumEdge.Edge_3: // var group3 = from bend in Bendings // where bend.Orientation == EnumEdge.Edge_3 // select bend; // if (group3.Count() == 0) // { // bending.Index = 0; // } // else // { // bending.Index = group3.Last().Index + 1; // } // Bendings.Add(bending); // break; // case EnumEdge.Edge_4: // var group4 = from bend in Bendings // where bend.Orientation == EnumEdge.Edge_4 // select bend; // if (group4.Count() == 0) // { // bending.Index = 0; // } // else // { // bending.Index = group4.Last().Index + 1; // } // Bendings.Add(bending); // break; // default: // break; //} #endregion }
private BendHelper BendDown(TopoShape face, TopoShape line, Bending bending) { #region 计算平面法向量 GeomSurface surface = new GeomSurface(); surface.Initialize(face); //参数域UV范围 double uFirst = surface.FirstUParameter(); double uLast = surface.LastUParameter(); double vFirst = surface.FirstVParameter(); double vLast = surface.LastVParameter(); //取中点 double umid = uFirst + (uLast - uFirst) * 0.5f; double vmid = vFirst + (vLast - vFirst) * 0.5f; //计算法向量 var data = surface.D1(umid, vmid); Vector3 dirU = data[1]; Vector3 dirV = data[2]; Vector3 dirF = dirV.CrossProduct(dirU); dirF.Normalize(); #endregion #region 计算边线参数 GeomCurve curve = new GeomCurve(); curve.Initialize(line); Vector3 dirL = curve.DN(curve.FirstParameter(), 1); Vector3 stPt = curve.Value(curve.FirstParameter()); //起点 Vector3 edPt = curve.Value(curve.LastParameter()); //终点 #endregion #region 绘制草图 TopoShapeGroup lineGroup = new TopoShapeGroup(); Vector3 center = stPt + dirF * bending.Radius; //圆心 Vector3 radius = stPt - center; //半径 double theta = bending.Angle * (Math.PI / 180.0); Vector3 radius2 = radius * Math.Cos(theta) + dirL.CrossProduct(radius) * Math.Sin(theta); Vector3 edArc = center + radius2; //圆弧终点 TopoShape arc = GlobalInstance.BrepTools.MakeArc(stPt, edArc, center, dirL); //绘制圆弧 if (arc != null) { lineGroup.Add(arc); } Vector3 edLine = dirL.CrossProduct(radius2) * (bending.Length / bending.Radius) + edArc; arc = GlobalInstance.BrepTools.MakeLine(edArc, edLine); lineGroup.Add(arc); //扫描生成折弯 TopoShape wireSketch = GlobalInstance.BrepTools.MakeWire(lineGroup); TopoShape sweep; if (wireSketch != null) { sweep = GlobalInstance.BrepTools.Sweep(wireSketch, line, true); } else { sweep = GlobalInstance.BrepTools.Sweep(arc, line, true); } TopoShape oFace = GlobalInstance.BrepTools.Sweep(arc, line, true).GetSubShape(0, 1); TopoShape oEdge = GlobalInstance.BrepTools.MakeLine(edLine, edLine + edPt - stPt); #endregion BendHelper bend = new BendHelper() { Sweep = sweep, EdFace = oFace, EdLine = oEdge }; return(bend); }
private void BtnDown_Click(object sender, EventArgs e) { //Get selected shape SelectedShapeQuery context = new SelectedShapeQuery(); renderViewDraw.QuerySelection(context); var face = context.GetGeometry(); var line = context.GetSubGeometry(); if (face == null || line == null) { return; } if (face.GetShapeType() != EnumTopoShapeType.Topo_FACE || line.GetShapeType() != EnumTopoShapeType.Topo_EDGE) { return; } //记录输入参数 Bending bending = new Bending() { Direction = EnumDir.Edge_DOWN, Angle = Convert.ToDouble(txtAngle.Text), Radius = Convert.ToDouble(txtRadius.Text), Length = Convert.ToDouble(txtLength.Text) }; GeomCurve curve = new GeomCurve(); curve.Initialize(line); Vector3 dirL = curve.DN(curve.FirstParameter(), 1); if (dirL.Y >= 0) { bending.Orientation = Math.Round(dirL.AngleBetween(Vector3.UNIT_X), 3); } else { bending.Orientation = Math.Round(360 - dirL.AngleBetween(Vector3.UNIT_X), 3); } //if (dirL.X == 1) //{ // bending.Orientation = EnumEdge.Edge_1; //} //else if (dirL.Y == 1) //{ // bending.Orientation = EnumEdge.Edge_2; //} //else if (dirL.X == -1) //{ // bending.Orientation = EnumEdge.Edge_3; //} //else //{ // bending.Orientation = EnumEdge.Edge_4; //} TopoShape sweep = BendDown(face, line, bending).Sweep; bendings.Add(bending); #region 渲染 ElementId faceId = new ElementId(bending.Index + shapeId); ElementId edgeId = new ElementId(bending.Index); SceneManager sceneMgr = renderViewDraw.SceneManager; SceneNode rootNode = GlobalInstance.TopoShapeConvert.ToSceneNode(sweep, 0.1f); SceneNode faceNode = GlobalInstance.TopoShapeConvert.ToSceneNode(face, 0.1f); SceneNode edgeNode = GlobalInstance.TopoShapeConvert.ToSceneNode(line, 0.1f); faceNode.SetId(faceId); faceNode.SetVisible(false); edgeNode.SetId(edgeId); edgeNode.SetVisible(false); if (rootNode != null) { sceneMgr.AddNode(rootNode); sceneMgr.AddNode(faceNode); sceneMgr.AddNode(edgeNode); } renderViewDraw.FitAll(); renderViewDraw.RequestDraw(EnumRenderHint.RH_LoadScene); #endregion }