diff --git a/src/Mod/Inspection/App/InspectionFeature.cpp b/src/Mod/Inspection/App/InspectionFeature.cpp index cdebaae2f178..6f4b53cdc030 100644 --- a/src/Mod/Inspection/App/InspectionFeature.cpp +++ b/src/Mod/Inspection/App/InspectionFeature.cpp @@ -751,8 +751,11 @@ App::DocumentObjectExecReturn* Feature::execute(void) } } - fRMS = fRMS / countRMS; - fRMS = sqrt(fRMS); + if (countRMS > 0) { + fRMS = fRMS / countRMS; + fRMS = sqrt(fRMS); + } + Base::Console().Message("RMS value for '%s' with search radius=%.4f is: %.4f\n", this->Label.getValue(), this->SearchRadius.getValue(), fRMS); diff --git a/src/Mod/Inspection/Gui/ViewProviderInspection.cpp b/src/Mod/Inspection/Gui/ViewProviderInspection.cpp index a70dc0731be9..8d2d3e46cc79 100644 --- a/src/Mod/Inspection/Gui/ViewProviderInspection.cpp +++ b/src/Mod/Inspection/Gui/ViewProviderInspection.cpp @@ -183,7 +183,7 @@ void ViewProviderInspection::updateData(const App::Property* prop) { // set to the expected size if (prop->getTypeId() == App::PropertyLink::getClassTypeId()) { - App::GeoFeature* object = static_cast(prop)->getValue(); + App::GeoFeature* object = dynamic_cast(prop)->getValue(); if (object) { float accuracy=0; Base::Type meshId = Base::Type::fromName("Mesh::Feature"); @@ -260,9 +260,10 @@ void ViewProviderInspection::updateData(const App::Property* prop) // force an update of the Inventor data nodes if (this->pcObject) { App::Property* link = this->pcObject->getPropertyByName("Actual"); - if (link) updateData(link); + if (link) + updateData(link); + setDistances(); } - setDistances(); } else if (prop->getTypeId() == App::PropertyFloat::getClassTypeId()) { if (strcmp(prop->getName(), "SearchRadius") == 0) { @@ -281,6 +282,9 @@ SoSeparator* ViewProviderInspection::getFrontRoot(void) const void ViewProviderInspection::setDistances() { + if (!pcObject) + return; + App::Property* pDistances = pcObject->getPropertyByName("Distances"); if (!pDistances) { SoDebugError::post("ViewProviderInspection::setDistances", "Unknown property 'Distances'"); diff --git a/src/Mod/Mesh/App/Core/Algorithm.cpp b/src/Mod/Mesh/App/Core/Algorithm.cpp index 4da823560800..520e3a9fc7af 100644 --- a/src/Mod/Mesh/App/Core/Algorithm.cpp +++ b/src/Mod/Mesh/App/Core/Algorithm.cpp @@ -1570,34 +1570,34 @@ bool MeshAlgorithm::ConnectPolygons(std::list > &clP std::list > &rclLines) const { - for(std::list< std::vector >::iterator OutIter = clPolyList.begin(); OutIter != clPolyList.end(); ++OutIter) - { - std::pair currentSort; - float fDist = Base::Distance(OutIter->front(),OutIter->back()); - currentSort.first = OutIter->front(); - currentSort.second = OutIter->back(); - - for(std::list< std::vector >::iterator InnerIter = clPolyList.begin(); InnerIter != clPolyList.end(); ++InnerIter) - { - if(OutIter == InnerIter) continue; + for (std::list< std::vector >::iterator OutIter = clPolyList.begin(); OutIter != clPolyList.end(); ++OutIter) { + if (OutIter->empty()) + continue; + std::pair currentSort; + float fDist = Base::Distance(OutIter->front(),OutIter->back()); + currentSort.first = OutIter->front(); + currentSort.second = OutIter->back(); + + for (std::list< std::vector >::iterator InnerIter = clPolyList.begin(); InnerIter != clPolyList.end(); ++InnerIter) { + if (OutIter == InnerIter) + continue; + + if (Base::Distance(OutIter->front(), InnerIter->front()) < fDist) { + currentSort.second = InnerIter->front(); + fDist = Base::Distance(OutIter->front(),InnerIter->front()); + } - if(Base::Distance(OutIter->front(),InnerIter->front()) < fDist) - { - currentSort.second = InnerIter->front(); - fDist = Base::Distance(OutIter->front(),InnerIter->front()); - } - if(Base::Distance(OutIter->front(),InnerIter->back()) < fDist) - { - currentSort.second = InnerIter->back(); - fDist = Base::Distance(OutIter->front(),InnerIter->back()); - } - } + if (Base::Distance(OutIter->front(), InnerIter->back()) < fDist) { + currentSort.second = InnerIter->back(); + fDist = Base::Distance(OutIter->front(),InnerIter->back()); + } + } - rclLines.push_front(currentSort); + rclLines.push_front(currentSort); - } + } - return true; + return true; } void MeshAlgorithm::GetFacetsFromPlane (const MeshFacetGrid &rclGrid, const Base::Vector3f& clNormal, float d, const Base::Vector3f &rclLeft, diff --git a/src/Mod/Mesh/App/Core/Approximation.cpp b/src/Mod/Mesh/App/Core/Approximation.cpp index 9f1e5623317a..068cdf81ca6c 100644 --- a/src/Mod/Mesh/App/Core/Approximation.cpp +++ b/src/Mod/Mesh/App/Core/Approximation.cpp @@ -107,9 +107,11 @@ void Approximation::AddPoints(const std::list &rsPointList) Base::Vector3f Approximation::GetGravity() const { Base::Vector3f clGravity; - for (std::list::const_iterator it = _vPoints.begin(); it!=_vPoints.end(); ++it) - clGravity += *it; - clGravity *= 1.0f / float(_vPoints.size()); + if (!_vPoints.empty()) { + for (std::list::const_iterator it = _vPoints.begin(); it!=_vPoints.end(); ++it) + clGravity += *it; + clGravity *= 1.0f / float(_vPoints.size()); + } return clGravity; } @@ -173,10 +175,10 @@ float PlaneFit::Fit() szz = szz - mz*mz/((double)nSize); #if defined(FC_USE_EIGEN) - Eigen::Matrix3d covMat = Eigen::Matrix3d::Zero(); - covMat(0,0) = sxx; - covMat(1,1) = syy; - covMat(2,2) = szz; + Eigen::Matrix3d covMat = Eigen::Matrix3d::Zero(); + covMat(0,0) = sxx; + covMat(1,1) = syy; + covMat(2,2) = szz; covMat(0,1) = sxy; covMat(1,0) = sxy; covMat(0,2) = sxz; covMat(2,0) = sxz; covMat(1,2) = syz; covMat(2,1) = syz; @@ -451,7 +453,7 @@ const double& QuadraticFit::GetCoeffArray() const double QuadraticFit::GetCoeff(unsigned long ulIndex) const { - assert( ulIndex >= 0 && ulIndex < 10 ); + assert(ulIndex < 10); if( _bIsFitted ) return _fCoeff[ ulIndex ]; @@ -636,9 +638,9 @@ double SurfaceFit::PolynomFit() // <=> sum[(P*Vi)*Vi] = sum[Vi*zi] // <=> sum[(Vi*Vi^t)*P] = sum[Vi*zi] where (Vi*Vi^t) is a symmetric matrix // <=> sum[(Vi*Vi^t)]*P = sum[Vi*zi] - Eigen::Matrix A = Eigen::Matrix::Zero(); - Eigen::Matrix b = Eigen::Matrix::Zero(); - Eigen::Matrix x = Eigen::Matrix::Zero(); + Eigen::Matrix A = Eigen::Matrix::Zero(); + Eigen::Matrix b = Eigen::Matrix::Zero(); + Eigen::Matrix x = Eigen::Matrix::Zero(); std::vector transform; transform.reserve(_vPoints.size()); @@ -765,7 +767,8 @@ double SurfaceFit::PolynomFit() // that 'sigma' becomes negative. if (sigma < 0) sigma = 0; - sigma = sqrt(sigma/_vPoints.size()); + if (!_vPoints.empty()) + sigma = sqrt(sigma/_vPoints.size()); _fLastResult = static_cast(sigma); return _fLastResult; diff --git a/src/Mod/Mesh/App/Core/Builder.cpp b/src/Mod/Mesh/App/Core/Builder.cpp index 4467004d3a6a..7dfd2acab699 100644 --- a/src/Mod/Mesh/App/Core/Builder.cpp +++ b/src/Mod/Mesh/App/Core/Builder.cpp @@ -36,7 +36,7 @@ using namespace MeshCore; -MeshBuilder::MeshBuilder (MeshKernel& kernel) : _meshKernel(kernel), _seq(0) +MeshBuilder::MeshBuilder (MeshKernel& kernel) : _meshKernel(kernel), _seq(0), _ptIdx(0) { _fSaveTolerance = MeshDefinitions::_fMinPointDistanceD1; } diff --git a/src/Mod/Mesh/App/Core/Builder.h b/src/Mod/Mesh/App/Core/Builder.h index f7b7ef5e708e..ae663a8c02c6 100644 --- a/src/Mod/Mesh/App/Core/Builder.h +++ b/src/Mod/Mesh/App/Core/Builder.h @@ -105,7 +105,7 @@ class MeshExport MeshBuilder // keep an array of iterators pointing to the vertex inside the set to save memory typedef std::pair::iterator, bool> MeshPointIterator; std::vector _pointsIterator; - unsigned long _ptIdx; + unsigned long _ptIdx; void SetNeighbourhood (); // As it's forbidden to insert a degenerated facet but insert its vertices anyway we must remove them diff --git a/src/Mod/Mesh/App/Core/Evaluation.cpp b/src/Mod/Mesh/App/Core/Evaluation.cpp index 954ca7a01df1..fcb15a39c43e 100644 --- a/src/Mod/Mesh/App/Core/Evaluation.cpp +++ b/src/Mod/Mesh/App/Core/Evaluation.cpp @@ -508,7 +508,7 @@ void MeshEvalPointManifolds::GetFacetIndices (std::vector &facets bool MeshEvalSingleFacet::Evaluate () { // get all non-manifolds - MeshEvalTopology::Evaluate(); + (void)MeshEvalTopology::Evaluate(); /* // for each (multiple) single linked facet there should // exist two valid facets sharing the same edge diff --git a/src/Mod/Mesh/App/Core/MeshIO.cpp b/src/Mod/Mesh/App/Core/MeshIO.cpp index b628607fda39..7894beafad31 100644 --- a/src/Mod/Mesh/App/Core/MeshIO.cpp +++ b/src/Mod/Mesh/App/Core/MeshIO.cpp @@ -1793,7 +1793,8 @@ bool MeshOutput::SaveBinarySTL (std::ostream &rstrOut) const return false; Base::SequencerLauncher seq("saving...", _rclMesh.CountFacets() + 1); - + + // stl_header has a length of 80 strcpy(szInfo, stl_header.c_str()); rstrOut.write(szInfo, std::strlen(szInfo)); diff --git a/src/Mod/Mesh/App/Core/SetOperations.h b/src/Mod/Mesh/App/Core/SetOperations.h index f8f943b71e83..bdf580d6484c 100644 --- a/src/Mod/Mesh/App/Core/SetOperations.h +++ b/src/Mod/Mesh/App/Core/SetOperations.h @@ -74,7 +74,6 @@ class MeshExport SetOperations MeshKernel &_resultMesh; /** Result mesh */ OperationType _operationType; /** Set Operation Type */ float _minDistanceToPoint; /** Minimal distance to facet corner points */ - float _saveMinMeshDistance; private: // Helper class cutting edge to his two attached facets diff --git a/src/Mod/Mesh/App/Core/Smoothing.cpp b/src/Mod/Mesh/App/Core/Smoothing.cpp index a84fd1930407..ac3c778134fe 100644 --- a/src/Mod/Mesh/App/Core/Smoothing.cpp +++ b/src/Mod/Mesh/App/Core/Smoothing.cpp @@ -36,7 +36,11 @@ using namespace MeshCore; -AbstractSmoothing::AbstractSmoothing(MeshKernel& m) : kernel(m) +AbstractSmoothing::AbstractSmoothing(MeshKernel& m) + : kernel(m) + , tolerance(0) + , component(Normal) + , continuity(C0) { } diff --git a/src/Mod/Mesh/App/Core/Tools.cpp b/src/Mod/Mesh/App/Core/Tools.cpp index 028134386cc6..77a8d1b89329 100644 --- a/src/Mod/Mesh/App/Core/Tools.cpp +++ b/src/Mod/Mesh/App/Core/Tools.cpp @@ -34,11 +34,13 @@ using namespace MeshCore; MeshSearchNeighbours::MeshSearchNeighbours (const MeshKernel &rclM, float fSampleDistance) -: _rclMesh(rclM), - _rclFAry(rclM.GetFacets()), - _rclPAry(rclM.GetPoints()), - _clPt2Fa(rclM), - _fSampleDistance(fSampleDistance) + : _rclMesh(rclM) + , _rclFAry(rclM.GetFacets()) + , _rclPAry(rclM.GetPoints()) + , _clPt2Fa(rclM) + , _fMaxDistanceP2(0) + , _fSampleDistance(fSampleDistance) + , _bTooFewPoints(false) { MeshAlgorithm(_rclMesh).ResetFacetFlag(MeshFacet::MARKED); MeshAlgorithm(_rclMesh).ResetPointFlag(MeshPoint::MARKED); diff --git a/src/Mod/Mesh/Gui/MeshEditor.cpp b/src/Mod/Mesh/Gui/MeshEditor.cpp index 71625fef4b2a..038ceb7c1395 100644 --- a/src/Mod/Mesh/Gui/MeshEditor.cpp +++ b/src/Mod/Mesh/Gui/MeshEditor.cpp @@ -409,7 +409,12 @@ namespace MeshGui { /* TRANSLATOR MeshGui::MeshFillHole */ MeshFillHole::MeshFillHole(MeshHoleFiller& hf, Gui::View3DInventor* parent) - : QObject(parent), myMesh(0), myNumPoints(0), myHoleFiller(hf) + : QObject(parent) + , myMesh(0) + , myNumPoints(0) + , myVertex1(0) + , myVertex2(0) + , myHoleFiller(hf) { myBoundariesRoot = new SoSeparator; myBoundariesRoot->ref(); diff --git a/src/Mod/Mesh/Gui/MeshSelection.cpp b/src/Mod/Mesh/Gui/MeshSelection.cpp index fce098476960..f8a385466b22 100644 --- a/src/Mod/Mesh/Gui/MeshSelection.cpp +++ b/src/Mod/Mesh/Gui/MeshSelection.cpp @@ -78,6 +78,9 @@ unsigned char MeshSelection::cross_mask_bitmap[] = { MeshSelection::MeshSelection() : onlyPointToUserTriangles(false) , onlyVisibleTriangles(false) + , addToSelection(false) + , addComponent(false) + , removeComponent(false) , activeCB(0) , selectionCB(0) , ivViewer(0) diff --git a/src/Mod/Mesh/Gui/SoFCMeshObject.cpp b/src/Mod/Mesh/Gui/SoFCMeshObject.cpp index b15b39d76c3b..2c13fa736916 100644 --- a/src/Mod/Mesh/Gui/SoFCMeshObject.cpp +++ b/src/Mod/Mesh/Gui/SoFCMeshObject.cpp @@ -588,7 +588,10 @@ void SoFCMeshObjectShape::initClass() SO_NODE_INIT_CLASS(SoFCMeshObjectShape, SoShape, "Shape"); } -SoFCMeshObjectShape::SoFCMeshObjectShape() : renderTriangleLimit(100000), meshChanged(true) +SoFCMeshObjectShape::SoFCMeshObjectShape() + : renderTriangleLimit(100000) + , meshChanged(true) + , selectBuf(0) { SO_NODE_CONSTRUCTOR(SoFCMeshObjectShape); setName(SoFCMeshObjectShape::getClassTypeId().getName()); diff --git a/src/Mod/Mesh/Gui/ViewProvider.cpp b/src/Mod/Mesh/Gui/ViewProvider.cpp index 174e26a91a6a..e7038c22d109 100644 --- a/src/Mod/Mesh/Gui/ViewProvider.cpp +++ b/src/Mod/Mesh/Gui/ViewProvider.cpp @@ -1028,7 +1028,7 @@ void ViewProviderMesh::getFacetsFromPolygon(const std::vector& picked, std::vector& indices) const { #if 1 - bool ok = true; + const bool ok = true; Base::Polygon2D polygon; for (std::vector::const_iterator it = picked.begin(); it != picked.end(); ++it) polygon.Add(Base::Vector2D((*it)[0],(*it)[1])); @@ -1890,6 +1890,8 @@ PROPERTY_SOURCE(MeshGui::ViewProviderIndexedFaceSet, MeshGui::ViewProviderMesh) ViewProviderIndexedFaceSet::ViewProviderIndexedFaceSet() { + pcMeshCoord = 0; + pcMeshFaces = 0; } ViewProviderIndexedFaceSet::~ViewProviderIndexedFaceSet() @@ -1979,6 +1981,8 @@ PROPERTY_SOURCE(MeshGui::ViewProviderMeshObject, MeshGui::ViewProviderMesh) ViewProviderMeshObject::ViewProviderMeshObject() { + pcMeshNode = 0; + pcMeshShape = 0; } ViewProviderMeshObject::~ViewProviderMeshObject() diff --git a/src/Mod/Mesh/Gui/ViewProviderDefects.cpp b/src/Mod/Mesh/Gui/ViewProviderDefects.cpp index 698adc608655..bb5142f18ed3 100644 --- a/src/Mod/Mesh/Gui/ViewProviderDefects.cpp +++ b/src/Mod/Mesh/Gui/ViewProviderDefects.cpp @@ -145,7 +145,7 @@ void ViewProviderMeshOrientation::attach(App::DocumentObject* pcFeat) void ViewProviderMeshOrientation::showDefects(const std::vector& inds) { - Mesh::Feature* f = dynamic_cast(pcObject); + Mesh::Feature* f = static_cast(pcObject); const MeshCore::MeshKernel & rMesh = f->Mesh.getValue().getKernel(); pcCoords->point.deleteValues(0); @@ -212,7 +212,7 @@ void ViewProviderMeshNonManifolds::showDefects(const std::vector& { if ((inds.size() % 2) != 0) return; - Mesh::Feature* f = dynamic_cast(pcObject); + Mesh::Feature* f = static_cast(pcObject); const MeshCore::MeshKernel & rMesh = f->Mesh.getValue().getKernel(); pcCoords->point.deleteValues(0); @@ -275,7 +275,7 @@ void ViewProviderMeshNonManifoldPoints::attach(App::DocumentObject* pcFeat) void ViewProviderMeshNonManifoldPoints::showDefects(const std::vector& inds) { - Mesh::Feature* f = dynamic_cast(pcObject); + Mesh::Feature* f = static_cast(pcObject); const MeshCore::MeshKernel & rMesh = f->Mesh.getValue().getKernel(); pcCoords->point.deleteValues(0); pcCoords->point.setNum(inds.size()); @@ -339,7 +339,7 @@ void ViewProviderMeshDuplicatedFaces::attach(App::DocumentObject* pcFeat) void ViewProviderMeshDuplicatedFaces::showDefects(const std::vector& inds) { - Mesh::Feature* f = dynamic_cast(pcObject); + Mesh::Feature* f = static_cast(pcObject); const MeshCore::MeshKernel & rMesh = f->Mesh.getValue().getKernel(); pcCoords->point.deleteValues(0); @@ -404,7 +404,7 @@ void ViewProviderMeshDuplicatedPoints::attach(App::DocumentObject* pcFeat) void ViewProviderMeshDuplicatedPoints::showDefects(const std::vector& inds) { - Mesh::Feature* f = dynamic_cast(pcObject); + Mesh::Feature* f = static_cast(pcObject); const MeshCore::MeshKernel & rMesh = f->Mesh.getValue().getKernel(); pcCoords->point.deleteValues(0); pcCoords->point.setNum(inds.size()); @@ -461,7 +461,7 @@ void ViewProviderMeshDegenerations::attach(App::DocumentObject* pcFeat) void ViewProviderMeshDegenerations::showDefects(const std::vector& inds) { - Mesh::Feature* f = dynamic_cast(pcObject); + Mesh::Feature* f = static_cast(pcObject); const MeshCore::MeshKernel & rMesh = f->Mesh.getValue().getKernel(); pcCoords->point.deleteValues(0); @@ -567,7 +567,7 @@ void ViewProviderMeshIndices::attach(App::DocumentObject* pcFeat) void ViewProviderMeshIndices::showDefects(const std::vector& inds) { - Mesh::Feature* f = dynamic_cast(pcObject); + Mesh::Feature* f = static_cast(pcObject); const MeshCore::MeshKernel & rMesh = f->Mesh.getValue().getKernel(); if (!inds.empty()) { @@ -636,7 +636,7 @@ void ViewProviderMeshSelfIntersections::showDefects(const std::vector(pcObject); + Mesh::Feature* f = static_cast(pcObject); const MeshCore::MeshKernel & rMesh = f->Mesh.getValue().getKernel(); MeshCore::MeshEvalSelfIntersection eval(rMesh); @@ -645,7 +645,7 @@ void ViewProviderMeshSelfIntersections::showDefects(const std::vector > lines; @@ -714,7 +714,7 @@ void ViewProviderMeshFolds::attach(App::DocumentObject* pcFeat) void ViewProviderMeshFolds::showDefects(const std::vector& inds) { - Mesh::Feature* f = dynamic_cast(pcObject); + Mesh::Feature* f = static_cast(pcObject); const MeshCore::MeshKernel & rMesh = f->Mesh.getValue().getKernel(); pcCoords->point.deleteValues(0); diff --git a/src/Mod/Mesh/Gui/ViewProviderTransformDemolding.cpp b/src/Mod/Mesh/Gui/ViewProviderTransformDemolding.cpp index f788ecf40b32..104a44a3d0d2 100644 --- a/src/Mod/Mesh/Gui/ViewProviderTransformDemolding.cpp +++ b/src/Mod/Mesh/Gui/ViewProviderTransformDemolding.cpp @@ -65,6 +65,8 @@ ViewProviderMeshTransformDemolding::ViewProviderMeshTransformDemolding() { pcTrackballDragger = new SoTrackballDragger; pcTrackballDragger->ref(); + pcTransformDrag = 0; + pcColorMat = 0; } ViewProviderMeshTransformDemolding::~ViewProviderMeshTransformDemolding() @@ -122,7 +124,7 @@ void ViewProviderMeshTransformDemolding::attach(App::DocumentObject *pcFeat) calcNormalVector(); calcMaterialIndex(SbRotation()); // geting center point - center = dynamic_cast(pcObject)->Mesh.getValue().getKernel().GetBoundBox().GetCenter(); + center = static_cast(pcObject)->Mesh.getValue().getKernel().GetBoundBox().GetCenter(); //SoGetBoundingBoxAction boxAction; //pcHighlight->getBoundingBox(&boxAction); @@ -131,7 +133,7 @@ void ViewProviderMeshTransformDemolding::attach(App::DocumentObject *pcFeat) void ViewProviderMeshTransformDemolding::calcNormalVector(void) { - const MeshKernel& cMesh = dynamic_cast(pcObject)->Mesh.getValue().getKernel(); + const MeshKernel& cMesh = static_cast(pcObject)->Mesh.getValue().getKernel(); MeshFacetIterator cFIt(cMesh); for( cFIt.Init(); cFIt.More(); cFIt.Next()) diff --git a/src/Mod/Points/App/PointsGrid.cpp b/src/Mod/Points/App/PointsGrid.cpp index 962ade82e9f0..428e1c520a60 100644 --- a/src/Mod/Points/App/PointsGrid.cpp +++ b/src/Mod/Points/App/PointsGrid.cpp @@ -282,25 +282,33 @@ void PointsGrid::Position (const Base::Vector3d &rclPoint, unsigned long &rulX, void PointsGrid::CalculateGridLength (unsigned long ulCtGrid, unsigned long ulMaxGrids) { - // Grid Laengen bzw. Anzahl der Grids pro Dimension berechnen - // pro Grid sollen ca. 10 (?!?!) Facets liegen - // bzw. max Grids sollten 10000 nicht ueberschreiten - Base::BoundBox3d clBBPtsEnlarged;// = _pclPoints->GetBoundBox(); - for (PointKernel::const_iterator it = _pclPoints->begin(); it != _pclPoints->end(); ++it ) - clBBPtsEnlarged.Add(*it); - double fVolElem; - - if (_ulCtElements > (ulMaxGrids * ulCtGrid)) - fVolElem = (clBBPtsEnlarged.LengthX() * clBBPtsEnlarged.LengthY() * clBBPtsEnlarged.LengthZ()) / float(ulMaxGrids * ulCtGrid); - else - fVolElem = (clBBPtsEnlarged.LengthX() * clBBPtsEnlarged.LengthY() * clBBPtsEnlarged.LengthZ()) / float(_ulCtElements); - - double fVol = fVolElem * float(ulCtGrid); - double fGridLen = float(pow((float)fVol,(float) 1.0f / 3.0f)); - - _ulCtGridsX = std::max((unsigned long)(clBBPtsEnlarged.LengthX() / fGridLen), 1); - _ulCtGridsY = std::max((unsigned long)(clBBPtsEnlarged.LengthY() / fGridLen), 1); - _ulCtGridsZ = std::max((unsigned long)(clBBPtsEnlarged.LengthZ() / fGridLen), 1); + // Grid Laengen bzw. Anzahl der Grids pro Dimension berechnen + // pro Grid sollen ca. 10 (?!?!) Facets liegen + // bzw. max Grids sollten 10000 nicht ueberschreiten + Base::BoundBox3d clBBPtsEnlarged;// = _pclPoints->GetBoundBox(); + for (PointKernel::const_iterator it = _pclPoints->begin(); it != _pclPoints->end(); ++it ) + clBBPtsEnlarged.Add(*it); + double fVolElem; + + if (_ulCtElements > (ulMaxGrids * ulCtGrid)) + fVolElem = (clBBPtsEnlarged.LengthX() * clBBPtsEnlarged.LengthY() * clBBPtsEnlarged.LengthZ()) / float(ulMaxGrids * ulCtGrid); + else + fVolElem = (clBBPtsEnlarged.LengthX() * clBBPtsEnlarged.LengthY() * clBBPtsEnlarged.LengthZ()) / float(_ulCtElements); + + double fVol = fVolElem * float(ulCtGrid); + double fGridLen = float(pow((float)fVol,(float) 1.0f / 3.0f)); + + if (fGridLen > 0) { + _ulCtGridsX = std::max((unsigned long)(clBBPtsEnlarged.LengthX() / fGridLen), 1); + _ulCtGridsY = std::max((unsigned long)(clBBPtsEnlarged.LengthY() / fGridLen), 1); + _ulCtGridsZ = std::max((unsigned long)(clBBPtsEnlarged.LengthZ() / fGridLen), 1); + } + else { + // Degenerated grid + _ulCtGridsX = 1; + _ulCtGridsY = 1; + _ulCtGridsZ = 1; + } } void PointsGrid::CalculateGridLength (int iCtGridPerAxis)