예제 #1
0
        public void DecodePLANE()         //解码平面字符串
        {
            //插入线
            TableItem temp = new TableItem();

            temp.child = new ArrayList();
            StringBuilder reg = new StringBuilder(); //存储所有中间字符串
            int           i   = 0;                   //循环控制变量

            //STEPId解码
            while (!Char.IsDigit(this.str_temp[i]))//跳过无用的字符,直接找到数字
            {
                ++i;
            }
            while (Char.IsDigit(this.str_temp[i]))
            {
                reg.Append(this.str_temp[i]);
                ++i;
            }
            temp.STEPId = int.Parse(reg.ToString());
            //TypeFlag解码
            temp.TypeFlag = PLANE_;
            //信息节点解码
            PLANE struct_tmp = new PLANE();  //建立结构体,并将指针赋值给共用体

            reg.Clear();                     //清空字符串
            while (this.str_temp[i] != '\'') //跳过前面的字符,直接读取有效信息
            {
                ++i;
            }
            ++i;
            //读取字符串'XX'里的属性
            while (this.str_temp[i] != '\'')
            {
                reg.Append(this.str_temp[i]);
                ++i;
            }
            struct_tmp.property = reg.ToString();
            reg.Clear();

            //读取孩子结点信息
            while (!Char.IsDigit(this.str_temp[i]))//跳过无用的字符,直接找到数字
            {
                ++i;
            }
            while (Char.IsDigit(this.str_temp[i]))
            {
                reg.Append(this.str_temp[i]);
                ++i;
            }
            temp.child.Add(int.Parse(reg.ToString()));
            reg.Clear();
            temp.node = struct_tmp;
            //将结构体插入到向量里
            TableNode.Add(temp);
        }
예제 #2
0
 public void LookForAdvancedFace()
 {
     for (int i = 0; i < Form1.MainStorage.TableNode.Count; ++i)
     {
         TableItem temp = (TableItem)(Form1.MainStorage.TableNode[i]);
         if (temp.TypeFlag == 13)//判断是否是高级面
         {
             AdvancedFaceIndex.Add(i);
         }
     }
 }
예제 #3
0
        public int WhichKindOfSurface(int index)//判断该面是何种的类型,从而调用不同的函数生成网格
        {
            int       ID   = Form1.MainStorage.LookForLastChildByIndex(index);
            TableItem temp = (TableItem)(Form1.MainStorage.TableNode[Form1.MainStorage.LookForNode(ID)]);

            switch (temp.TypeFlag)
            {
            case 9: return(CylinderSurface); break;

            case 10: return(PlaneSurface); break;

            default: return(0);
            }
        }
예제 #4
0
 public int LookForNode(int StepId)//查找表项,以STEP_ID形式,返回索引号
 {
     for (int i = 0; i < this.TableNode.Count; ++i)
     {
         TableItem temp = (TableItem)(this.TableNode[i]);
         if (StepId == temp.STEPId)
         {
             return(i);
         }
         else
         {
             continue;
         }
     }
     return(-1);
 }
예제 #5
0
        private bool CreateTreeNode(TreeNode parentTree)
        {
            int       TableIndex    = (int)parentTree.Tag;//索引到表项
            TableItem Obj_TableNode = (TableItem)(MainStorage.TableNode[TableIndex]);

            if (Obj_TableNode.child.Count != 0)                     //如果不存在孩子结点
            {
                for (int a = 0; a < Obj_TableNode.child.Count; ++a) //如果存在孩子结点
                {
                    int index = MainStorage.LookForNode((int)(Obj_TableNode.child[a]));
                    if (index == -1)
                    {
                        continue;
                    }
                    TableItem cache = (TableItem)(MainStorage.TableNode[index]);
                    TreeNode  temp  = new TreeNode(cache.GetTypeName() + cache.STEPId);
                    temp.Tag = index;
                    parentTree.Nodes.Add(temp);
                    CreateTreeNode(temp);
                }
            }
            return(true);
        }
예제 #6
0
        public void DecodeCYLINDRICAL_SURFACE()//解码圆柱面字符串
        {
            //插入圆柱面
            TableItem temp = new TableItem();

            temp.child = new ArrayList();
            StringBuilder reg = new StringBuilder(); //存储所有中间字符串
            int           i   = 0;                   //循环控制变量

            //STEPId解码
            while (!Char.IsDigit(this.str_temp[i]))//跳过无用的字符,直接找到数字
            {
                ++i;
            }
            while (Char.IsDigit(this.str_temp[i]))
            {
                reg.Append(this.str_temp[i]);
                ++i;
            }
            temp.STEPId = int.Parse(reg.ToString());
            //无孩子结点,无需解码
            //TypeFlag解码
            temp.TypeFlag = CYLINDRICAL_SURFACE_;
            //信息节点解码
            CYLINDRICAL_SURFACE struct_tmp = new CYLINDRICAL_SURFACE(); //建立结构体,并将指针赋值给共用体

            reg.Clear();                                                //清空字符串
            while (this.str_temp[i] != '\'')                            //跳过前面的字符,直接读取有效信息
            {
                ++i;
            }
            ++i;
            //读取字符串'XX'里的属性
            while (this.str_temp[i] != '\'')
            {
                reg.Append(this.str_temp[i]);
                ++i;
            }
            struct_tmp.property = reg.ToString();
            reg.Clear();

            //读取孩子结点信息
            while (!Char.IsDigit(this.str_temp[i]))//跳过无用的字符,直接找到数字
            {
                ++i;
            }
            while (Char.IsDigit(this.str_temp[i]))
            {
                reg.Append(this.str_temp[i]);
                ++i;
            }
            temp.child.Add(int.Parse(reg.ToString()));
            reg.Clear();
            //读取一行属性
            while (!Char.IsDigit(this.str_temp[i]) && (this.str_temp[i] != '+') && (this.str_temp[i] != '-') && (this.str_temp[i] != '.'))//跳过无用的字符
            {
                ++i;
            }
            while (Char.IsDigit(this.str_temp[i]) || (this.str_temp[i] == '+') || (this.str_temp[i] == '-') || (this.str_temp[i] == '.'))
            {
                reg.Append(this.str_temp[i]);
                ++i;
            }
            struct_tmp.radius = double.Parse(reg.ToString());
            reg.Clear();
            temp.node = struct_tmp;
            //将结构体插入到向量里
            TableNode.Add(temp);
        }
예제 #7
0
        public void DecodeEDGE_LOOP()         //解码环形边字符串
        {
            //插入向量
            TableItem temp = new TableItem();

            temp.child = new ArrayList();
            StringBuilder reg = new StringBuilder(); //存储所有中间字符串
            int           i   = 0;                   //循环控制变量

            //STEPId解码
            while (!Char.IsDigit(this.str_temp[i]))//跳过无用的字符,直接找到数字
            {
                ++i;
            }
            while (Char.IsDigit(this.str_temp[i]))
            {
                reg.Append(this.str_temp[i]);
                ++i;
            }
            temp.STEPId = int.Parse(reg.ToString());
            //无孩子结点,无需解码
            //TypeFlag解码
            temp.TypeFlag = EDGE_LOOP_;
            //信息节点解码
            EDGE_LOOP struct_tmp = new EDGE_LOOP(); //建立结构体,并将指针赋值给共用体

            reg.Clear();                            //清空字符串
            while (this.str_temp[i] != '\'')        //跳过前面的字符,直接读取有效信息
            {
                ++i;
            }
            ++i;
            //读取字符串'XX'里的属性
            while (this.str_temp[i] != '\'')
            {
                reg.Append(this.str_temp[i]);
                ++i;
            }
            struct_tmp.property = reg.ToString();
            reg.Clear();
            //读取多个子结点信息,长度不定
            while (this.str_temp[i] != '(')
            {
                ++i;
            }
            i++;
            while (this.str_temp[i] != ')')
            {
                if (!Char.IsDigit(this.str_temp[i]))
                {
                    ++i;
                }
                else if (Char.IsDigit(this.str_temp[i]) && (!Char.IsDigit(this.str_temp[i + 1])))
                {
                    reg.Append(this.str_temp[i]);
                    temp.child.Add(int.Parse(reg.ToString()));
                    reg.Clear();
                    ++i;
                }
                else
                {
                    reg.Append(this.str_temp[i]);
                    ++i;
                }
            }

            //将结构体插入到向量里
            temp.node = struct_tmp;
            TableNode.Add(temp);
        }
예제 #8
0
        public void DecodeCARTESIAN_POINT()//解码笛卡尔点字符串
        {
            //插入笛卡尔点
            TableItem temp = new TableItem();

            temp.child = new ArrayList();
            StringBuilder reg = new StringBuilder(); //存储所有中间字符串
            int           i   = 0;                   //循环控制变量

            //STEPId解码
            while (!Char.IsDigit(this.str_temp[i]))//跳过无用的字符,直接找到数字
            {
                ++i;
            }
            while (Char.IsDigit(this.str_temp[i]))
            {
                reg.Append(this.str_temp[i]);
                ++i;
            }
            temp.STEPId = int.Parse(reg.ToString());
            //无孩子结点,无需解码
            //TypeFlag解码
            temp.TypeFlag = CARTESIAN_POINT_;
            //信息节点解码
            CARTESIAN_POINT struct_tmp = new CARTESIAN_POINT(); //建立结构体,并将指针赋值给共用体

            reg.Clear();                                        //清空字符串
            while (this.str_temp[i] != '\'')                    //跳过前面的字符,直接读取有效信息
            {
                ++i;
            }
            ++i;
            //读取字符串'XX'里的属性
            while (this.str_temp[i] != '\'')
            {
                reg.Append(this.str_temp[i]);
                ++i;
            }
            struct_tmp.property = reg.ToString();
            reg.Clear();
            //读取x坐标信息
            while (!Char.IsDigit(this.str_temp[i]) && (this.str_temp[i] != '+') && (this.str_temp[i] != '-') && (this.str_temp[i] != '.'))//跳过无用的字符
            {
                ++i;
            }
            while (Char.IsDigit(this.str_temp[i]) || (this.str_temp[i] == '+') || (this.str_temp[i] == '-') || (this.str_temp[i] == '.'))
            {
                reg.Append(this.str_temp[i]);
                ++i;
            }
            struct_tmp.x_coord = double.Parse(reg.ToString());
            reg.Clear();
            //读取y坐标信息
            while (!Char.IsDigit(this.str_temp[i]) && (this.str_temp[i] != '+') && (this.str_temp[i] != '-') && (this.str_temp[i] != '.'))//跳过无用的字符
            {
                ++i;
            }
            while (Char.IsDigit(this.str_temp[i]) || (this.str_temp[i] == '+') || (this.str_temp[i] == '-') || (this.str_temp[i] == '.'))
            {
                reg.Append(this.str_temp[i]);
                ++i;
            }
            struct_tmp.y_coord = double.Parse(reg.ToString());
            reg.Clear();
            //读取z坐标信息
            while (!Char.IsDigit(this.str_temp[i]) && (this.str_temp[i] != '+') && (this.str_temp[i] != '-') && (this.str_temp[i] != '.'))//跳过无用的字符
            {
                ++i;
            }
            while (Char.IsDigit(this.str_temp[i]) || (this.str_temp[i] == '+') || (this.str_temp[i] == '-') || (this.str_temp[i] == '.'))
            {
                reg.Append(this.str_temp[i]);
                ++i;
            }
            struct_tmp.z_coord = double.Parse(reg.ToString());
            reg.Clear();
            //将结构体插入到向量里
            temp.node = struct_tmp;
            this.TableNode.Add(temp);
        }
예제 #9
0
        public int LookForLastChildByIndex(int Index)
        {
            TableItem Temp = (TableItem)(this.TableNode[Index]);

            return((int)Temp.child[Temp.child.Count - 1]);
        }
예제 #10
0
        public void CreatePlaneMesh(int index)//创建平面网格
        {
            //取出对应的STEP元素的索引
            int       StepIdOfBound            = Form1.MainStorage.LookForFirstChildByIndex(index);
            int       StepIdOfLoop             = Form1.MainStorage.LookForFirstChild(StepIdOfBound);
            int       StepIdOfOriented         = Form1.MainStorage.LookForFirstChild(StepIdOfLoop);
            int       StepIdOfCurve            = Form1.MainStorage.LookForFirstChild(StepIdOfOriented);
            int       StepIdOfCircle           = Form1.MainStorage.LookForLastChild(StepIdOfCurve);
            int       IndexOfCircle            = Form1.MainStorage.LookForNode(StepIdOfCircle);
            TableItem temp                     = (TableItem)(Form1.MainStorage.TableNode[IndexOfCircle]);
            float     radius                   = (float)((CIRCLE)(temp.node)).radius;                     //读出圆的半径
            int       StepIdOfCircleAXIS       = Form1.MainStorage.LookForFirstChild(StepIdOfCircle);
            int       StepIdOfCirclePoint      = Form1.MainStorage.LookForFirstChild(StepIdOfCircleAXIS); //读出圆心
            int       StepIdOfCircleDirection2 = Form1.MainStorage.LookForLastChild(StepIdOfCircleAXIS);  //读出平面的方向2
            ArrayList child_temp               = Form1.MainStorage.LookForChild(StepIdOfCircleAXIS);
            int       StepIdOfCircleDirection1 = (int)(child_temp[1]);                                    //读出平面方向1
            //从STEP文件编号中中实例化出信息
            TableItem       TEMP_CART           = (TableItem)(Form1.MainStorage.TableNode[Form1.MainStorage.LookForNode(StepIdOfCirclePoint)]);
            CARTESIAN_POINT circle_center_point = (CARTESIAN_POINT)(TEMP_CART.node);
            TableItem       TEMP_DIR1           = (TableItem)(Form1.MainStorage.TableNode[Form1.MainStorage.LookForNode(StepIdOfCircleDirection1)]);
            DIRECTION       circle_plane_dir1   = (DIRECTION)(TEMP_DIR1.node);
            TableItem       TEMP_DIR2           = (TableItem)(Form1.MainStorage.TableNode[Form1.MainStorage.LookForNode(StepIdOfCircleDirection2)]);
            DIRECTION       circle_plane_dir2   = (DIRECTION)(TEMP_DIR2.node);
            //条件判断,如果符合一定的特殊情况,那么就开始执行三角剖分
            STLPoint     point1;
            STLPoint     point2;
            STLPoint     point3;
            STLDirection dir_temp;
            STLTriangle  temp_tri;

            if ((circle_plane_dir1.x_dir == 0) && (circle_plane_dir1.y_dir == 0) && (circle_plane_dir1.z_dir > 0))
            {
                //建立方向
                dir_temp       = new STLDirection();
                dir_temp.x_dir = 0;
                dir_temp.y_dir = 0;
                dir_temp.z_dir = 1;

                for (int i = 0; i < CircleDivision; ++i)
                {
                    //建立第一个点
                    point1   = new STLPoint();
                    point1.x = (float)circle_center_point.x_coord;
                    point1.y = (float)circle_center_point.y_coord;
                    point1.z = (float)circle_center_point.z_coord;
                    //建立第二个点
                    point2   = new STLPoint();
                    point2.x = (float)circle_center_point.x_coord + (float)(radius * Math.Cos(2 * Math.PI * (i / (float)CircleDivision)));
                    point2.y = (float)circle_center_point.y_coord + (float)(radius * Math.Sin(2 * Math.PI * (i / (float)CircleDivision)));
                    point2.z = (float)circle_center_point.z_coord;
                    //建立第三个点
                    point3   = new STLPoint();
                    point3.x = (float)circle_center_point.x_coord + (float)(radius * Math.Cos(2 * Math.PI * ((i + 1) / (float)CircleDivision)));
                    point3.y = (float)circle_center_point.y_coord + (float)(radius * Math.Sin(2 * Math.PI * ((i + 1) / (float)CircleDivision)));
                    point3.z = (float)circle_center_point.z_coord;
                    //将点和方向插入到三角形结构体之中
                    temp_tri         = new STLTriangle();
                    temp_tri.Dir     = dir_temp;
                    temp_tri.Vertex1 = point1;
                    temp_tri.Vertex2 = point2;
                    temp_tri.Vertex3 = point3;
                    STL_menber.Add(temp_tri);
                }
            }
            if ((circle_plane_dir1.x_dir == 0) && (circle_plane_dir1.y_dir == 0) && (circle_plane_dir1.z_dir < 0))
            {
                //建立方向
                dir_temp       = new STLDirection();
                dir_temp.x_dir = 0;
                dir_temp.y_dir = 0;
                dir_temp.z_dir = -1;

                for (int i = 0; i < CircleDivision; ++i)
                {
                    //建立第一个点
                    point1   = new STLPoint();
                    point1.x = (float)circle_center_point.x_coord;
                    point1.y = (float)circle_center_point.y_coord;
                    point1.z = (float)circle_center_point.z_coord;
                    //建立第二个点
                    point2   = new STLPoint();
                    point2.x = (float)circle_center_point.x_coord + (float)(radius * Math.Cos(2 * Math.PI * (i / (float)CircleDivision)));
                    point2.y = (float)circle_center_point.y_coord + (float)(radius * Math.Sin(2 * Math.PI * (i / (float)CircleDivision)));
                    point2.z = (float)circle_center_point.z_coord;
                    //建立第三个点
                    point3   = new STLPoint();
                    point3.x = (float)circle_center_point.x_coord + (float)(radius * Math.Cos(2 * Math.PI * ((i + 1) / (float)CircleDivision)));
                    point3.y = (float)circle_center_point.y_coord + (float)(radius * Math.Sin(2 * Math.PI * ((i + 1) / (float)CircleDivision)));
                    point3.z = (float)circle_center_point.z_coord;
                    //将点和方向插入到三角形结构体之中
                    temp_tri         = new STLTriangle();
                    temp_tri.Dir     = dir_temp;
                    temp_tri.Vertex1 = point1;
                    temp_tri.Vertex2 = point2;
                    temp_tri.Vertex3 = point3;
                    STL_menber.Add(temp_tri);
                }
            }
            if ((circle_plane_dir1.x_dir == 0) && (circle_plane_dir1.y_dir != 0) && (circle_plane_dir1.z_dir == 0))
            {
                //
            }
            if ((circle_plane_dir1.x_dir != 0) && (circle_plane_dir1.y_dir == 0) && (circle_plane_dir1.z_dir == 0))
            {
                //
            }
        }
예제 #11
0
        public int LookForFirstChild(int StepId)
        {
            TableItem Temp = (TableItem)(this.TableNode[LookForNode(StepId)]);

            return((int)Temp.child[0]);
        }
예제 #12
0
        public ArrayList LookForChildByIndex(int Index)
        {
            TableItem Temp = (TableItem)(this.TableNode[Index]);

            return(Temp.child);
        }
예제 #13
0
        public ArrayList LookForChild(int StepId)
        {
            TableItem Temp = (TableItem)(this.TableNode[LookForNode(StepId)]);

            return(Temp.child);
        }
예제 #14
0
        public void DecodeADVANCED_BREP_SHAPE_REPRESENTATION()//解码高级B-rep形状表示字符串
        {
            //插入高级B-rep形状表示
            TableItem temp = new TableItem();

            temp.child = new ArrayList();
            StringBuilder reg = new StringBuilder(); //存储所有中间字符串
            int           i   = 0;                   //循环控制变量

            //STEPId解码
            while (!Char.IsDigit(this.str_temp[i]))//跳过无用的字符,直接找到数字
            {
                ++i;
            }
            while (Char.IsDigit(this.str_temp[i]))
            {
                reg.Append(this.str_temp[i]);
                ++i;
            }
            temp.STEPId = int.Parse(reg.ToString());
            //无孩子结点,无需解码
            //TypeFlag解码
            temp.TypeFlag = ADVANCED_BREP_SHAPE_REPRESENTATION_;
            //信息节点解码
            ADVANCED_BREP_SHAPE_REPRESENTATION struct_tmp = new ADVANCED_BREP_SHAPE_REPRESENTATION(); //建立结构体,并将指针赋值给共用体

            reg.Clear();                                                                              //清空字符串
            while (this.str_temp[i] != '(')
            {
                ++i;
            }
            ++i;
            //读取多个子结点信息,长度不定
            while (this.str_temp[i] != '(')
            {
                ++i;
            }
            i++;
            while (this.str_temp[i] != ')')
            {
                if (!Char.IsDigit(this.str_temp[i]))
                {
                    ++i;
                }
                else if (Char.IsDigit(this.str_temp[i]) && (!Char.IsDigit(this.str_temp[i + 1])))
                {
                    reg.Append(this.str_temp[i]);
                    temp.child.Add(int.Parse(reg.ToString()));
                    reg.Clear();
                    ++i;
                }
                else
                {
                    reg.Append(this.str_temp[i]);
                    ++i;
                }
            }
            //将结构体插入到向量里
            temp.node = struct_tmp;
            TableNode.Add(temp);
        }
예제 #15
0
        public void CreateCylinderMesh(int index)//创建圆柱面网格
        {
            //取出对应元素的索引信息
            ArrayList StepIdOfBound = Form1.MainStorage.LookForChildByIndex(index);

            int       StepIdOfLoop1        = Form1.MainStorage.LookForFirstChild((int)StepIdOfBound[0]);
            int       StepIdOfOriented1    = Form1.MainStorage.LookForFirstChild(StepIdOfLoop1);
            int       StepIdOfCurve1       = Form1.MainStorage.LookForFirstChild(StepIdOfOriented1);
            int       StepIdOfCircle1      = Form1.MainStorage.LookForLastChild(StepIdOfCurve1);
            int       IndexOfCircle1       = Form1.MainStorage.LookForNode(StepIdOfCircle1);
            int       StepIdOfCircleAXIS1  = Form1.MainStorage.LookForFirstChild(StepIdOfCircle1);
            int       StepIdOfCirclePoint1 = Form1.MainStorage.LookForFirstChild(StepIdOfCircleAXIS1);//读出圆心1
            TableItem temp1    = (TableItem)Form1.MainStorage.TableNode[Form1.MainStorage.LookForNode(StepIdOfCirclePoint1)];
            float     Z1_coord = (float)((CARTESIAN_POINT)temp1.node).z_coord;

            int       StepIdOfLoop2        = Form1.MainStorage.LookForFirstChild((int)StepIdOfBound[1]);
            int       StepIdOfOriented2    = Form1.MainStorage.LookForFirstChild(StepIdOfLoop2);
            int       StepIdOfCurve2       = Form1.MainStorage.LookForFirstChild(StepIdOfOriented2);
            int       StepIdOfCircle2      = Form1.MainStorage.LookForLastChild(StepIdOfCurve2);
            int       IndexOfCircle2       = Form1.MainStorage.LookForNode(StepIdOfCircle2);
            int       StepIdOfCircleAXIS2  = Form1.MainStorage.LookForFirstChild(StepIdOfCircle2);
            int       StepIdOfCirclePoint2 = Form1.MainStorage.LookForFirstChild(StepIdOfCircleAXIS2);//读出圆心2
            TableItem temp2    = (TableItem)Form1.MainStorage.TableNode[Form1.MainStorage.LookForNode(StepIdOfCirclePoint2)];
            float     Z2_coord = (float)((CARTESIAN_POINT)temp2.node).z_coord;

            float               height                    = (float)Math.Abs(Z1_coord - Z2_coord);//求出圆柱的高度
            int                 StepIdOfAxis3             = Form1.MainStorage.LookForFirstChild((int)StepIdOfBound[2]);
            ArrayList           all_child                 = Form1.MainStorage.LookForChild(StepIdOfAxis3);
            int                 StepIdOfCircleCenter      = (int)all_child[0]; //找到底面中心索引
            int                 StepIdOfCylinderDirection = (int)all_child[1]; //找到方向索引
            TableItem           Cylinder                  = (TableItem)Form1.MainStorage.TableNode[Form1.MainStorage.LookForNode((int)StepIdOfBound[2])];
            CYLINDRICAL_SURFACE Cylinder_obj              = (CYLINDRICAL_SURFACE)Cylinder.node;
            float               radius                    = (float)Cylinder_obj.radius;
            //读出底面的
            //从STEP文件编号中中实例化出信息
            TableItem       TEMP_CYL        = (TableItem)(Form1.MainStorage.TableNode[Form1.MainStorage.LookForNode(StepIdOfCircleCenter)]);
            CARTESIAN_POINT Cylinder_center = (CARTESIAN_POINT)TEMP_CYL.node;
            TableItem       TEMP_CYL_DIR    = (TableItem)(Form1.MainStorage.TableNode[Form1.MainStorage.LookForNode(StepIdOfCylinderDirection)]);
            DIRECTION       Cylinder_dir    = (DIRECTION)TEMP_CYL_DIR.node;

            STLDirection dir_temp;
            STLDirection dir_temp2;
            STLPoint     point1;
            STLPoint     point2;
            STLPoint     point3;
            STLTriangle  temp_tri1;
            STLPoint     point4;
            STLTriangle  temp_tri2;

            //条件判断,如果符合一定的特殊情况,那么就开始执行三角剖分
            if ((Cylinder_dir.x_dir == 0) && (Cylinder_dir.y_dir == 0) && (Cylinder_dir.z_dir > 0))
            {
                for (int i = 0; i < CircleDivision; ++i)
                {
                    //建立方向
                    dir_temp       = new STLDirection();
                    dir_temp.x_dir = (float)Cylinder_center.x_coord + radius * (float)Math.Cos(0.5 * (2 * Math.PI * (i / (float)CircleDivision) + 2 * Math.PI * ((i + 1) / (float)CircleDivision)));
                    dir_temp.y_dir = (float)Cylinder_center.y_coord + radius * (float)Math.Sin(0.5 * (2 * Math.PI * (i / (float)CircleDivision) + 2 * Math.PI * ((i + 1) / (float)CircleDivision)));
                    dir_temp.z_dir = (float)Cylinder_center.z_coord;

                    //以下部分建立第一个三角形
                    //建立第一个点
                    point1   = new STLPoint();
                    point1.x = (float)Cylinder_center.x_coord + radius * (float)Math.Cos(2 * Math.PI * (i / (float)CircleDivision));
                    point1.y = (float)Cylinder_center.y_coord + radius * (float)Math.Sin(2 * Math.PI * (i / (float)CircleDivision));
                    point1.z = (float)Cylinder_center.z_coord;
                    //建立第二个点
                    point2   = new STLPoint();
                    point2.x = (float)Cylinder_center.x_coord + radius * (float)Math.Cos(2 * Math.PI * ((i + 1) / (float)CircleDivision));
                    point2.y = (float)Cylinder_center.y_coord + radius * (float)Math.Sin(2 * Math.PI * ((i + 1) / (float)CircleDivision));
                    point2.z = (float)Cylinder_center.z_coord;
                    //建立第三个点
                    point3   = new STLPoint();
                    point3.x = (float)Cylinder_center.x_coord + radius * (float)Math.Cos(2 * Math.PI * (i / (float)CircleDivision));
                    point3.y = (float)Cylinder_center.y_coord + radius * (float)Math.Sin(2 * Math.PI * (i / (float)CircleDivision));
                    point3.z = (float)Cylinder_center.z_coord + height;

                    //以下部分建立第二个三角形
                    //前面有两个点可以共用,因此只用建立起一个点
                    point4   = new STLPoint();
                    point4.x = (float)Cylinder_center.x_coord + radius * (float)Math.Cos(2 * Math.PI * ((i + 1) / (float)CircleDivision));
                    point4.y = (float)Cylinder_center.y_coord + radius * (float)Math.Sin(2 * Math.PI * ((i + 1) / (float)CircleDivision));
                    point4.z = (float)Cylinder_center.z_coord + height;

                    //将点和方向插入到三角形结构体之中

                    temp_tri1         = new STLTriangle();
                    temp_tri1.Dir     = dir_temp;
                    temp_tri1.Vertex1 = point1;
                    temp_tri1.Vertex2 = point2;
                    temp_tri1.Vertex3 = point3;
                    STL_menber.Add(temp_tri1);


                    temp_tri2         = new STLTriangle();
                    temp_tri2.Dir     = dir_temp;
                    temp_tri2.Vertex1 = point3;
                    temp_tri2.Vertex2 = point4;
                    temp_tri2.Vertex3 = point2;
                    STL_menber.Add(temp_tri2);
                }
            }

            if ((Cylinder_dir.x_dir == 0) && (Cylinder_dir.y_dir > 0) && (Cylinder_dir.z_dir == 0))
            //条件判断,如果符合一定的特殊情况,那么就开始执行三角剖分
            {
                //
            }
            if ((Cylinder_dir.x_dir > 0) && (Cylinder_dir.y_dir == 0) && (Cylinder_dir.z_dir == 0))
            {
                //
            }
        }
예제 #16
0
        public void DecodeFACE_BOUND()  //解码面边界字符串
        {
            //插入线
            TableItem temp = new TableItem();

            temp.child = new ArrayList();
            StringBuilder reg = new StringBuilder(); //存储所有中间字符串
            int           i   = 0;                   //循环控制变量

            //STEPId解码
            while (!Char.IsDigit(this.str_temp[i]))//跳过无用的字符,直接找到数字
            {
                ++i;
            }
            while (Char.IsDigit(this.str_temp[i]))
            {
                reg.Append(this.str_temp[i]);
                ++i;
            }
            temp.STEPId = int.Parse(reg.ToString());
            //无孩子结点,无需解码
            //TypeFlag解码
            temp.TypeFlag = FACE_BOUND_;
            //信息节点解码
            FACE_BOUND struct_tmp = new FACE_BOUND(); //建立结构体,并将指针赋值给共用体

            reg.Clear();                              //清空字符串
            while (this.str_temp[i] != '\'')          //跳过前面的字符,直接读取有效信息
            {
                ++i;
            }
            ++i;
            //读取字符串'XX'里的属性
            while (this.str_temp[i] != '\'')
            {
                reg.Append(this.str_temp[i]);
                ++i;
            }
            struct_tmp.property = reg.ToString();
            reg.Clear();

            //读取孩子结点信息
            while (!Char.IsDigit(this.str_temp[i]))//跳过无用的字符,直接找到数字
            {
                ++i;
            }
            while (Char.IsDigit(this.str_temp[i]))
            {
                reg.Append(this.str_temp[i]);
                ++i;
            }
            temp.child.Add(int.Parse(reg.ToString()));
            reg.Clear();
            //插入方向信息
            while (this.str_temp[i] != '.')
            {
                ++i;
            }
            ++i;
            if (this.str_temp[i] == 'T')
            {
                struct_tmp.dir = true;
            }
            else
            {
                struct_tmp.dir = false;
            }
            temp.node = struct_tmp;
            //将结构体插入到向量里
            TableNode.Add(temp);
        }
예제 #17
0
        public void DecodeADVANCED_FACE()     //解码高级面字符串
        {
            //插入线
            TableItem temp = new TableItem();

            temp.child = new ArrayList();
            StringBuilder reg = new StringBuilder(); //存储所有中间字符串
            int           i   = 0;                   //循环控制变量

            //STEPId解码
            while (!Char.IsDigit(this.str_temp[i]))//跳过无用的字符,直接找到数字
            {
                ++i;
            }
            while (Char.IsDigit(this.str_temp[i]))
            {
                reg.Append(this.str_temp[i]);
                ++i;
            }
            temp.STEPId = int.Parse(reg.ToString());
            //TypeFlag解码
            temp.TypeFlag = ADVANCED_FACE_;
            //信息节点解码
            ADVANCED_FACE struct_tmp = new ADVANCED_FACE(); //建立结构体,并将指针赋值给共用体

            reg.Clear();                                    //清空字符串
            while (this.str_temp[i] != '\'')                //跳过前面的字符,直接读取有效信息
            {
                ++i;
            }
            ++i;
            //读取字符串'XX'里的属性
            while (this.str_temp[i] != '\'')
            {
                reg.Append(this.str_temp[i]);
                ++i;
            }
            struct_tmp.property = reg.ToString();
            reg.Clear();

            //读取多个子结点信息,长度不定
            while (this.str_temp[i] != '(')
            {
                ++i;
            }
            i++;
            while (this.str_temp[i] != ')')
            {
                if (!Char.IsDigit(this.str_temp[i]))
                {
                    ++i;
                }
                else if (Char.IsDigit(this.str_temp[i]) && (!Char.IsDigit(this.str_temp[i + 1])))
                {
                    reg.Append(this.str_temp[i]);
                    temp.child.Add(int.Parse(reg.ToString()));
                    reg.Clear();
                    ++i;
                }
                else
                {
                    reg.Append(this.str_temp[i]);
                    ++i;
                }
            }

            //读取最后一个孩子结点信息
            while (!Char.IsDigit(this.str_temp[i]))//跳过无用的字符,直接找到数字
            {
                ++i;
            }
            while (Char.IsDigit(this.str_temp[i]))
            {
                reg.Append(this.str_temp[i]);
                ++i;
            }
            temp.child.Add(int.Parse(reg.ToString()));
            reg.Clear();
            //插入方向信息
            while (this.str_temp[i] != '.')
            {
                ++i;
            }
            ++i;
            if (this.str_temp[i] == 'T')
            {
                struct_tmp.dir = true;
            }
            else
            {
                struct_tmp.dir = false;
            }
            temp.node = struct_tmp;
            //将结构体插入到向量里
            TableNode.Add(temp);
        }
예제 #18
0
        public int LookForFirstChildByIndex(int Index)
        {
            TableItem Temp = (TableItem)(this.TableNode[Index]);

            return((int)Temp.child[0]);
        }
예제 #19
0
        private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
        {
            int       index    = (int)treeView1.SelectedNode.Tag;
            TableItem tmp_node = (TableItem)(MainStorage.TableNode[index]);

            tableLayoutPanel1.Controls.Clear();
            Label label1 = new Label();

            label1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
            label1.TextAlign   = System.Drawing.ContentAlignment.MiddleCenter;
            label1.Text        = "StepId:";
            Label label2 = new Label();

            label2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
            label2.TextAlign   = System.Drawing.ContentAlignment.MiddleCenter;
            label2.Text        = tmp_node.STEPId.ToString();
            Label label3 = new Label();

            label3.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
            label3.TextAlign   = System.Drawing.ContentAlignment.MiddleCenter;
            label3.Text        = "类型:";
            Label label4 = new Label();

            label4.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
            label4.TextAlign   = System.Drawing.ContentAlignment.MiddleCenter;
            label4.Text        = tmp_node.GetTypeName();
            Label label5 = new Label();

            label5.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
            label5.TextAlign   = System.Drawing.ContentAlignment.MiddleCenter;
            label5.Text        = "属性字段:";
            Label label6 = new Label();

            label6.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
            label6.TextAlign   = System.Drawing.ContentAlignment.MiddleCenter;
            Label label7 = new Label();

            label7.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
            label7.TextAlign   = System.Drawing.ContentAlignment.MiddleCenter;
            Label label8 = new Label();

            label8.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
            label8.TextAlign   = System.Drawing.ContentAlignment.MiddleCenter;
            Label label9 = new Label();

            label9.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
            label9.TextAlign   = System.Drawing.ContentAlignment.MiddleCenter;
            Label label10 = new Label();

            label10.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
            label10.TextAlign   = System.Drawing.ContentAlignment.MiddleCenter;
            Label label11 = new Label();

            label11.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
            label11.TextAlign   = System.Drawing.ContentAlignment.MiddleCenter;
            Label label12 = new Label();

            label12.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
            label12.TextAlign   = System.Drawing.ContentAlignment.MiddleCenter;
            //针对不同的节点类型进行处理
            switch (tmp_node.TypeFlag)
            {
            case 1:
            {
                CARTESIAN_POINT struct_tmp = (CARTESIAN_POINT)(tmp_node.node);
                label6.Text  = struct_tmp.property;
                label7.Text  = "X坐标:";
                label8.Text  = struct_tmp.x_coord.ToString();
                label9.Text  = "Y坐标:";
                label10.Text = struct_tmp.y_coord.ToString();
                label11.Text = "Z坐标:";
                label12.Text = struct_tmp.z_coord.ToString();
            }
                ; break;

            case 2:
            {
                DIRECTION struct_tmp = (DIRECTION)(tmp_node.node);
                label6.Text  = struct_tmp.property;
                label7.Text  = "X投影分量:";
                label8.Text  = struct_tmp.x_dir.ToString();
                label9.Text  = "Y投影分量:";
                label10.Text = struct_tmp.y_dir.ToString();
                label11.Text = "Z投影分量:";
                label12.Text = struct_tmp.z_dir.ToString();
            }
                ; break;

            case 3:
            {
                VERTEX_POINT struct_tmp = (VERTEX_POINT)(tmp_node.node);
                label6.Text  = struct_tmp.property;
                label7.Text  = "";
                label8.Text  = "";
                label9.Text  = "";
                label10.Text = "";
                label11.Text = "";
                label12.Text = "";
            }
                ; break;

            case 4:
            {
                CIRCLE struct_tmp = (CIRCLE)(tmp_node.node);
                label6.Text  = struct_tmp.property;
                label7.Text  = "半径:";
                label8.Text  = struct_tmp.radius.ToString();
                label9.Text  = "";
                label10.Text = "";
                label11.Text = "";
                label12.Text = "";
            }
                ; break;

            case 5:
            {
                EDGE_CURVE struct_tmp = (EDGE_CURVE)(tmp_node.node);
                label6.Text  = struct_tmp.property;
                label7.Text  = "方向:";
                label8.Text  = struct_tmp.dir.ToString();
                label9.Text  = "";
                label10.Text = "";
                label11.Text = "";
                label12.Text = "";
            }
                ; break;

            case 6:
            {
                ORIENTED_EDGE struct_tmp = (ORIENTED_EDGE)(tmp_node.node);
                label6.Text  = struct_tmp.property;
                label7.Text  = "属性1:";
                label8.Text  = struct_tmp.flag_1;
                label9.Text  = "属性2:";
                label10.Text = struct_tmp.flag_2;
                label11.Text = "方向:";
                label12.Text = struct_tmp.dir.ToString();
            }
                ; break;

            case 7:
            {
                AXIS2_PLACEMENT_3D struct_tmp = (AXIS2_PLACEMENT_3D)(tmp_node.node);
                label6.Text  = struct_tmp.property;
                label7.Text  = "";
                label8.Text  = "";
                label9.Text  = "";
                label10.Text = "";
                label11.Text = "";
                label12.Text = "";
            }
                ; break;

            case 8:
            {
                EDGE_LOOP struct_tmp = (EDGE_LOOP)(tmp_node.node);
                label6.Text  = struct_tmp.property;
                label7.Text  = "";
                label8.Text  = "";
                label9.Text  = "";
                label10.Text = "";
                label11.Text = "";
                label12.Text = "";
            }
                ; break;

            case 9:
            {
                CYLINDRICAL_SURFACE struct_tmp = (CYLINDRICAL_SURFACE)(tmp_node.node);
                label6.Text  = struct_tmp.property;
                label7.Text  = "半径:";
                label8.Text  = struct_tmp.radius.ToString();
                label9.Text  = "";
                label10.Text = "";
                label11.Text = "";
                label12.Text = "";
            }
                ; break;

            case 10:
            {
                PLANE struct_tmp = (PLANE)(tmp_node.node);
                label6.Text  = struct_tmp.property;
                label7.Text  = "";
                label8.Text  = "";
                label9.Text  = "";
                label10.Text = "";
                label11.Text = "";
                label12.Text = "";
            }
                ; break;

            case 11:
            {
                FACE_OUTER_BOUND struct_tmp = (FACE_OUTER_BOUND)(tmp_node.node);
                label6.Text  = struct_tmp.property;
                label7.Text  = "方向:";
                label8.Text  = struct_tmp.dir.ToString();
                label9.Text  = "";
                label10.Text = "";
                label11.Text = "";
                label12.Text = "";
            }
                ; break;

            case 12:
            {
                FACE_BOUND struct_tmp = (FACE_BOUND)(tmp_node.node);
                label6.Text  = struct_tmp.property;
                label7.Text  = "方向:";
                label8.Text  = struct_tmp.dir.ToString();
                label9.Text  = "";
                label10.Text = "";
                label11.Text = "";
                label12.Text = "";
            }
                ; break;

            case 13:
            {
                ADVANCED_FACE struct_tmp = (ADVANCED_FACE)(tmp_node.node);
                label6.Text  = struct_tmp.property;
                label7.Text  = "方向:";
                label8.Text  = struct_tmp.dir.ToString();
                label9.Text  = "";
                label10.Text = "";
                label11.Text = "";
                label12.Text = "";
            }
                ; break;

            case 14:
            {
                CLOSED_SHELL struct_tmp = (CLOSED_SHELL)(tmp_node.node);
                label6.Text  = struct_tmp.property;
                label7.Text  = "";
                label8.Text  = "";
                label9.Text  = "";
                label10.Text = "";
                label11.Text = "";
                label12.Text = "";
            }
                ; break;

            case 15:
            {
                MANIFOLD_SOLID_BREP struct_tmp = (MANIFOLD_SOLID_BREP)(tmp_node.node);
                label6.Text  = struct_tmp.property;
                label7.Text  = "";
                label8.Text  = "";
                label9.Text  = "";
                label10.Text = "";
                label11.Text = "";
                label12.Text = "";
            }
                ; break;

            case 16:
            {
                ADVANCED_BREP_SHAPE_REPRESENTATION struct_tmp = (ADVANCED_BREP_SHAPE_REPRESENTATION)(tmp_node.node);
                label6.Text  = "缺省";
                label7.Text  = "";
                label8.Text  = "";
                label9.Text  = "";
                label10.Text = "";
                label11.Text = "";
                label12.Text = "";
            }
                ; break;
            }

            tableLayoutPanel1.Controls.Add(label1, 0, 0);
            tableLayoutPanel1.Controls.Add(label2, 1, 0);
            tableLayoutPanel1.Controls.Add(label3, 2, 0);
            tableLayoutPanel1.Controls.Add(label4, 3, 0);
            tableLayoutPanel1.Controls.Add(label5, 4, 0);
            tableLayoutPanel1.Controls.Add(label6, 5, 0);
            tableLayoutPanel1.Controls.Add(label7, 0, 1);
            tableLayoutPanel1.Controls.Add(label8, 1, 1);
            tableLayoutPanel1.Controls.Add(label9, 2, 1);
            tableLayoutPanel1.Controls.Add(label10, 3, 1);
            tableLayoutPanel1.Controls.Add(label11, 4, 1);
            tableLayoutPanel1.Controls.Add(label12, 5, 1);
        }
예제 #20
0
        public int LookForLastChild(int StepId)
        {
            TableItem Temp = (TableItem)(this.TableNode[LookForNode(StepId)]);

            return((int)Temp.child[Temp.child.Count - 1]);
        }