/// <summary> /// 计算角度,获取对应角度最小的点 /// </summary> /// <param name='i'> /// 已经计算到第几个 /// </param> /// <param name='mid_vec2'> /// 所在点 /// </param> /// <param name='mid_array'> /// 系列点 /// </param> void CalAngle(int mid_num, Vector2 mid_vec2, ArrayList mid_array) { if (mid_array.Count > mid_num) { float fangle_pre = -180; int mark_num = -1; for (int i = mid_num; i < mid_array.Count; i++) { //内积公式倒推,求出角度。 Vector2 vec1 = new Vector2(0, 1); Vector2 vec2 = new Vector2(mid_vec2.x - ((doLableData)(mid_array[i])).vPosEnd.x, ((doLableData)(mid_array[i])).vPosEnd.y - mid_vec2.y); float fangle = (float)((vec1.x * vec2.x + vec1.y * vec2.y) / (System.Math.Sqrt(vec1.x * vec1.x + vec1.y + vec1.y) + System.Math.Sqrt(vec2.x * vec2.x + vec2.y * vec2.y))); fangle = (float)System.Math.Acos(fangle); //如果角度大于之前的,则记录,用于最后交换位置用. if (fangle > fangle_pre) { fangle_pre = fangle; mark_num = i; } } //交换当前行数与lable与最小角度的lable数据. if (mark_num != -1) { doLableData midData = (doLableData)mid_array[mid_num]; doLableData midData2 = (doLableData)mid_array[mark_num]; mid_array.RemoveAt(mid_num); mid_array.Insert(mid_num, midData2); mid_array.RemoveAt(mark_num); mid_array.Insert(mark_num, midData); } } }
/// <summary> /// 调节左右显示窗口显示到上下半个窗口. /// </summary> void adjust_show_lable_ud() { //左边窗口分上下窗口均匀显示. if (array_pos_left.Count > 0) { for (int i = 0; i < array_pos_left.Count / 2; i++) { doLableData midData = (doLableData)array_pos_left[i]; array_pos_lu.Add(midData); } for (int i = array_pos_left.Count / 2; i < array_pos_left.Count; i++) { doLableData midData = (doLableData)array_pos_left[i]; array_pos_ld.Add(midData); } } //右边窗口上下均匀显示. if (array_pos_right.Count > 0) { for (int i = 0; i < array_pos_right.Count / 2; i++) { doLableData midData = (doLableData)array_pos_right[i]; array_pos_ru.Add(midData); } for (int i = array_pos_right.Count / 2; i < array_pos_right.Count; i++) { doLableData midData = (doLableData)array_pos_right[i]; array_pos_rd.Add(midData); } } }
void show_BigPart_Lable() { GUI.Button(new Rect(100, 100, 200, 40), ((string [])((ArrayList)m_read_Tree_xls.mmenu_top_array[0])[0])[0]); GUI.Button(new Rect(Screen.width - 300, 100, 200, 40), ((string [])((ArrayList)m_read_Tree_xls.mmenu_top_array[2])[0])[0]); GUI.Button(new Rect(100, Screen.height - 200, 200, 40), ((string [])((ArrayList)m_read_Tree_xls.mmenu_top_array[3])[0])[0]); array_pos.Clear(); //开合模部分 doLableData mid_data = new doLableData(); mid_data.vPosStart = new Vector3(300, 140, 0); mid_data.vPosEnd = GameObject.Find("CameraFree").camera.WorldToScreenPoint(GameObject.Find("ZSJ_KHM_5").transform.position); mid_data.vPosEnd.y = Screen.height - mid_data.vPosEnd.y; mid_data.vPosEnd.z = 0; array_pos.Add(mid_data); //注射部分 doLableData mid_data1 = new doLableData(); mid_data1.vPosStart = new Vector3(Screen.width - 300, 140, 0); mid_data1.vPosEnd = GameObject.Find("CameraFree").camera.WorldToScreenPoint(GameObject.Find("ZSJ_Inj_2").transform.position); mid_data1.vPosEnd.y = Screen.height - mid_data1.vPosEnd.y; mid_data1.vPosEnd.z = 0; array_pos.Add(mid_data1); //注射部分 doLableData mid_data2 = new doLableData(); mid_data2.vPosStart = new Vector3(300, Screen.height - 200, 0); mid_data2.vPosEnd = GameObject.Find("CameraFree").camera.WorldToScreenPoint(GameObject.Find("ZSJ_JZ_68").transform.position); mid_data2.vPosEnd.y = Screen.height - mid_data2.vPosEnd.y; mid_data2.vPosEnd.z = 0; array_pos.Add(mid_data2); }
public void setData(doLableData other) { vPosStart = other.vPosStart; vPosEnd = other.vPosEnd; rGUIRect = other.rGUIRect; strPartName = other.strPartName; }
/// <summary> /// 调节屏幕上需要显示的标注的显示位置 /// </summary> /// <param name='mid_doData'> /// Mid_do data. /// </param> void adjust_show_lable_lr(doLableData mid_doData) { //左半屏幕 if (mid_doData.vPosEnd.x < Screen.width / 2) { array_pos_left.Add(mid_doData); } else { array_pos_right.Add(mid_doData); } }
void OnGUI() { if (FuncPara.outlineOn) { //清空历史数据; array_pos.Clear(); array_pos_ld.Clear(); array_pos_lu.Clear(); array_pos_rd.Clear(); array_pos_ru.Clear(); array_pos_left.Clear(); array_pos_right.Clear(); float distanceJudge = 1f; float measurementPara = 1.2f; if (cameraType == "Orthographic") { distanceJudge = camerafree.orthographicSize; measurementPara = orthographicPara; } else { distanceJudge = camerafree.fieldOfView; measurementPara = perspectivePara; } if (distanceJudge < measurementPara) //距离较近时 { for (int j = 0; j < m_read_Tree_xls.mmenu_top_array.Count; j++) { for (int i = 0; i < ((ArrayList)m_read_Tree_xls.mmenu_top_array[j]).Count; i++) //bumingba { string mid_str_name = ((string [])((ArrayList)m_read_Tree_xls.mmenu_top_array[j])[i])[1]; //Excel表格第三列:物体名字 if (GameObject.Find(mid_str_name).renderer.isVisible) //GUI.Button(new Rect(100,i*30,300,30),i + ":" + mid_str_name); { if (((string [])((ArrayList)m_read_Tree_xls.mmenu_top_array[j])[i])[2].Length > 3) //好像是遮挡物体字符串,一般用不到 { //Array<string> mid_array; string [] mid_array = ((string [])((ArrayList)m_read_Tree_xls.mmenu_top_array[j])[i])[2].Split((",").ToCharArray()); int k = 0; for (; k < mid_array.Length; k++) { if (GameObject.Find(mid_array[k]).renderer.material.color.a > 0.8f) { break; } } if (k == mid_array.Length) { doLableData mdoData = new doLableData(); mdoData.strPartName = ((string [])((ArrayList)m_read_Tree_xls.mmenu_top_array[j])[i])[0]; //Excel表格第三列:部件中文名字 Vector3 mid_vec = GameObject.Find("CameraFree").camera.WorldToScreenPoint(GameObject.Find(mid_str_name).transform.position); mid_vec.y = Screen.height - mid_vec.y; mid_vec.z = 0; mdoData.vPosEnd = mid_vec; adjust_show_lable_lr(mdoData); } } else //大概是没有遮挡物体的意思,一般都走这条路 { doLableData mdoData = new doLableData(); mdoData.strPartName = ((string [])((ArrayList)m_read_Tree_xls.mmenu_top_array[j])[i])[0]; Vector3 mid_vec = GameObject.Find("CameraFree").camera.WorldToScreenPoint(GameObject.Find(mid_str_name).transform.position); mid_vec.y = Screen.height - mid_vec.y; mid_vec.z = 0; mdoData.vPosEnd = mid_vec; adjust_show_lable_lr(mdoData); } } } } } else //远距离所有都显示 { for (int i = 0; i < m_read_Tree_xls.mmenu_top_array.Count; i++) { string mid_str_name = ((string [])((ArrayList)m_read_Tree_xls.mmenu_top_array[i])[0])[1]; //Excel表格第三列:物体名字 if (GameObject.Find(mid_str_name).renderer.isVisible) { doLableData mdoData = new doLableData(); mdoData.strPartName = ((string [])((ArrayList)m_read_Tree_xls.mmenu_top_array[i])[0])[0]; Vector3 mid_vec = GameObject.Find("CameraFree").camera.WorldToScreenPoint(GameObject.Find(((string[])((ArrayList)m_read_Tree_xls.mmenu_top_array[i])[0])[1]).transform.position); mid_vec.y = Screen.height - mid_vec.y; mid_vec.z = 0; mdoData.vPosEnd = mid_vec; adjust_show_lable_lr(mdoData); } } //for(int i=0;i < m_read_Tree_xls.mmenu_top_array.Count; i++) //{} //显示大结构, //show_BigPart_Lable(); } //排序 mySortCompare msort = new mySortCompare(); array_pos_left.Sort(msort); array_pos_right.Sort(msort); //调节显示lable,上下. adjust_show_lable_ud(); mySortCompare1 msort1 = new mySortCompare1(); array_pos_lu.Sort(msort1); array_pos_ld.Sort(msort1); array_pos_ru.Sort(msort1); array_pos_rd.Sort(msort1); ftime += Time.deltaTime; //给array排序. if (ftime > 0.2f) { array_sort(); //防止两个lable重叠; ajust_angle_sort(); //防止线闯过另外一个lable //ajust_pos_line(); } //显示标注; LabelDisplay(); } }