[vtkusers] Problem with SetRepresentation

paddi.m at gmx.net paddi.m at gmx.net
Sat Jan 10 21:51:01 EST 2009


Hi,


I try to use different presentations for my actors inside VTK 5.2. As an 
interactor I use the wxVTKRenderWindowInteractor. It doesn't matter 
which representation I choose I always see the whole surface (like 
SetRepresentationToSurface). But if I check my actor before adding it to 
a renderer the vtkProperty has the right value :-(

I know it should be simple - but I don't see an error...

Thanks in advance,

Patrik

vtkProp* Im_VTKUtil::BuildMesh(Im_MeshPtr theMesh)
{
	vtkProp* result = NULL;
	if (theMesh)
	{
		Im_OSUtils theHelper;
		std::string matName;

		vtkProperty* vtkMaterial = NULL;
		theMesh->CalcNormals();
		if (theMesh->GetMaterial())
			vtkMaterial = BuildMaterial(theMesh->GetMaterial(), 
theMesh->GetDisplayMode());
//			matName = theHelper.ToAscii(theMesh->GetMaterial()->GetName());
		long nbFaces = theMesh->NbFaces();
		long nbPoints = theMesh->NbVertices();

		Im_Vec3D v1;

		vtkPolyData *meshpoly = vtkPolyData::New();
		vtkPoints *points = vtkPoints::New();
		vtkCellArray *polys = vtkCellArray::New();
//		vtkFloatArray *scalars = vtkFloatArray::New();
		
		for (long i = 0; i < nbPoints; i++)
		{
			v1 = theMesh->GetVertex(i);
			points->InsertPoint(i, v1.X(), v1.Y(), v1.Z());
		}

		long i1, i2, i3;

		for (long i = 0; i < nbFaces; i++)
		{
			if (theMesh->GetFaceIndices(i1, i2, i3, i))
			{
				polys->InsertNextCell(3);
				polys->InsertCellPoint(i1);
				polys->InsertCellPoint(i2);
				polys->InsertCellPoint(i3);
			}
		}
		meshpoly->SetPoints(points);
		meshpoly->SetPolys(polys);

		vtkPolyDataNormals *normals = vtkPolyDataNormals::New();
		normals->SetInput(meshpoly);
		normals->SetFeatureAngle(60.0);

		vtkPolyDataMapper *meshMapper = vtkPolyDataMapper::New();
		meshMapper->SetInput(normals->GetOutput());

/*
		vtkPainterPolyDataMapper * meshMapper = vtkPainterPolyDataMapper::New();
		meshMapper->SetInput(normals->GetOutput());
*/
		vtkActor *meshActor = vtkActor::New();
		meshActor->SetMapper(meshMapper);
		if (NULL != vtkMaterial)
			meshActor->SetProperty(vtkMaterial);
		result = meshActor;
	}
	return result;
}

vtkProperty* Im_VTKUtil::BuildMaterial(Im_MaterialPtr theMaterial, const 
Im_Entity3D::Im_EntityDisplayMode& theDisplayMode)
{
	vtkProperty* result = NULL;
	if (theMaterial)
	{
		Im_Color tmpColor;
		result = vtkProperty::New();
		
		SetDisplayMode(result, theDisplayMode);

		tmpColor = theMaterial->GetAmbient()->GetPropertyValue();
		result->SetAmbientColor(tmpColor.GetRed(), tmpColor.GetGreen(), 
tmpColor.GetBlue());
		
		tmpColor = theMaterial->GetDiffuse()->GetPropertyValue();
		result->SetDiffuseColor(tmpColor.GetRed(), tmpColor.GetGreen(), 
tmpColor.GetBlue());
		
		tmpColor = theMaterial->GetSpecular()->GetPropertyValue();
		result->SetSpecularColor(tmpColor.GetRed(), tmpColor.GetGreen(), 
tmpColor.GetBlue());

		result->SetSpecularPower(theMaterial->GetShininess());
		result->SetOpacity(abs(1-theMaterial->GetTransparency()));

	}
	return result;
	
}

void Im_VTKUtil::SetDisplayMode(vtkProperty* theMaterial, const 
Im_Entity3D::Im_EntityDisplayMode& theDisplayMode)
{
	if (NULL != theMaterial)
	{
		switch (theDisplayMode)
		{
			case Im_Entity3D::Im_Points:
				theMaterial->SetRepresentationToPoints();
				break;
			case Im_Entity3D::Im_Box:
			case Im_Entity3D::Im_WireFrame:
				theMaterial->SetRepresentationToWireframe();
				break;
			default:
				theMaterial->SetRepresentationToSurface();
				break;
		}
	}
}

Thanks



More information about the vtkusers mailing list