Example #1
0
 /// <summary>
 /// symbol的生成
 /// </summary>
 public void Generate_Symbol()
 {
     if (this.myConn == null)
     {
         MessageBox.Show("首先请选择一个数据库文件");
         return;
     }
     this.toolStripStatusLabel2.Text = "正在生成图标... ...";
     Meta_SymbolS meta_symbols = new Meta_SymbolS(this.meta_modules);//转换为描述Meta_Symbol信息
     meta_symbols.InsertIntoTable(this.myConn);//插入到Meta_SymbolMaster和meta_symboldetail中
     this.toolStripStatusLabel2.Text = "图标生成结束.";
 }
Example #2
0
        /// <summary>
        /// 文件的选择,Controlladdr的显示
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {            
            OpenFileDialog open_file_dialog = new OpenFileDialog();
            
            if (open_file_dialog.ShowDialog() == DialogResult.OK) 
            {
                this.file_path = open_file_dialog.FileName;
                this.toolStripStatusLabel1.Text = "Current File is:" + this.file_path;
                this.strConn = @"Provider=Microsoft.Jet.OLEDB.4.0;" + @"Data Source=" + this.file_path;
                this.myConn = new OleDbConnection(this.strConn);
                this.meta_modules = new Meta_ModuleS(this.myConn);
                this.meta_symbols = new Meta_SymbolS(this.meta_modules);

                string sqlStr = "SELECT DISTINCT ControllerAddress FROM Prj_Document";
                OleDbDataAdapter da = new OleDbDataAdapter(sqlStr, myConn);
                DataSet ds = new DataSet();
                da.Fill(ds);
                this.dataGridView_ControlAddr.DataSource = ds.Tables[0].DefaultView;
                foreach (DataRow row in ds.Tables[0].Rows)
                {
                    controlladdr_list.Add(row[0].ToString());
                }
            }
        }
Example #3
0
 /// <summary>
 /// 将Meta_FCMaster和Meta_FCDetail表中的内容转换到Meta_SymbolMaster和Meta_SymbolDetail表中
 /// </summary>
 /// <param name="conn">数据库连接:OleDbConnection</param>
 static public void Meta_Module_2_Meta_Symbol(OleDbConnection conn)
 {
     Meta_ModuleS meta_modules = new Meta_ModuleS(conn);//读取Meta_Module信息
     Meta_SymbolS meta_symbols = new Meta_SymbolS(meta_modules);//转换为描述Meta_Symbol信息
     meta_symbols.InsertIntoTable(conn);//插入到Meta_SymbolMaster和meta_symboldetail中
 }
Example #4
0
        /// <summary>
        /// 根据模块的连线关系,生成Cld_Signal数据
        /// 输入为:signals(从Cld_Module(开始模块)到ASignal的哈希)
        /// 输出:cld_signals(包含了所有的cld_signal信息,从objectid到 Cld_Signal对象的哈希表)
        /// </summary>
        /// <param name="meta_symbols">Meta_Symbols</param>
        public void Generate_Signal_Data(Meta_SymbolS meta_symbols)
        {
            #region 计算模块输入引脚延伸的长度
            //Cld_FCMaster id, PinName 到Asignal的哈希
            Hashtable id_name_to_asignal = Transform_Signal();

            //Cld_FCMaster id到ASignal List的哈希
            Hashtable id_to_asignal_list = new Hashtable();
            foreach (List<string> id_name_list in id_name_to_asignal.Keys)
            {
                if (id_to_asignal_list.Contains(id_name_list[0]))
                {
                    ((List<ASignal>)id_to_asignal_list[id_name_list[0]]).Add((ASignal)id_name_to_asignal[id_name_list]);
                }
                else
                {
                    List<ASignal> t = new List<ASignal>();
                    t.Add((ASignal)id_name_to_asignal[id_name_list]);
                    id_to_asignal_list[id_name_list[0]] = t;
                }
            }



            //对每一个Cld模块
            foreach (string id in id_to_asignal_list.Keys)
            {
                List<ASignal> asignal_list = (List<ASignal>)id_to_asignal_list[id];

                //表示一个cld_module_pin连线的方向 ,true means "up"  false means "down or h"

                foreach (ASignal asignal in asignal_list)
                {
                    //对每一个CLd模块的每一个输入引脚的连线进行处理


                    Cld_Module start_module = asignal.start_module;//开始模块
                    string start_pin = asignal.start_pin;//开始PinName
                    Cld_Module_Pin start_cld_pin_obj = (Cld_Module_Pin)start_module.Pins[start_pin];
                    Meta_Module meta_module = (Meta_Module)meta_modules.meta_modules[start_module.FunctionName];
                    Meta_Module_Pin start_pin_obj = meta_module.Pin_Obj_By_Pin_Name(start_pin);//开始Pin对象
                    Point start_module_point = start_module.Get_Pos();//模块的绝对位置坐标
                    Meta_SymbolMaster meta_symbol_master = (Meta_SymbolMaster)meta_symbols.meta_symbols[start_module.SymbolName];
                    Point start_pin_relative_point = (Point)meta_symbol_master.Pin_Relative_Pos[start_pin_obj];//开始点的相对坐标
                    Point start_pin_abs_point = start_module_point + start_pin_relative_point;



                    Cld_Module end_module = asignal.end_modules[0];//结束模块
                    string end_pin = asignal.end_pins[0];//结束PinName
                    Cld_Module_Pin end_cld_pin_obj = (Cld_Module_Pin)end_module.Pins[end_pin];
                    Meta_Module meta_module_end = (Meta_Module)meta_modules.meta_modules[end_module.FunctionName];
                    Meta_Module_Pin end_pin_obj = meta_module_end.Pin_Obj_By_Pin_Name(end_pin);//结束Pin对象
                    Point end_module_point = end_module.Get_Pos();//结束模块的绝对坐标
                    Meta_SymbolMaster meta_symbol_master_end = (Meta_SymbolMaster)meta_symbols.meta_symbols[end_module.SymbolName];
                    Point end_pin_relative_point = (Point)meta_symbol_master_end.Pin_Relative_Pos[end_pin_obj];//结束点的相对坐标
                    Point end_pin_abs_point = end_module_point + end_pin_relative_point;

                    if (start_pin_abs_point.y <= end_pin_abs_point.y)
                    {
                        //此Pin的连线向下
                        List<int> updown_and_pinindex = new List<int>();
                        updown_and_pinindex.Add(0);
                        updown_and_pinindex.Add(Int32.Parse(start_pin_obj.PinIndex));
                        asignal.annote = updown_and_pinindex;
                        asignal.start_pin_index = Int32.Parse(start_pin_obj.PinIndex);

                        asignal.start_direction = ASignal.DIR.DOWN;
                    }
                    else
                    {
                        //此Pin的连线向下
                        List<int> updown_and_pinindex = new List<int>();
                        updown_and_pinindex.Add(1);
                        updown_and_pinindex.Add(Int32.Parse(start_pin_obj.PinIndex));
                        asignal.annote = updown_and_pinindex;
                        asignal.start_pin_index = Int32.Parse(start_pin_obj.PinIndex);

                        asignal.start_direction = ASignal.DIR.UP;
                    }

                }
            }

            //Cld_FCMaster id到ASignal List的哈希
            Pin_length pin_length = new Pin_length(id_to_asignal_list);
            #endregion

            //最终数据库中要插入的signal的对象
            Cld_Signal temp;
            //处理每一个连线关系
            foreach (ASignal asignal in signals.data.Values)
            {
                Cld_Module start_module = asignal.start_module;//开始模块
                string start_pin = asignal.start_pin;//开始PinName
                Cld_Module_Pin start_cld_pin_obj = (Cld_Module_Pin)start_module.Pins[start_pin];
                Meta_Module meta_module = (Meta_Module)meta_modules.meta_modules[start_module.FunctionName];
                Meta_Module_Pin start_pin_obj = meta_module.Pin_Obj_By_Pin_Name(start_pin);//开始Pin对象
                Point start_module_point = start_module.Get_Pos();//模块的绝对位置坐标
                Meta_SymbolMaster meta_symbol_master = (Meta_SymbolMaster)meta_symbols.meta_symbols[start_module.SymbolName];
                Point start_pin_relative_point = (Point)meta_symbol_master.Pin_Relative_Pos[start_pin_obj];//开始点的相对坐标
                Point start_pin_abs_point = start_module_point + start_pin_relative_point;

                temp = new Cld_Signal();
                temp.ObjectID = start_module.ObjectID + "_" + start_pin;
                temp.ControllerAddress = ControllerAddr;
                temp.DocumentName = DocumentName;
                temp.SheetName = SheetName;
                temp.Name = "";
                temp.SignalType = "";
                temp.EntityBelongTo = "";

                //开始点的坐标 + { + 模块Id.pinName +} +,
                for (int i = 0; i < asignal.end_modules.Count; i++)
                {
                    Cld_Module end_module = asignal.end_modules[i];//结束模块
                    string end_pin = asignal.end_pins[i];//结束PinName
                    Cld_Module_Pin end_cld_pin_obj = (Cld_Module_Pin)end_module.Pins[end_pin];
                    Meta_Module meta_module_end = (Meta_Module)meta_modules.meta_modules[end_module.FunctionName];
                    Meta_Module_Pin end_pin_obj = meta_module_end.Pin_Obj_By_Pin_Name(end_pin);//结束Pin对象
                    Point end_module_point = end_module.Get_Pos();//结束模块的绝对坐标
                    Meta_SymbolMaster meta_symbol_master_end = (Meta_SymbolMaster)meta_symbols.meta_symbols[end_module.SymbolName];
                    Point end_pin_relative_point = (Point)meta_symbol_master_end.Pin_Relative_Pos[end_pin_obj];//结束点的相对坐标
                    Point end_pin_abs_point = end_module_point + end_pin_relative_point;

                    List<Point> line = new List<Point>();//一条线的数据
                    if (start_pin_abs_point.x - end_pin_abs_point.x < 0)
                    {
                        #region 从前到后
                        //首先判断源和目的是否在一条直线上
                        if (start_pin_abs_point.y == end_pin_abs_point.y)
                        {
                            //在一条直线上
                            start_pin_abs_point.cld_module_pin = start_cld_pin_obj;
                            line.Add(start_pin_abs_point);
                            end_pin_abs_point.cld_module_pin = end_cld_pin_obj;
                            line.Add(end_pin_abs_point);
                        }
                        else
                        {
                            //不在一条直线上,那么通过两个折点进行连接
                            Point temp_point;
                            //double layout_before_temp = end_module.line_layout_before.Next();
                            double layout_before_temp = pin_length.Get_Length(end_module.ObjectID, end_pin);
                            start_pin_abs_point.cld_module_pin = start_cld_pin_obj;
                            line.Add(start_pin_abs_point);//start
                            //第一个折点
                            temp_point = new Point();
                            temp_point.y = start_pin_abs_point.y;
                            temp_point.x = end_pin_abs_point.x - layout_before_temp;
                            temp_point.is_valid = true;
                            line.Add(temp_point);
                            //第二个折点
                            temp_point = new Point();
                            temp_point.y = end_pin_abs_point.y;
                            temp_point.x = end_pin_abs_point.x - layout_before_temp;
                            temp_point.is_valid = true;
                            line.Add(temp_point);
                            //最后的end
                            end_pin_abs_point.cld_module_pin = end_cld_pin_obj;
                            line.Add(end_pin_abs_point);
                        }
                        #endregion
                    }
                    else if (start_pin_abs_point.x - end_pin_abs_point.x == 0)
                    {
                        #region 在同一垂直方向上
                        if (start_pin_abs_point.y == end_pin_abs_point.y)
                        {
                            //在一条直线上
                            start_pin_abs_point.cld_module_pin = start_cld_pin_obj;
                            line.Add(start_pin_abs_point);
                            end_pin_abs_point.cld_module_pin = end_cld_pin_obj;
                            line.Add(end_pin_abs_point);
                        }
                        else
                        {
                            //不在一条直线上,直接相连x坐标相同
                            start_pin_abs_point.cld_module_pin = start_cld_pin_obj;
                            line.Add(start_pin_abs_point);//start

                            //最后的end
                            end_pin_abs_point.cld_module_pin = end_cld_pin_obj;
                            line.Add(end_pin_abs_point);
                        }
                        #endregion
                    }
                    else
                    {
                        #region 从后到前
                        //首先判断源和目的是否在一条水平线上
                        if (start_pin_abs_point.y == end_pin_abs_point.y)
                        {
                            //在一条水平线上
                            start_pin_abs_point.cld_module_pin = start_cld_pin_obj;
                            line.Add(start_pin_abs_point);
                            end_pin_abs_point.cld_module_pin = end_cld_pin_obj;
                            line.Add(end_pin_abs_point);
                        }
                        else
                        {
                            //不在一条水平线上,通过四个折点连接
                            if (start_module.ObjectID.Equals(end_module.ObjectID))
                            {
                                #region 开始和结束为同一个模块
                                start_pin_abs_point.cld_module_pin = start_cld_pin_obj;
                                line.Add(start_pin_abs_point);//start
                                //第一个折点
                                Point temp_point1 = new Point();
                                temp_point1.x = start_pin_abs_point.x + 30;
                                temp_point1.y = start_pin_abs_point.y;
                                temp_point1.is_valid = true;
                                line.Add(temp_point1);
                                //第二个折点
                                Point temp_point2 = new Point();
                                double upper_y = start_module_point.y - 15;
                                double lower_y = ((Meta_SymbolMaster)meta_symbols.meta_symbols[start_module.SymbolName]).Height + start_module_point.y + 15;
                                double upper_sum = start_pin_abs_point.y - upper_y + end_pin_abs_point.y - upper_y;
                                double lower_sum = lower_y - start_pin_abs_point.y + lower_y - end_pin_abs_point.y;
                                if (upper_sum > lower_sum)
                                {
                                    //第二个折点的y为lower
                                    temp_point2.x = temp_point1.x;
                                    temp_point2.y = lower_y;
                                }
                                else
                                {
                                    //第二个折点的y为upper
                                    temp_point2.x = temp_point1.x;
                                    temp_point2.y = upper_y;
                                }
                                temp_point2.is_valid = true;
                                line.Add(temp_point2);
                                //第三个折点
                                Point temp_point3 = new Point();
                                temp_point3.x = end_pin_abs_point.x - pin_length.Get_Length(end_module.ObjectID, end_pin);
                                temp_point3.y = temp_point2.y;
                                temp_point3.is_valid = true;
                                line.Add(temp_point3);
                                //第四个折点
                                Point temp_point4 = new Point();
                                temp_point4.x = temp_point3.x;
                                temp_point4.y = end_pin_abs_point.y;
                                temp_point4.is_valid = true;
                                line.Add(temp_point4);
                                //最后的end
                                end_pin_abs_point.cld_module_pin = end_cld_pin_obj;
                                line.Add(end_pin_abs_point);
                                #endregion
                            }
                            else
                            {
                                #region signal的开始和结束不为同一个模块
                                start_pin_abs_point.cld_module_pin = start_cld_pin_obj;
                                line.Add(start_pin_abs_point);//start
                                //第一个折点
                                Point temp_point1 = new Point();
                                temp_point1.x = start_pin_abs_point.x + 30;
                                temp_point1.y = start_pin_abs_point.y;
                                temp_point1.is_valid = true;
                                line.Add(temp_point1);
                                //第二个折点
                                Point temp_point2 = new Point();
                                temp_point2.x = temp_point1.x;
                                temp_point2.y = (end_pin_abs_point.y + start_pin_abs_point.y) / 2;
                                temp_point2.is_valid = true;
                                line.Add(temp_point2);
                                //第三个折点
                                Point temp_point3 = new Point();
                                temp_point3.x = end_pin_abs_point.x - pin_length.Get_Length(end_module.ObjectID, end_pin);
                                temp_point3.y = temp_point2.y;
                                temp_point3.is_valid = true;
                                line.Add(temp_point3);
                                //第四个折点
                                Point temp_point4 = new Point();
                                temp_point4.x = temp_point3.x;
                                temp_point4.y = end_pin_abs_point.y;
                                temp_point4.is_valid = true;
                                line.Add(temp_point4);
                                //最后的end
                                end_pin_abs_point.cld_module_pin = end_cld_pin_obj;
                                line.Add(end_pin_abs_point);
                                #endregion
                            }

                        }
                        #endregion
                    }

                    temp.lines.Add(line);

                }//end of foreach end_module

                //将数据进行合并,构成一个统一的数据
                temp.Data = Combine_Lines(temp.lines);

                cld_signals.data[temp.ObjectID] = temp;
            }
        }