示例#1
0
 public Bending(Bending previousB)
 {
     Orientation = previousB.Orientation;
     Index       = previousB.Index;
     Direction   = previousB.Direction;
     Angle       = previousB.Angle;
     Radius      = previousB.Radius;
     Length      = previousB.Length;
 }
示例#2
0
        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);
        }
示例#3
0
        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
        }
示例#4
0
        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);
        }
示例#5
0
        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
        }