private void LoadingAsync() { ShowMsg("Loading..."); // Thread.Sleep(5000); saveFileDialog1.InitialDirectory = Path.GetDirectoryName(openFileDialog1.FileName); saveFileDialog1.FileName = openFileDialog1.SafeFileName; this.Text = "Obj Doctor - " + Path.GetFileNameWithoutExtension(openFileDialog1.FileName); //var txt = objSrv.ReadFile(@"C:\Users\jorge\Documents\modo\triszbrush.OBJ"); //var txt = objSrv.ReadFile(@"C:\Users\jorge\Documents\modo\caja2.WaveFront"); var txt = objSrv.ReadFile(openFileDialog1.FileName); _waveFront = objSrv.ParseString(txt); objSrv.ObjGetStat(_waveFront); ShowMsg("Drawing..."); DrawStat(); var scale = objSrv.Scale(_waveFront.Max, _waveFront.Min, panel1.Width, panel1.Height, 0); int axis = comboBox1.SelectedIndex; _bitmap = objDraw.Draw(_waveFront, panel1.Width, panel1.Height, scale, axis); _waveFront.VBackup = objSrv.CloneList(_waveFront.V); // backup previous vectors. panel1.Refresh(); HideMsg(); }
private void AddVector(WaveFront waveFront, string[] line) { if (line.Length < 4) { //error, vector incorrectly defined. throw new Exception("Error in vector"); } Vector vector = new Vector(double.Parse(line[1], culture) , double.Parse(line[2], culture) , double.Parse(line[3], culture)); waveFront.V.Add(vector); }
public void ParseSave(WaveFront wave, Rescale rescale, string fileName) { var linesFinal = new List <string>(); foreach (var line in wave.Original) { if (line == "") { linesFinal.Add(line); continue; } if (line.Substring(0, 1) == "#") { // add comments. linesFinal.Add(line); continue; } var cont = line.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); var first = cont[0]; switch (first) { case "o": case "g": case "\0": case "mtllib": case "usemtl": case "s": case "f": case "vt": linesFinal.Add(line); // we do nothing break; case "v": linesFinal.Add(AddVector(cont, rescale)); //AddVector(waveFront, line); break; case "vn": linesFinal.Add(AddNormal(cont, rescale)); //waveFront.vn.Add(second); break; default: throw new Exception("Error in group type :[" + first + "]"); } } string txt = String.Join("\r\n", linesFinal); File.WriteAllText(fileName, txt); }
/// <summary> /// Obtenemos el minimo y maximo. /// </summary> /// <param name="waveFront"></param> public void ObjGetStat(WaveFront waveFront) { // reset waveFront.Min = new Vector(float.MaxValue, float.MaxValue, float.MaxValue); waveFront.Max = new Vector(float.MinValue, float.MinValue, float.MinValue); foreach (var v in waveFront.V) { waveFront.Min.X = (waveFront.Min.X > v.X) ? v.X : waveFront.Min.X; waveFront.Min.Y = (waveFront.Min.Y > v.Y) ? v.Y : waveFront.Min.Y; waveFront.Min.Z = (waveFront.Min.Z > v.Z) ? v.Z : waveFront.Min.Z; waveFront.Max.X = (waveFront.Max.X < v.X) ? v.X : waveFront.Max.X; waveFront.Max.Y = (waveFront.Max.Y < v.Y) ? v.Y : waveFront.Max.Y; waveFront.Max.Z = (waveFront.Max.Z < v.Z) ? v.Z : waveFront.Max.Z; } }
public WaveFront ParseString(string txt) { var lines = txt.Split(new[] { "\n" }, StringSplitOptions.None); var r = new WaveFront(); r.Original = lines.ToList(); foreach (var line in lines) { if (line == "") { continue; } var cont = line.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); var first = cont[0]; var p = line.IndexOf(" ", StringComparison.Ordinal); string second = p < 0 ? "" : line.Substring(p + 1); ParseHeader(cont, first, second, r); } return(r); }
public Bitmap Draw(WaveFront waveFront, int w, int h, double scale, int axis = 0) { if (w <= 0 || h <= 0) { w = 100; h = 100; } var bitmap = new Bitmap(w, h); var palette = new[] { Color.Blue, Color.Red, Color.DarkBlue, Color.Green, Color.SaddleBrown, Color.DarkGoldenrod }; int halfh = h / 2; int halfw = w / 2; int x = 0, y = 0; int x2 = 0, y2 = 0; FillBitmap(bitmap); double scale2 = scale / 1.5d; DrawLineInt(bitmap, halfw, 0, halfw, h, Color.Black); DrawLineInt(bitmap, 0, halfh, w, halfh, Color.Black); //var scale = Scale(WaveFront.max,WaveFront.min,w,h,axis); int numCol = -1; /* * var color = palette[0]; * foreach (var v in waveFront.v) * { * switch (axis) * { * case 0: * x = halfw+ Convert.ToInt32(v.x * scale); * y = halfh - Convert.ToInt32(v.y * scale); * break; * case 1: * x = halfw + Convert.ToInt32(v.x * scale); * y = halfh - Convert.ToInt32(v.z * scale); * break; * case 2: * x = halfw + Convert.ToInt32(v.y * scale); * y = halfh - Convert.ToInt32(v.z * scale); * break; * case 3: * x = halfw + Convert.ToInt32(v.x+(v.z/2) * scale2); * y = halfh - Convert.ToInt32(v.y+(v.z/2) * scale2); * break; * } * * bitmap.SetPixel(x,y,color); * } */ foreach (var mesh in waveFront.O) { foreach (var grupo in mesh.group) { numCol++; if (numCol >= palette.Length) { numCol = 0; } var color2 = palette[numCol]; int fCount = grupo.fg.Count; fCount = (fCount > 50000) ? 50000 : fCount; // hard limit of 50k vertexs. for (var i = 0; i < fCount; i++) { var curFace = grupo.fg[i]; var curFaceSize = curFace.f.Count; for (var ifg = 0; ifg < curFaceSize; ifg++) { int ifg1 = (ifg < curFaceSize - 1) ? ifg + 1 : 0; // we close the face var idxV1 = curFace.f[ifg]; var idxV2 = curFace.f[ifg1]; var vector = waveFront.V[idxV1.v - 1]; var vector2 = waveFront.V[idxV2.v - 1]; switch (axis) { case 0: x = Convert.ToInt32(vector.X * scale) + halfw; y = halfh - Convert.ToInt32(vector.Y * scale); x2 = Convert.ToInt32(vector2.X * scale) + halfw; y2 = halfh - Convert.ToInt32(vector2.Y * scale); break; case 1: x = Convert.ToInt32(vector.X * scale) + halfw; y = halfh - Convert.ToInt32(vector.Z * scale); x2 = Convert.ToInt32(vector2.X * scale) + halfw; y2 = halfh - Convert.ToInt32(vector2.Z * scale); break; case 2: x = Convert.ToInt32(vector.Y * scale) + halfw; y = halfh - Convert.ToInt32(vector.Z * scale); x2 = Convert.ToInt32(vector2.Y * scale) + halfw; y2 = halfh - Convert.ToInt32(vector2.Z * scale); break; case 3: x = Convert.ToInt32(vector.X + (vector.Z / 2) * scale2) + halfw; y = halfh - Convert.ToInt32(vector.Y + (vector.Z / 2) * scale2); x2 = Convert.ToInt32(vector2.X + (vector2.Z / 2) * scale2) + halfw; y2 = halfh - Convert.ToInt32(vector2.Y + (vector2.Z / 2) * scale2); break; } DrawLineInt(bitmap, x, y, x2, y2, color2); } } } } return(bitmap); }
private void ParseHeader(string[] line, string first, string second, WaveFront waveFront) { var curMesh = waveFront.O.LastOrDefault(); var curGroup = curMesh?.group.LastOrDefault(); switch (first) { case "#": waveFront.Com.Add(second); break; case "o": Mesh mesh = new Mesh(); mesh.name = second; waveFront.O.Add(mesh); //r = ObjMode.mesh; // cambiamos el modo break; case "g": Group g = new Group(); g.name = second; if (curMesh == null) { curMesh = new Mesh("Nonane " + waveFront.O.Count); waveFront.O.Add(curMesh); } curMesh.group.Add(g); //r = ObjMode.group; // cambiamos a modo grupo. break; case "vn": waveFront.Vn.Add(second); break; case "vt": waveFront.Vt.Add(second); break; case "mtllib": waveFront.Mtllib.Add(second); break; case "usemtl": waveFront.Usemtl.Add(second); break; case "s": waveFront.S.Add(second); break; case "v": AddVector(waveFront, line); break; case "f": if (curMesh == null) { curMesh = new Mesh("Nonane " + waveFront.O.Count); waveFront.O.Add(curMesh); } if (curGroup == null) { curGroup = new Group("Nonane " + curMesh.group.Count); curMesh.group.Add(curGroup); } AddFace(curGroup, line); break; case "\0": break; default: if (first.Substring(0, 1) == "#") { waveFront.Com.Add(first.Substring(1)); } else { throw new Exception("Error in group type :[" + first + "]"); } break; } }