/// <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 = "图标生成结束."; }
/// <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()); } } }
/// <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中 }
/// <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; } }