mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-04-21 10:13:43 +03:00
446 lines
13 KiB
C++
Executable File
446 lines
13 KiB
C++
Executable File
//Updates:
|
|
// GG 24/03/98 Add useMFT parameter to SetFontMap method.
|
|
// GG 07/07/98 BUC60258 Add SetMarkMap() method
|
|
|
|
#define PRO10988 //DCB Resets grid color indices after colormap change
|
|
|
|
#define IMP080300 //GG
|
|
// -> Optimize the SetColorMap() and InitializeColor() methods
|
|
// Review the 14/09/01 to avoid regression
|
|
// See new deferred method in Aspect_ColorMap
|
|
|
|
#include <V2d_Viewer.ixx>
|
|
#include <V2d_View.hxx>
|
|
#include <V2d_DefaultMap.hxx>
|
|
#include <Graphic2d_View.hxx>
|
|
#include <Aspect_GenericColorMap.hxx>
|
|
#include <Aspect_WindowDriver.hxx>
|
|
#include <TColStd_MapOfInteger.hxx>
|
|
#include <Aspect_ColorMapEntry.hxx>
|
|
|
|
/*=================================================================*/
|
|
V2d_Viewer::V2d_Viewer(const Handle(Aspect_GraphicDevice)& aGraphicDevice,
|
|
const Standard_ExtString aName,
|
|
const Standard_CString aDomain)
|
|
:Viewer_Viewer(aGraphicDevice,aName,aDomain,1),
|
|
myColorMap(V2d_DefaultMap::ColorMap()),
|
|
myTypeMap(V2d_DefaultMap::TypeMap()),
|
|
myWidthMap(V2d_DefaultMap::WidthMap()),
|
|
myFontMap(V2d_DefaultMap::FontMap()),
|
|
myMarkMap(V2d_DefaultMap::MarkMap()),
|
|
myGraphicView(new Graphic2d_View()),
|
|
myViews(),
|
|
myViewsIterator(),
|
|
myRGrid(),
|
|
myCGrid()
|
|
{
|
|
Init();
|
|
}
|
|
|
|
/*=================================================================*/
|
|
V2d_Viewer::V2d_Viewer(const Handle(Aspect_GraphicDevice)& aGraphicDevice,
|
|
const Handle(Graphic2d_View)& aView,
|
|
const Standard_ExtString aName,
|
|
const Standard_CString aDomain)
|
|
:Viewer_Viewer(aGraphicDevice,aName,aDomain,1),
|
|
myColorMap(V2d_DefaultMap::ColorMap()),
|
|
myTypeMap(V2d_DefaultMap::TypeMap()),
|
|
myWidthMap(V2d_DefaultMap::WidthMap()),
|
|
myFontMap(V2d_DefaultMap::FontMap()),
|
|
myMarkMap(V2d_DefaultMap::MarkMap()),
|
|
myGraphicView(aView),
|
|
myViews(),
|
|
myViewsIterator(),
|
|
myRGrid(),
|
|
myCGrid()
|
|
{
|
|
Init();
|
|
}
|
|
|
|
/*=================================================================*/
|
|
void V2d_Viewer::Init() {
|
|
myHitPointMarkerIndex = 1;
|
|
myHitPointColorIndex = 0;
|
|
Standard_Integer i1 = InitializeColor(Quantity_NOC_GRAY50);
|
|
Standard_Integer i2 = InitializeColor(Quantity_NOC_GRAY70);
|
|
myHitPointColorIndex = InitializeColor(Quantity_NOC_WHITE);
|
|
myCoordinatesColorIndex = myHitPointColorIndex ;
|
|
myGridType = Aspect_GT_Rectangular;
|
|
|
|
myUseMFT = Standard_True;
|
|
#ifdef PRO10988
|
|
if( myRGrid.IsNull() ) myRGrid = new V2d_RectangularGrid(this,i1,i2);
|
|
else myRGrid -> SetColorIndices (i1, i2);
|
|
if( myCGrid.IsNull() ) myCGrid = new V2d_CircularGrid(this,i1,i2);
|
|
else myCGrid -> SetColorIndices (i1, i2);
|
|
#else
|
|
myRGrid = new V2d_RectangularGrid(this,i1,i2);
|
|
myCGrid = new V2d_CircularGrid(this,i1,i2);
|
|
#endif
|
|
}
|
|
|
|
|
|
/*=================================================================*/
|
|
void V2d_Viewer::AddView(const Handle(V2d_View)& aView) {
|
|
myViews.Append(aView);
|
|
IncrCount();
|
|
}
|
|
|
|
/*=================================================================*/
|
|
void V2d_Viewer::RemoveView(const Handle(V2d_View)& aView) {
|
|
|
|
myViewsIterator.Initialize(myViews);
|
|
while(myViewsIterator.More())
|
|
if(aView == myViewsIterator.Value()) {
|
|
myViews.Remove(myViewsIterator);}
|
|
else
|
|
myViewsIterator.Next();
|
|
}
|
|
|
|
/*=================================================================*/
|
|
void V2d_Viewer::SetColorMap(const Handle(Aspect_ColorMap)& aColorMap) {
|
|
myColorMap = aColorMap;
|
|
#ifdef PRO10988
|
|
// Need to call to redefine myColorIndex1 and myColorIndex2,
|
|
// which may not be available in new colormap.
|
|
#ifdef IMP080300
|
|
if( myColorMap != aColorMap ) Init ();
|
|
#else
|
|
Init();
|
|
#endif
|
|
// We need to pass myColorMap in the views because
|
|
// it could be changed in Init() method by InitializeColor().
|
|
for (InitActiveViews();MoreActiveViews();NextActiveViews()) {
|
|
ActiveView()->Driver()->SetColorMap(myColorMap);
|
|
}
|
|
#else
|
|
for (InitActiveViews();MoreActiveViews();NextActiveViews()) {
|
|
ActiveView()->Driver()->SetColorMap(aColorMap);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
/*=================================================================*/
|
|
Handle(Aspect_ColorMap) V2d_Viewer::ColorMap() const {
|
|
return myColorMap;
|
|
}
|
|
|
|
/*=================================================================*/
|
|
void V2d_Viewer::SetTypeMap(const Handle(Aspect_TypeMap)& aTypeMap) {
|
|
myTypeMap = aTypeMap;
|
|
for (InitActiveViews();MoreActiveViews();NextActiveViews()) {
|
|
ActiveView()->Driver()->SetTypeMap(aTypeMap);
|
|
}
|
|
}
|
|
|
|
/*=================================================================*/
|
|
Handle(Aspect_TypeMap) V2d_Viewer::TypeMap() const {
|
|
return myTypeMap;
|
|
}
|
|
|
|
/*=================================================================*/
|
|
void V2d_Viewer::SetWidthMap(const Handle(Aspect_WidthMap)& aWidthMap) {
|
|
myWidthMap = aWidthMap;
|
|
for (InitActiveViews();MoreActiveViews();NextActiveViews()) {
|
|
ActiveView()->Driver()->SetWidthMap(aWidthMap);
|
|
}
|
|
}
|
|
|
|
/*=================================================================*/
|
|
Handle(Aspect_WidthMap) V2d_Viewer::WidthMap() const {
|
|
return myWidthMap;
|
|
}
|
|
|
|
/*=================================================================*/
|
|
void V2d_Viewer::SetFontMap(const Handle(Aspect_FontMap)& aFontMap,
|
|
const Standard_Boolean useMFT) {
|
|
myFontMap = aFontMap;
|
|
for (InitActiveViews();MoreActiveViews();NextActiveViews()) {
|
|
ActiveView()->Driver()->SetFontMap(aFontMap,useMFT);
|
|
}
|
|
}
|
|
|
|
/*=================================================================*/
|
|
void V2d_Viewer::SetMarkMap(const Handle(Aspect_MarkMap)& aMarkMap) {
|
|
myMarkMap = aMarkMap;
|
|
for (InitActiveViews();MoreActiveViews();NextActiveViews()) {
|
|
ActiveView()->Driver()->SetMarkMap(aMarkMap);
|
|
}
|
|
}
|
|
|
|
/*=================================================================*/
|
|
Handle(Aspect_FontMap) V2d_Viewer::FontMap() const {
|
|
return myFontMap;
|
|
}
|
|
|
|
/*=================================================================*/
|
|
Handle(Aspect_MarkMap) V2d_Viewer::MarkMap() const {
|
|
return myMarkMap;
|
|
}
|
|
|
|
/*=================================================================*/
|
|
Handle(Graphic2d_View) V2d_Viewer::View () const {
|
|
return myGraphicView;
|
|
}
|
|
|
|
/*=================================================================*/
|
|
Standard_Boolean V2d_Viewer::UseMFT() const {
|
|
return myUseMFT;
|
|
}
|
|
|
|
/*=================================================================*/
|
|
void V2d_Viewer::Update() {
|
|
for (InitActiveViews();MoreActiveViews();NextActiveViews()){
|
|
ActiveView()->Update();
|
|
}
|
|
}
|
|
|
|
/*=================================================================*/
|
|
void V2d_Viewer::UpdateNew() {
|
|
for (InitActiveViews();MoreActiveViews();NextActiveViews()){
|
|
ActiveView()->UpdateNew();
|
|
}
|
|
}
|
|
|
|
/*=================================================================*/
|
|
Standard_Integer V2d_Viewer::InitializeColor (const Quantity_NameOfColor aColor) {
|
|
Standard_Integer Size = myColorMap->Size();
|
|
Quantity_Color color(aColor);
|
|
#ifdef IMP080300
|
|
Standard_Integer index = myColorMap->AddEntry(color);
|
|
if( Size != myColorMap->Size() ) {
|
|
for (InitActiveViews();MoreActiveViews();NextActiveViews()){
|
|
ActiveView()->Driver()->SetColorMap(myColorMap);
|
|
}
|
|
}
|
|
#else // ??? why this gazworks ???
|
|
Standard_Integer i,index=0;
|
|
for ( i=1; i<= Size; i++) {
|
|
if(myColorMap->Entry(i).Color().IsEqual(color))
|
|
index=myColorMap->Entry(i).Index();
|
|
}
|
|
if (index == 0) {
|
|
Handle(Aspect_GenericColorMap) map = new Aspect_GenericColorMap;
|
|
for (i=1; i<= Size; i++) {
|
|
map->AddEntry(myColorMap->Entry(i));
|
|
}
|
|
// finding a free index.
|
|
TColStd_MapOfInteger M;
|
|
for ( i=1; i<= Size; i++) {
|
|
M.Add(myColorMap->Entry(i).Index());
|
|
}
|
|
#ifndef PRO10988
|
|
index = Size + 1;
|
|
#endif
|
|
i=1;
|
|
while (index == 0) {
|
|
if(!M.Contains(i)) index =i;
|
|
i++;
|
|
}
|
|
map->AddEntry(Aspect_ColorMapEntry(index,color));
|
|
for (InitActiveViews();MoreActiveViews();NextActiveViews()){
|
|
ActiveView()->Driver()->SetColorMap(map);
|
|
}
|
|
myColorMap = map;
|
|
}
|
|
#endif
|
|
return index;
|
|
}
|
|
|
|
/*=================================================================*/
|
|
void V2d_Viewer::InitActiveViews() {
|
|
myViewsIterator.Initialize(myViews);
|
|
}
|
|
|
|
/*=================================================================*/
|
|
Standard_Boolean V2d_Viewer::MoreActiveViews () const {
|
|
return myViewsIterator.More();
|
|
}
|
|
|
|
/*=================================================================*/
|
|
void V2d_Viewer::NextActiveViews () {
|
|
myViewsIterator.Next();
|
|
}
|
|
|
|
/*=================================================================*/
|
|
Handle(V2d_View) V2d_Viewer::ActiveView() const {
|
|
return (Handle(V2d_View)&)(myViewsIterator.Value());
|
|
}
|
|
|
|
/*=================================================================*/
|
|
Handle(Aspect_Grid) V2d_Viewer::Grid () const {
|
|
Handle(Aspect_Grid) grid;
|
|
|
|
switch (myGridType) {
|
|
case Aspect_GT_Circular:
|
|
grid = myCGrid;
|
|
break;
|
|
case Aspect_GT_Rectangular:
|
|
default:
|
|
grid = myRGrid;
|
|
}
|
|
return grid;
|
|
}
|
|
|
|
/*=================================================================*/
|
|
void V2d_Viewer::ActivateGrid(const Aspect_GridType aType,
|
|
const Aspect_GridDrawMode aMode){
|
|
|
|
Grid()->Erase();
|
|
myGridType = aType;
|
|
Grid()->SetDrawMode(aMode);
|
|
Grid()->Display();
|
|
Grid()->Activate();
|
|
Update();
|
|
}
|
|
|
|
/*=================================================================*/
|
|
void V2d_Viewer::DeactivateGrid() {
|
|
Grid()->Erase();
|
|
Grid()->Deactivate();
|
|
Update();
|
|
}
|
|
|
|
/*=================================================================*/
|
|
Standard_Boolean V2d_Viewer::IsActive () const {
|
|
return Grid()->IsActive();
|
|
}
|
|
|
|
/*=================================================================*/
|
|
void V2d_Viewer::RectangularGridValues
|
|
(Quantity_Length& theXOrigin,
|
|
Quantity_Length& theYOrigin,
|
|
Quantity_Length& theXStep,
|
|
Quantity_Length& theYStep,
|
|
Quantity_PlaneAngle& theRotationAngle) const {
|
|
|
|
theXOrigin = myRGrid->XOrigin();
|
|
theYOrigin = myRGrid->YOrigin();
|
|
theXStep = myRGrid->XStep();
|
|
theYStep = myRGrid->YStep();
|
|
theRotationAngle = myRGrid->RotationAngle();
|
|
}
|
|
|
|
/*=================================================================*/
|
|
void V2d_Viewer::SetRectangularGridValues
|
|
(const Quantity_Length theXOrigin,
|
|
const Quantity_Length theYOrigin,
|
|
const Quantity_Length theXStep,
|
|
const Quantity_Length theYStep,
|
|
const Quantity_PlaneAngle theRotationAngle) {
|
|
|
|
myRGrid->SetXOrigin(theXOrigin);
|
|
myRGrid->SetYOrigin(theYOrigin);
|
|
myRGrid->SetXStep(theXStep);
|
|
myRGrid->SetYStep(theYStep);
|
|
myRGrid->SetRotationAngle(theRotationAngle);
|
|
Update();
|
|
}
|
|
|
|
/*=================================================================*/
|
|
void V2d_Viewer::CircularGridValues
|
|
(Quantity_Length& theXOrigin,
|
|
Quantity_Length& theYOrigin,
|
|
Quantity_Length& theRadiusStep,
|
|
Standard_Integer& theDivisionNumber,
|
|
Quantity_PlaneAngle& theRotationAngle) const {
|
|
|
|
theXOrigin = myCGrid->XOrigin();
|
|
theYOrigin = myCGrid->YOrigin();
|
|
theRadiusStep = myCGrid->RadiusStep();
|
|
theDivisionNumber = myCGrid->DivisionNumber();
|
|
theRotationAngle = myCGrid->RotationAngle();
|
|
}
|
|
|
|
/*=================================================================*/
|
|
void V2d_Viewer::SetCircularGridValues
|
|
(const Quantity_Length theXOrigin,
|
|
const Quantity_Length theYOrigin,
|
|
const Quantity_Length theRadiusStep,
|
|
const Standard_Integer theDivisionNumber,
|
|
const Quantity_PlaneAngle theRotationAngle) {
|
|
|
|
myCGrid->SetXOrigin(theXOrigin);
|
|
myCGrid->SetYOrigin(theYOrigin);
|
|
myCGrid->SetRadiusStep(theRadiusStep);
|
|
myCGrid->SetDivisionNumber(theDivisionNumber);
|
|
myCGrid->SetRotationAngle(theRotationAngle);
|
|
Update();
|
|
}
|
|
|
|
/*=================================================================*/
|
|
Standard_Integer V2d_Viewer::HitPointColor() const {
|
|
return myHitPointColorIndex;
|
|
}
|
|
|
|
/*=================================================================*/
|
|
Standard_Integer V2d_Viewer::CoordinatesColor() const {
|
|
return myCoordinatesColorIndex;
|
|
}
|
|
|
|
/*=================================================================*/
|
|
Standard_Integer V2d_Viewer::HitPointMarkerIndex() const {
|
|
return myHitPointMarkerIndex;
|
|
}
|
|
|
|
/*=================================================================*/
|
|
void V2d_Viewer::Hit(const Quantity_Length rx,
|
|
const Quantity_Length ry,
|
|
Quantity_Length& gx,
|
|
Quantity_Length& gy) const {
|
|
|
|
Grid()->Hit(rx,ry,gx,gy);
|
|
}
|
|
|
|
/*=================================================================*/
|
|
Aspect_GridType V2d_Viewer::GridType() const {
|
|
return myGridType;
|
|
}
|
|
|
|
/*=================================================================*/
|
|
Standard_Boolean V2d_Viewer::IsEmpty() const {
|
|
|
|
return myViews.IsEmpty();
|
|
}
|
|
|
|
//SAV
|
|
void V2d_Viewer::SetGridColor( const Quantity_Color& color1,
|
|
const Quantity_Color& color2 )
|
|
{
|
|
Standard_Integer i1 = InitializeColor( color1.Name() );
|
|
Standard_Integer i2 = InitializeColor( color2.Name() );
|
|
|
|
Standard_Boolean restart = IsActive();
|
|
if ( restart ) {
|
|
DeactivateGrid();
|
|
Grid()->Erase();
|
|
}
|
|
|
|
Quantity_Length xOrigin, yOrigin, xStep, yStep;
|
|
Quantity_PlaneAngle angle;
|
|
Standard_Integer theDivisionNumber;
|
|
Aspect_GridDrawMode gMode = myRGrid->DrawMode();
|
|
|
|
RectangularGridValues( xOrigin, yOrigin, xStep, yStep, angle );
|
|
myRGrid.Nullify();
|
|
if ( myRGrid.IsNull() ) {
|
|
myRGrid = new V2d_RectangularGrid( this, i1, i2 );
|
|
myRGrid->SetDrawMode( gMode );
|
|
SetRectangularGridValues( xOrigin, yOrigin, xStep, yStep, angle );
|
|
}
|
|
|
|
gMode = myCGrid->DrawMode();
|
|
CircularGridValues( xOrigin, yOrigin, xStep, theDivisionNumber, angle );
|
|
myCGrid.Nullify();
|
|
if ( myCGrid.IsNull() ) {
|
|
myCGrid = new V2d_CircularGrid( this, i1, i2 );
|
|
myCGrid->SetDrawMode( gMode );
|
|
SetCircularGridValues( xOrigin, yOrigin, xStep, theDivisionNumber, angle );
|
|
}
|
|
if ( restart ) {
|
|
Grid()->Display();
|
|
Grid()->Activate();
|
|
Update();
|
|
}
|
|
}
|