[Paraview] copy/pase of clip filter crashes ParaView (tested in 3.14)
Nehme Bilal
nehmebilal at gmail.com
Wed Feb 22 11:42:40 EST 2012
Hello,
Just to let you know that copying and pasting of a clip filter causes
a crash. I think it will be the same for all filters using a 3D
widget.
I implemented a copy/paste few years ago for ParaViewGeo (based on
ParaView 3.4) and I think that it was able to copy the 3D widgets
correctly. The copy/paste action was a little different: when you copy
a filter, you can paste it on a source and it will create a new filter
on that source with the copied properties.
I find the new way used in ParaView (copying and pasting from/to
existing objects) simpler and better. Here is my old code, in case it
can help fixing the bug.
//----------------------------------------------------------------------------
void pqPipelineBrowser::copyItem()
{
// The copy item option only supports one filter at a time.
if(this->getSelectionModel()->selectedIndexes().size() != 1)
{
this->proxyCopy = NULL;
this->proxyCopyType = "none";
this->portCopy = NULL;
return;
}
QModelIndex current = this->getSelectionModel()->currentIndex();
vtkSMProxyManager *proxyManager = vtkSMProxyManager::GetProxyManager();
pqPipelineFilter *filter = dynamic_cast<pqPipelineFilter *>(
this->Model->getItemFor(current));
if(filter)
{
this->proxyCopyType = "filter";
this->portCopy = filter->getOutputPort(0);
}
else
{
pqPipelineSource *source = dynamic_cast<pqPipelineSource*>(
this->Model->getItemFor(current));
if(source)
{
this->portCopy = source->getOutputPort(0);
this->proxyCopyType = "source";
}
else
{
this->portCopy = NULL;
this->proxyCopyType = "none";
}
}
emit copyFired(this->portCopy);
}
//----------------------------------------------------------------------------
void pqPipelineBrowser::pasteItem()
{
if(!this->portCopy)
return;
QModelIndexList indexes = this->getSelectionModel()->selectedIndexes();
// The copy/paste feature only supports one filter at a time.
if(indexes.size() != 1)
{
return;
}
pqOutputPort *Port = NULL;
QModelIndex current = this->getSelectionModel()->currentIndex();
pqPipelineSource *source = dynamic_cast<pqPipelineSource *>(
this->Model->getItemFor(current));
if(!source)
{
Port = dynamic_cast<pqOutputPort *>(
this->Model->getItemFor(indexes.first()));
if(Port)
{
source = Port->getSource();
}
}
pqApplicationCore* core = pqApplicationCore::instance();
pqObjectBuilder* builder = core->getObjectBuilder();
if(source)
{
if(this->proxyCopyType == "filter")
{
vtkSMInputProperty *input = vtkSMInputProperty::SafeDownCast(
portCopy->getSource()->getProxy()->GetProperty("Input"));
input->RemoveAllUncheckedProxies();
if(!Port)
{
Port = source->getOutputPort(0);
}
input->AddUncheckedInputConnection(
Port->getSource()->getProxy(), Port->getPortNumber());
if(input->IsInDomains())
{
QMap<QString, QList<pqOutputPort*> > namedInputs;
QList<pqOutputPort*> inputs;
inputs.push_back(Port);
namedInputs["Input"] = inputs;
pqPipelineSource* newFilter = builder->createFilter("filters",
portCopy->getSource()->getProxy()->GetXMLName(), namedInputs,
this->Internal->activeServer);
this->copyPipelineProxy(portCopy->getSource(), newFilter);
}
else
{
qDebug()<< "incompatible source type";
}
}
}
else if(this->proxyCopyType == "source")
{
vtkSMStringVectorProperty *fileName = vtkSMStringVectorProperty::
SafeDownCast(portCopy->getSource()->getProxy()->GetProperty("FileName"));
pqPipelineSource *newSource;
if(fileName)
{
newSource = builder->createReader("sources",
portCopy->getSource()->getProxy()->GetXMLName(),
QStringList(tr(fileName->GetElement(0))), this->Internal->activeServer);
}
else
{
vtkSMStringVectorProperty *fileName = vtkSMStringVectorProperty::
SafeDownCast(portCopy->getSource()->getProxy()->GetProperty("FileNames"));
if(fileName)
{
QStringList files;
for(unsigned int i=0; i<fileName->GetNumberOfElements(); i++)
{
files.push_back(fileName->GetElement(i));
}
newSource = builder->createReader("sources",
portCopy->getSource()->getProxy()->GetXMLName(),
files, this->Internal->activeServer);
}
else
{
newSource = builder->createSource("sources",
portCopy->getSource()->getProxy()->GetXMLName(),this->Internal->activeServer);
}
}
this->copyPipelineProxy(portCopy->getSource(), newSource);
}
}
//------------------------------------------------------------------------------------------
void pqPipelineBrowser::copyPipelineProxy(pqPipelineSource* src,
pqPipelineSource* dest)
{
this->copyHelperProxies(src,dest);
this->copyProxy(src->getProxy(),dest->getProxy());
vtkSMPropertyIterator* piter;
piter = src->getProxy()->NewPropertyIterator();
for(piter->Begin(); !piter->IsAtEnd(); piter->Next())
{
if (piter->GetProperty()->IsA("vtkSMProxyProperty") &!
piter->GetProperty()->IsA("vtkSMInputProperty"))
{
vtkSMProxyProperty* psource = (vtkSMProxyProperty*)piter->GetProperty();
// get helperProxy ID
int ID = -1;
for (int i=0;i<src->getHelperProxies().size();i++)
{
if (src->getHelperProxies()[i] == psource->GetProxy(0))
{
ID = i;
break;
}
}
if (ID != -1)
{
vtkSMProxyProperty* ptarget =
(vtkSMProxyProperty*)dest->getProxy()->GetProperty(piter->GetKey());
ptarget->SetProxy(0, dest->getHelperProxies()[ID]);
}
}
}
piter->Delete();
}
//------------------------------------------------------------------------------------------
void pqPipelineBrowser::copyProxy(vtkSMProxy* src, vtkSMProxy* dest)
{
vtkSMProxyManager *pxm = vtkSMProxyManager::GetProxyManager();
vtkSMPropertyIterator* iter = dest->NewPropertyIterator();
for (iter->Begin(); !iter->IsAtEnd(); iter->Next())
{
vtkSMProperty* destProp = iter->GetProperty();
vtkSMProperty* srcProp = src->GetProperty(iter->GetKey());
if(!destProp->IsA("vtkSMProxyProperty") )
{
if (destProp && srcProp)
{
destProp->Copy(srcProp);
}
}
}
iter->Delete();
}
//------------------------------------------------------------------------------------------
void pqPipelineBrowser::copyHelperProxies(pqPipelineSource* src,
pqPipelineSource* dest)
{
QList<QString> helperProxiesKey = dest->getHelperKeys();
foreach(QString key, helperProxiesKey)
{
QList<vtkSMProxy*> destProxies = dest->getHelperProxies(key);
QList<vtkSMProxy*> srcProxies = src->getHelperProxies(key);
int i=0;
foreach(vtkSMProxy* proxy, destProxies)
{
this->copyProxy(srcProxies[i], proxy);
}
}
}
More information about the ParaView
mailing list