inline double GetSignedOffset(AcGeVector3d offset, AcGePoint3d p1, AcGePoint3d p2)
{
AcGeLine3d l(p1, p2);
AcGePoint3d p = p1 + offset;
AcGePoint3d pp = l.closestPointTo(p);
if (p1.distanceTo(pp) + p2.distanceTo(pp) > p1.distanceTo(p2))
return p1.distanceTo(pp);
else
return -p1.distanceTo(pp);
}
Acad::ErrorStatus Bolt::subMoveGripPointsAt(const AcDbIntArray &indices, const AcGeVector3d &offset)
{
assertWriteEnabled();
for (int i = 0; i < indices.length(); i++)
{
// Если хотим настроить что будет происходить
// когда будем тянуть за кокнретную грп-точку
// 0 - первую по счёту, 1 - вторую, 2 - третью и т.д.
// наша фигура это // subGetGripPoints Map:
//
// ------- 4
// / |
// | |0_______________ 1
// | |
// | ________________|
// \ |3 2
// ------|
// 5
AcGeMatrix3d mat;
switch (indices[i])
{
case 0:
m_diametrRezba += GetSignedOffset(offset, m_arRezbaline[0], m_arRezbaline[3]) * 2;
storePoints();
return Acad::eOk;
case 3:
m_diametrRezba += GetSignedOffset(offset, m_arRezbaline[3], m_arRezbaline[0]) * 2;
storePoints();
return Acad::eOk;
case 1:
m_lengthRezba += GetSignedOffset(offset, m_arRezbaline[1], m_arRezbaline[0]);
storePoints();
return Acad::eOk;
case 2:
m_lengthRezba += GetSignedOffset(offset, m_arRezbaline[2], m_arRezbaline[3]);
storePoints();
return Acad::eOk;
case 4:
m_diametrHat += GetSignedOffset(offset, m_arHatline[0], m_arHatline[2]) * 2;
storePoints();
return Acad::eOk;
case 5:
m_diametrHat += GetSignedOffset(offset, m_arHatline[2], m_arHatline[0]) * 2;
storePoints();
return Acad::eOk;
}
}
return (AcDbEntity::subMoveGripPointsAt(indices, offset));
}