Part: fix dangerous static_cast usage in view provider
Because Gui::ViewProviderLink can be used to override the view provider of any object, it is not safe to assume view provider type without explicit checking.
This commit is contained in:
@@ -102,15 +102,17 @@ void ViewProviderBoolean::updateData(const App::Property* prop)
|
||||
TopExp::MapShapes(toolShape, TopAbs_FACE, toolMap);
|
||||
TopExp::MapShapes(boolShape, TopAbs_FACE, boolMap);
|
||||
|
||||
Gui::ViewProvider* vpBase = Gui::Application::Instance->getViewProvider(objBase);
|
||||
Gui::ViewProvider* vpTool = Gui::Application::Instance->getViewProvider(objTool);
|
||||
auto vpBase = dynamic_cast<PartGui::ViewProviderPart*>(
|
||||
Gui::Application::Instance->getViewProvider(objBase));
|
||||
auto vpTool = dynamic_cast<PartGui::ViewProviderPart*>(
|
||||
Gui::Application::Instance->getViewProvider(objTool));
|
||||
if (vpBase && vpTool) {
|
||||
std::vector<App::Color> colBase = static_cast<PartGui::ViewProviderPart*>(vpBase)->DiffuseColor.getValues();
|
||||
std::vector<App::Color> colTool = static_cast<PartGui::ViewProviderPart*>(vpTool)->DiffuseColor.getValues();
|
||||
std::vector<App::Color> colBase = vpBase->DiffuseColor.getValues();
|
||||
std::vector<App::Color> colTool = vpTool->DiffuseColor.getValues();
|
||||
std::vector<App::Color> colBool;
|
||||
colBool.resize(boolMap.Extent(), this->ShapeColor.getValue());
|
||||
applyTransparency(static_cast<PartGui::ViewProviderPart*>(vpBase)->Transparency.getValue(),colBase);
|
||||
applyTransparency(static_cast<PartGui::ViewProviderPart*>(vpTool)->Transparency.getValue(),colTool);
|
||||
applyTransparency(vpBase->Transparency.getValue(),colBase);
|
||||
applyTransparency(vpTool->Transparency.getValue(),colTool);
|
||||
|
||||
if (static_cast<int>(colBase.size()) == baseMap.Extent()) {
|
||||
applyColor(hist[0], colBase, colBool);
|
||||
@@ -202,10 +204,10 @@ void ViewProviderMultiFuse::updateData(const App::Property* prop)
|
||||
TopTools_IndexedMapOfShape baseMap;
|
||||
TopExp::MapShapes(baseShape, TopAbs_FACE, baseMap);
|
||||
|
||||
Gui::ViewProvider* vpBase = Gui::Application::Instance->getViewProvider(objBase);
|
||||
auto vpBase = dynamic_cast<PartGui::ViewProviderPart*>(Gui::Application::Instance->getViewProvider(objBase));
|
||||
if (vpBase) {
|
||||
std::vector<App::Color> colBase = static_cast<PartGui::ViewProviderPart*>(vpBase)->DiffuseColor.getValues();
|
||||
applyTransparency(static_cast<PartGui::ViewProviderPart*>(vpBase)->Transparency.getValue(),colBase);
|
||||
std::vector<App::Color> colBase = vpBase->DiffuseColor.getValues();
|
||||
applyTransparency(vpBase->Transparency.getValue(),colBase);
|
||||
if (static_cast<int>(colBase.size()) == baseMap.Extent()) {
|
||||
applyColor(hist[index], colBase, colBool);
|
||||
}
|
||||
@@ -333,10 +335,10 @@ void ViewProviderMultiCommon::updateData(const App::Property* prop)
|
||||
TopTools_IndexedMapOfShape baseMap;
|
||||
TopExp::MapShapes(baseShape, TopAbs_FACE, baseMap);
|
||||
|
||||
Gui::ViewProvider* vpBase = Gui::Application::Instance->getViewProvider(objBase);
|
||||
auto vpBase = dynamic_cast<PartGui::ViewProviderPart*>(Gui::Application::Instance->getViewProvider(objBase));
|
||||
if (vpBase) {
|
||||
std::vector<App::Color> colBase = static_cast<PartGui::ViewProviderPart*>(vpBase)->DiffuseColor.getValues();
|
||||
applyTransparency(static_cast<PartGui::ViewProviderPart*>(vpBase)->Transparency.getValue(),colBase);
|
||||
std::vector<App::Color> colBase = vpBase->DiffuseColor.getValues();
|
||||
applyTransparency(vpBase->Transparency.getValue(),colBase);
|
||||
if (static_cast<int>(colBase.size()) == baseMap.Extent()) {
|
||||
applyColor(hist[index], colBase, colBool);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user