diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..101ae2b --- /dev/null +++ b/.gitignore @@ -0,0 +1,16 @@ +/3Depict-0.0.2.tar.gz +/3Depict-0.0.3.tar.gz +/3Depict-0.0.6.tar.gz +/3Depict-0.0.7.tar.gz +/3Depict-0.0.8.tar.gz +/3Depict-0.0.9.tar.gz +/3Depict-0.0.10.tar.gz +/3Depict-0.0.11.tar.gz +/3Depict-0.0.12.tar.gz +/3Depict-0.0.13.tar.gz +/3Depict-0.0.14.tar.gz +/3Depict-0.0.15.tar.gz +/3Depict-0.0.16.tar.gz +/3Depict-0.0.17.tar.gz +/3Depict-0.0.18.tar.gz +/3Depict-0.0.19.tar.gz diff --git a/3Depict-0.0.19-font-path.patch b/3Depict-0.0.19-font-path.patch new file mode 100644 index 0000000..02f52fc --- /dev/null +++ b/3Depict-0.0.19-font-path.patch @@ -0,0 +1,27 @@ +diff -r 7abb69436c2b src/wx/wxcomponents.cpp +--- src/wx/wxcomponents.cpp Sat Aug 02 05:39:24 2014 -0400 ++++ src/wx/wxcomponents.cpp Sat Aug 02 05:40:51 2014 -0400 +@@ -547,16 +547,17 @@ + //(Oh look Ma, I'm autoconf!) + + const char *dirs[] = { ".", +- "/usr/share/fonts/truetype", //Old debian ++ "/usr/local/share/fonts/truetype", // User fonts + "/usr/share/fonts/truetype/freefont", // New debian + "/usr/share/fonts/truetype/ttf-dejavu", //New debian +- "/usr/local/share/fonts/truetype", // User fonts ++ "/usr/share/fonts/truetype", //Old debian ++ "/usr/share/fonts/dejavu", //Fedora + "/usr/X11R6/lib/X11/fonts/truetype", + "/usr/X11R6/lib64/X11/fonts/truetype", +- "/usr/lib/X11/fonts/truetype",// Fedora 32 +- "/usr/lib64/X11/fonts/truetype", //Fedora 64 +- "/usr/local/lib/X11/fonts/truetype", // Fedora 32 new +- "/usr/local/lib64/X11/fonts/truetype",// Fedora 64 new ++ "/usr/lib/X11/fonts/truetype", ++ "/usr/lib64/X11/fonts/truetype", ++ "/usr/local/lib/X11/fonts/truetype", ++ "/usr/local/lib64/X11/fonts/truetype", + "", + }; //MUST end with "". + diff --git a/3Depict-0.0.19-manual-pdf-loc.patch b/3Depict-0.0.19-manual-pdf-loc.patch new file mode 100644 index 0000000..31178af --- /dev/null +++ b/3Depict-0.0.19-manual-pdf-loc.patch @@ -0,0 +1,16 @@ +diff -r 7abb69436c2b src/gui/mainFrame.cpp +--- src/gui/mainFrame.cpp Sat Aug 02 05:39:24 2014 -0400 ++++ src/gui/mainFrame.cpp Sat Aug 02 05:40:32 2014 -0400 +@@ -2840,9 +2840,9 @@ + string s; + s=locateDataFile("3Depict-manual.pdf"); + +- //Also Debian makes us use the lowercase "D", so check there too. +- if(!s.size()) +- s=locateDataFile("3depict-manual.pdf"); ++ //Also Fedora has diff dir ++ if(!wxFileExists(s)) ++ s="/usr/share/doc/3Depict-0.0.8/3Depict-0.0.8-manual.pdf"; + + //FIXME: under windows, currently we use "manual.pdf" + if(!s.size()) diff --git a/3Depict-0.0.19-upstream-effd078610a7.patch b/3Depict-0.0.19-upstream-effd078610a7.patch new file mode 100644 index 0000000..d588967 --- /dev/null +++ b/3Depict-0.0.19-upstream-effd078610a7.patch @@ -0,0 +1,1235 @@ +diff -r bcb9acfa66de -r effd078610a7 docs/manual-latex/build-latex.sh +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ docs/manual-latex/build-latex.sh Tue Jun 21 12:45:20 2016 +0100 +@@ -0,0 +1,37 @@ ++#!/bin/bash ++LATEXBIN=pdflatex ++BIBTEXBIN=bibtex ++if [ x`which $LATEXBIN` == x"" ] ; then ++ echo "no $LATEXBIN" ++ exit 1 ++fi ++ ++if [ x`which $BIBTEXBIN` == x"" ] ; then ++ echo "no $BIBTEXBIN" ++ exit 1 ++fi ++ ++MANUAL=manual.tex ++ ++#check to see if the manual and its bib file are around ++if [ ! -f $MANUAL ] ; then ++ echo "$MANUAL is missing" ++ exit 1 ++fi ++ ++#Remove the old manul ++rm -f manual.pdf ++ ++ ++ ++#run the multi-pass latex build. ++$LATEXBIN $MANUAL || { echo "failed latex build (pass 1 of 2)"; exit 1 ; } ++$BIBTEXBIN `basename -s .tex $MANUAL` || { echo "failed bibtex build"; exit 1 ; } ++$LATEXBIN $MANUAL || { echo "failed latex build (pass 2 of 2)"; exit 1 ; } ++ ++ ++if [ ! -f manual.pdf ] ; then ++ echo "latex ran, but somehow we did not output the PDF...." ++ exit 1 ++fi ++ +diff -r bcb9acfa66de -r effd078610a7 src/backend/filter.cpp +--- src/backend/filter.cpp Tue May 31 13:04:58 2016 +1000 ++++ src/backend/filter.cpp Tue Jun 21 12:45:20 2016 +0100 +@@ -553,7 +553,7 @@ + ASSERT(scatterIntensity.empty()); + + +- ASSERT(plotType < PLOT_TYPE_ENUM_END); ++ ASSERT(plotStyle < PLOT_TYPE_ENUM_END); + } + void RangeStreamData::checkSelfConsistent() const + { +diff -r bcb9acfa66de -r effd078610a7 src/backend/filter.h +--- src/backend/filter.h Tue May 31 13:04:58 2016 +1000 ++++ src/backend/filter.h Tue Jun 21 12:45:20 2016 +0100 +@@ -395,7 +395,7 @@ + //Label for X, Y axes + std::string xLabel,yLabel; + +- unsigned int plotType; ++ unsigned int plotStyle; + + //!Structured XY data pairs for plotting curve + Array2D xyData; +diff -r bcb9acfa66de -r effd078610a7 src/backend/filters/algorithms/rdf.cpp +--- src/backend/filters/algorithms/rdf.cpp Tue May 31 13:04:58 2016 +1000 ++++ src/backend/filters/algorithms/rdf.cpp Tue Jun 21 12:45:20 2016 +0100 +@@ -862,6 +862,8 @@ + return RDF_ABORT_FAIL; + #endif + ++ *progressPtr=100; ++ + return 0; + } + +@@ -1003,6 +1005,8 @@ + #endif + + //Calculations complete! ++ *progressPtr=100; ++ + return 0; + } + +diff -r bcb9acfa66de -r effd078610a7 src/backend/filters/annotation.cpp +--- src/backend/filters/annotation.cpp Tue May 31 13:04:58 2016 +1000 ++++ src/backend/filters/annotation.cpp Tue Jun 21 12:45:20 2016 +0100 +@@ -167,8 +167,15 @@ + + //If we are not enabled, do not draw anything into the output + if(!active) ++ { ++ progress.filterProgress=100; + return 0; ++ } + ++ progress.step=1; ++ progress.maxStep=1; ++ progress.stepName=TRANS("Draw"); ++ + DrawStreamData *d; + d = new DrawStreamData; + d->parent=this; +@@ -505,6 +512,7 @@ + d->cached=0; + getOut.push_back(d); + ++ progress.filterProgress=100; + return 0; + } + +diff -r bcb9acfa66de -r effd078610a7 src/backend/filters/boundingBox.cpp +--- src/backend/filters/boundingBox.cpp Tue May 31 13:04:58 2016 +1000 ++++ src/backend/filters/boundingBox.cpp Tue Jun 21 12:45:20 2016 +0100 +@@ -510,7 +510,6 @@ + } + #endif + bTotal.expand(bThis); +- progress.filterProgress=100; + break; + } + default: +@@ -521,6 +520,7 @@ + getOut.push_back(dataIn[ui]); + } + ++ progress.filterProgress=100; + //Append the bounding box if it is valid + if(bTotal.isValid()) + { +diff -r bcb9acfa66de -r effd078610a7 src/backend/filters/clusterAnalysis.cpp +--- src/backend/filters/clusterAnalysis.cpp Tue May 31 13:04:58 2016 +1000 ++++ src/backend/filters/clusterAnalysis.cpp Tue Jun 21 12:45:20 2016 +0100 +@@ -685,7 +685,7 @@ + Plot2DStreamData *p = new Plot2DStreamData; + p->parent=this; + +- p->plotType=PLOT_2D_SCATTER; ++ p->plotStyle=PLOT_2D_SCATTER; + p->dataLabel=TRANS("Morphology Plot"); + p->xLabel=TRANS("\\lambda_1:\\lambda_2 ratio"); + p->yLabel=TRANS("\\lambda_2:\\lambda_3 ratio"); +diff -r bcb9acfa66de -r effd078610a7 src/backend/filters/ionColour.cpp +--- src/backend/filters/ionColour.cpp Tue May 31 13:04:58 2016 +1000 ++++ src/backend/filters/ionColour.cpp Tue Jun 21 12:45:20 2016 +0100 +@@ -271,12 +271,14 @@ + + + p.name=TRANS("Show Bar"); ++ p.helpText=TRANS("Display the colour legend in the 3D view"); + p.key=KEY_IONCOLOURFILTER_SHOWBAR; + p.data=boolStrEnc(showColourBar); + p.type=PROPERTY_TYPE_BOOL; + propertyList.addProperty(p,curGroup); + + p.name=TRANS("Opacity"); ++ p.helpText=TRANS("How see-through to make the legend (0- transparent, 1- solid)"); + p.key=KEY_IONCOLOURFILTER_ALPHA; + stream_cast(p.data,alpha); + p.type=PROPERTY_TYPE_REAL; +diff -r bcb9acfa66de -r effd078610a7 src/backend/filters/ionDownsample.cpp +--- src/backend/filters/ionDownsample.cpp Tue May 31 13:04:58 2016 +1000 ++++ src/backend/filters/ionDownsample.cpp Tue Jun 21 12:45:20 2016 +0100 +@@ -88,7 +88,7 @@ + rsdIncoming = new RangeStreamData; + *rsdIncoming=*c; + +- if(ionFractions.size() != c->rangeFile->getNumIons()) ++ if(ionFractions.size() != c->rangeFile->getNumIons()+1) + { + //set up some defaults; seeded from normal + ionFractions.resize(c->rangeFile->getNumIons()+1,fraction); +@@ -464,7 +464,8 @@ + + propertyList.setGroupTitle(curGroup,TRANS("Mode")); + curGroup++; +- if(rsdIncoming && perSpecies) ++ ++ if(rsdIncoming && perSpecies && rsdIncoming->enabledIons.size()) + { + unsigned int typeVal; + if(fixedNumOut) +diff -r bcb9acfa66de -r effd078610a7 src/backend/filters/ionInfo.cpp +--- src/backend/filters/ionInfo.cpp Tue May 31 13:04:58 2016 +1000 ++++ src/backend/filters/ionInfo.cpp Tue Jun 21 12:45:20 2016 +0100 +@@ -398,7 +398,7 @@ + + + //"Pairwise events" - where we perform an action if both +- //These ++ //these are set + if(wantIonCounts && wantVolume) + { + if(computedVol > sqrtf(std::numeric_limits::epsilon())) +@@ -420,6 +420,9 @@ + } + } + ++ ++ progress.filterProgress=100; ++ + return 0; + } + +diff -r bcb9acfa66de -r effd078610a7 src/backend/filters/spatialAnalysis.cpp +--- src/backend/filters/spatialAnalysis.cpp Tue May 31 13:04:58 2016 +1000 ++++ src/backend/filters/spatialAnalysis.cpp Tue Jun 21 12:45:20 2016 +0100 +@@ -655,115 +655,180 @@ + return ERR_FILE_READ_FAIL; + + +- +- progress.step=3; +- progress.stepName=TRANS("Build"); +- progress.filterProgress=0; +- +- //Build the search tree we will use to perform replacement +- K3DTreeMk2 tree; +- tree.resetPts(fileIons,false); +- if(!tree.build()) +- return ERR_ABORT_FAIL; +- BoundCube b; +- tree.getBoundCube(b); +- +- //map the offset of the nearest to +- //the tree ID +- vector nearestVec; +- nearestVec.resize(inIons.size()); +- +- //TODO: pair vector might be faster +- // as we can use it in sequence, and can use openmp +- map matchedMap; +- +- //Find the nearest point for all points in the dataset +- +- #pragma omp parallel for +- for(size_t ui=0;ui outIons; ++ if(inIons.empty() || fileIons.empty()) + { +- nearestVec[ui]=tree.findNearestUntagged(inIons[ui].getPos(),b,false); +- } +- +- float sqrReplaceTol=replaceTolerance*replaceTolerance; +- +- //Filter this to only points that had an NN within range +- #pragma omp parallel for +- for(size_t ui=0;ui outIons; +- switch(replaceMode) +- { +- case REPLACE_MODE_SUBTRACT: ++ ++ progress.step=3; ++ progress.stepName=TRANS("Build"); ++ progress.filterProgress=0; ++ ++ //TODO: Possible speed increase by finding the smaller of ++ // the two inputs, and using that to build the tree ++ ++ //Build the search tree we will use to perform replacement ++ K3DTreeMk2 tree; ++ tree.resetPts(fileIons,false); ++ if(!tree.build()) ++ return ERR_ABORT_FAIL; ++ BoundCube b; ++ tree.getBoundCube(b); ++ ++ //map the offset of the nearest to ++ //the tree ID ++ vector nearestVec; ++ nearestVec.resize(inIons.size()); ++ ++ //TODO: pair vector might be faster ++ // as we can use it in sequence, and can use openmp ++ map matchedMap; ++ ++ //Find the nearest point for all points in the dataset ++ // maps the ith ion in "inions" to the tree value ++ #pragma omp parallel for ++ for(size_t ui=0;ui matchedMap.size()) +- outIons.reserve(inIons.size()-matchedMap.size()); +- +- // +- #pragma omp parallel for +- for(unsigned int ui=0;ui::iterator it; +- it=matchedMap.find(ui); +- if(it != matchedMap.end()) +- continue; +- + #pragma omp critical +- outIons.push_back(inIons[ui]); ++ matchedMap[ui]=tree.getOrigIndex(nearestVec[ui]); + } +- break; + } +- case REPLACE_MODE_INTERSECT: ++ ++ nearestVec.clear(); ++ ++ ++ progress.step=4; ++ progress.stepName=TRANS("Compute"); ++ progress.filterProgress=0; ++ ++ ++ //now we have a map that matches as so: ++ // map ( "inIon" ID -> "fileIon" ID) ++ // inIon should be our "A" in "A operator B" ++ switch(replaceMode) + { +- outIons.reserve(matchedMap.size()); +- +- if(replaceMass) ++ case REPLACE_MODE_SUBTRACT: + { +- for(map::const_iterator it=matchedMap.begin();it!=matchedMap.end();++it) ++ //If no matches, A-0 = A. Just return input ++ if(matchedMap.empty()) + { +- outIons.push_back(fileIons[it->second]); +- ASSERT(fileIons[it->second].getPosRef().sqrDist(inIons[it->first].getPosRef()) < sqrReplaceTol); ++ outIons.swap(inIons); ++ break; + } ++ //In subtraction mode, we should have ++ // at least this many ions ++ if(inIons.size() > matchedMap.size()) ++ outIons.reserve(inIons.size()-matchedMap.size()); ++ ++ // ++ #pragma omp parallel for ++ for(unsigned int ui=0;ui::iterator it; ++ it=matchedMap.find(ui); ++ if(it != matchedMap.end()) ++ continue; ++ ++ #pragma omp critical ++ outIons.push_back(inIons[ui]); ++ } ++ break; + } +- else ++ case REPLACE_MODE_INTERSECT: + { +- for(map::const_iterator it=matchedMap.begin();it!=matchedMap.end();++it) ++ //Finish if no matches ++ if(matchedMap.empty()) ++ break; ++ ++ outIons.reserve(matchedMap.size()); ++ ++ if(replaceMass) + { +- outIons.push_back(inIons[it->first]); ++ for(map::const_iterator it=matchedMap.begin();it!=matchedMap.end();++it) ++ { ++ outIons.push_back(fileIons[it->second]); ++ ASSERT(fileIons[it->second].getPosRef().sqrDist(inIons[it->first].getPosRef()) < sqrReplaceTol); ++ } + } ++ else ++ { ++ for(map::const_iterator it=matchedMap.begin();it!=matchedMap.end();++it) ++ { ++ outIons.push_back(inIons[it->first]); ++ } ++ } ++ break; + } +- break; ++ case REPLACE_MODE_UNION: ++ { ++ outIons.swap(fileIons); ++ outIons.reserve(outIons.size() + fileIons.size() - matchedMap.size()); ++ map::const_iterator it=matchedMap.begin(); ++ ++ ++ for(unsigned int ui=0;uifirst == ui) ) ++ { ++ it++; ++ continue; ++ } ++ ++ ++ outIons.push_back(inIons[ui]); ++ } ++ ++ ++ break; ++ } ++ default: ++ ASSERT(false); + } +- case REPLACE_MODE_UNION: +- { +- ASSERT(false); +- break; +- } +- default: +- ASSERT(false); + } + + //Only output ions if any were found +@@ -2779,6 +2844,8 @@ + newD->data.resize(d->data.size()); + if(stopMode == STOP_MODE_NEIGHBOUR) + { ++ unsigned int nProg=0; ++ + bool spin=false; + #pragma omp parallel for shared(spin) + for(size_t uj=0;ujdata.size();uj++) +@@ -2811,14 +2878,15 @@ + } + + res.clear(); ++ #pragma atomic ++ nProg++; + + //Update progress as needed + if(!curProg--) + { + #pragma omp critical + { +- n+=NUM_CALLBACK/(nnMax); +- progress.filterProgress= (unsigned int)(((float)n/(float)totalDataSize)*100.0f); ++ progress.filterProgress= (unsigned int)(((float)nProg/(float)totalDataSize)*100.0f); + if(*Filter::wantAbort) + spin=true; + curProg=NUM_CALLBACK/(nnMax); +@@ -3063,9 +3131,10 @@ + IonStreamData *newD = new IonStreamData; + newD->parent=this; + +- //Adjust this number to provide more update thanusual, because we ++ //Adjust this number to provide more update than usual, because we + //are not doing an o(1) task between updates; yes, it is a hack +- unsigned int curProg=NUM_CALLBACK/(10*nnMax); ++ const unsigned int PROG_PER_PASS=NUM_CALLBACK/(10*nnMax); ++ unsigned int curProg=PROG_PER_PASS; + newD->data.reserve(d->data.size()); + if(stopMode == STOP_MODE_NEIGHBOUR) + { +@@ -3113,11 +3182,11 @@ + { + #pragma omp critical + { +- n+=NUM_CALLBACK/(nnMax); ++ n+=PROG_PER_PASS; + progress.filterProgress= (unsigned int)(((float)n/(float)totalDataSize)*100.0f); + if(*Filter::wantAbort) + spin=true; +- curProg=NUM_CALLBACK/(nnMax); ++ curProg=PROG_PER_PASS; + } + } + } +@@ -3263,6 +3332,8 @@ + break; + } + } ++ progress.filterProgress=100; ++ + //If we have bad points, let the user know. + if(!badPts.empty()) + { +@@ -4230,11 +4301,8 @@ + } + + //distance between search pt and found pt +- float sqrDistance; +- sqrDistance = searchTree.getPtRef(ptIdx).sqrDist(pSource[ui].getPosRef()); +- +- if(sqrDistance > DISTANCE_EPSILON) +- ptsFound.insert(ptIdx); ++ ++ ptsFound.insert(ptIdx); + } + + +@@ -4244,8 +4312,14 @@ + //Count the number of numerator and denominator ions, using the masses we set aside earlier + for(set::iterator it=ptsFound.begin(); it!=ptsFound.end(); ++it) + { ++ ++ //check that the distance is non-zero, to force no self-matching ++ float sqrDistance; ++ sqrDistance = searchTree.getPtRef(*it).sqrDist(pSource[ui].getPosRef()); ++ if(sqrDistance < DISTANCE_EPSILON) ++ continue; ++ + float ionMass; +- //check that the distance is non-zero, to force no self-matching + ionMass = dataMasses[searchTree.getOrigIndex(*it)]; + + unsigned int ionID; +@@ -4326,9 +4400,11 @@ + bool nnHistogramTest(); + bool rdfPlotTest(); + bool axialDistTest(); +-bool replaceTest(); ++bool replaceIntersectAndUnionTest(); + bool localConcTestRadius(); + bool localConcTestNN(); ++bool replaceSubtractTest(); ++bool replaceUnionTest(); + + bool SpatialAnalysisFilter::runUnitTests() + { +@@ -4343,8 +4419,15 @@ + + if(!axialDistTest()) + return false; +- if(!replaceTest()) ++ if(!replaceIntersectAndUnionTest()) + return false; ++ ++ if(!replaceSubtractTest()) ++ return false; ++ ++ if(!replaceUnionTest()) ++ return false; ++ + if(!localConcTestRadius()) + return false; + +@@ -4617,7 +4700,7 @@ + return true; + } + +-bool replaceTest() ++bool replaceIntersectAndUnionTest() + { + std::string ionFile=createTmpFilename(NULL,".pos"); + +@@ -4637,6 +4720,157 @@ + //Create a spatial analysis filter + SpatialAnalysisFilter *f=new SpatialAnalysisFilter; + f->setCaching(false); ++ //Set it to do a union calculation ++ bool needUp; ++ string s; ++ s=TRANS(SPATIAL_ALGORITHMS[ALGORITHM_REPLACE]); ++ TEST(f->setProperty(KEY_ALGORITHM,s,needUp),"Set prop"); ++ TEST(f->setProperty(KEY_REPLACE_FILE,ionFile,needUp),"Set prop"); ++ s="1"; ++ TEST(f->setProperty(KEY_REPLACE_VALUE,s,needUp),"Set prop"); ++ ++ vector opVec; ++ opVec.push_back(REPLACE_MODE_INTERSECT); ++ opVec.push_back(REPLACE_MODE_UNION); ++ ++ ProgressData p; ++ vector streamIn,streamOut; ++ streamIn.push_back(d); ++ for(unsigned int opId=0;opIdsetProperty(KEY_REPLACE_ALGORITHM,s,needUp),"Set prop"); ++ ++ //Do the refresh ++ TEST(!f->refresh(streamIn,streamOut,p),"refresh OK"); ++ ++ TEST(streamOut.size() == 1,"stream count"); ++ TEST(streamOut[0]->getStreamType() == STREAM_TYPE_IONS,"stream type"); ++ TEST(streamOut[0]->getNumBasicObjects() == NIONS,"Number objects"); ++ ++ //we should have taken the mass-to-charge from the file ++ const IonStreamData *outIons = (const IonStreamData*)streamOut[0]; ++ for(unsigned int ui=0;uidata[ui].getMassToCharge() == 1); ++ } ++ delete streamOut[0]; ++ streamOut.clear(); ++ } ++ delete f; ++ delete d; ++ ++ wxRemoveFile(ionFile); ++ ++ ++ return true; ++} ++ ++bool replaceSubtractTest() ++{ ++ std::string ionFile=createTmpFilename(NULL,".pos"); ++ ++ vector ions; ++ const unsigned int NIONS=10; ++ const unsigned int DIFF_COUNT=5; ++ for(unsigned int ui=0;ui tmpI; ++ for(unsigned int ui=0;uidata.swap(ions); ++ ++ //Create a spatial analysis filter ++ SpatialAnalysisFilter *f=new SpatialAnalysisFilter; ++ f->setCaching(false); ++ ++ //Set it to do a subtraction calculation ++ bool needUp; ++ string s; ++ s=TRANS(SPATIAL_ALGORITHMS[ALGORITHM_REPLACE]); ++ TEST(f->setProperty(KEY_ALGORITHM,s,needUp),"Set prop"); ++ TEST(f->setProperty(KEY_REPLACE_FILE,ionFile,needUp),"Set prop"); ++ s=TRANS(REPLACE_ALGORITHMS[REPLACE_MODE_SUBTRACT]); ++ TEST(f->setProperty(KEY_REPLACE_ALGORITHM,s,needUp),"Set prop"); ++ ++ //Do the refresh ++ ProgressData p; ++ vector streamIn,streamOut; ++ streamIn.push_back(d); ++ TEST(!f->refresh(streamIn,streamOut,p),"refresh OK"); ++ delete f; ++ delete d; ++ streamIn.clear(); ++ ++ TEST(streamOut.size() == 1,"stream count"); ++ TEST(streamOut[0]->getStreamType() == STREAM_TYPE_IONS,"stream type"); ++ TEST(streamOut[0]->getNumBasicObjects() == DIFF_COUNT,"Number objects"); ++ ++ //we should have taken the mass-to-charge from the original data, ++ // not the file ++ const IonStreamData *outIons = (const IonStreamData*)streamOut[0]; ++ for(unsigned int ui=0;uigetNumBasicObjects(); ui++) ++ { ++ ASSERT(outIons->data[ui].getMassToCharge() == 1); ++ ASSERT(outIons->data[ui].getPos()[2] >= 0); ++ } ++ ++ wxRemoveFile(ionFile); ++ ++ delete streamOut[0]; ++ ++ return true; ++} ++ ++bool replaceUnionTest() ++{ ++ std::string ionFile=createTmpFilename(NULL,".pos"); ++ ++ //"B" dataset ++ vector ions; ++ ions.push_back(IonHit(Point3D(0,0,0),1)); ++ ions.push_back(IonHit(Point3D(1,0,1),1)); ++ ions.push_back(IonHit(Point3D(0,1,1),1)); ++ ++ IonHit::makePos(ions,ionFile.c_str()); ++ ions.clear(); ++ ++ //"A" dataset ++ ions.push_back(IonHit(Point3D(0,0,0),2)); ++ ions.push_back(IonHit(Point3D(1,0,-1),2)); ++ ions.push_back(IonHit(Point3D(0,1,-1),2)); ++ ++ ++ IonStreamData *d = new IonStreamData; ++ d->data.swap(ions); ++ ++ //Create a spatial analysis filter ++ SpatialAnalysisFilter *f=new SpatialAnalysisFilter; ++ f->setCaching(false); + + //Set it to do a union calculation + bool needUp; +@@ -4644,13 +4878,11 @@ + s=TRANS(SPATIAL_ALGORITHMS[ALGORITHM_REPLACE]); + TEST(f->setProperty(KEY_ALGORITHM,s,needUp),"Set prop"); + TEST(f->setProperty(KEY_REPLACE_FILE,ionFile,needUp),"Set prop"); +- s=TRANS(REPLACE_ALGORITHMS[REPLACE_MODE_INTERSECT]); ++ s=TRANS(REPLACE_ALGORITHMS[REPLACE_MODE_UNION]); + TEST(f->setProperty(KEY_REPLACE_ALGORITHM,s,needUp),"Set prop"); +- + s="1"; + TEST(f->setProperty(KEY_REPLACE_VALUE,s,needUp),"Set prop"); + +- + //Do the refresh + ProgressData p; + vector streamIn,streamOut; +@@ -4662,14 +4894,16 @@ + + TEST(streamOut.size() == 1,"stream count"); + TEST(streamOut[0]->getStreamType() == STREAM_TYPE_IONS,"stream type"); +- TEST(streamOut[0]->getNumBasicObjects() == NIONS,"Number objects"); +- +- //we should have taken the mass-to-charge from the file ++ TEST(streamOut[0]->getNumBasicObjects() == 5,"Number objects"); ++ ++ //There should be + const IonStreamData *outIons = (const IonStreamData*)streamOut[0]; +- for(unsigned int ui=0;uigetNumBasicObjects(); ui++) + { +- ASSERT(outIons->data[ui].getMassToCharge() == 1); ++ sumV+=outIons->data[ui].getMassToCharge(); + } ++ TEST( EQ_TOL(sumV,7.0f),"mass-to-charge check"); + + wxRemoveFile(ionFile); + +@@ -4678,7 +4912,6 @@ + return true; + } + +- + //--- Local concentration tests -- + const IonStreamData *createLCIonStream() + { +diff -r bcb9acfa66de -r effd078610a7 src/backend/filters/spectrumPlot.cpp +--- src/backend/filters/spectrumPlot.cpp Tue May 31 13:04:58 2016 +1000 ++++ src/backend/filters/spectrumPlot.cpp Tue Jun 21 12:45:20 2016 +0100 +@@ -517,6 +517,8 @@ + + getOut.push_back(d); + ++ progress.filterProgress=100; ++ + return 0; + } + +diff -r bcb9acfa66de -r effd078610a7 src/backend/filters/transform.cpp +--- src/backend/filters/transform.cpp Tue May 31 13:04:58 2016 +1000 ++++ src/backend/filters/transform.cpp Tue Jun 21 12:45:20 2016 +0100 +@@ -998,8 +998,10 @@ + break; + } + ++ } + } +- } ++ ++ progress.filterProgress=100; + } + else + { +@@ -1526,6 +1528,11 @@ + case KEY_CROP_MINIMUM: + { + ASSERT(scalarParams.size() ==2); ++ float tmp; ++ if(stream_cast(tmp,value) || tmp >=scalarParams[1]) ++ return false; ++ ++ + if(!applyPropertyNow(scalarParams[0],value,needUpdate)) + return false; + break; +@@ -1533,6 +1540,9 @@ + case KEY_CROP_MAXIMUM: + { + ASSERT(scalarParams.size() ==2); ++ float tmp; ++ if(stream_cast(tmp,value) || tmp <=scalarParams[0]) ++ return false; + if(!applyPropertyNow(scalarParams[1],value,needUpdate)) + return false; + break; +diff -r bcb9acfa66de -r effd078610a7 src/backend/plot.cpp +--- src/backend/plot.cpp Tue May 31 13:04:58 2016 +1000 ++++ src/backend/plot.cpp Tue Jun 21 12:45:20 2016 +0100 +@@ -29,7 +29,7 @@ + NTRANS("Moving avg.") + }; + +-const char *plotTypeStrings[]= { ++const char *traceStyleStrings[]= { + NTRANS("Lines"), + NTRANS("Bars"), + NTRANS("Steps"), +@@ -119,15 +119,15 @@ + string plotString(unsigned int plotMode) + { + ASSERT(plotMode< PLOT_TYPE_ENUM_END); +- return TRANS(plotTypeStrings[plotMode]); ++ return TRANS(traceStyleStrings[plotMode]); + } + + unsigned int plotID(const std::string &plotString) + { +- COMPILE_ASSERT(THREEDEP_ARRAYSIZE(plotTypeStrings) == PLOT_TYPE_ENUM_END); ++ COMPILE_ASSERT(THREEDEP_ARRAYSIZE(traceStyleStrings) == PLOT_TYPE_ENUM_END); + for(unsigned int ui=0;uigetPlotMode(); ++} ++ + void PlotWrapper::getVisibleIDs(vector &visiblePlotIDs ) const + { + +@@ -791,7 +797,7 @@ + if(!plottingData[ui]->visible) + continue; + +- if(plottingData[ui]->getType()!= PLOT_MODE_1D) ++ if(plottingData[ui]->getMode()!= PLOT_MODE_1D) + continue; + + if(((Plot1D*)plottingData[ui])->wantLogPlot()) +@@ -809,7 +815,7 @@ + float minYVal=0.1; + for(size_t ui=0;uivisible || plottingData[ui]->getType() !=PLOT_MODE_1D) ++ if(!plottingData[ui]->visible || plottingData[ui]->getMode() !=PLOT_MODE_1D) + continue; + + float tmp ; +@@ -929,7 +935,7 @@ + Plot2DFunc *curPlot; + curPlot=(Plot2DFunc*)plottingData[ui]; + +- if(curPlot->getType() == PLOT_2D_DENS) ++ if(curPlot->getMode() == PLOT_2D_DENS) + { + wantColourbar=true; + } +@@ -1047,11 +1053,6 @@ + plottingData[plotIDHandler.getPos(plotId)]->regionGroup.getRegion(regionId,region); + } + +-unsigned int PlotWrapper::plotType(unsigned int plotId) const +-{ +- return plottingData[plotIDHandler.getPos(plotId)]->getPlotMode(); +-} +- + + void PlotWrapper::moveRegion(unsigned int plotID, unsigned int regionId, bool regionSelfUpdate, + unsigned int movementType, float newX, float newY) const +@@ -1135,7 +1136,7 @@ + + void PlotBase::copyBase(PlotBase *target) const + { +- target->plotType=plotType; ++ target->traceStyle=traceStyle; + target->minX=minX; + target->maxX=maxX; + target->minY=minY; +@@ -1157,12 +1158,12 @@ + + unsigned int PlotBase::getType() const + { +- return plotType; ++ return traceStyle; + } + + unsigned int PlotBase::getMode() const + { +- switch(plotType) ++ switch(traceStyle) + { + case PLOT_LINE_LINES: + case PLOT_LINE_BARS: +@@ -1181,7 +1182,7 @@ + Plot1D::Plot1D() + { + //Set the default plot properties +- plotType=PLOT_LINE_LINES; ++ traceStyle=PLOT_LINE_LINES; + plotMode=PLOT_MODE_1D; + xLabel=""; + yLabel=""; +@@ -1489,7 +1490,7 @@ + + + //Plot the appropriate form +- switch(plotMode) ++ switch(traceStyle) + { + case PLOT_LINE_LINES: + //Unfortunately, when using line plots, mathgl moves the data points to the plot boundary, +@@ -1632,7 +1633,7 @@ + Plot2DFunc::Plot2DFunc() + { + plotMode = PLOT_MODE_2D; +- plotType=PLOT_2D_DENS; ++ traceStyle=PLOT_2D_DENS; + } + + void Plot2DFunc::setData(const Array2D &a, +@@ -1705,7 +1706,8 @@ + + Plot2DScatter::Plot2DScatter() + { +- plotType=PLOT_2D_SCATTER; ++ plotMode=PLOT_2D_SCATTER; ++ traceStyle=PLOT_LINE_POINTS; + scatterIntensityLog=false; + } + +diff -r bcb9acfa66de -r effd078610a7 src/backend/plot.h +--- src/backend/plot.h Tue May 31 13:04:58 2016 +1000 ++++ src/backend/plot.h Tue Jun 21 12:45:20 2016 +0100 +@@ -217,7 +217,7 @@ + class PlotBase + { + protected: +- //!Sub type of plot (eg lines, bars for 1D) ++ //!Type of plot + unsigned int plotMode; + //!xaxis label + std::string xLabel; +@@ -229,8 +229,9 @@ + //plot colour (for single coloured plots) + float r,g,b; + +- //The type of plot (ie what class is it?) +- unsigned int plotType; ++ //The sub-style of the plot trace (eg lines, points, bars, etc) ++ // FIXME: This is badly named, change to traceStyle, or dataStyle, or something ++ unsigned int traceStyle; + + void copyBase(PlotBase *target) const; + +@@ -297,8 +298,12 @@ + void setStrings(const std::string &x, + const std::string &y,const std::string &t); + ++ //Set the colour of the plot trace + void setColour(float rNew, float gNew, float bNew); + ++ //set the visual style for the trace (dots, lines, etc) ++ void setTraceStyle(unsigned int newStyle) { traceStyle=newStyle;} ++ + std::string getXLabel() const { return xLabel;} + std::string getTitle() const { return title;} + std::string getYLabel() const { return yLabel;} +@@ -309,6 +314,7 @@ + void setPlotMode(unsigned int newMode) { plotMode= newMode;} + + ++ //get the colour of the trace + void getColour(float &r, float &g, float &b) const ; + + #ifdef DEBUG +@@ -613,7 +619,7 @@ + + + //!obtain the type of a plot, given the plot's uniqueID +- unsigned int plotType(unsigned int plotId) const; ++ unsigned int getPlotMode(unsigned int plotId) const; + + //Retrieve the types of visible plots + unsigned int getVisibleMode() const; +diff -r bcb9acfa66de -r effd078610a7 src/backend/viscontrol.cpp +--- src/backend/viscontrol.cpp Tue May 31 13:04:58 2016 +1000 ++++ src/backend/viscontrol.cpp Tue Jun 21 12:45:20 2016 +0100 +@@ -249,7 +249,7 @@ + plotData->yLabel,plotData->dataLabel); + + //set the appearance of the plot +- //plotNew->setTraceStyle(plotStyle); ++ plotNew->setTraceStyle(plotData->plotStyle); + plotNew->setColour(plotData->r,plotData->g,plotData->b); + + +@@ -275,7 +275,7 @@ + unsigned int plotID; + + PlotBase *plotNew; +- switch(plotData->plotType) ++ switch(plotData->plotStyle) + { + case PLOT_2D_DENS: + { +diff -r bcb9acfa66de -r effd078610a7 src/common/basics.cpp +--- src/common/basics.cpp Tue May 31 13:04:58 2016 +1000 ++++ src/common/basics.cpp Tue Jun 21 12:45:20 2016 +0100 +@@ -1347,7 +1347,8 @@ + while(CFile.good() && !CFile.eof() && atHeader) + { + //Grab a line from the file +- CFile.getline(inBuffer,BUFFER_SIZE); ++ if(!CFile.getline(inBuffer,BUFFER_SIZE)) ++ break; + + if(!CFile.good()) + return ERR_FILE_FORMAT; +@@ -1457,10 +1458,8 @@ + + } + //Grab a line from the file +- CFile.getline(inBuffer,BUFFER_SIZE); +- +- if(!CFile.good() && !CFile.eof()) +- return ERR_FILE_FORMAT; ++ if(!CFile.getline(inBuffer,BUFFER_SIZE)) ++ break; + } + + return 0; +diff -r bcb9acfa66de -r effd078610a7 src/gui/mainFrame.cpp +--- src/gui/mainFrame.cpp Tue May 31 13:04:58 2016 +1000 ++++ src/gui/mainFrame.cpp Tue Jun 21 12:45:20 2016 +0100 +@@ -1391,7 +1391,7 @@ + updateWxTreeCtrl(treeFilters); + + if(!noUpdate) +- return doSceneUpdate(true); ++ doSceneUpdate(true); + + return true; + } +@@ -3834,7 +3834,7 @@ + + } + +-bool MainWindowFrame::doSceneUpdate(bool ensureVisible) ++void MainWindowFrame::doSceneUpdate(bool ensureVisible) + { + //Update scene + ASSERT(!currentlyUpdatingScene); +@@ -3864,6 +3864,11 @@ + ensureResultVisible=ensureVisible; + + ASSERT(!refreshControl); ++ ++ //Hack to prevent crash on double-refresh ++ if(refreshControl) ++ return; ++ + refreshControl = new RefreshController(visControl.state.treeState); + refreshThread=new RefreshThread(this,refreshControl); + progressTimer->Start(PROGRESS_TIMER_DELAY); +@@ -3871,7 +3876,8 @@ + refreshThread->Create(); + refreshThread->Run(); + +- return true; ++ cerr << "Updating scene complete"<< endl; ++ return; + } + + void MainWindowFrame::updateWxTreeCtrl( wxTreeCtrl *t, const Filter *f) +@@ -3971,6 +3977,11 @@ + ASSERT(!visControl.state.treeState.isRefreshing()); + progressTimer->Stop(); + ++ //Hack to prevent crash on re-entry during refresh. Should never trigger. ++ if(!refreshControl) ++ return; ++ ++ + vector > consoleMessages; + consoleMessages=refreshControl->getConsoleMessages(); + +diff -r bcb9acfa66de -r effd078610a7 src/gui/mainFrame.h +--- src/gui/mainFrame.h Tue May 31 13:04:58 2016 +1000 ++++ src/gui/mainFrame.h Tue Jun 21 12:45:20 2016 +0100 +@@ -124,7 +124,7 @@ + //!Update the progress information in the status bar + void updateProgressStatus(); + //!Perform an update to the 3D Scene. Returns false if refresh failed +- bool doSceneUpdate(bool ensureResultVisible=false); ++ void doSceneUpdate(bool ensureResultVisible=false); + + //!Complete the scene update. Returns false if failed + void finishSceneUpdate(unsigned int errCode); +diff -r bcb9acfa66de -r effd078610a7 src/gui/mathglPane.cpp +--- src/gui/mathglPane.cpp Tue May 31 13:04:58 2016 +1000 ++++ src/gui/mathglPane.cpp Tue Jun 21 12:45:20 2016 +0100 +@@ -627,7 +627,7 @@ + thePlot->getRegion(plotId,regionId,r); + + //TODO: Implement a more generic region handler? +- ASSERT(thePlot->plotType(plotId) == PLOT_MODE_1D); ++ ASSERT(thePlot->getPlotMode(plotId) == PLOT_MODE_1D); + + float mglStartX,mglStartY; + toPlotCoords(draggingStart.x, draggingStart.y,mglStartX,mglStartY); +@@ -1471,7 +1471,7 @@ + return; + + +- ASSERT(thePlot->plotType(startMousePlot) == PLOT_MODE_1D); ++ ASSERT(thePlot->getPlotMode(startMousePlot) == PLOT_MODE_1D); + + //See where extending the region is allowed up to. + thePlot->findRegionLimit(startMousePlot,startMouseRegion, +@@ -1550,7 +1550,7 @@ + { + //This needs to be extended to support more + //plot types. +- ASSERT(thePlot->plotType(startMousePlot) == PLOT_MODE_1D); ++ ASSERT(thePlot->getPlotMode(startMousePlot) == PLOT_MODE_1D); + + //Draw "ghost" limits markers for move, + //these appear as moving vertical bars to outline +diff -r bcb9acfa66de -r effd078610a7 src/wx/wxcomponents.cpp +--- src/wx/wxcomponents.cpp Tue May 31 13:04:58 2016 +1000 ++++ src/wx/wxcomponents.cpp Tue Jun 21 12:45:20 2016 +0100 +@@ -188,14 +188,14 @@ + + void CopyGrid::saveData() + { +- wxFileDialog *wxF = new wxFileDialog(this,TRANS("Save Data..."), wxT(""), ++ wxFileDialog wxF(this,TRANS("Save Data..."), wxT(""), + wxT(""),TRANS("Text File (*.txt)|*.txt|All Files (*)|*"),wxFD_SAVE); + +- if( (wxF->ShowModal() == wxID_CANCEL)) ++ if( (wxF.ShowModal() == wxID_CANCEL)) + return; + + +- std::string dataFile = stlStr(wxF->GetPath()); ++ std::string dataFile = stlStr(wxF.GetPath()); + ofstream f(dataFile.c_str()); + + if(!f) diff --git a/3Depict.spec b/3Depict.spec new file mode 100644 index 0000000..03a4d45 --- /dev/null +++ b/3Depict.spec @@ -0,0 +1,257 @@ +Name: 3Depict +Version: 0.0.19 +Release: 1%{?dist} +Summary: Valued 3D point cloud visualization and analysis +Group: Applications/Engineering + + +License: GPLv3+ +URL: http://threedepict.sourceforge.net +Source0: http://downloads.sourceforge.net/threedepict/%{name}-%{version}.tar.gz + + +#Mathgl for plotting +BuildRequires: mathgl-devel +#Mesa for GLU +BuildRequires: libGL-devel +#Libxml2 for file parsing +BuildRequires: libxml2-devel +#FTGL for 3d fonts +BuildRequires: ftgl-devel +#libpng for textures +BuildRequires: libpng-devel +#Desktop file utils for installing desktop file +BuildRequires: desktop-file-utils +#WX widgets +BuildRequires: wxGTK3-devel +#Vigra, for voxelisation +BuildRequires: vigra-devel + +#PDF latex build +#BuildRequires: tex(latex) + +#Required for surface removal algorithms +BuildRequires: qhull-devel + +#Fedora specific PDF dir. +Patch0: %{name}-%{version}-manual-pdf-loc.patch +#Fedora specific font dir +Patch1: %{name}-%{version}-font-path.patch +#Upstream post-release patches from hg repo +Patch2: %{name}-%{version}-upstream-effd078610a7.patch + +%description +This software is designed to help users visualize and analyze 3D point clouds +with an associated real value, in a fast and flexible fashion. It is +specifically targeted to atom probe tomography applications, but may be +useful for general scalar valued point data purposes. + +%prep + +%setup -q + +%patch0 +%patch1 +%patch2 + +%if 0%{?fedora} > 24 +# Installation directory has changed +sed -i -e 's,qhull/qhull_a.h,libqhull/qhull_a.h,' \ + src/backend/filters/filterCommon.h \ + src/backend/filters/algorithms/rdf.cpp \ + configure configure.ac +# Avoid rerunning the autotools +touch -r aclocal.m4 configure configure.ac +%endif + +%build +#Due to bug 1077718, wx-config cannot be specified, due to +# wx2/wx3 conflict. +%configure --disable-debug-checks --enable-openmp-parallel --with-wx-config=wx-config-3.0 +make %{?_smp_mflags} + +%install +make install DESTDIR=%{buildroot} + +# Install the textures +mkdir -p %{buildroot}%{_datadir}/%{name}/textures +cp -p data/textures/*png %{buildroot}%{_datadir}/%{name}/textures/ + + +#Install the manpage +install -Dp -m 644 packaging/manpage/%{name}.1 %{buildroot}%{_mandir}/man1/%{name}.1 + +desktop-file-install \ + --dir %{buildroot}%{_datadir}/applications \ + packaging/%{name}.desktop +mkdir -p %{buildroot}%{_datadir}/pixmaps/ +install -Dp -m 644 data/textures/tex-source/%{name}-icon.svg %{buildroot}%{_datadir}/pixmaps/%{name}.svg + +#install language files +#-- +#Remap locale names +mv locales/de_DE/ locales/de/ + +mkdir -p %{buildroot}/%{_datadir}/locale/ +cp -R locales/* %{buildroot}/%{_datadir}/locale/ + +#Restore the internal build's locale naming +mv locales/de/ locales/de_DE/ +#-- + + +#Move the documentation such that it is picked up by the doc macro +mv docs/manual-latex/manual.pdf %{name}-%{version}-manual.pdf + +#Locale stuff +%find_lang %{name} + + +%files -f %{name}.lang +%license COPYING +%doc AUTHORS ChangeLog README TODO %{name}-%{version}-manual.pdf +%{_bindir}/%{name} +%dir %{_datadir}/%{name}/ +%dir %{_datadir}/%{name}/textures +%{_datadir}/%{name}/textures/*.png +%{_datadir}/applications/%{name}.desktop +%{_mandir}/man1/%{name}.1.* +%{_datadir}/pixmaps/*.svg + + +%changelog +* Wed Jun 01 2016 D Haley - 0.0.19-1 +- Update to 0.0.19 +- Remove gcc patch, fixed upstream +- Add upstream patch + +* Fri Apr 29 2016 Ralf Corsépius - 0.0.18-7 +- Rebuild for qhull-2015.2-1. +- Reflect qhull_a.h's location having changed. + +* Tue Mar 8 2016 Orion Poplawski - 0.0.18-6 +- Add patch for fix compilation with gcc 6 + +* Mon Feb 22 2016 Orion Poplawski - 0.0.18-5 +- Rebuild for gsl 2.1 +- Cleanup spec + +* Wed Feb 03 2016 Fedora Release Engineering - 0.0.18-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild + +* Sun Nov 29 2015 Kalev Lember - 0.0.18-3 +- Rebuilt for libmgl soname bump + +* Tue Jun 16 2015 Fedora Release Engineering - 0.0.18-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild + +* Fri May 01 2015 D Haley - 0.0.18-1 +- Update to 0.0.18 + +* Sat Oct 11 2014 D Haley - 0.0.17-2 +- Rebuild for mathgl 2.3 + +* Sun Sep 28 2014 D Haley - 0.0.17-1 +- Update to 0.0.17 + +* Fri Jun 06 2014 Fedora Release Engineering - 0.0.16-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild + +* Sat Apr 26 2014 D Haley - 0.0.16-1 +- Update to 0.0.16 + +* Wed Feb 12 2014 D Haley - 0.0.15-4 +- Rebuild for mgl + +* Wed Feb 05 2014 D Haley - 0.0.15-3 +- Rebuild for new mgl +- Add upstream patches + +* Sun Jan 26 2014 D Haley - 0.0.15-2 +- Rebuild for new mgl + +* Sun Dec 01 2013 D Haley - 0.0.15-1 +- Update to 0.0.15 + +* Fri Aug 02 2013 Fedora Release Engineering - 0.0.14-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild + +* Sat Jul 20 2013 D Haley - 0.0.14-1 +- Update to 0.0.14 + +* Tue Jun 25 2013 D Haley - 0.0.13-2 +- Enable mathgl2 + +* Fri Apr 12 2013 D Haley - 0.0.13-1 +- Update to 0.0.13 + +* Sat Mar 23 2013 D Haley - 0.0.12-4 +- Add aarch 64 patch for bug 924960, until next version + +* Wed Feb 13 2013 Fedora Release Engineering - 0.0.12-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild + +* Sun Dec 9 2012 D Haley - 0.0.12-2 +- Import bugfixes from upstream for plot UI and crash fixes + +* Sun Nov 25 2012 D Haley - 0.0.12-1 +- Update to 0.0.12 + +* Mon Apr 2 2012 D Haley - 0.0.10-1 +- Update to 0.0.10 + +* Tue Feb 28 2012 Fedora Release Engineering - 0.0.9-4 +- Rebuilt for c++ ABI breakage + +* Thu Jan 12 2012 D Haley - 0.0.9-3 +- Patch to fix FTFBS for gcc 4.7 + +* Thu Jan 12 2012 Fedora Release Engineering - 0.0.9-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild + +* Sat Dec 17 2011 D Haley - 0.0.9-1 +- Update to 0.0.9 + +* Tue Dec 06 2011 Adam Jackson - 0.0.8-3 +- Rebuild for new libpng + +* Sat Oct 29 2011 D Haley - 0.0.8-2 +- Post release fixes for various crash bugs + +* Sun Oct 23 2011 D Haley - 0.0.8-1 +- Update to 0.0.8 + +* Sun Aug 14 2011 D Haley - 0.0.7-1 +- Update to 0.0.7 + +* Fri May 20 2011 D Haley - 0.0.6-1 +- Update to 0.0.6 + +* Sun Mar 27 2011 D Haley - 0.0.5-1 +- New upstream release + +* Sun Mar 13 2011 D Haley - 0.0.4-3 +- Patch opengl startup code -- peek at gl context. Possible fix for bug 684390 + +* Sat Feb 12 2011 D Haley - 0.0.4-2 +- Fix bug 677016 - 3Depict no built with rpm opt flags + +* Sat Jan 22 2011 D Haley - 0.0.4-1 +- Update to 0.0.4 + +* Fri Nov 26 2010 D Haley - 0.0.3-1 +- Update to 0.0.3 + +* Tue Oct 5 2010 D Haley - 0.0.2-3 +- Use tex(latex) virtual package in preference to texlive-latex + +* Mon Oct 4 2010 D Haley - 0.0.2-2 +- Add latex build for manual + +* Sat Sep 25 2010 D Haley - 0.0.2-1 +- Update to 0.0.2 +- Address comments in package review + +* Sun Aug 08 2010 D Haley - 0.0.1-1 +- Initial package + diff --git a/dead.package b/dead.package deleted file mode 100644 index 5204a84..0000000 --- a/dead.package +++ /dev/null @@ -1 +0,0 @@ -Orphaned for 6+ weeks diff --git a/sources b/sources new file mode 100644 index 0000000..768b71f --- /dev/null +++ b/sources @@ -0,0 +1 @@ +09f6e960a3a2e7e2a217e64930a1a3d4 3Depict-0.0.19.tar.gz