Fix issue659 - Problems constraining to ends of Helix.
Create a new copy type for faces that includes the translation aspect of helical extrusions. Also swap the end remappings when the shell is inside out - this was also affecting some Revolve extrusions.pull/672/head
parent
6ae417adb5
commit
b3eb589240
|
@ -121,6 +121,7 @@ void Entity::GetReferencePoints(std::vector<Vector> *refs) {
|
||||||
case Type::FACE_N_TRANS:
|
case Type::FACE_N_TRANS:
|
||||||
case Type::FACE_N_ROT_AA:
|
case Type::FACE_N_ROT_AA:
|
||||||
case Type::FACE_ROT_NORMAL_PT:
|
case Type::FACE_ROT_NORMAL_PT:
|
||||||
|
case Type::FACE_N_ROT_AXIS_TRANS:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -757,6 +758,7 @@ void Entity::Draw(DrawAs how, Canvas *canvas) {
|
||||||
case Type::FACE_N_TRANS:
|
case Type::FACE_N_TRANS:
|
||||||
case Type::FACE_N_ROT_AA:
|
case Type::FACE_N_ROT_AA:
|
||||||
case Type::FACE_ROT_NORMAL_PT:
|
case Type::FACE_ROT_NORMAL_PT:
|
||||||
|
case Type::FACE_N_ROT_AXIS_TRANS:
|
||||||
// Do nothing; these are drawn with the triangle mesh
|
// Do nothing; these are drawn with the triangle mesh
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -702,6 +702,7 @@ bool EntityBase::IsFace() const {
|
||||||
case Type::FACE_N_TRANS:
|
case Type::FACE_N_TRANS:
|
||||||
case Type::FACE_N_ROT_AA:
|
case Type::FACE_N_ROT_AA:
|
||||||
case Type::FACE_ROT_NORMAL_PT:
|
case Type::FACE_ROT_NORMAL_PT:
|
||||||
|
case Type::FACE_N_ROT_AXIS_TRANS:
|
||||||
return true;
|
return true;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
|
@ -774,6 +775,15 @@ ExprVector EntityBase::FaceGetPointExprs() const {
|
||||||
r = ExprVector::From(numPoint);
|
r = ExprVector::From(numPoint);
|
||||||
r = q.Rotate(r);
|
r = q.Rotate(r);
|
||||||
r = r.Plus(trans);
|
r = r.Plus(trans);
|
||||||
|
} else if(type == Type::FACE_N_ROT_AXIS_TRANS) {
|
||||||
|
ExprVector orig = ExprVector::From(numPoint);
|
||||||
|
ExprVector trans = ExprVector::From(param[0], param[1], param[2]);
|
||||||
|
ExprVector displace = ExprVector::From(param[4], param[5], param[6])
|
||||||
|
.WithMagnitude(Expr::From(param[7])).ScaledBy(Expr::From(timesApplied));
|
||||||
|
ExprQuaternion q = GetAxisAngleQuaternionExprs(3);
|
||||||
|
orig = orig.Minus(trans);
|
||||||
|
orig = q.Rotate(orig);
|
||||||
|
r = orig.Plus(trans).Plus(displace);
|
||||||
} else if(type == Type::FACE_N_TRANS) {
|
} else if(type == Type::FACE_N_TRANS) {
|
||||||
ExprVector trans = ExprVector::From(param[0], param[1], param[2]);
|
ExprVector trans = ExprVector::From(param[0], param[1], param[2]);
|
||||||
r = ExprVector::From(numPoint);
|
r = ExprVector::From(numPoint);
|
||||||
|
@ -801,6 +811,14 @@ Vector EntityBase::FaceGetPointNum() const {
|
||||||
Quaternion q = Quaternion::From(param[3], param[4], param[5], param[6]);
|
Quaternion q = Quaternion::From(param[3], param[4], param[5], param[6]);
|
||||||
r = q.Rotate(numPoint);
|
r = q.Rotate(numPoint);
|
||||||
r = r.Plus(trans);
|
r = r.Plus(trans);
|
||||||
|
} else if(type == Type::FACE_N_ROT_AXIS_TRANS) {
|
||||||
|
Vector offset = Vector::From(param[0], param[1], param[2]);
|
||||||
|
Vector displace = Vector::From(param[4], param[5], param[6])
|
||||||
|
.WithMagnitude(SK.GetParam(param[7])->val).ScaledBy(timesApplied);
|
||||||
|
Quaternion q = PointGetQuaternion();
|
||||||
|
r = numPoint.Minus(offset);
|
||||||
|
r = q.Rotate(r);
|
||||||
|
r = r.Plus(offset).Plus(displace);
|
||||||
} else if(type == Type::FACE_N_TRANS) {
|
} else if(type == Type::FACE_N_TRANS) {
|
||||||
Vector trans = Vector::From(param[0], param[1], param[2]);
|
Vector trans = Vector::From(param[0], param[1], param[2]);
|
||||||
r = numPoint.Plus(trans.ScaledBy(timesApplied));
|
r = numPoint.Plus(trans.ScaledBy(timesApplied));
|
||||||
|
|
|
@ -1113,6 +1113,7 @@ void Group::CopyEntity(IdList<Entity,hEntity> *el,
|
||||||
case Entity::Type::FACE_N_TRANS:
|
case Entity::Type::FACE_N_TRANS:
|
||||||
case Entity::Type::FACE_N_ROT_AA:
|
case Entity::Type::FACE_N_ROT_AA:
|
||||||
case Entity::Type::FACE_ROT_NORMAL_PT:
|
case Entity::Type::FACE_ROT_NORMAL_PT:
|
||||||
|
case Entity::Type::FACE_N_ROT_AXIS_TRANS:
|
||||||
if(as == CopyAs::N_TRANS) {
|
if(as == CopyAs::N_TRANS) {
|
||||||
en.type = Entity::Type::FACE_N_TRANS;
|
en.type = Entity::Type::FACE_N_TRANS;
|
||||||
en.param[0] = dx;
|
en.param[0] = dx;
|
||||||
|
@ -1120,8 +1121,18 @@ void Group::CopyEntity(IdList<Entity,hEntity> *el,
|
||||||
en.param[2] = dz;
|
en.param[2] = dz;
|
||||||
} else if (as == CopyAs::NUMERIC) {
|
} else if (as == CopyAs::NUMERIC) {
|
||||||
en.type = Entity::Type::FACE_NORMAL_PT;
|
en.type = Entity::Type::FACE_NORMAL_PT;
|
||||||
|
} else if (as == CopyAs::N_ROT_AXIS_TRANS) {
|
||||||
|
en.type = Entity::Type::FACE_N_ROT_AXIS_TRANS;
|
||||||
|
en.param[0] = dx;
|
||||||
|
en.param[1] = dy;
|
||||||
|
en.param[2] = dz;
|
||||||
|
en.param[3] = qw;
|
||||||
|
en.param[4] = qvx;
|
||||||
|
en.param[5] = qvy;
|
||||||
|
en.param[6] = qvz;
|
||||||
|
en.param[7] = dist;
|
||||||
} else {
|
} else {
|
||||||
if(as == CopyAs::N_ROT_AA || as == CopyAs::N_ROT_AXIS_TRANS) {
|
if(as == CopyAs::N_ROT_AA) {
|
||||||
en.type = Entity::Type::FACE_N_ROT_AA;
|
en.type = Entity::Type::FACE_N_ROT_AA;
|
||||||
} else {
|
} else {
|
||||||
en.type = Entity::Type::FACE_N_ROT_TRANS;
|
en.type = Entity::Type::FACE_N_ROT_TRANS;
|
||||||
|
|
|
@ -409,6 +409,7 @@ public:
|
||||||
FACE_N_TRANS = 5003,
|
FACE_N_TRANS = 5003,
|
||||||
FACE_N_ROT_AA = 5004,
|
FACE_N_ROT_AA = 5004,
|
||||||
FACE_ROT_NORMAL_PT = 5005,
|
FACE_ROT_NORMAL_PT = 5005,
|
||||||
|
FACE_N_ROT_AXIS_TRANS = 5006,
|
||||||
|
|
||||||
WORKPLANE = 10000,
|
WORKPLANE = 10000,
|
||||||
LINE_SEGMENT = 11000,
|
LINE_SEGMENT = 11000,
|
||||||
|
|
|
@ -648,12 +648,14 @@ void SShell::MakeFromHelicalRevolutionOf(SBezierLoopSet *sbls, Vector pt, Vector
|
||||||
double dist = distf - dists;
|
double dist = distf - dists;
|
||||||
int sections = (int)(fabs(anglef - angles) / (PI / 2) + 1);
|
int sections = (int)(fabs(anglef - angles) / (PI / 2) + 1);
|
||||||
double wedge = (anglef - angles) / sections;
|
double wedge = (anglef - angles) / sections;
|
||||||
|
int startMapping = Group::REMAP_LATHE_START, endMapping = Group::REMAP_LATHE_END;
|
||||||
|
|
||||||
if(CheckNormalAxisRelationship(sbls, pt, axis, anglef-angles, distf-dists)) {
|
if(CheckNormalAxisRelationship(sbls, pt, axis, anglef-angles, distf-dists)) {
|
||||||
swap(angles, anglef);
|
swap(angles, anglef);
|
||||||
swap(dists, distf);
|
swap(dists, distf);
|
||||||
dist = -dist;
|
dist = -dist;
|
||||||
wedge = -wedge;
|
wedge = -wedge;
|
||||||
|
swap(startMapping, endMapping);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Define a coordinate system to contain the original sketch, and get
|
// Define a coordinate system to contain the original sketch, and get
|
||||||
|
@ -678,7 +680,7 @@ void SShell::MakeFromHelicalRevolutionOf(SBezierLoopSet *sbls, Vector pt, Vector
|
||||||
u.RotatedAbout(axis, angles), v.RotatedAbout(axis, angles));
|
u.RotatedAbout(axis, angles), v.RotatedAbout(axis, angles));
|
||||||
s0.color = color;
|
s0.color = color;
|
||||||
|
|
||||||
hEntity face0 = group->Remap(Entity::NO_ENTITY, Group::REMAP_LATHE_START);
|
hEntity face0 = group->Remap(Entity::NO_ENTITY, startMapping);
|
||||||
s0.face = face0.v;
|
s0.face = face0.v;
|
||||||
|
|
||||||
s1 = SSurface::FromPlane(
|
s1 = SSurface::FromPlane(
|
||||||
|
@ -686,7 +688,7 @@ void SShell::MakeFromHelicalRevolutionOf(SBezierLoopSet *sbls, Vector pt, Vector
|
||||||
u.ScaledBy(-1).RotatedAbout(axis, anglef), v.RotatedAbout(axis, anglef));
|
u.ScaledBy(-1).RotatedAbout(axis, anglef), v.RotatedAbout(axis, anglef));
|
||||||
s1.color = color;
|
s1.color = color;
|
||||||
|
|
||||||
hEntity face1 = group->Remap(Entity::NO_ENTITY, Group::REMAP_LATHE_END);
|
hEntity face1 = group->Remap(Entity::NO_ENTITY, endMapping);
|
||||||
s1.face = face1.v;
|
s1.face = face1.v;
|
||||||
|
|
||||||
hSSurface hs0 = surface.AddAndAssignId(&s0);
|
hSSurface hs0 = surface.AddAndAssignId(&s0);
|
||||||
|
|
Loading…
Reference in New Issue