[Paraview] copy/pase of clip filter crashes ParaView (tested in 3.14)
Utkarsh Ayachit
utkarsh.ayachit at kitware.com
Wed Feb 22 14:32:04 EST 2012
Thanks for reporting Nehme. I've added a bug report:
http://paraview.org/Bug/view.php?id=12959
Utkarsh
On Wed, Feb 22, 2012 at 11:42 AM, Nehme Bilal <nehmebilal at gmail.com> wrote:
> 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);
> }
> }
> }
> _______________________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html
>
> Please keep messages on-topic and check the ParaView Wiki at: http://paraview.org/Wiki/ParaView
>
> Follow this link to subscribe/unsubscribe:
> http://www.paraview.org/mailman/listinfo/paraview
More information about the ParaView
mailing list