private void createPie(SettleNode node) { GeometryModel3D model, labelmodel; MeshGeometry3D mesh; MaterialGroup mat; Model3DGroup mgmodel = new Model3DGroup(); Model3DGroup mglabel = new Model3DGroup(); double sum = node.nodes.Sum(p => p.fee); double startAngle = 0, endAngle; double radius = 1; double holeradius = 0.5 * radius, heightratio = 1; int segcount = 1; int coloridx = 0; foreach (SettleNode e0 in node.nodes) { endAngle = startAngle + e0.fee / sum * 360; segcount = (int)Math.Abs((endAngle - startAngle) * 4); mesh = Model3DHelper.genPieSlice(radius, holeradius, heightratio, startAngle, endAngle, segcount, Model3DHelper.EPieType.棱形面); mat = (MaterialGroup)this.FindResource("matslice" + (coloridx % 12).ToString()); model = new GeometryModel3D(mesh, mat); mgmodel.Children.Add(model); Vector3D vec = new Vector3D(); vec.X = 1.1 * radius * Math.Cos((startAngle + endAngle) / 2 / 180 * Math.PI); vec.Y = model.Bounds.SizeY; /// 2; vec.Z = -1.1 * radius * Math.Sin((startAngle + endAngle) / 2 / 180 * Math.PI); mesh = (MeshGeometry3D)this.FindResource("meshText"); string text = e0.nodename + ":" + (e0.fee / sum).ToString("p1"); labelmodel = Model3DHelper.genTextPanel(mesh, Brushes.White, new SolidColorBrush(darkc[coloridx % 12]), 32, text, rotationY, 0.2, vec, 0.5, 0.38); mglabel.Children.Add(labelmodel); //重新绑定旋转 AxisAngleRotation3D axis3d = new AxisAngleRotation3D(); axis3d.Axis = new Vector3D(0, 1, 0); Binding anglebind = new Binding(); anglebind.Source = rotationY; anglebind.Path = new PropertyPath(AxisAngleRotation3D.AngleProperty); anglebind.Mode = BindingMode.OneWay; anglebind.Converter = new ConverterNegative(); BindingOperations.SetBinding(axis3d, AxisAngleRotation3D.AngleProperty, anglebind); ((labelmodel.Transform as Transform3DGroup).Children[1] as RotateTransform3D).Rotation = axis3d; startAngle = endAngle; coloridx++; } mgRight.Children.Add(mgmodel); mgRight.Children.Add(mglabel); }
///<summary>初始化</summary> public void initModel() { //构建文字圆柱 //MeshGeometry3D meshtop, meshmain; //meshtop = Share.Model3DHelper.genCylinder3DTopMesh(); //meshmain = Share.Model3DHelper.genCylinder3DMainMesh(); //GeometryModel3D modeltop, modelmain; //modeltop = Share.Model3DHelper.genTextPanel2(meshtop, mbrush, Brushes.Black, 36, price.ToString("f4"), 1, false, new Thickness(0.5, 0, 0.5, 0)); //double w, h; //h = 200; //w = ((Math.PI * scaleVec.X / scaleVec.Y) * h); //bool isrotation = w / Math.PI < h; //modelmain = Share.Model3DHelper.genTextPanel2(meshmain, mbrush, Brushes.Black, 36, energy.ToString("f0"), w / h, isrotation, isrotation ? new Thickness(1.5, 0.5, 1.5, 0.5) : new Thickness(3, 0, 3, 0)); //Model3DGroup mmg = new Model3DGroup(); //mmg.Children.Add(modeltop); //mmg.Children.Add(modelmain); //zmodel = mmg; //构建圆边方柱 //MeshGeometry3D meshtop, meshmain; //meshtop = Share.Model3DHelper.genBoxTopMesh(); //meshmain = Share.Model3DHelper.genBoxMidMesh(); //GeometryModel3D modeltop, modelmain; //modeltop = Share.Model3DHelper.genTextPanel2(meshtop, mbrush, Brushes.Black, 36, price.ToString("f4"), 1, false, new Thickness(0.5, 0, 0.5, 0)); //double w, h; //h = 200; //w = ((Math.PI * scaleVec.X / scaleVec.Y) * h); //bool isrotation = w / Math.PI < h; //modelmain = Share.Model3DHelper.genTextPanel2(meshmain, mbrush, Brushes.Black, 36, energy.ToString("f0"), w / h, isrotation, isrotation ? new Thickness(1.5, 0.5, 1.5, 0.5) : new Thickness(3, 0, 3, 0)); //Model3DGroup mmg = new Model3DGroup(); //mmg.Children.Add(modeltop); //mmg.Children.Add(modelmain); //zmodel = mmg; //构建园边柱 //MeshGeometry3D meshtop = (MeshGeometry3D)Application.Current.FindResource("meshSCylTop"); //MeshGeometry3D meshmid = (MeshGeometry3D)Application.Current.FindResource("meshSCylMid"); //MaterialGroup mat = new MaterialGroup(); //mat.Children.Add(new DiffuseMaterial(mbrush)); //mat.Children.Add(new SpecularMaterial(Brushes.White, 80)); ////Vector3D basescale = new Vector3D(1.0 / meshmid.Bounds.SizeX, 1.0 / (meshmid.Bounds.SizeY+meshtop.Bounds.SizeY), 1.0 / meshmid.Bounds.SizeZ); //缩放为与常用的一致,2*2*2 //Point3D basePoint = new Point3D(meshmid.Bounds.X + meshmid.Bounds.SizeX / 2, meshmid.Bounds.Y, meshmid.Bounds.Z + meshmid.Bounds.SizeZ / 2);//底面中心 ////Vector3D zscale = new Vector3D(scaleVec.X * basescale.X, scaleVec.Y * basescale.Y, scaleVec.Z * basescale.Z); //Vector3D zscale = new Vector3D(scaleVec.X, scaleVec.Y, scaleVec.Z); //Vector3D ztranslate = absoluteTranslateVec + new Vector3D(0, 1, 0); //Transform3DGroup tg = new Transform3DGroup(); //tg.Children.Add(new ScaleTransform3D(zscale, basePoint)); //tg.Children.Add(new TranslateTransform3D(ztranslate)); //zmodel = Model3DHelper.genBoxCylModelGroup(tg, mat, meshtop, meshmid); //foreach (GeometryModel3D one in (zmodel as Model3DGroup).Children) //{ // one.SetValue(ToolTipService.ToolTipProperty, this); //} ////zmodel.SetValue(ToolTipService.ToolTipProperty, this); //构建无文字圆柱 MeshGeometry3D mesh = (MeshGeometry3D)Application.Current.FindResource("meshCyl"); MaterialGroup mat = new MaterialGroup(); mat.Children.Add(new DiffuseMaterial(mbrush)); mat.Children.Add(new SpecularMaterial(Brushes.White, 80)); zmodel = new GeometryModel3D(mesh, mat); zmodel.SetValue(ToolTipService.ToolTipProperty, this); Vector3D basescale = new Vector3D(1.0 / zmodel.Bounds.SizeX, 1.0 / zmodel.Bounds.SizeY, 1.0 / zmodel.Bounds.SizeZ); //缩放为与常用的一致,2*2*2 Point3D basePoint = new Point3D(zmodel.Bounds.X + zmodel.Bounds.SizeX / 2, zmodel.Bounds.Y, zmodel.Bounds.Z + zmodel.Bounds.SizeZ / 2);//底面中心 Vector3D zscale = new Vector3D(scaleVec.X * basescale.X, scaleVec.Y * basescale.Y, scaleVec.Z * basescale.Z); Vector3D ztranslate = absoluteTranslateVec + new Vector3D(0, -zmodel.Bounds.Y, 0); Transform3DGroup tg = new Transform3DGroup(); tg.Children.Add(new ScaleTransform3D(zscale, basePoint)); tg.Children.Add(new TranslateTransform3D(ztranslate)); zmodel.Transform = tg; MeshGeometry3D meshlabel = (MeshGeometry3D)Application.Current.FindResource("meshText"); Vector3D vecTranslate = new Vector3D(absoluteTranslateVec.X, absoluteTranslateVec.Y + zmodel.Bounds.SizeY, absoluteTranslateVec.Z); string label = nodename + "\r\n" + fee.ToString("f0"); double scale = layerScale; int rownums = MyFunction.StringContainsSubstringNums(label, "\r\n"); double temp=2;//新疆怪需求 double panelheight = 0.2 * scale * (rownums + 1) * temp; zlabel = Model3DHelper.genTextPanel(meshlabel, Brushes.Transparent, new SolidColorBrush(Colors.Yellow), 36, label, null, panelheight, vecTranslate, 0.5, 0); if (haveChild) foreach (SettleNode e0 in nodes) e0.initModel(); }