Enable multiple originals for the transformed features

This commit is contained in:
jrheinlaender
2013-09-28 16:17:55 +02:00
committed by Stefan Tröger
parent a59901ee4b
commit fcea39b0d8
28 changed files with 1804 additions and 293 deletions

View File

@@ -77,18 +77,6 @@ bool ViewProviderTransformed::setEdit(int ModNum)
pcRejectedRoot = new SoSeparator();
pcRejectedRoot->ref();
rejectedTrfms = new SoMultipleCopy();
rejectedTrfms->ref();
rejectedCoords = new SoCoordinate3();
rejectedCoords->ref();
rejectedNorms = new SoNormal();
rejectedNorms->ref();
rejectedFaceSet = new SoIndexedFaceSet();
rejectedFaceSet->ref();
SoPickStyle* rejectedPickStyle = new SoPickStyle();
rejectedPickStyle->style = SoPickStyle::UNPICKABLE;
@@ -118,12 +106,7 @@ bool ViewProviderTransformed::setEdit(int ModNum)
pcRejectedRoot->addChild(rejectedMaterial);
pcRejectedRoot->addChild(rejectedHints);
pcRejectedRoot->addChild(rejectedFaceStyle);
pcRejectedRoot->addChild(rejectedCoords);
pcRejectedRoot->addChild(rejectedNorms);
pcRejectedRoot->addChild(rejectedNormb);
pcRejectedRoot->addChild(rejectedTrfms);
rejectedTrfms->addChild(rejectedFaceSet);
pcRejectedRoot->addChild(rejectedNormb); // NOTE: The code relies on the last child added here being index 6
pcRoot->addChild(pcRejectedRoot);
recomputeFeature();
@@ -151,16 +134,19 @@ void ViewProviderTransformed::unsetEdit(int ModNum)
PartGui::ViewProviderPart::unsetEdit(ModNum);
}
rejectedTrfms->removeAllChildren();
while (pcRejectedRoot->getNumChildren() > 7) {
SoSeparator* sep = static_cast<SoSeparator*>(pcRejectedRoot->getChild(7));
SoMultipleCopy* rejectedTrfms = static_cast<SoMultipleCopy*>(sep->getChild(2));
rejectedTrfms ->removeAllChildren();
sep->removeChild(1);
sep->removeChild(0);
pcRejectedRoot ->removeChild(7);
}
pcRejectedRoot->removeAllChildren();
pcRoot->removeChild(pcRejectedRoot);
pcRejectedRoot->unref();
rejectedTrfms->unref();
rejectedCoords->unref();
rejectedNorms->unref();
rejectedFaceSet->unref();
}
bool ViewProviderTransformed::onDelete(const std::vector<std::string> &s)
@@ -203,8 +189,11 @@ void ViewProviderTransformed::recomputeFeature(void)
PartDesign::Transformed* pcTransformed = static_cast<PartDesign::Transformed*>(getObject());
pcTransformed->getDocument()->recomputeFeature(pcTransformed);
const std::vector<App::DocumentObjectExecReturn*> log = pcTransformed->getDocument()->getRecomputeLog();
unsigned rejected = pcTransformed->getRejectedTransformations().size();
QString msg = QString::fromLatin1("%1");
PartDesign::Transformed::rejectedMap rejected_trsf = pcTransformed->getRejectedTransformations();
unsigned rejected = 0;
for (PartDesign::Transformed::rejectedMap::const_iterator r = rejected_trsf.begin(); r != rejected_trsf.end(); r++)
rejected += r->second.size();
QString msg = QString::fromAscii("%1");
if (rejected > 0) {
msg = QString::fromLatin1("<font color='orange'>%1<br/></font>\r\n%2");
if (rejected == 1)
@@ -223,25 +212,30 @@ void ViewProviderTransformed::recomputeFeature(void)
}
signalDiagnosis(msg);
TopoDS_Shape shape;
if (rejected != 0) {
// FIXME: create a compound if there are more than one originals
App::DocumentObject* original = pcTransformed->Originals.getValues().front();
if (original->getTypeId().isDerivedFrom(PartDesign::Additive::getClassTypeId())) {
PartDesign::Additive* addFeature = static_cast<PartDesign::Additive*>(original);
shape = addFeature->AddShape.getShape()._Shape;
} else if (original->getTypeId().isDerivedFrom(PartDesign::Subtractive::getClassTypeId())) {
PartDesign::Subtractive* subFeature = static_cast<PartDesign::Subtractive*>(original);
shape = subFeature->SubShape.getShape()._Shape;
}
// Clear all the rejected stuff
while (pcRejectedRoot->getNumChildren() > 7) {
SoSeparator* sep = static_cast<SoSeparator*>(pcRejectedRoot->getChild(7));
SoMultipleCopy* rejectedTrfms = static_cast<SoMultipleCopy*>(sep->getChild(2));
rejectedTrfms ->removeAllChildren();
sep->removeChild(1);
sep->removeChild(0);
pcRejectedRoot ->removeChild(7);
}
if (rejected == 0 || shape.IsNull()) {
rejectedCoords ->point .setNum(0);
rejectedNorms ->vector .setNum(0);
rejectedFaceSet ->coordIndex .setNum(0);
rejectedTrfms ->matrix .setNum(0);
} else {
for (PartDesign::Transformed::rejectedMap::const_iterator o = rejected_trsf.begin(); o != rejected_trsf.end(); o++) {
if (o->second.empty()) continue;
TopoDS_Shape shape;
if ((o->first)->getTypeId().isDerivedFrom(PartDesign::Additive::getClassTypeId())) {
PartDesign::Additive* addFeature = static_cast<PartDesign::Additive*>(o->first);
shape = addFeature->AddShape.getShape()._Shape;
} else if ((o->first)->getTypeId().isDerivedFrom(PartDesign::Subtractive::getClassTypeId())) {
PartDesign::Subtractive* subFeature = static_cast<PartDesign::Subtractive*>(o->first);
shape = subFeature->SubShape.getShape()._Shape;
}
if (shape.IsNull()) continue;
// Display the rejected transformations in red
TopoDS_Shape cShape(shape);
@@ -257,6 +251,7 @@ void ViewProviderTransformed::recomputeFeature(void)
Standard_Real deflection = ((xMax-xMin)+(yMax-yMin)+(zMax-zMin))/300.0 * Deviation.getValue();
// create or use the mesh on the data structure
// Note: This DOES have an effect on cShape
#if OCC_VERSION_HEX >= 0x060600
Standard_Real AngDeflectionRads = AngularDeflection.getValue() / 180.0 * M_PI;
BRepMesh_IncrementalMesh(cShape,deflection,Standard_False,
@@ -282,8 +277,11 @@ void ViewProviderTransformed::recomputeFeature(void)
}
// create memory for the nodes and indexes
SoCoordinate3* rejectedCoords = new SoCoordinate3();
rejectedCoords ->point .setNum(nbrNodes);
SoNormal* rejectedNorms = new SoNormal();
rejectedNorms ->vector .setNum(nbrNodes);
SoIndexedFaceSet* rejectedFaceSet = new SoIndexedFaceSet();
rejectedFaceSet ->coordIndex .setNum(nbrTriangles*4);
// get the raw memory for fast fill up
@@ -379,17 +377,23 @@ void ViewProviderTransformed::recomputeFeature(void)
rejectedFaceSet ->coordIndex .finishEditing();
// fill in the transformation matrices
rejectedTrfms->matrix.setNum(rejected);
SoMultipleCopy* rejectedTrfms = new SoMultipleCopy();
rejectedTrfms->matrix.setNum((o->second).size());
SbMatrix* mats = rejectedTrfms->matrix.startEditing();
std::list<gp_Trsf> rejected_trsf = pcTransformed->getRejectedTransformations();
std::list<gp_Trsf>::const_iterator trsf = rejected_trsf.begin();
for (unsigned int i=0; i < rejected; i++,trsf++) {
std::list<gp_Trsf>::const_iterator trsf = (o->second).begin();
for (unsigned int i=0; i < (o->second).size(); i++,trsf++) {
Base::Matrix4D mat;
Part::TopoShape::convertToMatrix(*trsf,mat);
mats[i] = convert(mat);
}
rejectedTrfms->matrix.finishEditing();
rejectedTrfms->addChild(rejectedFaceSet);
SoSeparator* sep = new SoSeparator();
sep->addChild(rejectedCoords);
sep->addChild(rejectedNorms);
sep->addChild(rejectedTrfms);
pcRejectedRoot->addChild(sep);
}
catch (...) {
Base::Console().Error("Cannot compute Inventor representation for the rejected transformations of shape of %s.\n",