private void RemoveSameAlignData(List <AlignData> alignDatas) { IList <UILineInfo> lines = cachedTextGenerator.lines; List <AlignData> removeAlignDatas = new List <AlignData>(); for (int i = 0; i < alignDatas.Count; i++) { AlignData alignData = alignDatas[i]; for (int j = 0; j < lines.Count; j++) { UILineInfo lInfo = lines[j]; if (lInfo.startCharIdx <= alignData.startCharIndex) { alignData.lineIndex = j; alignData.lineStartCharIndex = lInfo.startCharIdx; if (j == lines.Count - 1) { if (alignData.startCharIndex > cachedTextGenerator.characterCountVisible) { removeAlignDatas.Add(alignData); } else { alignData.lineEndCharIndex = cachedTextGenerator.characterCountVisible; } } } else { alignData.lineEndCharIndex = lInfo.startCharIdx - 1; break; } } alignDatas[i] = alignData; } List <int> lineList = new List <int>(); for (int i = 0; i < alignDatas.Count; i++) { AlignData alignData = alignDatas[i]; //Debug.Log("alignData.lineIndex :" + alignData.lineIndex); if (lineList.Contains(alignData.lineIndex)) { removeAlignDatas.Add(alignData); continue; } else { lineList.Add(alignData.lineIndex); } } for (int i = 0; i < removeAlignDatas.Count; i++) { alignDatas.Remove(removeAlignDatas[i]); } }
public static void GetEnergies(AlignData data1, IList <Vector> coords2 , out double pot_rmsd, out double pot_enrg, out double pot_enrg_full, out double pot_enrg_anisou , Pdb pdb2 = null , string pdb2outpath = null ) { Anisou[] anisous1;// = data1.GetAnisous(); double[] bfactor1; { List <Mode> modes = new List <Mode>(data1.GetModes()); for (int i = 0; i < 6; i++) { modes.RemoveAt(0); } bfactor1 = HBioinfo.GetBFactor(modes.ToArray(), data1.masses); HDebug.Assert(data1.size == bfactor1.Length); anisous1 = Anisou.FromBFactor(bfactor1, scale: 10000 * 1000); } //Trans3 trans = MinAnisou.GetTrans(data1.coords, anisous1, coords2); Trans3 trans = GetTrans(data1.coords, bfactor1, coords2); List <Vector> coords2trans = new List <Vector>(trans.GetTransformed(coords2)); if (pdb2 != null && pdb2outpath != null) { data1.pdb.ToFile(pdb2outpath, coords2trans, anisous: anisous1.GetUs()); } pot_rmsd = data1.GetRmsdFrom(coords2trans); pot_enrg = data1.GetEnergyFromDiag(coords2trans); pot_enrg_full = data1.GetEnergyFromFull(coords2trans); pot_enrg_anisou = data1.GetEnergyFromAnisou(coords2trans); }
// This updates the dragging private void Update() { snaptocardinaldirection = (General.Interface.ShiftState && General.Interface.AltState); //mxd snaptogrid = (snaptocardinaldirection || General.Interface.ShiftState ^ General.Interface.SnapToGrid); snaptonearest = General.Interface.CtrlState; snaptogridincrement = (!snaptocardinaldirection && General.Interface.AltState); //mxd //mxd. Snap to nearest linedef if (selectedthings.Count == 1 && snaptonearest && !snaptocardinaldirection && Thing.AlignableRenderModes.Contains(dragitem.RenderMode) && MoveThingsRelative(mousemappos - dragstartmappos, snaptogrid, snaptogridincrement, false, false)) { Linedef l = General.Map.Map.NearestLinedefRange(oldpositions[0] + mousemappos - dragstartmappos, BuilderPlug.Me.StitchRange / renderer.Scale); bool restoresettings = false; if (aligndata == null) { aligndata = new AlignData(dragitem); } if (l != null) { if (Tools.TryAlignThingToLine(dragitem, l)) { aligndata.Position = new PointF(dragitem.Position.x, dragitem.Position.y); aligndata.Active = true; } else if (dragitem.AngleDoom != aligndata.InitialAngle) //restore initial angle? { restoresettings = true; } } else if (dragitem.AngleDoom != aligndata.InitialAngle) //restore initial angle? { restoresettings = true; } if (restoresettings) { aligndata.Position = PointF.Empty; aligndata.Active = false; dragitem.Rotate(aligndata.InitialAngle); } UpdateRedraw(); // Redraw renderer.Present(); return; } // Move selected geometry if (MoveThingsRelative(mousemappos - dragstartmappos, snaptogrid, snaptogridincrement, snaptonearest, snaptocardinaldirection)) { // Redraw UpdateRedraw(); renderer.Present(); } }
public static AlignData FromFiles(string path_pdb, string path_hess, IList <double> masses, string cachebase = null) { AlignData data = new AlignData(); data.pdb = Pdb.FromFile(path_pdb); data.coords = data.pdb.atoms.ListCoord(); data.cachebase = cachebase; int n = data.coords.Count; { // data.hess List <string> lines = HFile.ReadLines(path_hess).ToList(); int row, col; { string[] tokens = lines[1].Split(new char[] { ' ', ',', '\t' }, StringSplitOptions.RemoveEmptyEntries); HDebug.Assert(tokens.Length == 2); row = int.Parse(tokens[0]); col = int.Parse(tokens[1]); HDebug.Assert(row == col); } HDebug.Assert(row == n * 3, col == n * 3); MatrixByArr[,] hess = new MatrixByArr[n, n]; for (int c = 0; c < n; c++) { for (int r = 0; r < n; r++) { hess[c, r] = new double[3, 3]; } } for (int c = 0; c < col; c++) { string line = lines[c + 2]; string[] tokens = line.Split(new char[] { ' ', ',', '\t' }, StringSplitOptions.RemoveEmptyEntries); HDebug.Assert(tokens.Length == row); for (int r = 0; r < row; r++) { double val = double.Parse(tokens[r]); hess[c / 3, r / 3][c % 3, r % 3] += val; hess[r / 3, c / 3][r % 3, c % 3] += val; } } for (int c = 0; c < n; c++) { for (int r = 0; r < n; r++) { hess[c, r] /= 2; } } data.hess = hess; } data.masses = masses.ToArray(); return(data); }
public static void GetEnergies(AlignData data1, IList <Vector> coords2 , out double geo_rmsd, out double geo_enrg, out double geo_enrg_full, out double geo_enrg_anisou , Pdb pdb2, string pdb2outpath ) { Trans3 trans = GetTrans(data1.coords, coords2); List <Vector> coords2trans = new List <Vector>(trans.GetTransformed(coords2).ToArray()); if (pdb2 != null && pdb2outpath != null) { pdb2.ToFile(pdb2outpath, coords2); } geo_rmsd = data1.GetRmsdFrom(coords2trans); geo_enrg = data1.GetEnergyFromDiag(coords2trans); geo_enrg_full = data1.GetEnergyFromFull(coords2trans); geo_enrg_anisou = data1.GetEnergyFromAnisou(coords2trans); }
//public static Trans3 GetTrans(IList<Vector> C1, Matrix[] anisou1, IList<Vector> C2) //{ // int size = C1.Count; // Tuple<Vector[], double[]>[] eigs1 = new Tuple<Vector[], double[]>[size]; // { // for(int i=0; i<size; i++) // { // Vector[] eigvec; // double[] eigval; // Debug.Verify(NumericSolver.Eig(anisou1[i], out eigvec, out eigval)); // { // normalize eigval and eigvec // double l; // l = eigvec[0].Dist; eigvec[0] /= l; eigval[0] *= (l*l); eigval[0] = Math.Pow(eigval[0], 2); Debug.Assert(eigval[0] >= 0); // l = eigvec[1].Dist; eigvec[1] /= l; eigval[1] *= (l*l); eigval[1] = Math.Pow(eigval[1], 2); Debug.Assert(eigval[1] >= 0); // l = eigvec[2].Dist; eigvec[2] /= l; eigval[2] *= (l*l); eigval[2] = Math.Pow(eigval[2], 2); Debug.Assert(eigval[2] >= 0); // } // { // eigval[0] = 1 / eigval[0]; // eigval[1] = 1 / eigval[1]; // eigval[2] = 1 / eigval[2]; // } // eigs1[i] = new Tuple<Vector[], double[]>(eigvec, eigval); // } // } // return GetTrans(C1, eigs1, C2); //} public static void GetEnergies(AlignData data1, IList <Vector> coords2 , out double pot_rmsd, out double pot_enrg, out double pot_enrg_full, out double pot_enrg_anisou , Pdb pdb2 = null , string pdb2outpath = null ) { Anisou[] anisous1 = data1.GetAnisous(); Trans3 trans = GetTrans(data1.coords, anisous1, coords2); List <Vector> coords2trans = new List <Vector>(trans.GetTransformed(coords2)); if (pdb2 != null && pdb2outpath != null) { pdb2.ToFile(pdb2outpath, coords2trans); } //data1.pdb.ToFile(pdb2outpath, coords2trans, anisous: anisous1.GetUs()); pot_rmsd = data1.GetRmsdFrom(coords2trans); pot_enrg = data1.GetEnergyFromDiag(coords2trans); pot_enrg_full = data1.GetEnergyFromFull(coords2trans); pot_enrg_anisou = data1.GetEnergyFromAnisou(coords2trans); }
private void RichTextAlignDataSupport(VertexHelper toFill) { if (!supportRichText) { base.OnPopulateMesh(toFill); return; } string changedText = ""; var orignText = m_Text; m_Text = DealWithTextContent(m_Text); changedText = m_Text; base.OnPopulateMesh(toFill); m_Text = orignText; IList <UILineInfo> lines = cachedTextGenerator.lines; IList <UICharInfo> characters = cachedTextGenerator.characters; Rect rectExtents = cachedTextGenerator.rectExtents; //Debug.Log("cachedTextGenerator.characterCountVisible :"+cachedTextGenerator.characterCountVisible); List <UIVertex> stream = new List <UIVertex>(); toFill.GetUIVertexStream(stream); List <AlignData> removeAlignDatas = new List <AlignData>(); for (int i = 0; i < alignDatas.Count; i++) { AlignData alignData = alignDatas[i]; for (int j = 0; j < lines.Count; j++) { UILineInfo lInfo = lines[j]; if (lInfo.startCharIdx <= alignData.startCharIndex) { alignData.lineIndex = j; alignData.lineStartCharIndex = lInfo.startCharIdx; if (j == lines.Count - 1) { if (alignData.startCharIndex > cachedTextGenerator.characterCountVisible) { removeAlignDatas.Add(alignData); } else { alignData.lineEndCharIndex = cachedTextGenerator.characterCountVisible; } } } else { alignData.lineEndCharIndex = lInfo.startCharIdx - 1; break; } } alignDatas[i] = alignData; } List <int> lineList = new List <int>(); for (int i = 0; i < alignDatas.Count; i++) { AlignData alignData = alignDatas[i]; //Debug.Log("alignData.lineIndex :" + alignData.lineIndex); if (lineList.Contains(alignData.lineIndex)) { removeAlignDatas.Add(alignData); continue; } else { lineList.Add(alignData.lineIndex); } } for (int i = 0; i < removeAlignDatas.Count; i++) { alignDatas.Remove(removeAlignDatas[i]); } //Debug.Log("alignDatas :" + alignDatas.Count); for (int i = 0; i < alignDatas.Count; i++) { AlignData alignData = alignDatas[i]; //Debug.Log("characters.Count :" + characters.Count + " stream.Count:" + stream.Count + " alignData.lineEndCharIndex:" + alignData.lineEndCharIndex); if (alignData.lineEndCharIndex >= characters.Count) { continue; } if (alignData.lineStartCharIndex >= characters.Count) { continue; } if ((alignData.lineEndCharIndex * 6) > stream.Count) { continue; } if (alignData.lineStartCharIndex * 6 >= stream.Count) { continue; } if (alignData.alignType == AlignType.Right) { UICharInfo uiChar = characters[alignData.lineEndCharIndex]; float detaMove = rectExtents.width / 2 - uiChar.cursorPos.x - uiChar.charWidth; for (int v = alignData.lineStartCharIndex * 6; v < alignData.lineEndCharIndex * 6; v++) { UIVertex ver = stream[v]; ver.position += new Vector3(detaMove, 0, 0); //ver.color = Color.red; stream[v] = ver; } } else if (alignData.alignType == AlignType.Left) { UICharInfo uiChar = characters[alignData.lineStartCharIndex]; float detaMove = (-rectExtents.width / 2) - uiChar.cursorPos.x; //Debug.Log("LLeft alignData.lineStartCharIndex:" + alignData.lineStartCharIndex + " alignData.lineEndCharIndex:" + alignData.lineEndCharIndex); for (int v = alignData.lineStartCharIndex * 6; v < alignData.lineEndCharIndex * 6; v++) { UIVertex ver = stream[v]; ver.position += new Vector3(detaMove, 0, 0); //ver.color = Color.green; stream[v] = ver; } } else if (alignData.alignType == AlignType.Center) { float lineCharLenth = 0; for (int j = alignData.lineStartCharIndex; j < alignData.lineEndCharIndex; j++) { lineCharLenth += characters[j].charWidth; } float detaMove = -lineCharLenth / 2 - characters[alignData.lineStartCharIndex].cursorPos.x; for (int v = alignData.lineStartCharIndex * 6; v < alignData.lineEndCharIndex * 6; v++) { UIVertex ver = stream[v]; ver.position += new Vector3(detaMove, 0, 0); //ver.color = Color.blue; stream[v] = ver; } } } toFill.AddUIVertexTriangleStream(stream); }
private string DealWithTextContent(string content) { alignDatas.Clear(); var temp = content; while (true) { for (int i = 0; i < temp.Length; i++) { if (temp[i] == '<') { int surplusLenth = temp.Length - i - 1; string testStr = ""; bool isResult = false; if (surplusLenth >= alignRightString.Length) { testStr = temp.Substring(i, alignRightString.Length); if (testStr == alignRightString) { isResult = true; AlignData align = new AlignData(); align.alignType = AlignType.Right; align.startCharIndex = i; alignDatas.Add(align); } } if (!isResult) { if (surplusLenth >= alignLeftString.Length) { testStr = temp.Substring(i, alignLeftString.Length); if (testStr == alignLeftString) { isResult = true; AlignData align = new AlignData(); align.alignType = AlignType.Left; align.startCharIndex = i; alignDatas.Add(align); } } } if (!isResult) { if (surplusLenth >= alignCenterString.Length) { testStr = temp.Substring(i, alignCenterString.Length); if (testStr == alignCenterString) { isResult = true; AlignData align = new AlignData(); align.alignType = AlignType.Center; align.startCharIndex = i; alignDatas.Add(align); } } } if (isResult) { temp = temp.Remove(i, testStr.Length); i = 0; } } } break; } //Debug.Log("alignDatas :" + alignDatas.Count); return(temp); }
private void RichTextAlignDataSupport(VertexHelper toFill) { if (!supportRichText) { base.OnPopulateMesh(toFill); return; } List <AlignData> alignDatas = new List <AlignData>(); //string changedText = ""; var orignText = m_Text; m_Text = DealWithTextContent(m_Text, ref alignDatas); //changedText = m_Text; base.OnPopulateMesh(toFill); m_Text = orignText; RectTransform rectTransform = GetComponent <RectTransform>(); float rangeWith = rectTransform.sizeDelta.x; IList <UICharInfo> characters = cachedTextGenerator.characters; Rect rectExtents = cachedTextGenerator.rectExtents; List <UIVertex> stream = new List <UIVertex>(); toFill.GetUIVertexStream(stream); toFill.Clear(); RemoveSameAlignData(alignDatas); for (int i = 0; i < alignDatas.Count; i++) { AlignData alignData = alignDatas[i]; //Debug.Log("characters.Count :" + characters.Count + " stream.Count:" + stream.Count + " alignData.lineEndCharIndex:" + alignData.lineEndCharIndex); if (alignData.lineEndCharIndex >= characters.Count) { continue; } if (alignData.lineStartCharIndex >= characters.Count) { continue; } if ((alignData.lineEndCharIndex * 6) > stream.Count) { continue; } if (alignData.lineStartCharIndex * 6 >= stream.Count) { continue; } int indexEnd = alignData.lineEndCharIndex * 6 - 3; int indexStart = alignData.lineStartCharIndex * 6; if (alignData.alignType == AlignType.Right) { float detaMove = rangeWith / 2 - stream[indexEnd].position.x; for (int v = alignData.lineStartCharIndex * 6; v < alignData.lineEndCharIndex * 6; v++) { UIVertex ver = stream[v]; //if (v >= ((alignData.lineEndCharIndex - 1) * 6) && v <= (alignData.lineEndCharIndex * 6)) //Debug.Log("Pos :" + ver.position); ver.position += new Vector3(detaMove, 0, 0); // ver.color = Color.red; stream[v] = ver; } } else if (alignData.alignType == AlignType.Left) { float detaMove = (-rangeWith / 2) - stream[indexStart].position.x; //Debug.Log("LLeft alignData.lineStartCharIndex:" + alignData.lineStartCharIndex + " alignData.lineEndCharIndex:" + alignData.lineEndCharIndex); for (int v = alignData.lineStartCharIndex * 6; v < alignData.lineEndCharIndex * 6; v++) { UIVertex ver = stream[v]; ver.position += new Vector3(detaMove, 0, 0); //if(v== (alignData.lineEndCharIndex * 6-1)) //ver.color = Color.green; stream[v] = ver; } } else if (alignData.alignType == AlignType.Center) { float lineCharLenth = Mathf.Abs(stream[indexEnd].position.x) + Mathf.Abs(stream[indexStart].position.x); float detaMove = (lineCharLenth) / 2 - stream[indexEnd].position.x; for (int v = alignData.lineStartCharIndex * 6; v < alignData.lineEndCharIndex * 6; v++) { UIVertex ver = stream[v]; ver.position += new Vector3(detaMove, 0, 0); //ver.color = Color.blue; stream[v] = ver; } } } toFill.AddUIVertexTriangleStream(stream); }