[Sketcher] Refactor SketchObject some more

This commit is contained in:
Ajinkya Dahale
2024-07-28 14:31:05 +05:30
parent 45021f204a
commit 6a3bbc195d

View File

@@ -4345,7 +4345,7 @@ int SketchObject::addSymmetric(const std::vector<int>& geoIdList, int refGeoId,
else {
for (auto* constr : constrvals) {
if (constr->First == refGeoId
&& (constr->Type == Sketcher::Vertical || constr->Type == Sketcher::Horizontal)){
&& (constr->Type == Sketcher::Vertical || constr->Type == Sketcher::Horizontal)) {
refIsAxisAligned = true;
}
}
@@ -4358,117 +4358,127 @@ int SketchObject::addSymmetric(const std::vector<int>& geoIdList, int refGeoId,
for (auto* constr : constrvals) {
// we look in the map, because we might have skipped internal alignment geometry
auto fit = geoIdMap.find(constr->First);
auto firstIt = geoIdMap.find(constr->First);
if (fit != geoIdMap.end()) {// if First of constraint is in geoIdList
if (addSymmetryConstraints && constr->Type != Sketcher::InternalAlignment) {
// if we are making symmetric constraints, then we don't want to copy all constraints
if (firstIt == geoIdMap.end()) {
continue;
}
// if First of constraint is in geoIdList
if (addSymmetryConstraints && constr->Type != Sketcher::InternalAlignment) {
// if we are making symmetric constraints, then we don't want to copy all constraints
continue;
}
if (constr->Second == GeoEnum::GeoUndef /*&& constr->Third == GeoEnum::GeoUndef*/) {
if (refIsAxisAligned
&& (constr->Type == Sketcher::DistanceX
|| constr->Type == Sketcher::DistanceY)) {
// In this case we want to keep the Vertical, Horizontal constraints.
// DistanceX and DistanceY constraints should also be possible to keep in
// this case, but keeping them causes segfault, not sure why.
continue;
}
if (!refIsAxisAligned
&& (constr->Type == Sketcher::DistanceX
|| constr->Type == Sketcher::DistanceY
|| constr->Type == Sketcher::Vertical
|| constr->Type == Sketcher::Horizontal)) {
// this includes all non-directional single GeoId constraints, as radius,
// diameter, weight,...
continue;
}
Constraint* constNew = constr->copy();
constNew->Name = "";
constNew->First = firstIt->second;
newconstrVals.push_back(constNew);
continue;
}
// other geoids intervene in this constraint
auto secondIt = geoIdMap.find(constr->Second);
if (secondIt == geoIdMap.end()) {
continue;
}
// Second is also in the list
if (constr->Third == GeoEnum::GeoUndef) {
if (!(constr->Type == Sketcher::Coincident
|| constr->Type == Sketcher::Perpendicular
|| constr->Type == Sketcher::Parallel
|| constr->Type == Sketcher::Tangent
|| constr->Type == Sketcher::Distance
|| constr->Type == Sketcher::Equal
|| constr->Type == Sketcher::Angle
|| constr->Type == Sketcher::PointOnObject
|| constr->Type == Sketcher::InternalAlignment)) {
continue;
}
if (constr->Second == GeoEnum::GeoUndef ){
if (refIsAxisAligned) {
// in this case we want to keep the Vertical, Horizontal constraints
// DistanceX ,and DistanceY constraints should also be possible to keep in
// this case, but keeping them causes segfault, not sure why.
if (constr->Type != Sketcher::DistanceX
&& constr->Type != Sketcher::DistanceY) {
Constraint* constNew = constr->copy();
constNew->Name = ""; // Make sure we don't have 2 constraint with same name.
constNew->First = fit->second;
newconstrVals.push_back(constNew);
}
}
else if (constr->Type != Sketcher::DistanceX
&& constr->Type != Sketcher::DistanceY
&& constr->Type != Sketcher::Vertical
&& constr->Type != Sketcher::Horizontal) {
// this includes all non-directional single GeoId constraints, as radius,
// diameter, weight,...
Constraint* constNew = constr->copy();
constNew->Name = "";
constNew->First = fit->second;
newconstrVals.push_back(constNew);
}
Constraint* constNew = constr->copy();
constNew->Name = "";
constNew->First = firstIt->second;
constNew->Second = secondIt->second;
if (isStartEndInverted[constr->First]) {
if (constr->FirstPos == Sketcher::PointPos::start)
constNew->FirstPos = Sketcher::PointPos::end;
else if (constr->FirstPos == Sketcher::PointPos::end)
constNew->FirstPos = Sketcher::PointPos::start;
}
else {// other geoids intervene in this constraint
auto sit = geoIdMap.find(constr->Second);
if (sit != geoIdMap.end()) {// Second is also in the list
if (constr->Third == GeoEnum::GeoUndef) {
if (constr->Type == Sketcher::Coincident
|| constr->Type == Sketcher::Perpendicular
|| constr->Type == Sketcher::Parallel
|| constr->Type == Sketcher::Tangent
|| constr->Type == Sketcher::Distance
|| constr->Type == Sketcher::Equal || constr->Type == Sketcher::Angle
|| constr->Type == Sketcher::PointOnObject
|| constr->Type == Sketcher::InternalAlignment) {
Constraint* constNew = constr->copy();
constNew->Name = "";
constNew->First = fit->second;
constNew->Second = sit->second;
if (isStartEndInverted[constr->First]) {
if (constr->FirstPos == Sketcher::PointPos::start)
constNew->FirstPos = Sketcher::PointPos::end;
else if (constr->FirstPos == Sketcher::PointPos::end)
constNew->FirstPos = Sketcher::PointPos::start;
}
if (isStartEndInverted[constr->Second]) {
if (constr->SecondPos == Sketcher::PointPos::start)
constNew->SecondPos = Sketcher::PointPos::end;
else if (constr->SecondPos == Sketcher::PointPos::end)
constNew->SecondPos = Sketcher::PointPos::start;
}
if (constNew->Type == Tangent || constNew->Type == Perpendicular)
AutoLockTangencyAndPerpty(constNew, true);
if ((constr->Type == Sketcher::Angle)
&& (refPosId == Sketcher::PointPos::none)) {
constNew->setValue(-constr->getValue());
}
newconstrVals.push_back(constNew);
}
}
else {// three GeoIds intervene in constraint
auto tit = geoIdMap.find(constr->Third);
if (tit != geoIdMap.end()) {// Third is also in the list
Constraint* constNew = constr->copy();
constNew->Name = "";
constNew->First = fit->second;
constNew->Second = sit->second;
constNew->Third = tit->second;
if (isStartEndInverted[constr->First]) {
if (constr->FirstPos == Sketcher::PointPos::start)
constNew->FirstPos = Sketcher::PointPos::end;
else if (constr->FirstPos == Sketcher::PointPos::end)
constNew->FirstPos = Sketcher::PointPos::start;
}
if (isStartEndInverted[constr->Second]) {
if (constr->SecondPos == Sketcher::PointPos::start)
constNew->SecondPos = Sketcher::PointPos::end;
else if (constr->SecondPos == Sketcher::PointPos::end)
constNew->SecondPos = Sketcher::PointPos::start;
}
if (isStartEndInverted[constr->Third]) {
if (constr->ThirdPos == Sketcher::PointPos::start)
constNew->ThirdPos = Sketcher::PointPos::end;
else if (constr->ThirdPos == Sketcher::PointPos::end)
constNew->ThirdPos = Sketcher::PointPos::start;
}
newconstrVals.push_back(constNew);
}
}
}
if (isStartEndInverted[constr->Second]) {
if (constr->SecondPos == Sketcher::PointPos::start)
constNew->SecondPos = Sketcher::PointPos::end;
else if (constr->SecondPos == Sketcher::PointPos::end)
constNew->SecondPos = Sketcher::PointPos::start;
}
if (constNew->Type == Tangent || constNew->Type == Perpendicular)
AutoLockTangencyAndPerpty(constNew, true);
if ((constr->Type == Sketcher::Angle)
&& (refPosId == Sketcher::PointPos::none)) {
constNew->setValue(-constr->getValue());
}
newconstrVals.push_back(constNew);
continue;
}
// three GeoIds intervene in constraint
auto thirdIt = geoIdMap.find(constr->Third);
if (thirdIt == geoIdMap.end()) {
continue;
}
// Third is also in the list
Constraint* constNew = constr->copy();
constNew->Name = "";
constNew->First = firstIt->second;
constNew->Second = secondIt->second;
constNew->Third = thirdIt->second;
if (isStartEndInverted[constr->First]) {
if (constr->FirstPos == Sketcher::PointPos::start)
constNew->FirstPos = Sketcher::PointPos::end;
else if (constr->FirstPos == Sketcher::PointPos::end)
constNew->FirstPos = Sketcher::PointPos::start;
}
if (isStartEndInverted[constr->Second]) {
if (constr->SecondPos == Sketcher::PointPos::start)
constNew->SecondPos = Sketcher::PointPos::end;
else if (constr->SecondPos == Sketcher::PointPos::end)
constNew->SecondPos = Sketcher::PointPos::start;
}
if (isStartEndInverted[constr->Third]) {
if (constr->ThirdPos == Sketcher::PointPos::start)
constNew->ThirdPos = Sketcher::PointPos::end;
else if (constr->ThirdPos == Sketcher::PointPos::end)
constNew->ThirdPos = Sketcher::PointPos::start;
}
newconstrVals.push_back(constNew);
}
if (addSymmetryConstraints) {
@@ -4555,20 +4565,21 @@ std::vector<Part::Geometry*> SketchObject::getSymmetric(const std::vector<int>&
auto shouldCopyGeometry = [&](auto* geo, int geoId) -> bool {
auto gf = GeometryFacade::getFacade(geo);
if (gf->isInternalAligned()) {
// only add if the corresponding geometry it defines is also in the list.
int definedGeo = GeoEnum::GeoUndef;
for (auto c : Constraints.getValues()) {
if (c->Type == Sketcher::InternalAlignment && c->First == geoId) {
definedGeo = c->Second;
break;
}
}
// Return true if definedGeo is in geoIdList, false otherwise
return std::ranges::find(geoIdList, definedGeo) != geoIdList.end();
if (!gf->isInternalAligned()) {
// Return true if not internal aligned, indicating it should always be copied
return true;
}
// Return true if not internal aligned, indicating it should always be copied
return true;
// only add if the corresponding geometry it defines is also in the list.
int definedGeo = GeoEnum::GeoUndef;
for (auto c : Constraints.getValues()) {
if (c->Type == Sketcher::InternalAlignment && c->First == geoId) {
definedGeo = c->Second;
break;
}
}
// Return true if definedGeo is in geoIdList, false otherwise
return std::ranges::find(geoIdList, definedGeo) != geoIdList.end();
};
if (refIsLine) {
@@ -5543,32 +5554,31 @@ int SketchObject::removeAxesAlignment(const std::vector<int>& geoIdList)
changed = true;
if (referenceHorizontal == GeoEnum::GeoUndef) {
referenceHorizontal = constrvals[i]->First;
++cindex;
continue;
}
else {
auto newConstr = new Constraint();
auto newConstr = new Constraint();
newConstr->Type = Sketcher::Parallel;
newConstr->First = referenceHorizontal;
newConstr->Second = constrvals[i]->First;
newConstr->Type = Sketcher::Parallel;
newConstr->First = referenceHorizontal;
newConstr->Second = constrvals[i]->First;
newconstrVals.push_back(newConstr);
}
newconstrVals.push_back(newConstr);
}
else if (changeConstraintIndices[cindex].second == Sketcher::Vertical && nvert > 0) {
changed = true;
if (referenceVertical == GeoEnum::GeoUndef) {
referenceVertical = constrvals[i]->First;
++cindex;
continue;
}
else {
auto newConstr = new Constraint();
auto newConstr = new Constraint();
newConstr->Type = Sketcher::Parallel;
newConstr->First = referenceVertical;
newConstr->Second = constrvals[i]->First;
newConstr->Type = Sketcher::Parallel;
newConstr->First = referenceVertical;
newConstr->Second = constrvals[i]->First;
newconstrVals.push_back(newConstr);
}
newconstrVals.push_back(newConstr);
}
else if (changeConstraintIndices[cindex].second == Sketcher::Symmetric
|| changeConstraintIndices[cindex].second == Sketcher::PointOnObject) {
@@ -5577,11 +5587,12 @@ int SketchObject::removeAxesAlignment(const std::vector<int>& geoIdList)
else if (changeConstraintIndices[cindex].second == Sketcher::DistanceX
|| changeConstraintIndices[cindex].second == Sketcher::DistanceY) {
changed = true;// We remove symmetric on axes
// TODO: Handle pathological cases like DistanceY on horizontal constraint
newconstrVals.push_back(constrvals[i]->clone());
newconstrVals.back()->Type = Sketcher::Distance;
}
cindex++;
++cindex;
}
if (nhoriz > 0 && nvert > 0) {
@@ -5594,8 +5605,9 @@ int SketchObject::removeAxesAlignment(const std::vector<int>& geoIdList)
newconstrVals.push_back(newConstr);
}
if (changed)
if (changed) {
Constraints.setValues(std::move(newconstrVals));
}
return 0;
}