For another project, please consult its home page to locate the current issue tracker.
View Issue Details [ Jump to Notes ] | [ Print ] | ||||||||
ID | Project | Category | View Status | Date Submitted | Last Update | ||||
0009132 | ParaView | Feature | public | 2009-06-10 13:54 | 2010-05-04 19:59 | ||||
Reporter | Ken Moreland | ||||||||
Assigned To | Ken Moreland | ||||||||
Priority | normal | Severity | minor | Reproducibility | have not tried | ||||
Status | closed | Resolution | fixed | ||||||
Platform | OS | OS Version | |||||||
Product Version | |||||||||
Target Version | 3.8 | Fixed in Version | 3.10 | ||||||
Summary | 0009132: Ability to control subdivision of quadratic faces | ||||||||
Description | Right now when you render a data set with quadratic faces, the faces are triangulated based on the midpoints given and rendered as such. Some applications might actually want the faces subdivided more (or less). There should be an option that controls how many linear faces to use to approximate the quadratic surfaces. | ||||||||
Tags | No tags attached. | ||||||||
Project | |||||||||
Topic Name | |||||||||
Type | |||||||||
Attached Files | NonlinearSubdivisions2.patch [^] (99,778 bytes) 2009-06-10 13:58 [Show Content] [Hide Content]Index: Qt/Components/pqDisplayProxyEditor.cxx =================================================================== RCS file: /cvsroot/ParaView3/ParaView3/Qt/Components/pqDisplayProxyEditor.cxx,v retrieving revision 1.74 diff -u -r1.74 pqDisplayProxyEditor.cxx --- Qt/Components/pqDisplayProxyEditor.cxx 23 Mar 2009 17:38:20 -0000 1.74 +++ Qt/Components/pqDisplayProxyEditor.cxx 8 Jun 2009 21:54:30 -0000 @@ -380,6 +380,15 @@ "value", SIGNAL(editingFinished()), reprProxy, reprProxy->GetProperty("Opacity")); + // setup of nonlinear subdivision + if (reprProxy->GetProperty("NonlinearSubdivisionLevel")) + { + this->Internal->Links->addPropertyLink( + this->Internal->NonlinearSubdivisionLevel, + "value", SIGNAL(valueChanged(int)), + reprProxy, reprProxy->GetProperty("NonlinearSubdivisionLevel")); + } + // setup for map scalars this->Internal->Links->addPropertyLink( this->Internal->ColorMapScalars, "checked", SIGNAL(stateChanged(int)), Index: Qt/Components/Resources/UI/pqDisplayProxyEditor.ui =================================================================== RCS file: /cvsroot/ParaView3/ParaView3/Qt/Components/Resources/UI/pqDisplayProxyEditor.ui,v retrieving revision 1.41 diff -u -r1.41 pqDisplayProxyEditor.ui --- Qt/Components/Resources/UI/pqDisplayProxyEditor.ui 20 Mar 2009 18:59:37 -0000 1.41 +++ Qt/Components/Resources/UI/pqDisplayProxyEditor.ui 8 Jun 2009 21:54:30 -0000 @@ -1,83 +1,72 @@ -<ui version="4.0" > +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> <class>pqDisplayProxyEditor</class> - <widget class="QWidget" name="pqDisplayProxyEditor" > - <property name="geometry" > + <widget class="QWidget" name="pqDisplayProxyEditor"> + <property name="geometry"> <rect> <x>0</x> <y>0</y> - <width>251</width> - <height>1151</height> + <width>366</width> + <height>1177</height> </rect> </property> - <property name="windowTitle" > + <property name="windowTitle"> <string>Form</string> </property> - <layout class="QVBoxLayout" > + <layout class="QVBoxLayout"> <item> - <widget class="QGroupBox" name="ViewGroup" > - <property name="title" > + <widget class="QGroupBox" name="ViewGroup"> + <property name="title"> <string>View</string> </property> - <layout class="QGridLayout" > - <property name="leftMargin" > + <layout class="QGridLayout"> + <property name="margin"> <number>6</number> </property> - <property name="topMargin" > + <property name="spacing"> <number>6</number> </property> - <property name="rightMargin" > - <number>6</number> - </property> - <property name="bottomMargin" > - <number>6</number> - </property> - <property name="horizontalSpacing" > - <number>6</number> - </property> - <property name="verticalSpacing" > - <number>6</number> - </property> - <item row="0" column="0" > - <widget class="QCheckBox" name="ViewData" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Fixed" hsizetype="Fixed" > + <item row="0" column="0"> + <widget class="QCheckBox" name="ViewData"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="toolTip" > - <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Toggle visibility of this dataset's geometry.</p></body></html></string> + <property name="toolTip"> + <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Toggle visibility of this dataset's geometry.</p></body></html></string> </property> - <property name="text" > + <property name="text"> <string>Visible</string> </property> </widget> </item> - <item row="0" column="1" > - <widget class="QPushButton" name="ViewZoomToData" > - <property name="enabled" > + <item row="0" column="1"> + <widget class="QPushButton" name="ViewZoomToData"> + <property name="enabled"> <bool>true</bool> </property> - <property name="toolTip" > - <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Change the camera location to best fit the dataset in the view window.</p></body></html></string> + <property name="toolTip"> + <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Change the camera location to best fit the dataset in the view window.</p></body></html></string> </property> - <property name="text" > + <property name="text"> <string>&Zoom To Data</string> </property> </widget> </item> - <item row="1" column="0" > - <widget class="QCheckBox" name="Selectable" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Fixed" hsizetype="Fixed" > + <item row="1" column="0"> + <widget class="QCheckBox" name="Selectable"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="toolTip" > - <string><html>Toggle the selectablity of the object. Only selectable objects can be selected using the selection mechanisms</html></string> + <property name="toolTip"> + <string><html>Toggle the selectablity of the object. Only selectable objects can be selected using the selection mechanisms</html></string> </property> - <property name="text" > + <property name="text"> <string>Selectable</string> </property> </widget> @@ -86,69 +75,48 @@ </widget> </item> <item> - <widget class="QGroupBox" name="ColorGroup" > - <property name="title" > + <widget class="QGroupBox" name="ColorGroup"> + <property name="title"> <string>Color</string> </property> - <layout class="QGridLayout" > - <property name="leftMargin" > - <number>6</number> - </property> - <property name="topMargin" > + <layout class="QGridLayout"> + <property name="margin"> <number>6</number> </property> - <property name="rightMargin" > + <property name="spacing"> <number>6</number> </property> - <property name="bottomMargin" > - <number>6</number> - </property> - <property name="horizontalSpacing" > - <number>6</number> - </property> - <property name="verticalSpacing" > - <number>6</number> - </property> - <item row="4" column="0" colspan="2" > - <widget class="QStackedWidget" name="ColorButtonStack" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Fixed" hsizetype="MinimumExpanding" > + <item row="4" column="0" colspan="2"> + <widget class="QStackedWidget" name="ColorButtonStack"> + <property name="sizePolicy"> + <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="currentIndex" > + <property name="currentIndex"> <number>0</number> </property> - <widget class="QWidget" name="ColorMapPage" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Fixed" hsizetype="MinimumExpanding" > + <widget class="QWidget" name="ColorMapPage"> + <property name="sizePolicy"> + <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <layout class="QHBoxLayout" > - <property name="spacing" > + <layout class="QHBoxLayout"> + <property name="spacing"> <number>6</number> </property> - <property name="leftMargin" > - <number>0</number> - </property> - <property name="topMargin" > - <number>0</number> - </property> - <property name="rightMargin" > - <number>0</number> - </property> - <property name="bottomMargin" > + <property name="margin"> <number>0</number> </property> <item> <spacer> - <property name="orientation" > + <property name="orientation"> <enum>Qt::Horizontal</enum> </property> - <property name="sizeHint" > + <property name="sizeHint" stdset="0"> <size> <width>0</width> <height>20</height> @@ -157,66 +125,54 @@ </spacer> </item> <item> - <widget class="QPushButton" name="EditColorMapButton" > - <property name="text" > + <widget class="QPushButton" name="EditColorMapButton"> + <property name="text"> <string>Edit Color Map...</string> </property> </widget> </item> <item> - <widget class="QPushButton" name="RescaleButton" > - <property name="text" > + <widget class="QPushButton" name="RescaleButton"> + <property name="text"> <string>Rescale to Data Range</string> </property> </widget> </item> </layout> </widget> - <widget class="QWidget" name="SolidColorPage" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Fixed" hsizetype="MinimumExpanding" > + <widget class="QWidget" name="SolidColorPage"> + <property name="sizePolicy"> + <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <layout class="QGridLayout" > - <property name="leftMargin" > - <number>0</number> - </property> - <property name="topMargin" > - <number>0</number> - </property> - <property name="rightMargin" > - <number>0</number> - </property> - <property name="bottomMargin" > + <layout class="QGridLayout"> + <property name="margin"> <number>0</number> </property> - <property name="horizontalSpacing" > + <property name="spacing"> <number>6</number> </property> - <property name="verticalSpacing" > - <number>6</number> - </property> - <item row="0" column="0" > - <widget class="pqStandardColorButton" name="ColorActorColor" > - <property name="enabled" > + <item row="0" column="0"> + <widget class="pqStandardColorButton" name="ColorActorColor"> + <property name="enabled"> <bool>true</bool> </property> - <property name="toolTip" > - <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Edit the constant color for the geometry.</p></body></html></string> + <property name="toolTip"> + <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Edit the constant color for the geometry.</p></body></html></string> </property> - <property name="text" > + <property name="text"> <string>Set Solid Color...</string> </property> </widget> </item> - <item row="0" column="1" > - <widget class="QLabel" name="label_21" > - <property name="text" > + <item row="0" column="1"> + <widget class="QLabel" name="label_21"> + <property name="text"> <string/> </property> - <property name="alignment" > + <property name="alignment"> <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set> </property> </widget> @@ -225,194 +181,173 @@ </widget> </widget> </item> - <item row="1" column="0" colspan="2" > - <widget class="QCheckBox" name="ColorMapScalars" > - <property name="enabled" > + <item row="1" column="0" colspan="2"> + <widget class="QCheckBox" name="ColorMapScalars"> + <property name="enabled"> <bool>true</bool> </property> - <property name="toolTip" > - <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Map scalars through lookup table before applying color.</p></body></html></string> + <property name="toolTip"> + <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Map scalars through lookup table before applying color.</p></body></html></string> </property> - <property name="text" > + <property name="text"> <string>Map Scalars</string> </property> </widget> </item> - <item row="0" column="0" colspan="2" > - <widget class="QCheckBox" name="ColorInterpolateScalars" > - <property name="enabled" > + <item row="0" column="0" colspan="2"> + <widget class="QCheckBox" name="ColorInterpolateScalars"> + <property name="enabled"> <bool>true</bool> </property> - <property name="toolTip" > - <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If on, scalars will be interpolated within polygons and color mapping will happen on a per-pixel basis. If off, color mapping occurs at polygon points and colors are interpolated, which is generally less accurate.</p></body></html></string> + <property name="toolTip"> + <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If on, scalars will be interpolated within polygons and color mapping will happen on a per-pixel basis. If off, color mapping occurs at polygon points and colors are interpolated, which is generally less accurate.</p></body></html></string> </property> - <property name="text" > + <property name="text"> <string>Interpolate Scalars</string> </property> </widget> </item> - <item row="3" column="1" > - <widget class="pqDisplayColorWidget" native="1" name="ColorBy" > - <property name="enabled" > + <item row="3" column="1"> + <widget class="pqDisplayColorWidget" name="ColorBy" native="true"> + <property name="enabled"> <bool>true</bool> </property> - <property name="sizePolicy" > - <sizepolicy vsizetype="Fixed" hsizetype="Minimum" > + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="toolTip" > - <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Select method for coloring dataset geometry.</p></body></html></string> + <property name="toolTip"> + <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Select method for coloring dataset geometry.</p></body></html></string> </property> </widget> </item> - <item row="3" column="0" > - <widget class="QLabel" name="label" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Preferred" hsizetype="Fixed" > + <item row="3" column="0"> + <widget class="QLabel" name="label"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="text" > + <property name="text"> <string>Color by</string> </property> </widget> </item> - <item row="2" column="0" > - <widget class="QLabel" name="TextureLabel" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Preferred" hsizetype="Fixed" > + <item row="2" column="0"> + <widget class="QLabel" name="TextureLabel"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="text" > + <property name="text"> <string>Apply Texture</string> </property> </widget> </item> - <item row="2" column="1" > - <widget class="pqTextureComboBox" name="Texture" /> + <item row="2" column="1"> + <widget class="pqTextureComboBox" name="Texture"/> </item> </layout> </widget> </item> <item> - <widget class="QGroupBox" name="SliceGroup" > - <property name="title" > + <widget class="QGroupBox" name="SliceGroup"> + <property name="title"> <string>Slice</string> </property> - <layout class="QGridLayout" > - <property name="leftMargin" > - <number>6</number> - </property> - <property name="topMargin" > - <number>6</number> - </property> - <property name="rightMargin" > - <number>6</number> - </property> - <property name="bottomMargin" > - <number>6</number> - </property> - <property name="horizontalSpacing" > + <layout class="QGridLayout"> + <property name="margin"> <number>6</number> </property> - <property name="verticalSpacing" > + <property name="spacing"> <number>6</number> </property> - <item row="0" column="0" > - <widget class="QLabel" name="label_14" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Preferred" hsizetype="Fixed" > + <item row="0" column="0"> + <widget class="QLabel" name="label_14"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="text" > + <property name="text"> <string>Slice Direction</string> </property> </widget> </item> - <item row="0" column="1" > - <widget class="QComboBox" name="SliceDirection" /> + <item row="0" column="1"> + <widget class="QComboBox" name="SliceDirection"/> </item> - <item row="1" column="0" > - <widget class="QLabel" name="label_15" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Preferred" hsizetype="Fixed" > + <item row="1" column="0"> + <widget class="QLabel" name="label_15"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="text" > + <property name="text"> <string>Slice</string> </property> </widget> </item> - <item row="1" column="1" > - <widget class="pqIntRangeWidget" native="1" name="Slice" /> + <item row="1" column="1"> + <widget class="pqIntRangeWidget" name="Slice" native="true"/> </item> </layout> </widget> </item> <item> - <widget class="QGroupBox" name="AnnotationGroup" > - <property name="title" > + <widget class="QGroupBox" name="AnnotationGroup"> + <property name="title"> <string>Annotation</string> </property> - <layout class="QGridLayout" > - <property name="leftMargin" > + <layout class="QGridLayout"> + <property name="margin"> <number>6</number> </property> - <property name="topMargin" > - <number>6</number> - </property> - <property name="rightMargin" > - <number>6</number> - </property> - <property name="bottomMargin" > - <number>6</number> - </property> - <item row="0" column="1" > - <widget class="QPushButton" name="EditCubeAxes" > - <property name="enabled" > + <item row="0" column="1"> + <widget class="QPushButton" name="EditCubeAxes"> + <property name="enabled"> <bool>false</bool> </property> - <property name="toolTip" > - <string><html>Edit properties of the cube axes </html></string> + <property name="toolTip"> + <string><html>Edit properties of the cube axes </html></string> </property> - <property name="statusTip" > - <string><html>Edit properties of the cube axes </html></string> + <property name="statusTip"> + <string><html>Edit properties of the cube axes </html></string> </property> - <property name="whatsThis" > - <string><html>Edit properties of the cube axes </html></string> + <property name="whatsThis"> + <string><html>Edit properties of the cube axes </html></string> </property> - <property name="text" > + <property name="text"> <string>Edit</string> </property> </widget> </item> - <item row="0" column="0" > - <widget class="QCheckBox" name="ShowCubeAxes" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Fixed" hsizetype="Fixed" > + <item row="0" column="0"> + <widget class="QCheckBox" name="ShowCubeAxes"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="toolTip" > - <string><html>Toggle visibility of the cube axes</html></string> + <property name="toolTip"> + <string><html>Toggle visibility of the cube axes</html></string> </property> - <property name="statusTip" > - <string><html>Toggle visibility of the cube axes</html></string> + <property name="statusTip"> + <string><html>Toggle visibility of the cube axes</html></string> </property> - <property name="whatsThis" > - <string><html>Toggle visibility of the cube axes</html></string> + <property name="whatsThis"> + <string><html>Toggle visibility of the cube axes</html></string> </property> - <property name="text" > + <property name="text"> <string>Show cube axes</string> </property> </widget> @@ -421,122 +356,110 @@ </widget> </item> <item> - <widget class="QGroupBox" name="StyleGroup" > - <property name="title" > + <widget class="QGroupBox" name="StyleGroup"> + <property name="title"> <string>Style</string> </property> - <layout class="QGridLayout" > - <property name="leftMargin" > - <number>6</number> - </property> - <property name="topMargin" > - <number>6</number> - </property> - <property name="rightMargin" > - <number>6</number> - </property> - <property name="bottomMargin" > + <layout class="QGridLayout"> + <property name="margin"> <number>6</number> </property> - <property name="horizontalSpacing" > + <property name="spacing"> <number>6</number> </property> - <property name="verticalSpacing" > - <number>6</number> - </property> - <item row="0" column="0" > - <widget class="QLabel" name="label_2" > - <property name="text" > + <item row="0" column="0"> + <widget class="QLabel" name="label_2"> + <property name="text"> <string>Representation</string> </property> - <property name="alignment" > + <property name="alignment"> <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set> </property> </widget> </item> - <item row="0" column="1" colspan="2" > - <widget class="pqDisplayRepresentationWidget" native="1" name="StyleRepresentation" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Fixed" hsizetype="Minimum" > + <item row="0" column="1" colspan="2"> + <widget class="pqDisplayRepresentationWidget" name="StyleRepresentation" native="true"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="toolTip" > - <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose what geometry should be used to represent the dataset.</p></body></html></string> + <property name="toolTip"> + <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose what geometry should be used to represent the dataset.</p></body></html></string> </property> </widget> </item> - <item row="1" column="0" colspan="3" > - <widget class="QTreeWidget" name="compositeTree" > + <item row="1" column="0" colspan="3"> + <widget class="QTreeWidget" name="compositeTree"> <column> - <property name="text" > + <property name="text"> <string>Block selection:</string> </property> </column> </widget> </item> - <item row="2" column="0" > - <widget class="QLabel" name="label_3" > - <property name="text" > + <item row="2" column="0"> + <widget class="QLabel" name="label_3"> + <property name="text"> <string>Interpolation</string> </property> </widget> </item> - <item row="2" column="1" colspan="2" > - <widget class="QComboBox" name="StyleInterpolation" > - <property name="toolTip" > - <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose the method used to shade the geometry and interpolate point attributes.</p></body></html></string> + <item row="2" column="1" colspan="2"> + <widget class="QComboBox" name="StyleInterpolation"> + <property name="toolTip"> + <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose the method used to shade the geometry and interpolate point attributes.</p></body></html></string> </property> </widget> </item> - <item row="3" column="0" > - <widget class="QLabel" name="label_13" > - <property name="text" > + <item row="3" column="0"> + <widget class="QLabel" name="label_13"> + <property name="text"> <string>Material</string> </property> </widget> </item> - <item row="3" column="1" colspan="2" > - <widget class="QComboBox" name="StyleMaterial" > + <item row="3" column="1" colspan="2"> + <widget class="QComboBox" name="StyleMaterial"> <item> - <property name="text" > + <property name="text"> <string>None</string> </property> </item> <item> - <property name="text" > + <property name="text"> <string>Browse...</string> </property> </item> </widget> </item> - <item row="4" column="0" > - <widget class="QLabel" name="label_4" > - <property name="text" > + <item row="4" column="0"> + <widget class="QLabel" name="label_4"> + <property name="text"> <string>Point size</string> </property> </widget> </item> - <item row="4" column="1" > - <widget class="QDoubleSpinBox" name="StylePointSize" > - <property name="toolTip" > - <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If your dataset contains points/verticies, this scale adjusts the diameter of the rendered points.</p></body></html></string> + <item row="4" column="1"> + <widget class="QDoubleSpinBox" name="StylePointSize"> + <property name="toolTip"> + <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If your dataset contains points/verticies, this scale adjusts the diameter of the rendered points.</p></body></html></string> </property> - <property name="minimum" > + <property name="minimum"> <double>1.000000000000000</double> </property> - <property name="maximum" > + <property name="maximum"> <double>100.000000000000000</double> </property> </widget> </item> - <item row="4" column="2" > + <item row="4" column="2"> <spacer> - <property name="orientation" > + <property name="orientation"> <enum>Qt::Horizontal</enum> </property> - <property name="sizeHint" > + <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> @@ -544,32 +467,32 @@ </property> </spacer> </item> - <item row="5" column="0" > - <widget class="QLabel" name="label_5" > - <property name="text" > + <item row="5" column="0"> + <widget class="QLabel" name="label_5"> + <property name="text"> <string>Line width</string> </property> </widget> </item> - <item row="5" column="1" > - <widget class="QDoubleSpinBox" name="StyleLineWidth" > - <property name="toolTip" > - <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If your dataset containes lines/edges, this scale adjusts the width of the rendered lines.</p></body></html></string> + <item row="5" column="1"> + <widget class="QDoubleSpinBox" name="StyleLineWidth"> + <property name="toolTip"> + <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If your dataset containes lines/edges, this scale adjusts the width of the rendered lines.</p></body></html></string> </property> - <property name="minimum" > + <property name="minimum"> <double>1.000000000000000</double> </property> - <property name="maximum" > + <property name="maximum"> <double>100.000000000000000</double> </property> </widget> </item> - <item row="5" column="2" > + <item row="5" column="2"> <spacer> - <property name="orientation" > + <property name="orientation"> <enum>Qt::Horizontal</enum> </property> - <property name="sizeHint" > + <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> @@ -577,34 +500,34 @@ </property> </spacer> </item> - <item row="6" column="0" > - <widget class="QLabel" name="label_6" > - <property name="text" > + <item row="6" column="0"> + <widget class="QLabel" name="label_6"> + <property name="text"> <string>Opacity</string> </property> </widget> </item> - <item row="6" column="1" > - <widget class="QDoubleSpinBox" name="Opacity" > - <property name="toolTip" > - <string><html>Set the opacity of the dataset's geometry. Artifacts + <item row="6" column="1"> + <widget class="QDoubleSpinBox" name="Opacity"> + <property name="toolTip"> + <string><html>Set the opacity of the dataset's geometry. Artifacts may appear in translucent geometry because primatives are not - sorted.</html></string> + sorted.</html></string> </property> - <property name="maximum" > + <property name="maximum"> <double>1.000000000000000</double> </property> - <property name="singleStep" > + <property name="singleStep"> <double>0.100000000000000</double> </property> </widget> </item> - <item row="6" column="2" > + <item row="6" column="2"> <spacer> - <property name="orientation" > + <property name="orientation"> <enum>Qt::Horizontal</enum> </property> - <property name="sizeHint" > + <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> @@ -612,66 +535,87 @@ </property> </spacer> </item> - <item row="7" column="0" > - <widget class="QLabel" name="label_19" > - <property name="text" > + <item row="8" column="0"> + <widget class="QLabel" name="label_19"> + <property name="text"> <string>Volume mapper</string> </property> </widget> </item> - <item row="7" column="1" colspan="2" > - <widget class="QComboBox" name="SelectedMapperIndex" > - <property name="toolTip" > - <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose the mapper to use for volume rendering.</p></body></html></string> + <item row="8" column="1" colspan="2"> + <widget class="QComboBox" name="SelectedMapperIndex"> + <property name="toolTip"> + <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose the mapper to use for volume rendering.</p></body></html></string> </property> </widget> </item> + <item row="7" column="0"> + <widget class="QLabel" name="label_17"> + <property name="text"> + <string>Subdivision</string> + </property> + </widget> + </item> + <item row="7" column="1"> + <widget class="QSpinBox" name="NonlinearSubdivisionLevel"> + <property name="toolTip"> + <string>Nonlinear faces are approximated with flat polygons. This parameter controls how many times to subdivide nonlinear surface cells. Higher subdivisions generate closer approximations but take more memory and rendering time. Subdivision is recursive, so the number of output polygons can grow exponentially with this parameter.</string> + </property> + <property name="maximum"> + <number>4</number> + </property> + </widget> + </item> + <item row="7" column="2"> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> </layout> </widget> </item> <item> - <widget class="QGroupBox" name="EdgeStyleGroup" > - <property name="title" > + <widget class="QGroupBox" name="EdgeStyleGroup"> + <property name="title"> <string>Edge Style</string> </property> - <layout class="QHBoxLayout" > - <property name="leftMargin" > - <number>6</number> - </property> - <property name="topMargin" > - <number>6</number> - </property> - <property name="rightMargin" > - <number>6</number> - </property> - <property name="bottomMargin" > + <layout class="QHBoxLayout"> + <property name="margin"> <number>6</number> </property> <item> - <widget class="pqStandardColorButton" name="EdgeColor" > - <property name="enabled" > + <widget class="pqStandardColorButton" name="EdgeColor"> + <property name="enabled"> <bool>true</bool> </property> - <property name="sizePolicy" > - <sizepolicy vsizetype="Fixed" hsizetype="Minimum" > + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="toolTip" > - <string><html>Set the color to use for edges shown on the surface</html></string> + <property name="toolTip"> + <string><html>Set the color to use for edges shown on the surface</html></string> </property> - <property name="text" > + <property name="text"> <string>Set Edge Color...</string> </property> </widget> </item> <item> <spacer> - <property name="orientation" > + <property name="orientation"> <enum>Qt::Horizontal</enum> </property> - <property name="sizeHint" > + <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> @@ -683,52 +627,40 @@ </widget> </item> <item> - <widget class="QGroupBox" name="LightingGroup" > - <property name="title" > + <widget class="QGroupBox" name="LightingGroup"> + <property name="title"> <string>Lighting</string> </property> - <layout class="QGridLayout" > - <property name="leftMargin" > - <number>6</number> - </property> - <property name="topMargin" > - <number>6</number> - </property> - <property name="rightMargin" > - <number>6</number> - </property> - <property name="bottomMargin" > - <number>6</number> - </property> - <property name="horizontalSpacing" > + <layout class="QGridLayout"> + <property name="margin"> <number>6</number> </property> - <property name="verticalSpacing" > + <property name="spacing"> <number>6</number> </property> - <item row="0" column="0" > - <widget class="QLabel" name="label_12" > - <property name="text" > + <item row="0" column="0"> + <widget class="QLabel" name="label_12"> + <property name="text"> <string>Specular Intensity</string> </property> </widget> </item> - <item row="0" column="1" > - <widget class="QDoubleSpinBox" name="SpecularIntensity" > - <property name="maximum" > + <item row="0" column="1"> + <widget class="QDoubleSpinBox" name="SpecularIntensity"> + <property name="maximum"> <double>1.000000000000000</double> </property> - <property name="singleStep" > + <property name="singleStep"> <double>0.100000000000000</double> </property> </widget> </item> - <item row="0" column="2" > + <item row="0" column="2"> <spacer> - <property name="orientation" > + <property name="orientation"> <enum>Qt::Horizontal</enum> </property> - <property name="sizeHint" > + <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> @@ -736,26 +668,26 @@ </property> </spacer> </item> - <item row="1" column="0" > - <widget class="QLabel" name="label_11" > - <property name="text" > + <item row="1" column="0"> + <widget class="QLabel" name="label_11"> + <property name="text"> <string>Specular Focus</string> </property> </widget> </item> - <item row="1" column="1" > - <widget class="QSpinBox" name="SpecularPower" > - <property name="maximum" > + <item row="1" column="1"> + <widget class="QSpinBox" name="SpecularPower"> + <property name="maximum"> <number>128</number> </property> </widget> </item> - <item row="1" column="2" > + <item row="1" column="2"> <spacer> - <property name="orientation" > + <property name="orientation"> <enum>Qt::Horizontal</enum> </property> - <property name="sizeHint" > + <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> @@ -763,12 +695,12 @@ </property> </spacer> </item> - <item row="2" column="0" colspan="3" > - <widget class="QCheckBox" name="SpecularWhite" > - <property name="text" > + <item row="2" column="0" colspan="3"> + <widget class="QCheckBox" name="SpecularWhite"> + <property name="text"> <string>Specular White</string> </property> - <property name="checked" > + <property name="checked"> <bool>true</bool> </property> </widget> @@ -777,85 +709,70 @@ </widget> </item> <item> - <widget class="QGroupBox" name="BackfaceStyleGroup" > - <property name="title" > + <widget class="QGroupBox" name="BackfaceStyleGroup"> + <property name="title"> <string>Backface Style</string> </property> - <layout class="QGridLayout" > - <property name="leftMargin" > - <number>6</number> - </property> - <property name="topMargin" > - <number>6</number> - </property> - <property name="rightMargin" > - <number>6</number> - </property> - <property name="bottomMargin" > + <layout class="QGridLayout"> + <property name="margin"> <number>6</number> </property> - <property name="horizontalSpacing" > + <property name="spacing"> <number>6</number> </property> - <property name="verticalSpacing" > - <number>6</number> - </property> - <item row="0" column="0" > - <widget class="QLabel" name="label_16" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Preferred" hsizetype="Fixed" > + <item row="0" column="0"> + <widget class="QLabel" name="label_16"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="text" > + <property name="text"> <string>Representation</string> </property> </widget> </item> - <item row="0" column="1" > - <widget class="QComboBox" name="BackfaceStyleRepresentation" /> + <item row="0" column="1"> + <widget class="QComboBox" name="BackfaceStyleRepresentation"/> </item> - <item row="1" column="0" colspan="2" > - <widget class="QWidget" native="1" name="BackfaceStyleGroupOptions" > - <layout class="QGridLayout" > - <property name="leftMargin" > + <item row="1" column="0" colspan="2"> + <widget class="QWidget" name="BackfaceStyleGroupOptions" native="true"> + <layout class="QGridLayout"> + <property name="leftMargin"> <number>0</number> </property> - <property name="topMargin" > + <property name="topMargin"> <number>6</number> </property> - <property name="rightMargin" > + <property name="rightMargin"> <number>0</number> </property> - <property name="bottomMargin" > + <property name="bottomMargin"> <number>0</number> </property> - <property name="horizontalSpacing" > - <number>6</number> - </property> - <property name="verticalSpacing" > + <property name="spacing"> <number>6</number> </property> - <item row="0" column="0" colspan="2" > - <widget class="pqStandardColorButton" name="BackfaceActorColor" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Fixed" hsizetype="Minimum" > + <item row="0" column="0" colspan="2"> + <widget class="pqStandardColorButton" name="BackfaceActorColor"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="text" > + <property name="text"> <string>Set Backface Color...</string> </property> </widget> </item> - <item row="0" column="2" > + <item row="0" column="2"> <spacer> - <property name="orientation" > + <property name="orientation"> <enum>Qt::Horizontal</enum> </property> - <property name="sizeHint" > + <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> @@ -863,29 +780,29 @@ </property> </spacer> </item> - <item row="1" column="0" > - <widget class="QLabel" name="label_20" > - <property name="text" > + <item row="1" column="0"> + <widget class="QLabel" name="label_20"> + <property name="text"> <string>Opacity</string> </property> </widget> </item> - <item row="1" column="1" > - <widget class="QDoubleSpinBox" name="BackfaceOpacity" > - <property name="maximum" > + <item row="1" column="1"> + <widget class="QDoubleSpinBox" name="BackfaceOpacity"> + <property name="maximum"> <double>1.000000000000000</double> </property> - <property name="singleStep" > + <property name="singleStep"> <double>0.100000000000000</double> </property> </widget> </item> - <item row="1" column="2" > + <item row="1" column="2"> <spacer> - <property name="orientation" > + <property name="orientation"> <enum>Qt::Horizontal</enum> </property> - <property name="sizeHint" > + <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> @@ -900,210 +817,198 @@ </widget> </item> <item> - <widget class="QGroupBox" name="TransformationGroup" > - <property name="title" > + <widget class="QGroupBox" name="TransformationGroup"> + <property name="title"> <string>Transformation</string> </property> - <layout class="QGridLayout" > - <property name="leftMargin" > - <number>6</number> - </property> - <property name="topMargin" > - <number>6</number> - </property> - <property name="rightMargin" > - <number>6</number> - </property> - <property name="bottomMargin" > - <number>6</number> - </property> - <property name="horizontalSpacing" > + <layout class="QGridLayout"> + <property name="margin"> <number>6</number> </property> - <property name="verticalSpacing" > + <property name="spacing"> <number>6</number> </property> - <item row="0" column="0" > - <widget class="QLabel" name="label_7" > - <property name="text" > + <item row="0" column="0"> + <widget class="QLabel" name="label_7"> + <property name="text"> <string>Translate</string> </property> </widget> </item> - <item row="0" column="1" > - <widget class="QLineEdit" name="TranslateX" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Fixed" hsizetype="Preferred" > + <item row="0" column="1"> + <widget class="QLineEdit" name="TranslateX"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="toolTip" > - <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Translate the geometry relative to the dataset location.</p></body></html></string> + <property name="toolTip"> + <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Translate the geometry relative to the dataset location.</p></body></html></string> </property> </widget> </item> - <item row="0" column="2" > - <widget class="QLineEdit" name="TranslateY" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Fixed" hsizetype="Preferred" > + <item row="0" column="2"> + <widget class="QLineEdit" name="TranslateY"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="toolTip" > - <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Translate the geometry relative to the dataset location.</p></body></html></string> + <property name="toolTip"> + <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Translate the geometry relative to the dataset location.</p></body></html></string> </property> </widget> </item> - <item row="0" column="3" > - <widget class="QLineEdit" name="TranslateZ" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Fixed" hsizetype="Preferred" > + <item row="0" column="3"> + <widget class="QLineEdit" name="TranslateZ"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="toolTip" > - <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Translate the geometry relative to the dataset location.</p></body></html></string> + <property name="toolTip"> + <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Translate the geometry relative to the dataset location.</p></body></html></string> </property> </widget> </item> - <item row="1" column="0" > - <widget class="QLabel" name="label_8" > - <property name="text" > + <item row="1" column="0"> + <widget class="QLabel" name="label_8"> + <property name="text"> <string>Scale</string> </property> </widget> </item> - <item row="1" column="1" > - <widget class="QLineEdit" name="ScaleX" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Fixed" hsizetype="Preferred" > + <item row="1" column="1"> + <widget class="QLineEdit" name="ScaleX"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="toolTip" > - <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Scale the geometry relative to the size of the dataset.</p></body></html></string> + <property name="toolTip"> + <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Scale the geometry relative to the size of the dataset.</p></body></html></string> </property> </widget> </item> - <item row="1" column="2" > - <widget class="QLineEdit" name="ScaleY" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Fixed" hsizetype="Preferred" > + <item row="1" column="2"> + <widget class="QLineEdit" name="ScaleY"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="toolTip" > - <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Scale the geometry relative to the size of the dataset.</p></body></html></string> + <property name="toolTip"> + <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Scale the geometry relative to the size of the dataset.</p></body></html></string> </property> </widget> </item> - <item row="1" column="3" > - <widget class="QLineEdit" name="ScaleZ" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Fixed" hsizetype="Preferred" > + <item row="1" column="3"> + <widget class="QLineEdit" name="ScaleZ"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="toolTip" > - <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Scale the geometry relative to the size of the dataset.</p></body></html></string> + <property name="toolTip"> + <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Scale the geometry relative to the size of the dataset.</p></body></html></string> </property> </widget> </item> - <item row="2" column="0" > - <widget class="QLabel" name="label_9" > - <property name="text" > + <item row="2" column="0"> + <widget class="QLabel" name="label_9"> + <property name="text"> <string>Orientation</string> </property> </widget> </item> - <item row="2" column="1" > - <widget class="QLineEdit" name="OrientationX" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Fixed" hsizetype="Preferred" > + <item row="2" column="1"> + <widget class="QLineEdit" name="OrientationX"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="toolTip" > - <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Orient the geometry relative to the dataset origin.</p></body></html></string> + <property name="toolTip"> + <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Orient the geometry relative to the dataset origin.</p></body></html></string> </property> </widget> </item> - <item row="2" column="2" > - <widget class="QLineEdit" name="OrientationY" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Fixed" hsizetype="Preferred" > + <item row="2" column="2"> + <widget class="QLineEdit" name="OrientationY"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="toolTip" > - <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Orient the geometry relative to the dataset origin.</p></body></html></string> + <property name="toolTip"> + <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Orient the geometry relative to the dataset origin.</p></body></html></string> </property> </widget> </item> - <item row="2" column="3" > - <widget class="QLineEdit" name="OrientationZ" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Fixed" hsizetype="Preferred" > + <item row="2" column="3"> + <widget class="QLineEdit" name="OrientationZ"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="toolTip" > - <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Orient the geometry relative to the dataset origin.</p></body></html></string> + <property name="toolTip"> + <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Orient the geometry relative to the dataset origin.</p></body></html></string> </property> </widget> </item> - <item row="3" column="0" > - <widget class="QLabel" name="label_10" > - <property name="text" > + <item row="3" column="0"> + <widget class="QLabel" name="label_10"> + <property name="text"> <string>Origin</string> </property> </widget> </item> - <item row="3" column="1" > - <widget class="QLineEdit" name="OriginX" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Fixed" hsizetype="Preferred" > + <item row="3" column="1"> + <widget class="QLineEdit" name="OriginX"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="toolTip" > - <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Set the origin point about which rotations take place.</p></body></html></string> + <property name="toolTip"> + <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Set the origin point about which rotations take place.</p></body></html></string> </property> </widget> </item> - <item row="3" column="2" > - <widget class="QLineEdit" name="OriginY" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Fixed" hsizetype="Preferred" > + <item row="3" column="2"> + <widget class="QLineEdit" name="OriginY"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="toolTip" > - <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Set the origin point about which rotations take place.</p></body></html></string> + <property name="toolTip"> + <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Set the origin point about which rotations take place.</p></body></html></string> </property> </widget> </item> - <item row="3" column="3" > - <widget class="QLineEdit" name="OriginZ" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Fixed" hsizetype="Preferred" > + <item row="3" column="3"> + <widget class="QLineEdit" name="OriginZ"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="toolTip" > - <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Set the origin point about which rotations take place.</p></body></html></string> + <property name="toolTip"> + <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Set the origin point about which rotations take place.</p></body></html></string> </property> </widget> </item> @@ -1160,6 +1065,7 @@ <tabstop>StylePointSize</tabstop> <tabstop>StyleLineWidth</tabstop> <tabstop>Opacity</tabstop> + <tabstop>NonlinearSubdivisionLevel</tabstop> <tabstop>SelectedMapperIndex</tabstop> <tabstop>EdgeColor</tabstop> <tabstop>SpecularIntensity</tabstop> @@ -1189,11 +1095,11 @@ <receiver>EditCubeAxes</receiver> <slot>setEnabled(bool)</slot> <hints> - <hint type="sourcelabel" > + <hint type="sourcelabel"> <x>82</x> <y>490</y> </hint> - <hint type="destinationlabel" > + <hint type="destinationlabel"> <x>213</x> <y>490</y> </hint> @@ -1205,11 +1111,11 @@ <receiver>EditColorMapButton</receiver> <slot>setEnabled(bool)</slot> <hints> - <hint type="sourcelabel" > + <hint type="sourcelabel"> <x>139</x> <y>122</y> </hint> - <hint type="destinationlabel" > + <hint type="destinationlabel"> <x>92</x> <y>194</y> </hint> @@ -1221,11 +1127,11 @@ <receiver>RescaleButton</receiver> <slot>setEnabled(bool)</slot> <hints> - <hint type="sourcelabel" > + <hint type="sourcelabel"> <x>139</x> <y>122</y> </hint> - <hint type="destinationlabel" > + <hint type="destinationlabel"> <x>201</x> <y>194</y> </hint> Index: Servers/Filters/vtkPVGeometryFilter.cxx =================================================================== RCS file: /cvsroot/ParaView3/ParaView3/Servers/Filters/vtkPVGeometryFilter.cxx,v retrieving revision 1.94 diff -u -r1.94 vtkPVGeometryFilter.cxx --- Servers/Filters/vtkPVGeometryFilter.cxx 8 May 2009 14:07:39 -0000 1.94 +++ Servers/Filters/vtkPVGeometryFilter.cxx 8 Jun 2009 21:54:30 -0000 @@ -124,10 +124,11 @@ this->UseOutline = 1; this->UseStrips = 0; this->GenerateCellNormals = 1; + this->NonlinearSubdivisionLevel = 1; this->DataSetSurfaceFilter = vtkDataSetSurfaceFilter::New(); this->GenericGeometryFilter=vtkGenericGeometryFilter::New(); - + // Setup a callback for the internal readers to report progress. this->InternalProgressObserver = vtkCallbackCommand::New(); this->InternalProgressObserver->SetCallback( @@ -1152,6 +1153,8 @@ os << indent << "UseStrips: " << (this->UseStrips?"on":"off") << endl; os << indent << "GenerateCellNormals: " << (this->GenerateCellNormals?"on":"off") << endl; + os << indent << "NonlinearSubdivisionLevel: " + << this->NonlinearSubdivisionLevel << endl; os << indent << "Controller: " << this->Controller << endl; os << indent << "PassThroughCellIds: " @@ -1235,3 +1238,20 @@ this->StripSettingMTime.Modified(); } } + +//----------------------------------------------------------------------------- +void vtkPVGeometryFilter::SetNonlinearSubdivisionLevel(int newvalue) +{ + if (this->NonlinearSubdivisionLevel != newvalue) + { + this->NonlinearSubdivisionLevel = newvalue; + + if (this->DataSetSurfaceFilter) + { + this->DataSetSurfaceFilter->SetNonlinearSubdivisionLevel( + this->NonlinearSubdivisionLevel); + } + + this->Modified(); + } +} Index: Servers/Filters/vtkPVGeometryFilter.h =================================================================== RCS file: /cvsroot/ParaView3/ParaView3/Servers/Filters/vtkPVGeometryFilter.h,v retrieving revision 1.45 diff -u -r1.45 vtkPVGeometryFilter.h --- Servers/Filters/vtkPVGeometryFilter.h 22 Sep 2008 18:16:00 -0000 1.45 +++ Servers/Filters/vtkPVGeometryFilter.h 8 Jun 2009 21:54:30 -0000 @@ -80,6 +80,15 @@ vtkBooleanMacro(GenerateCellNormals, int); // Description: + // Nonlinear faces are approximated with flat polygons. This parameter + // controls how many times to subdivide nonlinear surface cells. Higher + // subdivisions generate closer approximations but take more memory and + // rendering time. Subdivision is recursive, so the number of output polygons + // can grow exponentially with this parameter. + virtual void SetNonlinearSubdivisionLevel(int); + vtkGetMacro(NonlinearSubdivisionLevel, int); + + // Description: // Set and get the controller. virtual void SetController(vtkMultiProcessController*); vtkGetObjectMacro(Controller, vtkMultiProcessController); @@ -151,6 +160,7 @@ int UseOutline; int UseStrips; int GenerateCellNormals; + int NonlinearSubdivisionLevel; vtkMultiProcessController* Controller; vtkOutlineSource *OutlineSource; Index: Servers/ServerManager/Resources/filters.xml =================================================================== RCS file: /cvsroot/ParaView3/ParaView3/Servers/ServerManager/Resources/filters.xml,v retrieving revision 1.352 diff -u -r1.352 filters.xml --- Servers/ServerManager/Resources/filters.xml 8 Jun 2009 15:02:01 -0000 1.352 +++ Servers/ServerManager/Resources/filters.xml 8 Jun 2009 21:54:30 -0000 @@ -1524,6 +1524,26 @@ If the value of this property is set to 1, internal surfaces along process boundaries will be removed. NOTE: Enabling this option might cause multiple executions of the data source because more information is needed to remove internal surfaces. </Documentation> </IntVectorProperty> + + <IntVectorProperty name="NonlinearSubdivisionLevel" + command="SetNonlinearSubdivisionLevel" + number_of_elements="1" + default_values="1"> + <IntRangeDomain name="range" min="0" max="4" /> + <Documentation> + If the input is an unstructured grid with nonlinear faces, this + parameter determines how many times the face is subdivided into + linear faces. If 0, the output is the equivalent of its linear + couterpart (and the midpoints determining the nonlinear + interpolation are discarded). If 1, the nonlinear face is + triangulated based on the midpoints. If greater than 1, the + triangulated pieces are recursively subdivided to reach the + desired subdivision. Setting the value to greater than 1 may + cause some point data to not be passed even if no quadratic faces + exist. This option has no effect if the input is not an + unstructured grid. + </Documentation> + </IntVectorProperty> <!-- End DataSetSurfaceFilter --> </SourceProxy> @@ -6863,6 +6883,20 @@ Toggle whether to generate an outline or a surface. </Documentation> </IntVectorProperty> + <IntVectorProperty name="NonlinearSubdivisionLevel" + command="SetNonlinearSubdivisionLevel" + number_of_elements="1" + default_values="1"> + <IntRangeDomain name="range" min="0" max="4" /> + <Documentation> + Nonlinear faces are approximated with flat polygons. This + parameter controls how many times to subdivide nonlinear surface + cells. Higher subdivisions generate closer approximations but + take more memory and rendering time. Subdivision is recursive, + so the number of output polygons can grow exponentially with this + parameter. + </Documentation> + </IntVectorProperty> <IntVectorProperty name="PassThroughIds" command="SetPassThroughCellIds" Index: Servers/ServerManager/Resources/rendering.xml =================================================================== RCS file: /cvsroot/ParaView3/ParaView3/Servers/ServerManager/Resources/rendering.xml,v retrieving revision 1.351 diff -u -r1.351 rendering.xml --- Servers/ServerManager/Resources/rendering.xml 1 Jun 2009 12:48:55 -0000 1.351 +++ Servers/ServerManager/Resources/rendering.xml 8 Jun 2009 21:54:31 -0000 @@ -5870,6 +5870,7 @@ <ExposedProperties> <Property name="UseStrips" /> <Property name="ForceStrips" /> + <Property name="NonlinearSubdivisionLevel" /> </ExposedProperties> </SubProxy> @@ -6661,6 +6662,7 @@ <!-- Geometry Filter properties --> <Property name="UseStrips" /> <Property name="ForceStrips" /> + <Property name="NonlinearSubdivisionLevel" /> <!-- Mapper properties --> <Property name="LookupTable" /> Index: VTK/Graphics/vtkDataSetSurfaceFilter.cxx =================================================================== RCS file: /cvsroot/ParaView3/ParaView3/VTK/Graphics/vtkDataSetSurfaceFilter.cxx,v retrieving revision 1.70 diff -u -r1.70 vtkDataSetSurfaceFilter.cxx --- VTK/Graphics/vtkDataSetSurfaceFilter.cxx 25 Mar 2009 14:35:52 -0000 1.70 +++ VTK/Graphics/vtkDataSetSurfaceFilter.cxx 8 Jun 2009 21:54:31 -0000 @@ -37,7 +37,10 @@ #include "vtkVoxel.h" #include "vtkWedge.h" #include "vtkIdTypeArray.h" +#include "vtkDoubleArray.h" +#include <vtkstd/algorithm> +#include <vtksys/hash_map.hxx> static int sizeofFastQuad(int numPts) { @@ -45,6 +48,39 @@ return static_cast<int>(sizeof(vtkFastGeomQuad)+(numPts-4)*sizeof(vtkIdType)); } +class vtkDataSetSurfaceFilter::vtkEdgeInterpolationMap +{ +public: + void AddEdge(vtkIdType endpoint1, vtkIdType endpoint2, vtkIdType midpoint) { + if (endpoint1 > endpoint2) vtkstd::swap(endpoint1, endpoint2); + Map.insert(vtkstd::make_pair(vtkstd::make_pair(endpoint1, endpoint2), + midpoint)); + } + vtkIdType FindEdge(vtkIdType endpoint1, vtkIdType endpoint2) { + if (endpoint1 > endpoint2) vtkstd::swap(endpoint1, endpoint2); + MapType::iterator iter = Map.find(vtkstd::make_pair(endpoint1, endpoint2)); + if (iter != Map.end()) + { + return iter->second; + } + else + { + return -1; + } + } + +protected: + struct HashFunction { + public: + size_t operator()(vtkstd::pair<vtkIdType,vtkIdType> edge) const { + return static_cast<size_t>(edge.first + edge.second); + } + }; + typedef vtksys::hash_map<vtkstd::pair<vtkIdType, vtkIdType>, vtkIdType, + HashFunction> MapType; + MapType Map; +}; + vtkCxxRevisionMacro(vtkDataSetSurfaceFilter, "$Revision: 1.70 $"); vtkStandardNewMacro(vtkDataSetSurfaceFilter); @@ -53,6 +89,7 @@ { this->QuadHash = NULL; this->PointMap = NULL; + this->EdgeMap = NULL; this->QuadHashLength = 0; this->UseStrips = 0; this->NumberOfNewCells = 0; @@ -70,6 +107,8 @@ this->PassThroughPointIds = 0; this->OriginalCellIds = NULL; this->OriginalPointIds = NULL; + + this->NonlinearSubdivisionLevel = 1; } //---------------------------------------------------------------------------- @@ -916,6 +955,8 @@ os << indent << "PassThroughCellIds: " << (this->PassThroughCellIds ? "On\n" : "Off\n"); os << indent << "PassThroughPointIds: " << (this->PassThroughPointIds ? "On\n" : "Off\n"); + os << indent << "NonlinearSubdivisionLevel: " + << this->NonlinearSubdivisionLevel << endl; } //======================================================================== @@ -949,7 +990,6 @@ vtkCellData *cd = input->GetCellData(); vtkPointData *outputPD = output->GetPointData(); vtkCellData *outputCD = output->GetCellData(); - vtkIdType outPts[6]; vtkFastGeomQuad *q; unsigned char* cellTypes = input->GetCellTypesArray()->GetPointer(0); @@ -958,9 +998,19 @@ vtkPoints *coords; vtkCell *face; int flag2D = 0; + + // These are for subdividing quadratic cells + vtkDoubleArray *parametricCoords; + vtkDoubleArray *parametricCoords2; + vtkIdList *outPts; + vtkIdList *outPts2; pts = vtkIdList::New(); coords = vtkPoints::New(); + parametricCoords = vtkDoubleArray::New(); + parametricCoords2 = vtkDoubleArray::New(); + outPts = vtkIdList::New(); + outPts2 = vtkIdList::New(); // might not be necessary to set the data type for coords // but certainly safer to do so coords->SetDataType(input->GetPoints()->GetData()->GetDataType()); @@ -979,8 +1029,15 @@ newVerts = vtkCellArray::New(); newLines = vtkCellArray::New(); - outputPD->CopyGlobalIdsOn(); - outputPD->CopyAllocate(inputPD, numPts, numPts/2); + if (this->NonlinearSubdivisionLevel <= 1) + { + outputPD->CopyGlobalIdsOn(); + outputPD->CopyAllocate(inputPD, numPts, numPts/2); + } + else + { + outputPD->InterpolateAllocate(inputPD, numPts, numPts/2); + } outputCD->CopyGlobalIdsOn(); outputCD->CopyAllocate(inputCD, numCells, numCells/2); @@ -1201,14 +1258,40 @@ if ( cellIds->GetNumberOfIds() <= 0) { // FIXME: Face could not be consistent. vtkOrderedTriangulator is a better option - face->Triangulate(0,pts,coords); - for (i=0; i < pts->GetNumberOfIds(); i+=3) + if (this->NonlinearSubdivisionLevel >= 1) { - this->InsertTriInHash(pts->GetId(i), pts->GetId(i+1), - pts->GetId(i+2), cellId); + // TODO: Handle NonlinearSubdivisionLevel > 1 correctly. + face->Triangulate(0,pts,coords); + for (i=0; i < pts->GetNumberOfIds(); i+=3) + { + this->InsertTriInHash(pts->GetId(i), pts->GetId(i+1), + pts->GetId(i+2), cellId); + } } - } - } + else + { + switch (face->GetCellType()) + { + case VTK_QUADRATIC_TRIANGLE: + this->InsertTriInHash(face->PointIds->GetId(0), + face->PointIds->GetId(1), + face->PointIds->GetId(2), cellId); + break; + case VTK_QUADRATIC_QUAD: + case VTK_BIQUADRATIC_QUAD: + case VTK_QUADRATIC_LINEAR_QUAD: + this->InsertQuadInHash(face->PointIds->GetId(0), + face->PointIds->GetId(1), + face->PointIds->GetId(2), + face->PointIds->GetId(3), cellId); + break; + default: + vtkWarningMacro(<< "Encountered unknown nonlinear face."); + break; + } // switch cell type + } // subdivision level + } // cell has ids + } // for faces cellIds->Delete(); } //3d cell } //nonlinear cell @@ -1232,6 +1315,25 @@ // Move to the next cell. cellPointer += (1 + *cellPointer); + // If we have a quadratic face and our subdivision level is zero, just treat + // it as a linear cell. This should work so long as the first points of the + // quadratic cell correspond to all those of the equivalent linear cell + // (which all the current definitions do). + if (this->NonlinearSubdivisionLevel < 1) + { + switch (cellType) + { + case VTK_QUADRATIC_TRIANGLE: + cellType = VTK_TRIANGLE; numCellPts = 3; + break; + case VTK_QUADRATIC_QUAD: + case VTK_BIQUADRATIC_QUAD: + case VTK_QUADRATIC_LINEAR_QUAD: + cellType = VTK_POLYGON; numCellPts = 4; + break; + } + } + // A couple of common cases to see if things go faster. if (cellType == VTK_PIXEL) { // Do we really want to insert the 2D cells into a hash? @@ -1283,14 +1385,99 @@ || cellType == VTK_BIQUADRATIC_QUAD || cellType == VTK_QUADRATIC_LINEAR_QUAD) { + // Note: we should not be here if this->NonlinearSubdivisionLevel is less + // than 1. See the check above. input->GetCell( cellId, cell ); cell->Triangulate( 0, pts, coords ); - for ( i=0; i < pts->GetNumberOfIds(); i+=3 ) + // Copy the level 1 subdivision points (which also exist in the input and + // can therefore just be copied over. Note that the output of Triangulate + // records triangles in pts where each 3 points defines a triangle. We + // will keep this invariant and also keep the same invariant in + // parametericCoords and outPts later. + outPts->Reset(); + for ( i=0; i < pts->GetNumberOfIds(); i++ ) { - outPts[0] = this->GetOutputPointId( pts->GetId(i), input, newPts, outputPD ); - outPts[1] = this->GetOutputPointId( pts->GetId(i+1), input, newPts, outputPD ); - outPts[2] = this->GetOutputPointId( pts->GetId(i+2), input, newPts, outputPD ); - newPolys->InsertNextCell( 3, outPts ); + vtkIdType op; + op = this->GetOutputPointId(pts->GetId(i), input, newPts, outputPD); + outPts->InsertNextId(op); + } + // Do any further subdivision if necessary. + if (this->NonlinearSubdivisionLevel > 1) + { + // We are going to need parametric coordinates to further subdivide. + double *pc = cell->GetParametricCoords(); + parametricCoords->Reset(); + parametricCoords->SetNumberOfComponents(3); + for (i = 0; i < pts->GetNumberOfIds(); i++) + { + vtkIdType ptId = pts->GetId(i); + vtkIdType cellPtId; + for (cellPtId = 0; cell->GetPointId(cellPtId) != ptId; cellPtId++); + parametricCoords->InsertNextTupleValue(pc + 3*cellPtId); + } + // Subdivide these triangles as many more times as necessary. Remember + // that we have already done the first subdivision. + for (j = 1; j < this->NonlinearSubdivisionLevel; j++) + { + parametricCoords2->Reset(); + parametricCoords2->SetNumberOfComponents(3); + outPts2->Reset(); + // Each triangle will be split into 4 triangles. + for (i = 0; i < outPts->GetNumberOfIds(); i += 3) + { + // Hold the input point ids and parametric coordinates. First 3 + // indices are the original points. Second three are the midpoints + // in the edges (0,1), (1,2) and (2,0), respectively (see comment + // below). + vtkIdType inPts[6]; + double inParamCoords[6][3]; + int k; + for (k = 0; k < 3; k++) + { + inPts[k] = outPts->GetId(i+k); + parametricCoords->GetTupleValue(i+k, inParamCoords[k]); + } + for (k = 3; k < 6; k++) + { + int pt1 = k-3; + int pt2 = (pt1 < 2) ? (pt1 + 1) : 0; + inParamCoords[k][0] = 0.5*(inParamCoords[pt1][0] + inParamCoords[pt2][0]); + inParamCoords[k][1] = 0.5*(inParamCoords[pt1][1] + inParamCoords[pt2][1]); + inParamCoords[k][2] = 0.5*(inParamCoords[pt1][2] + inParamCoords[pt2][2]); + inPts[k] = GetInterpolatedPointId(inPts[pt1], inPts[pt2], + input, cell, + inParamCoords[k], newPts, + outputPD); + } + // * 0 + // / \ Use the 6 points recorded + // / \ in inPts and inParamCoords + // 3 *-----* 5 to create the 4 triangles + // / \ / \ shown here. + // / \ / \ . + // *-----*-----* + // 1 4 2 + const int subtriangles[12] = {0,3,5, 3,1,4, 3,4,5, 5,4,2}; + for (k = 0; k < 12; k++) + { + int localId = subtriangles[k]; + outPts2->InsertNextId(inPts[localId]); + parametricCoords2->InsertNextTupleValue(inParamCoords[localId]); + } + } // Iterate over triangles + // Now that we have recorded the subdivided triangles in outPts2 and + // parametricCoords2, swap them with outPts and parametricCoords to + // make them the current ones. + vtkstd::swap(outPts, outPts2); + vtkstd::swap(parametricCoords, parametricCoords2); + } // Iterate over subdivision levels + } // If further subdivision + + // Now that we have done all the subdivisions and created all of the + // points, record the triangles. + for (i = 0; i < outPts->GetNumberOfIds(); i += 3) + { + newPolys->InsertNextCell(3, outPts->GetPointer(i)); this->RecordOrigCellId(this->NumberOfNewCells, cellId); outputCD->CopyData(cd, cellId, this->NumberOfNewCells++); } @@ -1326,6 +1513,10 @@ cell->Delete(); coords->Delete(); pts->Delete(); + parametricCoords->Delete(); + parametricCoords2->Delete(); + outPts->Delete(); + outPts2->Delete(); output->SetPoints(newPts); newPts->Delete(); @@ -1387,6 +1578,7 @@ this->QuadHash[i] = NULL; this->PointMap[i] = -1; } + this->EdgeMap = new vtkEdgeInterpolationMap; } //---------------------------------------------------------------------------- @@ -1406,6 +1598,8 @@ this->QuadHashLength = 0; delete [] this->PointMap; this->PointMap = NULL; + delete this->EdgeMap; + this->EdgeMap = NULL; } //---------------------------------------------------------------------------- @@ -1800,6 +1994,34 @@ return outPtId; } +//----------------------------------------------------------------------------- +vtkIdType vtkDataSetSurfaceFilter::GetInterpolatedPointId(vtkIdType edgePtA, + vtkIdType edgePtB, + vtkDataSet *input, + vtkCell *cell, + double pcoords[3], + vtkPoints *outPts, + vtkPointData *outPD) +{ + vtkIdType outPtId; + + outPtId = this->EdgeMap->FindEdge(edgePtA, edgePtB); + if (outPtId == -1) + { + int subId = -1; + double wcoords[3]; + double weights[100]; // Any reason to need more? + cell->EvaluateLocation(subId, pcoords, wcoords, weights); + outPtId = outPts->InsertNextPoint(wcoords); + outPD->InterpolatePoint(input->GetPointData(), outPtId, + cell->GetPointIds(), weights); + this->RecordOrigPointId(outPtId, -1); + this->EdgeMap->AddEdge(edgePtA, edgePtB, outPtId); + } + + return outPtId; +} + //---------------------------------------------------------------------------- void vtkDataSetSurfaceFilter::RecordOrigCellId(vtkIdType destIndex, vtkIdType originalId) Index: VTK/Graphics/vtkDataSetSurfaceFilter.h =================================================================== RCS file: /cvsroot/ParaView3/ParaView3/VTK/Graphics/vtkDataSetSurfaceFilter.h,v retrieving revision 1.26 diff -u -r1.26 vtkDataSetSurfaceFilter.h --- VTK/Graphics/vtkDataSetSurfaceFilter.h 25 Mar 2009 14:35:54 -0000 1.26 +++ VTK/Graphics/vtkDataSetSurfaceFilter.h 8 Jun 2009 21:54:31 -0000 @@ -80,6 +80,19 @@ vtkGetMacro(PassThroughPointIds,int); vtkBooleanMacro(PassThroughPointIds,int); + // Description: + // If the input is an unstructured grid with nonlinear faces, this parameter + // determines how many times the face is subdivided into linear faces. If 0, + // the output is the equivalent of its linear couterpart (and the midpoints + // determining the nonlinear interpolation are discarded). If 1 (the + // default), the nonlinear face is triangulated based on the midpoints. If + // greater than 1, the triangulated pieces are recursively subdivided to reach + // the desired subdivision. Setting the value to greater than 1 may cause + // some point data to not be passed even if no nonlinear faces exist. This + // option has no effect if the input is not an unstructured grid. + vtkSetMacro(NonlinearSubdivisionLevel, int); + vtkGetMacro(NonlinearSubdivisionLevel, int); + protected: vtkDataSetSurfaceFilter(); ~vtkDataSetSurfaceFilter(); @@ -124,6 +137,14 @@ vtkIdType *PointMap; vtkIdType GetOutputPointId(vtkIdType inPtId, vtkDataSet *input, vtkPoints *outPts, vtkPointData *outPD); +//BTX + class vtkEdgeInterpolationMap; +//ETX + vtkEdgeInterpolationMap *EdgeMap; + vtkIdType GetInterpolatedPointId(vtkIdType edgePtA, vtkIdType edgePtB, + vtkDataSet *input, vtkCell *cell, + double pcoords[3], vtkPoints *outPts, + vtkPointData *outPD); vtkIdType NumberOfNewCells; @@ -149,6 +170,8 @@ void RecordOrigPointId(vtkIdType newIndex, vtkIdType origId); vtkIdTypeArray *OriginalPointIds; + int NonlinearSubdivisionLevel; + private: vtkDataSetSurfaceFilter(const vtkDataSetSurfaceFilter&); // Not implemented. void operator=(const vtkDataSetSurfaceFilter&); // Not implemented. NonlinearSubdivisions2.2.patch [^] (35,186 bytes) 2009-06-10 15:41 [Show Content] [Hide Content] Index: Qt/Components/pqDisplayProxyEditor.cxx =================================================================== RCS file: /cvsroot/ParaView3/ParaView3/Qt/Components/pqDisplayProxyEditor.cxx,v retrieving revision 1.75 diff -u -r1.75 pqDisplayProxyEditor.cxx --- Qt/Components/pqDisplayProxyEditor.cxx 9 Jun 2009 17:33:32 -0000 1.75 +++ Qt/Components/pqDisplayProxyEditor.cxx 10 Jun 2009 19:40:59 -0000 @@ -384,6 +384,15 @@ "value", SIGNAL(editingFinished()), reprProxy, reprProxy->GetProperty("Opacity")); + // setup of nonlinear subdivision + if (reprProxy->GetProperty("NonlinearSubdivisionLevel")) + { + this->Internal->Links->addPropertyLink( + this->Internal->NonlinearSubdivisionLevel, + "value", SIGNAL(valueChanged(int)), + reprProxy, reprProxy->GetProperty("NonlinearSubdivisionLevel")); + } + // setup for map scalars this->Internal->Links->addPropertyLink( this->Internal->ColorMapScalars, "checked", SIGNAL(stateChanged(int)), Index: Qt/Components/Resources/UI/pqDisplayProxyEditor.ui =================================================================== RCS file: /cvsroot/ParaView3/ParaView3/Qt/Components/Resources/UI/pqDisplayProxyEditor.ui,v retrieving revision 1.42 diff -u -r1.42 pqDisplayProxyEditor.ui --- Qt/Components/Resources/UI/pqDisplayProxyEditor.ui 9 Jun 2009 17:33:32 -0000 1.42 +++ Qt/Components/Resources/UI/pqDisplayProxyEditor.ui 10 Jun 2009 19:40:59 -0000 @@ -669,14 +669,44 @@ </property> </spacer> </item> - <item row="7" column="0" > + <item row="7" column="0"> + <widget class="QLabel" name="label_17"> + <property name="text"> + <string>Subdivision</string> + </property> + </widget> + </item> + <item row="7" column="1"> + <widget class="QSpinBox" name="NonlinearSubdivisionLevel"> + <property name="toolTip"> + <string>Nonlinear faces are approximated with flat polygons. This parameter controls how many times to subdivide nonlinear surface cells. Higher subdivisions generate closer approximations but take more memory and rendering time. Subdivision is recursive, so the number of output polygons can grow exponentially with this parameter.</string> + </property> + <property name="maximum"> + <number>4</number> + </property> + </widget> + </item> + <item row="7" column="2"> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item row="8" column="0" > <widget class="QLabel" name="label_19" > <property name="text" > <string>Volume mapper</string> </property> </widget> </item> - <item row="7" column="1" colspan="2" > + <item row="8" column="1" colspan="2" > <widget class="QComboBox" name="SelectedMapperIndex" > <property name="toolTip" > <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose the mapper to use for volume rendering.</p></body></html></string> @@ -1217,6 +1247,7 @@ <tabstop>StylePointSize</tabstop> <tabstop>StyleLineWidth</tabstop> <tabstop>Opacity</tabstop> + <tabstop>NonlinearSubdivisionLevel</tabstop> <tabstop>SelectedMapperIndex</tabstop> <tabstop>EdgeColor</tabstop> <tabstop>SpecularIntensity</tabstop> Index: Servers/Filters/vtkPVGeometryFilter.cxx =================================================================== RCS file: /cvsroot/ParaView3/ParaView3/Servers/Filters/vtkPVGeometryFilter.cxx,v retrieving revision 1.94 diff -u -r1.94 vtkPVGeometryFilter.cxx --- Servers/Filters/vtkPVGeometryFilter.cxx 8 May 2009 14:07:39 -0000 1.94 +++ Servers/Filters/vtkPVGeometryFilter.cxx 10 Jun 2009 19:40:59 -0000 @@ -18,6 +18,7 @@ #include "vtkCallbackCommand.h" #include "vtkCellArray.h" #include "vtkCellData.h" +#include "vtkCellTypes.h" #include "vtkCleanArrays.h" #include "vtkCommand.h" #include "vtkCompositeDataIterator.h" @@ -53,11 +54,15 @@ #include "vtkUnsignedCharArray.h" #include "vtkUnsignedIntArray.h" #include "vtkUnstructuredGrid.h" +#include "vtkUnstructuredGridGeometryFilter.h" #include <vtkstd/map> #include <vtkstd/string> #include <assert.h> +#define VTK_CREATE(type, name) \ + vtkSmartPointer<type> name = vtkSmartPointer<type>::New() + vtkCxxRevisionMacro(vtkPVGeometryFilter, "$Revision: 1.94 $"); vtkStandardNewMacro(vtkPVGeometryFilter); @@ -124,10 +129,12 @@ this->UseOutline = 1; this->UseStrips = 0; this->GenerateCellNormals = 1; + this->NonlinearSubdivisionLevel = 1; this->DataSetSurfaceFilter = vtkDataSetSurfaceFilter::New(); this->GenericGeometryFilter=vtkGenericGeometryFilter::New(); - + this->UnstructuredGridGeometryFilter=vtkUnstructuredGridGeometryFilter::New(); + // Setup a callback for the internal readers to report progress. this->InternalProgressObserver = vtkCallbackCommand::New(); this->InternalProgressObserver->SetCallback( @@ -154,13 +161,25 @@ //---------------------------------------------------------------------------- vtkPVGeometryFilter::~vtkPVGeometryFilter () { - if(this->DataSetSurfaceFilter) + // Be careful how you delete these so that you don't foul up the garbage + // collector. + if (this->DataSetSurfaceFilter) { - this->DataSetSurfaceFilter->Delete(); + vtkDataSetSurfaceFilter *tmp = this->DataSetSurfaceFilter; + this->DataSetSurfaceFilter = NULL; + tmp->Delete(); } - if(this->GenericGeometryFilter!=0) + if (this->GenericGeometryFilter) { - this->GenericGeometryFilter->Delete(); + vtkGenericGeometryFilter *tmp = this->GenericGeometryFilter; + this->GenericGeometryFilter = NULL; + tmp->Delete(); + } + if (this->UnstructuredGridGeometryFilter) + { + vtkUnstructuredGridGeometryFilter *tmp=this->UnstructuredGridGeometryFilter; + this->UnstructuredGridGeometryFilter = NULL; + tmp->Delete(); } this->OutlineSource->Delete(); this->InternalProgressObserver->Delete(); @@ -1009,6 +1028,51 @@ if (!this->UseOutline) { this->OutlineFlag = 0; + + bool handleSubdivision = false; + if (this->NonlinearSubdivisionLevel > 0) + { + // Check to see if the data actually has nonlinear cells. Handling + // nonlinear cells adds unnecessary work if we only have linear cells. + vtkUnsignedCharArray *types = input->GetCellTypesArray(); + vtkIdType numCells = input->GetNumberOfCells(); + for (vtkIdType i = 0; i < numCells; i++) + { + if (!vtkCellTypes::IsLinear(types->GetValue(i))) + { + handleSubdivision = true; + break; + } + } + } + + if (handleSubdivision) + { + // Use the vtkUnstructuredGridGeometryFilter to extract 2D surface cells + // from the geometry. This is important to extract an appropriate + // wireframe. Also, at the time of this writing vtkDataSetSurfaceFilter + // only properly subdivides 2D cells past level 1. + VTK_CREATE(vtkUnstructuredGrid, inputClone); + inputClone->ShallowCopy(input); + this->UnstructuredGridGeometryFilter->SetInput(inputClone); + + // Observe the progress of the internal filter. + // TODO: Make the consecutive internal filter execution have monotonically + // increasing progress rather than restarting for every internal filter. + this->UnstructuredGridGeometryFilter->AddObserver( + vtkCommand::ProgressEvent, + this->InternalProgressObserver); + this->UnstructuredGridGeometryFilter->Update(); + // The internal filter finished. Remove the observer. + this->UnstructuredGridGeometryFilter->RemoveObserver( + this->InternalProgressObserver); + + this->UnstructuredGridGeometryFilter->SetInput(NULL); + + // Feed the extracted surface as the input to the rest of the processing. + input->ShallowCopy(this->UnstructuredGridGeometryFilter->GetOutput()); + } + this->DataSetSurfaceExecute(input, output); return; } @@ -1132,6 +1196,8 @@ "DataSetSurfaceFilter"); vtkGarbageCollectorReport(collector, this->GenericGeometryFilter, "GenericGeometryFilter"); + vtkGarbageCollectorReport(collector, this->UnstructuredGridGeometryFilter, + "UnstructuredGridGeometryFilter"); } //---------------------------------------------------------------------------- @@ -1152,6 +1218,8 @@ os << indent << "UseStrips: " << (this->UseStrips?"on":"off") << endl; os << indent << "GenerateCellNormals: " << (this->GenerateCellNormals?"on":"off") << endl; + os << indent << "NonlinearSubdivisionLevel: " + << this->NonlinearSubdivisionLevel << endl; os << indent << "Controller: " << this->Controller << endl; os << indent << "PassThroughCellIds: " @@ -1235,3 +1303,20 @@ this->StripSettingMTime.Modified(); } } + +//----------------------------------------------------------------------------- +void vtkPVGeometryFilter::SetNonlinearSubdivisionLevel(int newvalue) +{ + if (this->NonlinearSubdivisionLevel != newvalue) + { + this->NonlinearSubdivisionLevel = newvalue; + + if (this->DataSetSurfaceFilter) + { + this->DataSetSurfaceFilter->SetNonlinearSubdivisionLevel( + this->NonlinearSubdivisionLevel); + } + + this->Modified(); + } +} Index: Servers/Filters/vtkPVGeometryFilter.h =================================================================== RCS file: /cvsroot/ParaView3/ParaView3/Servers/Filters/vtkPVGeometryFilter.h,v retrieving revision 1.45 diff -u -r1.45 vtkPVGeometryFilter.h --- Servers/Filters/vtkPVGeometryFilter.h 22 Sep 2008 18:16:00 -0000 1.45 +++ Servers/Filters/vtkPVGeometryFilter.h 10 Jun 2009 19:40:59 -0000 @@ -38,6 +38,7 @@ class vtkRectilinearGrid; class vtkStructuredGrid; class vtkUnstructuredGrid; +class vtkUnstructuredGridGeometryFilter; class VTK_EXPORT vtkPVGeometryFilter : public vtkPolyDataAlgorithm { @@ -80,6 +81,15 @@ vtkBooleanMacro(GenerateCellNormals, int); // Description: + // Nonlinear faces are approximated with flat polygons. This parameter + // controls how many times to subdivide nonlinear surface cells. Higher + // subdivisions generate closer approximations but take more memory and + // rendering time. Subdivision is recursive, so the number of output polygons + // can grow exponentially with this parameter. + virtual void SetNonlinearSubdivisionLevel(int); + vtkGetMacro(NonlinearSubdivisionLevel, int); + + // Description: // Set and get the controller. virtual void SetController(vtkMultiProcessController*); vtkGetObjectMacro(Controller, vtkMultiProcessController); @@ -151,11 +161,13 @@ int UseOutline; int UseStrips; int GenerateCellNormals; + int NonlinearSubdivisionLevel; vtkMultiProcessController* Controller; vtkOutlineSource *OutlineSource; vtkDataSetSurfaceFilter* DataSetSurfaceFilter; vtkGenericGeometryFilter *GenericGeometryFilter; + vtkUnstructuredGridGeometryFilter *UnstructuredGridGeometryFilter; int CheckAttributes(vtkDataObject* input); Index: Servers/ServerManager/Resources/filters.xml =================================================================== RCS file: /cvsroot/ParaView3/ParaView3/Servers/ServerManager/Resources/filters.xml,v retrieving revision 1.352 diff -u -r1.352 filters.xml --- Servers/ServerManager/Resources/filters.xml 8 Jun 2009 15:02:01 -0000 1.352 +++ Servers/ServerManager/Resources/filters.xml 10 Jun 2009 19:40:59 -0000 @@ -1524,6 +1524,26 @@ If the value of this property is set to 1, internal surfaces along process boundaries will be removed. NOTE: Enabling this option might cause multiple executions of the data source because more information is needed to remove internal surfaces. </Documentation> </IntVectorProperty> + + <IntVectorProperty name="NonlinearSubdivisionLevel" + command="SetNonlinearSubdivisionLevel" + number_of_elements="1" + default_values="1"> + <IntRangeDomain name="range" min="0" max="4" /> + <Documentation> + If the input is an unstructured grid with nonlinear faces, this + parameter determines how many times the face is subdivided into + linear faces. If 0, the output is the equivalent of its linear + couterpart (and the midpoints determining the nonlinear + interpolation are discarded). If 1, the nonlinear face is + triangulated based on the midpoints. If greater than 1, the + triangulated pieces are recursively subdivided to reach the + desired subdivision. Setting the value to greater than 1 may + cause some point data to not be passed even if no quadratic faces + exist. This option has no effect if the input is not an + unstructured grid. + </Documentation> + </IntVectorProperty> <!-- End DataSetSurfaceFilter --> </SourceProxy> @@ -6863,6 +6883,20 @@ Toggle whether to generate an outline or a surface. </Documentation> </IntVectorProperty> + <IntVectorProperty name="NonlinearSubdivisionLevel" + command="SetNonlinearSubdivisionLevel" + number_of_elements="1" + default_values="1"> + <IntRangeDomain name="range" min="0" max="4" /> + <Documentation> + Nonlinear faces are approximated with flat polygons. This + parameter controls how many times to subdivide nonlinear surface + cells. Higher subdivisions generate closer approximations but + take more memory and rendering time. Subdivision is recursive, + so the number of output polygons can grow exponentially with this + parameter. + </Documentation> + </IntVectorProperty> <IntVectorProperty name="PassThroughIds" command="SetPassThroughCellIds" Index: Servers/ServerManager/Resources/rendering.xml =================================================================== RCS file: /cvsroot/ParaView3/ParaView3/Servers/ServerManager/Resources/rendering.xml,v retrieving revision 1.352 diff -u -r1.352 rendering.xml --- Servers/ServerManager/Resources/rendering.xml 9 Jun 2009 17:38:12 -0000 1.352 +++ Servers/ServerManager/Resources/rendering.xml 10 Jun 2009 19:40:59 -0000 @@ -5870,6 +5870,7 @@ <ExposedProperties> <Property name="UseStrips" /> <Property name="ForceStrips" /> + <Property name="NonlinearSubdivisionLevel" /> </ExposedProperties> </SubProxy> @@ -6651,6 +6652,7 @@ <!-- Geometry Filter properties --> <Property name="UseStrips" /> <Property name="ForceStrips" /> + <Property name="NonlinearSubdivisionLevel" /> <!-- Mapper properties --> <Property name="LookupTable" /> Index: VTK/Filtering/vtkCellType.h =================================================================== RCS file: /cvsroot/ParaView3/ParaView3/VTK/Filtering/vtkCellType.h,v retrieving revision 1.5 diff -u -r1.5 vtkCellType.h --- VTK/Filtering/vtkCellType.h 7 May 2007 15:40:59 -0000 1.5 +++ VTK/Filtering/vtkCellType.h 10 Jun 2009 19:41:00 -0000 @@ -29,7 +29,8 @@ // GetCell() and vtkGenericCell::SetCellType(). Also, to do the job right, // you'll also have to modify some filters (vtkGeometryFilter...) and // regression tests (example scripts) to reflect the new cell addition. -// Also, make sure to update vtkCellTypesStrings in vtkCellTypes.cxx. +// Also, make sure to update vtkCellTypesStrings in vtkCellTypes.cxx +// and the vtkCellTypes::IsLinear method in vtkCellTypes.h. // .SECTION Caveats // An unstructured grid stores the types of its cells as a Index: VTK/Filtering/vtkCellTypes.h =================================================================== RCS file: /cvsroot/ParaView3/ParaView3/VTK/Filtering/vtkCellTypes.h,v retrieving revision 1.3 diff -u -r1.3 vtkCellTypes.h --- VTK/Filtering/vtkCellTypes.h 11 Dec 2008 21:47:19 -0000 1.3 +++ VTK/Filtering/vtkCellTypes.h 10 Jun 2009 19:41:00 -0000 @@ -118,6 +118,13 @@ // defined in vtkCellType.h) static int GetTypeIdFromClassName(const char* classname); + // Description: + // This convenience method is a fast check to determine if a cell type + // represents a linear or nonlinear cell. This is generally much more + // efficient than getting the appropriate vtkCell and checking its IsLinear + // method. + static int IsLinear(unsigned char type); + protected: vtkCellTypes(); ~vtkCellTypes(); @@ -148,5 +155,11 @@ return 0; } +//----------------------------------------------------------------------------- +inline int vtkCellTypes::IsLinear(unsigned char type) +{ + return ((type <= 20) || (type == VTK_CONVEX_POINT_SET)); +} + #endif Index: VTK/Graphics/vtkDataSetSurfaceFilter.cxx =================================================================== RCS file: /cvsroot/ParaView3/ParaView3/VTK/Graphics/vtkDataSetSurfaceFilter.cxx,v retrieving revision 1.70 diff -u -r1.70 vtkDataSetSurfaceFilter.cxx --- VTK/Graphics/vtkDataSetSurfaceFilter.cxx 25 Mar 2009 14:35:52 -0000 1.70 +++ VTK/Graphics/vtkDataSetSurfaceFilter.cxx 10 Jun 2009 19:41:00 -0000 @@ -16,8 +16,10 @@ #include "vtkCellArray.h" #include "vtkCellData.h" +#include "vtkDoubleArray.h" #include "vtkGenericCell.h" #include "vtkHexahedron.h" +#include "vtkIdTypeArray.h" #include "vtkInformation.h" #include "vtkInformationVector.h" #include "vtkMergePoints.h" @@ -26,18 +28,19 @@ #include "vtkPolyData.h" #include "vtkPyramid.h" #include "vtkRectilinearGrid.h" -#include "vtkStructuredGrid.h" -#include "vtkUniformGrid.h" #include "vtkStreamingDemandDrivenPipeline.h" +#include "vtkStructuredGrid.h" #include "vtkStructuredGridGeometryFilter.h" #include "vtkStructuredPoints.h" #include "vtkTetra.h" +#include "vtkUniformGrid.h" #include "vtkUnsignedCharArray.h" #include "vtkUnstructuredGrid.h" #include "vtkVoxel.h" #include "vtkWedge.h" -#include "vtkIdTypeArray.h" +#include <vtkstd/algorithm> +#include <vtksys/hash_map.hxx> static int sizeofFastQuad(int numPts) { @@ -45,6 +48,39 @@ return static_cast<int>(sizeof(vtkFastGeomQuad)+(numPts-4)*sizeof(vtkIdType)); } +class vtkDataSetSurfaceFilter::vtkEdgeInterpolationMap +{ +public: + void AddEdge(vtkIdType endpoint1, vtkIdType endpoint2, vtkIdType midpoint) { + if (endpoint1 > endpoint2) vtkstd::swap(endpoint1, endpoint2); + Map.insert(vtkstd::make_pair(vtkstd::make_pair(endpoint1, endpoint2), + midpoint)); + } + vtkIdType FindEdge(vtkIdType endpoint1, vtkIdType endpoint2) { + if (endpoint1 > endpoint2) vtkstd::swap(endpoint1, endpoint2); + MapType::iterator iter = Map.find(vtkstd::make_pair(endpoint1, endpoint2)); + if (iter != Map.end()) + { + return iter->second; + } + else + { + return -1; + } + } + +protected: + struct HashFunction { + public: + size_t operator()(vtkstd::pair<vtkIdType,vtkIdType> edge) const { + return static_cast<size_t>(edge.first + edge.second); + } + }; + typedef vtksys::hash_map<vtkstd::pair<vtkIdType, vtkIdType>, vtkIdType, + HashFunction> MapType; + MapType Map; +}; + vtkCxxRevisionMacro(vtkDataSetSurfaceFilter, "$Revision: 1.70 $"); vtkStandardNewMacro(vtkDataSetSurfaceFilter); @@ -53,6 +89,7 @@ { this->QuadHash = NULL; this->PointMap = NULL; + this->EdgeMap = NULL; this->QuadHashLength = 0; this->UseStrips = 0; this->NumberOfNewCells = 0; @@ -70,6 +107,8 @@ this->PassThroughPointIds = 0; this->OriginalCellIds = NULL; this->OriginalPointIds = NULL; + + this->NonlinearSubdivisionLevel = 1; } //---------------------------------------------------------------------------- @@ -916,6 +955,8 @@ os << indent << "PassThroughCellIds: " << (this->PassThroughCellIds ? "On\n" : "Off\n"); os << indent << "PassThroughPointIds: " << (this->PassThroughPointIds ? "On\n" : "Off\n"); + os << indent << "NonlinearSubdivisionLevel: " + << this->NonlinearSubdivisionLevel << endl; } //======================================================================== @@ -949,7 +990,6 @@ vtkCellData *cd = input->GetCellData(); vtkPointData *outputPD = output->GetPointData(); vtkCellData *outputCD = output->GetCellData(); - vtkIdType outPts[6]; vtkFastGeomQuad *q; unsigned char* cellTypes = input->GetCellTypesArray()->GetPointer(0); @@ -958,9 +998,19 @@ vtkPoints *coords; vtkCell *face; int flag2D = 0; + + // These are for subdividing quadratic cells + vtkDoubleArray *parametricCoords; + vtkDoubleArray *parametricCoords2; + vtkIdList *outPts; + vtkIdList *outPts2; pts = vtkIdList::New(); coords = vtkPoints::New(); + parametricCoords = vtkDoubleArray::New(); + parametricCoords2 = vtkDoubleArray::New(); + outPts = vtkIdList::New(); + outPts2 = vtkIdList::New(); // might not be necessary to set the data type for coords // but certainly safer to do so coords->SetDataType(input->GetPoints()->GetData()->GetDataType()); @@ -979,8 +1029,15 @@ newVerts = vtkCellArray::New(); newLines = vtkCellArray::New(); - outputPD->CopyGlobalIdsOn(); - outputPD->CopyAllocate(inputPD, numPts, numPts/2); + if (this->NonlinearSubdivisionLevel <= 1) + { + outputPD->CopyGlobalIdsOn(); + outputPD->CopyAllocate(inputPD, numPts, numPts/2); + } + else + { + outputPD->InterpolateAllocate(inputPD, numPts, numPts/2); + } outputCD->CopyGlobalIdsOn(); outputCD->CopyAllocate(inputCD, numCells, numCells/2); @@ -1201,14 +1258,40 @@ if ( cellIds->GetNumberOfIds() <= 0) { // FIXME: Face could not be consistent. vtkOrderedTriangulator is a better option - face->Triangulate(0,pts,coords); - for (i=0; i < pts->GetNumberOfIds(); i+=3) + if (this->NonlinearSubdivisionLevel >= 1) { - this->InsertTriInHash(pts->GetId(i), pts->GetId(i+1), - pts->GetId(i+2), cellId); + // TODO: Handle NonlinearSubdivisionLevel > 1 correctly. + face->Triangulate(0,pts,coords); + for (i=0; i < pts->GetNumberOfIds(); i+=3) + { + this->InsertTriInHash(pts->GetId(i), pts->GetId(i+1), + pts->GetId(i+2), cellId); + } } - } - } + else + { + switch (face->GetCellType()) + { + case VTK_QUADRATIC_TRIANGLE: + this->InsertTriInHash(face->PointIds->GetId(0), + face->PointIds->GetId(1), + face->PointIds->GetId(2), cellId); + break; + case VTK_QUADRATIC_QUAD: + case VTK_BIQUADRATIC_QUAD: + case VTK_QUADRATIC_LINEAR_QUAD: + this->InsertQuadInHash(face->PointIds->GetId(0), + face->PointIds->GetId(1), + face->PointIds->GetId(2), + face->PointIds->GetId(3), cellId); + break; + default: + vtkWarningMacro(<< "Encountered unknown nonlinear face."); + break; + } // switch cell type + } // subdivision level + } // cell has ids + } // for faces cellIds->Delete(); } //3d cell } //nonlinear cell @@ -1232,6 +1315,25 @@ // Move to the next cell. cellPointer += (1 + *cellPointer); + // If we have a quadratic face and our subdivision level is zero, just treat + // it as a linear cell. This should work so long as the first points of the + // quadratic cell correspond to all those of the equivalent linear cell + // (which all the current definitions do). + if (this->NonlinearSubdivisionLevel < 1) + { + switch (cellType) + { + case VTK_QUADRATIC_TRIANGLE: + cellType = VTK_TRIANGLE; numCellPts = 3; + break; + case VTK_QUADRATIC_QUAD: + case VTK_BIQUADRATIC_QUAD: + case VTK_QUADRATIC_LINEAR_QUAD: + cellType = VTK_POLYGON; numCellPts = 4; + break; + } + } + // A couple of common cases to see if things go faster. if (cellType == VTK_PIXEL) { // Do we really want to insert the 2D cells into a hash? @@ -1283,14 +1385,99 @@ || cellType == VTK_BIQUADRATIC_QUAD || cellType == VTK_QUADRATIC_LINEAR_QUAD) { + // Note: we should not be here if this->NonlinearSubdivisionLevel is less + // than 1. See the check above. input->GetCell( cellId, cell ); cell->Triangulate( 0, pts, coords ); - for ( i=0; i < pts->GetNumberOfIds(); i+=3 ) + // Copy the level 1 subdivision points (which also exist in the input and + // can therefore just be copied over. Note that the output of Triangulate + // records triangles in pts where each 3 points defines a triangle. We + // will keep this invariant and also keep the same invariant in + // parametericCoords and outPts later. + outPts->Reset(); + for ( i=0; i < pts->GetNumberOfIds(); i++ ) + { + vtkIdType op; + op = this->GetOutputPointId(pts->GetId(i), input, newPts, outputPD); + outPts->InsertNextId(op); + } + // Do any further subdivision if necessary. + if (this->NonlinearSubdivisionLevel > 1) + { + // We are going to need parametric coordinates to further subdivide. + double *pc = cell->GetParametricCoords(); + parametricCoords->Reset(); + parametricCoords->SetNumberOfComponents(3); + for (i = 0; i < pts->GetNumberOfIds(); i++) + { + vtkIdType ptId = pts->GetId(i); + vtkIdType cellPtId; + for (cellPtId = 0; cell->GetPointId(cellPtId) != ptId; cellPtId++); + parametricCoords->InsertNextTupleValue(pc + 3*cellPtId); + } + // Subdivide these triangles as many more times as necessary. Remember + // that we have already done the first subdivision. + for (j = 1; j < this->NonlinearSubdivisionLevel; j++) + { + parametricCoords2->Reset(); + parametricCoords2->SetNumberOfComponents(3); + outPts2->Reset(); + // Each triangle will be split into 4 triangles. + for (i = 0; i < outPts->GetNumberOfIds(); i += 3) + { + // Hold the input point ids and parametric coordinates. First 3 + // indices are the original points. Second three are the midpoints + // in the edges (0,1), (1,2) and (2,0), respectively (see comment + // below). + vtkIdType inPts[6]; + double inParamCoords[6][3]; + int k; + for (k = 0; k < 3; k++) + { + inPts[k] = outPts->GetId(i+k); + parametricCoords->GetTupleValue(i+k, inParamCoords[k]); + } + for (k = 3; k < 6; k++) + { + int pt1 = k-3; + int pt2 = (pt1 < 2) ? (pt1 + 1) : 0; + inParamCoords[k][0] = 0.5*(inParamCoords[pt1][0] + inParamCoords[pt2][0]); + inParamCoords[k][1] = 0.5*(inParamCoords[pt1][1] + inParamCoords[pt2][1]); + inParamCoords[k][2] = 0.5*(inParamCoords[pt1][2] + inParamCoords[pt2][2]); + inPts[k] = GetInterpolatedPointId(inPts[pt1], inPts[pt2], + input, cell, + inParamCoords[k], newPts, + outputPD); + } + // * 0 + // / \ Use the 6 points recorded + // / \ in inPts and inParamCoords + // 3 *-----* 5 to create the 4 triangles + // / \ / \ shown here. + // / \ / \ . + // *-----*-----* + // 1 4 2 + const int subtriangles[12] = {0,3,5, 3,1,4, 3,4,5, 5,4,2}; + for (k = 0; k < 12; k++) + { + int localId = subtriangles[k]; + outPts2->InsertNextId(inPts[localId]); + parametricCoords2->InsertNextTupleValue(inParamCoords[localId]); + } + } // Iterate over triangles + // Now that we have recorded the subdivided triangles in outPts2 and + // parametricCoords2, swap them with outPts and parametricCoords to + // make them the current ones. + vtkstd::swap(outPts, outPts2); + vtkstd::swap(parametricCoords, parametricCoords2); + } // Iterate over subdivision levels + } // If further subdivision + + // Now that we have done all the subdivisions and created all of the + // points, record the triangles. + for (i = 0; i < outPts->GetNumberOfIds(); i += 3) { - outPts[0] = this->GetOutputPointId( pts->GetId(i), input, newPts, outputPD ); - outPts[1] = this->GetOutputPointId( pts->GetId(i+1), input, newPts, outputPD ); - outPts[2] = this->GetOutputPointId( pts->GetId(i+2), input, newPts, outputPD ); - newPolys->InsertNextCell( 3, outPts ); + newPolys->InsertNextCell(3, outPts->GetPointer(i)); this->RecordOrigCellId(this->NumberOfNewCells, cellId); outputCD->CopyData(cd, cellId, this->NumberOfNewCells++); } @@ -1326,6 +1513,10 @@ cell->Delete(); coords->Delete(); pts->Delete(); + parametricCoords->Delete(); + parametricCoords2->Delete(); + outPts->Delete(); + outPts2->Delete(); output->SetPoints(newPts); newPts->Delete(); @@ -1387,6 +1578,7 @@ this->QuadHash[i] = NULL; this->PointMap[i] = -1; } + this->EdgeMap = new vtkEdgeInterpolationMap; } //---------------------------------------------------------------------------- @@ -1406,6 +1598,8 @@ this->QuadHashLength = 0; delete [] this->PointMap; this->PointMap = NULL; + delete this->EdgeMap; + this->EdgeMap = NULL; } //---------------------------------------------------------------------------- @@ -1800,6 +1994,34 @@ return outPtId; } +//----------------------------------------------------------------------------- +vtkIdType vtkDataSetSurfaceFilter::GetInterpolatedPointId(vtkIdType edgePtA, + vtkIdType edgePtB, + vtkDataSet *input, + vtkCell *cell, + double pcoords[3], + vtkPoints *outPts, + vtkPointData *outPD) +{ + vtkIdType outPtId; + + outPtId = this->EdgeMap->FindEdge(edgePtA, edgePtB); + if (outPtId == -1) + { + int subId = -1; + double wcoords[3]; + double weights[100]; // Any reason to need more? + cell->EvaluateLocation(subId, pcoords, wcoords, weights); + outPtId = outPts->InsertNextPoint(wcoords); + outPD->InterpolatePoint(input->GetPointData(), outPtId, + cell->GetPointIds(), weights); + this->RecordOrigPointId(outPtId, -1); + this->EdgeMap->AddEdge(edgePtA, edgePtB, outPtId); + } + + return outPtId; +} + //---------------------------------------------------------------------------- void vtkDataSetSurfaceFilter::RecordOrigCellId(vtkIdType destIndex, vtkIdType originalId) Index: VTK/Graphics/vtkDataSetSurfaceFilter.h =================================================================== RCS file: /cvsroot/ParaView3/ParaView3/VTK/Graphics/vtkDataSetSurfaceFilter.h,v retrieving revision 1.26 diff -u -r1.26 vtkDataSetSurfaceFilter.h --- VTK/Graphics/vtkDataSetSurfaceFilter.h 25 Mar 2009 14:35:54 -0000 1.26 +++ VTK/Graphics/vtkDataSetSurfaceFilter.h 10 Jun 2009 19:41:00 -0000 @@ -80,6 +80,19 @@ vtkGetMacro(PassThroughPointIds,int); vtkBooleanMacro(PassThroughPointIds,int); + // Description: + // If the input is an unstructured grid with nonlinear faces, this parameter + // determines how many times the face is subdivided into linear faces. If 0, + // the output is the equivalent of its linear couterpart (and the midpoints + // determining the nonlinear interpolation are discarded). If 1 (the + // default), the nonlinear face is triangulated based on the midpoints. If + // greater than 1, the triangulated pieces are recursively subdivided to reach + // the desired subdivision. Setting the value to greater than 1 may cause + // some point data to not be passed even if no nonlinear faces exist. This + // option has no effect if the input is not an unstructured grid. + vtkSetMacro(NonlinearSubdivisionLevel, int); + vtkGetMacro(NonlinearSubdivisionLevel, int); + protected: vtkDataSetSurfaceFilter(); ~vtkDataSetSurfaceFilter(); @@ -124,6 +137,14 @@ vtkIdType *PointMap; vtkIdType GetOutputPointId(vtkIdType inPtId, vtkDataSet *input, vtkPoints *outPts, vtkPointData *outPD); +//BTX + class vtkEdgeInterpolationMap; +//ETX + vtkEdgeInterpolationMap *EdgeMap; + vtkIdType GetInterpolatedPointId(vtkIdType edgePtA, vtkIdType edgePtB, + vtkDataSet *input, vtkCell *cell, + double pcoords[3], vtkPoints *outPts, + vtkPointData *outPD); vtkIdType NumberOfNewCells; @@ -149,6 +170,8 @@ void RecordOrigPointId(vtkIdType newIndex, vtkIdType origId); vtkIdTypeArray *OriginalPointIds; + int NonlinearSubdivisionLevel; + private: vtkDataSetSurfaceFilter(const vtkDataSetSurfaceFilter&); // Not implemented. void operator=(const vtkDataSetSurfaceFilter&); // Not implemented. | ||||||||
Relationships | ||||||
|
Relationships |
Notes | |
(0016696) Ken Moreland (manager) 2009-06-10 13:58 |
The attached patch is a pretty good first step. However, the solution is pretty entangled with bug 0009133, so I need to solve both before I can safely commit. |
(0020431) Ken Moreland (manager) 2010-04-27 12:55 |
Pushed changes to the central repository. VTK commits: http://vtk.org/gitweb?p=VTK.git;a=commit;h=175efdc2937b89cef01f10cc6fbd0f2b3c1e313f [^] http://vtk.org/gitweb?p=VTK.git;a=commit;h=b1778f69d6c38b828f7e28d7d43662084a15d320 [^] ParaView commits: http://paraview.org/gitweb?p=ParaView.git;a=commit;h=61f83397853c4a4c351ca8168e6d978b953b50e0 [^] |
(0020572) Alan Scott (manager) 2010-05-04 19:59 |
Assuming fixed. |
Notes |
Issue History | |||
Date Modified | Username | Field | Change |
2009-06-10 13:54 | Ken Moreland | New Issue | |
2009-06-10 13:54 | Ken Moreland | Status | backlog => tabled |
2009-06-10 13:54 | Ken Moreland | Assigned To | => Ken Moreland |
2009-06-10 13:56 | Ken Moreland | Relationship added | related to 0009133 |
2009-06-10 13:58 | Ken Moreland | File Added: NonlinearSubdivisions2.patch | |
2009-06-10 13:58 | Ken Moreland | Note Added: 0016696 | |
2009-06-10 15:41 | Ken Moreland | File Added: NonlinearSubdivisions2.2.patch | |
2010-04-27 12:55 | Ken Moreland | Note Added: 0020431 | |
2010-04-27 12:55 | Ken Moreland | Status | tabled => @80@ |
2010-04-27 12:55 | Ken Moreland | Fixed in Version | => 3.10 |
2010-04-27 12:55 | Ken Moreland | Resolution | open => fixed |
2010-05-04 19:59 | Alan Scott | Note Added: 0020572 | |
2010-05-04 19:59 | Alan Scott | Status | @80@ => closed |
2011-06-16 13:10 | Zack Galbreath | Category | Feature Request => Feature |
Issue History |
Copyright © 2000 - 2018 MantisBT Team |