void SoBrepPointSet::doAction(SoAction* action) { if (action->getTypeId() == Gui::SoHighlightElementAction::getClassTypeId()) { Gui::SoHighlightElementAction* hlaction = static_cast<Gui::SoHighlightElementAction*>(action); if (!hlaction->isHighlighted()) { this->highlightIndex = -1; return; } const SoDetail* detail = hlaction->getElement(); if (detail) { if (!detail->isOfType(SoPointDetail::getClassTypeId())) { this->highlightIndex = -1; return; } int index = static_cast<const SoPointDetail*>(detail)->getCoordinateIndex(); this->highlightIndex.setValue(index); this->highlightColor = hlaction->getColor(); } } else if (action->getTypeId() == Gui::SoSelectionElementAction::getClassTypeId()) { Gui::SoSelectionElementAction* selaction = static_cast<Gui::SoSelectionElementAction*>(action); this->selectionColor = selaction->getColor(); if (selaction->getType() == Gui::SoSelectionElementAction::All) { const SoCoordinateElement* coords = SoCoordinateElement::getInstance(action->getState()); int num = coords->getNum() - this->startIndex.getValue(); this->selectionIndex.setNum(num); int32_t* v = this->selectionIndex.startEditing(); int32_t s = this->startIndex.getValue(); for (int i=0; i<num;i++) v[i] = i + s; this->selectionIndex.finishEditing(); return; } else if (selaction->getType() == Gui::SoSelectionElementAction::None) { this->selectionIndex.setNum(0); return; } const SoDetail* detail = selaction->getElement(); if (detail) { if (!detail->isOfType(SoPointDetail::getClassTypeId())) { return; } int index = static_cast<const SoPointDetail*>(detail)->getCoordinateIndex(); switch (selaction->getType()) { case Gui::SoSelectionElementAction::Append: { if (this->selectionIndex.find(index) < 0) { int start = this->selectionIndex.getNum(); this->selectionIndex.set1Value(start, index); } } break; case Gui::SoSelectionElementAction::Remove: { int start = this->selectionIndex.find(index); if (start >= 0) this->selectionIndex.deleteValues(start,1); } break; default: break; } } } inherited::doAction(action); }
void SoBrepEdgeSet::doAction(SoAction* action) { if (action->getTypeId() == Gui::SoHighlightElementAction::getClassTypeId()) { Gui::SoHighlightElementAction* hlaction = static_cast<Gui::SoHighlightElementAction*>(action); if (!hlaction->isHighlighted()) { this->highlightIndex = -1; this->hl.clear(); return; } const SoDetail* detail = hlaction->getElement(); if (detail) { if (!detail->isOfType(SoLineDetail::getClassTypeId())) { this->highlightIndex = -1; this->hl.clear(); return; } this->highlightColor = hlaction->getColor(); int32_t index = static_cast<const SoLineDetail*>(detail)->getLineIndex(); const int32_t* cindices = this->coordIndex.getValues(0); int numcindices = this->coordIndex.getNum(); createIndexArray(&index, 1, cindices, numcindices, this->hl); this->highlightIndex.setValue(index); } } else if (action->getTypeId() == Gui::SoSelectionElementAction::getClassTypeId()) { Gui::SoSelectionElementAction* selaction = static_cast<Gui::SoSelectionElementAction*>(action); this->selectionColor = selaction->getColor(); if (selaction->getType() == Gui::SoSelectionElementAction::All) { const int32_t* cindices = this->coordIndex.getValues(0); int numcindices = this->coordIndex.getNum(); unsigned int num = std::count_if(cindices, cindices+numcindices, std::bind2nd(std::equal_to<int32_t>(), -1)); this->sl.clear(); this->selectionIndex.setNum(num); int32_t* v = this->selectionIndex.startEditing(); for (unsigned int i=0; i<num;i++) v[i] = i; this->selectionIndex.finishEditing(); int numsegm = this->selectionIndex.getNum(); if (numsegm > 0) { const int32_t* selsegm = this->selectionIndex.getValues(0); const int32_t* cindices = this->coordIndex.getValues(0); int numcindices = this->coordIndex.getNum(); createIndexArray(selsegm, numsegm, cindices, numcindices, this->sl); } return; } else if (selaction->getType() == Gui::SoSelectionElementAction::None) { this->selectionIndex.setNum(0); this->sl.clear(); return; } const SoDetail* detail = selaction->getElement(); if (detail) { if (!detail->isOfType(SoLineDetail::getClassTypeId())) { return; } int index = static_cast<const SoLineDetail*>(detail)->getLineIndex(); switch (selaction->getType()) { case Gui::SoSelectionElementAction::Append: { int start = this->selectionIndex.getNum(); this->selectionIndex.set1Value(start, index); } break; case Gui::SoSelectionElementAction::Remove: { int start = this->selectionIndex.find(index); this->selectionIndex.deleteValues(start,1); } break; default: break; } int numsegm = this->selectionIndex.getNum(); if (numsegm > 0) { const int32_t* selsegm = this->selectionIndex.getValues(0); const int32_t* cindices = this->coordIndex.getValues(0); int numcindices = this->coordIndex.getNum(); createIndexArray(selsegm, numsegm, cindices, numcindices, this->sl); } } } inherited::doAction(action); }
void SoBrepFaceSet::doAction(SoAction* action) { if (action->getTypeId() == Gui::SoHighlightElementAction::getClassTypeId()) { Gui::SoHighlightElementAction* hlaction = static_cast<Gui::SoHighlightElementAction*>(action); if (!hlaction->isHighlighted()) { this->highlightIndex = -1; return; } const SoDetail* detail = hlaction->getElement(); if (detail) { if (detail->isOfType(SoFaceDetail::getClassTypeId())) { int index = static_cast<const SoFaceDetail*>(detail)->getPartIndex(); this->highlightIndex.setValue(index); this->highlightColor = hlaction->getColor(); } else { this->highlightIndex = -1; return; } } } else if (action->getTypeId() == Gui::SoSelectionElementAction::getClassTypeId()) { Gui::SoSelectionElementAction* selaction = static_cast<Gui::SoSelectionElementAction*>(action); this->selectionColor = selaction->getColor(); if (selaction->getType() == Gui::SoSelectionElementAction::All) { int num = this->partIndex.getNum(); this->selectionIndex.setNum(num); int32_t* v = this->selectionIndex.startEditing(); for (int i=0; i<num; i++) v[i] = i; this->selectionIndex.finishEditing(); return; } else if (selaction->getType() == Gui::SoSelectionElementAction::None) { this->selectionIndex.setNum(0); return; } const SoDetail* detail = selaction->getElement(); if (detail) { if (!detail->isOfType(SoFaceDetail::getClassTypeId())) { return; } int index = static_cast<const SoFaceDetail*>(detail)->getPartIndex(); switch (selaction->getType()) { case Gui::SoSelectionElementAction::Append: { int start = this->selectionIndex.getNum(); this->selectionIndex.set1Value(start, index); } break; case Gui::SoSelectionElementAction::Remove: { int start = this->selectionIndex.find(index); this->selectionIndex.deleteValues(start,1); } break; default: break; } } } else if (action->getTypeId() == Gui::SoVRMLAction::getClassTypeId()) { // update the materialIndex field to match with the number of triangles if needed SoState * state = action->getState(); Binding mbind = this->findMaterialBinding(state); if (mbind == PER_PART) { const SoLazyElement* mat = SoLazyElement::getInstance(state); int numColor = 1; int numParts = partIndex.getNum(); if (mat) { numColor = mat->getNumDiffuse(); if (numColor == numParts) { int count = 0; const int32_t * indices = this->partIndex.getValues(0); for (int i=0; i<numParts; i++) { count += indices[i]; } this->materialIndex.setNum(count); int32_t * matind = this->materialIndex.startEditing(); int32_t k = 0; for (int i=0; i<numParts; i++) { for (int j=0; j<indices[i]; j++) { matind[k++] = i; } } this->materialIndex.finishEditing(); } } } } inherited::doAction(action); }