Exemple #1
0
        void Test()
        {
            foreach (var actor in m_actorDict.Keys)
            {
                int xmin    = 0;
                int xlength = 1000;
                int xmax    = xmin + xlength;
                int ymin    = 0;
                int ylength = 1000;
                int ymax    = ymin + ylength;

                int[] pos = { xmin, xmin + xlength, ymin, ymin + ylength };
                #region RECT
                vtkPoints pts = vtkPoints.New();
                pts.InsertPoint(0, xmin, ymin, 0);
                pts.InsertPoint(1, xmax, ymin, 0);
                pts.InsertPoint(2, xmax, ymax, 0);
                pts.InsertPoint(3, xmin, ymax, 0);
                vtkCellArray rect = vtkCellArray.New();
                rect.InsertNextCell(5);
                rect.InsertCellPoint(0);
                rect.InsertCellPoint(1);
                rect.InsertCellPoint(2);
                rect.InsertCellPoint(3);
                rect.InsertCellPoint(0);
                vtkPolyData selectRect = vtkPolyData.New();
                selectRect.SetPoints(pts);
                selectRect.SetLines(rect);
                vtkPolyDataMapper2D rectMapper = vtkPolyDataMapper2D.New();
                rectMapper.SetInput(selectRect);
                vtkActor2D rectActor = vtkActor2D.New();
                rectActor.SetMapper(rectMapper);
                m_render.AddActor(rectActor);
                #endregion
                vtkIdFilter ids = vtkIdFilter.New();
                ids.SetInput(actor.GetMapper().GetInput());
                //ids.SetInputConnection( actor.GetMapper().GetOutputPort());
                ids.PointIdsOn();
                ids.FieldDataOn();

                vtkSelectVisiblePoints visPts = vtkSelectVisiblePoints.New();
                visPts.SetInput(ids.GetOutput());
                visPts.SetRenderer(m_render);
                visPts.SelectInvisibleOn();
                visPts.SelectionWindowOn();
                //visPts.SelectInvisibleOff();
                visPts.SetSelection(pos[0], pos[1], pos[2], pos[3]);

                vtkLabeledDataMapper labelMapper = vtkLabeledDataMapper.New();
                labelMapper.SetInputConnection(visPts.GetOutputPort());
                // labelMapper.SetInput(visPts.GetInput());
                labelMapper.SetLabelModeToLabelFieldData();
                vtkActor2D actor2d = vtkActor2D.New();
                actor2d.SetMapper(labelMapper);
                m_render.AddActor(actor2d);
            }
            m_render.Render();
        }
        /// <summary>
        /// 左键释放时获取选择的对象
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void m_interactor_LeftButtonReleaseEvt(vtkObject sender, vtkObjectEventArgs e)
        {
            if (m_pickTarget == ePickTarget.None)
            {
                return;
            }

            //if (m_iren.GetControlKey() != 0)
            //    m_pickBoolean = ePickBollean.Add;
            //else if (m_iren.GetShiftKey() != 0)
            //    m_pickBoolean = ePickBollean.Sub;

            m_iren.GetEventPosition(ref endx, ref endy);
            #region 点选对象
            if (m_pickMode == ePickMode.DotPickMode) //如果是点选模式
            {
                vtkCellPicker cellPicker = new vtkCellPicker();
                cellPicker.SetTolerance(0.005);
                if (0 == cellPicker.Pick(endx, endy, 0, m_renderer))
                {
                    return;  //什么都没有选到就返回
                }
                FEMActor actor = cellPicker.GetActor() as FEMActor;
                if (actor == null)
                {
                    return;
                }
                if (m_pickTarget == ePickTarget.Actor)
                {                          //如果选择对象为
                    actor.IsSelected = true;
                    m_RWCtrl.Invalidate(); //貌似必须要用这个函数,update 不行
                    OnObjectsSelected(sender, e);
                }
                else if (m_pickTarget == ePickTarget.Cell)
                {
                    int cellId = cellPicker.GetCellId();
                    actor.AddCellId(cellId, m_pickBoolean);
                    OnObjectsSelected(sender, e);
                    //if (cellId > 0)
                    //    Console.WriteLine("dotselect cellid:{0}", cellId);
                }
                else if (m_pickTarget == ePickTarget.Point)
                {
                    int pointId = cellPicker.GetPointId();
                    if (pointId != -1)
                    {
                        actor.AddPointId(pointId, m_pickBoolean);
                        OnObjectsSelected(sender, e);
                        //   Console.WriteLine("dotselect pointid:{0}", pointId);
                    }
                }
            }
            #endregion
            else if (m_pickMode == ePickMode.RectPickMode) //如果是框选
            {
                vtkAreaPicker areaPicker = new vtkAreaPicker();
                if (0 == areaPicker.AreaPick(startx, starty, endx, endy, m_renderer))
                { //如果什么也没选到就返回
                    //this.impactViewForm.ClearAllSelectCells();
                    return;
                }
                vtkProp3DCollection selectedActors = areaPicker.GetProp3Ds();
                selectedActors.InitTraversal();
                FEMActor selectedActor;
                while ((selectedActor = selectedActors.GetNextProp3D() as FEMActor) != null)
                {
                    vtkSelection     selection     = new vtkSelection();
                    vtkSelectionNode selectionNode = new vtkSelectionNode();
                    selection.AddNode(selectionNode);

                    vtkIdFilter idFilter = new vtkIdFilter();
                    idFilter.FieldDataOn();
                    idFilter.SetInput(selectedActor.GetMapper().GetInput());
                    idFilter.Update();

                    vtkExtractSelection frustum = new vtkExtractSelection();
                    frustum.SetInput(0, idFilter.GetOutput());
                    frustum.SetInput(1, selection);

                    selectionNode.Initialize();
                    selectionNode.SetContentType((int)vtkSelectionNode.SelectionContent.FRUSTUM);

                    if (m_pickTarget == ePickTarget.Cell)//如果选择的目标是cell
                    {
                        selectionNode.SetFieldType((int)vtkSelectionNode.SelectionField.CELL);
                    }
                    else if (m_pickTarget == ePickTarget.Point) //如果选择的目标是point
                    {
                        selectionNode.SetFieldType((int)vtkSelectionNode.SelectionField.POINT);
                    }

                    vtkPoints      points         = areaPicker.GetClipPoints();
                    vtkDoubleArray frustumcorners = new vtkDoubleArray();
                    frustumcorners.SetNumberOfComponents(4);
                    frustumcorners.SetNumberOfTuples(8);
                    for (int i = 0; i < 8; ++i)
                    {
                        double[] point = points.GetPoint(i);
                        frustumcorners.SetTuple4(i, point[0], point[1], point[2], 0.0);
                    }
                    selectionNode.SetSelectionList(frustumcorners);

                    frustum.Update();
                    vtkUnstructuredGrid grid = new vtkUnstructuredGrid();
                    grid = vtkUnstructuredGrid.SafeDownCast(frustum.GetOutput());
                    vtkIdTypeArray ids = null;
                    if (m_pickTarget == ePickTarget.Cell)
                    {
                        ids = vtkIdTypeArray.SafeDownCast(grid.GetCellData().GetArray("vtkOriginalCellIds"));
                        if (ids == null)
                        {
                            continue;
                        }
                        selectedActor.AddCellId(ids, m_pickBoolean);
                        OnObjectsSelected(sender, e);
                    }
                    else if (m_pickTarget == ePickTarget.Point)
                    {
                        ids = vtkIdTypeArray.SafeDownCast(grid.GetPointData().GetArray("vtkOriginalPointIds"));
                        if (ids == null)
                        {
                            continue;
                        }
                        selectedActor.AddPointId(ids, m_pickBoolean);
                        OnObjectsSelected(sender, e);
                    }
                }
            }
        }