1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-09-08 14:17:06 +03:00

0026272: Visualization - provide a possibility to activate selection modes without opening local context

- picked or selected objects are now highlighted via owners instead of interactive objects;
- support methods for owners were added to AIS_InteractiveContext;
- selected owners are highlighted in immediate mode in AIS_InteractiveContext;
- selection without opening of local context is enabled by default;
- added "-local" key to vselmode command to enable selection in local context;
- selection filters are now completely supported in AIS_InteractiveContext;
- the idea of differencing of selected items onto current (in interactive context) and selected (local selection)
was eliminated;
- all calls to "current" were replaced by calls to "selected" in terms of future local context removal;
- AIS_InteractiveObject::mySelectionMode was removed;
- now each selectable object can define own selection mode for "global" selection of the whole object;
- whole object selection mode is 0 by default for all standard interactive objects.
- added support of drawing immediate structures in different layers;
- unused code for immediate mode was removed;
- vfeedback and vexport commands now produce correct output for raytrace mode;
- do not add TKD3DHost to projects list due to usage of c++11-specific structures that are not supported in vc11.
This commit is contained in:
vpa
2015-07-24 16:42:00 +03:00
parent 5f3a0c6b61
commit f6c886010d
49 changed files with 1582 additions and 1316 deletions

View File

@@ -293,7 +293,7 @@ void CViewer2dDoc::OnBUTTONTestRect()
Handle_AIS_Shape aRect2 = new AIS_Shape(W2); Handle_AIS_Shape aRect2 = new AIS_Shape(W2);
myAISContext->Display(aRect2); myAISContext->Display(aRect2);
myAISContext->SetColor(aRect2,Quantity_NOC_YELLOW); myAISContext->SetColor(aRect2,Quantity_NOC_YELLOW);
myAISContext->SetSelectionMode(aRect2,2); myAISContext->Activate(aRect2,2);
FitAll2DViews(Standard_True); // Update Viewer FitAll2DViews(Standard_True); // Update Viewer
} }

View File

@@ -34,7 +34,6 @@ AIS_InteractiveObject(PrsMgr_TOP_ProjectorDependant)
BRepPrimAPI_MakeCylinder S(R,H); BRepPrimAPI_MakeCylinder S(R,H);
myShape = S.Shape(); myShape = S.Shape();
SetHilightMode(0); SetHilightMode(0);
SetSelectionMode(0);
myDrawer->SetShadingAspect(new Prs3d_ShadingAspect()); myDrawer->SetShadingAspect(new Prs3d_ShadingAspect());
myPlanarFaceColor = Quantity_NOC_FIREBRICK3; myPlanarFaceColor = Quantity_NOC_FIREBRICK3;
myCylindricalFaceColor = Quantity_NOC_GRAY; myCylindricalFaceColor = Quantity_NOC_GRAY;
@@ -48,7 +47,6 @@ AIS_InteractiveObject(PrsMgr_TOP_ProjectorDependant)
BRepBuilderAPI_NurbsConvert aNurbsConvert(S.Shape()); BRepBuilderAPI_NurbsConvert aNurbsConvert(S.Shape());
myShape = aNurbsConvert.Shape(); myShape = aNurbsConvert.Shape();
SetHilightMode(0); SetHilightMode(0);
SetSelectionMode(0);
myDrawer->SetShadingAspect(new Prs3d_ShadingAspect()); myDrawer->SetShadingAspect(new Prs3d_ShadingAspect());
myPlanarFaceColor = Quantity_NOC_FIREBRICK3; myPlanarFaceColor = Quantity_NOC_FIREBRICK3;
myCylindricalFaceColor = Quantity_NOC_KHAKI4; myCylindricalFaceColor = Quantity_NOC_KHAKI4;

View File

@@ -50,7 +50,7 @@ class InteractiveContext from AIS inherits TShared from MMgt
-- - working on only a few objects, -- - working on only a few objects,
-- - working on a single object. -- - working on a single object.
-- 1. When you want ot work on one type of entity, you -- 1. When you want ot work on one type of entity, you
-- should open a local context with the option -- may open a local context with the option
-- UseDisplayedObjects set to false. DisplayedObjects -- UseDisplayedObjects set to false. DisplayedObjects
-- allows you to recover the visualized Interactive -- allows you to recover the visualized Interactive
-- Objects which have a given Type and -- Objects which have a given Type and
@@ -80,6 +80,14 @@ class InteractiveContext from AIS inherits TShared from MMgt
-- of setting up the different contexts of -- of setting up the different contexts of
-- selection/presentation according to the operation -- selection/presentation according to the operation
-- which you want to perform. -- which you want to perform.
--
-- Selection of parts of the objects can also be done without opening a local context.
-- Interactive context itself supports decomposed object selection with selection filters
-- support. Note that each selectable object must specify the selection mode that is
-- responsible for selection of object as a whole (global selection mode). By default, global
-- selection mode is equal to 0, but it might be redefined if needed. Sub-part selection
-- of the objects without using local context provides a possibility to activate part
-- selection modes along with global selection mode.
uses uses
Address from Standard, Address from Standard,
@@ -416,17 +424,6 @@ is
-- Standard_False, the presentation of the Interactive -- Standard_False, the presentation of the Interactive
-- Object returns to the default selection mode; the -- Object returns to the default selection mode; the
-- object is displayed but no viewer will be updated. -- object is displayed but no viewer will be updated.
SetSelectionMode(me:mutable;
aniobj:InteractiveObject from AIS;
aMode :Integer from Standard);
---Purpose:
-- Sets the selection mode of Interactive Objects.
-- aMode provides the selection mode index of the entity aniobj.
UnsetSelectionMode(me : mutable;
aniobj : InteractiveObject from AIS);
---Purpose:
-- Removes selection mode from Interactive Objects.
-- aMode provides the selection mode index of the entity aniobj.
SetPixelTolerance(me:mutable; SetPixelTolerance(me:mutable;
aPrecision: Real from Standard = 2.0); aPrecision: Real from Standard = 2.0);
@@ -700,14 +697,22 @@ is
returns Boolean from Standard; returns Boolean from Standard;
IsHilighted(me; IsHilighted(me;
anIobj : InteractiveObject from AIS; anIobj : InteractiveObject from AIS;
WithColor: out Boolean from Standard; WithColor: out Boolean from Standard;
theHiCol : out NameOfColor from Quantity) theHiCol : out NameOfColor from Quantity)
returns Boolean from Standard; returns Boolean from Standard;
---Purpose: if <anIObj> is hilighted with a specific color ---Purpose: if <anIObj> is hilighted with a specific color
-- <WithColor> will be returned TRUE -- <WithColor> will be returned TRUE
-- <theHiCol> gives the name of the hilightcolor -- <theHiCol> gives the name of the hilightcolor
IsHilighted (me;
theOwner : EntityOwner from SelectMgr;
theIsCustomColor : out Boolean from Standard;
theCustomColorName : out NameOfColor from Quantity)
returns Boolean from Standard;
---Purpose: if <theOwner> is hilighted with a specific color, than <theIsCustomColor> will be set
-- to true and <theCustomColorName> will have the name of the color stored
DisplayPriority(me;anIobj: InteractiveObject from AIS) DisplayPriority(me;anIobj: InteractiveObject from AIS)
returns Integer from Standard; returns Integer from Standard;
---Purpose: ---Purpose:
@@ -1130,136 +1135,159 @@ is
-- The Selected objects are objects picked -- The Selected objects are objects picked
-- when a local context is opened -- when a local context is opened
---Category: Obsolete methods that are valid for local context only
SetCurrentObject(me:mutable; SetCurrentObject(me:mutable;
aniobj: InteractiveObject from AIS; aniobj: InteractiveObject from AIS;
updateviewer : Boolean from Standard = Standard_True); updateviewer : Boolean from Standard = Standard_True);
--- Purpose: --- Purpose:
-- Updates the view of the current object in open context. -- Updates the view of the current object in open context.
-- Objects selected when there is no open local context -- Objects selected when there is no open local context
-- are called current objects; those selected in open -- are called current objects; those selected in open
-- local context, selected objects. -- local context, selected objects.
-- If a local context is open and if updateviewer equals -- If a local context is open and if updateviewer equals
-- Standard_False, the presentation of the Interactive -- Standard_False, the presentation of the Interactive
-- Object activates the selection mode; the object is -- Object activates the selection mode; the object is
-- displayed but no viewer will be updated. -- displayed but no viewer will be updated.
AddOrRemoveCurrentObject (me : mutable;
theObj : InteractiveObject from AIS;
theIsToUpdateViewer : Boolean from Standard = Standard_True);
---Purpose:
-- Allows to add or remove the object given to the list of current and highlight/unhighlight it
-- correspondingly. Is valid for global context only; for local context use method AddOrRemoveSelected.
-- Since this method makes sence only for neutral point selection of a whole object, if 0 selection
-- of the object is empty this method simply does nothing.
AddOrRemoveCurrentObject(me:mutable;
aniobj : InteractiveObject from AIS;
updateviewer : Boolean from Standard = Standard_True);
---Purpose:
-- Allows you to add a current object to the list of current
-- objects or remove it from that list.
-- Objects selected when there is no open local context
-- are called current objects; those selected in open
-- local context, selected objects.
-- If a local context is open and if updateviewer equals
-- Standard_False, the presentation of the Interactive
-- Object activates the selection mode; the object is
-- displayed but no viewer will be updated.
UpdateCurrent (me:mutable); UpdateCurrent (me:mutable);
---Purpose: Updates the list of current objects, i.e. hilights new ---Purpose: Updates the list of current objects, i.e. hilights new
-- current objects, removes hilighting from former current objects. -- current objects, removes hilighting from former current objects.
-- Objects selected when there is no open local context -- Objects selected when there is no open local context
-- are called current objects; those selected in open -- are called current objects; those selected in open
-- local context, selected objects. -- local context, selected objects.
--
WasCurrentTouched(me) returns Boolean from Standard; WasCurrentTouched(me) returns Boolean from Standard;
---Purpose: ---Purpose:
-- Returns the current selection touched by the cursor. -- Returns the current selection touched by the cursor.
-- Objects selected when there is no open local context -- Objects selected when there is no open local context
-- are called current objects; those selected in open -- are called current objects; those selected in open
-- local context, selected objects. -- local context, selected objects.
---C++: inline ---C++: inline
SetOkCurrent(me:mutable); SetOkCurrent(me:mutable);
---C++: inline ---C++: inline
IsCurrent(me;aniobj: InteractiveObject from AIS) returns Boolean from Standard; IsCurrent (me;
--- Purpose: theObject : InteractiveObject from AIS)
-- Returns true if there is a non-null interactive object in Neutral Point. returns Boolean from Standard;
-- Objects selected when there is no open local context --- Purpose: Returns true if there is a non-null interactive object in Neutral Point.
-- are called current objects; those selected in open -- Objects selected when there is no open local context are called current objects;
-- local context, selected objects. -- those selected in open local context, selected objects.
InitCurrent(me:mutable); InitCurrent(me:mutable);
--- Purpose: --- Purpose:
-- Initializes a scan of the current selected objects in -- Initializes a scan of the current selected objects in
-- Neutral Point. -- Neutral Point.
-- Objects selected when there is no open local context -- Objects selected when there is no open local context
-- are called current objects; those selected in open -- are called current objects; those selected in open
-- local context, selected objects. -- local context, selected objects.
MoreCurrent(me) returns Boolean from Standard; MoreCurrent(me) returns Boolean from Standard;
--- Purpose: --- Purpose:
-- Returns true if there is another object found by the -- Returns true if there is another object found by the
-- scan of the list of current objects. -- scan of the list of current objects.
-- Objects selected when there is no open local context -- Objects selected when there is no open local context
-- are called current objects; those selected in open -- are called current objects; those selected in open
-- local context, selected objects. -- local context, selected objects.
NextCurrent(me:mutable); NextCurrent(me:mutable);
---Purpose: ---Purpose:
-- Continues the scan to the next object in the list of -- Continues the scan to the next object in the list of
-- current objects. -- current objects.
-- Objects selected when there is no open local context -- Objects selected when there is no open local context
-- are called current objects; those selected in open -- are called current objects; those selected in open
-- local context, selected objects. -- local context, selected objects.
Current(me) returns InteractiveObject from AIS; Current(me) returns InteractiveObject from AIS;
---Purpose: ---Purpose:
-- Returns the current interactive object. -- Returns the current interactive object.
-- Objects selected when there is no open local context -- Objects selected when there is no open local context
-- are called current objects; those selected in open -- are called current objects; those selected in open
-- local context, selected objects. -- local context, selected objects.
NbCurrents(me:mutable) returns Integer from Standard; NbCurrents(me:mutable) returns Integer from Standard;
FirstCurrentObject(me:mutable) returns InteractiveObject from AIS; HilightCurrents (me : mutable;
---Purpose: theToUpdateViewer : Boolean from Standard = Standard_True);
-- Returns the first current object in the list of current objects. ---Purpose:
-- Objects selected when there is no open local context --- Highlights current objects.
-- are called current objects; those selected in open -- Objects selected when there is no open local context
-- local context, selected objects. -- are called current objects; those selected in open
-- local context, selected objects.
HilightCurrents(me : mutable; -- If a local context is open and if updateviewer equals
updateviewer : Boolean from Standard=Standard_True); -- Standard_False, the presentation of the Interactive
---Purpose: -- Object activates the selection mode; the object is
--- Highlights current objects. -- displayed but no viewer will be updated.
-- Objects selected when there is no open local context
-- are called current objects; those selected in open
-- local context, selected objects.
-- If a local context is open and if updateviewer equals
-- Standard_False, the presentation of the Interactive
-- Object activates the selection mode; the object is
-- displayed but no viewer will be updated.
UnhilightCurrents(me : mutable; UnhilightCurrents(me : mutable;
updateviewer : Boolean from Standard=Standard_True); updateviewer : Boolean from Standard=Standard_True);
---Purpose: ---Purpose:
-- Removes highlighting from current objects. -- Removes highlighting from current objects.
-- Objects selected when there is no open local context -- Objects selected when there is no open local context
-- are called current objects; those selected in open -- are called current objects; those selected in open
-- local context, selected objects. -- local context, selected objects.
-- If a local context is open and if updateviewer equals -- If a local context is open and if updateviewer equals
-- Standard_False, the presentation of the Interactive -- Standard_False, the presentation of the Interactive
-- Object activates the selection mode; the object is -- Object activates the selection mode; the object is
-- displayed but no viewer will be updated. -- displayed but no viewer will be updated.
ClearCurrents(me:mutable; ClearCurrents (me : mutable;
updateviewer : Boolean from Standard=Standard_True); theToUpdateViewer : Boolean from Standard = Standard_True);
---Purpose: ---Purpose:
-- Empties previous current objects in order to get the -- Empties previous current objects in order to get the
-- current objects detected by the selector using -- current objects detected by the selector using
-- UpdateCurrent. -- UpdateCurrent.
-- Objects selected when there is no open local context -- Objects selected when there is no open local context
-- are called current objects; those selected in open -- are called current objects; those selected in open
-- local context, selected objects. -- local context, selected objects.
-- If a local context is open and if updateviewer equals -- If a local context is open and if updateviewer equals
-- Standard_False, the presentation of the Interactive -- Standard_False, the presentation of the Interactive
-- Object activates the selection mode; the object is -- Object activates the selection mode; the object is
-- displayed but no viewer will be updated. -- displayed but no viewer will be updated.
DetectedCurrentShape(me) returns Shape from TopoDS;
---C++: return const &
---Purpose:
-- @return current mouse-detected shape or empty (null) shape, if current interactive object
-- is not a shape (AIS_Shape) or there is no current mouse-detected interactive object at all.
DetectedCurrentObject(me) returns InteractiveObject from AIS;
--Purpose:
-- @return current mouse-detected interactive object or null object if there is no current detected.
---Category: Selection mehods valid for both local and interactive context
SetSelected (me : mutable;
theOwners : EntityOwner from SelectMgr;
theToUpdateViewer : Boolean from Standard = Standard_True);
---Purpose: Unhighlights previously selected owners and marks them as not selected.
-- Marks owner given as selected and highlights it.
AddOrRemoveSelected (me : mutable;
theOwner : EntityOwner from SelectMgr;
theToUpdateViewer : Boolean from Standard = Standard_True);
---Purpose: Allows to highlight or unhighlight the owner given depending on its selection status
IsSelected (me;
theOwner : EntityOwner from SelectMgr)
returns Boolean from Standard;
---Purpose: Returns true is the owner given is selected
FirstSelectedObject(me:mutable) returns InteractiveObject from AIS;
---Purpose:
-- Returns the first current object in the list of current objects.
-- Objects selected when there is no open local context
-- are called current objects; those selected in open
-- local context, selected objects.
SetSelected(me:mutable;aniObj: InteractiveObject from AIS; SetSelected(me:mutable;aniObj: InteractiveObject from AIS;
updateviewer : Boolean from Standard=Standard_True); updateviewer : Boolean from Standard=Standard_True);
@@ -1270,8 +1298,6 @@ is
-- Object activates the selection mode; the object is -- Object activates the selection mode; the object is
-- displayed but no viewer will be updated. -- displayed but no viewer will be updated.
SetSelectedCurrent(me:mutable);
---Purpose: puts the selected list in the current objects List.
UpdateSelected(me:mutable; UpdateSelected(me:mutable;
updateviewer : Boolean from Standard=Standard_True); updateviewer : Boolean from Standard=Standard_True);
---Purpose: updates the list of selected objects ---Purpose: updates the list of selected objects
@@ -1281,126 +1307,120 @@ is
aniobj : InteractiveObject from AIS; aniobj : InteractiveObject from AIS;
updateviewer : Boolean from Standard=Standard_True); updateviewer : Boolean from Standard=Standard_True);
---Purpose:Allows you to add a selected object to the list of ---Purpose:Allows you to add a selected object to the list of
-- selected objects or remove it from that list. This entity -- selected objects or remove it from that list. This entity
-- can be an Interactive Object aniobj or its owner -- can be an Interactive Object aniobj or its owner
-- aShape as can be seen in the two syntaxes above. -- aShape as can be seen in the two syntaxes above.
-- Objects selected when there is no open local context -- Objects selected when there is no open local context
-- are called current objects; those selected in open -- are called current objects; those selected in open
-- local context, selected objects. -- local context, selected objects.
-- If a local context is open and if updateviewer equals -- If a local context is open and if updateviewer equals
-- Standard_False, the presentation of the Interactive -- Standard_False, the presentation of the Interactive
-- Object activates the selection mode; the object is -- Object activates the selection mode; the object is
-- displayed but no viewer will be updated. -- displayed but no viewer will be updated.
HilightSelected(me : mutable; HilightSelected(me : mutable;
updateviewer : Boolean from Standard=Standard_True); updateviewer : Boolean from Standard=Standard_True);
---Purpose: ---Purpose:
-- Highlights selected objects. -- Highlights selected objects.
-- Objects selected when there is no open local context -- Objects selected when there is no open local context
-- are called current objects; those selected in open -- are called current objects; those selected in open
-- local context, selected objects. -- local context, selected objects.
-- If a local context is open and if updateviewer equals -- If a local context is open and if updateviewer equals
-- Standard_False, the presentation of the Interactive -- Standard_False, the presentation of the Interactive
-- Object activates the selection mode; the object is -- Object activates the selection mode; the object is
-- displayed but no viewer will be updated. -- displayed but no viewer will be updated.
UnhilightSelected(me : mutable; UnhilightSelected(me : mutable;
updateviewer : Boolean from Standard=Standard_True); updateviewer : Boolean from Standard=Standard_True);
---Purpose: ---Purpose:
-- Removes highlighting from selected objects. -- Removes highlighting from selected objects.
-- Objects selected when there is no open local context -- Objects selected when there is no open local context
-- are called current objects; those selected in open -- are called current objects; those selected in open
-- local context, selected objects. -- local context, selected objects.
-- If a local context is open and if updateviewer equals -- If a local context is open and if updateviewer equals
-- Standard_False, the presentation of the Interactive -- Standard_False, the presentation of the Interactive
-- Object activates the selection mode; the object is -- Object activates the selection mode; the object is
-- displayed but no viewer will be updated. -- displayed but no viewer will be updated.
ClearSelected(me:mutable; ClearSelected(me:mutable;
updateviewer : Boolean from Standard=Standard_True); updateviewer : Boolean from Standard=Standard_True);
---Purpose: ---Purpose:
-- Empties previous selected objects in order to get the -- Empties previous selected objects in order to get the
-- selected objects detected by the selector using -- selected objects detected by the selector using
-- UpdateSelected. -- UpdateSelected.
-- Objects selected when there is no open local context -- Objects selected when there is no open local context
-- are called current objects; those selected in open -- are called current objects; those selected in open
-- local context, selected objects. -- local context, selected objects.
-- If a local context is open and if updateviewer equals -- If a local context is open and if updateviewer equals
-- Standard_False, the presentation of the Interactive -- Standard_False, the presentation of the Interactive
-- Object activates the selection mode; the object is -- Object activates the selection mode; the object is
-- displayed but no viewer will be updated. -- displayed but no viewer will be updated.
AddOrRemoveSelected(me:mutable;aShape:Shape from TopoDS; AddOrRemoveSelected(me:mutable;aShape:Shape from TopoDS;
updateviewer : Boolean from Standard=Standard_True); updateviewer : Boolean from Standard=Standard_True);
---Purpose: No right to Add a selected Shape (Internal Management ---Purpose: No right to Add a selected Shape (Internal Management
-- of shape Selection). -- of shape Selection).
-- A Previous selected shape may only be removed. -- A Previous selected shape may only be removed.
AddOrRemoveSelected(me:mutable;anOwner : EntityOwner from SelectMgr;
updateviewer: Boolean from Standard=Standard_True);
---Purpose: allows to add/remove in the selected list the entities
-- represented by <anOwner> in the selection process.
---Category: Selection Process ---Category: Selection Process
IsSelected(me;aniobj: InteractiveObject from AIS) returns Boolean from Standard; IsSelected(me;aniobj: InteractiveObject from AIS) returns Boolean from Standard;
--- Purpose: --- Purpose:
-- Finds the selected object aniobj in local context and -- Finds the selected object aniobj in local context and
-- returns its name. -- returns its name.
-- Objects selected when there is no open local context -- Objects selected when there is no open local context
-- are called current objects; those selected in open -- are called current objects; those selected in open
-- local context, selected objects. -- local context, selected objects.
InitSelected(me:mutable); InitSelected(me:mutable);
---Purpose: ---Purpose:
-- Initializes a scan of the selected objects in local context. -- Initializes a scan of the selected objects in local context.
-- Objects selected when there is no open local context -- Objects selected when there is no open local context
-- are called current objects; those selected in open -- are called current objects; those selected in open
-- local context, selected objects. -- local context, selected objects.
MoreSelected(me) returns Boolean from Standard; MoreSelected(me) returns Boolean from Standard;
---Purpose: ---Purpose:
-- Returns true if there is another object found by the -- Returns true if there is another object found by the
-- scan of the list of selected objects. -- scan of the list of selected objects.
-- Objects selected when there is no open local context -- Objects selected when there is no open local context
-- are called current objects; those selected in open -- are called current objects; those selected in open
-- local context, selected objects. -- local context, selected objects.
NextSelected(me:mutable); NextSelected(me:mutable);
---Purpose: ---Purpose:
-- Continues the scan to the next object in the list of -- Continues the scan to the next object in the list of
-- selected objects. -- selected objects.
-- Objects selected when there is no open local context -- Objects selected when there is no open local context
-- are called current objects; those selected in open -- are called current objects; those selected in open
-- local context, selected objects. -- local context, selected objects.
NbSelected(me:mutable) returns Integer from Standard; NbSelected(me:mutable) returns Integer from Standard;
HasSelectedShape(me) returns Boolean from Standard; HasSelectedShape(me) returns Boolean from Standard;
--- Purpose: --- Purpose:
-- Returns true if the interactive context has a shape -- Returns true if the interactive context has a shape
-- selected in it which results from the decomposition of -- selected in it which results from the decomposition of
-- another entity in local context. -- another entity in local context.
-- If HasSelectedShape returns true, SelectedShape -- If HasSelectedShape returns true, SelectedShape
-- returns the shape which has been shown to be -- returns the shape which has been shown to be
-- selected. Interactive returns the Interactive Object -- selected. Interactive returns the Interactive Object
-- from which the shape has been selected. -- from which the shape has been selected.
-- If HasSelectedShape returns false, Interactive -- If HasSelectedShape returns false, Interactive
-- returns the interactive entity selected by the click of the mouse. -- returns the interactive entity selected by the click of the mouse.
SelectedShape(me) returns Shape from TopoDS; SelectedShape(me) returns Shape from TopoDS;
---Purpose: ---Purpose:
-- Returns the selected shape in the open local context. -- Returns the selected shape in the open local context.
-- Objects selected when there is no open local context -- Objects selected when there is no open local context
-- are called current objects; those selected in open -- are called current objects; those selected in open
-- local context, selected objects. -- local context, selected objects.
SelectedOwner(me) returns EntityOwner from SelectMgr; SelectedOwner(me) returns EntityOwner from SelectMgr;
---Purpose: ---Purpose:
-- Returns the owner of the selected entity resulting -- Returns the owner of the selected entity resulting
-- from the decomposition of another entity in local context. -- from the decomposition of another entity in local context.
EntityOwners(me; theOwners : out IndexedMapOfOwner from SelectMgr; EntityOwners(me; theOwners : out IndexedMapOfOwner from SelectMgr;
theIObj : InteractiveObject from AIS; theIObj : InteractiveObject from AIS;
@@ -1410,8 +1430,6 @@ is
--- the selection mode theMode (in all active modes --- the selection mode theMode (in all active modes
--- if the Mode == -1) --- if the Mode == -1)
Interactive(me) returns InteractiveObject from AIS;
---Purpose: Returns the location of the selected Interactive Object.
SelectedInteractive(me) returns InteractiveObject from AIS; SelectedInteractive(me) returns InteractiveObject from AIS;
HasApplicative(me) returns Boolean from Standard; HasApplicative(me) returns Boolean from Standard;
@@ -1480,14 +1498,6 @@ is
---Purpose: ---Purpose:
-- Gets next current object during iteration through mouse-detected -- Gets next current object during iteration through mouse-detected
-- interactive objects. -- interactive objects.
DetectedCurrentShape(me) returns Shape from TopoDS;
---C++: return const &
---Purpose:
-- @return current mouse-detected shape or empty (null) shape, if current interactive object
-- is not a shape (AIS_Shape) or there is no current mouse-detected interactive object at all.
DetectedCurrentObject(me) returns InteractiveObject from AIS;
--Purpose:
-- @return current mouse-detected interactive object or null object if there is no current detected.
---Category: SPECIFIC LOCAL CONTEXT ACTIONS. ---Category: SPECIFIC LOCAL CONTEXT ACTIONS.
@@ -1998,6 +2008,12 @@ is
theStatus : DisplayStatus from AIS = AIS_DS_None) is static; theStatus : DisplayStatus from AIS = AIS_DS_None) is static;
---Purpose: Query objects visible or hidden in specified view due to affinity mask. ---Purpose: Query objects visible or hidden in specified view due to affinity mask.
RedrawImmediate (me : mutable;
theViewer : Viewer from V3d)
is static;
---Purpose: Redraws immediate structures in all views of the viewer given taking into
-- account their visibility.
InitAttributes(me:mutable) is static private; InitAttributes(me:mutable) is static private;
@@ -2014,6 +2030,30 @@ is
theToUpdateViewer : Boolean from Standard = Standard_True) is static private; theToUpdateViewer : Boolean from Standard = Standard_True) is static private;
---Purpose: UNKNOWN ---Purpose: UNKNOWN
unhighlightOwners (me : mutable;
theObject : InteractiveObject from AIS)
is static private;
---Purpose: Helper function to unhighlight all entity owners currently highlighted with seleciton color.
highlightWithColor (me : mutable;
theOwner : EntityOwner from SelectMgr;
theColor : NameOfColor from Quantity;
theViewer : Viewer from V3d = NULL)
is static private;
---Purpose: Helper function that highlights the owner given with <theColor> without
-- performing AutoHighlight checks, e.g. is used for dynamic highlight.
-- If the parameter <theViewer> is set and <theIsImmediate> is true, highlight will be synchronized
-- automatically in all views of the viewer.
highlightSelected (me : mutable;
theOwner : EntityOwner from SelectMgr;
theSelColor : NameOfColor from Quantity)
is static private;
---Purpose: Helper function that highlights the owner given with <theColor> with check
-- for AutoHighlight, e.g. is used for selection.
-- If the parameter <theViewer> is set and <theIsImmediate> is true, selection color will be synchronized
-- automatically in all views of the viewer.
fields fields
myObjects : DataMapOfIOStatus from AIS; myObjects : DataMapOfIOStatus from AIS;
@@ -2030,8 +2070,8 @@ fields
mySelectionName : AsciiString from TCollection; mySelectionName : AsciiString from TCollection;
myCurrentName : AsciiString from TCollection; myCurrentName : AsciiString from TCollection;
myLastPicked : InteractiveObject from AIS; myLastPicked : EntityOwner from SelectMgr;
myLastinMain : InteractiveObject from AIS; myLastinMain : EntityOwner from SelectMgr;
myWasLastMain : Boolean from Standard; myWasLastMain : Boolean from Standard;

View File

@@ -126,6 +126,10 @@ void AIS_InteractiveContext::Delete() const
{ {
Handle(AIS_InteractiveObject) anObj = anObjIter.Key(); Handle(AIS_InteractiveObject) anObj = anObjIter.Key();
anObj->SetContext (aNullContext); anObj->SetContext (aNullContext);
for (anObj->Init(); anObj->More(); anObj->Next())
{
anObj->CurrentSelection()->UpdateBVHStatus (SelectMgr_TBU_Renew);
}
} }
MMgt_TShared::Delete(); MMgt_TShared::Delete();
} }
@@ -1049,7 +1053,44 @@ Standard_Boolean AIS_InteractiveContext::IsHilighted(const Handle(AIS_Interactiv
return Standard_False; return Standard_False;
} }
//=======================================================================
//function : IsHilighted
//purpose : Returns true if the objects global status is set to highlighted.
// theIsCustomColor flag defines if highlight color is not equal to OCCT's
// default Quantity_NOC_WHITE color. If theIsCustomColor is true,
// custom highlight color name will be stored to theCustomColorName
//=======================================================================
Standard_Boolean AIS_InteractiveContext::IsHilighted (const Handle(SelectMgr_EntityOwner)& theOwner,
Standard_Boolean& theIsCustomColor,
Quantity_NameOfColor& theCustomColorName) const
{
if (theOwner.IsNull() || !theOwner->HasSelectable())
return Standard_False;
const Handle(AIS_InteractiveObject) anObj =
Handle(AIS_InteractiveObject)::DownCast (theOwner->Selectable());
if (!myObjects.IsBound (anObj))
return Standard_False;
const Handle(AIS_GlobalStatus)& anObjStatus = myObjects (anObj);
if (anObjStatus->IsHilighted())
{
if (anObjStatus->HilightColor() != Quantity_NOC_WHITE)
{
theIsCustomColor = Standard_True;
theCustomColorName = anObjStatus->HilightColor();
}
else
{
theIsCustomColor = Standard_False;
}
return Standard_True;
}
return Standard_False;
}
//======================================================================= //=======================================================================
//function : IsDisplayed //function : IsDisplayed
@@ -1521,6 +1562,12 @@ void AIS_InteractiveContext::SetDisplayMode (const AIS_DisplayMode theMode,
if (aStatus->GraphicStatus() == AIS_DS_Displayed) if (aStatus->GraphicStatus() == AIS_DS_Displayed)
{ {
myMainPM->Display (anObj, theMode); myMainPM->Display (anObj, theMode);
if (!myLastPicked.IsNull() && myLastPicked->Selectable() == anObj)
{
myMainPM->BeginImmediateDraw();
myMainPM->Unhighlight (anObj, myDisplayMode);
myMainPM->EndImmediateDraw (myMainVwr);
}
if (aStatus->IsSubIntensityOn()) if (aStatus->IsSubIntensityOn())
{ {
myMainPM->Color (anObj, mySubIntensity, theMode); myMainPM->Color (anObj, mySubIntensity, theMode);
@@ -2054,6 +2101,19 @@ void AIS_InteractiveContext::SetWidth (const Handle(AIS_InteractiveObject)& theI
theIObj->SetWidth (theWidth); theIObj->SetWidth (theWidth);
redisplayPrsRecModes (theIObj, theToUpdateViewer); redisplayPrsRecModes (theIObj, theToUpdateViewer);
if (!myLastinMain.IsNull() && myLastinMain->Selectable() == theIObj)
{
if (myLastinMain->IsAutoHilight())
{
const Standard_Integer aHiMode =
theIObj->HasHilightMode() ? theIObj->HilightMode() : 0;
myLastinMain->HilightWithColor (myMainPM, myLastinMain->IsSelected() ? mySelectionColor : myHilightColor, aHiMode);
}
else
{
theIObj->HilightOwnerWithColor (myMainPM, myLastinMain->IsSelected() ? mySelectionColor : myHilightColor, myLastinMain);
}
}
} }
//======================================================================= //=======================================================================
@@ -2270,7 +2330,6 @@ void AIS_InteractiveContext::Status (const Handle(AIS_InteractiveObject)& theIOb
theStatus += TCollection_AsciiString (aDispModeIter.Value()); theStatus += TCollection_AsciiString (aDispModeIter.Value());
theStatus += "\n"; theStatus += "\n";
} }
if (IsCurrent (theIObj)) theStatus +="\t| Current\n";
if (IsSelected(theIObj)) theStatus +="\t| Selected\n"; if (IsSelected(theIObj)) theStatus +="\t| Selected\n";
theStatus += "\t| Active Selection Modes in the MainViewer :\n"; theStatus += "\t| Active Selection Modes in the MainViewer :\n";
@@ -2303,7 +2362,7 @@ void AIS_InteractiveContext::GetDefModes (const Handle(AIS_InteractiveObject)& t
? myDisplayMode ? myDisplayMode
: 0); : 0);
theHiMode = theIObj->HasHilightMode() ? theIObj->HilightMode() : theDispMode; theHiMode = theIObj->HasHilightMode() ? theIObj->HilightMode() : theDispMode;
theSelMode = theIObj->HasSelectionMode() ? theIObj->SelectionMode() : -1; theSelMode = theIObj->GlobalSelectionMode();
} }
//======================================================================= //=======================================================================
@@ -2338,7 +2397,7 @@ void AIS_InteractiveContext::EraseGlobal (const Handle(AIS_InteractiveObject)& t
myMainPM->SetVisibility (theIObj, aDispModeIter.Value(), Standard_False); myMainPM->SetVisibility (theIObj, aDispModeIter.Value(), Standard_False);
} }
if (IsCurrent (theIObj) if (IsSelected (theIObj)
&& !aStatus->IsDModeIn (aDispMode)) && !aStatus->IsDModeIn (aDispMode))
{ {
myMainPM->SetVisibility (theIObj, aDispMode, Standard_False); myMainPM->SetVisibility (theIObj, aDispMode, Standard_False);
@@ -2348,6 +2407,7 @@ void AIS_InteractiveContext::EraseGlobal (const Handle(AIS_InteractiveObject)& t
{ {
mgrSelector->Deactivate (theIObj, aSelModeIter.Value(), myMainSel); mgrSelector->Deactivate (theIObj, aSelModeIter.Value(), myMainSel);
} }
aStatus->ClearSelectionModes();
aStatus->SetGraphicStatus (AIS_DS_Erased); aStatus->SetGraphicStatus (AIS_DS_Erased);
if (theToUpdateviewer) if (theToUpdateviewer)
@@ -2356,6 +2416,31 @@ void AIS_InteractiveContext::EraseGlobal (const Handle(AIS_InteractiveObject)& t
} }
} }
//=======================================================================
//function : unhighlightOwners
//purpose :
//=======================================================================
void AIS_InteractiveContext::unhighlightOwners (const Handle(AIS_InteractiveObject)& theObject)
{
Handle(AIS_Selection) aSel = AIS_Selection::Selection (myCurrentName.ToCString());
aSel->Init();
while (aSel->More())
{
const Handle(SelectMgr_EntityOwner) anOwner =
Handle(SelectMgr_EntityOwner)::DownCast (aSel->Value());
if (anOwner->Selectable() == theObject)
{
if (anOwner->IsSelected())
{
AddOrRemoveSelected (anOwner, Standard_False);
aSel->Init();
continue;
}
}
aSel->Next();
}
}
//======================================================================= //=======================================================================
//function : ClearGlobal //function : ClearGlobal
//purpose : //purpose :
@@ -2373,27 +2458,11 @@ void AIS_InteractiveContext::ClearGlobal (const Handle(AIS_InteractiveObject)& t
} }
Handle(AIS_GlobalStatus) aStatus = myObjects (theIObj); Handle(AIS_GlobalStatus) aStatus = myObjects (theIObj);
unhighlightOwners (theIObj);
for (TColStd_ListIteratorOfListOfInteger aDispModeIter (aStatus->DisplayedModes()); aDispModeIter.More(); aDispModeIter.Next()) for (TColStd_ListIteratorOfListOfInteger aDispModeIter (aStatus->DisplayedModes()); aDispModeIter.More(); aDispModeIter.Next())
{ {
if (aStatus->IsHilighted())
{
if (IsCurrent (theIObj))
{
AddOrRemoveCurrentObject (theIObj, theToUpdateviewer);
}
else if (myMainPM->IsHighlighted (theIObj, aDispModeIter.Value()))
{
myMainPM->Unhighlight (theIObj, aDispModeIter.Value());
}
}
myMainPM->Erase (theIObj, aDispModeIter.Value()); myMainPM->Erase (theIObj, aDispModeIter.Value());
myMainPM->Clear (theIObj, aDispModeIter.Value()); myMainPM->Clear (theIObj, aDispModeIter.Value());
if (theIObj->HasHilightMode())
{
Standard_Integer im = theIObj->HilightMode();
myMainPM->Unhighlight (theIObj, im);
myMainPM->Erase (theIObj, im);
}
} }
// Object removes from Detected sequence // Object removes from Detected sequence
@@ -2407,15 +2476,6 @@ void AIS_InteractiveContext::ClearGlobal (const Handle(AIS_InteractiveObject)& t
} }
} }
if (myLastinMain == theIObj)
{
myLastinMain.Nullify();
}
if (myLastPicked == theIObj)
{
myLastPicked.Nullify();
}
// remove IO from the selection manager to avoid memory leaks // remove IO from the selection manager to avoid memory leaks
mgrSelector->Remove (theIObj); mgrSelector->Remove (theIObj);
@@ -2426,8 +2486,13 @@ void AIS_InteractiveContext::ClearGlobal (const Handle(AIS_InteractiveObject)& t
myMainVwr->DefinedView()->View()->ChangeHiddenObjects()->Remove (theIObj); myMainVwr->DefinedView()->View()->ChangeHiddenObjects()->Remove (theIObj);
} }
if (theToUpdateviewer if (!myLastinMain.IsNull() && myLastinMain->Selectable() == theIObj)
&& aStatus->GraphicStatus() == AIS_DS_Displayed) myLastinMain.Nullify();
if (!myLastPicked.IsNull() && myLastPicked->Selectable() == theIObj)
myLastPicked.Nullify();
myMainPM->ClearImmediateDraw();
if (theToUpdateviewer && aStatus->GraphicStatus() == AIS_DS_Displayed)
{ {
myMainVwr->Update(); myMainVwr->Update();
} }
@@ -2570,25 +2635,6 @@ Standard_Boolean AIS_InteractiveContext::IsoOnPlane() const
return myDefaultDrawer->IsoOnPlane(); return myDefaultDrawer->IsoOnPlane();
} }
//=======================================================================
//function : SetSelectionMode
//purpose :
//=======================================================================
void AIS_InteractiveContext::SetSelectionMode (const Handle(AIS_InteractiveObject)& ,
const Standard_Integer )
{
//
}
//=======================================================================
//function : UnsetSelectionMode
//purpose :
//=======================================================================
void AIS_InteractiveContext::UnsetSelectionMode (const Handle(AIS_InteractiveObject)& )
{
//
}
//======================================================================= //=======================================================================
//function : SetPixelTolerance //function : SetPixelTolerance
//purpose : Disables the mechanism of adaptive tolerance calculation in //purpose : Disables the mechanism of adaptive tolerance calculation in

File diff suppressed because it is too large Load Diff

View File

@@ -44,10 +44,12 @@ OpenLocalContext(const Standard_Boolean UseDisplayedObjects,
{ {
// the entities eventually detected just before the context was opened are unhighlighted... // the entities eventually detected just before the context was opened are unhighlighted...
if(!IsCurrent(myLastPicked)){ if(!IsSelected(myLastPicked)){
if(!myLastPicked.IsNull()){ if(!myLastPicked.IsNull()){
Standard_Integer HiMod = myLastPicked->HasHilightMode()?myLastPicked->HilightMode():0; const Handle(AIS_InteractiveObject) aLastPickedAIS =
myMainPM->Unhighlight(myLastPicked,HiMod); Handle(AIS_InteractiveObject)::DownCast (myLastPicked->Selectable());
Standard_Integer HiMod = aLastPickedAIS->HasHilightMode()?aLastPickedAIS->HilightMode():0;
myMainPM->Unhighlight (aLastPickedAIS, HiMod);
}} }}
if(!mylastmoveview.IsNull()){ if(!mylastmoveview.IsNull()){
@@ -739,7 +741,7 @@ Standard_Boolean AIS_InteractiveContext::ImmediateAdd (const Handle(AIS_Interact
Standard_Boolean AIS_InteractiveContext::EndImmediateDraw (const Handle(V3d_View)& theView) Standard_Boolean AIS_InteractiveContext::EndImmediateDraw (const Handle(V3d_View)& theView)
{ {
return HasOpenedContext() return HasOpenedContext()
&& myLocalContexts (myCurLocalIndex)->EndImmediateDraw (theView); && myLocalContexts (myCurLocalIndex)->EndImmediateDraw (theView->Viewer());
} }
//======================================================================= //=======================================================================
@@ -761,7 +763,7 @@ Standard_Boolean AIS_InteractiveContext::EndImmediateDraw()
} }
Handle(V3d_View) aView = myMainVwr->ActiveView(); Handle(V3d_View) aView = myMainVwr->ActiveView();
return myLocalContexts (myCurLocalIndex)->EndImmediateDraw (aView); return myLocalContexts (myCurLocalIndex)->EndImmediateDraw (aView->Viewer());
} }

View File

@@ -307,43 +307,6 @@ is
-- This range can, however, be extended through the -- This range can, however, be extended through the
-- creation of new display modes. -- creation of new display modes.
HasSelectionMode(me) returns Boolean from Standard;
---Purpose: Allows you to change the selection mode of an
-- Interactive Object.
-- The default selection mode setting is 0.
-- For shapes, for example, the selection modes are as follows:
-- - mode 0 - selection of the shape itself
-- - mode 1 - selection of vertices
-- - mode 2 - selection of edges
-- - mode 3 - selection of wires
-- - mode 4 - selection of faces
-- - mode 5 - selection of shells
-- - mode 6 - selection of solids
-- - mode 7 - selection of compounds
-- For trihedra, on the other hand, the selection modes are the following four:
-- - mode 0 - selection of a trihedron
-- - mode 1 - selection of its origin
-- - mode 2 - selection of its axes
-- - mode 3 - selection of its planes
SelectionMode(me) returns Integer from Standard;
---Purpose: Returns the selection mode of the interactive object.
SetSelectionMode(me:mutable; aMode: Integer from Standard);
---Purpose: You can change the default selection mode index
-- aMode of an Interactive Object.
-- This is only of interest if you decide that mode 0
-- adopted by convention will not do.
UnsetSelectionMode(me:mutable);
---Purpose: You can change the default selection mode index of
-- an Interactive Object.
-- This is only of interest if you decide that the 0 mode
-- adopted by convention will not do.
---C++: inline
SelectionPriority(me) returns Integer from Standard; SelectionPriority(me) returns Integer from Standard;
---C++: inline ---C++: inline
---Purpose: Returns the selection priority setting. -1 indicates that there is none. ---Purpose: Returns the selection priority setting. -1 indicates that there is none.
@@ -604,7 +567,6 @@ fields
---myOwnMaterial : NameOfPhysicalMaterial from Graphic3d is protected; ---myOwnMaterial : NameOfPhysicalMaterial from Graphic3d is protected;
mySelPriority : Integer from Standard; mySelPriority : Integer from Standard;
myDisplayMode : Integer from Standard ; myDisplayMode : Integer from Standard ;
mySelectionMode : Integer from Standard;
myHilightMode : Integer from Standard is protected; myHilightMode : Integer from Standard is protected;
myOwnWidth : Real from Standard is protected; myOwnWidth : Real from Standard is protected;
myInfiniteState : Boolean from Standard is protected; myInfiniteState : Boolean from Standard is protected;

View File

@@ -60,7 +60,6 @@ myRecomputeEveryPrs(Standard_True),
myCTXPtr(NULL), myCTXPtr(NULL),
mySelPriority(-1), mySelPriority(-1),
myDisplayMode (-1), myDisplayMode (-1),
mySelectionMode(0),
mystate(0) mystate(0)
{ {
Handle (AIS_InteractiveContext) Bid; Handle (AIS_InteractiveContext) Bid;
@@ -194,18 +193,6 @@ void AIS_InteractiveObject::SetDisplayMode(const Standard_Integer aMode)
myDisplayMode = aMode; myDisplayMode = aMode;
} }
//=======================================================================
//function :
//purpose :
//=======================================================================
void AIS_InteractiveObject::SetSelectionMode(const Standard_Integer aMode)
{
mySelectionMode = aMode;
}
//======================================================================= //=======================================================================
//function : //function :
//purpose : //purpose :

View File

@@ -44,17 +44,6 @@ inline void AIS_InteractiveObject::UnsetDisplayMode()
inline Standard_Integer AIS_InteractiveObject::DisplayMode() const inline Standard_Integer AIS_InteractiveObject::DisplayMode() const
{return myDisplayMode;} {return myDisplayMode;}
inline Standard_Boolean AIS_InteractiveObject::HasSelectionMode() const
{return mySelectionMode!=-1;}
inline void AIS_InteractiveObject::UnsetSelectionMode()
{mySelectionMode =-1;}
inline Standard_Integer AIS_InteractiveObject::SelectionMode() const
{return mySelectionMode;}
inline Quantity_NameOfColor AIS_InteractiveObject::Color() const inline Quantity_NameOfColor AIS_InteractiveObject::Color() const
{ {
return myOwnColor.Name(); return myOwnColor.Name();

View File

@@ -50,6 +50,7 @@ uses
ShapeEnum from TopAbs, ShapeEnum from TopAbs,
Shape from TopoDS, Shape from TopoDS,
View from V3d, View from V3d,
Viewer from V3d,
PresentationManager3d from PrsMgr, PresentationManager3d from PrsMgr,
IndexedMapOfOwner from SelectMgr, IndexedMapOfOwner from SelectMgr,
EntityOwner from SelectMgr, EntityOwner from SelectMgr,
@@ -465,10 +466,10 @@ is
---Purpose: Stores presentation theMode of object theObj in the transient list of presentations to be displayed in immediate mode. ---Purpose: Stores presentation theMode of object theObj in the transient list of presentations to be displayed in immediate mode.
-- Will be taken in account in EndImmediateDraw method. -- Will be taken in account in EndImmediateDraw method.
EndImmediateDraw (me : mutable; EndImmediateDraw (me : mutable;
theView : View from V3d) theViewer : Viewer from V3d)
returns Boolean from Standard; returns Boolean from Standard;
---Purpose: Allows rapid drawing of the view theView by avoiding an update of the whole background. ---Purpose: Allows rapid drawing of the each view in theViewer by avoiding an update of the whole background.
IsImmediateModeOn (me) returns Boolean from Standard; IsImmediateModeOn (me) returns Boolean from Standard;
---Purpose: Returns true if Presentation Manager is accumulating transient list of presentations to be displayed in immediate mode. ---Purpose: Returns true if Presentation Manager is accumulating transient list of presentations to be displayed in immediate mode.

View File

@@ -308,10 +308,10 @@ Erase(const Handle(AIS_InteractiveObject)& anInteractive)
// Deactivate selectable entities of interactive object // Deactivate selectable entities of interactive object
if (mySM->Contains (anInteractive)) if (mySM->Contains (anInteractive))
{ {
TColStd_ListIteratorOfListOfInteger aModeIter (STAT->SelectionModes()); while (!STAT->SelectionModes().IsEmpty())
for (; aModeIter.More(); aModeIter.Next())
{ {
mySM->Deactivate (anInteractive, aModeIter.Value(), myMainVS); mySM->Deactivate (anInteractive, STAT->SelectionModes().Last(), myMainVS);
STAT->RemoveSelectionMode (STAT->SelectionModes().Last());
} }
} }
@@ -625,13 +625,6 @@ void AIS_LocalContext::Terminate (const Standard_Boolean theToUpdate)
AIS_Selection::Select(); AIS_Selection::Select();
AIS_Selection::Remove(mySelName.ToCString()); AIS_Selection::Remove(mySelName.ToCString());
Handle(V3d_Viewer) aViewer = myCTX->CurrentViewer();
for (aViewer->InitActiveViews(); aViewer->MoreActiveViews(); aViewer->NextActiveViews())
{
Handle(V3d_View) aView = aViewer->ActiveView();
aView->View()->ClearImmediate();
}
Handle(V3d_View) aDummyView; Handle(V3d_View) aDummyView;
myMainVS->ClearSensitive (aDummyView); myMainVS->ClearSensitive (aDummyView);
@@ -1110,14 +1103,14 @@ Standard_Boolean AIS_LocalContext::ImmediateAdd (const Handle(AIS_InteractiveObj
//function : EndImmediateDraw //function : EndImmediateDraw
//purpose : //purpose :
//======================================================================= //=======================================================================
Standard_Boolean AIS_LocalContext::EndImmediateDraw (const Handle(V3d_View)& theView) Standard_Boolean AIS_LocalContext::EndImmediateDraw (const Handle(V3d_Viewer)& theViewer)
{ {
if (!myMainPM->IsImmediateModeOn()) if (!myMainPM->IsImmediateModeOn())
{ {
return Standard_False; return Standard_False;
} }
myMainPM->EndImmediateDraw (theView); myMainPM->EndImmediateDraw (theViewer);
return Standard_True; return Standard_True;
} }

View File

@@ -474,7 +474,7 @@ void AIS_LocalContext::Hilight (const Handle(SelectMgr_EntityOwner)& theOwner,
const Standard_Integer aHilightMode = GetHiMod (Handle(AIS_InteractiveObject)::DownCast (theOwner->Selectable())); const Standard_Integer aHilightMode = GetHiMod (Handle(AIS_InteractiveObject)::DownCast (theOwner->Selectable()));
myMainPM->BeginImmediateDraw(); myMainPM->BeginImmediateDraw();
theOwner->HilightWithColor (myMainPM, myCTX->HilightColor(), aHilightMode); theOwner->HilightWithColor (myMainPM, myCTX->HilightColor(), aHilightMode);
myMainPM->EndImmediateDraw (theView); myMainPM->EndImmediateDraw (theView->Viewer());
} }
//================================================== //==================================================
@@ -1389,7 +1389,7 @@ Standard_Boolean AIS_LocalContext::UnhilightLastDetected (const Handle(V3d_View)
: 0; : 0;
myMapOfOwner (mylastindex)->Unhilight (myMainPM, aHilightMode); myMapOfOwner (mylastindex)->Unhilight (myMainPM, aHilightMode);
myMainPM->EndImmediateDraw (theView); myMainPM->EndImmediateDraw (theView->Viewer());
mylastindex = 0; mylastindex = 0;
return Standard_True; return Standard_True;
} }

View File

@@ -37,6 +37,7 @@ uses
Projector from Prs3d, Projector from Prs3d,
Transformation from Geom, Transformation from Geom,
Integer from Standard, Integer from Standard,
EntityOwner from SelectMgr,
Selection from SelectMgr, Selection from SelectMgr,
Trsf from gp, Trsf from gp,
Pnt from gp, Pnt from gp,
@@ -126,6 +127,10 @@ is
---Purpose: Informs the graphic context that the interactive Object ---Purpose: Informs the graphic context that the interactive Object
-- may be decomposed into sub-shapes for dynamic selection. -- may be decomposed into sub-shapes for dynamic selection.
GlobalSelOwner(me)
returns EntityOwner from SelectMgr
is redefined virtual;
---Purpose: Returns the owner of mode for selection of object as a whole.
ComputeSelection(me:mutable; aSelection : Selection from SelectMgr; ComputeSelection(me:mutable; aSelection : Selection from SelectMgr;
aMode : Integer from Standard) aMode : Integer from Standard)

View File

@@ -385,3 +385,12 @@ void AIS_MultipleConnectedInteractive::ComputeSelection (const Handle(SelectMgr_
} }
} }
} }
//=======================================================================
//function : GlobalSelOwner
//purpose :
//=======================================================================
Handle(SelectMgr_EntityOwner) AIS_MultipleConnectedInteractive::GlobalSelOwner() const
{
return myAssemblyOwner;
}

View File

@@ -378,16 +378,6 @@ is
-- But it works in any case and is especially useful for view dump because the dump image is read from the back buffer. -- But it works in any case and is especially useful for view dump because the dump image is read from the back buffer.
-- @return previous mode. -- @return previous mode.
DisplayImmediateStructure ( me : mutable;
theCView : CView from Graphic3d;
theStructure : Structure from Graphic3d )
is deferred;
---Purpose: Display structure in immediate mode on top of general presentation
---C++: alias "
//! Erases immediate structure
Standard_EXPORT virtual void EraseImmediateStructure (const Graphic3d_CView& theCView, const Graphic3d_CStructure& theCStructure) = 0;"
------------------------------- -------------------------------
-- Category: Layer mode methods -- Category: Layer mode methods
------------------------------- -------------------------------

View File

@@ -28,7 +28,7 @@ public:
//! Empty constructor. //! Empty constructor.
Graphic3d_ViewAffinity() Graphic3d_ViewAffinity()
{ {
::memset (&myMask, 0xFF, sizeof(myMask)); SetVisible (Standard_True);
} }
//! Return visibility flag. //! Return visibility flag.
@@ -38,6 +38,12 @@ public:
return (myMask & aBit) != 0; return (myMask & aBit) != 0;
} }
//! Setup visibility flag for all views.
void SetVisible (const Standard_Boolean theIsVisible)
{
::memset (&myMask, theIsVisible ? 0xFF : 0x00, sizeof(myMask));
}
//! Setup visibility flag. //! Setup visibility flag.
void SetVisible (const Standard_Integer theViewId, void SetVisible (const Standard_Integer theViewId,
const bool theIsVisible) const bool theIsVisible)

View File

@@ -991,6 +991,8 @@ void MeshVS_Mesh::HilightSelected ( const Handle(PrsMgr_PresentationManager3d)&
IsNeedToRedisplay = Standard_True; IsNeedToRedisplay = Standard_True;
aSelectionPrs->SetZLayer (Graphic3d_ZLayerId_Top);
if ( IsNeedToRedisplay ) if ( IsNeedToRedisplay )
{ {
aSelectionPrs->SetDisplayPriority(9); aSelectionPrs->SetDisplayPriority(9);
@@ -1105,6 +1107,8 @@ void MeshVS_Mesh::HilightOwnerWithColor ( const Handle(PrsMgr_PresentationManage
} }
} }
aHilightPrs->SetZLayer (Graphic3d_ZLayerId_Topmost);
if (PM->IsImmediateModeOn()) if (PM->IsImmediateModeOn())
{ {
PM->AddToImmediateList (aHilightPrs); PM->AddToImmediateList (aHilightPrs);

View File

@@ -29,7 +29,7 @@ proc Visualization:toolkits { } {
if { "$::tcl_platform(platform)" == "windows" } { if { "$::tcl_platform(platform)" == "windows" } {
if { [info exists ::env(HAVE_D3D)] && "$::env(HAVE_D3D)" == "true" } { if { [info exists ::env(HAVE_D3D)] && "$::env(HAVE_D3D)" == "true" } {
lappend aResult "TKD3DHost" lappend aResult "TKD3DHost"
} elseif { [info exists ::env(VCVER)] && "$::env(VCVER)" != "vc8" && "$::env(VCVER)" != "vc9" && "$::env(VCVER)" != "vc10" } { } elseif { [info exists ::env(VCVER)] && "$::env(VCVER)" != "vc8" && "$::env(VCVER)" != "vc9" && "$::env(VCVER)" != "vc10" && "$::env(VCVER)" != "vc11" } {
lappend aResult "TKD3DHost" lappend aResult "TKD3DHost"
} }
} }

View File

@@ -30,8 +30,10 @@ OpenGl_Caps::OpenGl_Caps()
keepArrayData (Standard_False), keepArrayData (Standard_False),
#if !defined(GL_ES_VERSION_2_0) #if !defined(GL_ES_VERSION_2_0)
ffpEnable (Standard_True), ffpEnable (Standard_True),
useSystemBuffer (Standard_False),
#else #else
ffpEnable (Standard_False), ffpEnable (Standard_False),
useSystemBuffer (Standard_True),
#endif #endif
buffersNoSwap (Standard_False), buffersNoSwap (Standard_False),
contextStereo (Standard_False), contextStereo (Standard_False),
@@ -64,6 +66,7 @@ OpenGl_Caps& OpenGl_Caps::operator= (const OpenGl_Caps& theCopy)
pntSpritesDisable = theCopy.pntSpritesDisable; pntSpritesDisable = theCopy.pntSpritesDisable;
keepArrayData = theCopy.keepArrayData; keepArrayData = theCopy.keepArrayData;
ffpEnable = theCopy.ffpEnable; ffpEnable = theCopy.ffpEnable;
useSystemBuffer = theCopy.useSystemBuffer;
buffersNoSwap = theCopy.buffersNoSwap; buffersNoSwap = theCopy.buffersNoSwap;
contextStereo = theCopy.contextStereo; contextStereo = theCopy.contextStereo;
contextDebug = theCopy.contextDebug; contextDebug = theCopy.contextDebug;

View File

@@ -31,6 +31,7 @@ public: //! @name flags to disable particular functionality, should be used only
Standard_Boolean pntSpritesDisable; //!< flag permits Point Sprites usage, will significantly affect performance (OFF by default) Standard_Boolean pntSpritesDisable; //!< flag permits Point Sprites usage, will significantly affect performance (OFF by default)
Standard_Boolean keepArrayData; //!< Disables freeing CPU memory after building VBOs (OFF by default) Standard_Boolean keepArrayData; //!< Disables freeing CPU memory after building VBOs (OFF by default)
Standard_Boolean ffpEnable; //!< Enables FFP (fixed-function pipeline), do not use built-in GLSL programs (ON by default on desktop OpenGL and OFF on OpenGL ES) Standard_Boolean ffpEnable; //!< Enables FFP (fixed-function pipeline), do not use built-in GLSL programs (ON by default on desktop OpenGL and OFF on OpenGL ES)
Standard_Boolean useSystemBuffer; //!< Enables usage of system backbuffer for blitting (OFF by default on desktop OpenGL and ON on OpenGL ES for testing)
public: //! @name context creation parameters public: //! @name context creation parameters

View File

@@ -415,40 +415,6 @@ Standard_Boolean OpenGl_GraphicDriver::SetImmediateModeDrawToFront (const Graphi
return Standard_False; return Standard_False;
} }
// =======================================================================
// function : DisplayImmediateStructure
// purpose :
// =======================================================================
void OpenGl_GraphicDriver::DisplayImmediateStructure (const Graphic3d_CView& theCView,
const Handle(Graphic3d_Structure)& theStructure)
{
OpenGl_CView* aCView = (OpenGl_CView* )theCView.ptrView;
if (aCView == NULL)
{
return;
}
aCView->View->DisplayImmediateStructure (theStructure);
}
// =======================================================================
// function : EraseImmediateStructure
// purpose :
// =======================================================================
void OpenGl_GraphicDriver::EraseImmediateStructure (const Graphic3d_CView& theCView,
const Graphic3d_CStructure& theCStructure)
{
OpenGl_CView* aCView = (OpenGl_CView* )theCView.ptrView;
OpenGl_Structure* aStructure = (OpenGl_Structure* )&theCStructure;
if (aCView == NULL)
{
return;
}
aCView->View->EraseImmediateStructure (aStructure);
}
// ======================================================================= // =======================================================================
// function : Print // function : Print
// purpose : // purpose :

View File

@@ -131,10 +131,6 @@ public: // Methods for graphical structures
Standard_EXPORT Standard_Boolean SetImmediateModeDrawToFront (const Graphic3d_CView& theCView, Standard_EXPORT Standard_Boolean SetImmediateModeDrawToFront (const Graphic3d_CView& theCView,
const Standard_Boolean theDrawToFrontBuffer); const Standard_Boolean theDrawToFrontBuffer);
Standard_EXPORT void DisplayImmediateStructure (const Graphic3d_CView& theCView,
const Handle(Graphic3d_Structure)& theStructure);
Standard_EXPORT void EraseImmediateStructure (const Graphic3d_CView& theCView,
const Graphic3d_CStructure& theCStructure);
public: public:

View File

@@ -42,6 +42,8 @@ OpenGl_StructureShadow::OpenGl_StructureShadow (const Handle(Graphic3d_Structure
} }
} }
UpdateTransformation();
myInstancedStructure = const_cast<OpenGl_Structure*> (myParent->InstancedStructure());
TransformPersistence.IsSet = myParent->TransformPersistence.IsSet; TransformPersistence.IsSet = myParent->TransformPersistence.IsSet;
TransformPersistence.Flag = myParent->TransformPersistence.Flag; TransformPersistence.Flag = myParent->TransformPersistence.Flag;
TransformPersistence.Point = myParent->TransformPersistence.Point; TransformPersistence.Point = myParent->TransformPersistence.Point;

View File

@@ -135,12 +135,6 @@ class OpenGl_View : public MMgt_TShared
//! Erase structure from display list. //! Erase structure from display list.
void EraseStructure (const Handle(Graphic3d_Structure)& theStructure); void EraseStructure (const Handle(Graphic3d_Structure)& theStructure);
//! Add structure to the list of immediate structures.
void DisplayImmediateStructure (const Handle(Graphic3d_Structure)& theStructure);
//! Erase structure from display list.
void EraseImmediateStructure (const OpenGl_Structure* theStructure);
//! Insert a new top-level z layer with ID <theLayerId> //! Insert a new top-level z layer with ID <theLayerId>
void AddZLayer (const Graphic3d_ZLayerId theLayerId); void AddZLayer (const Graphic3d_ZLayerId theLayerId);
@@ -200,17 +194,10 @@ class OpenGl_View : public MMgt_TShared
//! marks primitive set for rebuild. //! marks primitive set for rebuild.
void InvalidateBVHData (const Standard_Integer theLayerId); void InvalidateBVHData (const Standard_Integer theLayerId);
//! Returns list of immediate structures rendered on top of main presentation
const OpenGl_SequenceOfStructure& ImmediateStructures() const
{
return myImmediateList;
}
//! Returns true if there are immediate structures to display //! Returns true if there are immediate structures to display
bool HasImmediateStructures() const bool HasImmediateStructures() const
{ {
return !myImmediateList.IsEmpty() return myZLayers.NbImmediateStructures() != 0;
|| myZLayers.NbImmediateStructures() != 0;
} }
protected: protected:
@@ -267,8 +254,7 @@ protected:
//View_LABDepthCueing - fixed index used //View_LABDepthCueing - fixed index used
OpenGl_LayerList myZLayers; //!< main list of displayed structure, sorted by layers OpenGl_LayerList myZLayers; //!< main list of displayed structure, sorted by layers
OpenGl_SequenceOfStructure myImmediateList; //!< list of immediate structures rendered on top of main presentation
const TEL_TRANSFORM_PERSISTENCE *myTransPers; const TEL_TRANSFORM_PERSISTENCE *myTransPers;
Standard_Boolean myIsTransPers; Standard_Boolean myIsTransPers;

View File

@@ -568,7 +568,9 @@ void OpenGl_View::RenderStructs (const Handle(OpenGl_Workspace)& theWorkspace,
} }
Standard_Boolean toRenderGL = theToDrawImmediate || Standard_Boolean toRenderGL = theToDrawImmediate ||
theCView.RenderParams.Method != Graphic3d_RM_RAYTRACING || myRaytraceInitStatus == OpenGl_RT_FAIL; theCView.RenderParams.Method != Graphic3d_RM_RAYTRACING ||
myRaytraceInitStatus == OpenGl_RT_FAIL ||
aCtx->IsFeedback();
if (!toRenderGL) if (!toRenderGL)
{ {
@@ -911,26 +913,6 @@ void OpenGl_View::DisplayStructure (const Handle(Graphic3d_Structure)& theStruct
myZLayers.AddStructure (aStruct, aZLayer, thePriority); myZLayers.AddStructure (aStruct, aZLayer, thePriority);
} }
//=======================================================================
//function : DisplayImmediateStructure
//purpose :
//=======================================================================
void OpenGl_View::DisplayImmediateStructure (const Handle(Graphic3d_Structure)& theStructure)
{
const OpenGl_Structure* aStruct = reinterpret_cast<const OpenGl_Structure*> (theStructure->CStructure().operator->());
for (OpenGl_SequenceOfStructure::Iterator anIter (myImmediateList);
anIter.More(); anIter.Next())
{
if (anIter.Value() == aStruct)
{
return;
}
}
myImmediateList.Append (aStruct);
}
//======================================================================= //=======================================================================
//function : EraseStructure //function : EraseStructure
//purpose : //purpose :
@@ -941,24 +923,6 @@ void OpenGl_View::EraseStructure (const Handle(Graphic3d_Structure)& theStructur
myZLayers.RemoveStructure (theStructure); myZLayers.RemoveStructure (theStructure);
} }
//=======================================================================
//function : EraseImmediateStructure
//purpose :
//=======================================================================
void OpenGl_View::EraseImmediateStructure (const OpenGl_Structure* theStructure)
{
for (OpenGl_SequenceOfStructure::Iterator anIter (myImmediateList);
anIter.More(); anIter.Next())
{
if (anIter.Value() == theStructure)
{
myImmediateList.Remove (anIter);
return;
}
}
}
//======================================================================= //=======================================================================
//function : ChangeZLayer //function : ChangeZLayer
//purpose : //purpose :

View File

@@ -742,7 +742,7 @@ bool OpenGl_Workspace::blitBuffers (OpenGl_FrameBuffer* theReadFbo,
OpenGl_FrameBuffer* theDrawFbo, OpenGl_FrameBuffer* theDrawFbo,
const Standard_Boolean theToFlip) const Standard_Boolean theToFlip)
{ {
if (theReadFbo == NULL) if (theReadFbo == NULL || myGlContext->IsFeedback())
{ {
return false; return false;
} }
@@ -939,8 +939,7 @@ void OpenGl_Workspace::Redraw (const Graphic3d_CView& theCView,
{ {
myMainSceneFbos[0]->Init (myGlContext, aSizeX, aSizeY); myMainSceneFbos[0]->Init (myGlContext, aSizeX, aSizeY);
} }
if (myToFlipOutput if (!myGlContext->caps->useSystemBuffer && myMainSceneFbos[0]->IsValid())
&& myMainSceneFbos[0]->IsValid())
{ {
myImmediateSceneFbos[0]->InitLazy (myGlContext, aSizeX, aSizeY); myImmediateSceneFbos[0]->InitLazy (myGlContext, aSizeX, aSizeY);
} }
@@ -1040,8 +1039,7 @@ void OpenGl_Workspace::Redraw (const Graphic3d_CView& theCView,
{ {
OpenGl_FrameBuffer* aMainFbo = myMainSceneFbos[0]->IsValid() ? myMainSceneFbos[0].operator->() : NULL; OpenGl_FrameBuffer* aMainFbo = myMainSceneFbos[0]->IsValid() ? myMainSceneFbos[0].operator->() : NULL;
OpenGl_FrameBuffer* anImmFbo = aFrameBuffer; OpenGl_FrameBuffer* anImmFbo = aFrameBuffer;
if (myToFlipOutput if (!myGlContext->caps->useSystemBuffer && myImmediateSceneFbos[0]->IsValid())
&& myImmediateSceneFbos[0]->IsValid())
{ {
anImmFbo = myImmediateSceneFbos[0].operator->(); anImmFbo = myImmediateSceneFbos[0].operator->();
} }
@@ -1360,8 +1358,7 @@ void OpenGl_Workspace::RedrawImmediate (const Graphic3d_CView& theCView,
{ {
OpenGl_FrameBuffer* aMainFbo = myMainSceneFbos[0]->IsValid() ? myMainSceneFbos[0].operator->() : NULL; OpenGl_FrameBuffer* aMainFbo = myMainSceneFbos[0]->IsValid() ? myMainSceneFbos[0].operator->() : NULL;
OpenGl_FrameBuffer* anImmFbo = aFrameBuffer; OpenGl_FrameBuffer* anImmFbo = aFrameBuffer;
if (myToFlipOutput if (!myGlContext->caps->useSystemBuffer && myImmediateSceneFbos[0]->IsValid())
&& myImmediateSceneFbos[0]->IsValid())
{ {
anImmFbo = myImmediateSceneFbos[0].operator->(); anImmFbo = myImmediateSceneFbos[0].operator->();
} }
@@ -1477,21 +1474,6 @@ bool OpenGl_Workspace::redrawImmediate (const Graphic3d_CView& theCView,
myView->Render (myPrintContext, aWS, theDrawFbo, theProjection, myView->Render (myPrintContext, aWS, theDrawFbo, theProjection,
theCView, theCUnderLayer, theCOverLayer, Standard_True); theCView, theCUnderLayer, theCOverLayer, Standard_True);
if (!myView->ImmediateStructures().IsEmpty())
{
glDisable (GL_DEPTH_TEST);
}
for (OpenGl_SequenceOfStructure::Iterator anIter (myView->ImmediateStructures());
anIter.More(); anIter.Next())
{
const OpenGl_Structure* aStructure = anIter.Value();
if (!aStructure->IsVisible())
{
continue;
}
aStructure->Render (aWS);
}
return !toCopyBackToFront; return !toCopyBackToFront;
} }

View File

@@ -24,7 +24,9 @@ IMPLEMENT_STANDARD_RTTIEXT(Prs3d_PresentationShadow, Prs3d_Presentation)
//======================================================================= //=======================================================================
Prs3d_PresentationShadow::Prs3d_PresentationShadow (const Handle(Graphic3d_StructureManager)& theViewer, Prs3d_PresentationShadow::Prs3d_PresentationShadow (const Handle(Graphic3d_StructureManager)& theViewer,
const Handle(Prs3d_Presentation)& thePrs) const Handle(Prs3d_Presentation)& thePrs)
: Prs3d_Presentation (theViewer, thePrs) : Prs3d_Presentation (theViewer, thePrs),
myParentStructId (thePrs->Identification()),
myParentAffinity (thePrs->CStructure()->ViewAffinity)
{ {
// //
} }

View File

@@ -28,10 +28,20 @@ public:
Standard_EXPORT Prs3d_PresentationShadow (const Handle(Graphic3d_StructureManager)& theViewer, Standard_EXPORT Prs3d_PresentationShadow (const Handle(Graphic3d_StructureManager)& theViewer,
const Handle(Prs3d_Presentation)& thePrs); const Handle(Prs3d_Presentation)& thePrs);
//! Returns the id of the parent presentation
Standard_EXPORT inline Standard_Integer ParentId() const { return myParentStructId; }
//! Returns view affinity of the parent presentation
Standard_EXPORT inline const Handle(Graphic3d_ViewAffinity)& ParentAffinity() const { return myParentAffinity; }
private: private:
DEFINE_STANDARD_RTTI(Prs3d_PresentationShadow) DEFINE_STANDARD_RTTI(Prs3d_PresentationShadow)
private:
Standard_Integer myParentStructId;
Handle(Graphic3d_ViewAffinity) myParentAffinity;
}; };
DEFINE_STANDARD_HANDLE(Prs3d_PresentationShadow, Prs3d_Presentation) DEFINE_STANDARD_HANDLE(Prs3d_PresentationShadow, Prs3d_Presentation)

View File

@@ -25,6 +25,7 @@ inherits TShared from MMgt
uses uses
StructureManager from Graphic3d, StructureManager from Graphic3d,
ZLayerId from Graphic3d,
PresentableObject from PrsMgr, PresentableObject from PrsMgr,
ListOfPresentations from PrsMgr, ListOfPresentations from PrsMgr,
Length,NameOfColor from Quantity, Length,NameOfColor from Quantity,
@@ -32,7 +33,7 @@ uses
Transformation from Geom, Transformation from Geom,
NameOfMaterial from Graphic3d, NameOfMaterial from Graphic3d,
Presentation from PrsMgr, Presentation from PrsMgr,
View from V3d, Viewer from V3d,
ViewManager from Visual3d, ViewManager from Visual3d,
ShadingAspect from Prs3d, ShadingAspect from Prs3d,
Presentation from Prs3d Presentation from Prs3d
@@ -148,29 +149,39 @@ is
---Purpose: Resets the transient list of presentations previously displayed in immediate mode ---Purpose: Resets the transient list of presentations previously displayed in immediate mode
-- and begins accumulation of new list by following AddToImmediateList()/Color()/Highlight() calls. -- and begins accumulation of new list by following AddToImmediateList()/Color()/Highlight() calls.
ClearImmediateDraw (me : mutable); ClearImmediateDraw (me : mutable)
is static;
---Purpose: Resets the transient list of presentations previously displayed in immediate mode. ---Purpose: Resets the transient list of presentations previously displayed in immediate mode.
AddToImmediateList (me : mutable; AddToImmediateList (me : mutable;
thePrs : Presentation from Prs3d); thePrs : Presentation from Prs3d)
is static;
---Purpose: Stores thePrs in the transient list of presentations to be displayed in immediate mode. ---Purpose: Stores thePrs in the transient list of presentations to be displayed in immediate mode.
-- Will be taken in account in EndImmediateDraw method. -- Will be taken in account in EndImmediateDraw method.
EndImmediateDraw (me : mutable; EndImmediateDraw (me : mutable;
theView : View from V3d); theViewer : Viewer from V3d)
---Purpose: Allows rapid drawing of the view theView by avoiding an update of the whole background. is static;
---Purpose: Allows rapid drawing of the each view in theViewer by avoiding an update of the whole background.
IsImmediateModeOn (me) returns Boolean from Standard; RedrawImmediate (me : mutable;
theViewer : Viewer from V3d)
is static;
---Purpose: Clears and redisplays immediate structures of the viewer taking into account its affinity
IsImmediateModeOn (me) returns Boolean from Standard
is static;
---C++: inline ---C++: inline
---Purpose: Returns true if Presentation Manager is accumulating transient list of presentations to be displayed in immediate mode. ---Purpose: Returns true if Presentation Manager is accumulating transient list of presentations to be displayed in immediate mode.
---Category: Hilighting methods. ---Category: Hilighting methods.
Color (me : mutable; Color (me : mutable;
thePrsObject : PresentableObject from PrsMgr; thePrsObject : PresentableObject from PrsMgr;
theColor : NameOfColor from Quantity = Quantity_NOC_YELLOW; theColor : NameOfColor from Quantity = Quantity_NOC_YELLOW;
theMode : Integer from Standard = 0; theMode : Integer from Standard = 0;
theSelObj : PresentableObject from PrsMgr = NULL) theSelObj : PresentableObject from PrsMgr = NULL;
theImmediateStructLayerId : ZLayerId from Graphic3d = Graphic3d_ZLayerId_Topmost)
---Purpose: Highlights the graphic object thePrsObject in the color theColor. ---Purpose: Highlights the graphic object thePrsObject in the color theColor.
-- thePrsObject has the display mode theMode; -- thePrsObject has the display mode theMode;
-- this has the default value of 0, that is, the wireframe display mode. -- this has the default value of 0, that is, the wireframe display mode.
@@ -251,12 +262,17 @@ is
---Purpose: Removes a presentation of the presentable object thePrsObject to this framework. thePrsObject has the display mode theMode. ---Purpose: Removes a presentation of the presentable object thePrsObject to this framework. thePrsObject has the display mode theMode.
is protected; is protected;
displayImmediate (me : mutable;
theViewer : Viewer from V3d);
---Purpose: Handles the structures from <myImmediateList> and displays it separating view-dependent structures and taking into account
-- structure visibility by setting proper affinity.
fields fields
myStructureManager : ViewManager from Visual3d is protected; myStructureManager : ViewManager from Visual3d is protected;
myImmediateModeOn : Integer from Standard is protected; myImmediateModeOn : Integer from Standard is protected;
myImmediateList : ListOfPresentations from PrsMgr is protected; myImmediateList : ListOfPresentations from PrsMgr is protected;
myImmediateView : View from V3d is protected; myViewDependentImmediateList : ListOfPresentations from PrsMgr is protected;
mySelectionColor : Color from Quantity is protected; mySelectionColor : Color from Quantity is protected;
end PresentationManager from PrsMgr; end PresentationManager from PrsMgr;

View File

@@ -317,40 +317,108 @@ void PrsMgr_PresentationManager::BeginImmediateDraw()
// ======================================================================= // =======================================================================
void PrsMgr_PresentationManager::ClearImmediateDraw() void PrsMgr_PresentationManager::ClearImmediateDraw()
{ {
if (myImmediateView.IsNull())
{
myImmediateList.Clear();
return;
}
for (PrsMgr_ListOfPresentations::Iterator anIter (myImmediateList); anIter.More(); anIter.Next()) for (PrsMgr_ListOfPresentations::Iterator anIter (myImmediateList); anIter.More(); anIter.Next())
{ {
myImmediateView->View()->EraseImmediate (anIter.Value()); anIter.Value()->Erase();
}
for (PrsMgr_ListOfPresentations::Iterator anIter (myViewDependentImmediateList); anIter.More(); anIter.Next())
{
anIter.Value()->Erase();
} }
myImmediateList.Clear(); myImmediateList.Clear();
myImmediateView.Nullify(); myViewDependentImmediateList.Clear();
}
// =======================================================================
// function : displayImmediate
// purpose : Handles the structures from myImmediateList and its visibility
// in all views of the viewer given by setting proper affinity
// =======================================================================
void PrsMgr_PresentationManager::displayImmediate (const Handle(V3d_Viewer)& theViewer)
{
for (theViewer->InitActiveViews(); theViewer->MoreActiveViews(); theViewer->NextActiveViews())
{
const Handle(Visual3d_View)& aView = theViewer->ActiveView()->View();
for (PrsMgr_ListOfPresentations::Iterator anIter (myImmediateList); anIter.More(); anIter.Next())
{
const Handle(Prs3d_Presentation)& aPrs = anIter.Value();
if (aPrs.IsNull())
continue;
Handle(Prs3d_Presentation) aViewDepPrs;
Handle(Prs3d_PresentationShadow) aShadowPrs = Handle(Prs3d_PresentationShadow)::DownCast (aPrs);
if (!aShadowPrs.IsNull() && aView->IsComputed (aShadowPrs->ParentId(), aViewDepPrs))
{
aShadowPrs.Nullify();
aShadowPrs = new Prs3d_PresentationShadow (myStructureManager, aViewDepPrs);
aShadowPrs->SetZLayer (aViewDepPrs->CStructure()->ZLayer());
aShadowPrs->SetClipPlanes (aViewDepPrs->GetClipPlanes());
aShadowPrs->CStructure()->IsForHighlight = 1;
aShadowPrs->Highlight (Aspect_TOHM_COLOR, aPrs->HighlightColor());
myViewDependentImmediateList.Append (aShadowPrs);
}
// handles custom highlight presentations which were defined in overriden
// HilightOwnerWithColor method of a custom AIS objects and maintain its
// visibility in different views on their own
else if (aShadowPrs.IsNull())
{
aPrs->Display();
continue;
}
if (!aShadowPrs->IsDisplayed())
{
aShadowPrs->CStructure()->ViewAffinity = new Graphic3d_ViewAffinity();
aShadowPrs->CStructure()->ViewAffinity->SetVisible (Standard_False);
aShadowPrs->Display();
}
Standard_Integer aViewId = aView->Identification();
bool isParentVisible = aShadowPrs->ParentAffinity().IsNull() ?
Standard_True : aShadowPrs->ParentAffinity()->IsVisible (aViewId);
aShadowPrs->CStructure()->ViewAffinity->SetVisible (aViewId, isParentVisible);
}
}
} }
// ======================================================================= // =======================================================================
// function : EndImmediateDraw // function : EndImmediateDraw
// purpose : // purpose :
// ======================================================================= // =======================================================================
void PrsMgr_PresentationManager::EndImmediateDraw (const Handle(V3d_View)& theView) void PrsMgr_PresentationManager::EndImmediateDraw (const Handle(V3d_Viewer)& theViewer)
{ {
if (--myImmediateModeOn > 0) if (--myImmediateModeOn > 0)
{ {
return; return;
} }
displayImmediate (theViewer);
}
// =======================================================================
// function : RedrawImmediate
// purpose : Clears all immediate structures and redisplays with proper
// affinity
//=======================================================================
void PrsMgr_PresentationManager::RedrawImmediate (const Handle(V3d_Viewer)& theViewer)
{
if (myImmediateList.IsEmpty())
return;
// Clear previously displayed structures
for (PrsMgr_ListOfPresentations::Iterator anIter (myImmediateList); anIter.More(); anIter.Next()) for (PrsMgr_ListOfPresentations::Iterator anIter (myImmediateList); anIter.More(); anIter.Next())
{ {
theView->View()->DisplayImmediate (anIter.Value(), Standard_True); anIter.Value()->Erase();
} }
if (!myImmediateList.IsEmpty()) for (PrsMgr_ListOfPresentations::Iterator anIter (myViewDependentImmediateList); anIter.More(); anIter.Next())
{ {
myImmediateView = theView; anIter.Value()->Erase();
} }
myViewDependentImmediateList.Clear();
displayImmediate (theViewer);
} }
// ======================================================================= // =======================================================================
@@ -519,11 +587,12 @@ void PrsMgr_PresentationManager::Transform (const Handle(PrsMgr_PresentableObjec
void PrsMgr_PresentationManager::Color (const Handle(PrsMgr_PresentableObject)& thePrsObj, void PrsMgr_PresentationManager::Color (const Handle(PrsMgr_PresentableObject)& thePrsObj,
const Quantity_NameOfColor theColor, const Quantity_NameOfColor theColor,
const Standard_Integer theMode, const Standard_Integer theMode,
const Handle(PrsMgr_PresentableObject)& theSelObj) const Handle(PrsMgr_PresentableObject)& theSelObj,
const Standard_Integer theImmediateStructLayerId)
{ {
for (PrsMgr_ListOfPresentableObjectsIter anIter (thePrsObj->Children()); anIter.More(); anIter.Next()) for (PrsMgr_ListOfPresentableObjectsIter anIter (thePrsObj->Children()); anIter.More(); anIter.Next())
{ {
Color (anIter.Value(), theColor, theMode); Color (anIter.Value(), theColor, theMode, NULL, theImmediateStructLayerId);
} }
if (!thePrsObj->HasOwnPresentations()) if (!thePrsObj->HasOwnPresentations())
{ {
@@ -539,6 +608,9 @@ void PrsMgr_PresentationManager::Color (const Handle(PrsMgr_PresentableObject)&
if (myImmediateModeOn > 0) if (myImmediateModeOn > 0)
{ {
Handle(Prs3d_PresentationShadow) aShadow = new Prs3d_PresentationShadow (myStructureManager, aPrs->Presentation()); Handle(Prs3d_PresentationShadow) aShadow = new Prs3d_PresentationShadow (myStructureManager, aPrs->Presentation());
aShadow->SetZLayer (theImmediateStructLayerId);
aShadow->SetClipPlanes (aPrs->Presentation()->GetClipPlanes());
aShadow->CStructure()->IsForHighlight = 1;
aShadow->Highlight (Aspect_TOHM_COLOR, theColor); aShadow->Highlight (Aspect_TOHM_COLOR, theColor);
AddToImmediateList (aShadow); AddToImmediateList (aShadow);
} }

View File

@@ -417,13 +417,14 @@ static Standard_Integer OCC74bug_set (Draw_Interpretor& di, Standard_Integer arg
di << argv[1] << " : No interactive object" << "\n"; di << argv[1] << " : No interactive object" << "\n";
return 1; return 1;
} }
AISObj->SetSelectionMode(SelectMode);
if (!aContext->HasOpenedContext()) { if (!aContext->HasOpenedContext()) {
aContext->OpenLocalContext(); aContext->OpenLocalContext();
} }
aContext->Erase(AISObj, updateviewer); aContext->Erase(AISObj, updateviewer);
aContext->UpdateCurrentViewer(); aContext->UpdateCurrentViewer();
aContext->SetAutoActivateSelection (Standard_False);
aContext->Display(AISObj, updateviewer); aContext->Display(AISObj, updateviewer);
aContext->Activate (AISObj, SelectMode);
aContext->UpdateCurrentViewer(); aContext->UpdateCurrentViewer();
} }
return 0; return 0;
@@ -456,8 +457,10 @@ static Standard_Integer OCC74bug_get (Draw_Interpretor& di, Standard_Integer arg
di << argv[1] << " : No interactive object" << "\n"; di << argv[1] << " : No interactive object" << "\n";
return 1; return 1;
} }
Standard_Integer SelectMode = AISObj->SelectionMode(); TColStd_ListOfInteger anActivatedModes;
di << SelectMode << "\n"; aContext->ActivatedModes (AISObj, anActivatedModes);
Standard_Integer aMode = anActivatedModes.IsEmpty() ? -1 : anActivatedModes.Last();
di << aMode << "\n";
} }
return 0; return 0;

View File

@@ -229,11 +229,11 @@ static Standard_Integer OCC136 (Draw_Interpretor& di, Standard_Integer argc, con
anAISCtx->Display(aSh4); anAISCtx->Display(aSh4);
//set selected //set selected
anAISCtx->InitCurrent(); anAISCtx->InitSelected();
anAISCtx->AddOrRemoveCurrentObject(aSh1); anAISCtx->AddOrRemoveSelected(aSh1);
anAISCtx->AddOrRemoveCurrentObject(aSh2); anAISCtx->AddOrRemoveSelected(aSh2);
anAISCtx->AddOrRemoveCurrentObject(aSh3); anAISCtx->AddOrRemoveSelected(aSh3);
anAISCtx->AddOrRemoveCurrentObject(aSh4); anAISCtx->AddOrRemoveSelected(aSh4);
//remove all this objects from context //remove all this objects from context
anAISCtx->Remove (aSh1, Standard_False); anAISCtx->Remove (aSh1, Standard_False);
@@ -738,12 +738,13 @@ static Standard_Integer OCC166 (Draw_Interpretor& di, Standard_Integer /*argc*/,
BRepPrimAPI_MakeBox aBox(gp_Pnt(0, 0, 0), 100, 100, 100); BRepPrimAPI_MakeBox aBox(gp_Pnt(0, 0, 0), 100, 100, 100);
Handle(AIS_Shape) anAISBox = new AIS_Shape(aBox.Shape()); Handle(AIS_Shape) anAISBox = new AIS_Shape(aBox.Shape());
myAISContext->SetAutoActivateSelection (Standard_False);
myAISContext->Display(anAISBox, 1); myAISContext->Display(anAISBox, 1);
anAISBox->SetSelectionMode(-1);
Standard_Integer myLocContInd = myAISContext->OpenLocalContext(); Standard_Integer myLocContInd = myAISContext->OpenLocalContext();
myAISContext->CloseLocalContext(myLocContInd); myAISContext->CloseLocalContext(myLocContInd);
Standard_Integer aSelMode = ((Handle(AIS_InteractiveObject)) anAISBox)->SelectionMode(); TColStd_ListOfInteger anActivatedModes;
if(aSelMode != -1) myAISContext->ActivatedModes (anAISBox, anActivatedModes);
if(anActivatedModes.Extent() != 1 || anActivatedModes.First() != -1 )
return 1; return 1;
return 0; return 0;
@@ -5255,7 +5256,7 @@ Standard_Integer CR23234 (Draw_Interpretor& di, Standard_Integer argc, const cha
Handle(Geom_Axis2Placement) trihedronAxis = new Geom_Axis2Placement(gp::XOY()); Handle(Geom_Axis2Placement) trihedronAxis = new Geom_Axis2Placement(gp::XOY());
Handle(AIS_Trihedron) trihedron = new AIS_Trihedron(trihedronAxis); Handle(AIS_Trihedron) trihedron = new AIS_Trihedron(trihedronAxis);
if (aMode) if (aMode)
trihedron->UnsetSelectionMode(); // this line causes an exception on OpenLocalContext aisContext->SetAutoActivateSelection (Standard_False); // if selection must not be activated
trihedron->SetSize(20); trihedron->SetSize(20);
trihedron->SetColor(Quantity_NOC_GRAY30); trihedron->SetColor(Quantity_NOC_GRAY30);
trihedron->SetArrowColor(Quantity_NOC_GRAY30); trihedron->SetArrowColor(Quantity_NOC_GRAY30);

View File

@@ -398,21 +398,21 @@ static Standard_Integer OCC138 (Draw_Interpretor& di, Standard_Integer /*argc*/
aContext->Display(ais2); aContext->Display(ais2);
aContext->Display(ais3); aContext->Display(ais3);
aContext->AddOrRemoveCurrentObject(ais1); aContext->AddOrRemoveSelected(ais1);
aContext->AddOrRemoveCurrentObject(ais2); aContext->AddOrRemoveSelected(ais2);
aContext->AddOrRemoveCurrentObject(ais3); aContext->AddOrRemoveSelected(ais3);
di << "\n No of currents = " << aContext->NbCurrents(); di << "\n No of currents = " << aContext->NbSelected();
aContext->InitCurrent(); aContext->InitSelected();
int count = 1; int count = 1;
while(aContext->MoreCurrent()) while(aContext->MoreSelected())
{ {
di << "\n count is = " << count++; di << "\n count is = " << count++;
Handle(AIS_InteractiveObject) ais = aContext->Current(); Handle(AIS_InteractiveObject) ais = aContext->SelectedInteractive();
aContext->AddOrRemoveCurrentObject(ais); aContext->AddOrRemoveSelected(ais);
aContext->InitCurrent(); aContext->InitSelected();
} }
return 0; return 0;
@@ -694,51 +694,51 @@ static Standard_Integer OCC189 (Draw_Interpretor& di, Standard_Integer /*argc*/
aContext2->Display(ais2); aContext2->Display(ais2);
aContext2->Display(ais3); aContext2->Display(ais3);
aContext1->AddOrRemoveCurrentObject(ais1); aContext1->AddOrRemoveSelected(ais1);
aContext1->AddOrRemoveCurrentObject(ais2); aContext1->AddOrRemoveSelected(ais2);
aContext1->AddOrRemoveCurrentObject(ais3); aContext1->AddOrRemoveSelected(ais3);
di << "\n Stage : 1"; di << "\n Stage : 1";
di << "\n \t No of currents on aContext1 = " << aContext1->NbCurrents(); di << "\n \t No of currents on aContext1 = " << aContext1->NbSelected();
di << "\n \t No of currents on aContext2 = " << aContext2->NbCurrents() << "\n\n"; di << "\n \t No of currents on aContext2 = " << aContext2->NbSelected() << "\n\n";
di << "\n aContext1->IsCurrent = " << (Standard_Integer) aContext1->IsCurrent(ais1) << ", aContext2->IsCurrent = " << (Standard_Integer) aContext2->IsCurrent(ais1) << " "; di << "\n aContext1->IsSelected = " << (Standard_Integer) aContext1->IsCurrent(ais1) << ", aContext2->IsCurrent = " << (Standard_Integer) aContext2->IsCurrent(ais1) << " ";
aContext2->AddOrRemoveCurrentObject(ais1); aContext2->AddOrRemoveSelected(ais1);
aContext2->AddOrRemoveCurrentObject(ais2); aContext2->AddOrRemoveSelected(ais2);
aContext2->AddOrRemoveCurrentObject(ais3); aContext2->AddOrRemoveSelected(ais3);
di << "\n Stage : 2"; di << "\n Stage : 2";
di << "\n \t No of currents on aContext1 = " << aContext1->NbCurrents(); di << "\n \t No of currents on aContext1 = " << aContext1->NbSelected();
di << "\n \t No of currents on aContext2 = " << aContext2->NbCurrents() << "\n\n"; di << "\n \t No of currents on aContext2 = " << aContext2->NbSelected() << "\n\n";
aContext1->InitCurrent(); aContext1->InitSelected();
int count1 = 1; int count1 = 1;
while(aContext1->MoreCurrent()) while(aContext1->MoreSelected())
{ {
di << "\n count1 is = " << count1++; di << "\n count1 is = " << count1++;
Handle(AIS_InteractiveObject) ais = aContext1->Current(); Handle(AIS_InteractiveObject) ais = aContext1->SelectedInteractive();
aContext1->AddOrRemoveCurrentObject(ais); aContext1->AddOrRemoveSelected(ais);
aContext1->InitCurrent(); aContext1->InitSelected();
} }
di << "\n Stage : 3"; di << "\n Stage : 3";
di << "\n \t No of currents on aContext1 = " << aContext1->NbCurrents(); di << "\n \t No of currents on aContext1 = " << aContext1->NbSelected();
di << "\n \t No of currents on aContext2 = " << aContext2->NbCurrents() << "\n\n"; di << "\n \t No of currents on aContext2 = " << aContext2->NbSelected() << "\n\n";
aContext2->InitCurrent(); aContext2->InitSelected();
int count2 = 1; int count2 = 1;
while(aContext2->MoreCurrent()) while(aContext2->MoreSelected())
{ {
di << "\n count2 is = " << count2++; di << "\n count2 is = " << count2++;
Handle(AIS_InteractiveObject) ais = aContext2->Current(); Handle(AIS_InteractiveObject) ais = aContext2->SelectedInteractive();
aContext2->AddOrRemoveCurrentObject(ais); aContext2->AddOrRemoveSelected(ais);
aContext2->InitCurrent(); aContext2->InitSelected();
} }
di << "\n\n Stage : 4"; di << "\n\n Stage : 4";
di << "\n \t No of currents on aContext1 = " << aContext1->NbCurrents(); di << "\n \t No of currents on aContext1 = " << aContext1->NbSelected();
di << "\n \t No of currents on aContext2 = " << aContext2->NbCurrents(); di << "\n \t No of currents on aContext2 = " << aContext2->NbSelected();
return 0; return 0;
} }

View File

@@ -67,7 +67,7 @@ static Standard_Integer OCC172 (Draw_Interpretor& di, Standard_Integer /*argc*/
AIS_ListIteratorOfListOfInteractive It; AIS_ListIteratorOfListOfInteractive It;
for (It.Initialize(aListOfIO);It.More();It.Next()) for (It.Initialize(aListOfIO);It.More();It.Next())
{ {
aContext->AddOrRemoveCurrentObject(It.Value()); aContext->AddOrRemoveSelected(It.Value());
} }
return 0; return 0;
@@ -104,21 +104,21 @@ static Standard_Integer OCC204 (Draw_Interpretor& di, Standard_Integer argc, co
aContext->Display(ais2); aContext->Display(ais2);
aContext->Display(ais3); aContext->Display(ais3);
aContext->AddOrRemoveCurrentObject(ais1); aContext->AddOrRemoveSelected(ais1);
aContext->AddOrRemoveCurrentObject(ais2); aContext->AddOrRemoveSelected(ais2);
aContext->AddOrRemoveCurrentObject(ais3); aContext->AddOrRemoveSelected(ais3);
//printf("\n No of currents = %d", aContext->NbCurrents()); //printf("\n No of currents = %d", aContext->NbCurrents());
aContext->InitCurrent(); aContext->InitSelected();
//int count = 1; //int count = 1;
while(aContext->MoreCurrent()) while(aContext->MoreSelected())
{ {
//printf("\n count is = %d", count++); //printf("\n count is = %d", count++);
Handle(AIS_InteractiveObject) ais = aContext->Current(); Handle(AIS_InteractiveObject) ais = aContext->SelectedInteractive();
aContext->Remove(ais, UpdateViewer); aContext->Remove(ais, UpdateViewer);
aContext->InitCurrent(); aContext->InitSelected();
} }
return 0; return 0;

View File

@@ -86,7 +86,11 @@ void SelectMgr_EntityOwner::HilightWithColor(const Handle(PrsMgr_PresentationMan
{ {
if( HasSelectable() ) { if( HasSelectable() ) {
if( IsAutoHilight() ) if( IsAutoHilight() )
PM->Color(mySelectable,aColor,aMode); {
const Graphic3d_ZLayerId aLayerId = mySelectable->GlobalSelOwner().Access() == this ?
Graphic3d_ZLayerId_Top : Graphic3d_ZLayerId_Topmost;
PM->Color(mySelectable,aColor,aMode, NULL, aLayerId);
}
else else
mySelectable->HilightOwnerWithColor( PM, aColor, this ); mySelectable->HilightOwnerWithColor( PM, aColor, this );
} }

View File

@@ -239,6 +239,22 @@ is
---C++: return const& ---C++: return const&
---Purpose: Returns common entity owner if the object is an assembly ---Purpose: Returns common entity owner if the object is an assembly
GlobalSelectionMode (me)
returns Integer from Standard;
---C++: inline
---Purpose: Returns the mode for selection of object as a whole
GlobalSelOwner (me)
returns EntityOwner from SelectMgr
is virtual;
---Purpose: Returns the owner of mode for selection of object as a whole
setGlobalSelMode (me : mutable;
theMode : Integer from Standard)
is static protected;
---Purpose: Allows derived classes to redefine global selection mode.
---C++: inline
fields fields
myselections : SequenceOfSelection is protected; myselections : SequenceOfSelection is protected;
@@ -250,6 +266,7 @@ fields
mySelectionPrs : Presentation from Prs3d; mySelectionPrs : Presentation from Prs3d;
myHilightPrs : Presentation from Prs3d; myHilightPrs : Presentation from Prs3d;
myGlobalSelMode : Integer from Standard;
friends friends
class SelectionManager from SelectMgr class SelectionManager from SelectMgr

View File

@@ -50,12 +50,13 @@ static Standard_Integer Search (const SelectMgr_SequenceOfSelection& seq,
// Purpose : // Purpose :
//================================================== //==================================================
SelectMgr_SelectableObject::SelectMgr_SelectableObject( const PrsMgr_TypeOfPresentation3d aTypeOfPresentation3d): SelectMgr_SelectableObject::SelectMgr_SelectableObject (const PrsMgr_TypeOfPresentation3d aTypeOfPresentation3d)
PrsMgr_PresentableObject (aTypeOfPresentation3d), : PrsMgr_PresentableObject (aTypeOfPresentation3d),
myDrawer (new Prs3d_Drawer()), myDrawer (new Prs3d_Drawer()),
myHilightDrawer (new Prs3d_Drawer()), myHilightDrawer (new Prs3d_Drawer()),
myAssemblyOwner (NULL), myAssemblyOwner (NULL),
myAutoHilight (Standard_True) myAutoHilight (Standard_True),
myGlobalSelMode (0)
{ {
InitDefaultHilightAttributes (myHilightDrawer); InitDefaultHilightAttributes (myHilightDrawer);
myHilightDrawer->Link (myDrawer); myHilightDrawer->Link (myDrawer);
@@ -580,3 +581,25 @@ const Handle(SelectMgr_EntityOwner)& SelectMgr_SelectableObject::GetAssemblyOwne
{ {
return myAssemblyOwner; return myAssemblyOwner;
} }
//=======================================================================
//function : GlobalSelOwner
//purpose : Returns entity owner corresponding to selection of the object as a whole
//=======================================================================
Handle(SelectMgr_EntityOwner) SelectMgr_SelectableObject::GlobalSelOwner() const
{
Handle(SelectMgr_EntityOwner) anOwner;
if (!HasSelection (myGlobalSelMode))
return anOwner;
const Handle(SelectMgr_Selection)& aGlobalSel = Selection (myGlobalSelMode);
if (aGlobalSel->IsEmpty())
return anOwner;
aGlobalSel->Init();
anOwner =
Handle(SelectMgr_EntityOwner)::DownCast (aGlobalSel->Sensitive()->BaseSensitive()->OwnerId());
return anOwner;
}

View File

@@ -32,3 +32,21 @@ Attributes() const
inline const Handle(Prs3d_Drawer)& SelectMgr_SelectableObject:: inline const Handle(Prs3d_Drawer)& SelectMgr_SelectableObject::
HilightAttributes() const HilightAttributes() const
{return myHilightDrawer;} {return myHilightDrawer;}
//=======================================================================
//function : GlobalSelectionMode
//purpose :
//=======================================================================
inline Standard_Integer SelectMgr_SelectableObject::GlobalSelectionMode() const
{
return myGlobalSelMode;
}
//=======================================================================
//function : setGlobalSelMode
//purpose :
//=======================================================================
inline void SelectMgr_SelectableObject::setGlobalSelMode (const Standard_Integer theMode)
{
myGlobalSelMode = theMode > 0 ? theMode : 0;
}

View File

@@ -128,6 +128,8 @@ void StdSelect_BRepOwner::HilightWithColor(const Handle(PrsMgr_PresentationManag
const Standard_Integer aMode) const Standard_Integer aMode)
{ {
Standard_Integer M = (aMode < 0) ? myCurMode : aMode; Standard_Integer M = (aMode < 0) ? myCurMode : aMode;
Graphic3d_ZLayerId aHiLayer = this == Selectable()->GlobalSelOwner().Access() ?
Graphic3d_ZLayerId_Top : Graphic3d_ZLayerId_Topmost;
Handle(SelectMgr_SelectableObject) aSel = Selectable(); Handle(SelectMgr_SelectableObject) aSel = Selectable();
if (myFromDecomposition) if (myFromDecomposition)
{ {
@@ -169,17 +171,17 @@ void StdSelect_BRepOwner::HilightWithColor(const Handle(PrsMgr_PresentationManag
} }
// highlight with color and set layer // highlight with color and set layer
PM->Color (myPrsSh, aCol, M, aSel); PM->Color (myPrsSh, aCol, M, aSel, aHiLayer);
} }
else else
{ {
if (!myPrsSh.IsNull()) if (!myPrsSh.IsNull())
{ {
PM->Color (myPrsSh, aCol, M, aSel); PM->Color (myPrsSh, aCol, M, aSel, aHiLayer);
} }
else else
{ {
PM->Color (aSel, aCol, M); PM->Color (aSel, aCol, M, NULL, aHiLayer);
} }
} }
} }

View File

@@ -25,6 +25,8 @@
#include <TDF_DeltaOnAddition.hxx> #include <TDF_DeltaOnAddition.hxx>
#include <TDF_Tool.hxx> #include <TDF_Tool.hxx>
#include <TCollection_ExtendedString.hxx> #include <TCollection_ExtendedString.hxx>
#include <TColStd_ListOfInteger.hxx>
#include <TColStd_ListIteratorOfListOfInteger.hxx>
#include <TPrsStd_AISViewer.hxx> #include <TPrsStd_AISViewer.hxx>
#include <AIS_InteractiveContext.hxx> #include <AIS_InteractiveContext.hxx>
#include <AIS_InteractiveObject.hxx> #include <AIS_InteractiveObject.hxx>
@@ -570,17 +572,12 @@ void TPrsStd_AISPresentation::SetSelectionMode(const Standard_Integer theSelecti
{ {
// OCC2932 correction // OCC2932 correction
if(hasOwnSelectionMode && mySelectionMode == theSelectionMode && !myAIS.IsNull()) if(hasOwnSelectionMode && mySelectionMode == theSelectionMode && !myAIS.IsNull())
if(myAIS->SelectionMode() == theSelectionMode )
return; return;
Backup(); Backup();
mySelectionMode = theSelectionMode; mySelectionMode = theSelectionMode;
hasOwnSelectionMode = Standard_True; hasOwnSelectionMode = Standard_True;
if( myAIS.IsNull() ) AISUpdate(); if( myAIS.IsNull() ) AISUpdate();
if( !myAIS.IsNull() ) {
if( myAIS->SelectionMode() == theSelectionMode ) return;
myAIS->SetSelectionMode(theSelectionMode);
}
} }
//======================================================================= //=======================================================================
@@ -590,15 +587,12 @@ void TPrsStd_AISPresentation::SetSelectionMode(const Standard_Integer theSelecti
void TPrsStd_AISPresentation::UnsetSelectionMode() void TPrsStd_AISPresentation::UnsetSelectionMode()
{ {
if(!hasOwnSelectionMode && !myAIS.IsNull()) if(!hasOwnSelectionMode && !myAIS.IsNull())
if(!myAIS->HasSelectionMode())
return; return;
Backup(); Backup();
hasOwnSelectionMode = Standard_False; hasOwnSelectionMode = Standard_False;
if( myAIS.IsNull() ) AISUpdate(); if( myAIS.IsNull() ) AISUpdate();
if( !myAIS.IsNull() && myAIS->HasSelectionMode() ) { mySelectionMode = myAIS->GlobalSelectionMode();
myAIS->UnsetSelectionMode();
}
} }
//======================================================================= //=======================================================================
@@ -916,8 +910,24 @@ void TPrsStd_AISPresentation::AISUpdate ()
} }
if (hasOwnSelectionMode) { if (hasOwnSelectionMode) {
if (myAIS->SelectionMode() != mySelectionMode ) { const Handle(AIS_InteractiveContext) aContext =
myAIS->SetSelectionMode(mySelectionMode); ctx.IsNull() ? myAIS->GetContext() : ctx;
if (!aContext.IsNull())
{
TColStd_ListOfInteger anActivatedModes;
aContext->ActivatedModes (myAIS, anActivatedModes);
Standard_Boolean isActivated = Standard_False;
for (TColStd_ListIteratorOfListOfInteger aModeIter (anActivatedModes); aModeIter.More(); aModeIter.Next())
{
if (aModeIter.Value() == mySelectionMode)
{
isActivated = Standard_True;
break;
}
}
if (!isActivated)
aContext->Activate (myAIS, mySelectionMode, Standard_False);
} }
} }

View File

@@ -85,7 +85,7 @@ void V3d_Viewer::DeactivateGrid()
if (myGridEcho if (myGridEcho
&& !myGridEchoStructure.IsNull()) && !myGridEchoStructure.IsNull())
{ {
ActiveView()->View()->EraseImmediate (myGridEchoStructure); myGridEchoStructure->Erase();
} }
} }
Update(); Update();
@@ -241,10 +241,7 @@ void V3d_Viewer::SetGridEcho (const Standard_Boolean theToShowGrid)
return; return;
} }
for (InitActiveViews(); MoreActiveViews(); NextActiveViews()) myGridEchoStructure->Erase();
{
ActiveView()->View()->EraseImmediate (myGridEchoStructure);
}
} }
// ======================================================================= // =======================================================================
@@ -308,7 +305,12 @@ void V3d_Viewer::ShowGridEcho (const Handle(V3d_View)& theView,
anArrayOfPoints->AddVertex (theVertex.X(), theVertex.Y(), theVertex.Z()); anArrayOfPoints->AddVertex (theVertex.X(), theVertex.Y(), theVertex.Z());
myGridEchoGroup->AddPrimitiveArray (anArrayOfPoints); myGridEchoGroup->AddPrimitiveArray (anArrayOfPoints);
theView->View()->DisplayImmediate (myGridEchoStructure, Standard_True); myGridEchoStructure->SetZLayer (Graphic3d_ZLayerId_Topmost);
myGridEchoStructure->SetInfiniteState (Standard_True);
myGridEchoStructure->CStructure()->ViewAffinity = new Graphic3d_ViewAffinity();
myGridEchoStructure->CStructure()->ViewAffinity->SetVisible (Standard_False);
myGridEchoStructure->CStructure()->ViewAffinity->SetVisible (theView->View()->Identification(), true);
myGridEchoStructure->Display();
} }
// ======================================================================= // =======================================================================
@@ -323,5 +325,7 @@ void V3d_Viewer::HideGridEcho (const Handle(V3d_View)& theView)
} }
myGridEchoLastVert.SetCoord (ShortRealLast(), ShortRealLast(), ShortRealLast()); myGridEchoLastVert.SetCoord (ShortRealLast(), ShortRealLast(), ShortRealLast());
theView->View()->EraseImmediate (myGridEchoStructure); const Handle(Graphic3d_ViewAffinity)& anAffinity = myGridEchoStructure->CStructure()->ViewAffinity;
if (!anAffinity.IsNull() && anAffinity->IsVisible (theView->View()->Identification()))
myGridEchoStructure->Erase();
} }

View File

@@ -516,14 +516,14 @@ void ViewerTest::StandardModeActivation(const Standard_Integer mode )
if(!aContext->HasOpenedContext()) { if(!aContext->HasOpenedContext()) {
// To unhilight the preselected object // To unhilight the preselected object
aContext->UnhilightCurrents(Standard_False); aContext->UnhilightSelected(Standard_False);
// Open a local Context in order to be able to select subshape from // Open a local Context in order to be able to select subshape from
// the selected shape if any or for all if there is no selection // the selected shape if any or for all if there is no selection
if (!aContext->FirstCurrentObject().IsNull()){ if (!aContext->FirstSelectedObject().IsNull()){
aContext->OpenLocalContext(Standard_False); aContext->OpenLocalContext(Standard_False);
for(aContext->InitCurrent();aContext->MoreCurrent();aContext->NextCurrent()){ for(aContext->InitSelected();aContext->MoreSelected();aContext->NextSelected()){
aContext->Load( aContext->Current(),-1,Standard_True); aContext->Load( aContext->SelectedInteractive(),-1,Standard_True);
} }
} }
else else
@@ -992,18 +992,13 @@ static int VDispMode (Draw_Interpretor& , Standard_Integer argc, const char** ar
//unset displaymode.. comportement particulier... //unset displaymode.. comportement particulier...
if(TypeOfOperation==4){ if(TypeOfOperation==4){
if(argc==1){ if(argc==1){
if(Ctx->NbCurrents()==0 || if(Ctx->NbSelected()==0){
Ctx->NbSelected()==0){
Handle(AIS_InteractiveObject) IO; Handle(AIS_InteractiveObject) IO;
VwrTst_DispErase(IO,-1,4,Standard_False); VwrTst_DispErase(IO,-1,4,Standard_False);
} }
else if(!Ctx->HasOpenedContext()){
for(Ctx->InitCurrent();Ctx->MoreCurrent();Ctx->NextCurrent())
VwrTst_DispErase(Ctx->Current(),-1,4,Standard_False);
}
else{ else{
for(Ctx->InitSelected();Ctx->MoreSelected();Ctx->NextSelected()) for(Ctx->InitSelected();Ctx->MoreSelected();Ctx->NextSelected())
VwrTst_DispErase(Ctx->Interactive(),-1,4,Standard_False);} VwrTst_DispErase(Ctx->SelectedInteractive(),-1,4,Standard_False);}
Ctx->UpdateCurrentViewer(); Ctx->UpdateCurrentViewer();
} }
else{ else{
@@ -1018,20 +1013,20 @@ static int VDispMode (Draw_Interpretor& , Standard_Integer argc, const char** ar
} }
else if(argc==2){ else if(argc==2){
Standard_Integer Dmode = Draw::Atoi(argv[1]); Standard_Integer Dmode = Draw::Atoi(argv[1]);
if(Ctx->NbCurrents()==0 && TypeOfOperation==3){ if(Ctx->NbSelected()==0 && TypeOfOperation==3){
Handle(AIS_InteractiveObject) IO; Handle(AIS_InteractiveObject) IO;
VwrTst_DispErase(IO,Dmode,TypeOfOperation,Standard_True); VwrTst_DispErase(IO,Dmode,TypeOfOperation,Standard_True);
} }
if(!Ctx->HasOpenedContext()){ if(!Ctx->HasOpenedContext()){
// set/unset display mode sur le Contexte... // set/unset display mode sur le Contexte...
for(Ctx->InitCurrent();Ctx->MoreCurrent();Ctx->NextCurrent()){ for(Ctx->InitSelected();Ctx->MoreSelected();Ctx->NextSelected()){
VwrTst_DispErase(Ctx->Current(),Dmode,TypeOfOperation,Standard_False); VwrTst_DispErase(Ctx->SelectedInteractive(),Dmode,TypeOfOperation,Standard_False);
} }
Ctx->UpdateCurrentViewer(); Ctx->UpdateCurrentViewer();
} }
else{ else{
for(Ctx->InitSelected();Ctx->MoreSelected();Ctx->NextSelected()) for(Ctx->InitSelected();Ctx->MoreSelected();Ctx->NextSelected())
Ctx->Display(Ctx->Interactive(),Dmode); Ctx->Display(Ctx->SelectedInteractive(),Dmode);
} }
} }
else{ else{
@@ -1056,30 +1051,22 @@ static int VSubInt(Draw_Interpretor& di, Standard_Integer argc, const char** arg
Standard_Integer On = Draw::Atoi(argv[1]); Standard_Integer On = Draw::Atoi(argv[1]);
const Handle(AIS_InteractiveContext)& Ctx = ViewerTest::GetAISContext(); const Handle(AIS_InteractiveContext)& Ctx = ViewerTest::GetAISContext();
if(argc==2){ if(argc==2)
{
TCollection_AsciiString isOnOff = On == 1 ? "on" : "off";
di << "Sub intensite is turned " << isOnOff << " for " << Ctx->NbSelected() << "objects\n";
for (Ctx->InitSelected(); Ctx->MoreSelected(); Ctx->NextSelected())
{
if(On==1)
{
Ctx->SubIntensityOn (Ctx->SelectedInteractive(), Standard_False);
}
else
{
Ctx->SubIntensityOff (Ctx->SelectedInteractive(), Standard_False);
}
}
if(!Ctx->HasOpenedContext()){
di<<"sub intensite ";
if(On==1) di<<"On";
else di<<"Off";
di<<" pour "<<Ctx->NbCurrents()<<" objets"<<"\n";
for(Ctx->InitCurrent();Ctx->MoreCurrent();Ctx->NextCurrent()){
if(On==1){
Ctx->SubIntensityOn(Ctx->Current(),Standard_False);}
else{
di <<"passage dans off"<<"\n";
Ctx->SubIntensityOff(Ctx->Current(),Standard_False);
}
}
}
else{
for(Ctx->InitSelected();Ctx->MoreSelected();Ctx->NextSelected()){
if(On==1){
Ctx->SubIntensityOn(Ctx->Interactive(),Standard_False);}
else{
Ctx->SubIntensityOff(Ctx->Interactive(),Standard_False);}
}
}
Ctx->UpdateCurrentViewer(); Ctx->UpdateCurrentViewer();
} }
else { else {
@@ -1134,11 +1121,11 @@ public:
mySource = IterSource_List; mySource = IterSource_List;
mySeqIter = NCollection_Sequence<TCollection_AsciiString>::Iterator (mySeq); mySeqIter = NCollection_Sequence<TCollection_AsciiString>::Iterator (mySeq);
} }
else if (aCtx->NbCurrents() > 0) else if (aCtx->NbSelected() > 0)
{ {
mySource = IterSource_Selected; mySource = IterSource_Selected;
mySelIter = aCtx; mySelIter = aCtx;
mySelIter->InitCurrent(); mySelIter->InitSelected();
} }
else else
{ {
@@ -1170,7 +1157,7 @@ public:
{ {
case IterSource_All: return myMapIter.More(); case IterSource_All: return myMapIter.More();
case IterSource_List: return mySeqIter.More(); case IterSource_List: return mySeqIter.More();
case IterSource_Selected: return mySelIter->MoreCurrent(); case IterSource_Selected: return mySelIter->MoreSelected();
} }
return Standard_False; return Standard_False;
} }
@@ -1195,7 +1182,7 @@ public:
} }
case IterSource_Selected: case IterSource_Selected:
{ {
mySelIter->NextCurrent(); mySelIter->NextSelected();
break; break;
} }
} }
@@ -1235,10 +1222,10 @@ private:
} }
case IterSource_Selected: case IterSource_Selected:
{ {
if (mySelIter->MoreCurrent()) if (mySelIter->MoreSelected())
{ {
myCurrentName = GetMapOfAIS().Find1 (mySelIter->Current()); myCurrentName = GetMapOfAIS().Find1 (mySelIter->SelectedInteractive());
myCurrent = mySelIter->Current(); myCurrent = mySelIter->SelectedInteractive();
} }
break; break;
} }
@@ -2237,14 +2224,14 @@ static int VDonly2 (Draw_Interpretor& ,
if (anArgIter >= theArgNb) if (anArgIter >= theArgNb)
{ {
// display only selected objects // display only selected objects
if (aCtx->NbCurrents() < 1) if (aCtx->NbSelected() < 1)
{ {
return 0; return 0;
} }
for (aCtx->InitCurrent(); aCtx->MoreCurrent(); aCtx->NextCurrent()) for (aCtx->InitSelected(); aCtx->MoreSelected(); aCtx->NextSelected())
{ {
aDispSet.Add (aCtx->Current()); aDispSet.Add (aCtx->SelectedInteractive());
} }
} }
else else
@@ -2579,7 +2566,7 @@ int VErase (Draw_Interpretor& theDI,
} }
} }
} }
else if (!toEraseAll && aCtx->NbCurrents() > 0) else if (!toEraseAll && aCtx->NbSelected() > 0)
{ {
// Erase selected objects // Erase selected objects
for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anIter (GetMapOfAIS()); for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName anIter (GetMapOfAIS());
@@ -2587,7 +2574,7 @@ int VErase (Draw_Interpretor& theDI,
{ {
const Handle(AIS_InteractiveObject) anIO = Handle(AIS_InteractiveObject)::DownCast (anIter.Key1()); const Handle(AIS_InteractiveObject) anIO = Handle(AIS_InteractiveObject)::DownCast (anIter.Key1());
if (!anIO.IsNull() if (!anIO.IsNull()
&& aCtx->IsCurrent (anIO)) && aCtx->IsSelected (anIO))
{ {
theDI << anIter.Key2().ToCString() << " "; theDI << anIter.Key2().ToCString() << " ";
if (toEraseInView) if (toEraseInView)
@@ -2861,12 +2848,12 @@ int VBounding (Draw_Interpretor& theDI,
bndPresentation (theDI, aPrs, aName, anAction); bndPresentation (theDI, aPrs, aName, anAction);
} }
} }
else if (aCtx->NbCurrents() > 0) else if (aCtx->NbSelected() > 0)
{ {
// remove all currently selected objects // remove all currently selected objects
for (aCtx->InitCurrent(); aCtx->MoreCurrent(); aCtx->NextCurrent()) for (aCtx->InitSelected(); aCtx->MoreSelected(); aCtx->NextSelected())
{ {
Handle(AIS_InteractiveObject) anIO = aCtx->Current(); Handle(AIS_InteractiveObject) anIO = aCtx->SelectedInteractive();
Handle(PrsMgr_Presentation) aPrs = findPresentation (aCtx, anIO, aMode); Handle(PrsMgr_Presentation) aPrs = findPresentation (aCtx, anIO, aMode);
if (!aPrs.IsNull()) if (!aPrs.IsNull())
{ {
@@ -3498,7 +3485,7 @@ static int VDisplay2 (Draw_Interpretor& theDI,
&& aCtx->GetAutoActivateSelection() && aCtx->GetAutoActivateSelection()
&& aShape->GetTransformPersistenceMode() == 0)) && aShape->GetTransformPersistenceMode() == 0))
{ {
aSelMode = aShape->HasSelectionMode() ? aShape->SelectionMode() : -1; aSelMode = aShape->GlobalSelectionMode();
} }
aCtx->Display (aShape, aDispMode, aSelMode, aCtx->Display (aShape, aDispMode, aSelMode,
@@ -3555,7 +3542,7 @@ static int VDisplay2 (Draw_Interpretor& theDI,
&& aCtx->GetAutoActivateSelection() && aCtx->GetAutoActivateSelection()
&& aShape->GetTransformPersistenceMode() == 0)) && aShape->GetTransformPersistenceMode() == 0))
{ {
aSelMode = aShape->HasSelectionMode() ? aShape->SelectionMode() : -1; aSelMode = aShape->GlobalSelectionMode();
} }
if (aShape->Type() == AIS_KOI_Datum) if (aShape->Type() == AIS_KOI_Datum)
@@ -3963,11 +3950,11 @@ static int VActivatedMode (Draw_Interpretor& di, Standard_Integer argc, const ch
// on load tous les objets displayees et on Activate les objets de la liste // on load tous les objets displayees et on Activate les objets de la liste
AIS_ListOfInteractive ListOfIO; AIS_ListOfInteractive ListOfIO;
// on sauve dans une AISListOfInteractive tous les objets currents // on sauve dans une AISListOfInteractive tous les objets currents
if (TheAISContext()->NbCurrents()>0 ){ if (TheAISContext()->NbSelected()>0 ){
TheAISContext()->UnhilightCurrents(Standard_False); TheAISContext()->UnhilightSelected(Standard_False);
for (TheAISContext()->InitCurrent(); TheAISContext()->MoreCurrent(); TheAISContext()->NextCurrent() ){ for (TheAISContext()->InitSelected(); TheAISContext()->MoreSelected(); TheAISContext()->NextSelected() ){
ListOfIO.Append(TheAISContext()->Current() ); ListOfIO.Append(TheAISContext()->SelectedInteractive() );
} }
} }
@@ -4015,7 +4002,7 @@ static int VActivatedMode (Draw_Interpretor& di, Standard_Integer argc, const ch
TheAISContext()->UnhilightSelected(Standard_False); TheAISContext()->UnhilightSelected(Standard_False);
// il y a des objets selected,on les parcourt // il y a des objets selected,on les parcourt
for (TheAISContext()->InitSelected(); TheAISContext()->MoreSelected(); TheAISContext()->NextSelected() ){ for (TheAISContext()->InitSelected(); TheAISContext()->MoreSelected(); TheAISContext()->NextSelected() ){
Handle(AIS_InteractiveObject) aIO=TheAISContext()->Interactive(); Handle(AIS_InteractiveObject) aIO=TheAISContext()->SelectedInteractive();
if (HaveMode(aIO,aMode) ) { if (HaveMode(aIO,aMode) ) {
@@ -4346,12 +4333,12 @@ static Standard_Integer VState (Draw_Interpretor& theDI,
return 0; return 0;
} }
if (aCtx->NbCurrents() > 0 if (aCtx->NbSelected() > 0
&& !toShowAll) && !toShowAll)
{ {
for (aCtx->InitCurrent(); aCtx->MoreCurrent(); aCtx->NextCurrent()) for (aCtx->InitSelected(); aCtx->MoreSelected(); aCtx->NextSelected())
{ {
Handle(AIS_InteractiveObject) anObj = aCtx->Current(); Handle(AIS_InteractiveObject) anObj = aCtx->SelectedInteractive();
TCollection_AsciiString aName = GetMapOfAIS().Find1 (anObj); TCollection_AsciiString aName = GetMapOfAIS().Find1 (anObj);
aName.LeftJustify (20, ' '); aName.LeftJustify (20, ' ');
theDI << aName << " "; theDI << aName << " ";
@@ -5012,7 +4999,7 @@ static Standard_Integer VLoadSelection (Draw_Interpretor& /*theDi*/,
} }
aCtx->Load (aShape, -1, Standard_False); aCtx->Load (aShape, -1, Standard_False);
aCtx->Activate (aShape, aShape->SelectionMode(), Standard_True); aCtx->Activate (aShape, aShape->GlobalSelectionMode(), Standard_True);
} }
} }

View File

@@ -318,7 +318,7 @@ static int VSize (Draw_Interpretor& di, Standard_Integer argc, const char** argv
TheAISContext()->CloseLocalContext(); TheAISContext()->CloseLocalContext();
// On set le booleen ThereIsCurrent // On set le booleen ThereIsCurrent
if (TheAISContext() -> NbCurrents() > 0) {ThereIsCurrent=Standard_True;} if (TheAISContext() -> NbSelected() > 0) {ThereIsCurrent=Standard_True;}
else {ThereIsCurrent=Standard_False;} else {ThereIsCurrent=Standard_False;}
@@ -337,7 +337,7 @@ static int VSize (Draw_Interpretor& di, Standard_Integer argc, const char** argv
Handle(AIS_InteractiveObject) aShape= Handle(AIS_InteractiveObject) aShape=
Handle(AIS_InteractiveObject)::DownCast(it.Key1()); Handle(AIS_InteractiveObject)::DownCast(it.Key1());
if (!aShape.IsNull() && TheAISContext()->IsCurrent(aShape) ) if (!aShape.IsNull() && TheAISContext()->IsSelected(aShape) )
{ {
// On verifie que l'AIS InteraciveObject selectionne est bien // On verifie que l'AIS InteraciveObject selectionne est bien
@@ -493,7 +493,7 @@ static int VPlaneTrihedron (Draw_Interpretor& di, Standard_Integer argc, const c
Handle(AIS_InteractiveObject) theIOB; Handle(AIS_InteractiveObject) theIOB;
for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) { for(TheAISContext()->InitSelected() ;TheAISContext()->MoreSelected() ;TheAISContext()->NextSelected() ) {
theIOB = TheAISContext()->Interactive(); theIOB = TheAISContext()->SelectedInteractive();
} }
// on le downcast // on le downcast
Handle(AIS_Plane) PlaneB =((*(Handle(AIS_Plane)*)&theIOB)); Handle(AIS_Plane) PlaneB =((*(Handle(AIS_Plane)*)&theIOB));
@@ -4212,16 +4212,21 @@ static Standard_Integer VSetSelectionMode (Draw_Interpretor& /*di*/,
} }
// Check the arguments // Check the arguments
if (theArgc != 3 && theArgc != 4) if (theArgc < 3 && theArgc > 5)
{ {
std::cerr << "vselmode error : expects at least 2 arguments.\n" std::cerr << "vselmode error : expects at least 2 arguments.\n"
<< "Type help "<< theArgv[0] <<" for more information." << std::endl; << "Type help "<< theArgv[0] <<" for more information." << std::endl;
return 1; return 1;
} }
TCollection_AsciiString aLastArg (theArgv[theArgc - 1]);
aLastArg.LowerCase();
Standard_Boolean isToOpenLocalCtx = aLastArg == "-local";
// get objects to change selection mode // get objects to change selection mode
AIS_ListOfInteractive aTargetIOs; AIS_ListOfInteractive aTargetIOs;
if (theArgc == 3) Standard_Integer anArgNb = isToOpenLocalCtx ? theArgc - 1 : theArgc;
if (anArgNb == 3)
{ {
anAISContext->DisplayedObjects (aTargetIOs); anAISContext->DisplayedObjects (aTargetIOs);
} }
@@ -4241,8 +4246,8 @@ static Standard_Integer VSetSelectionMode (Draw_Interpretor& /*di*/,
} }
} }
const Standard_Integer aSelectionMode = Draw::Atoi (theArgc == 3 ? theArgv[1] : theArgv[2]); const Standard_Integer aSelectionMode = Draw::Atoi (anArgNb == 3 ? theArgv[1] : theArgv[2]);
const Standard_Boolean toTurnOn = Draw::Atoi (theArgc == 3 ? theArgv[2] : theArgv[3]); const Standard_Boolean toTurnOn = Draw::Atoi (anArgNb == 3 ? theArgv[2] : theArgv[3]);
if (aSelectionMode == 0 && anAISContext->HasOpenedContext()) if (aSelectionMode == 0 && anAISContext->HasOpenedContext())
{ {
anAISContext->CloseLocalContext(); anAISContext->CloseLocalContext();
@@ -4255,6 +4260,12 @@ static Standard_Integer VSetSelectionMode (Draw_Interpretor& /*di*/,
for (AIS_ListIteratorOfListOfInteractive aTargetIt (aTargetIOs); aTargetIt.More(); aTargetIt.Next()) for (AIS_ListIteratorOfListOfInteractive aTargetIt (aTargetIOs); aTargetIt.More(); aTargetIt.Next())
{ {
const Handle(AIS_InteractiveObject)& anIO = aTargetIt.Value(); const Handle(AIS_InteractiveObject)& anIO = aTargetIt.Value();
TColStd_ListOfInteger anActiveModes;
anAISContext->ActivatedModes (anIO, anActiveModes);
if (!anActiveModes.IsEmpty())
{
anAISContext->Deactivate (anIO);
}
if (!InList (anAISContext, anIO, aSelectionMode)) if (!InList (anAISContext, anIO, aSelectionMode))
{ {
anAISContext->Activate (anIO); anAISContext->Activate (anIO);
@@ -4276,7 +4287,7 @@ static Standard_Integer VSetSelectionMode (Draw_Interpretor& /*di*/,
if (aSelectionMode != 0 && toTurnOn) // Turn on specified mode if (aSelectionMode != 0 && toTurnOn) // Turn on specified mode
{ {
if (!anAISContext->HasOpenedContext()) if (!anAISContext->HasOpenedContext() && isToOpenLocalCtx)
{ {
anAISContext->OpenLocalContext (Standard_False); anAISContext->OpenLocalContext (Standard_False);
} }
@@ -4284,6 +4295,10 @@ static Standard_Integer VSetSelectionMode (Draw_Interpretor& /*di*/,
for (AIS_ListIteratorOfListOfInteractive aTargetIt (aTargetIOs); aTargetIt.More(); aTargetIt.Next()) for (AIS_ListIteratorOfListOfInteractive aTargetIt (aTargetIOs); aTargetIt.More(); aTargetIt.Next())
{ {
const Handle(AIS_InteractiveObject)& anIO = aTargetIt.Value(); const Handle(AIS_InteractiveObject)& anIO = aTargetIt.Value();
if (InList (anAISContext, anIO, 0))
{
anAISContext->Deactivate (anIO, 0);
}
if (!InList (anAISContext, anIO, aSelectionMode)) if (!InList (anAISContext, anIO, aSelectionMode))
{ {
anAISContext->Load (anIO, -1, Standard_True); anAISContext->Load (anIO, -1, Standard_True);
@@ -4294,11 +4309,6 @@ static Standard_Integer VSetSelectionMode (Draw_Interpretor& /*di*/,
if (aSelectionMode != 0 && !toTurnOn) // Turn off specified mode if (aSelectionMode != 0 && !toTurnOn) // Turn off specified mode
{ {
if (!anAISContext->HasOpenedContext())
{
return 0;
}
for (AIS_ListIteratorOfListOfInteractive aTargetIt (aTargetIOs); aTargetIt.More(); aTargetIt.Next()) for (AIS_ListIteratorOfListOfInteractive aTargetIt (aTargetIOs); aTargetIt.More(); aTargetIt.Next())
{ {
const Handle(AIS_InteractiveObject)& anIO = aTargetIt.Value(); const Handle(AIS_InteractiveObject)& anIO = aTargetIt.Value();

View File

@@ -683,6 +683,7 @@ TCollection_AsciiString ViewerTest::ViewerInit (const Standard_Integer thePxLeft
// NIS setup // NIS setup
Handle(NIS_View) aView = new NIS_View (a3DViewer, VT_GetWindow()); Handle(NIS_View) aView = new NIS_View (a3DViewer, VT_GetWindow());
ViewerTest::GetAISContext()->RedrawImmediate (a3DViewer);
ViewerTest::CurrentView(aView); ViewerTest::CurrentView(aView);
ViewerTest_myViews.Bind (aViewNames.GetViewName(), aView); ViewerTest_myViews.Bind (aViewNames.GetViewName(), aView);
@@ -1372,7 +1373,7 @@ void VT_ProcessKeyPress (const char* buf_ret)
aContext->DefaultDrawer()->SetTypeOfHLR(Prs3d_TOH_PolyAlgo); aContext->DefaultDrawer()->SetTypeOfHLR(Prs3d_TOH_PolyAlgo);
else else
aContext->DefaultDrawer()->SetTypeOfHLR(Prs3d_TOH_Algo); aContext->DefaultDrawer()->SetTypeOfHLR(Prs3d_TOH_Algo);
if (aContext->NbCurrents()==0 || aContext->NbSelected() == 0) if (aContext->NbSelected()==0)
{ {
AIS_ListOfInteractive aListOfShapes; AIS_ListOfInteractive aListOfShapes;
aContext->DisplayedObjects(aListOfShapes); aContext->DisplayedObjects(aListOfShapes);
@@ -1391,9 +1392,9 @@ void VT_ProcessKeyPress (const char* buf_ret)
} }
else else
{ {
for (aContext->InitCurrent();aContext->MoreCurrent();aContext->NextCurrent()) for (aContext->InitSelected();aContext->MoreSelected();aContext->NextSelected())
{ {
Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast(aContext->Current()); Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast(aContext->SelectedInteractive());
if (aShape.IsNull()) if (aShape.IsNull())
continue; continue;
if(aShape->TypeOfHLR() == Prs3d_TOH_PolyAlgo) if(aShape->TypeOfHLR() == Prs3d_TOH_PolyAlgo)
@@ -1412,18 +1413,11 @@ void VT_ProcessKeyPress (const char* buf_ret)
std::cout << "setup Shaded display mode" << std::endl; std::cout << "setup Shaded display mode" << std::endl;
Handle(AIS_InteractiveContext) Ctx = ViewerTest::GetAISContext(); Handle(AIS_InteractiveContext) Ctx = ViewerTest::GetAISContext();
if(Ctx->NbCurrents()==0 || if(Ctx->NbSelected()==0)
Ctx->NbSelected()==0)
Ctx->SetDisplayMode(AIS_Shaded); Ctx->SetDisplayMode(AIS_Shaded);
else{ else{
if(Ctx->HasOpenedContext()){ for(Ctx->InitSelected();Ctx->MoreSelected();Ctx->NextSelected())
for(Ctx->InitSelected();Ctx->MoreSelected();Ctx->NextSelected()) Ctx->SetDisplayMode(Ctx->SelectedInteractive(),1,Standard_False);
Ctx->SetDisplayMode(Ctx->Interactive(),1,Standard_False);
}
else{
for(Ctx->InitCurrent();Ctx->MoreCurrent();Ctx->NextCurrent())
Ctx->SetDisplayMode(Ctx->Current(),1,Standard_False);
}
Ctx->UpdateCurrentViewer(); Ctx->UpdateCurrentViewer();
} }
} }
@@ -1433,18 +1427,11 @@ void VT_ProcessKeyPress (const char* buf_ret)
std::cout << "reset display mode to defaults" << std::endl; std::cout << "reset display mode to defaults" << std::endl;
Handle(AIS_InteractiveContext) Ctx = ViewerTest::GetAISContext(); Handle(AIS_InteractiveContext) Ctx = ViewerTest::GetAISContext();
if(Ctx->NbCurrents()==0 || if(Ctx->NbSelected()==0)
Ctx->NbSelected()==0)
Ctx->SetDisplayMode(AIS_WireFrame); Ctx->SetDisplayMode(AIS_WireFrame);
else{ else{
if(Ctx->HasOpenedContext()){ for(Ctx->InitSelected();Ctx->MoreSelected();Ctx->NextSelected())
for(Ctx->InitSelected();Ctx->MoreSelected();Ctx->NextSelected()) Ctx->UnsetDisplayMode(Ctx->SelectedInteractive(),Standard_False);
Ctx->UnsetDisplayMode(Ctx->Interactive(),Standard_False);
}
else{
for(Ctx->InitCurrent();Ctx->MoreCurrent();Ctx->NextCurrent())
Ctx->UnsetDisplayMode(Ctx->Current(),Standard_False);
}
Ctx->UpdateCurrentViewer(); Ctx->UpdateCurrentViewer();
} }
@@ -1473,18 +1460,11 @@ void VT_ProcessKeyPress (const char* buf_ret)
{ {
std::cout << "setup WireFrame display mode" << std::endl; std::cout << "setup WireFrame display mode" << std::endl;
Handle(AIS_InteractiveContext) Ctx = ViewerTest::GetAISContext(); Handle(AIS_InteractiveContext) Ctx = ViewerTest::GetAISContext();
if(Ctx->NbCurrents()==0 || if(Ctx->NbSelected()==0)
Ctx->NbSelected()==0)
Ctx->SetDisplayMode(AIS_WireFrame); Ctx->SetDisplayMode(AIS_WireFrame);
else{ else{
if(Ctx->HasOpenedContext()){ for(Ctx->InitSelected();Ctx->MoreSelected();Ctx->NextSelected())
for(Ctx->InitSelected();Ctx->MoreSelected();Ctx->NextSelected()) Ctx->SetDisplayMode(Ctx->SelectedInteractive(),0,Standard_False);
Ctx->SetDisplayMode(Ctx->Interactive(),0,Standard_False);
}
else{
for(Ctx->InitCurrent();Ctx->MoreCurrent();Ctx->NextCurrent())
Ctx->SetDisplayMode(Ctx->Current(),0,Standard_False);
}
Ctx->UpdateCurrentViewer(); Ctx->UpdateCurrentViewer();
} }
} }
@@ -1518,7 +1498,6 @@ void VT_ProcessKeyPress (const char* buf_ret)
{ {
Handle(AIS_InteractiveContext) aCtx = ViewerTest::GetAISContext(); Handle(AIS_InteractiveContext) aCtx = ViewerTest::GetAISContext();
if (!aCtx.IsNull() if (!aCtx.IsNull()
&& aCtx->NbCurrents() > 0
&& aCtx->NbSelected() > 0) && aCtx->NbSelected() > 0)
{ {
Draw_Interprete ("verase"); Draw_Interprete ("verase");
@@ -3260,11 +3239,11 @@ static int VExport(Draw_Interpretor& di, Standard_Integer argc, const char** arg
{ {
if (aFileName.Value (aLen - 2) == '.') if (aFileName.Value (aLen - 2) == '.')
{ {
aFormatStr = aFileName.SubString (aLen - 1, aLen); aFormatStr = aFileName.ToCString() + aLen - 2;
} }
else if (aFileName.Value (aLen - 3) == '.') else if (aFileName.Value (aLen - 3) == '.')
{ {
aFormatStr = aFileName.SubString (aLen - 2, aLen); aFormatStr = aFileName.ToCString() + aLen - 3;
} }
else else
{ {
@@ -6075,14 +6054,7 @@ static Standard_Integer VChangeSelected (Draw_Interpretor& di,
return 1; return 1;
} }
if(aContext->HasOpenedContext()) aContext->AddOrRemoveSelected(anAISObject);
{
aContext->AddOrRemoveSelected(anAISObject);
}
else
{
aContext->AddOrRemoveCurrentObject(anAISObject);
}
} }
return 0; return 0;
} }

View File

@@ -680,6 +680,14 @@ is
---Level: Advanced ---Level: Advanced
---Purpose: Returns the view manager handle which manage this view ---Purpose: Returns the view manager handle which manage this view
IsComputed (me;
theStructId : Integer from Standard;
theComputedStruct : out Structure from Graphic3d)
returns Boolean from Standard
is static;
---Purpose: Returns Standard_True in case if the structure with the given <theStructId> is
-- in list of structures to be computed and stores computed struct to <theComputedStruct>.
---------------------------- ----------------------------
-- Category: Private methods -- Category: Private methods
---------------------------- ----------------------------
@@ -782,30 +790,6 @@ is
---Purpose: Display the structure <AStructure> to the view <me>. ---Purpose: Display the structure <AStructure> to the view <me>.
---Category: Private methods ---Category: Private methods
DisplayImmediate ( me : mutable;
theStructure : Structure from Graphic3d;
theIsSingleView : Boolean from Standard = Standard_True)
returns Boolean from Standard
is static;
---Level: Internal
---Purpose: Add structure to the list of immediate presentations.
-- @return true if structure has not been registered in this view
EraseImmediate ( me : mutable;
theStructure : Structure from Graphic3d )
returns Boolean from Standard
is static;
---Level: Internal
---Purpose: Removes the structure from the list of immediate presentations.
-- @return true if structure has been registered in view
ClearImmediate ( me : mutable )
returns Boolean from Standard
is static;
---Level: Internal
---Purpose: Clears list of immediate presentations.
-- @return true if list was not empty
Erase ( me : mutable; Erase ( me : mutable;
AStructure : Structure from Graphic3d ) AStructure : Structure from Graphic3d )
is static private; is static private;
@@ -1125,7 +1109,6 @@ fields
-- the displayed structures in the view -- the displayed structures in the view
myStructsDisplayed : MapOfStructure from Graphic3d; myStructsDisplayed : MapOfStructure from Graphic3d;
myImmediateStructures : MapOfStructure from Graphic3d;
myGTrihedron : GraduatedTrihedron from Graphic3d; myGTrihedron : GraduatedTrihedron from Graphic3d;

View File

@@ -973,7 +973,6 @@ void Visual3d_View::Redraw (const Handle(Visual3d_Layer)& theUnderLayer,
if (myGraphicDriver->IsDeviceLost()) if (myGraphicDriver->IsDeviceLost())
{ {
myViewManager->RecomputeStructures(); myViewManager->RecomputeStructures();
myViewManager->RecomputeStructures (myImmediateStructures);
myGraphicDriver->ResetDeviceLostFlag(); myGraphicDriver->ResetDeviceLostFlag();
} }
@@ -1256,69 +1255,6 @@ void Visual3d_View::Disconnect (const Handle(Graphic3d_Structure)& theMother,
} }
} }
// ========================================================================
// function : DisplayImmediate
// purpose :
// ========================================================================
Standard_Boolean Visual3d_View::DisplayImmediate (const Handle(Graphic3d_Structure)& theStructure,
const Standard_Boolean theIsSingleView)
{
if (!myImmediateStructures.Add (theStructure))
{
return Standard_False;
}
if (theIsSingleView)
{
const Visual3d_SequenceOfView& aViews = myViewManager->DefinedViews();
for (Standard_Integer aViewIter = 1; aViewIter <= aViews.Length(); ++aViewIter)
{
const Handle(Visual3d_View)& aView = aViews.Value (aViewIter);
if (aView.Access() != this)
{
aView->EraseImmediate (theStructure);
}
}
}
myGraphicDriver->DisplayImmediateStructure (MyCView, theStructure);
return Standard_True;
}
// ========================================================================
// function : EraseImmediate
// purpose :
// ========================================================================
Standard_Boolean Visual3d_View::EraseImmediate (const Handle(Graphic3d_Structure)& theStructure)
{
const Standard_Boolean isErased = myImmediateStructures.Remove (theStructure);
if (isErased)
{
myGraphicDriver->EraseImmediateStructure (MyCView, *theStructure->CStructure());
}
return isErased;
}
// ========================================================================
// function : ClearImmediate
// purpose :
// ========================================================================
Standard_Boolean Visual3d_View::ClearImmediate()
{
if (myImmediateStructures.IsEmpty())
{
return Standard_False;
}
for (Graphic3d_MapOfStructure::Iterator aStructIter (myImmediateStructures); aStructIter.More(); aStructIter.Next())
{
myGraphicDriver->EraseImmediateStructure (MyCView, *aStructIter.Key()->CStructure());
}
myImmediateStructures.Clear();
return Standard_True;
}
// ======================================================================== // ========================================================================
// function : Display // function : Display
// purpose : // purpose :
@@ -1534,7 +1470,6 @@ void Visual3d_View::Erase (const Handle(Graphic3d_Structure)& theStruct,
const Aspect_TypeOfUpdate theUpdateMode) const Aspect_TypeOfUpdate theUpdateMode)
{ {
if ( IsDeleted() if ( IsDeleted()
|| EraseImmediate (theStruct)
|| !IsDisplayed (theStruct)) || !IsDisplayed (theStruct))
{ {
return; return;
@@ -1574,11 +1509,34 @@ void Visual3d_View::Highlight (const Handle(Graphic3d_Structure)& theStruct,
const Standard_Integer anIndex = IsComputed (theStruct); const Standard_Integer anIndex = IsComputed (theStruct);
if (anIndex != 0) if (anIndex != 0)
{ {
const Handle(Graphic3d_Structure)& aCompStruct = myStructsComputed.ChangeValue (anIndex); const Handle(Graphic3d_Structure)& aCompStruct = myStructsComputed.Value (anIndex);
aCompStruct->Highlight (theMethod, theStruct->HighlightColor(), Standard_False); aCompStruct->Highlight (theMethod, theStruct->HighlightColor(), Standard_False);
} }
} }
// ========================================================================
// function : IsComputed
// purpose :
// ========================================================================
Standard_Boolean Visual3d_View::IsComputed (const Standard_Integer theStructId,
Handle(Graphic3d_Structure)& theComputedStruct) const
{
theComputedStruct.Nullify();
if (!ComputedMode())
return Standard_False;
const Standard_Integer aNbStructs = myStructsToCompute.Length();
for (Standard_Integer aStructIter = 1; aStructIter <= aNbStructs; ++aStructIter)
{
if (myStructsToCompute.Value (aStructIter)->Identification() == theStructId)
{
theComputedStruct = myStructsComputed (aStructIter);
return Standard_True;
}
}
return Standard_False;
}
// ======================================================================== // ========================================================================
// function : SetTransform // function : SetTransform
// purpose : // purpose :
@@ -1745,8 +1703,6 @@ inline void addStructureBndBox (const Handle(Graphic3d_Structure)& theStruct,
Bnd_Box Visual3d_View::MinMaxValues (const Standard_Boolean theToIgnoreInfiniteFlag) const Bnd_Box Visual3d_View::MinMaxValues (const Standard_Boolean theToIgnoreInfiniteFlag) const
{ {
Bnd_Box aResult = MinMaxValues (myStructsDisplayed, theToIgnoreInfiniteFlag); Bnd_Box aResult = MinMaxValues (myStructsDisplayed, theToIgnoreInfiniteFlag);
Bnd_Box anImmediate = MinMaxValues (myImmediateStructures, theToIgnoreInfiniteFlag);
aResult.Add (anImmediate);
return aResult; return aResult;
} }

View File

@@ -1,5 +1,3 @@
puts "TODO OCC11111 ALL: Error : Colors are not equal in default coordinate and in the near coordinates too"
puts "================" puts "================"
puts "OCC1629" puts "OCC1629"
puts "OCC2707" puts "OCC2707"
@@ -37,7 +35,7 @@ set Selection_G 0.8
set Selection_B 0.8 set Selection_B 0.8
#QASetChoiceMode EDGE ON #QASetChoiceMode EDGE ON
vselmode 2 1 vselmode 2 1 -local
set BeforeNbSelected [vnbselected] set BeforeNbSelected [vnbselected]
@@ -84,11 +82,11 @@ puts ""
set CloseNbSelected [vnbselected] set CloseNbSelected [vnbselected]
checkcolor ${x1} ${y1} ${Selection_R} ${Selection_G} ${Selection_B} checkcolor ${x1} ${y1} 1 1 0
checkcolor ${x2} ${y2} ${Selection_R} ${Selection_G} ${Selection_B} checkcolor ${x2} ${y2} 1 1 0
checkcolor ${x3} ${y3} ${Selection_R} ${Selection_G} ${Selection_B} checkcolor ${x3} ${y3} 1 1 0
checkcolor ${x4} ${y4} ${Selection_R} ${Selection_G} ${Selection_B} checkcolor ${x4} ${y4} 1 1 0
checkcolor ${x5} ${y5} ${Selection_R} ${Selection_G} ${Selection_B} checkcolor ${x5} ${y5} 1 1 0
if {${CloseNbSelected} == 0} { if {${CloseNbSelected} == 0} {
puts "OCC1629: OK (case 13: after close local context)" puts "OCC1629: OK (case 13: after close local context)"

View File

@@ -18,8 +18,8 @@ vertex p2 150 300 0
edge e1 p1 p2 edge e1 p1 p2
vdisplay e1 vdisplay e1
vselmode e1 2 1 vselmode e1 2 1 -local
vselmode e1 1 1 vselmode e1 1 1 -local
vselect 0 0 2500 2500 vselect 0 0 2500 2500
verase -local verase -local

View File

@@ -15,7 +15,7 @@ vdisplay b
vfit vfit
# opening a local context for local selection # opening a local context for local selection
vselmode b 4 1 vselmode b 4 1 -local
# Select a face just to simulate the scenario used in a real application # Select a face just to simulate the scenario used in a real application
vselect 200 200 vselect 200 200
# This line should not lead to exception # This line should not lead to exception