Rectangle DSH : Fix a bug where 3p rectangle with radius, radius would not apply. Also fix various edge cases. Improve syntax.

This commit is contained in:
Paddle
2023-11-03 18:25:19 +01:00
committed by abdullahtahiriyo
parent 2c27a1da3c
commit 386467e685

View File

@@ -234,10 +234,6 @@ private:
else {
radius = 0.;
}
SbString text;
text.sprintf(" (%.1f Angle)", angle123 / M_PI * 180);
setPositionText(onSketchPos, text);
}
else {
corner2 = onSketchPos;
@@ -1450,7 +1446,15 @@ private:
Base::Vector2d e = onSketchPos - corner1;
double du = (v.y * e.x - v.x * e.y) / (u.x * v.y - u.y * v.x);
double dv = (-u.y * e.x + u.x * e.y) / (u.x * v.y - u.y * v.x);
if (du < 0 || du > length || dv < 0 || dv > width) {
if (-Precision::Confusion() < du && du < 0) {
du = 0.0;
}
if (-Precision::Confusion() < dv && dv < 0) {
dv = 0.0;
}
if (du < 0.0 || du > length || dv < 0.0 || dv > width) {
radius = 0.;
}
else {
@@ -1488,10 +1492,6 @@ private:
/ (cos(angle412 / 2) / sqrt(1 - cos(angle412 / 2) * cos(angle412 / 2))
+ cos(angle123 / 2) / sqrt(1 - cos(angle123 / 2) * cos(angle123 / 2))));
}
SbString text;
text.sprintf(" (%.1f radius)", radius);
setPositionText(onSketchPos, text);
}
void calculateThickness(Base::Vector2d onSketchPos)
@@ -1525,10 +1525,6 @@ private:
frameCorner4 = corner4 - u * obliqueThickness + v * obliqueThickness;
thickness = obliqueThickness * sin(angle412);
SbString text;
text.sprintf(" (%.1fT)", thickness);
setPositionText(onSketchPos, text);
}
};
@@ -1732,49 +1728,48 @@ void DSHRectangleControllerBase::doEnforceControlParameters(Base::Vector2d& onSk
double length = onViewParameters[OnViewParameter::Third]->getValue();
if (fabs(length) < Precision::Confusion()) {
unsetOnViewParameter(onViewParameters[OnViewParameter::Third].get());
return;
}
if (handler->constructionMethod() == ConstructionMethod::Diagonal) {
int sign = (onSketchPos.x - handler->corner1.x) >= 0 ? 1 : -1;
onSketchPos.x = handler->corner1.x + sign * length;
}
else {
if (handler->constructionMethod() == ConstructionMethod::Diagonal) {
int sign = (onSketchPos.x - handler->corner1.x) >= 0 ? 1 : -1;
onSketchPos.x = handler->corner1.x + sign * length;
}
else {
onSketchPos.x = handler->center.x + length / 2;
}
onSketchPos.x = handler->center.x + length / 2;
}
}
if (onViewParameters[OnViewParameter::Fourth]->isSet) {
double width = onViewParameters[OnViewParameter::Fourth]->getValue();
if (fabs(width) < Precision::Confusion()) {
unsetOnViewParameter(onViewParameters[OnViewParameter::Fourth].get());
return;
}
if (handler->constructionMethod() == ConstructionMethod::Diagonal) {
int sign = (onSketchPos.y - handler->corner1.y) >= 0 ? 1 : -1;
onSketchPos.y = handler->corner1.y + sign * width;
}
else {
if (handler->constructionMethod() == ConstructionMethod::Diagonal) {
int sign = (onSketchPos.y - handler->corner1.y) >= 0 ? 1 : -1;
onSketchPos.y = handler->corner1.y + sign * width;
}
else {
onSketchPos.y = handler->center.y + width / 2;
}
onSketchPos.y = handler->center.y + width / 2;
}
}
}
else if (handler->constructionMethod() == ConstructionMethod::ThreePoints) {
Base::Vector2d dir = onSketchPos - handler->corner1;
if (dir.Length() < Precision::Confusion()) {
dir.x = 1.0; // if direction null, default to (1,0)
}
double length = dir.Length();
if (onViewParameters[OnViewParameter::Third]->isSet) {
length = onViewParameters[OnViewParameter::Third]->getValue();
if (length < Precision::Confusion()) {
unsetOnViewParameter(onViewParameters[OnViewParameter::Third].get());
return;
}
else {
if (dir.Length() < Precision::Confusion()) {
dir.x = 1; // if direction cannot be determined, default to (1,0)
}
onSketchPos = handler->corner1 + length * dir.Normalize();
}
onSketchPos = handler->corner1 + length * dir.Normalize();
}
if (onViewParameters[OnViewParameter::Fourth]->isSet) {
@@ -1792,6 +1787,12 @@ void DSHRectangleControllerBase::doEnforceControlParameters(Base::Vector2d& onSk
if (onViewParameters[OnViewParameter::Fourth]->isSet) {
onSketchPos.y = onViewParameters[OnViewParameter::Fourth]->getValue();
}
if (onViewParameters[OnViewParameter::Third]->isSet
&& onViewParameters[OnViewParameter::Fourth]->isSet
&& (onSketchPos - handler->center).Length() < Precision::Confusion()) {
unsetOnViewParameter(onViewParameters[OnViewParameter::Third].get());
unsetOnViewParameter(onViewParameters[OnViewParameter::Fourth].get());
}
}
} break;
case SelectMode::SeekThird: {
@@ -1809,92 +1810,88 @@ void DSHRectangleControllerBase::doEnforceControlParameters(Base::Vector2d& onSk
double thickness = onViewParameters[OnViewParameter::Sixth]->getValue();
if (thickness < Precision::Confusion()) {
unsetOnViewParameter(onViewParameters[OnViewParameter::Sixth].get());
return;
}
else {
Base::Vector2d u = (handler->corner2 - handler->corner1).Normalize();
Base::Vector2d v = (handler->corner4 - handler->corner1).Normalize();
onSketchPos = handler->corner1 - u * thickness - v * thickness;
}
Base::Vector2d u = (handler->corner2 - handler->corner1).Normalize();
Base::Vector2d v = (handler->corner4 - handler->corner1).Normalize();
onSketchPos = handler->corner1 - u * thickness - v * thickness;
}
}
}
else if (handler->constructionMethod() == ConstructionMethod::ThreePoints) {
Base::Vector2d dir = onSketchPos - handler->corner2Initial;
if (dir.Length() < Precision::Confusion()) {
dir.x = 1.0; // if direction null, default to (1,0)
}
double width = dir.Length();
if (onViewParameters[OnViewParameter::Fifth]->isSet) {
width = onViewParameters[OnViewParameter::Fifth]->getValue();
if (width < Precision::Confusion()) {
unsetOnViewParameter(onViewParameters[OnViewParameter::Fifth].get());
return;
}
else {
if (dir.Length() < Precision::Confusion()) {
dir.x = 1; // if direction cannot be determined, default to (1,0)
}
onSketchPos = handler->corner2Initial + width * dir.Normalize();
}
onSketchPos = handler->corner2Initial + width * dir.Normalize();
}
if (onViewParameters[OnViewParameter::Sixth]->isSet) {
double angle =
onViewParameters[OnViewParameter::Sixth]->getValue() * M_PI / 180;
if (fmod(angle, M_PI) < Precision::Confusion()) {
unsetOnViewParameter(onViewParameters[OnViewParameter::Sixth].get());
return;
}
else {
int sign1 = handler->getPointSideOfVector(onSketchPos,
handler->corner2Initial
- handler->corner1,
handler->corner1);
int sign = handler->side != sign1 ? 1 : -1;
int sign1 =
handler->getPointSideOfVector(onSketchPos,
handler->corner2Initial - handler->corner1,
handler->corner1);
double angle123 = (handler->corner2Initial - handler->corner1).Angle()
+ M_PI + sign * angle;
int sign = handler->side != sign1 ? 1 : -1;
onSketchPos.x = handler->corner2Initial.x + cos(angle123) * width;
onSketchPos.y = handler->corner2Initial.y + sin(angle123) * width;
}
double angle123 =
(handler->corner2Initial - handler->corner1).Angle() + M_PI + sign * angle;
onSketchPos.x = handler->corner2Initial.x + cos(angle123) * width;
onSketchPos.y = handler->corner2Initial.y + sin(angle123) * width;
}
}
else {
Base::Vector2d dir = onSketchPos - handler->corner1;
if (dir.Length() < Precision::Confusion()) {
dir.x = 1.0; // if direction null, default to (1,0)
}
double width = dir.Length();
if (onViewParameters[OnViewParameter::Fifth]->isSet) {
width = onViewParameters[OnViewParameter::Fifth]->getValue();
if (width < Precision::Confusion()) {
unsetOnViewParameter(onViewParameters[OnViewParameter::Fifth].get());
return;
}
else {
if (dir.Length() < Precision::Confusion()) {
dir.x = 1; // if direction cannot be determined, default to (1,0)
}
onSketchPos = handler->corner1 + width * dir.Normalize();
}
onSketchPos = handler->corner1 + width * dir.Normalize();
}
if (onViewParameters[OnViewParameter::Sixth]->isSet) {
double c = onViewParameters[OnViewParameter::Sixth]->getValue() * M_PI / 180;
if (fmod(c, M_PI) < Precision::Confusion()) {
unsetOnViewParameter(onViewParameters[OnViewParameter::Sixth].get());
return;
}
else {
double a = asin(width * sin(M_PI - c)
/ (handler->corner3 - handler->corner1).Length());
int sign1 =
handler->getPointSideOfVector(onSketchPos,
handler->corner3 - handler->corner1,
handler->corner1);
double a = asin(width * sin(M_PI - c)
/ (handler->corner3 - handler->corner1).Length());
int sign = handler->side != sign1 ? 1 : -1;
int sign1 = handler->getPointSideOfVector(onSketchPos,
handler->corner3 - handler->corner1,
handler->corner1);
double angle =
(handler->center - handler->corner1).Angle() + sign * (c - a);
int sign = handler->side != sign1 ? 1 : -1;
onSketchPos.x = handler->corner1.x + cos(angle) * width;
onSketchPos.y = handler->corner1.y + sin(angle) * width;
}
double angle = (handler->center - handler->corner1).Angle() + sign * (c - a);
onSketchPos.x = handler->corner1.x + cos(angle) * width;
onSketchPos.y = handler->corner1.y + sin(angle) * width;
}
}
} break;
@@ -1906,12 +1903,12 @@ void DSHRectangleControllerBase::doEnforceControlParameters(Base::Vector2d& onSk
double thickness = onViewParameters[OnViewParameter::Sixth]->getValue();
if (thickness < Precision::Confusion()) {
unsetOnViewParameter(onViewParameters[OnViewParameter::Sixth].get());
return;
}
else {
Base::Vector2d u = (handler->corner2 - handler->corner1).Normalize();
Base::Vector2d v = (handler->corner4 - handler->corner1).Normalize();
onSketchPos = handler->corner1 - u * thickness - v * thickness;
}
Base::Vector2d u = (handler->corner2 - handler->corner1).Normalize();
Base::Vector2d v = (handler->corner4 - handler->corner1).Normalize();
onSketchPos = handler->corner1 - u * thickness - v * thickness;
}
}
else {
@@ -1933,12 +1930,12 @@ void DSHRectangleControllerBase::doEnforceControlParameters(Base::Vector2d& onSk
double thickness = onViewParameters[OnViewParameter::Eighth]->getValue();
if (thickness < Precision::Confusion()) {
unsetOnViewParameter(onViewParameters[OnViewParameter::Eighth].get());
return;
}
else {
Base::Vector2d u = (handler->corner2 - handler->corner1).Normalize();
Base::Vector2d v = (handler->corner4 - handler->corner1).Normalize();
onSketchPos = handler->corner1 - u * thickness - v * thickness;
}
Base::Vector2d u = (handler->corner2 - handler->corner1).Normalize();
Base::Vector2d v = (handler->corner4 - handler->corner1).Normalize();
onSketchPos = handler->corner1 - u * thickness - v * thickness;
}
}
}
@@ -1948,12 +1945,12 @@ void DSHRectangleControllerBase::doEnforceControlParameters(Base::Vector2d& onSk
double thickness = onViewParameters[OnViewParameter::Eighth]->getValue();
if (thickness < Precision::Confusion()) {
unsetOnViewParameter(onViewParameters[OnViewParameter::Eighth].get());
return;
}
else {
Base::Vector2d u = (handler->corner2 - handler->corner1).Normalize();
Base::Vector2d v = (handler->corner4 - handler->corner1).Normalize();
onSketchPos = handler->corner1 - u * thickness - v * thickness;
}
Base::Vector2d u = (handler->corner2 - handler->corner1).Normalize();
Base::Vector2d v = (handler->corner4 - handler->corner1).Normalize();
onSketchPos = handler->corner1 - u * thickness - v * thickness;
}
} break;
default: