AISObjectPtr FeaturesPlugin_Measurement::getAISObject(AISObjectPtr thePrevious)
{
+ AttributeDoubleArrayPtr aValues =
+ std::dynamic_pointer_cast<ModelAPI_AttributeDoubleArray>(attribute(RESULT_VALUES_ID()));
+ if ((aValues->size() == 0) || (aValues->value(0) <= Precision::Confusion()))
+ return AISObjectPtr();
+
AISObjectPtr anAIS;
std::string aKind = string(MEASURE_KIND())->value();
if (aKind == MEASURE_LENGTH())
gp_Pnt aPnt2(aPoint2->impl<gp_Pnt>());
double aLength = aPnt1.Distance(aPnt2);
- gp_Pln aPlane = myScreenPlane->impl<gp_Pln>(); // gce_MP.Value();
- aPlane.SetLocation(aPnt1);
+ if (aLength > 0) {
+ gp_Pln aPlane = myScreenPlane->impl<gp_Pln>(); // gce_MP.Value();
+ aPlane.SetLocation(aPnt1);
+
+ gp_XYZ aNormal = aPlane.Axis().Direction().XYZ();
+ gp_XYZ aVec(aPnt2.X() - aPnt1.X(), aPnt2.Y() - aPnt1.Y(), aPnt2.Z() - aPnt1.Z());
+ double aDot = aNormal.Dot(aVec);
+ if (fabs(aDot - aLength) <= Precision::Confusion()) {
+ aPlane = gp_Pln(aPnt1, aPlane.XAxis().Direction());
+ }
- Handle(AIS_LengthDimension) aDim;
- if (thePrevious.get()) {
- aAISObj = thePrevious;
- Handle(AIS_InteractiveObject) aAIS = aAISObj->impl<Handle(AIS_InteractiveObject)>();
- aDim = Handle(AIS_LengthDimension)::DownCast(aAIS);
- if (aDim.IsNull()) {
+ Handle(AIS_LengthDimension) aDim;
+ if (thePrevious.get()) {
+ aAISObj = thePrevious;
+ Handle(AIS_InteractiveObject) aAIS = aAISObj->impl<Handle(AIS_InteractiveObject)>();
+ aDim = Handle(AIS_LengthDimension)::DownCast(aAIS);
+ if (aDim.IsNull()) {
+ aDim = new AIS_LengthDimension(aTEdge, aPlane);
+ aAISObj = AISObjectPtr(new GeomAPI_AISObject());
+ aAISObj->setImpl(new Handle(AIS_InteractiveObject)(aDim));
+ }
+ else {
+ aDim->SetMeasuredGeometry(aTEdge, aPlane);
+ }
+ }
+ else {
aDim = new AIS_LengthDimension(aTEdge, aPlane);
+ aAISObj = AISObjectPtr(new GeomAPI_AISObject());
aAISObj->setImpl(new Handle(AIS_InteractiveObject)(aDim));
- } else {
- aDim->SetMeasuredGeometry(aTEdge, aPlane);
}
- } else {
- aDim = new AIS_LengthDimension(aTEdge, aPlane);
- aAISObj = AISObjectPtr(new GeomAPI_AISObject());
- aAISObj->setImpl(new Handle(AIS_InteractiveObject)(aDim));
+ aDim->SetFlyout(aLength / 3.);
}
- aDim->SetFlyout(aLength / 3.);
}
return aAISObj;
}
gp_Pnt aPnt1 = aDist.PointOnShape1(1);
gp_Pnt aPnt2 = aDist.PointOnShape2(1);
double aDistance = aDist.Value();
- gp_Pln aPlane = myScreenPlane->impl<gp_Pln>();
- aPlane.SetLocation(aPnt1);
-
- Handle(AIS_LengthDimension) aDim;
- if (thePrevious.get()) {
- aAISObj = thePrevious;
- Handle(AIS_InteractiveObject) aAIS = aAISObj->impl<Handle(AIS_InteractiveObject)>();
- aDim = Handle(AIS_LengthDimension)::DownCast(aAIS);
- if (aDim.IsNull()) {
+ if (aDistance > 0) {
+ gp_Pln aPlane = myScreenPlane->impl<gp_Pln>();
+ aPlane.SetLocation(aPnt1);
+
+ gp_XYZ aNormal = aPlane.Axis().Direction().XYZ();
+ gp_XYZ aVec(aPnt2.X() - aPnt1.X(), aPnt2.Y() - aPnt1.Y(), aPnt2.Z() - aPnt1.Z());
+ double aDot = aNormal.Dot(aVec);
+ if (fabs(aDot - aDistance) <= Precision::Confusion()) {
+ aPlane = gp_Pln(aPnt1, aPlane.XAxis().Direction());
+ }
+
+ Handle(AIS_LengthDimension) aDim;
+ if (thePrevious.get()) {
+ aAISObj = thePrevious;
+ Handle(AIS_InteractiveObject) aAIS = aAISObj->impl<Handle(AIS_InteractiveObject)>();
+ aDim = Handle(AIS_LengthDimension)::DownCast(aAIS);
+ if (aDim.IsNull()) {
+ aDim = new AIS_LengthDimension(aPnt1, aPnt2, aPlane);
+ aAISObj = AISObjectPtr(new GeomAPI_AISObject());
+ aAISObj->setImpl(new Handle(AIS_InteractiveObject)(aDim));
+ }
+ else {
+ aDim->SetMeasuredGeometry(aPnt1, aPnt2, aPlane);
+ aDim->SetFlyout(aDistance / 3.);
+ }
+ }
+ else {
+ aAISObj = AISObjectPtr(new GeomAPI_AISObject());
aDim = new AIS_LengthDimension(aPnt1, aPnt2, aPlane);
aAISObj->setImpl(new Handle(AIS_InteractiveObject)(aDim));
- } else {
- aDim->SetMeasuredGeometry(aPnt1, aPnt2, aPlane);
- aDim->SetFlyout(aDistance / 3.);
}
- } else {
- aAISObj = AISObjectPtr(new GeomAPI_AISObject());
- aDim = new AIS_LengthDimension(aPnt1, aPnt2, aPlane);
- aAISObj->setImpl(new Handle(AIS_InteractiveObject)(aDim));
+ aDim->SetFlyout(aDistance / 3.);
}
- aDim->SetFlyout(aDistance / 3.);
}
}
}
Handle(AIS_RadiusDimension) aDim = Handle(AIS_RadiusDimension)::DownCast(aAIS);
if (aDim.IsNull()) {
aDim = new AIS_RadiusDimension(aShp);
+ aAISObj = AISObjectPtr(new GeomAPI_AISObject());
aAISObj->setImpl(new Handle(AIS_InteractiveObject)(aDim));
} else
aDim->SetMeasuredGeometry(aShp);
if (anEdge1.get() && anEdge2.get()) {
TopoDS_Edge aTEdge1 = TopoDS::Edge(anEdge1->impl<TopoDS_Shape>());
TopoDS_Edge aTEdge2 = TopoDS::Edge(anEdge2->impl<TopoDS_Shape>());
+
Handle(AIS_AngleDimension) aDim;
if (thePrevious.get()) {
aAISObj = thePrevious;
aDim = Handle(AIS_AngleDimension)::DownCast(aAIS);
if (aDim.IsNull()) {
aDim = new AIS_AngleDimension(aTEdge1, aTEdge2);
+ aAISObj = AISObjectPtr(new GeomAPI_AISObject());
aAISObj->setImpl(new Handle(AIS_InteractiveObject)(aDim));
} else
aDim->SetMeasuredGeometry(aTEdge1, aTEdge2);
gp_Pnt aPnt2(aPoint2->impl<gp_Pnt>());
gp_Pnt aPnt3(aPoint3->impl<gp_Pnt>());
+ if (aPnt1.IsEqual(aPnt2, Precision::Confusion()) ||
+ aPnt1.IsEqual(aPnt3, Precision::Confusion()) ||
+ aPnt2.IsEqual(aPnt3, Precision::Confusion()))
+ return thePrevious;
+
if (thePrevious.get()) {
aAISObj = thePrevious;
Handle(AIS_InteractiveObject) aAIS = aAISObj->impl<Handle(AIS_InteractiveObject)>();
Handle(AIS_AngleDimension) aDim = Handle(AIS_AngleDimension)::DownCast(aAIS);
if (aDim.IsNull()) {
aDim = new AIS_AngleDimension(aPnt1, aPnt2, aPnt3);
+ aAISObj = AISObjectPtr(new GeomAPI_AISObject());
aAISObj->setImpl(new Handle(AIS_InteractiveObject)(aDim));
} else
aDim->SetMeasuredGeometry(aPnt1, aPnt2, aPnt3);
Handle(AIS_Dimension) aDim = Handle(AIS_Dimension)::DownCast(aAIS);
int aSize = Config_PropManager::integer("Visualization", "dimension_arrow_size");
int aTextSize = Config_PropManager::integer("Visualization", "dimension_value_size");
+ std::string aFont = Config_PropManager::string("Visualization", "dimension_font");
Handle(Prs3d_DimensionAspect) anAspect = aDim->DimensionAspect();
anAspect->MakeArrows3d(false);
anAspect->MakeTextShaded(false);
anAspect->MakeUnitsDisplayed(false);
anAspect->MakeUnitsDisplayed(false);
- anAspect->TextAspect()->SetFont(Config_PropManager::string("Visualization",
- "dimension_font").c_str());
- anAspect->TextAspect()->SetHeight(aTextSize / mySceenScale);
+ anAspect->TextAspect()->SetFont(aFont.c_str());
+ anAspect->TextAspect()->SetHeight(aTextSize);
anAspect->ArrowAspect()->SetLength(aSize / mySceenScale);
anAspect->SetExtensionSize((aTextSize / mySceenScale + aSize) / 2.0);
aDim->SetDimensionAspect(anAspect);