------------------------------------------------------------------ -- -- NAME: GKS_ESCAPE - BODY -- DISCREPANCY REPORTS: ------------------------------------------------------------------ -- file: GKS_ESCAPE_B.ADA -- level: all levels with WSM; with CGI; with CGI_SUBTYPES_A; with GKS_DESCRIPTION_TABLE; with GKS_ERROR_STATE_LIST; with GKS_OPERATING_STATE_LIST; with GKS_ERRORS; with GKS_STATE_LIST; with ERROR_HANDLING; use WSM; use CGI; use CGI_SUBTYPES_A; use GKS_ERROR_STATE_LIST; use GKS_OPERATING_STATE_LIST; use GKS_ERRORS; package body GKS_ESCAPE is -- This package provides the registered ESCAPE procedures available -- in this implementation. In addition to the procedures for the -- implemented ESCAPE functions, the GENERALIZED_ESCAPE procedure is -- provided to support the ability to write a registered ESCAPE, that -- is not implemented, to a metafile. Each supported ESCAPE may be -- invoked by calling the specific procedure or by calling the -- GENERALIZED_ESCAPE procedure with the appropriate ESCAPE_ID and -- ESCAPE_DATA_RECORD. procedure GENERALIZED_ESC ( ESCAPE_NAME : in ESCAPE_ID; ESC_DATA_IN : in ESC_DATA_RECORD; ESC_DATA_OUT : out ESC_DATA_RECORD) is -- -- This procedure provides access to all registered escape -- functions that are supported. It can be called to write an -- unsupported registered escape function to a GKS metafile. -- -- Escape IDs, Input Data Records, and Output Data Records: -- -- Virtual extended pick (see VIRTUAL_EXTENDED_PICK) - -- Escape ID : VIRTUAL_EXTENDED_PICK_ID (defined above) -- Input Data Record -- Number of integers : 2 -- Meaning of integers : workstation identifier -- maximum number of picked items -- Number of reals : 4 -- Meaning of reals : XMIN of pick rectangle in NDC -- XMAX of pick rectangle in NDC -- YMIN of pick rectangle in NDC -- YMAX of pick rectangle in NDC -- Number of strings : 0 -- Output Data Record -- Number of integers : 2 * (number of pick items returned) -- Meaning of integers : first segment name -- first pick identifier -- ... -- last segment name -- last pick identifier -- Number of reals : 0 -- Number of strings : 1 -- Meaning of strings : the pick status ("OK", "NOPICK", or "NONE") -- -- Possible errors: -- 7 GKS not in proper state: GKS shall be in one of the states -- WSOP, WSAC, SGOP -- 8 GKS not in proper state: GKS shall be in one of the states -- GKOP, WSOP, WSAC, SGOP -- 25 Specified workstation is not open -- 180 Specified escape function is not supported -- 182 Contents of escape data record are invalid -- -- This procedure cases on the ESCAPE name to verify whether GKS -- is in the correct state for the desired operation and to validate -- the input data record. If the state is invalid, error 7 or 8 -- occurs and the procedure ERROR_HANDLING is called. Error 182 -- occurs if the contents of the data record are invalid for a -- supported ESCAPE. Error 180 is detected if a desired operation -- is not supported at the implemented GKS level (e.g. the -- virtual extended pick operation is allowed only at level 1b and -- above). If no errors are detected, the CGI instruction is -- formatted and sent to the workstation manager. ERROR_HANDLING is -- called if error 180 is sent back from a workstation. EMPTY_ESC_DATA_OUT : GKS_ESCAPE.ESC_DATA_RECORD; -- Used to assign to output parameter ESC_DATA_OUT when no -- output data is returned. GKS_INSTR : CGI_ESCAPE; begin -- Check the GKS_ERROR_STATE_LIST to see that the ERROR_STATE -- is not ON before continuing. if GKS_ERROR_STATE_LIST.ERROR_STATE = ON then return; end if; -- Set up ESCAPE_NAME for CGI instruction. GKS_INSTR.ESCAPE_NAME := ESCAPE_NAME; -- Perform the specialized processing necessary to validate -- GKS state, data record inputs and to send the CGI instruction -- to the WSM. case ESCAPE_NAME is when GKS_ESCAPE.VIRTUAL_EXTENDED_PICK_ID => -- Verify at least one workstation is open. if CURRENT_OPERATING_STATE /= WSOP and CURRENT_OPERATING_STATE /= WSAC and CURRENT_OPERATING_STATE /= SGOP then -- Error 7 GKS_INSTR.ERROR_INDICATOR := GKS_ERRORS.NOT_WSOP_WSAC_SGOP; -- Verify at least level 1b elsif GKS_DESCRIPTION_TABLE.LEVEL_OF_GKS /= GKS_TYPES.L1B and GKS_DESCRIPTION_TABLE.LEVEL_OF_GKS /= GKS_TYPES.L2B and GKS_DESCRIPTION_TABLE.LEVEL_OF_GKS /= GKS_TYPES.L1C and GKS_DESCRIPTION_TABLE.LEVEL_OF_GKS /= GKS_TYPES.L2C then GKS_INSTR.ERROR_INDICATOR := GKS_ERRORS.ESCAPE_FUNCTION_NOT_SUPPORTED; -- Error 180 -- Verify data record sizing elsif ESC_DATA_IN.NUM_OF_INTEGERS /= 2 or else ESC_DATA_IN.NUM_OF_REALS /= 4 or else ESC_DATA_IN.NUM_OF_STRINGS /= 0 then GKS_INSTR.ERROR_INDICATOR := GKS_ERRORS.INVALID_ESCAPE_DATA_RECORD; -- Error 182 -- Verify WS and number of pick items is positive elsif ESC_DATA_IN.INTEGER_ARRAY(1) <= 0 or else ESC_DATA_IN.INTEGER_ARRAY(2) <= 0 then GKS_INSTR.ERROR_INDICATOR := GKS_ERRORS.INVALID_ESCAPE_DATA_RECORD; -- Error 182 -- Verify the specified WS is open elsif not WS_IDS.IS_IN_LIST (GKS_TYPES.WS_ID (ESC_DATA_IN. INTEGER_ARRAY(1)), GKS_STATE_LIST.LIST_OF_OPEN_WS) then GKS_INSTR.ERROR_INDICATOR := GKS_ERRORS.WS_NOT_OPEN; -- Error 25 -- Verify pick rectangle is a valid rectangle. -- (i.e. XMIN < XMAX and YMIN < YMAX) elsif ESC_DATA_IN.REAL_ARRAY(1) >= ESC_DATA_IN.REAL_ARRAY(2) or ESC_DATA_IN.REAL_ARRAY(3) >= ESC_DATA_IN.REAL_ARRAY(4) then GKS_INSTR.ERROR_INDICATOR := GKS_ERRORS.INVALID_ESCAPE_DATA_RECORD; -- Error 182 else -- No error detected, process escape GKS_INSTR.ESCAPE_DATA_IN := new GKS_ESCAPE. ESC_DATA_RECORD'(ESC_DATA_IN); WS_MANAGER (GKS_INSTR); CGI.FREE_ESC_DATA_RECORD (GKS_INSTR.ESCAPE_DATA_IN); end if; when others => -- Verify GKS is open. if CURRENT_OPERATING_STATE = GKCL then -- Error 8 GKS_INSTR.ERROR_INDICATOR := GKS_ERRORS.NOT_GKOP_WSOP_WSAC_SGOP; else -- Process unsupported ESCAPEs. Pass through data. GKS_INSTR.ESCAPE_DATA_IN := new GKS_ESCAPE. ESC_DATA_RECORD'(ESC_DATA_IN); WS_MANAGER (GKS_INSTR); CGI.FREE_ESC_DATA_RECORD (GKS_INSTR.ESCAPE_DATA_IN); end if; end case; if GKS_INSTR.ERROR_INDICATOR /= SUCCESSFUL then GKS_ERROR_STATE_LIST.ERROR_STATE := ON; --Errors 107, 108, 180, 182 ERROR_HANDLING (GKS_INSTR.ERROR_INDICATOR,"GKS_ESCAPE"); GKS_ERROR_STATE_LIST.ERROR_STATE := OFF; else -- Copy the output ESCAPE data record to the user area. if GKS_INSTR.ESCAPE_DATA_OUT /= null then ESC_DATA_OUT := GKS_INSTR.ESCAPE_DATA_OUT.all; CGI.FREE_ESC_DATA_RECORD (GKS_INSTR.ESCAPE_DATA_OUT); else ESC_DATA_OUT := EMPTY_ESC_DATA_OUT; end if; end if; exception when GKS_ERROR => GKS_ERROR_STATE_LIST.ERROR_STATE := OFF; raise; when others => begin GKS_ERROR_STATE_LIST.ERROR_STATE := ON; ERROR_HANDLING (UNKNOWN, "GKS_ESCAPE"); -- Error 2501 GKS_ERROR_STATE_LIST.ERROR_STATE := OFF; exception when others => GKS_ERROR_STATE_LIST.ERROR_STATE := OFF; raise; end; end GENERALIZED_ESC; procedure VIRTUAL_EXTENDED_PICK ( WS : in WS_ID; MAX_NUMBER_PICK_ITEM : in POSITIVE; PICK_RECTANGLE : in NDC.RECTANGLE_LIMITS; STATUS : out PICK_REQUEST_STATUS; SEGMENT_LIST : out SEGMENT_NAMES.LIST_OF; PICK_ID_LIST : out PICK_IDS.LIST_OF) is -- -- This procedure performs a pick operation without an input -- device; i.e. a software trigger acts as a virtual device. -- The pick returns an extended list of pick IDs and segment -- names for all detectable items within the pick window. -- -- Possible errors: -- 7 GKS not in proper state: GKS shall be in one of the states -- WSOP, WSAC, SGOP -- 25 Specified workstation is not open IN_DATA_RECORD : GKS_ESCAPE.ESC_DATA_RECORD (NUM_OF_INTEGERS => 2, NUM_OF_REALS => 4, NUM_OF_STRINGS => 0); -- Used to pass data into GENERALIZED_ESC procedure. OUT_DATA_RECORD : GKS_ESCAPE.ESC_DATA_RECORD; -- Used to get data from GENERALIZED_ESC procedure. begin -- Call GENERALIZED_ESC with the required parameters. IN_DATA_RECORD.INTEGER_ARRAY(1) := INTEGER (WS); IN_DATA_RECORD.INTEGER_ARRAY(2) := INTEGER (MAX_NUMBER_PICK_ITEM); IN_DATA_RECORD.REAL_ARRAY(1) := GKS_ESCAPE.ESCAPE_FLOAT ( PICK_RECTANGLE.XMIN); IN_DATA_RECORD.REAL_ARRAY(2) := GKS_ESCAPE.ESCAPE_FLOAT ( PICK_RECTANGLE.XMAX); IN_DATA_RECORD.REAL_ARRAY(3) := GKS_ESCAPE.ESCAPE_FLOAT ( PICK_RECTANGLE.YMIN); IN_DATA_RECORD.REAL_ARRAY(4) := GKS_ESCAPE.ESCAPE_FLOAT ( PICK_RECTANGLE.YMAX); GENERALIZED_ESC ( ESCAPE_NAME => GKS_ESCAPE.VIRTUAL_EXTENDED_PICK_ID, ESC_DATA_IN => IN_DATA_RECORD, ESC_DATA_OUT => OUT_DATA_RECORD); EXTRACT_OUTPUT: declare INDEX : POSITIVE := 1; -- Used to loop through the returned integers. NUMBER_OF_SEGMENT_PRIMITIVES : NATURAL := OUT_DATA_RECORD.NUM_OF_INTEGERS / 2; -- The number of SEGMENT_NAME/PICK_ID pairs that have been -- picked. PICK_ID_ARRAY : GKS_TYPES.PICK_IDS.LIST_VALUES (1 .. NUMBER_OF_SEGMENT_PRIMITIVES); -- The pick IDs corresponding to each picked primitive. SEGMENT_NAME_ARRAY : GKS_TYPES.SEGMENT_NAMES.LIST_VALUES (1 .. NUMBER_OF_SEGMENT_PRIMITIVES); -- The segment names corresponding to each picked primitive. begin -- Extract the SEGMENT_LIST and PICK_ID_LIST for I in 1 .. NUMBER_OF_SEGMENT_PRIMITIVES loop SEGMENT_NAME_ARRAY (I) := GKS_TYPES.SEGMENT_NAME ( OUT_DATA_RECORD.INTEGER_ARRAY (INDEX) ); INDEX := INDEX + 1; PICK_ID_ARRAY (I) := GKS_TYPES.PICK_ID ( OUT_DATA_RECORD.INTEGER_ARRAY (INDEX) ); INDEX := INDEX + 1; end loop; SEGMENT_LIST := GKS_TYPES.SEGMENT_NAMES.LIST (SEGMENT_NAME_ARRAY); PICK_ID_LIST := GKS_TYPES.PICK_IDS.LIST (PICK_ID_ARRAY); -- Extract the STATUS STATUS := GKS_TYPES.PICK_REQUEST_STATUS'VALUE ( OUT_DATA_RECORD.ESC_STRINGS(1)); end EXTRACT_OUTPUT; end VIRTUAL_EXTENDED_PICK; end GKS_ESCAPE;