コード例 #1
0
        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);
        }
コード例 #2
0
        ///<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();
        }