mirror of
https://github.com/OpenFOAM/ThirdParty-6.git
synced 2025-12-08 06:57:43 +00:00
237 lines
7.1 KiB
C++
237 lines
7.1 KiB
C++
/*=========================================================================
|
|
|
|
Program: ParaView
|
|
Module: vtkSMDomain.cxx
|
|
|
|
Copyright (c) Kitware, Inc.
|
|
All rights reserved.
|
|
See Copyright.txt or http://www.paraview.org/HTML/Copyright.html for details.
|
|
|
|
This software is distributed WITHOUT ANY WARRANTY; without even
|
|
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
PURPOSE. See the above copyright notice for more information.
|
|
|
|
=========================================================================*/
|
|
#include "vtkSMDomain.h"
|
|
|
|
#include "vtkCommand.h"
|
|
#include "vtkPVXMLElement.h"
|
|
#include "vtkSMProperty.h"
|
|
#include "vtkSMSession.h"
|
|
#include "vtkSMSourceProxy.h"
|
|
#include "vtkSMUncheckedPropertyHelper.h"
|
|
#include "vtkStdString.h"
|
|
#include "vtkWeakPointer.h"
|
|
|
|
#include <map>
|
|
#include <assert.h>
|
|
|
|
struct vtkSMDomainInternals
|
|
{
|
|
// This used to be a vtkSmartPointer. Converting this to vtkWeakPointer.
|
|
// There's no reason why a domain should have a hard reference to the required
|
|
// property since both the domain and the required property belong to the same
|
|
// proxy, so they will be deleted only when the proxy disappears.
|
|
typedef
|
|
std::map<vtkStdString, vtkWeakPointer<vtkSMProperty> > PropertyMap;
|
|
PropertyMap RequiredProperties;
|
|
|
|
// This is the property that has this domain.
|
|
vtkWeakPointer<vtkSMProperty> DomainProperty;
|
|
};
|
|
|
|
//---------------------------------------------------------------------------
|
|
vtkSMDomain::vtkSMDomain()
|
|
{
|
|
this->XMLName = 0;
|
|
this->Internals = new vtkSMDomainInternals;
|
|
this->IsOptional = false;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
vtkSMDomain::~vtkSMDomain()
|
|
{
|
|
this->SetXMLName(0);
|
|
delete this->Internals;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
vtkSMProperty* vtkSMDomain::GetRequiredProperty(const char* function)
|
|
{
|
|
vtkSMDomainInternals::PropertyMap::iterator iter =
|
|
this->Internals->RequiredProperties.find(function);
|
|
if (iter != this->Internals->RequiredProperties.end())
|
|
{
|
|
return iter->second.GetPointer();
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
void vtkSMDomain::RemoveRequiredProperty(vtkSMProperty* prop)
|
|
{
|
|
vtkSMDomainInternals::PropertyMap::iterator iter =
|
|
this->Internals->RequiredProperties.begin();
|
|
|
|
for(; iter != this->Internals->RequiredProperties.end(); iter++)
|
|
{
|
|
if ( iter->second.GetPointer() == prop )
|
|
{
|
|
this->Internals->RequiredProperties.erase(iter);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
int vtkSMDomain::ReadXMLAttributes(vtkSMProperty* prop, vtkPVXMLElement* element)
|
|
{
|
|
assert("Property and proxy should be properly set" && prop && prop->GetParent());
|
|
this->SetSession(prop->GetParent()->GetSession());
|
|
|
|
int isOptional;
|
|
int retVal = element->GetScalarAttribute("optional", &isOptional);
|
|
if(retVal)
|
|
{
|
|
this->SetIsOptional(isOptional!=0);
|
|
}
|
|
|
|
for(unsigned int i=0; i < element->GetNumberOfNestedElements(); ++i)
|
|
{
|
|
vtkPVXMLElement* domainEl = element->GetNestedElement(i);
|
|
if ( strcmp(domainEl->GetName(), "RequiredProperties" ) == 0 )
|
|
{
|
|
for(unsigned int j=0; j < domainEl->GetNumberOfNestedElements(); ++j)
|
|
{
|
|
vtkPVXMLElement* reqEl = domainEl->GetNestedElement(j);
|
|
const char* name = reqEl->GetAttribute("name");
|
|
if (name)
|
|
{
|
|
if ( prop->GetXMLName() && strcmp(name, prop->GetXMLName()) == 0 )
|
|
{
|
|
vtkErrorMacro("A domain can not depend on it's property");
|
|
}
|
|
else
|
|
{
|
|
const char* function = reqEl->GetAttribute("function");
|
|
if (!function)
|
|
{
|
|
vtkErrorMacro("Missing required attribute: function");
|
|
}
|
|
else
|
|
{
|
|
vtkSMProperty* req = prop->NewProperty(name);
|
|
if (req)
|
|
{
|
|
this->AddRequiredProperty(req, function);
|
|
}
|
|
else
|
|
{
|
|
vtkWarningMacro(
|
|
"You have added a domain dependency to a property named '"
|
|
<< name << "' which does not exist.");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
vtkPVDataInformation* vtkSMDomain::GetInputDataInformation(
|
|
const char* function, int /*index=0*/)
|
|
{
|
|
vtkSMProperty* inputProperty = this->GetRequiredProperty(function);
|
|
if (!inputProperty)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
vtkSMUncheckedPropertyHelper helper(inputProperty);
|
|
if (helper.GetNumberOfElements() > 0)
|
|
{
|
|
vtkSMSourceProxy* sp = vtkSMSourceProxy::SafeDownCast(helper.GetAsProxy(0));
|
|
if (sp)
|
|
{
|
|
return sp->GetDataInformation(helper.GetOutputPort());
|
|
}
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
void vtkSMDomain::AddRequiredProperty(vtkSMProperty *prop,
|
|
const char *function)
|
|
{
|
|
if (!prop)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (!function)
|
|
{
|
|
vtkErrorMacro("Missing name of function for new required property.");
|
|
return;
|
|
}
|
|
|
|
prop->AddDependent(this);
|
|
this->Internals->RequiredProperties[function] = prop;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
unsigned int vtkSMDomain::GetNumberOfRequiredProperties()
|
|
{
|
|
return static_cast<unsigned int>(this->Internals->RequiredProperties.size());
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
void vtkSMDomain::DomainModified()
|
|
{
|
|
this->InvokeEvent(vtkCommand::DomainModifiedEvent, 0);
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
void vtkSMDomain::ChildSaveState(vtkPVXMLElement* /*domainElement*/)
|
|
{
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
void vtkSMDomain::SaveState(vtkPVXMLElement* parent, const char* uid)
|
|
{
|
|
vtkPVXMLElement* domainElement = vtkPVXMLElement::New();
|
|
domainElement->SetName("Domain");
|
|
domainElement->AddAttribute("name", this->XMLName);
|
|
domainElement->AddAttribute("id", uid);
|
|
|
|
this->ChildSaveState(domainElement);
|
|
|
|
parent->AddNestedElement(domainElement);
|
|
domainElement->Delete();
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
vtkSMProperty* vtkSMDomain::GetProperty()
|
|
{
|
|
return this->Internals->DomainProperty;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
void vtkSMDomain::SetProperty(vtkSMProperty* prop)
|
|
{
|
|
this->Internals->DomainProperty = prop;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
void vtkSMDomain::PrintSelf(ostream& os, vtkIndent indent)
|
|
{
|
|
this->Superclass::PrintSelf(os, indent);
|
|
os << indent << "XMLName: " << (this->XMLName ? this->XMLName : "(null)")
|
|
<< endl;
|
|
os << indent << "IsOptional: " << this->IsOptional << endl;
|
|
os << indent << "Property: " << this->Internals->DomainProperty.GetPointer() << endl;
|
|
}
|