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); } } } }
void Test2() { int xmin = 0; int xlength = 1000; int xmax = xmin + xlength; int ymin = 0; int ylength = 1000; int ymax = ymin + ylength; #region 定义显示的rectActor 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); #endregion vtkSphereSource sphere = vtkSphereSource.New(); vtkPolyDataMapper sphereMapper = vtkPolyDataMapper.New(); sphereMapper.SetInputConnection(sphere.GetOutputPort()); // sphereMapper.SetImmediateModeRendering(1); vtkActor sphereActor = vtkActor.New(); sphereActor.SetMapper(sphereMapper); vtkIdFilter ids = vtkIdFilter.New(); ids.SetInputConnection(sphere.GetOutputPort()); ids.PointIdsOn(); ids.CellIdsOn(); ids.FieldDataOn(); #region 设置要显示的点的及其label vtkSelectVisiblePoints visPts = vtkSelectVisiblePoints.New(); visPts.SetInputConnection(ids.GetOutputPort()); visPts.SetRenderer(m_render); visPts.SelectionWindowOn(); visPts.SetSelection(xmin, xmin + xlength, ymin, ymin + ylength); vtkLabeledDataMapper pointsMapper = vtkLabeledDataMapper.New(); pointsMapper.SetInputConnection(visPts.GetOutputPort()); pointsMapper.SetLabelModeToLabelFieldData(); pointsMapper.GetLabelTextProperty().SetColor(0, 255, 0); pointsMapper.GetLabelTextProperty().BoldOff(); vtkActor2D pointLabels = vtkActor2D.New(); pointLabels.SetMapper(pointsMapper); #endregion #region 设置要显示的cell的id及其label vtkCellCenters cc = vtkCellCenters.New(); cc.SetInputConnection(ids.GetOutputPort()); vtkSelectVisiblePoints visCells = vtkSelectVisiblePoints.New(); visCells.SetInputConnection(cc.GetOutputPort()); visCells.SetRenderer(m_render); visCells.SelectionWindowOn(); visCells.SetSelection(xmin, xmin + xlength, ymin, ymin + ylength); ///显示每个Cell的id vtkLabeledDataMapper cellMapper = vtkLabeledDataMapper.New(); cellMapper.SetInputConnection(visCells.GetOutputPort()); cellMapper.SetLabelModeToLabelFieldData(); cellMapper.GetLabelTextProperty().SetColor(255, 0, 0); vtkActor2D cellLabels = vtkActor2D.New(); cellLabels.SetMapper(cellMapper); #endregion m_render.AddActor(sphereActor); m_render.AddActor2D(rectActor); m_render.AddActor2D(pointLabels); // m_render.AddActor2D(cellLabels); }