TechDraw: Improve Arc Length dimension tool so that it can do any edge length: arc of ellipse, bspline.
This commit is contained in:
@@ -163,7 +163,8 @@ public:
|
||||
bool has1Ellipse() const { return s_pts == 0 && s_lns == 0 && s_cir == 0 && s_ell == 1 && s_spl == 0 && s_fcs == 0; }
|
||||
bool has2Ellipses() const { return s_pts == 0 && s_lns == 0 && s_cir == 0 && s_ell == 2 && s_spl == 0 && s_fcs == 0; }
|
||||
|
||||
bool has1SplineAndMore() const { return s_pts >= 0 && s_lns >= 0 && s_cir >= 0 && s_ell >= 0 && s_spl >= 1 && s_fcs == 0; }
|
||||
bool has1Spline() const { return s_pts == 0 && s_lns == 0 && s_cir == 0 && s_ell == 0 && s_spl == 1 && s_fcs == 0; }
|
||||
bool has1SplineAndMore() const { return s_spl >= 1 && s_fcs == 0; }
|
||||
|
||||
size_t s_pts, s_lns, s_cir, s_ell, s_spl, s_fcs;
|
||||
};
|
||||
@@ -732,6 +733,7 @@ protected:
|
||||
if (selection.has2Ellipses()) { makeCts_2Ellipses(selAllowed, pos); }
|
||||
}
|
||||
else if (selection.hasSplineAndCo()) {
|
||||
if (selection.has1Spline()) { makeCts_1Spline(selAllowed, pos); }
|
||||
if (selection.has1SplineAndMore()) { makeCts_1SplineAndMore(selAllowed, pos); }
|
||||
}
|
||||
return selAllowed;
|
||||
@@ -947,6 +949,13 @@ protected:
|
||||
if (availableDimension == AvailableDimension::SECOND) {
|
||||
restartCommand(QT_TRANSLATE_NOOP("Command", "Add Radius dimension"));
|
||||
createRadiusDiameterDimension(selEllipseArc[0], pos, false);
|
||||
if (selEllipseArc[0].geomEdgeType() != TechDraw::ARCOFELLIPSE) {
|
||||
availableDimension = AvailableDimension::RESET;
|
||||
}
|
||||
}
|
||||
if (availableDimension == AvailableDimension::THIRD) {
|
||||
restartCommand(QT_TRANSLATE_NOOP("Command", "Add Arc Length dimension"));
|
||||
createArcLengthDimension(selEllipseArc[0], pos);
|
||||
availableDimension = AvailableDimension::RESET;
|
||||
}
|
||||
}
|
||||
@@ -966,6 +975,17 @@ protected:
|
||||
}
|
||||
}
|
||||
|
||||
void makeCts_1Spline(bool& selAllowed, QPoint& pos)
|
||||
{
|
||||
//Edge length
|
||||
if (availableDimension == AvailableDimension::FIRST) {
|
||||
restartCommand(QT_TRANSLATE_NOOP("Command", "Add edge length dimension"));
|
||||
createArcLengthDimension(selSplineAndCo[0], pos);
|
||||
selAllowed = true;
|
||||
availableDimension = AvailableDimension::RESET;
|
||||
}
|
||||
}
|
||||
|
||||
void makeCts_1SplineAndMore(bool& selAllowed, QPoint& pos)
|
||||
{
|
||||
//Extend
|
||||
@@ -1379,6 +1399,8 @@ CmdTechDrawRadiusDimension::CmdTechDrawRadiusDimension()
|
||||
sWhatsThis = "TechDraw_RadiusDimension";
|
||||
sStatusTip = sToolTipText;
|
||||
sPixmap = "TechDraw_RadiusDimension";
|
||||
sAccel = "D";
|
||||
eType = ForEdit;
|
||||
}
|
||||
|
||||
void CmdTechDrawRadiusDimension::activated(int iMsg)
|
||||
|
||||
@@ -2305,6 +2305,8 @@ void CmdTechDrawExtensionCreateLengthArc::activated(int iMsg) {
|
||||
TechDraw::DrawViewDimension* dim = makeArcLengthDimension(ref);
|
||||
|
||||
if (dim) {
|
||||
objFeat->refreshCEGeoms();
|
||||
objFeat->requestPaint();
|
||||
Gui::Command::commitCommand();
|
||||
}
|
||||
else {
|
||||
@@ -2366,42 +2368,40 @@ DrawViewDimension* TechDrawGui::makeArcLengthDimension(const ReferenceEntry& ref
|
||||
int geoId = DrawUtil::getIndexFromName(ref.getSubName());
|
||||
BaseGeomPtr geom = dvp->getGeomByIndex(geoId);
|
||||
|
||||
if (ref.geomEdgeType() == TechDraw::ARCOFCIRCLE) {
|
||||
TechDraw::AOCPtr arcTag = std::static_pointer_cast<TechDraw::AOC>(geom);
|
||||
float radius = arcTag->radius;
|
||||
Base::Vector3d centerPt = arcTag->center;
|
||||
centerPt.y = -centerPt.y;
|
||||
Base::Vector3d startPt = arcTag->startPnt;
|
||||
startPt.y = -startPt.y;
|
||||
Base::Vector3d endPt = arcTag->endPnt;
|
||||
endPt.y = -endPt.y;
|
||||
|
||||
std::stringstream startName, endName, formatSpec;
|
||||
double scale = dvp->getScale();
|
||||
Base::Vector3d cvPoint = CosmeticVertex::makeCanonicalPoint(dvp, startPt);
|
||||
std::string startVertTag = dvp->addCosmeticVertex(cvPoint);
|
||||
int startVertNumber = dvp->add1CVToGV(startVertTag);
|
||||
startName << "Vertex" << startVertNumber;
|
||||
cvPoint = CosmeticVertex::makeCanonicalPoint(dvp, endPt);
|
||||
std::string endVertTag = dvp->addCosmeticVertex(cvPoint);
|
||||
int endVertNumber = dvp->add1CVToGV(endVertTag);
|
||||
endName << "Vertex" << endVertNumber;
|
||||
|
||||
dim = _createLinDimension(dvp, startName.str(), endName.str(), "Distance");
|
||||
TechDraw::pointPair pp = dim->getLinearPoints();
|
||||
Base::Vector3d mid = (pp.first() + pp.second()) / 2.0;
|
||||
dim->X.setValue(mid.x);
|
||||
dim->Y.setValue(-mid.y);
|
||||
Base::Vector3d radVec1 = startPt - centerPt;
|
||||
Base::Vector3d radVec2 = endPt - centerPt;
|
||||
float alpha = acos((radVec1 * radVec2) / (radVec1.Length() * radVec2.Length()));
|
||||
float arcLength = alpha * radius / scale;
|
||||
dim->Arbitrary.setValue(true);
|
||||
formatSpec << "◠ " << arcLength;
|
||||
dim->FormatSpec.setValue(formatSpec.str());
|
||||
dvp->refreshCEGeoms();
|
||||
dvp->requestPaint();
|
||||
// Find the edge length.
|
||||
TechDraw::BaseGeomPtr edge = dvp->getEdge(ref.getSubName());
|
||||
if (!edge) {
|
||||
return nullptr;
|
||||
}
|
||||
GProp_GProps edgeProps;
|
||||
BRepGProp::LinearProperties(edge->getOCCEdge(), edgeProps);
|
||||
double length = edgeProps.Mass();
|
||||
|
||||
Base::Vector3d startPt = edge->getStartPoint();
|
||||
Base::Vector3d endPt = edge->getEndPoint();
|
||||
startPt.y = -startPt.y;
|
||||
endPt.y = -endPt.y;
|
||||
|
||||
std::stringstream startName, endName, formatSpec;
|
||||
double scale = dvp->getScale();
|
||||
Base::Vector3d cvPoint = CosmeticVertex::makeCanonicalPoint(dvp, startPt);
|
||||
std::string startVertTag = dvp->addCosmeticVertex(cvPoint);
|
||||
int startVertNumber = dvp->add1CVToGV(startVertTag);
|
||||
startName << "Vertex" << startVertNumber;
|
||||
cvPoint = CosmeticVertex::makeCanonicalPoint(dvp, endPt);
|
||||
std::string endVertTag = dvp->addCosmeticVertex(cvPoint);
|
||||
int endVertNumber = dvp->add1CVToGV(endVertTag);
|
||||
endName << "Vertex" << endVertNumber;
|
||||
|
||||
dim = _createLinDimension(dvp, startName.str(), endName.str(), "Distance");
|
||||
TechDraw::pointPair pp = dim->getLinearPoints();
|
||||
Base::Vector3d mid = (pp.first() + pp.second()) / 2.0;
|
||||
dim->X.setValue(mid.x);
|
||||
dim->Y.setValue(-mid.y);
|
||||
|
||||
dim->Arbitrary.setValue(true);
|
||||
formatSpec << "◠ " << length;
|
||||
dim->FormatSpec.setValue(formatSpec.str());
|
||||
|
||||
return dim;
|
||||
}
|
||||
|
||||
@@ -347,7 +347,9 @@ Gui::ToolBarItem* Workbench::setupToolBars() const
|
||||
*extattribs << "TechDraw_ExtensionPosChainDimensionGroup";
|
||||
*extattribs << "TechDraw_ExtensionCascadeDimensionGroup";
|
||||
*extattribs << "TechDraw_ExtensionAreaAnnotation";
|
||||
*extattribs << "TechDraw_ExtensionArcLengthAnnotation";
|
||||
if (separatedTools) {
|
||||
*extattribs << "TechDraw_ExtensionArcLengthAnnotation";
|
||||
}
|
||||
*extattribs << "TechDraw_ExtensionCustomizeFormat";
|
||||
|
||||
Gui::ToolBarItem* extcenter = new Gui::ToolBarItem(root);
|
||||
|
||||
Reference in New Issue
Block a user