OpenGl_Mat4& aModelWorld = aCtx->ModelWorldState.ChangeCurrent();
aStartPnt = aTrsfPersistence->AnchorPoint();
Graphic3d_Vec4 anAnchorPoint = aModelWorld * Graphic3d_Vec4 (aStartPnt.X(), aStartPnt.Y(), aStartPnt.Z(), 1.0);
- aModelWorld.InitIdentity();
+ aModelWorld.SetColumn (3, Graphic3d_Vec4 (Graphic3d_Vec3 (0.0), 1.0));
aTrsfPersistence->SetAnchorPoint (gp_Pnt (anAnchorPoint.x(), anAnchorPoint.y(), anAnchorPoint.z()));
}
applyPersistence (aCtx, aTrsfPersistence, anOldCastShadows, Standard_True);
Prs3d_ArrowAspect::Prs3d_ArrowAspect()
: myArrowAspect (new Graphic3d_AspectLine3d (Quantity_Color(Quantity_NOC_WHITE), Aspect_TOL_SOLID, 1.0)),
myAngle (M_PI / 180.0 * 10.0),
- myLength(1.0)
+ myLength (1.0),
+ myIsZoomable (Standard_True)
{
//
}
//! Returns the current value of the length used when drawing an arrow.
Standard_Real Length() const { return myLength; }
+ //! Turns usage of arrow zoomable on/off
+ void SetZoomable (bool theIsZoomable) { myIsZoomable = theIsZoomable; }
+
+ //! Returns TRUE when the Arrow Zoomable is on.
+ bool Zoomable() const { return myIsZoomable; }
+
void SetColor (const Quantity_Color& theColor) { myArrowAspect->SetColor (theColor); }
const Handle(Graphic3d_AspectLine3d)& Aspect() const { return myArrowAspect; }
Handle(Graphic3d_AspectLine3d) myArrowAspect;
Standard_Real myAngle;
Standard_Real myLength;
+ Standard_Boolean myIsZoomable;
};
aFirstArrowBegin = aFirstAttach;
aSecondArrowBegin = aSecondAttach;
- aFirstArrowEnd = aFirstAttach.Translated (-aFirstArrowVec);
- aSecondArrowEnd = aSecondAttach.Translated (-aSecondArrowVec);
+ aFirstArrowEnd = aFirstAttach;
+ aSecondArrowEnd = aSecondAttach;
+
+ if (aDimensionAspect->ArrowAspect()->Zoomable())
+ {
+ aFirstArrowEnd.Translate (-aFirstArrowVec);
+ aSecondArrowEnd.Translate (-aSecondArrowVec);
+ }
// Group1: stenciling text and the angle dimension arc
thePresentation->NewGroup();
Standard_Real aLength = myDrawer->DimensionAspect()->ArrowAspect()->Length();
Standard_Real anAngle = myDrawer->DimensionAspect()->ArrowAspect()->Angle();
+ Standard_Boolean isZoomable = myDrawer->DimensionAspect()->ArrowAspect()->Zoomable();
if (myDrawer->DimensionAspect()->IsArrows3d())
{
}
else
{
+ gp_Pnt aLocation = isZoomable ? theLocation : gp::Origin();
gp_Pnt aLeftPoint (gp::Origin());
gp_Pnt aRightPoint (gp::Origin());
const gp_Dir& aPlane = GetPlane().Axis().Direction();
- PointsForArrow (theLocation, theDirection, aPlane, aLength, anAngle, aLeftPoint, aRightPoint);
+ PointsForArrow (aLocation, theDirection, aPlane, aLength, anAngle, aLeftPoint, aRightPoint);
Handle(Graphic3d_ArrayOfTriangles) anArrow = new Graphic3d_ArrayOfTriangles(3);
anArrow->AddVertex (aLeftPoint);
- anArrow->AddVertex (theLocation);
+ anArrow->AddVertex (aLocation);
anArrow->AddVertex (aRightPoint);
// Set aspect for arrow triangles
aGroup->SetPrimitivesAspect (aShadingStyle);
aGroup->AddPrimitiveArray (anArrow);
+ if (!isZoomable)
+ {
+ aGroup->SetTransformPersistence (new Graphic3d_TransformPers (Graphic3d_TMF_ZoomPers, theLocation));
+ }
}
SelectionGeometry::Arrow& aSensitiveArrow = mySelectionGeom.NewArrow();
aFirstArrowBegin = aLineBegPoint;
aSecondArrowBegin = aLineEndPoint;
- aFirstArrowEnd = aLineBegPoint.Translated (-gp_Vec (aFirstArrowDir).Scaled (anArrowLength));
- aSecondArrowEnd = aLineEndPoint.Translated (-gp_Vec (aSecondArrowDir).Scaled (anArrowLength));
+ aFirstArrowEnd = aLineBegPoint;
+ aSecondArrowEnd = aLineEndPoint;
+
+ if (aDimensionAspect->ArrowAspect()->Zoomable())
+ {
+ aFirstArrowEnd.Translate (-gp_Vec (aFirstArrowDir).Scaled (anArrowLength));
+ aSecondArrowEnd.Translate (-gp_Vec (aSecondArrowDir).Scaled (anArrowLength));
+ }
- gp_Pnt aCenterLineBegin = isArrowsExternal
+ gp_Pnt aCenterLineBegin = isArrowsExternal
? aLineBegPoint : aFirstArrowEnd;
gp_Pnt aCenterLineEnd = isArrowsExternal || theIsOneSide
if (aLocalParam == "internal") { theAspect->SetArrowOrientation (Prs3d_DAO_Internal); }
if (aLocalParam == "fit") { theAspect->SetArrowOrientation (Prs3d_DAO_Fit); }
}
+ else if (aParam.IsEqual ("-zoomablearrow"))
+ {
+ TCollection_AsciiString aValue (theArgVec[++anIt]);
+ if (!aValue.IsIntegerValue())
+ {
+ Message::SendFail() << "Error: zoomable arrow value should be 0 or 1.";
+ return 1;
+ }
+ theAspect->ArrowAspect()->SetZoomable (Draw::Atoi (aValue.ToCString()) != 0);
+ }
else if (aParam.IsEqual ("-arrowlength") || aParam.IsEqual ("-arlen"))
{
TCollection_AsciiString aValue (theArgVec[++anIt]);
"[-font FontName]\n"
"[-label left|right|hcenter|hfit top|bottom|vcenter|vfit]\n"
"[-arrow external|internal|fit]\n"
+ "[-zoomablearrow 0|1]\n"
"[{-arrowlength|-arlen} RealArrowLength]\n"
"[{-arrowangle|-arangle} ArrowAngle(degrees)]\n"
"[-plane xoy|yoz|zox]\n"
"[-font FontName]\n"
"[-label left|right|hcenter|hfit top|bottom|vcenter|vfit]\n"
"[-arrow external|internal|fit]\n"
+ "[-zoomablearrow 0|1]\n"
"[{-arrowlength|-arlen} RealArrowLength]\n"
"[{-arrowangle|-arangle} ArrowAngle(degrees)]\n"
"[-plane xoy|yoz|zox]\n"
--- /dev/null
+puts "============="
+puts "0027919: Visualization - support multiple transformation persistence groups within single presentation"
+puts "============="
+
+vinit
+vtrihedron t1
+
+vpoint p11 -25 50 0
+vpoint p12 25 50 0
+vdimension dim -length -plane xoy -shapes p11 p12
+vdimparam dim -flyout 1 -arrowlength 30 -arrow internal -label hcenter -zoomablearrow 0
+
+vpoint p21 -100 0 0
+vpoint p22 0 0 0
+vpoint p23 100 0 0
+vdimension angle -angle -shapes p21 p22 p23 -arrowlength 30 -zoomablearrow 0
+
+vtop
+vfit
+vzoom 1.5
+
+if {[vreadpixel 182 119 rgb name] != "BLACK"} { puts "ERROR: the arrow of the dimension should not be zoomable" }
+if {[vreadpixel 149 195 rgb name] != "BLACK"} { puts "ERROR: the arrow of the angle dimension should not be zoomable" }
+
+vdump $imagedir/${casename}.png