1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-08-19 13:40:49 +03:00

Compare commits

..

1 Commits

Author SHA1 Message Date
abv
baa6e38e70 0027871: Possible memory leak in viewers in virtual windows mode
Command checktrend is modified to avoid performing check for lists containing less than 5 items, as estimations based on short lists often lead to false positives.
2019-03-03 08:14:43 +03:00
269 changed files with 5233 additions and 6632 deletions

View File

@@ -1679,43 +1679,6 @@ Some public methods of the class BRepFilletAPI_MakeChamfer are released from exc
- method Add for symmetric chamfer now takes only 2 arguments: distance and edge;
- method GetDistAngle now takes only 3 arguments: index of contour, distance and angle.
@subsection upgrade_740_aspects Aspects unification
Fill Area, Line and Marker aspects (classes *Graphic3d_AspectFillArea3d*, *Graphic3d_AspectLine3d*, *Graphic3d_AspectMarker3d* and *Graphic3d_AspectText3d*)
have been merged into new class *Graphic3d_Aspects* providing a single state for rendering primitives of any type.
The old per-primitive type aspect classes have been preserved as sub-classes of *Graphic3d_Aspects* with default values close to the previous behavior.
All aspects except Graphic3d_AspectFillArea3d define Graphic3d_TOSM_UNLIT shading model.
The previous approach with dedicated aspects per primitive type was handy in simplified case, but lead to confusion otherwise.
In fact, drawing points or lines with lighting applied is a valid use case, but only *Graphic3d_AspectFillArea3d* previously defined necessary material properties.
As aspects for different primitive types have been merged, Graphic3d_Group does no more provide per-type aspect properties.
Existing code relying on old behavior and putting interleaved per-type aspects into single Graphic3d_Group should be updated.
For example, the following pseudo-code will not work anymore, because all *SetGroupPrimitivesAspect* calls will setup the same property:
~~~~
Handle(Graphic3d_Group) aGroup = thePrs->NewGroup();
aGroup->SetGroupPrimitivesAspect (myDrawer->ShadingAspect()->Aspect());
aGroup->SetGroupPrimitivesAspect (myDrawer->LineAspect()->Aspect()); //!< overrides previous aspect
Handle(Graphic3d_ArrayOfSegments) aLines = new Graphic3d_ArrayOfSegments (2);
Handle(Graphic3d_ArrayOfTriangles) aTris = new Graphic3d_ArrayOfTriangles (3);
aGroup->AddPrimitiveArray (aLines); //!< both arrays will use the same aspect
aGroup->AddPrimitiveArray (aTris);
~~~~
To solve the problem, the code should be modified to either put primitives into dedicated groups (preferred approach), or using *SetPrimitivesAspect* in proper order:
~~~~
Handle(Graphic3d_Group) aGroup = thePrs->NewGroup();
aGroup->SetGroupPrimitivesAspect (myDrawer->ShadingAspect()->Aspect());
Handle(Graphic3d_ArrayOfTriangles) aTris = new Graphic3d_ArrayOfTriangles (3);
aGroup->AddPrimitiveArray (aTris);
Handle(Graphic3d_ArrayOfSegments) aLines = new Graphic3d_ArrayOfSegments (2);
aGroup->SetPrimitivesAspect (myDrawer->LineAspect()->Aspect()); //!< next array will use the new aspect
aGroup->AddPrimitiveArray (aLines);
~~~~
@subsection upgrade_740_interiorstyles Interior styles
* *Aspect_IS_HOLLOW* is now an alias to *Aspect_IS_EMPTY* and does not implicitly enables drawing mesh edges anymore.

View File

@@ -23,7 +23,7 @@ WARNINGS = NO
ENABLE_PREPROCESSING = YES
MACRO_EXPANSION = YES
EXPAND_ONLY_PREDEF = YES
PREDEFINED = Standard_EXPORT Standard_NODISCARD Standard_OVERRIDE:=override __Standard_API __Draw_API Handle(a):=Handle<a> DEFINE_STANDARD_ALLOC DEFINE_NCOLLECTION_ALLOC
PREDEFINED = Standard_EXPORT Standard_OVERRIDE:=override __Standard_API __Draw_API Handle(a):=Handle<a> DEFINE_STANDARD_ALLOC DEFINE_NCOLLECTION_ALLOC
GENERATE_HTML = YES
GENERATE_LATEX = NO
SEARCH_INCLUDES = YES

View File

@@ -277,6 +277,7 @@ blend result _model 2 _model_161
pload VISUALIZATION
vinit Driver1/Viewer1/View1
vsetcolorbg 200 200 255
vdisplay -dispMode 1 result
vdisplay result
vfit
vaspects result -setFaceBoundaryDraw 1 -mostContinuity c2
vsetdispmode 1
vshowfaceboundary result 1

View File

@@ -263,6 +263,7 @@ unifysamedom result p_1
pload VISUALIZATION
vinit Driver1/Viewer1/View1
vsetcolorbg 200 200 255
vdisplay -dispMode 1 result
vdisplay result
vfit
vaspects result -setFaceBoundaryDraw 1
vsetdispmode 1
vshowfaceboundary result 1

View File

@@ -57,7 +57,9 @@ bcommon res b9 c2
# show result
donly res
trotate res 0 0 0 0 0 1 90
vinit View1
vdisplay -dispMode 1 res
vaspects res -setFaceBoundaryDraw 1 -setFaceBoundaryColor WHITE -isoontriangulation 1
vinit
vdisplay res
vsetdispmode 1
vshowfaceboundary res 1 255 255 255
vaspects -isoontriangulation 1
vfit

View File

@@ -236,18 +236,17 @@ void AIS_CameraFrustum::Compute (const Handle(PrsMgr_PresentationManager3d)& ,
return;
}
Handle(Graphic3d_Group) aGroup = thePrs->NewGroup();
switch (theMode)
{
case AIS_Shaded:
{
Handle(Graphic3d_Group) aGroup = thePrs->NewGroup();
aGroup->SetGroupPrimitivesAspect (myDrawer->ShadingAspect()->Aspect());
aGroup->AddPrimitiveArray (myTriangles);
}
Standard_FALLTHROUGH
case AIS_WireFrame:
{
Handle(Graphic3d_Group) aGroup = thePrs->NewGroup();
aGroup->SetGroupPrimitivesAspect (myDrawer->LineAspect()->Aspect());
aGroup->AddPrimitiveArray (myBorders);
break;

View File

@@ -232,6 +232,11 @@ void AIS_ColoredShape::SetCustomWidth (const TopoDS_Shape& theShape,
void AIS_ColoredShape::SetColor (const Quantity_Color& theColor)
{
setColor (myDrawer, theColor);
myDrawer->SetColor (theColor);
hasOwnColor = Standard_True;
LoadRecomputable (AIS_WireFrame);
LoadRecomputable (AIS_Shaded);
for (AIS_DataMapOfShapeDrawer::Iterator anIter (myShapeColors); anIter.More(); anIter.Next())
{
const Handle(AIS_ColoredDrawer)& aDrawer = anIter.Value();
@@ -257,7 +262,6 @@ void AIS_ColoredShape::SetColor (const Quantity_Color& theColor)
aDrawer->FaceBoundaryAspect()->SetColor (theColor);
}
}
AIS_Shape::SetColor (theColor);
}
//=======================================================================
@@ -267,6 +271,10 @@ void AIS_ColoredShape::SetColor (const Quantity_Color& theColor)
void AIS_ColoredShape::SetWidth (const Standard_Real theLineWidth)
{
setWidth (myDrawer, theLineWidth);
myOwnWidth = theLineWidth;
LoadRecomputable (AIS_WireFrame);
LoadRecomputable (AIS_Shaded);
for (AIS_DataMapOfShapeDrawer::Iterator anIter (myShapeColors); anIter.More(); anIter.Next())
{
const Handle(AIS_ColoredDrawer)& aDrawer = anIter.Value();
@@ -288,16 +296,6 @@ void AIS_ColoredShape::SetWidth (const Standard_Real theLineWidth)
aDrawer->FaceBoundaryAspect()->SetWidth (theLineWidth);
}
}
AIS_Shape::SetWidth (theLineWidth);
}
//=======================================================================
//function : UnsetWidth
//purpose :
//=======================================================================
void AIS_ColoredShape::UnsetWidth()
{
SetWidth (1.0f);
}
//=======================================================================
@@ -307,6 +305,10 @@ void AIS_ColoredShape::UnsetWidth()
void AIS_ColoredShape::SetTransparency (const Standard_Real theValue)
{
setTransparency (myDrawer, theValue);
myDrawer->SetTransparency ((Standard_ShortReal )theValue);
LoadRecomputable (AIS_WireFrame);
LoadRecomputable (AIS_Shaded);
for (AIS_DataMapOfShapeDrawer::Iterator anIter (myShapeColors); anIter.More(); anIter.Next())
{
const Handle(AIS_ColoredDrawer)& aDrawer = anIter.Value();
@@ -320,7 +322,6 @@ void AIS_ColoredShape::SetTransparency (const Standard_Real theValue)
aDrawer->ShadingAspect()->SetTransparency (theValue, myCurrentFacingModel);
}
}
AIS_Shape::SetTransparency (theValue);
}
//=======================================================================
@@ -329,7 +330,27 @@ void AIS_ColoredShape::SetTransparency (const Standard_Real theValue)
//=======================================================================
void AIS_ColoredShape::UnsetTransparency()
{
SetTransparency (0.0f);
myDrawer->SetTransparency (0.0f);
if (myDrawer->HasOwnShadingAspect())
{
myDrawer->ShadingAspect()->SetTransparency (0.0, myCurrentFacingModel);
if (!HasColor()
&& !HasMaterial()
&& !myDrawer->ShadingAspect()->Aspect()->ToMapTexture())
{
myDrawer->SetShadingAspect (Handle(Prs3d_ShadingAspect)());
}
}
for (AIS_DataMapOfShapeDrawer::Iterator anIter (myShapeColors); anIter.More(); anIter.Next())
{
const Handle(Prs3d_Drawer)& aDrawer = anIter.Value();
if (aDrawer->HasOwnShadingAspect())
{
aDrawer->ShadingAspect()->SetTransparency (0.0, myCurrentFacingModel);
}
}
SynchronizeAspects();
}
//=======================================================================
@@ -339,6 +360,10 @@ void AIS_ColoredShape::UnsetTransparency()
void AIS_ColoredShape::SetMaterial (const Graphic3d_MaterialAspect& theMaterial)
{
setMaterial (myDrawer, theMaterial, HasColor(), IsTransparent());
//myOwnMaterial = theMaterial;
hasOwnMaterial = Standard_True;
LoadRecomputable (AIS_Shaded);
for (AIS_DataMapOfShapeDrawer::Iterator anIter (myShapeColors); anIter.More(); anIter.Next())
{
const Handle(AIS_ColoredDrawer)& aDrawer = anIter.Value();
@@ -348,7 +373,6 @@ void AIS_ColoredShape::SetMaterial (const Graphic3d_MaterialAspect& theMaterial)
setMaterial (aDrawer, theMaterial, aDrawer->HasOwnColor(), aDrawer->HasOwnTransparency());
}
}
AIS_Shape::SetMaterial (theMaterial);
}
//=======================================================================
@@ -586,7 +610,7 @@ void AIS_ColoredShape::addShapesWithCustomProps (const Handle(Prs3d_Presentation
const DataMapOfDrawerCompd& theDrawerClosedFaces,
const Standard_Integer theMode)
{
Handle(Graphic3d_Group) anOpenGroup, aClosedGroup, anEdgesGroup;
Handle(Graphic3d_Group) anOpenGroup, aClosedGroup;
for (size_t aShType = 0; aShType <= (size_t )TopAbs_SHAPE; ++aShType)
{
const Standard_Boolean isClosed = aShType == TopAbs_SHAPE;
@@ -640,7 +664,7 @@ void AIS_ColoredShape::addShapesWithCustomProps (const Handle(Prs3d_Presentation
{
if (aShadedGroup.IsNull())
{
aShadedGroup = thePrs->NewGroup();
aShadedGroup = Prs3d_Root::NewGroup (thePrs);
aShadedGroup->SetClosed (isClosed);
}
aShadedGroup->SetPrimitivesAspect (aDrawer->ShadingAspect()->Aspect());
@@ -649,15 +673,18 @@ void AIS_ColoredShape::addShapesWithCustomProps (const Handle(Prs3d_Presentation
if (aDrawer->FaceBoundaryDraw())
{
if (Handle(Graphic3d_ArrayOfSegments) aBndSegments = StdPrs_ShadedShape::FillFaceBoundaries (aShapeDraw, aDrawer->FaceBoundaryUpperContinuity()))
Handle(Graphic3d_ArrayOfSegments) aBndSegments = StdPrs_ShadedShape::FillFaceBoundaries (aShapeDraw);
if (!aBndSegments.IsNull())
{
if (anEdgesGroup.IsNull())
if (aShadedGroup.IsNull())
{
anEdgesGroup = thePrs->NewGroup();
aShadedGroup = Prs3d_Root::NewGroup (thePrs);
aShadedGroup->SetClosed (isClosed);
}
anEdgesGroup->SetPrimitivesAspect (aDrawer->FaceBoundaryAspect()->Aspect());
anEdgesGroup->AddPrimitiveArray (aBndSegments);
Handle(Graphic3d_AspectLine3d) aBoundaryAspect = aDrawer->FaceBoundaryAspect()->Aspect();
aShadedGroup->SetPrimitivesAspect (aBoundaryAspect);
aShadedGroup->AddPrimitiveArray (aBndSegments);
}
}
}

View File

@@ -81,16 +81,11 @@ public: //! @name global aspects
//! Sets transparency value.
Standard_EXPORT virtual void SetTransparency (const Standard_Real theValue) Standard_OVERRIDE;
//! Sets the material aspect.
Standard_EXPORT virtual void SetMaterial (const Graphic3d_MaterialAspect& theAspect) Standard_OVERRIDE;
public:
//! Removes the setting for transparency in the reconstructed compound shape.
Standard_EXPORT virtual void UnsetTransparency() Standard_OVERRIDE;
//! Setup line width of entire shape.
Standard_EXPORT virtual void UnsetWidth() Standard_OVERRIDE;
//! Sets the material aspect.
Standard_EXPORT virtual void SetMaterial (const Graphic3d_MaterialAspect& theAspect) Standard_OVERRIDE;
protected: //! @name override presentation computation

View File

@@ -431,7 +431,6 @@ void AIS_Dimension::drawText (const Handle(Prs3d_Presentation)& thePresentation,
const TCollection_ExtendedString& theText,
const Standard_Integer theLabelPosition)
{
Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup();
if (myDrawer->DimensionAspect()->IsText3d())
{
// getting font parameters
@@ -518,7 +517,7 @@ void AIS_Dimension::drawText (const Handle(Prs3d_Presentation)& thePresentation,
aCenterOfLabel.Transform (aTextPlaneTrsf);
gp_Ax2 aFlippingAxes (aCenterOfLabel, GetPlane().Axis().Direction(), aTextDir);
aGroup->SetFlippingOptions (Standard_True, aFlippingAxes);
Prs3d_Root::CurrentGroup (thePresentation)->SetFlippingOptions (Standard_True, aFlippingAxes);
// draw text
if (myDrawer->DimensionAspect()->IsTextShaded())
@@ -547,14 +546,11 @@ void AIS_Dimension::drawText (const Handle(Prs3d_Presentation)& thePresentation,
{
myDrawer->SetFreeBoundaryAspect (new Prs3d_LineAspect (aColor, Aspect_TOL_SOLID, 1.0));
}
myDrawer->FreeBoundaryAspect()->Aspect()->SetColor (aColor);
// drawing text
if (Handle(Graphic3d_ArrayOfPrimitives) anEdges = StdPrs_WFShape::AddAllEdges (aTextShape, myDrawer))
{
aGroup->SetGroupPrimitivesAspect (myDrawer->FreeBoundaryAspect()->Aspect());
aGroup->AddPrimitiveArray (anEdges);
}
StdPrs_WFShape::Add (thePresentation, aTextShape, myDrawer);
}
Prs3d_Root::CurrentGroup (thePresentation)->SetFlippingOptions (Standard_False, gp_Ax2());
@@ -569,7 +565,7 @@ void AIS_Dimension::drawText (const Handle(Prs3d_Presentation)& thePresentation,
// generate primitives for 2D text
myDrawer->DimensionAspect()->TextAspect()->Aspect()->SetDisplayType (Aspect_TODT_DIMENSION);
Prs3d_Text::Draw (aGroup,
Prs3d_Text::Draw (Prs3d_Root::CurrentGroup (thePresentation),
myDrawer->DimensionAspect()->TextAspect(),
theText,
theTextPos);
@@ -603,7 +599,6 @@ void AIS_Dimension::DrawExtension (const Handle(Prs3d_Presentation)& thePresenta
gp_Pnt aTextPos = ElCLib::Value (theExtensionSize, anExtensionLine);
gp_Dir aTextDir = theExtensionDir;
Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup();
drawText (thePresentation,
aTextPos,
aTextDir,
@@ -635,17 +630,16 @@ void AIS_Dimension::DrawExtension (const Handle(Prs3d_Presentation)& thePresenta
aSensitiveCurve.Append (anExtStart);
aSensitiveCurve.Append (anExtEnd);
Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup();
if (!myDrawer->DimensionAspect()->IsText3d() && theMode == ComputeMode_All)
{
aGroup->SetStencilTestOptions (Standard_True);
Prs3d_Root::CurrentGroup (thePresentation)->SetStencilTestOptions (Standard_True);
}
Handle(Graphic3d_AspectLine3d) aDimensionLineStyle = myDrawer->DimensionAspect()->LineAspect()->Aspect();
aGroup->SetPrimitivesAspect (aDimensionLineStyle);
aGroup->AddPrimitiveArray (anExtPrimitive);
Prs3d_Root::CurrentGroup (thePresentation)->SetPrimitivesAspect (aDimensionLineStyle);
Prs3d_Root::CurrentGroup (thePresentation)->AddPrimitiveArray (anExtPrimitive);
if (!myDrawer->DimensionAspect()->IsText3d() && theMode == ComputeMode_All)
{
aGroup->SetStencilTestOptions (Standard_False);
Prs3d_Root::CurrentGroup (thePresentation)->SetStencilTestOptions (Standard_False);
}
}
@@ -739,6 +733,8 @@ void AIS_Dimension::DrawLinearDimension (const Handle(Prs3d_Presentation)& thePr
case LabelPosition_HCenter:
{
// add label on dimension or extension line to presentation
Prs3d_Root::NewGroup (thePresentation);
gp_Pnt aTextPos = IsTextPositionCustom() ? myFixedTextPosition
: (aCenterLineBegin.XYZ() + aCenterLineEnd.XYZ()) * 0.5;
gp_Dir aTextDir = aDimensionLine.Direction();
@@ -746,7 +742,6 @@ void AIS_Dimension::DrawLinearDimension (const Handle(Prs3d_Presentation)& thePr
// add text primitives
if (theMode == ComputeMode_All || theMode == ComputeMode_Text)
{
thePresentation->NewGroup();
drawText (thePresentation,
aTextPos,
aTextDir,
@@ -804,28 +799,24 @@ void AIS_Dimension::DrawLinearDimension (const Handle(Prs3d_Presentation)& thePr
aDimensionAspect->TextAspect()->SetVerticalJustification (aTextJustificaton);
// main dimension line, short extension
if (!aDimensionAspect->IsText3d() && theMode == ComputeMode_All)
{
Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup();
if (!aDimensionAspect->IsText3d() && theMode == ComputeMode_All)
{
aGroup->SetStencilTestOptions (Standard_True);
}
aGroup->SetPrimitivesAspect (aDimensionAspect->LineAspect()->Aspect());
aGroup->AddPrimitiveArray (aPrimSegments);
if (!aDimensionAspect->IsText3d() && theMode == ComputeMode_All)
{
aGroup->SetStencilTestOptions (Standard_False);
}
Prs3d_Root::CurrentGroup (thePresentation)->SetStencilTestOptions (Standard_True);
}
Prs3d_Root::CurrentGroup (thePresentation)->SetPrimitivesAspect (aDimensionAspect->LineAspect()->Aspect());
Prs3d_Root::CurrentGroup (thePresentation)->AddPrimitiveArray (aPrimSegments);
if (!aDimensionAspect->IsText3d() && theMode == ComputeMode_All)
{
Prs3d_Root::CurrentGroup (thePresentation)->SetStencilTestOptions (Standard_False);
}
// add arrows to presentation
Prs3d_Root::NewGroup (thePresentation);
DrawArrow (thePresentation, aFirstArrowBegin, aFirstArrowDir);
if (!theIsOneSide)
{
Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup();
DrawArrow (thePresentation, aFirstArrowBegin, aFirstArrowDir);
if (!theIsOneSide)
{
DrawArrow (thePresentation, aSecondArrowBegin, aSecondArrowDir);
}
DrawArrow (thePresentation, aSecondArrowBegin, aSecondArrowDir);
}
if (!isArrowsExternal)
@@ -834,18 +825,19 @@ void AIS_Dimension::DrawLinearDimension (const Handle(Prs3d_Presentation)& thePr
}
// add arrow extension lines to presentation
Prs3d_Root::NewGroup (thePresentation);
DrawExtension (thePresentation, aDimensionAspect->ArrowTailSize(),
aFirstArrowEnd, aFirstExtensionDir,
THE_EMPTY_LABEL, 0.0, theMode, LabelPosition_None);
if (!theIsOneSide)
{
DrawExtension (thePresentation, aDimensionAspect->ArrowTailSize(),
aFirstArrowEnd, aFirstExtensionDir,
aSecondArrowEnd, aSecondExtensionDir,
THE_EMPTY_LABEL, 0.0, theMode, LabelPosition_None);
if (!theIsOneSide)
{
DrawExtension (thePresentation, aDimensionAspect->ArrowTailSize(),
aSecondArrowEnd, aSecondExtensionDir,
THE_EMPTY_LABEL, 0.0, theMode, LabelPosition_None);
}
}
}
break;
}
// ------------------------------------------------------------------------ //
@@ -855,48 +847,45 @@ void AIS_Dimension::DrawLinearDimension (const Handle(Prs3d_Presentation)& thePr
case LabelPosition_Left:
{
// add label on dimension or extension line to presentation
{
// Left extension with the text
DrawExtension (thePresentation, anExtensionSize,
isArrowsExternal
? aFirstArrowEnd
: aFirstArrowBegin,
aFirstExtensionDir,
aLabelString,
aLabelWidth,
theMode,
aLabelPosition);
}
Prs3d_Root::NewGroup (thePresentation);
// Left extension with the text
DrawExtension (thePresentation, anExtensionSize,
isArrowsExternal
? aFirstArrowEnd
: aFirstArrowBegin,
aFirstExtensionDir,
aLabelString,
aLabelWidth,
theMode,
aLabelPosition);
// add dimension line primitives
if (theMode == ComputeMode_All || theMode == ComputeMode_Line)
{
// add central dimension line
{
Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup();
Prs3d_Root::NewGroup (thePresentation);
// add graphical primitives
Handle(Graphic3d_ArrayOfSegments) aPrimSegments = new Graphic3d_ArrayOfSegments (2);
aPrimSegments->AddVertex (aCenterLineBegin);
aPrimSegments->AddVertex (aCenterLineEnd);
// add graphical primitives
Handle(Graphic3d_ArrayOfSegments) aPrimSegments = new Graphic3d_ArrayOfSegments (2);
aPrimSegments->AddVertex (aCenterLineBegin);
aPrimSegments->AddVertex (aCenterLineEnd);
aGroup->SetPrimitivesAspect (aDimensionAspect->LineAspect()->Aspect());
aGroup->AddPrimitiveArray (aPrimSegments);
Prs3d_Root::CurrentGroup (thePresentation)->SetPrimitivesAspect (aDimensionAspect->LineAspect()->Aspect());
Prs3d_Root::CurrentGroup (thePresentation)->AddPrimitiveArray (aPrimSegments);
// add selection primitives
SelectionGeometry::Curve& aSensitiveCurve = mySelectionGeom.NewCurve();
aSensitiveCurve.Append (aCenterLineBegin);
aSensitiveCurve.Append (aCenterLineEnd);
}
// add selection primitives
SelectionGeometry::Curve& aSensitiveCurve = mySelectionGeom.NewCurve();
aSensitiveCurve.Append (aCenterLineBegin);
aSensitiveCurve.Append (aCenterLineEnd);
// add arrows to presentation
Prs3d_Root::NewGroup (thePresentation);
DrawArrow (thePresentation, aFirstArrowBegin, aFirstArrowDir);
if (!theIsOneSide)
{
Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup();
DrawArrow (thePresentation, aFirstArrowBegin, aFirstArrowDir);
if (!theIsOneSide)
{
DrawArrow (thePresentation, aSecondArrowBegin, aSecondArrowDir);
}
DrawArrow (thePresentation, aSecondArrowBegin, aSecondArrowDir);
}
if (!isArrowsExternal || theIsOneSide)
@@ -905,11 +894,11 @@ void AIS_Dimension::DrawLinearDimension (const Handle(Prs3d_Presentation)& thePr
}
// add extension lines for external arrows
{
DrawExtension (thePresentation, aDimensionAspect->ArrowTailSize(),
aSecondArrowEnd, aSecondExtensionDir,
THE_EMPTY_LABEL, 0.0, theMode, LabelPosition_None);
}
Prs3d_Root::NewGroup (thePresentation);
DrawExtension (thePresentation, aDimensionAspect->ArrowTailSize(),
aSecondArrowEnd, aSecondExtensionDir,
THE_EMPTY_LABEL, 0.0, theMode, LabelPosition_None);
}
break;
@@ -921,6 +910,7 @@ void AIS_Dimension::DrawLinearDimension (const Handle(Prs3d_Presentation)& thePr
case LabelPosition_Right:
{
// add label on dimension or extension line to presentation
Prs3d_Root::NewGroup (thePresentation);
// Right extension with text
DrawExtension (thePresentation, anExtensionSize,
@@ -935,30 +925,27 @@ void AIS_Dimension::DrawLinearDimension (const Handle(Prs3d_Presentation)& thePr
if (theMode == ComputeMode_All || theMode == ComputeMode_Line)
{
// add central dimension line
{
Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup();
Prs3d_Root::NewGroup (thePresentation);
// add graphical primitives
Handle(Graphic3d_ArrayOfSegments) aPrimSegments = new Graphic3d_ArrayOfSegments (2);
aPrimSegments->AddVertex (aCenterLineBegin);
aPrimSegments->AddVertex (aCenterLineEnd);
aGroup->SetGroupPrimitivesAspect (aDimensionAspect->LineAspect()->Aspect());
aGroup->AddPrimitiveArray (aPrimSegments);
// add graphical primitives
Handle(Graphic3d_ArrayOfSegments) aPrimSegments = new Graphic3d_ArrayOfSegments (2);
aPrimSegments->AddVertex (aCenterLineBegin);
aPrimSegments->AddVertex (aCenterLineEnd);
Prs3d_Root::CurrentGroup (thePresentation)->SetPrimitivesAspect (aDimensionAspect->LineAspect()->Aspect());
Prs3d_Root::CurrentGroup (thePresentation)->AddPrimitiveArray (aPrimSegments);
// add selection primitives
SelectionGeometry::Curve& aSensitiveCurve = mySelectionGeom.NewCurve();
aSensitiveCurve.Append (aCenterLineBegin);
aSensitiveCurve.Append (aCenterLineEnd);
}
// add selection primitives
SelectionGeometry::Curve& aSensitiveCurve = mySelectionGeom.NewCurve();
aSensitiveCurve.Append (aCenterLineBegin);
aSensitiveCurve.Append (aCenterLineEnd);
// add arrows to presentation
Prs3d_Root::NewGroup (thePresentation);
DrawArrow (thePresentation, aSecondArrowBegin, aSecondArrowDir);
if (!theIsOneSide)
{
thePresentation->NewGroup();
DrawArrow (thePresentation, aSecondArrowBegin, aSecondArrowDir);
if (!theIsOneSide)
{
DrawArrow (thePresentation, aFirstArrowBegin, aFirstArrowDir);
}
DrawArrow (thePresentation, aFirstArrowBegin, aFirstArrowDir);
}
if (!isArrowsExternal || theIsOneSide)
@@ -967,11 +954,11 @@ void AIS_Dimension::DrawLinearDimension (const Handle(Prs3d_Presentation)& thePr
}
// add extension lines for external arrows
{
DrawExtension (thePresentation, aDimensionAspect->ArrowTailSize(),
aFirstArrowEnd, aFirstExtensionDir,
THE_EMPTY_LABEL, 0.0, theMode, LabelPosition_None);
}
Prs3d_Root::NewGroup (thePresentation);
DrawExtension (thePresentation, aDimensionAspect->ArrowTailSize(),
aFirstArrowEnd, aFirstExtensionDir,
THE_EMPTY_LABEL, 0.0, theMode, LabelPosition_None);
}
break;
@@ -981,7 +968,7 @@ void AIS_Dimension::DrawLinearDimension (const Handle(Prs3d_Presentation)& thePr
// add flyout lines to presentation
if (theMode == ComputeMode_All)
{
Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup();
Prs3d_Root::NewGroup (thePresentation);
Handle(Graphic3d_ArrayOfSegments) aPrimSegments = new Graphic3d_ArrayOfSegments(4);
aPrimSegments->AddVertex (theFirstPoint);
@@ -990,8 +977,8 @@ void AIS_Dimension::DrawLinearDimension (const Handle(Prs3d_Presentation)& thePr
aPrimSegments->AddVertex (theSecondPoint);
aPrimSegments->AddVertex (aLineEndPoint);
aGroup->SetGroupPrimitivesAspect (aDimensionAspect->LineAspect()->Aspect());
aGroup->AddPrimitiveArray (aPrimSegments);
Prs3d_Root::CurrentGroup (thePresentation)->SetPrimitivesAspect (aDimensionAspect->LineAspect()->Aspect());
Prs3d_Root::CurrentGroup (thePresentation)->AddPrimitiveArray (aPrimSegments);
}
mySelectionGeom.IsComputed = Standard_True;

View File

@@ -198,21 +198,6 @@ public: //! @name highlighting management
const Handle(Prs3d_Drawer)& HighlightStyle (const Prs3d_TypeOfHighlight theStyleType) const { return myStyles[theStyleType]; }
//! Setup highlight style settings.
//! It is preferred modifying existing style returned by method HighlightStyle()
//! instead of creating a new drawer.
//!
//! If a new highlight style is created, its presentation Zlayer should be checked,
//! otherwise highlighting might not work as expected.
//! Default values are:
//! - Prs3d_TypeOfHighlight_Dynamic: Graphic3d_ZLayerId_Top,
//! object highlighting is drawn on top of main scene within Immediate Layers,
//! so that V3d_View::RedrawImmediate() will be enough to see update;
//! - Prs3d_TypeOfHighlight_LocalDynamic: Graphic3d_ZLayerId_Topmost,
//! object parts highlighting is drawn on top of main scene within Immediate Layers
//! with depth cleared (even overlapped geometry will be revealed);
//! - Prs3d_TypeOfHighlight_Selected: Graphic3d_ZLayerId_UNKNOWN,
//! object highlighting is drawn on top of main scene within the same layer
//! as object itself (e.g. Graphic3d_ZLayerId_Default by default) and increased priority.
void SetHighlightStyle (const Prs3d_TypeOfHighlight theStyleType,
const Handle(Prs3d_Drawer)& theStyle) { myStyles[theStyleType] = theStyle; }
@@ -227,14 +212,6 @@ public: //! @name highlighting management
}
//! Setup the style of dynamic highlighting.
//! It is preferred modifying existing style returned by method HighlightStyle()
//! instead of creating a new drawer.
//!
//! If a new highlight style is created, its presentation Zlayer should be checked,
//! otherwise highlighting might not work as expected.
//! Default value is Graphic3d_ZLayerId_Top,
//! object highlighting is drawn on top of main scene within Immediate Layers,
//! so that V3d_View::RedrawImmediate() will be enough to see update;
void SetHighlightStyle (const Handle(Prs3d_Drawer)& theStyle) { myStyles[Prs3d_TypeOfHighlight_Dynamic] = theStyle; }
//! Returns current selection style settings.
@@ -1285,10 +1262,6 @@ protected: //! @name internal methods
return myStyles[!theOwner.IsNull() && theOwner->ComesFromDecomposition() ? Prs3d_TypeOfHighlight_LocalDynamic : Prs3d_TypeOfHighlight_Dynamic];
}
//! Return TRUE if highlight style of owner requires full viewer redraw.
Standard_EXPORT Standard_Boolean isSlowHiStyle (const Handle(SelectMgr_EntityOwner)& theOwner,
const Handle(V3d_Viewer)& theViewer) const;
//! Helper function that returns correct selection style for the object:
//! if custom style is defined via object's highlight drawer, it will be used. Otherwise,
//! selection style of interactive context will be returned.

View File

@@ -293,22 +293,6 @@ void AIS_InteractiveContext::highlightWithSubintensity (const Handle(SelectMgr_E
theOwner->HilightWithColor (myMainPM, myStyles[Prs3d_TypeOfHighlight_SubIntensity], theMode);
}
//=======================================================================
//function : isSlowHiStyle
//purpose :
//=======================================================================
Standard_Boolean AIS_InteractiveContext::isSlowHiStyle (const Handle(SelectMgr_EntityOwner)& theOwner,
const Handle(V3d_Viewer)& theViewer) const
{
if (const Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (theOwner->Selectable()))
{
const Handle(Prs3d_Drawer)& aHiStyle = getHiStyle (anObj, myLastPicked);
return aHiStyle->ZLayer() == Graphic3d_ZLayerId_UNKNOWN
|| !theViewer->ZLayerSettings (aHiStyle->ZLayer()).IsImmediate();
}
return Standard_False;
}
//=======================================================================
//function : MoveTo
//purpose :
@@ -388,11 +372,6 @@ AIS_StatusOfDetection AIS_InteractiveContext::MoveTo (const Standard_Integer th
// method call. As result it is necessary to rehighligt it with mySelectionColor.
if (!myLastPicked.IsNull() && myLastPicked->HasSelectable())
{
if (isSlowHiStyle (myLastPicked, theView->Viewer()))
{
theView->Viewer()->Invalidate();
}
clearDynamicHighlight();
toUpdateViewer = Standard_True;
}
@@ -408,11 +387,6 @@ AIS_StatusOfDetection AIS_InteractiveContext::MoveTo (const Standard_Integer th
&& (!myLastPicked->IsSelected()
|| myToHilightSelected))
{
if (isSlowHiStyle (myLastPicked, theView->Viewer()))
{
theView->Viewer()->Invalidate();
}
highlightWithColor (myLastPicked, theView->Viewer());
toUpdateViewer = Standard_True;
}
@@ -431,11 +405,6 @@ AIS_StatusOfDetection AIS_InteractiveContext::MoveTo (const Standard_Integer th
&& !myLastPicked.IsNull()
&& myLastPicked->HasSelectable())
{
if (isSlowHiStyle (myLastPicked, theView->Viewer()))
{
theView->Viewer()->Invalidate();
}
clearDynamicHighlight();
toUpdateViewer = Standard_True;
}
@@ -453,14 +422,7 @@ AIS_StatusOfDetection AIS_InteractiveContext::MoveTo (const Standard_Integer th
}
else
{
if (theView->IsInvalidated())
{
theView->Viewer()->Redraw();
}
else
{
theView->Viewer()->RedrawImmediate();
}
theView->Viewer()->RedrawImmediate();
}
}

View File

@@ -472,7 +472,33 @@ void AIS_InteractiveObject::SetPolygonOffsets(const Standard_Integer aMode,
myDrawer->SetShadingAspect(new Prs3d_ShadingAspect());
myDrawer->ShadingAspect()->Aspect()->SetPolygonOffsets( aMode, aFactor, aUnits );
SynchronizeAspects();
// Modify existing presentations
for (Standard_Integer aPrsIter = 1, n = myPresentations.Length(); aPrsIter <= n; ++aPrsIter)
{
const Handle(PrsMgr_Presentation)& aPrs3d = myPresentations (aPrsIter).Presentation();
if ( !aPrs3d.IsNull() ) {
const Handle(Graphic3d_Structure)& aStruct = aPrs3d->Presentation();
if( !aStruct.IsNull() ) {
// Workaround for issue 23115: Need to update also groups, because their
// face aspect ALWAYS overrides the structure's.
const Graphic3d_SequenceOfGroup& aGroups = aStruct->Groups();
for (Graphic3d_SequenceOfGroup::Iterator aGroupIter (aGroups); aGroupIter.More(); aGroupIter.Next())
{
Handle(Graphic3d_Group)& aGrp = aGroupIter.ChangeValue();
if (aGrp.IsNull()
|| !aGrp->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_FILL_AREA))
{
continue;
}
Handle(Graphic3d_AspectFillArea3d) aFaceAsp = aGrp->FillAreaAspect();
aFaceAsp->SetPolygonOffsets(aMode, aFactor, aUnits);
aGrp->SetGroupPrimitivesAspect(aFaceAsp);
}
}
}
}
}
//=======================================================================
@@ -596,33 +622,3 @@ void AIS_InteractiveObject::SynchronizeAspects()
}
}
}
//=======================================================================
//function : replaceAspects
//purpose :
//=======================================================================
void AIS_InteractiveObject::replaceAspects (const Graphic3d_MapOfAspectsToAspects& theMap)
{
if (theMap.IsEmpty())
{
return;
}
for (PrsMgr_Presentations::Iterator aPrsIter (myPresentations); aPrsIter.More(); aPrsIter.Next())
{
const Handle(PrsMgr_Presentation)& aPrs3d = aPrsIter.ChangeValue().Presentation();
if (aPrs3d.IsNull()
|| aPrs3d->Presentation().IsNull())
{
continue;
}
for (Graphic3d_SequenceOfGroup::Iterator aGroupIter (aPrs3d->Presentation()->Groups()); aGroupIter.More(); aGroupIter.Next())
{
if (!aGroupIter.Value().IsNull())
{
aGroupIter.ChangeValue()->ReplaceAspects (theMap);
}
}
}
}

View File

@@ -386,15 +386,6 @@ public:
//! so that modifications will take effect on already computed presentation groups (thus avoiding re-displaying the object).
Standard_EXPORT void SynchronizeAspects();
protected:
//! Replace aspects of existing (computed) presentation groups,
//! so that the new aspects can be applied without recomputing presentation.
//! It is NOT recommended approach, because user has to fill such map and then search for each occurrence in computed groups.
//! The recommended approach is computing presentation with necessary customized aspects,
//! and then modify them directly followed by SynchronizeAspects() call.
Standard_EXPORT void replaceAspects (const Graphic3d_MapOfAspectsToAspects& theMap);
private:
Standard_EXPORT virtual Standard_Boolean RecomputeEveryPrs() const;

View File

@@ -26,7 +26,6 @@
#include <Prs3d_Root.hxx>
#include <Prs3d_ShadingAspect.hxx>
#include <Prs3d_ToolDisk.hxx>
#include <Prs3d_ToolSector.hxx>
#include <Prs3d_ToolSphere.hxx>
#include <Select3D_SensitiveCircle.hxx>
#include <Select3D_SensitivePoint.hxx>
@@ -152,19 +151,6 @@ void AIS_Manipulator::init()
myHighlightAspect->Aspect()->SetInteriorStyle (Aspect_IS_SOLID);
myHighlightAspect->SetMaterial (aHilightMaterial);
Graphic3d_MaterialAspect aDraggerMaterial;
aDraggerMaterial.SetReflectionModeOff(Graphic3d_TOR_DIFFUSE);
aDraggerMaterial.SetReflectionModeOff(Graphic3d_TOR_SPECULAR);
aDraggerMaterial.SetReflectionModeOff(Graphic3d_TOR_EMISSION);
aDraggerMaterial.SetMaterialType(Graphic3d_MATERIAL_ASPECT);
aDraggerMaterial.SetAmbient(1.0);
myDraggerHighlight = new Prs3d_ShadingAspect();
myDraggerHighlight->Aspect()->SetInteriorStyle(Aspect_IS_SOLID);
myDraggerHighlight->SetMaterial(aDraggerMaterial);
myDraggerHighlight->SetTransparency(0.5);
SetSize (100);
SetZLayer (Graphic3d_ZLayerId_Topmost);
}
@@ -184,11 +170,10 @@ Handle(Prs3d_Presentation) AIS_Manipulator::getHighlightPresentation (const Hand
switch (anOwner->Mode())
{
case AIS_MM_Translation : return myAxes[anOwner->Index()].TranslatorHighlightPrs();
case AIS_MM_Rotation : return myAxes[anOwner->Index()].RotatorHighlightPrs();
case AIS_MM_Scaling : return myAxes[anOwner->Index()].ScalerHighlightPrs();
case AIS_MM_TranslationPlane: return myAxes[anOwner->Index()].DraggerHighlightPrs();
case AIS_MM_None : break;
case AIS_MM_Translation: return myAxes[anOwner->Index()].TranslatorHighlightPrs();
case AIS_MM_Rotation : return myAxes[anOwner->Index()].RotatorHighlightPrs();
case AIS_MM_Scaling : return myAxes[anOwner->Index()].ScalerHighlightPrs();
case AIS_MM_None : break;
}
return aDummyPrs;
@@ -209,11 +194,10 @@ Handle(Graphic3d_Group) AIS_Manipulator::getGroup (const Standard_Integer theInd
switch (theMode)
{
case AIS_MM_Translation : return myAxes[theIndex].TranslatorGroup();
case AIS_MM_Rotation : return myAxes[theIndex].RotatorGroup();
case AIS_MM_Scaling : return myAxes[theIndex].ScalerGroup();
case AIS_MM_TranslationPlane: return myAxes[theIndex].DraggerGroup();
case AIS_MM_None : break;
case AIS_MM_Translation: return myAxes[theIndex].TranslatorGroup();
case AIS_MM_Rotation : return myAxes[theIndex].RotatorGroup();
case AIS_MM_Scaling : return myAxes[theIndex].ScalerGroup();
case AIS_MM_None : break;
}
return aDummyGroup;
@@ -282,10 +266,6 @@ void AIS_Manipulator::SetPart (const Standard_Integer theAxisIndex, const AIS_Ma
myAxes[theAxisIndex].SetScaling (theIsEnabled);
break;
case AIS_MM_TranslationPlane:
myAxes[theAxisIndex].SetDragging(theIsEnabled);
break;
case AIS_MM_None:
break;
}
@@ -297,7 +277,7 @@ void AIS_Manipulator::SetPart (const Standard_Integer theAxisIndex, const AIS_Ma
//=======================================================================
void AIS_Manipulator::SetPart (const AIS_ManipulatorMode theMode, const Standard_Boolean theIsEnabled)
{
for (Standard_Integer anIt = 0; anIt < 4; ++anIt)
for (Standard_Integer anIt = 0; anIt < 3; ++anIt)
{
SetPart (anIt, theMode, theIsEnabled);
}
@@ -420,7 +400,6 @@ void AIS_Manipulator::Attach (const Handle(AIS_ManipulatorObjectSequence)& theOb
EnableMode (AIS_MM_Rotation);
EnableMode (AIS_MM_Translation);
EnableMode (AIS_MM_Scaling);
EnableMode (AIS_MM_TranslationPlane);
}
}
@@ -607,34 +586,6 @@ Standard_Boolean AIS_Manipulator::ObjectTransformation (const Standard_Integer t
myPrevState = anAngle;
return Standard_True;
}
case AIS_MM_TranslationPlane:
{
const gp_Pnt aPosLoc = myStartPosition.Location();
const gp_Ax1 aCurrAxis = getAx1FromAx2Dir(myStartPosition, myCurrentIndex);
IntAna_IntConicQuad aIntersector(anInputLine, gp_Pln(aPosLoc, aCurrAxis.Direction()), Precision::Angular(), Precision::Intersection());
if (!aIntersector.IsDone() || aIntersector.NbPoints() < 1)
{
return Standard_False;
}
const gp_Pnt aNewPosition = aIntersector.Point(1);
if (!myHasStartedTransformation)
{
myStartPick = aNewPosition;
myHasStartedTransformation = Standard_True;
return Standard_True;
}
if (aNewPosition.Distance(myStartPick) < Precision::Confusion())
{
return Standard_False;
}
gp_Trsf aNewTrsf;
aNewTrsf.SetTranslation(gp_Vec(myStartPick, aNewPosition));
theTrsf *= aNewTrsf;
return Standard_True;
}
case AIS_MM_None:
{
return Standard_False;
@@ -706,9 +657,8 @@ void AIS_Manipulator::Transform (const gp_Trsf& theTrsf)
}
}
if ((myCurrentMode == AIS_MM_Translation && myBehaviorOnTransform.FollowTranslation)
|| (myCurrentMode == AIS_MM_Rotation && myBehaviorOnTransform.FollowRotation)
|| (myCurrentMode == AIS_MM_TranslationPlane && myBehaviorOnTransform.FollowDragging))
if ((myCurrentMode == AIS_MM_Translation && myBehaviorOnTransform.FollowTranslation)
|| (myCurrentMode == AIS_MM_Rotation && myBehaviorOnTransform.FollowRotation))
{
gp_Pnt aPos = myStartPosition.Location().Transformed (theTrsf);
gp_Dir aVDir = myStartPosition.Direction().Transformed (theTrsf);
@@ -836,13 +786,8 @@ void AIS_Manipulator::DeactivateCurrentMode()
Handle(Prs3d_ShadingAspect) anAspect = new Prs3d_ShadingAspect();
anAspect->Aspect()->SetInteriorStyle (Aspect_IS_SOLID);
anAspect->SetMaterial (myDrawer->ShadingAspect()->Material());
if (myCurrentMode == AIS_MM_TranslationPlane)
anAspect->SetTransparency(1.0);
else
{
anAspect->SetTransparency(myDrawer->ShadingAspect()->Transparency());
anAspect->SetColor(myAxes[myCurrentIndex].Color());
}
anAspect->SetTransparency (myDrawer->ShadingAspect()->Transparency());
anAspect->SetColor (myAxes[myCurrentIndex].Color());
aGroup->SetGroupPrimitivesAspect (anAspect->Aspect());
}
@@ -937,14 +882,14 @@ void AIS_Manipulator::Compute (const Handle(PrsMgr_PresentationManager3d)& thePr
// Display center
myCenter.Init (myAxes[0].AxisRadius() * 2.0f, gp::Origin());
aGroup = thePrs->NewGroup ();
aGroup = Prs3d_Root::NewGroup (thePrs);
aGroup->SetPrimitivesAspect (myDrawer->ShadingAspect()->Aspect());
aGroup->AddPrimitiveArray (myCenter.Array());
for (Standard_Integer anIt = 0; anIt < 3; ++anIt)
{
// Display axes
aGroup = thePrs->NewGroup ();
aGroup = Prs3d_Root::NewGroup (thePrs);
Handle(Prs3d_ShadingAspect) anAspectAx = new Prs3d_ShadingAspect (new Graphic3d_AspectFillArea3d(*anAspect->Aspect()));
anAspectAx->SetColor (myAxes[anIt].Color());
@@ -987,13 +932,7 @@ void AIS_Manipulator::HilightSelected (const Handle(PrsMgr_PresentationManager3d
return;
}
if (anOwner->Mode() == AIS_MM_TranslationPlane)
{
myDraggerHighlight->SetColor(myAxes[anOwner->Index()].Color());
aGroup->SetGroupPrimitivesAspect(myDraggerHighlight->Aspect());
}
else
aGroup->SetGroupPrimitivesAspect(myHighlightAspect->Aspect());
aGroup->SetGroupPrimitivesAspect (myHighlightAspect->Aspect());
myCurrentIndex = anOwner->Index();
myCurrentMode = anOwner->Mode();
@@ -1022,20 +961,13 @@ void AIS_Manipulator::HilightOwnerWithColor (const Handle(PrsMgr_PresentationMan
{
return;
}
if (anOwner->Mode() == AIS_MM_TranslationPlane)
{
Handle(Prs3d_Drawer) aStyle = new Prs3d_Drawer();
aStyle->SetColor(myAxes[anOwner->Index()].Color());
aStyle->SetTransparency(0.5);
aPresentation->Highlight(aStyle);
}
else
aPresentation->Highlight(theStyle);
aPresentation->Highlight (theStyle);
for (Graphic3d_SequenceOfGroup::Iterator aGroupIter (aPresentation->Groups());
aGroupIter.More(); aGroupIter.Next())
{
Handle(Graphic3d_Group)& aGrp = aGroupIter.ChangeValue();
if (!aGrp.IsNull())
if (!aGrp.IsNull()
&& aGrp->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_FILL_AREA))
{
aGrp->SetGroupPrimitivesAspect (myHighlightAspect->Aspect());
}
@@ -1144,38 +1076,6 @@ void AIS_Manipulator::ComputeSelection (const Handle(SelectMgr_Selection)& theSe
theSelection->Add (aTri);
}
}
if (aMode == AIS_MM_TranslationPlane || aMode == AIS_MM_None)
{
for (Standard_Integer anIt = 0; anIt < 3; ++anIt)
{
if (!myAxes[anIt].HasDragging())
{
continue;
}
if (aMode != AIS_MM_None)
{
anOwner = new AIS_ManipulatorOwner(this, anIt, AIS_MM_TranslationPlane, 9);
}
// define sensitivity by two crossed lines
gp_Pnt aP1, aP2;
aP1 = myAxes[((anIt + 1) % 3)].TranslatorTipPosition();
aP2 = myAxes[((anIt + 2) % 3)].TranslatorTipPosition();
gp_XYZ aMidP = (aP1.XYZ() + aP2.XYZ()) / 2.0;
Handle(Select3D_SensitiveSegment) aLine1 = new Select3D_SensitiveSegment(anOwner, aP1, aP2);
aLine1->SetSensitivityFactor(10);
theSelection->Add(aLine1);
Handle(Select3D_SensitiveSegment) aLine2 = new Select3D_SensitiveSegment(anOwner, gp::Origin(), aMidP);
aLine2->SetSensitivityFactor(10);
theSelection->Add(aLine2);
// enlarge sensitivity by triangulation
Handle(Select3D_SensitiveTriangulation) aTri = new Select3D_SensitiveTriangulation(anOwner, myAxes[anIt].DraggerSector().Triangulation(), TopLoc_Location(), Standard_True);
theSelection->Add(aTri);
}
}
}
//=======================================================================
@@ -1291,24 +1191,6 @@ void AIS_Manipulator::Cube::addTriangle (const Standard_Integer theIndex,
myArray->AddVertex (theP3, theNormal);
}
//=======================================================================
//class : Sector
//function : Init
//purpose :
//=======================================================================
void AIS_Manipulator::Sector::Init (const Standard_ShortReal theRadius,
const gp_Ax1& thePosition,
const gp_Dir& theXDirection,
const Standard_Integer theSlicesNb,
const Standard_Integer theStacksNb)
{
Prs3d_ToolSector aTool(theRadius, theSlicesNb, theStacksNb);
gp_Ax3 aSystem(thePosition.Location(), thePosition.Direction(), theXDirection);
gp_Trsf aTrsf;
aTrsf.SetTransformation(aSystem, gp_Ax3());
aTool.FillArray(myArray, myTriangulation, aTrsf);
}
//=======================================================================
//class : Axis
//function : Constructor
@@ -1329,7 +1211,6 @@ AIS_Manipulator::Axis::Axis (const gp_Ax1& theAxis,
myInnerRadius (myLength + myBoxSize),
myDiskThickness (myBoxSize * 0.5f),
myIndent (0.2f),
myHasDragging(Standard_True),
myFacettesNumber (20),
myCircleRadius (myLength + myBoxSize + myBoxSize * 0.5f * 0.5f)
{
@@ -1358,7 +1239,7 @@ void AIS_Manipulator::Axis::Compute (const Handle(PrsMgr_PresentationManager)& t
myAxisRadius * 1.5,
anArrowLength,
myFacettesNumber);
myTranslatorGroup = thePrs->NewGroup ();
myTranslatorGroup = Prs3d_Root::NewGroup (thePrs);
myTranslatorGroup->SetGroupPrimitivesAspect (theAspect->Aspect());
myTranslatorGroup->AddPrimitiveArray (myTriangleArray);
@@ -1382,7 +1263,7 @@ void AIS_Manipulator::Axis::Compute (const Handle(PrsMgr_PresentationManager)& t
myCubePos = myReferenceAxis.Direction().XYZ() * (myLength + myIndent);
myCube.Init (gp_Ax1 (myCubePos, myReferenceAxis.Direction()), myBoxSize);
myScalerGroup = thePrs->NewGroup ();
myScalerGroup = Prs3d_Root::NewGroup (thePrs);
myScalerGroup->SetGroupPrimitivesAspect (theAspect->Aspect());
myScalerGroup->AddPrimitiveArray (myCube.Array());
@@ -1405,7 +1286,7 @@ void AIS_Manipulator::Axis::Compute (const Handle(PrsMgr_PresentationManager)& t
{
myCircleRadius = myInnerRadius + myIndent * 2 + myDiskThickness * 0.5f;
myCircle.Init (myInnerRadius + myIndent * 2, myInnerRadius + myDiskThickness + myIndent * 2, gp_Ax1(gp::Origin(), myReferenceAxis.Direction()), myFacettesNumber * 2);
myRotatorGroup = thePrs->NewGroup ();
myRotatorGroup = Prs3d_Root::NewGroup (thePrs);
myRotatorGroup->SetGroupPrimitivesAspect (theAspect->Aspect());
myRotatorGroup->AddPrimitiveArray (myCircle.Array());
@@ -1423,36 +1304,4 @@ void AIS_Manipulator::Axis::Compute (const Handle(PrsMgr_PresentationManager)& t
aGroup->AddPrimitiveArray (myCircle.Array());
}
}
if (myHasDragging)
{
gp_Dir aXDirection;
if (myReferenceAxis.Direction().X() > 0)
aXDirection = gp::DY();
else if (myReferenceAxis.Direction().Y() > 0)
aXDirection = gp::DZ();
else
aXDirection = gp::DX();
mySector.Init(myInnerRadius + myIndent * 2, gp_Ax1(gp::Origin(), myReferenceAxis.Direction()), aXDirection, myFacettesNumber * 2);
myDraggerGroup = thePrs->NewGroup();
Handle(Graphic3d_AspectFillArea3d) aFillArea = new Graphic3d_AspectFillArea3d();
myDraggerGroup->SetGroupPrimitivesAspect(aFillArea);
myDraggerGroup->AddPrimitiveArray(mySector.Array());
if (myHighlightDragger.IsNull())
{
myHighlightDragger = new Prs3d_Presentation(thePrsMgr->StructureManager());
}
else
{
myHighlightDragger->Clear();
}
{
Handle(Graphic3d_Group) aGroup = Prs3d_Root::CurrentGroup(myHighlightDragger);
aGroup->SetGroupPrimitivesAspect(aFillArea);
aGroup->AddPrimitiveArray(mySector.Array());
}
}
}

View File

@@ -280,14 +280,12 @@ public:
//! - FollowRotation - whether the manipulator will be rotated together with an object.
struct BehaviorOnTransform {
BehaviorOnTransform() : FollowTranslation (Standard_True), FollowRotation (Standard_True), FollowDragging (Standard_True) {}
BehaviorOnTransform() : FollowTranslation (Standard_True), FollowRotation (Standard_True) {}
BehaviorOnTransform& SetFollowTranslation (const Standard_Boolean theApply) { FollowTranslation = theApply; return *this; }
BehaviorOnTransform& SetFollowRotation (const Standard_Boolean theApply) { FollowRotation = theApply; return *this; }
BehaviorOnTransform& SetFollowDragging (const Standard_Boolean theApply) { FollowDragging = theApply; return *this; }
Standard_Boolean FollowTranslation;
Standard_Boolean FollowRotation;
Standard_Boolean FollowDragging;
};
//! Sets behavior settings for transformation action carried on the manipulator,
@@ -448,29 +446,6 @@ protected: //! @name Auxiliary classes to fill presentation with proper primitiv
Handle(Graphic3d_ArrayOfTriangles) myArray;
};
class Sector : public Quadric
{
public:
Sector()
: Quadric(),
myRadius(0.0f)
{ }
~Sector() { }
void Init(const Standard_ShortReal theRadius,
const gp_Ax1& thePosition,
const gp_Dir& theXDirection,
const Standard_Integer theSlicesNb = 5,
const Standard_Integer theStacksNb = 5);
protected:
gp_Ax1 myPosition;
Standard_ShortReal myRadius;
};
//! The class describes on axis sub-object.
//! It includes sub-objects itself:
//! -rotator
@@ -510,11 +485,6 @@ protected: //! @name Auxiliary classes to fill presentation with proper primitiv
{
myHighlightRotator->SetTransformPersistence (theTrsfPers);
}
if (!myHighlightDragger.IsNull())
{
myHighlightDragger->SetTransformPersistence(theTrsfPers);
}
}
void Transform (const Handle(Geom_Transformation)& theTransformation)
@@ -533,11 +503,6 @@ protected: //! @name Auxiliary classes to fill presentation with proper primitiv
{
myHighlightRotator->SetTransformation (theTransformation);
}
if (!myHighlightDragger.IsNull())
{
myHighlightDragger->SetTransformation(theTransformation);
}
}
Standard_Boolean HasTranslation() const { return myHasTranslation; }
@@ -546,16 +511,12 @@ protected: //! @name Auxiliary classes to fill presentation with proper primitiv
Standard_Boolean HasScaling() const { return myHasScaling; }
Standard_Boolean HasDragging() const { return myHasDragging; }
void SetTranslation (const Standard_Boolean theIsEnabled) { myHasTranslation = theIsEnabled; }
void SetRotation (const Standard_Boolean theIsEnabled) { myHasRotation = theIsEnabled; }
void SetScaling (const Standard_Boolean theIsEnabled) { myHasScaling = theIsEnabled; }
void SetDragging(const Standard_Boolean theIsEnabled) { myHasDragging = theIsEnabled; }
Quantity_Color Color() const { return myColor; }
Standard_ShortReal AxisLength() const { return myLength; }
@@ -570,16 +531,12 @@ protected: //! @name Auxiliary classes to fill presentation with proper primitiv
const Handle(Prs3d_Presentation)& ScalerHighlightPrs() const { return myHighlightScaler; }
const Handle(Prs3d_Presentation)& DraggerHighlightPrs() const { return myHighlightDragger; }
const Handle(Graphic3d_Group)& TranslatorGroup() const { return myTranslatorGroup; }
const Handle(Graphic3d_Group)& RotatorGroup() const { return myRotatorGroup; }
const Handle(Graphic3d_Group)& ScalerGroup() const { return myScalerGroup; }
const Handle(Graphic3d_Group)& DraggerGroup() const { return myDraggerGroup; }
const Handle(Graphic3d_ArrayOfTriangles)& TriangleArray() const { return myTriangleArray; }
void SetIndent (const Standard_ShortReal theValue) { myIndent = theValue; }
@@ -613,7 +570,6 @@ protected: //! @name Auxiliary classes to fill presentation with proper primitiv
public:
const gp_Pnt& TranslatorTipPosition() const { return myArrowTipPos; }
const Sector& DraggerSector() const { return mySector; }
const Disk& RotatorDisk() const { return myCircle; }
float RotatorDiskRadius() const { return myCircleRadius; }
const Cube& ScalerCube() const { return myCube; }
@@ -637,14 +593,11 @@ protected: //! @name Auxiliary classes to fill presentation with proper primitiv
Standard_ShortReal myDiskThickness;
Standard_ShortReal myIndent; //!< Gap between visual part of the manipulator.
Standard_Boolean myHasDragging;
protected:
Standard_Integer myFacettesNumber;
gp_Pnt myArrowTipPos;
Sector mySector;
Disk myCircle;
float myCircleRadius;
Cube myCube;
@@ -653,12 +606,10 @@ protected: //! @name Auxiliary classes to fill presentation with proper primitiv
Handle(Graphic3d_Group) myTranslatorGroup;
Handle(Graphic3d_Group) myScalerGroup;
Handle(Graphic3d_Group) myRotatorGroup;
Handle(Graphic3d_Group) myDraggerGroup;
Handle(Prs3d_Presentation) myHighlightTranslator;
Handle(Prs3d_Presentation) myHighlightScaler;
Handle(Prs3d_Presentation) myHighlightRotator;
Handle(Prs3d_Presentation) myHighlightDragger;
Handle(Graphic3d_ArrayOfTriangles) myTriangleArray;
@@ -687,9 +638,6 @@ protected: //! @name Fields for interactive transformation. Fields only for inte
//! Aspect used to color current detected part and current selected part.
Handle(Prs3d_ShadingAspect) myHighlightAspect;
//! Aspect used to color sector part when it's selected.
Handle(Prs3d_ShadingAspect) myDraggerHighlight;
public:
DEFINE_STANDARD_RTTIEXT(AIS_Manipulator, AIS_InteractiveObject)

View File

@@ -22,8 +22,7 @@ enum AIS_ManipulatorMode
AIS_MM_None = 0,
AIS_MM_Translation = 1,
AIS_MM_Rotation,
AIS_MM_Scaling,
AIS_MM_TranslationPlane
AIS_MM_Scaling
};
#endif

View File

@@ -173,8 +173,8 @@ void AIS_PointCloudOwner::Clear (const Handle(PrsMgr_PresentationManager)& thePr
//==================================================
AIS_PointCloud::AIS_PointCloud()
{
myDrawer->SetupOwnShadingAspect();
myDrawer->ShadingAspect()->Aspect()->SetMarkerType (Aspect_TOM_POINT);
// override default point style to Aspect_TOM_POINT
myDrawer->SetPointAspect (new Prs3d_PointAspect (Aspect_TOM_POINT, Quantity_NOC_YELLOW, 1.0));
SetDisplayMode (AIS_PointCloud::DM_Points);
SetHilightMode (AIS_PointCloud::DM_BndBox);
@@ -282,8 +282,52 @@ void AIS_PointCloud::SetColor (const Quantity_Color& theColor)
{
AIS_InteractiveObject::SetColor(theColor);
if (!myDrawer->HasOwnPointAspect())
{
myDrawer->SetPointAspect (new Prs3d_PointAspect (Aspect_TOM_POINT, theColor, 1.0));
if (myDrawer->HasLink())
{
*myDrawer->PointAspect()->Aspect() = *myDrawer->Link()->PointAspect()->Aspect();
}
}
if (!myDrawer->HasOwnShadingAspect())
{
myDrawer->SetShadingAspect (new Prs3d_ShadingAspect());
if (myDrawer->HasLink())
{
*myDrawer->ShadingAspect()->Aspect() = *myDrawer->Link()->ShadingAspect()->Aspect();
}
}
// Override color
myDrawer->ShadingAspect()->SetColor (theColor);
SynchronizeAspects();
myDrawer->PointAspect() ->SetColor (theColor);
const PrsMgr_Presentations& aPrsList = Presentations();
Handle(Graphic3d_AspectMarker3d) aPointAspect = myDrawer->PointAspect()->Aspect();
Handle(Graphic3d_AspectFillArea3d) anAreaAspect = myDrawer->ShadingAspect()->Aspect();
for (Standard_Integer aPrsIt = 1; aPrsIt <= aPrsList.Length(); ++aPrsIt)
{
const PrsMgr_ModedPresentation& aPrsModed = aPrsList.Value (aPrsIt);
if (aPrsModed.Mode() != AIS_PointCloud::DM_Points)
{
continue;
}
const Handle(Prs3d_Presentation)& aPrs = aPrsModed.Presentation()->Presentation();
for (Graphic3d_SequenceOfGroup::Iterator aGroupIt (aPrs->Groups()); aGroupIt.More(); aGroupIt.Next())
{
const Handle(Graphic3d_Group)& aGroup = aGroupIt.Value();
if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_MARKER))
{
aGroup->SetGroupPrimitivesAspect (aPointAspect);
}
if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_FILL_AREA))
{
aGroup->SetGroupPrimitivesAspect (anAreaAspect);
}
}
}
}
//=======================================================================
@@ -298,20 +342,34 @@ void AIS_PointCloud::UnsetColor()
}
AIS_InteractiveObject::UnsetColor();
if (!HasWidth())
{
myDrawer->SetPointAspect (Handle(Prs3d_PointAspect)());
}
else
{
myDrawer->PointAspect()->SetColor (myDrawer->HasLink()
? myDrawer->Link()->PointAspect()->Aspect()->Color()
: Quantity_Color (Quantity_NOC_YELLOW));
}
if (HasMaterial()
|| IsTransparent())
{
Graphic3d_MaterialAspect aDefaultMat (Graphic3d_NOM_BRASS);
Graphic3d_MaterialAspect aMat = aDefaultMat;
Quantity_Color aColor = aDefaultMat.Color();
if (myDrawer->HasLink())
{
aColor = myDrawer->Link()->ShadingAspect()->Color (myCurrentFacingModel);
}
if (HasMaterial() || myDrawer->HasLink())
{
aMat = AIS_GraphicTool::GetMaterial (HasMaterial() ? myDrawer : myDrawer->Link());
}
if (HasMaterial())
{
Quantity_Color aColor = aDefaultMat.AmbientColor();
if (myDrawer->HasLink())
{
aColor = myDrawer->Link()->ShadingAspect()->Color (myCurrentFacingModel);
}
aMat.SetColor (aColor);
}
if (IsTransparent())
@@ -320,10 +378,43 @@ void AIS_PointCloud::UnsetColor()
aMat.SetTransparency (Standard_ShortReal(aTransp));
}
myDrawer->ShadingAspect()->SetMaterial (aMat, myCurrentFacingModel);
myDrawer->ShadingAspect()->Aspect()->SetInteriorColor (aColor);
}
else
{
myDrawer->SetShadingAspect (Handle(Prs3d_ShadingAspect)());
}
myDrawer->SetPointAspect (Handle(Prs3d_PointAspect)());
SynchronizeAspects();
// modify shading presentation without re-computation
const PrsMgr_Presentations& aPrsList = Presentations();
Handle(Graphic3d_AspectFillArea3d) anAreaAsp = myDrawer->Link()->ShadingAspect()->Aspect();
Handle(Graphic3d_AspectMarker3d) aMarkerAsp = myDrawer->Link()->PointAspect()->Aspect();
for (Standard_Integer aPrsIt = 1; aPrsIt <= aPrsList.Length(); ++aPrsIt)
{
const PrsMgr_ModedPresentation& aPrsModed = aPrsList.Value (aPrsIt);
if (aPrsModed.Mode() != AIS_PointCloud::DM_Points)
{
continue;
}
const Handle(Prs3d_Presentation)& aPrs = aPrsModed.Presentation()->Presentation();
for (Graphic3d_SequenceOfGroup::Iterator aGroupIt (aPrs->Groups()); aGroupIt.More(); aGroupIt.Next())
{
const Handle(Graphic3d_Group)& aGroup = aGroupIt.Value();
// Check if aspect of given type is set for the group,
// because setting aspect for group with no already set aspect
// can lead to loss of presentation data
if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_FILL_AREA))
{
aGroup->SetGroupPrimitivesAspect (anAreaAsp);
}
if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_MARKER))
{
aGroup->SetGroupPrimitivesAspect (aMarkerAsp);
}
}
}
}
//=======================================================================
@@ -332,6 +423,14 @@ void AIS_PointCloud::UnsetColor()
//=======================================================================
void AIS_PointCloud::SetMaterial (const Graphic3d_MaterialAspect& theMat)
{
if (!myDrawer->HasOwnShadingAspect())
{
myDrawer->SetShadingAspect (new Prs3d_ShadingAspect());
if (myDrawer->HasLink())
{
*myDrawer->ShadingAspect()->Aspect() = *myDrawer->Link()->ShadingAspect()->Aspect();
}
}
hasOwnMaterial = Standard_True;
myDrawer->ShadingAspect()->SetMaterial (theMat, myCurrentFacingModel);
@@ -340,7 +439,28 @@ void AIS_PointCloud::SetMaterial (const Graphic3d_MaterialAspect& theMat)
myDrawer->ShadingAspect()->SetColor (myDrawer->Color(), myCurrentFacingModel);
}
myDrawer->ShadingAspect()->SetTransparency (myDrawer->Transparency(), myCurrentFacingModel);
SynchronizeAspects();
// modify shading presentation without re-computation
const PrsMgr_Presentations& aPrsList = Presentations();
Handle(Graphic3d_AspectFillArea3d) anAreaAsp = myDrawer->ShadingAspect()->Aspect();
for (Standard_Integer aPrsIt = 1; aPrsIt <= aPrsList.Length(); ++aPrsIt)
{
const PrsMgr_ModedPresentation& aPrsModed = aPrsList.Value (aPrsIt);
if (aPrsModed.Mode() != AIS_PointCloud::DM_Points)
{
continue;
}
const Handle(Prs3d_Presentation)& aPrs = aPrsModed.Presentation()->Presentation();
for (Graphic3d_SequenceOfGroup::Iterator aGroupIt (aPrs->Groups()); aGroupIt.More(); aGroupIt.Next())
{
const Handle(Graphic3d_Group)& aGroup = aGroupIt.Value();
if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_FILL_AREA))
{
aGroup->SetGroupPrimitivesAspect (anAreaAsp);
}
}
}
}
//=======================================================================
@@ -354,6 +474,8 @@ void AIS_PointCloud::UnsetMaterial()
return;
}
if (HasColor()
|| IsTransparent())
{
Graphic3d_MaterialAspect aDefaultMat (Graphic3d_NOM_BRASS);
myDrawer->ShadingAspect()->SetMaterial (myDrawer->HasLink() ?
@@ -366,8 +488,33 @@ void AIS_PointCloud::UnsetMaterial()
myDrawer->ShadingAspect()->SetTransparency (myDrawer->Transparency(), myCurrentFacingModel);
}
}
else
{
myDrawer->SetShadingAspect (Handle(Prs3d_ShadingAspect)());
}
hasOwnMaterial = Standard_False;
SynchronizeAspects();
// modify shading presentation without re-computation
const PrsMgr_Presentations& aPrsList = Presentations();
Handle(Graphic3d_AspectFillArea3d) anAreaAsp = myDrawer->ShadingAspect()->Aspect();
for (Standard_Integer aPrsIt = 1; aPrsIt <= aPrsList.Length(); ++aPrsIt)
{
const PrsMgr_ModedPresentation& aPrsModed = aPrsList.Value (aPrsIt);
if (aPrsModed.Mode() != AIS_PointCloud::DM_Points)
{
continue;
}
const Handle(Prs3d_Presentation)& aPrs = aPrsModed.Presentation()->Presentation();
for (Graphic3d_SequenceOfGroup::Iterator aGroupIt (aPrs->Groups()); aGroupIt.More(); aGroupIt.Next())
{
const Handle(Graphic3d_Group)& aGroup = aGroupIt.Value();
if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_FILL_AREA))
{
aGroup->SetGroupPrimitivesAspect (anAreaAsp);
}
}
}
}
//=======================================================================
@@ -388,7 +535,8 @@ void AIS_PointCloud::Compute (const Handle(PrsMgr_PresentationManager3d)& /*theP
return;
}
Handle(Graphic3d_Group) aGroup = thePrs->NewGroup();
Handle(Graphic3d_Group) aGroup = Prs3d_Root::CurrentGroup (thePrs);
aGroup->SetGroupPrimitivesAspect (myDrawer->PointAspect()->Aspect());
aGroup->SetGroupPrimitivesAspect (myDrawer->ShadingAspect()->Aspect());
aGroup->AddPrimitiveArray (aPoints);
break;

View File

@@ -28,7 +28,6 @@
#include <Geom_Line.hxx>
#include <Geom_Plane.hxx>
#include <Geom_Surface.hxx>
#include <Graphic3d_ArrayOfSegments.hxx>
#include <gp_Circ.hxx>
#include <gp_Lin.hxx>
#include <gp_Pnt.hxx>
@@ -185,13 +184,8 @@ void AIS_Relation::ComputeProjVertexPresentation(const Handle(Prs3d_Presentation
pa->SetTypeOfMarker(aProjTOM);
}
{
Handle(Graphic3d_Group) aGroup = aPrs->NewGroup();
Handle(Graphic3d_ArrayOfPoints) anArrayOfPoints = new Graphic3d_ArrayOfPoints (1);
anArrayOfPoints->AddVertex (ProjPoint);
aGroup->SetGroupPrimitivesAspect (myDrawer->PointAspect()->Aspect());
aGroup->AddPrimitiveArray (anArrayOfPoints);
}
// calcul du projete
StdPrs_Point::Add(aPrs, new Geom_CartesianPoint(ProjPoint), myDrawer);
if (!myDrawer->HasOwnWireAspect()){
myDrawer->SetWireAspect(new Prs3d_LineAspect(aColor,aCallTOL,2.));}
@@ -203,14 +197,10 @@ void AIS_Relation::ComputeProjVertexPresentation(const Handle(Prs3d_Presentation
}
// Si les points ne sont pas confondus...
if (!ProjPoint.IsEqual (BRep_Tool::Pnt(aVertex),Precision::Confusion()))
{
Handle(Graphic3d_Group) aGroup = aPrs->NewGroup();
Handle(Graphic3d_ArrayOfSegments) anArrayOfLines = new Graphic3d_ArrayOfSegments (2);
anArrayOfLines->AddVertex (ProjPoint);
anArrayOfLines->AddVertex (BRep_Tool::Pnt(aVertex));
aGroup->SetGroupPrimitivesAspect (myDrawer->WireAspect()->Aspect());
aGroup->AddPrimitiveArray (anArrayOfLines);
if (!ProjPoint.IsEqual (BRep_Tool::Pnt(aVertex),Precision::Confusion())) {
// calcul des lignes de rappel
BRepBuilderAPI_MakeEdge MakEd (ProjPoint,BRep_Tool::Pnt(aVertex));
StdPrs_WFShape::Add (aPrs, MakEd.Edge(), myDrawer);
}
}

View File

@@ -392,12 +392,13 @@ void AIS_RubberBand::Compute (const Handle(PrsMgr_PresentationManager3d)& /*theP
const Handle(Prs3d_Presentation)& thePresentation,
const Standard_Integer /*theMode*/)
{
Handle (Graphic3d_Group) aGroup = Prs3d_Root::CurrentGroup (thePresentation);
// Draw filling
if (IsFilling() && fillTriangles())
{
Handle(Graphic3d_Group) aGroup1 = thePresentation->NewGroup();
aGroup1->SetGroupPrimitivesAspect (myDrawer->ShadingAspect()->Aspect());
aGroup1->AddPrimitiveArray (myTriangles);
aGroup->SetGroupPrimitivesAspect (myDrawer->ShadingAspect()->Aspect());
aGroup->AddPrimitiveArray (myTriangles);
}
// Draw frame
@@ -432,7 +433,6 @@ void AIS_RubberBand::Compute (const Handle(PrsMgr_PresentationManager3d)& /*theP
}
}
Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup();
aGroup->SetGroupPrimitivesAspect (myDrawer->LineAspect()->Aspect());
aGroup->AddPrimitiveArray (myBorders);
}

View File

@@ -77,40 +77,6 @@ static Standard_Boolean IsInList(const TColStd_ListOfInteger& LL, const Standard
return Standard_False;
}
// Auxiliary macros
#define replaceAspectWithDef(theMap, theAspect) \
if (myDrawer->Link()->theAspect()->Aspect() != myDrawer->theAspect()->Aspect()) \
{ \
theMap.Bind (myDrawer->theAspect()->Aspect(), myDrawer->Link()->theAspect()->Aspect()); \
}
// Auxiliary macros for replaceWithNewOwnAspects()
#define replaceAspectWithOwn(theMap, theAspect) \
if (myDrawer->Link()->theAspect()->Aspect() != myDrawer->theAspect()->Aspect()) \
{ \
theMap.Bind (myDrawer->Link()->theAspect()->Aspect(), myDrawer->theAspect()->Aspect()); \
}
//=======================================================================
//function : replaceWithNewOwnAspects
//purpose :
//=======================================================================
void AIS_Shape::replaceWithNewOwnAspects()
{
Graphic3d_MapOfAspectsToAspects aReplaceMap;
replaceAspectWithOwn (aReplaceMap, ShadingAspect);
replaceAspectWithOwn (aReplaceMap, LineAspect);
replaceAspectWithOwn (aReplaceMap, WireAspect);
replaceAspectWithOwn (aReplaceMap, FreeBoundaryAspect);
replaceAspectWithOwn (aReplaceMap, UnFreeBoundaryAspect);
replaceAspectWithOwn (aReplaceMap, SeenLineAspect);
replaceAspectWithOwn (aReplaceMap, FaceBoundaryAspect);
replaceAspectWithOwn (aReplaceMap, PointAspect);
replaceAspects (aReplaceMap);
}
//==================================================
// Function: AIS_Shape
// Purpose :
@@ -386,7 +352,11 @@ bool AIS_Shape::setColor (const Handle(Prs3d_Drawer)& theDrawer,
bool toRecompute = false;
toRecompute = theDrawer->SetupOwnShadingAspect() || toRecompute;
toRecompute = theDrawer->SetOwnLineAspects() || toRecompute;
toRecompute = theDrawer->SetupOwnPointAspect() || toRecompute;
if (theDrawer->SetupOwnPointAspect())
{
toRecompute = true;
}
// override color
theDrawer->ShadingAspect()->SetColor (theColor, myCurrentFacingModel);
@@ -410,19 +380,52 @@ void AIS_Shape::SetColor (const Quantity_Color& theColor)
const bool toRecompute = setColor (myDrawer, theColor);
myDrawer->SetColor (theColor);
hasOwnColor = Standard_True;
myRecomputeEveryPrs = false; // no mode to recalculate, only viewer update
myToRecomputeModes.Clear();
if (!toRecompute
|| !myDrawer->HasLink())
if (!toRecompute)
{
myToRecomputeModes.Clear();
myRecomputeEveryPrs = false;
SynchronizeAspects();
return;
}
else
// modify shading presentation without re-computation
const PrsMgr_Presentations& aPrsList = Presentations();
Handle(Graphic3d_AspectFillArea3d) anAreaAspect = myDrawer->ShadingAspect()->Aspect();
Handle(Graphic3d_AspectLine3d) aLineAspect = myDrawer->LineAspect()->Aspect();
Handle(Graphic3d_AspectMarker3d) aPointAspect = myDrawer->PointAspect()->Aspect();
for (Standard_Integer aPrsIt = 1; aPrsIt <= aPrsList.Length(); ++aPrsIt)
{
replaceWithNewOwnAspects();
const PrsMgr_ModedPresentation& aPrsModed = aPrsList.Value (aPrsIt);
if (aPrsModed.Mode() != AIS_Shaded)
{
continue;
}
const Handle(Prs3d_Presentation)& aPrs = aPrsModed.Presentation()->Presentation();
for (Graphic3d_SequenceOfGroup::Iterator aGroupIt (aPrs->Groups()); aGroupIt.More(); aGroupIt.Next())
{
const Handle(Graphic3d_Group)& aGroup = aGroupIt.Value();
// Check if aspect of given type is set for the group,
// because setting aspect for group with no already set aspect
// can lead to loss of presentation data
if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_FILL_AREA))
{
aGroup->SetGroupPrimitivesAspect (anAreaAspect);
}
if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_LINE))
{
aGroup->SetGroupPrimitivesAspect (aLineAspect);
}
if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_MARKER))
{
aGroup->SetGroupPrimitivesAspect (aPointAspect);
}
}
}
recomputeComputed();
LoadRecomputable (AIS_WireFrame);
LoadRecomputable (2);
}
//=======================================================================
@@ -432,31 +435,25 @@ void AIS_Shape::SetColor (const Quantity_Color& theColor)
void AIS_Shape::UnsetColor()
{
myRecomputeEveryPrs = false; // no mode to recalculate, only viewer update
myToRecomputeModes.Clear();
if (!HasColor())
{
myToRecomputeModes.Clear();
myRecomputeEveryPrs = false;
return;
}
hasOwnColor = Standard_False;
myDrawer->SetColor (myDrawer->HasLink() ? myDrawer->Link()->Color() : Quantity_Color (Quantity_NOC_WHITE));
Graphic3d_MapOfAspectsToAspects aReplaceMap;
if (!HasWidth())
{
replaceAspectWithDef (aReplaceMap, LineAspect);
replaceAspectWithDef (aReplaceMap, WireAspect);
replaceAspectWithDef (aReplaceMap, FreeBoundaryAspect);
replaceAspectWithDef (aReplaceMap, UnFreeBoundaryAspect);
replaceAspectWithDef (aReplaceMap, SeenLineAspect);
replaceAspectWithDef (aReplaceMap, FaceBoundaryAspect);
myDrawer->SetLineAspect (Handle(Prs3d_LineAspect)());
myDrawer->SetWireAspect (Handle(Prs3d_LineAspect)());
myDrawer->SetFreeBoundaryAspect (Handle(Prs3d_LineAspect)());
myDrawer->SetUnFreeBoundaryAspect(Handle(Prs3d_LineAspect)());
myDrawer->SetSeenLineAspect (Handle(Prs3d_LineAspect)());
myDrawer->SetFaceBoundaryAspect (Handle(Prs3d_LineAspect)());
Handle(Prs3d_LineAspect) anEmptyAsp;
myDrawer->SetLineAspect (anEmptyAsp);
myDrawer->SetWireAspect (anEmptyAsp);
myDrawer->SetFreeBoundaryAspect (anEmptyAsp);
myDrawer->SetUnFreeBoundaryAspect(anEmptyAsp);
myDrawer->SetSeenLineAspect (anEmptyAsp);
myDrawer->SetFaceBoundaryAspect (anEmptyAsp);
}
else
{
@@ -538,17 +535,10 @@ void AIS_Shape::UnsetColor()
}
else
{
replaceAspectWithDef (aReplaceMap, ShadingAspect);
myDrawer->SetShadingAspect (Handle(Prs3d_ShadingAspect)());
}
if (myDrawer->HasOwnPointAspect())
{
replaceAspectWithDef (aReplaceMap, PointAspect);
myDrawer->SetPointAspect (Handle(Prs3d_PointAspect)());
}
replaceAspects (aReplaceMap);
SynchronizeAspects();
recomputeComputed();
myDrawer->SetPointAspect (Handle(Prs3d_PointAspect)());
myRecomputeEveryPrs = true;
}
//=======================================================================
@@ -579,19 +569,16 @@ bool AIS_Shape::setWidth (const Handle(Prs3d_Drawer)& theDrawer,
void AIS_Shape::SetWidth (const Standard_Real theLineWidth)
{
myOwnWidth = theLineWidth;
myRecomputeEveryPrs = false; // no mode to recalculate, only viewer update
myToRecomputeModes.Clear();
if (!setWidth (myDrawer, theLineWidth)
|| !myDrawer->HasLink())
if (setWidth (myDrawer, theLineWidth))
{
SynchronizeAspects();
myRecomputeEveryPrs = true;
}
else
{
replaceWithNewOwnAspects();
myRecomputeEveryPrs = false;
myToRecomputeModes.Clear();
SynchronizeAspects();
}
recomputeComputed();
}
//=======================================================================
@@ -601,30 +588,24 @@ void AIS_Shape::SetWidth (const Standard_Real theLineWidth)
void AIS_Shape::UnsetWidth()
{
myRecomputeEveryPrs = false; // no mode to recalculate, only viewer update
myToRecomputeModes.Clear();
if (myOwnWidth == 0.0)
{
myToRecomputeModes.Clear();
myRecomputeEveryPrs = false;
return;
}
myOwnWidth = 0.0;
if (!HasColor())
{
Graphic3d_MapOfAspectsToAspects aReplaceMap;
replaceAspectWithDef (aReplaceMap, LineAspect);
replaceAspectWithDef (aReplaceMap, WireAspect);
replaceAspectWithDef (aReplaceMap, FreeBoundaryAspect);
replaceAspectWithDef (aReplaceMap, UnFreeBoundaryAspect);
replaceAspectWithDef (aReplaceMap, SeenLineAspect);
replaceAspectWithDef (aReplaceMap, FaceBoundaryAspect);
myDrawer->SetLineAspect (Handle(Prs3d_LineAspect)());
myDrawer->SetWireAspect (Handle(Prs3d_LineAspect)());
myDrawer->SetFreeBoundaryAspect (Handle(Prs3d_LineAspect)());
myDrawer->SetUnFreeBoundaryAspect(Handle(Prs3d_LineAspect)());
myDrawer->SetSeenLineAspect (Handle(Prs3d_LineAspect)());
myDrawer->SetFaceBoundaryAspect (Handle(Prs3d_LineAspect)());
replaceAspects (aReplaceMap);
const Handle(Prs3d_LineAspect) anEmptyAsp;
myDrawer->SetLineAspect (anEmptyAsp);
myDrawer->SetWireAspect (anEmptyAsp);
myDrawer->SetFreeBoundaryAspect (anEmptyAsp);
myDrawer->SetUnFreeBoundaryAspect(anEmptyAsp);
myDrawer->SetSeenLineAspect (anEmptyAsp);
myDrawer->SetFaceBoundaryAspect (anEmptyAsp);
myRecomputeEveryPrs = true;
}
else
{
@@ -641,8 +622,9 @@ void AIS_Shape::UnsetWidth()
myDrawer->FaceBoundaryAspect() ->SetWidth (myDrawer->HasLink() ?
AIS_GraphicTool::GetLineWidth (myDrawer->Link(), AIS_TOA_FaceBoundary) : 1.);
SynchronizeAspects();
myToRecomputeModes.Clear();
myRecomputeEveryPrs = false;
}
recomputeComputed();
}
//=======================================================================
@@ -677,21 +659,37 @@ void AIS_Shape::setMaterial (const Handle(Prs3d_Drawer)& theDrawer,
void AIS_Shape::SetMaterial (const Graphic3d_MaterialAspect& theMat)
{
const bool toRecompute = !myDrawer->HasOwnShadingAspect();
setMaterial (myDrawer, theMat, HasColor(), IsTransparent());
hasOwnMaterial = Standard_True;
myRecomputeEveryPrs = false; // no mode to recalculate, only viewer update
// modify shading presentation without re-computation
const PrsMgr_Presentations& aPrsList = Presentations();
Handle(Graphic3d_AspectFillArea3d) anAreaAsp = myDrawer->ShadingAspect()->Aspect();
for (Standard_Integer aPrsIt = 1; aPrsIt <= aPrsList.Length(); ++aPrsIt)
{
const PrsMgr_ModedPresentation& aPrsModed = aPrsList.Value (aPrsIt);
if (aPrsModed.Mode() != AIS_Shaded)
{
continue;
}
const Handle(Prs3d_Presentation)& aPrs = aPrsModed.Presentation()->Presentation();
for (Graphic3d_SequenceOfGroup::Iterator aGroupIt (aPrs->Groups()); aGroupIt.More(); aGroupIt.Next())
{
const Handle(Graphic3d_Group)& aGroup = aGroupIt.Value();
// Check if aspect of given type is set for the group,
// because setting aspect for group with no already set aspect
// can lead to loss of presentation data
if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_FILL_AREA))
{
aGroup->SetGroupPrimitivesAspect (anAreaAsp);
}
}
}
myRecomputeEveryPrs = Standard_False; // no mode to recalculate :only viewer update
myToRecomputeModes.Clear();
if (!toRecompute
|| !myDrawer->HasLink())
{
SynchronizeAspects();
}
else
{
replaceWithNewOwnAspects();
}
}
//=======================================================================
@@ -701,8 +699,6 @@ void AIS_Shape::SetMaterial (const Graphic3d_MaterialAspect& theMat)
void AIS_Shape::UnsetMaterial()
{
myRecomputeEveryPrs = false; // no mode to recalculate, only viewer update
myToRecomputeModes.Clear();
if (!HasMaterial())
{
return;
@@ -726,15 +722,37 @@ void AIS_Shape::UnsetMaterial()
myDrawer->ShadingAspect()->SetColor (myDrawer->Color(), myCurrentFacingModel);
myDrawer->ShadingAspect()->SetTransparency (myDrawer->Transparency(), myCurrentFacingModel);
}
SynchronizeAspects();
}
else
{
Graphic3d_MapOfAspectsToAspects aReplaceMap;
replaceAspectWithDef (aReplaceMap, ShadingAspect);
myDrawer->SetShadingAspect (Handle(Prs3d_ShadingAspect)());
replaceAspects (aReplaceMap);
}
hasOwnMaterial = Standard_False;
// modify shading presentation without re-computation
const PrsMgr_Presentations& aPrsList = Presentations();
Handle(Graphic3d_AspectFillArea3d) anAreaAsp = myDrawer->ShadingAspect()->Aspect();
for (Standard_Integer aPrsIt = 1; aPrsIt <= aPrsList.Length(); ++aPrsIt)
{
const PrsMgr_ModedPresentation& aPrsModed = aPrsList.Value (aPrsIt);
if (aPrsModed.Mode() != AIS_Shaded)
{
continue;
}
const Handle(Prs3d_Presentation)& aPrs = aPrsModed.Presentation()->Presentation();
for (Graphic3d_SequenceOfGroup::Iterator aGroupIt (aPrs->Groups()); aGroupIt.More(); aGroupIt.Next())
{
const Handle(Graphic3d_Group)& aGroup = aGroupIt.Value();
if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_FILL_AREA))
{
aGroup->SetGroupPrimitivesAspect (anAreaAsp);
}
}
}
myRecomputeEveryPrs = Standard_False; // no mode to recalculate :only viewer update
myToRecomputeModes.Clear();
}
//=======================================================================
@@ -757,21 +775,33 @@ void AIS_Shape::setTransparency (const Handle(Prs3d_Drawer)& theDrawer,
void AIS_Shape::SetTransparency (const Standard_Real theValue)
{
const bool toRecompute = !myDrawer->HasOwnShadingAspect();
setTransparency (myDrawer, theValue);
myDrawer->SetTransparency ((Standard_ShortReal )theValue);
myRecomputeEveryPrs = false; // no mode to recalculate, only viewer update
// modify shading presentation without re-computation
const PrsMgr_Presentations& aPrsList = Presentations();
Handle(Graphic3d_AspectFillArea3d) anAreaAsp = myDrawer->ShadingAspect()->Aspect();
for (Standard_Integer aPrsIt = 1; aPrsIt <= aPrsList.Length(); ++aPrsIt)
{
const PrsMgr_ModedPresentation& aPrsModed = aPrsList.Value (aPrsIt);
if (aPrsModed.Mode() != AIS_Shaded)
{
continue;
}
const Handle(Prs3d_Presentation)& aPrs = aPrsModed.Presentation()->Presentation();
for (Graphic3d_SequenceOfGroup::Iterator aGroupIt (aPrs->Groups()); aGroupIt.More(); aGroupIt.Next())
{
const Handle(Graphic3d_Group)& aGroup = aGroupIt.Value();
if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_FILL_AREA))
{
aGroup->SetGroupPrimitivesAspect (anAreaAsp);
}
}
}
myRecomputeEveryPrs = Standard_False; // no mode to recalculate - only viewer update
myToRecomputeModes.Clear();
if (!toRecompute
|| !myDrawer->HasLink())
{
SynchronizeAspects();
}
else
{
replaceWithNewOwnAspects();
}
}
//=======================================================================
@@ -781,9 +811,6 @@ void AIS_Shape::SetTransparency (const Standard_Real theValue)
void AIS_Shape::UnsetTransparency()
{
myRecomputeEveryPrs = false; // no mode to recalculate, only viewer update
myToRecomputeModes.Clear();
myDrawer->SetTransparency (0.0f);
if (!myDrawer->HasOwnShadingAspect())
{
@@ -794,15 +821,36 @@ void AIS_Shape::UnsetTransparency()
|| myDrawer->ShadingAspect()->Aspect()->ToMapTexture())
{
myDrawer->ShadingAspect()->SetTransparency (0.0, myCurrentFacingModel);
SynchronizeAspects();
}
else
{
Graphic3d_MapOfAspectsToAspects aReplaceMap;
replaceAspectWithDef (aReplaceMap, ShadingAspect);
myDrawer->SetShadingAspect (Handle(Prs3d_ShadingAspect)());
replaceAspects (aReplaceMap);
}
// modify shading presentation without re-computation
const PrsMgr_Presentations& aPrsList = Presentations();
Handle(Graphic3d_AspectFillArea3d) anAreaAsp = myDrawer->ShadingAspect()->Aspect();
for (Standard_Integer aPrsIt = 1; aPrsIt <= aPrsList.Length(); ++aPrsIt)
{
const PrsMgr_ModedPresentation& aPrsModed = aPrsList.Value (aPrsIt);
if (aPrsModed.Mode() != AIS_Shaded)
{
continue;
}
const Handle(Prs3d_Presentation)& aPrs = aPrsModed.Presentation()->Presentation();
for (Graphic3d_SequenceOfGroup::Iterator aGroupIt (aPrs->Groups()); aGroupIt.More(); aGroupIt.Next())
{
const Handle(Graphic3d_Group)& aGroup = aGroupIt.Value();
if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_FILL_AREA))
{
aGroup->SetGroupPrimitivesAspect (anAreaAsp);
}
}
}
myRecomputeEveryPrs = Standard_False; // no mode to recalculate :only viewer update
myToRecomputeModes.Clear();
}
//=======================================================================

View File

@@ -316,9 +316,6 @@ protected:
Standard_EXPORT void setMaterial (const Handle(Prs3d_Drawer)& theDrawer, const Graphic3d_MaterialAspect& theMaterial, const Standard_Boolean theToKeepColor, const Standard_Boolean theToKeepTransp) const;
//! Replace aspects of already computed groups from drawer link by the new own value.
Standard_EXPORT void replaceWithNewOwnAspects();
public:
//! Compute HLR presentation for specified shape.

View File

@@ -218,6 +218,36 @@ void AIS_TexturedShape::SetColor (const Quantity_Color& theColor)
void AIS_TexturedShape::UnsetColor()
{
AIS_Shape::UnsetColor();
for (Standard_Integer aPrsIt = 1; aPrsIt <= Presentations().Length(); ++aPrsIt)
{
const PrsMgr_ModedPresentation& aPrsModed = Presentations().Value (aPrsIt);
if (aPrsModed.Mode() != 3)
continue;
Handle(Prs3d_Presentation) aPrs = aPrsModed.Presentation()->Presentation();
Handle(Graphic3d_Group) aGroup = Prs3d_Root::CurrentGroup (aPrs);
Handle(Graphic3d_AspectFillArea3d) anAreaAsp = myDrawer->Link()->ShadingAspect()->Aspect();
Handle(Graphic3d_AspectLine3d) aLineAsp = myDrawer->Link()->LineAspect()->Aspect();
Quantity_Color aColor;
AIS_GraphicTool::GetInteriorColor (myDrawer->Link(), aColor);
anAreaAsp->SetInteriorColor (aColor);
// Check if aspect of given type is set for the group,
// because setting aspect for group with no already set aspect
// can lead to loss of presentation data
if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_FILL_AREA))
{
aGroup->SetGroupPrimitivesAspect (anAreaAsp);
}
if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_LINE))
{
aGroup->SetGroupPrimitivesAspect (aLineAsp);
}
updateAttributes (aPrs);
}
}
//=======================================================================
@@ -347,6 +377,10 @@ void AIS_TexturedShape::updateAttributes (const Handle(Prs3d_Presentation)& theP
for (Graphic3d_SequenceOfGroup::Iterator aGroupIt (thePrs->Groups()); aGroupIt.More(); aGroupIt.Next())
{
const Handle(Graphic3d_Group)& aGroup = aGroupIt.Value();
if (!aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_FILL_AREA))
{
continue;
}
aGroup->SetGroupPrimitivesAspect (myAspect);
}
}

View File

@@ -108,7 +108,10 @@ void AIS_Triangulation::updatePresentation()
for (Graphic3d_SequenceOfGroup::Iterator aGroupIt (aPrs->Groups()); aGroupIt.More(); aGroupIt.Next())
{
const Handle(Graphic3d_Group)& aGroup = aGroupIt.Value();
aGroup->SetGroupPrimitivesAspect (anAreaAsp);
if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_FILL_AREA))
{
aGroup->SetGroupPrimitivesAspect (anAreaAsp);
}
}
}

View File

@@ -1182,29 +1182,6 @@ Standard_Boolean BRep_Tool::HasContinuity(const TopoDS_Edge& E)
return Standard_False;
}
//=======================================================================
//function : MaxContinuity
//purpose :
//=======================================================================
GeomAbs_Shape BRep_Tool::MaxContinuity (const TopoDS_Edge& theEdge)
{
GeomAbs_Shape aMaxCont = GeomAbs_C0;
for (BRep_ListIteratorOfListOfCurveRepresentation aReprIter ((*((Handle(BRep_TEdge)*)&theEdge.TShape()))->ChangeCurves());
aReprIter.More(); aReprIter.Next())
{
const Handle(BRep_CurveRepresentation)& aRepr = aReprIter.Value();
if (aRepr->IsRegularity())
{
const GeomAbs_Shape aCont = aRepr->Continuity();
if ((Standard_Integer )aCont > (Standard_Integer )aMaxCont)
{
aMaxCont = aCont;
}
}
}
return aMaxCont;
}
//=======================================================================
//function : Pnt
//purpose : Returns the 3d point.

View File

@@ -242,9 +242,6 @@ public:
//! Returns True if the edge has regularity on some
//! two surfaces
Standard_EXPORT static Standard_Boolean HasContinuity (const TopoDS_Edge& E);
//! Returns the max continuity of edge between some surfaces or GeomAbs_C0 if there no such surfaces.
Standard_EXPORT static GeomAbs_Shape MaxContinuity (const TopoDS_Edge& theEdge);
//! Returns the 3d point.
Standard_EXPORT static gp_Pnt Pnt (const TopoDS_Vertex& V);

View File

@@ -682,7 +682,7 @@ void BRepMesh_Delaun::cleanupMesh()
if ( anEdges[aCurEdgeIdx] != aFreeEdgeId )
continue;
for ( Standard_Integer anOtherEdgeIt = 1; anOtherEdgeIt <= 2 && isCanNotBeRemoved; ++anOtherEdgeIt )
for ( Standard_Integer anOtherEdgeIt = 1; anOtherEdgeIt <= 2; ++anOtherEdgeIt )
{
Standard_Integer anOtherEdgeId = ( aCurEdgeIdx + anOtherEdgeIt ) % 3;
const BRepMesh_PairOfIndex& anOtherEdgePair =
@@ -691,27 +691,7 @@ void BRepMesh_Delaun::cleanupMesh()
if ( anOtherEdgePair.Extent() < 2 )
{
isCanNotBeRemoved = Standard_False;
}
else
{
for (int aTriIdx = 1; aTriIdx <= anOtherEdgePair.Extent () && isCanNotBeRemoved; ++aTriIdx)
{
if (anOtherEdgePair.Index (aTriIdx) == aTriId)
continue;
Standard_Integer v[3];
const BRepMesh_Triangle& aCurTriangle = GetTriangle (anOtherEdgePair.Index (aTriIdx));
myMeshData->ElementNodes (aCurTriangle, v);
for (int aNodeIdx = 0; aNodeIdx < 3 && isCanNotBeRemoved; ++aNodeIdx)
{
if (v[aNodeIdx] == mySupVert[0] ||
v[aNodeIdx] == mySupVert[1] ||
v[aNodeIdx] == mySupVert[2])
{
isCanNotBeRemoved = Standard_False;
}
}
}
break;
}
}

View File

@@ -57,11 +57,8 @@ BRepMesh_ShapeVisitor::~BRepMesh_ShapeVisitor ()
//=======================================================================
void BRepMesh_ShapeVisitor::Visit(const TopoDS_Edge& theEdge)
{
if (!myDEdgeMap.IsBound (theEdge))
{
myModel->AddEdge (theEdge);
myDEdgeMap.Bind (theEdge, myModel->EdgesNb () - 1);
}
myModel->AddEdge(theEdge);
myDEdgeMap.Bind(theEdge, myModel->EdgesNb() - 1);
}
//=======================================================================

View File

@@ -179,8 +179,7 @@ static
const TopTools_MapOfShape& theEdgesInvalidByVertex,
const TopTools_MapOfShape& theMFHoles,
TopTools_IndexedMapOfShape& theMFInvInHole,
TopTools_ListOfShape& theInvFaces,
TopTools_ListOfShape& theInvertedFaces);
TopTools_ListOfShape& theInvFaces);
static
void FindFacesInsideHoleWires(const TopoDS_Face& theFOrigin,
@@ -239,8 +238,6 @@ static
TopTools_IndexedDataMapOfShapeListOfShape& theInvFaces,
const TopTools_DataMapOfShapeShape& theArtInvFaces,
const TopTools_IndexedMapOfShape& theInvEdges,
const TopTools_MapOfShape& theInvertedEdges,
const TopTools_ListOfShape& theInvertedFaces,
const TopTools_IndexedMapOfShape& theMFToCheckInt,
const TopTools_IndexedMapOfShape& theMFInvInHole,
const TopoDS_Shape& theFHoles,
@@ -261,7 +258,6 @@ static
const TopTools_DataMapOfShapeShape& theDMFImF,
const TopTools_IndexedMapOfShape& theMFInv,
const TopTools_IndexedMapOfShape& theInvEdges,
const TopTools_MapOfShape& theInvertedEdges,
TopTools_MapOfShape& theMFToRem);
static
@@ -600,21 +596,6 @@ static
void AppendToList(TopTools_ListOfShape& theL,
const TopoDS_Shape& theS);
template <class ContainerType, class FenceMapType>
static Standard_Boolean TakeModified(const TopoDS_Shape& theS,
const TopTools_DataMapOfShapeListOfShape& theImages,
ContainerType& theMapOut,
FenceMapType* theMFence);
template <class ContainerType>
static Standard_Boolean TakeModified(const TopoDS_Shape& theS,
const TopTools_DataMapOfShapeListOfShape& theImages,
ContainerType& theMapOut)
{
TopTools_MapOfShape* aDummy = NULL;
return TakeModified (theS, theImages, theMapOut, aDummy);
}
//=======================================================================
//function : BuildSplitsOfTrimmedFaces
//purpose : Building splits of already trimmed faces
@@ -1007,12 +988,6 @@ void BuildSplitsOfFaces(const TopTools_ListOfShape& theLF,
}
#endif
#ifdef OFFSET_DEBUG
// Show all obtained splits of faces
TopoDS_Compound aCFIm1;
BRep_Builder().MakeCompound(aCFIm1);
#endif
// Build Edge-Face connectivity map to find faces which removal
// may potentially lead to creation of the holes in the faces
// preventing from obtaining closed volume in the result
@@ -1022,12 +997,7 @@ void BuildSplitsOfFaces(const TopTools_ListOfShape& theLF,
{
TopTools_ListIteratorOfListOfShape itLFIm(theFImages(i));
for (; itLFIm.More(); itLFIm.Next())
{
TopExp::MapShapesAndAncestors(itLFIm.Value(), TopAbs_EDGE, TopAbs_FACE, anEFMap);
#ifdef OFFSET_DEBUG
BRep_Builder().Add(aCFIm1, itLFIm.Value());
#endif
}
}
TopTools_ListOfShape anEmptyList;
@@ -1036,8 +1006,6 @@ void BuildSplitsOfFaces(const TopTools_ListOfShape& theLF,
// all hole faces
TopoDS_Compound aFHoles;
aBB.MakeCompound(aFHoles);
// Find the faces containing only the inverted edges and the invalid ones
TopTools_ListOfShape anInvertedFaces;
// find invalid faces
// considering faces containing only invalid edges as invalid
aItLF.Initialize(aLFDone);
@@ -1076,7 +1044,7 @@ void BuildSplitsOfFaces(const TopTools_ListOfShape& theLF,
// find invalid faces
FindInvalidFaces(aLFImages, theInvEdges, theValidEdges, aDMFLVE, aDMFLIE,
*pLNE, *pLIVE, theInvertedEdges, aMEdgeInvalidByVertex,
aMFHoles, aMFInvInHole, aLFInv, anInvertedFaces);
aMFHoles, aMFInvInHole, aLFInv);
}
//
if (aLFInv.Extent()) {
@@ -1127,8 +1095,8 @@ void BuildSplitsOfFaces(const TopTools_ListOfShape& theLF,
//
// remove inside faces
TopTools_IndexedMapOfShape aMEInside;
RemoveInsideFaces(theFImages, theInvFaces, theArtInvFaces, theInvEdges, theInvertedEdges,
anInvertedFaces, aMFToCheckInt, aMFInvInHole, aFHoles, theSSInterfs,
RemoveInsideFaces(theFImages, theInvFaces, theArtInvFaces, theInvEdges,
aMFToCheckInt, aMFInvInHole, aFHoles, theSSInterfs,
aMERemoved, aMEInside, theSolids);
//
// make compound of valid splits
@@ -1851,8 +1819,7 @@ void FindInvalidFaces(TopTools_ListOfShape& theLFImages,
const TopTools_MapOfShape& theEdgesInvalidByVertex,
const TopTools_MapOfShape& theMFHoles,
TopTools_IndexedMapOfShape& theMFInvInHole,
TopTools_ListOfShape& theInvFaces,
TopTools_ListOfShape& theInvertedFaces)
TopTools_ListOfShape& theInvFaces)
{
// The face should be considered as invalid in the following cases:
// 1. It has been reverted, i.e. at least two not connected edges
@@ -1865,8 +1832,7 @@ void FindInvalidFaces(TopTools_ListOfShape& theLFImages,
// The face will be kept in the following cases:
// 1. Some of the edges are valid for this face.
Standard_Boolean bHasValid, bAllValid, bAllInvalid, bHasReallyInvalid, bAllInvNeutral;
Standard_Boolean bValid, bValidLoc, bInvalid, bInvalidLoc, bNeutral, bInverted;
Standard_Boolean bIsInvalidByInverted;
Standard_Boolean bValid, bValidLoc, bInvalid, bInvalidLoc, bNeutral;
Standard_Integer i, aNbChecked;
//
// neutral edges
@@ -1883,7 +1849,7 @@ void FindInvalidFaces(TopTools_ListOfShape& theLFImages,
aMEValInverted.Add(aItLE.Value());
}
//
Standard_Boolean bTreatInvertedAsInvalid = (theLFImages.Extent() == 1);
Standard_Boolean bCheckInverted = (theLFImages.Extent() == 1);
//
// neutral edges to remove
TopTools_IndexedMapOfShape aMENRem;
@@ -1917,7 +1883,6 @@ void FindInvalidFaces(TopTools_ListOfShape& theLFImages,
bAllInvalid = Standard_True;
bHasReallyInvalid = Standard_False;
bAllInvNeutral = Standard_True;
bIsInvalidByInverted = Standard_True;
aNbChecked = 0;
//
const TopoDS_Wire& aWIm = BRepTools::OuterWire(aFIm);
@@ -1944,19 +1909,17 @@ void FindInvalidFaces(TopTools_ListOfShape& theLFImages,
bNeutral = aMEN.Contains(aEIm);
bValidLoc = aMVE.Contains(aEIm);
//
bInverted = theMEInverted.Contains(aEIm);
if (!bInvalid && bTreatInvertedAsInvalid) {
bInvalid = bInverted;
if (!bInvalid && bCheckInverted) {
bInvalid = theMEInverted.Contains(aEIm);
}
//
if (bValidLoc && (bNeutral || aMEValInverted.Contains(aEIm))) {
bHasValid = Standard_True;
}
//
bAllValid &= bValidLoc;
bAllInvalid &= bInvalid;
bAllInvNeutral &= (bAllInvalid && bNeutral);
bIsInvalidByInverted &= (bInvalidLoc || bInverted);
bAllValid = bAllValid && bValidLoc;
bAllInvalid = bAllInvalid && bInvalid;
bAllInvNeutral = bAllInvNeutral && bAllInvalid && bNeutral;
}
//
if (!aNbChecked) {
@@ -1991,12 +1954,6 @@ void FindInvalidFaces(TopTools_ListOfShape& theLFImages,
continue;
}
//
if (bIsInvalidByInverted && !(bHasValid || bAllValid))
{
// The face contains only the inverted and locally invalid edges
theInvertedFaces.Append(aFIm);
}
if (!bAllInvNeutral) {
aLFPT.Append(aFIm);
}
@@ -2046,7 +2003,7 @@ void FindInvalidFaces(TopTools_ListOfShape& theLFImages,
bNeutral = aMEN.Contains(aEIm);
bValidLoc = aMVE.Contains(aEIm);
//
if (!bInvalid && bTreatInvertedAsInvalid) {
if (!bInvalid && bCheckInverted) {
bInvalid = theMEInverted.Contains(aEIm);
}
//
@@ -2916,8 +2873,6 @@ void RemoveInsideFaces(TopTools_IndexedDataMapOfShapeListOfShape& theFImages,
TopTools_IndexedDataMapOfShapeListOfShape& theInvFaces,
const TopTools_DataMapOfShapeShape& theArtInvFaces,
const TopTools_IndexedMapOfShape& theInvEdges,
const TopTools_MapOfShape& theInvertedEdges,
const TopTools_ListOfShape& theInvertedFaces,
const TopTools_IndexedMapOfShape& theMFToCheckInt,
const TopTools_IndexedMapOfShape& theMFInvInHole,
const TopoDS_Shape& theFHoles,
@@ -2977,9 +2932,6 @@ void RemoveInsideFaces(TopTools_IndexedDataMapOfShapeListOfShape& theFImages,
aMV.SetArguments(aLS);
aMV.SetIntersect(Standard_True);
aMV.Perform();
if (aMV.HasErrors())
return;
//
// get shapes connection for using in the rebuilding process
// for the cases in which some of the intersection left undetected
@@ -3064,21 +3016,19 @@ void RemoveInsideFaces(TopTools_IndexedDataMapOfShapeListOfShape& theFImages,
TopExp::MapShapes(aFIm, TopAbs_EDGE, aMEBoundary);
}
}
// Tool for getting the splits of faces
const TopTools_DataMapOfShapeListOfShape& aMVIms = aMV.Images();
//
// update invalid faces with images
aNb = aMFInv.Extent();
for (i = 1; i <= aNb; ++i) {
const TopoDS_Shape& aFInv = aMFInv(i);
TakeModified(aFInv, aMVIms, aMFInv);
const TopTools_ListOfShape& aLFInvIm = aMV.Modified(aFInv);
TopTools_ListIteratorOfListOfShape aItLFInvIm(aLFInvIm);
for (; aItLFInvIm.More(); aItLFInvIm.Next()) {
const TopoDS_Shape& aFInvIm = aItLFInvIm.Value();
aMFInv.Add(aFInvIm);
}
}
// Take into account the faces invalid by inverted edges
for (TopTools_ListOfShape::Iterator itLF(theInvertedFaces); itLF.More(); itLF.Next())
TakeModified(itLF.Value(), aMVIms, aMFInv);
//
// check if the invalid faces inside the holes are really invalid:
// check its normal direction - if it has changed relatively the
// original face the offset face is invalid and should be kept for rebuilding
@@ -3132,14 +3082,10 @@ void RemoveInsideFaces(TopTools_IndexedDataMapOfShapeListOfShape& theFImages,
//
if (aFS.Orientation() == TopAbs_INTERNAL) {
aMFToRem.Add(aFS);
continue;
}
if (aMFToRem.Contains(aFS))
continue;
bAllRemoved = false;
bAllInv &= aMFInv.Contains(aFS);
//
bAllRemoved = bAllRemoved && aMFToRem.Contains(aFS);
bAllInv = bAllInv && (aMFToRem.Contains(aFS) || aMFInv.Contains(aFS));
}
//
if (bAllInv && !bAllRemoved) {
@@ -3170,7 +3116,7 @@ void RemoveInsideFaces(TopTools_IndexedDataMapOfShapeListOfShape& theFImages,
}
// Remove the invalid hanging parts external to the solids
RemoveHangingParts(aMV, aDMFImF, aMFInv, theInvEdges, theInvertedEdges, aMFToRem);
RemoveHangingParts(aMV, aDMFImF, aMFInv, theInvEdges, aMFToRem);
// Remove newly found internal and hanging faces
RemoveValidSplits(aMFToRem, theFImages, aMV, theMERemoved);
@@ -3356,7 +3302,6 @@ void RemoveHangingParts(const BOPAlgo_MakerVolume& theMV,
const TopTools_DataMapOfShapeShape& theDMFImF,
const TopTools_IndexedMapOfShape& theMFInv,
const TopTools_IndexedMapOfShape& theInvEdges,
const TopTools_MapOfShape& theInvertedEdges,
TopTools_MapOfShape& theMFToRem)
{
// Map the faces of the result solids to filter them from avoided faces
@@ -3378,7 +3323,22 @@ void RemoveHangingParts(const BOPAlgo_MakerVolume& theMV,
for (; anExpF.More(); anExpF.Next())
{
const TopoDS_Shape& aF = anExpF.Current();
TakeModified(aF, aMVIms, aCFHangs, &aMFS);
const TopTools_ListOfShape* pLFIm = aMVIms.Seek(aF);
if (pLFIm)
{
TopTools_ListIteratorOfListOfShape aItLFIm(*pLFIm);
for (; aItLFIm.More(); aItLFIm.Next())
{
const TopoDS_Shape& aFIm = aItLFIm.Value();
if (!aMFS.Contains(aFIm))
aBB.Add(aCFHangs, aFIm);
}
}
else
{
if (!aMFS.Contains(aF))
aBB.Add(aCFHangs, aF);
}
}
}
@@ -3404,41 +3364,27 @@ void RemoveHangingParts(const BOPAlgo_MakerVolume& theMV,
// Update invalid edges with intersection results
TopTools_MapOfShape aMEInv;
Standard_Integer i, aNbE = theInvEdges.Extent();
for (i = 1; i <= aNbE; ++i)
TakeModified(theInvEdges(i), aMVIms, aMEInv);
// Update inverted edges with intersection results
TopTools_MapOfShape aMEInverted;
for (TopTools_MapIteratorOfMapOfShape itM(theInvertedEdges); itM.More(); itM.Next())
TakeModified(itM.Value(), aMVIms, aMEInverted);
for (i = 1; i <= aNbE; ++i) {
const TopoDS_Shape& aEInv = theInvEdges(i);
const TopTools_ListOfShape *pLEIm = aMVIms.Seek(aEInv);
if (pLEIm)
{
TopTools_ListIteratorOfListOfShape aItLEIm(*pLEIm);
for (; aItLEIm.More(); aItLEIm.Next())
aMEInv.Add(aItLEIm.Value());
}
else
aMEInv.Add(aEInv);
}
// Tool for getting the origins of the splits
const TopTools_DataMapOfShapeListOfShape& aMVOrs = theMV.Origins();
// Find hanging blocks to remove
TopTools_ListOfShape aBlocksToRemove;
TopTools_ListIteratorOfListOfShape aItLCBH(aLCBHangs);
for (; aItLCBH.More(); aItLCBH.Next())
{
const TopoDS_Shape& aCBH = aItLCBH.Value();
// Remove the block containing the inverted edges
Standard_Boolean bHasInverted = Standard_False;
TopExp_Explorer anExpE(aCBH, TopAbs_EDGE);
for (; anExpE.More() && !bHasInverted; anExpE.Next())
{
const TopoDS_Shape& aE = anExpE.Current();
bHasInverted = !aDMEF .Contains(aE) &&
aMEInverted.Contains(aE);
}
if (bHasInverted)
{
aBlocksToRemove.Append(aCBH);
continue;
}
// Check the block to contain invalid split
Standard_Boolean bHasInvalidFace = Standard_False;
// Check connectivity to invalid parts
@@ -3460,7 +3406,7 @@ void RemoveHangingParts(const BOPAlgo_MakerVolume& theMV,
if (!bIsConnected)
{
// check edges
anExpE.Init(aF, TopAbs_EDGE);
TopExp_Explorer anExpE(aF, TopAbs_EDGE);
for (; anExpE.More() && !bIsConnected; anExpE.Next())
{
const TopoDS_Shape& aE = anExpE.Current();
@@ -3473,20 +3419,17 @@ void RemoveHangingParts(const BOPAlgo_MakerVolume& theMV,
}
}
// check vertices
if (!bIsConnected)
TopExp_Explorer anExpV(aF, TopAbs_VERTEX);
for (; anExpV.More() && !bIsConnected; anExpV.Next())
{
TopExp_Explorer anExpV(aF, TopAbs_VERTEX);
for (; anExpV.More() && !bIsConnected; anExpV.Next())
const TopoDS_Shape& aV = anExpV.Current();
const TopTools_ListOfShape *pLE = aDMVE.Seek(aV);
if (pLE)
{
const TopoDS_Shape& aV = anExpV.Current();
const TopTools_ListOfShape *pLE = aDMVE.Seek(aV);
if (pLE)
{
TopTools_ListIteratorOfListOfShape aItLE(*pLE);
for (; aItLE.More() && !bIsConnected; aItLE.Next())
bIsConnected = !aBlockME.Contains(aItLE.Value()) &&
aMEInv .Contains(aItLE.Value());
}
TopTools_ListIteratorOfListOfShape aItLE(*pLE);
for (; aItLE.More() && !bIsConnected; aItLE.Next())
bIsConnected = !aBlockME.Contains(aItLE.Value()) &&
aMEInv .Contains(aItLE.Value());
}
}
}
@@ -3515,17 +3458,12 @@ void RemoveHangingParts(const BOPAlgo_MakerVolume& theMV,
(!bIsConnected || aMOffsetF.Extent() == 1);
if (bRemove)
aBlocksToRemove.Append(aCBH);
}
// remove the invalidated blocks
aItLCBH.Initialize(aBlocksToRemove);
for (; aItLCBH.More(); aItLCBH.Next())
{
const TopoDS_Shape& aCBH = aItLCBH.Value();
TopExp_Explorer anExpF(aCBH, TopAbs_FACE);
for (; anExpF.More(); anExpF.Next())
theMFToRem.Add(anExpF.Current());
{
// remove the block
anExpF.Init(aCBH, TopAbs_FACE);
for (; anExpF.More(); anExpF.Next())
theMFToRem.Add(anExpF.Current());
}
}
}
@@ -6986,16 +6924,13 @@ void UpdateImages(const TopTools_ListOfShape& theLA,
TopTools_MapOfShape& theModified)
{
TopTools_ListIteratorOfListOfShape aIt(theLA);
for (; aIt.More(); aIt.Next())
{
for (; aIt.More(); aIt.Next()) {
const TopoDS_Shape& aS = aIt.Value();
//
TopTools_ListOfShape* pLSIm = theImages.ChangeSeek(aS);
if (!pLSIm)
{
if (!pLSIm) {
const TopTools_ListOfShape& aLSIm = theGF.Modified(aS);
if (aLSIm.Extent())
{
if (aLSIm.Extent()) {
theImages.Bind(aS, aLSIm);
theModified.Add(aS);
}
@@ -7009,14 +6944,27 @@ void UpdateImages(const TopTools_ListOfShape& theLA,
//
// check modifications of the images
TopTools_ListIteratorOfListOfShape aIt1(*pLSIm);
for (; aIt1.More(); aIt1.Next())
{
for (; aIt1.More(); aIt1.Next()) {
const TopoDS_Shape& aSIm = aIt1.Value();
bModified |= TakeModified(aSIm, theGF.Images(), aLSImNew, &aMFence);
const TopTools_ListOfShape& aLSIm1 = theGF.Modified(aSIm);
if (aLSIm1.IsEmpty()) {
if (aMFence.Add(aSIm)) {
aLSImNew.Append(aSIm);
}
}
else {
TopTools_ListIteratorOfListOfShape aIt2(aLSIm1);
for (; aIt2.More(); aIt2.Next()) {
const TopoDS_Shape& aSImIm = aIt2.Value();
if (aMFence.Add(aSImIm)) {
aLSImNew.Append(aSImIm);
}
}
bModified = Standard_True;
}
}
//
if (bModified)
{
if (bModified) {
*pLSIm = aLSImNew;
theModified.Add(aS);
}
@@ -7151,61 +7099,3 @@ void AppendToList(TopTools_ListOfShape& theList,
}
theList.Append(theShape);
}
//=======================================================================
//function : AddToContainer
//purpose : Set of methods to add a shape into container
//=======================================================================
static void AddToContainer(const TopoDS_Shape& theS,
TopTools_ListOfShape& theList)
{
theList.Append(theS);
}
static Standard_Boolean AddToContainer(const TopoDS_Shape& theS,
TopTools_MapOfShape& theMap)
{
return theMap.Add(theS);
}
static Standard_Boolean AddToContainer(const TopoDS_Shape& theS,
TopTools_IndexedMapOfShape& theMap)
{
const Standard_Integer aNb = theMap.Extent();
const Standard_Integer anInd = theMap.Add(theS);
return anInd > aNb;
}
static void AddToContainer(const TopoDS_Shape& theS,
TopoDS_Shape& theSOut)
{
BRep_Builder().Add(theSOut, theS);
}
//=======================================================================
//function : TakeModified
//purpose : Check if the shape has images in the given images map.
// Puts in the output map either the images or the shape itself.
//=======================================================================
template <class ContainerType, class FenceMapType>
Standard_Boolean TakeModified(const TopoDS_Shape& theS,
const TopTools_DataMapOfShapeListOfShape& theImages,
ContainerType& theContainer,
FenceMapType* theMFence)
{
const TopTools_ListOfShape *pLSIm = theImages.Seek(theS);
if (pLSIm)
{
TopTools_ListIteratorOfListOfShape itLSIm(*pLSIm);
for (; itLSIm.More(); itLSIm.Next())
{
const TopoDS_Shape& aSIm = itLSIm.Value();
if (!theMFence || AddToContainer(aSIm, *theMFence))
AddToContainer(aSIm, theContainer);
}
return Standard_True;
}
else
{
if (!theMFence || AddToContainer(theS, *theMFence))
AddToContainer(theS, theContainer);
return Standard_False;
}
}

View File

@@ -83,7 +83,7 @@ public:
//! Transform the bounding box with the given transformation.
//! The resulting box will be larger if theTrsf contains rotation.
Standard_EXPORT Standard_NODISCARD Bnd_B2d Transformed (const gp_Trsf2d& theTrsf) const;
Standard_EXPORT Bnd_B2d Transformed (const gp_Trsf2d& theTrsf) const;
//! Check the given point for the inclusion in the Box.
//! Returns True if the point is outside.

View File

@@ -84,7 +84,7 @@ public:
//! Transform the bounding box with the given transformation.
//! The resulting box will be larger if theTrsf contains rotation.
Standard_EXPORT Standard_NODISCARD Bnd_B2f Transformed (const gp_Trsf2d& theTrsf) const;
Standard_EXPORT Bnd_B2f Transformed (const gp_Trsf2d& theTrsf) const;
//! Check the given point for the inclusion in the Box.
//! Returns True if the point is outside.

View File

@@ -84,7 +84,7 @@ public:
//! Transform the bounding box with the given transformation.
//! The resulting box will be larger if theTrsf contains rotation.
Standard_EXPORT Standard_NODISCARD Bnd_B3d Transformed (const gp_Trsf& theTrsf) const;
Standard_EXPORT Bnd_B3d Transformed (const gp_Trsf& theTrsf) const;
//! Check the given point for the inclusion in the Box.
//! Returns True if the point is outside.

View File

@@ -85,7 +85,7 @@ public:
//! Transform the bounding box with the given transformation.
//! The resulting box will be larger if theTrsf contains rotation.
Standard_EXPORT Standard_NODISCARD Bnd_B3f Transformed (const gp_Trsf& theTrsf) const;
Standard_EXPORT Bnd_B3f Transformed (const gp_Trsf& theTrsf) const;
//! Check the given point for the inclusion in the Box.
//! Returns True if the point is outside.

View File

@@ -213,7 +213,7 @@ public:
//! Applying a geometric transformation (for example, a
//! rotation) to a bounding box generally increases its
//! dimensions. This is not optimal for algorithms which use it.
Standard_EXPORT Standard_NODISCARD Bnd_Box Transformed (const gp_Trsf& T) const;
Standard_EXPORT Bnd_Box Transformed (const gp_Trsf& T) const;
//! Adds the box <Other> to <me>.
Standard_EXPORT void Add (const Bnd_Box& Other);

View File

@@ -160,7 +160,7 @@ public:
//! Applying a geometric transformation (for example, a
//! rotation) to a bounding box generally increases its
//! dimensions. This is not optimal for algorithms which use it.
Standard_EXPORT Standard_NODISCARD Bnd_Box2d Transformed (const gp_Trsf2d& T) const;
Standard_EXPORT Bnd_Box2d Transformed (const gp_Trsf2d& T) const;
//! Adds the 2d box <Other> to <me>.
Standard_EXPORT void Add (const Bnd_Box2d& Other);

View File

@@ -851,7 +851,7 @@ void ChFi3d_Builder::StartSol(const Handle(ChFiDS_Stripe)& Stripe,
PC->D1(woned, P1, derive);
// There are ponts on the border, and internal points are found
if (derive.Magnitude() > Precision::PConfusion()) {
derive.Normalize();
derive.Normalized();
derive.Rotate(M_PI/2);
AS.Initialize(f1);
ResU = AS.UResolution(TolE);

View File

@@ -128,7 +128,7 @@ Standard_Boolean Contap_ArcFunction::Derivative (const Standard_Real U,
dnorm = d2uv.Crossed(d1v) + d1u.Crossed(d2v);
dfv = (dnorm.Dot(myDir)-myCosAng*dnorm.Dot(norm))/myMean;
*/
norm.Normalize();
norm.Normalized();
dfu = (dnu.Dot(myDir)-myCosAng*dnu.Dot(norm))/myMean;
dfv = (dnv.Dot(myDir)-myCosAng*dnv.Dot(norm))/myMean;
}

View File

@@ -1291,43 +1291,42 @@ void DBRep::Set(const Standard_CString Name, const TopoDS_Shape& S)
Draw::Set(Name,D);
}
//=======================================================================
//function : getShape
//purpose :
//function : Get
//purpose :
//=======================================================================
TopoDS_Shape DBRep::getShape (Standard_CString& theName,
TopAbs_ShapeEnum theType,
Standard_Boolean theToComplain)
TopoDS_Shape DBRep::Get(Standard_CString& name,
const TopAbs_ShapeEnum typ,
const Standard_Boolean complain)
{
const Standard_Boolean toPick = theName[0] == '.';
Handle(DBRep_DrawableShape) aDrawable = Handle(DBRep_DrawableShape)::DownCast (Draw::Get (theName));
if (aDrawable.IsNull())
{
return TopoDS_Shape();
}
TopoDS_Shape aShape = aDrawable->Shape();
if (theType != TopAbs_SHAPE
&& theType != aShape.ShapeType()
&& toPick)
{
// try to find prom pick
Standard_Real u, v;
DBRep_DrawableShape::LastPick (aShape, u, v);
}
if (theType != TopAbs_SHAPE
&& theType != aShape.ShapeType())
{
if (theToComplain)
{
std::cout << theName << " is not a ";
TopAbs::Print (theType, std::cout);
std::cout << " but a ";
TopAbs::Print (aShape.ShapeType(), std::cout);
std::cout << std::endl;
Standard_Boolean pick = name[0] == '.';
TopoDS_Shape S;
Handle(DBRep_DrawableShape) D;
Handle(Draw_Drawable3D) DD = Draw::Get(name,complain);
if (!DD.IsNull())
D = Handle(DBRep_DrawableShape)::DownCast(DD);
if (!D.IsNull()) {
S = D->Shape();
if (typ != TopAbs_SHAPE) {
if (typ != S.ShapeType()) {
// try to find prom pick
if (pick) {
Standard_Real u,v;
DBRep_DrawableShape::LastPick(S,u,v);
}
}
if (typ != S.ShapeType()) {
if (complain) {
cout << name << " is not a ";
TopAbs::Print(typ,cout);
cout << " but a ";
TopAbs::Print(S.ShapeType(),cout);
cout << endl;
}
S = TopoDS_Shape();
}
}
return TopoDS_Shape();
}
return aShape;
return S;
}
static Standard_Integer XProgress (Draw_Interpretor& di, Standard_Integer argc, const char **argv)

View File

@@ -17,10 +17,23 @@
#ifndef _DBRep_HeaderFile
#define _DBRep_HeaderFile
#include <Draw_Interpretor.hxx>
#include <TCollection_AsciiString.hxx>
#include <Standard.hxx>
#include <Standard_DefineAlloc.hxx>
#include <Standard_Handle.hxx>
#include <Standard_CString.hxx>
#include <TopAbs_ShapeEnum.hxx>
#include <TopoDS_Shape.hxx>
#include <Standard_Boolean.hxx>
#include <Draw_Interpretor.hxx>
#include <Standard_Real.hxx>
#include <Standard_Integer.hxx>
class TopoDS_Shape;
class DBRep_Edge;
class DBRep_Face;
class DBRep_HideData;
class DBRep_DrawableShape;
class DBRep_IsoBuilder;
//! Used to display BRep objects using the DrawTrSurf
//! package.
@@ -41,46 +54,12 @@ public:
//! variable if already set.
Standard_EXPORT static void Set (const Standard_CString Name, const TopoDS_Shape& S);
//! Returns the shape in the variable.
//! @param theName [in] [out] variable name, or "." to pick up shape interactively (the picked name will be returned then)
//! @param theType [in] shape type filter; function will return NULL if shape has different type
//! @param theToComplain [in] when TRUE, prints a message on cout if the variable is not set
static TopoDS_Shape Get (Standard_CString& theName, TopAbs_ShapeEnum theType = TopAbs_SHAPE, Standard_Boolean theToComplain = Standard_False)
{
return getShape (theName, theType, theToComplain);
}
//! Returns the shape in the variable.
//! @param theName [in] [out] variable name, or "." to pick up shape interactively (the picked name will be returned then)
//! @param theType [in] shape type filter; function will return NULL if shape has different type
//! @param theToComplain [in] when TRUE, prints a message on cout if the variable is not set
static TopoDS_Shape Get (TCollection_AsciiString& theName, TopAbs_ShapeEnum theType = TopAbs_SHAPE, Standard_Boolean theToComplain = Standard_False)
{
Standard_CString aNamePtr = theName.ToCString();
TopoDS_Shape aShape = getShape (aNamePtr, theType, theToComplain);
if (aNamePtr != theName.ToCString())
{
theName = aNamePtr;
}
return aShape;
}
//! Returns the shape in the variable.
//! @param theName [in] variable name
//! @param theType [in] shape type filter; function will return NULL if shape has different type
//! @param theToComplain [in] when TRUE, prints a message on cout if the variable is not set
static TopoDS_Shape GetExisting (const TCollection_AsciiString& theName, TopAbs_ShapeEnum theType = TopAbs_SHAPE, Standard_Boolean theToComplain = Standard_False)
{
if (theName.Length() == 1
&& theName.Value (1) == '.')
{
return TopoDS_Shape();
}
Standard_CString aNamePtr = theName.ToCString();
return getShape (aNamePtr, theType, theToComplain);
}
//! Returns the shape in the variable <Name>. Returns
//! a null shape if the variable is not set or not of
//! the given <Typ>. If <Complain> is True a message
//! is printed on cout if the variable is not set.
Standard_EXPORT static TopoDS_Shape Get (Standard_CString& Name, const TopAbs_ShapeEnum Typ = TopAbs_SHAPE, const Standard_Boolean Complain = Standard_False);
//! Defines the basic commands.
Standard_EXPORT static void BasicCommands (Draw_Interpretor& theCommands);
@@ -107,16 +86,32 @@ public:
//! get progress indicator
Standard_EXPORT static Standard_Integer Discretisation();
protected:
//! Returns the shape in the variable.
//! @param theName [in] [out] variable name, or "." to pick up shape interactively (the picked name will be returned then)
//! @param theType [in] shape type filter; function will return NULL if shape has different type
//! @param theToComplain [in] when TRUE, prints a message on cout if the variable is not set
Standard_EXPORT static TopoDS_Shape getShape (Standard_CString& theName,
TopAbs_ShapeEnum theType,
Standard_Boolean theToComplain);
private:
friend class DBRep_Edge;
friend class DBRep_Face;
friend class DBRep_HideData;
friend class DBRep_DrawableShape;
friend class DBRep_IsoBuilder;
};
#endif // _DBRep_HeaderFile

View File

@@ -75,7 +75,7 @@ Standard_Boolean DDF::GetDF (Standard_CString& Name,
Handle(TDF_Data)& DF,
const Standard_Boolean Complain)
{
Handle(Standard_Transient) t = Draw::Get (Name);
Handle(Standard_Transient) t = Draw::Get(Name, Complain);
Handle(DDF_Data) DDF = Handle(DDF_Data)::DownCast (t);
//Handle(DDF_Data) DDF = Handle(DDF_Data)::DownCast (Draw::Get(Name, Complain));
if (!DDF.IsNull()) {

View File

@@ -103,12 +103,8 @@ static Standard_Integer DFOpenLabel (Draw_Interpretor& di,
{
if (n < 2) return 1;
Handle(DDF_Browser) browser = Handle(DDF_Browser)::DownCast (Draw::GetExisting (a[1]));
if (browser.IsNull())
{
std::cout << "Syntax error: browser '" << a[1] << "' not found\n";
return 1;
}
Handle(DDF_Browser) browser =
Handle(DDF_Browser)::DownCast (Draw::Get(a[1], Standard_True));
TDF_Label lab;
if (n == 3) TDF_Tool::Label(browser->Data(),a[2],lab);
@@ -132,12 +128,8 @@ static Standard_Integer DFOpenAttributeList(Draw_Interpretor& di,
{
if (n < 3) return 1;
Handle(DDF_Browser) browser = Handle(DDF_Browser)::DownCast (Draw::GetExisting (a[1]));
if (browser.IsNull())
{
std::cout << "Syntax error: browser '" << a[1] << "' not found\n";
return 1;
}
Handle(DDF_Browser) browser =
Handle(DDF_Browser)::DownCast (Draw::Get(a[1], Standard_True));
TDF_Label lab;
TDF_Tool::Label(browser->Data(),a[2],lab);
@@ -165,12 +157,8 @@ static Standard_Integer DFOpenAttribute (Draw_Interpretor& di,
{
if (n < 3) return 1;
Handle(DDF_Browser) browser = Handle(DDF_Browser)::DownCast (Draw::GetExisting (a[1]));
if (browser.IsNull())
{
std::cout << "Syntax error: browser '" << a[1] << "' not found\n";
return 1;
}
Handle(DDF_Browser) browser =
Handle(DDF_Browser)::DownCast (Draw::Get(a[1], Standard_True));
const Standard_Integer index = Draw::Atoi(a[2]);
TCollection_AsciiString list = browser->OpenAttribute(index);

View File

@@ -86,26 +86,18 @@ static Standard_Integer DDataStd_PNT (Draw_Interpretor& di,
//purpose : Rmdraw (name)
//=======================================================================
static Standard_Integer DDataStd_Rmdraw (Draw_Interpretor& ,
static Standard_Integer DDataStd_Rmdraw (Draw_Interpretor& di,
Standard_Integer nb,
const char** arg)
{
if (nb != 2)
{
std::cout << "Syntax error: wrong number of arguments\n";
return 1;
}
if (Handle(Draw_Drawable3D) D3D = Draw::Get (arg[1]))
{
dout.RemoveDrawable (D3D);
if (nb == 2) {
Handle(Draw_Drawable3D) D3D;
D3D = Draw::Get(arg[1],Standard_True);
if (!D3D.IsNull()) dout.RemoveDrawable(D3D);
return 0;
}
else
{
std::cout << "Syntax error: variable '" << arg[1] << "' not found\n";
return 1;
}
di << "DDataStd_Rmdraw : Error : not done\n";
return 1;
}
//=======================================================================

View File

@@ -347,12 +347,8 @@ static Standard_Integer DDataStd_OpenNode (Draw_Interpretor& di,
{
if (n < 2) return 1;
Handle(DDataStd_TreeBrowser) browser = Handle(DDataStd_TreeBrowser)::DownCast (Draw::GetExisting (a[1]));
if (browser.IsNull())
{
std::cout << "Syntax error: browser '" << a[1] << "' not found\n";
return 1;
}
Handle(DDataStd_TreeBrowser) browser =
Handle(DDataStd_TreeBrowser)::DownCast (Draw::Get(a[1], Standard_True));
TDF_Label lab;
if (n == 3) TDF_Tool::Label(browser->Label().Data(),a[2],lab);

View File

@@ -71,7 +71,10 @@ Standard_Boolean DDocStd::GetDocument (Standard_CString& Name,
Handle(TDocStd_Document)& DOC,
const Standard_Boolean Complain)
{
Handle(DDocStd_DrawDocument) DD = Handle(DDocStd_DrawDocument)::DownCast (Draw::GetExisting (Name));
Handle(Draw_Drawable3D) D = Draw::Get(Name,Standard_False);
Handle(DDocStd_DrawDocument) DD = Handle(DDocStd_DrawDocument)::DownCast (D);
if (DD.IsNull()) {
if (Complain) cout << Name << " is not a Document" << endl;
return Standard_False;

View File

@@ -348,10 +348,8 @@ static Standard_Integer DDocStd_Close (Draw_Interpretor& /*theDI*/,
aDocApp->Close (aDoc);
if (Handle(Draw_Drawable3D) aDrawable = Draw::GetExisting (aDocName))
{
dout.RemoveDrawable (aDrawable);
}
Handle(Draw_Drawable3D) aDrawable = Draw::Get (aDocName, Standard_False);
dout.RemoveDrawable (aDrawable);
Draw::Set (theArgVec[1], Handle(Draw_Drawable3D)());
return 0;
}

View File

@@ -206,19 +206,20 @@ static int mtmNestedMode (Draw_Interpretor& di, int n, const char** a)
static Standard_Integer XAttributeValue (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
{
if ( argc < 4 ) { di << "ERROR: Too few args\n"; return 1; }
Handle(DDF_Browser) browser = Handle(DDF_Browser)::DownCast (Draw::GetExisting (argv[1]));
if ( browser.IsNull() ) { std::cout << "Syntax error: Not a browser: " << argv[1] << "\n"; return 1; }
if ( argc <4 ) { di << "ERROR: Too few args\n"; return 0; }
Handle(DDF_Browser) browser =
Handle(DDF_Browser)::DownCast (Draw::Get(argv[1], Standard_True));
if ( browser.IsNull() ) { di << "ERROR: Not a browser: " << argv[1] << "\n"; return 0; }
TDF_Label lab;
TDF_Tool::Label(browser->Data(),argv[2],lab);
if ( lab.IsNull() ) { di << "Syntax error: label is Null: " << argv[2] << "\n"; return 1; }
if ( lab.IsNull() ) { di << "ERROR: label is Null: " << argv[2] << "\n"; return 0; }
Standard_Integer num = Draw::Atoi ( argv[3] );
TDF_AttributeIterator itr(lab,Standard_False);
for (Standard_Integer i=1; itr.More() && i < num; i++) itr.Next();
if ( ! itr.More() ) { di << "Syntax error: Attribute #" << num << " not found\n"; return 1; }
if ( ! itr.More() ) { di << "ERROR: Attribute #" << num << " not found\n"; return 0; }
const Handle(TDF_Attribute)& att = itr.Value();
if ( att->IsKind(STANDARD_TYPE(TDataStd_TreeNode)) )

View File

@@ -132,7 +132,7 @@ static Standard_Integer DNaming_TCopyShape (Draw_Interpretor& di,
DNaming_DataMapIteratorOfDataMapOfShapeOfName itrn(aDMapOfShapeOfName);
for(;itrn.More();itrn.Next()) {
TCollection_AsciiString name = itrn.Value();
const TopoDS_Shape Result = TR.Copied(itrn.Key());
const TopoDS_Shape& Result = TR.Copied(itrn.Key());
DBRep::Set(name.ToCString(), Result);
di.AppendElement(name.ToCString());
}

View File

@@ -73,18 +73,16 @@ public:
//! Returns main DRAW interpretor.
Standard_EXPORT static Draw_Interpretor& GetInterpretor();
//! Returns a variable value.
//! The name "." does a graphic selection; in this case theName will be is overwritten with the name of the variable.
static Handle(Draw_Drawable3D) Get (Standard_CString& theName) { return getDrawable (theName, Standard_True); }
//! Returns a variable value.
static Handle(Draw_Drawable3D) GetExisting (const Standard_CString& theName)
{
Standard_CString aName = theName;
return getDrawable (aName, Standard_False);
}
//! Returns a variable value. Null if the variable
//! does not exist, a warning is printed if Complain
//! is True.
//!
//! The name "." does a graphic selection. If the
//! selection is a variable <Name> is overwritten with
//! the name of the variable.
Standard_EXPORT static Handle(Draw_Drawable3D) Get (Standard_CString& Name, const Standard_Boolean Complain = Standard_True);
//! Gets a numeric variable. Returns True if the
//! variable exist.
Standard_EXPORT static Standard_Boolean Get (const Standard_CString Name, Standard_Real& val);
@@ -131,16 +129,20 @@ public:
//! Defines Draw unit commands
Standard_EXPORT static void UnitCommands (Draw_Interpretor& I);
protected:
//! Returns a variable value.
//! @param theName [in] [out] variable name, or "." to activate picking
//! @param theToAllowPick [in] when TRUE, "." name will activate picking
Standard_EXPORT static Handle(Draw_Drawable3D) getDrawable (Standard_CString& theName,
Standard_Boolean theToAllowPick);
private:
friend class Draw_Drawable3D;
friend class Draw_Drawable2D;
friend class Draw_Color;

View File

@@ -627,7 +627,7 @@ static Standard_Integer dgetenv(Draw_Interpretor& di, Standard_Integer argc, con
static Standard_Integer isdraw(Draw_Interpretor& di, Standard_Integer n, const char** a)
{
if (n != 2) return 1;
Handle(Draw_Drawable3D) D = Draw::Get (a[1]);
Handle(Draw_Drawable3D) D = Draw::Get(a[1],Standard_False);
if (D.IsNull())
di << "0";
else
@@ -643,7 +643,7 @@ static Standard_Integer isdraw(Draw_Interpretor& di, Standard_Integer n, const c
Standard_Integer isprot(Draw_Interpretor& di, Standard_Integer n, const char** a)
{
if (n != 2) return 1;
Handle(Draw_Drawable3D) D = Draw::Get(a[1]);
Handle(Draw_Drawable3D) D = Draw::Get(a[1],Standard_False);
if (D.IsNull())
di << "0";
else {
@@ -814,63 +814,75 @@ void Draw::Set(const Standard_CString name,
//function : Set
//purpose :
//=======================================================================
void Draw::Set(const Standard_CString theName, const Standard_Real theValue)
void Draw::Set(const Standard_CString Name, const Standard_Real val)
{
if (Handle(Draw_Number) aNumber = Handle(Draw_Number)::DownCast (Draw::GetExisting (theName)))
{
aNumber->Value (theValue);
if ((Name[0] == '.') && (Name[1] == '\0')) return;
Standard_CString aName = Name;
Handle(Draw_Drawable3D) D = Draw::Get(aName,Standard_False);
Handle(Draw_Number) N;
if (!D.IsNull()) {
N = Handle(Draw_Number)::DownCast(D);
}
if (N.IsNull()) {
N = new Draw_Number(val);
Draw::Set(aName,N,Standard_False);
}
else
{
aNumber = new Draw_Number (theValue);
Draw::Set (theName, aNumber, Standard_False);
}
N->Value(val);
}
//=======================================================================
//function : getDrawable
//purpose :
//function : Get
//purpose :
//=======================================================================
Handle(Draw_Drawable3D) Draw::getDrawable (Standard_CString& theName,
Standard_Boolean theToAllowPick)
Handle(Draw_Drawable3D) Draw::Get(Standard_CString& name,
const Standard_Boolean )
{
const Standard_Boolean toPick = ((theName[0] == '.') && (theName[1] == '\0'));
if (!toPick)
{
ClientData aCD = Tcl_VarTraceInfo (Draw::GetInterpretor().Interp(), theName, TCL_TRACE_UNSETS | TCL_TRACE_WRITES, tracevar, NULL);
Handle(Draw_Drawable3D) aDrawable = reinterpret_cast<Draw_Drawable3D*>(aCD);
return theVariables.Contains (aDrawable)
? aDrawable
: Handle(Draw_Drawable3D)();
Standard_Boolean pick = ((name[0] == '.') && (name[1] == '\0'));
Handle(Draw_Drawable3D) D;
if (pick) {
cout << "Pick an object" << endl;
dout.Select(p_id,p_X,p_Y,p_b);
dout.Pick(p_id,p_X,p_Y,5,D,0);
if (!D.IsNull()) {
if (D->Name()) {
name = p_Name = D->Name();
//p_Name = (char *)D->Name();
}
}
}
else if (!theToAllowPick)
{
return Handle(Draw_Drawable3D)();
else {
ClientData aCD =
Tcl_VarTraceInfo(Draw::GetInterpretor().Interp(),name,TCL_TRACE_UNSETS | TCL_TRACE_WRITES,
tracevar, NULL);
D = reinterpret_cast<Draw_Drawable3D*>(aCD);
if (!theVariables.Contains(D))
D.Nullify();
#if 0
if (D.IsNull() && complain)
cout <<name<<" does not exist"<<endl;
#endif
}
std::cout << "Pick an object" << std::endl;
Handle(Draw_Drawable3D) aDrawable;
dout.Select (p_id, p_X, p_Y, p_b);
dout.Pick (p_id, p_X, p_Y, 5, aDrawable, 0);
if (!aDrawable.IsNull()
&& aDrawable->Name() != NULL)
{
theName = p_Name = aDrawable->Name();
}
return aDrawable;
return D;
}
//=======================================================================
//function : Get
//purpose :
//=======================================================================
Standard_Boolean Draw::Get (const Standard_CString theName,
Standard_Real& theValue)
Standard_Boolean Draw::Get(const Standard_CString name,
Standard_Real& val)
{
if (Handle(Draw_Number) aNumber = Handle(Draw_Number)::DownCast (Draw::GetExisting (theName)))
{
theValue = aNumber->Value();
return Standard_True;
if ((name[0] == '.') && (name[1] == '\0')) {
return Standard_False;
}
Standard_CString aName = name;
Handle(Draw_Drawable3D) D = Draw::Get(aName,Standard_False);
if (!D.IsNull()) {
Handle(Draw_Number) N = Handle(Draw_Number)::DownCast(D);
if (!N.IsNull()) {
val = N->Value();
return Standard_True;
}
}
return Standard_False;
}

View File

@@ -2731,13 +2731,14 @@ proc _checkpoint {coord_x coord_y rd_ch gr_ch bl_ch} {
# the check fails and procedure raises error with specified message.
#
# Otherwise the procedure returns false meaning that more iterations are needed.
# Note that false is returned in any case if length of listval is less than 3.
# Note that analysis is peformed only if listval contains at least 5 values,
# thus false is returned unconditionally for shorter lists.
#
# See example of use to check memory leaks in bugs/caf/bug23489
#
proc checktrend {listval delta tolerance message} {
set nbval [llength $listval]
if { $nbval < 3} {
if { $nbval < 5} {
return 0
}

View File

@@ -55,11 +55,12 @@ void DsgPrs::ComputeSymbol (const Handle(Prs3d_Presentation)& aPresentation,
const DsgPrs_ArrowSide ArrowSide,
const Standard_Boolean drawFromCenter)
{
Handle(Graphic3d_Group) aGroup = aPresentation->NewGroup();
Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
Quantity_Color aColor = LA->LineAspect()->Aspect()->Color();
Handle(Graphic3d_AspectMarker3d) aMarkerAsp = new Graphic3d_AspectMarker3d (Aspect_TOM_O, aColor, 1.0);
aGroup->SetGroupPrimitivesAspect (LA->LineAspect()->Aspect());
Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect (aMarkerAsp);
Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
switch(ArrowSide) {
case DsgPrs_AS_NONE:
@@ -68,7 +69,7 @@ void DsgPrs::ComputeSymbol (const Handle(Prs3d_Presentation)& aPresentation,
}
case DsgPrs_AS_FIRSTAR:
{
Prs3d_Arrow::Draw (aGroup,
Prs3d_Arrow::Draw(Prs3d_Root::CurrentGroup (aPresentation),
pt1,
dir1,
LA->ArrowAspect()->Angle(),
@@ -78,7 +79,7 @@ void DsgPrs::ComputeSymbol (const Handle(Prs3d_Presentation)& aPresentation,
case DsgPrs_AS_LASTAR:
{
Prs3d_Arrow::Draw (aGroup,
Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPresentation),
pt2,
dir2,
LA->ArrowAspect()->Angle(),
@@ -88,12 +89,12 @@ void DsgPrs::ComputeSymbol (const Handle(Prs3d_Presentation)& aPresentation,
case DsgPrs_AS_BOTHAR:
{
Prs3d_Arrow::Draw (aGroup,
Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPresentation),
pt1,
dir1,
LA->ArrowAspect()->Angle(),
LA->ArrowAspect()->Length());
Prs3d_Arrow::Draw (aGroup,
Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPresentation),
pt2,
dir2,
LA->ArrowAspect()->Angle(),
@@ -126,11 +127,15 @@ void DsgPrs::ComputeSymbol (const Handle(Prs3d_Presentation)& aPresentation,
{
if(drawFromCenter)
{
Handle(Graphic3d_ArrayOfPoints) anArrayOfPoints1 = new Graphic3d_ArrayOfPoints (2);
Handle(Graphic3d_ArrayOfPoints) anArrayOfPoints1 = new Graphic3d_ArrayOfPoints (1);
anArrayOfPoints1->AddVertex (pt1.X(), pt1.Y(), pt1.Z());
anArrayOfPoints1->AddVertex (pt2.X(), pt2.Y(), pt2.Z());
aGroup->SetGroupPrimitivesAspect (aMarkerAsp);
aGroup->AddPrimitiveArray (anArrayOfPoints1);
Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray (anArrayOfPoints1);
}
if(drawFromCenter)
{
Handle(Graphic3d_ArrayOfPoints) anArrayOfPoints2 = new Graphic3d_ArrayOfPoints (1);
anArrayOfPoints2->AddVertex (pt2.X(), pt2.Y(), pt2.Z());
Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray (anArrayOfPoints2);
}
break;
}
@@ -138,7 +143,7 @@ void DsgPrs::ComputeSymbol (const Handle(Prs3d_Presentation)& aPresentation,
case DsgPrs_AS_FIRSTAR_LASTPT:
{
// an Arrow
Prs3d_Arrow::Draw (aGroup,
Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPresentation),
pt1,
dir1,
LA->ArrowAspect()->Angle(),
@@ -146,28 +151,25 @@ void DsgPrs::ComputeSymbol (const Handle(Prs3d_Presentation)& aPresentation,
// a Round
Handle(Graphic3d_ArrayOfPoints) anArrayOfPoints = new Graphic3d_ArrayOfPoints (1);
anArrayOfPoints->AddVertex (pt2.X(), pt2.Y(), pt2.Z());
aGroup->SetPrimitivesAspect (aMarkerAsp);
aGroup->AddPrimitiveArray (anArrayOfPoints);
Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray (anArrayOfPoints);
break;
}
case DsgPrs_AS_FIRSTPT_LASTAR:
{
// a Round
if(drawFromCenter)
{
Handle(Graphic3d_ArrayOfPoints) anArrayOfPoints = new Graphic3d_ArrayOfPoints (1);
anArrayOfPoints->AddVertex (pt1.X(), pt1.Y(), pt1.Z());
Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray (anArrayOfPoints);
}
// an Arrow
Prs3d_Arrow::Draw (aGroup,
Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPresentation),
pt2,
dir2,
LA->ArrowAspect()->Angle(),
LA->ArrowAspect()->Length());
// a Round
if (drawFromCenter)
{
Handle(Graphic3d_ArrayOfPoints) anArrayOfPoints = new Graphic3d_ArrayOfPoints (1);
anArrayOfPoints->AddVertex (pt1.X(), pt1.Y(), pt1.Z());
aGroup->SetPrimitivesAspect (aMarkerAsp);
aGroup->AddPrimitiveArray (anArrayOfPoints);
}
break;
}
}

View File

@@ -162,14 +162,13 @@ void Extrema_ExtPElS::Perform(const gp_Pnt& P,
myDone = Standard_True;
return;
}
gp_Vec DirZ;
if (M.SquareDistance(O) < Tol * Tol)
{
DirZ = (A < 0 ? -OZ : OZ);
}
else
DirZ = gp_Vec(M, O);
gp_Vec DirZ;
if (M.SquareDistance(O)<Tol * Tol)
{ DirZ=OZ;
if( A<0) DirZ.Multiplied(-1.);
}
else
DirZ=gp_Vec(M,O);
// Projection of P in the reference plane of the cone ...
Standard_Real Zp = gp_Vec(O, P).Dot(OZ);

View File

@@ -155,7 +155,7 @@ FEmTool_ProfileMatrix::FEmTool_ProfileMatrix(const TColStd_Array1OfInteger& Firs
Standard_Real * x = &X(X.Lower());
x--;
const Standard_Real * b = &B(B.Lower());
Standard_Real * b = &B(B.Lower());
b--;
const Standard_Real * SMA = &SMatrix->Value(1);
SMA --;
@@ -207,7 +207,7 @@ FEmTool_ProfileMatrix::FEmTool_ProfileMatrix(const TColStd_Array1OfInteger& Firs
Standard_Integer i, j, jj, DiagAddr, CurrAddr;
Standard_Real * m = &MX(MX.Lower());
m--;
const Standard_Real * x = &X(X.Lower());
Standard_Real * x = &X(X.Lower());
x--;
const Standard_Real * PM = &ProfileMatrix->Value(1);
PM--;

View File

@@ -65,7 +65,7 @@ public:
Standard_EXPORT void Reverse();
//! Returns a copy of <me> reversed.
Standard_EXPORT Standard_NODISCARD Handle(Geom_Axis1Placement) Reversed() const;
Standard_EXPORT Handle(Geom_Axis1Placement) Reversed() const;
//! Assigns V to the unit vector of this axis.
Standard_EXPORT void SetDirection (const gp_Dir& V) Standard_OVERRIDE;

View File

@@ -117,7 +117,7 @@ public:
Standard_EXPORT virtual Standard_Real ParametricTransformation (const gp_Trsf& T) const;
//! Returns a copy of <me> reversed.
Standard_EXPORT Standard_NODISCARD Handle(Geom_Curve) Reversed() const;
Standard_EXPORT Handle(Geom_Curve) Reversed() const;
//! Returns the value of the first parameter.
//! Warnings :

View File

@@ -99,21 +99,21 @@ public:
//! (see class Transformation of the package Geom).
Standard_EXPORT virtual void Transform (const gp_Trsf& T) = 0;
Standard_EXPORT Standard_NODISCARD Handle(Geom_Geometry) Mirrored (const gp_Pnt& P) const;
Standard_EXPORT Handle(Geom_Geometry) Mirrored (const gp_Pnt& P) const;
Standard_EXPORT Standard_NODISCARD Handle(Geom_Geometry) Mirrored (const gp_Ax1& A1) const;
Standard_EXPORT Handle(Geom_Geometry) Mirrored (const gp_Ax1& A1) const;
Standard_EXPORT Standard_NODISCARD Handle(Geom_Geometry) Mirrored (const gp_Ax2& A2) const;
Standard_EXPORT Handle(Geom_Geometry) Mirrored (const gp_Ax2& A2) const;
Standard_EXPORT Standard_NODISCARD Handle(Geom_Geometry) Rotated (const gp_Ax1& A1, const Standard_Real Ang) const;
Standard_EXPORT Handle(Geom_Geometry) Rotated (const gp_Ax1& A1, const Standard_Real Ang) const;
Standard_EXPORT Standard_NODISCARD Handle(Geom_Geometry) Scaled (const gp_Pnt& P, const Standard_Real S) const;
Standard_EXPORT Handle(Geom_Geometry) Scaled (const gp_Pnt& P, const Standard_Real S) const;
Standard_EXPORT Standard_NODISCARD Handle(Geom_Geometry) Transformed (const gp_Trsf& T) const;
Standard_EXPORT Handle(Geom_Geometry) Transformed (const gp_Trsf& T) const;
Standard_EXPORT Standard_NODISCARD Handle(Geom_Geometry) Translated (const gp_Vec& V) const;
Standard_EXPORT Handle(Geom_Geometry) Translated (const gp_Vec& V) const;
Standard_EXPORT Standard_NODISCARD Handle(Geom_Geometry) Translated (const gp_Pnt& P1, const gp_Pnt& P2) const;
Standard_EXPORT Handle(Geom_Geometry) Translated (const gp_Pnt& P1, const gp_Pnt& P2) const;
//! Creates a new object which is a copy of this geometric object.
Standard_EXPORT virtual Handle(Geom_Geometry) Copy() const = 0;

View File

@@ -79,7 +79,7 @@ public:
//! Reverses the U direction of parametrization of <me>.
//! The bounds of the surface are not modified.
//! A copy of <me> is returned.
Standard_EXPORT Standard_NODISCARD Handle(Geom_Surface) UReversed() const;
Standard_EXPORT Handle(Geom_Surface) UReversed() const;
//! Returns the parameter on the Ureversed surface for
//! the point of parameter U on <me>.
@@ -100,7 +100,7 @@ public:
//! Reverses the V direction of parametrization of <me>.
//! The bounds of the surface are not modified.
//! A copy of <me> is returned.
Standard_EXPORT Standard_NODISCARD Handle(Geom_Surface) VReversed() const;
Standard_EXPORT Handle(Geom_Surface) VReversed() const;
//! Returns the parameter on the Vreversed surface for
//! the point of parameter V on <me>.

View File

@@ -160,12 +160,12 @@ public:
//! Raised if the the transformation is singular. This means that
//! the ScaleFactor is lower or equal to Resolution from
//! package gp.
Standard_EXPORT Standard_NODISCARD Handle(Geom_Transformation) Inverted() const;
Standard_EXPORT Handle(Geom_Transformation) Inverted() const;
//! Computes the transformation composed with Other and <me>.
//! <me> * Other.
//! Returns a new transformation
Standard_EXPORT Standard_NODISCARD Handle(Geom_Transformation) Multiplied (const Handle(Geom_Transformation)& Other) const;
Standard_EXPORT Handle(Geom_Transformation) Multiplied (const Handle(Geom_Transformation)& Other) const;
//! Computes the transformation composed with Other and <me> .
//! <me> = <me> * Other.

View File

@@ -47,7 +47,7 @@ public:
//! Returns a copy of <me> reversed.
Standard_EXPORT Standard_NODISCARD Handle(Geom_Vector) Reversed() const;
Standard_EXPORT Handle(Geom_Vector) Reversed() const;
//! Computes the angular value, in radians, between this
//! vector and vector Other. The result is a value between 0 and Pi.

View File

@@ -80,7 +80,7 @@ public:
//! Adds the vector Other to <me>.
Standard_EXPORT Standard_NODISCARD Handle(Geom_VectorWithMagnitude) Added (const Handle(Geom_Vector)& Other) const;
Standard_EXPORT Handle(Geom_VectorWithMagnitude) Added (const Handle(Geom_Vector)& Other) const;
//! Computes the cross product between <me> and Other
@@ -106,12 +106,12 @@ public:
//! Divides <me> by a scalar. A new vector is returned.
Standard_EXPORT Standard_NODISCARD Handle(Geom_VectorWithMagnitude) Divided (const Standard_Real Scalar) const;
Standard_EXPORT Handle(Geom_VectorWithMagnitude) Divided (const Standard_Real Scalar) const;
//! Computes the product of the vector <me> by a scalar.
//! A new vector is returned.
Standard_EXPORT Standard_NODISCARD Handle(Geom_VectorWithMagnitude) Multiplied (const Standard_Real Scalar) const;
Standard_EXPORT Handle(Geom_VectorWithMagnitude) Multiplied (const Standard_Real Scalar) const;
//! Computes the product of the vector <me> by a scalar.
@@ -127,15 +127,14 @@ public:
//!
//! Raised if the magnitude of the vector is lower or equal to
//! Resolution from package gp.
Standard_EXPORT Standard_NODISCARD Handle(Geom_VectorWithMagnitude) Normalized() const;
Standard_EXPORT Handle(Geom_VectorWithMagnitude) Normalized() const;
//! Subtracts the Vector Other to <me>.
Standard_EXPORT void Subtract (const Handle(Geom_Vector)& Other);
//! Subtracts the vector Other to <me>. A new vector is returned.
Standard_EXPORT Standard_NODISCARD
Handle(Geom_VectorWithMagnitude) Subtracted (const Handle(Geom_Vector)& Other) const;
Standard_EXPORT Handle(Geom_VectorWithMagnitude) Subtracted (const Handle(Geom_Vector)& Other) const;
//! Applies the transformation T to this vector.
Standard_EXPORT void Transform (const gp_Trsf& T) Standard_OVERRIDE;

View File

@@ -64,7 +64,7 @@ public:
//! Note:
//! - Reverse assigns the result to this axis, while
//! - Reversed creates a new one.
Standard_EXPORT Standard_NODISCARD Handle(Geom2d_AxisPlacement) Reversed() const;
Standard_EXPORT Handle(Geom2d_AxisPlacement) Reversed() const;
//! Changes the complete definition of the axis placement.
Standard_EXPORT void SetAxis (const gp_Ax2d& A);

View File

@@ -110,7 +110,7 @@ public:
//! - the end point of the initial curve becomes the start
//! point of the reversed curve.
//! - Reversed creates a new curve.
Standard_EXPORT Standard_NODISCARD Handle(Geom2d_Curve) Reversed() const;
Standard_EXPORT Handle(Geom2d_Curve) Reversed() const;
//! Returns the value of the first parameter.
//! Warnings :

View File

@@ -94,19 +94,19 @@ public:
//! itself. A copy of the object is returned.
Standard_EXPORT virtual void Transform (const gp_Trsf2d& T) = 0;
Standard_EXPORT Standard_NODISCARD Handle(Geom2d_Geometry) Mirrored (const gp_Pnt2d& P) const;
Standard_EXPORT Handle(Geom2d_Geometry) Mirrored (const gp_Pnt2d& P) const;
Standard_EXPORT Standard_NODISCARD Handle(Geom2d_Geometry) Mirrored (const gp_Ax2d& A) const;
Standard_EXPORT Handle(Geom2d_Geometry) Mirrored (const gp_Ax2d& A) const;
Standard_EXPORT Standard_NODISCARD Handle(Geom2d_Geometry) Rotated (const gp_Pnt2d& P, const Standard_Real Ang) const;
Standard_EXPORT Handle(Geom2d_Geometry) Rotated (const gp_Pnt2d& P, const Standard_Real Ang) const;
Standard_EXPORT Standard_NODISCARD Handle(Geom2d_Geometry) Scaled (const gp_Pnt2d& P, const Standard_Real S) const;
Standard_EXPORT Handle(Geom2d_Geometry) Scaled (const gp_Pnt2d& P, const Standard_Real S) const;
Standard_EXPORT Standard_NODISCARD Handle(Geom2d_Geometry) Transformed (const gp_Trsf2d& T) const;
Standard_EXPORT Handle(Geom2d_Geometry) Transformed (const gp_Trsf2d& T) const;
Standard_EXPORT Standard_NODISCARD Handle(Geom2d_Geometry) Translated (const gp_Vec2d& V) const;
Standard_EXPORT Handle(Geom2d_Geometry) Translated (const gp_Vec2d& V) const;
Standard_EXPORT Standard_NODISCARD Handle(Geom2d_Geometry) Translated (const gp_Pnt2d& P1, const gp_Pnt2d& P2) const;
Standard_EXPORT Handle(Geom2d_Geometry) Translated (const gp_Pnt2d& P1, const gp_Pnt2d& P2) const;
Standard_EXPORT virtual Handle(Geom2d_Geometry) Copy() const = 0;

View File

@@ -170,15 +170,14 @@ public:
//! Computes the inverse of this transformation and creates a new one.
//! Raises ConstructionError if the the transformation is singular. This means that
//! the ScaleFactor is lower or equal to Resolution from package gp.
Standard_EXPORT Standard_NODISCARD Handle(Geom2d_Transformation) Inverted() const;
Standard_EXPORT Handle(Geom2d_Transformation) Inverted() const;
//! Computes the transformation composed with Other and <me>.
//! <me> * Other.
//! Returns a new transformation
Standard_EXPORT Standard_NODISCARD
Handle(Geom2d_Transformation) Multiplied (const Handle(Geom2d_Transformation)& Other) const;
Standard_NODISCARD Handle(Geom2d_Transformation) operator * (const Handle(Geom2d_Transformation)& Other) const
Standard_EXPORT Handle(Geom2d_Transformation) Multiplied (const Handle(Geom2d_Transformation)& Other) const;
Handle(Geom2d_Transformation) operator * (const Handle(Geom2d_Transformation)& Other) const
{
return Multiplied(Other);
}

View File

@@ -46,7 +46,7 @@ public:
Standard_EXPORT void Reverse();
//! Returns a copy of <me> reversed.
Standard_EXPORT Standard_NODISCARD Handle(Geom2d_Vector) Reversed() const;
Standard_EXPORT Handle(Geom2d_Vector) Reversed() const;
//! Computes the angular value, in radians, between this
//! vector and vector Other. The result is a value

View File

@@ -135,7 +135,8 @@ void Geom2d_VectorWithMagnitude::Normalize () { gpVec2d.Normalize (); }
Handle(Geom2d_VectorWithMagnitude) Geom2d_VectorWithMagnitude::Normalized () const {
gp_Vec2d V = gpVec2d.Normalized();
gp_Vec2d V = gpVec2d;
V.Normalized ();
return new VectorWithMagnitude (V);
}

View File

@@ -80,9 +80,8 @@ void operator += (const Handle(Geom2d_Vector)& Other)
//! Adds the vector Other to <me>.
Standard_EXPORT Standard_NODISCARD
Handle(Geom2d_VectorWithMagnitude) Added (const Handle(Geom2d_Vector)& Other) const;
Standard_NODISCARD Handle(Geom2d_VectorWithMagnitude) operator + (const Handle(Geom2d_Vector)& Other) const
Standard_EXPORT Handle(Geom2d_VectorWithMagnitude) Added (const Handle(Geom2d_Vector)& Other) const;
Handle(Geom2d_VectorWithMagnitude) operator + (const Handle(Geom2d_Vector)& Other) const
{
return Added(Other);
}
@@ -105,8 +104,8 @@ void operator /= (const Standard_Real Scalar)
//! Divides <me> by a scalar. A new vector is returned.
Standard_EXPORT Standard_NODISCARD Handle(Geom2d_VectorWithMagnitude) Divided (const Standard_Real Scalar) const;
Standard_NODISCARD Handle(Geom2d_VectorWithMagnitude) operator / (const Standard_Real Scalar) const
Standard_EXPORT Handle(Geom2d_VectorWithMagnitude) Divided (const Standard_Real Scalar) const;
Handle(Geom2d_VectorWithMagnitude) operator / (const Standard_Real Scalar) const
{
return Divided(Scalar);
}
@@ -117,7 +116,7 @@ Standard_NODISCARD Handle(Geom2d_VectorWithMagnitude) operator / (const Standard
//!
//! -C++: alias operator *
//! Collision with same operator defined for the class Vector!
Standard_EXPORT Standard_NODISCARD Handle(Geom2d_VectorWithMagnitude) Multiplied (const Standard_Real Scalar) const;
Standard_EXPORT Handle(Geom2d_VectorWithMagnitude) Multiplied (const Standard_Real Scalar) const;
//! Computes the product of the vector <me> by a scalar.
@@ -137,7 +136,7 @@ void operator *= (const Standard_Real Scalar)
//!
//! Raised if the magnitude of the vector is lower or equal to
//! Resolution from package gp.
Standard_EXPORT Standard_NODISCARD Handle(Geom2d_VectorWithMagnitude) Normalized() const;
Standard_EXPORT Handle(Geom2d_VectorWithMagnitude) Normalized() const;
//! Subtracts the Vector Other to <me>.
Standard_EXPORT void Subtract (const Handle(Geom2d_Vector)& Other);
@@ -148,9 +147,8 @@ void operator -= (const Handle(Geom2d_Vector)& Other)
//! Subtracts the vector Other to <me>. A new vector is returned.
Standard_EXPORT Standard_NODISCARD
Handle(Geom2d_VectorWithMagnitude) Subtracted (const Handle(Geom2d_Vector)& Other) const;
Standard_NODISCARD Handle(Geom2d_VectorWithMagnitude) operator - (const Handle(Geom2d_Vector)& Other) const
Standard_EXPORT Handle(Geom2d_VectorWithMagnitude) Subtracted (const Handle(Geom2d_Vector)& Other) const;
Handle(Geom2d_VectorWithMagnitude) operator - (const Handle(Geom2d_Vector)& Other) const
{
return Subtracted(Other);
}

View File

@@ -252,7 +252,7 @@ void GeomFill_GuideTrihedronPlan::SetCurve(const Handle(Adaptor3d_HCurve)& C)
Normal = n.Normalized();
BiNormal = Tangent.Crossed(Normal);
BiNormal.Normalize();
BiNormal.Normalized();
}
else { // Erreur...
#ifdef OCCT_DEBUG

View File

@@ -1381,7 +1381,7 @@ void GeomFill_LocationGuide::Resolution (const Standard_Integer ,
//Function : InitX
//Purpose : recherche par interpolation d'une valeur initiale
//==================================================================
void GeomFill_LocationGuide::InitX(const Standard_Real Param)
void GeomFill_LocationGuide::InitX(const Standard_Real Param) const
{
Standard_Integer Ideb = 1, Ifin = myPoles2d->RowLength(), Idemi;

View File

@@ -186,7 +186,7 @@ private:
Standard_EXPORT void SetRotation (const Standard_Real PrecAngle, Standard_Real& LastAngle);
Standard_EXPORT void InitX (const Standard_Real Param);
Standard_EXPORT void InitX (const Standard_Real Param) const;
Handle(GeomFill_TrihedronWithGuide) myLaw;
Handle(GeomFill_SectionLaw) mySec;

View File

@@ -124,7 +124,7 @@ gp_Vec GeomFill_TgtOnCoons::D1(const Standard_Real W) const
Standard_Real scal = tgsc.Dot(n);
gp_Vec scaln = n.Multiplied(-scal);
tgsc.Add(scaln);
tgsc.Added(scaln);
gp_Vec scaldn = dn.Multiplied(-scal);

View File

@@ -11,8 +11,6 @@ Graphic3d_ArrayOfSegments.hxx
Graphic3d_ArrayOfTriangleFans.hxx
Graphic3d_ArrayOfTriangles.hxx
Graphic3d_ArrayOfTriangleStrips.hxx
Graphic3d_Aspects.cxx
Graphic3d_Aspects.hxx
Graphic3d_AspectFillArea3d.cxx
Graphic3d_AspectFillArea3d.hxx
Graphic3d_AspectLine3d.cxx
@@ -21,6 +19,7 @@ Graphic3d_AspectMarker3d.cxx
Graphic3d_AspectMarker3d.hxx
Graphic3d_AspectText3d.cxx
Graphic3d_AspectText3d.hxx
Graphic3d_AspectTextDefinitionError.hxx
Graphic3d_AttribBuffer.cxx
Graphic3d_AttribBuffer.hxx
Graphic3d_BndBox3d.hxx
@@ -74,7 +73,6 @@ Graphic3d_IndexedMapOfAddress.hxx
Graphic3d_LevelOfTextureAnisotropy.hxx
Graphic3d_LightSet.cxx
Graphic3d_LightSet.hxx
Graphic3d_MapOfAspectsToAspects.hxx
Graphic3d_MapIteratorOfMapOfStructure.hxx
Graphic3d_MapOfObject.hxx
Graphic3d_MapOfStructure.hxx

View File

@@ -15,15 +15,30 @@
#include <Graphic3d_AspectFillArea3d.hxx>
IMPLEMENT_STANDARD_RTTIEXT(Graphic3d_AspectFillArea3d, Graphic3d_Aspects)
IMPLEMENT_STANDARD_RTTIEXT(Graphic3d_AspectFillArea3d, Standard_Transient)
// =======================================================================
// function : Graphic3d_AspectFillArea3d
// purpose :
// =======================================================================
Graphic3d_AspectFillArea3d::Graphic3d_AspectFillArea3d()
: myInteriorColor (Quantity_NOC_CYAN1),
myBackInteriorColor (Quantity_NOC_CYAN1),
myEdgeColor (Quantity_NOC_WHITE),
myInteriorStyle (Aspect_IS_EMPTY),
myShadingModel (Graphic3d_TOSM_DEFAULT),
myAlphaMode (Graphic3d_AlphaMode_BlendAuto),
myAlphaCutoff (0.5f),
myEdgeType (Aspect_TOL_SOLID),
myEdgeWidth (1.0f),
myHatchStyle (Handle(Graphic3d_HatchStyle)()),
myToSkipFirstEdge (false),
myToDistinguishMaterials (false),
myToDrawEdges (false),
myToSuppressBackFaces (true),
myToMapTexture (false)
{
myInteriorStyle = Aspect_IS_EMPTY;
//
}
// =======================================================================
@@ -37,13 +52,41 @@ Graphic3d_AspectFillArea3d::Graphic3d_AspectFillArea3d (const Aspect_InteriorSty
const Standard_Real theEdgeLineWidth,
const Graphic3d_MaterialAspect& theFrontMaterial,
const Graphic3d_MaterialAspect& theBackMaterial)
: myFrontMaterial (theFrontMaterial),
myBackMaterial (theBackMaterial),
myInteriorColor (theInteriorColor),
myBackInteriorColor (theInteriorColor),
myEdgeColor (theEdgeColor),
myInteriorStyle (theInteriorStyle),
myShadingModel (Graphic3d_TOSM_DEFAULT),
myAlphaMode (Graphic3d_AlphaMode_BlendAuto),
myAlphaCutoff (0.5f),
myEdgeType (theEdgeLineType),
myEdgeWidth ((float )theEdgeLineWidth),
myHatchStyle (Handle(Graphic3d_HatchStyle)()),
myToSkipFirstEdge (false),
myToDistinguishMaterials (false),
myToDrawEdges (false),
myToSuppressBackFaces (true),
myToMapTexture (false)
{
myFrontMaterial = theFrontMaterial;
myBackMaterial = theBackMaterial;
myInteriorColor.SetRGB (theInteriorColor);
myBackInteriorColor.SetRGB (theInteriorColor);
myEdgeColor.SetRGB (theEdgeColor);
myInteriorStyle = theInteriorStyle;
myLineType = theEdgeLineType;
SetEdgeWidth ((float )theEdgeLineWidth);
if (theEdgeLineWidth <= 0.0)
{
throw Aspect_AspectFillAreaDefinitionError("Bad value for EdgeLineWidth");
}
}
// =======================================================================
// function : Graphic3d_AspectFillArea3d
// purpose :
// =======================================================================
void Graphic3d_AspectFillArea3d::SetTextureMap (const Handle(Graphic3d_TextureMap)& theTexture)
{
if (theTexture.IsNull())
{
myTextureSet.Nullify();
return;
}
myTextureSet = new Graphic3d_TextureSet (theTexture);
}

View File

@@ -17,12 +17,30 @@
#ifndef _Graphic3d_AspectFillArea3d_HeaderFile
#define _Graphic3d_AspectFillArea3d_HeaderFile
#include <Graphic3d_Aspects.hxx>
#include <Aspect_AspectFillAreaDefinitionError.hxx>
#include <Aspect_PolygonOffsetMode.hxx>
#include <Aspect_InteriorStyle.hxx>
#include <Aspect_TypeOfLine.hxx>
#include <Graphic3d_AlphaMode.hxx>
#include <Graphic3d_HatchStyle.hxx>
#include <Graphic3d_MaterialAspect.hxx>
#include <Graphic3d_PolygonOffset.hxx>
#include <Graphic3d_ShaderProgram.hxx>
#include <Graphic3d_TextureMap.hxx>
#include <Graphic3d_TextureSet.hxx>
#include <Graphic3d_TypeOfShadingModel.hxx>
#include <Standard.hxx>
#include <Standard_Boolean.hxx>
#include <Standard_Integer.hxx>
#include <Standard_ShortReal.hxx>
#include <Standard_Real.hxx>
#include <Standard_Type.hxx>
#include <Quantity_ColorRGBA.hxx>
//! This class defines graphic attributes for opaque 3d primitives (polygons, triangles, quadrilaterals).
class Graphic3d_AspectFillArea3d : public Graphic3d_Aspects
class Graphic3d_AspectFillArea3d : public Standard_Transient
{
DEFINE_STANDARD_RTTIEXT(Graphic3d_AspectFillArea3d, Graphic3d_Aspects)
DEFINE_STANDARD_RTTIEXT(Graphic3d_AspectFillArea3d, Standard_Transient)
public:
//! Creates a context table for fill area primitives defined with the following default values:
@@ -55,13 +73,333 @@ public:
const Graphic3d_MaterialAspect& theFrontMaterial,
const Graphic3d_MaterialAspect& theBackMaterial);
//! Return interior rendering style (Aspect_IS_EMPTY by default, which means nothing will be rendered!).
Aspect_InteriorStyle InteriorStyle() const { return myInteriorStyle; }
//! Modifies the interior type used for rendering
void SetInteriorStyle (const Aspect_InteriorStyle theStyle) { myInteriorStyle = theStyle; }
//! Returns shading model (Graphic3d_TOSM_DEFAULT by default, which means that Shading Model set as default for entire Viewer will be used)
Graphic3d_TypeOfShadingModel ShadingModel() const { return myShadingModel; }
//! Sets shading model
void SetShadingModel (const Graphic3d_TypeOfShadingModel theShadingModel) { myShadingModel = theShadingModel; }
//! Returns the way how alpha value should be treated (Graphic3d_AlphaMode_BlendAuto by default, for backward compatibility).
Graphic3d_AlphaMode AlphaMode() const { return myAlphaMode; }
//! Returns alpha cutoff threshold, for discarding fragments within Graphic3d_AlphaMode_Mask mode (0.5 by default).
//! If the alpha value is greater than or equal to this value then it is rendered as fully opaque, otherwise, it is rendered as fully transparent.
Standard_ShortReal AlphaCutoff() const { return myAlphaCutoff; }
//! Defines the way how alpha value should be treated.
void SetAlphaMode (Graphic3d_AlphaMode theMode, Standard_ShortReal theAlphaCutoff = 0.5f)
{
myAlphaMode = theMode;
myAlphaCutoff = theAlphaCutoff;
}
//! Return interior color.
const Quantity_Color& InteriorColor() const { return myInteriorColor.GetRGB(); }
//! Return interior color.
const Quantity_ColorRGBA& InteriorColorRGBA() const { return myInteriorColor; }
//! Modifies the color of the interior of the face
void SetInteriorColor (const Quantity_Color& theColor) { myInteriorColor.SetRGB (theColor); }
//! Modifies the color of the interior of the face
void SetInteriorColor (const Quantity_ColorRGBA& theColor) { myInteriorColor = theColor; }
//! Return back interior color.
const Quantity_Color& BackInteriorColor() const { return myBackInteriorColor.GetRGB(); }
//! Return back interior color.
const Quantity_ColorRGBA& BackInteriorColorRGBA() const { return myBackInteriorColor; }
//! Modifies the color of the interior of the back face
void SetBackInteriorColor (const Quantity_Color& theColor) { myBackInteriorColor.SetRGB (theColor); }
//! Modifies the color of the interior of the back face
void SetBackInteriorColor (const Quantity_ColorRGBA& theColor) { myBackInteriorColor = theColor; }
//! Returns the surface material of external faces
const Graphic3d_MaterialAspect& FrontMaterial() const { return myFrontMaterial; }
//! Returns the surface material of external faces
Graphic3d_MaterialAspect& ChangeFrontMaterial() { return myFrontMaterial; }
//! Modifies the surface material of external faces
void SetFrontMaterial (const Graphic3d_MaterialAspect& theMaterial) { myFrontMaterial = theMaterial; }
//! Returns the surface material of internal faces
const Graphic3d_MaterialAspect& BackMaterial() const { return myBackMaterial; }
//! Returns the surface material of internal faces
Graphic3d_MaterialAspect& ChangeBackMaterial() { return myBackMaterial; }
//! Modifies the surface material of internal faces
void SetBackMaterial (const Graphic3d_MaterialAspect& theMaterial) { myBackMaterial = theMaterial; }
//! Returns true if back faces should be suppressed (true by default).
bool ToSuppressBackFaces() const { return myToSuppressBackFaces; }
//! Assign back faces culling flag.
void SetSuppressBackFaces (bool theToSuppress) { myToSuppressBackFaces = theToSuppress; }
//! Returns true if back faces should be suppressed (true by default).
bool BackFace() const { return myToSuppressBackFaces; }
//! Allows the display of back-facing filled polygons.
void AllowBackFace() { myToSuppressBackFaces = false; }
//! Suppress the display of back-facing filled polygons.
//! A back-facing polygon is defined as a polygon whose
//! vertices are in a clockwise order with respect to screen coordinates.
void SuppressBackFace() { myToSuppressBackFaces = true; }
//! Returns true if material properties should be distinguished for back and front faces (false by default).
bool Distinguish() const { return myToDistinguishMaterials; }
//! Set material distinction between front and back faces.
void SetDistinguish (bool toDistinguish) { myToDistinguishMaterials = toDistinguish; }
//! Allows material distinction between front and back faces.
void SetDistinguishOn() { myToDistinguishMaterials = true; }
//! Forbids material distinction between front and back faces.
void SetDistinguishOff() { myToDistinguishMaterials = false; }
//! Return shader program.
const Handle(Graphic3d_ShaderProgram)& ShaderProgram() const { return myProgram; }
//! Sets up OpenGL/GLSL shader program.
void SetShaderProgram (const Handle(Graphic3d_ShaderProgram)& theProgram) { myProgram = theProgram; }
//! Return texture array to be mapped.
const Handle(Graphic3d_TextureSet)& TextureSet() const { return myTextureSet; }
//! Setup texture array to be mapped.
void SetTextureSet (const Handle(Graphic3d_TextureSet)& theTextures) { myTextureSet = theTextures; }
//! Return texture to be mapped.
//Standard_DEPRECATED("Deprecated method, TextureSet() should be used instead")
Handle(Graphic3d_TextureMap) TextureMap() const
{
return !myTextureSet.IsNull() && !myTextureSet->IsEmpty()
? myTextureSet->First()
: Handle(Graphic3d_TextureMap)();
}
//! Assign texture to be mapped.
//! See also SetTextureMapOn() to actually activate texture mapping.
//Standard_DEPRECATED("Deprecated method, SetTextureSet() should be used instead")
Standard_EXPORT void SetTextureMap (const Handle(Graphic3d_TextureMap)& theTexture);
//! Return true if texture mapping is enabled (false by default).
bool ToMapTexture() const { return myToMapTexture; }
//! Return true if texture mapping is enabled (false by default).
bool TextureMapState() const { return myToMapTexture; }
//! Enable or disable texture mapping (has no effect if texture is not set).
void SetTextureMapOn (bool theToMap) { myToMapTexture = theToMap; }
//! Enable texture mapping (has no effect if texture is not set).
void SetTextureMapOn() { myToMapTexture = true; }
//! Disable texture mapping.
void SetTextureMapOff() { myToMapTexture = false; }
//! Returns current polygon offsets settings.
const Graphic3d_PolygonOffset& PolygonOffset() const { return myPolygonOffset; }
//! Sets polygon offsets settings.
void SetPolygonOffset (const Graphic3d_PolygonOffset& theOffset) { myPolygonOffset = theOffset; }
//! Returns current polygon offsets settings.
void PolygonOffsets (Standard_Integer& theMode,
Standard_ShortReal& theFactor,
Standard_ShortReal& theUnits) const
{
theMode = myPolygonOffset.Mode;
theFactor = myPolygonOffset.Factor;
theUnits = myPolygonOffset.Units;
}
//! Sets up OpenGL polygon offsets mechanism.
//! <aMode> parameter can contain various combinations of
//! Aspect_PolygonOffsetMode enumeration elements (Aspect_POM_None means
//! that polygon offsets are not changed).
//! If <aMode> is different from Aspect_POM_Off and Aspect_POM_None, then <aFactor> and <aUnits>
//! arguments are used by graphic renderer to calculate a depth offset value:
//!
//! offset = <aFactor> * m + <aUnits> * r, where
//! m - maximum depth slope for the polygon currently being displayed,
//! r - minimum window coordinates depth resolution (implementation-specific)
//!
//! Default settings for OCC 3D viewer: mode = Aspect_POM_Fill, factor = 1., units = 0.
//!
//! Negative offset values move polygons closer to the viewport,
//! while positive values shift polygons away.
//! Consult OpenGL reference for details (glPolygonOffset function description).
void SetPolygonOffsets (const Standard_Integer theMode,
const Standard_ShortReal theFactor = 1.0f,
const Standard_ShortReal theUnits = 0.0f)
{
myPolygonOffset.Mode = (Aspect_PolygonOffsetMode )(theMode & Aspect_POM_Mask);
myPolygonOffset.Factor = theFactor;
myPolygonOffset.Units = theUnits;
}
public:
Standard_DEPRECATED("Deprecated method, ToDrawEdges() should be used instead")
//! Returns true if edges should be drawn (false by default).
bool ToDrawEdges() const { return myToDrawEdges && myEdgeType != Aspect_TOL_EMPTY; }
//! Set if edges should be drawn or not.
void SetDrawEdges (bool theToDraw)
{
myToDrawEdges = theToDraw;
if (myEdgeType == Aspect_TOL_EMPTY)
{
myEdgeType = Aspect_TOL_SOLID;
}
}
//! Returns true if edges should be drawn.
bool Edge() const { return ToDrawEdges(); }
//! The edges of FillAreas are drawn.
void SetEdgeOn() { SetDrawEdges (true); }
//! The edges of FillAreas are not drawn.
void SetEdgeOff() { SetDrawEdges (false); }
//! Return color of edges.
const Quantity_Color& EdgeColor() const { return myEdgeColor.GetRGB(); }
//! Return color of edges.
const Quantity_ColorRGBA& EdgeColorRGBA() const { return myEdgeColor; }
//! Modifies the color of the edge of the face
void SetEdgeColor (const Quantity_Color& theColor) { myEdgeColor.SetRGB (theColor); }
//! Modifies the color of the edge of the face
void SetEdgeColor (const Quantity_ColorRGBA& theColor) { myEdgeColor = theColor; }
//! Return edges line type.
Aspect_TypeOfLine EdgeLineType() const { return myEdgeType; }
//! Modifies the edge line type
void SetEdgeLineType (const Aspect_TypeOfLine theType) { myEdgeType = theType; }
//! Return width for edges in pixels.
Standard_ShortReal EdgeWidth() const { return myEdgeWidth; }
//! Modifies the edge thickness
//! Warning: Raises AspectFillAreaDefinitionError if the width is a negative value.
void SetEdgeWidth (const Standard_Real theWidth)
{
if (theWidth <= 0.0)
{
throw Aspect_AspectFillAreaDefinitionError("Bad value for EdgeLineWidth");
}
myEdgeWidth = (float )theWidth;
}
//! Returns TRUE if drawing element edges should discard first edge in triangle; FALSE by default.
//! Graphics hardware works mostly with triangles, so that wireframe presentation will draw triangle edges by default.
//! This flag allows rendering wireframe presentation of quad-only array split into triangles.
//! For this, quads should be split in specific order, so that the quad diagonal (to be NOT rendered) goes first:
//! 1------2
//! / / Triangle #1: 2-0-1; Triangle #2: 0-2-3
//! 0------3
bool ToSkipFirstEdge() const { return myToSkipFirstEdge; }
//! Set skip first triangle edge flag for drawing wireframe presentation of quads array split into triangles.
void SetSkipFirstEdge (bool theToSkipFirstEdge) { myToSkipFirstEdge = theToSkipFirstEdge; }
public:
//! Returns the hatch type used when InteriorStyle is IS_HATCH
const Handle(Graphic3d_HatchStyle)& HatchStyle() const { return myHatchStyle; }
//! Modifies the hatch type used when InteriorStyle is IS_HATCH
void SetHatchStyle (const Handle(Graphic3d_HatchStyle)& theStyle) { myHatchStyle = theStyle; }
//! Modifies the hatch type used when InteriorStyle is IS_HATCH
//! @warning This method always creates a new handle for a given hatch style
void SetHatchStyle (const Aspect_HatchStyle theStyle)
{
if (theStyle == Aspect_HS_SOLID)
{
myHatchStyle.Nullify();
return;
}
myHatchStyle = new Graphic3d_HatchStyle (theStyle);
}
//! Returns the current values.
Standard_DEPRECATED("Deprecated method Values() should be replaced by individual property getters")
void Values (Aspect_InteriorStyle& theStyle,
Quantity_Color& theIntColor,
Quantity_Color& theEdgeColor,
Aspect_TypeOfLine& theType,
Standard_Real& theWidth) const
{
theStyle = myInteriorStyle;
theIntColor = myInteriorColor.GetRGB();
theEdgeColor= myEdgeColor.GetRGB();
theType = myEdgeType;
theWidth = myEdgeWidth;
}
//! Returns the current values.
Standard_DEPRECATED("Deprecated method Values() should be replaced by individual property getters")
void Values (Aspect_InteriorStyle& theStyle,
Quantity_Color& theIntColor,
Quantity_Color& theBackIntColor,
Quantity_Color& theEdgeColor,
Aspect_TypeOfLine& theType,
Standard_Real& theWidth) const
{
theStyle = myInteriorStyle;
theIntColor = myInteriorColor.GetRGB();
theBackIntColor= myBackInteriorColor.GetRGB();
theEdgeColor = myEdgeColor.GetRGB();
theType = myEdgeType;
theWidth = myEdgeWidth;
}
protected:
Handle(Graphic3d_ShaderProgram) myProgram;
Handle(Graphic3d_TextureSet) myTextureSet;
Graphic3d_MaterialAspect myFrontMaterial;
Graphic3d_MaterialAspect myBackMaterial;
Quantity_ColorRGBA myInteriorColor;
Quantity_ColorRGBA myBackInteriorColor;
Quantity_ColorRGBA myEdgeColor;
Aspect_InteriorStyle myInteriorStyle;
Graphic3d_TypeOfShadingModel myShadingModel;
Graphic3d_AlphaMode myAlphaMode;
Standard_ShortReal myAlphaCutoff;
Aspect_TypeOfLine myEdgeType;
Standard_ShortReal myEdgeWidth;
Handle(Graphic3d_HatchStyle) myHatchStyle;
Graphic3d_PolygonOffset myPolygonOffset;
bool myToSkipFirstEdge;
bool myToDistinguishMaterials;
bool myToDrawEdges;
bool myToSuppressBackFaces;
bool myToMapTexture;
};
DEFINE_STANDARD_HANDLE(Graphic3d_AspectFillArea3d, Graphic3d_Aspects)
DEFINE_STANDARD_HANDLE(Graphic3d_AspectFillArea3d, Standard_Transient)
#endif // _Graphic3d_AspectFillArea3d_HeaderFile

View File

@@ -15,30 +15,33 @@
#include <Graphic3d_AspectLine3d.hxx>
IMPLEMENT_STANDARD_RTTIEXT(Graphic3d_AspectLine3d, Graphic3d_Aspects)
IMPLEMENT_STANDARD_RTTIEXT(Graphic3d_AspectLine3d, Standard_Transient)
// =======================================================================
// function : Graphic3d_AspectLine3d
// purpose :
// =======================================================================
Graphic3d_AspectLine3d::Graphic3d_AspectLine3d()
: myColor (Quantity_NOC_YELLOW),
myType (Aspect_TOL_SOLID),
myWidth (1.0f)
{
myShadingModel = Graphic3d_TOSM_UNLIT;
myInteriorColor.SetRGB (Quantity_NOC_YELLOW);
myLineType = Aspect_TOL_SOLID;
myLineWidth = 1.0f;
//
}
// =======================================================================
// function : Graphic3d_AspectLine3d
// purpose :
// =======================================================================
Graphic3d_AspectLine3d::Graphic3d_AspectLine3d (const Quantity_Color& theColor,
Aspect_TypeOfLine theType,
Standard_Real theWidth)
Graphic3d_AspectLine3d::Graphic3d_AspectLine3d (const Quantity_Color& theColor,
const Aspect_TypeOfLine theType,
const Standard_Real theWidth)
: myColor (theColor),
myType (theType),
myWidth ((float )theWidth)
{
myShadingModel = Graphic3d_TOSM_UNLIT;
myInteriorColor.SetRGB (theColor);
myLineType = theType;
SetLineWidth ((float)theWidth);
if (myWidth <= 0.0f)
{
throw Aspect_AspectLineDefinitionError("Graphic3d_AspectLine3d, Bad value for LineWidth");
}
}

View File

@@ -16,13 +16,19 @@
#ifndef _Graphic3d_AspectLine3d_HeaderFile
#define _Graphic3d_AspectLine3d_HeaderFile
#include <Graphic3d_Aspects.hxx>
#include <Aspect_AspectLineDefinitionError.hxx>
#include <Aspect_TypeOfLine.hxx>
#include <Graphic3d_ShaderProgram.hxx>
#include <Standard.hxx>
#include <Standard_Real.hxx>
#include <Standard_Type.hxx>
#include <Quantity_ColorRGBA.hxx>
//! Creates and updates a group of attributes for 3d line primitives.
//! This group contains the color, the type of line, and its thickness.
class Graphic3d_AspectLine3d : public Graphic3d_Aspects
class Graphic3d_AspectLine3d : public Standard_Transient
{
DEFINE_STANDARD_RTTIEXT(Graphic3d_AspectLine3d, Graphic3d_Aspects)
DEFINE_STANDARD_RTTIEXT(Graphic3d_AspectLine3d, Standard_Transient)
public:
//! Creates a context table for line primitives
@@ -38,32 +44,85 @@ public:
//! The nominal line width is 1 pixel.
//! The width of the line is determined by applying the line width scale factor to this nominal line width.
//! The supported line widths vary by 1-pixel units.
Standard_EXPORT Graphic3d_AspectLine3d (const Quantity_Color& theColor,
Aspect_TypeOfLine theType,
Standard_Real theWidth);
Standard_EXPORT Graphic3d_AspectLine3d (const Quantity_Color& theColor,
const Aspect_TypeOfLine theType,
const Standard_Real theWidth);
//! Return color.
const Quantity_ColorRGBA& ColorRGBA() const { return myColor; }
//! Return color.
const Quantity_Color& Color() const { return myColor.GetRGB(); }
//! Modifies the color.
void SetColor (const Quantity_Color& theColor) { myColor.SetRGB (theColor); }
//! Return line type.
Aspect_TypeOfLine Type() const { return myLineType; }
Aspect_TypeOfLine Type() const { return myType; }
//! Modifies the type of line.
void SetType (const Aspect_TypeOfLine theType) { myLineType = theType; }
void SetType (const Aspect_TypeOfLine theType) { myType = theType; }
//! Return line width.
Standard_ShortReal Width() const { return myLineWidth; }
Standard_ShortReal Width() const { return myWidth; }
//! Modifies the line thickness.
//! Warning: Raises Standard_OutOfRange if the width is a negative value.
//! Warning: Raises AspectLineDefinitionError if the width is a negative value.
void SetWidth (const Standard_Real theWidth) { SetWidth ((float )theWidth); }
//! Modifies the line thickness.
//! Warning: Raises Standard_OutOfRange if the width is a negative value.
void SetWidth (Standard_ShortReal theWidth)
//! Warning: Raises AspectLineDefinitionError if the width is a negative value.
void SetWidth (const Standard_ShortReal theWidth)
{
SetLineWidth (theWidth);
if (theWidth <= 0.0f)
{
throw Aspect_AspectLineDefinitionError("Graphic3d_AspectLine3d, Bad value for LineWidth");
}
myWidth = theWidth;
}
//! Return shader program.
const Handle(Graphic3d_ShaderProgram)& ShaderProgram() const { return myProgram; }
//! Sets up OpenGL/GLSL shader program.
void SetShaderProgram (const Handle(Graphic3d_ShaderProgram)& theProgram) { myProgram = theProgram; }
//! Check for equality with another line aspect.
bool IsEqual (const Graphic3d_AspectLine3d& theOther)
{
if (this == &theOther)
{
return true;
}
return myProgram == theOther.myProgram
&& myType == theOther.myType
&& myColor == theOther.myColor
&& myWidth == theOther.myWidth;
}
public:
//! Returns the current values of the group.
Standard_DEPRECATED("Deprecated method Values() should be replaced by individual property getters")
void Values (Quantity_Color& theColor,
Aspect_TypeOfLine& theType,
Standard_Real& theWidth) const
{
theColor = myColor.GetRGB();
theType = myType;
theWidth = myWidth;
}
protected:
Handle(Graphic3d_ShaderProgram) myProgram;
Quantity_ColorRGBA myColor;
Aspect_TypeOfLine myType;
Standard_ShortReal myWidth;
};
DEFINE_STANDARD_HANDLE(Graphic3d_AspectLine3d, Graphic3d_Aspects)
DEFINE_STANDARD_HANDLE(Graphic3d_AspectLine3d, Standard_Transient)
#endif // _Graphic3d_AspectLine3d_HeaderFile

View File

@@ -15,18 +15,18 @@
#include <Graphic3d_AspectMarker3d.hxx>
IMPLEMENT_STANDARD_RTTIEXT(Graphic3d_AspectMarker3d, Graphic3d_Aspects)
IMPLEMENT_STANDARD_RTTIEXT(Graphic3d_AspectMarker3d, Standard_Transient)
// =======================================================================
// function : Graphic3d_AspectMarker3d
// purpose :
// =======================================================================
Graphic3d_AspectMarker3d::Graphic3d_AspectMarker3d()
: myColor (Quantity_NOC_YELLOW),
myType (Aspect_TOM_X),
myScale (1.0f)
{
myShadingModel = Graphic3d_TOSM_UNLIT;
myInteriorColor.SetRGB (Quantity_NOC_YELLOW);
myMarkerType = Aspect_TOM_X;
myMarkerScale = 1.0f;
//
}
// =======================================================================
@@ -36,11 +36,14 @@ Graphic3d_AspectMarker3d::Graphic3d_AspectMarker3d()
Graphic3d_AspectMarker3d::Graphic3d_AspectMarker3d (const Aspect_TypeOfMarker theType,
const Quantity_Color& theColor,
const Standard_Real theScale)
: myColor (theColor),
myType (theType),
myScale ((float )theScale)
{
myShadingModel = Graphic3d_TOSM_UNLIT;
myInteriorColor.SetRGB (theColor);
myMarkerType = theType;
SetMarkerScale ((float )theScale);
if (theScale <= 0.0)
{
throw Aspect_AspectMarkerDefinitionError("Bad value for MarkerScale");
}
}
// =======================================================================
@@ -51,12 +54,12 @@ Graphic3d_AspectMarker3d::Graphic3d_AspectMarker3d (const Quantity_Color& theCo
const Standard_Integer theWidth,
const Standard_Integer theHeight,
const Handle(TColStd_HArray1OfByte)& theTextureBitMap)
: myMarkerImage (new Graphic3d_MarkerImage (theTextureBitMap, theWidth, theHeight)),
myColor (theColor),
myType (Aspect_TOM_USERDEFINED),
myScale (1.0f)
{
myShadingModel = Graphic3d_TOSM_UNLIT;
myMarkerImage = new Graphic3d_MarkerImage(theTextureBitMap, theWidth, theHeight);
myInteriorColor.SetRGB (theColor),
myMarkerType = Aspect_TOM_USERDEFINED;
myMarkerScale = 1.0f;
//
}
// =======================================================================
@@ -64,12 +67,12 @@ Graphic3d_AspectMarker3d::Graphic3d_AspectMarker3d (const Quantity_Color& theCo
// purpose :
// =======================================================================
Graphic3d_AspectMarker3d::Graphic3d_AspectMarker3d (const Handle(Image_PixMap)& theTextureImage)
: myMarkerImage (new Graphic3d_MarkerImage (theTextureImage)),
myColor (Quantity_NOC_YELLOW),
myType (Aspect_TOM_USERDEFINED),
myScale (1.0f)
{
myShadingModel = Graphic3d_TOSM_UNLIT;
myMarkerImage = new Graphic3d_MarkerImage (theTextureImage);
myInteriorColor.SetRGB (Quantity_NOC_YELLOW);
myMarkerType = Aspect_TOM_USERDEFINED;
myMarkerScale = 1.0f;
//
}
// =======================================================================

View File

@@ -16,13 +16,23 @@
#ifndef _Graphic3d_AspectMarker3d_HeaderFile
#define _Graphic3d_AspectMarker3d_HeaderFile
#include <Graphic3d_Aspects.hxx>
#include <Aspect_AspectMarkerDefinitionError.hxx>
#include <Aspect_TypeOfMarker.hxx>
#include <Graphic3d_MarkerImage.hxx>
#include <Graphic3d_ShaderProgram.hxx>
#include <Image_PixMap.hxx>
#include <Standard.hxx>
#include <Standard_Integer.hxx>
#include <Standard_Real.hxx>
#include <Standard_Type.hxx>
#include <TColStd_HArray1OfByte.hxx>
#include <Quantity_ColorRGBA.hxx>
//! Creates and updates an attribute group for marker type primitives.
//! This group contains the type of marker, its color, and its scale factor.
class Graphic3d_AspectMarker3d : public Graphic3d_Aspects
class Graphic3d_AspectMarker3d : public Standard_Transient
{
DEFINE_STANDARD_RTTIEXT(Graphic3d_AspectMarker3d, Graphic3d_Aspects)
DEFINE_STANDARD_RTTIEXT(Graphic3d_AspectMarker3d, Standard_Transient)
public:
//! Creates a context table for marker primitives
@@ -43,26 +53,39 @@ public:
//! defined with the specified values.
Standard_EXPORT Graphic3d_AspectMarker3d(const Handle(Image_PixMap)& theTextureImage);
//! Return color.
const Quantity_ColorRGBA& ColorRGBA() const { return myColor; }
//! Return the color.
const Quantity_Color& Color() const { return myColor.GetRGB(); }
//! Modifies the color.
void SetColor (const Quantity_Color& theColor) { myColor.SetRGB (theColor); }
//! Return scale factor.
Standard_ShortReal Scale() const { return myMarkerScale; }
Standard_ShortReal Scale() const { return myScale; }
//! Modifies the scale factor.
//! Marker type Aspect_TOM_POINT is not affected by the marker size scale factor.
//! It is always the smallest displayable dot.
//! Warning: Raises Standard_OutOfRange if the scale is a negative value.
//! Warning: Raises AspectMarkerDefinitionError if the scale is a negative value.
void SetScale (const Standard_ShortReal theScale)
{
SetMarkerScale (theScale);
if (theScale <= 0.0f)
{
throw Aspect_AspectMarkerDefinitionError("Bad value for MarkerScale");
}
myScale = theScale;
}
//! Assign scale factor.
void SetScale (const Standard_Real theScale) { SetScale ((float )theScale); }
//! Return marker type.
Aspect_TypeOfMarker Type() const { return myMarkerType; }
Aspect_TypeOfMarker Type() const { return myType; }
//! Modifies the type of marker.
void SetType (const Aspect_TypeOfMarker theType) { myMarkerType = theType; }
void SetType (const Aspect_TypeOfMarker theType) { myType = theType; }
//! Returns marker's texture size.
Standard_EXPORT void GetTextureSize (Standard_Integer& theWidth, Standard_Integer& theHeight) const;
@@ -71,10 +94,40 @@ public:
//! Could be null handle if marker aspect has been initialized as default type of marker.
const Handle(Graphic3d_MarkerImage)& GetMarkerImage() const { return myMarkerImage; }
//! Set marker's image texture.
void SetMarkerImage (const Handle(Graphic3d_MarkerImage)& theImage) { myMarkerImage = theImage; }
Standard_EXPORT void SetBitMap (const Standard_Integer theWidth, const Standard_Integer theHeight, const Handle(TColStd_HArray1OfByte)& theTexture);
//! Return the program.
const Handle(Graphic3d_ShaderProgram)& ShaderProgram() const { return myProgram; }
//! Sets up OpenGL/GLSL shader program.
void SetShaderProgram (const Handle(Graphic3d_ShaderProgram)& theProgram) { myProgram = theProgram; }
public:
//! Returns the current values of the group.
Standard_DEPRECATED("Deprecated method Values() should be replaced by individual property getters")
void Values (Quantity_Color& theColor,
Aspect_TypeOfMarker& theType,
Standard_Real& theScale) const
{
theColor = myColor.GetRGB();
theType = myType;
theScale = myScale;
}
protected:
Handle(Graphic3d_ShaderProgram) myProgram;
Handle(Graphic3d_MarkerImage) myMarkerImage;
Quantity_ColorRGBA myColor;
Aspect_TypeOfMarker myType;
Standard_ShortReal myScale;
};
DEFINE_STANDARD_HANDLE(Graphic3d_AspectMarker3d, Graphic3d_Aspects)
DEFINE_STANDARD_HANDLE(Graphic3d_AspectMarker3d, Standard_Transient)
#endif // _Graphic3d_AspectMarker3d_HeaderFile

View File

@@ -15,43 +15,55 @@
#include <Graphic3d_AspectText3d.hxx>
IMPLEMENT_STANDARD_RTTIEXT(Graphic3d_AspectText3d, Graphic3d_Aspects)
IMPLEMENT_STANDARD_RTTIEXT(Graphic3d_AspectText3d, Standard_Transient)
// =======================================================================
// function : Graphic3d_AspectText3d
// purpose :
// =======================================================================
Graphic3d_AspectText3d::Graphic3d_AspectText3d()
: myFont (Font_NOF_ASCII_MONO),
myColor (Quantity_NOC_YELLOW),
myFactor (1.0),
mySpace (0.0),
myStyle (Aspect_TOST_NORMAL),
myDisplayType (Aspect_TODT_NORMAL),
myColorSubTitle (Quantity_NOC_WHITE),
myTextZoomable (false),
myTextAngle (0.0),
myTextFontAspect(Font_FA_Regular)
{
// actually this should be a special state Graphic3d_AlphaMode_MaskBlend
// since text is drawn in usual order with normal opaque objects (thanks to alpha test),
// but blending is also enabled to smoothen boundaries
SetAlphaMode (Graphic3d_AlphaMode_Mask, 0.285f);
myShadingModel = Graphic3d_TOSM_UNLIT;
myInteriorColor.SetRGB (Quantity_NOC_YELLOW);
myEdgeColor.SetRGB (Quantity_NOC_WHITE);
//
}
// =======================================================================
// function : Graphic3d_AspectText3d
// purpose :
// =======================================================================
Graphic3d_AspectText3d::Graphic3d_AspectText3d (const Quantity_Color& theColor,
Standard_CString theFont,
Standard_Real ,
Standard_Real ,
Aspect_TypeOfStyleText theStyle,
Aspect_TypeOfDisplayText theDisplayType)
Graphic3d_AspectText3d::Graphic3d_AspectText3d (const Quantity_Color& theColor,
const Standard_CString theFont,
const Standard_Real theExpansionFactor,
const Standard_Real theSpace,
const Aspect_TypeOfStyleText theStyle,
const Aspect_TypeOfDisplayText theDisplayType)
: myFont (theFont),
myColor (theColor),
myFactor (theExpansionFactor),
mySpace (theSpace),
myStyle (theStyle),
myDisplayType (theDisplayType),
myColorSubTitle (Quantity_NOC_WHITE),
myTextZoomable (false),
myTextAngle (0.0),
myTextFontAspect(Font_FA_Regular)
{
SetAlphaMode (Graphic3d_AlphaMode_Mask, 0.285f);
myShadingModel = Graphic3d_TOSM_UNLIT;
myTextStyle = theStyle;
myTextDisplayType = theDisplayType;
myInteriorColor.SetRGB (theColor);
myEdgeColor.SetRGB (Quantity_NOC_WHITE);
if (theFont != NULL
&& *theFont != '\0')
if (myFont.IsEmpty())
{
myTextFont = new TCollection_HAsciiString (theFont);
myFont = Font_NOF_ASCII_MONO;
}
if (theExpansionFactor <= 0.0)
{
throw Graphic3d_AspectTextDefinitionError("Bad value for TextScaleFactor");
}
}

View File

@@ -16,69 +16,89 @@
#ifndef _Graphic3d_AspectText3d_HeaderFile
#define _Graphic3d_AspectText3d_HeaderFile
#include <Graphic3d_Aspects.hxx>
#include <Aspect_TypeOfStyleText.hxx>
#include <Aspect_TypeOfDisplayText.hxx>
#include <Graphic3d_AspectTextDefinitionError.hxx>
#include <Graphic3d_ShaderProgram.hxx>
#include <Font_FontAspect.hxx>
#include <Font_NameOfFont.hxx>
#include <Standard_Transient.hxx>
#include <Standard.hxx>
#include <Standard_Boolean.hxx>
#include <Standard_Real.hxx>
#include <Standard_Type.hxx>
#include <TCollection_AsciiString.hxx>
#include <Quantity_ColorRGBA.hxx>
//! Creates and updates a group of attributes for text primitives.
class Graphic3d_AspectText3d : public Graphic3d_Aspects
//! Creates and updates a group of attributes for
//! text primitives. This group contains the color,
//! font, expansion factor (height/width ratio), and
//! inter-character space.
//!
//! NOTE: The font name is stored in the aspect instance
//! so it is safe to pass it as const char* to OpenGl package
//! without copying the string. However, the aspect should not
//! be deleted until the text drawn using this aspect is no longer
//! visible. The best practice is to keep the aspect in the object's drawer.
class Graphic3d_AspectText3d : public Standard_Transient
{
DEFINE_STANDARD_RTTIEXT(Graphic3d_AspectText3d, Graphic3d_Aspects)
DEFINE_STANDARD_RTTIEXT(Graphic3d_AspectText3d, Standard_Transient)
public:
//! Creates a context table for text primitives defined with the following default values:
//! Color : Quantity_NOC_YELLOW
//! Font : Font_NOF_ASCII_MONO
//! The style : Aspect_TOST_NORMAL
//! The display type : Aspect_TODT_NORMAL
//! Creates a context table for text primitives
//! defined with the following default values:
//!
//! Color : NOC_YELLOW
//! Font : NOF_ASCII_MONO
//! Expansion factor : 1.
//! Space between characters : 0.
//! The style : TOST_NORMAL
//! The display type : TODT_NORMAL
Standard_EXPORT Graphic3d_AspectText3d();
//! Creates a context table for text primitives defined with the specified values.
//! @param theColor [in] text color
//! @param theFont [in] font family name or alias like Font_NOF_ASCII_MONO
//! @param theExpansionFactor [in] deprecated parameter, has no effect
//! @param theSpace [in] deprecated parameter, has no effect
//! @param theStyle [in] font style
//! @param theDisplayType [in] display mode
Standard_EXPORT Graphic3d_AspectText3d (const Quantity_Color& theColor,
Standard_CString theFont,
Standard_Real theExpansionFactor,
Standard_Real theSpace,
Aspect_TypeOfStyleText theStyle = Aspect_TOST_NORMAL,
Aspect_TypeOfDisplayText theDisplayType = Aspect_TODT_NORMAL);
//! Creates a context table for text primitives
//! defined with the specified values.
//! AFont may be to take means from User(example "Courier New")
//! or Font name defined in Font_NameOfFont(example Font_NOF_ASCII_MONO)
//! or use default font("Courier")
Standard_EXPORT Graphic3d_AspectText3d (const Quantity_Color& theColor,
const Standard_CString theFont,
const Standard_Real theExpansionFactor,
const Standard_Real theSpace,
const Aspect_TypeOfStyleText theStyle = Aspect_TOST_NORMAL,
const Aspect_TypeOfDisplayText theDisplayType = Aspect_TODT_NORMAL);
//! Return the text color.
const Quantity_Color& Color() const { return myInteriorColor.GetRGB(); }
const Quantity_Color& Color() const { return myColor.GetRGB(); }
//! Return the text color.
const Quantity_ColorRGBA& ColorRGBA() const { return myInteriorColor; }
const Quantity_ColorRGBA& ColorRGBA() const { return myColor; }
//! Modifies the color.
void SetColor (const Quantity_Color& theColor) { myInteriorColor.SetRGB (theColor); }
void SetColor (const Quantity_Color& theColor) { myColor.SetRGB (theColor); }
//! Modifies the color.
void SetColor (const Quantity_ColorRGBA& theColor) { myInteriorColor = theColor; }
void SetColor (const Quantity_ColorRGBA& theColor) { myColor = theColor; }
//! Modifies the expansion factor (height/width ratio)
//! If the factor is less than 1, the characters will
//! be higher than they are wide.
void SetExpansionFactor (const Standard_Real theFactor)
{
if (theFactor <= 0.0)
{
throw Graphic3d_AspectTextDefinitionError("Bad value for TextScaleFactor");
}
myFactor = theFactor;
}
//! Return the font.
const TCollection_AsciiString& Font() const
{
if (myTextFont.IsNull())
{
static const TCollection_AsciiString anEmpty;
return anEmpty;
}
return myTextFont->String();
}
const TCollection_AsciiString& Font() const { return myFont; }
//! Modifies the font.
void SetFont (const TCollection_AsciiString& theFont)
{
if (!theFont.IsEmpty())
{
myTextFont = new TCollection_HAsciiString (theFont);
}
else
{
myTextFont.Nullify();
}
myFont = !theFont.IsEmpty() ? theFont : TCollection_AsciiString (Font_NOF_ASCII_MONO);
}
//! Modifies the font.
@@ -87,32 +107,174 @@ public:
SetFont (TCollection_AsciiString (theFont));
}
//! Return the space between characters.
Standard_Real Space() const { return mySpace; }
//! Modifies the space between the characters.
void SetSpace (const Standard_Real theSpace) { mySpace = theSpace; }
//! Return the text style.
Aspect_TypeOfStyleText Style() const { return myTextStyle; }
Aspect_TypeOfStyleText Style() const { return myStyle; }
//! Modifies the style of the text.
void SetStyle (Aspect_TypeOfStyleText theStyle) { myTextStyle = theStyle; }
//! * TOST_NORMAL
//! Default text. The text is displayed like any other graphic object.
//! This text can be hidden by another object that is nearest from the point of view.
//! * TOST_ANNOTATION
//! The text is always visible.
//! The text is displayed over the other object according to the priority.
void SetStyle (const Aspect_TypeOfStyleText theStyle) { myStyle = theStyle; }
//! Return display type.
Aspect_TypeOfDisplayText DisplayType() const { return myTextDisplayType; }
Aspect_TypeOfDisplayText DisplayType() const { return myDisplayType; }
//! Define the display type of the text.
void SetDisplayType (Aspect_TypeOfDisplayText theDisplayType) { myTextDisplayType = theDisplayType; }
//!
//! TODT_NORMAL Default display. Text only.
//! TODT_SUBTITLE There is a subtitle under the text.
//! TODT_DEKALE The text is displayed with a 3D style.
//! TODT_BLEND The text is displayed in XOR.
//! TODT_DIMENSION Dimension line under text will be invisible.
void SetDisplayType (const Aspect_TypeOfDisplayText theDisplayType) { myDisplayType = theDisplayType; }
//! Return subtitle color.
const Quantity_ColorRGBA& ColorSubTitleRGBA() const { return myColorSubTitle; }
//! Return subtitle color.
const Quantity_Color& ColorSubTitle() const { return myColorSubTitle.GetRGB(); }
//! Modifies the color of the subtitle for the TODT_SUBTITLE TextDisplayType
//! and the color of background for the TODT_DEKALE TextDisplayType.
void SetColorSubTitle (const Quantity_Color& theColor) { myColorSubTitle.SetRGB (theColor); }
//! Modifies the color of the subtitle for the TODT_SUBTITLE TextDisplayType
//! and the color of background for the TODT_DEKALE TextDisplayType.
void SetColorSubTitle (const Quantity_ColorRGBA& theColor) { myColorSubTitle = theColor; }
//! Returns TRUE when the Text Zoomable is on.
bool GetTextZoomable() const { return myIsTextZoomable; }
bool GetTextZoomable() const { return myTextZoomable; }
//! Turns usage of text zoomable on/off
void SetTextZoomable (const bool theFlag) { myTextZoomable = theFlag; }
//! Returns Angle of degree
Standard_ShortReal GetTextAngle() const { return myTextAngle; }
Standard_Real GetTextAngle() const { return myTextAngle; }
//! Turns usage of text rotated
void SetTextAngle (const Standard_Real theAngle) { myTextAngle = (Standard_ShortReal )theAngle; }
void SetTextAngle (const Standard_Real theAngle) { myTextAngle = theAngle; }
//! Returns text FontAspect
Font_FontAspect GetTextFontAspect() const { return myTextFontAspect; }
//! Turns usage of Aspect text
void SetTextFontAspect (const Font_FontAspect theFontAspect) { myTextFontAspect = theFontAspect; }
//! Return the shader program.
const Handle(Graphic3d_ShaderProgram)& ShaderProgram() const { return myProgram; }
//! Sets up OpenGL/GLSL shader program.
void SetShaderProgram (const Handle(Graphic3d_ShaderProgram)& theProgram) { myProgram = theProgram; }
public:
//! Returns the current values of the group.
Standard_DEPRECATED("Deprecated method Values() should be replaced by individual property getters")
void Values (Quantity_Color& theColor,
Standard_CString& theFont,
Standard_Real& theExpansionFactor,
Standard_Real& theSpace) const
{
theColor = myColor.GetRGB();
theFont = myFont.ToCString();
theExpansionFactor = myFactor;
theSpace = mySpace;
}
//! Returns the current values of the group.
Standard_DEPRECATED("Deprecated method Values() should be replaced by individual property getters")
void Values (Quantity_Color& theColor,
Standard_CString& theFont,
Standard_Real& theExpansionFactor,
Standard_Real& theSpace,
Aspect_TypeOfStyleText& theStyle,
Aspect_TypeOfDisplayText& theDisplayType,
Quantity_Color& theColorSubTitle) const
{
theColor = myColor.GetRGB();
theFont = myFont.ToCString();
theExpansionFactor= myFactor;
theSpace = mySpace;
theStyle = myStyle;
theDisplayType = myDisplayType;
theColorSubTitle = myColorSubTitle.GetRGB();
}
//! Returns the current values of the group.
Standard_DEPRECATED("Deprecated method Values() should be replaced by individual property getters")
void Values (Quantity_Color& theColor,
Standard_CString& theFont,
Standard_Real& theExpansionFactor,
Standard_Real& theSpace,
Aspect_TypeOfStyleText& theStyle,
Aspect_TypeOfDisplayText& theDisplayType,
Quantity_Color& theColorSubTitle,
Standard_Boolean& theTextZoomable,
Standard_Real& theTextAngle) const
{
theColor = myColor.GetRGB();
theFont = myFont.ToCString();
theExpansionFactor= myFactor;
theSpace = mySpace;
theStyle = myStyle;
theDisplayType = myDisplayType;
theColorSubTitle = myColorSubTitle.GetRGB();
theTextZoomable = myTextZoomable;
theTextAngle = myTextAngle;
}
//! Returns the current values of the group.
Standard_DEPRECATED("Deprecated method Values() should be replaced by individual property getters")
void Values (Quantity_Color& theColor,
Standard_CString& theFont,
Standard_Real& theExpansionFactor,
Standard_Real& theSpace,
Aspect_TypeOfStyleText& theStyle,
Aspect_TypeOfDisplayText& theDisplayType,
Quantity_Color& theColorSubTitle,
Standard_Boolean& theTextZoomable,
Standard_Real& theTextAngle,
Font_FontAspect& theTextFontAspect) const
{
theColor = myColor.GetRGB();
theFont = myFont.ToCString();
theExpansionFactor= myFactor;
theSpace = mySpace;
theStyle = myStyle;
theDisplayType = myDisplayType;
theColorSubTitle = myColorSubTitle.GetRGB();
theTextZoomable = myTextZoomable;
theTextAngle = myTextAngle;
theTextFontAspect = myTextFontAspect;
}
protected:
TCollection_AsciiString myFont;
Quantity_ColorRGBA myColor;
Standard_Real myFactor;
Standard_Real mySpace;
Aspect_TypeOfStyleText myStyle;
Aspect_TypeOfDisplayText myDisplayType;
Quantity_ColorRGBA myColorSubTitle;
bool myTextZoomable;
Standard_Real myTextAngle;
Font_FontAspect myTextFontAspect;
Handle(Graphic3d_ShaderProgram) myProgram;
};
DEFINE_STANDARD_HANDLE(Graphic3d_AspectText3d, Graphic3d_Aspects)
DEFINE_STANDARD_HANDLE(Graphic3d_AspectText3d, Standard_Transient)
#endif // _Graphic3d_AspectText3d_HeaderFile

View File

@@ -0,0 +1,37 @@
// Created on: 1993-03-31
// Created by: NW,JPB,CAL
// Copyright (c) 1993-1999 Matra Datavision
// Copyright (c) 1999-2014 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#ifndef _Graphic3d_AspectTextDefinitionError_HeaderFile
#define _Graphic3d_AspectTextDefinitionError_HeaderFile
#include <Standard_Type.hxx>
#include <Standard_DefineException.hxx>
#include <Standard_SStream.hxx>
#include <Standard_OutOfRange.hxx>
class Graphic3d_AspectTextDefinitionError;
DEFINE_STANDARD_HANDLE(Graphic3d_AspectTextDefinitionError, Standard_OutOfRange)
#if !defined No_Exception && !defined No_Graphic3d_AspectTextDefinitionError
#define Graphic3d_AspectTextDefinitionError_Raise_if(CONDITION, MESSAGE) \
if (CONDITION) throw Graphic3d_AspectTextDefinitionError(MESSAGE);
#else
#define Graphic3d_AspectTextDefinitionError_Raise_if(CONDITION, MESSAGE)
#endif
DEFINE_STANDARD_EXCEPTION(Graphic3d_AspectTextDefinitionError, Standard_OutOfRange)
#endif // _Graphic3d_AspectTextDefinitionError_HeaderFile

View File

@@ -1,62 +0,0 @@
// Copyright (c) 2019 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#include <Graphic3d_Aspects.hxx>
IMPLEMENT_STANDARD_RTTIEXT(Graphic3d_Aspects, Standard_Transient)
// =======================================================================
// function : Graphic3d_Aspects
// purpose :
// =======================================================================
Graphic3d_Aspects::Graphic3d_Aspects()
: myInteriorColor (Quantity_NOC_CYAN1),
myBackInteriorColor (Quantity_NOC_CYAN1),
myEdgeColor (Quantity_NOC_WHITE),
myInteriorStyle (Aspect_IS_SOLID),
myShadingModel (Graphic3d_TOSM_DEFAULT),
myAlphaMode (Graphic3d_AlphaMode_BlendAuto),
myAlphaCutoff (0.5f),
myLineType (Aspect_TOL_SOLID),
myLineWidth (1.0f),
myMarkerType (Aspect_TOM_POINT),
myMarkerScale (1.0f),
myTextStyle (Aspect_TOST_NORMAL),
myTextDisplayType (Aspect_TODT_NORMAL),
myTextFontAspect (Font_FontAspect_Regular),
myTextAngle (0.0f),
myToSkipFirstEdge (false),
myToDistinguishMaterials (false),
myToDrawEdges (false),
myToDrawSilhouette (false),
myToSuppressBackFaces (true),
myToMapTexture (false),
myIsTextZoomable (false)
{
//
}
// =======================================================================
// function : SetTextureMap
// purpose :
// =======================================================================
void Graphic3d_Aspects::SetTextureMap (const Handle(Graphic3d_TextureMap)& theTexture)
{
if (theTexture.IsNull())
{
myTextureSet.Nullify();
return;
}
myTextureSet = new Graphic3d_TextureSet (theTexture);
}

View File

@@ -1,510 +0,0 @@
// Copyright (c) 2019 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#ifndef _Graphic3d_Aspects_HeaderFile
#define _Graphic3d_Aspects_HeaderFile
#include <Aspect_PolygonOffsetMode.hxx>
#include <Aspect_InteriorStyle.hxx>
#include <Aspect_TypeOfDisplayText.hxx>
#include <Aspect_TypeOfLine.hxx>
#include <Aspect_TypeOfMarker.hxx>
#include <Aspect_TypeOfStyleText.hxx>
#include <Font_FontAspect.hxx>
#include <Font_NameOfFont.hxx>
#include <Graphic3d_AlphaMode.hxx>
#include <Graphic3d_MarkerImage.hxx>
#include <Graphic3d_HatchStyle.hxx>
#include <Graphic3d_MaterialAspect.hxx>
#include <Graphic3d_PolygonOffset.hxx>
#include <Graphic3d_ShaderProgram.hxx>
#include <Graphic3d_TextureMap.hxx>
#include <Graphic3d_TextureSet.hxx>
#include <Graphic3d_TypeOfShadingModel.hxx>
#include <TCollection_HAsciiString.hxx>
//! This class defines graphic attributes.
class Graphic3d_Aspects : public Standard_Transient
{
DEFINE_STANDARD_RTTIEXT(Graphic3d_Aspects, Standard_Transient)
public:
//! Creates a context table for drawing primitives defined with the following default values:
Standard_EXPORT Graphic3d_Aspects();
//! Return interior rendering style; Aspect_IS_SOLID by default.
Aspect_InteriorStyle InteriorStyle() const { return myInteriorStyle; }
//! Modifies the interior type used for rendering
void SetInteriorStyle (const Aspect_InteriorStyle theStyle) { myInteriorStyle = theStyle; }
//! Returns shading model; Graphic3d_TOSM_DEFAULT by default.
//! Graphic3d_TOSM_DEFAULT means that Shading Model set as default for entire Viewer will be used.
Graphic3d_TypeOfShadingModel ShadingModel() const { return myShadingModel; }
//! Sets shading model
void SetShadingModel (const Graphic3d_TypeOfShadingModel theShadingModel) { myShadingModel = theShadingModel; }
//! Returns the way how alpha value should be treated (Graphic3d_AlphaMode_BlendAuto by default, for backward compatibility).
Graphic3d_AlphaMode AlphaMode() const { return myAlphaMode; }
//! Returns alpha cutoff threshold, for discarding fragments within Graphic3d_AlphaMode_Mask mode (0.5 by default).
//! If the alpha value is greater than or equal to this value then it is rendered as fully opaque, otherwise, it is rendered as fully transparent.
Standard_ShortReal AlphaCutoff() const { return myAlphaCutoff; }
//! Defines the way how alpha value should be treated.
void SetAlphaMode (Graphic3d_AlphaMode theMode, Standard_ShortReal theAlphaCutoff = 0.5f)
{
myAlphaMode = theMode;
myAlphaCutoff = theAlphaCutoff;
}
//! Return color
const Quantity_ColorRGBA& ColorRGBA() const { return myInteriorColor; }
//! Return the color.
const Quantity_Color& Color() const { return myInteriorColor.GetRGB(); }
//! Modifies the color.
void SetColor (const Quantity_Color& theColor) { myInteriorColor.SetRGB(theColor); }
//! Return interior color.
const Quantity_Color& InteriorColor() const { return myInteriorColor.GetRGB(); }
//! Return interior color.
const Quantity_ColorRGBA& InteriorColorRGBA() const { return myInteriorColor; }
//! Modifies the color of the interior of the face
void SetInteriorColor (const Quantity_Color& theColor) { myInteriorColor.SetRGB (theColor); }
//! Modifies the color of the interior of the face
void SetInteriorColor (const Quantity_ColorRGBA& theColor) { myInteriorColor = theColor; }
//! Return back interior color.
const Quantity_Color& BackInteriorColor() const { return myBackInteriorColor.GetRGB(); }
//! Return back interior color.
const Quantity_ColorRGBA& BackInteriorColorRGBA() const { return myBackInteriorColor; }
//! Modifies the color of the interior of the back face
void SetBackInteriorColor (const Quantity_Color& theColor) { myBackInteriorColor.SetRGB (theColor); }
//! Modifies the color of the interior of the back face
void SetBackInteriorColor (const Quantity_ColorRGBA& theColor) { myBackInteriorColor = theColor; }
//! Returns the surface material of external faces
const Graphic3d_MaterialAspect& FrontMaterial() const { return myFrontMaterial; }
//! Returns the surface material of external faces
Graphic3d_MaterialAspect& ChangeFrontMaterial() { return myFrontMaterial; }
//! Modifies the surface material of external faces
void SetFrontMaterial (const Graphic3d_MaterialAspect& theMaterial) { myFrontMaterial = theMaterial; }
//! Returns the surface material of internal faces
const Graphic3d_MaterialAspect& BackMaterial() const { return myBackMaterial; }
//! Returns the surface material of internal faces
Graphic3d_MaterialAspect& ChangeBackMaterial() { return myBackMaterial; }
//! Modifies the surface material of internal faces
void SetBackMaterial (const Graphic3d_MaterialAspect& theMaterial) { myBackMaterial = theMaterial; }
//! Returns true if back faces should be suppressed (true by default).
bool ToSuppressBackFaces() const { return myToSuppressBackFaces; }
//! Assign back faces culling flag.
void SetSuppressBackFaces (bool theToSuppress) { myToSuppressBackFaces = theToSuppress; }
//! Returns true if back faces should be suppressed (true by default).
bool BackFace() const { return myToSuppressBackFaces; }
//! Allows the display of back-facing filled polygons.
void AllowBackFace() { myToSuppressBackFaces = false; }
//! Suppress the display of back-facing filled polygons.
//! A back-facing polygon is defined as a polygon whose
//! vertices are in a clockwise order with respect to screen coordinates.
void SuppressBackFace() { myToSuppressBackFaces = true; }
//! Returns true if material properties should be distinguished for back and front faces (false by default).
bool Distinguish() const { return myToDistinguishMaterials; }
//! Set material distinction between front and back faces.
void SetDistinguish (bool toDistinguish) { myToDistinguishMaterials = toDistinguish; }
//! Allows material distinction between front and back faces.
void SetDistinguishOn() { myToDistinguishMaterials = true; }
//! Forbids material distinction between front and back faces.
void SetDistinguishOff() { myToDistinguishMaterials = false; }
//! Return shader program.
const Handle(Graphic3d_ShaderProgram)& ShaderProgram() const { return myProgram; }
//! Sets up OpenGL/GLSL shader program.
void SetShaderProgram (const Handle(Graphic3d_ShaderProgram)& theProgram) { myProgram = theProgram; }
//! Return texture array to be mapped.
const Handle(Graphic3d_TextureSet)& TextureSet() const { return myTextureSet; }
//! Setup texture array to be mapped.
void SetTextureSet (const Handle(Graphic3d_TextureSet)& theTextures) { myTextureSet = theTextures; }
//! Return texture to be mapped.
//Standard_DEPRECATED("Deprecated method, TextureSet() should be used instead")
Handle(Graphic3d_TextureMap) TextureMap() const
{
return !myTextureSet.IsNull() && !myTextureSet->IsEmpty()
? myTextureSet->First()
: Handle(Graphic3d_TextureMap)();
}
//! Assign texture to be mapped.
//! See also SetTextureMapOn() to actually activate texture mapping.
//Standard_DEPRECATED("Deprecated method, SetTextureSet() should be used instead")
Standard_EXPORT void SetTextureMap (const Handle(Graphic3d_TextureMap)& theTexture);
//! Return true if texture mapping is enabled (false by default).
bool ToMapTexture() const { return myToMapTexture; }
//! Return true if texture mapping is enabled (false by default).
bool TextureMapState() const { return myToMapTexture; }
//! Enable or disable texture mapping (has no effect if texture is not set).
void SetTextureMapOn (bool theToMap) { myToMapTexture = theToMap; }
//! Enable texture mapping (has no effect if texture is not set).
void SetTextureMapOn() { myToMapTexture = true; }
//! Disable texture mapping.
void SetTextureMapOff() { myToMapTexture = false; }
//! Returns current polygon offsets settings.
const Graphic3d_PolygonOffset& PolygonOffset() const { return myPolygonOffset; }
//! Sets polygon offsets settings.
void SetPolygonOffset (const Graphic3d_PolygonOffset& theOffset) { myPolygonOffset = theOffset; }
//! Returns current polygon offsets settings.
void PolygonOffsets (Standard_Integer& theMode,
Standard_ShortReal& theFactor,
Standard_ShortReal& theUnits) const
{
theMode = myPolygonOffset.Mode;
theFactor = myPolygonOffset.Factor;
theUnits = myPolygonOffset.Units;
}
//! Sets up OpenGL polygon offsets mechanism.
//! <aMode> parameter can contain various combinations of
//! Aspect_PolygonOffsetMode enumeration elements (Aspect_POM_None means
//! that polygon offsets are not changed).
//! If <aMode> is different from Aspect_POM_Off and Aspect_POM_None, then <aFactor> and <aUnits>
//! arguments are used by graphic renderer to calculate a depth offset value:
//!
//! offset = <aFactor> * m + <aUnits> * r, where
//! m - maximum depth slope for the polygon currently being displayed,
//! r - minimum window coordinates depth resolution (implementation-specific)
//!
//! Default settings for OCC 3D viewer: mode = Aspect_POM_Fill, factor = 1., units = 0.
//!
//! Negative offset values move polygons closer to the viewport,
//! while positive values shift polygons away.
//! Consult OpenGL reference for details (glPolygonOffset function description).
void SetPolygonOffsets (const Standard_Integer theMode,
const Standard_ShortReal theFactor = 1.0f,
const Standard_ShortReal theUnits = 0.0f)
{
myPolygonOffset.Mode = (Aspect_PolygonOffsetMode )(theMode & Aspect_POM_Mask);
myPolygonOffset.Factor = theFactor;
myPolygonOffset.Units = theUnits;
}
//! @name parameters specific to Line primitive rendering
public:
//! Return line type; Aspect_TOL_SOLID by default.
Aspect_TypeOfLine LineType() const { return myLineType; }
//! Modifies the line type
void SetLineType (Aspect_TypeOfLine theType) { myLineType = theType; }
//! Return width for edges in pixels; 1.0 by default.
Standard_ShortReal LineWidth() const { return myLineWidth; }
//! Modifies the line thickness
//! Warning: Raises Standard_OutOfRange if the width is a negative value.
void SetLineWidth (Standard_ShortReal theWidth)
{
if (theWidth <= 0.0f)
{
throw Standard_OutOfRange ("Bad value for EdgeLineWidth");
}
myLineWidth = theWidth;
}
//! @name parameters specific to Point (Marker) primitive rendering
public:
//! Return marker type; Aspect_TOM_POINT by default.
Aspect_TypeOfMarker MarkerType() const { return myMarkerType; }
//! Modifies the type of marker.
void SetMarkerType (Aspect_TypeOfMarker theType) { myMarkerType = theType; }
//! Return marker scale factor; 1.0 by default.
Standard_ShortReal MarkerScale() const { return myMarkerScale; }
//! Modifies the scale factor.
//! Marker type Aspect_TOM_POINT is not affected by the marker size scale factor.
//! It is always the smallest displayable dot.
//! Warning: Raises Standard_OutOfRange if the scale is a negative value.
void SetMarkerScale (const Standard_ShortReal theScale)
{
if (theScale <= 0.0f)
{
throw Standard_OutOfRange ("Bad value for MarkerScale");
}
myMarkerScale = theScale;
}
//! Returns marker's image texture.
//! Could be null handle if marker aspect has been initialized as default type of marker.
const Handle(Graphic3d_MarkerImage)& MarkerImage() const { return myMarkerImage; }
//! Set marker's image texture.
void SetMarkerImage (const Handle(Graphic3d_MarkerImage)& theImage) { myMarkerImage = theImage; }
//! @name parameters specific to text rendering
public:
//! Returns the font; NULL string by default.
const Handle(TCollection_HAsciiString)& TextFont() const { return myTextFont; }
//! Modifies the font.
void SetTextFont (const Handle(TCollection_HAsciiString)& theFont) { myTextFont = theFont; }
//! Returns text FontAspect
Font_FontAspect TextFontAspect() const { return myTextFontAspect; }
//! Turns usage of Aspect text
void SetTextFontAspect (Font_FontAspect theFontAspect) { myTextFontAspect = theFontAspect; }
//! Returns display type; Aspect_TODT_NORMAL by default.
Aspect_TypeOfDisplayText TextDisplayType() const { return myTextDisplayType; }
//! Sets display type.
void SetTextDisplayType (Aspect_TypeOfDisplayText theType) { myTextDisplayType = theType; }
//! Returns text background/shadow color; equals to EdgeColor() property.
const Quantity_ColorRGBA& ColorSubTitleRGBA() const { return myEdgeColor; }
//! Return text background/shadow color; equals to EdgeColor() property.
const Quantity_Color& ColorSubTitle() const { return myEdgeColor.GetRGB(); }
//! Modifies text background/shadow color; equals to EdgeColor() property.
void SetColorSubTitle (const Quantity_Color& theColor) { myEdgeColor.SetRGB (theColor); }
//! Modifies text background/shadow color; equals to EdgeColor() property.
void SetColorSubTitle (const Quantity_ColorRGBA& theColor) { myEdgeColor = theColor; }
//! Returns TRUE when the Text Zoomable is on.
bool IsTextZoomable() const { return myIsTextZoomable; }
//! Turns usage of text zoomable on/off
void SetTextZoomable (bool theFlag) { myIsTextZoomable = theFlag; }
//! Returns the text style; Aspect_TOST_NORMAL by default.
Aspect_TypeOfStyleText TextStyle() const { return myTextStyle; }
//! Modifies the style of the text.
void SetTextStyle (Aspect_TypeOfStyleText theStyle) { myTextStyle = theStyle; }
//! Returns Angle of degree
Standard_ShortReal TextAngle() const { return myTextAngle; }
//! Turns usage of text rotated
void SetTextAngle (Standard_ShortReal theAngle) { myTextAngle = (Standard_ShortReal )theAngle; }
//! @name parameters specific to Mesh Edges (of triangulation primitive) rendering
public:
//! Returns true if mesh edges should be drawn (false by default).
bool ToDrawEdges() const { return myToDrawEdges && myLineType != Aspect_TOL_EMPTY; }
//! Set if mesh edges should be drawn or not.
void SetDrawEdges (bool theToDraw)
{
myToDrawEdges = theToDraw;
if (myLineType == Aspect_TOL_EMPTY)
{
myLineType = Aspect_TOL_SOLID;
}
}
//! The edges of FillAreas are drawn.
void SetEdgeOn() { SetDrawEdges (true); }
//! The edges of FillAreas are not drawn.
void SetEdgeOff() { SetDrawEdges (false); }
//! Return color of edges.
const Quantity_Color& EdgeColor() const { return myEdgeColor.GetRGB(); }
//! Return color of edges.
const Quantity_ColorRGBA& EdgeColorRGBA() const { return myEdgeColor; }
//! Modifies the color of the edge of the face
void SetEdgeColor (const Quantity_Color& theColor) { myEdgeColor.SetRGB (theColor); }
//! Modifies the color of the edge of the face
void SetEdgeColor (const Quantity_ColorRGBA& theColor) { myEdgeColor = theColor; }
//! Return edges line type (same as LineType()).
Aspect_TypeOfLine EdgeLineType() const { return myLineType; }
//! Modifies the edge line type (same as SetLineType())
void SetEdgeLineType (Aspect_TypeOfLine theType) { myLineType = theType; }
//! Return width for edges in pixels (same as LineWidth()).
Standard_ShortReal EdgeWidth() const { return myLineWidth; }
//! Modifies the edge thickness (same as SetLineWidth())
void SetEdgeWidth (Standard_Real theWidth) { SetLineWidth ((Standard_ShortReal )theWidth); }
//! Returns TRUE if drawing element edges should discard first edge in triangle; FALSE by default.
//! Graphics hardware works mostly with triangles, so that wireframe presentation will draw triangle edges by default.
//! This flag allows rendering wireframe presentation of quad-only array split into triangles.
//! For this, quads should be split in specific order, so that the quad diagonal (to be NOT rendered) goes first:
//! 1------2
//! / / Triangle #1: 2-0-1; Triangle #2: 0-2-3
//! 0------3
bool ToSkipFirstEdge() const { return myToSkipFirstEdge; }
//! Set skip first triangle edge flag for drawing wireframe presentation of quads array split into triangles.
void SetSkipFirstEdge (bool theToSkipFirstEdge) { myToSkipFirstEdge = theToSkipFirstEdge; }
//! Returns TRUE if silhouette (outline) should be drawn (with edge color and width); FALSE by default.
bool ToDrawSilhouette() const { return myToDrawSilhouette; }
//! Enables/disables drawing silhouette (outline).
void SetDrawSilhouette (bool theToDraw) { myToDrawSilhouette = theToDraw; }
public:
//! Returns the hatch type used when InteriorStyle is IS_HATCH
const Handle(Graphic3d_HatchStyle)& HatchStyle() const { return myHatchStyle; }
//! Modifies the hatch type used when InteriorStyle is IS_HATCH
void SetHatchStyle (const Handle(Graphic3d_HatchStyle)& theStyle) { myHatchStyle = theStyle; }
//! Modifies the hatch type used when InteriorStyle is IS_HATCH
//! @warning This method always creates a new handle for a given hatch style
void SetHatchStyle (const Aspect_HatchStyle theStyle)
{
if (theStyle == Aspect_HS_SOLID)
{
myHatchStyle.Nullify();
return;
}
myHatchStyle = new Graphic3d_HatchStyle (theStyle);
}
public:
//! Check for equality with another aspects.
bool IsEqual (const Graphic3d_Aspects& theOther)
{
if (this == &theOther)
{
return true;
}
return myProgram == theOther.myProgram
&& myTextureSet == theOther.myTextureSet
&& myMarkerImage == theOther.myMarkerImage
&& myInteriorColor == theOther.myInteriorColor
&& myBackInteriorColor == theOther.myBackInteriorColor
&& myFrontMaterial == theOther.myFrontMaterial
&& myBackMaterial == theOther.myBackMaterial
&& myInteriorStyle == theOther.myInteriorStyle
&& myShadingModel == theOther.myShadingModel
&& myAlphaMode == theOther.myAlphaMode
&& myAlphaCutoff == theOther.myAlphaCutoff
&& myLineType == theOther.myLineType
&& myEdgeColor == theOther.myEdgeColor
&& myLineWidth == theOther.myLineWidth
&& myMarkerType == theOther.myMarkerType
&& myMarkerScale == theOther.myMarkerScale
&& myHatchStyle == theOther.myHatchStyle
&& myTextFont == theOther.myTextFont
&& myPolygonOffset == theOther.myPolygonOffset
&& myTextStyle == theOther.myTextStyle
&& myTextDisplayType == theOther.myTextDisplayType
&& myTextFontAspect == theOther.myTextFontAspect
&& myTextAngle == theOther.myTextAngle
&& myToSkipFirstEdge == theOther.myToSkipFirstEdge
&& myToDistinguishMaterials == theOther.myToDistinguishMaterials
&& myToDrawEdges == theOther.myToDrawEdges
&& myToDrawSilhouette == theOther.myToDrawSilhouette
&& myToSuppressBackFaces == theOther.myToSuppressBackFaces
&& myToMapTexture == theOther.myToMapTexture
&& myIsTextZoomable == theOther.myIsTextZoomable;
}
protected:
Handle(Graphic3d_ShaderProgram) myProgram;
Handle(Graphic3d_TextureSet) myTextureSet;
Handle(Graphic3d_MarkerImage) myMarkerImage;
Handle(Graphic3d_HatchStyle) myHatchStyle;
Handle(TCollection_HAsciiString) myTextFont;
Graphic3d_MaterialAspect myFrontMaterial;
Graphic3d_MaterialAspect myBackMaterial;
Quantity_ColorRGBA myInteriorColor;
Quantity_ColorRGBA myBackInteriorColor;
Quantity_ColorRGBA myEdgeColor;
Graphic3d_PolygonOffset myPolygonOffset;
Aspect_InteriorStyle myInteriorStyle;
Graphic3d_TypeOfShadingModel myShadingModel;
Graphic3d_AlphaMode myAlphaMode;
Standard_ShortReal myAlphaCutoff;
Aspect_TypeOfLine myLineType;
Standard_ShortReal myLineWidth;
Aspect_TypeOfMarker myMarkerType;
Standard_ShortReal myMarkerScale;
Aspect_TypeOfStyleText myTextStyle;
Aspect_TypeOfDisplayText myTextDisplayType;
Font_FontAspect myTextFontAspect;
Standard_ShortReal myTextAngle;
bool myToSkipFirstEdge;
bool myToDistinguishMaterials;
bool myToDrawEdges;
bool myToDrawSilhouette;
bool myToSuppressBackFaces;
bool myToMapTexture;
bool myIsTextZoomable;
};
DEFINE_STANDARD_HANDLE(Graphic3d_Aspects, Standard_Transient)
#endif // _Graphic3d_Aspects_HeaderFile

View File

@@ -211,6 +211,68 @@ void Graphic3d_Group::Update() const
myStructure->StructureManager()->Update();
}
// =======================================================================
// function : IsGroupPrimitivesAspectSet
// purpose :
// =======================================================================
Standard_Boolean Graphic3d_Group::IsGroupPrimitivesAspectSet (const Graphic3d_GroupAspect theAspect) const
{
switch (theAspect)
{
case Graphic3d_ASPECT_LINE: return !LineAspect().IsNull();
case Graphic3d_ASPECT_TEXT: return !TextAspect().IsNull();
case Graphic3d_ASPECT_MARKER: return !MarkerAspect().IsNull();
case Graphic3d_ASPECT_FILL_AREA: return !FillAreaAspect().IsNull();
default: return Standard_False;
}
}
// =======================================================================
// function : GroupPrimitivesAspect
// purpose :
// =======================================================================
void Graphic3d_Group::GroupPrimitivesAspect (const Handle(Graphic3d_AspectLine3d)& theAspLine,
const Handle(Graphic3d_AspectText3d)& theAspText,
const Handle(Graphic3d_AspectMarker3d)& theAspMarker,
const Handle(Graphic3d_AspectFillArea3d)& theAspFill) const
{
if (!theAspLine.IsNull())
{
Handle(Graphic3d_AspectLine3d) aLineAspect = LineAspect();
if (!aLineAspect.IsNull())
{
*theAspLine.operator->() = *aLineAspect;
}
}
if (!theAspText.IsNull())
{
Handle(Graphic3d_AspectText3d) aTextAspect = TextAspect();
if (!aTextAspect.IsNull())
{
*theAspText.operator->() = *aTextAspect;
}
}
if (!theAspMarker.IsNull())
{
Handle(Graphic3d_AspectMarker3d) aMarkerAspect = MarkerAspect();
if (!aMarkerAspect.IsNull())
{
*theAspMarker.operator->() = *aMarkerAspect;
}
}
if (!theAspFill.IsNull())
{
Handle(Graphic3d_AspectFillArea3d) aFillAspect = FillAreaAspect();
if (!aFillAspect.IsNull())
{
*theAspFill.operator->() = *aFillAspect;
}
}
}
// =======================================================================
// function : AddPrimitiveArray
// purpose :

View File

@@ -17,12 +17,17 @@
#ifndef _Graphic3d_Group_HeaderFile
#define _Graphic3d_Group_HeaderFile
#include <Standard.hxx>
#include <Standard_Type.hxx>
#include <Graphic3d_BndBox4f.hxx>
#include <Standard_Boolean.hxx>
#include <Graphic3d_AspectLine3d.hxx>
#include <Graphic3d_AspectFillArea3d.hxx>
#include <Graphic3d_AspectText3d.hxx>
#include <Graphic3d_AspectMarker3d.hxx>
#include <Graphic3d_MapOfAspectsToAspects.hxx>
#include <Standard_Transient.hxx>
#include <Standard_Real.hxx>
#include <Standard_CString.hxx>
#include <Graphic3d_Vertex.hxx>
#include <Graphic3d_TextPath.hxx>
@@ -32,6 +37,8 @@
#include <Graphic3d_IndexBuffer.hxx>
#include <Graphic3d_Buffer.hxx>
#include <Graphic3d_BoundBuffer.hxx>
#include <Standard_Address.hxx>
#include <Graphic3d_GroupAspect.hxx>
#include <gp_Ax2.hxx>
#include <TCollection_ExtendedString.hxx>
@@ -95,20 +102,70 @@ public:
public:
//! Return line aspect.
virtual Handle(Graphic3d_AspectLine3d) LineAspect() const = 0;
//! Assign line aspect to the group.
virtual void SetGroupPrimitivesAspect (const Handle(Graphic3d_AspectLine3d)& theAspect) = 0;
//! Return fill area aspect.
virtual Handle(Graphic3d_Aspects) Aspects() const = 0;
virtual Handle(Graphic3d_AspectFillArea3d) FillAreaAspect() const = 0;
//! Modifies the context for all the face primitives of the group.
virtual void SetGroupPrimitivesAspect (const Handle(Graphic3d_Aspects)& theAspect) = 0;
virtual void SetGroupPrimitivesAspect (const Handle(Graphic3d_AspectFillArea3d)& theAspect) = 0;
//! Modifies the current context of the group to give another aspect for all the primitives created after this call in the group.
virtual void SetPrimitivesAspect (const Handle(Graphic3d_Aspects)& theAspect) = 0;
//! Return text aspect.
virtual Handle(Graphic3d_AspectText3d) TextAspect() const = 0;
//! Modifies the context for all the text primitives of the group.
virtual void SetGroupPrimitivesAspect (const Handle(Graphic3d_AspectText3d)& theAspect) = 0;
//! Return marker aspect.
virtual Handle(Graphic3d_AspectMarker3d) MarkerAspect() const = 0;
//! Modifies the context for all the marker primitives of the group.
virtual void SetGroupPrimitivesAspect (const Handle(Graphic3d_AspectMarker3d)& theAspect) = 0;
//! Modifies the current context of the group to give
//! another aspect for all the line primitives created
//! after this call in the group.
virtual void SetPrimitivesAspect (const Handle(Graphic3d_AspectLine3d)& theAspect) = 0;
//! Modifies the current context of the group to give
//! another aspect for all the face primitives created
//! after this call in the group.
virtual void SetPrimitivesAspect (const Handle(Graphic3d_AspectFillArea3d)& theAspect) = 0;
//! Modifies the current context of the group to give
//! another aspect for all the text primitives created
//! after this call in the group.
virtual void SetPrimitivesAspect (const Handle(Graphic3d_AspectText3d)& theAspect) = 0;
//! Modifies the current context of the group to give
//! another aspect for all the marker primitives created
//! after this call in the group.
virtual void SetPrimitivesAspect (const Handle(Graphic3d_AspectMarker3d)& theAspect) = 0;
//! Update presentation aspects after their modification.
virtual void SynchronizeAspects() = 0;
//! Replace aspects specified in the replacement map.
virtual void ReplaceAspects (const Graphic3d_MapOfAspectsToAspects& theMap) = 0;
//! Returns TRUE if aspect is set for the group.
Standard_EXPORT Standard_Boolean IsGroupPrimitivesAspectSet (const Graphic3d_GroupAspect theAspect) const;
//! Returns the context of all the primitives of the group.
Standard_EXPORT void GroupPrimitivesAspect (const Handle(Graphic3d_AspectLine3d)& theAspLine,
const Handle(Graphic3d_AspectText3d)& theAspText,
const Handle(Graphic3d_AspectMarker3d)& theAspMarker,
const Handle(Graphic3d_AspectFillArea3d)& theAspFill) const;
//! Returns the last inserted context in the group for each kind of primitives.
void PrimitivesAspect (const Handle(Graphic3d_AspectLine3d)& theAspLine,
const Handle(Graphic3d_AspectText3d)& theAspText,
const Handle(Graphic3d_AspectMarker3d)& theAspMarker,
const Handle(Graphic3d_AspectFillArea3d)& theAspFill) const
{
GroupPrimitivesAspect (theAspLine, theAspText, theAspMarker, theAspFill);
}
public:

View File

@@ -1,23 +0,0 @@
// Copyright (c) 2019 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#ifndef _Graphic3d_MapOfAspectsToAspects_Header
#define _Graphic3d_MapOfAspectsToAspects_Header
#include <NCollection_DataMap.hxx>
#include <Standard_Transient.hxx>
class Graphic3d_Aspects;
typedef NCollection_DataMap<Handle(Graphic3d_Aspects), Handle(Graphic3d_Aspects)> Graphic3d_MapOfAspectsToAspects;
#endif // _Graphic3d_MapOfAspectsToAspects_Header

View File

@@ -25,14 +25,6 @@ struct Graphic3d_PolygonOffset
//! Empty constructor.
Graphic3d_PolygonOffset() : Mode(Aspect_POM_Fill), Factor (1.0f), Units (0.0f) {}
//! Equality comparison.
bool operator== (const Graphic3d_PolygonOffset& theOther) const
{
return Mode == theOther.Mode
&& Factor == theOther.Factor
&& Units == theOther.Units;
}
};
#endif // _Graphic3d_PolygonOffset_HeaderFile

View File

@@ -60,11 +60,6 @@ public:
//! Returns unique ID used to manage resource in graphic driver.
const TCollection_AsciiString& GetId() const { return myID; }
//! Sets unique ID used to manage resource in graphic driver.
//! WARNING! Graphic3d_ShaderProgram constructor generates a unique id for proper resource management;
//! however if application overrides it, it is responsibility of application to avoid name collisions.
void SetId (const TCollection_AsciiString& theId) { myID = theId; }
//! Returns GLSL header (version code and extensions).
const TCollection_AsciiString& Header() const { return myHeader; }

View File

@@ -127,14 +127,12 @@ static void AddCompositeShape (const Handle(XCAFDoc_ShapeTool)& theSTool,
if( nbSimple && aHasCompositeSubShape)
{
theSTool->AddShape( aSimpleShape, Standard_False, Standard_False );
TopoDS_Compound aNewShape;
aB.MakeCompound(aNewShape);
aB.Add(aNewShape, aSimpleShape);
aB.Add(aNewShape,aCompShape);
if (!aLoc.IsIdentity())
aNewShape.Location(aLoc );
//if (!aLoc.IsIdentity())
// aNewShape.Location(aLoc );
aNewShape.Orientation(theShape.Orientation());
theSTool->AddShape( aNewShape, aHasCompositeSubShape, Standard_False );
}

View File

@@ -25,32 +25,6 @@
#include <TopTools_MapOfShape.hxx>
#include <Geom_Surface.hxx>
namespace
{
//=======================================================================
// Function: visitEdges
// Purpose : Explodes the given shape on edges according to the specified
// criteria and visits each one in order to add it to data model.
//=======================================================================
void visitEdges (const Handle (IMeshTools_ShapeVisitor)& theVisitor,
const TopoDS_Shape& theShape,
const TopAbs_ShapeEnum theToFind,
const TopAbs_ShapeEnum theToAvoid = TopAbs_SHAPE)
{
TopExp_Explorer aEdgesIt (theShape, theToFind, theToAvoid);
for (; aEdgesIt.More (); aEdgesIt.Next ())
{
const TopoDS_Edge& aEdge = TopoDS::Edge (aEdgesIt.Current ());
if (!BRep_Tool::IsGeometric (aEdge))
{
continue;
}
theVisitor->Visit (aEdge);
}
}
}
//=======================================================================
// Function: Constructor
// Purpose :
@@ -76,15 +50,28 @@ IMeshTools_ShapeExplorer::~IMeshTools_ShapeExplorer ()
void IMeshTools_ShapeExplorer::Accept (
const Handle (IMeshTools_ShapeVisitor)& theVisitor)
{
// Explore all free edges in shape.
visitEdges (theVisitor, GetShape (), TopAbs_EDGE, TopAbs_FACE);
// Explore all edges in shape - either free or related to some face.
TopTools_IndexedMapOfShape aEdges;
TopExp::MapShapes (GetShape (), TopAbs_EDGE, aEdges);
// Explore all related to some face edges in shape.
// make array of faces suitable for processing (excluding faces without surface)
TopTools_IndexedMapOfShape::Iterator aEdgeIt (aEdges);
for (; aEdgeIt.More (); aEdgeIt.Next ())
{
const TopoDS_Edge& aEdge = TopoDS::Edge (aEdgeIt.Value ());
if (!BRep_Tool::IsGeometric(aEdge))
{
continue;
}
theVisitor->Visit (aEdge);
}
// Explore faces
TopTools_ListOfShape aFaceList;
BRepLib::ReverseSortFaces (GetShape (), aFaceList);
TopTools_MapOfShape aFaceMap;
// make array of faces suitable for processing (excluding faces without surface)
TopLoc_Location aDummyLoc;
const TopLoc_Location aEmptyLoc;
TopTools_ListIteratorOfListOfShape aFaceIter (aFaceList);
@@ -97,16 +84,13 @@ void IMeshTools_ShapeExplorer::Accept (
continue; // already processed
}
const TopoDS_Face& aFace = TopoDS::Face (aFaceIter.Value ());
TopoDS_Face aFace = TopoDS::Face (aFaceIter.Value ());
const Handle (Geom_Surface)& aSurf = BRep_Tool::Surface (aFace, aDummyLoc);
if (aSurf.IsNull())
{
continue;
}
// Explore all edges in face.
visitEdges (theVisitor, aFace, TopAbs_EDGE);
// Store only forward faces in order to prevent inverse issue.
theVisitor->Visit (TopoDS::Face (aFace.Oriented (TopAbs_FORWARD)));
}

View File

@@ -899,10 +899,6 @@ static Standard_Integer VtkMoveTo(Draw_Interpretor& theDI,
Standard_Integer anY = GetInteractor()->GetRenderWindow()->GetSize()[1] - atoi (theArgs[2]) - 1;
GetInteractor()->MoveTo (atoi (theArgs[1]), anY);
gp_XYZ aPickPnt;
GetInteractor()->Selector()->GetPickPosition (aPickPnt.ChangeData());
theDI << aPickPnt.X() << " " << aPickPnt.Y() << " " << aPickPnt.Z();
return 0;
}

View File

@@ -58,7 +58,6 @@ public:
virtual void Enable();
virtual void Start() { }
const PSelector& Selector() const { return mySelector; }
void SetShapePicker (const PSelector& theSelector);
void SetPipelines (const Handle(ShapePipelineMap)& thePipelines);
void SetOCCWindow (const Handle(Aspect_Window)& theWindow);

View File

@@ -269,7 +269,6 @@ void IVtkOCC_ShapePickerAlgo::SubShapesPicked (const IVtk_IdType theId, IVtk_Sha
//================================================================
void IVtkOCC_ShapePickerAlgo::clearPicked()
{
myTopPickedPoint.SetCoord (RealLast(), RealLast(), RealLast());
myShapesPicked.Clear();
mySubShapesPicked.Clear();
}
@@ -290,11 +289,9 @@ int IVtkOCC_ShapePickerAlgo::NbPicked()
bool IVtkOCC_ShapePickerAlgo::processPicked()
{
Standard_Integer aNbPicked = myViewerSelector->NbPicked();
Handle(StdSelect_BRepOwner) anEntityOwner;
Handle(Message_Messenger) anOutput = Message::DefaultMessenger();
bool isTop = true;
for (Standard_Integer aDetectIt = 1; aDetectIt <= aNbPicked; aDetectIt++)
{
// ViewerSelector detects sensitive entities under the mouse
@@ -323,11 +320,6 @@ bool IVtkOCC_ShapePickerAlgo::processPicked()
IVtk_IdType aTopLevelId = aSelShape->GetId();
myShapesPicked.Append (aTopLevelId);
if (isTop)
{
isTop = false;
myTopPickedPoint = myViewerSelector->PickedPoint (aDetectIt);
}
// Now try to guess if it's the top-level shape itself or just a sub-shape picked
TopoDS_Shape aTopLevelShape = aSelShape->GetShape();

View File

@@ -100,9 +100,6 @@ public: //! @name Obtain picking results
//! @param [in] theShape the selectable shape
Standard_EXPORT virtual void RemoveSelectableObject(const IVtk_IShape::Handle& theShape);
//! Return topmost picked 3D point or (Inf, Inf, Inf) if undefined.
const gp_Pnt& TopPickedPoint() const { return myTopPickedPoint; }
public:
DEFINE_STANDARD_RTTIEXT(IVtkOCC_ShapePickerAlgo,IVtk_IShapePickerAlgo)
@@ -124,7 +121,6 @@ private:
IVtk_IView::Handle myView;
IVtk_ShapeIdList myShapesPicked;
IVtk_SubShapeMap mySubShapesPicked;
gp_Pnt myTopPickedPoint;
Handle(IVtkOCC_ViewerSelector) myViewerSelector;
};

View File

@@ -193,10 +193,6 @@ void IVtkTools_ShapePicker::doPickImpl (double* thePos,
{
myOccPickerAlgo->Pick (thePos[0], thePos[1]);
}
PickPosition[0] = myOccPickerAlgo->TopPickedPoint().X();
PickPosition[1] = myOccPickerAlgo->TopPickedPoint().Y();
PickPosition[2] = myOccPickerAlgo->TopPickedPoint().Z();
}
//============================================================================

View File

@@ -34,8 +34,6 @@
#include <gp.hxx>
#include <Message.hxx>
#include <Message_Messenger.hxx>
#include <NCollection_Array1.hxx>
#include <Standard_ArrayStreamBuffer.hxx>
#include <TCollection_AsciiString.hxx>
#include <TCollection_ExtendedString.hxx>
#include <OSD_OpenFile.hxx>
@@ -112,109 +110,6 @@ namespace
return FIT_UNKNOWN;
}
}
//! Wrapper for accessing C++ stream from FreeImage.
class Image_FreeImageStream
{
public:
//! Construct wrapper over input stream.
Image_FreeImageStream (std::istream& theStream)
: myIStream (&theStream), myOStream (NULL), myInitPos (theStream.tellg()) {}
//! Get io object.
FreeImageIO GetFiIO() const
{
FreeImageIO anIo;
memset (&anIo, 0, sizeof(anIo));
if (myIStream != NULL)
{
anIo.read_proc = readProc;
anIo.seek_proc = seekProc;
anIo.tell_proc = tellProc;
}
if (myOStream != NULL)
{
anIo.write_proc = writeProc;
}
return anIo;
}
public:
//! Simulate fread().
static unsigned int DLL_CALLCONV readProc (void* theBuffer, unsigned int theSize, unsigned int theCount, fi_handle theHandle)
{
Image_FreeImageStream* aThis = (Image_FreeImageStream* )theHandle;
if (aThis->myIStream == NULL)
{
return 0;
}
if (!aThis->myIStream->read ((char* )theBuffer, std::streamsize(theSize) * std::streamsize(theCount)))
{
//aThis->myIStream->clear();
}
const std::streamsize aNbRead = aThis->myIStream->gcount();
return (unsigned int )(aNbRead / theSize);
}
//! Simulate fwrite().
static unsigned int DLL_CALLCONV writeProc (void* theBuffer, unsigned int theSize, unsigned int theCount, fi_handle theHandle)
{
Image_FreeImageStream* aThis = (Image_FreeImageStream* )theHandle;
if (aThis->myOStream != NULL
&& aThis->myOStream->write ((const char* )theBuffer, std::streamsize(theSize) * std::streamsize(theCount)))
{
return theCount;
}
return 0;
}
//! Simulate fseek().
static int DLL_CALLCONV seekProc (fi_handle theHandle, long theOffset, int theOrigin)
{
Image_FreeImageStream* aThis = (Image_FreeImageStream* )theHandle;
if (aThis->myIStream == NULL)
{
return -1;
}
bool isSeekDone = false;
switch (theOrigin)
{
case SEEK_SET:
if (aThis->myIStream->seekg ((std::streamoff )aThis->myInitPos + theOffset, std::ios::beg))
{
isSeekDone = true;
}
break;
case SEEK_CUR:
if (aThis->myIStream->seekg (theOffset, std::ios::cur))
{
isSeekDone = true;
}
break;
case SEEK_END:
if (aThis->myIStream->seekg (theOffset, std::ios::end))
{
isSeekDone = true;
}
break;
}
return isSeekDone ? 0 : -1;
}
//! Simulate ftell().
static long DLL_CALLCONV tellProc (fi_handle theHandle)
{
Image_FreeImageStream* aThis = (Image_FreeImageStream* )theHandle;
const long aPos = aThis->myIStream != NULL ? (long )(aThis->myIStream->tellg() - aThis->myInitPos) : 0;
return aPos;
}
private:
std::istream* myIStream;
std::ostream* myOStream;
std::streampos myInitPos;
};
#elif defined(HAVE_WINCODEC)
//! Return a zero GUID
@@ -489,50 +384,21 @@ void Image_AlienPixMap::Clear()
#endif
}
// =======================================================================
// function : IsTopDownDefault
// purpose :
// =======================================================================
bool Image_AlienPixMap::IsTopDownDefault()
{
#ifdef HAVE_FREEIMAGE
return false;
#elif defined(HAVE_WINCODEC)
return true;
#else
return false;
#endif
}
// =======================================================================
// function : Load
// purpose :
// =======================================================================
#ifdef HAVE_FREEIMAGE
bool Image_AlienPixMap::Load (const Standard_Byte* theData,
Standard_Size theLength,
const TCollection_AsciiString& theImagePath)
bool Image_AlienPixMap::Load (const TCollection_AsciiString& theImagePath)
{
Clear();
#ifdef _WIN32
const TCollection_ExtendedString aFileNameW (theImagePath);
FREE_IMAGE_FORMAT aFIF = FreeImage_GetFileTypeU (aFileNameW.ToWideString(), 0);
#else
FREE_IMAGE_FORMAT aFIF = FreeImage_GetFileType (theImagePath.ToCString(), 0);
#endif
FREE_IMAGE_FORMAT aFIF = FIF_UNKNOWN;
FIMEMORY* aFiMem = NULL;
if (theData != NULL)
{
aFiMem = FreeImage_OpenMemory ((BYTE* )theData, (DWORD )theLength);
aFIF = FreeImage_GetFileTypeFromMemory (aFiMem, 0);
}
else
{
#ifdef _WIN32
aFIF = FreeImage_GetFileTypeU (aFileNameW.ToWideString(), 0);
#else
aFIF = FreeImage_GetFileType (theImagePath.ToCString(), 0);
#endif
}
if (aFIF == FIF_UNKNOWN)
{
// no signature? try to guess the file format from the file extension
@@ -540,12 +406,10 @@ bool Image_AlienPixMap::Load (const Standard_Byte* theData,
}
if ((aFIF == FIF_UNKNOWN) || !FreeImage_FIFSupportsReading (aFIF))
{
::Message::DefaultMessenger()->Send (TCollection_AsciiString ("Error: image '") + theImagePath + "' has unsupported file format.",
Message_Fail);
if (aFiMem != NULL)
{
FreeImage_CloseMemory (aFiMem);
}
TCollection_AsciiString aMessage = "Error: image file '";
aMessage.AssignCat (theImagePath);
aMessage.AssignCat ("' has unsupported file format.");
::Message::DefaultMessenger()->Send (aMessage, Message_Fail);
return false;
}
@@ -561,21 +425,11 @@ bool Image_AlienPixMap::Load (const Standard_Byte* theData,
aLoadFlags = ICO_MAKEALPHA;
}
FIBITMAP* anImage = NULL;
if (theData != NULL)
{
anImage = FreeImage_LoadFromMemory (aFIF, aFiMem, aLoadFlags);
FreeImage_CloseMemory (aFiMem);
aFiMem = NULL;
}
else
{
#ifdef _WIN32
anImage = FreeImage_LoadU (aFIF, aFileNameW.ToWideString(), aLoadFlags);
#else
anImage = FreeImage_Load (aFIF, theImagePath.ToCString(), aLoadFlags);
#endif
}
#ifdef _WIN32
FIBITMAP* anImage = FreeImage_LoadU (aFIF, aFileNameW.ToWideString(), aLoadFlags);
#else
FIBITMAP* anImage = FreeImage_Load (aFIF, theImagePath.ToCString(), aLoadFlags);
#endif
if (anImage == NULL)
{
TCollection_AsciiString aMessage = "Error: image file '";
@@ -591,8 +445,10 @@ bool Image_AlienPixMap::Load (const Standard_Byte* theData,
if (aFormat == Image_Format_UNKNOWN)
{
//anImage = FreeImage_ConvertTo24Bits (anImage);
::Message::DefaultMessenger()->Send ( TCollection_AsciiString ("Error: image '") + theImagePath + "' has unsupported pixel format.",
Message_Fail);
TCollection_AsciiString aMessage = "Error: image file '";
aMessage.AssignCat (theImagePath);
aMessage.AssignCat ("' has unsupported pixel format.");
::Message::DefaultMessenger()->Send (aMessage, Message_Fail);
return false;
}
@@ -604,106 +460,25 @@ bool Image_AlienPixMap::Load (const Standard_Byte* theData,
myLibImage = anImage;
return true;
}
bool Image_AlienPixMap::Load (std::istream& theStream,
const TCollection_AsciiString& theFileName)
{
Clear();
Image_FreeImageStream aStream (theStream);
FreeImageIO aFiIO = aStream.GetFiIO();
FREE_IMAGE_FORMAT aFIF = FreeImage_GetFileTypeFromHandle (&aFiIO, &aStream, 0);
if (aFIF == FIF_UNKNOWN)
{
// no signature? try to guess the file format from the file extension
aFIF = FreeImage_GetFIFFromFilename (theFileName.ToCString());
}
if ((aFIF == FIF_UNKNOWN) || !FreeImage_FIFSupportsReading (aFIF))
{
::Message::DefaultMessenger()->Send (TCollection_AsciiString ("Error: image stream '") + theFileName + "' has unsupported file format.",
Message_Fail);
return false;
}
int aLoadFlags = 0;
if (aFIF == FIF_GIF)
{
// 'Play' the GIF to generate each frame (as 32bpp) instead of returning raw frame data when loading
aLoadFlags = GIF_PLAYBACK;
}
else if (aFIF == FIF_ICO)
{
// convert to 32bpp and create an alpha channel from the AND-mask when loading
aLoadFlags = ICO_MAKEALPHA;
}
FIBITMAP* anImage = FreeImage_LoadFromHandle (aFIF, &aFiIO, &aStream, aLoadFlags);
if (anImage == NULL)
{
::Message::DefaultMessenger()->Send (TCollection_AsciiString ("Error: image stream '") + theFileName + "' is missing or invalid.",
Message_Fail);
return false;
}
Image_Format aFormat = convertFromFreeFormat (FreeImage_GetImageType(anImage),
FreeImage_GetColorType(anImage),
FreeImage_GetBPP (anImage));
if (aFormat == Image_Format_UNKNOWN)
{
::Message::DefaultMessenger()->Send (TCollection_AsciiString ("Error: image stream '") + theFileName + "' has unsupported pixel format.",
Message_Fail);
return false;
}
Image_PixMap::InitWrapper (aFormat, FreeImage_GetBits (anImage),
FreeImage_GetWidth (anImage), FreeImage_GetHeight (anImage), FreeImage_GetPitch (anImage));
SetTopDown (false);
// assign image after wrapper initialization (virtual Clear() called inside)
myLibImage = anImage;
return true;
}
#elif defined(HAVE_WINCODEC)
bool Image_AlienPixMap::Load (const Standard_Byte* theData,
Standard_Size theLength,
const TCollection_AsciiString& theFileName)
bool Image_AlienPixMap::Load (const TCollection_AsciiString& theImagePath)
{
Clear();
Image_ComPtr<IWICImagingFactory> aWicImgFactory;
IWICImagingFactory* aWicImgFactory = NULL;
CoInitializeEx (NULL, COINIT_MULTITHREADED);
if (CoCreateInstance (CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&aWicImgFactory.ChangePtr())) != S_OK)
if (CoCreateInstance (CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&aWicImgFactory)) != S_OK)
{
Message::DefaultMessenger()->Send ("Error: cannot initialize WIC Imaging Factory", Message_Fail);
return false;
}
Image_ComPtr<IWICBitmapDecoder> aWicDecoder;
Image_ComPtr<IWICStream> aWicStream;
if (theData != NULL)
const TCollection_ExtendedString aFileNameW (theImagePath);
if (aWicImgFactory->CreateDecoderFromFilename (aFileNameW.ToWideString(), NULL, GENERIC_READ, WICDecodeMetadataCacheOnDemand, &aWicDecoder.ChangePtr()) != S_OK)
{
if (aWicImgFactory->CreateStream (&aWicStream.ChangePtr()) != S_OK
|| aWicStream->InitializeFromMemory ((BYTE* )theData, (DWORD )theLength) != S_OK)
{
Message::DefaultMessenger()->Send ("Error: cannot initialize WIC Stream", Message_Fail);
return false;
}
if (aWicImgFactory->CreateDecoderFromStream (aWicStream.get(), NULL, WICDecodeMetadataCacheOnDemand, &aWicDecoder.ChangePtr()) != S_OK)
{
Message::DefaultMessenger()->Send ("Error: cannot create WIC Image Decoder", Message_Fail);
return false;
}
}
else
{
const TCollection_ExtendedString aFileNameW (theFileName);
if (aWicImgFactory->CreateDecoderFromFilename (aFileNameW.ToWideString(), NULL, GENERIC_READ, WICDecodeMetadataCacheOnDemand, &aWicDecoder.ChangePtr()) != S_OK)
{
Message::DefaultMessenger()->Send ("Error: cannot create WIC Image Decoder", Message_Fail);
return false;
}
Message::DefaultMessenger()->Send ("Error: cannot create WIC Image Decoder", Message_Fail);
return false;
}
UINT aFrameCount = 0, aFrameSizeX = 0, aFrameSizeY = 0;
@@ -752,45 +527,10 @@ bool Image_AlienPixMap::Load (const Standard_Byte* theData,
SetTopDown (true);
return true;
}
bool Image_AlienPixMap::Load (std::istream& theStream,
const TCollection_AsciiString& theFilePath)
{
Clear();
// fallback copying stream data into transient buffer
const std::streamoff aStart = theStream.tellg();
theStream.seekg (0, std::ios::end);
const Standard_Integer aLen = Standard_Integer(theStream.tellg() - aStart);
theStream.seekg (aStart);
if (aLen <= 0)
{
Message::DefaultMessenger()->Send ("Error: empty stream", Message_Fail);
return false;
}
NCollection_Array1<Standard_Byte> aBuff (1, aLen);
if (!theStream.read ((char* )&aBuff.ChangeFirst(), aBuff.Size()))
{
Message::DefaultMessenger()->Send ("Error: unable to read stream", Message_Fail);
return false;
}
return Load (&aBuff.ChangeFirst(), aBuff.Size(), theFilePath);
}
#else
bool Image_AlienPixMap::Load (std::istream& ,
const TCollection_AsciiString& )
bool Image_AlienPixMap::Load (const TCollection_AsciiString&)
{
Clear();
Message::DefaultMessenger()->Send ("Error: no image library available", Message_Fail);
return false;
}
bool Image_AlienPixMap::Load (const Standard_Byte* ,
Standard_Size ,
const TCollection_AsciiString& )
{
Clear();
Message::DefaultMessenger()->Send ("Error: no image library available", Message_Fail);
return false;
}
#endif
@@ -1034,9 +774,9 @@ bool Image_AlienPixMap::Save (const TCollection_AsciiString& theFileName)
return false;
}
Image_ComPtr<IWICImagingFactory> aWicImgFactory;
IWICImagingFactory* aWicImgFactory = NULL;
CoInitializeEx (NULL, COINIT_MULTITHREADED);
if (CoCreateInstance (CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&aWicImgFactory.ChangePtr())) != S_OK)
if (CoCreateInstance (CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&aWicImgFactory)) != S_OK)
{
Message::DefaultMessenger()->Send ("Error: cannot initialize WIC Imaging Factory", Message_Fail);
return false;

View File

@@ -36,10 +36,6 @@ class Image_AlienPixMap : public Image_PixMap
DEFINE_STANDARD_RTTIEXT(Image_AlienPixMap, Image_PixMap)
public:
//! Return default rows order used by underlying image library.
Standard_EXPORT static bool IsTopDownDefault();
public:
//! Empty constructor.
Standard_EXPORT Image_AlienPixMap();
@@ -47,23 +43,7 @@ public:
Standard_EXPORT virtual ~Image_AlienPixMap();
//! Read image data from file.
bool Load (const TCollection_AsciiString& theFileName)
{
return Load (NULL, 0, theFileName);
}
//! Read image data from stream.
Standard_EXPORT bool Load (std::istream& theStream,
const TCollection_AsciiString& theFileName);
//! Read image data from memory buffer.
//! @param theData memory pointer to read from;
//! when NULL, function will attempt to open theFileName file
//! @param theLength memory buffer length
//! @param theFileName optional file name
Standard_EXPORT bool Load (const Standard_Byte* theData,
Standard_Size theLength,
const TCollection_AsciiString& theFileName);
Standard_EXPORT bool Load (const TCollection_AsciiString& theFileName);
//! Write image data to file using file extension to determine compression format.
Standard_EXPORT bool Save (const TCollection_AsciiString& theFileName);

View File

@@ -125,6 +125,7 @@ void IntImpParGen::DetermineTransition(const IntRes2d_Position Pos1,
}
else {
gp_Vec2d Norm;
Tan1.Normalized();
Norm.SetCoord(-Tan1.Y(),Tan1.X());
Standard_Real Val1,Val2;
if (!courbure1) {

View File

@@ -116,6 +116,7 @@ void Determine_Transition(const IntRes2d_Position Pos1,
}
else {
gp_Vec2d Norm;
Tan1.Normalized();
Norm.SetCoord(-Tan1.Y(),Tan1.X());
Standard_Real Val1,Val2;
if (!courbure1) {

View File

@@ -159,10 +159,15 @@ void MeshVS_TextPrsBuilder::Build ( const Handle(Prs3d_Presentation)& Prs,
!aDrawer->GetDouble ( MeshVS_DA_TextHeight, aHeight ) )
return;
Handle(Graphic3d_Group) aTextGroup = Prs->NewGroup();
Prs3d_Root::NewGroup ( Prs );
Handle (Graphic3d_Group) aTextGroup = Prs3d_Root::CurrentGroup ( Prs );
Quantity_Color AColor = Quantity_NOC_YELLOW;
Standard_CString AFont = Font_NOF_ASCII_MONO;
#ifdef _WIN32
Standard_CString AFont = "Courier New";
#else
Standard_CString AFont = "Courier";
#endif
Standard_Real AExpansionFactor = 1.0;
Standard_Real ASpace = 0.0;
Aspect_TypeOfStyleText ATextStyle = Aspect_TOST_ANNOTATION;
@@ -191,7 +196,10 @@ void MeshVS_TextPrsBuilder::Build ( const Handle(Prs3d_Presentation)& Prs,
Handle (Graphic3d_AspectText3d) aTextAspect = new Graphic3d_AspectText3d ( AColor, AFont, AExpansionFactor, ASpace,
ATextStyle, ADisplayType );
aTextAspect->SetTextFontAspect( AFontAspectType );
aTextGroup->SetGroupPrimitivesAspect( aTextAspect );
Handle (Graphic3d_AspectMarker3d) anAspectMarker3d =
new Graphic3d_AspectMarker3d( Aspect_TOM_POINT, Quantity_NOC_GRAY, 1. );
aTextGroup->SetPrimitivesAspect( aTextAspect );
aTextGroup->SetPrimitivesAspect( anAspectMarker3d );
MeshVS_Buffer aCoordsBuf (3*aMaxFaceNodes*sizeof(Standard_Real));
TColStd_Array1OfReal aCoords (aCoordsBuf, 1, 3*aMaxFaceNodes);
@@ -213,8 +221,8 @@ void MeshVS_TextPrsBuilder::Build ( const Handle(Prs3d_Presentation)& Prs,
}
anIDs.Subtract( IDsToExclude );
NCollection_Sequence<Graphic3d_Vec3> aPnts;
for (TColStd_MapIteratorOfPackedMapOfInteger it (anIDs); it.More(); it.Next())
TColStd_MapIteratorOfPackedMapOfInteger it (anIDs);
for( ; it.More(); it.Next() )
{
Standard_Integer aKey = it.Key();
if( GetText ( IsElement, aKey, aStr ) )
@@ -250,27 +258,15 @@ void MeshVS_TextPrsBuilder::Build ( const Handle(Prs3d_Presentation)& Prs,
continue;
}
aPnts.Append (Graphic3d_Vec3 ((float )X, (float )Y, (float )Z));
Graphic3d_Vertex aPoint (X, Y, Z);
Handle(Graphic3d_ArrayOfPoints) anArrayOfPoints = new Graphic3d_ArrayOfPoints (1);
anArrayOfPoints->AddVertex (X, Y, Z);
aTextGroup->AddPrimitiveArray (anArrayOfPoints);
aTextGroup->Text (aStr.ToCString(), aPoint, aHeight);
}
}
}
if (!aPnts.IsEmpty())
{
Handle(Graphic3d_Group) aMarkerGroup = Prs->NewGroup();
Handle(Graphic3d_ArrayOfPoints) anArrayOfPoints = new Graphic3d_ArrayOfPoints (aPnts.Size());
for (NCollection_Sequence<Graphic3d_Vec3>::Iterator aPntIter (aPnts); aPntIter.More(); aPntIter.Next())
{
const Graphic3d_Vec3& aPnt = aPntIter.Value();
anArrayOfPoints->AddVertex (aPnt.x(), aPnt.y(), aPnt.z());
}
Handle (Graphic3d_AspectMarker3d) anAspectMarker3d = new Graphic3d_AspectMarker3d (Aspect_TOM_POINT, Quantity_NOC_GRAY, 1.0);
aMarkerGroup->SetGroupPrimitivesAspect (anAspectMarker3d);
aMarkerGroup->AddPrimitiveArray (anArrayOfPoints);
}
if (!aCustomElements.IsEmpty())
CustomBuild ( Prs, aCustomElements, IDsToExclude, theDisplayMode );
}

View File

@@ -59,32 +59,6 @@ public:
return myPtr;
}
//! Move assignment.
//! This array will borrow all the data from theOther.
NCollection_LocalArray& Move (NCollection_LocalArray& theOther)
{
if (&theOther == this)
{
return *this;
}
Deallocate();
mySize = theOther.mySize;
if (theOther.myPtr == theOther.myBuffer)
{
// deep copy
myPtr = myBuffer;
memcpy (myPtr, theOther.myPtr, sizeof(theItem) * theOther.mySize);
memset (theOther.myPtr, 0, sizeof(theItem) * theOther.mySize);
}
else
{
myPtr = theOther.myPtr;
theOther.myPtr = theOther.myBuffer;
}
return *this;
}
private:
NCollection_LocalArray (const NCollection_LocalArray& );

Some files were not shown because too many files have changed in this diff Show More