VTK/Marks: Difference between revisions
No edit summary |
|||
Line 9: | Line 9: | ||
In VTK, we want to explore a similar interface for marks in C++. The following is a possible technology stack for using marks in VTK: | In VTK, we want to explore a similar interface for marks in C++. The following is a possible technology stack for using marks in VTK: | ||
[[ | |||
[[Image:Marks.png]] | |||
If we include Qt as an alternative back-end to marks, we would have the following: | If we include Qt as an alternative back-end to marks, we would have the following: | ||
[[ | |||
[[Image:MarksWithQt.png]] | |||
== Fleshing Out the vtkMark API == | == Fleshing Out the vtkMark API == |
Revision as of 21:52, 24 November 2009
Overview
Marks can be thought of as highly-configurable vectorized graphics items, or graphics item factories. They are a mid-level API built on more basic rendering primitives like lines, circles, etc. You want to use marks to make it easy to configure a set of primitives, where each primitive's properties will change depending on the item.
Protovis is an API description for marks with a reference implementation in javascript. Some of the features that make this attractive include
- List
- Of
- Cool
- Features
In VTK, we want to explore a similar interface for marks in C++. The following is a possible technology stack for using marks in VTK:
If we include Qt as an alternative back-end to marks, we would have the following:
Fleshing Out the vtkMark API
The fundamental type would be vtkMark, the superclass of all mark types. It's interface would define how programmers would work with all marks in VTK. The following sections enumerate some possible use cases with code snippets showing what the functionality the feature would allow.
Possible Supported Parameter Types
- Basic types (double, int, string, vtkVariant)
<source lang="cpp"> vtkDotMark* m = vtkDotMark::New(); m->SetParameter("size", 10); </source>
- Data object
<source lang="cpp"> vtkDirectedGraph* g = vtkDirectedGraph::New(); //... vtkDotMark* m = vtkDotMark::New(); m->SetParameter("data", g); </source>
- Pipeline output port
<source lang="cpp"> vtkRandomGraphSource* s = vtkRandomGraphSource::New(); //... vtkDotMark* m = vtkDotMark::New(); m->SetParameter("data", s->GetOutputPort()); </source>
- vtkArray
<source lang="cpp"> vtkDenseArray<double>* a = vtkDenseArray<double>::New(); //... vtkDotMark* m = vtkDotMark::New(); m->SetParameter("size", a); </source>
- vtkAbstractArray
<source lang="cpp"> vtkDoubleArray* a = vtkDoubleArray::New(); //... vtkDotMark* m = vtkDotMark::New(); m->SetParameter("size", a); </source>
- Data object + field type + array name
<source lang="cpp"> vtkTable* t = vtkTable::New(); //... vtkDotMark* m = vtkDotMark::New(); m->SetParameter("size", t, vtkDataObject::ROW, "columnName"); </source>
- Data object + field type + array name + component index
<source lang="cpp"> vtkTable* t = vtkTable::New(); vtkDoubleArray* loc = vtkDoubleArray::New(); loc->SetNumberOfComponents(2); //... vtkDotMark* m = vtkDotMark::New(); m->SetParameter("left", t, vtkDataObject::ROW, "location", 0); m->SetParameter("bottom", t, vtkDataObject::ROW, "location", 1); </source>
- Function pointer
<source lang="cpp"> double MySize(vtkMark* m, int i) { return 10*i; } //... vtkDotMark* m = vtkDotMark::New(); m->SetParameter("size", &MySize); </source>
- Functor (i.e. struct type with operator()) - requires SetParameter to be templated.
<source lang="cpp"> struct MySize {
double operator()(vtkMark* m, int i) { return 10*i; }
} //... vtkDotMark* m = vtkDotMark::New(); m->SetParameter("size", MySize()); </source>
- Lambda function (boost::lambda)
- Parameter strategies
<source lang="cpp"> class vtkDoubleParameter {
virtual double Get(vtkMark* m, int i) = 0;
}
class MySize : public vtkDoubleParameter { protected:
double Get(vtkMark* m, int i) { return 10*i; }
} //... vtkDotMark* m = vtkDotMark::New(); m->SetParameter("size", MySize()); </source>
- Override virtual methods in mark
<source lang="cpp"> class vtkDotMark : public vtkMark { protected:
virtual double GetSize(int i) { return 10; }
}
class MyMark : public vtkDotMark { protected:
double GetSize(int i) { return 10*i; }
} //... MyMark* m = MyMark::New(); </source>
- Inherit from parent mark
<source lang="cpp"> vtkDotMark* parent = vtkDotMark::New(); parent->SetParameter("size", 10); vtkDotMark* child = vtkDotMark::New(); parent->Add(child); // Child has size 10 </source>
Possible Parameter Storage and Access
- Named member variables
<source lang="cpp"> class vtkDotMark { public:
ParamType GetSize() { return this->Size; } void SetSize(ParamType p) { this->Size = p; }
private:
ParamType Size;
} </source>
- Named member variables with import/export to name/value map
<source lang="cpp"> class vtkMark { public:
ParamType GetParameter(string key) { this->ExportSettings()->GetParameter(key); } void SetParameter(string key, ParamType p) { this->ImportSettings(this->ExportSettings()->SetParameter(key, p)); } virtual void ImportSettings(vtkSettings* s) { } virtual vtkSettings* ExportSettings() { return vtkSettings::New(); }
}
class vtkDotMark { public:
ParamType GetSize() { return this->Size; } void SetSize(ParamType p) { this->Size = p; } virtual vtkSettings* ExportSettings() { return this->Parent->ExportSettings()->SetParameter("size", this->Size); } virutal void ImportSettings(vtkSettings* s) { this->Size = s->GetParameter("size"); }
private:
ParamType Size;
} </source>
- Generic name/value map
<source lang="cpp"> class vtkMark { public:
ParamType GetParameter(string key) { return this->Parameters[key].Valid ? this->Parameters[key] : this->Parent->GetParameter(key); } void SetParameter(string key, ParamType p) { this->Parameters[key] = p; }
private:
map<string, ParamType> Parameters;
} </source>
- Generic name/value map with setter/getter syntactic sugar for discoverability
<source lang="cpp"> class vtkDotMark { public:
ParamType GetSize() { return this->GetParameter("size"); } void SetSize(ParamType p) { this->SetParameter("size", p); }
} </source>
Possible Other Features
- Declarative API
- Iterator support