Import: Fix import/export of STEP file

For the import/export use the transparency value of the material property.
Since v1.0 the alpha channel of the diffuse color is used for this but
when changing the transparency in the user interface this alpha channel
won't be adjusted and thus leads to unexpected results.

This fixes issue 18569

(cherry picked from commit be3acac53a)
This commit is contained in:
wmayer
2026-02-14 09:04:47 +01:00
committed by Max Wilfinger
parent 6db18e1604
commit c29185075d
3 changed files with 31 additions and 17 deletions
+8 -5
View File
@@ -21,22 +21,25 @@
* *
**************************************************************************/
#include "ExportOCAFGui.h"
#include <Gui/Application.h>
#include <Mod/Part/Gui/ViewProvider.h>
using namespace ImportGui;
ExportOCAFGui::ExportOCAFGui(Handle(TDocStd_Document) hDoc, bool explicitPlacement)
: ExportOCAF(hDoc, explicitPlacement)
{}
void ExportOCAFGui::findColors(Part::Feature* part, std::vector<Base::Color>& colors) const
{
Gui::ViewProvider* vp = Gui::Application::Instance->getViewProvider(part);
if (vp && vp->isDerivedFrom<PartGui::ViewProviderPartExt>()) {
colors = static_cast<PartGui::ViewProviderPartExt*>(vp)->ShapeAppearance.getDiffuseColors();
if (auto vp = Gui::Application::Instance->getViewProvider(part)) {
if (auto vppe = freecad_cast<PartGui::ViewProviderPartExt*>(vp)) {
colors = vppe->ShapeAppearance.getDiffuseColors();
auto transp = vppe->ShapeAppearance.getTransparency();
for (auto& it : colors) {
it.setTransparency(transp);
}
}
}
}
+9
View File
@@ -52,6 +52,15 @@ void ImportOCAFGui::applyFaceColors(Part::Feature* part, const std::vector<Base:
}
else {
vp->ShapeAppearance.setDiffuseColors(colors);
std::vector<float> transp;
transp.reserve(colors.size());
std::transform(
colors.cbegin(),
colors.cend(),
std::back_inserter(transp),
[](const Base::Color& col) { return col.transparency(); }
);
vp->ShapeAppearance.setTransparencies(transp);
}
}
+14 -12
View File
@@ -759,7 +759,7 @@ std::map<std::string, Base::Color> ViewProviderPartExt::getElementColors(const c
if (!element || !element[0]) {
auto color = ShapeAppearance.getDiffuseColor();
color.setTransparency(Base::fromPercent(Transparency.getValue()));
color.setTransparency(ShapeAppearance.getTransparency());
ret["Face"] = color;
ret["Edge"] = LineColor.getValue();
ret["Vertex"] = PointColor.getValue();
@@ -773,18 +773,16 @@ std::map<std::string, Base::Color> ViewProviderPartExt::getElementColors(const c
color.setTransparency(Base::fromPercent(Transparency.getValue()));
bool singleColor = true;
for (int i = 0; i < size; ++i) {
Base::Color faceColor = ShapeAppearance.getDiffuseColor(i);
faceColor.setTransparency(ShapeAppearance.getTransparency(i));
if (faceColor != color) {
ret[std::string(element, 4) + std::to_string(i + 1)] = faceColor;
auto color_i = ShapeAppearance.getDiffuseColor(i);
color_i.setTransparency(ShapeAppearance.getTransparency(i));
if (color_i != color) {
ret[std::string(element, 4) + std::to_string(i + 1)] = color_i;
}
Base::Color firstFaceColor = ShapeAppearance.getDiffuseColor(0);
firstFaceColor.setTransparency(ShapeAppearance.getTransparency(0));
singleColor = singleColor && (faceColor == firstFaceColor);
singleColor = singleColor && color == color_i;
}
if (size > 0 && singleColor) {
color = ShapeAppearance.getDiffuseColor(0);
color.setTransparency(ShapeAppearance.getTransparency(0));
color.setTransparency(ShapeAppearance.getTransparency());
ret.clear();
}
ret["Face"] = color;
@@ -792,13 +790,17 @@ std::map<std::string, Base::Color> ViewProviderPartExt::getElementColors(const c
else {
int idx = atoi(element + 4);
if (idx > 0 && idx <= size) {
ret[element] = ShapeAppearance.getDiffuseColor(idx - 1);
auto color_i = ShapeAppearance.getDiffuseColor(idx - 1);
color_i.setTransparency(ShapeAppearance.getTransparency(idx - 1));
ret[element] = color_i;
}
else {
ret[element] = ShapeAppearance.getDiffuseColor();
auto color_i = ShapeAppearance.getDiffuseColor();
color_i.setTransparency(ShapeAppearance.getTransparency());
ret[element] = color_i;
}
if (size == 1) {
ret[element].setTransparency(Base::fromPercent(Transparency.getValue()));
ret[element].setTransparency(ShapeAppearance.getTransparency());
}
}
}