diff --git a/src/Cxx/GeometricObjects/ParametricKuenDemo.cxx b/src/Cxx/GeometricObjects/ParametricKuenDemo.cxx index 69c88061fd4d692fa5e4238db59b924d45804ea0..d859b63dc8e132a03538a0330d4547e9b00a923a 100644 --- a/src/Cxx/GeometricObjects/ParametricKuenDemo.cxx +++ b/src/Cxx/GeometricObjects/ParametricKuenDemo.cxx @@ -1,20 +1,18 @@ -#include <vtkSmartPointer.h> - -#include <vtkParametricKuen.h> -#include <vtkParametricFunctionSource.h> - -#include <vtkCamera.h> -#include <vtkPolyDataMapper.h> #include <vtkActor.h> #include <vtkActor2D.h> +#include <vtkCamera.h> +#include <vtkMath.h> +#include <vtkNamedColors.h> +#include <vtkParametricFunctionSource.h> +#include <vtkParametricKuen.h> +#include <vtkPolyDataMapper.h> #include <vtkProperty.h> -#include <vtkRenderWindow.h> #include <vtkRenderer.h> +#include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> -#include <vtkMath.h> - -#include <vtkSliderWidget.h> #include <vtkSliderRepresentation2D.h> +#include <vtkSliderWidget.h> +#include <vtkSmartPointer.h> // These callbacks do the actual work. // Callbacks for the interactions @@ -112,6 +110,22 @@ public: int main(int, char *[]) { + vtkSmartPointer<vtkNamedColors> colors = + vtkSmartPointer<vtkNamedColors>::New(); + + // Set the background color. + auto SetColor = [&colors](std::array<double, 3>& v, + std::string const& colorName) { + auto const scaleFactor = 256.0; + std::transform(std::begin(v), std::end(v), std::begin(v), + [=](double const& n) { return n / scaleFactor; }); + colors->SetColor(colorName, v.data()); + return; + }; + std::array<double, 3> bkg{{51, 77, 102}}; + // std::array<double, 3> bkg{{26, 51, 77}}; + SetColor(bkg, "BkgColor"); + vtkSmartPointer<vtkParametricKuen> surface = vtkSmartPointer<vtkParametricKuen>::New(); vtkSmartPointer<vtkParametricFunctionSource> source = @@ -126,7 +140,7 @@ int main(int, char *[]) vtkSmartPointer<vtkProperty> backProperty = vtkSmartPointer<vtkProperty>::New(); - backProperty->SetColor(1.0000, 0.3882, 0.2784); + backProperty->SetColor(colors->GetColor3d("Tomato").GetData()); // Create a parametric function source, renderer, mapper, and actor source->SetParametricFunction(surface); @@ -135,16 +149,17 @@ int main(int, char *[]) actor->SetMapper(mapper); actor->SetBackfaceProperty(backProperty); - actor->GetProperty()->SetDiffuseColor(0.8900, 0.8100, 0.3400); + actor->GetProperty()->SetDiffuseColor(colors->GetColor3d("Banana").GetData()); actor->GetProperty()->SetSpecular(.5); actor->GetProperty()->SetSpecularPower(20); vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); + renderWindow->SetWindowName("Parametric Kuen Demonstration"); renderWindow->AddRenderer(renderer); renderWindow->SetSize(640,480); renderer->AddActor(actor); - renderer->SetBackground(.2, .3, .4); + renderer->SetBackground(colors->GetColor3d("BkgColor").GetData()); renderer->ResetCamera(); renderer->GetActiveCamera()->Azimuth(30); renderer->GetActiveCamera()->Elevation(-30); diff --git a/src/Python.md b/src/Python.md index ab2ed3a38637cfc7e1b87db5497eeb09378e4dd9..29a5353315164f48fed7eba186afb175c3dce7cc 100644 --- a/src/Python.md +++ b/src/Python.md @@ -145,6 +145,7 @@ It would be appreciated if there are any Python VTK experts who could convert an | Example Name | Classes Demonstrated | Description | Image | | -------------- | ---------------------- | ------------- | ------- | +[ParametricKuenDemo](/Python/GeometricObjects/ParametricKuenDemo) | vtkParametricKuen | Interactively change the parameters for a Kuen Surface. [ParametricObjects](/Python/GeometricObjects/ParametricObjects) | | Uncomment the object that you wish to be displayed. [ParametricObjectsDemo](/Python/GeometricObjects/ParametricObjectsDemo) | vtkParametricBoy vtkParametricConicSpiral vtkParametricCrossCap vtkParametricDini vtkParametricEllipsoid vtkParametricEnneper vtkParametricFigure8Klein vtkParametricKlein vtkParametricMobius vtkParametricRandomHills vtkParametricRoman vtkParametricSpline vtkParametricSuperEllipsoid vtkParametricSuperToroid vtkParametricTorus | Demonstration of of the vtkParametric classes added by Andrew Maclean. All the objects are displayed in a 4X4 array. [ParametricObjectsDemo2](/Python/GeometricObjects/ParametricObjectsDemo2) | vtkParametricBohemianDome vtkParametricBour vtkParametricCatalanMinimal vtkParametricHenneberg vtkParametricKuen vtkParametricPluckerConoid vtkParametricPseudosphere | Demonstration of additional vtkParametric* classes added by Tim Meehan. All the objects are displayed in a 4X2 array. diff --git a/src/Python/GeometricObjects/ParametricKuenDemo.py b/src/Python/GeometricObjects/ParametricKuenDemo.py new file mode 100755 index 0000000000000000000000000000000000000000..8b1841ca08737df5ee33d4001225ff64f5fe5ee9 --- /dev/null +++ b/src/Python/GeometricObjects/ParametricKuenDemo.py @@ -0,0 +1,229 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import vtk + + +def main(): + colors = vtk.vtkNamedColors() + + # Set the background color. Match those in VTKTextbook.pdf. + bkg = map(lambda x: x / 256.0, [51, 77, 102]) + # bkg = map(lambda x: x / 256.0, [26, 51, 77]) + colors.SetColor("BkgColor", *bkg) + + surface = vtk.vtkParametricKuen() + source = vtk.vtkParametricFunctionSource() + + renderer = vtk.vtkRenderer() + mapper = vtk.vtkPolyDataMapper() + actor = vtk.vtkActor() + + backProperty = vtk.vtkProperty() + backProperty.SetColor(colors.GetColor3d("Tomato")) + + # Create a parametric function source, renderer, mapper, and actor + source.SetParametricFunction(surface) + + mapper.SetInputConnection(source.GetOutputPort()) + + actor.SetMapper(mapper) + actor.SetBackfaceProperty(backProperty) + actor.GetProperty().SetDiffuseColor(colors.GetColor3d("Banana")) + actor.GetProperty().SetSpecular(.5) + actor.GetProperty().SetSpecularPower(20) + + renderWindow = vtk.vtkRenderWindow() + renderWindow.SetWindowName("Parametric Kuen Demonstration") + renderWindow.AddRenderer(renderer) + renderWindow.SetSize(640, 480) + + renderer.AddActor(actor) + renderer.SetBackground(colors.GetColor3d("BkgColor")) + renderer.ResetCamera() + renderer.GetActiveCamera().Azimuth(30) + renderer.GetActiveCamera().Elevation(-30) + renderer.GetActiveCamera().Zoom(0.9) + renderer.ResetCameraClippingRange() + + interactor = vtk.vtkRenderWindowInteractor() + interactor.SetRenderWindow(renderWindow) + + # Setup a slider widget for each varying parameter + tubeWidth = 0.004 + sliderLength = 0.004 + titleHeight = 0.02 + labelHeight = 0.02 + + sliderRepMinimumU = vtk.vtkSliderRepresentation2D() + + sliderRepMinimumU.SetMinimumValue(-4.5) + sliderRepMinimumU.SetMaximumValue(4.5) + sliderRepMinimumU.SetValue(-4.5) + sliderRepMinimumU.SetTitleText("U min") + + sliderRepMinimumU.GetPoint1Coordinate().SetCoordinateSystemToNormalizedDisplay() + sliderRepMinimumU.GetPoint1Coordinate().SetValue(.1, .1) + sliderRepMinimumU.GetPoint2Coordinate().SetCoordinateSystemToNormalizedDisplay() + sliderRepMinimumU.GetPoint2Coordinate().SetValue(.9, .1) + + sliderRepMinimumU.SetTubeWidth(tubeWidth) + sliderRepMinimumU.SetSliderLength(sliderLength) + sliderRepMinimumU.SetTitleHeight(titleHeight) + sliderRepMinimumU.SetLabelHeight(labelHeight) + + sliderWidgetMinimumU = vtk.vtkSliderWidget() + sliderWidgetMinimumU.SetInteractor(interactor) + sliderWidgetMinimumU.SetRepresentation(sliderRepMinimumU) + sliderWidgetMinimumU.SetAnimationModeToAnimate() + sliderWidgetMinimumU.EnabledOn() + + sliderWidgetMinimumU.AddObserver('InteractionEvent', SliderCallbackMinimumU(surface)) + + sliderRepMaximumU = vtk.vtkSliderRepresentation2D() + + sliderRepMaximumU.SetMinimumValue(-4.5) + sliderRepMaximumU.SetMaximumValue(4.5) + sliderRepMaximumU.SetValue(4.5) + sliderRepMaximumU.SetTitleText("U max") + + sliderRepMaximumU.GetPoint1Coordinate().SetCoordinateSystemToNormalizedDisplay() + sliderRepMaximumU.GetPoint1Coordinate().SetValue(.1, .9) + sliderRepMaximumU.GetPoint2Coordinate().SetCoordinateSystemToNormalizedDisplay() + sliderRepMaximumU.GetPoint2Coordinate().SetValue(.9, .9) + + sliderRepMaximumU.SetTubeWidth(tubeWidth) + sliderRepMaximumU.SetSliderLength(sliderLength) + sliderRepMaximumU.SetTitleHeight(titleHeight) + sliderRepMaximumU.SetLabelHeight(labelHeight) + + sliderWidgetMaximumU = vtk.vtkSliderWidget() + sliderWidgetMaximumU.SetInteractor(interactor) + sliderWidgetMaximumU.SetRepresentation(sliderRepMaximumU) + sliderWidgetMaximumU.SetAnimationModeToAnimate() + sliderWidgetMaximumU.EnabledOn() + + sliderWidgetMaximumU.AddObserver('InteractionEvent', SliderCallbackMaximumU(surface)) + + sliderRepMinimumV = vtk.vtkSliderRepresentation2D() + + sliderRepMinimumV.SetMinimumValue(0.05) + sliderRepMinimumV.SetMaximumValue(vtk.vtkMath.Pi()) + sliderRepMinimumV.SetValue(0.0) + sliderRepMinimumV.SetTitleText("V min") + + sliderRepMinimumV.GetPoint1Coordinate().SetCoordinateSystemToNormalizedDisplay() + sliderRepMinimumV.GetPoint1Coordinate().SetValue(.1, .1) + sliderRepMinimumV.GetPoint2Coordinate().SetCoordinateSystemToNormalizedDisplay() + sliderRepMinimumV.GetPoint2Coordinate().SetValue(.1, .9) + + sliderRepMinimumV.SetTubeWidth(tubeWidth) + sliderRepMinimumV.SetSliderLength(sliderLength) + sliderRepMinimumV.SetTitleHeight(titleHeight) + sliderRepMinimumV.SetLabelHeight(labelHeight) + + sliderWidgetMinimumV = vtk.vtkSliderWidget() + sliderWidgetMinimumV.SetInteractor(interactor) + sliderWidgetMinimumV.SetRepresentation(sliderRepMinimumV) + sliderWidgetMinimumV.SetAnimationModeToAnimate() + sliderWidgetMinimumV.EnabledOn() + + sliderWidgetMinimumV.AddObserver(vtk.vtkCommand.InteractionEvent, SliderCallbackMinimumV(surface)) + + sliderRepMaximumV = vtk.vtkSliderRepresentation2D() + + sliderRepMaximumV.SetMinimumValue(0.05) + sliderRepMaximumV.SetMaximumValue(vtk.vtkMath.Pi() - .05) + sliderRepMaximumV.SetValue(vtk.vtkMath.Pi()) + sliderRepMaximumV.SetTitleText("V max") + + sliderRepMaximumV.GetPoint1Coordinate().SetCoordinateSystemToNormalizedDisplay() + sliderRepMaximumV.GetPoint1Coordinate().SetValue(.9, .1) + sliderRepMaximumV.GetPoint2Coordinate().SetCoordinateSystemToNormalizedDisplay() + sliderRepMaximumV.GetPoint2Coordinate().SetValue(.9, .9) + sliderRepMaximumV.SetTubeWidth(tubeWidth) + sliderRepMaximumV.SetSliderLength(sliderLength) + sliderRepMaximumV.SetTitleHeight(titleHeight) + sliderRepMaximumV.SetLabelHeight(labelHeight) + + sliderWidgetMaximumV = vtk.vtkSliderWidget() + sliderWidgetMaximumV.SetInteractor(interactor) + sliderWidgetMaximumV.SetRepresentation(sliderRepMaximumV) + sliderWidgetMaximumV.SetAnimationModeToAnimate() + sliderWidgetMaximumV.EnabledOn() + + sliderWidgetMaximumV.AddObserver(vtk.vtkCommand.InteractionEvent, SliderCallbackMaximumV(surface)) + + surface.SetMinimumU(-4.5) + surface.SetMaximumU(4.5) + surface.SetMinimumV(0.05) + surface.SetMaximumV(vtk.vtkMath.Pi() - .05) + + renderer.ResetCamera() + renderer.GetActiveCamera().Azimuth(30) + renderer.GetActiveCamera().Elevation(-30) + renderer.GetActiveCamera().Zoom(0.9) + renderer.ResetCameraClippingRange() + renderWindow.Render() + + interactor.Initialize() + + interactor.Start() + + +# These callbacks do the actual work. +# Callbacks for the interactions +class SliderCallbackMinimumU(object): + def __init__(self, kuen): + self.kuen = kuen + + def __call__(self, caller, ev): + sliderWidget = caller + value = sliderWidget.GetRepresentation().GetValue() + if value > 0.9 * self.kuen.GetMaximumU(): + value = 0.99 * self.kuen.GetMaximumU() + sliderWidget.GetRepresentation().SetValue(value) + self.kuen.SetMinimumU(value) + + +class SliderCallbackMaximumU(object): + def __init__(self, kuen): + self.kuen = kuen + + def __call__(self, caller, ev): + sliderWidget = caller + value = sliderWidget.GetRepresentation().GetValue() + if value < self.kuen.GetMinimumU() + .01: + value = self.kuen.GetMinimumU() + .01 + sliderWidget.GetRepresentation().SetValue(value) + self.kuen.SetMaximumU(value) + + +class SliderCallbackMinimumV(object): + def __init__(self, kuen): + self.kuen = kuen + + def __call__(self, caller, ev): + sliderWidget = caller + value = sliderWidget.GetRepresentation().GetValue() + if value > 0.9 * self.kuen.GetMaximumV(): + value = 0.99 * self.kuen.GetMaximumV() + sliderWidget.GetRepresentation().SetValue(value) + self.kuen.SetMinimumV(value) + + +class SliderCallbackMaximumV(object): + def __init__(self, kuen): + self.kuen = kuen + + def __call__(self, caller, ev): + sliderWidget = caller + value = sliderWidget.GetRepresentation().GetValue() + if value < self.kuen.GetMinimumV() + .01: + value = self.kuen.GetMinimumV() + .01 + sliderWidget.GetRepresentation().SetValue(value) + self.kuen.SetMaximumV(value) + + +if __name__ == '__main__': + main()