mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-09-08 14:17:06 +03:00
Compare commits
25 Commits
CR29003_2
...
v1_0_CAPOF
Author | SHA1 | Date | |
---|---|---|---|
|
764e97a419 | ||
|
cf1ae6e9fe | ||
|
e8b4130801 | ||
|
c31c7ae3ba | ||
|
78dbfeb083 | ||
|
1e25daebc7 | ||
|
7dc7bda859 | ||
|
0f1bc56d6c | ||
|
dcbf27086f | ||
|
91c71dd97c | ||
|
3a90fab251 | ||
|
c763f2a1f4 | ||
|
678c09482c | ||
|
611cd82c38 | ||
|
ea712b6b04 | ||
|
49c79be2c3 | ||
|
e3f977d899 | ||
|
6277a5996c | ||
|
4b09d0360c | ||
|
bfaf93b6f6 | ||
|
e1879ccf43 | ||
|
8b2102869f | ||
|
07af2e5c9b | ||
|
fbc3f28c6e | ||
|
fc5399d2e2 |
Binary file not shown.
Before Width: | Height: | Size: 5.6 KiB After Width: | Height: | Size: 11 KiB |
2562
data/occ/hammer.brep
2562
data/occ/hammer.brep
File diff suppressed because one or more lines are too long
@@ -192,11 +192,7 @@ Use prefix <i>bug</i> followed by Mantis issue ID and, if necessary, additional
|
||||
* If the test case reports error due to an existing problem and the fix is not available, add @ref testmanual_3_6 "TODO" statement for each error to mark it as a known problem. The TODO statements must be specific so as to match the actually generated messages but not all similar errors.
|
||||
* To check expected output which should be obtained as the test result, add @ref testmanual_3_7 "REQUIRED" statement for each line of output to mark it as required.
|
||||
* If the test case produces error messages (contained in parse.rules), which are expected in that test and should not be considered as its failure (e.g. test for *checkshape* command), add REQUIRED statement for each error to mark it as required output.
|
||||
4. To check whether the data files needed for the test are already present in the database, use DRAW command *testfile* (see below).
|
||||
If the data file is already present, use it for new test instead of adding a duplicate.
|
||||
If the data file(s) are not yet present in the test database, put them to some folder and add it to the environment variable *CSF_TestDataPath* to be found by the test system.
|
||||
Information on where the data files can be accessed by OCC team for putting to official database should be provided in comment to Mantis issue, clearly indicating how names of the files used by the test script match the actual names of the files.
|
||||
The simplest way is to attach the data files to the Mantis issue, with the same names as used by the test script.
|
||||
4. If the test uses data file(s) that are not yet present in the test database, it is possible to put them to (sub)directory pointed out by *CSF_TestDataPath* variable for running test. The files should be attached to the Mantis issue corresponding to the tested modification.
|
||||
5. Check that the test case runs as expected (test for fix: OK with the fix, FAILED without the fix; test for existing problem: BAD), and integrate it to the Git branch created for the issue.
|
||||
|
||||
Example:
|
||||
@@ -222,33 +218,6 @@ fixshape result a 0.01 0.01
|
||||
checkshape result
|
||||
~~~~~
|
||||
|
||||
DRAW command testfile should be used to check the data files being used by the test for possible duplication of content or names.
|
||||
The command accepts list of paths to files being checked as single argument, and will give conclusion on each of the files, for instance:
|
||||
|
||||
~~~~~
|
||||
Draw[1]> testfile [glob /my/data/path/bug12345*]
|
||||
Collecting info on test data files repository...
|
||||
Checking new file(s)...
|
||||
|
||||
* /my/data/path/bug12345.brep: duplicate
|
||||
already present under name bug28773_1.brep
|
||||
--> //server/occt_tests_data/public/brep/bug28773_1.brep
|
||||
|
||||
* /my/data/path/cadso.brep: new file
|
||||
Warning: DOS encoding detected, consider converting to
|
||||
UNIX unless DOS line ends are needed for the test
|
||||
Warning: shape contains triangulation (946 triangles),
|
||||
consider removing them unless they are needed for the test!
|
||||
BREP size=201 KiB, nbfaces=33, nbedges=94 -> private
|
||||
|
||||
* /my/data/path/case_8_wire3.brep: already present
|
||||
--> //server/occt_tests_data/public/brep/case_8_wire3.brep
|
||||
|
||||
* /my/data/path/case_8_wire4.brep: error
|
||||
name is already used by existing file
|
||||
--> //server/occt_tests_data/public/brep/case_8_wire4.brep
|
||||
~~~~~
|
||||
|
||||
@section testmanual_2 Organization of Test Scripts
|
||||
|
||||
@subsection testmanual_2_1 General Layout
|
||||
|
@@ -3,24 +3,19 @@
|
||||
export aSamplePath="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
|
||||
if [ -e "custom.sh" ]; then
|
||||
source "custom.sh" $*;
|
||||
source "custom.sh";
|
||||
fi
|
||||
|
||||
if [ -e "${aSamplePath}/../../../env.sh" ]; then
|
||||
source "${aSamplePath}/../../../env.sh" $*;
|
||||
source "${aSamplePath}/../../../env.sh";
|
||||
fi
|
||||
|
||||
if [ "${QTDIR}" != "" ]; then
|
||||
export PATH=${QTDIR}/bin:${PATH}
|
||||
else
|
||||
aQMakePath=`which qmake`
|
||||
echo "Environment variable \"QTDIR\" not defined.. Define it in \"custom.sh\" script."
|
||||
if [ -x "$aQMakePath" ]; then
|
||||
echo "qmake from PATH will be used instead."
|
||||
else
|
||||
exit 1
|
||||
fi
|
||||
if test "${QTDIR}" == ""; then
|
||||
echo "Environment variable \"QTDIR\" not defined. Define it in \"custom.sh\" script."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
host=`uname -s`
|
||||
export STATION=$host
|
||||
|
||||
export PATH=${QTDIR}/bin:${PATH}
|
||||
|
@@ -1,14 +1,13 @@
|
||||
#!/bin/bash
|
||||
|
||||
export aSamplePath="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
if [ -e "${aSamplePath}/env.sh" ]; then source "${aSamplePath}/env.sh" $*; fi
|
||||
if [ -e "${aSamplePath}/env.sh" ]; then source "${aSamplePath}/env.sh"; fi
|
||||
cd $aSamplePath
|
||||
qmake FuncDemo.pro
|
||||
if [ "$(uname -s)" != "Darwin" ] || [ "$MACOSX_USE_GLX" == "true" ]; then
|
||||
aNbJobs="$(getconf _NPROCESSORS_ONLN)"
|
||||
if [ "${CASDEB}" == "d" ]; then
|
||||
make -j $aNbJobs debug
|
||||
make debug
|
||||
else
|
||||
make -j $aNbJobs release
|
||||
make release
|
||||
fi
|
||||
fi
|
||||
|
@@ -2,7 +2,7 @@
|
||||
|
||||
export aSamplePath="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
|
||||
if [ -e "${aSamplePath}/env.sh" ]; then source "${aSamplePath}/env.sh" $*; fi
|
||||
if [ -e "${aSamplePath}/env.sh" ]; then source "${aSamplePath}/env.sh"; fi
|
||||
cd $aSamplePath
|
||||
|
||||
aSystem=`uname -s`
|
||||
|
@@ -3,25 +3,20 @@
|
||||
export aSamplePath="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
|
||||
if [ -e "custom.sh" ]; then
|
||||
source "custom.sh" $*;
|
||||
source "custom.sh";
|
||||
fi
|
||||
|
||||
if [ -e "${aSamplePath}/../../../env.sh" ]; then
|
||||
source "${aSamplePath}/../../../env.sh" $*;
|
||||
source "${aSamplePath}/../../../env.sh";
|
||||
fi
|
||||
|
||||
if [ "${QTDIR}" != "" ]; then
|
||||
export PATH=${QTDIR}/bin:${PATH}
|
||||
else
|
||||
aQMakePath=`which qmake`
|
||||
echo "Environment variable \"QTDIR\" not defined.. Define it in \"custom.sh\" script."
|
||||
if [ -x "$aQMakePath" ]; then
|
||||
echo "qmake from PATH will be used instead."
|
||||
else
|
||||
exit 1
|
||||
fi
|
||||
if test "${QTDIR}" == ""; then
|
||||
echo "Environment variable \"QTDIR\" not defined. Define it in \"custom.sh\" script."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
host=`uname -s`
|
||||
export STATION=$host
|
||||
export RES_DIR=${aSamplePath}/${STATION}/res
|
||||
|
||||
export PATH=${QTDIR}/bin:${PATH}
|
||||
|
@@ -1,14 +1,13 @@
|
||||
#!/bin/bash
|
||||
|
||||
export aSamplePath="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
if [ -e "${aSamplePath}/env.sh" ]; then source "${aSamplePath}/env.sh" $*; fi
|
||||
if [ -e "${aSamplePath}/env.sh" ]; then source "${aSamplePath}/env.sh"; fi
|
||||
cd $aSamplePath
|
||||
qmake IESample.pro
|
||||
if [ "$(uname -s)" != "Darwin" ] || [ "$MACOSX_USE_GLX" == "true" ]; then
|
||||
aNbJobs="$(getconf _NPROCESSORS_ONLN)"
|
||||
if [ "${CASDEB}" == "d" ]; then
|
||||
make -j $aNbJobs debug
|
||||
make debug
|
||||
else
|
||||
make -j $aNbJobs release
|
||||
make release
|
||||
fi
|
||||
fi
|
||||
|
@@ -2,7 +2,7 @@
|
||||
|
||||
export aSamplePath="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
|
||||
if [ -e "${aSamplePath}/env.sh" ]; then source "${aSamplePath}/env.sh" $*; fi
|
||||
if [ -e "${aSamplePath}/env.sh" ]; then source "${aSamplePath}/env.sh"; fi
|
||||
cd $aSamplePath
|
||||
|
||||
aSystem=`uname -s`
|
||||
|
@@ -3,25 +3,20 @@
|
||||
export aSamplePath="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
|
||||
if [ -e "custom.sh" ]; then
|
||||
source "custom.sh" $*;
|
||||
source "custom.sh";
|
||||
fi
|
||||
|
||||
if [ -e "${aSamplePath}/../../../env.sh" ]; then
|
||||
source "${aSamplePath}/../../../env.sh" $*;
|
||||
source "${aSamplePath}/../../../env.sh";
|
||||
fi
|
||||
|
||||
if [ "${QTDIR}" != "" ]; then
|
||||
export PATH=${QTDIR}/bin:${PATH}
|
||||
else
|
||||
aQMakePath=`which qmake`
|
||||
echo "Environment variable \"QTDIR\" not defined.. Define it in \"custom.sh\" script."
|
||||
if [ -x "$aQMakePath" ]; then
|
||||
echo "qmake from PATH will be used instead."
|
||||
else
|
||||
exit 1
|
||||
fi
|
||||
if test "${QTDIR}" == ""; then
|
||||
echo "Environment variable \"QTDIR\" not defined. Define it in \"custom.sh\" script."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
host=`uname -s`
|
||||
export STATION=$host
|
||||
export RES_DIR=${aSamplePath}/${STATION}/res
|
||||
|
||||
export PATH=${QTDIR}/bin:${PATH}
|
||||
|
@@ -1,14 +1,13 @@
|
||||
#!/bin/bash
|
||||
|
||||
export aSamplePath="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
if [ -e "${aSamplePath}/env.sh" ]; then source "${aSamplePath}/env.sh" $*; fi
|
||||
if [ -e "${aSamplePath}/env.sh" ]; then source "${aSamplePath}/env.sh"; fi
|
||||
cd $aSamplePath
|
||||
qmake Tutorial.pro
|
||||
if [ "$(uname -s)" != "Darwin" ] || [ "$MACOSX_USE_GLX" == "true" ]; then
|
||||
aNbJobs="$(getconf _NPROCESSORS_ONLN)"
|
||||
if [ "${CASDEB}" == "d" ]; then
|
||||
make -j $aNbJobs debug
|
||||
make debug
|
||||
else
|
||||
make -j $aNbJobs release
|
||||
make release
|
||||
fi
|
||||
fi
|
||||
|
@@ -2,7 +2,7 @@
|
||||
|
||||
export aSamplePath="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
|
||||
if [ -e "${aSamplePath}/env.sh" ]; then source "${aSamplePath}/env.sh" $*; fi
|
||||
if [ -e "${aSamplePath}/env.sh" ]; then source "${aSamplePath}/env.sh"; fi
|
||||
cd $aSamplePath
|
||||
|
||||
aSystem=`uname -s`
|
||||
|
@@ -618,6 +618,9 @@ void AIS_ColoredShape::addShapesWithCustomProps (const Handle(Prs3d_Presentation
|
||||
{
|
||||
aShadedGroup = Prs3d_Root::NewGroup (thePrs);
|
||||
aShadedGroup->SetClosed (isClosed);
|
||||
if (isClosed
|
||||
&& !myCappingStyle.IsNull())
|
||||
aShadedGroup->SetGroupPrimitivesAspect (myCappingStyle);
|
||||
}
|
||||
aShadedGroup->SetPrimitivesAspect (aDrawer->ShadingAspect()->Aspect());
|
||||
aShadedGroup->AddPrimitiveArray (aTriangles);
|
||||
|
@@ -21,6 +21,7 @@
|
||||
#include <Aspect_PolygonOffsetMode.hxx>
|
||||
#include <Bnd_Box.hxx>
|
||||
#include <Graphic3d_AspectFillArea3d.hxx>
|
||||
#include <Graphic3d_AspectFillCapping.hxx>
|
||||
#include <Graphic3d_AspectLine3d.hxx>
|
||||
#include <Graphic3d_AspectMarker3d.hxx>
|
||||
#include <Graphic3d_AspectText3d.hxx>
|
||||
@@ -277,6 +278,37 @@ void AIS_InteractiveObject::UnsetMaterial()
|
||||
hasOwnMaterial = Standard_False;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : SetCappingStyle
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void AIS_InteractiveObject::SetCappingStyle (const Handle(Graphic3d_AspectFillCapping)& theStyle)
|
||||
{
|
||||
myCappingStyle = theStyle;
|
||||
|
||||
// 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())
|
||||
{
|
||||
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())
|
||||
continue;
|
||||
|
||||
aGrp->SetGroupPrimitivesAspect (theStyle);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : SetTransparency
|
||||
//purpose :
|
||||
@@ -621,10 +653,11 @@ void AIS_InteractiveObject::SynchronizeAspects()
|
||||
continue;
|
||||
}
|
||||
|
||||
Handle(Graphic3d_AspectLine3d) aLineAspect = aGrp->LineAspect();
|
||||
Handle(Graphic3d_AspectFillArea3d) aFaceAspect = aGrp->FillAreaAspect();
|
||||
Handle(Graphic3d_AspectMarker3d) aMarkerAspect = aGrp->MarkerAspect();
|
||||
Handle(Graphic3d_AspectText3d) aTextAspect = aGrp->TextAspect();
|
||||
Handle(Graphic3d_AspectLine3d) aLineAspect = aGrp->LineAspect();
|
||||
Handle(Graphic3d_AspectFillArea3d) aFaceAspect = aGrp->FillAreaAspect();
|
||||
Handle(Graphic3d_AspectFillCapping) aCappingAspect = aGrp->FillCappingAspect();
|
||||
Handle(Graphic3d_AspectMarker3d) aMarkerAspect = aGrp->MarkerAspect();
|
||||
Handle(Graphic3d_AspectText3d) aTextAspect = aGrp->TextAspect();
|
||||
if (!aLineAspect.IsNull())
|
||||
{
|
||||
aGrp->SetGroupPrimitivesAspect (aLineAspect);
|
||||
@@ -633,6 +666,10 @@ void AIS_InteractiveObject::SynchronizeAspects()
|
||||
{
|
||||
aGrp->SetGroupPrimitivesAspect (aFaceAspect);
|
||||
}
|
||||
if (!aCappingAspect.IsNull())
|
||||
{
|
||||
aGrp->SetGroupPrimitivesAspect (aCappingAspect);
|
||||
}
|
||||
if (!aMarkerAspect.IsNull())
|
||||
{
|
||||
aGrp->SetGroupPrimitivesAspect (aMarkerAspect);
|
||||
@@ -641,6 +678,7 @@ void AIS_InteractiveObject::SynchronizeAspects()
|
||||
{
|
||||
aGrp->SetGroupPrimitivesAspect (aTextAspect);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -306,10 +306,16 @@ public:
|
||||
//! Material aspect determines shading aspect, color and
|
||||
//! transparency of visible entities.
|
||||
Standard_EXPORT virtual void SetMaterial (const Graphic3d_MaterialAspect& aName);
|
||||
|
||||
|
||||
//! Removes the setting for material.
|
||||
Standard_EXPORT virtual void UnsetMaterial();
|
||||
|
||||
|
||||
//! Set style of filling capping section created by clipping planes.
|
||||
Standard_EXPORT virtual void SetCappingStyle (const Handle(Graphic3d_AspectFillCapping)& theStyle);
|
||||
|
||||
//! Returns style for filling capping section created by clipping planes.
|
||||
const Handle(Graphic3d_AspectFillCapping)& CappingStyle() const { return myCappingStyle; }
|
||||
|
||||
//! Attributes a setting aValue for transparency.
|
||||
//! The transparency value should be between 0.0 and 1.0.
|
||||
//! At 0.0 an object will be totally opaque, and at 1.0, fully transparent.
|
||||
@@ -416,7 +422,7 @@ protected:
|
||||
Standard_Boolean hasOwnColor;
|
||||
Standard_Boolean hasOwnMaterial;
|
||||
Standard_Boolean myRecomputeEveryPrs;
|
||||
|
||||
Handle(Graphic3d_AspectFillCapping) myCappingStyle;
|
||||
};
|
||||
|
||||
DEFINE_STANDARD_HANDLE(AIS_InteractiveObject, SelectMgr_SelectableObject)
|
||||
|
@@ -186,10 +186,7 @@ void AIS_Shape::Compute(const Handle(PrsMgr_PresentationManager3d)& /*aPresentat
|
||||
try
|
||||
{
|
||||
OCC_CATCH_SIGNALS
|
||||
StdPrs_ShadedShape::Add (aPrs, myshape, myDrawer,
|
||||
myDrawer->ShadingAspect()->Aspect()->ToMapTexture()
|
||||
&& !myDrawer->ShadingAspect()->Aspect()->TextureMap().IsNull(),
|
||||
myUVOrigin, myUVRepeat, myUVScale);
|
||||
StdPrs_ShadedShape::Add (aPrs, myshape, myDrawer, myCappingStyle);
|
||||
}
|
||||
catch (Standard_Failure)
|
||||
{
|
||||
|
2104
src/AIS/AIS_ViewCube.cxx
Normal file
2104
src/AIS/AIS_ViewCube.cxx
Normal file
File diff suppressed because it is too large
Load Diff
1059
src/AIS/AIS_ViewCube.hxx
Normal file
1059
src/AIS/AIS_ViewCube.hxx
Normal file
File diff suppressed because it is too large
Load Diff
@@ -180,3 +180,5 @@ AIS_TypeOfAxis.hxx
|
||||
AIS_TypeOfDist.hxx
|
||||
AIS_TypeOfIso.hxx
|
||||
AIS_TypeOfPlane.hxx
|
||||
AIS_ViewCube.hxx
|
||||
AIS_ViewCube.cxx
|
||||
|
@@ -2865,7 +2865,7 @@ static Standard_Boolean EnlargeGeometry(Handle(Geom_Surface)& S,
|
||||
const Standard_Boolean GlobalEnlargeVfirst,
|
||||
const Standard_Boolean GlobalEnlargeVlast)
|
||||
{
|
||||
const Standard_Real coeff = 2.; //4.;
|
||||
const Standard_Real coeff = 4.;
|
||||
const Standard_Real TolApex = 1.e-5;
|
||||
|
||||
Standard_Boolean SurfaceChange = Standard_False;
|
||||
@@ -3248,8 +3248,7 @@ Standard_Boolean BRepOffset_Tool::EnLargeFace
|
||||
const Standard_Boolean UpdatePCurve,
|
||||
const Standard_Boolean enlargeU,
|
||||
const Standard_Boolean enlargeVfirst,
|
||||
const Standard_Boolean enlargeVlast,
|
||||
const Standard_Boolean UseInfini)
|
||||
const Standard_Boolean enlargeVlast)
|
||||
{
|
||||
//---------------------------
|
||||
// extension de la geometrie.
|
||||
@@ -3271,20 +3270,8 @@ Standard_Boolean BRepOffset_Tool::EnLargeFace
|
||||
}
|
||||
|
||||
S->Bounds (US1,US2,VS1,VS2);
|
||||
if (UseInfini)
|
||||
{
|
||||
UU1 = VV1 = - TheInfini;
|
||||
UU2 = VV2 = TheInfini;
|
||||
}
|
||||
else
|
||||
{
|
||||
Standard_Real FaceDU = UF2 - UF1;
|
||||
Standard_Real FaceDV = VF2 - VF1;
|
||||
UU1 = UF1 - FaceDU;
|
||||
UU2 = UF2 + FaceDU;
|
||||
VV1 = VF1 - FaceDV;
|
||||
VV2 = VF2 + FaceDV;
|
||||
}
|
||||
UU1 = VV1 = - TheInfini;
|
||||
UU2 = VV2 = TheInfini;
|
||||
|
||||
if (CanExtentSurface) {
|
||||
SurfaceChange = EnlargeGeometry( S, UU1, UU2, VV1, VV2, isVV1degen, isVV2degen, UF1, UF2, VF1, VF2,
|
||||
@@ -4161,4 +4148,4 @@ void PerformPlanes(const TopoDS_Face& theFace1,
|
||||
Standard_Boolean IsInf(const Standard_Real theVal)
|
||||
{
|
||||
return (theVal > TheInfini*0.9);
|
||||
}
|
||||
}
|
@@ -104,14 +104,7 @@ public:
|
||||
//! if <UpdatePCurve> is TRUE, update the pcurves of the
|
||||
//! edges of <F> on the new surface.if the surface has been changed,
|
||||
//! Returns True if The Surface of <NF> has changed.
|
||||
Standard_EXPORT static Standard_Boolean EnLargeFace (const TopoDS_Face& F,
|
||||
TopoDS_Face& NF,
|
||||
const Standard_Boolean ChangeGeom,
|
||||
const Standard_Boolean UpDatePCurve = Standard_False,
|
||||
const Standard_Boolean enlargeU = Standard_True,
|
||||
const Standard_Boolean enlargeVfirst = Standard_True,
|
||||
const Standard_Boolean enlargeVlast = Standard_True,
|
||||
const Standard_Boolean UseInfini = Standard_True);
|
||||
Standard_EXPORT static Standard_Boolean EnLargeFace (const TopoDS_Face& F, TopoDS_Face& NF, const Standard_Boolean ChangeGeom, const Standard_Boolean UpDatePCurve = Standard_False, const Standard_Boolean enlargeU = Standard_True, const Standard_Boolean enlargeVfirst = Standard_True, const Standard_Boolean enlargeVlast = Standard_True);
|
||||
|
||||
Standard_EXPORT static void ExtentFace (const TopoDS_Face& F, TopTools_DataMapOfShapeShape& ConstShapes, TopTools_DataMapOfShapeShape& ToBuild, const TopAbs_State Side, const Standard_Real TolConf, TopoDS_Face& NF);
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -1,111 +0,0 @@
|
||||
// Created on: 2012-08-06
|
||||
// Created by: jgv@ROLEX
|
||||
// Copyright (c) 2012-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 _BRepOffsetAPI_PatchFaces_HeaderFile
|
||||
#define _BRepOffsetAPI_PatchFaces_HeaderFile
|
||||
|
||||
#include <Standard.hxx>
|
||||
#include <Standard_DefineAlloc.hxx>
|
||||
#include <Standard_Handle.hxx>
|
||||
|
||||
#include <TopoDS_Shape.hxx>
|
||||
#include <TopoDS_Face.hxx>
|
||||
#include <TopoDS_Edge.hxx>
|
||||
#include <TopoDS_Vertex.hxx>
|
||||
#include <Standard_Boolean.hxx>
|
||||
#include <TopTools_IndexedDataMapOfShapeShape.hxx>
|
||||
#include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
|
||||
#include <TopTools_DataMapOfShapeShape.hxx>
|
||||
#include <TopTools_DataMapOfOrientedShapeShape.hxx>
|
||||
#include <TopTools_MapOfShape.hxx>
|
||||
#include <BRepBuilderAPI_MakeShape.hxx>
|
||||
class TopoDS_Shape;
|
||||
|
||||
|
||||
//! Describes functions to replace some faces in a shape
|
||||
//! by patches
|
||||
class BRepOffsetAPI_PatchFaces : public BRepBuilderAPI_MakeShape
|
||||
{
|
||||
public:
|
||||
|
||||
DEFINE_STANDARD_ALLOC
|
||||
|
||||
|
||||
//! General constructor.
|
||||
Standard_EXPORT BRepOffsetAPI_PatchFaces(const TopoDS_Shape& aShape);
|
||||
|
||||
//! Adds the patch face for the face in the shape.
|
||||
Standard_EXPORT void AddPatchFace (const TopoDS_Face& theFace, const TopoDS_Face& thePatchFace);
|
||||
|
||||
Standard_EXPORT virtual void Build() Standard_OVERRIDE;
|
||||
|
||||
|
||||
|
||||
|
||||
protected:
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
private:
|
||||
|
||||
|
||||
Standard_EXPORT void UpdateEdgesAndVertex(const TopoDS_Edge& thePrevEdge,
|
||||
TopoDS_Edge& thePrevNewEdge,
|
||||
const TopoDS_Edge& theCurEdge,
|
||||
TopoDS_Edge& theCurNewEdge,
|
||||
TopoDS_Vertex& theCurVertex,
|
||||
const TopoDS_Face& theFace,
|
||||
const TopoDS_Face& theNewFace,
|
||||
TopoDS_Face& theBoundedNewFace);
|
||||
|
||||
Standard_EXPORT void PutVertexToEdge(const TopoDS_Vertex& theVertex,
|
||||
const TopoDS_Vertex& theProVertex,
|
||||
TopoDS_Edge& theEdge,
|
||||
const TopoDS_Edge& theProEdge,
|
||||
const Standard_Real theParamOnEdge);
|
||||
|
||||
Standard_EXPORT void ProjectVertexOnNewEdge_2d(const TopoDS_Vertex& theVertex,
|
||||
const TopoDS_Edge& theEdge,
|
||||
const TopoDS_Face& theFace,
|
||||
const TopoDS_Edge& theNewEdge,
|
||||
const TopoDS_Face& theNewFace,
|
||||
Standard_Real& theParam,
|
||||
gp_Pnt& thePnt,
|
||||
gp_Pnt2d& thePnt2d,
|
||||
Standard_Real& theTolReached);
|
||||
|
||||
TopoDS_Shape myInitialShape;
|
||||
|
||||
TopTools_IndexedDataMapOfShapeShape myFacePatchFace;
|
||||
TopTools_IndexedDataMapOfShapeShape myFaceNewFace;
|
||||
TopTools_DataMapOfShapeShape myNewFaceBoundedFace;
|
||||
TopTools_DataMapOfShapeShape myEdgeNewEdge;
|
||||
//TopTools_DataMapOfOrientedShapeShape myOrientedEdgeNewEdge;
|
||||
TopTools_DataMapOfShapeShape myVertexNewVertex;
|
||||
TopTools_MapOfShape myTangentEdges;
|
||||
|
||||
TopTools_IndexedDataMapOfShapeListOfShape myEFmap;
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif // _BRepOffsetAPI_PatchFaces_HeaderFile
|
@@ -27,5 +27,3 @@ BRepOffsetAPI_SequenceOfSequenceOfShape.hxx
|
||||
BRepOffsetAPI_Sewing.hxx
|
||||
BRepOffsetAPI_ThruSections.cxx
|
||||
BRepOffsetAPI_ThruSections.hxx
|
||||
BRepOffsetAPI_PatchFaces.cxx
|
||||
BRepOffsetAPI_PatchFaces.hxx
|
||||
|
@@ -62,8 +62,6 @@
|
||||
#include <DBRep_DrawableShape.hxx>
|
||||
#include <BRepTest.hxx>
|
||||
|
||||
#include <BRepOffsetAPI_PatchFaces.hxx>
|
||||
|
||||
#include <BRepFilletAPI_MakeFillet.hxx>
|
||||
#include <ChFi3d_FilletShape.hxx>
|
||||
|
||||
@@ -2289,36 +2287,6 @@ static Standard_Integer ComputeSimpleOffset(Draw_Interpretor& theCommands,
|
||||
return 0;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : patchfaces
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
static Standard_Integer patchfaces(Draw_Interpretor& /*di*/,
|
||||
Standard_Integer n, const char** a)
|
||||
{
|
||||
if (n < 5) return 1;
|
||||
|
||||
TopoDS_Shape aShape = DBRep::Get(a[2]);
|
||||
if (aShape.IsNull()) return 1;
|
||||
|
||||
TopoDS_Shape aLocalFace = DBRep::Get(a[3], TopAbs_FACE);
|
||||
if (aLocalFace.IsNull()) return 1;
|
||||
TopoDS_Face aFace = TopoDS::Face(aLocalFace);
|
||||
|
||||
TopoDS_Shape aLocalNewFace = DBRep::Get(a[4], TopAbs_FACE);
|
||||
if (aLocalNewFace.IsNull()) return 1;
|
||||
TopoDS_Face aNewFace = TopoDS::Face(aLocalNewFace);
|
||||
|
||||
BRepOffsetAPI_PatchFaces Builder(aShape);
|
||||
Builder.AddPatchFace(aFace, aNewFace);
|
||||
Builder.Build();
|
||||
|
||||
TopoDS_Shape Result = Builder.Shape();
|
||||
DBRep::Set(a[1], Result);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : FeatureCommands
|
||||
//purpose :
|
||||
@@ -2467,7 +2435,4 @@ void BRepTest::FeatureCommands (Draw_Interpretor& theCommands)
|
||||
theCommands.Add("offsetshapesimple",
|
||||
"offsetshapesimple result shape offsetvalue [solid] [tolerance=1e-7]",
|
||||
__FILE__, ComputeSimpleOffset);
|
||||
|
||||
theCommands.Add("patchfaces", "patchfaces res shape face newface",
|
||||
__FILE__,patchfaces,g);
|
||||
}
|
||||
|
@@ -42,6 +42,8 @@
|
||||
#include <BinMXCAFDoc_ViewDriver.hxx>
|
||||
#include <BinMXCAFDoc_ViewToolDriver.hxx>
|
||||
#include <BinMXCAFDoc_VolumeDriver.hxx>
|
||||
#include <BinMXCAFDoc_AnimationDriver.hxx>
|
||||
#include <BinMXCAFDoc_AnimationToolDriver.hxx>
|
||||
#include <CDM_MessageDriver.hxx>
|
||||
#include <TNaming_NamedShape.hxx>
|
||||
|
||||
@@ -81,6 +83,7 @@ void BinMXCAFDoc::AddDrivers(const Handle(BinMDF_ADriverTable)& theDriverTable,
|
||||
theDriverTable->AddDriver( new BinMXCAFDoc_NoteBinDataDriver (theMsgDrv));
|
||||
theDriverTable->AddDriver( new BinMXCAFDoc_NoteCommentDriver (theMsgDrv));
|
||||
theDriverTable->AddDriver( new BinMXCAFDoc_ViewDriver (theMsgDrv));
|
||||
theDriverTable->AddDriver( new BinMXCAFDoc_AnimationDriver (theMsgDrv));
|
||||
|
||||
theDriverTable->AddDriver( new BinMXCAFDoc_ColorToolDriver (theMsgDrv));
|
||||
theDriverTable->AddDriver( new BinMXCAFDoc_DocumentToolDriver(theMsgDrv));
|
||||
@@ -90,4 +93,5 @@ void BinMXCAFDoc::AddDrivers(const Handle(BinMDF_ADriverTable)& theDriverTable,
|
||||
theDriverTable->AddDriver( new BinMXCAFDoc_MaterialToolDriver(theMsgDrv));
|
||||
theDriverTable->AddDriver( new BinMXCAFDoc_NotesToolDriver (theMsgDrv));
|
||||
theDriverTable->AddDriver( new BinMXCAFDoc_ViewToolDriver (theMsgDrv));
|
||||
theDriverTable->AddDriver( new BinMXCAFDoc_AnimationToolDriver(theMsgDrv));
|
||||
}
|
||||
|
@@ -34,6 +34,9 @@ class BinMXCAFDoc_GeomToleranceDriver;
|
||||
class BinMXCAFDoc_DimensionDriver;
|
||||
class BinMXCAFDoc_DimTolDriver;
|
||||
class BinMXCAFDoc_MaterialDriver;
|
||||
class BinMXCAFDoc_NoteCommentDriver;
|
||||
class BinMXCAFDoc_NoteBinDataDriver;
|
||||
class BinMXCAFDoc_NotesToolDriver;
|
||||
class BinMXCAFDoc_ColorToolDriver;
|
||||
class BinMXCAFDoc_DocumentToolDriver;
|
||||
class BinMXCAFDoc_LayerToolDriver;
|
||||
@@ -42,6 +45,9 @@ class BinMXCAFDoc_DimTolToolDriver;
|
||||
class BinMXCAFDoc_MaterialToolDriver;
|
||||
class BinMXCAFDoc_ViewDriver;
|
||||
class BinMXCAFDoc_ViewToolDriver;
|
||||
class BinMXCAFDoc_AnimationDriver;
|
||||
class BinMXCAFDoc_AnimationToolDriver;
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -89,6 +95,9 @@ friend class BinMXCAFDoc_DimTolToolDriver;
|
||||
friend class BinMXCAFDoc_MaterialToolDriver;
|
||||
friend class BinMXCAFDoc_ViewDriver;
|
||||
friend class BinMXCAFDoc_ViewToolDriver;
|
||||
friend class BinMXCAFDoc_AnimationDriver;
|
||||
friend class BinMXCAFDoc_AnimationToolDriver;
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
112
src/BinMXCAFDoc/BinMXCAFDoc_AnimationDriver.cxx
Normal file
112
src/BinMXCAFDoc/BinMXCAFDoc_AnimationDriver.cxx
Normal file
@@ -0,0 +1,112 @@
|
||||
// Created on: 2017-10-02
|
||||
// Created by: Elena MOZOKHINA
|
||||
// Copyright (c) 2016 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 <BinMXCAFDoc_AnimationDriver.hxx>
|
||||
#include <BinObjMgt_Persistent.hxx>
|
||||
#include <CDM_MessageDriver.hxx>
|
||||
#include <Standard_Type.hxx>
|
||||
#include <TCollection_HAsciiString.hxx>
|
||||
#include <TDF_Attribute.hxx>
|
||||
#include <XCAFDoc_Animation.hxx>
|
||||
# include <TColStd_HArray1OfByte.hxx>
|
||||
|
||||
IMPLEMENT_STANDARD_RTTIEXT(BinMXCAFDoc_AnimationDriver,BinMDF_ADriver)
|
||||
|
||||
static Standard_Boolean getByteArray(const BinObjMgt_Persistent& theSource, Handle(TColStd_HArray1OfByte)& theArray)
|
||||
{
|
||||
Standard_Integer aFirstInd, aLastInd;
|
||||
if (!(theSource >> aFirstInd >> aLastInd))
|
||||
return Standard_False;
|
||||
if (aLastInd < aFirstInd)
|
||||
return Standard_False;
|
||||
|
||||
theArray.reset(new TColStd_HArray1OfByte(aFirstInd, aLastInd - aFirstInd + 1));
|
||||
theSource.GetByteArray(&theArray->ChangeFirst(), aLastInd - aFirstInd + 1);
|
||||
return Standard_True;
|
||||
}
|
||||
|
||||
static void putByteArray(BinObjMgt_Persistent& theTarget, const Handle(TColStd_HArray1OfByte)& theArray)
|
||||
{
|
||||
if (theArray.IsNull())
|
||||
return;
|
||||
const Standard_Integer aFirstInd = theArray->Lower();
|
||||
const Standard_Integer aLastInd = theArray->Upper();
|
||||
if (aLastInd < aFirstInd)
|
||||
return;
|
||||
|
||||
theTarget << aFirstInd << aLastInd;
|
||||
theTarget.PutByteArray(&theArray->ChangeFirst(), aLastInd - aFirstInd + 1);
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : Constructor
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
BinMXCAFDoc_AnimationDriver::BinMXCAFDoc_AnimationDriver
|
||||
(const Handle(CDM_MessageDriver)& theMsgDriver)
|
||||
: BinMDF_ADriver(theMsgDriver, STANDARD_TYPE(XCAFDoc_Animation)->Name())
|
||||
{
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : NewEmpty
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
Handle(TDF_Attribute) BinMXCAFDoc_AnimationDriver::NewEmpty() const
|
||||
{
|
||||
return new XCAFDoc_Animation();
|
||||
}
|
||||
|
||||
|
||||
//=======================================================================
|
||||
//function : Paste
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
Standard_Boolean BinMXCAFDoc_AnimationDriver::Paste(const BinObjMgt_Persistent& theSource,
|
||||
const Handle(TDF_Attribute)& theTarget,
|
||||
BinObjMgt_RRelocationTable& /*theRelocTable*/) const
|
||||
{
|
||||
Handle(XCAFDoc_Animation) anAtt = Handle(XCAFDoc_Animation)::DownCast(theTarget);
|
||||
Standard_Real aDensity;
|
||||
TCollection_AsciiString aName;
|
||||
|
||||
if (!(theSource >> aName))
|
||||
return Standard_False;
|
||||
Handle(TColStd_HArray1OfByte) anImage, anAnimation;
|
||||
if (!getByteArray(theSource, anImage) || anImage.IsNull())
|
||||
return Standard_False;
|
||||
if (!getByteArray(theSource, anAnimation) || anAnimation.IsNull())
|
||||
return Standard_False;
|
||||
anAtt->Set(new TCollection_HAsciiString(aName), anImage, anAnimation);
|
||||
return Standard_True;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : Paste
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void BinMXCAFDoc_AnimationDriver::Paste(const Handle(TDF_Attribute)& theSource,
|
||||
BinObjMgt_Persistent& theTarget,
|
||||
BinObjMgt_SRelocationTable& /*theRelocTable*/) const
|
||||
{
|
||||
Handle(XCAFDoc_Animation) anAtt = Handle(XCAFDoc_Animation)::DownCast(theSource);
|
||||
Handle(TCollection_HAsciiString) aName = anAtt->GetName();
|
||||
if (!aName.IsNull())
|
||||
theTarget << aName->String();
|
||||
|
||||
putByteArray(theTarget, anAtt->GetImage());
|
||||
putByteArray(theTarget, anAtt->GetAnimation());
|
||||
}
|
72
src/BinMXCAFDoc/BinMXCAFDoc_AnimationDriver.hxx
Normal file
72
src/BinMXCAFDoc/BinMXCAFDoc_AnimationDriver.hxx
Normal file
@@ -0,0 +1,72 @@
|
||||
// Created on: 2017-10-02
|
||||
// Created by: Elena MOZOKHINA
|
||||
// Copyright (c) 2016 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 _BinMXCAFDoc_AnimationDriver_HeaderFile
|
||||
#define _BinMXCAFDoc_AnimationDriver_HeaderFile
|
||||
|
||||
#include <Standard.hxx>
|
||||
#include <Standard_Type.hxx>
|
||||
|
||||
#include <BinMDF_ADriver.hxx>
|
||||
#include <Standard_Boolean.hxx>
|
||||
#include <BinObjMgt_RRelocationTable.hxx>
|
||||
#include <BinObjMgt_SRelocationTable.hxx>
|
||||
class CDM_MessageDriver;
|
||||
class TDF_Attribute;
|
||||
class BinObjMgt_Persistent;
|
||||
|
||||
|
||||
class BinMXCAFDoc_AnimationDriver;
|
||||
DEFINE_STANDARD_HANDLE(BinMXCAFDoc_AnimationDriver, BinMDF_ADriver)
|
||||
|
||||
|
||||
class BinMXCAFDoc_AnimationDriver : public BinMDF_ADriver
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
|
||||
Standard_EXPORT BinMXCAFDoc_AnimationDriver(const Handle(CDM_MessageDriver)& theMsgDriver);
|
||||
|
||||
Standard_EXPORT virtual Handle(TDF_Attribute) NewEmpty() const Standard_OVERRIDE;
|
||||
|
||||
Standard_EXPORT virtual Standard_Boolean Paste (const BinObjMgt_Persistent& theSource, const Handle(TDF_Attribute)& theTarget, BinObjMgt_RRelocationTable& theRelocTable) const Standard_OVERRIDE;
|
||||
|
||||
Standard_EXPORT virtual void Paste (const Handle(TDF_Attribute)& theSource, BinObjMgt_Persistent& theTarget, BinObjMgt_SRelocationTable& theRelocTable) const Standard_OVERRIDE;
|
||||
|
||||
|
||||
|
||||
|
||||
DEFINE_STANDARD_RTTIEXT(BinMXCAFDoc_AnimationDriver,BinMDF_ADriver)
|
||||
|
||||
protected:
|
||||
|
||||
|
||||
|
||||
|
||||
private:
|
||||
|
||||
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif // _BinMXCAFDoc_AnimationDriver_HeaderFile
|
65
src/BinMXCAFDoc/BinMXCAFDoc_AnimationToolDriver.cxx
Normal file
65
src/BinMXCAFDoc/BinMXCAFDoc_AnimationToolDriver.cxx
Normal file
@@ -0,0 +1,65 @@
|
||||
// Created on: 2017-10-02
|
||||
// Created by: Elena MOZOKHINA
|
||||
// Copyright (c) 2016 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 <BinMXCAFDoc_AnimationToolDriver.hxx>
|
||||
#include <BinObjMgt_Persistent.hxx>
|
||||
#include <CDM_MessageDriver.hxx>
|
||||
#include <Standard_Type.hxx>
|
||||
#include <TDF_Attribute.hxx>
|
||||
#include <XCAFDoc_AnimationTool.hxx>
|
||||
|
||||
IMPLEMENT_STANDARD_RTTIEXT(BinMXCAFDoc_AnimationToolDriver, BinMDF_ADriver)
|
||||
|
||||
//=======================================================================
|
||||
//function :
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
BinMXCAFDoc_AnimationToolDriver::BinMXCAFDoc_AnimationToolDriver
|
||||
(const Handle(CDM_MessageDriver)& theMsgDriver)
|
||||
: BinMDF_ADriver(theMsgDriver, STANDARD_TYPE(XCAFDoc_AnimationTool)->Name())
|
||||
{
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function :
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
Handle(TDF_Attribute) BinMXCAFDoc_AnimationToolDriver::NewEmpty() const
|
||||
{
|
||||
return new XCAFDoc_AnimationTool();
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function :
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
Standard_Boolean BinMXCAFDoc_AnimationToolDriver::Paste
|
||||
(const BinObjMgt_Persistent& /*theSource*/,
|
||||
const Handle(TDF_Attribute)& /*theTarget*/,
|
||||
BinObjMgt_RRelocationTable& /*theRelocTable*/) const
|
||||
{
|
||||
return Standard_True;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function :
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void BinMXCAFDoc_AnimationToolDriver::Paste
|
||||
(const Handle(TDF_Attribute)& /*theSource*/,
|
||||
BinObjMgt_Persistent& /*theTarget*/,
|
||||
BinObjMgt_SRelocationTable& /*theRelocTable*/) const {
|
||||
}
|
50
src/BinMXCAFDoc/BinMXCAFDoc_AnimationToolDriver.hxx
Normal file
50
src/BinMXCAFDoc/BinMXCAFDoc_AnimationToolDriver.hxx
Normal file
@@ -0,0 +1,50 @@
|
||||
// Created on: 2017-10-02
|
||||
// Created by: Elena MOZOKHINA
|
||||
// Copyright (c) 2016 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 _BinMXCAFDoc_AnimationToolDriver_HeaderFile
|
||||
#define _BinMXCAFDoc_AnimationToolDriver_HeaderFile
|
||||
|
||||
#include <Standard.hxx>
|
||||
#include <Standard_Type.hxx>
|
||||
|
||||
#include <BinMDF_ADriver.hxx>
|
||||
#include <Standard_Boolean.hxx>
|
||||
#include <BinObjMgt_RRelocationTable.hxx>
|
||||
#include <BinObjMgt_SRelocationTable.hxx>
|
||||
class CDM_MessageDriver;
|
||||
class TDF_Attribute;
|
||||
class BinObjMgt_Persistent;
|
||||
|
||||
|
||||
class BinMXCAFDoc_AnimationToolDriver;
|
||||
DEFINE_STANDARD_HANDLE(BinMXCAFDoc_AnimationToolDriver, BinMDF_ADriver)
|
||||
|
||||
|
||||
class BinMXCAFDoc_AnimationToolDriver : public BinMDF_ADriver
|
||||
{
|
||||
public:
|
||||
|
||||
Standard_EXPORT BinMXCAFDoc_AnimationToolDriver(const Handle(CDM_MessageDriver)& theMsgDriver);
|
||||
|
||||
Standard_EXPORT virtual Handle(TDF_Attribute) NewEmpty() const Standard_OVERRIDE;
|
||||
|
||||
Standard_EXPORT virtual Standard_Boolean Paste(const BinObjMgt_Persistent& theSource, const Handle(TDF_Attribute)& theTarget, BinObjMgt_RRelocationTable& theRelocTable) const Standard_OVERRIDE;
|
||||
|
||||
Standard_EXPORT virtual void Paste(const Handle(TDF_Attribute)& theSource, BinObjMgt_Persistent& theTarget, BinObjMgt_SRelocationTable& theRelocTable) const Standard_OVERRIDE;
|
||||
|
||||
DEFINE_STANDARD_RTTIEXT(BinMXCAFDoc_AnimationToolDriver, BinMDF_ADriver)
|
||||
|
||||
};
|
||||
#endif // _BinMXCAFDoc_AnimationToolDriver_HeaderFile
|
@@ -53,3 +53,7 @@ BinMXCAFDoc_ViewToolDriver.cxx
|
||||
BinMXCAFDoc_ViewToolDriver.hxx
|
||||
BinMXCAFDoc_VolumeDriver.cxx
|
||||
BinMXCAFDoc_VolumeDriver.hxx
|
||||
BinMXCAFDoc_AnimationDriver.cxx
|
||||
BinMXCAFDoc_AnimationDriver.hxx
|
||||
BinMXCAFDoc_AnimationToolDriver.cxx
|
||||
BinMXCAFDoc_AnimationToolDriver.hxx
|
||||
|
@@ -74,8 +74,8 @@ static Standard_OStream& operator <<(Standard_OStream& OS, const gp_Pnt P)
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
|
||||
BinTools_ShapeSet::BinTools_ShapeSet(const Standard_Boolean isWithTriangles)
|
||||
:myFormatNb(3), myWithTriangles(isWithTriangles)
|
||||
BinTools_ShapeSet::BinTools_ShapeSet(const Standard_Boolean /*isWithTriangles*/)
|
||||
:myFormatNb(3), myWithTriangles(Standard_True/*isWithTriangles*/)
|
||||
{}
|
||||
|
||||
//=======================================================================
|
||||
@@ -517,6 +517,12 @@ void BinTools_ShapeSet::Read(TopoDS_Shape& S, Standard_IStream& IS,
|
||||
anOrient = (TopAbs_Orientation)aChar;
|
||||
Standard_Integer anIndx;
|
||||
BinTools::GetInteger(IS, anIndx);
|
||||
Standard_Integer anInd = nbshapes - anIndx + 1;
|
||||
if (anInd < 1 || anInd > myShapes.Extent())
|
||||
{
|
||||
S = TopoDS_Shape();
|
||||
return;
|
||||
}
|
||||
S = myShapes(nbshapes - anIndx + 1);
|
||||
S.Orientation(anOrient);
|
||||
|
||||
|
@@ -95,6 +95,8 @@ Standard_Integer BinTools_SurfaceSet::Add(const Handle(Geom_Surface)& S)
|
||||
Handle(Geom_Surface) BinTools_SurfaceSet::Surface
|
||||
(const Standard_Integer I)const
|
||||
{
|
||||
if (I < 1 || I > myMap.Extent())
|
||||
return Handle(Geom_Surface)();
|
||||
return Handle(Geom_Surface)::DownCast(myMap(I));
|
||||
}
|
||||
|
||||
|
@@ -800,29 +800,20 @@ proc testdiff {dir1 dir2 args} {
|
||||
|
||||
# Procedure to check data file before adding it to repository
|
||||
help testfile {
|
||||
Checks specified data files for putting them into the test data files repository.
|
||||
|
||||
Use: testfile filelist
|
||||
Check data file and prepare it for putting to test data files repository.
|
||||
Use: testfile [filelist]
|
||||
|
||||
Will report if:
|
||||
- data file (non-binary) is in DOS encoding (CR/LF)
|
||||
- same data file (with same or another name) already exists in the repository
|
||||
- another file with the same name already exists
|
||||
Note that names are considered to be case-insensitive (for compatibility
|
||||
with Windows).
|
||||
Note that names are assumed to be case-insensitive (for Windows).
|
||||
|
||||
Unless the file is already in the repository, tries to load it, reports
|
||||
the recognized file format, file size, number of faces and edges in the
|
||||
loaded shape (if any), information contained its triangulation, and makes
|
||||
snapshot (in the temporary directory).
|
||||
|
||||
loaded shape (if any), and makes snapshot (in the temporary directory).
|
||||
Finally it advises whether the file should be put to public section of the
|
||||
repository.
|
||||
|
||||
Use: testfile -check
|
||||
|
||||
If "-check" is given as an argument, then procedure will check files already
|
||||
located in the repository (for possible duplicates and for DOS encoding).
|
||||
}
|
||||
proc testfile {filelist} {
|
||||
global env
|
||||
@@ -832,11 +823,8 @@ proc testfile {filelist} {
|
||||
error "Environment variable CSF_TestDataPath must be defined!"
|
||||
}
|
||||
|
||||
set checkrepo f
|
||||
if { "$filelist" == "-check" } { set checkrepo t }
|
||||
|
||||
# build registry of existing data files (name -> path) and (size -> path)
|
||||
puts "Collecting info on test data files repository..."
|
||||
puts "Checking available test data files..."
|
||||
foreach dir [_split_path $env(CSF_TestDataPath)] {
|
||||
while {[llength $dir] != 0} {
|
||||
set curr [lindex $dir 0]
|
||||
@@ -845,143 +833,89 @@ proc testfile {filelist} {
|
||||
foreach file [glob -nocomplain -directory $curr -type f *] {
|
||||
set name [file tail $file]
|
||||
set name_lower [string tolower $name]
|
||||
set size [file size $file]
|
||||
|
||||
# check that the file is not in DOS encoding
|
||||
if { $checkrepo } {
|
||||
if { [_check_dos_encoding $file] } {
|
||||
puts "Warning: file $file is in DOS encoding; was this intended?"
|
||||
}
|
||||
_check_file_format $file
|
||||
if { [_check_dos_encoding $file] } {
|
||||
puts "Warning: file $file is in DOS encoding; was this intended?"
|
||||
}
|
||||
_check_file_format $file
|
||||
|
||||
# check if file with the same name is present twice or more
|
||||
if { [info exists names($name_lower)] } {
|
||||
puts "Error: more than one file with name $name is present in the repository:"
|
||||
if { [_diff_files $file $names($name_lower)] } {
|
||||
puts "(files are different by content)"
|
||||
} else {
|
||||
puts "(files are same by content)"
|
||||
}
|
||||
puts "--> $file"
|
||||
puts "--> $names($name_lower)"
|
||||
continue
|
||||
}
|
||||
# check if file with the same name is present twice or more
|
||||
if { [info exists names($name_lower)] } {
|
||||
puts "Error: more than one file with name $name is present in the repository:"
|
||||
if { [_diff_files $file $names($name_lower)] } {
|
||||
puts "(files are different by content)"
|
||||
} else {
|
||||
puts "(files are same by content)"
|
||||
}
|
||||
puts "--> $file"
|
||||
puts "--> $names($name_lower)"
|
||||
continue
|
||||
}
|
||||
|
||||
# check if file with the same content exists
|
||||
if { [info exists sizes($size)] } {
|
||||
foreach other $sizes($size) {
|
||||
if { ! [_diff_files $file $other] } {
|
||||
puts "Warning: two files with the same content found:"
|
||||
puts "--> $file"
|
||||
puts "--> $other"
|
||||
}
|
||||
# check if file with the same content exists
|
||||
set size [file size $file]
|
||||
if { [info exists sizes($size)] } {
|
||||
foreach other $sizes($size) {
|
||||
if { ! [_diff_files $file $other] } {
|
||||
puts "Warning: two files with the same content found:"
|
||||
puts "--> $file"
|
||||
puts "--> $other"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# add the file to the registry
|
||||
lappend names($name_lower) $file
|
||||
set names($name_lower) $file
|
||||
lappend sizes($size) $file
|
||||
}
|
||||
}
|
||||
}
|
||||
if { $checkrepo || [llength $filelist] <= 0 } { return }
|
||||
if { [llength $filelist] <= 0 } { return }
|
||||
|
||||
# check the new files
|
||||
set has_images f
|
||||
puts "Checking new file(s)..."
|
||||
foreach file $filelist {
|
||||
# check for DOS encoding
|
||||
if { [_check_dos_encoding $file] } {
|
||||
puts "$file: Warning: DOS encoding detected"
|
||||
}
|
||||
|
||||
set name [file tail $file]
|
||||
set name_lower [string tolower $name]
|
||||
set found f
|
||||
|
||||
# check for presence of the file with same name
|
||||
if { [info exists names($name_lower)] } {
|
||||
set found f
|
||||
foreach other $names($name_lower) {
|
||||
# avoid comparing the file with itself
|
||||
if { [file normalize $file] == [file normalize $other] } {
|
||||
continue
|
||||
}
|
||||
# compare content
|
||||
if { [_diff_files $file $other] } {
|
||||
puts "\n* $file: error\n name is already used by existing file\n --> $other"
|
||||
} else {
|
||||
puts "\n* $file: already present \n --> $other"
|
||||
}
|
||||
set found t
|
||||
break
|
||||
if { [_diff_files $file $names($name_lower)] } {
|
||||
puts "$file: Error: name is already used by existing file\n--> $names($name_lower)"
|
||||
} else {
|
||||
puts "$file: OK: already in the repository \n--> $names($name_lower)"
|
||||
continue
|
||||
}
|
||||
if { $found } { continue }
|
||||
}
|
||||
|
||||
# get size of the file; if it is in DOS encoding and less than 1 MB,
|
||||
# estimate also its size in UNIX encoding to be able to find same
|
||||
# file if already present but in UNIX encoding
|
||||
set sizeact [file size $file]
|
||||
set sizeunx ""
|
||||
set isdos [_check_dos_encoding $file]
|
||||
if { $isdos && $sizeact < 10000000 } {
|
||||
set fd [open $file r]
|
||||
fconfigure $fd -translation crlf
|
||||
set sizeunx [string length [read $fd]]
|
||||
close $fd
|
||||
}
|
||||
|
||||
# check if file with the same content exists
|
||||
foreach size "$sizeact $sizeunx" {
|
||||
if { [info exists sizes($size)] } {
|
||||
set size [file size $file]
|
||||
if { [info exists sizes($size)] } {
|
||||
set found f
|
||||
foreach other $sizes($size) {
|
||||
# avoid comparing the file with itself
|
||||
if { [file normalize $file] == [file normalize $other] } {
|
||||
continue
|
||||
}
|
||||
# compare content
|
||||
if { ! [_diff_files $file $other] } {
|
||||
puts "\n* $file: duplicate \n already present under name [file tail $other]\n --> $other"
|
||||
puts "$file: OK: the same file is already present under name [file tail $other]\n--> $other"
|
||||
set found t
|
||||
break
|
||||
}
|
||||
}
|
||||
if { $found } { break }
|
||||
}
|
||||
}
|
||||
if { $found } { continue }
|
||||
|
||||
# file is not present yet, so to be analyzed
|
||||
puts "\n* $file: new file"
|
||||
|
||||
# add the file to the registry as if it were added to the repository,
|
||||
# to report possible duplicates among the currently processed files
|
||||
lappend names($name_lower) $file
|
||||
if { "$sizeunx" != "" } {
|
||||
lappend sizes($sizeunx) $file
|
||||
} else {
|
||||
lappend sizes($sizeact) $file
|
||||
}
|
||||
|
||||
# first of all, complain if it is in DOS encoding
|
||||
if { $isdos } {
|
||||
puts " Warning: DOS encoding detected, consider converting to"
|
||||
puts " UNIX unless DOS line ends are needed for the test"
|
||||
if { $found } { continue }
|
||||
}
|
||||
|
||||
# try to read the file
|
||||
set format [_check_file_format $file]
|
||||
if { [catch {uplevel load_data_file $file $format a}] } {
|
||||
puts " Warning: Cannot read as $format file"
|
||||
puts "$file: Error: Cannot read as $format file"
|
||||
continue
|
||||
}
|
||||
|
||||
# warn if shape contains triangulation
|
||||
pload MODELING
|
||||
if { "$format" != "STL" &&
|
||||
[regexp {contains\s+([0-9]+)\s+triangles} [uplevel trinfo a] res nbtriangles] &&
|
||||
$nbtriangles != 0 } {
|
||||
puts " Warning: shape contains triangulation ($nbtriangles triangles),"
|
||||
puts " consider removing them unless they are needed for the test!"
|
||||
}
|
||||
|
||||
# get number of faces and edges
|
||||
set edges 0
|
||||
set faces 0
|
||||
@@ -994,10 +928,16 @@ proc testfile {filelist} {
|
||||
set dir public
|
||||
} else {
|
||||
set dir private
|
||||
# check if one of names of that file corresponds to typical name for
|
||||
# MDTV bugs or has extension .rle, this should be old model
|
||||
if { [regexp -nocase {.*(cts|ats|pro|buc|ger|fra|usa|uki)[0-9]+.*} $name] ||
|
||||
[regexp -nocase {[.]rle\y} $name] } {
|
||||
set dir old
|
||||
}
|
||||
}
|
||||
|
||||
# add stats
|
||||
puts " $format size=[expr $size / 1024] KiB, nbfaces=$faces, nbedges=$edges -> $dir"
|
||||
puts "$file: $format size=[expr $size / 1024] KiB, nbfaces=$faces, nbedges=$edges -> $dir"
|
||||
|
||||
set tmpdir [_get_temp_dir]
|
||||
file mkdir $tmpdir/$dir
|
||||
@@ -1005,7 +945,6 @@ proc testfile {filelist} {
|
||||
# make snapshot
|
||||
pload AISV
|
||||
uplevel vdisplay a
|
||||
uplevel vsetdispmode 1
|
||||
uplevel vfit
|
||||
uplevel vzfit
|
||||
uplevel vdump $tmpdir/$dir/[file rootname [file tail $file]].png
|
||||
@@ -1578,7 +1517,7 @@ proc _html_highlight {status line} {
|
||||
|
||||
# Internal procedure to generate HTML page presenting log of the tests
|
||||
# execution in tabular form, with links to reports on individual cases
|
||||
proc _log_html_summary {logdir log totals regressions improvements skipped total_time} {
|
||||
proc _log_html_summary {logdir log totals regressions improvements total_time} {
|
||||
global _test_case_regexp
|
||||
|
||||
# create missing directories as needed
|
||||
@@ -1625,7 +1564,7 @@ proc _log_html_summary {logdir log totals regressions improvements skipped total
|
||||
}
|
||||
|
||||
# print regressions and improvements
|
||||
foreach featured [list $regressions $improvements $skipped] {
|
||||
foreach featured [list $regressions $improvements] {
|
||||
if { [llength $featured] <= 1 } { continue }
|
||||
set status [string trim [lindex $featured 0] { :}]
|
||||
puts $fd "<h2>$status</h2>"
|
||||
@@ -1732,16 +1671,13 @@ proc _log_summarize {logdir log {total_time {}}} {
|
||||
set totals {}
|
||||
set improvements {Improvements:}
|
||||
set regressions {Failed:}
|
||||
set skipped {Skipped:}
|
||||
if { [info exists stat] } {
|
||||
foreach status [lsort [array names stat]] {
|
||||
lappend totals [list [llength $stat($status)] $status]
|
||||
|
||||
# separately count improvements (status starting with IMP), skipped (status starting with SKIP) and regressions (all except IMP, OK, BAD, and SKIP)
|
||||
# separately count improvements (status starting with IMP) and regressions (all except IMP, OK, BAD, and SKIP)
|
||||
if { [regexp -nocase {^IMP} $status] } {
|
||||
eval lappend improvements $stat($status)
|
||||
} elseif { [regexp -nocase {^SKIP} $status] } {
|
||||
eval lappend skipped $stat($status)
|
||||
} elseif { $status != "OK" && ! [regexp -nocase {^BAD} $status] && ! [regexp -nocase {^SKIP} $status] } {
|
||||
eval lappend regressions $stat($status)
|
||||
}
|
||||
@@ -1756,9 +1692,6 @@ proc _log_summarize {logdir log {total_time {}}} {
|
||||
if { [llength $regressions] > 1 } {
|
||||
_log_and_puts log [join $regressions "\n "]
|
||||
}
|
||||
if { [llength $skipped] > 1 } {
|
||||
_log_and_puts log [join $skipped "\n "]
|
||||
}
|
||||
if { [llength $improvements] == 1 && [llength $regressions] == 1 } {
|
||||
_log_and_puts log "No regressions"
|
||||
}
|
||||
@@ -1768,7 +1701,7 @@ proc _log_summarize {logdir log {total_time {}}} {
|
||||
|
||||
# save log to files
|
||||
if { $logdir != "" } {
|
||||
_log_html_summary $logdir $log $totals $regressions $improvements $skipped $total_time
|
||||
_log_html_summary $logdir $log $totals $regressions $improvements $total_time
|
||||
_log_save $logdir/tests.log [join $log "\n"] "Tests summary"
|
||||
}
|
||||
|
||||
@@ -2407,7 +2340,7 @@ proc load_data_file {file format shape} {
|
||||
DRAW { uplevel restore $file $shape }
|
||||
IGES { pload XSDRAW; uplevel igesbrep $file $shape * }
|
||||
STEP { pload XSDRAW; uplevel stepread $file __a *; uplevel renamevar __a_1 $shape }
|
||||
STL { pload XSDRAW; uplevel readstl $shape $file triangulation }
|
||||
STL { pload XSDRAW; uplevel readstl $shape $file }
|
||||
default { error "Cannot read $format file $file" }
|
||||
}
|
||||
}
|
||||
|
@@ -20,6 +20,8 @@ Graphic3d_ArrayOfTriangleStrips.cxx
|
||||
Graphic3d_ArrayOfTriangleStrips.hxx
|
||||
Graphic3d_AspectFillArea3d.cxx
|
||||
Graphic3d_AspectFillArea3d.hxx
|
||||
Graphic3d_AspectFillCapping.cxx
|
||||
Graphic3d_AspectFillCapping.hxx
|
||||
Graphic3d_AspectLine3d.cxx
|
||||
Graphic3d_AspectLine3d.hxx
|
||||
Graphic3d_AspectMarker3d.cxx
|
||||
@@ -38,7 +40,6 @@ Graphic3d_BufferType.hxx
|
||||
Graphic3d_Camera.cxx
|
||||
Graphic3d_Camera.hxx
|
||||
Graphic3d_CameraTile.hxx
|
||||
Graphic3d_CappingFlags.hxx
|
||||
Graphic3d_CLight.hxx
|
||||
Graphic3d_ClipPlane.cxx
|
||||
Graphic3d_ClipPlane.hxx
|
||||
|
110
src/Graphic3d/Graphic3d_AspectFillCapping.cxx
Normal file
110
src/Graphic3d/Graphic3d_AspectFillCapping.cxx
Normal file
@@ -0,0 +1,110 @@
|
||||
// Created on: 2017-04-14
|
||||
// Created by: Anton POLETAEV
|
||||
// Copyright (c) 2017 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_AspectFillCapping.hxx>
|
||||
|
||||
IMPLEMENT_STANDARD_RTTIEXT(Graphic3d_AspectFillCapping, Standard_Transient)
|
||||
|
||||
// =======================================================================
|
||||
// function : Graphic3d_AspectFillCapping
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
Graphic3d_AspectFillCapping::Graphic3d_AspectFillCapping()
|
||||
: myFlags (Flags_None),
|
||||
myHatchingState (0)
|
||||
{
|
||||
Graphic3d_MaterialAspect aMaterial;
|
||||
aMaterial.SetColor (Quantity_NOC_BLACK);
|
||||
aMaterial.SetReflectionModeOff (Graphic3d_TOR_AMBIENT);
|
||||
aMaterial.SetReflectionModeOff (Graphic3d_TOR_DIFFUSE);
|
||||
aMaterial.SetReflectionModeOff (Graphic3d_TOR_SPECULAR);
|
||||
aMaterial.SetReflectionModeOff (Graphic3d_TOR_EMISSION);
|
||||
aMaterial.SetMaterialType (Graphic3d_MATERIAL_ASPECT);
|
||||
SetHatchStyle (Aspect_HS_HORIZONTAL);
|
||||
SetHatchMaterial (aMaterial);
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : SetHatchStyle
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
void Graphic3d_AspectFillCapping::SetHatchStyle (const Aspect_HatchStyle theStyle)
|
||||
{
|
||||
myStippleHatch = new Graphic3d_HatchStyle (theStyle);
|
||||
myTextureHatch.Nullify();
|
||||
myHatchingState++;
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : SetHatchStyle
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
void Graphic3d_AspectFillCapping::SetHatchStyle (const Handle(Graphic3d_HatchStyle)& theStyle)
|
||||
{
|
||||
myStippleHatch = theStyle;
|
||||
myTextureHatch.Nullify();
|
||||
myHatchingState++;
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : SetHatchStyle
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
void Graphic3d_AspectFillCapping::SetHatchStyle (const Handle(Graphic3d_TextureMap)& theTexture)
|
||||
{
|
||||
myStippleHatch.Nullify();
|
||||
myTextureHatch = theTexture;
|
||||
myHatchingState++;
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : SetHatchMaterial
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
void Graphic3d_AspectFillCapping::SetHatchMaterial (const Graphic3d_MaterialAspect& theMaterial)
|
||||
{
|
||||
myHatchMaterial = theMaterial;
|
||||
myHatchingState++;
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : SetToDrawHatch
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
void Graphic3d_AspectFillCapping::SetToDrawHatch (const Standard_Boolean theToDraw)
|
||||
{
|
||||
setFlag (theToDraw, Flags_DrawHatching);
|
||||
myHatchingState++;
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : SetHatchZoomPeristent
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
void Graphic3d_AspectFillCapping::SetHatchZoomPeristent (const Standard_Boolean theToSet)
|
||||
{
|
||||
setFlag (theToSet, Flags_HatchZoomPersistent);
|
||||
myHatchingState++;
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : SetHatchRotationPeristent
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
void Graphic3d_AspectFillCapping::SetHatchRotationPeristent (const Standard_Boolean theToSet)
|
||||
{
|
||||
setFlag (theToSet, Flags_HatchRotationPersistent);
|
||||
myHatchingState++;
|
||||
}
|
163
src/Graphic3d/Graphic3d_AspectFillCapping.hxx
Normal file
163
src/Graphic3d/Graphic3d_AspectFillCapping.hxx
Normal file
@@ -0,0 +1,163 @@
|
||||
// Created on: 2017-04-14
|
||||
// Created by: Anton POLETAEV
|
||||
// Copyright (c) 2017 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_AspectFillCapping_HeaderFile
|
||||
#define _Graphic3d_AspectFillCapping_HeaderFile
|
||||
|
||||
#include <Aspect_HatchStyle.hxx>
|
||||
#include <Graphic3d_HatchStyle.hxx>
|
||||
#include <Graphic3d_MaterialAspect.hxx>
|
||||
#include <Graphic3d_ShaderProgram.hxx>
|
||||
#include <Graphic3d_TextureMap.hxx>
|
||||
#include <Standard_Transient.hxx>
|
||||
|
||||
//! Defines graphical attributes for drawing section planes on solids resulted from clipping (cutting) planes.
|
||||
class Graphic3d_AspectFillCapping : public Standard_Transient
|
||||
{
|
||||
public:
|
||||
|
||||
//! Default constructor.
|
||||
Standard_EXPORT Graphic3d_AspectFillCapping();
|
||||
|
||||
public:
|
||||
|
||||
//! Sets material for filling section created by clipping.
|
||||
void SetMaterial (const Graphic3d_MaterialAspect& theMaterial) { myMaterial = theMaterial; }
|
||||
|
||||
//! Returns material for filling section created by clipping.
|
||||
const Graphic3d_MaterialAspect& Material() const { return myMaterial; }
|
||||
|
||||
//! Sets flag indicating whether object's material (instead of defined by this aspect) should be used for filling section.
|
||||
void SetUseObjectMaterial (const Standard_Boolean theToUse) { setFlag (theToUse, Flags_UseObjectMaterial); }
|
||||
|
||||
//! Returns flag indicating whether object's material (instead of defined by this aspect) should be used for filling section.
|
||||
Standard_Boolean ToUseObjectMaterial() const { return (myFlags & Flags_UseObjectMaterial) != 0; }
|
||||
|
||||
//! Sets texture for filling section created by clipping.
|
||||
void SetTexture (const Handle(Graphic3d_TextureMap)& theTexture) { myTexture = theTexture; }
|
||||
|
||||
//! Returns texture for filling section created by clipping.
|
||||
const Handle(Graphic3d_TextureMap)& Texture() const { return myTexture; }
|
||||
|
||||
//! Sets flag indicating whether object's texture (instead of defined by this aspect) should be used for filling section.
|
||||
void SetUseObjectTexture (const Standard_Boolean theToUse) { setFlag (theToUse, Flags_UseObjectTexture); }
|
||||
|
||||
//! Returns flag indicating whether object's texture (instead of defined by this aspect) should be used for filling section.
|
||||
Standard_Boolean ToUseObjectTexture() const { return (myFlags & Flags_UseObjectTexture) != 0; }
|
||||
|
||||
//! Sets OpenGL/GLSL shader program.
|
||||
void SetShader (const Handle(Graphic3d_ShaderProgram)& theShader) { myShader = theShader; }
|
||||
|
||||
//! Returns OpenGL/GLSL shader program.
|
||||
const Handle(Graphic3d_ShaderProgram)& Shader() const { return myShader; }
|
||||
|
||||
//! Sets flag indicating whether object's shader (instead of defined by this aspect) should be used for filling section.
|
||||
void SetUseObjectShader (const Standard_Boolean theToUse) { setFlag (theToUse, Flags_UseObjectShader); }
|
||||
|
||||
//! Returns flag indicating whether object's shader (instead of defined by this aspect) should be used for filling section.
|
||||
Standard_Boolean ToUseObjectShader() const { return (myFlags & Flags_UseObjectShader) != 0; }
|
||||
|
||||
public:
|
||||
|
||||
//! Sets style of hatch defined by predefined stipple mask.
|
||||
Standard_EXPORT void SetHatchStyle (const Aspect_HatchStyle theStyle);
|
||||
|
||||
//! Sets style of hatch defined by custom stipple mask.
|
||||
Standard_EXPORT void SetHatchStyle (const Handle(Graphic3d_HatchStyle)& theStyle);
|
||||
|
||||
//! Sets style of hatch defined by texture map (decal texture with alpha channel should be used).
|
||||
Standard_EXPORT void SetHatchStyle (const Handle(Graphic3d_TextureMap)& theTexture);
|
||||
|
||||
//! Sets material style for hatch lines (texture).
|
||||
Standard_EXPORT void SetHatchMaterial (const Graphic3d_MaterialAspect& theMaterial);
|
||||
|
||||
//! Returns material style for hatch lines (texture).
|
||||
const Graphic3d_MaterialAspect& HatchMaterial() const { return myHatchMaterial; }
|
||||
|
||||
//! Sets boolean flag indicating whether the hatch layer should be drawn or not.
|
||||
Standard_EXPORT void SetToDrawHatch (const Standard_Boolean theToDraw);
|
||||
|
||||
//! Returns boolean flag indicating whether the hatch layer should be drawn or not.
|
||||
Standard_Boolean ToDrawHatch() const { return (myFlags & Flags_DrawHatching) != 0; }
|
||||
|
||||
//! Sets flag controlling behavior of hatch texture mapping on zooming.
|
||||
//! @param theToSet [in] if passed TRUE the texture will keep constant screen-scale independent of zooming.
|
||||
Standard_EXPORT void SetHatchZoomPeristent (const Standard_Boolean theToSet);
|
||||
|
||||
//! Returns value of flag controlling behavior of hatch texture mapping on zooming.
|
||||
Standard_Boolean IsHatchZoomPersistent() { return (myFlags & Flags_HatchZoomPersistent) != 0; }
|
||||
|
||||
//! Sets flag controlling behavior of hatch texture mapping on camera rotation around heading vector.
|
||||
Standard_EXPORT void SetHatchRotationPeristent (const Standard_Boolean theToSet);
|
||||
|
||||
//! Returns value of flag controlling behavior of hatch texture mapping on camera rotation around heading vector.
|
||||
Standard_Boolean IsHatchRotationPersistent() { return (myFlags & Flags_HatchRotationPersistent) != 0; }
|
||||
|
||||
//! Returns true if hatch is defined by texture.
|
||||
Standard_Boolean IsTextureHatch() const { return !myTextureHatch.IsNull(); }
|
||||
|
||||
//! Returns texture map defining the hatch.
|
||||
const Handle(Graphic3d_TextureMap)& TextureHatch() const { return myTextureHatch; }
|
||||
|
||||
//! Returns true if hatch is defined by stipple mask.
|
||||
Standard_Boolean IsStippleHatch() const { return !myStippleHatch.IsNull(); }
|
||||
|
||||
//! Returns the stipple mask.
|
||||
const Handle(Graphic3d_HatchStyle)& StippleHatch() const { return myStippleHatch; }
|
||||
|
||||
//! Returns modification counter for hatching state.
|
||||
Standard_Size HatchingState() const { return myHatchingState; }
|
||||
|
||||
private:
|
||||
|
||||
enum Flags
|
||||
{
|
||||
Flags_None = 0x00, //!< no flags
|
||||
Flags_UseObjectMaterial = 0x01, //!< use object material
|
||||
Flags_UseObjectTexture = 0x02, //!< use object texture
|
||||
Flags_UseObjectShader = 0x04, //!< use object GLSL program
|
||||
Flags_HatchZoomPersistent = 0x08, //!< zoom-persistent texturing
|
||||
Flags_HatchRotationPersistent = 0x10, //!< rotation-persistent texturing
|
||||
Flags_DrawHatching = 0x20, //!< draw hatching
|
||||
Flags_UseObjectProperties = //!< use entire fill area aspect from object
|
||||
Flags_UseObjectMaterial
|
||||
| Flags_UseObjectTexture
|
||||
| Flags_UseObjectShader
|
||||
};
|
||||
|
||||
void setFlag (const Standard_Boolean theToUse, const unsigned int theFlag)
|
||||
{
|
||||
myFlags = theToUse ? myFlags | theFlag : myFlags & ~theFlag;
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
Graphic3d_MaterialAspect myMaterial;
|
||||
Handle(Graphic3d_TextureMap) myTexture;
|
||||
Handle(Graphic3d_ShaderProgram) myShader;
|
||||
Handle(Graphic3d_HatchStyle) myStippleHatch;
|
||||
Handle(Graphic3d_TextureMap) myTextureHatch;
|
||||
Graphic3d_MaterialAspect myHatchMaterial;
|
||||
unsigned int myFlags;
|
||||
Standard_Size myHatchingState;
|
||||
|
||||
public:
|
||||
|
||||
DEFINE_STANDARD_RTTIEXT(Graphic3d_AspectFillCapping, Standard_Transient)
|
||||
};
|
||||
|
||||
DEFINE_STANDARD_HANDLE (Graphic3d_AspectFillCapping, Standard_Transient)
|
||||
|
||||
#endif // _Graphic3d_AspectFillCapping_HeaderFile
|
@@ -1,29 +0,0 @@
|
||||
// Created on: 2016-08-04
|
||||
// Copyright (c) 2016 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_CappingFlags_HeaderFile
|
||||
#define _Graphic3d_CappingFlags_HeaderFile
|
||||
|
||||
//! Enumeration of capping flags.
|
||||
enum Graphic3d_CappingFlags
|
||||
{
|
||||
Graphic3d_CappingFlags_None = 0x0000, //!< no flags
|
||||
Graphic3d_CappingFlags_ObjectMaterial = 0x0001, //!< use object material
|
||||
Graphic3d_CappingFlags_ObjectTexture = 0x0002, //!< use object texture
|
||||
Graphic3d_CappingFlags_ObjectShader = 0x0008, //!< use object GLSL program
|
||||
Graphic3d_CappingFlags_ObjectAspect =
|
||||
Graphic3d_CappingFlags_ObjectMaterial | Graphic3d_CappingFlags_ObjectTexture | Graphic3d_CappingFlags_ObjectShader //!< use entire fill area aspect from object
|
||||
};
|
||||
|
||||
#endif // _Graphic3d_CappingFlags_HeaderFile
|
@@ -19,24 +19,11 @@
|
||||
#include <gp_Pln.hxx>
|
||||
#include <Standard_Atomic.hxx>
|
||||
|
||||
IMPLEMENT_STANDARD_RTTIEXT(Graphic3d_ClipPlane,Standard_Transient)
|
||||
IMPLEMENT_STANDARD_RTTIEXT(Graphic3d_ClipPlane, Standard_Transient)
|
||||
|
||||
namespace
|
||||
{
|
||||
static volatile Standard_Integer THE_CLIP_PLANE_COUNTER = 0;
|
||||
|
||||
static Handle(Graphic3d_AspectFillArea3d) defaultAspect()
|
||||
{
|
||||
const Graphic3d_MaterialAspect aMaterial (Graphic3d_NOM_DEFAULT);
|
||||
Handle(Graphic3d_AspectFillArea3d) anAspect = new Graphic3d_AspectFillArea3d();
|
||||
anAspect->SetDistinguishOff();
|
||||
anAspect->SetFrontMaterial (aMaterial);
|
||||
anAspect->SetHatchStyle (Aspect_HS_HORIZONTAL);
|
||||
anAspect->SetInteriorStyle (Aspect_IS_SOLID);
|
||||
anAspect->SetInteriorColor (aMaterial.Color());
|
||||
anAspect->SetSuppressBackFaces (false);
|
||||
return anAspect;
|
||||
}
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
@@ -44,69 +31,40 @@ namespace
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
Graphic3d_ClipPlane::Graphic3d_ClipPlane()
|
||||
: myAspect (defaultAspect()),
|
||||
myPlane (0.0, 0.0, 1.0, 0.0),
|
||||
myEquation (0.0, 0.0, 1.0, 0.0),
|
||||
myFlags (Graphic3d_CappingFlags_None),
|
||||
myEquationMod(0),
|
||||
myAspectMod (0),
|
||||
myIsOn (Standard_True),
|
||||
myIsCapping (Standard_False)
|
||||
{
|
||||
makeId();
|
||||
init();
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : Graphic3d_ClipPlane
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
Graphic3d_ClipPlane::Graphic3d_ClipPlane(const Equation& theEquation)
|
||||
: myAspect (defaultAspect()),
|
||||
myPlane (theEquation.x(), theEquation.y(), theEquation.z(), theEquation.w()),
|
||||
myEquation (theEquation),
|
||||
myFlags (Graphic3d_CappingFlags_None),
|
||||
myEquationMod(0),
|
||||
myAspectMod (0),
|
||||
myIsOn (Standard_True),
|
||||
myIsCapping (Standard_False)
|
||||
Graphic3d_ClipPlane::Graphic3d_ClipPlane (const Equation& theEquation)
|
||||
{
|
||||
makeId();
|
||||
init (gp_Pln (theEquation.x(), theEquation.y(), theEquation.z(), theEquation.a()));
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : Graphic3d_ClipPlane
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
Graphic3d_ClipPlane::Graphic3d_ClipPlane(const Graphic3d_ClipPlane& theOther)
|
||||
: Standard_Transient(theOther),
|
||||
myAspect (defaultAspect()),
|
||||
myPlane (theOther.myPlane),
|
||||
myEquation (theOther.myEquation),
|
||||
myFlags (theOther.myFlags),
|
||||
myEquationMod(0),
|
||||
myAspectMod (0),
|
||||
myIsOn (theOther.myIsOn),
|
||||
myIsCapping (theOther.myIsCapping)
|
||||
Graphic3d_ClipPlane::Graphic3d_ClipPlane (const Graphic3d_ClipPlane& theOther)
|
||||
: Standard_Transient (theOther)
|
||||
{
|
||||
makeId();
|
||||
*myAspect = *theOther.CappingAspect();
|
||||
init (theOther.myPlane,
|
||||
theOther.myIsOn,
|
||||
theOther.myIsCapping,
|
||||
theOther.ToOverrideCappingAspect(),
|
||||
theOther.CappingSectionStyle());
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : Graphic3d_ClipPlane
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
Graphic3d_ClipPlane::Graphic3d_ClipPlane(const gp_Pln& thePlane)
|
||||
: myAspect (defaultAspect()),
|
||||
myPlane (thePlane),
|
||||
myFlags (Graphic3d_CappingFlags_None),
|
||||
myEquationMod(0),
|
||||
myAspectMod (0),
|
||||
myIsOn (Standard_True),
|
||||
myIsCapping (Standard_False)
|
||||
Graphic3d_ClipPlane::Graphic3d_ClipPlane (const gp_Pln& thePlane)
|
||||
{
|
||||
thePlane.Coefficients (myEquation[0], myEquation[1], myEquation[2], myEquation[3]);
|
||||
makeId();
|
||||
init (thePlane);
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
@@ -115,23 +73,20 @@ Graphic3d_ClipPlane::Graphic3d_ClipPlane(const gp_Pln& thePlane)
|
||||
// =======================================================================
|
||||
void Graphic3d_ClipPlane::SetEquation (const Equation& theEquation)
|
||||
{
|
||||
myPlane = gp_Pln (theEquation.x(), theEquation.y(), theEquation.z(), theEquation.w());
|
||||
myEquation = theEquation;
|
||||
myEquationMod++;
|
||||
myPlane = gp_Pln (theEquation.x(), theEquation.y(), theEquation.z(), theEquation.w());
|
||||
myEquation = theEquation;
|
||||
myOrientationDirty = Standard_True;
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : SetPlane
|
||||
// function : SetEquation
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
void Graphic3d_ClipPlane::SetEquation (const gp_Pln& thePlane)
|
||||
{
|
||||
myPlane = thePlane;
|
||||
thePlane.Coefficients (myEquation[0],
|
||||
myEquation[1],
|
||||
myEquation[2],
|
||||
myEquation[3]);
|
||||
myEquationMod++;
|
||||
thePlane.Coefficients (myEquation[0], myEquation[1], myEquation[2], myEquation[3]);
|
||||
myOrientationDirty = Standard_True;
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
@@ -162,117 +117,100 @@ Handle(Graphic3d_ClipPlane) Graphic3d_ClipPlane::Clone() const
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : SetCappingMaterial
|
||||
// function : SetCappingSectionStyle
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
void Graphic3d_ClipPlane::SetCappingMaterial (const Graphic3d_MaterialAspect& theMat)
|
||||
void Graphic3d_ClipPlane::SetCappingSectionStyle (const Handle(Graphic3d_AspectFillCapping)& theStyle)
|
||||
{
|
||||
myAspect->SetFrontMaterial (theMat);
|
||||
myAspect->SetInteriorColor (theMat.Color());
|
||||
++myAspectMod;
|
||||
mySectionStyle = theStyle;
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : SetCappingTexture
|
||||
// function : OrientationMatrix
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
void Graphic3d_ClipPlane::SetCappingTexture (const Handle(Graphic3d_TextureMap)& theTexture)
|
||||
const Graphic3d_Mat4& Graphic3d_ClipPlane::OrientationMatrix() const
|
||||
{
|
||||
if (!theTexture.IsNull())
|
||||
if (myOrientationDirty)
|
||||
{
|
||||
myAspect->SetTextureMapOn();
|
||||
Handle(Graphic3d_TextureSet) aTextureSet = myAspect->TextureSet();
|
||||
if (aTextureSet.IsNull() || aTextureSet->Size() != 1)
|
||||
const Standard_ShortReal aDirection[] = {
|
||||
static_cast<Standard_ShortReal> (myEquation[0]),
|
||||
static_cast<Standard_ShortReal> (myEquation[1]),
|
||||
static_cast<Standard_ShortReal> (myEquation[2])
|
||||
};
|
||||
|
||||
const Standard_ShortReal aTranslate[] = {
|
||||
static_cast<Standard_ShortReal> (myEquation[0] * -myEquation[3]),
|
||||
static_cast<Standard_ShortReal> (myEquation[1] * -myEquation[3]),
|
||||
static_cast<Standard_ShortReal> (myEquation[2] * -myEquation[3])
|
||||
};
|
||||
|
||||
Standard_ShortReal aSide1[] = { 0.0f, 0.0f, 0.0f };
|
||||
Standard_ShortReal aSide2[] = { 0.0f, 0.0f, 0.0f };
|
||||
|
||||
const Standard_ShortReal aMagintude = static_cast<Standard_ShortReal> (Sqrt (myEquation[0] * myEquation[0] + myEquation[2] * myEquation[2]));
|
||||
|
||||
if (aMagintude < ShortRealSmall())
|
||||
{
|
||||
aTextureSet = new Graphic3d_TextureSet (theTexture);
|
||||
aSide1[0] = 1.0f;
|
||||
}
|
||||
else
|
||||
{
|
||||
aTextureSet->SetFirst (theTexture);
|
||||
aSide1[0] = aDirection[2] / aMagintude;
|
||||
aSide1[2] = -aDirection[0] / aMagintude;
|
||||
}
|
||||
myAspect->SetTextureSet (aTextureSet);
|
||||
|
||||
aSide2[0] = (-aSide1[1] * aDirection[2]) - (-aSide1[2] * aDirection[1]);
|
||||
aSide2[1] = (-aSide1[2] * aDirection[0]) - (-aSide1[0] * aDirection[2]);
|
||||
aSide2[2] = (-aSide1[0] * aDirection[1]) - (-aSide1[1] * aDirection[0]);
|
||||
|
||||
myOrientationMat.SetValue (0, 0, aSide1[0]);
|
||||
myOrientationMat.SetValue (1, 0, aSide1[1]);
|
||||
myOrientationMat.SetValue (2, 0, aSide1[2]);
|
||||
myOrientationMat.SetValue (3, 0, 0.0F);
|
||||
|
||||
myOrientationMat.SetValue (0, 1, aDirection[0]);
|
||||
myOrientationMat.SetValue (1, 1, aDirection[1]);
|
||||
myOrientationMat.SetValue (2, 1, aDirection[2]);
|
||||
myOrientationMat.SetValue (3, 1, 0.0F);
|
||||
|
||||
myOrientationMat.SetValue (0, 2, aSide2[0]);
|
||||
myOrientationMat.SetValue (1, 2, aSide2[1]);
|
||||
myOrientationMat.SetValue (2, 2, aSide2[2]);
|
||||
myOrientationMat.SetValue (3, 2, 0.0F);
|
||||
|
||||
myOrientationMat.SetValue (0, 3, aTranslate[0]);
|
||||
myOrientationMat.SetValue (1, 3, aTranslate[1]);
|
||||
myOrientationMat.SetValue (2, 3, aTranslate[2]);
|
||||
myOrientationMat.SetValue (3, 3, 1.0F);
|
||||
|
||||
myOrientationDirty = Standard_False;
|
||||
}
|
||||
else
|
||||
|
||||
return myOrientationMat;
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : init
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
void Graphic3d_ClipPlane::init (const gp_Pln& thePlane,
|
||||
const Standard_Boolean theIsOn,
|
||||
const Standard_Boolean theIsCapping,
|
||||
const Standard_Boolean theOverrideStyle,
|
||||
const Handle(Graphic3d_AspectFillCapping)& theStyle)
|
||||
{
|
||||
if (myEntityUID.IsEmpty())
|
||||
{
|
||||
myAspect->SetTextureMapOff();
|
||||
myAspect->SetTextureSet (Handle(Graphic3d_TextureSet)());
|
||||
myEntityUID = TCollection_AsciiString ("Graphic3d_ClipPlane_") //DynamicType()->Name()
|
||||
+ TCollection_AsciiString (Standard_Atomic_Increment (&THE_CLIP_PLANE_COUNTER));
|
||||
}
|
||||
++myAspectMod;
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : SetCappingHatch
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
void Graphic3d_ClipPlane::SetCappingHatch (const Aspect_HatchStyle theStyle)
|
||||
{
|
||||
myAspect->SetHatchStyle (theStyle);
|
||||
++myAspectMod;
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : SetCappingCustomHatch
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
void Graphic3d_ClipPlane::SetCappingCustomHatch (const Handle(Graphic3d_HatchStyle)& theStyle)
|
||||
{
|
||||
myAspect->SetHatchStyle (theStyle);
|
||||
++myAspectMod;
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : SetCappingHatchOn
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
void Graphic3d_ClipPlane::SetCappingHatchOn()
|
||||
{
|
||||
myAspect->SetInteriorStyle (Aspect_IS_HATCH);
|
||||
++myAspectMod;
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : SetCappingHatchOff
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
void Graphic3d_ClipPlane::SetCappingHatchOff()
|
||||
{
|
||||
myAspect->SetInteriorStyle (Aspect_IS_SOLID);
|
||||
++myAspectMod;
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : SetCappingAspect
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
void Graphic3d_ClipPlane::SetCappingAspect (const Handle(Graphic3d_AspectFillArea3d)& theAspect)
|
||||
{
|
||||
myAspect = theAspect;
|
||||
++myAspectMod;
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : setCappingFlag
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
void Graphic3d_ClipPlane::setCappingFlag (bool theToUse, int theFlag)
|
||||
{
|
||||
if (theToUse)
|
||||
{
|
||||
myFlags |= theFlag;
|
||||
}
|
||||
else
|
||||
{
|
||||
myFlags &= ~(theFlag);
|
||||
}
|
||||
++myAspectMod;
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : makeId
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
void Graphic3d_ClipPlane::makeId()
|
||||
{
|
||||
myId = TCollection_AsciiString ("Graphic3d_ClipPlane_") //DynamicType()->Name()
|
||||
+ TCollection_AsciiString (Standard_Atomic_Increment (&THE_CLIP_PLANE_COUNTER));
|
||||
myPlane = thePlane;
|
||||
myPlane.Coefficients (myEquation[0], myEquation[1], myEquation[2], myEquation[3]);
|
||||
myIsOn = theIsOn;
|
||||
myIsCapping = theIsCapping;
|
||||
myOverrideObjectStyle = theOverrideStyle;
|
||||
mySectionStyle = theStyle.IsNull() ? new Graphic3d_AspectFillCapping() : theStyle;
|
||||
myOrientationDirty = Standard_True;
|
||||
}
|
||||
|
@@ -17,14 +17,16 @@
|
||||
#define _Graphic3d_ClipPlane_HeaderFile
|
||||
|
||||
#include <Aspect_HatchStyle.hxx>
|
||||
#include <gp_Pln.hxx>
|
||||
#include <Graphic3d_AspectFillArea3d.hxx>
|
||||
#include <Graphic3d_CappingFlags.hxx>
|
||||
#include <Graphic3d_AspectFillCapping.hxx>
|
||||
#include <Graphic3d_Mat4.hxx>
|
||||
#include <Graphic3d_TextureMap.hxx>
|
||||
#include <NCollection_Handle.hxx>
|
||||
#include <NCollection_Vec4.hxx>
|
||||
#include <Standard_Macro.hxx>
|
||||
#include <Standard_TypeDef.hxx>
|
||||
#include <Standard_Transient.hxx>
|
||||
#include <Standard_TypeDef.hxx>
|
||||
#include <gp_Pln.hxx>
|
||||
|
||||
//! Container for properties describing graphic driver clipping planes.
|
||||
//! It is up to application to create instances of this class and specify its
|
||||
@@ -45,6 +47,8 @@ public:
|
||||
|
||||
typedef NCollection_Vec4<Standard_Real> Equation;
|
||||
|
||||
public:
|
||||
|
||||
//! Default constructor.
|
||||
//! Initializes clip plane container with the following properties:
|
||||
//! - Equation (0.0, 0.0, 1.0, 0)
|
||||
@@ -58,7 +62,7 @@ public:
|
||||
|
||||
//! Copy constructor.
|
||||
//! @param theOther [in] the copied plane.
|
||||
Standard_EXPORT Graphic3d_ClipPlane(const Graphic3d_ClipPlane& theOther);
|
||||
Standard_EXPORT Graphic3d_ClipPlane (const Graphic3d_ClipPlane& theOther);
|
||||
|
||||
//! Construct clip plane for the passed equation.
|
||||
//! By default the plane is on, capping is turned off.
|
||||
@@ -82,37 +86,17 @@ public:
|
||||
|
||||
//! Get 4-component equation vector for clipping plane.
|
||||
//! @return clipping plane equation vector.
|
||||
const Equation& GetEquation() const
|
||||
{
|
||||
return myEquation;
|
||||
}
|
||||
const Equation& GetEquation() const { return myEquation; }
|
||||
|
||||
//! Check that the clipping plane is turned on.
|
||||
//! @return boolean flag indicating whether the plane is in on or off state.
|
||||
Standard_Boolean IsOn() const
|
||||
{
|
||||
return myIsOn;
|
||||
}
|
||||
Standard_Boolean IsOn() const { return myIsOn; }
|
||||
|
||||
//! Change state of the clipping plane.
|
||||
//! @param theIsOn [in] the flag specifying whether the graphic driver
|
||||
//! clipping by this plane should be turned on or off.
|
||||
Standard_EXPORT void SetOn(const Standard_Boolean theIsOn);
|
||||
|
||||
//! Change state of capping surface rendering.
|
||||
//! @param theIsOn [in] the flag specifying whether the graphic driver should
|
||||
//! perform rendering of capping surface produced by this plane. The graphic
|
||||
//! driver produces this surface for convex graphics by means of stencil-test
|
||||
//! and multi-pass rendering.
|
||||
Standard_EXPORT void SetCapping(const Standard_Boolean theIsOn);
|
||||
|
||||
//! Check state of capping surface rendering.
|
||||
//! @return true (turned on) or false depending on the state.
|
||||
Standard_Boolean IsCapping() const
|
||||
{
|
||||
return myIsCapping;
|
||||
}
|
||||
|
||||
//! Get geometrical definition.
|
||||
//! @return geometrical definition of clipping plane
|
||||
const gp_Pln& ToPlane() const { return myPlane; }
|
||||
@@ -123,47 +107,6 @@ public:
|
||||
//! @return new instance of clipping plane with same properties and attributes.
|
||||
Standard_EXPORT virtual Handle(Graphic3d_ClipPlane) Clone() const;
|
||||
|
||||
public: // @name user-defined graphical attributes
|
||||
|
||||
//! Set material for rendering capping surface.
|
||||
//! @param theMat [in] the material.
|
||||
Standard_EXPORT void SetCappingMaterial (const Graphic3d_MaterialAspect& theMat);
|
||||
|
||||
//! @return capping material.
|
||||
const Graphic3d_MaterialAspect& CappingMaterial() const { return myAspect->FrontMaterial(); }
|
||||
|
||||
//! Set texture to be applied on capping surface.
|
||||
//! @param theTexture [in] the texture.
|
||||
Standard_EXPORT void SetCappingTexture (const Handle(Graphic3d_TextureMap)& theTexture);
|
||||
|
||||
//! @return capping texture map.
|
||||
Handle(Graphic3d_TextureMap) CappingTexture() const { return !myAspect->TextureSet().IsNull() && !myAspect->TextureSet()->IsEmpty()
|
||||
? myAspect->TextureSet()->First()
|
||||
: Handle(Graphic3d_TextureMap)(); }
|
||||
|
||||
//! Set hatch style (stipple) and turn hatching on.
|
||||
//! @param theStyle [in] the hatch style.
|
||||
Standard_EXPORT void SetCappingHatch (const Aspect_HatchStyle theStyle);
|
||||
|
||||
//! @return hatching style.
|
||||
Aspect_HatchStyle CappingHatch() const { return (Aspect_HatchStyle)myAspect->HatchStyle()->HatchType(); }
|
||||
|
||||
//! Set custom hatch style (stipple) and turn hatching on.
|
||||
//! @param theStyle [in] the hatch pattern.
|
||||
Standard_EXPORT void SetCappingCustomHatch (const Handle(Graphic3d_HatchStyle)& theStyle);
|
||||
|
||||
//! @return hatching style.
|
||||
const Handle(Graphic3d_HatchStyle)& CappingCustomHatch() const { return myAspect->HatchStyle(); }
|
||||
|
||||
//! Turn on hatching.
|
||||
Standard_EXPORT void SetCappingHatchOn();
|
||||
|
||||
//! Turn off hatching.
|
||||
Standard_EXPORT void SetCappingHatchOff();
|
||||
|
||||
//! @return True if hatching mask is turned on.
|
||||
Standard_Boolean IsHatchOn() const { return myAspect->InteriorStyle() == Aspect_IS_HATCH; }
|
||||
|
||||
//! This ID is used for managing associated resources in graphical driver.
|
||||
//! The clip plane can be assigned within a range of IO which can be
|
||||
//! displayed in separate OpenGl contexts. For each of the context an associated
|
||||
@@ -171,81 +114,61 @@ public: // @name user-defined graphical attributes
|
||||
//! The resources are stored in graphical driver for each of individual groups
|
||||
//! of shared context under the clip plane identifier.
|
||||
//! @return clip plane resource identifier string.
|
||||
const TCollection_AsciiString& GetId() const
|
||||
{
|
||||
return myId;
|
||||
}
|
||||
const TCollection_AsciiString& GetId() const { return myEntityUID; }
|
||||
|
||||
public:
|
||||
|
||||
//! Return capping aspect.
|
||||
//! @return capping surface rendering aspect.
|
||||
const Handle(Graphic3d_AspectFillArea3d)& CappingAspect() const { return myAspect; }
|
||||
//! Change state of capping surface rendering.
|
||||
//! @param theIsOn [in] the flag specifying whether the graphic driver should
|
||||
//! perform rendering of capping surface produced by this plane. The graphic
|
||||
//! driver produces this surface for convex graphics by means of stencil-test
|
||||
//! and multi-pass rendering.
|
||||
Standard_EXPORT void SetCapping(const Standard_Boolean theIsOn);
|
||||
|
||||
//! Assign capping aspect.
|
||||
Standard_EXPORT void SetCappingAspect (const Handle(Graphic3d_AspectFillArea3d)& theAspect);
|
||||
//! Check state of capping surface rendering.
|
||||
//! @return true (turned on) or false depending on the state.
|
||||
Standard_Boolean IsCapping() const { return myIsCapping; }
|
||||
|
||||
//! Flag indicating whether material for capping plane should be taken from object.
|
||||
//! Default value: FALSE (use dedicated capping plane material).
|
||||
bool ToUseObjectMaterial() const { return (myFlags & Graphic3d_CappingFlags_ObjectMaterial) != 0; }
|
||||
//! Sets clipping section filling aspect.
|
||||
Standard_EXPORT void SetCappingSectionStyle (const Handle(Graphic3d_AspectFillCapping)& theStyle);
|
||||
|
||||
//! Set flag for controlling the source of capping plane material.
|
||||
void SetUseObjectMaterial (bool theToUse) { setCappingFlag (theToUse, Graphic3d_CappingFlags_ObjectMaterial); }
|
||||
//! Returns style used for drawing capping section.
|
||||
const Handle(Graphic3d_AspectFillCapping)& CappingSectionStyle() const { return mySectionStyle; }
|
||||
|
||||
//! Flag indicating whether texture for capping plane should be taken from object.
|
||||
//! Default value: FALSE.
|
||||
bool ToUseObjectTexture() const { return (myFlags & Graphic3d_CappingFlags_ObjectTexture) != 0; }
|
||||
//! Flag indicating whether section style of the plane should overrides similar property of object presentation.
|
||||
//! Default value: FALSE (use dedicated presentation aspect style).
|
||||
bool ToOverrideCappingAspect() const { return myOverrideObjectStyle; }
|
||||
|
||||
//! Set flag for controlling the source of capping plane texture.
|
||||
void SetUseObjectTexture (bool theToUse) { setCappingFlag (theToUse, Graphic3d_CappingFlags_ObjectTexture); }
|
||||
//! Sets flag for controlling the preference of using section style between clip plane and object.
|
||||
void SetToOverrideCappingAspect (const bool theToOverride) { myOverrideObjectStyle = theToOverride; }
|
||||
|
||||
//! Flag indicating whether shader program for capping plane should be taken from object.
|
||||
//! Default value: FALSE.
|
||||
bool ToUseObjectShader() const { return (myFlags & Graphic3d_CappingFlags_ObjectShader) != 0; }
|
||||
|
||||
//! Set flag for controlling the source of capping plane shader program.
|
||||
void SetUseObjectShader(bool theToUse) { setCappingFlag (theToUse, Graphic3d_CappingFlags_ObjectShader); }
|
||||
|
||||
//! Return true if some fill area aspect properties should be taken from object.
|
||||
bool ToUseObjectProperties() const { return myFlags != Graphic3d_CappingFlags_None; }
|
||||
|
||||
public: // @name modification counters
|
||||
|
||||
//! @return modification counter for equation.
|
||||
unsigned int MCountEquation() const
|
||||
{
|
||||
return myEquationMod;
|
||||
}
|
||||
|
||||
//! @return modification counter for aspect.
|
||||
unsigned int MCountAspect() const
|
||||
{
|
||||
return myAspectMod;
|
||||
}
|
||||
//! Returns plane's orientation matrix.
|
||||
Standard_EXPORT const Graphic3d_Mat4& OrientationMatrix() const;
|
||||
|
||||
private:
|
||||
|
||||
//! Generate unique object id for OpenGL graphic resource manager.
|
||||
void makeId();
|
||||
|
||||
//! Set capping flag.
|
||||
Standard_EXPORT void setCappingFlag (bool theToUse, int theFlag);
|
||||
//! Initializes plane and makes unique identifier (UID) to differentiate clipping plane entities.
|
||||
void init (const gp_Pln& thePlane = gp_Pln(),
|
||||
const Standard_Boolean theIsOn = Standard_True,
|
||||
const Standard_Boolean theIsCapping = Standard_False,
|
||||
const Standard_Boolean theOverrideStyle = Standard_False,
|
||||
const Handle(Graphic3d_AspectFillCapping)& theStyle = Handle(Graphic3d_AspectFillCapping)());
|
||||
|
||||
private:
|
||||
|
||||
Handle(Graphic3d_AspectFillArea3d) myAspect; //!< fill area aspect
|
||||
TCollection_AsciiString myId; //!< resource id
|
||||
gp_Pln myPlane; //!< plane definition
|
||||
Equation myEquation; //!< plane equation vector
|
||||
unsigned int myFlags; //!< capping flags
|
||||
unsigned int myEquationMod; //!< modification counter for equation
|
||||
unsigned int myAspectMod; //!< modification counter of aspect
|
||||
Standard_Boolean myIsOn; //!< state of the clipping plane
|
||||
Standard_Boolean myIsCapping; //!< state of graphic driver capping
|
||||
TCollection_AsciiString myEntityUID; //!< Unique identifier for the plane
|
||||
gp_Pln myPlane; //!< Plane definition
|
||||
Equation myEquation; //!< Plane equation vector
|
||||
Standard_Boolean myIsOn; //!< State of the clipping plane
|
||||
Standard_Boolean myIsCapping; //!< State of graphic driver capping
|
||||
Standard_Boolean myOverrideObjectStyle; //!< Flag forcing to use plane's section style rather than section style defined for object
|
||||
Handle(Graphic3d_AspectFillCapping) mySectionStyle; //!< Style set for drawing capped solid section.
|
||||
mutable Standard_Boolean myOrientationDirty; //!< Boolean flag indicating whether orientation matrix is dirty or not.
|
||||
mutable Graphic3d_Mat4 myOrientationMat; //!< Plane orientation matrix (for visualization purposes).
|
||||
|
||||
public:
|
||||
|
||||
DEFINE_STANDARD_RTTIEXT(Graphic3d_ClipPlane,Standard_Transient)
|
||||
DEFINE_STANDARD_RTTIEXT (Graphic3d_ClipPlane, Standard_Transient)
|
||||
};
|
||||
|
||||
DEFINE_STANDARD_HANDLE (Graphic3d_ClipPlane, Standard_Transient)
|
||||
|
@@ -231,10 +231,11 @@ Standard_Boolean Graphic3d_Group::IsGroupPrimitivesAspectSet (const Graphic3d_Gr
|
||||
// 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
|
||||
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 Handle(Graphic3d_AspectFillCapping)& theAspCapping) const
|
||||
{
|
||||
if (!theAspLine.IsNull())
|
||||
{
|
||||
@@ -271,6 +272,15 @@ void Graphic3d_Group::GroupPrimitivesAspect (const Handle(Graphic3d_AspectLine3d
|
||||
*theAspFill.operator->() = *aFillAspect;
|
||||
}
|
||||
}
|
||||
|
||||
if (!theAspCapping.IsNull())
|
||||
{
|
||||
Handle(Graphic3d_AspectFillCapping) aCappingAspect = FillCappingAspect();
|
||||
if (!aCappingAspect.IsNull())
|
||||
{
|
||||
*theAspCapping.operator->() = *aCappingAspect;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
|
@@ -17,30 +17,30 @@
|
||||
#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_AspectFillCapping.hxx>
|
||||
#include <Graphic3d_AspectLine3d.hxx>
|
||||
#include <Graphic3d_AspectMarker3d.hxx>
|
||||
#include <Standard_Transient.hxx>
|
||||
#include <Standard_Real.hxx>
|
||||
#include <Standard_CString.hxx>
|
||||
#include <Graphic3d_Vertex.hxx>
|
||||
#include <Graphic3d_TextPath.hxx>
|
||||
#include <Graphic3d_HorizontalTextAlignment.hxx>
|
||||
#include <Graphic3d_VerticalTextAlignment.hxx>
|
||||
#include <Graphic3d_TypeOfPrimitiveArray.hxx>
|
||||
#include <Graphic3d_IndexBuffer.hxx>
|
||||
#include <Graphic3d_Buffer.hxx>
|
||||
#include <Graphic3d_AspectText3d.hxx>
|
||||
#include <Graphic3d_BndBox4f.hxx>
|
||||
#include <Graphic3d_BoundBuffer.hxx>
|
||||
#include <Standard_Address.hxx>
|
||||
#include <Graphic3d_Buffer.hxx>
|
||||
#include <Graphic3d_GroupAspect.hxx>
|
||||
#include <gp_Ax2.hxx>
|
||||
#include <Graphic3d_HorizontalTextAlignment.hxx>
|
||||
#include <Graphic3d_IndexBuffer.hxx>
|
||||
#include <Graphic3d_TextPath.hxx>
|
||||
#include <Graphic3d_TypeOfPrimitiveArray.hxx>
|
||||
#include <Graphic3d_Vertex.hxx>
|
||||
#include <Graphic3d_VerticalTextAlignment.hxx>
|
||||
#include <MMgt_TShared.hxx>
|
||||
#include <Standard.hxx>
|
||||
#include <Standard_Address.hxx>
|
||||
#include <Standard_Boolean.hxx>
|
||||
#include <Standard_CString.hxx>
|
||||
#include <Standard_Real.hxx>
|
||||
#include <Standard_Type.hxx>
|
||||
#include <TCollection_ExtendedString.hxx>
|
||||
#include <gp_Ax2.hxx>
|
||||
|
||||
class Graphic3d_Structure;
|
||||
class Graphic3d_ArrayOfPrimitives;
|
||||
@@ -56,7 +56,7 @@ class Graphic3d_ArrayOfPrimitives;
|
||||
//! 1) Non-modifiable, or unbounded, group ('black box').
|
||||
//! Developers can repeat a sequence of
|
||||
//! SetPrimitivesAspect() with AddPrimitiveArray() methods arbitrary number of times
|
||||
//! to define arbitrary number of primitive "blocks" each having individual apect values.
|
||||
//! to define arbitrary number of primitive "blocks" each having individual aspect values.
|
||||
//! Any modification of such a group is forbidden, as aspects and primitives are mixed
|
||||
//! in memory without any high-level logical structure, and any modification is very likely to result
|
||||
//! in corruption of the group internal data.
|
||||
@@ -75,14 +75,14 @@ class Graphic3d_ArrayOfPrimitives;
|
||||
//! with aspects and primitives and choose the group usage model beforehand out of application needs.
|
||||
//! Note that some Graphic3d_Group class virtual methods contain only base implementation
|
||||
//! that is extended by the descendant class in OpenGl package.
|
||||
class Graphic3d_Group : public Standard_Transient
|
||||
class Graphic3d_Group : public MMgt_TShared
|
||||
{
|
||||
friend class Graphic3d_Structure;
|
||||
DEFINE_STANDARD_RTTIEXT(Graphic3d_Group,Standard_Transient)
|
||||
DEFINE_STANDARD_RTTIEXT(Graphic3d_Group,MMgt_TShared)
|
||||
|
||||
public:
|
||||
|
||||
//! Supress all primitives and attributes of <me>.
|
||||
//! Suppress all primitives and attributes of <me>.
|
||||
//! To clear group without update in Graphic3d_StructureManager
|
||||
//! pass Standard_False as <theUpdateStructureMgr>. This
|
||||
//! used on context and viewer destruction, when the pointer
|
||||
@@ -91,13 +91,13 @@ public:
|
||||
//! cross-reference);
|
||||
Standard_EXPORT virtual void Clear (const Standard_Boolean theUpdateStructureMgr = Standard_True);
|
||||
|
||||
//! Supress the group <me> in the structure.
|
||||
//! Suppress the group <me> in the structure.
|
||||
Standard_EXPORT virtual ~Graphic3d_Group();
|
||||
|
||||
//! Supress the group <me> in the structure.
|
||||
//! Suppress the group <me> in the structure.
|
||||
//! Warning: No more graphic operations in <me> after this call.
|
||||
//! Modifies the current modelling transform persistence (pan, zoom or rotate)
|
||||
//! Get the current modelling transform persistence (pan, zoom or rotate)
|
||||
//! Modifies the current modeling transform persistence (pan, zoom or rotate)
|
||||
//! Get the current modeling transform persistence (pan, zoom or rotate)
|
||||
Standard_EXPORT void Remove();
|
||||
|
||||
public:
|
||||
@@ -126,6 +126,12 @@ public:
|
||||
//! Modifies the context for all the marker primitives of the group.
|
||||
virtual void SetGroupPrimitivesAspect (const Handle(Graphic3d_AspectMarker3d)& theAspect) = 0;
|
||||
|
||||
//! Returns style of filling clipping sections on closed shell primitives.
|
||||
virtual Handle(Graphic3d_AspectFillCapping) FillCappingAspect() const = 0;
|
||||
|
||||
//! Modifies the context for filling clipping section for all closed shell primitives of the group.
|
||||
virtual void SetGroupPrimitivesAspect (const Handle(Graphic3d_AspectFillCapping)& 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.
|
||||
@@ -153,15 +159,17 @@ public:
|
||||
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;
|
||||
const Handle(Graphic3d_AspectFillArea3d)& theAspFill,
|
||||
const Handle(Graphic3d_AspectFillCapping)& theAspFillCapping) 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
|
||||
void PrimitivesAspect (const Handle(Graphic3d_AspectLine3d)& theAspLine,
|
||||
const Handle(Graphic3d_AspectText3d)& theAspText,
|
||||
const Handle(Graphic3d_AspectMarker3d)& theAspMarker,
|
||||
const Handle(Graphic3d_AspectFillArea3d)& theAspFill,
|
||||
const Handle(Graphic3d_AspectFillCapping)& theAspFillCapping) const
|
||||
{
|
||||
GroupPrimitivesAspect (theAspLine, theAspText, theAspMarker, theAspFill);
|
||||
GroupPrimitivesAspect (theAspLine, theAspText, theAspMarker, theAspFill, theAspFillCapping);
|
||||
}
|
||||
|
||||
public:
|
||||
@@ -312,6 +320,6 @@ protected:
|
||||
|
||||
};
|
||||
|
||||
DEFINE_STANDARD_HANDLE(Graphic3d_Group, Standard_Transient)
|
||||
DEFINE_STANDARD_HANDLE(Graphic3d_Group, MMgt_TShared)
|
||||
|
||||
#endif // _Graphic3d_Group_HeaderFile
|
||||
|
@@ -21,13 +21,15 @@
|
||||
//! - ASPECT_LINE: aspect for line primitives;
|
||||
//! - ASPECT_TEXT: aspect for text primitives;
|
||||
//! - ASPECT_MARKER: aspect for marker primitives;
|
||||
//! - ASPECT_FILL_AREA: aspect for face primitives.
|
||||
//! - ASPECT_FILL_AREA: aspect for face primitives;
|
||||
//! - Graphic3d_ASPECT_FILL_CAPPING: aspect for filling clipping sections.
|
||||
enum Graphic3d_GroupAspect
|
||||
{
|
||||
Graphic3d_ASPECT_LINE,
|
||||
Graphic3d_ASPECT_TEXT,
|
||||
Graphic3d_ASPECT_MARKER,
|
||||
Graphic3d_ASPECT_FILL_AREA
|
||||
Graphic3d_ASPECT_LINE,
|
||||
Graphic3d_ASPECT_TEXT,
|
||||
Graphic3d_ASPECT_MARKER,
|
||||
Graphic3d_ASPECT_FILL_AREA,
|
||||
Graphic3d_ASPECT_FILL_CAPPING
|
||||
};
|
||||
|
||||
#endif // _Graphic3d_GroupAspect_HeaderFile
|
||||
|
@@ -291,7 +291,7 @@ public:
|
||||
|
||||
//! Compute per-element multiplication.
|
||||
//! @param theFactor [in] the scale factor.
|
||||
//! @return the result of multiplicaton.
|
||||
//! @return the result of multiplication.
|
||||
NCollection_Mat4 operator* (const Element_t theFactor) const
|
||||
{
|
||||
return Multiplied (theFactor);
|
||||
@@ -299,7 +299,7 @@ public:
|
||||
|
||||
//! Compute per-element multiplication.
|
||||
//! @param theFactor [in] the scale factor.
|
||||
//! @return the result of multiplicaton.
|
||||
//! @return the result of multiplication.
|
||||
NCollection_Mat4 Multiplied (const Element_t theFactor) const
|
||||
{
|
||||
NCollection_Mat4 aTempMat (*this);
|
||||
|
@@ -7,6 +7,8 @@ OpenGl_ArbTBO.hxx
|
||||
OpenGl_ArbTexBindless.hxx
|
||||
OpenGl_AspectFace.cxx
|
||||
OpenGl_AspectFace.hxx
|
||||
OpenGl_AspectFillCapping.cxx
|
||||
OpenGl_AspectFillCapping.hxx
|
||||
OpenGl_AspectLine.cxx
|
||||
OpenGl_AspectLine.hxx
|
||||
OpenGl_AspectMarker.cxx
|
||||
@@ -66,10 +68,8 @@ OpenGl_BVHClipPrimitiveTrsfPersSet.cxx
|
||||
OpenGl_BVHClipPrimitiveTrsfPersSet.hxx
|
||||
OpenGl_BVHTreeSelector.cxx
|
||||
OpenGl_BVHTreeSelector.hxx
|
||||
OpenGl_CappingAlgo.cxx
|
||||
OpenGl_CappingAlgo.hxx
|
||||
OpenGl_CappingPlaneResource.cxx
|
||||
OpenGl_CappingPlaneResource.hxx
|
||||
OpenGl_CappingRenderer.cxx
|
||||
OpenGl_CappingRenderer.hxx
|
||||
OpenGl_Caps.cxx
|
||||
OpenGl_Caps.hxx
|
||||
OpenGl_Clipping.cxx
|
||||
|
247
src/OpenGl/OpenGl_AspectFillCapping.cxx
Normal file
247
src/OpenGl/OpenGl_AspectFillCapping.cxx
Normal file
@@ -0,0 +1,247 @@
|
||||
// Created on: 2017-04-14
|
||||
// Created by: Anton POLETAEV
|
||||
// Copyright (c) 2017 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 <OpenGl_AspectFillCapping.hxx>
|
||||
|
||||
#include <OpenGl_AspectFace.hxx>
|
||||
#include <OpenGl_Workspace.hxx>
|
||||
|
||||
namespace
|
||||
{
|
||||
Handle(Graphic3d_AspectFillArea3d) defaultMaterial()
|
||||
{
|
||||
Handle(Graphic3d_AspectFillArea3d) anAspect;
|
||||
const Graphic3d_MaterialAspect aMaterial (Graphic3d_NOM_DEFAULT);
|
||||
anAspect = new Graphic3d_AspectFillArea3d();
|
||||
anAspect->SetDistinguishOff();
|
||||
anAspect->SetFrontMaterial (aMaterial);
|
||||
anAspect->SetInteriorStyle (Aspect_IS_SOLID);
|
||||
anAspect->SetInteriorColor (aMaterial.Color());
|
||||
anAspect->SetSuppressBackFaces (false);
|
||||
return anAspect;
|
||||
}
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : OpenGl_AspectFillCapping
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
OpenGl_AspectFillCapping::OpenGl_AspectFillCapping (const Handle(Graphic3d_AspectFillCapping)& theAspect)
|
||||
: myCappingAspect (defaultMaterial()),
|
||||
myHatchingAspect (defaultMaterial()),
|
||||
myHatchingState (0)
|
||||
{
|
||||
SetAspect (theAspect);
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : ~OpenGl_AspectFillCapping
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
OpenGl_AspectFillCapping::~OpenGl_AspectFillCapping()
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : SetAspect
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
void OpenGl_AspectFillCapping::SetAspect (const Handle(Graphic3d_AspectFillCapping)& theAspect)
|
||||
{
|
||||
myAspect = theAspect;
|
||||
|
||||
if (theAspect.IsNull())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (!theAspect->ToUseObjectMaterial()
|
||||
|| !theAspect->ToUseObjectTexture()
|
||||
|| !theAspect->ToUseObjectShader())
|
||||
{
|
||||
Handle(Graphic3d_AspectFillArea3d) aFillAspect = myCappingAspect.Aspect();
|
||||
|
||||
if (!theAspect->ToUseObjectMaterial())
|
||||
{
|
||||
aFillAspect->SetFrontMaterial (theAspect->Material());
|
||||
aFillAspect->SetInteriorColor (theAspect->Material().Color());
|
||||
}
|
||||
|
||||
if (!theAspect->ToUseObjectTexture())
|
||||
{
|
||||
aFillAspect->SetTextureMap (theAspect->Texture());
|
||||
|
||||
if (!theAspect->Texture().IsNull())
|
||||
{
|
||||
aFillAspect->SetTextureMapOn();
|
||||
}
|
||||
else
|
||||
{
|
||||
aFillAspect->SetTextureMapOff();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
aFillAspect->SetTextureMap (Handle(Graphic3d_TextureMap)());
|
||||
aFillAspect->SetTextureMapOff();
|
||||
}
|
||||
|
||||
if (!theAspect->ToUseObjectShader())
|
||||
{
|
||||
aFillAspect->SetShaderProgram (theAspect->Shader());
|
||||
}
|
||||
|
||||
myCappingAspect.SetAspect (aFillAspect);
|
||||
}
|
||||
|
||||
if (theAspect->ToDrawHatch()
|
||||
&& (theAspect->IsTextureHatch()
|
||||
|| theAspect->IsStippleHatch()))
|
||||
{
|
||||
Handle(Graphic3d_AspectFillArea3d) aFillAspect = myHatchingAspect.Aspect();
|
||||
|
||||
aFillAspect->SetInteriorStyle (theAspect->IsStippleHatch() ? Aspect_IS_HATCH : Aspect_IS_SOLID);
|
||||
aFillAspect->SetHatchStyle (theAspect->IsStippleHatch() ? theAspect->StippleHatch() : Handle(Graphic3d_HatchStyle)());
|
||||
aFillAspect->SetTextureMap (theAspect->IsTextureHatch() ? theAspect->TextureHatch() : Handle(Graphic3d_TextureMap)());
|
||||
aFillAspect->SetFrontMaterial (theAspect->HatchMaterial());
|
||||
aFillAspect->SetInteriorColor (theAspect->HatchMaterial().Color());
|
||||
if (theAspect->IsTextureHatch())
|
||||
{
|
||||
aFillAspect->SetTextureMapOn();
|
||||
}
|
||||
else
|
||||
{
|
||||
aFillAspect->SetTextureMapOff();
|
||||
}
|
||||
|
||||
myHatchingAspect.SetAspect (aFillAspect);
|
||||
myHatchingState = theAspect->HatchingState();
|
||||
}
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : Release
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
void OpenGl_AspectFillCapping::Release (OpenGl_Context* theContext)
|
||||
{
|
||||
myCappingAspect .Release (theContext);
|
||||
myHatchingAspect.Release (theContext);
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : CappingFaceAspect
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
const OpenGl_AspectFace* OpenGl_AspectFillCapping::CappingFaceAspect (const OpenGl_AspectFace* theObjectAspect) const
|
||||
{
|
||||
if (myAspect.IsNull())
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Handle(Graphic3d_AspectFillArea3d) aFillAspect = myCappingAspect.Aspect();
|
||||
|
||||
if (myAspect->ToUseObjectMaterial() && theObjectAspect != NULL)
|
||||
{
|
||||
// only front material currently supported by capping rendering
|
||||
aFillAspect->SetFrontMaterial (theObjectAspect->Aspect()->FrontMaterial());
|
||||
aFillAspect->SetInteriorColor (theObjectAspect->Aspect()->InteriorColor());
|
||||
}
|
||||
else
|
||||
{
|
||||
aFillAspect->SetFrontMaterial (myAspect->Material());
|
||||
aFillAspect->SetInteriorColor (myAspect->Material().Color());
|
||||
}
|
||||
|
||||
if (myAspect->ToUseObjectTexture() && theObjectAspect != NULL)
|
||||
{
|
||||
if (theObjectAspect->Aspect()->ToMapTexture())
|
||||
{
|
||||
aFillAspect->SetTextureMap (theObjectAspect->Aspect()->TextureMap());
|
||||
aFillAspect->SetTextureMapOn();
|
||||
}
|
||||
else
|
||||
{
|
||||
aFillAspect->SetTextureMapOff();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
aFillAspect->SetTextureMap (myAspect->Texture());
|
||||
if (!myAspect->Texture().IsNull())
|
||||
{
|
||||
aFillAspect->SetTextureMapOn();
|
||||
}
|
||||
else
|
||||
{
|
||||
aFillAspect->SetTextureMapOff();
|
||||
}
|
||||
}
|
||||
|
||||
if (myAspect->ToUseObjectShader() && theObjectAspect != NULL)
|
||||
{
|
||||
aFillAspect->SetShaderProgram (theObjectAspect->Aspect()->ShaderProgram());
|
||||
}
|
||||
else
|
||||
{
|
||||
aFillAspect->SetShaderProgram (myAspect->Shader());
|
||||
}
|
||||
|
||||
myCappingAspect.SetAspect (aFillAspect);
|
||||
|
||||
return &myCappingAspect;
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : HatchingFaceAspect
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
const OpenGl_AspectFace* OpenGl_AspectFillCapping::HatchingFaceAspect() const
|
||||
{
|
||||
if (myAspect.IsNull())
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const Standard_Size aHatchingState = myAspect->HatchingState();
|
||||
if (myHatchingState != aHatchingState)
|
||||
{
|
||||
if (myAspect->ToDrawHatch())
|
||||
{
|
||||
Handle(Graphic3d_AspectFillArea3d) aFillAspect = myHatchingAspect.Aspect();
|
||||
|
||||
aFillAspect->SetInteriorStyle (myAspect->IsStippleHatch() ? Aspect_IS_HATCH : Aspect_IS_SOLID);
|
||||
aFillAspect->SetHatchStyle (myAspect->IsStippleHatch() ? myAspect->StippleHatch() : Handle(Graphic3d_HatchStyle)());
|
||||
aFillAspect->SetTextureMap (myAspect->IsTextureHatch() ? myAspect->TextureHatch() : Handle(Graphic3d_TextureMap)());
|
||||
aFillAspect->SetFrontMaterial (myAspect->HatchMaterial());
|
||||
aFillAspect->SetInteriorColor (myAspect->HatchMaterial().Color());
|
||||
if (myAspect->IsTextureHatch())
|
||||
{
|
||||
aFillAspect->SetTextureMapOn();
|
||||
}
|
||||
else
|
||||
{
|
||||
aFillAspect->SetTextureMapOff();
|
||||
}
|
||||
|
||||
myHatchingAspect.SetAspect (aFillAspect);
|
||||
myHatchingState = aHatchingState;
|
||||
}
|
||||
}
|
||||
|
||||
return &myHatchingAspect;
|
||||
}
|
70
src/OpenGl/OpenGl_AspectFillCapping.hxx
Normal file
70
src/OpenGl/OpenGl_AspectFillCapping.hxx
Normal file
@@ -0,0 +1,70 @@
|
||||
// Created on: 2017-04-14
|
||||
// Created by: Anton POLETAEV
|
||||
// Copyright (c) 2017 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 _OpenGl_AspectFillCapping_Header
|
||||
#define _OpenGl_AspectFillCapping_Header
|
||||
|
||||
#include <Graphic3d_AspectFillCapping.hxx>
|
||||
#include <OpenGl_AspectFace.hxx>
|
||||
#include <OpenGl_Resource.hxx>
|
||||
|
||||
//! Gl resource holding particular aspects for filling capping.
|
||||
class OpenGl_AspectFillCapping : public OpenGl_Resource
|
||||
{
|
||||
public:
|
||||
|
||||
//! Create and assign style.
|
||||
Standard_EXPORT OpenGl_AspectFillCapping (const Handle(Graphic3d_AspectFillCapping)& theAspect);
|
||||
|
||||
//! Destructor.
|
||||
Standard_EXPORT ~OpenGl_AspectFillCapping();
|
||||
|
||||
//! Assign section style.
|
||||
Standard_EXPORT void SetAspect (const Handle(Graphic3d_AspectFillCapping)& theAspect);
|
||||
|
||||
//! Returns section style parameters.
|
||||
const Handle(Graphic3d_AspectFillCapping)& Aspect() const { return myAspect; }
|
||||
|
||||
//! Release any allocated GL resources.
|
||||
Standard_EXPORT virtual void Release (OpenGl_Context* theContext);
|
||||
|
||||
//! Returns true if capping should draw hatch layer.
|
||||
Standard_Boolean ToDrawHatch() const
|
||||
{
|
||||
return myAspect->ToDrawHatch()
|
||||
&& (myAspect->IsStippleHatch()
|
||||
|| myAspect->IsTextureHatch());
|
||||
}
|
||||
|
||||
//! Returns the shading aspect for drawing face of a clipping section itself.
|
||||
//! @param theObjectAspect [in] the aspect of an object if it requires combining.
|
||||
Standard_EXPORT const OpenGl_AspectFace* CappingFaceAspect (const OpenGl_AspectFace* theObjectAspect) const;
|
||||
|
||||
//! Returns the shading aspect for drawing hatch layer of a section.
|
||||
Standard_EXPORT const OpenGl_AspectFace* HatchingFaceAspect() const;
|
||||
|
||||
protected:
|
||||
|
||||
Handle(Graphic3d_AspectFillCapping) myAspect; //!< Section style settings from application's level.
|
||||
mutable OpenGl_AspectFace myCappingAspect; //!< GL aspect for shading base layer of a capping section.
|
||||
mutable OpenGl_AspectFace myHatchingAspect; //!< GL aspect for shading hatching layer (additional to base) of a capping section.
|
||||
mutable Standard_Size myHatchingState;
|
||||
|
||||
public:
|
||||
|
||||
DEFINE_STANDARD_ALLOC
|
||||
};
|
||||
|
||||
#endif //_OpenGl_AspectFillCapping_Header
|
@@ -19,6 +19,7 @@
|
||||
#include <Aspect_GradientFillMethod.hxx>
|
||||
#include <Aspect_FillMethod.hxx>
|
||||
#include <Graphic3d_TypeOfBackground.hxx>
|
||||
#include <Graphic3d_TransformPers.hxx>
|
||||
#include <OpenGl_AspectFace.hxx>
|
||||
#include <OpenGl_PrimitiveArray.hxx>
|
||||
#include <OpenGl_Vec.hxx>
|
||||
|
@@ -1,235 +0,0 @@
|
||||
// Created on: 2013-09-05
|
||||
// Created by: Anton POLETAEV
|
||||
// Copyright (c) 2013-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.
|
||||
|
||||
#include <OpenGl_CappingAlgo.hxx>
|
||||
|
||||
#include <OpenGl_Workspace.hxx>
|
||||
#include <OpenGl_Context.hxx>
|
||||
#include <OpenGl_PrimitiveArray.hxx>
|
||||
#include <OpenGl_CappingPlaneResource.hxx>
|
||||
#include <OpenGl_Vec.hxx>
|
||||
#include <OpenGl_Structure.hxx>
|
||||
#include <OpenGl_ShaderManager.hxx>
|
||||
|
||||
IMPLEMENT_STANDARD_RTTIEXT(OpenGl_CappingAlgoFilter,OpenGl_RenderFilter)
|
||||
|
||||
namespace
|
||||
{
|
||||
//! Render infinite capping plane.
|
||||
//! @param theWorkspace [in] the GL workspace, context state.
|
||||
//! @param thePlane [in] the graphical plane, for which the capping surface is rendered.
|
||||
static void renderPlane (const Handle(OpenGl_Workspace)& theWorkspace,
|
||||
const Handle(OpenGl_CappingPlaneResource)& thePlane,
|
||||
const OpenGl_AspectFace* theAspectFace)
|
||||
{
|
||||
const Handle(OpenGl_Context)& aContext = theWorkspace->GetGlContext();
|
||||
thePlane->Update (aContext, theAspectFace != NULL ? theAspectFace->Aspect() : Handle(Graphic3d_AspectFillArea3d)());
|
||||
|
||||
const OpenGl_AspectFace* aFaceAspect = theWorkspace->AspectFace();
|
||||
theWorkspace->SetAspectFace (thePlane->AspectFace());
|
||||
|
||||
// set identity model matrix
|
||||
aContext->ModelWorldState.Push();
|
||||
aContext->ModelWorldState.SetCurrent (OpenGl_Mat4::Map (*thePlane->Orientation()->mat));
|
||||
aContext->ApplyModelViewMatrix();
|
||||
|
||||
thePlane->Primitives().Render (theWorkspace);
|
||||
|
||||
aContext->ModelWorldState.Pop();
|
||||
aContext->ApplyModelViewMatrix();
|
||||
|
||||
theWorkspace->SetAspectFace (aFaceAspect);
|
||||
}
|
||||
|
||||
//! Render capping for specific structure.
|
||||
static void renderCappingForStructure (const Handle(OpenGl_Workspace)& theWorkspace,
|
||||
const OpenGl_Structure& theStructure,
|
||||
const OpenGl_ClippingIterator& thePlaneIter,
|
||||
const Handle(OpenGl_CappingPlaneResource)& thePlane)
|
||||
{
|
||||
const Handle(OpenGl_Context)& aContext = theWorkspace->GetGlContext();
|
||||
const Handle(Graphic3d_ClipPlane)& aRenderPlane = thePlane->Plane();
|
||||
for (OpenGl_Structure::GroupIterator aGroupIter (theStructure.Groups()); aGroupIter.More(); aGroupIter.Next())
|
||||
{
|
||||
if (!aGroupIter.Value()->IsClosed())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// enable only the rendering plane to generate stencil mask
|
||||
aContext->ChangeClipping().DisableAllExcept (aContext, thePlaneIter);
|
||||
aContext->ShaderManager()->UpdateClippingState();
|
||||
|
||||
glClear (GL_STENCIL_BUFFER_BIT);
|
||||
glColorMask (GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
|
||||
|
||||
// override aspects, disable culling
|
||||
theWorkspace->SetAspectFace (&theWorkspace->NoneCulling());
|
||||
theWorkspace->ApplyAspectFace();
|
||||
|
||||
// evaluate number of pair faces
|
||||
if (theWorkspace->UseZBuffer())
|
||||
{
|
||||
glDisable (GL_DEPTH_TEST);
|
||||
}
|
||||
if (theWorkspace->UseDepthWrite())
|
||||
{
|
||||
glDepthMask (GL_FALSE);
|
||||
}
|
||||
glStencilFunc (GL_ALWAYS, 1, 0x01);
|
||||
glStencilOp (GL_KEEP, GL_INVERT, GL_INVERT);
|
||||
|
||||
// render closed primitives
|
||||
if (aRenderPlane->ToUseObjectProperties())
|
||||
{
|
||||
aGroupIter.Value()->Render (theWorkspace);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (; aGroupIter.More(); aGroupIter.Next())
|
||||
{
|
||||
if (aGroupIter.Value()->IsClosed())
|
||||
{
|
||||
aGroupIter.Value()->Render (theWorkspace);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// override material, cull back faces
|
||||
theWorkspace->SetAspectFace (&theWorkspace->FrontCulling());
|
||||
theWorkspace->ApplyAspectFace();
|
||||
|
||||
// enable all clip plane except the rendered one
|
||||
aContext->ChangeClipping().EnableAllExcept (aContext, thePlaneIter);
|
||||
aContext->ShaderManager()->UpdateClippingState();
|
||||
|
||||
// render capping plane using the generated stencil mask
|
||||
glColorMask (GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
|
||||
if (theWorkspace->UseDepthWrite())
|
||||
{
|
||||
glDepthMask (GL_TRUE);
|
||||
}
|
||||
glStencilFunc (GL_EQUAL, 1, 0x01);
|
||||
glStencilOp (GL_KEEP, GL_KEEP, GL_KEEP);
|
||||
if (theWorkspace->UseZBuffer())
|
||||
{
|
||||
glEnable (GL_DEPTH_TEST);
|
||||
}
|
||||
|
||||
renderPlane (theWorkspace, thePlane, aRenderPlane->ToUseObjectProperties()
|
||||
? aGroupIter.Value()->AspectFace()
|
||||
: NULL);
|
||||
|
||||
// turn on the current plane to restore initial state
|
||||
aContext->ChangeClipping().SetEnabled (aContext, thePlaneIter, Standard_True);
|
||||
aContext->ShaderManager()->RevertClippingState();
|
||||
aContext->ShaderManager()->RevertClippingState();
|
||||
}
|
||||
|
||||
if (theStructure.InstancedStructure() != NULL)
|
||||
{
|
||||
renderCappingForStructure (theWorkspace, *theStructure.InstancedStructure(), thePlaneIter, thePlane);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : RenderCapping
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
void OpenGl_CappingAlgo::RenderCapping (const Handle(OpenGl_Workspace)& theWorkspace,
|
||||
const OpenGl_Structure& theStructure)
|
||||
{
|
||||
const Handle(OpenGl_Context)& aContext = theWorkspace->GetGlContext();
|
||||
if (!aContext->Clipping().IsCappingOn())
|
||||
{
|
||||
// do not perform algorithm if there is nothing to render
|
||||
return;
|
||||
}
|
||||
|
||||
// remember current aspect face defined in workspace
|
||||
const OpenGl_AspectFace* aFaceAsp = theWorkspace->AspectFace();
|
||||
|
||||
// replace primitive groups rendering filter
|
||||
Handle(OpenGl_RenderFilter) aRenderFilter = theWorkspace->GetRenderFilter();
|
||||
Handle(OpenGl_CappingAlgoFilter) aCappingFilter = theWorkspace->DefaultCappingAlgoFilter();
|
||||
aCappingFilter->SetPreviousFilter (aRenderFilter);
|
||||
theWorkspace->SetRenderFilter (aCappingFilter);
|
||||
|
||||
// prepare for rendering the clip planes
|
||||
glEnable (GL_STENCIL_TEST);
|
||||
|
||||
// remember current state of depth
|
||||
// function and change its value
|
||||
GLint aDepthFuncPrev;
|
||||
glGetIntegerv (GL_DEPTH_FUNC, &aDepthFuncPrev);
|
||||
glDepthFunc (GL_LESS);
|
||||
|
||||
// generate capping for every clip plane
|
||||
for (OpenGl_ClippingIterator aCappingIt (aContext->Clipping()); aCappingIt.More(); aCappingIt.Next())
|
||||
{
|
||||
// get plane being rendered
|
||||
const Handle(Graphic3d_ClipPlane)& aRenderPlane = aCappingIt.Value();
|
||||
if (!aRenderPlane->IsCapping()
|
||||
|| aCappingIt.IsDisabled())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// get resource for the plane
|
||||
const TCollection_AsciiString& aResId = aRenderPlane->GetId();
|
||||
Handle(OpenGl_CappingPlaneResource) aPlaneRes;
|
||||
if (!aContext->GetResource (aResId, aPlaneRes))
|
||||
{
|
||||
// share and register for release once the resource is no longer used
|
||||
aPlaneRes = new OpenGl_CappingPlaneResource (aRenderPlane);
|
||||
aContext->ShareResource (aResId, aPlaneRes);
|
||||
}
|
||||
|
||||
renderCappingForStructure (theWorkspace, theStructure, aCappingIt, aPlaneRes);
|
||||
|
||||
// set delayed resource release
|
||||
aPlaneRes.Nullify();
|
||||
aContext->ReleaseResource (aResId, Standard_True);
|
||||
}
|
||||
|
||||
// restore previous application state
|
||||
glClear (GL_STENCIL_BUFFER_BIT);
|
||||
glDepthFunc (aDepthFuncPrev);
|
||||
glStencilFunc (GL_ALWAYS, 0, 0xFF);
|
||||
glDisable (GL_STENCIL_TEST);
|
||||
|
||||
// restore rendering aspects
|
||||
theWorkspace->SetAspectFace (aFaceAsp);
|
||||
theWorkspace->SetRenderFilter (aRenderFilter);
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : CanRender
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
Standard_Boolean OpenGl_CappingAlgoFilter::ShouldRender (const Handle(OpenGl_Workspace)& theWorkspace,
|
||||
const OpenGl_Element* theGlElement)
|
||||
{
|
||||
if (!myFilter.IsNull() && !myFilter->ShouldRender (theWorkspace, theGlElement))
|
||||
{
|
||||
return Standard_False;
|
||||
}
|
||||
|
||||
const OpenGl_PrimitiveArray* aPArray = dynamic_cast<const OpenGl_PrimitiveArray*> (theGlElement);
|
||||
return aPArray != NULL
|
||||
&& aPArray->DrawMode() >= OpenGl_PrimitiveArray::THE_FILLPRIM_FROM
|
||||
&& aPArray->DrawMode() <= OpenGl_PrimitiveArray::THE_FILLPRIM_TO;
|
||||
}
|
@@ -1,71 +0,0 @@
|
||||
// Created on: 2013-09-05
|
||||
// Created by: Anton POLETAEV
|
||||
// Copyright (c) 2013-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 _OpenGl_CappingAlgo_H__
|
||||
#define _OpenGl_CappingAlgo_H__
|
||||
|
||||
#include <OpenGl_RenderFilter.hxx>
|
||||
#include <OpenGl_Group.hxx>
|
||||
|
||||
// Forward declaration
|
||||
class OpenGl_CappingAlgoFilter;
|
||||
class OpenGl_CappingPlaneResource;
|
||||
class OpenGl_Structure;
|
||||
|
||||
DEFINE_STANDARD_HANDLE (OpenGl_CappingAlgoFilter, OpenGl_RenderFilter)
|
||||
|
||||
//! Capping surface rendering algorithm.
|
||||
class OpenGl_CappingAlgo
|
||||
{
|
||||
public:
|
||||
|
||||
//! Draw capping surfaces by OpenGl for the clipping planes enabled in current context state.
|
||||
//! Depth buffer must be generated for the passed groups.
|
||||
//! @param theWorkspace [in] the GL workspace, context state
|
||||
//! @param theStructure [in] the structure to be capped
|
||||
Standard_EXPORT static void RenderCapping (const Handle(OpenGl_Workspace)& theWorkspace,
|
||||
const OpenGl_Structure& theStructure);
|
||||
|
||||
};
|
||||
|
||||
//! Graphical capping rendering algorithm filter.
|
||||
//! Filters out everything except shaded primitives.
|
||||
class OpenGl_CappingAlgoFilter : public OpenGl_RenderFilter
|
||||
{
|
||||
public:
|
||||
|
||||
//! Default constructor.
|
||||
OpenGl_CappingAlgoFilter() {}
|
||||
|
||||
//! Sets the current active filter in workspace.
|
||||
//! @param thePrevFilter [in] the previously active filter that should have additive effect.
|
||||
void SetPreviousFilter (const Handle(OpenGl_RenderFilter)& thePrevFitler) { myFilter = thePrevFitler; }
|
||||
|
||||
//! Checks whether the element can be rendered or not.
|
||||
//! @param theElement [in] the element to check.
|
||||
//! @return True if element can be rendered.
|
||||
virtual Standard_Boolean ShouldRender (const Handle(OpenGl_Workspace)& theWorkspace,
|
||||
const OpenGl_Element* theGlElement) Standard_OVERRIDE;
|
||||
|
||||
private:
|
||||
|
||||
Handle(OpenGl_RenderFilter) myFilter; //!< Previous active filter that should be combined.
|
||||
|
||||
public:
|
||||
|
||||
DEFINE_STANDARD_RTTIEXT(OpenGl_CappingAlgoFilter,OpenGl_RenderFilter)
|
||||
};
|
||||
|
||||
#endif
|
@@ -1,244 +0,0 @@
|
||||
// Created on: 2013-08-15
|
||||
// Created by: Anton POLETAEV
|
||||
// Copyright (c) 2013-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.
|
||||
|
||||
#include <NCollection_AlignedAllocator.hxx>
|
||||
#include <OpenGl_CappingPlaneResource.hxx>
|
||||
#include <OpenGl_Context.hxx>
|
||||
#include <OpenGl_Vec.hxx>
|
||||
#include <Precision.hxx>
|
||||
|
||||
IMPLEMENT_STANDARD_RTTIEXT(OpenGl_CappingPlaneResource,OpenGl_Resource)
|
||||
|
||||
namespace
|
||||
{
|
||||
//! 12 plane vertices, interleaved:
|
||||
//! - 4 floats, position
|
||||
//! - 4 floats, normal
|
||||
//! - 4 floats, UV texture coordinates
|
||||
static const GLfloat THE_CAPPING_PLN_VERTS[12 * (4 + 4 + 4)] =
|
||||
{
|
||||
0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f,
|
||||
1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f,
|
||||
0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f,-1.0f, 0.0f, 0.0f,
|
||||
|
||||
0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f,
|
||||
0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f,-1.0f, 0.0f, 0.0f,
|
||||
-1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f,
|
||||
|
||||
0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f,
|
||||
-1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f,
|
||||
0.0f, 0.0f,-1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
|
||||
|
||||
0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f,
|
||||
0.0f, 0.0f,-1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
|
||||
1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f
|
||||
};
|
||||
|
||||
static const OpenGl_Matrix OpenGl_IdentityMatrix =
|
||||
{
|
||||
// mat[4][4]
|
||||
{ { 1.0f, 0.0f, 0.0f, 0.0f },
|
||||
{ 0.0f, 1.0f, 0.0f, 0.0f },
|
||||
{ 0.0f, 0.0f, 1.0f, 0.0f },
|
||||
{ 0.0f, 0.0f, 0.0f, 1.0f } }
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
|
||||
// =======================================================================
|
||||
// function : OpenGl_CappingPlaneResource
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
OpenGl_CappingPlaneResource::OpenGl_CappingPlaneResource (const Handle(Graphic3d_ClipPlane)& thePlane)
|
||||
: myPrimitives (NULL),
|
||||
myOrientation (OpenGl_IdentityMatrix),
|
||||
myAspect (NULL),
|
||||
myPlaneRoot (thePlane),
|
||||
myEquationMod ((unsigned int )-1),
|
||||
myAspectMod ((unsigned int )-1)
|
||||
{
|
||||
// Fill primitive array
|
||||
Handle(NCollection_AlignedAllocator) anAlloc = new NCollection_AlignedAllocator (16);
|
||||
Handle(Graphic3d_Buffer) anAttribs = new Graphic3d_Buffer (anAlloc);
|
||||
Graphic3d_Attribute anAttribInfo[] =
|
||||
{
|
||||
{ Graphic3d_TOA_POS, Graphic3d_TOD_VEC4 },
|
||||
{ Graphic3d_TOA_NORM, Graphic3d_TOD_VEC4 },
|
||||
{ Graphic3d_TOA_UV, Graphic3d_TOD_VEC4 }
|
||||
};
|
||||
if (anAttribs->Init (12, anAttribInfo, 3))
|
||||
{
|
||||
memcpy (anAttribs->ChangeData(), THE_CAPPING_PLN_VERTS, sizeof(THE_CAPPING_PLN_VERTS));
|
||||
myPrimitives.InitBuffers (NULL, Graphic3d_TOPA_TRIANGLES, NULL, anAttribs, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : OpenGl_CappingPlaneResource
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
OpenGl_CappingPlaneResource::~OpenGl_CappingPlaneResource()
|
||||
{
|
||||
Release (NULL);
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : Update
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
void OpenGl_CappingPlaneResource::Update (const Handle(OpenGl_Context)& ,
|
||||
const Handle(Graphic3d_AspectFillArea3d)& theObjAspect)
|
||||
{
|
||||
updateTransform();
|
||||
updateAspect (theObjAspect);
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : Release
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
void OpenGl_CappingPlaneResource::Release (OpenGl_Context* theContext)
|
||||
{
|
||||
OpenGl_Element::Destroy (theContext, myAspect);
|
||||
myPrimitives.Release (theContext);
|
||||
myEquationMod = (unsigned int )-1;
|
||||
myAspectMod = (unsigned int )-1;
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : updateAspect
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
void OpenGl_CappingPlaneResource::updateAspect (const Handle(Graphic3d_AspectFillArea3d)& theObjAspect)
|
||||
{
|
||||
if (myAspect == NULL)
|
||||
{
|
||||
myAspect = new OpenGl_AspectFace();
|
||||
myAspectMod = myPlaneRoot->MCountAspect() - 1; // mark out of sync
|
||||
}
|
||||
|
||||
if (theObjAspect.IsNull())
|
||||
{
|
||||
if (myAspectMod != myPlaneRoot->MCountAspect())
|
||||
{
|
||||
myAspect->SetAspect (myPlaneRoot->CappingAspect());
|
||||
myAspectMod = myPlaneRoot->MCountAspect();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (myFillAreaAspect.IsNull())
|
||||
{
|
||||
myFillAreaAspect = new Graphic3d_AspectFillArea3d();
|
||||
}
|
||||
if (myAspectMod != myPlaneRoot->MCountAspect())
|
||||
{
|
||||
*myFillAreaAspect = *myPlaneRoot->CappingAspect();
|
||||
}
|
||||
|
||||
if (myPlaneRoot->ToUseObjectMaterial())
|
||||
{
|
||||
// only front material currently supported by capping rendering
|
||||
myFillAreaAspect->SetFrontMaterial (theObjAspect->FrontMaterial());
|
||||
myFillAreaAspect->SetInteriorColor (theObjAspect->InteriorColor());
|
||||
}
|
||||
if (myPlaneRoot->ToUseObjectTexture())
|
||||
{
|
||||
myFillAreaAspect->SetTextureSet (theObjAspect->TextureSet());
|
||||
if (theObjAspect->ToMapTexture())
|
||||
{
|
||||
myFillAreaAspect->SetTextureMapOn();
|
||||
}
|
||||
else
|
||||
{
|
||||
myFillAreaAspect->SetTextureMapOff();
|
||||
}
|
||||
}
|
||||
if (myPlaneRoot->ToUseObjectShader())
|
||||
{
|
||||
myFillAreaAspect->SetShaderProgram (theObjAspect->ShaderProgram());
|
||||
}
|
||||
|
||||
myAspect->SetAspect (myFillAreaAspect);
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : updateTransform
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
void OpenGl_CappingPlaneResource::updateTransform()
|
||||
{
|
||||
const Graphic3d_ClipPlane::Equation& anEquation = myPlaneRoot->GetEquation();
|
||||
if (myEquationMod == myPlaneRoot->MCountEquation())
|
||||
{
|
||||
return; // nothing to update
|
||||
}
|
||||
|
||||
// re-evaluate infinite plane transformation matrix
|
||||
Standard_ShortReal N[3] =
|
||||
{ (Standard_ShortReal)anEquation[0],
|
||||
(Standard_ShortReal)anEquation[1],
|
||||
(Standard_ShortReal)anEquation[2] };
|
||||
|
||||
Standard_ShortReal T[3] =
|
||||
{ (Standard_ShortReal)(anEquation[0] * -anEquation[3]),
|
||||
(Standard_ShortReal)(anEquation[1] * -anEquation[3]),
|
||||
(Standard_ShortReal)(anEquation[2] * -anEquation[3]) };
|
||||
|
||||
Standard_ShortReal L[3] = { 0.0f, 0.0f, 0.0f };
|
||||
Standard_ShortReal F[3] = { 0.0f, 0.0f, 0.0f };
|
||||
|
||||
// project plane normal onto OX to find left vector
|
||||
Standard_ShortReal aProjLen =
|
||||
sqrt ( (Standard_ShortReal)(anEquation[0] * anEquation[0])
|
||||
+ (Standard_ShortReal)(anEquation[2] * anEquation[2]));
|
||||
if (aProjLen < ShortRealSmall())
|
||||
{
|
||||
L[0] = 1.0f;
|
||||
}
|
||||
else
|
||||
{
|
||||
L[0] = N[2] / aProjLen;
|
||||
L[2] = -N[0] / aProjLen;
|
||||
}
|
||||
|
||||
// (-aLeft) x aNorm
|
||||
F[0] = (-L[1])*N[2] - (-L[2])*N[1];
|
||||
F[1] = (-L[2])*N[0] - (-L[0])*N[2];
|
||||
F[2] = (-L[0])*N[1] - (-L[1])*N[0];
|
||||
|
||||
myOrientation.mat[0][0] = L[0];
|
||||
myOrientation.mat[0][1] = L[1];
|
||||
myOrientation.mat[0][2] = L[2];
|
||||
myOrientation.mat[0][3] = 0.0f;
|
||||
|
||||
myOrientation.mat[1][0] = N[0];
|
||||
myOrientation.mat[1][1] = N[1];
|
||||
myOrientation.mat[1][2] = N[2];
|
||||
myOrientation.mat[1][3] = 0.0f;
|
||||
|
||||
myOrientation.mat[2][0] = F[0];
|
||||
myOrientation.mat[2][1] = F[1];
|
||||
myOrientation.mat[2][2] = F[2];
|
||||
myOrientation.mat[2][3] = 0.0f;
|
||||
|
||||
myOrientation.mat[3][0] = T[0];
|
||||
myOrientation.mat[3][1] = T[1];
|
||||
myOrientation.mat[3][2] = T[2];
|
||||
myOrientation.mat[3][3] = 1.0f;
|
||||
|
||||
myEquationMod = myPlaneRoot->MCountEquation();
|
||||
}
|
@@ -1,93 +0,0 @@
|
||||
// Created on: 2013-08-15
|
||||
// Created by: Anton POLETAEV
|
||||
// Copyright (c) 2013-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 _OpenGl_CappingPlaneResource_H__
|
||||
#define _OpenGl_CappingPlaneResource_H__
|
||||
|
||||
#include <OpenGl_PrimitiveArray.hxx>
|
||||
#include <OpenGl_Resource.hxx>
|
||||
#include <OpenGl_AspectFace.hxx>
|
||||
#include <OpenGl_Matrix.hxx>
|
||||
#include <Graphic3d_ClipPlane.hxx>
|
||||
|
||||
class OpenGl_CappingPlaneResource;
|
||||
DEFINE_STANDARD_HANDLE (OpenGl_CappingPlaneResource, OpenGl_Resource)
|
||||
|
||||
//! Container of graphical resources for rendering capping plane
|
||||
//! associated to graphical clipping plane.
|
||||
//! This resource holds data necessary for OpenGl_CappingAlgo.
|
||||
//! This object is implemented as OpenGl resource for the following reasons:
|
||||
//! - one instance should be shared between contexts.
|
||||
//! - instance associated to Graphic3d_ClipPlane data by id.
|
||||
//! - should created and released within context (owns OpenGl elements and resources).
|
||||
class OpenGl_CappingPlaneResource : public OpenGl_Resource
|
||||
{
|
||||
public:
|
||||
|
||||
//! Constructor.
|
||||
//! Create capping plane presentation associated to clipping plane data.
|
||||
//! @param thePlane [in] the plane data.
|
||||
Standard_EXPORT OpenGl_CappingPlaneResource (const Handle(Graphic3d_ClipPlane)& thePlane);
|
||||
|
||||
//! Destroy object.
|
||||
Standard_EXPORT virtual ~OpenGl_CappingPlaneResource();
|
||||
|
||||
//! Update resource data in the passed context.
|
||||
//! @param theContext [in] the context
|
||||
//! @param theObjAspect [in] object aspect
|
||||
Standard_EXPORT void Update (const Handle(OpenGl_Context)& theContext,
|
||||
const Handle(Graphic3d_AspectFillArea3d)& theObjAspect);
|
||||
|
||||
//! Release associated OpenGl resources.
|
||||
//! @param theContext [in] the resource context.
|
||||
Standard_EXPORT virtual void Release (OpenGl_Context* theContext) Standard_OVERRIDE;
|
||||
|
||||
//! Return parent clipping plane structure.
|
||||
const Handle(Graphic3d_ClipPlane)& Plane() const { return myPlaneRoot; }
|
||||
|
||||
//! @return aspect face for rendering capping surface.
|
||||
inline const OpenGl_AspectFace* AspectFace() const { return myAspect; }
|
||||
|
||||
//! @return evaluated orientation matrix to transform infinite plane.
|
||||
inline const OpenGl_Matrix* Orientation() const { return &myOrientation; }
|
||||
|
||||
//! @return primitive array of vertices to render infinite plane.
|
||||
inline const OpenGl_PrimitiveArray& Primitives() const { return myPrimitives; }
|
||||
|
||||
private:
|
||||
|
||||
//! Update precomputed plane orientation matrix.
|
||||
void updateTransform();
|
||||
|
||||
//! Update resources.
|
||||
void updateAspect (const Handle(Graphic3d_AspectFillArea3d)& theObjAspect);
|
||||
|
||||
private:
|
||||
|
||||
OpenGl_PrimitiveArray myPrimitives; //!< vertices and texture coordinates for rendering
|
||||
OpenGl_Matrix myOrientation; //!< plane transformation matrix.
|
||||
OpenGl_AspectFace* myAspect; //!< capping face aspect.
|
||||
Handle(Graphic3d_ClipPlane) myPlaneRoot; //!< parent clipping plane structure.
|
||||
Handle(Graphic3d_AspectFillArea3d) myFillAreaAspect; //!< own capping aspect
|
||||
unsigned int myEquationMod; //!< modification counter for plane equation.
|
||||
unsigned int myAspectMod; //!< modification counter for aspect.
|
||||
|
||||
public:
|
||||
|
||||
DEFINE_STANDARD_RTTIEXT(OpenGl_CappingPlaneResource,OpenGl_Resource) // Type definition
|
||||
|
||||
};
|
||||
|
||||
#endif
|
447
src/OpenGl/OpenGl_CappingRenderer.cxx
Normal file
447
src/OpenGl/OpenGl_CappingRenderer.cxx
Normal file
@@ -0,0 +1,447 @@
|
||||
// Created on: 2013-09-05
|
||||
// Created by: Anton POLETAEV
|
||||
// Copyright (c) 2013-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.
|
||||
|
||||
#include <OpenGl_CappingRenderer.hxx>
|
||||
|
||||
#include <OpenGl_AspectFace.hxx>
|
||||
#include <OpenGl_AspectFillCapping.hxx>
|
||||
#include <OpenGl_Context.hxx>
|
||||
#include <OpenGl_Element.hxx>
|
||||
#include <OpenGl_PrimitiveArray.hxx>
|
||||
#include <OpenGl_Resource.hxx>
|
||||
#include <OpenGl_ShaderManager.hxx>
|
||||
#include <OpenGl_Structure.hxx>
|
||||
#include <OpenGl_View.hxx>
|
||||
#include <OpenGl_Workspace.hxx>
|
||||
|
||||
#include <Graphic3d_Camera.hxx>
|
||||
#include <NCollection_AlignedAllocator.hxx>
|
||||
|
||||
IMPLEMENT_STANDARD_RTTIEXT(OpenGl_CappingRenderFilter, OpenGl_RenderFilter)
|
||||
|
||||
namespace
|
||||
{
|
||||
//! interleaved (4x position, 4x normals, 4x (u,v) coordinates).
|
||||
//! o ----o
|
||||
//! representing | \ / |
|
||||
//! these | o |
|
||||
//! triangles: | / \ |
|
||||
//! o --- o
|
||||
static const GLfloat THE_CAPPING_PLN_VERTS[12 * (4 + 4 + 4)] =
|
||||
{
|
||||
0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f,
|
||||
1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f,
|
||||
0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f,-1.0f, 0.0f, 0.0f,
|
||||
|
||||
0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f,
|
||||
0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f,-1.0f, 0.0f, 0.0f,
|
||||
-1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f,
|
||||
|
||||
0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f,
|
||||
-1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f,
|
||||
0.0f, 0.0f,-1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
|
||||
|
||||
0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f,
|
||||
0.0f, 0.0f,-1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
|
||||
1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f
|
||||
};
|
||||
|
||||
class OpenGl_SharedElement : public OpenGl_Resource
|
||||
{
|
||||
public:
|
||||
OpenGl_SharedElement (OpenGl_Element* theGlElement) : myGlElement (theGlElement) {}
|
||||
virtual void Release (OpenGl_Context* theGlCtx) Standard_OVERRIDE
|
||||
{
|
||||
OpenGl_Element::Destroy (theGlCtx, myGlElement);
|
||||
}
|
||||
OpenGl_Element* GlElement() const { return myGlElement; }
|
||||
|
||||
private:
|
||||
OpenGl_Element* myGlElement;
|
||||
|
||||
public:
|
||||
|
||||
DEFINE_STANDARD_RTTI_INLINE (OpenGl_SharedElement, OpenGl_Resource)
|
||||
};
|
||||
|
||||
|
||||
static const TCollection_AsciiString THE_QUAD_PARRAY = "OpenGl_CappingRenderer_Quad";
|
||||
static const TCollection_AsciiString THE_PLANE_STYLE = "OpenGl_CappingRenderer_CappingStyle_";
|
||||
static const OpenGl_AspectFillCapping THE_DEFAULT_ASPECT = OpenGl_AspectFillCapping (new Graphic3d_AspectFillCapping);
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : Render
|
||||
// purpose : Renders capping surfaces for enabled clipping planes.
|
||||
// =======================================================================
|
||||
void OpenGl_CappingRenderer::Render (const Handle(OpenGl_Workspace)& theWorkspace,
|
||||
const OpenGl_Structure& theStructure)
|
||||
{
|
||||
const Handle(OpenGl_Context)& aContext = theWorkspace->GetGlContext();
|
||||
if (!aContext->Clipping().IsCappingOn())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
const OpenGl_PrimitiveArray* aCappingQuad = initQuad (aContext);
|
||||
if (!aCappingQuad)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
const OpenGl_AspectFace* aPrevAspect = theWorkspace->AspectFace();
|
||||
Handle(OpenGl_RenderFilter) aPrevFilter = theWorkspace->GetRenderFilter();
|
||||
Handle(OpenGl_CappingRenderFilter) aCappingFilter = theWorkspace->CappingRenderFilter();
|
||||
aCappingFilter->SetPreviousFilter (aPrevFilter);
|
||||
|
||||
theWorkspace->SetRenderFilter (aCappingFilter);
|
||||
|
||||
GLint aDepthFuncPrev;
|
||||
glGetIntegerv (GL_DEPTH_FUNC, &aDepthFuncPrev);
|
||||
glDepthFunc (GL_LESS);
|
||||
glEnable (GL_STENCIL_TEST);
|
||||
|
||||
GLboolean aPrevBlend = glIsEnabled (GL_BLEND);
|
||||
GLint aPrevBlendSrc = GL_ONE;
|
||||
GLint aPrevBlendDst = GL_ZERO;
|
||||
if (aPrevBlend == GL_TRUE)
|
||||
{
|
||||
glGetIntegerv (GL_BLEND_SRC_ALPHA, &aPrevBlendSrc);
|
||||
glGetIntegerv (GL_BLEND_DST_ALPHA, &aPrevBlendDst);
|
||||
glDisable (GL_BLEND);
|
||||
}
|
||||
|
||||
for (OpenGl_ClippingIterator aCappingIt (aContext->Clipping()); aCappingIt.More(); aCappingIt.Next())
|
||||
{
|
||||
const Handle(Graphic3d_ClipPlane)& aPlane = aCappingIt.Value();
|
||||
if (!aPlane->IsCapping()
|
||||
|| aCappingIt.IsDisabled())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
Handle(OpenGl_AspectFillCapping) anAspect;
|
||||
|
||||
TCollection_AsciiString aSharedStyleId;
|
||||
if (!aPlane->CappingSectionStyle().IsNull())
|
||||
{
|
||||
aSharedStyleId = THE_PLANE_STYLE + aPlane->GetId();
|
||||
|
||||
if (!aContext->GetResource (aSharedStyleId, anAspect))
|
||||
{
|
||||
anAspect = new OpenGl_AspectFillCapping (aPlane->CappingSectionStyle());
|
||||
aContext->ShareResource (aSharedStyleId, anAspect);
|
||||
}
|
||||
}
|
||||
|
||||
renderOne (theWorkspace, theStructure, aCappingIt, anAspect.get(), aCappingQuad);
|
||||
|
||||
if (!aSharedStyleId.IsEmpty())
|
||||
{
|
||||
// schedule release of resource if not used
|
||||
aContext->ReleaseResource (aSharedStyleId, Standard_True);
|
||||
}
|
||||
}
|
||||
|
||||
glClear (GL_STENCIL_BUFFER_BIT);
|
||||
glDepthFunc (aDepthFuncPrev);
|
||||
glStencilFunc (GL_ALWAYS, 0, 0xFF);
|
||||
glDisable (GL_STENCIL_TEST);
|
||||
|
||||
if (aPrevBlend == GL_TRUE)
|
||||
{
|
||||
glEnable (GL_BLEND);
|
||||
glBlendFunc (aPrevBlendSrc, aPrevBlendDst);
|
||||
}
|
||||
|
||||
theWorkspace->SetRenderFilter (aPrevFilter);
|
||||
theWorkspace->SetAspectFace (aPrevAspect);
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : renderOne
|
||||
// purpose : method to render capping section of one given plane for a structure.
|
||||
// =======================================================================
|
||||
void OpenGl_CappingRenderer::renderOne (const Handle(OpenGl_Workspace)& theWorkspace,
|
||||
const OpenGl_Structure& theStructure,
|
||||
const OpenGl_ClippingIterator& thePlaneIter,
|
||||
const OpenGl_AspectFillCapping* thePlaneAspectCapping,
|
||||
const OpenGl_PrimitiveArray* theQuad)
|
||||
{
|
||||
const Handle(Graphic3d_ClipPlane)& aPlane = thePlaneIter.Value();
|
||||
const Handle(OpenGl_Context)& aContext = theWorkspace->GetGlContext();
|
||||
const Handle(Graphic3d_Camera) aCamera = theWorkspace->View() != NULL
|
||||
? theWorkspace->View()->Camera()
|
||||
: Handle(Graphic3d_Camera)();
|
||||
|
||||
const OpenGl_Mat4& aPlaneMat = OpenGl_Mat4::Map (aPlane->OrientationMatrix());
|
||||
Standard_ShortReal aRotateAngle = 0.0;
|
||||
Standard_ShortReal aViewScale = ShortRealLast();
|
||||
OpenGl_Mat4 aRotateZoomMat;
|
||||
|
||||
for (OpenGl_Structure::GroupIterator aGroupIter (theStructure.Groups()); aGroupIter.More(); aGroupIter.Next())
|
||||
{
|
||||
if (!aGroupIter.Value()->IsClosed())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// enable only the rendering plane to generate stencil mask
|
||||
aContext->ChangeClipping().DisableAllExcept (aContext, thePlaneIter);
|
||||
aContext->ShaderManager()->UpdateClippingState();
|
||||
|
||||
glClear (GL_STENCIL_BUFFER_BIT);
|
||||
glColorMask (GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
|
||||
|
||||
// override aspects, disable culling
|
||||
theWorkspace->SetAspectFace (&theWorkspace->NoneCulling());
|
||||
theWorkspace->ApplyAspectFace();
|
||||
|
||||
// evaluate number of pair faces
|
||||
if (theWorkspace->UseZBuffer())
|
||||
{
|
||||
glDisable (GL_DEPTH_TEST);
|
||||
}
|
||||
if (theWorkspace->UseDepthWrite())
|
||||
{
|
||||
glDepthMask (GL_FALSE);
|
||||
}
|
||||
glStencilFunc (GL_ALWAYS, 1, 0x01);
|
||||
glStencilOp (GL_KEEP, GL_INVERT, GL_INVERT);
|
||||
|
||||
aGroupIter.Value()->Render (theWorkspace);
|
||||
|
||||
// override material, cull back faces
|
||||
theWorkspace->SetAspectFace (&theWorkspace->FrontCulling());
|
||||
theWorkspace->ApplyAspectFace();
|
||||
|
||||
// enable all clip plane except the rendered one
|
||||
aContext->ChangeClipping().EnableAllExcept (aContext, thePlaneIter);
|
||||
aContext->ShaderManager()->UpdateClippingState();
|
||||
|
||||
// render capping plane using the generated stencil mask
|
||||
glColorMask (GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
|
||||
if (theWorkspace->UseDepthWrite())
|
||||
{
|
||||
glDepthMask (GL_TRUE);
|
||||
}
|
||||
glStencilFunc (GL_EQUAL, 1, 0x01);
|
||||
glStencilOp (GL_KEEP, GL_KEEP, GL_KEEP);
|
||||
if (theWorkspace->UseZBuffer())
|
||||
{
|
||||
glEnable (GL_DEPTH_TEST);
|
||||
}
|
||||
|
||||
const OpenGl_AspectFace* aGroupAspectFace = aGroupIter.Value()->AspectFace();
|
||||
const OpenGl_AspectFillCapping* aGroupAspectCapping = aGroupIter.Value()->AspectFillCapping();
|
||||
const OpenGl_AspectFillCapping* anAspectCapping =
|
||||
thePlaneAspectCapping && (!aGroupAspectCapping || aGroupAspectCapping->Aspect().IsNull() || aPlane->ToOverrideCappingAspect())
|
||||
? thePlaneAspectCapping
|
||||
: aGroupAspectCapping;
|
||||
|
||||
if (anAspectCapping == NULL)
|
||||
{
|
||||
anAspectCapping = &THE_DEFAULT_ASPECT;
|
||||
}
|
||||
|
||||
const OpenGl_AspectFace* anAspectFace = anAspectCapping->CappingFaceAspect (aGroupAspectFace);
|
||||
const Standard_Boolean hasHatch = anAspectCapping->Aspect()->ToDrawHatch();
|
||||
const OpenGl_AspectFace* anAspectHatching = hasHatch ? anAspectCapping->HatchingFaceAspect() : NULL;
|
||||
const Standard_Boolean hasTextureHatch = hasHatch && !anAspectCapping->Aspect()->TextureHatch().IsNull();
|
||||
const Standard_Boolean isRotatePers = hasTextureHatch && !aCamera.IsNull() && anAspectCapping->Aspect()->IsHatchRotationPersistent();
|
||||
const Standard_Boolean isZoomPers = hasTextureHatch && !aCamera.IsNull() && anAspectCapping->Aspect()->IsHatchZoomPersistent();
|
||||
|
||||
Standard_ShortReal aHatchScale = 1.0;
|
||||
Standard_ShortReal aHatchAngle = 0.0;
|
||||
|
||||
if (isRotatePers || isZoomPers)
|
||||
{
|
||||
|
||||
if (isRotatePers)
|
||||
{
|
||||
if (aRotateAngle == 0.0)
|
||||
{
|
||||
const gp_Dir aPlaneSide (aPlaneMat.GetValue (0, 0), aPlaneMat.GetValue (1, 0), aPlaneMat.GetValue (2, 0));
|
||||
const gp_Dir aPlaneUp (aPlaneMat.GetValue (0, 2), aPlaneMat.GetValue (1, 2), aPlaneMat.GetValue (2, 2));
|
||||
const gp_Dir& aCameraUp = aCamera->Up();
|
||||
const gp_Vec aCameraPln = aPlaneSide.Dot (aCameraUp) * aPlaneSide + aPlaneUp.Dot (aCameraUp) * aPlaneUp;
|
||||
const gp_Dir& aCameraDir = aCamera->Direction();
|
||||
aRotateAngle = static_cast<Standard_ShortReal> (aCameraPln.AngleWithRef (aPlaneUp, aCameraDir) / M_PI * 180.0);
|
||||
}
|
||||
|
||||
aHatchAngle = aRotateAngle;
|
||||
}
|
||||
|
||||
if (isZoomPers)
|
||||
{
|
||||
if (aViewScale == ShortRealLast())
|
||||
{
|
||||
const Standard_Real aFocus = aCamera->IsOrthographic()
|
||||
? aCamera->Distance()
|
||||
: (aCamera->ZFocusType() == Graphic3d_Camera::FocusType_Relative
|
||||
? Standard_Real(aCamera->ZFocus() * aCamera->Distance())
|
||||
: Standard_Real(aCamera->ZFocus()));
|
||||
|
||||
const gp_XYZ aViewDim = aCamera->ViewDimensions (aFocus);
|
||||
aViewScale = static_cast<Standard_ShortReal> (aViewDim.Y() / aContext->Viewport()[3]);
|
||||
}
|
||||
|
||||
aHatchScale = 1.0f / (aViewScale * anAspectHatching->TextureSet (aContext)->First()->SizeY());
|
||||
}
|
||||
}
|
||||
|
||||
renderSection (theWorkspace, theQuad, anAspectFace, hasHatch ? anAspectCapping->HatchingFaceAspect() : NULL, aPlaneMat, aHatchScale, aHatchAngle);
|
||||
|
||||
// turn on the current plane to restore initial state
|
||||
aContext->ChangeClipping().SetEnabled (aContext, thePlaneIter, Standard_True);
|
||||
aContext->ShaderManager()->RevertClippingState();
|
||||
aContext->ShaderManager()->RevertClippingState();
|
||||
}
|
||||
|
||||
if (theStructure.InstancedStructure() != NULL)
|
||||
{
|
||||
renderOne (theWorkspace, *theStructure.InstancedStructure(), thePlaneIter, thePlaneAspectCapping, theQuad);
|
||||
}
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : renderSection
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
void OpenGl_CappingRenderer::renderSection (const Handle(OpenGl_Workspace)& theWorkspace,
|
||||
const OpenGl_PrimitiveArray* theQuad,
|
||||
const OpenGl_AspectFace* theCappingAspect,
|
||||
const OpenGl_AspectFace* theHatchAspect,
|
||||
const OpenGl_Mat4& theCappingMatrix,
|
||||
const Standard_ShortReal theHatchScale,
|
||||
const Standard_ShortReal theHatchRotate)
|
||||
{
|
||||
const Handle(OpenGl_Context)& aContext = theWorkspace->GetGlContext();
|
||||
|
||||
const Standard_Boolean isTextureHatch =
|
||||
theHatchAspect != NULL
|
||||
&& theHatchAspect->Aspect()->TextureMapState();
|
||||
|
||||
aContext->ModelWorldState.Push();
|
||||
aContext->ModelWorldState.SetCurrent (theCappingMatrix);
|
||||
aContext->ApplyModelViewMatrix();
|
||||
|
||||
theWorkspace->SetAspectFace (theCappingAspect);
|
||||
theWorkspace->ApplyAspectFace();
|
||||
|
||||
theQuad->Render (theWorkspace);
|
||||
|
||||
if (theHatchAspect != NULL)
|
||||
{
|
||||
Graphic3d_Vec2 aPrevScale;
|
||||
Standard_ShortReal aPrevRotate = 0.0;
|
||||
|
||||
if (isTextureHatch)
|
||||
{
|
||||
glEnable (GL_BLEND);
|
||||
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
|
||||
if (theHatchScale != 1.0 || theHatchRotate != 0.0)
|
||||
{
|
||||
const Handle(Graphic3d_TextureParams)& aTexParams = theHatchAspect->TextureSet(aContext)->First()->Sampler()->Parameters();
|
||||
|
||||
aPrevScale = aTexParams->Scale();
|
||||
aPrevRotate = aTexParams->Rotation();
|
||||
|
||||
const Standard_Boolean isMirror = aPrevScale.x() * aPrevScale.y() < 0.0;
|
||||
aTexParams->SetScale (aPrevScale * theHatchScale);
|
||||
aTexParams->SetRotation (isMirror ? aPrevRotate - theHatchRotate : aPrevRotate + theHatchRotate);
|
||||
}
|
||||
}
|
||||
|
||||
theWorkspace->SetAspectFace (theHatchAspect);
|
||||
theWorkspace->ApplyAspectFace();
|
||||
|
||||
glDepthFunc (GL_LEQUAL);
|
||||
|
||||
theQuad->Render (theWorkspace);
|
||||
|
||||
glDepthFunc (GL_LESS);
|
||||
|
||||
if (isTextureHatch)
|
||||
{
|
||||
glDisable (GL_BLEND);
|
||||
|
||||
if (theHatchScale != 1.0 || theHatchRotate != 0.0)
|
||||
{
|
||||
const Handle(Graphic3d_TextureParams)& aTexParams = theHatchAspect->TextureSet(aContext)->First()->Sampler()->Parameters();
|
||||
|
||||
aTexParams->SetScale (aPrevScale);
|
||||
aTexParams->SetRotation (aPrevRotate);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
aContext->ModelWorldState.Pop();
|
||||
aContext->ApplyModelViewMatrix();
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : initQuad
|
||||
// purpose : initializes and returns vertex buffer for plane section
|
||||
// =======================================================================
|
||||
OpenGl_PrimitiveArray* OpenGl_CappingRenderer::initQuad (const Handle(OpenGl_Context)& theContext)
|
||||
{
|
||||
Handle(OpenGl_SharedElement) aSharedResource;
|
||||
|
||||
if (!theContext->GetResource (THE_QUAD_PARRAY, aSharedResource))
|
||||
{
|
||||
OpenGl_PrimitiveArray* aPArray = NULL;
|
||||
|
||||
Handle(NCollection_AlignedAllocator) anAlloc = new NCollection_AlignedAllocator (16);
|
||||
Handle(Graphic3d_Buffer) anAttribs = new Graphic3d_Buffer (anAlloc);
|
||||
Graphic3d_Attribute anAttribInfo[] =
|
||||
{
|
||||
{ Graphic3d_TOA_POS, Graphic3d_TOD_VEC4 },
|
||||
{ Graphic3d_TOA_NORM, Graphic3d_TOD_VEC4 },
|
||||
{ Graphic3d_TOA_UV, Graphic3d_TOD_VEC4 }
|
||||
};
|
||||
if (anAttribs->Init (12, anAttribInfo, 3))
|
||||
{
|
||||
memcpy (anAttribs->ChangeData(), THE_CAPPING_PLN_VERTS, sizeof (THE_CAPPING_PLN_VERTS));
|
||||
|
||||
aPArray = new OpenGl_PrimitiveArray (NULL);
|
||||
aPArray->InitBuffers (NULL, Graphic3d_TOPA_TRIANGLES, NULL, anAttribs, NULL);
|
||||
}
|
||||
aSharedResource = new OpenGl_SharedElement (aPArray);
|
||||
|
||||
theContext->ShareResource (THE_QUAD_PARRAY, aSharedResource);
|
||||
}
|
||||
|
||||
return dynamic_cast<OpenGl_PrimitiveArray*> (aSharedResource->GlElement());
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : CanRender
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
Standard_Boolean OpenGl_CappingRenderFilter::ShouldRender (const Handle(OpenGl_Workspace)& theWorkspace,
|
||||
const OpenGl_Element* theGlElement)
|
||||
{
|
||||
if (!myFilter.IsNull() && !myFilter->ShouldRender (theWorkspace, theGlElement))
|
||||
{
|
||||
return Standard_False;
|
||||
}
|
||||
|
||||
const OpenGl_PrimitiveArray* aPArray = dynamic_cast<const OpenGl_PrimitiveArray*> (theGlElement);
|
||||
return aPArray != NULL
|
||||
&& aPArray->DrawMode() >= OpenGl_PrimitiveArray::THE_FILLPRIM_FROM
|
||||
&& aPArray->DrawMode() <= OpenGl_PrimitiveArray::THE_FILLPRIM_TO;
|
||||
}
|
120
src/OpenGl/OpenGl_CappingRenderer.hxx
Normal file
120
src/OpenGl/OpenGl_CappingRenderer.hxx
Normal file
@@ -0,0 +1,120 @@
|
||||
// Created on: 2013-09-05
|
||||
// Created by: Anton POLETAEV
|
||||
// Copyright (c) 2013-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 _OpenGl_CappingRenderer_H__
|
||||
#define _OpenGl_CappingRenderer_H__
|
||||
|
||||
#include <OpenGl_RenderFilter.hxx>
|
||||
#include <OpenGl_Vec.hxx>
|
||||
|
||||
// Forward declaration
|
||||
class OpenGl_AspectFace;
|
||||
class OpenGl_AspectFillCapping;
|
||||
class OpenGl_AspectSection;
|
||||
class OpenGl_CappingStyle;
|
||||
class OpenGl_ClippingIterator;
|
||||
class OpenGl_Context;
|
||||
class OpenGl_Element;
|
||||
class OpenGl_PrimitiveArray;
|
||||
class OpenGl_Structure;
|
||||
class OpenGl_Texture;
|
||||
class OpenGl_Workspace;
|
||||
|
||||
//! Class implementing an OpenGL rasterization algorithm for drawing capping planes over clipped geometry.
|
||||
class OpenGl_CappingRenderer
|
||||
{
|
||||
public:
|
||||
|
||||
//! Renders capping surfaces for enabled clipping planes.
|
||||
//! @note Depth buffer must be generated for the passed groups.
|
||||
//! @param theWorkspace [in] the GL workspace, context state
|
||||
//! @param theStructure [in] the structure to be capped
|
||||
Standard_EXPORT static void Render (const Handle(OpenGl_Workspace)& theWorkspace,
|
||||
const OpenGl_Structure& theStructure);
|
||||
|
||||
private:
|
||||
|
||||
//! Method to render capping section of one given plane for a structure.
|
||||
static void renderOne (const Handle(OpenGl_Workspace)& theWorkspace,
|
||||
const OpenGl_Structure& theStructure,
|
||||
const OpenGl_ClippingIterator& thePlaneIter,
|
||||
const OpenGl_AspectFillCapping* thePlaneAspectCapping,
|
||||
const OpenGl_PrimitiveArray* theQuad);
|
||||
|
||||
//! Render section plane using the given aspects.
|
||||
static void renderSection (const Handle(OpenGl_Workspace)& theWorkspace,
|
||||
const OpenGl_PrimitiveArray* theQuad,
|
||||
const OpenGl_AspectFace* theCappingAspect,
|
||||
const OpenGl_AspectFace* theHatchAspect,
|
||||
const OpenGl_Mat4& theCappingMatrix,
|
||||
const Standard_ShortReal theHatchScale,
|
||||
const Standard_ShortReal theHatchRotate);
|
||||
|
||||
//! Initializes and returns face draw element for rendering section plane.
|
||||
//! @note once initialized, context will hold resource until destroyed.
|
||||
static OpenGl_PrimitiveArray* initQuad (const Handle(OpenGl_Context)& theContext);
|
||||
|
||||
//! Set rotation persistence components for the matrix to support persistent texturing.
|
||||
//! @param theWorkspace [in] the GL workspace, context state.
|
||||
//! @param thePlane [in] the plane.
|
||||
//! @param theRotateScaleMat [in/out] the matrix combining rotation and scaling persistence components.
|
||||
static void computePersistence (const Handle(OpenGl_Workspace)& theWorkspace,
|
||||
const OpenGl_ClippingIterator& thePlane,
|
||||
const Handle(OpenGl_Texture)& theTexture,
|
||||
const bool theRotatePers,
|
||||
const bool theZoomPers,
|
||||
OpenGl_Mat4& theRotateScaleMat);
|
||||
|
||||
//! Set zoom persistence components for the matrix to support persistent texturing.
|
||||
//! @param theWorkspace [in] the GL workspace, context state.
|
||||
//! @param thePlane [in] the plane.
|
||||
//! @param theTexture [in] the texture.
|
||||
//! @param theRotateScaleMat [in/out] the matrix combining rotation and scaling persistence components.
|
||||
static void setZoomPersistence (const Handle(OpenGl_Workspace)& theWorkspace,
|
||||
const Handle(OpenGl_Texture)& theTexture,
|
||||
OpenGl_Mat4& theRotateScaleMat);
|
||||
};
|
||||
|
||||
//! Filters out everything except face primitives of solids.
|
||||
class OpenGl_CappingRenderFilter : public OpenGl_RenderFilter
|
||||
{
|
||||
public:
|
||||
|
||||
//! Default constructor.
|
||||
OpenGl_CappingRenderFilter() {}
|
||||
|
||||
//! Sets the current active filter in workspace.
|
||||
//! @param thePrevFilter [in] the previously active filter that should have additive effect.
|
||||
void SetPreviousFilter (const Handle(OpenGl_RenderFilter)& thePrevFitler) { myFilter = thePrevFitler; }
|
||||
|
||||
//! Checks whether the element can be rendered or not.
|
||||
//! @param theElement [in] the element to check.
|
||||
//! @return True if element can be rendered.
|
||||
Standard_EXPORT virtual
|
||||
Standard_Boolean ShouldRender (const Handle(OpenGl_Workspace)& theWorkspace,
|
||||
const OpenGl_Element* theGlElement) Standard_OVERRIDE;
|
||||
|
||||
private:
|
||||
|
||||
Handle(OpenGl_RenderFilter) myFilter; //!< Previous active filter that should be combined.
|
||||
|
||||
public:
|
||||
|
||||
DEFINE_STANDARD_RTTIEXT (OpenGl_CappingRenderFilter, OpenGl_RenderFilter)
|
||||
};
|
||||
|
||||
DEFINE_STANDARD_HANDLE (OpenGl_CappingRenderFilter, OpenGl_RenderFilter)
|
||||
|
||||
#endif
|
@@ -63,7 +63,7 @@ public:
|
||||
//! @param theWorkspace [in] the rendering workspace.
|
||||
//! @param theFilter [in] the rendering filter to check whether the element
|
||||
//! should be rendered or not.
|
||||
//! @return True if element passes the check and renders,
|
||||
//! @return True if element passes the filtering check and is rendered.
|
||||
inline Standard_Boolean
|
||||
RenderFiltered (const Handle(OpenGl_Workspace)& theWorkspace,
|
||||
const Handle(OpenGl_RenderFilter)& theFilter) const
|
||||
|
@@ -242,6 +242,28 @@ void OpenGl_Group::SetPrimitivesAspect (const Handle(Graphic3d_AspectText3d)& th
|
||||
Update();
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : SetGroupPrimitivesAspect
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
void OpenGl_Group::SetGroupPrimitivesAspect (const Handle(Graphic3d_AspectFillCapping)& theAspect)
|
||||
{
|
||||
if (IsDeleted())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (myAspectFillCapping == NULL)
|
||||
{
|
||||
myAspectFillCapping = new OpenGl_AspectFillCapping (theAspect);
|
||||
}
|
||||
else
|
||||
{
|
||||
myAspectFillCapping->SetAspect (theAspect);
|
||||
}
|
||||
Update();
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : AddPrimitiveArray
|
||||
// purpose :
|
||||
|
@@ -22,6 +22,7 @@
|
||||
#include <NCollection_List.hxx>
|
||||
#include <OpenGl_AspectLine.hxx>
|
||||
#include <OpenGl_AspectFace.hxx>
|
||||
#include <OpenGl_AspectFillCapping.hxx>
|
||||
#include <OpenGl_AspectMarker.hxx>
|
||||
#include <OpenGl_AspectText.hxx>
|
||||
#include <OpenGl_Element.hxx>
|
||||
@@ -103,6 +104,17 @@ public:
|
||||
//! Append text aspect as an element.
|
||||
Standard_EXPORT virtual void SetPrimitivesAspect (const Handle(Graphic3d_AspectText3d)& theAspect) Standard_OVERRIDE;
|
||||
|
||||
//! Update section style aspect.
|
||||
Standard_EXPORT virtual void SetGroupPrimitivesAspect (const Handle(Graphic3d_AspectFillCapping)& theAspect) Standard_OVERRIDE;
|
||||
|
||||
//! Returns section style aspect.
|
||||
virtual Handle(Graphic3d_AspectFillCapping) FillCappingAspect() const Standard_OVERRIDE
|
||||
{
|
||||
return myAspectFillCapping != NULL
|
||||
? myAspectFillCapping->Aspect()
|
||||
: Handle(Graphic3d_AspectFillCapping)();
|
||||
}
|
||||
|
||||
//! Add primitive array element
|
||||
Standard_EXPORT virtual void AddPrimitiveArray (const Graphic3d_TypeOfPrimitiveArray theType,
|
||||
const Handle(Graphic3d_IndexBuffer)& theIndices,
|
||||
@@ -153,6 +165,9 @@ public:
|
||||
//! Returns OpenGL face aspect.
|
||||
const OpenGl_AspectFace* AspectFace() const { return myAspectFace; }
|
||||
|
||||
//! Returns OpenGL capping filling aspect.
|
||||
const OpenGl_AspectFillCapping* AspectFillCapping() const { return myAspectFillCapping; }
|
||||
|
||||
//! Is the group ray-tracable (contains ray-tracable elements)?
|
||||
Standard_Boolean IsRaytracable() const { return myIsRaytracable; }
|
||||
|
||||
@@ -162,10 +177,11 @@ protected:
|
||||
|
||||
protected:
|
||||
|
||||
OpenGl_AspectLine* myAspectLine;
|
||||
OpenGl_AspectFace* myAspectFace;
|
||||
OpenGl_AspectMarker* myAspectMarker;
|
||||
OpenGl_AspectText* myAspectText;
|
||||
OpenGl_AspectLine* myAspectLine;
|
||||
OpenGl_AspectFace* myAspectFace;
|
||||
OpenGl_AspectMarker* myAspectMarker;
|
||||
OpenGl_AspectText* myAspectText;
|
||||
OpenGl_AspectFillCapping* myAspectFillCapping;
|
||||
|
||||
OpenGl_ElementNode* myFirst;
|
||||
OpenGl_ElementNode* myLast;
|
||||
|
@@ -1136,11 +1136,11 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramFont()
|
||||
EOL"}";
|
||||
|
||||
TCollection_AsciiString
|
||||
aSrcGetAlpha = EOL"float getAlpha(void) { return occTexture2D(occSamplerBaseColor, TexCoord.st).a; }";
|
||||
aSrcGetAlpha = EOL"float getAlpha(void) { return occTexture2D(occActiveSampler, TexCoord.st).a; }";
|
||||
#if !defined(GL_ES_VERSION_2_0)
|
||||
if (myContext->core11 == NULL)
|
||||
{
|
||||
aSrcGetAlpha = EOL"float getAlpha(void) { return occTexture2D(occSamplerBaseColor, TexCoord.st).r; }";
|
||||
aSrcGetAlpha = EOL"float getAlpha(void) { return occTexture2D(occActiveSampler, TexCoord.st).r; }";
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1243,8 +1243,8 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramFboBlit()
|
||||
}
|
||||
|
||||
myContext->BindProgram (myBlitProgram);
|
||||
myBlitProgram->SetSampler (myContext, "uColorSampler", Graphic3d_TextureUnit_0);
|
||||
myBlitProgram->SetSampler (myContext, "uDepthSampler", Graphic3d_TextureUnit_1);
|
||||
myBlitProgram->SetSampler(myContext, "uColorSampler", Graphic3d_TextureUnit_0);
|
||||
myBlitProgram->SetSampler(myContext, "uDepthSampler", Graphic3d_TextureUnit_1);
|
||||
myContext->BindProgram (NULL);
|
||||
return Standard_True;
|
||||
}
|
||||
@@ -1331,8 +1331,8 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramOitCompositing (const St
|
||||
}
|
||||
|
||||
myContext->BindProgram (aProgram);
|
||||
aProgram->SetSampler (myContext, "uAccumTexture", Graphic3d_TextureUnit_0);
|
||||
aProgram->SetSampler (myContext, "uWeightTexture", Graphic3d_TextureUnit_1);
|
||||
aProgram->SetSampler(myContext, "uAccumTexture", Graphic3d_TextureUnit_0);
|
||||
aProgram->SetSampler(myContext, "uWeightTexture", Graphic3d_TextureUnit_1);
|
||||
myContext->BindProgram (Handle(OpenGl_ShaderProgram)());
|
||||
return Standard_True;
|
||||
}
|
||||
@@ -1343,12 +1343,12 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramOitCompositing (const St
|
||||
// =======================================================================
|
||||
TCollection_AsciiString OpenGl_ShaderManager::pointSpriteAlphaSrc (const Standard_Integer theBits)
|
||||
{
|
||||
TCollection_AsciiString aSrcGetAlpha = EOL"float getAlpha(void) { return occTexture2D(occSamplerBaseColor, " THE_VEC2_glPointCoord ").a; }";
|
||||
TCollection_AsciiString aSrcGetAlpha = EOL"float getAlpha(void) { return occTexture2D(occActiveSampler, " THE_VEC2_glPointCoord ").a; }";
|
||||
#if !defined(GL_ES_VERSION_2_0)
|
||||
if (myContext->core11 == NULL
|
||||
&& (theBits & OpenGl_PO_TextureA) != 0)
|
||||
{
|
||||
aSrcGetAlpha = EOL"float getAlpha(void) { return occTexture2D(occSamplerBaseColor, " THE_VEC2_glPointCoord ").r; }";
|
||||
aSrcGetAlpha = EOL"float getAlpha(void) { return occTexture2D(occActiveSampler, " THE_VEC2_glPointCoord ").r; }";
|
||||
}
|
||||
#else
|
||||
(void )theBits;
|
||||
@@ -1391,7 +1391,7 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramFlat (Handle(OpenGl_Shad
|
||||
if ((theBits & OpenGl_PO_TextureRGB) != 0)
|
||||
{
|
||||
aSrcFragGetColor =
|
||||
EOL"vec4 getColor(void) { return occTexture2D(occSamplerBaseColor, " THE_VEC2_glPointCoord "); }";
|
||||
EOL"vec4 getColor(void) { return occTexture2D(occActiveSampler, " THE_VEC2_glPointCoord "); }";
|
||||
}
|
||||
|
||||
if (textureUsed (theBits))
|
||||
@@ -1429,7 +1429,10 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramFlat (Handle(OpenGl_Shad
|
||||
aSrcVertExtraMain += THE_VARY_TexCoord_Trsf;
|
||||
|
||||
aSrcFragGetColor =
|
||||
EOL"vec4 getColor(void) { return occTexture2D(occSamplerBaseColor, TexCoord.st / TexCoord.w); }";
|
||||
EOL"vec4 getColor(void)"
|
||||
EOL"{"
|
||||
EOL" return occTexture2D(occActiveSampler, TexCoord.st / TexCoord.w) * occColor;"
|
||||
EOL"}";
|
||||
}
|
||||
else if ((theBits & OpenGl_PO_TextureEnv) != 0)
|
||||
{
|
||||
@@ -1446,7 +1449,7 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramFlat (Handle(OpenGl_Shad
|
||||
EOL" TexCoord = vec4(aReflect.xy * inversesqrt (dot (aReflect, aReflect)) * 0.5 + vec2 (0.5), 0.0, 1.0);";
|
||||
|
||||
aSrcFragGetColor =
|
||||
EOL"vec4 getColor(void) { return occTexture2D (occSamplerBaseColor, TexCoord.st); }";
|
||||
EOL"vec4 getColor(void) { return occTexture2D (occActiveSampler, TexCoord.st); }";
|
||||
}
|
||||
}
|
||||
if ((theBits & OpenGl_PO_VertColor) != 0)
|
||||
@@ -1605,7 +1608,7 @@ TCollection_AsciiString OpenGl_ShaderManager::pointSpriteShadingSrc (const TColl
|
||||
EOL"vec4 getColor(void)"
|
||||
EOL"{"
|
||||
EOL" vec4 aColor = " + theBaseColorSrc + ";"
|
||||
EOL" aColor = occTexture2D(occSamplerBaseColor, " THE_VEC2_glPointCoord ") * aColor;"
|
||||
EOL" aColor = occTexture2D(occActiveSampler, " THE_VEC2_glPointCoord ") * aColor;"
|
||||
EOL" if (aColor.a <= 0.1) discard;"
|
||||
EOL" return aColor;"
|
||||
EOL"}";
|
||||
@@ -1745,7 +1748,7 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramGouraud (Handle(OpenGl_S
|
||||
EOL"vec4 getColor(void)"
|
||||
EOL"{"
|
||||
EOL" vec4 aColor = gl_FrontFacing ? FrontColor : BackColor;"
|
||||
EOL" return occTexture2D(occSamplerBaseColor, TexCoord.st / TexCoord.w) * aColor;"
|
||||
EOL" return occTexture2D(occActiveSampler, TexCoord.st / TexCoord.w) * aColor;"
|
||||
EOL"}";
|
||||
}
|
||||
}
|
||||
@@ -1886,7 +1889,7 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramPhong (Handle(OpenGl_Sha
|
||||
EOL"vec4 getColor(void)"
|
||||
EOL"{"
|
||||
EOL" vec4 aColor = " thePhongCompLight ";"
|
||||
EOL" return occTexture2D(occSamplerBaseColor, TexCoord.st / TexCoord.w) * aColor;"
|
||||
EOL" return occTexture2D(occActiveSampler, TexCoord.st / TexCoord.w) * aColor;"
|
||||
EOL"}";
|
||||
}
|
||||
}
|
||||
@@ -2200,8 +2203,8 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramStereo (Handle(OpenGl_Sh
|
||||
}
|
||||
|
||||
myContext->BindProgram (theProgram);
|
||||
theProgram->SetSampler (myContext, "uLeftSampler", Graphic3d_TextureUnit_0);
|
||||
theProgram->SetSampler (myContext, "uRightSampler", Graphic3d_TextureUnit_1);
|
||||
theProgram->SetSampler(myContext, "uLeftSampler", Graphic3d_TextureUnit_0);
|
||||
theProgram->SetSampler(myContext, "uRightSampler", Graphic3d_TextureUnit_1);
|
||||
myContext->BindProgram (NULL);
|
||||
return Standard_True;
|
||||
}
|
||||
|
@@ -13,7 +13,7 @@
|
||||
// Alternatively, this file may be used under the terms of Open CASCADE
|
||||
// commercial license or contractual agreement.
|
||||
|
||||
#include <OpenGl_CappingAlgo.hxx>
|
||||
#include <OpenGl_CappingRenderer.hxx>
|
||||
#include <OpenGl_Context.hxx>
|
||||
#include <OpenGl_GlCore11.hxx>
|
||||
#include <OpenGl_GraphicDriver.hxx>
|
||||
@@ -657,10 +657,9 @@ void OpenGl_Structure::Render (const Handle(OpenGl_Workspace) &theWorkspace) con
|
||||
}
|
||||
|
||||
// Render capping for structure groups
|
||||
if (hasClosedPrims
|
||||
&& aCtx->Clipping().IsCappingOn())
|
||||
if (hasClosedPrims && aCtx->Clipping().IsCappingOn())
|
||||
{
|
||||
OpenGl_CappingAlgo::RenderCapping (theWorkspace, *this);
|
||||
OpenGl_CappingRenderer::Render (theWorkspace, *this);
|
||||
}
|
||||
|
||||
// Revert structure clippings
|
||||
|
@@ -16,18 +16,14 @@
|
||||
#include <OpenGl_Workspace.hxx>
|
||||
|
||||
#include <OpenGl_ArbFBO.hxx>
|
||||
#include <OpenGl_AspectLine.hxx>
|
||||
#include <OpenGl_AspectFace.hxx>
|
||||
#include <OpenGl_AspectMarker.hxx>
|
||||
#include <OpenGl_AspectText.hxx>
|
||||
#include <OpenGl_Context.hxx>
|
||||
#include <OpenGl_Element.hxx>
|
||||
#include <OpenGl_FrameBuffer.hxx>
|
||||
#include <OpenGl_GlCore15.hxx>
|
||||
#include <OpenGl_SceneGeometry.hxx>
|
||||
#include <OpenGl_Structure.hxx>
|
||||
#include <OpenGl_Sampler.hxx>
|
||||
#include <OpenGl_SceneGeometry.hxx>
|
||||
#include <OpenGl_ShaderManager.hxx>
|
||||
#include <OpenGl_Structure.hxx>
|
||||
#include <OpenGl_Texture.hxx>
|
||||
#include <OpenGl_View.hxx>
|
||||
#include <OpenGl_Window.hxx>
|
||||
@@ -167,7 +163,7 @@ OpenGl_Workspace::OpenGl_Workspace (OpenGl_View* theView, const Handle(OpenGl_Wi
|
||||
#endif
|
||||
}
|
||||
|
||||
myDefaultCappingAlgoFilter = new OpenGl_CappingAlgoFilter();
|
||||
myCappingRenderFilter = new OpenGl_CappingRenderFilter();
|
||||
|
||||
myNoneCulling .Aspect()->SetSuppressBackFaces (false);
|
||||
myNoneCulling .Aspect()->SetDrawEdges (false);
|
||||
|
@@ -17,9 +17,13 @@
|
||||
#define _OpenGl_Workspace_Header
|
||||
|
||||
#include <Graphic3d_BufferType.hxx>
|
||||
#include <Graphic3d_PresentationAttributes.hxx>
|
||||
|
||||
#include <OpenGl_AspectFace.hxx>
|
||||
#include <OpenGl_CappingAlgo.hxx>
|
||||
#include <OpenGl_AspectMarker.hxx>
|
||||
#include <OpenGl_AspectLine.hxx>
|
||||
#include <OpenGl_AspectText.hxx>
|
||||
#include <OpenGl_CappingRenderer.hxx>
|
||||
#include <OpenGl_FrameBuffer.hxx>
|
||||
#include <OpenGl_Material.hxx>
|
||||
#include <OpenGl_Matrix.hxx>
|
||||
@@ -264,9 +268,9 @@ public:
|
||||
const Graphic3d_PolygonOffset& AppliedPolygonOffset() { return myPolygonOffsetApplied; }
|
||||
|
||||
//! Returns capping algorithm rendering filter.
|
||||
const Handle(OpenGl_CappingAlgoFilter)& DefaultCappingAlgoFilter() const
|
||||
const Handle(OpenGl_CappingRenderFilter)& CappingRenderFilter() const
|
||||
{
|
||||
return myDefaultCappingAlgoFilter;
|
||||
return myCappingRenderFilter;
|
||||
}
|
||||
|
||||
//! Returns face aspect for none culling mode.
|
||||
@@ -289,14 +293,14 @@ public:
|
||||
|
||||
protected: //! @name protected fields
|
||||
|
||||
OpenGl_View* myView;
|
||||
Handle(OpenGl_Window) myWindow;
|
||||
Handle(OpenGl_Context) myGlContext;
|
||||
Standard_Boolean myUseZBuffer;
|
||||
Standard_Boolean myUseDepthWrite;
|
||||
Handle(OpenGl_CappingAlgoFilter) myDefaultCappingAlgoFilter;
|
||||
OpenGl_AspectFace myNoneCulling;
|
||||
OpenGl_AspectFace myFrontCulling;
|
||||
OpenGl_View* myView;
|
||||
Handle(OpenGl_Window) myWindow;
|
||||
Handle(OpenGl_Context) myGlContext;
|
||||
Standard_Boolean myUseZBuffer;
|
||||
Standard_Boolean myUseDepthWrite;
|
||||
Handle(OpenGl_CappingRenderFilter) myCappingRenderFilter;
|
||||
OpenGl_AspectFace myNoneCulling;
|
||||
OpenGl_AspectFace myFrontCulling;
|
||||
|
||||
protected: //! @name fields related to status
|
||||
|
||||
|
@@ -39,6 +39,7 @@
|
||||
#include <StepBasic_ProductDefinition.hxx>
|
||||
#include <StepBasic_ProductDefinitionFormation.hxx>
|
||||
#include <StepBasic_ProductDefinitionRelationship.hxx>
|
||||
#include <StepBasic_ProductDefinitionWithAssociatedDocuments.hxx>
|
||||
#include <StepBasic_SiUnit.hxx>
|
||||
#include <StepBasic_SiUnitAndLengthUnit.hxx>
|
||||
#include <StepBasic_Unit.hxx>
|
||||
@@ -1166,6 +1167,7 @@ Standard_Boolean STEPCAFControl_Reader::ReadNames (const Handle(XSControl_WorkSe
|
||||
Standard_Integer nb = Model->NbEntities();
|
||||
Handle(Standard_Type) tNAUO = STANDARD_TYPE(StepRepr_NextAssemblyUsageOccurrence);
|
||||
Handle(Standard_Type) tPD = STANDARD_TYPE(StepBasic_ProductDefinition);
|
||||
Handle(Standard_Type) tPDWAD = STANDARD_TYPE(StepBasic_ProductDefinitionWithAssociatedDocuments);
|
||||
Handle(TCollection_HAsciiString) name;
|
||||
TDF_Label L;
|
||||
for (Standard_Integer i = 1; i <= nb; i++) {
|
||||
@@ -1198,7 +1200,7 @@ Standard_Boolean STEPCAFControl_Reader::ReadNames (const Handle(XSControl_WorkSe
|
||||
}
|
||||
|
||||
// for PD get name of associated product
|
||||
if ( enti->DynamicType() == tPD ) {
|
||||
if (enti->DynamicType() == tPD || enti->DynamicType() == tPDWAD) {
|
||||
L.Nullify();
|
||||
Handle(StepBasic_ProductDefinition) PD =
|
||||
Handle(StepBasic_ProductDefinition)::DownCast(enti);
|
||||
@@ -3072,7 +3074,8 @@ TDF_Label STEPCAFControl_Reader::createGDTObjectInXCAF(const Handle(Standard_Tra
|
||||
{
|
||||
TDF_Label aShL;
|
||||
aSTool->Search(aSh, aShL, Standard_True, Standard_True, Standard_True);
|
||||
aShLS1.Append(aShL);
|
||||
if (!aShL.IsNull())
|
||||
aShLS1.Append(aShL);
|
||||
}
|
||||
}
|
||||
if (!aSeqRI2.IsEmpty())
|
||||
@@ -3090,7 +3093,8 @@ TDF_Label STEPCAFControl_Reader::createGDTObjectInXCAF(const Handle(Standard_Tra
|
||||
{
|
||||
TDF_Label aShL;
|
||||
aSTool->Search(aSh, aShL, Standard_True, Standard_True, Standard_True);
|
||||
aShLS2.Append(aShL);
|
||||
if (!aShL.IsNull())
|
||||
aShLS2.Append(aShL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -42,6 +42,7 @@
|
||||
#include <ShapeFix.hxx>
|
||||
#include <ShapeFix_ComposeShell.hxx>
|
||||
#include <ShapeUpgrade.hxx>
|
||||
#include <ShapeUpgrade_CombineToCylinder.hxx>
|
||||
#include <ShapeUpgrade_RemoveInternalWires.hxx>
|
||||
#include <ShapeUpgrade_RemoveLocations.hxx>
|
||||
#include <ShapeUpgrade_ShapeConvertToBezier.hxx>
|
||||
@@ -1524,6 +1525,69 @@ Standard_Integer reshape(Draw_Interpretor& di,
|
||||
return 0;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
// CombineToCylinder
|
||||
//=======================================================================
|
||||
static Standard_Integer CombineToCylinder(Draw_Interpretor& di, Standard_Integer n, const char** a)
|
||||
{
|
||||
if (n < 3)
|
||||
{
|
||||
di << "Use combinetocyl result shape [-t val] [-a val]\n";
|
||||
di << "options:\n";
|
||||
di << "-t val to set linear tolerance (default is 1e-7)\n";
|
||||
di << "-a val to set angular tolerance (default is 1e-12)\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
TopoDS_Shape aShape = DBRep::Get(a[2]);
|
||||
if (aShape.IsNull())
|
||||
return 1;
|
||||
|
||||
// default values
|
||||
Standard_Real aLinTol = Precision::Confusion();
|
||||
Standard_Real aAngTol = Precision::Angular();
|
||||
|
||||
if (n > 3)
|
||||
{
|
||||
for (int i = 3; i < n; i++)
|
||||
{
|
||||
if (!strcmp(a[i], "-t") || !strcmp(a[i], "-a"))
|
||||
{
|
||||
if (++i < n)
|
||||
{
|
||||
if (a[i - 1][1] == 't')
|
||||
aLinTol = Draw::Atof(a[i]);
|
||||
else
|
||||
aAngTol = Draw::Atof(a[i]) * M_PI / 180.;
|
||||
}
|
||||
else
|
||||
{
|
||||
di << "value expected after " << a[i - 1];
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ShapeUpgrade_CombineToCylinder aTool;
|
||||
aTool.SetShape(aShape);
|
||||
aTool.SetLinearTolerance(aLinTol);
|
||||
aTool.SetAngularTolerance(aAngTol);
|
||||
aTool.Build();
|
||||
if (!aTool.IsDone())
|
||||
{
|
||||
di << "Not done";
|
||||
}
|
||||
else
|
||||
{
|
||||
di << "Number of new merged faces: " << aTool.NbNewFaces();
|
||||
di << "\nNumber of replaced faces: " << aTool.NbReplacedFaces();
|
||||
const TopoDS_Shape& Result = aTool.Shape();
|
||||
DBRep::Set(a[1], Result);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : InitCommands
|
||||
//purpose :
|
||||
@@ -1646,4 +1710,7 @@ Standard_Integer reshape(Draw_Interpretor& di,
|
||||
"\n '-remove what' Removes 'what' sub-shape"
|
||||
"\n Requests '-replace' and '-remove' can be repeated many times.",
|
||||
__FILE__, reshape, g);
|
||||
|
||||
theCommands.Add("combinetocylinder",
|
||||
"run w/o arguments to get help", __FILE__, CombineToCylinder, g);
|
||||
}
|
||||
|
@@ -4,6 +4,8 @@ ShapeUpgrade_ClosedEdgeDivide.cxx
|
||||
ShapeUpgrade_ClosedEdgeDivide.hxx
|
||||
ShapeUpgrade_ClosedFaceDivide.cxx
|
||||
ShapeUpgrade_ClosedFaceDivide.hxx
|
||||
ShapeUpgrade_CombineToCylinder.cxx
|
||||
ShapeUpgrade_CombineToCylinder.hxx
|
||||
ShapeUpgrade_ConvertCurve2dToBezier.cxx
|
||||
ShapeUpgrade_ConvertCurve2dToBezier.hxx
|
||||
ShapeUpgrade_ConvertCurve3dToBezier.cxx
|
||||
|
901
src/ShapeUpgrade/ShapeUpgrade_CombineToCylinder.cxx
Normal file
901
src/ShapeUpgrade/ShapeUpgrade_CombineToCylinder.cxx
Normal file
@@ -0,0 +1,901 @@
|
||||
//-Copyright: Open CASCADE 2016
|
||||
// Created on: 2016-08-01
|
||||
// Created by: Mikhail Sazonov
|
||||
// Copyright (c) 2016 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 <ShapeUpgrade_CombineToCylinder.hxx>
|
||||
#include <BRep_Builder.hxx>
|
||||
#include <BRepAdaptor_Curve.hxx>
|
||||
#include <BRepAdaptor_Surface.hxx>
|
||||
#include <BRepBuilderAPI_MakeEdge.hxx>
|
||||
#include <BRepBuilderAPI_MakeFace.hxx>
|
||||
#include <BRepTools.hxx>
|
||||
#include <BRepTools_ReShape.hxx>
|
||||
#include <ElCLib.hxx>
|
||||
#include <GCPnts_AbscissaPoint.hxx>
|
||||
#include <Geom_Circle.hxx>
|
||||
#include <Geom_BSplineCurve.hxx>
|
||||
#include <GeomAPI_PointsToBSpline.hxx>
|
||||
#include <gce_MakeCirc.hxx>
|
||||
#include <gp_Ax1.hxx>
|
||||
#include <gp_Ax3.hxx>
|
||||
#include <gp_Circ.hxx>
|
||||
#include <gp_Cylinder.hxx>
|
||||
#include <gp_Pln.hxx>
|
||||
#include <IntAna_IntConicQuad.hxx>
|
||||
#include <ShapeAnalysis_Curve.hxx>
|
||||
#include <ShapeFix_Shape.hxx>
|
||||
#include <TColStd_MapOfInteger.hxx>
|
||||
#include <TopoDS.hxx>
|
||||
#include <TopoDS_Compound.hxx>
|
||||
#include <TopoDS_Edge.hxx>
|
||||
#include <TopoDS_Face.hxx>
|
||||
#include <TopExp.hxx>
|
||||
#include <TopExp_Explorer.hxx>
|
||||
#include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
|
||||
#include <TopTools_IndexedMapOfShape.hxx>
|
||||
#include <TopTools_MapOfShape.hxx>
|
||||
#include <Precision.hxx>
|
||||
|
||||
//=======================================================================
|
||||
//function : ShapeUpgrade_CombineToCylinder
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
ShapeUpgrade_CombineToCylinder::ShapeUpgrade_CombineToCylinder()
|
||||
: myLinTol(Precision::Confusion()),
|
||||
myAngTol(Precision::Angular()),
|
||||
myNbNewFaces(0),
|
||||
myNbReplacedFaces(0),
|
||||
myDone(Standard_False)
|
||||
{
|
||||
myContext = new BRepTools_ReShape;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : sortEdges
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
static void sortEdges(const TopoDS_Shape& theShape,
|
||||
const TopTools_IndexedDataMapOfShapeListOfShape& theMapEF,
|
||||
const Standard_Real theLinTol,
|
||||
const Standard_Real theAngTol,
|
||||
TopTools_MapOfShape& theStopEdges,
|
||||
NCollection_DataMap<TopoDS_Shape,gp_Cylinder>& theMapECyl)
|
||||
{
|
||||
TopExp_Explorer anEx(theShape, TopAbs_EDGE);
|
||||
for (; anEx.More(); anEx.Next())
|
||||
{
|
||||
const TopoDS_Edge& anEdge = TopoDS::Edge(anEx.Current());
|
||||
const TopTools_ListOfShape* pFaces = theMapEF.Seek(anEdge);
|
||||
if (!pFaces)
|
||||
continue;
|
||||
|
||||
// check for manifold edge
|
||||
if (pFaces->Extent() != 2)
|
||||
{
|
||||
theStopEdges.Add(anEdge);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Get curve of the edge and check if it is a line
|
||||
BRepAdaptor_Curve aCurve(anEdge);
|
||||
if (aCurve.GetType() != GeomAbs_Line)
|
||||
{
|
||||
theStopEdges.Add(anEdge);
|
||||
continue;
|
||||
}
|
||||
// Check if the edge has enough length
|
||||
Standard_Real aLength = GCPnts_AbscissaPoint::Length(aCurve);
|
||||
if (aLength < 2.*theLinTol)
|
||||
{
|
||||
theStopEdges.Add(anEdge);
|
||||
continue;
|
||||
}
|
||||
|
||||
// check that both faces are planar, if no then add the edge to stop list
|
||||
TopoDS_Face aFaces[2] = { TopoDS::Face(pFaces->First()), TopoDS::Face(pFaces->Last()) };
|
||||
BRepAdaptor_Surface aSurf[2] = {
|
||||
BRepAdaptor_Surface(aFaces[0], Standard_False),
|
||||
BRepAdaptor_Surface(aFaces[1], Standard_False) };
|
||||
if (aSurf[0].GetType() != GeomAbs_Plane || aSurf[1].GetType() != GeomAbs_Plane)
|
||||
{
|
||||
theStopEdges.Add(anEdge);
|
||||
continue;
|
||||
}
|
||||
|
||||
// check if edge is sharp, if yes then add it to stop list
|
||||
gp_Pln aPl1 = aSurf[0].Plane();
|
||||
gp_Pln aPl2 = aSurf[1].Plane();
|
||||
if (aPl1.Axis().Direction().Angle(aPl2.Axis().Direction()) > theAngTol)
|
||||
{
|
||||
theStopEdges.Add(anEdge);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Create plane perpendicular to the edge
|
||||
gp_Lin aLin = aCurve.Line();
|
||||
gp_Pln aPln(aLin.Location(), aLin.Direction());
|
||||
|
||||
// Get opposite edges on each face
|
||||
TopoDS_Edge anOpEdges[2];
|
||||
gp_Lin anOpLines[2];
|
||||
Standard_Integer i;
|
||||
for (i = 0; i < 2; i++)
|
||||
{
|
||||
TopExp_Explorer anEx1(aFaces[i], TopAbs_EDGE);
|
||||
Standard_Integer nbE = 0;
|
||||
for (; anEx1.More(); anEx1.Next(), nbE++)
|
||||
{
|
||||
if (anOpEdges[i].IsNull())
|
||||
{
|
||||
const TopoDS_Edge& aE = TopoDS::Edge(anEx1.Current());
|
||||
if (!aE.IsSame(anEdge))
|
||||
{
|
||||
BRepAdaptor_Curve aC(aE);
|
||||
if (aC.GetType() == GeomAbs_Line)
|
||||
{
|
||||
gp_Lin aL = aC.Line();
|
||||
if (aL.Direction().IsParallel(aLin.Direction(), theAngTol))
|
||||
{
|
||||
anOpEdges[i] = aE;
|
||||
anOpLines[i] = aL;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (nbE != 4)
|
||||
break; // face has non-rectangular form
|
||||
}
|
||||
if (anOpEdges[0].IsNull() || anOpEdges[1].IsNull())
|
||||
{
|
||||
theStopEdges.Add(anEdge);
|
||||
continue;
|
||||
}
|
||||
|
||||
// intersect all 3 edges with the plane
|
||||
gp_Lin aLines[3] = { anOpLines[0], aLin, anOpLines[1] };
|
||||
gp_Pnt anIntPnt[3];
|
||||
for (i = 0; i < 3; i++)
|
||||
{
|
||||
IntAna_IntConicQuad anInter(aLines[i], aPln, theAngTol);
|
||||
if (!anInter.IsDone() || anInter.NbPoints() != 1)
|
||||
break;
|
||||
anIntPnt[i] = anInter.Point(1);
|
||||
}
|
||||
if (i < 3)
|
||||
{
|
||||
theStopEdges.Add(anEdge);
|
||||
continue;
|
||||
}
|
||||
|
||||
// check that distances to points on opposite edges are equal
|
||||
Standard_Real aDist1 = anIntPnt[0].Distance(anIntPnt[1]);
|
||||
Standard_Real aDist2 = anIntPnt[2].Distance(anIntPnt[1]);
|
||||
if (fabs(aDist1 - aDist2) > theLinTol)
|
||||
{
|
||||
theStopEdges.Add(anEdge);
|
||||
continue;
|
||||
}
|
||||
|
||||
// compute the circle radius
|
||||
gce_MakeCirc aCircMaker(anIntPnt[0], anIntPnt[1], anIntPnt[2]);
|
||||
if (!aCircMaker.IsDone())
|
||||
{
|
||||
theStopEdges.Add(anEdge);
|
||||
continue;
|
||||
}
|
||||
Standard_Real aRadius = aCircMaker.Value().Radius();
|
||||
const gp_Ax1& aCylAxis = aCircMaker.Value().Axis();
|
||||
gp_Cylinder aCyl(gp_Ax3(aCylAxis.Location(), aCylAxis.Direction()), aRadius);
|
||||
theMapECyl.Bind(anEdge, aCyl);
|
||||
}
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : updateBoundary
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
static void updateBoundary(TopTools_ListOfShape& theBoundary,
|
||||
const TopoDS_Shape& theFace,
|
||||
const TopoDS_Shape& theConnectingEdge,
|
||||
const TopTools_MapOfShape& theStopEdges)
|
||||
{
|
||||
// iterate on all edges of the face
|
||||
TopExp_Explorer anEx(theFace, TopAbs_EDGE);
|
||||
for (; anEx.More(); anEx.Next())
|
||||
{
|
||||
const TopoDS_Edge& anEdge = TopoDS::Edge(anEx.Current());
|
||||
if (anEdge.IsSame(theConnectingEdge) || theStopEdges.Contains(anEdge))
|
||||
continue; // skip stop edges
|
||||
// find this edge in the boundary
|
||||
TopTools_ListIteratorOfListOfShape anIt(theBoundary);
|
||||
while (anIt.More())
|
||||
{
|
||||
if (anIt.Value().IsSame(anEdge))
|
||||
break;
|
||||
anIt.Next();
|
||||
}
|
||||
if (anIt.More())
|
||||
{
|
||||
// found, remove it from boundary
|
||||
theBoundary.Remove(anIt);
|
||||
}
|
||||
else
|
||||
{
|
||||
// not found, add to boundary
|
||||
theBoundary.Append(anEdge);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : Auxiliary structures
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
namespace CombineToCylinder
|
||||
{
|
||||
struct Area
|
||||
{
|
||||
TopoDS_Compound Faces;
|
||||
const gp_Cylinder* pCylinder;
|
||||
Standard_Integer nbFaces;
|
||||
|
||||
Area() : pCylinder(0L), nbFaces(0)
|
||||
{}
|
||||
void Init()
|
||||
{
|
||||
Faces.Nullify();
|
||||
nbFaces = 0;
|
||||
BRep_Builder().MakeCompound(Faces);
|
||||
}
|
||||
void AddFace(const TopoDS_Shape& theFace)
|
||||
{
|
||||
BRep_Builder().Add(Faces, theFace);
|
||||
nbFaces++;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : EqualCylinders
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
inline Standard_Boolean EqualCylinders(const gp_Cylinder& theCyl1,
|
||||
const gp_Cylinder& theCyl2,
|
||||
const Standard_Real theLinTol,
|
||||
const Standard_Real theAngTol)
|
||||
{
|
||||
// check radii
|
||||
if (fabs(theCyl1.Radius() - theCyl2.Radius()) > theLinTol)
|
||||
return Standard_False;
|
||||
// check if parallel
|
||||
if (!theCyl1.Axis().Direction().IsParallel(theCyl2.Axis().Direction(), theAngTol))
|
||||
return Standard_False;
|
||||
// check distance between axes
|
||||
gp_XYZ aVecO1O2 = theCyl2.Location().XYZ() - theCyl1.Location().XYZ();
|
||||
Standard_Real aDist1 = aVecO1O2.CrossSquareMagnitude(theCyl2.Axis().Direction().XYZ());
|
||||
Standard_Real aDist2 = aVecO1O2.CrossSquareMagnitude(theCyl1.Axis().Direction().XYZ());
|
||||
Standard_Real aTol = theLinTol * theLinTol;
|
||||
return aDist1 <= aTol && aDist2 < aTol;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : collectAreas
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
static void collectAreas(const TopoDS_Shape& theShape,
|
||||
const TopTools_IndexedDataMapOfShapeListOfShape& theMapEF,
|
||||
const TopTools_MapOfShape& theStopEdges,
|
||||
const NCollection_DataMap<TopoDS_Shape, gp_Cylinder>& theMapECyl,
|
||||
const Standard_Real theLinTol,
|
||||
const Standard_Real theAngTol,
|
||||
NCollection_List<CombineToCylinder::Area>& theAreas)
|
||||
{
|
||||
TopTools_MapOfShape aPassedFaces;
|
||||
|
||||
// Repeat while there are unprocessed faces
|
||||
for (;;)
|
||||
{
|
||||
// get first unprocessed face
|
||||
TopoDS_Shape aCurFace;
|
||||
TopExp_Explorer anEx(theShape, TopAbs_FACE);
|
||||
for (; anEx.More(); anEx.Next())
|
||||
{
|
||||
aCurFace = anEx.Current();
|
||||
if (!aPassedFaces.Contains(aCurFace))
|
||||
break;
|
||||
}
|
||||
if (!anEx.More())
|
||||
break; // all are processed, stop
|
||||
|
||||
// Start area with it
|
||||
CombineToCylinder::Area anArea;
|
||||
anArea.Init();
|
||||
anArea.AddFace(aCurFace);
|
||||
aPassedFaces.Add(aCurFace);
|
||||
|
||||
// Define edges of boundary of area
|
||||
TopTools_ListOfShape aBoundary;
|
||||
updateBoundary(aBoundary, aCurFace, TopoDS_Shape(), theStopEdges);
|
||||
|
||||
// Add all neighbors to the area while there are unprocessed edges of boundary
|
||||
while (!aBoundary.IsEmpty())
|
||||
{
|
||||
TopTools_ListIteratorOfListOfShape anIt(aBoundary);
|
||||
while (anIt.More())
|
||||
{
|
||||
const TopoDS_Shape& anEdge = anIt.Value();
|
||||
const gp_Cylinder* pCyl = theMapECyl.Seek(anEdge);
|
||||
const TopTools_ListOfShape* pFaces = theMapEF.Seek(anEdge);
|
||||
Standard_ASSERT_RAISE(pCyl && pFaces && pFaces->Extent() == 2, "collectAreas");
|
||||
if (!anArea.pCylinder || EqualCylinders(*anArea.pCylinder, *pCyl, theLinTol, theAngTol))
|
||||
{
|
||||
anArea.pCylinder = pCyl;
|
||||
aCurFace = (aPassedFaces.Contains(pFaces->First()) ? pFaces->Last() : pFaces->First());
|
||||
if (!aPassedFaces.Contains(aCurFace))
|
||||
{
|
||||
// Update boundary adding the next face
|
||||
updateBoundary(aBoundary, aCurFace, anEdge, theStopEdges);
|
||||
anArea.AddFace(aCurFace);
|
||||
aPassedFaces.Add(aCurFace);
|
||||
}
|
||||
}
|
||||
aBoundary.Remove(anIt);
|
||||
}
|
||||
}
|
||||
|
||||
// check if area is well formed
|
||||
if (anArea.pCylinder && anArea.nbFaces > 2)
|
||||
{
|
||||
// Add area to the result list
|
||||
theAreas.Append(anArea);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : getNextEdge
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
static Standard_Boolean getNextEdge(const TopTools_ListOfShape& theChain,
|
||||
const Standard_Boolean theFwd,
|
||||
const TopTools_IndexedDataMapOfShapeListOfShape& theMapVE,
|
||||
const Standard_Real theSmoothAng,
|
||||
TopoDS_Edge& theNextEdge)
|
||||
{
|
||||
// Get end edge and vertex
|
||||
TopoDS_Edge anEndE, anOppoEdge;
|
||||
TopoDS_Vertex anEndV;
|
||||
if (theFwd)
|
||||
{
|
||||
anEndE = TopoDS::Edge(theChain.Last());
|
||||
anOppoEdge = TopoDS::Edge(theChain.First());
|
||||
anEndV = TopExp::LastVertex(anEndE, Standard_True);
|
||||
}
|
||||
else
|
||||
{
|
||||
anEndE = TopoDS::Edge(theChain.First());
|
||||
anOppoEdge = TopoDS::Edge(theChain.Last());
|
||||
anEndV = TopExp::FirstVertex(anEndE, Standard_True);
|
||||
}
|
||||
|
||||
// Get next edge using topology map; reject the case of multi-connected vertex,
|
||||
// when there are more than one candidate edge
|
||||
const TopTools_ListOfShape& aConnEdges = theMapVE.FindFromKey(anEndV);
|
||||
// Note! aConnEdges can contain duplicates
|
||||
theNextEdge.Nullify();
|
||||
TopTools_ListIteratorOfListOfShape itL(aConnEdges);
|
||||
for (; itL.More(); itL.Next())
|
||||
{
|
||||
const TopoDS_Shape& aE = itL.Value();
|
||||
if (aE.IsSame(anEndE))
|
||||
continue;
|
||||
if (theNextEdge.IsNull())
|
||||
theNextEdge = TopoDS::Edge(aE);
|
||||
else if(!aE.IsSame(theNextEdge))
|
||||
return Standard_False; // multi-connected vertex
|
||||
}
|
||||
|
||||
// check for closed chain
|
||||
if (theNextEdge.IsSame(anOppoEdge))
|
||||
return Standard_False;
|
||||
|
||||
// Orient the next edge
|
||||
TopoDS_Vertex aNextEndV = (theFwd ? TopExp::FirstVertex(theNextEdge, Standard_True) :
|
||||
TopExp::LastVertex(theNextEdge, Standard_True));
|
||||
if (!aNextEndV.IsSame(anEndV))
|
||||
theNextEdge.Reverse();
|
||||
|
||||
if (theSmoothAng > 0.)
|
||||
{
|
||||
// Check that the edge is linear
|
||||
BRepAdaptor_Curve aNextC(theNextEdge);
|
||||
if (aNextC.GetType() != GeomAbs_Line)
|
||||
return Standard_False;
|
||||
|
||||
// Verify smoothness of connection
|
||||
BRepAdaptor_Curve anEndC(anEndE);
|
||||
gp_Lin anEndLin = anEndC.Line();
|
||||
gp_Lin aNextLin = aNextC.Line();
|
||||
const gp_Dir& anEndDir = anEndLin.Direction();
|
||||
const gp_Dir& aNextDir = aNextLin.Direction();
|
||||
if (!anEndDir.IsParallel(aNextDir, theSmoothAng))
|
||||
return Standard_False;
|
||||
}
|
||||
return Standard_True;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : makeEdgesChain
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
static void makeEdgesChain(TopTools_ListOfShape& theChain,
|
||||
const TopTools_IndexedDataMapOfShapeListOfShape& theMapVE,
|
||||
const Standard_Real theSmoothAng)
|
||||
{
|
||||
// Cycle for both ends of the chain
|
||||
Standard_Boolean isFwd[2] = { Standard_True, Standard_False };
|
||||
for (Standard_Integer i = 0; i < 2; i++)
|
||||
{
|
||||
TopoDS_Edge aNextEdge;
|
||||
while (getNextEdge(theChain, isFwd[i], theMapVE, theSmoothAng, aNextEdge))
|
||||
{
|
||||
// add next edge to the chain
|
||||
if (isFwd[i])
|
||||
theChain.Append(aNextEdge);
|
||||
else
|
||||
theChain.Prepend(aNextEdge);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : createCylFaceFromArea
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
static TopoDS_Face createCylFaceFromArea(const TopoDS_Compound& theFaces,
|
||||
const gp_Cylinder& theCylinder)
|
||||
{
|
||||
// Find boundary edges of the area
|
||||
TopTools_IndexedDataMapOfShapeListOfShape aMapEF, aMapVE;
|
||||
TopExp::MapShapesAndAncestors(theFaces, TopAbs_EDGE, TopAbs_FACE, aMapEF);
|
||||
TopTools_ListOfShape aBoundary;
|
||||
Standard_Integer i;
|
||||
for (i = 1; i <= aMapEF.Extent(); i++)
|
||||
{
|
||||
if (aMapEF(i).Extent() == 1)
|
||||
{
|
||||
const TopoDS_Shape& aE = aMapEF.FindKey(i);
|
||||
aBoundary.Append(aE);
|
||||
TopExp::MapShapesAndAncestors(aE, TopAbs_VERTEX, TopAbs_EDGE, aMapVE);
|
||||
}
|
||||
}
|
||||
|
||||
// Check the case of closed cylinder. In this case there will be two
|
||||
// distinct chains of boundary edges, and we need to create a seam edge
|
||||
TopoDS_Edge aSeamEdge;
|
||||
TopTools_ListOfShape aChain;
|
||||
aChain.Append(aBoundary.First());
|
||||
makeEdgesChain(aChain, aMapVE, 0.);
|
||||
TopTools_MapOfShape aMapChain;
|
||||
TopTools_ListIteratorOfListOfShape itC(aChain);
|
||||
for (; itC.More(); itC.Next())
|
||||
aMapChain.Add(itC.Value());
|
||||
TopTools_ListIteratorOfListOfShape itB(aBoundary);
|
||||
for (; itB.More(); itB.Next())
|
||||
{
|
||||
if (!aMapChain.Contains(itB.Value()))
|
||||
break;
|
||||
}
|
||||
if (itB.More())
|
||||
{
|
||||
// It is the case.
|
||||
// Get any multi-connected edge and use it as a seam
|
||||
for (i = 1; i <= aMapEF.Extent(); i++)
|
||||
if (aMapEF(i).Extent() == 2)
|
||||
aSeamEdge = TopoDS::Edge(aMapEF.FindKey(i));
|
||||
}
|
||||
|
||||
// Build new cylindrical face
|
||||
TopoDS_Wire aWire;
|
||||
BRep_Builder().MakeWire(aWire);
|
||||
for (itB.Init(aBoundary); itB.More(); itB.Next())
|
||||
{
|
||||
BRep_Builder().Add(aWire, itB.Value());
|
||||
}
|
||||
if (!aSeamEdge.IsNull())
|
||||
{
|
||||
BRep_Builder().Add(aWire, aSeamEdge);
|
||||
BRep_Builder().Add(aWire, aSeamEdge.Reversed());
|
||||
}
|
||||
TopoDS_Face aCylFace = BRepBuilderAPI_MakeFace(theCylinder, aWire);
|
||||
|
||||
// Check orientation of an initial face, so that possibly to reverse the new face.
|
||||
// The new cylindrical surface always has normal directed outside of cylinder.
|
||||
// If an initial face has normal (taking face orientation into account) directed
|
||||
// inside then we must reverse the new face.
|
||||
const TopoDS_Edge& aE = TopoDS::Edge(aBoundary.First());
|
||||
const TopoDS_Face& aF = TopoDS::Face(aMapEF.FindFromKey(aE).First());
|
||||
BRepAdaptor_Surface aSurf(aF, Standard_False);
|
||||
Standard_Real aParF, aParL;
|
||||
Handle(Geom2d_Curve) aPCurve = BRep_Tool::CurveOnSurface(aE, aF, aParF, aParL);
|
||||
Standard_ASSERT_RAISE(!aPCurve.IsNull(), "createCylFaceFromArea");
|
||||
gp_Pnt2d aP2d = aPCurve->Value(aParF);
|
||||
gp_Pnt aP;
|
||||
gp_Vec aDU, aDV;
|
||||
aSurf.D1(aP2d.X(), aP2d.Y(), aP, aDU, aDV);
|
||||
gp_XYZ aN = aDU.XYZ() ^ aDV.XYZ();
|
||||
if (aF.Orientation() == TopAbs_REVERSED)
|
||||
aN.Reverse();
|
||||
gp_XYZ aVecFromAxis = aP.XYZ() - theCylinder.Location().XYZ();
|
||||
if (aVecFromAxis * aN < 0.)
|
||||
{
|
||||
// need reverse
|
||||
aCylFace.Reverse();
|
||||
}
|
||||
return aCylFace;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : updateVertexOnCirc
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
static Standard_Boolean updateVertexOnCirc(const TopoDS_Vertex& theV,
|
||||
const gp_Circ& theCirc,
|
||||
Standard_Real theMaxDist,
|
||||
Standard_Real& thePar)
|
||||
{
|
||||
Standard_Real aTol = BRep_Tool::Tolerance(theV);
|
||||
gp_Pnt aP = BRep_Tool::Pnt(theV);
|
||||
thePar = ElCLib::Parameter(theCirc, aP);
|
||||
gp_Pnt aProj = ElCLib::Value(thePar, theCirc);
|
||||
Standard_Real aDist = aProj.SquareDistance(aP);
|
||||
Standard_Boolean isOK = Standard_False;
|
||||
if (aDist > aTol*aTol)
|
||||
{
|
||||
if (aDist < theMaxDist*theMaxDist)
|
||||
{
|
||||
BRep_Builder().UpdateVertex(theV, sqrt(aDist)*1.001);
|
||||
isOK = Standard_True;
|
||||
}
|
||||
}
|
||||
return isOK;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : createCurveEdge
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
static TopoDS_Edge createCurveEdge(const TopTools_ListOfShape& theChain,
|
||||
const TopTools_IndexedDataMapOfShapeListOfShape& theMapEF,
|
||||
const Standard_Real theLinTol)
|
||||
{
|
||||
// Find a cylindrical face common for all edges
|
||||
TopTools_ListOfShape aCylFaces;
|
||||
TopTools_ListIteratorOfListOfShape itL(theChain);
|
||||
for (; itL.More(); itL.Next())
|
||||
{
|
||||
const TopoDS_Shape& aE = itL.Value();
|
||||
const TopTools_ListOfShape& aFaces = theMapEF.FindFromKey(aE);
|
||||
// get cyl faces of the current edge
|
||||
TopTools_ListOfShape aCurCylFaces;
|
||||
TopTools_ListIteratorOfListOfShape itF(aFaces);
|
||||
for (; itF.More(); itF.Next())
|
||||
{
|
||||
const TopoDS_Face& aF = TopoDS::Face(itF.Value());
|
||||
BRepAdaptor_Surface aSurf(aF, Standard_False);
|
||||
if (aSurf.GetType() == GeomAbs_Cylinder)
|
||||
aCurCylFaces.Append(aF);
|
||||
}
|
||||
|
||||
if (aCylFaces.IsEmpty())
|
||||
// initialize cyl faces with the first edge
|
||||
aCylFaces.Append(aCurCylFaces);
|
||||
else
|
||||
{
|
||||
// filter cyl faces leaving only common ones
|
||||
TopTools_ListIteratorOfListOfShape itCF(aCylFaces);
|
||||
while (itCF.More())
|
||||
{
|
||||
const TopoDS_Shape& aF = itCF.Value();
|
||||
TopTools_ListIteratorOfListOfShape itCF1(aCurCylFaces);
|
||||
for (; itCF1.More(); itCF1.Next())
|
||||
if (itCF1.Value().IsSame(aF))
|
||||
break;
|
||||
if (!itCF1.More())
|
||||
aCylFaces.Remove(itCF);
|
||||
else
|
||||
itCF.Next();
|
||||
}
|
||||
}
|
||||
if (aCylFaces.IsEmpty())
|
||||
return TopoDS_Edge(); // no common cyl faces
|
||||
}
|
||||
if (aCylFaces.IsEmpty())
|
||||
return TopoDS_Edge();
|
||||
const TopoDS_Face& aCylFace = TopoDS::Face(aCylFaces.First());
|
||||
BRepAdaptor_Surface aCylSurf(aCylFace, Standard_False);
|
||||
gp_Cylinder aCyl = aCylSurf.Cylinder();
|
||||
const gp_Dir& aCylDir = aCyl.Axis().Direction();
|
||||
const gp_Pnt& aCylLoc = aCyl.Location();
|
||||
const Standard_Real aRadius = aCyl.Radius();
|
||||
|
||||
// Check if the chain is closed
|
||||
TopoDS_Vertex aVF, aVL;
|
||||
aVF = TopoDS::Vertex(TopExp::FirstVertex(TopoDS::Edge(theChain.First()), Standard_True));
|
||||
aVL = TopoDS::Vertex(TopExp::LastVertex(TopoDS::Edge(theChain.Last()), Standard_True));
|
||||
Standard_Boolean isClosed = aVF.IsSame(aVL);
|
||||
|
||||
// Check if all points are in plane perpendicular to the cylinder axis;
|
||||
// in such case the curve is a circle
|
||||
TColgp_Array1OfPnt aPnts(1, theChain.Extent()+1);
|
||||
Standard_Real aTol = 0.;
|
||||
Standard_Integer i = 1;
|
||||
for (itL.Init(theChain); itL.More(); itL.Next(), i++)
|
||||
{
|
||||
const TopoDS_Edge& aE = TopoDS::Edge(itL.Value());
|
||||
TopoDS_Shape aV = TopExp::FirstVertex(aE, Standard_True);
|
||||
aPnts(i) = BRep_Tool::Pnt(TopoDS::Vertex(aV));
|
||||
aTol = Max(aTol, BRep_Tool::Tolerance(aE));
|
||||
}
|
||||
aPnts(i) = BRep_Tool::Pnt(aVL);
|
||||
gp_XYZ aMidPnt(0, 0, 0);
|
||||
for (i = 1; i <= aPnts.Length(); i++)
|
||||
aMidPnt += aPnts(i).XYZ();
|
||||
aMidPnt /= aPnts.Length();
|
||||
aTol = Min(aTol, theLinTol);
|
||||
for (i = 1; i <= aPnts.Length(); i++)
|
||||
{
|
||||
Standard_Real aDist = fabs((aPnts(i).XYZ() - aMidPnt) * aCylDir.XYZ());
|
||||
if (aDist > aTol)
|
||||
break;
|
||||
}
|
||||
Standard_Boolean isCircle = (i > aPnts.Length());
|
||||
|
||||
// Create new edge
|
||||
TopoDS_Edge aNewEdge;
|
||||
if (isCircle)
|
||||
{
|
||||
// Create circular edge.
|
||||
// Find center by projecting aMidPnt to the cylinder axis
|
||||
gp_XYZ aVecOM = aMidPnt - aCylLoc.XYZ();
|
||||
gp_Pnt aCenter = aCylLoc.Translated(aCylDir.XYZ() * (aVecOM * aCylDir.XYZ()));
|
||||
gp_XYZ aXDir = aPnts(1).XYZ() - aCenter.XYZ();
|
||||
gp_XYZ aCircDir = aCylDir.XYZ();
|
||||
gp_XYZ aTanDir = aPnts(2).XYZ() - aPnts(1).XYZ();
|
||||
if ((aXDir ^ aTanDir)* aCylDir.XYZ() < 0.)
|
||||
aCircDir.Reverse();
|
||||
gp_Circ aCirc(gp_Ax2(aCenter, aCircDir, aXDir), aRadius);
|
||||
Handle(Geom_Circle) aCurve = new Geom_Circle(aCirc);
|
||||
// update vertices tolerance, but not more than on a value aTol,
|
||||
// otherwise skip building a circle, and build bspline.
|
||||
Standard_Real aPar;
|
||||
if (updateVertexOnCirc(aVF, aCirc, aTol, aPar))
|
||||
{
|
||||
if (isClosed)
|
||||
{
|
||||
// full circle
|
||||
aNewEdge = BRepBuilderAPI_MakeEdge(aCurve, aVF, aVL, 0, M_PI*2.);
|
||||
}
|
||||
else
|
||||
{
|
||||
// an arc
|
||||
if (updateVertexOnCirc(aVL, aCirc, aTol, aPar))
|
||||
aNewEdge = BRepBuilderAPI_MakeEdge(aCurve, aVF, aVL, 0., aPar);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (aNewEdge.IsNull())
|
||||
{
|
||||
// not a circle, try building bspline
|
||||
gp_Pnt aPnts1[3];
|
||||
const gp_Pnt* pPnts = &aPnts(1);
|
||||
Standard_Integer np = aPnts.Length();
|
||||
if (np == 2)
|
||||
{
|
||||
gp_XYZ anEdgeDir = aPnts(2).XYZ() - aPnts(1).XYZ();
|
||||
const Standard_Real anEpsAng = 1e-4;
|
||||
if (aCylDir.IsParallel(anEdgeDir, anEpsAng))
|
||||
return aNewEdge;
|
||||
// we have only two points; create additional point in the middle of the segment
|
||||
aPnts1[0] = aPnts(1);
|
||||
aPnts1[2] = aPnts(2);
|
||||
aPnts1[1] = (aPnts1[0].XYZ() + aPnts1[2].XYZ()) * 0.5;
|
||||
pPnts = aPnts1;
|
||||
np = 3;
|
||||
}
|
||||
TColgp_Array1OfPnt aPntA(*pPnts, 1, np);
|
||||
// Create b-spline curve
|
||||
Standard_Integer aDegMin = 3;
|
||||
Standard_Integer aDegMax = 3;
|
||||
GeomAbs_Shape aCont = GeomAbs_C2;
|
||||
GeomAPI_PointsToBSpline aCreator(aPntA, aDegMin, aDegMax, aCont, aTol);
|
||||
if (aCreator.IsDone())
|
||||
{
|
||||
const Handle(Geom_BSplineCurve)& aCurve = aCreator.Curve();
|
||||
Standard_Real aTol = BRep_Tool::Tolerance(aVF);
|
||||
Standard_Real aParF = aCurve->FirstParameter();
|
||||
Standard_Real aParL = aCurve->LastParameter();
|
||||
Standard_Real aDist = aCurve->Value(aParF).SquareDistance(aPntA(1));
|
||||
if (aDist > aTol*aTol)
|
||||
BRep_Builder().UpdateVertex(aVF, sqrt(aDist));
|
||||
if (!isClosed)
|
||||
{
|
||||
aTol = BRep_Tool::Tolerance(aVL);
|
||||
aDist = aCurve->Value(aParL).SquareDistance(aPntA(np));
|
||||
if (aDist > aTol*aTol)
|
||||
BRep_Builder().UpdateVertex(aVL, sqrt(aDist));
|
||||
}
|
||||
aNewEdge = BRepBuilderAPI_MakeEdge(aCurve, aVF, aVL, aParF, aParL);
|
||||
}
|
||||
}
|
||||
return aNewEdge;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : mergeEdges
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
static void mergeEdges(const TopoDS_Shape& theShape,
|
||||
const Standard_Real theLinTol,
|
||||
const Standard_Real theAngTol,
|
||||
const Handle(BRepTools_ReShape)& theContext)
|
||||
{
|
||||
// Create topological data maps
|
||||
TopTools_IndexedDataMapOfShapeListOfShape aMapVE, aMapEF;
|
||||
TopExp::MapShapesAndAncestors(theShape, TopAbs_VERTEX, TopAbs_EDGE, aMapVE);
|
||||
TopExp::MapShapesAndAncestors(theShape, TopAbs_EDGE, TopAbs_FACE, aMapEF);
|
||||
|
||||
// The idea is to gather chains of edges in which all intermediate vertices
|
||||
// have only two neighboring edges, and do not have connection to any other edges
|
||||
// from the shape.
|
||||
|
||||
// Prepare set of all edges
|
||||
TopTools_IndexedMapOfShape anEdges;
|
||||
TopExp::MapShapes(theShape, TopAbs_EDGE, anEdges);
|
||||
TColStd_MapOfInteger anEdgesInd; // set of indices of left edges
|
||||
Standard_Integer i;
|
||||
for (i = 1; i <= anEdges.Extent(); i++)
|
||||
anEdgesInd.Add(i);
|
||||
|
||||
// Process while there are unprocessed edges
|
||||
while (!anEdgesInd.IsEmpty())
|
||||
{
|
||||
// Get an unprocessed edge
|
||||
Standard_Integer aEInd = TColStd_MapIteratorOfMapOfInteger(anEdgesInd).Value();
|
||||
anEdgesInd.Remove(aEInd);
|
||||
TopoDS_Edge aFirstEdge = TopoDS::Edge(anEdges(aEInd));
|
||||
BRepAdaptor_Curve aCurve(aFirstEdge);
|
||||
if (aCurve.GetType() != GeomAbs_Line)
|
||||
continue; // only linear edges are to be merged
|
||||
|
||||
// Start a new chain
|
||||
TopTools_ListOfShape aChain;
|
||||
aChain.Append(aFirstEdge.Oriented(TopAbs_FORWARD));
|
||||
makeEdgesChain(aChain, aMapVE, theAngTol);
|
||||
|
||||
// Remove it from the left edges
|
||||
TopTools_ListIteratorOfListOfShape itL(aChain);
|
||||
for (; itL.More(); itL.Next())
|
||||
{
|
||||
const TopoDS_Shape& aE = itL.Value();
|
||||
Standard_Integer aEI = anEdges.FindIndex(aE);
|
||||
anEdgesInd.Remove(aEI);
|
||||
}
|
||||
|
||||
if (aChain.Extent() > 0)
|
||||
{
|
||||
// Create a new curvilinear edge from the polyline
|
||||
TopoDS_Edge aNewEdge = createCurveEdge(aChain, aMapEF, theLinTol);
|
||||
if (!aNewEdge.IsNull())
|
||||
{
|
||||
aNewEdge.Orientation(aFirstEdge.Orientation());
|
||||
// Replace edges from the chain with the new edge.
|
||||
Standard_Integer nbMerged = 0;
|
||||
for (itL.Init(aChain); itL.More(); itL.Next(), nbMerged++)
|
||||
{
|
||||
const TopoDS_Shape& aE = itL.Value();
|
||||
if (nbMerged == 0)
|
||||
theContext->Replace(aE, aNewEdge);
|
||||
else
|
||||
theContext->Remove(aE);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : Build
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void ShapeUpgrade_CombineToCylinder::Build()
|
||||
{
|
||||
myDone = Standard_False;
|
||||
myNbNewFaces = myNbReplacedFaces = 0;
|
||||
myShape.Nullify();
|
||||
|
||||
TopTools_IndexedDataMapOfShapeListOfShape aMapEF;
|
||||
TopExp::MapShapesAndAncestors(myInitShape, TopAbs_EDGE, TopAbs_FACE, aMapEF);
|
||||
|
||||
// Sort edges in the shape on two groups - stop edges and smooth edges that are
|
||||
// to be located on a cylinder wall parallel to its axis.
|
||||
TopTools_MapOfShape aStopEdges;
|
||||
NCollection_DataMap<TopoDS_Shape, gp_Cylinder> aMapECyl;
|
||||
sortEdges(myInitShape, aMapEF, myLinTol, myAngTol, aStopEdges, aMapECyl);
|
||||
|
||||
#ifdef DEBUG_CombineToCylinder_StopEdges
|
||||
TopoDS_Compound aCompE;
|
||||
BRep_Builder().MakeCompound(aCompE);
|
||||
TopTools_MapIteratorOfMapOfShape aMapIt(aStopEdges);
|
||||
for (; aMapIt.More(); aMapIt.Next())
|
||||
BRep_Builder().Add(aCompE, aMapIt.Value());
|
||||
BRepTools::Write(aCompE, "stope.brep");
|
||||
#endif
|
||||
|
||||
// Collect faces forming same-cylinder areas
|
||||
NCollection_List<CombineToCylinder::Area> anAreas;
|
||||
collectAreas(myInitShape, aMapEF, aStopEdges, aMapECyl, myLinTol, myAngTol, anAreas);
|
||||
|
||||
#ifdef DEBUG_CombineToCylinder_Areas
|
||||
TopoDS_Compound aComp;
|
||||
BRep_Builder().MakeCompound(aComp);
|
||||
TopTools_ListIteratorOfListOfShape anItA(anAreas);
|
||||
for (; anItA.More(); anItA.Next())
|
||||
BRep_Builder().Add(aComp, anItA.Value());
|
||||
BRepTools::Write(aComp, "areas.brep");
|
||||
#endif
|
||||
|
||||
// Process each area
|
||||
NCollection_List<CombineToCylinder::Area>::Iterator anItAreas(anAreas);
|
||||
for (; anItAreas.More(); anItAreas.Next())
|
||||
{
|
||||
const CombineToCylinder::Area& anArea = anItAreas.Value();
|
||||
if (!anArea.pCylinder)
|
||||
continue;
|
||||
|
||||
TopoDS_Shape aCylFace = createCylFaceFromArea(anArea.Faces, *anArea.pCylinder);
|
||||
|
||||
// Replace faces from the list with the new face.
|
||||
TopExp_Explorer anEx(anArea.Faces, TopAbs_FACE);
|
||||
Standard_Integer nbMerged = 0;
|
||||
for (; anEx.More(); anEx.Next(), nbMerged++)
|
||||
{
|
||||
const TopoDS_Shape& aFace = anEx.Current();
|
||||
if (nbMerged == 0)
|
||||
myContext->Replace(aFace, aCylFace);
|
||||
else
|
||||
myContext->Remove(aFace);
|
||||
}
|
||||
myNbNewFaces++;
|
||||
myNbReplacedFaces += nbMerged;
|
||||
}
|
||||
|
||||
// Build intermediate result shape using replacement context.
|
||||
// This shape will contain chains of linear edges along cylinders
|
||||
// instead of circles or whatever curves.
|
||||
// The next step is to merge them.
|
||||
TopoDS_Shape aTempShape = myContext->Apply(myInitShape);
|
||||
mergeEdges(aTempShape, myLinTol, myAngTol, myContext);
|
||||
|
||||
// Rebuild the result shape using replacement context.
|
||||
myShape = myContext->Apply(myInitShape);
|
||||
|
||||
// build pcurves
|
||||
ShapeFix_Shape aFix(myShape);
|
||||
aFix.Perform();
|
||||
myShape = aFix.Shape();
|
||||
myDone = Standard_True;
|
||||
}
|
93
src/ShapeUpgrade/ShapeUpgrade_CombineToCylinder.hxx
Normal file
93
src/ShapeUpgrade/ShapeUpgrade_CombineToCylinder.hxx
Normal file
@@ -0,0 +1,93 @@
|
||||
//-Copyright: Open CASCADE 2016
|
||||
// Created on: 2016-08-01
|
||||
// Created by: Mikhail Sazonov
|
||||
// Copyright (c) 2016 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 _ShapeUpgrade_CombineToCylinder_HeaderFile
|
||||
#define _ShapeUpgrade_CombineToCylinder_HeaderFile
|
||||
|
||||
#include <Standard_TypeDef.hxx>
|
||||
#include <TopoDS_Shape.hxx>
|
||||
|
||||
class BRepTools_ReShape;
|
||||
|
||||
//! This tool tries to merge planar faces constituting a cylindrical surface into one face.
|
||||
//! The algorithm checks that all merged faces have smooth change of normal within the given
|
||||
//! angular tolerance.
|
||||
class ShapeUpgrade_CombineToCylinder
|
||||
{
|
||||
public:
|
||||
|
||||
//! empty constructor
|
||||
Standard_EXPORT ShapeUpgrade_CombineToCylinder();
|
||||
|
||||
//! Sets input shape
|
||||
void SetShape(const TopoDS_Shape& theShape)
|
||||
{
|
||||
myInitShape = theShape;
|
||||
}
|
||||
|
||||
//! Sets the linear tolerance. Default value is Precision::Confusion().
|
||||
void SetLinearTolerance(const Standard_Real theValue)
|
||||
{
|
||||
myLinTol = theValue;
|
||||
}
|
||||
|
||||
//! Sets the angular tolerance. Default value is Precision::Angular().
|
||||
void SetAngularTolerance(const Standard_Real theValue)
|
||||
{
|
||||
myAngTol = theValue;
|
||||
}
|
||||
|
||||
//! Builds the resulting shape
|
||||
Standard_EXPORT void Build();
|
||||
|
||||
//! Returns true if the result shape was successfully built.
|
||||
Standard_Boolean IsDone() const
|
||||
{
|
||||
return myDone;
|
||||
}
|
||||
|
||||
//! Returns the result shape.
|
||||
const TopoDS_Shape& Shape() const
|
||||
{
|
||||
return myShape;
|
||||
}
|
||||
|
||||
//! Returns the number of new faces built by merging
|
||||
Standard_Integer NbNewFaces() const
|
||||
{
|
||||
return myNbNewFaces;
|
||||
}
|
||||
|
||||
//! Returns the number of replaced faces
|
||||
Standard_Integer NbReplacedFaces() const
|
||||
{
|
||||
return myNbReplacedFaces;
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
TopoDS_Shape myInitShape;
|
||||
Standard_Real myLinTol;
|
||||
Standard_Real myAngTol;
|
||||
TopoDS_Shape myShape;
|
||||
Handle(BRepTools_ReShape) myContext;
|
||||
Standard_Integer myNbNewFaces;
|
||||
Standard_Integer myNbReplacedFaces;
|
||||
Standard_Boolean myDone;
|
||||
|
||||
};
|
||||
|
||||
#endif // _ShapeUpgrade_CombineToCylinder_HeaderFile
|
@@ -276,14 +276,15 @@ namespace
|
||||
}
|
||||
|
||||
//! Prepare shaded presentation for specified shape
|
||||
static Standard_Boolean shadeFromShape (const TopoDS_Shape& theShape,
|
||||
const Handle(Prs3d_Presentation)& thePrs,
|
||||
const Handle(Prs3d_Drawer)& theDrawer,
|
||||
const Standard_Boolean theHasTexels,
|
||||
const gp_Pnt2d& theUVOrigin,
|
||||
const gp_Pnt2d& theUVRepeat,
|
||||
const gp_Pnt2d& theUVScale,
|
||||
const bool theIsClosed)
|
||||
static Standard_Boolean shadeFromShape (const TopoDS_Shape& theShape,
|
||||
const Handle(Prs3d_Presentation)& thePrs,
|
||||
const Handle(Prs3d_Drawer)& theDrawer,
|
||||
const Handle(Graphic3d_AspectFillCapping)& theCappingStyle,
|
||||
const Standard_Boolean theHasTexels,
|
||||
const gp_Pnt2d& theUVOrigin,
|
||||
const gp_Pnt2d& theUVRepeat,
|
||||
const gp_Pnt2d& theUVScale,
|
||||
const bool theIsClosed)
|
||||
{
|
||||
Handle(Graphic3d_ArrayOfTriangles) aPArray = fillTriangles (theShape, theHasTexels, theUVOrigin, theUVRepeat, theUVScale);
|
||||
if (aPArray.IsNull())
|
||||
@@ -294,6 +295,9 @@ namespace
|
||||
Handle(Graphic3d_Group) aGroup = Prs3d_Root::NewGroup (thePrs);
|
||||
aGroup->SetClosed (theIsClosed);
|
||||
aGroup->SetGroupPrimitivesAspect (theDrawer->ShadingAspect()->Aspect());
|
||||
if (!theCappingStyle.IsNull())
|
||||
aGroup->SetGroupPrimitivesAspect (theCappingStyle);
|
||||
|
||||
aGroup->AddPrimitiveArray (aPArray);
|
||||
return Standard_True;
|
||||
}
|
||||
@@ -496,28 +500,30 @@ void StdPrs_ShadedShape::ExploreSolids (const TopoDS_Shape& theShape,
|
||||
// function : Add
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
void StdPrs_ShadedShape::Add (const Handle(Prs3d_Presentation)& thePrs,
|
||||
const TopoDS_Shape& theShape,
|
||||
const Handle(Prs3d_Drawer)& theDrawer,
|
||||
const StdPrs_Volume theVolume)
|
||||
void StdPrs_ShadedShape::Add (const Handle(Prs3d_Presentation)& thePrs,
|
||||
const TopoDS_Shape& theShape,
|
||||
const Handle(Prs3d_Drawer)& theDrawer,
|
||||
const Handle(Graphic3d_AspectFillCapping)& theCappingStyle,
|
||||
const StdPrs_Volume theVolume)
|
||||
{
|
||||
gp_Pnt2d aDummy;
|
||||
StdPrs_ShadedShape::Add (thePrs, theShape, theDrawer,
|
||||
Standard_False, aDummy, aDummy, aDummy, theVolume);
|
||||
Standard_False, aDummy, aDummy, aDummy, theCappingStyle, theVolume);
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : Add
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
void StdPrs_ShadedShape::Add (const Handle (Prs3d_Presentation)& thePrs,
|
||||
const TopoDS_Shape& theShape,
|
||||
const Handle (Prs3d_Drawer)& theDrawer,
|
||||
const Standard_Boolean theHasTexels,
|
||||
const gp_Pnt2d& theUVOrigin,
|
||||
const gp_Pnt2d& theUVRepeat,
|
||||
const gp_Pnt2d& theUVScale,
|
||||
const StdPrs_Volume theVolume)
|
||||
void StdPrs_ShadedShape::Add (const Handle (Prs3d_Presentation)& thePrs,
|
||||
const TopoDS_Shape& theShape,
|
||||
const Handle (Prs3d_Drawer)& theDrawer,
|
||||
const Standard_Boolean theHasTexels,
|
||||
const gp_Pnt2d& theUVOrigin,
|
||||
const gp_Pnt2d& theUVRepeat,
|
||||
const gp_Pnt2d& theUVScale,
|
||||
const Handle(Graphic3d_AspectFillCapping)& theCappingStyle,
|
||||
const StdPrs_Volume theVolume)
|
||||
{
|
||||
if (theShape.IsNull())
|
||||
{
|
||||
@@ -555,21 +561,21 @@ void StdPrs_ShadedShape::Add (const Handle (Prs3d_Presentation)& thePrs,
|
||||
TopoDS_Iterator aShapeIter (aClosed);
|
||||
if (aShapeIter.More())
|
||||
{
|
||||
shadeFromShape (aClosed, thePrs, theDrawer,
|
||||
shadeFromShape (aClosed, thePrs, theDrawer, theCappingStyle,
|
||||
theHasTexels, theUVOrigin, theUVRepeat, theUVScale, true);
|
||||
}
|
||||
|
||||
aShapeIter.Initialize (anOpened);
|
||||
if (aShapeIter.More())
|
||||
{
|
||||
shadeFromShape (anOpened, thePrs, theDrawer,
|
||||
shadeFromShape (anOpened, thePrs, theDrawer, theCappingStyle,
|
||||
theHasTexels, theUVOrigin, theUVRepeat, theUVScale, false);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// if the shape type is not compound, composolid or solid, use autodetection back-facing filled
|
||||
shadeFromShape (theShape, thePrs, theDrawer,
|
||||
shadeFromShape (theShape, thePrs, theDrawer, theCappingStyle,
|
||||
theHasTexels, theUVOrigin, theUVRepeat, theUVScale,
|
||||
theVolume == StdPrs_Volume_Closed);
|
||||
}
|
||||
|
@@ -43,13 +43,25 @@ public:
|
||||
//! @param theVolumeType defines the way how to interpret input shapes - as Closed volumes (to activate back-face
|
||||
//! culling and capping plane algorithms), as Open volumes (shells or solids with holes)
|
||||
//! or to perform Autodetection (would split input shape into two groups)
|
||||
Standard_EXPORT static void Add (const Handle(Prs3d_Presentation)& thePresentation, const TopoDS_Shape& theShape, const Handle(Prs3d_Drawer)& theDrawer, const StdPrs_Volume theVolume = StdPrs_Volume_Autodetection);
|
||||
Standard_EXPORT static void Add (const Handle(Prs3d_Presentation)& thePresentation,
|
||||
const TopoDS_Shape& theShape,
|
||||
const Handle(Prs3d_Drawer)& theDrawer,
|
||||
const Handle(Graphic3d_AspectFillCapping)& theCappingStyle = Handle(Graphic3d_AspectFillCapping)(),
|
||||
StdPrs_Volume theVolume = StdPrs_Volume_Autodetection);
|
||||
|
||||
//! Shades <theShape> with texture coordinates.
|
||||
//! @param theVolumeType defines the way how to interpret input shapes - as Closed volumes (to activate back-face
|
||||
//! culling and capping plane algorithms), as Open volumes (shells or solids with holes)
|
||||
//! or to perform Autodetection (would split input shape into two groups)
|
||||
Standard_EXPORT static void Add (const Handle(Prs3d_Presentation)& thePresentation, const TopoDS_Shape& theShape, const Handle(Prs3d_Drawer)& theDrawer, const Standard_Boolean theHasTexels, const gp_Pnt2d& theUVOrigin, const gp_Pnt2d& theUVRepeat, const gp_Pnt2d& theUVScale, const StdPrs_Volume theVolume = StdPrs_Volume_Autodetection);
|
||||
Standard_EXPORT static void Add (const Handle(Prs3d_Presentation)& thePresentation,
|
||||
const TopoDS_Shape& theShape,
|
||||
const Handle(Prs3d_Drawer)& theDrawer,
|
||||
const Standard_Boolean theHasTexels,
|
||||
const gp_Pnt2d& theUVOrigin,
|
||||
const gp_Pnt2d& theUVRepeat,
|
||||
const gp_Pnt2d& theUVScale,
|
||||
const Handle(Graphic3d_AspectFillCapping)& theCappingStyle = Handle(Graphic3d_AspectFillCapping)(),
|
||||
const StdPrs_Volume theVolume = StdPrs_Volume_Autodetection);
|
||||
|
||||
//! Searches closed and unclosed subshapes in shape structure and puts them
|
||||
//! into two compounds for separate processing of closed and unclosed sub-shapes
|
||||
|
@@ -45,5 +45,5 @@ StepVisual_PresentationStyleSelect StepVisual_PresentationStyleAssignment::Style
|
||||
|
||||
Standard_Integer StepVisual_PresentationStyleAssignment::NbStyles () const
|
||||
{
|
||||
return styles->Length();
|
||||
return styles.IsNull() ? 0 : styles->Length();
|
||||
}
|
||||
|
@@ -11,3 +11,5 @@ TKHLR
|
||||
TKService
|
||||
TKGeomAlgo
|
||||
TKV3d
|
||||
TKSTL
|
||||
TKShHealing
|
||||
|
@@ -24,3 +24,4 @@ TKDCAF
|
||||
TKViewerTest
|
||||
TKBinXCAF
|
||||
TKXmlXCAF
|
||||
TKVRML
|
||||
|
@@ -1618,17 +1618,17 @@ static int VSetInteriorStyle (Draw_Interpretor& theDI,
|
||||
//! Auxiliary structure for VAspects
|
||||
struct ViewerTest_AspectsChangeSet
|
||||
{
|
||||
Standard_Integer ToSetVisibility;
|
||||
Standard_Integer Visibility;
|
||||
Standard_Integer ToSetVisibility;
|
||||
Standard_Integer Visibility;
|
||||
|
||||
Standard_Integer ToSetColor;
|
||||
Quantity_Color Color;
|
||||
Standard_Integer ToSetColor;
|
||||
Quantity_Color Color;
|
||||
|
||||
Standard_Integer ToSetLineWidth;
|
||||
Standard_Real LineWidth;
|
||||
Standard_Integer ToSetLineWidth;
|
||||
Standard_Real LineWidth;
|
||||
|
||||
Standard_Integer ToSetTypeOfLine;
|
||||
Aspect_TypeOfLine TypeOfLine;
|
||||
Standard_Integer ToSetTypeOfLine;
|
||||
Aspect_TypeOfLine TypeOfLine;
|
||||
|
||||
Standard_Integer ToSetTypeOfMarker;
|
||||
Aspect_TypeOfMarker TypeOfMarker;
|
||||
@@ -1640,30 +1640,60 @@ struct ViewerTest_AspectsChangeSet
|
||||
Standard_Integer ToSetTransparency;
|
||||
Standard_Real Transparency;
|
||||
|
||||
Standard_Integer ToSetMaterial;
|
||||
Graphic3d_NameOfMaterial Material;
|
||||
TCollection_AsciiString MatName;
|
||||
Standard_Integer ToSetMaterial;
|
||||
Graphic3d_NameOfMaterial Material;
|
||||
TCollection_AsciiString MatName;
|
||||
|
||||
NCollection_Sequence<TopoDS_Shape> SubShapes;
|
||||
|
||||
Standard_Integer ToSetShowFreeBoundary;
|
||||
Standard_Integer ToSetFreeBoundaryWidth;
|
||||
Standard_Real FreeBoundaryWidth;
|
||||
Standard_Integer ToSetFreeBoundaryColor;
|
||||
Quantity_Color FreeBoundaryColor;
|
||||
Standard_Integer ToSetShowFreeBoundary;
|
||||
Standard_Integer ToSetFreeBoundaryWidth;
|
||||
Standard_Real FreeBoundaryWidth;
|
||||
Standard_Integer ToSetFreeBoundaryColor;
|
||||
Quantity_Color FreeBoundaryColor;
|
||||
|
||||
Standard_Integer ToEnableIsoOnTriangulation;
|
||||
Standard_Integer ToEnableIsoOnTriangulation;
|
||||
|
||||
Standard_Integer ToSetMaxParamValue;
|
||||
Standard_Real MaxParamValue;
|
||||
Standard_Integer ToSetMaxParamValue;
|
||||
Standard_Real MaxParamValue;
|
||||
|
||||
Standard_Integer ToSetSensitivity;
|
||||
Standard_Integer SelectionMode;
|
||||
Standard_Integer Sensitivity;
|
||||
Standard_Integer ToSetSensitivity;
|
||||
Standard_Integer SelectionMode;
|
||||
Standard_Integer Sensitivity;
|
||||
|
||||
Standard_Integer ToSetHatch;
|
||||
Standard_Integer StdHatchStyle;
|
||||
TCollection_AsciiString PathToHatchPattern;
|
||||
Standard_Integer ToSetHatch;
|
||||
Standard_Integer StdHatchStyle;
|
||||
TCollection_AsciiString PathToHatchPattern;
|
||||
|
||||
Standard_Integer ToSetCappingUseObjMaterial;
|
||||
Standard_Integer ToSetCappingUseObjTexture;
|
||||
Standard_Integer ToSetCappingUseObjShader;
|
||||
Standard_Integer ToSetCappingHatchZoomPers;
|
||||
Standard_Integer ToSetCappingHatchRotatePers;
|
||||
Standard_Integer ToSetCappingHatchEnabled;
|
||||
Standard_Boolean ToSetCappingColor;
|
||||
Quantity_Color CappingColor;
|
||||
Standard_Boolean ToSetCappingTexture;
|
||||
Handle(Graphic3d_TextureMap) CappingTexture;
|
||||
Standard_Boolean ToSetCappingTexScale;
|
||||
Graphic3d_Vec2 CappingTexScale;
|
||||
Standard_Boolean ToSetCappingTexOrigin;
|
||||
Graphic3d_Vec2 CappingTexOrigin;
|
||||
Standard_Boolean ToSetCappingTexRotate;
|
||||
Standard_ShortReal CappingTexRotate;
|
||||
Standard_Boolean ToSetCappingStippleHatch;
|
||||
Handle(Graphic3d_HatchStyle) CappingHatchStipple;
|
||||
Standard_Boolean ToSetCappingHatchColor;
|
||||
Quantity_Color CappingHatchColor;
|
||||
Standard_Boolean ToSetCappingTextureHatch;
|
||||
Handle(Graphic3d_TextureMap) CappingHatchTexture;
|
||||
Standard_Boolean ToSetCappingHatchTexScale;
|
||||
Graphic3d_Vec2 CappingHatchTexScale;
|
||||
Standard_Boolean ToSetCappingHatchTexOrigin;
|
||||
Graphic3d_Vec2 CappingHatchTexOrigin;
|
||||
Standard_Boolean ToSetCappingHatchTexRotate;
|
||||
Standard_ShortReal CappingHatchTexRotate;
|
||||
Standard_Boolean ToUnsetCapping;
|
||||
|
||||
//! Empty constructor
|
||||
ViewerTest_AspectsChangeSet()
|
||||
@@ -1695,7 +1725,26 @@ struct ViewerTest_AspectsChangeSet
|
||||
SelectionMode (-1),
|
||||
Sensitivity (-1),
|
||||
ToSetHatch (0),
|
||||
StdHatchStyle (-1)
|
||||
StdHatchStyle (-1),
|
||||
ToSetCappingUseObjMaterial (-1),
|
||||
ToSetCappingUseObjTexture (-1),
|
||||
ToSetCappingUseObjShader (-1),
|
||||
ToSetCappingHatchZoomPers (-1),
|
||||
ToSetCappingHatchRotatePers (-1),
|
||||
ToSetCappingHatchEnabled (-1),
|
||||
ToSetCappingColor (Standard_False),
|
||||
ToSetCappingTexture (Standard_False),
|
||||
ToSetCappingTexScale (Standard_False),
|
||||
ToSetCappingTexOrigin (Standard_False),
|
||||
ToSetCappingTexRotate (Standard_False),
|
||||
ToSetCappingStippleHatch (Standard_False),
|
||||
ToSetCappingHatchColor (Standard_False),
|
||||
ToSetCappingTextureHatch (Standard_False),
|
||||
ToSetCappingHatchTexScale (Standard_False),
|
||||
ToSetCappingHatchTexOrigin (Standard_False),
|
||||
ToSetCappingHatchTexRotate (Standard_False),
|
||||
CappingTexRotate (0.F),
|
||||
ToUnsetCapping (Standard_False)
|
||||
{}
|
||||
|
||||
//! @return true if no changes have been requested
|
||||
@@ -1711,7 +1760,30 @@ struct ViewerTest_AspectsChangeSet
|
||||
&& ToSetFreeBoundaryWidth == 0
|
||||
&& ToSetMaxParamValue == 0
|
||||
&& ToSetSensitivity == 0
|
||||
&& ToSetHatch == 0;
|
||||
&& ToSetHatch == 0
|
||||
&& !ToSetCapping();
|
||||
}
|
||||
|
||||
Standard_Boolean ToSetCapping() const
|
||||
{
|
||||
return ToSetCappingUseObjMaterial != -1
|
||||
|| ToSetCappingUseObjTexture != -1
|
||||
|| ToSetCappingUseObjShader != -1
|
||||
|| ToSetCappingHatchZoomPers != -1
|
||||
|| ToSetCappingHatchRotatePers != -1
|
||||
|| ToSetCappingHatchEnabled != -1
|
||||
|| ToSetCappingColor
|
||||
|| ToSetCappingTexture
|
||||
|| ToSetCappingTexScale
|
||||
|| ToSetCappingTexOrigin
|
||||
|| ToSetCappingTexRotate
|
||||
|| ToSetCappingStippleHatch
|
||||
|| ToSetCappingHatchColor
|
||||
|| ToSetCappingTextureHatch
|
||||
|| ToSetCappingHatchTexScale
|
||||
|| ToSetCappingHatchTexOrigin
|
||||
|| ToSetCappingHatchTexRotate
|
||||
|| ToUnsetCapping;
|
||||
}
|
||||
|
||||
//! @return true if properties are valid
|
||||
@@ -1768,9 +1840,109 @@ struct ViewerTest_AspectsChangeSet
|
||||
std::cout << "Error: hatch style must be specified\n";
|
||||
isOk = Standard_False;
|
||||
}
|
||||
if (ToUnsetCapping && ToSetCapping())
|
||||
{
|
||||
std::cout << "Error: not possible to set capping attribute with -unsetCapping specified\n";
|
||||
isOk = Standard_False;
|
||||
}
|
||||
return isOk;
|
||||
}
|
||||
|
||||
void ApplyToCappingStyle (const Handle(Graphic3d_AspectFillCapping)& theStyle)
|
||||
{
|
||||
if (ToSetCappingUseObjMaterial != -1)
|
||||
{
|
||||
theStyle->SetUseObjectMaterial (ToSetCappingUseObjMaterial != 0);
|
||||
}
|
||||
if (ToSetCappingUseObjTexture != -1)
|
||||
{
|
||||
theStyle->SetUseObjectTexture (ToSetCappingUseObjTexture != 0);
|
||||
}
|
||||
if (ToSetCappingUseObjShader != -1)
|
||||
{
|
||||
theStyle->SetUseObjectShader (ToSetCappingUseObjShader != 0);
|
||||
}
|
||||
if (ToSetCappingHatchZoomPers != -1)
|
||||
{
|
||||
theStyle->SetHatchZoomPeristent (ToSetCappingHatchZoomPers != 0);
|
||||
}
|
||||
if (ToSetCappingHatchRotatePers != -1)
|
||||
{
|
||||
theStyle->SetHatchRotationPeristent (ToSetCappingHatchRotatePers != 0);
|
||||
}
|
||||
if (ToSetCappingHatchEnabled != -1)
|
||||
{
|
||||
theStyle->SetToDrawHatch (ToSetCappingHatchEnabled != 0);
|
||||
}
|
||||
if (ToSetCappingColor)
|
||||
{
|
||||
Graphic3d_MaterialAspect aMat = theStyle->Material();
|
||||
aMat.SetAmbientColor (CappingColor);
|
||||
aMat.SetDiffuseColor (CappingColor);
|
||||
theStyle->SetMaterial (aMat);
|
||||
}
|
||||
if (ToSetCappingTexture)
|
||||
{
|
||||
theStyle->SetTexture (CappingTexture);
|
||||
}
|
||||
if (ToSetCappingTexScale)
|
||||
{
|
||||
if (!theStyle->Texture().IsNull())
|
||||
{
|
||||
theStyle->Texture()->GetParams()->SetScale (CappingTexScale);
|
||||
}
|
||||
}
|
||||
if (ToSetCappingTexOrigin)
|
||||
{
|
||||
if (!theStyle->Texture().IsNull())
|
||||
{
|
||||
theStyle->Texture()->GetParams()->SetTranslation (CappingTexOrigin);
|
||||
}
|
||||
}
|
||||
if (ToSetCappingTexRotate)
|
||||
{
|
||||
if (!theStyle->Texture().IsNull())
|
||||
{
|
||||
theStyle->Texture()->GetParams()->SetRotation (CappingTexRotate);
|
||||
}
|
||||
}
|
||||
if (ToSetCappingStippleHatch)
|
||||
{
|
||||
theStyle->SetHatchStyle (CappingHatchStipple);
|
||||
}
|
||||
if (ToSetCappingHatchColor)
|
||||
{
|
||||
Graphic3d_MaterialAspect aMat = theStyle->HatchMaterial();
|
||||
aMat.SetAmbientColor (CappingHatchColor);
|
||||
aMat.SetDiffuseColor (CappingHatchColor);
|
||||
theStyle->SetHatchMaterial (aMat);
|
||||
}
|
||||
if (ToSetCappingTextureHatch)
|
||||
{
|
||||
theStyle->SetHatchStyle (CappingHatchTexture);
|
||||
}
|
||||
if (ToSetCappingHatchTexScale)
|
||||
{
|
||||
if (!theStyle->TextureHatch().IsNull())
|
||||
{
|
||||
theStyle->TextureHatch()->GetParams()->SetScale (CappingHatchTexScale);
|
||||
}
|
||||
}
|
||||
if (ToSetCappingHatchTexOrigin)
|
||||
{
|
||||
if (!theStyle->TextureHatch().IsNull())
|
||||
{
|
||||
theStyle->TextureHatch()->GetParams()->SetTranslation (CappingHatchTexOrigin);
|
||||
}
|
||||
}
|
||||
if (ToSetCappingHatchTexRotate)
|
||||
{
|
||||
if (!theStyle->TextureHatch().IsNull())
|
||||
{
|
||||
theStyle->TextureHatch()->GetParams()->SetRotation (CappingHatchTexRotate);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
@@ -1825,6 +1997,7 @@ static Standard_Integer VAspects (Draw_Interpretor& /*theDI*/,
|
||||
NCollection_Sequence<ViewerTest_AspectsChangeSet> aChanges;
|
||||
aChanges.Append (ViewerTest_AspectsChangeSet());
|
||||
ViewerTest_AspectsChangeSet* aChangeSet = &aChanges.ChangeLast();
|
||||
Standard_Boolean toEnable = Standard_False;
|
||||
|
||||
// parse syntax of legacy commands
|
||||
if (aCmdName == "vsetwidth")
|
||||
@@ -1944,6 +2117,8 @@ static Standard_Integer VAspects (Draw_Interpretor& /*theDI*/,
|
||||
}
|
||||
for (; anArgIter < theArgNb; ++anArgIter)
|
||||
{
|
||||
const char** aChangeArgs = theArgVec + anArgIter;
|
||||
Standard_Integer aNbChangeArgs = theArgNb - anArgIter;
|
||||
TCollection_AsciiString anArg = theArgVec[anArgIter];
|
||||
anArg.LowerCase();
|
||||
if (anArg == "-setwidth"
|
||||
@@ -2389,12 +2564,6 @@ static Standard_Integer VAspects (Draw_Interpretor& /*theDI*/,
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (aNames.IsEmpty())
|
||||
{
|
||||
std::cout << "Error: object should be specified explicitly when -setHatch is used!\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
aChangeSet->ToSetHatch = 1;
|
||||
TCollection_AsciiString anArgHatch (theArgVec[++anArgIter]);
|
||||
if (anArgHatch.Length() <= 2)
|
||||
@@ -2413,6 +2582,382 @@ static Standard_Integer VAspects (Draw_Interpretor& /*theDI*/,
|
||||
aChangeSet->PathToHatchPattern = anArgHatch;
|
||||
}
|
||||
}
|
||||
else if (anArg == "-setcappinguseobjmaterial")
|
||||
{
|
||||
if (isDefaults)
|
||||
{
|
||||
std::cout << "Error: wrong syntax. -setHatch can not be used together with -defaults call!\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (aNbChangeArgs < 2)
|
||||
{
|
||||
std::cout << "Syntax error: -setCappingUseObjMaterial need more arguments.\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (ViewerTest::ParseOnOff (aChangeArgs[1], toEnable))
|
||||
{
|
||||
aChangeSet->ToSetCappingUseObjMaterial = toEnable ? 1 : 0;
|
||||
anArgIter += 1;
|
||||
}
|
||||
}
|
||||
else if (anArg == "-setcappinguseobjtexture")
|
||||
{
|
||||
if (isDefaults)
|
||||
{
|
||||
std::cout << "Error: wrong syntax. -setHatch can not be used together with -defaults call!\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (aNbChangeArgs < 2)
|
||||
{
|
||||
std::cout << "Syntax error: -setCappingUseObjTexture need more arguments.\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (ViewerTest::ParseOnOff (aChangeArgs[1], toEnable))
|
||||
{
|
||||
aChangeSet->ToSetCappingUseObjTexture = toEnable ? 1 : 0;
|
||||
anArgIter += 1;
|
||||
}
|
||||
}
|
||||
else if (anArg == "-setcappinguseobjshader")
|
||||
{
|
||||
if (isDefaults)
|
||||
{
|
||||
std::cout << "Error: wrong syntax. -setHatch can not be used together with -defaults call!\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (aNbChangeArgs < 2)
|
||||
{
|
||||
std::cout << "Syntax error: -setCappingUseObjShader need more arguments.\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (ViewerTest::ParseOnOff (aChangeArgs[1], toEnable))
|
||||
{
|
||||
aChangeSet->ToSetCappingUseObjShader = toEnable ? 1 : 0;
|
||||
anArgIter += 1;
|
||||
}
|
||||
}
|
||||
else if (anArg == "-setcappingcolor")
|
||||
{
|
||||
if (isDefaults)
|
||||
{
|
||||
std::cout << "Error: wrong syntax. -setHatch can not be used together with -defaults call!\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
Quantity_Color aColor;
|
||||
Standard_Integer aNbParsed = ViewerTest::ParseColor (aNbChangeArgs - 1,
|
||||
aChangeArgs + 1,
|
||||
aColor);
|
||||
if (aNbParsed == 0)
|
||||
{
|
||||
std::cout << "Syntax error: -setCappingColor need more arguments.\n";
|
||||
return 1;
|
||||
}
|
||||
anArgIter += aNbParsed;
|
||||
aChangeSet->ToSetCappingColor = Standard_True;
|
||||
aChangeSet->CappingColor = aColor;
|
||||
}
|
||||
else if (anArg == "-setcappingtexture")
|
||||
{
|
||||
if (isDefaults)
|
||||
{
|
||||
std::cout << "Error: wrong syntax. -setHatch can not be used together with -defaults call!\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (aNbChangeArgs < 2)
|
||||
{
|
||||
std::cout << "Syntax error: -setCappingTexture need more arguments.\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
TCollection_AsciiString aTextureName (aChangeArgs[1]);
|
||||
Handle(Graphic3d_Texture2Dmanual) aTexture = new Graphic3d_Texture2Dmanual(aTextureName);
|
||||
if (!aTexture->IsDone())
|
||||
{
|
||||
aChangeSet->CappingTexture = Handle(Graphic3d_TextureMap)();
|
||||
}
|
||||
else
|
||||
{
|
||||
aTexture->EnableModulate();
|
||||
aTexture->EnableRepeat();
|
||||
aChangeSet->CappingTexture = aTexture.get();
|
||||
}
|
||||
aChangeSet->ToSetCappingTexture = Standard_True;
|
||||
anArgIter += 1;
|
||||
}
|
||||
else if (anArg == "-setcappingtexscale")
|
||||
{
|
||||
if (isDefaults)
|
||||
{
|
||||
std::cout << "Error: wrong syntax. -setHatch can not be used together with -defaults call!\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (aNbChangeArgs < 3)
|
||||
{
|
||||
std::cout << "Syntax error: -setCappingTexScale need more arguments.\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
Standard_ShortReal aSx = (Standard_ShortReal)Draw::Atof (aChangeArgs[1]);
|
||||
Standard_ShortReal aSy = (Standard_ShortReal)Draw::Atof (aChangeArgs[2]);
|
||||
aChangeSet->ToSetCappingTexScale = Standard_True;
|
||||
aChangeSet->CappingTexScale = Graphic3d_Vec2 (aSx, aSy);
|
||||
anArgIter += 2;
|
||||
}
|
||||
else if (anArg == "-setcappingtexorigin")
|
||||
{
|
||||
if (aNbChangeArgs < 3)
|
||||
{
|
||||
std::cout << "Syntax error: -setCappingTexOrigin need more arguments.\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
Standard_ShortReal aTx = (Standard_ShortReal)Draw::Atof (aChangeArgs[1]);
|
||||
Standard_ShortReal aTy = (Standard_ShortReal)Draw::Atof (aChangeArgs[2]);
|
||||
aChangeSet->ToSetCappingTexOrigin = Standard_True;
|
||||
aChangeSet->CappingTexOrigin = Graphic3d_Vec2 (aTx, aTy);
|
||||
anArgIter += 2;
|
||||
}
|
||||
else if (anArg == "-setcappingtexrotate")
|
||||
{
|
||||
if (isDefaults)
|
||||
{
|
||||
std::cout << "Error: wrong syntax. -setHatch can not be used together with -defaults call!\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (aNbChangeArgs < 2)
|
||||
{
|
||||
std::cout << "Syntax error: -setCappingTexRotate need more arguments.\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
aChangeSet->ToSetCappingTexRotate = Standard_True;
|
||||
aChangeSet->CappingTexRotate = (Standard_ShortReal)Draw::Atof (aChangeArgs[1]);
|
||||
anArgIter += 1;
|
||||
}
|
||||
else if (anArg == "-setcappinghatchzoompers")
|
||||
{
|
||||
if (isDefaults)
|
||||
{
|
||||
std::cout << "Error: wrong syntax. -setHatch can not be used together with -defaults call!\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (aNbChangeArgs < 2)
|
||||
{
|
||||
std::cout << "Syntax error: -setCappingHatchZoomPers need more arguments.\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (ViewerTest::ParseOnOff (aChangeArgs[1], toEnable))
|
||||
{
|
||||
aChangeSet->ToSetCappingHatchZoomPers = toEnable ? 1 : 0;
|
||||
anArgIter += 1;
|
||||
}
|
||||
}
|
||||
else if (anArg == "-setcappinghatchrotatepers")
|
||||
{
|
||||
if (isDefaults)
|
||||
{
|
||||
std::cout << "Error: wrong syntax. -setHatch can not be used together with -defaults call!\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (aNbChangeArgs < 2)
|
||||
{
|
||||
std::cout << "Syntax error: -setCappingHatchRotatePers need more arguments.\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (ViewerTest::ParseOnOff (aChangeArgs[1], toEnable))
|
||||
{
|
||||
aChangeSet->ToSetCappingHatchRotatePers = toEnable ? 1 : 0;
|
||||
anArgIter += 1;
|
||||
}
|
||||
}
|
||||
else if (anArg == "-setcappinghatch")
|
||||
{
|
||||
if (isDefaults)
|
||||
{
|
||||
std::cout << "Error: wrong syntax. -setHatch can not be used together with -defaults call!\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (aNbChangeArgs < 2)
|
||||
{
|
||||
std::cout << "Syntax error: -setCappingHatch need more arguments.\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (ViewerTest::ParseOnOff (aChangeArgs[1], toEnable))
|
||||
{
|
||||
aChangeSet->ToSetCappingHatchEnabled = toEnable ? 1 : 0;
|
||||
anArgIter += 1;
|
||||
}
|
||||
}
|
||||
else if (anArg == "-setcappinghatchstipple")
|
||||
{
|
||||
if (isDefaults)
|
||||
{
|
||||
std::cout << "Error: wrong syntax. -setHatch can not be used together with -defaults call!\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (aNbChangeArgs < 2)
|
||||
{
|
||||
std::cout << "Syntax error: -setCappingHatchStipple need more arguments.\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
TCollection_AsciiString anArg = aChangeArgs[1];
|
||||
if (anArg.IsIntegerValue())
|
||||
{
|
||||
aChangeSet->ToSetCappingStippleHatch = Standard_True;
|
||||
aChangeSet->CappingHatchStipple = new Graphic3d_HatchStyle ((Aspect_HatchStyle)Draw::Atoi (aChangeArgs[1]));
|
||||
}
|
||||
else
|
||||
{
|
||||
Handle(Image_AlienPixMap) anImage = new Image_AlienPixMap();
|
||||
if (!anImage->Load (anArg))
|
||||
{
|
||||
std::cout << "Syntax error: -setCappingHatchStipple image " << anArg << " could not be loaded.\n";
|
||||
return 1;
|
||||
}
|
||||
aChangeSet->ToSetCappingStippleHatch = Standard_True;
|
||||
aChangeSet->CappingHatchStipple = new Graphic3d_HatchStyle (anImage);
|
||||
}
|
||||
anArgIter += 1;
|
||||
}
|
||||
else if (anArg == "-setcappinghatchcolor")
|
||||
{
|
||||
if (isDefaults)
|
||||
{
|
||||
std::cout << "Error: wrong syntax. -setHatch can not be used together with -defaults call!\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
Quantity_Color aColor;
|
||||
Standard_Integer aNbParsed = ViewerTest::ParseColor (aNbChangeArgs - 1,
|
||||
aChangeArgs + 1,
|
||||
aColor);
|
||||
if (aNbParsed == 0)
|
||||
{
|
||||
std::cout << "Syntax error: -setCappingHatchColor need more arguments.\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
aChangeSet->ToSetCappingHatchColor = Standard_True;
|
||||
aChangeSet->CappingHatchColor = aColor;
|
||||
anArgIter += aNbParsed;
|
||||
}
|
||||
else if (anArg == "-setcappinghatchtexture")
|
||||
{
|
||||
if (isDefaults)
|
||||
{
|
||||
std::cout << "Error: wrong syntax. -setHatch can not be used together with -defaults call!\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (aNbChangeArgs < 2)
|
||||
{
|
||||
std::cout << "Syntax error: -setCappingHatchTexture need more arguments.\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
TCollection_AsciiString aTextureName (aChangeArgs[1]);
|
||||
Handle(Graphic3d_Texture2Dmanual) aTexture = new Graphic3d_Texture2Dmanual(aTextureName);
|
||||
if (aTexture->IsDone())
|
||||
{
|
||||
aTexture->EnableModulate();
|
||||
aTexture->EnableRepeat();
|
||||
}
|
||||
aChangeSet->ToSetCappingTextureHatch = Standard_True;
|
||||
aChangeSet->CappingHatchTexture = aTexture->IsDone() ? aTexture : Handle(Graphic3d_TextureMap)();
|
||||
anArgIter += 1;
|
||||
}
|
||||
else if (anArg == "-setcappinghatchtexscale")
|
||||
{
|
||||
if (isDefaults)
|
||||
{
|
||||
std::cout << "Error: wrong syntax. -setHatch can not be used together with -defaults call!\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (aNbChangeArgs < 3)
|
||||
{
|
||||
std::cout << "Syntax error: -setCappingHatchTexScale need more arguments.\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
Standard_ShortReal aSx = (Standard_ShortReal)Draw::Atof (aChangeArgs[1]);
|
||||
Standard_ShortReal aSy = (Standard_ShortReal)Draw::Atof (aChangeArgs[2]);
|
||||
aChangeSet->ToSetCappingHatchTexScale = Standard_True;
|
||||
aChangeSet->CappingHatchTexScale = Graphic3d_Vec2 (aSx, aSy);
|
||||
anArgIter += 2;
|
||||
}
|
||||
else if (anArg == "-setcappinghatchtexorigin")
|
||||
{
|
||||
if (isDefaults)
|
||||
{
|
||||
std::cout << "Error: wrong syntax. -setHatch can not be used together with -defaults call!\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (aNbChangeArgs < 3)
|
||||
{
|
||||
std::cout << "Syntax error: -setCappingHatchTexOrigin need more arguments.\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
Standard_ShortReal aTx = (Standard_ShortReal)Draw::Atof (aChangeArgs[1]);
|
||||
Standard_ShortReal aTy = (Standard_ShortReal)Draw::Atof (aChangeArgs[2]);
|
||||
aChangeSet->ToSetCappingHatchTexOrigin = Standard_True;
|
||||
aChangeSet->CappingHatchTexOrigin = Graphic3d_Vec2 (aTx, aTy);
|
||||
anArgIter += 2;
|
||||
}
|
||||
else if (anArg == "-setcappinghatchtexrotate")
|
||||
{
|
||||
if (isDefaults)
|
||||
{
|
||||
std::cout << "Error: wrong syntax. -setHatch can not be used together with -defaults call!\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (aNbChangeArgs < 2)
|
||||
{
|
||||
std::cout << "Syntax error: -setCappingHatchTexRotate need more arguments.\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
aChangeSet->ToSetCappingHatchTexRotate = Standard_True;
|
||||
aChangeSet->CappingHatchTexRotate = (Standard_ShortReal)Draw::Atof (aChangeArgs[1]);
|
||||
anArgIter += 1;
|
||||
}
|
||||
else if (anArg == "-unsetcappingstyle")
|
||||
{
|
||||
if (isDefaults)
|
||||
{
|
||||
std::cout << "Error: wrong syntax. -setHatch can not be used together with -defaults call!\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (isDefaults)
|
||||
{
|
||||
std::cout << "Error: wrong syntax. -unsetCappingStyle can not be used together with -defaults call!\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
aChangeSet->ToUnsetCapping = Standard_True;
|
||||
}
|
||||
else
|
||||
{
|
||||
std::cout << "Error: wrong syntax at " << anArg << "\n";
|
||||
@@ -2699,6 +3244,27 @@ static Standard_Integer VAspects (Draw_Interpretor& /*theDI*/,
|
||||
}
|
||||
toRedisplay = Standard_True;
|
||||
}
|
||||
if (aChangeSet->ToSetCapping())
|
||||
{
|
||||
Handle(Graphic3d_AspectFillCapping) aCappingStyle = aPrs->CappingStyle();
|
||||
|
||||
if (aCappingStyle.IsNull())
|
||||
{
|
||||
aCappingStyle = new Graphic3d_AspectFillCapping;
|
||||
}
|
||||
|
||||
aChangeSet->ApplyToCappingStyle (aCappingStyle);
|
||||
|
||||
aPrs->SetCappingStyle (aCappingStyle);
|
||||
|
||||
toRedisplay = Standard_True;
|
||||
}
|
||||
if (aChangeSet->ToUnsetCapping != 0)
|
||||
{
|
||||
aPrs->SetCappingStyle (Handle(Graphic3d_AspectFillCapping)());
|
||||
|
||||
toRedisplay = Standard_True;
|
||||
}
|
||||
}
|
||||
|
||||
for (aChangesIter.Next(); aChangesIter.More(); aChangesIter.Next())
|
||||
@@ -6229,6 +6795,24 @@ void ViewerTest::Commands(Draw_Interpretor& theCommands)
|
||||
"\n\t\t: [-setMaxParamValue {value}]"
|
||||
"\n\t\t: [-setSensitivity {selection_mode} {value}]"
|
||||
"\n\t\t: [-setHatch HatchStyle]"
|
||||
"\n\t\t: [-setCappingUseObjMaterial {off/on | 0/1}]"
|
||||
"\n\t\t: [-setCappingUseObjTexture {off/on | 0/1}]"
|
||||
"\n\t\t: [-setCappingUseObjShader {off/on | 0/1}]"
|
||||
"\n\t\t: [-setCappingColor R G B]"
|
||||
"\n\t\t: [-setCappingTexture texture]"
|
||||
"\n\t\t: [-setCappingTexScale SX SY]"
|
||||
"\n\t\t: [-setCappingTexOrigin TX TY]"
|
||||
"\n\t\t: [-setCappingTexRotate Angle]"
|
||||
"\n\t\t: [-setCappingHatch {off/on | 0/1}]"
|
||||
"\n\t\t: [-setCappingHatchColor R G B]"
|
||||
"\n\t\t: [-setCappingHatchStipple maskID]"
|
||||
"\n\t\t: [-setCappingHatchTexture Texture]"
|
||||
"\n\t\t: [-setCappingHatchTexScale SX SY]"
|
||||
"\n\t\t: [-setCappingHatchTexOrigin TX TY]"
|
||||
"\n\t\t: [-setCappingHatchTexRotate Angle]"
|
||||
"\n\t\t: [-setCappingHatchZoomPers {off/on | 0/1}]"
|
||||
"\n\t\t: [-setCappingHatchRotatePers {off/on | 0/1}]"
|
||||
"\n\t\t: [-unsetCappingStyle]"
|
||||
"\n\t\t: Manage presentation properties of all, selected or named objects."
|
||||
"\n\t\t: When -subshapes is specified than following properties will be"
|
||||
"\n\t\t: assigned to specified sub-shapes."
|
||||
|
@@ -26,6 +26,7 @@
|
||||
#include <AIS_InteractiveObject.hxx>
|
||||
#include <AIS_ListOfInteractive.hxx>
|
||||
#include <AIS_ListIteratorOfListOfInteractive.hxx>
|
||||
#include <AIS_ViewCube.hxx>
|
||||
#include <DBRep.hxx>
|
||||
#include <Draw_ProgressIndicator.hxx>
|
||||
#include <Graphic3d_ArrayOfPolylines.hxx>
|
||||
@@ -233,6 +234,25 @@ Standard_EXPORT Handle(AIS_Manipulator) GetActiveAISManipulator()
|
||||
return NULL;
|
||||
}
|
||||
|
||||
typedef NCollection_DataMap<Handle(V3d_View), Handle(AIS_ViewCube)> ViewerTest_MapOfViewCube;
|
||||
|
||||
Standard_EXPORT ViewerTest_MapOfViewCube& MapOfViewCube()
|
||||
{
|
||||
static ViewerTest_MapOfViewCube aViewMap;
|
||||
return aViewMap;
|
||||
}
|
||||
|
||||
Standard_EXPORT Handle(AIS_ViewCube) ActiveViewCube()
|
||||
{
|
||||
Handle(AIS_ViewCube) aCube;
|
||||
if (MapOfViewCube().Find (ViewerTest::CurrentView(), aCube))
|
||||
{
|
||||
return aCube;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
|
||||
#ifdef _WIN32
|
||||
@@ -8225,6 +8245,7 @@ static int VClipPlane (Draw_Interpretor& theDi, Standard_Integer theArgsNb, cons
|
||||
if (ViewerTest::ParseOnOff (aChangeArgs[1], toEnable))
|
||||
{
|
||||
aClipPlane->SetCapping (toEnable);
|
||||
|
||||
anArgIter += 1;
|
||||
}
|
||||
else
|
||||
@@ -8245,7 +8266,7 @@ static int VClipPlane (Draw_Interpretor& theDi, Standard_Integer theArgsNb, cons
|
||||
|
||||
if (ViewerTest::ParseOnOff (aChangeArgs[1], toEnable))
|
||||
{
|
||||
aClipPlane->SetUseObjectMaterial (toEnable == Standard_True);
|
||||
aClipPlane->CappingSectionStyle()->SetUseObjectMaterial (toEnable == Standard_True);
|
||||
anArgIter += 1;
|
||||
}
|
||||
}
|
||||
@@ -8262,7 +8283,7 @@ static int VClipPlane (Draw_Interpretor& theDi, Standard_Integer theArgsNb, cons
|
||||
|
||||
if (ViewerTest::ParseOnOff (aChangeArgs[1], toEnable))
|
||||
{
|
||||
aClipPlane->SetUseObjectTexture (toEnable == Standard_True);
|
||||
aClipPlane->CappingSectionStyle()->SetUseObjectTexture (toEnable == Standard_True);
|
||||
anArgIter += 1;
|
||||
}
|
||||
}
|
||||
@@ -8277,7 +8298,7 @@ static int VClipPlane (Draw_Interpretor& theDi, Standard_Integer theArgsNb, cons
|
||||
|
||||
if (ViewerTest::ParseOnOff (aChangeArgs[1], toEnable))
|
||||
{
|
||||
aClipPlane->SetUseObjectShader (toEnable == Standard_True);
|
||||
aClipPlane->CappingSectionStyle()->SetUseObjectShader (toEnable == Standard_True);
|
||||
anArgIter += 1;
|
||||
}
|
||||
}
|
||||
@@ -8294,14 +8315,29 @@ static int VClipPlane (Draw_Interpretor& theDi, Standard_Integer theArgsNb, cons
|
||||
return 1;
|
||||
}
|
||||
|
||||
Graphic3d_MaterialAspect aMat = aClipPlane->CappingMaterial();
|
||||
Graphic3d_MaterialAspect aMat = aClipPlane->CappingSectionStyle()->Material();
|
||||
aMat.SetAmbientColor (aColor);
|
||||
aMat.SetDiffuseColor (aColor);
|
||||
aClipPlane->SetCappingMaterial (aMat);
|
||||
aClipPlane->CappingSectionStyle()->SetMaterial (aMat);
|
||||
anArgIter += aNbParsed;
|
||||
}
|
||||
else if (aChangeArg == "-texname"
|
||||
|| aChangeArg == "texname")
|
||||
else if (aChangeArg == "-overrideaspect"
|
||||
|| aChangeArg == "overrideaspect")
|
||||
{
|
||||
if (aNbChangeArgs < 2)
|
||||
{
|
||||
std::cout << "Syntax error: need more arguments.\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (ViewerTest::ParseOnOff (aChangeArgs[1], toEnable))
|
||||
{
|
||||
aClipPlane->SetToOverrideCappingAspect (toEnable == Standard_True);
|
||||
anArgIter += 1;
|
||||
}
|
||||
}
|
||||
else if (aChangeArg == "-texture"
|
||||
|| aChangeArg == "texture")
|
||||
{
|
||||
if (aNbChangeArgs < 2)
|
||||
{
|
||||
@@ -8313,20 +8349,22 @@ static int VClipPlane (Draw_Interpretor& theDi, Standard_Integer theArgsNb, cons
|
||||
Handle(Graphic3d_Texture2Dmanual) aTexture = new Graphic3d_Texture2Dmanual(aTextureName);
|
||||
if (!aTexture->IsDone())
|
||||
{
|
||||
aClipPlane->SetCappingTexture (NULL);
|
||||
aClipPlane->CappingSectionStyle()->SetTexture (Handle(Graphic3d_TextureMap)());
|
||||
}
|
||||
else
|
||||
{
|
||||
aTexture->EnableModulate();
|
||||
aTexture->EnableRepeat();
|
||||
aClipPlane->SetCappingTexture (aTexture);
|
||||
aClipPlane->CappingSectionStyle()->SetTexture (aTexture.get());
|
||||
}
|
||||
anArgIter += 1;
|
||||
}
|
||||
else if (aChangeArg == "-texscale"
|
||||
|| aChangeArg == "texscale")
|
||||
{
|
||||
if (aClipPlane->CappingTexture().IsNull())
|
||||
const Handle(Graphic3d_TextureMap)& aHatchTexture = aClipPlane->CappingSectionStyle()->Texture();
|
||||
|
||||
if (aHatchTexture.IsNull())
|
||||
{
|
||||
std::cout << "Error: no texture is set.\n";
|
||||
return 1;
|
||||
@@ -8340,13 +8378,15 @@ static int VClipPlane (Draw_Interpretor& theDi, Standard_Integer theArgsNb, cons
|
||||
|
||||
Standard_ShortReal aSx = (Standard_ShortReal)Draw::Atof (aChangeArgs[1]);
|
||||
Standard_ShortReal aSy = (Standard_ShortReal)Draw::Atof (aChangeArgs[2]);
|
||||
aClipPlane->CappingTexture()->GetParams()->SetScale (Graphic3d_Vec2 (aSx, aSy));
|
||||
aHatchTexture->GetParams()->SetScale (Graphic3d_Vec2 (aSx, aSy));
|
||||
anArgIter += 2;
|
||||
}
|
||||
else if (aChangeArg == "-texorigin"
|
||||
|| aChangeArg == "texorigin") // texture origin
|
||||
{
|
||||
if (aClipPlane->CappingTexture().IsNull())
|
||||
const Handle(Graphic3d_TextureMap)& aHatchTexture = aClipPlane->CappingSectionStyle()->Texture();
|
||||
|
||||
if (aHatchTexture.IsNull())
|
||||
{
|
||||
std::cout << "Error: no texture is set.\n";
|
||||
return 1;
|
||||
@@ -8361,13 +8401,15 @@ static int VClipPlane (Draw_Interpretor& theDi, Standard_Integer theArgsNb, cons
|
||||
Standard_ShortReal aTx = (Standard_ShortReal)Draw::Atof (aChangeArgs[1]);
|
||||
Standard_ShortReal aTy = (Standard_ShortReal)Draw::Atof (aChangeArgs[2]);
|
||||
|
||||
aClipPlane->CappingTexture()->GetParams()->SetTranslation (Graphic3d_Vec2 (aTx, aTy));
|
||||
aHatchTexture->GetParams()->SetTranslation (Graphic3d_Vec2 (aTx, aTy));
|
||||
anArgIter += 2;
|
||||
}
|
||||
else if (aChangeArg == "-texrotate"
|
||||
|| aChangeArg == "texrotate") // texture rotation
|
||||
{
|
||||
if (aClipPlane->CappingTexture().IsNull())
|
||||
const Handle(Graphic3d_TextureMap)& aHatchTexture = aClipPlane->CappingSectionStyle()->Texture();
|
||||
|
||||
if (aHatchTexture.IsNull())
|
||||
{
|
||||
std::cout << "Error: no texture is set.\n";
|
||||
return 1;
|
||||
@@ -8380,7 +8422,7 @@ static int VClipPlane (Draw_Interpretor& theDi, Standard_Integer theArgsNb, cons
|
||||
}
|
||||
|
||||
Standard_ShortReal aRot = (Standard_ShortReal)Draw::Atof (aChangeArgs[1]);
|
||||
aClipPlane->CappingTexture()->GetParams()->SetRotation (aRot);
|
||||
aHatchTexture->GetParams()->SetRotation (aRot);
|
||||
anArgIter += 1;
|
||||
}
|
||||
else if (aChangeArg == "-hatch"
|
||||
@@ -8392,22 +8434,165 @@ static int VClipPlane (Draw_Interpretor& theDi, Standard_Integer theArgsNb, cons
|
||||
return 1;
|
||||
}
|
||||
|
||||
TCollection_AsciiString aHatchStr (aChangeArgs[1]);
|
||||
aHatchStr.LowerCase();
|
||||
if (aHatchStr == "on")
|
||||
if (ViewerTest::ParseOnOff (aChangeArgs[1], toEnable))
|
||||
{
|
||||
aClipPlane->SetCappingHatchOn();
|
||||
aClipPlane->CappingSectionStyle()->SetToDrawHatch (toEnable == Standard_True);
|
||||
anArgIter += 1;
|
||||
}
|
||||
else if (aHatchStr == "off")
|
||||
}
|
||||
else if (aChangeArg == "-hatchtexture"
|
||||
|| aChangeArg == "hatchtexture")
|
||||
{
|
||||
if (aNbChangeArgs < 2)
|
||||
{
|
||||
aClipPlane->SetCappingHatchOff();
|
||||
std::cout << "Syntax error: need more arguments.\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
TCollection_AsciiString aTextureName (aChangeArgs[1]);
|
||||
Handle(Graphic3d_Texture2Dmanual) aTexture = new Graphic3d_Texture2Dmanual(aTextureName);
|
||||
if (!aTexture->IsDone())
|
||||
{
|
||||
aClipPlane->CappingSectionStyle()->SetHatchStyle (Handle(Graphic3d_TextureMap)());
|
||||
}
|
||||
else
|
||||
{
|
||||
aClipPlane->SetCappingHatch ((Aspect_HatchStyle)Draw::Atoi (aChangeArgs[1]));
|
||||
aTexture->EnableModulate();
|
||||
aTexture->EnableRepeat();
|
||||
aClipPlane->CappingSectionStyle()->SetHatchStyle (aTexture.get());
|
||||
aClipPlane->CappingSectionStyle()->SetToDrawHatch (true);
|
||||
}
|
||||
anArgIter += 1;
|
||||
}
|
||||
else if (aChangeArg == "-hatchstipple"
|
||||
|| aChangeArg == "hatchstipple")
|
||||
{
|
||||
if (aNbChangeArgs < 2)
|
||||
{
|
||||
std::cout << "Syntax error: need more arguments.\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
aClipPlane->CappingSectionStyle()->SetHatchStyle ((Aspect_HatchStyle)Draw::Atoi (aChangeArgs[1]));
|
||||
aClipPlane->CappingSectionStyle()->SetToDrawHatch (true);
|
||||
anArgIter += 1;
|
||||
}
|
||||
else if (aChangeArg == "-hatchcolor"
|
||||
|| aChangeArg == "hatchcolor")
|
||||
{
|
||||
Quantity_Color aColor;
|
||||
Standard_Integer aNbParsed = ViewerTest::ParseColor (aNbChangeArgs - 1,
|
||||
aChangeArgs + 1,
|
||||
aColor);
|
||||
if (aNbParsed == 0)
|
||||
{
|
||||
std::cout << "Syntax error: need more arguments.\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
Graphic3d_MaterialAspect aMat = aClipPlane->CappingSectionStyle()->HatchMaterial();
|
||||
aMat.SetAmbientColor (aColor);
|
||||
aMat.SetDiffuseColor (aColor);
|
||||
aClipPlane->CappingSectionStyle()->SetHatchMaterial (aMat);
|
||||
anArgIter += aNbParsed;
|
||||
}
|
||||
|
||||
else if (aChangeArg == "-hatchscale"
|
||||
|| aChangeArg == "hatchscale")
|
||||
{
|
||||
const Handle(Graphic3d_TextureMap)& aHatchTexture = aClipPlane->CappingSectionStyle()->TextureHatch();
|
||||
|
||||
if (aHatchTexture.IsNull())
|
||||
{
|
||||
std::cout << "Error: no texture is set.\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (aNbChangeArgs < 3)
|
||||
{
|
||||
std::cout << "Syntax error: need more arguments.\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
Standard_ShortReal aSx = (Standard_ShortReal)Draw::Atof (aChangeArgs[1]);
|
||||
Standard_ShortReal aSy = (Standard_ShortReal)Draw::Atof (aChangeArgs[2]);
|
||||
aHatchTexture->GetParams()->SetScale (Graphic3d_Vec2 (aSx, aSy));
|
||||
anArgIter += 2;
|
||||
}
|
||||
else if (aChangeArg == "-hatchorigin"
|
||||
|| aChangeArg == "hatchorigin") // texture origin
|
||||
{
|
||||
const Handle(Graphic3d_TextureMap)& aHatchTexture = aClipPlane->CappingSectionStyle()->TextureHatch();
|
||||
|
||||
if (aHatchTexture.IsNull())
|
||||
{
|
||||
std::cout << "Error: no texture is set.\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (aNbChangeArgs < 3)
|
||||
{
|
||||
std::cout << "Syntax error: need more arguments.\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
Standard_ShortReal aTx = (Standard_ShortReal)Draw::Atof (aChangeArgs[1]);
|
||||
Standard_ShortReal aTy = (Standard_ShortReal)Draw::Atof (aChangeArgs[2]);
|
||||
|
||||
aHatchTexture->GetParams()->SetTranslation (Graphic3d_Vec2 (aTx, aTy));
|
||||
anArgIter += 2;
|
||||
}
|
||||
else if (aChangeArg == "-hatchrotate"
|
||||
|| aChangeArg == "hatchrotate") // texture rotation
|
||||
{
|
||||
const Handle(Graphic3d_TextureMap)& aHatchTexture = aClipPlane->CappingSectionStyle()->TextureHatch();
|
||||
|
||||
if (aHatchTexture.IsNull())
|
||||
{
|
||||
std::cout << "Error: no texture is set.\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (aNbChangeArgs < 2)
|
||||
{
|
||||
std::cout << "Syntax error: need more arguments.\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
Standard_ShortReal aRot = (Standard_ShortReal)Draw::Atof (aChangeArgs[1]);
|
||||
aHatchTexture->GetParams()->SetRotation (aRot);
|
||||
anArgIter += 1;
|
||||
}
|
||||
else if (aChangeArg == "-hatchzoompers"
|
||||
|| aChangeArg == "hatchzoompers")
|
||||
{
|
||||
if (aNbChangeArgs < 2)
|
||||
{
|
||||
std::cout << "Syntax error: need more arguments.\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (ViewerTest::ParseOnOff (aChangeArgs[1], toEnable))
|
||||
{
|
||||
aClipPlane->CappingSectionStyle()->SetHatchZoomPeristent (toEnable == Standard_True);
|
||||
anArgIter += 1;
|
||||
}
|
||||
}
|
||||
else if (aChangeArg == "-hatchrotatepers"
|
||||
|| aChangeArg == "hatchrotatepers")
|
||||
{
|
||||
if (aNbChangeArgs < 2)
|
||||
{
|
||||
std::cout << "Syntax error: need more arguments.\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (ViewerTest::ParseOnOff (aChangeArgs[1], toEnable))
|
||||
{
|
||||
aClipPlane->CappingSectionStyle()->SetHatchRotationPeristent (toEnable == Standard_True);
|
||||
anArgIter += 1;
|
||||
}
|
||||
}
|
||||
else if (aChangeArg == "-delete"
|
||||
|| aChangeArg == "delete")
|
||||
{
|
||||
@@ -11321,6 +11506,215 @@ static int VDumpSelectionImage (Draw_Interpretor& /*theDi*/,
|
||||
return 0;
|
||||
}
|
||||
|
||||
//===============================================================================================
|
||||
//function : VViewCube
|
||||
//purpose :
|
||||
//===============================================================================================
|
||||
static int VViewCube (Draw_Interpretor& theDi,
|
||||
Standard_Integer theArgsNb,
|
||||
const char** theArgVec)
|
||||
{
|
||||
if (theArgsNb < 2)
|
||||
{
|
||||
std::cout << "Syntax error: wrong number arguments for '" << theArgVec[0] << "'\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
const Handle(AIS_InteractiveContext)& aContext = ViewerTest::GetAISContext();
|
||||
const Handle(V3d_View)& aView = ViewerTest::CurrentView();
|
||||
if (aContext.IsNull() || aView.IsNull())
|
||||
{
|
||||
std::cout << "Error: no active view.\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
ViewerTest_AutoUpdater anUpdateTool (aContext, aView);
|
||||
Standard_Integer anArgIter = 1;
|
||||
for (; anArgIter < theArgsNb; ++anArgIter)
|
||||
{
|
||||
anUpdateTool.parseRedrawMode (theArgVec[anArgIter]);
|
||||
}
|
||||
|
||||
Handle(AIS_ViewCube) aViewCube;
|
||||
ViewerTest_CmdParser aCmd;
|
||||
aCmd.AddDescription ("vviewcube Name [options]. Commmand manages View Cube object:");
|
||||
aCmd.AddOption ("enable", "enables view cube");
|
||||
aCmd.AddOption ("disable", "disables view cube");
|
||||
aCmd.AddOption ("remove", "removes view cube presentation from context and view");
|
||||
aCmd.AddOption ("remove", "removes view cube presentation from context and view");
|
||||
aCmd.AddOption ("reset", "reset geomertical and visual attributes");
|
||||
aCmd.AddOption ("size", "... size - set size of View Cube");
|
||||
aCmd.AddOption ("adaptsize", " - adapt all another parameters to input size");
|
||||
aCmd.AddOption ("color", "... r g b - set color of View Cube ");
|
||||
aCmd.AddOption ("boxcolor", "... r g b - set box color of view cube");
|
||||
aCmd.AddOption ("arrowcolor", "... r g b - set arrow color of view cube");
|
||||
aCmd.AddOption ("textcolor", "... r g b - set side text color of view cube");
|
||||
aCmd.AddOption ("innercolor", "... r g b - set inner box color of view cube");
|
||||
aCmd.AddOption ("arrowangle", "... value - set pointer angle of arrows in radians");
|
||||
aCmd.AddOption ("arrowlength", "... value - set length of arrows");
|
||||
aCmd.AddOption ("arrowpadding", "... value - set padding between axis and arrows");
|
||||
aCmd.AddOption ("transparency", "... [0;1] - set transparency of object");
|
||||
aCmd.AddOption ("boxtransparency", "... [0;1] - set transparency of box in View Cube");
|
||||
aCmd.AddOption ("arrowtransparency", "... [0;1] - set transparency of arrows in View Cube");
|
||||
aCmd.AddOption ("font", "... string - set font name");
|
||||
aCmd.AddOption ("fontheight", "... value - set font height");
|
||||
aCmd.AddOption ("boxpadding", "... value - set padding between box sides");
|
||||
aCmd.AddOption ("axispadding", "... value - set padding between box and arrows");
|
||||
aCmd.AddOption ("cornerradius", "... value - set radius of side corners in [0;0.5] (0-50% of box side size)");
|
||||
aCmd.AddOption ("hideedges", " - hide edges of View Cube");
|
||||
aCmd.AddOption ("showedges", " - show edges of View Cube");
|
||||
aCmd.AddOption ("hidevertices", " - hide vertices ov View Cube");
|
||||
aCmd.AddOption ("showvertices", " - show vertices ov View Cube");
|
||||
aCmd.AddOption ("position", "... PixX PixY - 2D position of View Cube from top left corner");
|
||||
|
||||
aCmd.Parse (theArgsNb, theArgVec);
|
||||
|
||||
if (aCmd.HasOption ("help"))
|
||||
{
|
||||
theDi.PrintHelp (theArgVec[0]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Get current view cube entity
|
||||
aViewCube = ActiveViewCube();
|
||||
if (aViewCube.IsNull())
|
||||
{
|
||||
aViewCube = new AIS_ViewCube();
|
||||
MapOfViewCube().Bind (aView, aViewCube);
|
||||
aViewCube->SetAutoTransform (Standard_True);
|
||||
}
|
||||
|
||||
if (aCmd.HasOption ("color"))
|
||||
{
|
||||
aViewCube->SetColor (Quantity_Color (aCmd.ArgVec3f ("color")));
|
||||
}
|
||||
if (aCmd.HasOption ("boxcolor"))
|
||||
{
|
||||
aViewCube->SetBoxColor (Quantity_Color (aCmd.ArgVec3f ("boxcolor")));
|
||||
}
|
||||
if (aCmd.HasOption ("arrowcolor"))
|
||||
{
|
||||
aViewCube->SetArrowColor (Quantity_Color (aCmd.ArgVec3f ("arrowcolor")));
|
||||
}
|
||||
if (aCmd.HasOption ("textcolor"))
|
||||
{
|
||||
aViewCube->SetTextColor (Quantity_Color (aCmd.ArgVec3f ("textcolor")));
|
||||
}
|
||||
if (aCmd.HasOption ("innercolor"))
|
||||
{
|
||||
aViewCube->SetInnerColor (Quantity_Color (aCmd.ArgVec3f ("innercolor")));
|
||||
}
|
||||
if (aCmd.HasOption ("arrowangle"))
|
||||
{
|
||||
aViewCube->SetArrowAngle (aCmd.ArgDouble ("arrowangle") * M_PI / 180.0);
|
||||
}
|
||||
if (aCmd.HasOption ("arrowlength"))
|
||||
{
|
||||
aViewCube->SetArrowLength (aCmd.ArgDouble ("arrowlength"));
|
||||
}
|
||||
if (aCmd.HasOption ("arrowpadding"))
|
||||
{
|
||||
aViewCube->SetArrowPadding (aCmd.ArgDouble ("arrowpadding"));
|
||||
}
|
||||
if (aCmd.HasOption ("transparency"))
|
||||
{
|
||||
aViewCube->SetTransparency (aCmd.ArgDouble ("transparency"));
|
||||
}
|
||||
if (aCmd.HasOption ("boxtransparency"))
|
||||
{
|
||||
aViewCube->SetBoxTransparency (aCmd.ArgDouble ("boxtransparency"));
|
||||
}
|
||||
if (aCmd.HasOption ("arrowtransparency"))
|
||||
{
|
||||
aViewCube->SetArrowTransparency (aCmd.ArgDouble ("arrowtransparency"));
|
||||
}
|
||||
if (aCmd.HasOption ("font"))
|
||||
{
|
||||
aViewCube->SetFont (aCmd.Arg ("font", 0).c_str());
|
||||
}
|
||||
if (aCmd.HasOption ("fontheight"))
|
||||
{
|
||||
aViewCube->SetFontHeight (aCmd.ArgDouble ("fontheight", 0));
|
||||
}
|
||||
if (aCmd.HasOption ("boxpadding"))
|
||||
{
|
||||
aViewCube->SetBoxPadding (aCmd.ArgDouble ("boxpadding"));
|
||||
}
|
||||
if (aCmd.HasOption ("axispadding"))
|
||||
{
|
||||
aViewCube->SetAxisPadding (aCmd.ArgDouble ("axispadding"));
|
||||
}
|
||||
if (aCmd.HasOption ("cornerradius"))
|
||||
{
|
||||
aViewCube->SetCornerRadius (aCmd.ArgDouble ("cornerradius"));
|
||||
}
|
||||
if (aCmd.HasOption ("hideedges"))
|
||||
{
|
||||
aViewCube->SetDrawEdges (Standard_False);
|
||||
}
|
||||
if (aCmd.HasOption ("showedges"))
|
||||
{
|
||||
aViewCube->SetDrawEdges (Standard_True);
|
||||
}
|
||||
if (aCmd.HasOption ("hidevertices"))
|
||||
{
|
||||
aViewCube->SetDrawVertices (Standard_False);
|
||||
}
|
||||
if (aCmd.HasOption ("showvertices"))
|
||||
{
|
||||
aViewCube->SetDrawVertices (Standard_True);
|
||||
}
|
||||
if (aCmd.HasOption ("position", 2))
|
||||
{
|
||||
aViewCube->SetPosition (Graphic3d_Vec2i (aCmd.ArgInt ("position", 0), aCmd.ArgInt ("position", 1)),
|
||||
aView);
|
||||
}
|
||||
if (aCmd.HasOption ("size"))
|
||||
{
|
||||
aViewCube->SetSize (aCmd.ArgDouble ("size", 0), aCmd.HasOption ("adaptsize"));
|
||||
}
|
||||
if (aCmd.HasOption ("reset"))
|
||||
{
|
||||
aViewCube->Reset();
|
||||
}
|
||||
|
||||
// Enable View Cube for current view
|
||||
if (aCmd.HasOption ("enable") && !aContext->IsDisplayed (aViewCube))
|
||||
{
|
||||
aContext->MainSelector()->SetPickClosest (Standard_False);
|
||||
if (aViewCube->View().IsNull())
|
||||
{
|
||||
aViewCube->SetView (aView);
|
||||
aViewCube->AddTo (aContext, aView);
|
||||
}
|
||||
else
|
||||
{
|
||||
aViewCube->Show();
|
||||
}
|
||||
}
|
||||
else if (aCmd.HasOption ("disable") && aContext->IsDisplayed (aViewCube))
|
||||
{
|
||||
ViewerTest::GetAISContext()->MainSelector()->SetPickClosest (Standard_True);
|
||||
aViewCube->Hide();
|
||||
}
|
||||
else if (aCmd.HasOption ("remove") && aContext->IsDisplayed (aViewCube))
|
||||
{
|
||||
ViewerTest::GetAISContext()->MainSelector()->SetPickClosest (Standard_True);
|
||||
MapOfViewCube().UnBind (aViewCube->View());
|
||||
aContext->Remove (aViewCube, Standard_False);
|
||||
}
|
||||
else
|
||||
{
|
||||
TColStd_ListOfInteger aModes;
|
||||
aViewCube->ToBeUpdated (aModes);
|
||||
if (!aModes.IsEmpty())
|
||||
{
|
||||
aContext->Redisplay (aViewCube, Standard_False);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
//=======================================================================
|
||||
//function : ViewerCommands
|
||||
//purpose :
|
||||
@@ -11835,11 +12229,18 @@ void ViewerTest::ViewerCommands(Draw_Interpretor& theCommands)
|
||||
"\n\t\t: [-set|-unset [objects|views]]"
|
||||
"\n\t\t: [-maxPlanes]"
|
||||
"\n\t\t: [-capping {0|1}]"
|
||||
"\n\t\t: [-color R G B] [-hatch {on|off|ID}]"
|
||||
"\n\t\t: [-texName Texture] [-texScale SX SY] [-texOrigin TX TY]"
|
||||
"\n\t\t: [-texRotate Angle]"
|
||||
"\n\t\t: [-overrideAspect {0|1}]"
|
||||
"\n\t\t: [-color R G B]"
|
||||
"\n\t\t: [-texture Texture] [-texScale SX SY]"
|
||||
"\n\t\t: [-texOrigin TX TY] [-texRotate Angle]"
|
||||
"\n\t\t: [-hatch {on|off}] [-hatchStipple mask]"
|
||||
"\n\t\t: [-hatchColor R G B] [-hatchTexture texture]"
|
||||
"\n\t\t: [-hatchScale SX SY] [-hatchOrigin TX TY]"
|
||||
"\n\t\t: [-hatchRotate Angle]"
|
||||
"\n\t\t: [-hatchZoomPers {0|1}]"
|
||||
"\n\t\t: [-hatchRotatePers {0|1}]"
|
||||
"\n\t\t: [-useObjMaterial {0|1}] [-useObjTexture {0|1}]"
|
||||
"\n\t\t: [-useObjShader {0|1}]"
|
||||
"\n\t\t: [-useObjShader {0|1}]"
|
||||
"\n\t\t: Clipping planes management:"
|
||||
"\n\t\t: -maxPlanes print plane limit for view"
|
||||
"\n\t\t: -delete delete plane with given name"
|
||||
@@ -11850,12 +12251,21 @@ void ViewerTest::ViewerCommands(Draw_Interpretor& theCommands)
|
||||
"\n\t\t: -clone SourcePlane NewPlane clone the plane definition."
|
||||
"\n\t\t: Capping options:"
|
||||
"\n\t\t: -capping {off|on|0|1} turn capping on/off"
|
||||
"\n\t\t: -overrideAspect override presentation aspect (if defined)"
|
||||
"\n\t\t: -color R G B set capping color"
|
||||
"\n\t\t: -texName Texture set capping texture"
|
||||
"\n\t\t: -texture Texture set capping texture"
|
||||
"\n\t\t: -texScale SX SY set capping tex scale"
|
||||
"\n\t\t: -texOrigin TX TY set capping tex origin"
|
||||
"\n\t\t: -texRotate Angle set capping tex rotation"
|
||||
"\n\t\t: -hatch {on|off|ID} set capping hatching mask"
|
||||
"\n\t\t: -hatch {on|off} turn on/off hatch style on capping"
|
||||
"\n\t\t: -hatchStipple ID set stipple mask for drawing hatch"
|
||||
"\n\t\t: -hatchColor R G B set color for hatch material"
|
||||
"\n\t\t: -hatchTexture Texture set texture (semi-opaque) for drawing hatch"
|
||||
"\n\t\t: -hatchScale SX SY set hatch texture scale"
|
||||
"\n\t\t: -hatchOrigin TX TY set hatch texture origin"
|
||||
"\n\t\t: -hatchRotate Angle set hatch texture rotation"
|
||||
"\n\t\t: -hatchZoomPers allow hatch tetxure mapping to be constant when zooming"
|
||||
"\n\t\t: -hatchRotatePers allow hatch tetxure mapping to be constant when rotating"
|
||||
"\n\t\t: -useObjMaterial {off|on|0|1} use material of clipped object"
|
||||
"\n\t\t: -useObjTexture {off|on|0|1} use texture of clipped object"
|
||||
"\n\t\t: -useObjShader {off|on|0|1} use shader program of object",
|
||||
@@ -12000,4 +12410,39 @@ void ViewerTest::ViewerCommands(Draw_Interpretor& theCommands)
|
||||
"vprogressive",
|
||||
__FILE__, VProgressiveMode, group);
|
||||
#endif
|
||||
|
||||
theCommands.Add ("vviewcube",
|
||||
"\n vviewcube [-enable|-disable]"
|
||||
"\n Warning: after end pf test please call vviewcube -remove, otherwise View Cube will hold down active view from closing"
|
||||
"\n tool to create and manage interactive view manipualtion object for active view."
|
||||
"\n Options: "
|
||||
"\n '-enable|disable' display/erase view cube with defined visual options"
|
||||
"\n '-reset reset geomertical and visual attributes'"
|
||||
"\n '-size Value' adjust position when attaching"
|
||||
"\n '-adaptSize' call with -size to adapt all part to size of 3D box"
|
||||
"\n 'remove' removes view cube presentation from context and view"
|
||||
"\n 'size Size' set size of View Cube"
|
||||
"\n 'color R G B' set color of View Cube in limits [0;1]"
|
||||
"\n 'boxcolor R G B' set box color of view cube in limits [0;1]"
|
||||
"\n 'arrowcolor R G B' set arrow color of view cube in limits [0;1]"
|
||||
"\n 'textcolor R G B' set color of side text of view cube in limits [0;1]"
|
||||
"\n 'innercolor R G B' set inner box color of view cube in limits [0;1]"
|
||||
"\n 'arrowangle Value' set pointer angle of arrows in radians"
|
||||
"\n 'arrowlength Value' set length of arrows"
|
||||
"\n 'arrowpadding Value' set padding between axis and arrows"
|
||||
"\n 'transparency [0;1]' set transparency of object"
|
||||
"\n 'boxtransparency [0;1]' set transparency of box in View Cube"
|
||||
"\n 'arrowtransparency [0;1]' set transparency of arrows in View Cube"
|
||||
"\n 'font Name' set font name"
|
||||
"\n 'fontheight value' set font height"
|
||||
"\n 'boxpadding Value' set padding between box sides"
|
||||
"\n 'axispadding Value' set padding between box and arrows"
|
||||
"\n 'cornerradius Value' set radius of corners of sides"
|
||||
"\n 'hideedges' hide edges of View Cube"
|
||||
"\n 'showedges' show edges of View Cube"
|
||||
"\n 'hidevertices' hide vertices ov View Cube"
|
||||
"\n 'showvertices' show vertices ov View Cube"
|
||||
"\n 'position XPix YPix' 2D position of View Cube from top left corner",
|
||||
__FILE__, VViewCube, group);
|
||||
|
||||
}
|
||||
|
@@ -631,7 +631,15 @@ VrmlData_ErrorStatus VrmlData_ArrayVec3d::ReadArray
|
||||
// Read the body of the data node (list of triplets)
|
||||
if (OK(aStatus) && OK(aStatus, VrmlData_Scene::ReadLine(theBuffer))) {
|
||||
if (theBuffer.LinePtr[0] != '[') // opening bracket
|
||||
aStatus = VrmlData_VrmlFormatError;
|
||||
{
|
||||
// Handle case when brackets are ommited for single element of array
|
||||
gp_XYZ anXYZ;
|
||||
// Read three numbers (XYZ value)
|
||||
if (!OK(aStatus, Scene().ReadXYZ(theBuffer, anXYZ,
|
||||
isScale, Standard_False)))
|
||||
aStatus = VrmlData_VrmlFormatError;
|
||||
vecValues.Append(anXYZ);
|
||||
}
|
||||
else {
|
||||
theBuffer.LinePtr++;
|
||||
for(;;) {
|
||||
|
@@ -203,6 +203,10 @@ VrmlData_ErrorStatus VrmlData_Group::Read (VrmlData_InBuffer& theBuffer)
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (VRMLDATA_LCOMPARE(theBuffer.LinePtr, "collide")) {
|
||||
TCollection_AsciiString aDummy;
|
||||
aStatus = Scene().ReadWord (theBuffer, aDummy);
|
||||
}
|
||||
else if (VRMLDATA_LCOMPARE (theBuffer.LinePtr, "Separator") ||
|
||||
VRMLDATA_LCOMPARE (theBuffer.LinePtr, "Switch")) {
|
||||
Standard_Boolean isBracketed (Standard_False);
|
||||
|
@@ -29,6 +29,26 @@
|
||||
#include <Poly.hxx>
|
||||
#include <TShort_HArray1OfShortReal.hxx>
|
||||
|
||||
#include <TopoDS_Face.hxx>
|
||||
#include <BRep_Tool.hxx>
|
||||
#include <TopoDS_Vertex.hxx>
|
||||
#include <TopoDS_Wire.hxx>
|
||||
#include <BRepBuilderAPI_Sewing.hxx>
|
||||
#include <TopoDS_Compound.hxx>
|
||||
#include <BRep_Builder.hxx>
|
||||
#include <TopExp_Explorer.hxx>
|
||||
#include <TopoDS.hxx>
|
||||
#include <BRepBuilderAPI_CellFilter.hxx>
|
||||
//#include <StlMesh_Mesh.hxx>
|
||||
//#include <StlMesh_MeshExplorer.hxx>
|
||||
#include <BRepBuilderAPI_MakeVertex.hxx>
|
||||
#include <BRepBuilderAPI_MakePolygon.hxx>
|
||||
#include <BRepBuilderAPI_MakeFace.hxx>
|
||||
#include <StlAPI.hxx>
|
||||
#include <ShapeUpgrade_UnifySameDomain.hxx>
|
||||
#include <BRepClass3d_SolidClassifier.hxx>
|
||||
#include <ShapeUpgrade_CombineToCylinder.hxx>
|
||||
|
||||
IMPLEMENT_STANDARD_RTTIEXT(VrmlData_IndexedFaceSet,VrmlData_Faceted)
|
||||
|
||||
#ifdef _MSC_VER
|
||||
@@ -36,9 +56,240 @@ IMPLEMENT_STANDARD_RTTIEXT(VrmlData_IndexedFaceSet,VrmlData_Faceted)
|
||||
#pragma warning (disable:4996)
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
//// Auxiliary tools
|
||||
//namespace
|
||||
//{
|
||||
// // Tool to get triangles from triangulation taking into account face
|
||||
// // orientation and location
|
||||
// class TriangleAccessor
|
||||
// {
|
||||
// public:
|
||||
// TriangleAccessor (const TopoDS_Face& aFace)
|
||||
// {
|
||||
// TopLoc_Location aLoc;
|
||||
// myPoly = BRep_Tool::Triangulation (aFace, aLoc);
|
||||
// myTrsf = aLoc.Transformation();
|
||||
// myNbTriangles = (myPoly.IsNull() ? 0 : myPoly->Triangles().Length());
|
||||
// myInvert = (aFace.Orientation() == TopAbs_REVERSED);
|
||||
// if (myTrsf.IsNegative())
|
||||
// myInvert = ! myInvert;
|
||||
// }
|
||||
//
|
||||
// int NbTriangles () const { return myNbTriangles; }
|
||||
//
|
||||
// // get i-th triangle and outward normal
|
||||
// void GetTriangle (int iTri, gp_Vec &theNormal, gp_Pnt &thePnt1, gp_Pnt &thePnt2, gp_Pnt &thePnt3)
|
||||
// {
|
||||
// // get positions of nodes
|
||||
// int iNode1, iNode2, iNode3;
|
||||
// myPoly->Triangles()(iTri).Get (iNode1, iNode2, iNode3);
|
||||
// thePnt1 = myPoly->Nodes()(iNode1);
|
||||
// thePnt2 = myPoly->Nodes()(myInvert ? iNode3 : iNode2);
|
||||
// thePnt3 = myPoly->Nodes()(myInvert ? iNode2 : iNode3);
|
||||
//
|
||||
// // apply transormation if not identity
|
||||
// if (myTrsf.Form() != gp_Identity)
|
||||
// {
|
||||
// thePnt1.Transform (myTrsf);
|
||||
// thePnt2.Transform (myTrsf);
|
||||
// thePnt3.Transform (myTrsf);
|
||||
// }
|
||||
//
|
||||
// // calculate normal
|
||||
// theNormal = (thePnt2.XYZ() - thePnt1.XYZ()) ^ (thePnt3.XYZ() - thePnt1.XYZ());
|
||||
// Standard_Real aNorm = theNormal.Magnitude();
|
||||
// if (aNorm > gp::Resolution())
|
||||
// theNormal /= aNorm;
|
||||
// }
|
||||
//
|
||||
// private:
|
||||
// Handle(Poly_Triangulation) myPoly;
|
||||
// gp_Trsf myTrsf;
|
||||
// int myNbTriangles;
|
||||
// bool myInvert;
|
||||
// };
|
||||
//
|
||||
// // convert to float and, on big-endian platform, to little-endian representation
|
||||
// inline float convertFloat (Standard_Real aValue)
|
||||
// {
|
||||
//#ifdef OCCT_BINARY_FILE_DO_INVERSE
|
||||
// return OSD_BinaryFile::InverseShortReal ((float)aValue);
|
||||
//#else
|
||||
// return (float)aValue;
|
||||
//#endif
|
||||
// }
|
||||
//
|
||||
// // A static method adding nodes to a mesh and keeping coincident (sharing) nodes.
|
||||
// static Standard_Integer AddVertex(Handle(StlMesh_Mesh)& mesh,
|
||||
// BRepBuilderAPI_CellFilter& filter,
|
||||
// BRepBuilderAPI_VertexInspector& inspector,
|
||||
// const gp_XYZ& p)
|
||||
// {
|
||||
// Standard_Integer index;
|
||||
// inspector.SetCurrent(p);
|
||||
// gp_XYZ minp = inspector.Shift(p, -Precision::Confusion());
|
||||
// gp_XYZ maxp = inspector.Shift(p, +Precision::Confusion());
|
||||
// filter.Inspect(minp, maxp, inspector);
|
||||
// else
|
||||
// const TColStd_ListOfInteger& indices = inspector.ResInd();
|
||||
// if (indices.IsEmpty() == Standard_False)
|
||||
// {
|
||||
// index = indices.First(); // it should be only one
|
||||
// inspector.ClearResList();
|
||||
// }
|
||||
// {
|
||||
// index = mesh->AddVertex(p.X(), p.Y(), p.Z());
|
||||
// filter.Add(index, p);
|
||||
// inspector.Add(p);
|
||||
// }
|
||||
// return index;
|
||||
// }
|
||||
//
|
||||
// void createFromMesh(Handle(TopoDS_TShape)& theShapeWithMesh)
|
||||
// {
|
||||
// TopoDS_Shape aShape;
|
||||
// //aShape.Orientation(TopAbs_FORWARD);
|
||||
//
|
||||
// aShape.TShape(theShapeWithMesh);
|
||||
// if (aShape.IsNull())
|
||||
// return;
|
||||
//
|
||||
// // Write to STL and then read again to get BRep model (vrml fills only triangulation)
|
||||
// //StlAPI::Write(aShape, "D:/Temp/tempfile");
|
||||
// //StlAPI::Read(aShape, "D:/Temp/tempfile");
|
||||
//
|
||||
// gp_XYZ p1, p2, p3;
|
||||
// TopoDS_Vertex Vertex1, Vertex2, Vertex3;
|
||||
// TopoDS_Face AktFace;
|
||||
// TopoDS_Wire AktWire;
|
||||
// BRepBuilderAPI_Sewing aSewingTool;
|
||||
// Standard_Real x1, y1, z1;
|
||||
// Standard_Real x2, y2, z2;
|
||||
// Standard_Real x3, y3, z3;
|
||||
// Standard_Integer i1,i2,i3;
|
||||
//
|
||||
// aSewingTool.Init(1.0e-06,Standard_True);
|
||||
//
|
||||
// TopoDS_Compound aComp;
|
||||
// BRep_Builder BuildTool;
|
||||
// BuildTool.MakeCompound( aComp );
|
||||
//
|
||||
// Handle(StlMesh_Mesh) aSTLMesh = new StlMesh_Mesh();
|
||||
// aSTLMesh->AddDomain();
|
||||
//
|
||||
// // Filter unique vertices to share the nodes of the mesh.
|
||||
// BRepBuilderAPI_CellFilter uniqueVertices(Precision::Confusion());
|
||||
// BRepBuilderAPI_VertexInspector inspector(Precision::Confusion());
|
||||
//
|
||||
// // Read mesh
|
||||
// for (TopExp_Explorer exp (aShape, TopAbs_FACE); exp.More(); exp.Next())
|
||||
// {
|
||||
// TriangleAccessor aTool (TopoDS::Face (exp.Current()));
|
||||
// for (int iTri = 1; iTri <= aTool.NbTriangles(); iTri++)
|
||||
// {
|
||||
// gp_Vec aNorm;
|
||||
// gp_Pnt aPnt1, aPnt2, aPnt3;
|
||||
// aTool.GetTriangle(iTri, aNorm, aPnt1, aPnt2, aPnt3);
|
||||
//
|
||||
// i1 = AddVertex(aSTLMesh, uniqueVertices, inspector, aPnt1.XYZ());
|
||||
// i2 = AddVertex(aSTLMesh, uniqueVertices, inspector, aPnt2.XYZ());
|
||||
// i3 = AddVertex(aSTLMesh, uniqueVertices, inspector, aPnt3.XYZ());
|
||||
// aSTLMesh->AddTriangle(i1, i2, i3, aNorm.X(), aNorm.Y(), aNorm.Z());
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// StlMesh_MeshExplorer aMExp (aSTLMesh);
|
||||
// Standard_Integer NumberDomains = aSTLMesh->NbDomains();
|
||||
// Standard_Integer iND;
|
||||
// for (iND=1;iND<=NumberDomains;iND++)
|
||||
// {
|
||||
// for (aMExp.InitTriangle (iND); aMExp.MoreTriangle (); aMExp.NextTriangle ())
|
||||
// {
|
||||
// aMExp.TriangleVertices (x1,y1,z1,x2,y2,z2,x3,y3,z3);
|
||||
// p1.SetCoord(x1,y1,z1);
|
||||
// p2.SetCoord(x2,y2,z2);
|
||||
// p3.SetCoord(x3,y3,z3);
|
||||
//
|
||||
// if ((!(p1.IsEqual(p2,0.0))) && (!(p1.IsEqual(p3,0.0))))
|
||||
// {
|
||||
// Vertex1 = BRepBuilderAPI_MakeVertex(p1);
|
||||
// Vertex2 = BRepBuilderAPI_MakeVertex(p2);
|
||||
// Vertex3 = BRepBuilderAPI_MakeVertex(p3);
|
||||
//
|
||||
// AktWire = BRepBuilderAPI_MakePolygon( Vertex1, Vertex2, Vertex3, Standard_True);
|
||||
//
|
||||
// if( !AktWire.IsNull())
|
||||
// {
|
||||
// AktFace = BRepBuilderAPI_MakeFace( AktWire);
|
||||
// if(!AktFace.IsNull())
|
||||
// BuildTool.Add( aComp, AktFace );
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// aSTLMesh->Clear();
|
||||
//
|
||||
// aSewingTool.Init();
|
||||
// aSewingTool.Load( aComp );
|
||||
// aSewingTool.Perform();
|
||||
// aShape = aSewingTool.SewedShape();
|
||||
// if ( aShape.IsNull() )
|
||||
// aShape = aComp;
|
||||
//
|
||||
// ShapeUpgrade_UnifySameDomain anUSD(aShape);
|
||||
// anUSD.SetLinearTolerance(1e-5);
|
||||
// anUSD.Build();
|
||||
// aShape = anUSD.Shape();
|
||||
//
|
||||
// if (aShape.ShapeType() == TopAbs_SHELL && TopoDS::Shell(aShape).Closed())
|
||||
// {
|
||||
// TopoDS_Solid aSolid;
|
||||
// TopoDS_Shell aShell = TopoDS::Shell (aShape);
|
||||
// if (!aShell.Free ()) {
|
||||
// aShell.Free(Standard_True);
|
||||
// }
|
||||
// BRep_Builder aBuilder;
|
||||
// aBuilder.MakeSolid (aSolid);
|
||||
// aBuilder.Add (aSolid, aShell);
|
||||
//
|
||||
// Standard_Boolean isOk = Standard_True;
|
||||
// try {
|
||||
// OCC_CATCH_SIGNALS
|
||||
// BRepClass3d_SolidClassifier bsc3d (aSolid);
|
||||
// Standard_Real t = Precision::Confusion();
|
||||
// bsc3d.PerformInfinitePoint(t);
|
||||
//
|
||||
// if (bsc3d.State() == TopAbs_IN) {
|
||||
// TopoDS_Solid aSolid2;
|
||||
// aBuilder.MakeSolid (aSolid2);
|
||||
// aShell.Reverse();
|
||||
// aBuilder.Add (aSolid2, aShell);
|
||||
// aSolid = aSolid2;
|
||||
// }
|
||||
// }
|
||||
// catch (Standard_Failure) { isOk = Standard_False; }
|
||||
// if (isOk) aShape = aSolid;
|
||||
// }
|
||||
//
|
||||
// // Trying to apply "Combine to Cylinder"
|
||||
//
|
||||
// //ShapeUpgrade_CombineToCylinder cmb2Cyl;
|
||||
// //Standard_Boolean isOk = Standard_True;
|
||||
// //try {
|
||||
// // OCC_CATCH_SIGNALS
|
||||
// // cmb2Cyl.SetShape(aShape);
|
||||
// // cmb2Cyl.SetAngularTolerance(20);
|
||||
// // cmb2Cyl.SetLinearTolerance(3);
|
||||
// // cmb2Cyl.Build();
|
||||
// //}
|
||||
// //catch (Standard_Failure) { isOk = Standard_False; }
|
||||
// //if (isOk && cmb2Cyl.IsDone())
|
||||
// // aShape = cmb2Cyl.Shape();
|
||||
//
|
||||
// theShapeWithMesh = aShape.TShape();
|
||||
// }
|
||||
//}
|
||||
//
|
||||
//=======================================================================
|
||||
//function : readData
|
||||
//purpose :
|
||||
@@ -210,6 +461,7 @@ const Handle(TopoDS_TShape)& VrmlData_IndexedFaceSet::TShape ()
|
||||
|
||||
myIsModified = Standard_False;
|
||||
}
|
||||
//createFromMesh(myTShape);
|
||||
return myTShape;
|
||||
}
|
||||
|
||||
|
@@ -33,6 +33,10 @@ IMPLEMENT_STANDARD_RTTIEXT(VrmlData_IndexedLineSet,VrmlData_Geometry)
|
||||
#pragma warning (disable:4996)
|
||||
#endif
|
||||
|
||||
namespace
|
||||
{
|
||||
static Handle(TopoDS_TShape) THE_NULL_SHAPE;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : GetColor
|
||||
@@ -55,34 +59,34 @@ Quantity_Color VrmlData_IndexedLineSet::GetColor
|
||||
|
||||
const Handle(TopoDS_TShape)& VrmlData_IndexedLineSet::TShape ()
|
||||
{
|
||||
if (myNbPolygons == 0)
|
||||
myTShape.Nullify();
|
||||
else if (myIsModified) {
|
||||
Standard_Integer i;
|
||||
BRep_Builder aBuilder;
|
||||
const gp_XYZ * arrNodes = myCoords->Values();
|
||||
//if (myNbPolygons == 0)
|
||||
// myTShape.Nullify();
|
||||
//else if (myIsModified) {
|
||||
// Standard_Integer i;
|
||||
// BRep_Builder aBuilder;
|
||||
// const gp_XYZ * arrNodes = myCoords->Values();
|
||||
|
||||
// Create the Wire
|
||||
TopoDS_Wire aWire;
|
||||
aBuilder.MakeWire(aWire);
|
||||
for (i = 0; i < (int)myNbPolygons; i++) {
|
||||
const Standard_Integer * arrIndice;
|
||||
const Standard_Integer nNodes = Polygon(i, arrIndice);
|
||||
TColgp_Array1OfPnt arrPoint (1, nNodes);
|
||||
TColStd_Array1OfReal arrParam (1, nNodes);
|
||||
for (Standard_Integer j = 0; j < nNodes; j++) {
|
||||
arrPoint(j+1).SetXYZ (arrNodes[arrIndice[j]]);
|
||||
arrParam(j+1) = j;
|
||||
}
|
||||
const Handle(Poly_Polygon3D) aPolyPolygon =
|
||||
new Poly_Polygon3D (arrPoint, arrParam);
|
||||
TopoDS_Edge anEdge;
|
||||
aBuilder.MakeEdge (anEdge, aPolyPolygon);
|
||||
aBuilder.Add (aWire, anEdge);
|
||||
}
|
||||
myTShape = aWire.TShape();
|
||||
}
|
||||
return myTShape;
|
||||
// // Create the Wire
|
||||
// TopoDS_Wire aWire;
|
||||
// aBuilder.MakeWire(aWire);
|
||||
// for (i = 0; i < (int)myNbPolygons; i++) {
|
||||
// const Standard_Integer * arrIndice;
|
||||
// const Standard_Integer nNodes = Polygon(i, arrIndice);
|
||||
// TColgp_Array1OfPnt arrPoint (1, nNodes);
|
||||
// TColStd_Array1OfReal arrParam (1, nNodes);
|
||||
// for (Standard_Integer j = 0; j < nNodes; j++) {
|
||||
// arrPoint(j+1).SetXYZ (arrNodes[arrIndice[j]]);
|
||||
// arrParam(j+1) = j;
|
||||
// }
|
||||
// const Handle(Poly_Polygon3D) aPolyPolygon =
|
||||
// new Poly_Polygon3D (arrPoint, arrParam);
|
||||
// TopoDS_Edge anEdge;
|
||||
// aBuilder.MakeEdge (anEdge, aPolyPolygon);
|
||||
// aBuilder.Add (aWire, anEdge);
|
||||
// }
|
||||
// myTShape = aWire.TShape();
|
||||
//}
|
||||
return THE_NULL_SHAPE;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
|
@@ -497,6 +497,9 @@ VrmlData_ErrorStatus VrmlData_Scene::createNode
|
||||
else if (VRMLDATA_LCOMPARE(theBuffer.LinePtr, "Separator"))
|
||||
aNode = new VrmlData_Group (* this, strName,
|
||||
Standard_False);
|
||||
else if (VRMLDATA_LCOMPARE(theBuffer.LinePtr, "Collision"))
|
||||
aNode = new VrmlData_Group (* this, strName,
|
||||
Standard_False);
|
||||
else if (VRMLDATA_LCOMPARE(theBuffer.LinePtr, "Switch"))
|
||||
aNode = new VrmlData_Group (* this, strName,
|
||||
Standard_False);
|
||||
|
@@ -65,3 +65,8 @@ XCAFDoc_ViewTool.cxx
|
||||
XCAFDoc_ViewTool.hxx
|
||||
XCAFDoc_Volume.cxx
|
||||
XCAFDoc_Volume.hxx
|
||||
XCAFDoc_Animation.cxx
|
||||
XCAFDoc_Animation.hxx
|
||||
XCAFDoc_AnimationTool.cxx
|
||||
XCAFDoc_AnimationTool.hxx
|
||||
|
||||
|
@@ -251,13 +251,24 @@ Standard_GUID XCAFDoc::ViewRefPlaneGUID()
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : ViewRefPlaneGUID
|
||||
//function : ViewRefNoteGUID
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
|
||||
Standard_GUID XCAFDoc::ViewRefNoteGUID()
|
||||
{
|
||||
static Standard_GUID ID("C814ACC6-43AC-4812-9B2A-4E9A2A549354");
|
||||
static Standard_GUID ID("efd213e2-6dfd-11d4-b9c8-0060b0ee281b");
|
||||
return ID;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : ViewRefEnabledShapesGUID
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
|
||||
Standard_GUID XCAFDoc::ViewRefEnabledShapesGUID()
|
||||
{
|
||||
static Standard_GUID ID("efd213e4-6dfd-11d4-b9c8-0060b0ee281b");
|
||||
return ID;
|
||||
}
|
||||
|
||||
@@ -282,3 +293,23 @@ Standard_GUID XCAFDoc::LockGUID()
|
||||
static Standard_GUID ID("efd213eb-6dfd-11d4-b9c8-0060b0ee281b");
|
||||
return ID;
|
||||
}
|
||||
//=======================================================================
|
||||
//function : ViewRefEnabledShapesGUID
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
|
||||
Standard_GUID XCAFDoc::ClipPlaneCappingRefGUID()
|
||||
{
|
||||
static Standard_GUID ID("50976BC9-A2B0-497C-9A66-443FB8703DAD");
|
||||
return ID;
|
||||
}
|
||||
//=======================================================================
|
||||
//function : LockGUID
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
|
||||
Standard_GUID XCAFDoc::ClipPlaneVisibleRefGUID()
|
||||
{
|
||||
static Standard_GUID ID("279E76D5-4EFF-4F48-81D5-01CA307A5634");
|
||||
return ID;
|
||||
}
|
||||
|
@@ -120,9 +120,20 @@ public:
|
||||
|
||||
//! Return GUIDs for TreeNode representing specified types of View
|
||||
Standard_EXPORT static Standard_GUID ViewRefPlaneGUID();
|
||||
|
||||
//! Return GUIDs for GraphNode representing specified types of View
|
||||
|
||||
//! Return GUIDs for TreeNode representing specified types of View
|
||||
Standard_EXPORT static Standard_GUID ViewRefNoteGUID();
|
||||
|
||||
//! Return GUIDs for TreeNode representing specified types of View
|
||||
Standard_EXPORT static Standard_GUID ViewRefEnabledShapesGUID();
|
||||
|
||||
//! Return GUIDs for clipping plane capping
|
||||
Standard_EXPORT static Standard_GUID ClipPlaneCappingRefGUID();
|
||||
|
||||
//! Return GUIDs for clipping plane visibility
|
||||
Standard_EXPORT static Standard_GUID ClipPlaneVisibleRefGUID();
|
||||
|
||||
//! Return GUIDs for GraphNode representing specified types of View
|
||||
Standard_EXPORT static Standard_GUID ViewRefAnnotationGUID();
|
||||
|
||||
//! Returns GUID for UAttribute identifying lock flag
|
||||
|
214
src/XCAFDoc/XCAFDoc_Animation.cxx
Normal file
214
src/XCAFDoc/XCAFDoc_Animation.cxx
Normal file
@@ -0,0 +1,214 @@
|
||||
// Created on: 2017-10-02
|
||||
// Created by: Elena MOZOKHINA
|
||||
// Copyright (c) 2016 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 <Standard_GUID.hxx>
|
||||
#include <Standard_Type.hxx>
|
||||
#include <TCollection_HAsciiString.hxx>
|
||||
#include <TDF_Attribute.hxx>
|
||||
#include <TDF_Label.hxx>
|
||||
#include <TDF_RelocationTable.hxx>
|
||||
#include <XCAFDoc_Animation.hxx>
|
||||
|
||||
#include <TColStd_HArray1OfByte.hxx>
|
||||
|
||||
IMPLEMENT_STANDARD_RTTIEXT(XCAFDoc_Animation, TDF_Attribute)
|
||||
|
||||
//=======================================================================
|
||||
//function : XCAFDoc_Animation
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
XCAFDoc_Animation::XCAFDoc_Animation()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
//=======================================================================
|
||||
//function : GetID
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
|
||||
const Standard_GUID& XCAFDoc_Animation::GetID()
|
||||
{
|
||||
static Standard_GUID MatID("431A3BB7-7113-45C4-8653-AED7CC0012E1");
|
||||
return MatID;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : Set
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
|
||||
Handle(XCAFDoc_Animation) XCAFDoc_Animation::Set(const TDF_Label& theLabel,
|
||||
const Handle(TCollection_HAsciiString)& theName,
|
||||
const Handle(TColStd_HArray1OfByte)& theImage,
|
||||
const Handle(TColStd_HArray1OfByte)& theAnimation)
|
||||
{
|
||||
Handle(XCAFDoc_Animation) A;
|
||||
if (!theLabel.FindAttribute(XCAFDoc_Animation::GetID(), A))
|
||||
{
|
||||
A = new XCAFDoc_Animation();
|
||||
theLabel.AddAttribute(A);
|
||||
}
|
||||
A->Set(theName, theImage, theAnimation);
|
||||
return A;
|
||||
}
|
||||
//=======================================================================
|
||||
//function : Set
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
|
||||
Handle(XCAFDoc_Animation) XCAFDoc_Animation::Set(const TDF_Label& theLabel,
|
||||
const Handle(TCollection_HAsciiString)& theName,
|
||||
OSD_File& theImageFile, OSD_File& theAnimationFile)
|
||||
{
|
||||
Handle(XCAFDoc_Animation) anAnimation;
|
||||
if (!theLabel.FindAttribute(XCAFDoc_Animation::GetID(), anAnimation))
|
||||
{
|
||||
anAnimation = new XCAFDoc_Animation();
|
||||
if (anAnimation->Set(theName, theImageFile, theAnimationFile))
|
||||
theLabel.AddAttribute(anAnimation);
|
||||
else
|
||||
anAnimation.Nullify();
|
||||
}
|
||||
else
|
||||
anAnimation->Set(theName, theImageFile, theAnimationFile);
|
||||
return anAnimation;
|
||||
}
|
||||
//=======================================================================
|
||||
//function : Set
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
Standard_Boolean XCAFDoc_Animation::Set(const Handle(TCollection_HAsciiString)& theName, OSD_File& theImageFile, OSD_File& theAnimationFile)
|
||||
{
|
||||
if (!theImageFile.IsOpen() || !theImageFile.IsReadable() || !theAnimationFile.IsOpen() || !theAnimationFile.IsReadable())
|
||||
return Standard_False;
|
||||
if (theImageFile.Size() > (Standard_Size)IntegerLast() || theAnimationFile.Size() > (Standard_Size)IntegerLast())
|
||||
return Standard_False;
|
||||
myImage.reset(new TColStd_HArray1OfByte(1, static_cast<Standard_Integer>(theImageFile.Size())));
|
||||
Standard_Integer nbReadBytes = 0;
|
||||
theImageFile.Read((Standard_Address)&myImage->First(), myImage->Length(), nbReadBytes);
|
||||
if (nbReadBytes < myImage->Length())
|
||||
return Standard_False;
|
||||
myAnimation.reset(new TColStd_HArray1OfByte(1, static_cast<Standard_Integer>(theAnimationFile.Size())));
|
||||
nbReadBytes = 0;
|
||||
theAnimationFile.Read((Standard_Address)&myAnimation->First(), myAnimation->Length(), nbReadBytes);
|
||||
if (nbReadBytes < myAnimation->Length())
|
||||
return Standard_False;
|
||||
myName = theName;
|
||||
return Standard_True;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : Set
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
|
||||
void XCAFDoc_Animation::Set(const Handle(TCollection_HAsciiString)& theName,
|
||||
const Handle(TColStd_HArray1OfByte)& theImage,
|
||||
const Handle(TColStd_HArray1OfByte)& theAnimation)
|
||||
{
|
||||
myName = theName;
|
||||
myImage = theImage;
|
||||
myAnimation = theAnimation;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : Set
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
|
||||
void XCAFDoc_Animation::Set(const Handle(TCollection_HAsciiString)& theName)
|
||||
{
|
||||
myName = theName;
|
||||
}
|
||||
//=======================================================================
|
||||
//function : GetName
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
|
||||
Handle(TCollection_HAsciiString) XCAFDoc_Animation::GetName() const
|
||||
{
|
||||
return myName;
|
||||
}
|
||||
|
||||
|
||||
//=======================================================================
|
||||
//function : GetImage
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
|
||||
Handle(TColStd_HArray1OfByte) XCAFDoc_Animation::GetImage() const
|
||||
{
|
||||
return myImage;
|
||||
}
|
||||
|
||||
|
||||
//=======================================================================
|
||||
//function : GetAnimation
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
|
||||
Handle(TColStd_HArray1OfByte) XCAFDoc_Animation::GetAnimation() const
|
||||
{
|
||||
return myAnimation;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : ID
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
|
||||
const Standard_GUID& XCAFDoc_Animation::ID() const
|
||||
{
|
||||
return GetID();
|
||||
}
|
||||
|
||||
|
||||
//=======================================================================
|
||||
//function : Restore
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
|
||||
void XCAFDoc_Animation::Restore(const Handle(TDF_Attribute)& With)
|
||||
{
|
||||
myName = Handle(XCAFDoc_Animation)::DownCast(With)->GetName();
|
||||
myImage = Handle(XCAFDoc_Animation)::DownCast(With)->GetImage();
|
||||
myAnimation = Handle(XCAFDoc_Animation)::DownCast(With)->GetAnimation();
|
||||
}
|
||||
|
||||
|
||||
//=======================================================================
|
||||
//function : NewEmpty
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
|
||||
Handle(TDF_Attribute) XCAFDoc_Animation::NewEmpty() const
|
||||
{
|
||||
return new XCAFDoc_Animation();
|
||||
}
|
||||
|
||||
|
||||
//=======================================================================
|
||||
//function : Paste
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
|
||||
void XCAFDoc_Animation::Paste(const Handle(TDF_Attribute)& Into,
|
||||
const Handle(TDF_RelocationTable)& /*RT*/) const
|
||||
{
|
||||
Handle(XCAFDoc_Animation)::DownCast(Into)->Set(myName, myImage, myAnimation);
|
||||
}
|
||||
|
82
src/XCAFDoc/XCAFDoc_Animation.hxx
Normal file
82
src/XCAFDoc/XCAFDoc_Animation.hxx
Normal file
@@ -0,0 +1,82 @@
|
||||
// Created on: 2017-10-02
|
||||
// Created by: Elena MOZOKHINA
|
||||
// Copyright (c) 2016 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 _XCAFDoc_Animation_HeaderFile
|
||||
#define _XCAFDoc_Animation_HeaderFile
|
||||
|
||||
#include <Standard.hxx>
|
||||
#include <Standard_Type.hxx>
|
||||
|
||||
#include <OSD_File.hxx>
|
||||
#include <TDF_Attribute.hxx>
|
||||
class Standard_GUID;
|
||||
class TDF_Label;
|
||||
class TDF_Attribute;
|
||||
class TDF_RelocationTable;
|
||||
class XCAFView_Object;
|
||||
|
||||
class XCAFDoc_Animation;
|
||||
class TCollection_HAsciiString;
|
||||
class TColStd_HArray1OfByte;
|
||||
|
||||
DEFINE_STANDARD_HANDLE(XCAFDoc_Animation, TDF_Attribute)
|
||||
|
||||
//! attribute to store animation
|
||||
class XCAFDoc_Animation : public TDF_Attribute
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
Standard_EXPORT XCAFDoc_Animation();
|
||||
|
||||
Standard_EXPORT static const Standard_GUID& GetID();
|
||||
|
||||
Standard_EXPORT static Handle(XCAFDoc_Animation) Set(const TDF_Label& label, const Handle(TCollection_HAsciiString)& theName, const Handle(TColStd_HArray1OfByte)& theImage, const Handle(TColStd_HArray1OfByte)& theAnimation);
|
||||
|
||||
Standard_EXPORT static Handle(XCAFDoc_Animation) Set(const TDF_Label& theLabel, const Handle(TCollection_HAsciiString)& theName, OSD_File& theImageFile, OSD_File& theAnimationFile);
|
||||
|
||||
Standard_EXPORT void Set(const Handle(TCollection_HAsciiString)& theName, const Handle(TColStd_HArray1OfByte)& theImage, const Handle(TColStd_HArray1OfByte)& theAnimation);
|
||||
|
||||
Standard_EXPORT Standard_Boolean Set(const Handle(TCollection_HAsciiString)& aName, OSD_File& theImageFile, OSD_File& theAnimationFile);
|
||||
|
||||
Standard_EXPORT void Set(const Handle(TCollection_HAsciiString)& theName);
|
||||
|
||||
Standard_EXPORT Handle(TCollection_HAsciiString) GetName() const;
|
||||
|
||||
Standard_EXPORT Handle(TColStd_HArray1OfByte) GetImage() const;
|
||||
|
||||
Standard_EXPORT Handle(TColStd_HArray1OfByte) GetAnimation() const;
|
||||
|
||||
Standard_EXPORT const Standard_GUID& ID() const Standard_OVERRIDE;
|
||||
|
||||
Standard_EXPORT void Restore(const Handle(TDF_Attribute)& With) Standard_OVERRIDE;
|
||||
|
||||
Standard_EXPORT Handle(TDF_Attribute) NewEmpty() const Standard_OVERRIDE;
|
||||
|
||||
Standard_EXPORT void Paste(const Handle(TDF_Attribute)& Into, const Handle(TDF_RelocationTable)& RT) const Standard_OVERRIDE;
|
||||
|
||||
|
||||
|
||||
|
||||
DEFINE_STANDARD_RTTIEXT(XCAFDoc_Animation, TDF_Attribute)
|
||||
|
||||
private:
|
||||
|
||||
Handle(TCollection_HAsciiString) myName;
|
||||
Handle(TColStd_HArray1OfByte) myImage;
|
||||
Handle(TColStd_HArray1OfByte) myAnimation;
|
||||
};
|
||||
|
||||
#endif
|
236
src/XCAFDoc/XCAFDoc_AnimationTool.cxx
Normal file
236
src/XCAFDoc/XCAFDoc_AnimationTool.cxx
Normal file
@@ -0,0 +1,236 @@
|
||||
// Created on: 2017-10-02
|
||||
// Created by: Elena MOZOKHINA
|
||||
// Copyright (c) 2016 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 <TCollection_HAsciiString.hxx>
|
||||
#include <TDataStd_Integer.hxx>
|
||||
#include <TDataStd_Name.hxx>
|
||||
#include <TDataStd_TreeNode.hxx>
|
||||
#include <TDataXtd_Geometry.hxx>
|
||||
#include <TDataXtd_Plane.hxx>
|
||||
#include <TDF_Attribute.hxx>
|
||||
#include <TDF_ChildIDIterator.hxx>
|
||||
#include <XCAFDoc.hxx>
|
||||
#include <XCAFDoc_Animation.hxx>
|
||||
#include <XCAFDoc_AnimationTool.hxx>
|
||||
#include <TDF_AttributeIterator.hxx>
|
||||
|
||||
IMPLEMENT_STANDARD_RTTIEXT(XCAFDoc_AnimationTool, TDF_Attribute)
|
||||
|
||||
//=======================================================================
|
||||
//function : BaseLabel
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
|
||||
TDF_Label XCAFDoc_AnimationTool::BaseLabel() const
|
||||
{
|
||||
return Label();
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : IsAnimation
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
|
||||
Standard_Boolean XCAFDoc_AnimationTool::IsAnimation(const TDF_Label& theLabel) const
|
||||
{
|
||||
if (theLabel.Father() != Label())
|
||||
return Standard_False;
|
||||
|
||||
Handle(XCAFDoc_Animation) anAnimAttribute;
|
||||
if (!theLabel.FindAttribute(XCAFDoc_Animation::GetID(), anAnimAttribute))
|
||||
return Standard_False;
|
||||
|
||||
|
||||
return Standard_True;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : GetAnimation
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
|
||||
Standard_Boolean XCAFDoc_AnimationTool::GetAnimation(const TDF_Label& theLabel,
|
||||
Handle(TCollection_HAsciiString)& theName,
|
||||
Handle(TColStd_HArray1OfByte)& theImage,
|
||||
Handle(TColStd_HArray1OfByte)& theAnimation) const
|
||||
{
|
||||
|
||||
if (theLabel.Father() != Label())
|
||||
return Standard_False;
|
||||
|
||||
Handle(XCAFDoc_Animation) animAttr;
|
||||
if (!theLabel.FindAttribute(XCAFDoc_Animation::GetID(), animAttr)) {
|
||||
return Standard_False;
|
||||
}
|
||||
theName = animAttr->GetName();
|
||||
theImage = animAttr->GetImage();
|
||||
theAnimation = animAttr->GetAnimation();
|
||||
return Standard_True;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : AddAnimation
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
|
||||
TDF_Label XCAFDoc_AnimationTool::AddAnimation(const Handle(TCollection_HAsciiString)& theName,
|
||||
const Handle(TColStd_HArray1OfByte)& theImage,
|
||||
const Handle(TColStd_HArray1OfByte)& theAnimation )
|
||||
{
|
||||
TDF_Label animL;
|
||||
TDF_TagSource aTag;
|
||||
animL = aTag.NewChild(Label());
|
||||
XCAFDoc_Animation::Set(animL, theName, theImage, theAnimation);
|
||||
TDataStd_Name::Set(animL, TCollection_AsciiString(theName->ToCString()));
|
||||
return animL;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : AddAnimation
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
|
||||
TDF_Label XCAFDoc_AnimationTool::AddAnimation(const Handle(TCollection_HAsciiString)& theName,
|
||||
OSD_File& theImageFile, OSD_File& theAnimationFile)
|
||||
{
|
||||
TDF_Label animL;
|
||||
TDF_TagSource aTag;
|
||||
animL = aTag.NewChild(Label());
|
||||
TDataStd_Name::Set(animL, TCollection_AsciiString(theName->ToCString()));
|
||||
XCAFDoc_Animation::Set(animL, theName, theImageFile, theAnimationFile);
|
||||
return animL;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : RemoveAnimation
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
|
||||
Standard_Boolean XCAFDoc_AnimationTool::RemoveAnimation(const TDF_Label& theLabel) const
|
||||
{
|
||||
Handle(XCAFDoc_Animation)anAnimAttr;
|
||||
if (!IsAnimation(theLabel) || !theLabel.FindAttribute(XCAFDoc_Animation::GetID(), anAnimAttr))
|
||||
return Standard_False;
|
||||
|
||||
theLabel.ForgetAllAttributes(Standard_True);
|
||||
return Standard_True;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : GetAnimationLabels
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
|
||||
void XCAFDoc_AnimationTool::GetAnimationLabels(TDF_LabelSequence& theLabels) const
|
||||
{
|
||||
theLabels.Clear();
|
||||
TDF_ChildIterator aChildIterator(Label());
|
||||
for (; aChildIterator.More(); aChildIterator.Next()) {
|
||||
TDF_Label aLabel = aChildIterator.Value();
|
||||
if (IsAnimation(aLabel)) theLabels.Append(aLabel);
|
||||
}
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : SetName
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
|
||||
void XCAFDoc_AnimationTool::SetName(const TDF_Label& theLabel,
|
||||
const Handle(TCollection_HAsciiString)& theName) const
|
||||
{
|
||||
if (theLabel.Father() != Label())
|
||||
return;
|
||||
|
||||
Handle(XCAFDoc_Animation)anAnimAttr;
|
||||
if (!theLabel.FindAttribute(XCAFDoc_Animation::GetID(), anAnimAttr))
|
||||
return;
|
||||
anAnimAttr->Set(theName);
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : GetID
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
|
||||
const Standard_GUID& XCAFDoc_AnimationTool::GetID()
|
||||
{
|
||||
static Standard_GUID AnimationID("7261F539-43AD-4544-8419-AE63C6ED4A41");
|
||||
return AnimationID;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : Set
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
|
||||
Handle(XCAFDoc_AnimationTool) XCAFDoc_AnimationTool::Set(const TDF_Label& L)
|
||||
{
|
||||
Handle(XCAFDoc_AnimationTool) A;
|
||||
if (!L.FindAttribute(XCAFDoc_AnimationTool::GetID(), A)) {
|
||||
A = new XCAFDoc_AnimationTool();
|
||||
L.AddAttribute(A);
|
||||
}
|
||||
return A;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : ID
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
|
||||
const Standard_GUID& XCAFDoc_AnimationTool::ID() const
|
||||
{
|
||||
return GetID();
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : Restore
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
|
||||
void XCAFDoc_AnimationTool::Restore(const Handle(TDF_Attribute)& /*with*/)
|
||||
{
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : NewEmpty
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
|
||||
Handle(TDF_Attribute) XCAFDoc_AnimationTool::NewEmpty() const
|
||||
{
|
||||
return new XCAFDoc_AnimationTool;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : Paste
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
|
||||
void XCAFDoc_AnimationTool::Paste(const Handle(TDF_Attribute)& /*into*/,
|
||||
const Handle(TDF_RelocationTable)& /*RT*/) const
|
||||
{
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : XCAFDoc_AnimationTool
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
|
||||
XCAFDoc_AnimationTool::XCAFDoc_AnimationTool()
|
||||
{
|
||||
}
|
||||
|
85
src/XCAFDoc/XCAFDoc_AnimationTool.hxx
Normal file
85
src/XCAFDoc/XCAFDoc_AnimationTool.hxx
Normal file
@@ -0,0 +1,85 @@
|
||||
// Created on: 2017-10-02
|
||||
// Created by: Elena MOZOKHINA
|
||||
// Copyright (c) 2016 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 _XCAFDoc_AnimationTool_HeaderFile
|
||||
#define _XCAFDoc_AnimationTool_HeaderFile
|
||||
|
||||
#include <TDF_LabelSequence.hxx>
|
||||
#include <TColStd_HArray1OfByte.hxx>
|
||||
#include <OSD_File.hxx>
|
||||
|
||||
class XCAFDoc_AnimationTool;
|
||||
DEFINE_STANDARD_HANDLE(XCAFDoc_AnimationToolTool, TDF_Attribute)
|
||||
|
||||
//! Provide tool for management of Animations section of document.
|
||||
//! Provide tool to store, retrieve, remove and modify animations.
|
||||
//! Each animation has a name and binary data of screenshot and animation.
|
||||
class XCAFDoc_AnimationTool : public TDF_Attribute
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
|
||||
Standard_EXPORT XCAFDoc_AnimationTool();
|
||||
|
||||
//! Creates (if not exist) Animation tool.
|
||||
Standard_EXPORT static Handle(XCAFDoc_AnimationTool) Set(const TDF_Label& theLabel);
|
||||
|
||||
Standard_EXPORT static const Standard_GUID& GetID();
|
||||
|
||||
//! returns the label under which Animations are stored
|
||||
Standard_EXPORT TDF_Label BaseLabel() const;
|
||||
|
||||
//! Returns True if label belongs to a Animations table and
|
||||
//! is a animation definition
|
||||
Standard_EXPORT Standard_Boolean IsAnimation (const TDF_Label& theLabel) const;
|
||||
|
||||
//! Returns animation defined by label theLabel
|
||||
//! Returns False if the label is not in Animations table
|
||||
Standard_EXPORT Standard_Boolean GetAnimation(const TDF_Label& theLabel, Handle(TCollection_HAsciiString)& theName, Handle(TColStd_HArray1OfByte)& theImage, Handle(TColStd_HArray1OfByte)& theAnimation) const;
|
||||
|
||||
//! Adds an animation definition to a Animations table
|
||||
//! Returns created label
|
||||
Standard_EXPORT TDF_Label AddAnimation(const Handle(TCollection_HAsciiString)& theName, const Handle(TColStd_HArray1OfByte)& theImage, const Handle(TColStd_HArray1OfByte)& theAnimation);
|
||||
|
||||
//! Adds an animation definition to a Animations table
|
||||
//! Returns created label
|
||||
Standard_EXPORT TDF_Label AddAnimation(const Handle(TCollection_HAsciiString)& theName, OSD_File& theImageFile, OSD_File& theAnimationFile);
|
||||
|
||||
//! Removes animation from the Animations table
|
||||
Standard_EXPORT Standard_Boolean RemoveAnimation(const TDF_Label& theLabel) const;
|
||||
|
||||
//! Returns a sequence of animations currently stored
|
||||
//! in the Animations table
|
||||
Standard_EXPORT void GetAnimationLabels(TDF_LabelSequence& Labels) const;
|
||||
|
||||
//! Rename animation
|
||||
Standard_EXPORT void SetName(const TDF_Label& theLabelL, const Handle(TCollection_HAsciiString)& theName) const;
|
||||
|
||||
Standard_EXPORT const Standard_GUID& ID() const Standard_OVERRIDE;
|
||||
|
||||
Standard_EXPORT void Restore (const Handle(TDF_Attribute)& with) Standard_OVERRIDE;
|
||||
|
||||
Standard_EXPORT Handle(TDF_Attribute) NewEmpty() const Standard_OVERRIDE;
|
||||
|
||||
Standard_EXPORT void Paste (const Handle(TDF_Attribute)& into, const Handle(TDF_RelocationTable)& RT) const Standard_OVERRIDE;
|
||||
|
||||
|
||||
|
||||
|
||||
DEFINE_STANDARD_RTTIEXT(XCAFDoc_AnimationTool, TDF_Attribute)
|
||||
|
||||
};
|
||||
#endif // _XCAFDoc_ClippingPlaneTool_HeaderFile
|
65
src/XCAFDoc/XCAFDoc_Annotation.hxx
Normal file
65
src/XCAFDoc/XCAFDoc_Annotation.hxx
Normal file
@@ -0,0 +1,65 @@
|
||||
// Created on: 2017-10-02
|
||||
// Created by: Elena MOZOKHINA
|
||||
// Copyright (c) 2016 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 _XCAFDoc_View_HeaderFile
|
||||
#define _XCAFDoc_View_HeaderFile
|
||||
|
||||
#include <Standard.hxx>
|
||||
#include <Standard_Type.hxx>
|
||||
|
||||
#include <TDF_Attribute.hxx>
|
||||
class Standard_GUID;
|
||||
class TDF_Label;
|
||||
class TDF_Attribute;
|
||||
class TDF_RelocationTable;
|
||||
class XCAFView_Object;
|
||||
|
||||
// resolve name collisions with WinAPI headers
|
||||
#ifdef GetObject
|
||||
#undef GetObject
|
||||
#endif
|
||||
|
||||
class XCAFDoc_View;
|
||||
DEFINE_STANDARD_HANDLE(XCAFDoc_View, TDF_Attribute)
|
||||
|
||||
//! attribute to store view
|
||||
class XCAFDoc_View : public TDF_Attribute
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
Standard_EXPORT XCAFDoc_View();
|
||||
|
||||
Standard_EXPORT static const Standard_GUID& GetID();
|
||||
|
||||
Standard_EXPORT static Handle(XCAFDoc_View) Set (const TDF_Label& theLabel);
|
||||
|
||||
Standard_EXPORT const Standard_GUID& ID() const Standard_OVERRIDE;
|
||||
|
||||
Standard_EXPORT void Restore (const Handle(TDF_Attribute)& With) Standard_OVERRIDE;
|
||||
|
||||
Standard_EXPORT Handle(TDF_Attribute) NewEmpty() const Standard_OVERRIDE;
|
||||
|
||||
Standard_EXPORT void Paste (const Handle(TDF_Attribute)& Into, const Handle(TDF_RelocationTable)& RT) const Standard_OVERRIDE;
|
||||
|
||||
Standard_EXPORT void SetObject (const Handle(XCAFView_Object)& theViewObject);
|
||||
|
||||
Standard_EXPORT Handle(XCAFView_Object) GetObject() const;
|
||||
|
||||
DEFINE_STANDARD_RTTIEXT(XCAFDoc_View, TDF_Attribute)
|
||||
|
||||
};
|
||||
|
||||
#endif
|
@@ -34,14 +34,14 @@ enum {
|
||||
ExtraRef_SubshapeIndex
|
||||
};
|
||||
|
||||
const Standard_GUID&
|
||||
const Standard_GUID&
|
||||
XCAFDoc_AssemblyItemRef::GetID()
|
||||
{
|
||||
static Standard_GUID s_ID("3F2E4CD6-169B-4747-A321-5670E4291F5D");
|
||||
return s_ID;
|
||||
}
|
||||
|
||||
Handle(XCAFDoc_AssemblyItemRef)
|
||||
Handle(XCAFDoc_AssemblyItemRef)
|
||||
XCAFDoc_AssemblyItemRef::Get(const TDF_Label& theLabel)
|
||||
{
|
||||
Handle(XCAFDoc_AssemblyItemRef) aThis;
|
||||
@@ -49,9 +49,9 @@ XCAFDoc_AssemblyItemRef::Get(const TDF_Label& theLabel)
|
||||
return aThis;
|
||||
}
|
||||
|
||||
Handle(XCAFDoc_AssemblyItemRef)
|
||||
Handle(XCAFDoc_AssemblyItemRef)
|
||||
XCAFDoc_AssemblyItemRef::Set(const TDF_Label& theLabel,
|
||||
const XCAFDoc_AssemblyItemId& theItemId)
|
||||
const XCAFDoc_AssemblyItemId& theItemId)
|
||||
{
|
||||
Handle(XCAFDoc_AssemblyItemRef) aThis;
|
||||
if (!theLabel.IsNull() && !theLabel.FindAttribute(XCAFDoc_AssemblyItemRef::GetID(), aThis))
|
||||
@@ -63,10 +63,10 @@ XCAFDoc_AssemblyItemRef::Set(const TDF_Label& theLabel,
|
||||
return aThis;
|
||||
}
|
||||
|
||||
Handle(XCAFDoc_AssemblyItemRef)
|
||||
Handle(XCAFDoc_AssemblyItemRef)
|
||||
XCAFDoc_AssemblyItemRef::Set(const TDF_Label& theLabel,
|
||||
const XCAFDoc_AssemblyItemId& theItemId,
|
||||
const Standard_GUID& theAttrGUID)
|
||||
const XCAFDoc_AssemblyItemId& theItemId,
|
||||
const Standard_GUID& theAttrGUID)
|
||||
{
|
||||
Handle(XCAFDoc_AssemblyItemRef) aThis;
|
||||
if (!theLabel.IsNull() && !theLabel.FindAttribute(XCAFDoc_AssemblyItemRef::GetID(), aThis))
|
||||
@@ -79,10 +79,10 @@ XCAFDoc_AssemblyItemRef::Set(const TDF_Label& theLabel,
|
||||
return aThis;
|
||||
}
|
||||
|
||||
Handle(XCAFDoc_AssemblyItemRef)
|
||||
Handle(XCAFDoc_AssemblyItemRef)
|
||||
XCAFDoc_AssemblyItemRef::Set(const TDF_Label& theLabel,
|
||||
const XCAFDoc_AssemblyItemId& theItemId,
|
||||
const Standard_Integer theShapeIndex)
|
||||
const XCAFDoc_AssemblyItemId& theItemId,
|
||||
const Standard_Integer theShapeIndex)
|
||||
{
|
||||
Handle(XCAFDoc_AssemblyItemRef) aThis;
|
||||
if (!theLabel.IsNull() && !theLabel.FindAttribute(XCAFDoc_AssemblyItemRef::GetID(), aThis))
|
||||
@@ -101,7 +101,7 @@ XCAFDoc_AssemblyItemRef::XCAFDoc_AssemblyItemRef()
|
||||
|
||||
}
|
||||
|
||||
Standard_Boolean
|
||||
Standard_Boolean
|
||||
XCAFDoc_AssemblyItemRef::IsOrphan() const
|
||||
{
|
||||
if (myItemId.IsNull())
|
||||
@@ -152,31 +152,31 @@ XCAFDoc_AssemblyItemRef::IsOrphan() const
|
||||
return Standard_False;
|
||||
}
|
||||
|
||||
Standard_Boolean
|
||||
Standard_Boolean
|
||||
XCAFDoc_AssemblyItemRef::HasExtraRef() const
|
||||
{
|
||||
return (myExtraRef != ExtraRef_None);
|
||||
}
|
||||
|
||||
Standard_Boolean
|
||||
Standard_Boolean
|
||||
XCAFDoc_AssemblyItemRef::IsGUID() const
|
||||
{
|
||||
return (myExtraRef == ExtraRef_AttrGUID && Standard_GUID::CheckGUIDFormat(myExtraId.ToCString()));
|
||||
}
|
||||
|
||||
Standard_Boolean
|
||||
Standard_Boolean
|
||||
XCAFDoc_AssemblyItemRef::IsSubshapeIndex() const
|
||||
{
|
||||
return (myExtraRef == ExtraRef_SubshapeIndex && myExtraId.IsIntegerValue());
|
||||
}
|
||||
|
||||
const XCAFDoc_AssemblyItemId&
|
||||
const XCAFDoc_AssemblyItemId&
|
||||
XCAFDoc_AssemblyItemRef::GetItem() const
|
||||
{
|
||||
return myItemId;
|
||||
}
|
||||
|
||||
Standard_GUID
|
||||
Standard_GUID
|
||||
XCAFDoc_AssemblyItemRef::GetGUID() const
|
||||
{
|
||||
if (IsGUID())
|
||||
@@ -185,7 +185,7 @@ XCAFDoc_AssemblyItemRef::GetGUID() const
|
||||
return Standard_GUID();
|
||||
}
|
||||
|
||||
Standard_Integer
|
||||
Standard_Integer
|
||||
XCAFDoc_AssemblyItemRef::GetSubshapeIndex() const
|
||||
{
|
||||
if (IsSubshapeIndex())
|
||||
@@ -194,7 +194,7 @@ XCAFDoc_AssemblyItemRef::GetSubshapeIndex() const
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
void
|
||||
XCAFDoc_AssemblyItemRef::SetItem(const XCAFDoc_AssemblyItemId& theItemId)
|
||||
{
|
||||
Backup();
|
||||
@@ -223,13 +223,13 @@ void XCAFDoc_AssemblyItemRef::SetGUID(const Standard_GUID& theAttrGUID)
|
||||
Backup();
|
||||
myExtraRef = ExtraRef_AttrGUID;
|
||||
Standard_Character aGUIDStr[Standard_GUID_SIZE + 1];
|
||||
theAttrGUID.ToCString(aGUIDStr);
|
||||
theAttrGUID.ToCString(aGUIDStr);
|
||||
aGUIDStr[Standard_GUID_SIZE] = '\0';
|
||||
myExtraId.Clear();
|
||||
myExtraId.AssignCat(aGUIDStr);
|
||||
}
|
||||
|
||||
void
|
||||
void
|
||||
XCAFDoc_AssemblyItemRef::SetSubshapeIndex(Standard_Integer theSubshapeIndex)
|
||||
{
|
||||
Backup();
|
||||
@@ -238,7 +238,7 @@ XCAFDoc_AssemblyItemRef::SetSubshapeIndex(Standard_Integer theSubshapeIndex)
|
||||
myExtraId.AssignCat(theSubshapeIndex);
|
||||
}
|
||||
|
||||
void
|
||||
void
|
||||
XCAFDoc_AssemblyItemRef::ClearExtraRef()
|
||||
{
|
||||
Backup();
|
||||
@@ -246,19 +246,19 @@ XCAFDoc_AssemblyItemRef::ClearExtraRef()
|
||||
myExtraId.Clear();
|
||||
}
|
||||
|
||||
const Standard_GUID&
|
||||
const Standard_GUID&
|
||||
XCAFDoc_AssemblyItemRef::ID() const
|
||||
{
|
||||
return GetID();
|
||||
}
|
||||
|
||||
Handle(TDF_Attribute)
|
||||
Handle(TDF_Attribute)
|
||||
XCAFDoc_AssemblyItemRef::NewEmpty() const
|
||||
{
|
||||
return new XCAFDoc_AssemblyItemRef();
|
||||
}
|
||||
|
||||
void
|
||||
void
|
||||
XCAFDoc_AssemblyItemRef::Restore(const Handle(TDF_Attribute)& theAttrFrom)
|
||||
{
|
||||
Handle(XCAFDoc_AssemblyItemRef) anOther = Handle(XCAFDoc_AssemblyItemRef)::DownCast(theAttrFrom);
|
||||
@@ -270,9 +270,9 @@ XCAFDoc_AssemblyItemRef::Restore(const Handle(TDF_Attribute)& theAttrFrom)
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
void
|
||||
XCAFDoc_AssemblyItemRef::Paste(const Handle(TDF_Attribute)& theAttrInto,
|
||||
const Handle(TDF_RelocationTable)& /*theRT*/) const
|
||||
const Handle(TDF_RelocationTable)& /*theRT*/) const
|
||||
{
|
||||
Handle(XCAFDoc_AssemblyItemRef) anOther = Handle(XCAFDoc_AssemblyItemRef)::DownCast(theAttrInto);
|
||||
if (!anOther.IsNull())
|
||||
@@ -283,7 +283,7 @@ XCAFDoc_AssemblyItemRef::Paste(const Handle(TDF_Attribute)& theAttrInto,
|
||||
}
|
||||
}
|
||||
|
||||
Standard_OStream&
|
||||
Standard_OStream&
|
||||
XCAFDoc_AssemblyItemRef::Dump(Standard_OStream& theOS) const
|
||||
{
|
||||
theOS << "Path: " << myItemId.ToString();
|
||||
|
@@ -59,7 +59,7 @@ Standard_Boolean XCAFDoc_ClippingPlaneTool::IsClippingPlane(const TDF_Label& the
|
||||
//=======================================================================
|
||||
|
||||
Standard_Boolean XCAFDoc_ClippingPlaneTool::GetClippingPlane(const TDF_Label& theLabel,
|
||||
gp_Pln& thePlane, TCollection_ExtendedString& theName, Standard_Boolean &theCapping) const
|
||||
gp_Pln& thePlane, TCollection_ExtendedString& theName, Standard_Boolean &theCapping, Standard_Boolean &theVisible) const
|
||||
{
|
||||
if (theLabel.Father() != Label())
|
||||
return Standard_False;
|
||||
@@ -74,9 +74,13 @@ Standard_Boolean XCAFDoc_ClippingPlaneTool::GetClippingPlane(const TDF_Label& th
|
||||
theName = aNameAttribute->Get();
|
||||
|
||||
Handle(TDataStd_Integer) aCappingAttribute;
|
||||
if (theLabel.FindAttribute(TDataStd_Integer::GetID(), aCappingAttribute))
|
||||
if (theLabel.FindAttribute(XCAFDoc::ClipPlaneCappingRefGUID(), aCappingAttribute))
|
||||
theCapping = (aCappingAttribute->Get() == 1);
|
||||
|
||||
|
||||
Handle(TDataStd_Integer) aVisibleAttribute;
|
||||
if (theLabel.FindAttribute(XCAFDoc::ClipPlaneVisibleRefGUID(), aVisibleAttribute))
|
||||
theVisible = (aVisibleAttribute->Get() == 1);
|
||||
|
||||
return Standard_True;
|
||||
}
|
||||
|
||||
@@ -86,10 +90,10 @@ Standard_Boolean XCAFDoc_ClippingPlaneTool::GetClippingPlane(const TDF_Label& th
|
||||
//=======================================================================
|
||||
|
||||
Standard_Boolean XCAFDoc_ClippingPlaneTool::GetClippingPlane(const TDF_Label& theLabel,
|
||||
gp_Pln& thePlane, Handle(TCollection_HAsciiString)& theName, Standard_Boolean &theCapping) const
|
||||
gp_Pln& thePlane, Handle(TCollection_HAsciiString)& theName, Standard_Boolean &theCapping, Standard_Boolean &theVisible) const
|
||||
{
|
||||
TCollection_ExtendedString anExtName;
|
||||
if (!GetClippingPlane(theLabel, thePlane, anExtName, theCapping))
|
||||
if (!GetClippingPlane(theLabel, thePlane, anExtName, theCapping, theVisible))
|
||||
return Standard_False;
|
||||
theName = new TCollection_HAsciiString(anExtName);
|
||||
return Standard_True;
|
||||
@@ -108,8 +112,8 @@ TDF_Label XCAFDoc_ClippingPlaneTool::AddClippingPlane(const gp_Pln thePlane, con
|
||||
for (Standard_Integer i = 1; i <= aClippingPlanes.Length(); i++) {
|
||||
gp_Pln aPlane;
|
||||
TCollection_ExtendedString aName;
|
||||
Standard_Boolean aCapping;
|
||||
GetClippingPlane(aClippingPlanes.Value(i), aPlane, aName, aCapping);
|
||||
Standard_Boolean aCapping, aVisible;
|
||||
GetClippingPlane(aClippingPlanes.Value(i), aPlane, aName, aCapping, aVisible);
|
||||
if (!aName.IsEqual(theName))
|
||||
continue;
|
||||
if (aPlane.Axis().Angle(thePlane.Axis()) > Precision::Angular())
|
||||
@@ -149,12 +153,14 @@ TDF_Label XCAFDoc_ClippingPlaneTool::AddClippingPlane(const gp_Pln thePlane, con
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
|
||||
TDF_Label XCAFDoc_ClippingPlaneTool::AddClippingPlane(const gp_Pln thePlane, const TCollection_ExtendedString theName, const Standard_Boolean theCapping) const
|
||||
TDF_Label XCAFDoc_ClippingPlaneTool::AddClippingPlane(const gp_Pln thePlane, const TCollection_ExtendedString theName, const Standard_Boolean theCapping, const Standard_Boolean theVisible) const
|
||||
{
|
||||
TDF_Label aLabel = AddClippingPlane(thePlane, theName);
|
||||
Standard_Integer aCappingVal = (theCapping) ? 1 : 0;
|
||||
TDataStd_Integer::Set(aLabel, aCappingVal);
|
||||
|
||||
Standard_Integer aVisibleVal = (theVisible) ? 1 : 0;
|
||||
TDataStd_Integer::Set(aLabel, aVisibleVal);
|
||||
return aLabel;
|
||||
}
|
||||
|
||||
@@ -163,10 +169,10 @@ TDF_Label XCAFDoc_ClippingPlaneTool::AddClippingPlane(const gp_Pln thePlane, con
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
|
||||
TDF_Label XCAFDoc_ClippingPlaneTool::AddClippingPlane(const gp_Pln thePlane, const Handle(TCollection_HAsciiString)& theName, const Standard_Boolean theCapping) const
|
||||
TDF_Label XCAFDoc_ClippingPlaneTool::AddClippingPlane(const gp_Pln thePlane, const Handle(TCollection_HAsciiString)& theName, const Standard_Boolean theCapping, const Standard_Boolean theVisible) const
|
||||
{
|
||||
TCollection_ExtendedString anExtName = TCollection_ExtendedString(theName->String());
|
||||
return AddClippingPlane(thePlane, anExtName, theCapping);
|
||||
return AddClippingPlane(thePlane, anExtName, theCapping, theVisible);
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
@@ -230,9 +236,9 @@ void XCAFDoc_ClippingPlaneTool::SetCapping(const TDF_Label& theClippingPlaneL, c
|
||||
if (theClippingPlaneL.Father() != Label())
|
||||
return;
|
||||
|
||||
theClippingPlaneL.ForgetAttribute(TDataStd_Integer::GetID());
|
||||
theClippingPlaneL.ForgetAttribute(XCAFDoc::ClipPlaneCappingRefGUID());
|
||||
Standard_Integer aCappingVal = (theCapping) ? 1 : 0;
|
||||
TDataStd_Integer::Set(theClippingPlaneL, aCappingVal);
|
||||
TDataStd_Integer::Set(theClippingPlaneL, XCAFDoc::ClipPlaneCappingRefGUID(), aCappingVal);
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
@@ -246,7 +252,7 @@ Standard_Boolean XCAFDoc_ClippingPlaneTool::GetCapping(const TDF_Label& theClipp
|
||||
return Standard_False;
|
||||
|
||||
Handle(TDataStd_Integer) aCappingAttribute;
|
||||
if (theClippingPlaneL.FindAttribute(TDataStd_Integer::GetID(), aCappingAttribute))
|
||||
if (theClippingPlaneL.FindAttribute(XCAFDoc::ClipPlaneCappingRefGUID(), aCappingAttribute))
|
||||
return (aCappingAttribute->Get() == 1);
|
||||
|
||||
return Standard_False;
|
||||
@@ -263,13 +269,63 @@ Standard_Boolean XCAFDoc_ClippingPlaneTool::GetCapping(const TDF_Label& theClipp
|
||||
return Standard_False;
|
||||
|
||||
Handle(TDataStd_Integer) aCappingAttribute;
|
||||
if (theClippingPlaneL.FindAttribute(TDataStd_Integer::GetID(), aCappingAttribute)) {
|
||||
if (theClippingPlaneL.FindAttribute(XCAFDoc::ClipPlaneCappingRefGUID(), aCappingAttribute)) {
|
||||
theCapping = (aCappingAttribute->Get() == 1);
|
||||
return Standard_True;
|
||||
}
|
||||
|
||||
return Standard_False;
|
||||
}
|
||||
//=======================================================================
|
||||
//function : SetVisible
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
|
||||
void XCAFDoc_ClippingPlaneTool::SetVisible(const TDF_Label& theClippingPlaneL, const Standard_Boolean theVisible)
|
||||
{
|
||||
if (theClippingPlaneL.Father() != Label())
|
||||
return;
|
||||
|
||||
theClippingPlaneL.ForgetAttribute(XCAFDoc::ClipPlaneVisibleRefGUID());
|
||||
Standard_Integer aVisibleVal = (theVisible) ? 1 : 0;
|
||||
TDataStd_Integer::Set(theClippingPlaneL, XCAFDoc::ClipPlaneVisibleRefGUID(), aVisibleVal);
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : GetVisible
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
|
||||
Standard_Boolean XCAFDoc_ClippingPlaneTool::GetVisible(const TDF_Label& theClippingPlaneL) const
|
||||
{
|
||||
if (theClippingPlaneL.Father() != Label())
|
||||
return Standard_False;
|
||||
|
||||
Handle(TDataStd_Integer) aVisibleAttribute;
|
||||
if (theClippingPlaneL.FindAttribute(XCAFDoc::ClipPlaneVisibleRefGUID(), aVisibleAttribute))
|
||||
return (aVisibleAttribute->Get() == 1);
|
||||
|
||||
return Standard_False;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : GetVisible
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
|
||||
Standard_Boolean XCAFDoc_ClippingPlaneTool::GetVisible(const TDF_Label& theClippingPlaneL, Standard_Boolean &theVisible) const
|
||||
{
|
||||
if (theClippingPlaneL.Father() != Label())
|
||||
return Standard_False;
|
||||
|
||||
Handle(TDataStd_Integer) aVisibleAttribute;
|
||||
if (theClippingPlaneL.FindAttribute(XCAFDoc::ClipPlaneVisibleRefGUID(), aVisibleAttribute)) {
|
||||
theVisible = (aVisibleAttribute->Get() == 1);
|
||||
return Standard_True;
|
||||
}
|
||||
|
||||
return Standard_False;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : GetID
|
||||
|
@@ -48,22 +48,22 @@ public:
|
||||
//! Returns ClippingPlane defined by label lab
|
||||
//! Returns False if the label is not in ClippingPlane table
|
||||
//! or does not define a ClippingPlane
|
||||
Standard_EXPORT Standard_Boolean GetClippingPlane(const TDF_Label& theLabel, gp_Pln& thePlane, TCollection_ExtendedString& theName, Standard_Boolean &theCapping) const;
|
||||
Standard_EXPORT Standard_Boolean GetClippingPlane(const TDF_Label& theLabel, gp_Pln& thePlane, TCollection_ExtendedString& theName, Standard_Boolean &theCapping, Standard_Boolean &theVisible) const;
|
||||
|
||||
//! Returns ClippingPlane defined by label lab
|
||||
//! Returns False if the label is not in ClippingPlane table
|
||||
//! or does not define a ClippingPlane
|
||||
Standard_EXPORT Standard_Boolean GetClippingPlane(const TDF_Label& theLabel, gp_Pln& thePlane, Handle(TCollection_HAsciiString)& theName, Standard_Boolean &theCapping) const;
|
||||
Standard_EXPORT Standard_Boolean GetClippingPlane(const TDF_Label& theLabel, gp_Pln& thePlane, Handle(TCollection_HAsciiString)& theName, Standard_Boolean &theCapping, Standard_Boolean &theVisible) const;
|
||||
|
||||
//! Adds a clipping plane definition to a ClippingPlane table and returns
|
||||
//! its label (returns existing label if the same clipping plane
|
||||
//! is already defined)
|
||||
Standard_EXPORT TDF_Label AddClippingPlane(const gp_Pln thePlane, const TCollection_ExtendedString theName, const Standard_Boolean theCapping) const;
|
||||
Standard_EXPORT TDF_Label AddClippingPlane(const gp_Pln thePlane, const TCollection_ExtendedString theName, const Standard_Boolean theCapping, const Standard_Boolean theVisible) const;
|
||||
|
||||
//! Adds a clipping plane definition to a ClippingPlane table and returns
|
||||
//! its label (returns existing label if the same clipping plane
|
||||
//! is already defined)
|
||||
Standard_EXPORT TDF_Label AddClippingPlane(const gp_Pln thePlane, const Handle(TCollection_HAsciiString)& theName, const Standard_Boolean theCapping) const;
|
||||
Standard_EXPORT TDF_Label AddClippingPlane(const gp_Pln thePlane, const Handle(TCollection_HAsciiString)& theName, const Standard_Boolean theCapping, const Standard_Boolean theVisible) const;
|
||||
|
||||
//! Adds a clipping plane definition to a ClippingPlane table and returns
|
||||
//! its label (returns existing label if the same clipping plane
|
||||
@@ -97,6 +97,17 @@ public:
|
||||
//! Get capping value for given clipping plane label
|
||||
//! Return true if Label is valid abd capping is exist.
|
||||
Standard_EXPORT Standard_Boolean GetCapping(const TDF_Label& theClippingPlaneL, Standard_Boolean &theCapping) const;
|
||||
|
||||
//! Set new value of visible for given clipping plane label
|
||||
Standard_EXPORT void SetVisible(const TDF_Label& theClippingPlaneL, const Standard_Boolean theCapping);
|
||||
|
||||
//! Get visible value for given clipping plane label
|
||||
//! Return capping value
|
||||
Standard_EXPORT Standard_Boolean GetVisible(const TDF_Label& theClippingPlaneL) const;
|
||||
|
||||
//! Get visible value for given clipping plane label
|
||||
//! Return true if Label is valid abd capping is exist.
|
||||
Standard_EXPORT Standard_Boolean GetVisible(const TDF_Label& theClippingPlaneL, Standard_Boolean &theCapping) const;
|
||||
|
||||
Standard_EXPORT const Standard_GUID& ID() const Standard_OVERRIDE;
|
||||
|
||||
|
@@ -33,6 +33,7 @@
|
||||
#include <XCAFDoc_NotesTool.hxx>
|
||||
#include <XCAFDoc_ShapeTool.hxx>
|
||||
#include <XCAFDoc_ViewTool.hxx>
|
||||
#include <XCAFDoc_AnimationTool.hxx>
|
||||
|
||||
IMPLEMENT_STANDARD_RTTIEXT(XCAFDoc_DocumentTool,TDF_Attribute)
|
||||
|
||||
@@ -87,6 +88,7 @@ Handle(XCAFDoc_DocumentTool) XCAFDoc_DocumentTool::Set(const TDF_Label& L,
|
||||
XCAFDoc_NotesTool::Set(NotesLabel(L));
|
||||
XCAFDoc_ViewTool::Set(ViewsLabel(L));
|
||||
XCAFDoc_ClippingPlaneTool::Set(ClippingPlanesLabel(L));
|
||||
XCAFDoc_AnimationTool::Set(AnimationsLabel(L));
|
||||
}
|
||||
return A;
|
||||
}
|
||||
@@ -224,7 +226,17 @@ TDF_Label XCAFDoc_DocumentTool::NotesLabel(const TDF_Label& acces)
|
||||
TDataStd_Name::Set(L, "Notes");
|
||||
return L;
|
||||
}
|
||||
//=======================================================================
|
||||
//function : AnimationsLabel
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
|
||||
TDF_Label XCAFDoc_DocumentTool::AnimationsLabel(const TDF_Label& acces)
|
||||
{
|
||||
TDF_Label L = DocLabel(acces).FindChild(10, Standard_True);
|
||||
TDataStd_Name::Set(L, "Animations");
|
||||
return L;
|
||||
}
|
||||
//=======================================================================
|
||||
//function : ShapeTool
|
||||
//purpose :
|
||||
@@ -308,7 +320,15 @@ Handle(XCAFDoc_NotesTool) XCAFDoc_DocumentTool::NotesTool(const TDF_Label& acces
|
||||
{
|
||||
return XCAFDoc_NotesTool::Set(NotesLabel(acces));
|
||||
}
|
||||
//=======================================================================
|
||||
//function : AnimationTool
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
|
||||
Handle(XCAFDoc_AnimationTool) XCAFDoc_DocumentTool::AnimationTool(const TDF_Label& acces)
|
||||
{
|
||||
return XCAFDoc_AnimationTool::Set(AnimationsLabel(acces));
|
||||
}
|
||||
//=======================================================================
|
||||
//function : ID
|
||||
//purpose :
|
||||
|
@@ -34,6 +34,7 @@ class XCAFDoc_NotesTool;
|
||||
class XCAFDoc_ViewTool;
|
||||
class TDF_Attribute;
|
||||
class TDF_RelocationTable;
|
||||
class XCAFDoc_AnimationTool;
|
||||
|
||||
|
||||
class XCAFDoc_DocumentTool;
|
||||
@@ -88,6 +89,9 @@ public:
|
||||
|
||||
//! Returns sub-label of DocLabel() with tag 9.
|
||||
Standard_EXPORT static TDF_Label NotesLabel(const TDF_Label& acces);
|
||||
|
||||
//! Returns sub-label of DocLabel() with tag 10.
|
||||
Standard_EXPORT static TDF_Label AnimationsLabel(const TDF_Label& acces);
|
||||
|
||||
//! Creates (if it does not exist) ShapeTool attribute on ShapesLabel().
|
||||
Standard_EXPORT static Handle(XCAFDoc_ShapeTool) ShapeTool (const TDF_Label& acces);
|
||||
@@ -112,6 +116,9 @@ public:
|
||||
|
||||
//! Creates (if it does not exist) NotesTool attribute on NotesLabel().
|
||||
Standard_EXPORT static Handle(XCAFDoc_NotesTool) NotesTool(const TDF_Label& acces);
|
||||
|
||||
//! Creates (if it does not exist) AnimationTool attribute on NotesLabel().
|
||||
Standard_EXPORT static Handle(XCAFDoc_AnimationTool) AnimationTool(const TDF_Label& acces);
|
||||
|
||||
Standard_EXPORT XCAFDoc_DocumentTool();
|
||||
|
||||
|
@@ -92,7 +92,7 @@ XCAFDoc_NoteBinData::Set(const TCollection_ExtendedString& theTitle,
|
||||
if (theFile.Size() > (Standard_Size)IntegerLast())
|
||||
return Standard_False;
|
||||
|
||||
myData.reset(new TColStd_HArray1OfByte(1, (Standard_Integer)theFile.Size()));
|
||||
myData.reset(new TColStd_HArray1OfByte(1, static_cast<Standard_Integer>(theFile.Size())));
|
||||
Standard_Integer nbReadBytes = 0;
|
||||
theFile.Read((Standard_Address)&myData->First(), myData->Length(), nbReadBytes);
|
||||
if (nbReadBytes < myData->Length())
|
||||
|
@@ -84,7 +84,7 @@ public:
|
||||
|
||||
DEFINE_STANDARD_RTTIEXT(XCAFDoc_NotesTool, TDF_Attribute)
|
||||
|
||||
Standard_EXPORT static const Standard_GUID& GetID();
|
||||
Standard_EXPORT static const Standard_GUID& GetID();
|
||||
|
||||
//! Create (if not exist) a notes tool from XCAFDoc on theLabel.
|
||||
Standard_EXPORT static Handle(XCAFDoc_NotesTool) Set(const TDF_Label& theLabel);
|
||||
@@ -142,28 +142,28 @@ public:
|
||||
//! \param [in] theGUID - assembly item's attribute GUID.
|
||||
//! \return annotated item label if it is found, otherwise - null label.
|
||||
Standard_EXPORT TDF_Label FindAnnotatedItemAttr(const XCAFDoc_AssemblyItemId& theItemId,
|
||||
const Standard_GUID& theGUID) const;
|
||||
const Standard_GUID& theGUID) const;
|
||||
|
||||
//! Finds a label of the given labeled item's attribute in the annotated items hive.
|
||||
//! \param [in] theItemLabel - item label.
|
||||
//! \param [in] theGUID - item's attribute GUID.
|
||||
//! \return annotated item label if it is found, otherwise - null label.
|
||||
Standard_EXPORT TDF_Label FindAnnotatedItemAttr(const TDF_Label& theItemLabel,
|
||||
const Standard_GUID& theGUID) const;
|
||||
const Standard_GUID& theGUID) const;
|
||||
|
||||
//! Finds a label of the given assembly item's subshape in the annotated items hive.
|
||||
//! \param [in] theItemId - assembly item ID.
|
||||
//! \param [in] theSubshapeIndex - assembly item's subshape index.
|
||||
//! \return annotated item label if it is found, otherwise - null label.
|
||||
Standard_EXPORT TDF_Label FindAnnotatedItemSubshape(const XCAFDoc_AssemblyItemId& theItemId,
|
||||
Standard_Integer theSubshapeIndex) const;
|
||||
Standard_Integer theSubshapeIndex) const;
|
||||
|
||||
//! Finds a label of the given labeled item's subshape in the annotated items hive.
|
||||
//! \param [in] theItemLabel - item label.
|
||||
//! \param [in] theSubshapeIndex - labeled item's subshape index.
|
||||
//! \return annotated item label if it is found, otherwise - null label.
|
||||
Standard_EXPORT TDF_Label FindAnnotatedItemSubshape(const TDF_Label& theItemLabel,
|
||||
Standard_Integer theSubshapeIndex) const;
|
||||
Standard_Integer theSubshapeIndex) const;
|
||||
|
||||
//! @}
|
||||
|
||||
@@ -178,8 +178,8 @@ public:
|
||||
//! \param [in] theComment - textual comment.
|
||||
//! \return a handle to the base note attribute.
|
||||
Standard_EXPORT Handle(XCAFDoc_Note) CreateComment(const TCollection_ExtendedString& theUserName,
|
||||
const TCollection_ExtendedString& theTimeStamp,
|
||||
const TCollection_ExtendedString& theComment);
|
||||
const TCollection_ExtendedString& theTimeStamp,
|
||||
const TCollection_ExtendedString& theComment);
|
||||
|
||||
//! Create a new 'balloon' note.
|
||||
//! Creates a new label under the notes hive and attaches \ref XCAFDoc_NoteBalloon
|
||||
@@ -189,8 +189,8 @@ public:
|
||||
//! \param [in] theComment - textual comment.
|
||||
//! \return a handle to the base note attribute.
|
||||
Standard_EXPORT Handle(XCAFDoc_Note) CreateBalloon(const TCollection_ExtendedString& theUserName,
|
||||
const TCollection_ExtendedString& theTimeStamp,
|
||||
const TCollection_ExtendedString& theComment);
|
||||
const TCollection_ExtendedString& theTimeStamp,
|
||||
const TCollection_ExtendedString& theComment);
|
||||
|
||||
//! Create a new note with data loaded from a binary file.
|
||||
//! Creates a new label under the notes hive and attaches \ref XCAFDoc_NoteComment
|
||||
@@ -202,10 +202,10 @@ public:
|
||||
//! \param [in] theFile - input binary file.
|
||||
//! \return a handle to the base note attribute.
|
||||
Standard_EXPORT Handle(XCAFDoc_Note) CreateBinData(const TCollection_ExtendedString& theUserName,
|
||||
const TCollection_ExtendedString& theTimeStamp,
|
||||
const TCollection_ExtendedString& theTitle,
|
||||
const TCollection_AsciiString& theMIMEtype,
|
||||
OSD_File& theFile);
|
||||
const TCollection_ExtendedString& theTimeStamp,
|
||||
const TCollection_ExtendedString& theTitle,
|
||||
const TCollection_AsciiString& theMIMEtype,
|
||||
OSD_File& theFile);
|
||||
|
||||
//! Create a new note with data loaded from a byte data array.
|
||||
//! Creates a new label under the notes hive and attaches \ref XCAFDoc_NoteComment
|
||||
@@ -217,10 +217,10 @@ public:
|
||||
//! \param [in] theData - byte data array.
|
||||
//! \return a handle to the base note attribute.
|
||||
Standard_EXPORT Handle(XCAFDoc_Note) CreateBinData(const TCollection_ExtendedString& theUserName,
|
||||
const TCollection_ExtendedString& theTimeStamp,
|
||||
const TCollection_ExtendedString& theTitle,
|
||||
const TCollection_AsciiString& theMIMEtype,
|
||||
const Handle(TColStd_HArray1OfByte)& theData);
|
||||
const TCollection_ExtendedString& theTimeStamp,
|
||||
const TCollection_ExtendedString& theTitle,
|
||||
const TCollection_AsciiString& theMIMEtype,
|
||||
const Handle(TColStd_HArray1OfByte)& theData);
|
||||
|
||||
//! @}
|
||||
|
||||
@@ -234,7 +234,7 @@ public:
|
||||
//! \param [out] theNoteLabels - sequence of labels.
|
||||
//! \return number of added labels.
|
||||
Standard_EXPORT Standard_Integer GetNotes(const XCAFDoc_AssemblyItemId& theItemId,
|
||||
TDF_LabelSequence& theNoteLabels) const;
|
||||
TDF_LabelSequence& theNoteLabels) const;
|
||||
|
||||
//! Gets all note labels of the labeled item.
|
||||
//! Notes linked to item's attributes aren't
|
||||
@@ -243,7 +243,7 @@ public:
|
||||
//! \param [out] theNoteLabels - sequence of labels.
|
||||
//! \return number of added labels.
|
||||
Standard_EXPORT Standard_Integer GetNotes(const TDF_Label& theItemLabel,
|
||||
TDF_LabelSequence& theNoteLabels) const;
|
||||
TDF_LabelSequence& theNoteLabels) const;
|
||||
|
||||
//! Gets all note labels of the assembly item's attribute.
|
||||
//! Notes linked to the item itself or to item's subshapes
|
||||
@@ -253,8 +253,8 @@ public:
|
||||
//! \param [out] theNoteLabels - sequence of labels.
|
||||
//! \return number of added labels.
|
||||
Standard_EXPORT Standard_Integer GetAttrNotes(const XCAFDoc_AssemblyItemId& theItemId,
|
||||
const Standard_GUID& theGUID,
|
||||
TDF_LabelSequence& theNoteLabels) const;
|
||||
const Standard_GUID& theGUID,
|
||||
TDF_LabelSequence& theNoteLabels) const;
|
||||
|
||||
//! Gets all note labels of the labeled item's attribute.
|
||||
//! Notes linked to the item itself or to item's subshapes
|
||||
@@ -264,8 +264,8 @@ public:
|
||||
//! \param [out] theNoteLabels - sequence of labels.
|
||||
//! \return number of added labels.
|
||||
Standard_EXPORT Standard_Integer GetAttrNotes(const TDF_Label& theItemLabel,
|
||||
const Standard_GUID& theGUID,
|
||||
TDF_LabelSequence& theNoteLabels) const;
|
||||
const Standard_GUID& theGUID,
|
||||
TDF_LabelSequence& theNoteLabels) const;
|
||||
|
||||
//! Gets all note labels of the annotated item.
|
||||
//! Notes linked to the item itself or to item's attributes
|
||||
@@ -275,8 +275,8 @@ public:
|
||||
//! \param [out] theNoteLabels - sequence of labels.
|
||||
//! \return number of added labels.
|
||||
Standard_EXPORT Standard_Integer GetSubshapeNotes(const XCAFDoc_AssemblyItemId& theItemId,
|
||||
Standard_Integer theSubshapeIndex,
|
||||
TDF_LabelSequence& theNoteLabels) const;
|
||||
Standard_Integer theSubshapeIndex,
|
||||
TDF_LabelSequence& theNoteLabels) const;
|
||||
|
||||
//! @}
|
||||
|
||||
@@ -288,14 +288,14 @@ public:
|
||||
//! \param [in] theItemId - assembly item ID.
|
||||
//! \return a handle to the assembly reference attribute.
|
||||
Standard_EXPORT Handle(XCAFDoc_AssemblyItemRef) AddNote(const TDF_Label& theNoteLabel,
|
||||
const XCAFDoc_AssemblyItemId& theItemId);
|
||||
const XCAFDoc_AssemblyItemId& theItemId);
|
||||
|
||||
//! Adds the given note to the labeled item.
|
||||
//! \param [in] theNoteLabel - note label.
|
||||
//! \param [in] theItemLabel - item label.
|
||||
//! \return a handle to the assembly reference attribute.
|
||||
Standard_EXPORT Handle(XCAFDoc_AssemblyItemRef) AddNote(const TDF_Label& theNoteLabel,
|
||||
const TDF_Label& theItemLabel);
|
||||
const TDF_Label& theItemLabel);
|
||||
|
||||
//! Adds the given note to the assembly item's attribute.
|
||||
//! \param [in] theNoteLabel - note label.
|
||||
@@ -303,8 +303,8 @@ public:
|
||||
//! \param [in] theGUID - assembly item's attribute GUID.
|
||||
//! \return a handle to the assembly reference attribute.
|
||||
Standard_EXPORT Handle(XCAFDoc_AssemblyItemRef) AddNoteToAttr(const TDF_Label& theNoteLabel,
|
||||
const XCAFDoc_AssemblyItemId& theItemId,
|
||||
const Standard_GUID& theGUID);
|
||||
const XCAFDoc_AssemblyItemId& theItemId,
|
||||
const Standard_GUID& theGUID);
|
||||
|
||||
//! Adds the given note to the labeled item's attribute.
|
||||
//! \param [in] theNoteLabel - note label.
|
||||
@@ -312,8 +312,8 @@ public:
|
||||
//! \param [in] theGUID - assembly item's attribute GUID.
|
||||
//! \return a handle to the assembly reference attribute.
|
||||
Standard_EXPORT Handle(XCAFDoc_AssemblyItemRef) AddNoteToAttr(const TDF_Label& theNoteLabel,
|
||||
const TDF_Label& theItemLabel,
|
||||
const Standard_GUID& theGUID);
|
||||
const TDF_Label& theItemLabel,
|
||||
const Standard_GUID& theGUID);
|
||||
|
||||
//! Adds the given note to the assembly item's subshape.
|
||||
//! \param [in] theNoteLabel - note label.
|
||||
@@ -321,8 +321,8 @@ public:
|
||||
//! \param [in] theSubshapeIndex - assembly item's subshape index.
|
||||
//! \return a handle to the assembly reference attribute.
|
||||
Standard_EXPORT Handle(XCAFDoc_AssemblyItemRef) AddNoteToSubshape(const TDF_Label& theNoteLabel,
|
||||
const XCAFDoc_AssemblyItemId& theItemId,
|
||||
Standard_Integer theSubshapeIndex);
|
||||
const XCAFDoc_AssemblyItemId& theItemId,
|
||||
Standard_Integer theSubshapeIndex);
|
||||
|
||||
//! Adds the given note to the labeled item's subshape.
|
||||
//! \param [in] theNoteLabel - note label.
|
||||
@@ -330,8 +330,8 @@ public:
|
||||
//! \param [in] theSubshapeIndex - assembly item's subshape index.
|
||||
//! \return a handle to the assembly reference attribute.
|
||||
Standard_EXPORT Handle(XCAFDoc_AssemblyItemRef) AddNoteToSubshape(const TDF_Label& theNoteLabel,
|
||||
const TDF_Label& theItemLabel,
|
||||
Standard_Integer theSubshapeIndex);
|
||||
const TDF_Label& theItemLabel,
|
||||
Standard_Integer theSubshapeIndex);
|
||||
|
||||
//! @}
|
||||
|
||||
@@ -346,8 +346,8 @@ public:
|
||||
//! linked with the note.
|
||||
//! \return true if the note is removed, otherwise - false.
|
||||
Standard_EXPORT Standard_Boolean RemoveNote(const TDF_Label& theNoteLabel,
|
||||
const XCAFDoc_AssemblyItemId& theItemId,
|
||||
Standard_Boolean theDelIfOrphan = Standard_False);
|
||||
const XCAFDoc_AssemblyItemId& theItemId,
|
||||
Standard_Boolean theDelIfOrphan = Standard_False);
|
||||
|
||||
//! Removes the given note from the labeled item.
|
||||
//! \param [in] theNoteLabel - note label.
|
||||
@@ -357,8 +357,8 @@ public:
|
||||
//! linked with the note.
|
||||
//! \return true if the note is removed, otherwise - false.
|
||||
Standard_EXPORT Standard_Boolean RemoveNote(const TDF_Label& theNoteLabel,
|
||||
const TDF_Label& theItemLabel,
|
||||
Standard_Boolean theDelIfOrphan = Standard_False);
|
||||
const TDF_Label& theItemLabel,
|
||||
Standard_Boolean theDelIfOrphan = Standard_False);
|
||||
|
||||
//! Removes the given note from the assembly item's subshape.
|
||||
//! \param [in] theNoteLabel - note label.
|
||||
@@ -369,9 +369,9 @@ public:
|
||||
//! subshape linked with the note.
|
||||
//! \return true if the note is removed, otherwise - false.
|
||||
Standard_EXPORT Standard_Boolean RemoveSubshapeNote(const TDF_Label& theNoteLabel,
|
||||
const XCAFDoc_AssemblyItemId& theItemId,
|
||||
Standard_Integer theSubshapeIndex,
|
||||
Standard_Boolean theDelIfOrphan = Standard_False);
|
||||
const XCAFDoc_AssemblyItemId& theItemId,
|
||||
Standard_Integer theSubshapeIndex,
|
||||
Standard_Boolean theDelIfOrphan = Standard_False);
|
||||
|
||||
//! Removes the given note from the labeled item's subshape.
|
||||
//! \param [in] theNoteLabel - note label.
|
||||
@@ -382,9 +382,9 @@ public:
|
||||
//! subshape linked with the note.
|
||||
//! \return true if the note is removed, otherwise - false.
|
||||
Standard_EXPORT Standard_Boolean RemoveSubshapeNote(const TDF_Label& theNoteLabel,
|
||||
const TDF_Label& theItemLabel,
|
||||
Standard_Integer theSubshapeIndex,
|
||||
Standard_Boolean theDelIfOrphan = Standard_False);
|
||||
const TDF_Label& theItemLabel,
|
||||
Standard_Integer theSubshapeIndex,
|
||||
Standard_Boolean theDelIfOrphan = Standard_False);
|
||||
|
||||
//! Removes a note from the assembly item's attribute.
|
||||
//! \param [in] theNoteLabel - note label.
|
||||
@@ -395,9 +395,9 @@ public:
|
||||
//! attribute linked with the note.
|
||||
//! \return true if the note is removed, otherwise - false.
|
||||
Standard_EXPORT Standard_Boolean RemoveAttrNote(const TDF_Label& theNoteLabel,
|
||||
const XCAFDoc_AssemblyItemId& theItemId,
|
||||
const Standard_GUID& theGUID,
|
||||
Standard_Boolean theDelIfOrphan = Standard_False);
|
||||
const XCAFDoc_AssemblyItemId& theItemId,
|
||||
const Standard_GUID& theGUID,
|
||||
Standard_Boolean theDelIfOrphan = Standard_False);
|
||||
|
||||
//! Removes a note from the labeled item's attribute.
|
||||
//! \param [in] theNoteLabel - note label.
|
||||
@@ -408,9 +408,9 @@ public:
|
||||
//! attribute linked with the note.
|
||||
//! \return true if the note is removed, otherwise - false.
|
||||
Standard_EXPORT Standard_Boolean RemoveAttrNote(const TDF_Label& theNoteLabel,
|
||||
const TDF_Label& theItemLabel,
|
||||
const Standard_GUID& theGUID,
|
||||
Standard_Boolean theDelIfOrphan = Standard_False);
|
||||
const TDF_Label& theItemLabel,
|
||||
const Standard_GUID& theGUID,
|
||||
Standard_Boolean theDelIfOrphan = Standard_False);
|
||||
|
||||
//! Removes all notes from the assembly item.
|
||||
//! \param [in] theItemId - assembly item ID.
|
||||
@@ -419,7 +419,7 @@ public:
|
||||
//! linked with the notes.
|
||||
//! \return true if the notes are removed, otherwise - false.
|
||||
Standard_EXPORT Standard_Boolean RemoveAllNotes(const XCAFDoc_AssemblyItemId& theItemId,
|
||||
Standard_Boolean theDelIfOrphan = Standard_False);
|
||||
Standard_Boolean theDelIfOrphan = Standard_False);
|
||||
|
||||
//! Removes all notes from the labeled item.
|
||||
//! \param [in] theItemLabel - item label.
|
||||
@@ -428,7 +428,7 @@ public:
|
||||
//! linked with the notes.
|
||||
//! \return true if the notes are removed, otherwise - false.
|
||||
Standard_EXPORT Standard_Boolean RemoveAllNotes(const TDF_Label& theItemLabel,
|
||||
Standard_Boolean theDelIfOrphan = Standard_False);
|
||||
Standard_Boolean theDelIfOrphan = Standard_False);
|
||||
|
||||
//! Removes all notes from the assembly item's subshape.
|
||||
//! \param [in] theItemId - assembly item ID.
|
||||
@@ -438,8 +438,8 @@ public:
|
||||
//! linked with the notes.
|
||||
//! \return true if the notes are removed, otherwise - false.
|
||||
Standard_EXPORT Standard_Boolean RemoveAllSubshapeNotes(const XCAFDoc_AssemblyItemId& theItemId,
|
||||
Standard_Integer theSubshapeIndex,
|
||||
Standard_Boolean theDelIfOrphan = Standard_False);
|
||||
Standard_Integer theSubshapeIndex,
|
||||
Standard_Boolean theDelIfOrphan = Standard_False);
|
||||
|
||||
//! Removes all notes from the assembly item's attribute.
|
||||
//! \param [in] theItemId - assembly item ID.
|
||||
@@ -449,8 +449,8 @@ public:
|
||||
//! linked with the notes.
|
||||
//! \return true if the notes are removed, otherwise - false.
|
||||
Standard_EXPORT Standard_Boolean RemoveAllAttrNotes(const XCAFDoc_AssemblyItemId& theItemId,
|
||||
const Standard_GUID& theGUID,
|
||||
Standard_Boolean theDelIfOrphan = Standard_False);
|
||||
const Standard_GUID& theGUID,
|
||||
Standard_Boolean theDelIfOrphan = Standard_False);
|
||||
|
||||
//! Removes all notes from the labeled item's attribute.
|
||||
//! \param [in] theItemLabel - item label.
|
||||
@@ -460,8 +460,8 @@ public:
|
||||
//! linked with the notes.
|
||||
//! \return true if the notes are removed, otherwise - false.
|
||||
Standard_EXPORT Standard_Boolean RemoveAllAttrNotes(const TDF_Label& theItemLabel,
|
||||
const Standard_GUID& theGUID,
|
||||
Standard_Boolean theDelIfOrphan = Standard_False);
|
||||
const Standard_GUID& theGUID,
|
||||
Standard_Boolean theDelIfOrphan = Standard_False);
|
||||
|
||||
//! @}
|
||||
|
||||
@@ -497,7 +497,7 @@ public:
|
||||
//! The label sequence isn't cleared beforehand.
|
||||
//! \param [out] theNoteLabels - sequence of labels.
|
||||
Standard_EXPORT void GetOrphanNotes(TDF_LabelSequence& theNoteLabels) const;
|
||||
|
||||
|
||||
//! Deletes all notes that aren't linked to annotated items.
|
||||
//! \return number of deleted notes.
|
||||
Standard_EXPORT Standard_Integer DeleteOrphanNotes();
|
||||
@@ -510,8 +510,8 @@ public:
|
||||
Standard_EXPORT const Standard_GUID& ID() const Standard_OVERRIDE;
|
||||
Standard_EXPORT Handle(TDF_Attribute) NewEmpty() const Standard_OVERRIDE;
|
||||
Standard_EXPORT void Restore(const Handle(TDF_Attribute)& theAttrFrom) Standard_OVERRIDE;
|
||||
Standard_EXPORT void Paste(const Handle(TDF_Attribute)& theAttrInto,
|
||||
const Handle(TDF_RelocationTable)& theRT) const Standard_OVERRIDE;
|
||||
Standard_EXPORT void Paste(const Handle(TDF_Attribute)& theAttrInto,
|
||||
const Handle(TDF_RelocationTable)& theRT) const Standard_OVERRIDE;
|
||||
Standard_EXPORT Standard_OStream& Dump(Standard_OStream& theOS) const Standard_OVERRIDE;
|
||||
|
||||
};
|
||||
|
@@ -1031,8 +1031,11 @@ Standard_Boolean XCAFDoc_ShapeTool::IsSubShape (const TDF_Label &shapeL,
|
||||
const TopoDS_Shape &sub) const
|
||||
{
|
||||
Handle(XCAFDoc_ShapeMapTool) A;
|
||||
if ( ! shapeL.FindAttribute(XCAFDoc_ShapeMapTool::GetID(), A) )
|
||||
return Standard_False;
|
||||
if (!shapeL.FindAttribute(XCAFDoc_ShapeMapTool::GetID(), A)) {
|
||||
A = XCAFDoc_ShapeMapTool::Set(shapeL);
|
||||
TopoDS_Shape aShape = GetShape(shapeL);
|
||||
A->SetShape(aShape);
|
||||
}
|
||||
|
||||
//TopoDS_Shape S = GetShape ( shapeL );
|
||||
//return ! S.IsNull() && CheckSubShape ( S, sub );
|
||||
|
@@ -20,6 +20,7 @@
|
||||
#include <TDataStd_Integer.hxx>
|
||||
#include <TDataStd_Real.hxx>
|
||||
#include <TDataStd_RealArray.hxx>
|
||||
#include <TDataStd_ByteArray.hxx>
|
||||
#include <TDataXtd_Axis.hxx>
|
||||
#include <TDataXtd_Geometry.hxx>
|
||||
#include <TDataXtd_Plane.hxx>
|
||||
@@ -45,7 +46,10 @@ enum ChildLab
|
||||
ChildLab_BackPlaneDistance,
|
||||
ChildLab_ViewVolumeSidesClipping,
|
||||
ChildLab_ClippingExpression,
|
||||
ChildLab_GDTPoints
|
||||
ChildLab_GDTPoints,
|
||||
ChildLab_Image,
|
||||
ChildLab_EnabledShapes,
|
||||
ChildLab_NotePoints
|
||||
};
|
||||
|
||||
//=======================================================================
|
||||
@@ -149,6 +153,32 @@ void XCAFDoc_View::SetObject (const Handle(XCAFView_Object)& theObject)
|
||||
TDataXtd_Point::Set(aPointsLabel.FindChild(i), theObject->GDTPoint(i));
|
||||
}
|
||||
}
|
||||
//Image
|
||||
if (theObject->HasImage())
|
||||
{
|
||||
Handle(TColStd_HArray1OfByte) image = theObject->Image();
|
||||
Handle(TDataStd_ByteArray) arr = TDataStd_ByteArray::Set(Label().FindChild(ChildLab_Image), image->Lower(), image->Upper());
|
||||
for (Standard_Integer i = image->Lower(); i <= image->Upper(); i++) {
|
||||
arr->SetValue(i, image->Value(i));
|
||||
}
|
||||
}
|
||||
//shapes transparency
|
||||
if (theObject->HasEnabledShapes())
|
||||
{
|
||||
TDF_Label aShapeTranspLabel = Label().FindChild(ChildLab_EnabledShapes);
|
||||
for (Standard_Integer i = 1; i <= theObject->NbEnabledShapes(); i++) {
|
||||
Standard_Integer aValue = theObject->EnabledShape(i) ? 1 : 0;
|
||||
TDataStd_Integer::Set(aShapeTranspLabel.FindChild(i), aValue);
|
||||
}
|
||||
}
|
||||
//note points
|
||||
if (theObject->HasNotePoints())
|
||||
{
|
||||
TDF_Label aPointsLabel = Label().FindChild(ChildLab_NotePoints);
|
||||
for (Standard_Integer i = 1; i <= theObject->NbNotePoints(); i++) {
|
||||
TDataXtd_Point::Set(aPointsLabel.FindChild(i), theObject->NotePoint(i));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
@@ -259,7 +289,37 @@ Handle(XCAFView_Object) XCAFDoc_View::GetObject() const
|
||||
anObj->SetGDTPoint(i, aPoint);
|
||||
}
|
||||
}
|
||||
//Image
|
||||
Handle(TDataStd_ByteArray) anArr;
|
||||
if (Label().FindChild(ChildLab_Image).FindAttribute(TDataStd_ByteArray::GetID(), anArr)) {
|
||||
anObj->SetImage(anArr->InternalArray());
|
||||
}
|
||||
|
||||
// Shapes transparency
|
||||
if (!Label().FindChild(ChildLab_EnabledShapes, Standard_False).IsNull()) {
|
||||
TDF_Label aShapesTranspLabel = Label().FindChild(ChildLab_EnabledShapes);
|
||||
anObj->CreateEnabledShapes(aShapesTranspLabel.NbChildren());
|
||||
for (Standard_Integer i = 1; i <= aShapesTranspLabel.NbChildren(); i++) {
|
||||
gp_Pnt aPoint;
|
||||
Handle(TDataStd_Integer) aTranspAttr;
|
||||
aShapesTranspLabel.FindChild(i).FindAttribute(TDataStd_Integer::GetID(), aTranspAttr);
|
||||
Standard_Boolean aValue = (aTranspAttr->Get() == 1);
|
||||
anObj->SetEnabledShape(i, aValue);
|
||||
}
|
||||
}
|
||||
|
||||
// Note Points
|
||||
if (!Label().FindChild(ChildLab_NotePoints, Standard_False).IsNull()) {
|
||||
TDF_Label aPointsLabel = Label().FindChild(ChildLab_NotePoints);
|
||||
anObj->CreateNotePoints(aPointsLabel.NbChildren());
|
||||
for (Standard_Integer i = 1; i <= aPointsLabel.NbChildren(); i++) {
|
||||
gp_Pnt aPoint;
|
||||
Handle(TDataXtd_Point) aPointAttr;
|
||||
aPointsLabel.FindChild(i).FindAttribute(TDataXtd_Point::GetID(), aPointAttr);
|
||||
TDataXtd_Geometry::Point(aPointAttr->Label(), aPoint);
|
||||
anObj->SetNotePoint(i, aPoint);
|
||||
}
|
||||
}
|
||||
return anObj;
|
||||
}
|
||||
|
||||
|
@@ -287,11 +287,10 @@ void XCAFDoc_ViewTool::SetView(const TDF_LabelSequence& theShapeLabels,
|
||||
aPlaneGNode = aChGNode->GetFather(1);
|
||||
aPlaneGNode->UnSetChild(aChGNode);
|
||||
if (aPlaneGNode->NbChildren() == 0)
|
||||
aPlaneGNode->ForgetAttribute(XCAFDoc::ViewRefGDTGUID());
|
||||
aPlaneGNode->ForgetAttribute(XCAFDoc::ViewRefPlaneGUID());
|
||||
}
|
||||
theViewL.ForgetAttribute(XCAFDoc::ViewRefPlaneGUID());
|
||||
}
|
||||
|
||||
if (!theViewL.FindAttribute(XCAFDoc::ViewRefShapeGUID(), aChGNode) && theShapeLabels.Length() > 0) {
|
||||
aChGNode = new XCAFDoc_GraphNode;
|
||||
aChGNode = XCAFDoc_GraphNode::Set(theViewL);
|
||||
@@ -426,7 +425,7 @@ void XCAFDoc_ViewTool::SetClippingPlanes(const TDF_LabelSequence& theClippingPla
|
||||
aPlaneGNode = aChGNode->GetFather(1);
|
||||
aPlaneGNode->UnSetChild(aChGNode);
|
||||
if (aPlaneGNode->NbChildren() == 0)
|
||||
aPlaneGNode->ForgetAttribute(XCAFDoc::ViewRefGDTGUID());
|
||||
aPlaneGNode->ForgetAttribute(XCAFDoc::ViewRefPlaneGUID());
|
||||
}
|
||||
theViewL.ForgetAttribute(XCAFDoc::ViewRefPlaneGUID());
|
||||
}
|
||||
@@ -447,7 +446,86 @@ void XCAFDoc_ViewTool::SetClippingPlanes(const TDF_LabelSequence& theClippingPla
|
||||
aChGNode->SetFather(aPlaneGNode);
|
||||
}
|
||||
}
|
||||
//=======================================================================
|
||||
//function : SetEnabledShapes
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void XCAFDoc_ViewTool::SetEnabledShapes(const TDF_LabelSequence& theShapesTransparencyLabels,
|
||||
const TDF_Label& theViewL) const
|
||||
{
|
||||
if (!IsView(theViewL))
|
||||
return;
|
||||
|
||||
Handle(XCAFDoc_GraphNode) aChGNode;
|
||||
Handle(XCAFDoc_GraphNode) aShapeGNode;
|
||||
|
||||
if (theViewL.FindAttribute(XCAFDoc::ViewRefEnabledShapesGUID(), aChGNode)) {
|
||||
while (aChGNode->NbFathers() > 0) {
|
||||
aShapeGNode = aChGNode->GetFather(1);
|
||||
aShapeGNode->UnSetChild(aChGNode);
|
||||
if (aShapeGNode->NbChildren() == 0)
|
||||
aShapeGNode->ForgetAttribute(XCAFDoc::ViewRefEnabledShapesGUID());
|
||||
}
|
||||
theViewL.ForgetAttribute(XCAFDoc::ViewRefEnabledShapesGUID());
|
||||
}
|
||||
|
||||
|
||||
if (!theViewL.FindAttribute(XCAFDoc::ViewRefEnabledShapesGUID(), aChGNode) && theShapesTransparencyLabels.Length() > 0) {
|
||||
aChGNode = new XCAFDoc_GraphNode;
|
||||
aChGNode = XCAFDoc_GraphNode::Set(theViewL);
|
||||
aChGNode->SetGraphID(XCAFDoc::ViewRefEnabledShapesGUID());
|
||||
}
|
||||
for (Standard_Integer i = theShapesTransparencyLabels.Lower(); i <= theShapesTransparencyLabels.Upper(); i++)
|
||||
{
|
||||
if (!theShapesTransparencyLabels.Value(i).FindAttribute(XCAFDoc::ViewRefEnabledShapesGUID(), aShapeGNode)) {
|
||||
aShapeGNode = new XCAFDoc_GraphNode;
|
||||
aShapeGNode = XCAFDoc_GraphNode::Set(theShapesTransparencyLabels.Value(i));
|
||||
}
|
||||
aShapeGNode->SetGraphID(XCAFDoc::ViewRefEnabledShapesGUID());
|
||||
aShapeGNode->SetChild(aChGNode);
|
||||
aChGNode->SetFather(aShapeGNode);
|
||||
}
|
||||
}
|
||||
//=======================================================================
|
||||
//function : SetNotes
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void XCAFDoc_ViewTool::SetNotes(const TDF_LabelSequence& theNoteLabels,
|
||||
const TDF_Label& theViewL) const
|
||||
{
|
||||
if (!IsView(theViewL))
|
||||
return;
|
||||
|
||||
Handle(XCAFDoc_GraphNode) aChGNode;
|
||||
Handle(XCAFDoc_GraphNode) aNoteGNode;
|
||||
|
||||
if (theViewL.FindAttribute(XCAFDoc::ViewRefNoteGUID(), aChGNode)) {
|
||||
while (aChGNode->NbFathers() > 0) {
|
||||
aNoteGNode = aChGNode->GetFather(1);
|
||||
aNoteGNode->UnSetChild(aChGNode);
|
||||
if (aNoteGNode->NbChildren() == 0)
|
||||
aNoteGNode->ForgetAttribute(XCAFDoc::ViewRefNoteGUID());
|
||||
}
|
||||
theViewL.ForgetAttribute(XCAFDoc::ViewRefNoteGUID());
|
||||
}
|
||||
|
||||
|
||||
if (!theViewL.FindAttribute(XCAFDoc::ViewRefNoteGUID(), aChGNode) && theNoteLabels.Length() > 0) {
|
||||
aChGNode = new XCAFDoc_GraphNode;
|
||||
aChGNode = XCAFDoc_GraphNode::Set(theViewL);
|
||||
aChGNode->SetGraphID(XCAFDoc::ViewRefNoteGUID());
|
||||
}
|
||||
for (Standard_Integer i = theNoteLabels.Lower(); i <= theNoteLabels.Upper(); i++)
|
||||
{
|
||||
if (!theNoteLabels.Value(i).FindAttribute(XCAFDoc::ViewRefNoteGUID(), aNoteGNode)) {
|
||||
aNoteGNode = new XCAFDoc_GraphNode;
|
||||
aNoteGNode = XCAFDoc_GraphNode::Set(theNoteLabels.Value(i));
|
||||
}
|
||||
aNoteGNode->SetGraphID(XCAFDoc::ViewRefNoteGUID());
|
||||
aNoteGNode->SetChild(aChGNode);
|
||||
aChGNode->SetFather(aNoteGNode);
|
||||
}
|
||||
}
|
||||
//=======================================================================
|
||||
//function : RemoveView
|
||||
//purpose :
|
||||
@@ -561,6 +639,30 @@ Standard_Boolean XCAFDoc_ViewTool::GetRefClippingPlaneLabel(const TDF_Label& the
|
||||
return Standard_True;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : GetRefEnabledShapesLabel
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
Standard_Boolean XCAFDoc_ViewTool::GetRefEnabledShapesLabel(const TDF_Label& theViewL,
|
||||
TDF_LabelSequence& theShapesTranspanencyLabels) const
|
||||
{
|
||||
theShapesTranspanencyLabels.Clear();
|
||||
Handle(TDataStd_TreeNode) aNode;
|
||||
if (!theViewL.FindAttribute(XCAFDoc::ViewRefGUID(), aNode) || !aNode->HasFather()) {
|
||||
Handle(XCAFDoc_GraphNode) aGNode;
|
||||
if (theViewL.FindAttribute(XCAFDoc::ViewRefEnabledShapesGUID(), aGNode) && aGNode->NbFathers() > 0) {
|
||||
for (Standard_Integer i = 1; i <= aGNode->NbFathers(); i++)
|
||||
theShapesTranspanencyLabels.Append(aGNode->GetFather(i)->Label());
|
||||
return Standard_True;
|
||||
}
|
||||
else
|
||||
return Standard_False;
|
||||
}
|
||||
|
||||
theShapesTranspanencyLabels.Append(aNode->Father()->Label());
|
||||
return Standard_True;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : GetRefNoteLabel
|
||||
//purpose :
|
||||
@@ -666,6 +768,25 @@ Standard_Boolean XCAFDoc_ViewTool::GetViewLabelsForClippingPlane(const TDF_Label
|
||||
return aResult;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function :GetViewLabelsForEnabledShapesLabel
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
Standard_Boolean XCAFDoc_ViewTool::GetViewLabelsForEnabledShapesLabel(const TDF_Label& theShapesTransparencyL,
|
||||
TDF_LabelSequence& theViews) const
|
||||
{
|
||||
Handle(XCAFDoc_GraphNode) aGNode;
|
||||
Standard_Boolean aResult = Standard_False;
|
||||
if (theShapesTransparencyL.FindAttribute(XCAFDoc::ViewRefPlaneGUID(), aGNode) && aGNode->NbChildren() > 0) {
|
||||
for (Standard_Integer i = 1; i <= aGNode->NbChildren(); i++)
|
||||
{
|
||||
theViews.Append(aGNode->GetChild(i)->Label());
|
||||
}
|
||||
aResult = Standard_True;
|
||||
}
|
||||
return aResult;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : GetViewLabelsForNote
|
||||
//purpose :
|
||||
|
@@ -86,6 +86,12 @@ public:
|
||||
//! Set Clipping planes to given View
|
||||
Standard_EXPORT void SetClippingPlanes(const TDF_LabelSequence& theClippingPlaneLabels,
|
||||
const TDF_Label& theViewL) const;
|
||||
Standard_EXPORT void SetEnabledShapes(const TDF_LabelSequence& theShapesTransparencyLabels,
|
||||
const TDF_Label& theViewL) const;
|
||||
|
||||
//! Set Notes to given View
|
||||
Standard_EXPORT void SetNotes(const TDF_LabelSequence& theNoteLabels,
|
||||
const TDF_Label& theViewL) const;
|
||||
|
||||
//! Remove View
|
||||
Standard_EXPORT void RemoveView(const TDF_Label& theViewL);
|
||||
@@ -105,6 +111,9 @@ public:
|
||||
//! Returns all View labels defined for label AnnotationL
|
||||
Standard_EXPORT Standard_Boolean GetViewLabelsForAnnotation(const TDF_Label& theAnnotationL, TDF_LabelSequence& theViews) const;
|
||||
|
||||
//! Returns all View labels defined for label Shapes transparency
|
||||
Standard_EXPORT Standard_Boolean GetViewLabelsForEnabledShapesLabel(const TDF_Label& theShapesTransparencyL, TDF_LabelSequence& theViews) const;
|
||||
|
||||
//! Adds a view definition to a View table and returns its label
|
||||
Standard_EXPORT TDF_Label AddView() ;
|
||||
|
||||
@@ -120,6 +129,9 @@ public:
|
||||
//! Returns False if the theViewL is not in View table
|
||||
Standard_EXPORT Standard_Boolean GetRefClippingPlaneLabel(const TDF_Label& theViewL, TDF_LabelSequence& theClippingPlaneLabels) const;
|
||||
|
||||
//! Returns shapes transparency labels defined for label theViewL
|
||||
//! Returns False if the theViewL is not in View table
|
||||
Standard_EXPORT Standard_Boolean GetRefEnabledShapesLabel(const TDF_Label& theViewL, TDF_LabelSequence& theShapesTranspanencyLabels) const;
|
||||
//! Returns Notes labels defined for label theViewL
|
||||
//! Returns False if the theViewL is not in View table
|
||||
Standard_EXPORT Standard_Boolean GetRefNoteLabel(const TDF_Label& theViewL, TDF_LabelSequence& theNoteLabels) const;
|
||||
|
@@ -28,6 +28,9 @@ XCAFView_Object::XCAFView_Object()
|
||||
myBackPlaneClipping = Standard_False;
|
||||
myViewVolumeSidesClipping = Standard_False;
|
||||
myGDTPoints = NULL;
|
||||
myImage = NULL;
|
||||
myEnabledShapes = NULL;
|
||||
myNotePoints = NULL;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
@@ -50,5 +53,8 @@ XCAFView_Object::XCAFView_Object(const Handle(XCAFView_Object)& theObj)
|
||||
myBackPlaneDistance = theObj->myBackPlaneDistance;
|
||||
myViewVolumeSidesClipping = theObj->myViewVolumeSidesClipping;
|
||||
myGDTPoints = NULL;
|
||||
myImage = theObj->myImage;
|
||||
myEnabledShapes = NULL;
|
||||
myGDTPoints = NULL;
|
||||
}
|
||||
|
||||
|
@@ -26,6 +26,8 @@
|
||||
#include <TColgp_HArray1OfPnt.hxx>
|
||||
#include <TCollection_HAsciiString.hxx>
|
||||
#include <XCAFView_ProjectionType.hxx>
|
||||
#include <TColStd_HArray1OfByte.hxx>
|
||||
#include <TColStd_HArray1OfBoolean.hxx>
|
||||
|
||||
class XCAFView_Object;
|
||||
DEFINE_STANDARD_HANDLE(XCAFView_Object, Standard_Transient)
|
||||
@@ -217,7 +219,93 @@ public:
|
||||
else
|
||||
return gp_Pnt();
|
||||
}
|
||||
|
||||
|
||||
Standard_EXPORT void SetImage(Handle(TColStd_HArray1OfByte) theImage)
|
||||
{
|
||||
myImage = theImage;
|
||||
}
|
||||
|
||||
Standard_EXPORT Handle(TColStd_HArray1OfByte) Image()
|
||||
{
|
||||
return myImage;
|
||||
}
|
||||
|
||||
Standard_EXPORT Standard_Boolean HasImage()
|
||||
{
|
||||
return (!myImage.IsNull());
|
||||
}
|
||||
|
||||
Standard_EXPORT void CreateEnabledShapes(const Standard_Integer theLenght)
|
||||
{
|
||||
if (theLenght > 0)
|
||||
myEnabledShapes = new TColStd_HArray1OfBoolean(1, theLenght);
|
||||
}
|
||||
|
||||
Standard_EXPORT Standard_Boolean HasEnabledShapes()
|
||||
{
|
||||
return (!myEnabledShapes.IsNull());
|
||||
}
|
||||
|
||||
Standard_EXPORT Standard_Integer NbEnabledShapes()
|
||||
{
|
||||
if (myEnabledShapes.IsNull())
|
||||
return 0;
|
||||
return myEnabledShapes->Length();
|
||||
}
|
||||
|
||||
Standard_EXPORT void SetEnabledShape(const Standard_Integer theIndex, const bool theVal)
|
||||
{
|
||||
if (myEnabledShapes.IsNull())
|
||||
return;
|
||||
if (theIndex > 0 && theIndex <= myEnabledShapes->Length())
|
||||
myEnabledShapes->SetValue(theIndex, theVal);
|
||||
}
|
||||
|
||||
Standard_EXPORT bool EnabledShape(const Standard_Integer theIndex)
|
||||
{
|
||||
if (myEnabledShapes.IsNull())
|
||||
return Standard_False;
|
||||
if (theIndex > 0 && theIndex <= myEnabledShapes->Length())
|
||||
return myEnabledShapes->Value(theIndex);
|
||||
else
|
||||
return Standard_False;
|
||||
}
|
||||
Standard_EXPORT void CreateNotePoints(const Standard_Integer theLenght)
|
||||
{
|
||||
if (theLenght > 0)
|
||||
myNotePoints = new TColgp_HArray1OfPnt(1, theLenght);
|
||||
}
|
||||
|
||||
Standard_EXPORT Standard_Boolean HasNotePoints()
|
||||
{
|
||||
return (!myNotePoints.IsNull());
|
||||
}
|
||||
|
||||
Standard_EXPORT Standard_Integer NbNotePoints()
|
||||
{
|
||||
if (myNotePoints.IsNull())
|
||||
return 0;
|
||||
return myNotePoints->Length();
|
||||
}
|
||||
|
||||
Standard_EXPORT void SetNotePoint(const Standard_Integer theIndex, const gp_Pnt thePoint)
|
||||
{
|
||||
if (myNotePoints.IsNull())
|
||||
return;
|
||||
if (theIndex > 0 && theIndex <= myNotePoints->Length())
|
||||
myNotePoints->SetValue(theIndex, thePoint);
|
||||
}
|
||||
|
||||
Standard_EXPORT gp_Pnt NotePoint(const Standard_Integer theIndex)
|
||||
{
|
||||
if (myNotePoints.IsNull())
|
||||
return gp_Pnt();
|
||||
if (theIndex > 0 && theIndex <= myNotePoints->Length())
|
||||
return myNotePoints->Value(theIndex);
|
||||
else
|
||||
return gp_Pnt();
|
||||
}
|
||||
|
||||
DEFINE_STANDARD_RTTIEXT(XCAFView_Object,Standard_Transient)
|
||||
|
||||
private:
|
||||
@@ -237,6 +325,9 @@ private:
|
||||
Standard_Real myBackPlaneDistance;
|
||||
Standard_Boolean myViewVolumeSidesClipping;
|
||||
Handle(TColgp_HArray1OfPnt) myGDTPoints; // Point for each GDT to describe position of GDT frame in View.
|
||||
Handle(TColStd_HArray1OfByte) myImage;
|
||||
Handle(TColStd_HArray1OfBoolean) myEnabledShapes;
|
||||
Handle(TColgp_HArray1OfPnt) myNotePoints;
|
||||
};
|
||||
|
||||
#endif // _XCAFView_Object_HeaderFile
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user