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>((unsigned long)(clBBPtsEnlarged.LengthX() / fGridLen), 1); _ulCtGridsY = std::max<unsigned long>((unsigned long)(clBBPtsEnlarged.LengthY() / fGridLen), 1); _ulCtGridsZ = std::max<unsigned long>((unsigned long)(clBBPtsEnlarged.LengthZ() / fGridLen), 1); }
PointsGrid::PointsGrid (const PointKernel &rclM, double fGridLen) : _pclPoints(&rclM), _ulCtElements(0), _ulCtGridsX(0), _ulCtGridsY(0), _ulCtGridsZ(0), _fGridLenX(0.0f), _fGridLenY(0.0f), _fGridLenZ(0.0f), _fMinX(0.0f), _fMinY(0.0f), _fMinZ(0.0f) { Base::BoundBox3d clBBPts;// = _pclPoints->GetBoundBox(); for (PointKernel::const_iterator it = _pclPoints->begin(); it != _pclPoints->end(); ++it ) clBBPts.Add(*it); Rebuild(std::max<unsigned long>((unsigned long)(clBBPts.LengthX() / fGridLen), 1), std::max<unsigned long>((unsigned long)(clBBPts.LengthY() / fGridLen), 1), std::max<unsigned long>((unsigned long)(clBBPts.LengthZ() / fGridLen), 1)); }
void PointsGrid::InitGrid (void) { assert(_pclPoints != NULL); unsigned long i, j; // Grid Laengen berechnen wenn nicht initialisiert // if ((_ulCtGridsX == 0) || (_ulCtGridsY == 0) || (_ulCtGridsZ == 0)) CalculateGridLength(POINTS_CT_GRID, POINTS_MAX_GRIDS); // Grid Laengen und Offset bestimmen // { Base::BoundBox3d clBBPts;// = _pclPoints->GetBoundBox(); for (PointKernel::const_iterator it = _pclPoints->begin(); it != _pclPoints->end(); ++it ) clBBPts.Add(*it); double fLengthX = clBBPts.LengthX(); double fLengthY = clBBPts.LengthY(); double fLengthZ = clBBPts.LengthZ(); { // Offset fGridLen/2 // _fGridLenX = (1.0f + fLengthX) / double(_ulCtGridsX); _fMinX = clBBPts.MinX - 0.5f; } { _fGridLenY = (1.0f + fLengthY) / double(_ulCtGridsY); _fMinY = clBBPts.MinY - 0.5f; } { _fGridLenZ = (1.0f + fLengthZ) / double(_ulCtGridsZ); _fMinZ = clBBPts.MinZ - 0.5f; } } // Daten-Struktur anlegen _aulGrid.clear(); _aulGrid.resize(_ulCtGridsX); for (i = 0; i < _ulCtGridsX; i++) { _aulGrid[i].resize(_ulCtGridsY); for (j = 0; j < _ulCtGridsY; j++) _aulGrid[i][j].resize(_ulCtGridsZ); } }
void Tessellation::findShapes() { App::Document* activeDoc = App::GetApplication().getActiveDocument(); if (!activeDoc) return; Gui::Document* activeGui = Gui::Application::Instance->getDocument(activeDoc); if (!activeGui) return; this->document = QString::fromAscii(activeDoc->getName()); std::vector<Part::Feature*> objs = activeDoc->getObjectsOfType<Part::Feature>(); double edgeLen = 0; bool foundSelection = false; for (std::vector<Part::Feature*>::iterator it = objs.begin(); it!=objs.end(); ++it) { const TopoDS_Shape& shape = (*it)->Shape.getValue(); if (shape.IsNull()) continue; bool hasfaces = false; TopExp_Explorer xp(shape,TopAbs_FACE); while (xp.More()) { hasfaces = true; break; } if (hasfaces) { Base::BoundBox3d bbox = (*it)->Shape.getBoundingBox(); edgeLen = std::max<double>(edgeLen, bbox.LengthX()); edgeLen = std::max<double>(edgeLen, bbox.LengthY()); edgeLen = std::max<double>(edgeLen, bbox.LengthZ()); QString label = QString::fromUtf8((*it)->Label.getValue()); QString name = QString::fromAscii((*it)->getNameInDocument()); QTreeWidgetItem* child = new QTreeWidgetItem(); child->setText(0, label); child->setToolTip(0, label); child->setData(0, Qt::UserRole, name); Gui::ViewProvider* vp = activeGui->getViewProvider(*it); if (vp) child->setIcon(0, vp->getIcon()); ui->treeWidget->addTopLevelItem(child); if (Gui::Selection().isSelected(*it)) { child->setSelected(true); foundSelection = true; } } } ui->spinMaximumEdgeLength->setValue(edgeLen/10); if (foundSelection) ui->treeWidget->hide(); }
void ViewProviderInspection::updateData(const App::Property* prop) { // set to the expected size if (prop->getTypeId() == App::PropertyLink::getClassTypeId()) { App::GeoFeature* object = static_cast<const App::PropertyLink*>(prop)->getValue<App::GeoFeature*>(); if (object) { float accuracy=0; Base::Type meshId = Base::Type::fromName("Mesh::Feature"); Base::Type shapeId = Base::Type::fromName("Part::Feature"); Base::Type pointId = Base::Type::fromName("Points::Feature"); Base::Type propId = App::PropertyComplexGeoData::getClassTypeId(); // set the Distance property to the correct size to sync size of material node with number // of vertices/points of the referenced geometry const Data::ComplexGeoData* data = 0; if (object->getTypeId().isDerivedFrom(meshId)) { App::Property* prop = object->getPropertyByName("Mesh"); if (prop && prop->getTypeId().isDerivedFrom(propId)) { data = static_cast<App::PropertyComplexGeoData*>(prop)->getComplexData(); } } else if (object->getTypeId().isDerivedFrom(shapeId)) { App::Property* prop = object->getPropertyByName("Shape"); if (prop && prop->getTypeId().isDerivedFrom(propId)) { data = static_cast<App::PropertyComplexGeoData*>(prop)->getComplexData(); ParameterGrp::handle hGrp = App::GetApplication().GetParameterGroupByPath ("User parameter:BaseApp/Preferences/Mod/Part"); float deviation = hGrp->GetFloat("MeshDeviation",0.2); Base::BoundBox3d bbox = data->getBoundBox(); accuracy = (float)((bbox.LengthX() + bbox.LengthY() + bbox.LengthZ())/300.0 * deviation); } } else if (object->getTypeId().isDerivedFrom(pointId)) { App::Property* prop = object->getPropertyByName("Points"); if (prop && prop->getTypeId().isDerivedFrom(propId)) { data = static_cast<App::PropertyComplexGeoData*>(prop)->getComplexData(); } } if (data) { this->pcLinkRoot->removeAllChildren(); std::vector<Base::Vector3d> points; std::vector<Data::ComplexGeoData::Facet> faces; data->getFaces(points, faces, accuracy); this->pcLinkRoot->addChild(this->pcCoords); this->pcCoords->point.setNum(points.size()); SbVec3f* pts = this->pcCoords->point.startEditing(); for (size_t i=0; i < points.size(); i++) { const Base::Vector3d& p = points[i]; pts[i].setValue((float)p.x,(float)p.y,(float)p.z); } this->pcCoords->point.finishEditing(); if (!faces.empty()) { SoIndexedFaceSet* face = new SoIndexedFaceSet(); this->pcLinkRoot->addChild(face); face->coordIndex.setNum(4*faces.size()); int32_t* indices = face->coordIndex.startEditing(); unsigned long j=0; std::vector<Data::ComplexGeoData::Facet>::iterator it; for (it = faces.begin(); it != faces.end(); ++it,j++) { indices[4*j+0] = it->I1; indices[4*j+1] = it->I2; indices[4*j+2] = it->I3; indices[4*j+3] = SO_END_FACE_INDEX; } face->coordIndex.finishEditing(); } else { this->pcLinkRoot->addChild(this->pcPointStyle); this->pcLinkRoot->addChild(new SoPointSet()); } } } } else if (prop->getTypeId() == Inspection::PropertyDistanceList::getClassTypeId()) { // force an update of the Inventor data nodes if (this->pcObject) { App::Property* link = this->pcObject->getPropertyByName("Actual"); if (link) updateData(link); } setDistances(); } else if (prop->getTypeId() == App::PropertyFloat::getClassTypeId()) { if (strcmp(prop->getName(), "SearchRadius") == 0) { float fSearchRadius = ((App::PropertyFloat*)prop)->getValue(); this->search_radius = fSearchRadius; pcColorBar->setRange( -fSearchRadius, fSearchRadius, 4 ); pcColorBar->Notify(0); } } }
void PointsGrid::CalculateGridLength (int iCtGridPerAxis) { if (iCtGridPerAxis<=0) { CalculateGridLength(POINTS_CT_GRID, POINTS_MAX_GRIDS); return; } // 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 clBBPts;// = _pclPoints->GetBoundBox(); for (PointKernel::const_iterator it = _pclPoints->begin(); it != _pclPoints->end(); ++it ) clBBPts.Add(*it); double fLenghtX = clBBPts.LengthX(); double fLenghtY = clBBPts.LengthY(); double fLenghtZ = clBBPts.LengthZ(); double fLenghtD = clBBPts.CalcDiagonalLength(); double fLengthTol = 0.05f * fLenghtD; bool bLenghtXisZero = (fLenghtX <= fLengthTol); bool bLenghtYisZero = (fLenghtY <= fLengthTol); bool bLenghtZisZero = (fLenghtZ <= fLengthTol); int iFlag = 0; int iMaxGrids = 1; if (bLenghtXisZero) iFlag += 1; else iMaxGrids *= iCtGridPerAxis; if (bLenghtYisZero) iFlag += 2; else iMaxGrids *= iCtGridPerAxis; if (bLenghtZisZero) iFlag += 4; else iMaxGrids *= iCtGridPerAxis; unsigned long ulGridsFacets = 10; double fFactorVolumen = 40.0; double fFactorArea = 10.0; switch (iFlag) { case 0: { double fVolumen = fLenghtX * fLenghtY * fLenghtZ; double fVolumenGrid = (fVolumen * ulGridsFacets) / (fFactorVolumen * _ulCtElements); if ((fVolumenGrid * iMaxGrids) < fVolumen) fVolumenGrid = fVolumen / (float)iMaxGrids; double fLengthGrid = float(pow((float)fVolumenGrid,(float) 1.0f / 3.0f)); _ulCtGridsX = std::max<unsigned long>((unsigned long)(fLenghtX / fLengthGrid), 1); _ulCtGridsY = std::max<unsigned long>((unsigned long)(fLenghtY / fLengthGrid), 1); _ulCtGridsZ = std::max<unsigned long>((unsigned long)(fLenghtZ / fLengthGrid), 1); } break; case 1: { _ulCtGridsX = 1; // bLenghtXisZero double fArea = fLenghtY * fLenghtZ; double fAreaGrid = (fArea * ulGridsFacets) / (fFactorArea * _ulCtElements); if ((fAreaGrid * iMaxGrids) < fArea) fAreaGrid = fArea / (double)iMaxGrids; double fLengthGrid = double(sqrt(fAreaGrid)); _ulCtGridsY = std::max<unsigned long>((unsigned long)(fLenghtY / fLengthGrid), 1); _ulCtGridsZ = std::max<unsigned long>((unsigned long)(fLenghtZ / fLengthGrid), 1); } break; case 2: { _ulCtGridsY = 1; // bLenghtYisZero double fArea = fLenghtX * fLenghtZ; double fAreaGrid = (fArea * ulGridsFacets) / (fFactorArea * _ulCtElements); if ((fAreaGrid * iMaxGrids) < fArea) fAreaGrid = fArea / (double)iMaxGrids; double fLengthGrid = double(sqrt(fAreaGrid)); _ulCtGridsX = std::max<unsigned long>((unsigned long)(fLenghtX / fLengthGrid), 1); _ulCtGridsZ = std::max<unsigned long>((unsigned long)(fLenghtZ / fLengthGrid), 1); } break; case 3: { _ulCtGridsX = 1; // bLenghtXisZero _ulCtGridsY = 1; // bLenghtYisZero _ulCtGridsZ = iMaxGrids; // bLenghtYisZero } break; case 4: { _ulCtGridsZ = 1; // bLenghtZisZero double fArea = fLenghtX * fLenghtY; double fAreaGrid = (fArea * ulGridsFacets) / (fFactorArea * _ulCtElements); if ((fAreaGrid * iMaxGrids) < fArea) fAreaGrid = fArea / (float)iMaxGrids; double fLengthGrid = double(sqrt(fAreaGrid)); _ulCtGridsX = std::max<unsigned long>((unsigned long)(fLenghtX / fLengthGrid), 1); _ulCtGridsY = std::max<unsigned long>((unsigned long)(fLenghtY / fLengthGrid), 1); } break; case 5: { _ulCtGridsX = 1; // bLenghtXisZero _ulCtGridsZ = 1; // bLenghtZisZero _ulCtGridsY = iMaxGrids; // bLenghtYisZero } break; case 6: { _ulCtGridsY = 1; // bLenghtYisZero _ulCtGridsZ = 1; // bLenghtZisZero _ulCtGridsX = iMaxGrids; // bLenghtYisZero } break; case 7: { _ulCtGridsX = iMaxGrids; // bLenghtXisZero _ulCtGridsY = iMaxGrids; // bLenghtYisZero _ulCtGridsZ = iMaxGrids; // bLenghtZisZero } break; } }