Update testing cases due to changes of issue 24130
[occt.git] / dox / user_guides / visualization / visualization.md
72b7576f 1Visualization {#user_guides__visualization}
4@section occt_1621831385_591811643 Introduction
7This manual explains how to use Open CASCADE Technology Visualization. It provides basic documentation on setting up and using Visualization. For advanced information on Visualization and its applications, see our offerings on our web site
dba69de2 8(Training and E-Learning) at <a href="http://www.opencascade.org/support/training/">http://www.opencascade.org/support/training/</a>
72b7576f 9
10Visualization in Open CASCADE Technology is based on the separation of:
11 * on the one hand - the data which stores the geometry and topology of the entities you want to display and select, and
12 * on the other hand - its *presentation* (what you see when an object is displayed in a scene) and *selection* (possibility to choose the whole object or its sub-parts interactively in order to apply some application-defined operations to the selected entities).
14@subsection occt_1621831385_5918116431 Open CASCADE Technology Visualization and the Organization of this guide
16Presentations are managed through the Presentation component, and selection through the Selection component.
18To make management of these functionalities in 3D more intuitive and consequently, more transparent, **Application Interactive Services** have been created. **AIS** use the notion of the *interactive object*, a displayable and selectable entity, which represents an element from the application data. As a result, in 3D, you, the user, have no need to be familiar with any functions underlying AIS unless you want to create your own interactive objects or selection filters.
20If, however, you require types of interactive objects and filters other than those provided, you will need to know the mechanics of presentable and selectable objects, specifically how to implement their virtual functions. To do this requires familiarity with such fundamental concepts as the sensitive primitive and the presentable object.
22The packages used to display 3D objects are the following:
23 * AIS
24 * StdPrs
25 * Prs3d
26 * PrsMgr
27 * V3d
28 * Graphic3d
30If you are concerned with 2D visualization, you must familiarize yourself with the fundamental concepts of presentation as outlined in the section on this subject in chapter 1, Fundamental Concepts. In brief, the packages used to display 2D objects are the following:
31 * AIS2D
32 * Prs2d
33 * PrsMgr
34 * V2d
35 * Graphic2d.
37Figure 1 below presents a schematic overview of the relations between the key concepts and packages in visualization. AIS stands for both AIS and AIS2D packages. Naturally, *Geometry &amp; Topology* is just an example of application data that can be handled by AIS, and application-specific interactive objects can deal with any kind of data.
dba69de2 39@image html /user_guides/visualization/images/visualization_image003.jpg
40@image latex /user_guides/visualization/images/visualization_image003.jpg
72b7576f 41**Figure 1. Key concepts and packages in visualization**
43To answer different needs of CASCADE users, this user’s guide offers the following three paths in reading it.
dba69de2 44
72b7576f 45 * If the 3D services proposed in AIS meet your requirements, you need only read chapter 3, *AIS: Application Interactive Services*.
47 * If the services provided do not satisfy your requirements - if for example, you need a selection filter on another type of entity - you should read chapter 2 *Fundamental Concepts*, chapter 3 *AIS: Application Interactive Services*, and possibly chapters 4 and 5 *3D Presentations *and *3D Resources*. You may want to begin with the chapter presenting AIS.
49 * If your display will be in 2D, you should read chapter 1 *Fundamental Concepts*, chapter 6 *2D Presentations* and chapter 7 *2D Resources*.
dba69de2 52@section occt_1621831385_1633708282 Fundamental Concepts
72b7576f 53
54@subsection occt_1621831385_16337082821 Presentation
56In Open CASCADE Technology, presentation services are separated from the data, which they represent, which is generated by applicative algorithms. This division allows you to modify a geometric or topological algorithm and its resulting objects without modifying the visualization services.
58@subsubsection occt_1621831385_163370828211 Key difference in implementation of 2D and 3D visualization
59Current implementation of 3D visualization services is based on OpenGL.
602D visualization packages use native window system API (Win32 GDI API on Windows, Xlib API on Unix and Linux).
dba69de2 61@subsubsection occt_1621831385_163370828212 Structure of the Presentation
72b7576f 62
63Displaying an object on the screen involves three kinds of entity:
64 * a presentable object, the *AIS_InteractiveObject *
65 * a viewer
66 * an interactive context, the *AIS_InteractiveContext*.
68<h4>The presentable object </h4>
dba69de2 69The purpose of a presentable object is to provide the graphical representation of an object in the form of Graphic2d or Graphic3d structure. On the first display request, it creates this structure by calling the appropriate algorithm and retaining this framework for further display.
72b7576f 70Standard presentation algorithms are provided in the StdPrs and Prs3d packages. You can, however, write specific presentation algorithms of your own, provided that they create presentations made of structures from the Graphic2d or Graphic3d packages. You can also create several presentations of a single presentable object: one for each visualization mode supported by your application.
71Each object to be presented individually must be presentable or associated with a presentable object.
73<h4>The viewer </h4>
74The viewer allows you to interactively manipulate views of the object. When you zoom, translate or rotate a view, the viewer operates on the graphic structure created by the presentable object and not on the data model of the application. Creating Graphic2d and Graphic3d structures in your presentation algorithms allows you to use the 2D and 3D viewers provided in Open CASCADE Technology.
76<h4>The Interactive Context </h4>
77(see chapter 2, AIS: Application Interactive Services) The interactive context controls the entire presentation process from a common high-level API. When the application requests the display of an object, the interactive context requests the graphic structure from the presentable object and sends it to the viewer for displaying.
79<h4>Presentation packages </h4>
80Presentation involves at least the AIS, AIS2D, PrsMgr, StdPrs, V3d and V2d packages. Additional packages such as Prs3d, Prs2d, Graphic3d and Graphic2d may be used if you need to implement your own presentation algorithms.
82<h4>AIS and AIS2D</h4>
83See chapter 2, **AIS: Application Interactive Services **The *AIS* package provides all classes to implement interactive objects (presentable and selectable 2D or 3D entities).
85<h4>PrsMgr </h4>
86The *PrsMgr* package provides all the classes needed to implement the presentation process: the *Presentation* and *PresentableObject* abstract classes and the *PresentationManager2d* and *PresentationManager3d* concrete classes.
88<h4>StdPrs </h4>
89The *StdPrs* package provides ready-to-use standard presentation algorithms of points, curves and shapes of the geometry and topology toolkits.
91<h4>V2d and V3d </h4>
92The *V2d* and *V3d* packages provide the services supported by the 2D and 3D viewers.
94<h4>Prs3d and Prs2d</h4>
95The *Prs3d* package provides some generic presentation algorithms such as wireframe, shading and hidden line removal associated with a Drawer class which controls the attributes of the presentation to be created in terms of color, line type, thickness, and so on.
97<h4>Graphic2d and Graphic3d </h4>
dba69de2 98The *Graphic2d* and *Graphic3d* packages provide resources to create 2D and 3D graphic structures (please refer to chapters on 3D Resources and 2D Resources for more information).
72b7576f 99
101@subsubsection occt_1621831385_163370828213 A Basic Example: How to display a 3D object
102<h4>Example </h4>
dba69de2 104Void Standard_Real dx = ...; //Parameters Void Standard_Real dy = ...; //to build a wedge Void Standard_Real dz = ...; Void Standard_Real ltx = ...;
72b7576f 105
106Handle(V3d_Viewer)aViewer = ...; Handle(AIS_InteractiveContext)aContext; aContext = new AIS_InteractiveContext(aViewer);
107BRepPrimAPI_MakeWedge w(dx, dy, dz, ltx); TopoDS_Solid &amp; = w.Solid(); Handle(AIS_Shape) anAis = new AIS_Shape(S); //creation of the presentable object aContext - Display(anAis); //Display the presentable object in the 3d viewer.
109The shape is created using the *BRepPrimAPI_MakeWedge* command. An AIS_Shape is then created from the shape. When calling the *Display *command, the interactive context calls the Compute method of the presentable object to calculate the presentation data and transfer it to the viewer. See Figure 2 below.
dba69de2 111** **
72b7576f 113
dba69de2 119@image html /user_guides/visualization/images/visualization_image004.png
120@image latex /user_guides/visualization/images/visualization_image004.png
72b7576f 121
dba69de2 122@image html /user_guides/visualization/images/visualization_image005.png
123@image latex /user_guides/visualization/images/visualization_image005.png
72b7576f 124**Figure 2. Processes involved in displaying a presentable shape**
126@subsection occt_1621831385_16337082822 Selection
127This chapter deals with the process used for selecting entities, which are displayed in the 2D space of the selection view.
129@subsubsection occt_1621831385_163370828221 The Selection Principle
131Objects that may be selected graphically, are displayed as sets of sensitive primitives, which provide sensitive zones in 2D graphic space. These zones are sorted according to their position on the screen when starting the selection process.
132The position of the mouse is also associated with a sensitive zone. When moving within the window where objects are displayed, the areas touched by the zone of the mouse are analyzed. The owners of these areas are then highlighted or signaled by other means such as the name of the object highlighted in a list. That way, you are informed of the identity of the element detected.
dba69de2 134@image html /user_guides/visualization/images/visualization_image006.jpg
135@image latex /user_guides/visualization/images/visualization_image006.jpg
72b7576f 136**Figure 3. A model **
dba69de2 138@image html /user_guides/visualization/images/visualization_image007.jpg
139@image latex /user_guides/visualization/images/visualization_image007.jpg
72b7576f 140**Figure 4. Modeling faces with sensitive primitives **
dba69de2 142@image html /user_guides/visualization/images/visualization_image008.jpg
143@image latex /user_guides/visualization/images/visualization_image008.jpg
72b7576f 144**Figure 5. In a dynamic selection, each sensitive polygon is represented by its bounding rectangle**
dba69de2 146@image html /user_guides/visualization/images/visualization_image009.jpg
147@image latex /user_guides/visualization/images/visualization_image009.jpg
72b7576f 148Figure 6. Reference to the sensitive primitive, then to the owner
150@subsubsection occt_1621831385_163370828222 The Sensitive Primitive
152The sensitive primitive - along with the entity owner - allow you to define what can be made selectable, and in so doing, provide the link between the applicative object and the sensitive zones defined by the 2D bounding boxes. For an object to be dynamically selectable, it has to be represented either as a sensitive primitive or a set of them. These give 2D boxes that will be included in a sorting algorithm.
153The use of 2D boxes allows a pre-selection of the detected entities. After pre-selection, the algorithm checks which sensitive primitives are actually detected. When detected, the primitives provide their owners’ identity.
154<h4>Example </h4>
156The sensitive line segment below proposes a bounding box to the selector. During selection, positions 1 and 2 of the mouse detect the box but after sorting, only position 2 retains the line segment as selected by the algorithm.
dba69de2 158@image html /user_guides/visualization/images/visualization_image010.jpg
159@image latex /user_guides/visualization/images/visualization_image010.jpg
72b7576f 160**Figure 7. Example of sensitive primitives **
162When the 2D box associated with the position of the mouse intersects the 2D box of a sensitive primitive, the owner of the sensitive primitive is called and its presentation is highlighted.
163The notion of sensitive primitive is important for the developer when defining his own classes of sensitive primitives for the chosen selection modes. The classes must contain *Areas* and *Matches* functions. The former provides the list of 2D sensitive boxes representing the sensitive primitive at pre-selection and the latter determines if the detection of the primitive by the 2D boxes is valid.
164@subsubsection occt_1621831385_163370828223 The Principles of Dynamic Selection
166Dynamic selection causes objects in a view to be automatically highlighted as the mouse cursor moves over them. This allows the user to be certain that the picked object is the correct one. Dynamic Selection is based on the following two concepts:
167 * a Selectable Object (see *AIS_InteractiveObject*)
dba69de2 168 * an Interactive Context
72b7576f 169
170<h4>Selectable Object </h4>
171A selectable object presents a given number of selection modes which can be redefined, and which will be activated or deactivated in the selection manager’s selectors.
173*The term, selection mode of a selectable object, can refer to the selection mode of the object itself or to that of one of its parts.*
175For each selection mode, a *SelectMgr_Selection* object class is included in the selectable object. (Each selection mode establishes a priority of selection for each class of selectable object defined.)
177The notion of SELECTION is comparable to the notion of DISPLAY. Just as a display contains a set of graphic primitives that allow display of the entity in a specific display mode, a SELECTION contains a set of sensitive primitives, which allow detection of the entities they are associated with.
179<h4>Interactive Context</h4>
180See chapter 2, AIS: Application Interactive Services, Section 2.4
182The interactive context is used to manage both selectable objects and selection processes.
184Selection modes may be activated or de-activated for given selectable objects. Information is then provided about the status of activated/de-activated selection modes for a given object in a given selector.
185<h4>Example </h4>
187Let’s consider the 3D selectable shape object, which corresponds to a topological shape.
189For this class, seven selection modes can be defined:
191mode 0 - selection of the shape itself
192mode 1 - selection of vertices
193mode 2 - selection of edges
194mode 3 - selection of wires
195mode 4 - selection of faces
196mode 5 - selection of shells
197mode 6 - selection of solids
198mode 7 - selection of compounds
200Selection 2 includes the sensitive primitives that model all the edges of the shape. Each of these primitives contains a reference to the edge it represents.
202The selections may be calculated before any activation and are graph independent as long as they are not activated in a given selector. Activation of selection mode 3 in a selector associated with a view V leads to the projection of the 3D sensitive primitives contained in the selection; then the 2D areas which represent the 2D bounding boxes of these primitives are provided to the sorting process of the selector containing all the detectable areas.
204To deactivate selection mode 3 remove all those 2D areas.
207*Selection Packages *
208The selection packages are the following: *SelectBasics*, *SelectMgr*, *Select2D*, *Select3D*, *StdSelect*.
210*SelectBasics *
211The *SelectBasics* package contains the basic classes of the selection:
212 * the main definition of a sensitive primitive: *SensitiveEntity *
213 * the definition of a sensitive primitive owner: *EntityOwner *
214 * the algorithm used for sorting sensitive boxes: *SortAlgo *
216*EntityOwner* is used to establish a link from *SensitiveEntity* to application-level objects. For example, *SelectMgr_EntityOwner* (see below) class holds a pointer to corresponding *SelectableObject*.
218*SelectMgr *
219The *SelectMgr* package is used to manage the whole dynamic selection process. It contains the *SelectableObject**, Entity Owner containing a link to its SelectableObject,* *Selection*, *SelectionManager*, and *ViewSelector* classes.
220There are also implementations of *ViewerSelector* interface for 2D and 3D selection: *ViewerSelector2d* and *ViewerSelector3d*, respectively.
222*Select2D *
223The *Select2D* package contains the basic classes of 2D sensitive primitives such as Points, Segments, and Circles, which inherit from *SensitiveEntity* from *SelectBasics* and used to represent 2D selectable objects from a dynamic selection viewpoint.
225*Select3D *
226The *Select3D* package contains all 3D standard sensitive primitives such as point, curve and face. All these classes inherit from 3D *SensitiveEntry* from *SelectBasics* with an additional method, which allows recovery of the bounding boxes in the 2D graphic selection space, if required. This package also includes the 3D-2D projector.
228*StdSelect *
229The *StdSelect* package provides standard uses of the classes described above and main tools used to prevent the developer from redefining the selection objects. In particular, *StdSelect* includes standard means for selection of topological objects (shapes).
231@subsubsection occt_1621831385_163370828224 Methodology
233Several operations must be performed prior to using dynamic selection:
dba69de2 234**1. **Implement specific sensitive primitives if those defined in Select2D and Select3D are not sufficient. These primitives must inherit from *SensitiveEntity* from *SelectBasics* or from a suitable Select3D sensitive entity class when a projection from 3D to 2D is necessary.
235**2. **Define all the owner types, which will be used, and the classes of selectable objects, i.e. the number of possible selection modes for these objects and the calculation of the decomposition of the object into sensitive primitives of all the primitives describing this mode. It is possible to define only one default selection mode for a selectable object if this object is to be selectable in a unique way.
236**3. **Install the process, which provides the user with the identity of the owner of the detected entities in the selection loop.
72b7576f 237
238When all these steps have been carried out, follow the procedure below:
dba69de2 239**1. **Create an interactive context.
240**2. **Create the selectable objects and calculate their various possible selections.
241**3. **Load these selectable objects in the interactive context. The objects may be common to all the selectors, i.e. they will be seen by all the selectors in the selection manager, or local to one selector or more.
242**4. **Activate or deactivate the objects’ selection modes in the selector(s). When activating a selection mode in a selector for a given object, the manager sends the order to make the sensitive primitives in this selector selectable. If the primitives are to projected from 3D to 2D, the selector calls the specific method used to carry out this projection.
72b7576f 243
244At this stage, the selection of selectable entities in the selectors is available.
245The selection loop informs constantly the selectors with the position of the mouse and questions them about the detected entities.
248@subsubsection occt_1621831385_163370828225 Example of Use
250Let’s suppose you are creating an application that displays houses in a viewer of the V3d package and you want to select houses or parts of these houses (windows, doors, etc.) in the graphic window.
251You define a selectable object called *House* and propose four possible selection modes for this object:
252**1 -** selection of the house itself
253**2 -** selection of the rooms
254**3 -** selection of the walls
255**4 - **selection of the doors.
257You have to write the method, which calculates the four selections above, i.e. the sensitive primitives which are activated when the mode is.
258You must define the class *Owner* specific to your application. This class will contain the reference to the house element it represents: wall, door or room. It inherits from *EntityOwner* from *SelectMgr*.
259For example, let’s consider a house with the following representation:
dba69de2 260@image html /user_guides/visualization/images/visualization_image011.jpg
261@image latex /user_guides/visualization/images/visualization_image011.jpg
72b7576f 262**Figure 8. Selection of the rooms of a house**
264To build the selection, which corresponds to the mode *selection of the rooms* (selection 2 in the list of selection modes) use the following procedure:
265<h4>Example </h4>
267Void House::ComputeSelection
268(Const Handle(SelectMgr_Selection)&amp; Sel,
dba69de2 269 const Standard_Integer mode {
270 switch(mode){ case 0: //Selection of the rooms { for(Standard_Integer i = 1; i = myNbRooms; i++) { //for every room, create an instance of the owner
271 //along with the given room and its name. Handle(RoomOwner) aRoomOwner = new RoomOwner (Room(i), NameRoom(i)); //Room() returns a room and NameRoom() returns its name.
72b7576f 272Handle(Select3d_SensitiveBox) aSensitiveBox;
273aSensitiveBox = new Select3d_SensitiveBox
274(aRoomOwner, Xmin, Ymin, Zmin, Xmax, Ymax, Zmax);
dba69de2 275 Sel - Add(aSensitiveBox); } break; Case 1: ... //Selection of the doors } //Switch
72b7576f 276) // ComputeSelection
dba69de2 279@image html /user_guides/visualization/images/visualization_image012.jpg
280@image latex /user_guides/visualization/images/visualization_image012.jpg
72b7576f 281**Figure 9. Activated sensitive boxes corresponding to selection mode 0 (selection of the rooms)**
dba69de2 283@image html /user_guides/visualization/images/visualization_image013.jpg
284@image latex /user_guides/visualization/images/visualization_image013.jpg
286@image html /user_guides/visualization/images/visualization_image014.jpg
287@image latex /user_guides/visualization/images/visualization_image014.jpg
72b7576f 288**Figure 11. Activated sensitive polygons corresponding to selection mode 1.**
290**(selection of the doors)**
dba69de2 291@image html /user_guides/visualization/images/visualization_image015.jpg
292@image latex /user_guides/visualization/images/visualization_image015.jpg
72b7576f 293
294**Figure 12. Sensitive rectangles in the selector during dynamic selection in view 2**
dba69de2 295@section occt_1621831385_810308609 AIS: Application Interactive Services
72b7576f 296Application Interactive Services (**AIS**) offers a set of general services beyond those offered by basic Selection and Presentation packages such as **PrsMgr**, **SelectMgr** and **StdSelect**. These allow you to manage presentations and dynamic selection in a viewer simply and transparently. To use these services optimally, you should know various rules and conventions. Section I provides an overview of the important classes which you need to manipulate AIS well. Sections 2 and 3 explain in detail how to use them and how to implement them, as well as the rules and conventions to respect. The annexes offer various standard Interactive Objects in AIS, an example of an implementation of AIS and a reminder of how to manage presentation and selection.
298@subsection occt_1621831385_8103086091 Overview
300@subsubsection occt_1621831385_81030860911 Interactive Context/Local Context
301<h4>AIS_InteractiveContext </h4>
302The central entity, which pilots visualizations and selections, is the Interactive Context. It is linked to a main viewer (and if need be, a trash bin viewer.) It has two operating modes: the Neutral Point and the local visualization and selection context. The neutral point, which is the default mode, allows you to easily visualize and select interactive objects, which have been loaded into the context. Opening Local Contexts allows you to prepare and use a temporary selection environment without disturbing the neutral point. A set of functions allows you to choose the interactive objects, which you want to act on, the selection modes, which you want to activate, and the temporary visualizations, which you will execute. When the operation is finished, you close the current local context and return to the state in which you were before opening it (neutral point or previous local context).
304@subsubsection occt_1621831385_81030860912 The Interactive Object
307Entities, which are visualized and selected, are Interactive Objects. You can use classes of standard interactive objects for which all necessary functions have already been programmed, or you can implement your own classes of interactive objects, by respecting a certain number of rules and conventions described below.
309@subsubsection occt_1621831385_81030860913 Graphic Attributes Manager or *Drawer*
dba69de2 311@image html /user_guides/visualization/images/visualization_image016.jpg
312@image latex /user_guides/visualization/images/visualization_image016.jpg
72b7576f 313An Interactive Object can have a certain number of graphic attributes specific to it (such as visualization mode, color and material) By the same token, the Interactive Context has a drawer which is valid by default for the objects it controls. When an interactive object is visualized, the required graphic attributes are first taken from its own Drawer if it has the ones required, or from the context drawer if it does not have them.
315@subsubsection occt_1621831385_81030860914 Selection Filters
dba69de2 317@image html /user_guides/visualization/images/visualization_image017.jpg
318@image latex /user_guides/visualization/images/visualization_image017.jpg
72b7576f 319
320An important need in selection is the filtering of entities, which you want to select. Consequently there are FILTER entities, which allow you to refine the dynamic detection context, which you want to put into effect. Some of these filters can be used at the Neutral Point, others only in an open local context. A user will be able to program his own filters and load them into the interactive context.
322@subsection occt_1621831385_8103086092 Rules and Conventions Governing Interactive Objects
dba69de2 323 An interactive object is a *virtual* entity, which can be presented and selected. It can also have its own visualization aspects such as color, material, and mode of visualization. In order to create and manipulate the interactive objects with ease, you must know the rules and conventions, which have been established. Several *virtual* functions must be implemented for these objects to have the behavior expected of them. A certain number of standard interactive objects, which respect the rules and conventions described below, have been implemented in AIS. The current list of them can be found in ANNEX I. The services that concern manipulation of presentations, selection and graphic attributes will be treated separately.
72b7576f 324
326@subsubsection occt_1621831385_81030860921 Presentations:
dba69de2 328@image html /user_guides/visualization/images/visualization_image018.jpg
329@image latex /user_guides/visualization/images/visualization_image018.jpg
72b7576f 330*Conventions *
331 * Either in 2D or in 3D, an interactive object can have as many presentations as its creator wants to give it.
332 * 3D presentations are managed by PresentationManager3D; 2D presentations by PresentationManager2D. As this is transparent in AIS, the user does not have to worry about it.
333 * A presentation is identified by an index and by the reference to the Presentation Manager which it depends on.
334 * By convention, the default mode of representation for the Interactive Object has index 0.
336*Virtual functions *
338Calculation of different presentations of an interactive object is done in the *Compute *functions inheriting from *PrsMgr_ PresentableObject::Compute *functions. They are automatically called by *PresentationManager* at a visualization or an update request.
340If you are creating your own type of interactive object, you must implement the Compute function in one of the following ways:
342 * **For 2D: **
343<h4>Example </h4>
345void PackageName_ClassName::Compute
346(const Handle(PrsMgr_PresentationManager2d)&amp;
dba69de2 348 const Handle(Graphic2d_GraphicObject)&amp; aGraphicObject,
349 const Standard_Integer aMode = 0);
72b7576f 350 * **For 3D: **
351<h4>Example </h4>
353void PackageName_ClassName::Compute
354(const Handle(PrsMgr_PresentationManager3d)&amp;
dba69de2 356 const Handle(Prs3d_Presentation)&amp; aPresentation,
357 const Standard_Integer aMode = 0);
72b7576f 358
359 * **For hidden line removal (HLR) mode in 3D (*): **
360<h4>Example </h4>
362void PackageName_ClassName::Compute
363(const Handle(Prs3d_Projector)&amp; aProjector,
dba69de2 364 const Handle(Prs3d_Presentation)&amp; aPresentation);
72b7576f 365
367*WARNING (*) *
dba69de2 368As its call is automatically ordered by a view, this function requires explanation; the view has two states: degenerate mode (normal mode) and non-degenerate mode (Hidden line mode). When the latter is active, the view looks for all presentations displayed in normal mode, which have been signaled as accepting hidden line mode. An internal mechanism allows us to call the interactive object’s own *Compute*, that is, projector, function. How do you declare that such and such a presentation will accept an *equivalent* in hidden line mode? By convention, it is the Interactive Object, which accepts or rejects the representation of hidden-line mode. You can make this declaration in one of two ways, either initially by using one of the values of the enumeration PrsMgr_TypeOfPresentation:
72b7576f 369 * PrsMgr_TOP_AllView,
370 * PrsMgr_TOP_ProjectorDependant
372or later on, by using the function:
373 * * PrsMgr_PresentableObject::SetTypeOfPresentation
375@subsubsection occt_1621831385_81030860922 Important Specifics of AIS:
377There are four types of interactive object in AIS:
378 * the *construction element* or Datum,
379 * the Relation (dimensions and constraints)
380 * the Object
381 * the None type (when the object is of an unknown type).
383Inside these categories, additional characterization is available by means of a signature (an index.) By default, the interactive object has a NONE type and a signature of 0 (equivalent to NONE.) If you want to give a particular type and signature to your interactive object, you must redefine two virtual functions:
385 * AIS_InteractiveObject::Type
386 * AIS_InteractiveObject::Signature.
dba69de2 387
72b7576f 388
389<h4>WARNING </h4>
390Some signatures have already been used by *standard* objects delivered in AIS. (see the list of standard objects, Annex I.)
392As will be seen below, the interactive context can have a default mode of representation for the set of interactive objects. This mode may not be accepted by a given class of objects. Consequently, a virtual function allowing you to get information about this class must be implemented:
393 * AIS_InteractiveObject::AcceptDisplayMode.
395<h5>Services You Should Know </h5>
396Display Mode: An object can have its own display mode, which is different from that proposed by the interactive context. The functions to use are:
397 * AIS_InteractiveContext::SetDisplayMode
398 * AIS_InteractiveContext::UnsetDisplayMode.
400Hilight Mode: At dynamic detection, the presentation echoed by the Interactive Context, is by default the presentation already on the screen. You can always specify the display mode used for highlighting purposes (so called highlight mode), which is valid no matter what the active representation of the object. It makes no difference whether this choice is temporary or definitive. To do this, you use the following functions:
401 * AIS_InteractiveObject::SetHilightMode
402 * AIS_InteractiveObject::UnSetHilightMode
404Note that the same presentation (and consequently the same highlight mode) is used for highlighting *detected* objects and for highlighting *selected* objects, the latter being drawn with a special *selection color *(refer to the section related to *Interactive Context* services).
406An example: For a shape - whether it is visualized in wireframe presentation or with shading - you want to systematically highlight the wireframe presentation. Consequently, you set the highlight mode to *0 *in the constructor of the interactive object. You mustn’t forget to effect the implementation of this representation mode in the *Compute* functions.
408Infinite Status: If you don’t want an object to be affected by a FitAll view, you must declare it infinite; you can cancel its *infinite* status in the same way.
409 * AIS_InteractiveObject::SetInfiniteState
410 * AIS_InteractiveObject::IsInfinite
411<h4>Example </h4>
413Let’s take the case of a class called IShape, representing an interactive object
415(const TopoDS_Shape&amp; SH, PrsMgr_TypeOfPresentation aType):
dba69de2 417AIS_InteractiveObject(aType), myShape(SH), myDrwr(new AIS_Drawer()) {
72b7576f 418SetHilightMode(0);
dba69de2 419}
72b7576f 420void myPk_IShape::Compute
dba69de2 421(const Handle(PrsMgr_PresentationManager3d) &amp; PM, const Handle(Prs3d_Presentation)&amp; P, const Standard_Integer TheMode)
72b7576f 422{
423switch (TheMode){
425case 0:
426StdPrs_WFDeflectionShape::Add (P,myShape,myDrwr);
427//algo for calculation of wireframe presentation break;
429case 1:
430StdPrs_ShadedShape::Add (P,myShape,myDrwr); //algo for calculation of shading presentation. break;
433void myPk_IsShape::Compute
434(const Handle(Prs3d_Projector)&amp; Prj,
435const Handle(Prs3d_Presentation) P)
438//Cas-cade hidden line mode calculation algorithm
443@subsection occt_1621831385_8103086093 Selections
444@subsubsection occt_1621831385_81030860931 Conventions
446An interactive object can have an indefinite number of modes of selection, each representing a *decomposition* into sensitive primitives; each primitive has an Owner (*SelectMgr_EntityOwner*) which allows us to identify the exact entity which has been detected (see ANNEX II).
448The set of sensitive primitives, which correspond to a given mode, is stocked in a SELECTION (*SelectMgr_Selection*).
450Each Selection mode is identified by an index. By Convention, the default selection mode that allows us to grasp the Interactive object in its entirety is mode *0*.
452@subsubsection occt_1621831385_81030860932 Virtual functions
454The calculation of Selection primitives (or sensitive primitives) is done by the intermediary of a virtual function, *ComputeSelection*. This should be implemented for each type of interactive object on which you want to make different type selections using the following function:
456 * AIS_ConnectedInteractive::ComputeSelection
458A detailed explanation of the mechanism and the manner of implementing this function has been given in ANNEX II.
460Moreover, just as the most frequently manipulated entity is TopoDS_Shape, the most used Interactive Object is AIS_Shape. You will see below that activation functions for standard selection modes are proposed in the Interactive context (selection by vertex, by edges etc.). To create new classes of interactive object with the same behavior as AIS_Shape - such as vertices and edges - you must redefine the virtual function:
462 * AIS_ConnectedInteractive::AcceptShapeDecomposition.
466@subsubsection occt_1621831385_81030860933 Other Services
467You can change the default selection mode index of an Interactive Object. For instance, you can:
468 * check to see if there is a selection mode
469 * check the current selection mode
470 * set a selection mode
471 * unset a selection mode.
472 The following functions are concerned:
474 * AIS_InteractiveObject::HasSelectionMode
475 * AIS_InteractiveObject::SelectionMode
476 * AIS_InteractiveContext::SetSelectionMode
477 * AIS_InteractiveContext::UnsetSelectionMode
479These functions are only of interest if you decide that the *0* mode adopted by convention will not do. In the same way, you can temporarily change the priority of certain interactive objects for selection of 0 mode. You could do this to make it easier to detect them graphically. You can:
480 * check to see if there is a selection priority setting for the owner
481 * check the current priority
482 * set a priority
483 * unset the priority.
485To do this, you use the following functions:
486 * AIS_InteractiveObject::HasSelectionPriority
487 * AIS_InteractiveObject::SelectionPriority
488 * AIS_InteractiveObject::SetSelectionPriority
489 * AIS_InteractiveObject::UnsetSelectionPriority
493@subsection occt_1621831385_8103086094 Graphic attributes of an interactive object
495Keep in mind the following points concerning graphic attributes:
496 * Each interactive object can have its own visualization attributes.
497 * The set of graphic attributes of an interactive object is stocked in an *AIS_Drawer*, which is only a *Prs3d_Drawer* with the possibility of a link to another drawer
498 * By default, the interactive object takes the graphic attributes of the context in which it is visualized (visualization mode, deflection values for the calculation of presentations, number of isoparameters, color, type of line, material, etc.)
499 * In the *AIS_InteractiveObject* abstract class, several standard attributes have been privileged. These include: color, thickness of line, material, and transparency. Consequently, a certain number of virtual functions, which allow us to act on these attributes, have been proposed. Each new class of interactive object can redefine these functions in order to bring about the changes it should produce in the behavior of the class.
dba69de2 502@image html /user_guides/visualization/images/visualization_image019.jpg
503@image latex /user_guides/visualization/images/visualization_image019.jpg
72b7576f 504**Figure 13. Redefinition of virtual functions for changes in AIS_Point **
dba69de2 506@image html /user_guides/visualization/images/visualization_image020.jpg
507@image latex /user_guides/visualization/images/visualization_image020.jpg
72b7576f 508**Figure 14. **Redefinition** of virtual functions for changes in AIS_Shape.**
510The virtual functions concerned here allow you to provide settings for:
511 * color
512 * width
513 * material
514 * transparency
516The functions concerned are the following:
518 * AIS_InteractiveObject::UnsetColor
519 * AIS_InteractiveObject::SetWidth
520 * AIS_InteractiveObject::UnsetWidth
521 * AIS_InteractiveObject::SetMaterial (const Graphic3d_NameOfPhysicalMaterial &amp; aName)
dba69de2 522 * AIS_InteractiveObject::SetMaterial (const Graphic3d_MaterialAspect &amp; aMat)
72b7576f 523 * AIS_InteractiveObject::UnsetMaterial
524 * AIS_InteractiveObject::SetTransparency
525 * AIS_InteractiveObject::UnsetTransparency
527For other types of attribute, it is appropriate to change the Drawer of the object directly using:
529 * AIS_InteractiveObject::SetAttributes
530 * AIS_InteractiveObject::UnsetAttributes
533@subsubsection occt_1621831385_81030860941 Manipulation of Attributes
535Some of these functions may imply the recalculation of presentations of the object. It is important to know which ones. If an interactive object’s presentation mode is to be updated, a flag from *PrsMgr_PresentableObject* indicates this. The mode should be updated using the functions *Display* and *Redisplay* in *AIS_InteractiveContext*.
537@subsection occt_1621831385_8103086095 Complementary Services - Precautions
539@subsubsection occt_1621831385_81030860951 Changing an interactive object’s location
541When using complementary services for interactive objects, pay special attention to the following cases:
542Functions allowing us to temporarily *move* the representation and selection of Interactive Objects in a view without recalculation.
543 * AIS_InteractiveContext::SetLocation
544 * AIS_InteractiveContext::ResetLocation
545 * AIS_InteractiveContext::HasLocation
546 * AIS_InteractiveContext::Location
548How you link applicative entities to interactive objects.
551@subsubsection occt_1621831385_810308609552 Connecting an interactive object to an applicative entity
553Each Interactive Object has functions that allow us to attribute it an Owner in the form of a Transient.
554 * AIS_InteractiveObject::SetOwner
555 * AIS_InteractiveObject::HasOwner
556 * AIS_InteractiveObject::Owner
558An interactive object can therefore be associated with an applicative entity or not, without this affecting its behavior.
560@subsubsection occt_1621831385_810308609553 Resolving coincident topology
562Due to the fact that the accuracy of three-dimensional graphics coordinates has a finite resolution the elements of topological objects can coincide producing the effect of *popping* some elements one over another.
564To avoid such kind of a problem when the elements of two or more InteractiveObjects are coincident you can apply the polygon offset. It is a sort of graphics computational offset, or depth buffer offset, that allows you to arrange elements (by modifying their depth value) without changing their coordinates. The graphical elements that accept this kind of offsets are solid polygons or displayed as boundary lines and points. The polygons could be displayed as lines or points by setting the appropriate interior style.
566The following method allows you to set up the polygon offsets:
567 * void AIS_InteractiveObject::SetPolygonOffsets
568(const Standard_Integer aMode,
dba69de2 569 const Standard_Real aFactor,
570 const Standard_Real aUnits)
72b7576f 571The parameter aMode can contain various combinations of Aspect_PolygonOffsetMode enumeration elements. The enumeration has the following elements:
572 * Aspect_POM_None
573 * Aspect_POM_Off
574 * Aspect_POM_Fill
575 * Aspect_POM_Line
576 * Aspect_POM_Point
577 * Aspect_POM_All
dba69de2 579The combination of these elements defines the polygon display modes that will use the given offsets. You can switch off the polygon offsets by passing the Aspect_POM_Off. Passing Aspect_POM_None allows you to change the aFactor and aUnits values without changing the mode. If aMode is different from Aspect_POM_Off, the aFactor and aUnits arguments are used by the graphics renderer to calculate the depth offset value:
72b7576f 580 offset = aFactor * m + aUnits * r,
581 where m – maximum depth slope for the polygons currently being displayed, r – minimum depth resolution (implementation-specific)
583Negative offset values move polygons closer to the viewer while positive values shift polygons away.
586This method has a side effect – it creates its own shading aspect if not yet created, so it is better to set up the object shading aspect first.
588You can use the following functions to obtain the current settings for polygon offsets:
589 * void AIS_InteractiveObject::PolygonOffsets
590(Standard_Integer &amp;aMode,
dba69de2 591 Standard_Real &amp;aFactor,
592 Standard_Real &amp;aUnits)
72b7576f 593 * Standard_Boolean
596The same operation could be performed for the interactive object known by the AIS_InteractiveContext with the following methods:
597 * void AIS_InteractiveContext::SetPolygonOffsets
598(const Handle(AIS_InteractiveObject) &amp;anObj,
dba69de2 599 const Standard_Integer aMode,
600 const Standard_Real aFactor,
601 const Standard_Real aUnits)
72b7576f 602 * void AIS_InteractiveContext::PolygonOffsets
603(const Handle(AIS_InteractiveObject) &amp;anObj,
dba69de2 604 Standard_Integer &amp;aMode,
605 Standard_Real &amp;aFactor,
606 Standard_Real &amp;aUnits)
72b7576f 607 * Standard_Boolean AIS_InteractiveContext::HasPolygonOffsets
608(const Handle(AIS_InteractiveObject) &amp;anObj)
610@subsection occt_1621831385_8103086096 The Interactive Context
612@subsubsection occt_1621831385_810308609661 Preliminary Rules
614The Interactive Context allows us to manage in a transparent way, the graphic and *selectable* behavior of interactive objects in one or more viewers. Most functions which allow us to modify the attributes of interactive objects, and which were presented in the preceding chapter, will be looked at again here.
616There is one essential rule to follow: the modification of an interactive object, which is already known by the Context, must be done using Context functions. You can only directly call the functions available for an interactive object if it has not been loaded into an Interactive Context.
618<h4>Example </h4>
620Handle (AIS_Shape) TheAISShape = new AIS_Shape (ashape); myIntContext-Display(TheAISShape);
621myIntContext-SetDisplayMode(TheAISShape ,1);
624//but you can write
626Handle (AIS_Shape) TheAISShape = new AIS_Shape (ashape); TheAISShape-SetColor(Quantity_NOC_RED);
631@subsubsection occt_1621831385_810308609662 Groups of functions
633You must distinguish two states in the Interactive Context:
dba69de2 634* No Open Local Context; which will be referred to as Neutral Point.
635* One or several open local contexts, each representing a temporary state of selection and presentation.
72b7576f 636
637Some functions can only be used in open Local Context; others in closed local context; others do not have the same behavior in one state as in the other.
639The Interactive Context is composed of a great many functions, which can be conveniently grouped according to theme:
640 * management proper to the context
641 * management in the local context
642 * presentations and selection in open/closed context
643 * selection strictly speaking
646@subsubsection occt_1621831385_810308609663 Management proper to the Interactive Context
648The Interactive Context is made up of a Principal Viewer and, optionally, a trash bin or *Collector* Viewer. It also has a group of adjustable settings allowing you to personalize the behavior of presentations and selections:
649 * Default Drawer, containing all the color and line attributes which can be used by interactive objects, which do not have their own attributes.
650 * Default Visualization Mode for interactive objects
651Default: mode 0
652 * Highlight color of entities detected by mouse movement
653Default: Quantity_NOC_CYAN1
654 * Preselection color
655Default: Quantity_NOC_GREEN
656 * Selection color (when you click on a detected object)
657Default: Quantity_NOC_GRAY80
658 * Sub-Intensity color
659Default: Quantity_NOC_GRAY40
661All of these settings can be modified by functions proper to the Context.
663When you change a graphic attribute pertaining to the Context (visualization mode, for example), all interactive objects, which do not have the corresponding appropriate attribute, are updated.
664<h4>Example </h4>
666//obj1, obj2: 2 interactive objects.
668TheCtx-Display(obj1,Standard_False); // False = no update
669of viewer.
670TheCtx-Display(obj2,Standard_True); // True = Update of
674// obj2 is visualised in mode 2 (if it accepts this mode)
675// obj1 stays visualised in its mode 3.
677To the main Viewer, are associated a *PresentationManager3D* and a *Selector3D *which manage the presentation and selection of present interactive objects. The same is true of the optional Collector. As we shall see, this management is completely transparent for the user.
680@subsection occt_1621831385_8103086097 Management of Local Context
682@subsubsection occt_1621831385_810308609771 Rules and Conventions
684 * Opening a local context allows you to prepare an environment for temporary presentations and selections, which will disappear once the local context is closed.
685 * It is possible to open several local contexts, but only the last one will be active.
686 * When you close a local context, the one before, which is still on the stack, reactivates. If none is left, you return to Neutral Point.
687 * Each local context has an index created when the context opens. You should close the local context, which you have opened.
689@subsubsection occt_1621831385_810308609772 Important functionality
691The interactive object, which is used the most by applications, is *AIS_Shape*. Consequently, standard functions are available which allow you to easily prepare selection operations on the constituent elements of shapes (selection of vertices, edges, faces etc) in an open local context. The selection modes specific to *Shape* type objects are called **Standard Activation Mode**. These modes are only taken into account in open local context and only act on interactive objects which have redefined the virtual function *AcceptShapeDecomposition() *so that it returns *TRUE*.
692 * Objects, which are temporarily in a local context, are not recognized by other local contexts a priori. Only objects visualized in Neutral Point are recognized by all local contexts.
693 * The state of a temporary interactive object in a local context can only be modified while another local context is open (except for one special case - see III.4.2)
695<h4>WARNING </h4>
696The specific modes of selection only concern the interactive objects, which are present in the Main Viewer. In the Collector, you can only locate interactive objects, which answer positively to the positioned filters when a local context is open. Under no circumstances are they decomposed in standard mode etc.
698@subsubsection occt_1621831385_810308609773 Use
699Opening and closing a local context are easy to put into operation:
701 * AIS_InteractiveContext::OpenLocalContext
703The options available allow you to control what you want to do:
704 * *UseDisplayedObjects*: allows you to load or not load the interactive objects visualized at Neutral Point in the local context, which you open. If* FALSE*, the local context is empty after being opened. If *TRUE*, the objects at Neutral Point are modified by their default selection mode.
705 * *AllowShapeDecomposition*: AIS_Shape allows or prevents decomposition in standard shape location mode of objects at Neutral Point, which are type-*privileged* (see selection chapter). This Flag is only taken into account when *UseDisplayedObjects* is *TRUE*.
706 * *AcceptEraseOfObjects*: authorises other local contexts to erase the interactive objects present in this context. This option is rarely used. The last option has no current use.
708This function returns the index of the created local context. It should be kept and used when the context is closed.
710To load objects visualized at Neutral Point into a local context or remove them from one:
711 * AIS_InteractiveContext::UseDisplayedObjects
712 * AIS_InteractiveContext::NotUseDisplayedObjects
714Closing Local Contexts is done by:
715 * AIS_InteractiveContext::CloseLocalContext
716 * AIS_InteractiveContext::CloseAllContexts
720When the index isn’t specified in the first function, the current Context is closed. This option can be dangerous, as other Interactive Functions can open local contexts without necessarily warning the user. For greater security, you have to close the context with the index given on opening.
722To get the index of the current context, use the following function:
724 * AIS_InteractiveContext::IndexOfCurrentLocal
726The second function allows you to close all open local contexts at one go. In this case, you find yourself directly at Neutral Point.
728When you close a local context, all temporary interactive objects are erased (deleted), all selection modes concerning the context are cancelled, and all content filters are emptied.
732@subsubsection occt_1621831385_810308609774 Management of Presentations and Selections
734You must distinguish between the Neutral Point and the Open Local Context states. Although the majority of visualization functions can be used in both situations, their behavior is different:
736@subsubsection occt_1621831385_810308609775 Presentation in Neutral Point
738Neutral Point should be used to visualize the interactive objects, which represent and select an applicative entity. Visualization and Erasing orders are straightforward:
740 * AIS_InteractiveContext::Display
741(const Handle(AIS_InteractiveObject)&amp; anIobj,
dba69de2 742 const Standard_Boolean updateviewer=Standard_True);
72b7576f 743
744 * AIS_InteractiveContext::Display
745(const Handle(AIS_InteractiveObject)&amp; anIobj,
dba69de2 746 const Standard_Integer amode,
747 const Standard_Integer aSelectionMode,
748 const Standard_Boolean
72b7576f 749updateviewer = Standard_True,
dba69de2 750 const Standard_Boolean
72b7576f 751allowdecomposition = Standard_True);
753 * AIS_InteractiveContext::Erase
754 * AIS_InteractiveContext::EraseMode
755 * AIS_InteractiveContext::ClearPrs
756 * AIS_InteractiveContext::Redisplay
757 * AIS_InteractiveContext::Remove
758 * AIS_InteractiveContext::EraseAll
759 * AIS_InteractiveContext::Hilight
760 * AIS_InteractiveContext::HilightWithColor
762@subsubsection occt_1621831385_810308609776 Important Remarks:
764Bear in mind the following points:
765 * It is recommended to display and erase interactive objects when no local context is opened, and open a local context for local selection only.
766 * The first **Display** function among the two ones available in *InteractiveContext* visualizes the object in its default mode (set with help of SetDisplayMode() method of InteractiveObject prior to Display() call), or in the default context mode, if applicable. If it has neither, the function displays it in 0 presentation mode. The object’s default selection mode is automatically activated (0 mode by convention).
767 * Activating the displayed object by default can be turned off with help of **SetAutoActivateSelection**() method. This might be efficient if you are not interested in selection immediately after displaying an object.
768 * The second **Display** function should only be used in Neutral Point to visualize a supplementary mode for the object, which you can erase by EraseMode (...). You activate the selection mode. This is passed as an argument. By convention, if you do not want to activate a selection mode, you must set the *SelectionMode *argument to the value of -1. This function is especially interesting in open local context, as we will see below.
769 * In Neutral Point, it is unadvisable to activate other selection modes than the default selection one. It is preferable to open a local context in order to activate particular selection modes.
770 * When you call **Erase **(Interactive object) function, the *PutIncollector* argument, which is FALSE by default, allows you to visualize the object directly in the Collector and makes it selectable (by activation of 0 mode). You can nonetheless block its passage through the Collector by changing the value of this option. In this case, the object is present in the Interactive Context, but is not seen anywhere.
771 * **Erase**() with *putInCollector* = Standard_True** might be slow as it re-computes the objects presentation in the Collector. Set putInCollector to Standard_False if you simply want to hide the object’s presentation temporarily.
772 * Modifications of visualization attributes and graphic behavior is effected through a set of functions similar to those which are available for the interactive object (color, thickness of line, material, transparency, locations etc.) The context then manages immediate and deferred updates.
773 * Call **Remove**() method of *InteractiveContext* as soon as the interactive object is no longer needed and you want to destroy it.. Otherwise, references to *InteractiveObject* are kept by *InteractiveContext*, and the *Object* is not destroyed that results in memory leaks. In general, if some interactive object’s presentation can be computed quickly, it is recommended to **Remove**() it instead of **Erase**()-ing.
775@subsubsection occt_1621831385_810308609777 Presentation in Local Context
777In open local context, the Display functions presented above apply as well.
779<h4>WARNING </h4>
780The function, AIS_InteractiveObject::Display, automatically activates the object’s default selection mode. When you only want to visualize an Interactive Object in open Context, you must call the second function:
784You can activate or deactivate specific selection modes in local open context in several different ways:
785Use the Display functions with the appropriate modes
786Activate standard mode:
788 * AIS_InteractiveContext::ActivateStandardMode
789only if a local Context is opened
791 * AIS_InteractiveContext::DeactivateStandardMode
793 * AIS_InteractiveContext::ActivatedStandardModes
795 * AIS_InteractiveContext::SetShapeDecomposition
797This has the effect of activating the corresponding selection mode for all objects in Local Context, which accept decomposition into sub-shapes. Every new Object which has been loaded into the interactive context and which answers these decomposition criteria is automatically activated according to these modes.
799<h4>WARNING </h4>
800If you have opened a local context by loading an object with the default options (AllowShapeDecomposition = Standard_True), all objects of the *Shape* type are also activated with the same modes. You can act on the state of these *Standard* objects by using SetShapeDecomposition(Status).
802Load an interactive object by the following function:
804 * AIS_InteractiveContext::Load.
806This function allows you to load an Interactive Object whether it is visualized or not with a given selection mode, and/or with the desired decomposition option. If *AllowDecomp=TRUE* and obviously, if the interactive object is of the *Shape* type, these *standard* selection modes will be automatically activated as a function of the modes present in the Local Context.
808Directly activate/deactivate selection modes on an object:
810 * AIS_InteractiveContext::Activate
811 * AIS_InteractiveContext::Deactivate.
dba69de2 812
72b7576f 813
820@subsubsection occt_1621831385_810308609778 Use of Filters
822When Interactive objects have been *prepared* in local context, you can add rejection filters. The root class of objects is *SelectMgr_Filter*. The principle behind it is straightforward: a filter tests to see whether the owners (*SelectMgr_EntityOwner*) detected in mouse position by the Local context selector answer *OK*. If so, it is kept; if not, it is rejected.
824You can therefore create your own class of filter objects by implementing the deferred function *IsOk()*:
825<h4>Example </h4>
827class MyFilter : public SelectMgr_Filter {
829virtual Standard_Boolean MyFilter::IsOk
830(const Handle(SelectMgr_EntityOwner)&amp; anObj) const = 0;
833In *SelectMgr*, there are also Composition filters (AND Filters, OR Filters), which allow you to combine several filters. In InteractiveContext , all filters that you add are stocked in an OR filter (which answers *OK* if at least one filter answers *OK*).
835There are Standard filters, which have already been implemented in several packages:
837 * StdSelect_EdgeFilter
838Filters acting on edges such as lines and circles
839 * StdSelect_FaceFilter
840Filters acting on faces such as planes, cylinders and spheres
841 * StdSelect_ShapeTypeFilter
842Filters shape types such as compounds, solids, shells and wires
843 * AIS_TypeFilter
844Acts on types of interactive objects
845 * AIS_SignatureFilter
846Acts on types and signatures of interactive objects
847 * AIS_AttributeFilter
848Acts on attributes of Interactive Objects such as color and width
850Because there are specific behaviors on shapes, each new Filter class must, if necessary, redefine a function, which allows a Local Context to know if it acts on specific types of sub-shapes:
852 * AIS_LocalContext::ActsOn.
854By default, this function answers *FALSE*.
857Only type filters are activated in Neutral Point. This is to make it possible to identify a specific type of visualized object. For filters to come into play, one or more object selection modes must be activated.
859There are several functions to manipulate filters:
861 * AIS_InteractiveContext::AddFilter
863to add a filter passed as an argument.
dba69de2 864
72b7576f 865 * AIS_InteractiveContext::RemoveFilter
867to remove a filter passed as an argument.
869 * AIS_InteractiveContext::RemoveFilters
871to remove all filters present.
873 * AIS_InteractiveContext::Filters
875to get the list of filters active in a local context.
876<h4>Example </h4>
879// no object in neutral point is loaded
882//activates decomposition of shapes into faces.
883Handle (AIS_Shape) myAIShape = new AIS_Shape ( ATopoShape);
885myContext-Display(myAIShape,1,-1,Standard_True,Standard_True); //shading visualization mode, no specific mode, authorization for //decomposition into sub-shapes. At this Stage, myAIShape is decomposed into faces...
887Handle(StdSelect_FaceFilter) Fil1= new
889Handle(StdSelect_FaceFilter) Fil2= new
dba69de2 890 StdSelect_FaceFilter(StdSelect_Plane);
72b7576f 891
892myContext-AddFilter(Fil1); myContext-AddFilter(Fil2); //only faces of revolution or planar faces will be selected
893 *
894myContext-MoveTo( xpix,ypix,Vue);
895// detects of mouse position
898@subsubsection occt_1621831385_810308609779 Selection Strictly Speaking.
899Dynamic detection and selection are put into effect in a straightforward way. There are only a few conventions and functions to be familiar with. The functions are the same in neutral point and in open local context:
901 * AIS_InteractiveContext::MoveTo
902passes mouse position to Interactive Context selectors
903 * AIS_InteractiveContext::Select
904stocks what has been detected on the last MoveTo. Replaces the previously selected object. Empties the stack if nothing has been detected at the last move
905 * AIS_InteractiveContext::ShiftSelect
906if the object detected at the last move was not already selected , it is added to the list of those selected. If not, it is withdrawn. Nothing happens if you click on an empty area.
907 * AIS_InteractiveContext::Select
908selects everything found in the surrounding area
909 * AIS_InteractiveContext::ShiftSelect
910selects what was not previously in the list of selected, deselects those already present.
912Highlighting of detected and selected entities is automatically managed by the Interactive Context, whether you are in neutral point or Local Context. The Highlight colors are those dealt with above. You can nonetheless disconnect this automatic mode if you want to manage this part yourself:
914 * AIS_InteractiveContext::SetAutomaticHilight
915 * AIS_InteractiveContext::AutomaticHilight
918If there is no open local context, the objects selected are called CURRENT OBJECTS; SELECTED OBJECTS if there is one. Iterators allow entities to be recovered in either case. A set of functions allows you to manipulate the objects, which have been placed in these different lists.
921When a Local Context is open, you can select entities other than interactive objects (vertices, edges etc.) from decompositions in standard modes, or from activation in specific modes on specific interactive objects. Only interactive objects are stocked in the list of selected objects. You can question the Interactive context by moving the mouse. The following functions will allow you to:
922 * tell whether something has been detected
923 * tell whether it is a shape
924 * get the shape if the detected entity is one
925 * get the interactive object if the detected entity is one.
927The following functions are concerned:
928 * AIS_InteractiveContext::HasDetected
929 * AIS_InteractiveContext::HasDetectedShape
930 * AIS_InteractiveContext::DetectedShape
931 * AIS_InteractiveContext::DetectedInteractive
933After using the Select and ShiftSelect functions in Neutral Point, you can explore the list of selections, referred to as current objects in this context. You can:
934 * initiate a scan of this list
935 * extend the scan
936 * resume the scan
937 * get the name of the current object detected in the scan.
939The following functions are concerned:
940 * AIS_InteractiveContext::InitCurrent
941 * AIS_InteractiveContext::MoreCurrent
942 * AIS_InteractiveContext::NextCurrent
943 * AIS_InteractiveContext::Current
945You can:
946 * get the first current interactive object
947 * highlight current objects
948 * remove highlight from current objects
949 * empty the list of current objects in order to update it
950 * find the current object.
952The following functions are concerned:
953 * AIS_InteractiveContext::FirstCurrentObject
954 * AIS_InteractiveContext::HilightCurrents
955 * AIS_InteractiveContext::UnhilightCurrents
956 * AIS_InteractiveContext::ClearCurrents
957 * AIS_InteractiveContext::IsCurrent.
959In Local Context, you can explore the list of selected objects available. You can:
960 * initiate,
961 * extend,
962 * resume a scan, and then
963 * get the name of the selected object.
965The following functions are concerned:
967 * AIS_InteractiveContext::InitSelected
968 * AIS_InteractiveContext::MoreSelected
969 * AIS_InteractiveContext::NextSelected
970 * AIS_InteractiveContext::SelectedShape.
972You can:
973 * check to see if you have a selected shape, and if not,
974 * get the picked interactive object,
975 * check to see if the applicative object has an owner from Interactive attributed to it
976 * get the owner of the detected applicative entity
977 * get the name of the selected object.
979The following functions are concerned:
981 * AIS_InteractiveContext::HasSelectedShape
982 * AIS_InteractiveContext::Interactive
983 * AIS_InteractiveContext::HasApplicative
984 * AIS_InteractiveContext::Applicative
985 * AIS_InteractiveContext::IsSelected.
987<h4>Example </h4>
991while (myAISCtx-MoreSelected())
993if (myAISCtx-HasSelectedShape)
995TopoDS_Shape ashape = myAISCtx-SelectedShape();
996// to be able to use the picked shape
dba69de2 997 }
72b7576f 998else
1000Handle_AIS_InteractiveObject aniobj = myAISCtx-Interactive();
1001// to be able to use the picked interactive object
1003myAISCtx-NextSelected(); }
1006@subsubsection occt_1621831385_8103086097710 Remarks:
1008In Local Context and in the iteration loop, which allows you to recover selected entities, you have to ask whether you have selected a shape or an interactive object before you can recover the entity. If you have selected a Shape from TopoDS on decomposition in standard mode, the *Interactive ()* function returns the interactive object, which provided the selected shape. Other functions allow you to manipulate the content of Selected or Current Objects:
1009 * erase selected objects
1010 * display them,
1011 * put them in the list of selections
1013The following functions are concerned:
1015 * AIS_InteractiveContext::EraseSelected
1016 * AIS_InteractiveContext::DisplaySelected
1017 * AIS_InteractiveContext::SetSelected
1020You can also:
1022 * take the list of selected objects from a local context and put it into the list of current objects in Neutral Point,
1023 * add or remove an object from the list of selected entities,
1024 * highlight and
1025 * remove highlighting from a selected object
1026 * empty the list of selected objects.
1028The following functions are concerned:
1030 * AIS_InteractiveContext::SetSelectedCurrent
1031 * AIS_InteractiveContext::AddOrRemoveSelected
1032 * AIS_InteractiveContext::HilightSelected
1033 * AIS_InteractiveContext::UnhilightSelected
1034 * AIS_InteractiveContext::ClearSelected
1036You can highlight and remove highlighting from a current object, and empty the list of current objects.
dba69de2 1038 * AIS_InteractiveContext::HilightCurrents
1039 * AIS_InteractiveContext::UnhilightCurrents
1040 * AIS_InteractiveContext::ClearCurrents
72b7576f 1041
1042When you are in open Local Context, you may be lead to keep *temporary* interactive objects. This is possible using the following functions:
1044 * AIS_InteractiveContext::KeepTemporary
1045 * AIS_InteractiveContext::SetSelectedCurrent
1047The first function transfers the characteristics of the interactive object seen in its local context (visualization mode etc.) to the neutral point. When the local context is closed, the object does not disappear. The second allows the selected object to become the current object when you close the local context.
1048You can also want to modify in a general way the state of the local context before continuing a selection (emptying objects, removing filters, standard activation modes). To do that, you must use the following function:
1050 * AIS_InteractiveContext::ClearLocalContext
1052@subsubsection occt_1621831385_8103086097711 Advice on Using Local Contexts
1054The possiblities of use for local contexts are numerous depending on the type of operation that you want to perform:
1055 * working on all visualized interactive objects,
1056 * working on only a few objects,
1057 * working on a single object.
10591. When you want to work on one type of entity, you should open a local context with the option UseDisplayedObjects set to FALSE. Some functions which allow you to recover the visualized interactive objects, which have a given Type, and Signature from the *Neutral Point* are:
1062(AIS_ListOfInteractive&amp; aListOfIO) const;
1065(const AIS_KindOfInteractive WhichKind,
dba69de2 1066 const Standard_Integer WhichSignature,
72b7576f 1067AIS_ListOfInteractive&amp; aListOfIO) const;
1069At this stage, you only have to load the functions Load, Activate, and so on.
10712. When you open a Local Context with default options, you must keep the following points in mind:
1073The Interactive Objects visualized at Neutral Point are activated with their default selection mode. You must deactivate those, which you do not want to use.
1075The Shape Type Interactive Objects are automatically decomposed into sub-shapes when standard activation modes are launched.
1077The *temporary* Interactive Objects present in the Local Contexts are not automatically taken into account. You have to load them manually if you want to use them.
1079The stages could be the following:
10801. Open a Local Context with the right options;
10812. Load/Visualize the required complementary objects with the desired activation modes.
10823. Activate Standard modes if necessary
10834. Create its filters and add them to the Local Context
10845. Detect/Select/recover the desired entities
10856. Close the Local Context with the adequate index.
1087It is useful to create an INTERACTIVE EDITOR, to which you pass the Interactive Context. This will take care of setting up the different contexts of selection/presentation according to the operation, which you want to perform.
1088<h4>Example </h4>
1091You have visualized several types of interactive objects: *AIS_Points*, *AIS_Axes*, *AIS_Trihedrons*, and *AIS_Shapes*.
1093For your applicative function, you need an axis to create a revolved object. You could obtain this axis by identifying:
1094 * an axis which is already visualized,
1095 * 2 points,
1096 * a rectilinear edge on the shapes which are present,
1097 * a cylindrical face on the shapes (You will take the axis of this face)
1100(const Handle(AIS_InteractiveContext)&amp; Ctx,
dba69de2 1101 ....) :
1102 myCtx(Ctx),
72b7576f 1103...
1110myIndex =myCtx-OpenLocalContext();
1112//the filters
1114Handle(AIS_SignatureFilter) F1 = new
dba69de2 1115 AIS_SignatureFilter(AIS_KOI_Datum,AIS_SD_Point);
72b7576f 1116//filter on the points
1118Handle(AIS_SignatureFilter) F2 = new
1120//filters on the axes.
1122Handle(StdSelect_FaceFilter) F3 = new
dba69de2 1123 StdSelect_FaceFilter(AIS_Cylinder);
72b7576f 1124//cylindrical face filters
1128// activation of standard modes on the shapes..
1135// at this point, you can call the selection/detection function
1138void myIHMEditor::MoveTo(xpix,ypix,Vue)
1140{ myCTX-MoveTo(xpix,ypix,vue); // the highlight of what is detected is automatic. }
1141Standard_Boolean myIHMEditor::Select() { // returns true if you should continue the selection
1142myCTX-Select(); myCTX-InitSelected(); if(myCTX-MoreSelected())
dba69de2 1143 { if(myCTX-HasSelectedShape())
72b7576f 1144{ const TopoDS_Shape&amp; sh = myCTX-SelectedShape();
1145if( vertex){
1148//if it’s the first vertex, you stock it, then you deactivate the faces and only keep the filter on the points:
1149mypoint1 = ....;
1153// the filter on the AIS_Points
1154myFirstV = Standard_False;
1155return Standard_True;
dba69de2 1156 } else {
1157 mypoint2 =...;
72b7576f 1158// construction of the axis return Standard_False;
dba69de2 1160 }
1161 else
1162 {
72b7576f 1163//it is a cylindrical face : you recover the axis; visualize it; and stock it.
1164return Standard_False;
dba69de2 1166 }
72b7576f 1167// it is not a shape but is no doubt a point.
1171SelObj = myCTX-SelectedInteractive();
1176if (firstPoint)
1178mypoint1 =...
1179return Standard_True;
1183mypoint2 = ...;
1184//construction of the axis, visualization, stocking
1185return Standard_False;
1191// you have selected an axis; stock the axis
1192return Standard_False;
1198@subsection occt_1621831385_810308609111 ANNEX I: Standard Interactive Object Classes in AIS DATUMS:
1200AIS_Point AIS_Axis AIS_Line AIS_Circle AIS_Plane AIS_Trihedron : 4 selection modes
1201 * mode 0 : selection of a trihedron
1202 * mode 1 : selection of the origin of the trihedron
1203 * mode 2 : selection of the axes
1204 * mode 3 : selection of the planes XOY, YOZ, XOZ
1206when you activate one of modes 1 2 3 4 , you pick AIS objects of type:
1207 * AIS_Point
1208 * AIS_Axis (and information on the type of axis)
1209 * AIS_Plane (and information on the type of plane).
1211AIS_PlaneTrihedron offers 3 selection modes:
1212 * mode 0 : selection of the whole trihedron
1213 * mode 1 : selection of the origin of the trihedron
1214 * mode 2 : selection of the axes - same remarks as for the Trihedron.
1216<h4>Warning </h4>
1217For the presentation of planes and trihedra, the default unit of length is millimeter, and the default value for the representation of axes is 100. If you modify these dimensions, you must temporarily recover the object DRAWER. From inside it, take the Aspects in which the values for length are stocked (PlaneAspect for the plane, FirstAxisAspect for trihedra), and change these values inside these Aspects. Finally, recalculate the presentation.
1219@subsubsection occt_1621831385_8103086092222 OBJECTS
1220AIS_Shape : 3 visualization modes :
1221 * mode 0 : Line (default mode)
1222 * mode 1 : Shading (depending on the type of shape)
1223 * mode 2 : Bounding Box
12257 maximum selection modes, depending on the complexity of the shape :
1226 * * mode 0 : selection of the AIS_Shape
1227 * * mode 1 : selection of the vertices
1228 * * mode 2 : selection of the edges
1229 * * mode 3 : selection of the wires
1230 * * mode 4 : selection of the faces
1231 * * mode 5 : selection of the shells
1232 * * mode 6 : selection of the constituent solids.
1234AIS_Triangulation: Simple interactive object for displaying triangular mesh contained in Poly_Triangulation container.
1236AIS_ConnectedInteractive: Interactive Object connecting to another interactive object reference, and located elsewhere in the viewer makes it possible not to calculate presentation and selection, but to deduce them from your object reference.
1238AIS_ConnectedShape: Object connected to interactive objects having a shape; this class has the same decompositions as AIS_Shape. What’s more, it allows a presentation of hidden parts, which are calculated automatically from the shape of its reference.
1240AIS_MultipleConnectedInteractive: Object connected to a list of interactive objects (which can also be Connected objects. It does not require memory hungry calculations of presentation)
1242AIS_MultipleConnectedShape: Interactive Object connected to a list of interactive objects having a Shape (AIS_Shape, AIS_ConnectedShape, AIS_MultipleConnectedShape). The presentation of hidden parts is calculated automatically.
1244AIS_TexturedShape: Interactive Object that supports texture mapping. It is constructed as a usual AIS_Shape, but has additional methods that allow to map a texture on it.
1246MeshVS_Mesh: Interactive Object that represents meshes, it has a data source that provides geometrical information (nodes, elements) and can be built up from the source data with a custom presentation builder.
1248@subsubsection occt_1621831385_8103086093333 RELATIONS
1249The list is not exhaustive.
1259@subsubsection occt_1621831385_810308609444 DIMENSIONS
1269@subsubsection occt_1621831385_810308609555 MeshVS_Mesh
1270MeshVS_Mesh is an Interactive Object that represents meshes.
1271This object differs from the AIS_Shape as its geometrical data is supported by the data source (*MeshVS_DataSource*) that describes nodes and elements of the object. As a result, you can provide your own data source.
1272However, the *DataSource* does not provide any information on attributes, for example nodal colors, but you can apply them in a special way – by choosing the appropriate presentation builder.
1273The presentations of MeshVS_Mesh are built with the presentation builders (*MeshVS_PrsBuilder*). You can choose between the builders to represent the object in a different way. Moreover, you can redefine the base builder class and provide your own presentation builder.
1274You can add/remove builders using the following methods:
1275 * MeshVS_Mesh::AddBuilder
1276 (const Handle (MeshVS_PrsBuilder) &amp;Builder,
dba69de2 1277 Standard_Boolean TreatAsHilighter)
72b7576f 1278 * MeshVS_Mesh::RemoveBuilder (const Standard_Integer Index)
1279 * MeshVS_Mesh::RemoveBuilderById
1280 (const Standard_Integer Id)
1282There is a set of reserved display and highlighting mode flags for MeshVS_Mesh. Mode value is a number of bits that allows you to select additional display parameters and combine the following mode flags:
1283 * MeshVS_DMF_WireFrame
1284 * MeshVS_DMF_Shading
1285 * MeshVS_DMF_Shrink
1286base modes: display mesh in wireframe, shading, shrink modes.
1288 * MeshVS_DMF_VectorDataPrs
1289 * MeshVS_DMF_NodalColorDataPrs
1290 * MeshVS_DMF_ElementalColorDataPrs
1291 * MeshVS_DMF_TextDataPrs
1292 * MeshVS_DMF_EntitiesWithData
1293represent different kinds of data
1295 * MeshVS_DMF_DeformedPrsWireFrame
1296 * MeshVS_DMF_DeformedPrsShading
1297 * MeshVS_DMF_DeformedPrsShrink
1298display deformed mesh in wireframe, shading or shrink modes
1300 * MeshVS_DMF_SelectionPrs
1301 * MeshVS_DMF_HilightPrs
1302selection and hilighting
1304 * MeshVS_DMF_User
1305user-defined mode
1307These values will be used by the presentation builder.
1308There is also a set of selection modes flags that can be grouped in a combination of bits:
1309 * MeshVS_SMF_0D
1310 * MeshVS_SMF_Link
1311 * MeshVS_SMF_Face
1312 * MeshVS_SMF_Volume
1313 * MeshVS_SMF_Element
1314Element: 0D, Link, Face and Volume grouped as a bit mask
1316 * MeshVS_SMF_Node
1317 * MeshVS_SMF_All
1318All: Element and Node grouped as a bit mask
1320 * MeshVS_SMF_Mesh
1321 * MeshVS_SMF_Group
1323Such an object, for example, can be used for displaying the object, stored in the STL file format:
1324<h4>Example </h4>
1326**// read the data and create a data source**
1327Handle (StlMesh_Mesh) aSTLMesh = RWStl::ReadFile (aFileName);
1328Handle (XSDRAWSTLVRML_DataSource) aDataSource =
1329 new XSDRAWSTLVRML_DataSource (aSTLMesh);
1331**// create mesh**
1332Handle (MeshVS_Mesh) aMesh = new MeshVS();
1333aMesh-SetDataSource (aDataSource);
1335**// use default presentation builder**
1336Handle (MeshVS_MeshPrsBuilder) aBuilder =
dba69de2 1337 new MeshVS_MeshPrsBuilder (aMesh);
72b7576f 1338aMesh-AddBuilder (aBuilder, Standard_True);
1340MeshVS_NodalColorPrsBuilder allows you to represent a mesh with a color scaled texture mapped on it. To do this you should define a color map for the color scale, pass this map to the presentation builder, and define an appropriate value in the range of 0.0 – 1.0 for every node.
1341The following example demonstrates how you can do this (**please check,** if the view has been set up to display textures):
1342<h4>Example </h4>
1344**// assign nodal builder to the mesh**
1345Handle (MeshVS_NodalColorPrsBuilder) aBuilder =
dba69de2 1346 new MeshVS_NodalColorPrsBuilder
1347 (aMesh,MeshVS_DMF_NodalColorDataPrs | MeshVS_DMF_OCCMask);
72b7576f 1348aBuilder-UseTexture (Standard_True);
1350**// prepare color map**
1351Aspect_SequenceOfColor aColorMap;
1352aColorMap.Append ((Quantity_NameOfColor) Quantity_NOC_RED);
1353aColorMap.Append ((Quantity_NameOfColor) Quantity_NOC_BLUE1);
1355**// assign color scale map values (0..1) to nodes**
1356TColStd_DataMapOfIntegerReal aScaleMap;
dba69de2 1358** // iterate through the nodes and add an node id and an appropriate **
1359** // value to the map**
1360 aScaleMap.Bind (anId, aValue);
72b7576f 1362**// pass color map and color scale values to the builder**
1363aBuilder-SetColorMap (aColorMap);
1364aBuilder-SetInvalidColor (Quantity_NOC_BLACK);
1365aBuilder-SetTextureCoords (aScaleMap);
1366aMesh-AddBuilder (aBuilder, Standard_True);
dba69de2 1368@subsection occt_1621831385_810308609666 ANNEX II : Principles of Dynamic Selection
72b7576f 1369
1371The idea of dynamic selection is to represent the entities, which you want to select by a bounding box in the actual 2D space of the selection view. The set of these zones is ordered by a powerful sorting algorithm. To then find the applicative entities actually detected at this position, all you have to do is read which rectangles are touched at mouse position (X,Y) of the view, and judiciously reject some of the entities which have provided these rectangles.
1374@subsubsection occt_1621831385_81030860912222 How to go from the objects to 2D boxes
1377An intermediary stage consists in representing what you can make selectable by means of sensitive primitives and owners, entities of a high enough level to be known by the selector mechanisms.
1379The sensitive primitive is capable of:
1380 * giving a 2D bounding box to the selector.
1381 * answering the rejection criteria positively or negatively by a *Matches* function.
1382 * being projected from 3D in the 2D space of the view if need be.
1383 * returning the owner which it will represent in terms of selection.
1385A set of standard sensitive primitives exists in Select3D packages for 3D primitives, and Select2D for 2D primitives.
1387The owner is the entity, which makes it possible to link the sensitive primitives and the objects that you really wanted to detect. It stocks the diverse information, which makes it possible to find objects. An owner has a priority (*5* by default), which you can modulate, so as to make one entity more selectable than another.
dba69de2 1388@image html /user_guides/visualization/images/visualization_image021.jpg
1389@image latex /user_guides/visualization/images/visualization_image021.jpg
72b7576f 1390
1391@subsubsection occt_1621831385_81030860912341 Implementation in an interactive/selectable object
13931. Define the number of selection modes possible, i.e. what you want to identify by activating each of the selection modes. Example: for an interactive object representing a topological shape,
1394mode 0: selection of the interactive object itself
1395mode 1: selection of the vertices
1396mode 2: selection of the edges
1397mode 3: selection of the wires
1398mode 4: selection of the faces detectable
14002. For each selection mode of an interactive object, *model* the set of entities, which you want to locate by these primitives and these owners.
14023. There exists an *owner* root class, *SelectMgr_EntityOwne*r, containing a reference to a selectable object, which has created it. If you want to stock its information, you have to create classes derived from this root class. Example: for shapes, there is the *StdSelect_BRepOwner *class, which can save a TopoDS shape as a field as well as the Interactive Object.
14044. The set of sensitive primitives which has been calculated for a given mode is stocked in *SelectMgr_Selection*.
14065. For an Interactive object, the modeling is done in the *ComputeSelection *virtual function.
1408<h4>Example </h4>
1410Let an interactive object represent a box.
1411We are interested in having 2 location modes:
1412 * mode 0: location of the whole box.
1413 * mode 1: location of the edges on the box.
dba69de2 1415 For the first mode, all sensitive primitives will have the same owner, which will represent the interactive object. In the second case, we have to create an owner for each edge, and this owner will have to contain the index for the edge, which it represents. You will create a class of owner, which derives from *SelectMgr_EntityOwner*.
72b7576f 1416
1417The *ComputeSelection* function for the interactive box can have the following form:
1419void InteractiveBox::ComputeSelection
1420(const Handle(SelectMgr_Selection)&amp; Sel,
dba69de2 1421 const Standard_Integer Mode)
72b7576f 1422{
1424{ case 0: //locating the whole box by making its faces sensitive...
1426Handle(SelectMgr_EntityOwner) Ownr = new
dba69de2 1427 SelectMgr_EntityOwner(this,5);
72b7576f 1428for(Standard_Integer I=1;I=Nbfaces;I++)
1430//Array is a TColgp_Array1OfPnt: which represents the array of vertices. Sensitivity is
1431Select3D_TypeOfSensitivity value
dba69de2 1436 }
1437 case 1:
1438// locates the edges { for(Standard_Integer i=1;i=12;i++)
72b7576f 1439{
1440// 1 owner per edge...
1441Handle(mypk_EdgeOwner) Ownr =
1442new mypk_EdgeOwner(this,i,6);
1444Sel-Add(new Select3D_SensitiveSegment
dba69de2 1445 (Ownr,firstpt(i),lastpt(i)));
72b7576f 1446}
1453@subsubsection occt_1621831385_81030860912432 How It Works Concretely
1455Selectable objects are loaded in the selection manager, which has one or more selectors; in general, we suggest assigning one selector per viewer. All you have to do afterwards is to activate or deactivate the different selection modes for selectable objects. The *SelectionManager* looks after the call to the *ComputeSelection* functions for different objects. NOTE: This procedure is completely hidden if you use the interactive contexts of AIS (see section 3.3, Contexts)
1457<h4>Example </h4>
1459//We have several * interactive boxes * box1, box2, box3;
1461Handle(SelectMgr_SelectionManager) SM = new SelectMgr_SelectionManager();
1462Handle(StdSelect_ViewerSelector3d) VS = new StdSelect_ViewerSelector3d();
1466// box load.
1468// activates mode 0 of box 1 in the selector VS
1473// detection of primitives by mouse position.
1475Handle(EntityOwner) POwnr = VS-OnePicked();
1476// picking of the *best* owner detected
1481// picking of all owners detected
dba69de2 1482 }
72b7576f 1483SM-Deactivate(box1);
1484// deactivate all active modes of box1
dba69de2 1486@image html /user_guides/visualization/images/visualization_image022.jpg
1487@image latex /user_guides/visualization/images/visualization_image022.jpg
72b7576f 14881st activation of the box’s mode 1: calculation of sensitive primitives + 3D/2D projection + sorting
1490deactivation of mode: only updated by sorting
1492rotation of the view: only projection + sorting of active primitives
dba69de2 1494modification of the box - Recalculation of the active selection, recalculation flag on the inactive ones + 3D/2D projection + sorting
72b7576f 1495
1496@section occt_1621831385_1539918866 3D Presentations
1498@subsection occt_1621831385_15399188661 Glossary of 3D terms
1500@subsubsection occt_1621831385_153991886611 From Graphic3d
1504@subsubsection occt_1621831385_153991886612 From V3d
dba69de2 1507** **
72b7576f 1508
1510@subsection occt_1621831385_15399188662 Creating a 3D scene
1512To create 3D graphic objects and display them on the screen, follow the procedure below:
1513**1. **Create attributes.
1514**2. **Create a 3D viewer..
1515**3. **Create a view.
1516**4. **Create an interactive context.
1517**5. **Create interactive objects.
1518**6. **Create primitives in the interactive object
1519**7. **Display the interactive object.
1521@subsubsection occt_1621831385_153991886621 Create attributes
1523Create colors.
1524<h4>Example </h4>
1526Quantity_Color Black (Quantity_NOC_BLACK);
1527Quantity_Color Blue (Quantity_NOC_MATRABLUE);
1528Quantity_Color Brown (Quantity_NOC_BROWN4);
1529Quantity_Color Firebrick (Quantity_NOC_FIREBRICK);
1530Quantity_Color Forest (Quantity_NOC_FORESTGREEN);
1531Quantity_Color Gray (Quantity_NOC_GRAY70);
1533MyColor (0.99, 0.65, 0.31, Quantity_TOC_RGB);
1534Quantity_Color Beet (Quantity_NOC_BEET);
1535Quantity_Color White (Quantity_NOC_WHITE);
1539Create line attributes.
1541<h4>Example </h4>
1543Handle(Graphic3d_AspectLine3d) CTXLBROWN =
1544new Graphic3d_AspectLine3d ();
1545Handle(Graphic3d_AspectLine3d) CTXLBLUE =
1546new Graphic3d_AspectLine3d ();
1547Handle(Graphic3d_AspectLine3d) CTXLWHITE =
1548new Graphic3d_AspectLine3d();
1549CTXLBROWN-SetColor (Brown);
1550CTXLBLUE-SetColor (Blue);
1551CTXLWHITE-SetColor (White);
1554Create marker attributes.
1555<h4>Example </h4>
1557Handle(Graphic3d_AspectMarker3d) CTXMFIREBRICK =
1558new Graphic3d_AspectMarker3d();
1559CTXMFIREBRICK-SetColor (Firebrick);
1560CTXMFIREBRICK-SetScale (1.0);
1564Create facet attributes.
1565<h4>Example </h4>
1567Handle(Graphic3d_AspectFillArea3d) CTXF =
1568new Graphic3d_AspectFillArea3d ();
1569Graphic3d_MaterialAspect BrassMaterial
1571Graphic3d_MaterialAspect GoldMaterial
1573CTXF-SetInteriorStyle (Aspect_IS_SOLID);
1574CTXF-SetInteriorColor (MyColor);
1575CTXF-SetDistinguishOn ();
1576CTXF-SetFrontMaterial (GoldMaterial);
1577CTXF-SetBackMaterial (BrassMaterial);
1578CTXF-SetEdgeOn ();
1581Create text attributes.
1582<h4>Example </h4>
1584Handle(Graphic3d_AspectText3d) CTXT =
1585new Graphic3d_AspectText3d
1586(Forest, Graphic3d_NOF_ASCII_MONO, 1., 0.);
1588@subsubsection occt_1621831385_153991886622 Create a 3D Viewer (a Windows example)
1589<h4>Example </h4>
1591Handle(Graphic3d_WNTGraphicDevice) TheGraphicDevice = ...;
1592TCollection_ExtendedString aName(*3DV*);
1593myViewer =
1594new V3d_Viewer (TheGraphicDevice,aName.ToExtString (), **);
1595myViewer - SetDefaultLights ();
1596myViewer - SetLightOn ();
1597@subsubsection occt_1621831385_153991886623 Create a 3D view (a Windows example)
dba69de2 1599It is assumed that a valid Windows window may already be accessed via the method GetSafeHwnd().
72b7576f 1600<h4>Example </h4>
1604@subsubsection occt_1621831385_153991886624 Create an interactive context
1605<h4>Example </h4>
1607myAISContext = new AIS_InteractiveContext (myViewer);
1610You are now able to display interactive objects such as an AIS_Shape.
1611<h4>Example </h4>
1613TopoDS_Shape aShape = BRepAPI_MakeBox(10,20,30)_Solid();
1614Handle (AIS_Shape) aAISShape = new AIS_Shape(aShape);
1615myAISContext - Display (aAISShape);
1617@subsubsection occt_1621831385_153991886625 Create your own interactive object
1619Follow the procedure below to compute the presentable object:
1621**1. **Build a presentable object inheriting from AIS_InteractiveObject (refer to the Chapter on Presentable Objects).
1623**2. **Reuse the Prs3d_Presentation provided as an argument of the compute methods.
1626*There are two compute methods: one for a ‘standard representation, and the other for a ‘degenerated representation, i.e. in hidden line removal and wireframe modes.*
1627<h4>Example of the compute methods</h4>
1631(const Handle(PrsMgr_PresentationManager3d)&amp;
1633const Handle(Prs3d_Presentation)&amp; aPrs,
1634const Standard_Integer aMode)
1643(const Handle(Prs3d_Projector)&amp;,
1644const Handle(Prs3d_Presentation)&amp; aPrs)
1650@subsubsection occt_1621831385_153991886626 Create primitives in the interactive object
1652Get the group used in Prs3d_Presentation.
1653<h4>Example </h4>
1655Handle(Graphic3d_Group) TheGroup = Prs3d_Root::CurrentGroup(aPrs);
1658Update the group attributes.
1660<h4>Example </h4>
1662TheGroup - SetPrimitivesAspect(CTXLBLUE);
1665Create two triangles in group TheGroup.
1666<h4>Example </h4>
1668Standard_Integer aNbTria = 2;
1669Handle(Graphic3d_ArrayOfTriangles) aTriangles = new Graphic3d_ArrayOfTriangles(3 * aNbTria, 0, Standard_True);
1670Standard_Integer anIndex;
1671for (anIndex = 1; anIndex = aNbTria; nt++)
dba69de2 1673 aTriangles-AddVertex(anIndex * 5., 0., 0., 1., 1., 1.);
1674 aTriangles-AddVertex(anIndex * 5 + 5, 0., 0., 1., 1., 1.);
1675 aTriangles-AddVertex(anIndex * 5 + 2.5, 5., 0., 1., 1., 1.);
72b7576f 1676}
1677TheGroup-BeginPrimitives ();
1679TheGroup-EndPrimitives ();
1682The BeginPrimitives () and EndPrimitives () methods are used when creating a set of various primitives in the same group.
1683Use the polyline function to create a boundary box for the Struct structure in group TheGroup.
1684<h4>Example </h4>
1686Standard_Real Xm, Ym, Zm, XM, YM, ZM;
1687Struct-MinMaxValues (Xm, Ym, Zm, XM, YM, ZM);
1689Handle(Graphic3d_ArrayOfPolylines) aPolylines = new Graphic3d_ArrayOfPolylines(16, 4);
1690aPolylines-AddBound (4);
1691aPolylines-AddVertex (Xm, Ym, Zm);
1692aPolylines-AddVertex (Xm, Ym, ZM);
1693aPolylines-AddVertex (Xm, YM, ZM);
1694aPolylines-AddVertex (Xm, YM, Zm);
1695aPolylines-AddBound (4);
1696aPolylines-AddVertex (Xm, Ym, Zm);
1697aPolylines-AddVertex (XM, Ym, Zm);
1698aPolylines-AddVertex (XM, Ym, ZM);
1699aPolylines-AddVertex (XM, YM, ZM);
1700aPolylines-AddBound (4);
1701aPolylines-AddVertex (XM, YM, Zm);
1702aPolylines-AddVertex (XM, Ym, Zm);
1703aPolylines-AddVertex (XM, YM, Zm);
1704aPolylines-AddVertex (Xm, YM, Zm);
1705aPolylines-AddBound (4);
1706aPolylines-AddVertex (Xm, YM, ZM);
1707aPolylines-AddVertex (XM, YM, ZM);
1708aPolylines-AddVertex (XM, Ym, ZM);
1709aPolylines-AddVertex (Xm, Ym, ZM);
1711TheGroup-BeginPrimitives ();
1713TheGroup-EndPrimitives ();
1716Create text and markers in group TheGroup.
1717<h4>Example </h4>
dba69de2 1719static char *texte[3] = { *Application title*,
72b7576f 1720*My company*,
1721*My company address.* };
1722Graphic3d_Array1OfVertex Tpts8 (0, 1);
1723Tpts8(0).SetCoord (-40.0, -40.0, -40.0);
1724Tpts8(1).SetCoord (40.0, 40.0, 40.0);
1725TheGroup-MarkerSet (Tpts8);
1726Graphic3d_Vertex Marker (0.0, 0.0, 0.0);
1728for (i=0; i=2; i++) {
dba69de2 1729 Marker.SetCoord (-(Standard_Real)i*4 + 30,
1730 (Standard_Real)i*4,
1731 -(Standard_Real)i*4);
1732 TheGroup-Text (texte[i], Marker, 20.);
72b7576f 1733}
1735@section occt_1621831385_1435012457 3D Resources
1737The 3D resources include the Graphic3d and V3d packages.
1739@subsection occt_1621831385_14350124571 Graphic3D
1741@subsubsection occt_1621831385_143501245711 Overview
1743The **Graphic3d** package is used to create 3D graphic objects in a 3D viewer. These objects called **structures** are made up of groups of primitives and attributes. A group is the smallest editable element of a structure. A transformation can be applied to a structure. Structures can be connected to form a tree of structures, composed by transformations. Structures are globally manipulated by the viewer.
1745@subsubsection occt_1621831385_143501245712 Provided services
1747Graphic structures can be:
1748 * Displayed,
1749 * Highlighted,
1750 * Erased,
1751 * Transformed,
1752 * Connected to form a tree.
1753 There are classes for:
1754 * Visual attributes for lines, faces, markers, text, materials,
1755 * Vectors and vertices,
1756 * Defining an Advanced Graphic Device,
1757 * Graphic objects, groups, and structures.
1759@subsubsection occt_1621831385_143501245713 About the primitives
dba69de2 1760** **
1761** **Markers** **
72b7576f 1762 * Have one or more vertices,
1763 * Have a type, a scale factor, and a color,
1764 * Have a size, shape, and orientation independent of transformations.
1765*Polygons *
1766 * Have one closed boundary,
1767 * Have at least three vertices,
1768 * Are planar and have a normal,
1769 * Have interior attributes - style, color, front and back material, texture and reflection ratio,
1770 * Have a boundary with the following attributes - type, width scale factor, color. The boundary is only drawn when the interior style is hollow.
1772*Polygons with holes *
1773 * Have multiple closed boundaries, each one with at least three vertices,
1774 * Are planar and have a normal,
1775 * Have interior attributes - style, color, front and back material,
1776 * Have a boundary with the following attributes - type, width scale factor, color. The boundary is only drawn when the interior style is hollow.
1778*Polylines *
1779 * Have two or more vertices,
1780 * Have the following attributes - type, width scale factor, color.
1782*Text *
1783 * Has geometric and non-geometric attributes,
1784 * Geometric attributes - character height, character up vector, text path, horizontal and vertical alignment, orientation, three-dimensional position, zoomable flag
1785 * Non-geometric attributes - text font, character spacing, character expansion factor, color.
1787@subsubsection occt_1621831385_143501245714 Primitive arrays
1789Primitive arrays are a more efficient approach to describe and display the primitives from the aspects of memory usage and graphical performance. The key feature of the primitive arrays is that the primitive data is not duplicated. For example, two polygons could share the same vertices, so it is more efficient to keep the vertices in a single array and specify the polygon vertices with indices of this array. In addition to such kind of memory savings, the OpenGl graphics driver provides the Vertex Buffer Objects (VBO). VBO is a sort of video memory storage that can be allocated to hold the primitive arrays, thus making the display operations more efficient and releasing the RAM memory.
1791The Vertex Buffer Objects are enabled by default, but VBOs availability depends on the implementation of OpenGl. If the VBOs are unavailable or there is not enough video memory to store the primitive arrays, the RAM memory will be used to store the arrays.
1793The Vertex Buffer Objects can be disabled at the application level. You can use the following method to enable/disable VBOs:
1794 * void Graphic3d_GraphicDriver::EnableVBO
1795 (const Standard_Boolean status)
1797The following example shows how to disable the VBO support:
1798<h4>Example </h4>
1800**// get the graphic driver**
1801Handle (Aspect_GraphicDriver) aDriver =
dba69de2 1802 myAISContext-CurrentViewer()-Device()-GraphicDriver();
72b7576f 1803
1804**// disable VBO support**
1805Handle (Graphic3d_GraphicDriver)::
dba69de2 1806 DownCast (aDriver)-EnableVBO (Standard_False);
72b7576f 1807
1808**Please note** that the use of Vertex Buffer Objects requires the application level primitive data provided by the Graphic3d_ArrayOfPrimitives to be transferred to the video memory. TKOpenGl transfers the data and releases the Graphic3d_ArrayOfPrimitives internal pointers to the primitive data. Thus it might be necessary to pay attention to such kind of behaviour, as the pointers could be modified (nullified) by the TKOpenGl.
1810The different types of primitives could be presented with the following primitive arrays:
1811 * Graphic3d_ArrayOfPoints,
1812 * Graphic3d_ArrayOfPolygons,
1813 * Graphic3d_ArrayOfPolylines,
1814 * Graphic3d_ArrayOfQuadrangles,
1815 * Graphic3d_ArrayOfQuadrangleStrips,
1816 * Graphic3d_ArrayOfSegments,
1817 * Graphic3d_ArrayOfTriangleFans,
1818 * Graphic3d_ArrayOfTriangles,
1819 * Graphic3d_ArrayOfTriangleStrips.
1821The Graphic3d_ArrayOfPrimitives is a base class for these primitive arrays.
1823There is a set of similar methods to add vertices to the primitive array:
1824 * Standard_Integer Graphic3d_ArrayOfPrimitives::AddVertex
1826These methods take vertex coordinates as an argument and allow you to define the color, the normal and the texture coordinates assigned to the vertex. The return value is the actual number of vertices in the array.
1828You can also modify the values assigned to the vertex or query these values by the vertex index:
1829 * void Graphic3d_ArrayOfPrimitives::SetVertice
1830 * void Graphic3d_ArrayOfPrimitives::SetVertexColor
1831 * void Graphic3d_ArrayOfPrimitives::SetVertexNormal
1832 * void Graphic3d_ArrayOfPrimitives::SetVertexTexel
1833 * gp_Pnt Graphic3d_ArrayOfPrimitives::Verticie
dba69de2 1834 * gp_Dir Graphic3d_ArrayOfPrimitives::VertexNormal
72b7576f 1835 * gp_Pnt2d Graphic3d_ArrayOfPrimitives::VertexTexel
1836 * Quantity_Color Graphic3d_ArrayOfPrimitives::VertexColor
1837 * void Graphic3d_ArrayOfPrimitives::Verticie
1838 * void Graphic3d_ArrayOfPrimitives::VertexNormal
1839 * void Graphic3d_ArrayOfPrimitives::VertexTexel
1840 * void Graphic3d_ArrayOfPrimitives::VertexColor
1842The following example shows how to define an array of points:
1843<h4>Example </h4>
1845**// create an array**
1846Handle (Graphic3d_ArrayOfPoints) anArray =
dba69de2 1847 new Graphic3d_ArrayOfPoints (aVerticiesMaxCount);
72b7576f 1848
1849**// add vertices to the array**
1850anArray-AddVertex (10.0, 10.0, 10.0);
1851anArray-AddVertex (0.0, 10.0, 10.0);
1853**// add the array to the structure **
1854Handle (Graphic3d_Group) aGroup =
1855 Prs3d_Root::CurrentGroup (aPrs);
1856aGroup-BeginPrimitives ();
1857aGroup-AddPrimitiveArray (anArray);
1858aGroup-EndPrimitives ();
1860If the primitives share the same vertices (polygons, triangles, etc) then you can define them as indices of the vertices array. The following method allows you to define the primitives by the indices:
dba69de2 1861 * Standard_Integer Graphic3d_ArrayOfPrimitives::AddEdge
72b7576f 1862
1863This method adds an *edge* in the range [1, VertexNumber() ] in the array.
1864It is also possible to query the vertex defined by an edge:
1865 * Standard_Integer Graphic3d_ArrayOfPrimitives::Edge
1867The following example shows how to define an array of triangles:
1868<h4>Example </h4>
1870**// create an array**
1871Standard_Boolean IsNormals = Standard_False;
dba69de2 1872Standard_Boolean IsColors = Standard_False;
72b7576f 1873Standard_Boolean IsTextureCrds = Standard_False;
1874Handle (Graphic3d_ArrayOfTriangles) anArray =
dba69de2 1875 new Graphic3d_ArrayOfTriangles (aVerticesMaxCount,
1876 aEdgesMaxCount,
1877 IsNormals,
1878 IsColors,
1879 IsTextureCrds);
72b7576f 1880**// add vertices to the array**
dba69de2 1881anArray-AddVertex (-1.0, 0.0, 0.0); **// vertex 1**
1882anArray-AddVertex ( 1.0, 0.0, 0.0); **// vertex 2**
1883anArray-AddVertex ( 0.0, 1.0, 0.0); **// vertex 3**
1884anArray-AddVertex ( 0.0,-1.0, 0.0); **// vertex 4**
72b7576f 1885
1886**// add edges to the array**
dba69de2 1887anArray-AddEdge (1); **// first triangle**
72b7576f 1888anArray-AddEdge (2);
1889anArray-AddEdge (3);
dba69de2 1890anArray-AddEdge (1); **// second triangle**
72b7576f 1891anArray-AddEdge (2);
1892anArray-AddEdge (4);
1894**// add the array to the structure**
1895Handle (Graphic3d_Group) aGroup =
dba69de2 1896 Prs3d_Root::CurrentGroup (aPrs);
72b7576f 1897aGroup-BeginPrimitives ();
1898aGroup-AddPrimitiveArray (anArray);
1899aGroup-EndPrimitives ();
1901If the primitive array presents primitives built from sequential sets of vertices, for example polygons, then you can specify the bounds, or the number of vertices for each primitive. You can use the following method to define the bounds and the color for each bound:
1902 * Standard_Integer Graphic3d_ArrayOfPrimitives::AddBound
1904This method returns the actual number of bounds.
1905It is also possible to set the color and query the number of edges in the bound and bound color:
1906 * Standard_Integer Graphic3d_ArrayOfPrimitives::Bound
1907 * Quantity_Color Graphic3d_ArrayOfPrimitives::BoundColor
1908 * void Graphic3d_ArrayOfPrimitives::BoundColor
1910The following example shows how to define an array of polygons:
1911<h4>Example </h4>
1913**// create an array**
dba69de2 1914Standard_Boolean IsNormals = Standard_False;
72b7576f 1915Standard_Boolean IsVertexColors = Standard_False;
dba69de2 1916Standard_Boolean IsFaceColors = Standard_False;
1917Standard_Boolean IsTextureCrds = Standard_False;
72b7576f 1918Handle (Graphic3d_ArrayOfPolygons) anArray =
dba69de2 1919 new Graphic3d_ArrayOfPolygons (aVerticesMaxCount,
72b7576f 1920 aBoundsMaxCount,
1921 aEdgesMaxCount,
1922 IsNormals,
dba69de2 1923 IsVertexColors,
72b7576f 1924 IsFaceColors,
1925 IsTextureCrds);
1927**// add bounds to the array, first polygon**
1928anArray-AddBound (3);
dba69de2 1929anArray-AddVertex (-1.0, 0.0, 0.0);
1930anArray-AddVertex ( 1.0, 0.0, 0.0);
1931anArray-AddVertex ( 0.0, 1.0, 0.0);
72b7576f 1932
1933**// add bounds to the array, second polygon**
1934anArray-AddBound (4);
dba69de2 1935anArray-AddVertex (-1.0, 0.0, 0.0);
1936anArray-AddVertex ( 1.0, 0.0, 0.0);
1937anArray-AddVertex ( 1.0,-1.0, 0.0);
1938anArray-AddVertex (-1.0,-1.0, 0.0);
72b7576f 1939
1940**// add the array to the structure **
1941Handle (Graphic3d_Group) aGroup =
dba69de2 1942 Prs3d_Root::CurrentGroup (aPrs);
72b7576f 1943aGroup-BeginPrimitives ();
1944aGroup-AddPrimitiveArray (anArray);
1945aGroup-EndPrimitives ();
1947There are also several helper methods. You can get the type of the primitive array:
dba69de2 1948 * Graphic3d_TypeOfPrimitiveArray Graphic3d_ArrayOfPrimitives::Type
72b7576f 1949 * Standard_CString Graphic3d_ArrayOfPrimitives::StringType
1951and check if the primitive array provides normals, vertex colors, vertex texels (texture coordinates):
dba69de2 1952 * Standard_Boolean Graphic3d_ArrayOfPrimitives::HasVertexNormals
1953 * Standard_Boolean Graphic3d_ArrayOfPrimitives::HasVertexColors
1954 * Standard_Boolean Graphic3d_ArrayOfPrimitives::HasVertexTexels
72b7576f 1955
1956or get the number of vertices, edges and bounds:
dba69de2 1957 * Standard_Integer Graphic3d_ArrayOfPrimitives::VertexNumber
1958 * Standard_Integer Graphic3d_ArrayOfPrimitives::EdgeNumber
1959 * Standard_Integer Graphic3d_ArrayOfPrimitives::BoundNumber
72b7576f 1960
1961@subsubsection occt_1621831385_143501245715 About materials
1963A **material** is defined by coefficients of:
1964 * Transparency,
1965 * Diffuse reflection,
1966 * Ambient reflection,
1967 * Specular reflection.
1969Two properties define a given material:
1970 * Transparency
1971 * Reflection properties - its absorption and reflection of light.
1973**Diffuse reflection** is seen as a component of the color of the object.
1975**Specular reflection** is seen as a component of the color of the light source.
1977The following items are required to determine the three colors of reflection:
1978 * Color,
1979 * Coefficient of diffuse reflection,
1980 * Coefficient of ambient reflection,
1981 * Coefficient of specular reflection.
1985@subsubsection occt_1621831385_143501245716 About textures
1987A **texture **is defined by a name.
1988Three types of texture are available:
1989 * 1D,
1990 * 2D,
1991 * Environment mapping.
1993@subsubsection occt_1621831385_143501245717 Graphic3d text
1995The OpenGl graphics driver uses advanced text rendering powered by FTGL library. This library provides vector text rendering, as a result the text can be rotated and zoomed without quality loss.
1996Graphic3d text primitives have the following features:
1997 * fixed size (non-zoomable) or zoomable,
1998 * can be rotated to any angle in the view plane,
1999 * support unicode charset.
2001The text attributes for the group could be defined with the Graphic3d_AspectText3d attributes group.
2002To add any text to the graphic structure you can use the following methods:
dba69de2 2003 * void Graphic3d_Group::Text
72b7576f 2004(const Standard_CString AText,
dba69de2 2005 const Graphic3d_Vertex&amp; APoint,
2006 const Standard_Real AHeight,
2007 const Quantity_PlaneAngle AAngle,
2008 const Graphic3d_TextPath ATp,
2009 const Graphic3d_HorizontalTextAlignment AHta,
2010 const Graphic3d_VerticalTextAlignment AVta,
2011 const Standard_Boolean EvalMinMax),
72b7576f 2012AText parameter is the text string, APoint is the three-dimensional position of the text, AHeight is the text height, AAngle is the orientation of the text (at the moment, this parameter has no effect, but you can specify the text orientation through the Graphic3d_AspectText3d attributes).
2013ATp parameter defines the text path, AHta is the horizontal alignment of the text, AVta is the vertical alignment of the text.
2014You can pass Standard_False as EvalMinMax if you don’t want the graphic3d structure boundaries to be affected by the text position.
2015**Please note** that the text orientation angle can be defined by Graphic3d_AspectText3d attributes.
2017 * void Graphic3d_Group::Text
2018(const Standard_CString AText,
dba69de2 2019 const Graphic3d_Vertex&amp; APoint,
2020 const Standard_Real AHeight,
2021 const Standard_Boolean EvalMinMax)
72b7576f 2022 * void Graphic3d_Group::Text
2023(const TCcollection_ExtendedString &amp;AText,
2024const Graphic3d_Vertex&amp; APoint,
dba69de2 2025 const Standard_Real AHeight,
2026 const Quantity_PlaneAngle AAngle,
2027 const Graphic3d_TextPath ATp,
2028 const Graphic3d_HorizontalTextAlignment AHta,
2029 const Graphic3d_VerticalTextAlignment AVta,
2030 const Standard_Boolean EvalMinMax)
72b7576f 2031 * void Graphic3d_Group::Text
2032(const TCcollection_ExtendedString &amp;AText,
dba69de2 2033 const Graphic3d_Vertex&amp; APoint,
2034 const Standard_Real AHeight,
2035 const Standard_Boolean EvalMinMax)
72b7576f 2036
2037<h4>Example </h4>
2039**// get the group**
2040Handle (Graphic3d_Group) aGroup =
dba69de2 2041 Prs3d_Root::CurrentGroup (aPrs);
72b7576f 2042
2043**// change the text aspect**
2044Handle(Graphic3d_AspectText3d) aTextAspect =
dba69de2 2045 new Graphic3d_AspectText3d ();
72b7576f 2046aTextAspect-SetTextZoomable (Standard_True);
2047aTextAspect-SetTextAngle (45.0);
2048aGroup-SetPrimitivesAspect (aTextAspect);
2050**// add a text primitive to the structure**
2051Graphic3d_Vertex aPoint (1, 1, 1);
2052aGroup-Text (Standard_CString (*Text*), aPoint, 16.0);
2055@subsubsection occt_1621831385_143501245718 Display priorities
2057Structure display priorities control the order in which structures are drawn. When you display a structure you specify its priority. The lower the value, the lower the display priority. When the display is regenerated the structures with the lowest priority are drawn first. For structures with the same display priority the order in which they were displayed determines the drawing order. CAS.CADE supports eleven structure display priorities.
2059@subsubsection occt_1621831385_143501245719 About structure hierarchies
2061The root is the top of a structure hierarchy or structure network. The attributes of a parent structure are passed to its descendants. The attributes of the descendant structures do not affect the parent. Recursive structure networks are not supported.
2063@subsection occt_1621831385_14350124572 V3d
2064@subsubsection occt_1621831385_143501245721 Overview
2065The **V3d** package provides the resources to define a 3D viewer and the views attached to this viewer (orthographic, perspective). This package provides the commands to manipulate the graphic scene of any 3D object visualized in a view on screen.
2066A set of high-level commands allows the separate manipulation of parameters and the result of a projection (Rotations, Zoom, Panning, etc.) as well as the visualization attributes (Mode, Lighting, Clipping, Depth-cueing, etc) in any particular view.
2068@subsubsection occt_1621831385_143501245722 Provided services
2069The V3d package is basically a set of tools directed by commands from the viewer front-end. This tool set contains methods for creating and editing classes of the viewer such as:
2070 * Default parameters of the viewer,
2071 * Views (orthographic, perspective),
2072 * Lighting (positional, directional, ambient, spot, headlight),
2073 * Clipping planes (note that only Z-clipping planes can work with the Phigs interface),
2074 * Instantiated sequences of views, planes, light sources, graphic structures, and picks,
2075 * Various package methods.
2077@subsubsection occt_1621831385_143501245723 A programming example
2078<h4>Example </h4>
2080This sample TEST program for the V3d Package uses primary packages Xw and Graphic3d and secondary packages Visual3d, Aspect, Quantity, Phigs, math.
2082**//Create a Graphic Device from the default DISPLAY **
2083Handle(Graphic3d_GraphicDevice) GD =
2084new Graphic3d_GraphicDevice(**) ;
2086**// Create a Viewer to this Device **
2087Handle(V3d_Viewer) VM = new V3d_Viewer(GD, 400.,
2088// Space size
2089V3d_Xpos,// Default projection Quantity_NOC_DARKVIOLET,
2090// Default background
2092// Type of visualization
2094// Shading model
2096// Update mode
2097**// Create a structure in this Viewer **
2098Handle(Graphic3d_Structure) S =
2099new Graphic3d_Structure(VM-Viewer()) ;
2101**// Type of structure **
2102S-SetVisual (Graphic3d_TOS_SHADING);
2104**// Create a group of primitives in this structure**
2105Handle(Graphic3d_Group) G = new Graphic3d_Group(S) ;
2107**// Fill this group with one polygon of size 100**
2108Graphic3d_Array1OfVertex Points(0,3) ;
2109Points(0).SetCoord(-100./2.,-100./2.,-100./2.) ;
2110Points(1).SetCoord(-100./2., 100./2.,-100./2.) ;
2111Points(2).SetCoord( 100./2., 100./2.,-100./2.) ;
2112Points(3).SetCoord( 100./2.,-100./2.,-100./2.) ; Normal.SetCoord(0.,0.,1.) ;
2113G-Polygon(Points,Normal) ;
2115**// Create Ambient and Infinite Lights in this Viewer**
2116Handle(V3d_AmbientLight) L1 = new V3d_AmbientLight
2117(VM,Quantity_NOC_GRAY50) ;
2118Handle(V3d_DirectionalLight) L2 = new V3d_DirectionalLight
2119(VM,V3d_XnegYnegZneg,Quantity_NOC_WHITE) ;
2121**// Create a 3D quality Window from the same GraphicDevice**
2122Handle(Xw_Window) W =
2123new Xw_Window(GD,*Test V3d*,0.5,0.5,0.5,0.5) ;
2125**// Map this Window to this screen**
dba69de2 2126 W-Map() ;
72b7576f 2127
2128**// Create a Perspective View in this Viewer**
2129Handle(V3d_PerspectiveView) V =
2130new V3d_PerspectiveView(VM);
2132**// Set the Eye position**
2133V-SetEye(100.,100.,100.) ;
2135**// Associate this View with the Window **
2136V-SetWindow(W) ;
2138**// Activate ALL defined Lights in this View **
2139V-SetLightOn() ;
2141**// Display ALL structures in this View **
2142(VM-Viewer())-Display() ;
2144**// Finally update the Visualization in this View **
2145V-Update() ;
2147@subsubsection occt_1621831385_143501245724 Glossary of view transformations
2148The following terms are used to define view orientation, i.e. transformation from World Coordinates (WC) to the View Reference Coordinates system (VRC)
2150The following terms are used to define view mapping, i.e. transformation from View Reference Coordinates (VRC) to the Normalized Projection Coordinates (NPC)
2152The V3d_View API uses the following terms to define view orientation and mapping
2155@subsubsection occt_1621831385_143501245725 Management of perspective projection
2156The perspective projection allows definition of viewing volume as a truncated pyramid (frustum) with apex at the Projection Reference Point. In the View Reference Coordinate system it can be presented by the following picture:
dba69de2 2158@image html /user_guides/visualization/images/visualization_image023.png
2159@image latex /user_guides/visualization/images/visualization_image023.png
2161@image html /user_guides/visualization/images/visualization_image024.png
2162@image latex /user_guides/visualization/images/visualization_image024.png
72b7576f 2163Figure 1 View Reference Coordinate System, perspective viewing volume and view mapping parameters
2165During panning, window limits are changed, as if a sort of *frame* through which the user sees a portion of the view plane was moved over the view. The perspective frustum itself remains unchanged.
2167The perspective projection is defined by two parameters:
2168 * **Depth** value defines distance between Projection Reference Point and the nearest (front) clipping plane.
2169 * **ZSize** defines distance between Front and Back clipping planes. The influence of this parameter is caused by the OCCT specific to center viewing volume around View Reference Point so the front and back plane distances were the same: FPD = BPD = ZSize / 2.
2170**Note** that the closer the displayed object to the Projection Reference Point the more visible its perspective distortion. Thus, in order to get a good perspective it is recommended to set ZSize value comparable with the expected model size and small Depth value.
2172However, very small Depth values might lead to inaccuracy of *fit all* operation and to non-realistic perspective distortion.
2173<h4>Example </h4>
2175**// Create a Perspective View in Viewer VM**
2176Handle(V3d_PerspectiveView) V =
2177new V3d_PerspectiveView(VM);
2179**// Set the ZSize **
2180V-SetZSize(2000.) ;
2182**// Set the Depth value**
2183V-SetDepth(20.) ;
2185**// Set the current mapping as default**
2186**// to be used by Reset() operation**
2187V-SetViewMappingDefault() ;
2189As an alternative to manual setting of perspective parameters the *V3d_View::DepthFitAll* function can be used.
2190<h4>Example </h4>
dba69de2 2192**// Display shape in Viewer VM**
72b7576f 2193Handle(AIS_InteractiveContext) aContext =
2194new AIS_InteractiveContext(VM);
2197**// Create a Perspective View in Viewer VM**
2198Handle(V3d_PerspectiveView) V =
2199new V3d_PerspectiveView(VM);
2201**// Set automatically the perspective parameters**
2202V-DepthFitAll() ;
2204**// Fit view to object size **
2207**// Set the current mapping as default**
2208**// to be used by Reset() operation**
2209V-SetViewMappingDefault() ;
2212It is necessary to take into account that during rotation Z size of the view might be modified automatically to fit the model into the viewing volume.
2213Make sure the Eye point never gets between the Front and Back clipping planes.
2214In perspective view, changing Z size results in changed perspective effect. To avoid this, an application should specify the maximum expected Z size using V3d_View::SetZSize() method in advance.
2215V3d_View::FitAll() with FitZ = Standard_True and V3d_View::ZFitAll() also change the perspective effect and should therefore be used with precautions similar to those for rotation.
2217@subsubsection occt_1621831385_143501245726 Underlay and overlay layers management
2218In addition to interactive 3d graphics displayed in the view you can display an underlying and overlying graphics: text, color scales, drawings.
2220All of the v3d view’s graphical objects in the overlay are managed by the default layer manager (*V3d_LayerMgr*). The v3d view has a basic layer manager capable of displaying the color scale, but you can redefine this class to provide your own overlay and underlay graphics.
2222You can assign your own layer manager to the v3d view using the following method:
2223 * void V3d_View::SetLayerMgr
2224(const Handle (V3d_LayerMgr)&amp; aMgr)
2226There are three virtual methods to prepare graphics in the manager for further drawing (set up layer dimensions, draw static graphics). These methods could be redefined:
2227 * void V3d_LayerMgr::Begin ()
2228 * void V3d_LayerMgr::Redraw ()
2229 * void V3d_LayerMgr::End ()
2231The layer manager controls layers* *(*Visual3d_Layer*) and layer items* *(*Visual3d_LayerItem*). Both the overlay and underlay layers can be created by the layer manager.
2233The layer entity is presented by the *Visual3d_Layer* class. This entity provides drawing services in the layer, for example:
2234 * void Visual3d_Layer::DrawText
2235 * void Visual3d_Layer::DrawRectangle
2236 * void Visual3d_Layer::SetColor
2237 * void Visual3d_Layer::SetViewport
2239The following example demonstrates how to draw overlay graphics by the V3d_LayerMgr:
2240<h4>Example </h4>
2242**// redefined method of V3d_LayerMgr**
2243void MyLayerMgr::Redraw ()
dba69de2 2245 Quantity_Color aRed (Quantity_NOC_RED);
2246 myOverlayLayer-SetColor (aRed);
2247 myOverlayLayer-DrawRectangle (0, 0, 100, 100);
72b7576f 2248}
2250The layer contains layer items that will be displayed on view redraw. Such items are the Visual3d_LayerItem entities. To manipulate Visual3d_LayerItem entities assigned to the layer’s internal list you can use the following methods:
2251 * void Visual3d_Layer::AddLayerItem
2252(const Handle (Visual3d_LayerItem)&amp; Item)
2253 * void Visual3d_Layer::RemoveLayerItem
dba69de2 2254(const Handle (Visual3d_LayerItem)&amp; Item)
72b7576f 2255 * void Visual3d_Layer::RemoveAllLayerItems ()
2256 * const Visual3d_NListOfLayerItem&amp;
dba69de2 2257Visual3d_Layer::GetLayerItemList ()
72b7576f 2258
2259The layer’s items are rendered when the following method is called by the graphical driver:
2260 * void Visual3d_Layer::RenderLayerItems ()
2262The *Visual3d_LayerItem* has virtual methods that are used to render the item:
2263 * void Visual3d_LayerItem::RedrawLayerPrs ()
2264 * void Visual3d_LayerItem::ComputeLayerPrs ()
2266The item’s presentation can be computed before drawing by the ComputeLayerPrs method to save time on redraw. It also has an additional flag that is used to tell that the presentation should be recomputed:
2267 * void Visual3d_LayerItem::SetNeedToRecompute
2268(const Standard_Boolean NeedToRecompute)
2269 * Standard_Boolean Visual3d_LayerItem::IsNeedToRecompute
2271An example of Visual3d_LayerItem is *V3d_ColorScaleLayerItem* that represents the color scale entity as the layer’s item.
2272The *V3d_ColorScaleLayerItem* sends render requests to the color scale entity represented by it. As this entity (*V3d_ColorScale*) is assigned to the *V3d_LayerMgr* it uses its overlay layer’s services for drawing:
2273<h4>Example </h4>
2275**// tell V3d_ColorScale to draw itself**
2276void V3d_ColorScaleLayerItem::RedrawLayerPrs ()
dba69de2 2278 Visual3d_LayerItem::RedrawLayerPrs ()
2279 if (!MyColorScale.IsNull ())
2280 MyColorScale-DrawScale ();
72b7576f 2281}
2283**// V3d_ColorScale has a reference to a LayerMgr**
2284void V3d_ColorScale::DrawScale ()
dba69de2 2286 **// calls *V3d_ColorScale::PaintRect, V3d_ColorScale::PaintText*, etc …**
72b7576f 2287}
2289**// PaintRect method uses overlay layer of LayerMgr to draw a rectangle **
2290void V3d_ColorScale::PaintRect
dba69de2 2291 (const Standard_Integer X, const Standard_Integer Y,
2292 const Standard_Integer W, const Standard_Integer H,
2293 const Quantity_Color aColor,
2294 const Standard_Boolean aFilled)
72b7576f 2295{
dba69de2 2296 const Handle (Visual3d_Layer)&amp; theLayer =
72b7576f 2297 myLayerMgr-Overlay ();
2298** …**
dba69de2 2300** **theLayer-SetColor (aColor);
2301 theLayer-DrawRectangle (X, Y, W, H);
72b7576f 2302** …**
2306@subsubsection occt_1621831385_143501245727 View background styles
2307There are three types of background styles available for V3d_view: solid color, gradient color and image.
2309To set solid color for the background you can use the following methods:
2310 * void V3d_View::SetBackgroundColor
2311(const Quantity_TypeOfColor Type,
dba69de2 2312 const Quantity_Parameter V1,
2313 const Quantity_Parameter V2,
2314 const Quantity_Parameter V3)
72b7576f 2315This method allows you to specify the background color in RGB (red, green, blue) or HLS (hue, lightness, saturation) color spaces, so the appropriate values of the Type parameter are Quantity_TOC_RGB and Quantity_TOC_HLS. **Note** that the color value parameters V1,V2,V3 should be in the range between 0.0-1.0.
2317 * void V3d_View::SetBackgroundColor
2318(const Quantity_Color &amp;Color)
2319 * void V3d_View::SetBackgroundColor
2320(const Quantity_NameOfColor Name)
2322The gradient background style could be set up with the following methods:
2323 * void V3d_View::SetBgGradientColors
2324(const Quantity_Color&amp; Color1,
dba69de2 2325 const Quantity_Color&amp; Color2,
2326 const Aspect_GradientFillMethod FillStyle,
2327 const Standard_Boolean update)
72b7576f 2328 * void V3d_View::SetBgGradientColors
2329(const Quantity_NameOfColor Color1,
dba69de2 2330 const Quantity_NameOfColor Color2,
2331 const Aspect_GradientFillMethod FillStyle,
2332 const Standard_Boolean update)
72b7576f 2333The Color1 and Color2 parameters define the boundary colors of interpolation, the FillStyle parameter defines the direction of interpolation. You can pass Standard_True as the last parameter to update the view.
2335The fill style can be also set with the following method:
2336 * void V3d_View::SetBgGradientStyle
2337(const Aspect_GradientFillMethod AMethod,
2338const Standard_Boolean update)
2340To get the current background color you can use the following methods:
2341 * void V3d_View::BackgroundColor
2342(const Quantity_TypeOfColor Type,
dba69de2 2343 Quantity_Parameter &amp;V1,
2344 Quantity_Parameter &amp;V2,
2345 Quantity_Parameter &amp;V3)
72b7576f 2346 * Quantity_Color V3d_View::BackgroundColor()
2347 * void V3d_View::GradientBackgroundColors
2348(Quantity_Color&amp; Color1,
dba69de2 2349 Quantity_Color&amp; Color2)
72b7576f 2350 * Aspect_GradientBackground GradientBackground()
2352To set the image as a background and change the background image style you can use the following methods:
2353 * void V3d_View::SetBackgroundImage
2354(const Standard_CString FileName,
dba69de2 2355 const Aspect_FillMethod FillStyle,
2356 const Standard_Boolean update)
72b7576f 2357 * void V3d_View::SetBgImageStyle
2358(const Aspect_FillMethod FillStyle,
dba69de2 2359 const Standard_Boolean update)
72b7576f 2360
2361The FileName parameter defines the image file name and the path to it, the FillStyle parameter defines the method of filling the background with the image. The methods are:
dba69de2 2362 * Aspect_FM_NONE: draw the image in the default position
72b7576f 2363 * Aspect_FM_CENTERED: draw the image at the center of the view
2364 * Aspect_FM_TILED: tile the view with the image
2365 * Aspect_FM_STRETCH: stretch the image over the view
2367@subsubsection occt_1621831385_143501245728 User-defined clipping planes
2368The ability to define custom clipping planes could be very useful for some tasks. The v3d view provides such an opportunity.
2370The V3d_Plane class provides the services of clipping planes: it holds the plane equation coefficients and provides its graphical representation. To set and get plane equation coefficients you can use the following methods:
2371 * void V3d_Plane::SetPlane
2372(const Quantity_Parameter A,
dba69de2 2373 const Quantity_Parameter B,
2374 const Quantity_Parameter C,
2375 const Quantity_Parameter D)
72b7576f 2376 * void V3d_Plane::Plane
2377(Quantity_Parameter&amp; A,
dba69de2 2378 Quantity_Parameter&amp; B,
2379 Quantity_Parameter&amp; C,
2380 Quantity_Parameter&amp; D)
72b7576f 2381
dba69de2 2382 V3d_Plane also provides display services:
72b7576f 2383 * void V3d_Plane::Display
2384(const Handle(V3d_View)&amp; aView,
dba69de2 2385 const Quantity_Color&amp; aColor)
72b7576f 2386 * void V3d_Plane::Erase ()
2387 * Standard_Boolean V3d_Plane::IsDisplayed ()
2388The Display method could be redefined to provide custom representation of the clipping plane.
2390The clipping planes could be activated with the following methods:
2391 * void V3d_View::SetPlaneOn
2392(const Handle(V3d_Plane)&amp; MyPlane)
2393 * void V3d_View::SetPlaneOn ()
2394The first method appends the given V3d_Plane to the internal list of user-defined clipping planes of a view and activates it. If the plane is already in the list, it becomes activated. The second method activates all of the planes defined for the view.
2396The clipping planes could be deactivated with the similar methods:
2397 * void V3d_View::SetPlaneOff
2398(const Handle(V3d_Plane)&amp; MyPlane)
2399 * void V3d_View::SetPlaneOff ()
2401The only difference is that these methods remove the user-defined clipping planes from the internal list. Thus, the view retains only active clipping planes.
2403You can iterate through the active planes using the following methods:
2404 * void V3d_View::InitActivePlanes ()
2405sets the iterator to the beginning of the internal list of clipping planes
2406 * Standard_Boolean V3d_View::MoreActivePlanes ()
2407returns Standard_True if there are more active planes to return
2408 * void V3d_View::NextActivePlanes ()
2409sets the iterator to the next active plane in the list
2410 * Handle(V3d_Plane) V3d_View::ActivePlane ()
2411returns the active plane
2413or check if a certain clipping plane has been activated:
2414 * Standard_Boolean V3d_View::IsActivePlane
2415(const Handle (V3d_Plane)&amp; aPlane)The number of clipping planes is limited. The following method allows you to check if it is possible to activate at least one more plane in the view or the limit has been reached:
2416 * Standard_Boolean V3d_View::IfMorePlanes ()
2417<h4>Example </h4>
2419**// try to use an existing clipping plane or create a new one**
2420Handle(V3d_Plane) aCustomPlane;
2421myView-InitActivePlanes ();
2422if (myView-MoreActivePlanes ())
dba69de2 2423 aCustomPlane = myView-ActivePlane ();
72b7576f 2424else
dba69de2 2425 aCustomPlane = new V3d_Plane ();
72b7576f 2426
2427**// calculate new coefficients**
2428Standard_Real a, b, c, d;
2429Standard_Real x = 0.0, y = 0.0, z = 10.0;
2430Standard_Real dx = 0.0, dy = 0.0, dz = 1.0;
2431gp_Pln aPln (gp_Pnt (x, y, z), gp_Dir (dx, dy, dz));
2432aPln.Coefficients (a, b, c, d);
2434**// update plane**
2435aCustomPlane-SetPlane (a, b, c, d);
2436myView-SetPlaneOn (aCustomPlane);
2438@subsubsection occt_1621831385_143501245729 Dumping a 3D scene into an image file
2439The 3D scene displayed in the view could be dumped in high resolution into an image file. The high resolution (8192x8192 on some implementations) is achieved using the Frame Buffer Objects (FBO) provided by the graphic driver. Frame Buffer Objects enable off-screen rendering into a virtual view to produce images in the background mode (without displaying any graphics on the screen).
2441The V3d_View has the following methods for dumping the 3D scene:
2442 * Standard_Boolean V3d_View::Dump
2443(const Standard_CString theFile,
dba69de2 2444 const Image_TypeOfImage theBufferType)
72b7576f 2445 * Standard_Boolean V3d_View::Dump
2446(const Standard_CString theFile,
dba69de2 2447 const Aspect_FormatOfSheetPaper theFormat,
2448 const Image_TypeOfImage theBufferType)
72b7576f 2449These methods dump the 3D scene into an image file passed by its name and path as theFile.
2450The raster image data handling algorithm is based on the Image_PixMap class. The supported extensions are *.png*, *.bmp*, *.jpg*, *.png*.
2451The first method dumps the scene into an image file with the view dimensions. The second method allows you to make the dimensions of the output image compatible to a certain format of printing paper passed by theFormat argument.
2452The value passed as theBufferType argument defines the type of the buffer for an output image (RGB, RGBA, floating-point, RGBF, RGBAF). Both methods return Standard_True if the scene has been successfully dumped.
2453**Please note** that dumping the image for a paper format with large dimensions is a memory consuming operation, it might be necessary to take care of preparing enough free memory to perform this operation.
2455 * Handle_Image_PixMap V3d_View::ToPixMap
2456(const Standard_Integer theWidth,
dba69de2 2457 const Standard_Integer theHeight,
2458 const Image_TypeOfImage theBufferType,
2459 const Standard_Boolean theForceCentered)
72b7576f 2460This method allows you to dump the displayed 3d scene into a pixmap with a width and height passed as theWidth and theHeight arguments.
2461The value passed as theBufferType argument defines the type of the buffer for a pixmap (RGB, RGBA, floating-point, RGBF, RGBAF).
2462The last parameter allows you to center the 3D scene on dumping.
2464All these methods assume that you have created a view and displayed a 3d scene in it. However, the window used for such a view could be virtual, so you can dump the 3d scene in the background mode without displaying it on the screen. To use such an opportunity you can perform the following steps:
24651) Create a graphic device;
24662) Create a window;
24673) Set up the window as virtual, Aspect_Window::SetVirtual ();
24684) Create a view and an interactive context;
24695) Assign the virtual window to the view;
24706) Display a 3D scene;
24717) Use one of the functions described above to dump the 3D scene.
2473The following example demonstrates this procedure for the WNT_Window:
2474<h4>Example </h4>
2476**// create a graphic device**
2477Handle (WNT_GraphicDevice) aDevice =
dba69de2 2478 new Graphic3d_WNTGraphicDevice ();
72b7576f 2479
2480**// create a window**
dba69de2 2481Standard_Integer aDefWidth = 800;
72b7576f 2482Standard_Integer aDefHeight = 600;
2483Handle (WNT_WClass) aWClass =
dba69de2 2484 new WNT_WClass (*Virtual Class*,DefWindowProc,
72b7576f 2485 CS_VREDRAW | CS_HREDRAW, 0, 0,
2486 ::LoadCursor (NULL, IDC_ARROW));
2487Handle (WNT_Window) aWindow =
dba69de2 2488 new WNT_Window (aDevice, *VirtualWnd*, aWClass,
72b7576f 2489 WS_OVERLAPPEDWINDOW, 0, 0,
2490 aDefWidth, aDefHeight);
2492**// set up the window as virtual**
2493aWindow-SetVirtual (Standard_True);
2495**// create a view and an interactive context**
2496Handle (V3d_Viewer) aViewer =
2497 new V3d_Viewer (aDevice,
2498 Standard_ExtString (*Virtual*));
2499Handle (AIS_InteractiveContext) aContext =
2500 new AIS_InteractiveContext (aViewer);
2501Handle (V3d_View) aView = aViewer-CreateView ();
2503**// assign the virtual window to the view**
2504aView-SetWindow (aWindow);
2506**// display a 3D scene**
2507Handle (AIS_Shape) aBox =
2508 new AIS_Shape (BRepPrimAPI_MakeBox (5, 5, 5));
2509aContext-Display (aBox);
2512**// dump the 3D scene into an image file**
2513aView-Dump (*3dscene.png*);
2515@subsubsection occt_1621831385_1435012457210 Printing a 3D scene
2516The contents of a view can be printed out. Moreover, the OpenGl graphic driver used by the v3d view supports printing in high resolution. The print method uses the OpenGl frame buffer (Frame Buffer Object) for rendering the view contents and advanced print algorithms that allow printing in, theoretically, any resolution.
2518The following method prints the view contents:
2519 * void V3d_View::Print
2520(const Aspect_Handle hPrnDC,
dba69de2 2521 const Standard_Boolean showDialog,
2522 const Standard_Boolean showBackground,
2523 const Standard_CString filename,
2524 const Aspect_PrintAlgo printAlgorithm)
72b7576f 2525The hPrnDC is the printer device handle. You can pass your own printer handle or *NULL* to select the printer by the default dialog. In that case you can use the default dialog or pass *Standard_False* as the showDialog argument to select the default printer automatically.
2526You can define the filename for the printer driver if you want to print out the result into a file.
2527If you do not want to print the background, you can pass *Standard_False* as the showBackground argument.
2528The printAlgorithm argument allows you to choose between two print algorithms that define how the 3d scene is mapped to the print area when the maximum dimensions of the frame buffer are smaller than the dimensions of the print area. You can pass the following values as the printAlgorithm argument:
2529 * Aspect_PA_STRETCH,
2530 * Aspect_PA_TILE
2532The first value defines the stretch algorithm: the scene is drawn with the maximum possible frame buffer dimensions and then is stretched to the whole printing area. The second value defines TileSplit algorithm: covering the whole printing area by rendering multiple parts of the viewer.
2534**Please note** that at the moment printing is implemented only for Windows.
2536@subsubsection occt_1621831385_1435012457211 Vector image export
2537The 3D content of a view can be exported to the vector image file format. The vector image export is powered by the GL2PS library. You can export your 3D scenes into a file format supported by the GL2PS library: PostScript (PS), Encapsulated PostScript (EPS), Portable Document Format (PDF), Scalable Vector Graphics (SVG), LaTeX file format and Portable LaTeX Graphics (PGF).
2539The following method of Visual3d_View class allows you to export your 3D scene:
2540 * void Visual3d_View::Export
2541(const Standard_CString FileName,
dba69de2 2542 const Graphic3d_ExportFormat Format,
2543 const Graphic3d_SortType aSortType,
2544 const Standard_Real Precision,
2545 const Standard_Address ProgressBarFunc,
2546 const Standard_Address ProgressObject)
72b7576f 2547The FileName defines the output image file name and the Format argument defines the output file format:
2548 * Graphic3d_EF_PostScript (PS),
2549 * Graphic3d_EF_EhnPostScript (EPS),
2550 * Graphic3d_EF_TEX (TEX),
2551 * Graphic3d_EF_PDF (PDF),
2552 * Graphic3d_EF_SVG (SVG),
2553 * Graphic3d_EF_PGF (PGF)
2555The aSortType parameter defines the GL2PS sorting algorithm for the primitives. The Precision, ProgressBarFunc and ProgressObject parameters are implemented for future uses and at the moment have no effect.
2557The Export method supports only basic 3d graphics and has several limitations:
2558 * Rendering large scenes could be slow and can lead to large output files;
2559 * Transparency is only supported for PDF and SVG output;
2560 * Textures and some effects are not supported by the GL2PS library.
2561@section occt_1621831385_1090976821 2D Presentations
2562@subsection occt_1621831385_10909768211 Glossary of 2D terms
2564@subsubsection occt_1621831385_10909768212 Creating a 2D scene
2566To create 2D graphic objects and display them on the screen, follow the procedure below:
2567**1. **Create the marker map.
2568**2. **Create the attribute maps.
2569**3. **Define the connection to a graphic device.
2570**4. **Create a window.
2571**5. **Create a window driver.
2572**6. **Install the maps.
2573**7. **Create a view.
2574**8. **Create a view mapping.
2575**9. **Create one or more graphic objects associated with a view.
2576**10. **Create primitives and associate them with a graphic object.
2577**11. **Get the workspace of the driver.
2578**12. **Update the view in the driver.
2580@subsubsection occt_1621831385_109097682121 Creating the marker map
2582The marker map defines a set of markers available to the application. Markers may be predefined, Aspect_Tom_X for example, or user-defined.
dba69de2 2584@image html /user_guides/visualization/images/visualization_image025.jpg
2585@image latex /user_guides/visualization/images/visualization_image025.jpg
72b7576f 2586Figure 15. Markers.
2588The markers are manipulated by an index.
2589A marker map is defined as follows:
2590<h4>Example </h4>
2592Handle(Aspect_MarkMap) mkrmap = new Aspect_MarkMap;
2593Aspect_MarkMapEntry mkrmapentry1 (1, Aspect_TOM_X)
2594Aspect_MarkMapEntry mkrmapentry2 (2, Aspect_TOM_PLUS)
2595Aspect_MarkMapEntry mkrmapentry3 (3, Aspect_O_PLUS)
2597mkrmap-AddEntry (mkrmapentry1);
2598mkrmap-AddEntry (mkrmapentry2);
2599mkrmap-AddEntry (mkrmapentry3);
2602@subsubsection occt_1621831385_109097682122 Creating the attribute maps
2604Maps are created for color, line type, line width, and text font. A map is used to reference a given attribute by an integer value.
dba69de2 2607@image html /user_guides/visualization/images/visualization_image026.jpg
2608@image latex /user_guides/visualization/images/visualization_image026.jpg
72b7576f 2609Figure 16. Attributes
2611The color map
2612The hardware system will certainly have default colors available but to make the application portable and durable, it must be insulated from external factors by defining the set of colors to be used.
2614A color map is defined as follows:
2616<h4>Example </h4>
2618Handle(Aspect_GenericColorMap) colmap =
2619new Aspect_GenericColorMap;
2620Aspect_ColorMapEntry colmapentry;
2621Quantity_Color YELLOW (Quantity_NOC_YELLOW); colmapentry.SetValue (1, YELLOW);
2622colmap-AddEntry (colmapentry);
2623Quantity_Color RED (Quantity_NOC_RED);
2624colmapentry.SetValue (2, RED);
2625colmap-AddEntry (colmapentry);
2626Quantity_Color GREEN (Quantity_NOC_GREEN); colmapentry.SetValue (3, GREEN);
2627colmap-AddEntry (colmapentry);
2629You can include as many colors in your color map as you like, though there are some restrictions related to the hardware.
2631<h4>The type map </h4>
2632Lines can be solid, dotted, dashed, dot-dashed, or user defined. For a user-defined type the pattern of solid and blank sections is listed.
2634A type map is defined as follows:
2636<h4>Example </h4>
2638Handle(Aspect_TypeMap) typmap = new Aspect_TypeMap;
2639{TColQuantity_Array1OfLength myLineStyle(1,2); myLineStyle.SetValue(1, 2); // the solid part is 2 mm myLineStyle.SetValue(2, 3); // the blank part is 3 mm Aspect_LineStyle linestyle1 (Aspect_TOL_SOLID); Aspect_LineStyle linestyle2 (Aspect_TOL_DASH); Aspect_LineStyle linestyle3 (myLineStyle);
2640Aspect_LineStyle linestyle4 (Aspect_TOL_DOTDASH); Aspect_TypeMapEntry typmapentry1 (1, linestyle1); Aspect_TypeMapEntry typmapentry2 (2, linestyle2); Aspect_TypeMapEntry typmapentry3 (3, linestyle3); Aspect_TypeMapEntry typmapentry4 (4, linestyle4);
2641typmap-AddEntry (typmapentry1);
2642typmap-AddEntry (typmapentry2);
2643typmap-AddEntry (typmapentry3);
2644typmap-AddEntry (typmapentry4);
2648*The line type enumeration and all the other enumerations are available from the Aspect package.*
2650<h4>The width map </h4>
2651The width map defines a set of levels of line thickness available to your application. Widths and all other distances are specified in mms or as members of an enumeration.
2653A width map is defined as follows:
2654<h4>Example </h4>
2656Handle(Aspect_WidthMap) widmap = new Aspect_WidthMap; Aspect_WidthMapEntry widmapentry1 (1,Aspect_WOL_THIN); Aspect_WidthMapEntry widmapentry2 (2,Aspect_WOL_MEDIUM); Aspect_WidthMapEntry widmapentry3 (3, 3); Aspect_WidthMapEntry widmapentry4 (4, 40); widmap-AddEntry (widmapentry1); widmap-AddEntry (widmapentry2); widmap-AddEntry (widmapentry3); widmap-AddEntry (widmapentry4);
2658The font map
2659The font map defines a set of text fonts available to your application. Default fonts enumerated in Aspect may be used with addition of any other font known to the X driver, specifying the size and slant angle desired.
2661A font map is defined as follows:
2663<h4>Example </h4>
2665Handle(Aspect_FontMap) fntmap = new Aspect_FontMap; Aspect_FontStyle fontstyle1 (*Courier-Bold*, 3, 0.0); Aspect_FontStyle fontstyle2 (*Helvetica-Bold*, 3, 0.0); Aspect_FontStyle fontstyle3 (Aspect_TOF_DEFAULT); Aspect_FontMapEntry fntmapentry1 (1, fontstyle1); Aspect_FontMapEntry fntmapentry2 (2, fontstyle2); Aspect_FontMapEntry fntmapentry3 (3, fontstyle3); fntmap-AddEntry (fntmapentry1); fntmap-AddEntry (fntmapentry2); fntmap-AddEntry (fntmapentry3);
2668@subsubsection occt_1621831385_109097682123 Creating a 2D driver (a Windows example)
2670<h4>Example </h4>
2672Handle(WNT_GraphicDevice) TheGraphicDevice = ...; TCollection_ExtendedString aName(*2DV*);
2673my2DViewer = new V2d_Viewer(TheGraphicDevice,
2675@subsubsection occt_1621831385_109097682124 Installing the maps
2677When the 2D viewer has been created, you may install the maps created earlier.
2678<h4>Example </h4>
2686@subsubsection occt_1621831385_109097682125 Creating a view (a Windows example)
2688It is assumed that a valid Windows window may be accessed via the method GetSafeHwnd().
2689<h4>Example </h4>
2691Handle(WNT_Window) aWNTWindow;
2692aWNTWindow = new
2693WNT_Window(TheGraphicDevice, GetSafeHwnd());
2694aWNTWindow-SetBackground(Quantity_NOC_MATRAGRAY); Handle(WNT_WDriver) aDriver = new
2696myV2dView = new V2d_View(aDriver, my2dViewer, 0,0,50);
2697// 0,0: view center and 50: view size
2700@subsubsection occt_1621831385_109097682126 Creating the presentable object
2702Follow the procedure below to compute the presentable object.
dba69de2 2703**1. **Build a presentable object inheriting from AIS_InteractiveObject (refer to Chapter 1 Fundamental Concepts, Section Presentable objects)
2704**2. **Re-use the graphic object provided as an argument of the Compute method for your presentable object.
72b7576f 2705<h4>Example </h4>
2708myPresentableObject::Compute (
2709const Handle(Prs_Mgr_PresentationManager2D)&amp;
2711const Handle(Graphic2d_GraphicObject)&amp; aGrObj,
2712const Standard_Integer aMode)
2718@subsubsection occt_1621831385_109097682127 Creating a primitive
2720Primitives may be created using the resources of the Graphic2d package. Here for example an array is instantiated and filled with a set of three circles with different radii, line widths, and colors, centered on given origin coordinates (4.0, 1.0) and passed to the specified graphic object (go).
2721<h4>Example </h4>
2723Handle(Graphic2d_Circle) tcircle[4]; Quantity_Length radius; for (i=1; i=4; i++) { radius = Quantity_Length (i); tcircle[i-1] = new Graphic2d_Circle (aGrObj, 4.0, 1.0, radius);
2724tcircle[i-1]-SetColorIndex (i);
2725tcircle[i-1]-SetWidthIndex (1); }
2727Add a filled rectangle to your graphic object. It will be put outside of your view mapping.
2728<h4>Example </h4>
2730TColStd_Array1OfReal aListX (1, 5);
2731TColStd_Array1OfReal aListY (1, 5);
2732aListX (1) = -7.0; aListY (1) = -1.0;
2733aListX (2) = -7.0; aListY (2) = 1.0;
2734aListX (3) = -5.0; aListY (3) = 1.0;
2735aListX (4) = -5.0; aListY (4) = -1.0;
2736aListX (5) = -7.0; aListY (5) = -1.0;
2737Handle(Graphic2d_Polyline) rectangle =
2738new Graphic2d_Polyline (go, 0., 0., aListX, aListY); rectangle-SetColorIndex (6);
2739rectangle-SetWidthIndex (1);
2740rectangle-SetTypeOfPolygonFilling(Graphic2d_TOPF_FILLED); rectangle-SetDrawEdge(Standard_True);
2741*A given primitive can only be assigned to a single graphic object.*
dba69de2 2743@image html /user_guides/visualization/images/visualization_image027.jpg
2744@image latex/user_guides/visualization/images/visualization_image027.jpg
72b7576f 2745Figure 17. Graphic object and view mapping in the space model.
2747@subsection occt_1621831385_10909768213 Dealing with images
2749@subsubsection occt_1621831385_109097682131 General case
2751Images are primitives too. The graphic resources can currently accept all image types described in the *AlienImage* package. In the following example only **.xwd **formats are accepted.
2753Define the primitive Image in the GraphicObject.
2754<h4>Example </h4>
2756Handle(Image_Image) anImage; if (XwdImage || RgbImage) { anImage = AlienUser-ToImage (); Handle(Graphic2d_Image) gImage = new Graphic2d_Image
2757(aGrObj, anImage, 0., 0., 0., 0., Aspect_CP_CENTER); }
2761*The above constructor for image takes as arguments the graphic object which will contain the image, the image itself, XY coordinates for the center, XY offsets in the device space, and a cardinal point value to give a direction of display. *
2763Now update the view in the driver. In other words, draw the image.
2765<h4>Example </h4>
2767Standard_Boolean clear = Standard_True
2768view-Update (driver, viewmapping, W/2., H/2., scale, clear);
2771@subsubsection occt_1621831385_109097682132 Specific case: xwd format
2773When the manipulated image is stored with the xwd format, a special class Graphic2d_ImageFile may be used to increase performance.
2774<h4>Example </h4>
2776OSD_Path aPath (*C:/test.xwd*);
2777OSD_File aFile (aPath);
2778Handle(Graphic2d_ImageFile)gImageFile =
2779new Graphic2d_ImageFile (aGrObj,
2783Aspect_CP_Center, 1);
2787The graphic contains now an image, which is manipulated as a primitive.
2790@subsection occt_1621831385_10909768214 Dealing with text
2792The constructor for the Graphic2d_Text takes a reference point in the space model and an angle (in radians) as its arguments, as well as the graphic object to which it is assigned. Note that the angle is ignored unless the Xdps driver, which allows angled text, is in use.
2793<h4>Example </h4>
2795TCollection_ExtendedString str1 (*yellow Courier-bold*); TCollection_ExtendedString str2 (*red Helevetica-bold*); TCollection_ExtendedString str3 (*green Aspect_TOF_DEFAULT*); Handle(Graphic2d_Text) t1 = new Graphic2d_Text
2796(aGrObj, str1, 0.3, 0.3, 0.0);
2797Handle(Graphic2d_Text) t2 = new Graphic2d_Text
2798(aGrObj, str2, 0.0, 0.0, 0.0);
2799Handle(Graphic2d_Text) t3 = new Graphic2d_Text
2800(aGrObj, str3, -0.3, -0.3, 0.0);
2801t1-SetFontIndex (1); t1-SetColorIndex (1);
2802t2-SetFontIndex (2); t2-SetColorIndex (2);
2803t3-SetFontIndex (3); t3-SetColorIndex (3);
2806@subsection occt_1621831385_10909768215 Dealing with markers
2808A marker is a primitive that retains its original size when the view is zoomed. Markers can be used, for example, as references to dimensions.
2810@subsubsection occt_1621831385_109097682151 Vectorial markers
2811Every marker takes an XY point as its reference point. The constructor also takes another pair of XY values as an offset from this reference point. For CircleMarker and EllipsMarker this offset point is its center. For PolylineMarker this offset point is its origin i.e. the first point in its list.
2812In the example below, a rectangle is created using Graphic2d_Polyline.
2813<h4>Example </h4>
2815TColStd_Array1OfReal rListX (1, 5);
2816TColStd_Array1OfReal rListY (1, 5);
2817rListX (1) = -0.3; rListY (1) = -0.3;
2818rListX (2) = -0.3; rListY (2) = 0.3;
2819rListX (3) = 0.3; rListY (3) = 0.3;
2820rListX (4) = 0.3; rListY (4) = -0.3;
2821rListX (5) = -0.3; rListY (5) = -0.3;
2822Handle(Graphic2d_Polyline) rp =
2823new Graphic2d_Polyline (aGrObj, rListX, rListY);
2826Two Graphic2d_CircleMarkers are created. The first one has no offset from its center. The second is constrained to be a given offset from a reference point.
2827<h4>Example </h4>
2829Handle(Graphic2d_CircleMarker) rc1 = new
2831(aGrObj, 0.04, 0.03, 0.0, 0.0, 0.01); Handle(Graphic2d_CircleMarker) rc2 = new
2833(aGrObj, 0.03, -0.03, 0.01, 0.0, 0.01);
2834window-Clear ();
dba69de2 2836@image html /user_guides/visualization/images/visualization_image028.jpg
2837@image latex /user_guides/visualization/images/visualization_image028.jpg
72b7576f 2838Figure 18. Figure of zoom and attachment point of a marker.
2841@subsubsection occt_1621831385_109097682152 Indexed markers
2843Once the marker map has been created, indexed markers may be added to a graphic object.
2844<h4>Example </h4>
2846Handle (Graphic2d_Marker) xmkr = new Graphic2d_Marker
2847(aGrObj, 1, 0.04, 0.03, 0.0, 0.0, 0.0);
2848Handle (Graphic2d_Marker) plusmkr = new Graphic2d_Marker
2849(aGrObj, 2, 0.04, 0.0, 0.0, 0.0, 0.0);
2850Handle (Graphic2d_Marker) oplusmkr = new Graphic2d_Marker
2851(aGrObj, 3, 0.04, -0.03, 0.0, 0.0, 0.0);
2853@subsection occt_1621831385_10909768216 Dragging with Buffers
2855A **buffer** is used to draw very quickly a partial area of the scene without deleting the background context.
2856 A buffer contains a set of graphic objects or primitives which are to be moved, rotated or scaled above the scene in the front planes of the view (in this case, double-buffering is not active). For example:
dba69de2 2858**1. **Draw a very complex scene in the view.
2859**2. **Create a buffer of primitives with the primitive color index 10 and the font index 4:
72b7576f 2860buffer = new Graphic2d_Buffer (view, 0., 0., 10, 4);
dba69de2 2862**3. **Add graphic objects or primitives:
72b7576f 2863buffer-Add (go);
2864buffer-Add (tcircle[1]);
2865buffer-Add (t1);
dba69de2 2867**4. **Post the buffer in the view:
72b7576f 2868buffer-Post ();
dba69de2 2870**5. **Move, rotate or scale the buffer above the view:
72b7576f 2871buffer-Move (x,y); buffer-Rotate (alpha);
2872buffer-Scale (zoom_factor);
dba69de2 2874**6. **Unpost the buffer from the view:
72b7576f 2875buffer-Unpost ();
2876@section occt_1621831385_86393950 2D Resources
dba69de2 2879The 2D resources include the Graphic2d, Image, AlienImage, and V2d packages.
72b7576f 2880
2882@subsection occt_1621831385_863939501 Graphic2d
2885@subsubsection occt_1621831385_8639395011 Overview
2887The **Graphic2d** package is used to create a 2D graphic object. Each object, called a GraphicObject, is composed of primitives. Each primitive is a class and contains attributes. Each primitive has its own Draw method.
2889A Graphic2d_Image is created from an Image from the Image package.
2892@subsubsection occt_1621831385_8639395012 The services provided
2894The **Graphic2d** packages provides classes for creating the following primitives:
2895 * Circle
2896 * Curve
2897 * Ellips
2898 * InfiniteLine
2899 * Polyline
2900 * Segment
2901 * SetOfSegments
2902 * Text
2903 * Marker
2904 * SetOfMarkers
2905 * VectorialMarker
2906 * CircleMarker
2908**2D Resources **
2909 * PolylineMarker
2910 * EllipsMarker
2911 * Image
2912 * ImageFile
2913 * SetOfCurves
2917@subsection occt_1621831385_863939502 Image
2919@subsubsection occt_1621831385_8639395021 Overview
2921The **Image** package provides the resources to produce and manage bitmap images. It has two purposes:
2922 * To define what is an image on the CAS.CADE platform.
2923 * To define operations which can be carried out on an image.
2925The package allows the user to manipulate images without knowing their type. For various functionalities such as zoom, pan, and rotation, an application does not need to know the type nor the format of the image. Consequently, the image could be stored as an integer, real, or object of the Color type.
2927Another important asset of the package is to make the handling of images independent of the type of pixel. Thus a new image based on a different pixel type can be created without rewriting any of the algorithms.
2929@subsubsection occt_1621831385_8639395022 The services provided
2931The classes **ColorImage** and **PseudoColorImage** define the two types of image, which can be handled by the Image toolkit. These classes support different types of operations, such as zoom and rotate. The **PixMap** class defines system-independent bitmaps. It stores raster image data and provides special services, such as saving the image data into an image file. The PixMaps are powered by the FreeImage library.
2933**ColorImage** is used to create 24-bit TrueColor images:
2934 * Create a ColorImage object with a given background color.
2935 * Request the type of the image.
2936 * Request or set the color of a given pixel.
2937 * Zoom, rotating, translating, simple and refining transformations.
2938 * Set position and size.
2939 * Transpose, shift, clip, shift, clear.
2940 * Draw line and rectangle.
2942**PseudoColorImage** is used to create 32-bit images:
2943 * Create a PseudoColorImage object with a given background color associated with a given ColorMap (Generic, ColorCube, ColorRamp)
2944 * Ask or set the color of a given pixel, row, or column.
2945 * Find the maximum &amp; minimum pixel values of an image.
2946 * Change the pixel values by scaling.
2947 * Change the pixel values below a threshold value.
2948 * Zoom, rotating, translating, simple and refining transformations.
2949 * Set position and size.
2950 * Transpose, shift, clip, shift, clear.
dba69de2 2951 * * Draw line and rectangle.
72b7576f 2952
2953**PixMap **provides support for system-independent bitmaps:
2954 * Supports different kinds of raster images, such as 24-bit, 32-bit, 96-bit, 128-bit, or RGB, RGBA, floating-point RGB and RGBA.
2955 * Provides direct access to the pixel buffer.
2956 * Provides image dump services. The use of FreeImage library enhances these services with the capability of saving raster images into different image file formats. **Note** that without FreeImage library support, the raster images could be dumped into the PPM format only.
2957 * PixMaps could be used for handling system bitmaps and dumping window contents.
dba69de2 2958
72b7576f 2959**Convertor** is used to:
2960 * Change an image from a ColorImage to a PseudoColorImage. Select between two dithering algorithms for the change.
2961 * Change an image from a PseudoColorImage to a ColorImage.
2962 * Change a PseudoColorImage into one with a different ColorMap.
2964**LookupTable** is used to:
2965 * Transform the pixels of a PseudoColorImage.
2967Various **PixelInterpolation** classes are available for dealing with pixel values at non-integer coordinates.
2969The package also includes a number of **package methods** for zooming, rotation, translation, as well as simple and refining transformations.
2971@subsection occt_1621831385_863939503 AlienImage
2973@subsubsection occt_1621831385_8639395031 Overview
2975The **AlienImage** package is used to import 2D images from some other format into the CAS.CADE format.
2977@subsubsection occt_1621831385_8639395032 Available Services
2978 * Reads the content of an AlienImage object from a file.
2979 * Writes the content of an AlienImage object to a file.
2980 * Converts an AlienImage object to an Image object.
2981 * Converts an Image object to an AlienImage object.
2983@subsection occt_1621831385_863939504 V2d
2985@subsubsection occt_1621831385_8639395041 Overview
2987This package is used to build a 2D mono-view viewer in a windowing system. It contains the commands available within the viewer (zoom, pan, pick, etc).
2989@subsubsection occt_1621831385_8639395042 The services provided
2991The **V2d** package contains the **View** class. **View** is used to:
2992 * Create a view in an window.
2993 * Handle the view:
2994 * zoom
2995 * fit all
2996 * pan
2997 * translate
2998 * erase
2999 * pick
3000 * highlight
3001 * set drawing precision
3002 * Postscript output
3004@section occt_1621831385_1676618855 Graphic Attributes
3005@subsection occt_1621831385_16766188551 Aspect
3007@subsubsection occt_1621831385_167661885511 Overview
3009The **Aspect** package provides classes for the graphic elements, which are common to all 2D and 3D viewers - screen background, windows, edges, groups of graphic attributes that can be used in describing 2D and 3D objects.
3011@subsubsection occt_1621831385_167661885512 The services provided
3013The **Aspect** package provides classes to implement:
3014 * Color maps,
3015 * Pixels,
3016 * Groups of graphic attributes,
3017 * Edges, lines, background,
3018 * Font classes,
3019 * Width map classes,
3020 * Marker map classes,
3021 * Type of Line map classes,
3022 * Window,
3023 * Driver, PlotterDriver (inherited by PS_Driver), WindowDriver,
3024 * Graphic device (inherited by Xw_GraphicDevice, Graphic3d_GraphicDevice),
3025 * Enumerations for many of the above,
3026 * Array instantiations for edges,
3027 * Array instantiations for map entries for color, type, font, width, and marker.