hexagon logo

Multi Dimensional Array to Single Dimension Array

Here's something I always seem to forget when I need it and have to think a little bit to remember (so why not document it here for my future self ps. you're memory is deteriorating quickly future self!).

            ASSIGN/ARRAY_1=ARRAY({PNT69},{CIR16},{CIR17})
            ASSIGN/ARRAY_2=ARRAY({LIN12},{PLN6},{PLN7},{PLN8},{LIN13})
            ASSIGN/ARRAY_3=ARRAY({LIN14},{PLN9},{PLN10},{PLN11},{LIN15})
$$ NO,
            load as many arrays into below vvvv
            ASSIGN/MULTI_ARRAY=ARRAY(ARRAY_1,ARRAY_2,ARRAY_3)
$$ NO,
            Push all items in multi dimensional array into a single dimensional array.
            
            ASSIGN/SINGLE_ARRAY=0
            ASSIGN/CNT=1
            ASSIGN/O_CNT=1
            DO/
            ASSIGN/I_CNT=1
            DO/
            ASSIGN/SINGLE_ARRAY[CNT]=MULTI_ARRAY[O_CNT,I_CNT]
            ASSIGN/CNT=CNT+1
            ASSIGN/I_CNT=I_CNT+1
            UNTIL/I_CNT > LEN(MULTI_ARRAY[O_CNT])
            ASSIGN/O_CNT=O_CNT+1
            UNTIL/O_CNT > LEN(MULTI_ARRAY)


You super users out there.. if you know a quicker, simpler, easier way to do this I would greatly appreciate it if you shared it below.
Parents
  • Cris_C don't say I've never given you anything...

    $$ NO,
                _____________________________________________________________________________________________
                 
                                             Export OP20 data to .txt for OP30.
                _____________________________________________________________________________________________
                 
                Updated By: Kp61dude!
                Updated on: 20190820
                Update Reason: 'GETTEXT()' does not pull any information from Generic Features. I found a solution
                               to get this missing information. 'GETTEXT()' is doing the job of gathering this info
                               but again it doesn't for Generic types, the workaround is '.FTYPE' (returns INTEGER value of
                               feature type from a predefined PcDmis list, see PCD help). 
                               'MY_FTYPE' is loaded with, previously missing, string information (ie. "PLANE", "CIRCLE").
                               Logic 'If/LEN(MY_FTYPE) <= 0' was added and 'FTYPE' was changed to 'MY_FTYPE'.
                 
                Update on: 20200427
                Update Reason: Added "CYLINDER" to CASE
                 
                SUBROUTINE/WRITE_TO_TXT,
                    PART =  : INPUT: ROUTINES PART#,
                    SERIAL =  : INPUT: STRING OF TEXT FLOWED DOWN FROM PLC,
                    FNAME =  : INPUT: ARRAY OF FEATURE OBJECTS EX. ASSIGN TYPE ARRAY({F1},{F2},{F3}),
                    RETURN =  : RETURN: STRING OF FEATURE TYPE (IF NOT NULL),
                    APPEND = 0 : APPEND TO EXISTING FILE,
                     = 
                ASSIGN/DEBUG=0
                ASSIGN/SERNUM=RIGHT(SERIAL,LEN(SERIAL)-INDEX(SERIAL,"-"))
                ASSIGN/TXTFILE1="C:\USERS\PUBLIC\DOCUMENTS\WAI\PC-DMIS\2015.1\PN_"+PART+"_SN_"+SERNUM+".txt"
    $$ NO,
                 
                 
                IF/APPEND
    FPTR         =FILE/OPEN,TXTFILE1,APPEND
                END_IF/
                ELSE/
    FPTR         =FILE/OPEN,TXTFILE1,WRITE
                END_ELSE/
    $$ NO,
                 
                 
                IF/DEBUG
                  ASSIGN/LOG_FILE="c:\users\public\documents\wai\pc-dmis\2015.1\DEBUG_LOG.txt"
    DEBUGLOG     =FILE/OPEN,LOG_FILE,APPEND
                  FILE/WRITELINE,DEBUGLOG,"*********************************************"
                  FILE/WRITELINE,DEBUGLOG,"Started: " + SYSTEMTIME("hh:mm:ss tt") + ", " + SYSTEMDATE("MM'/'dd'/'yyyy")
                END_IF/
    $$ NO,
                 
                 
                DO/
                ASSIGN/COUNTER=COUNTER+1
                ASSIGN/MY_FTYPE=GETTEXT(486,0,FNAME[COUNTER]) + GETTEXT(63,0,FNAME[COUNTER])
                ASSIGN/MY_FTYPE=GETTEXT(486,0,MY_FTYPE) + GETTEXT(63,0,MY_FTYPE)
                IF/LEN(MY_FTYPE) <= 0
                  SELECT/FNAME[COUNTER].FTYPE
                    CASE/1
                      ASSIGN/MY_FTYPE=""
                      IF/DEBUG
                        FILE/WRITELINE,DEBUGLOG,COUNTER + ". MY_FTYPE IS NULL " + MY_FTYPE
                      END_IF/
                    END_CASE/
                    CASE/2
                      ASSIGN/MY_FTYPE="CIRCLE"
                      IF/DEBUG
                        FILE/WRITELINE,DEBUGLOG,COUNTER + ". MY_FTYPE IS CIRCLE " + MY_FTYPE
                      END_IF/
                    END_CASE/
                    CASE/4
                      ASSIGN/MY_FTYPE="LINE"
                      IF/DEBUG
                        FILE/WRITELINE,DEBUGLOG,COUNTER + ". MY_FTYPE IS LINE " + MY_FTYPE
                      END_IF/
                    END_CASE/
                    CASE/6
                      ASSIGN/MY_FTYPE="CYLINDER"
                      IF/DEBUG
                        FILE/WRITELINE,DEBUGLOG,COUNTER + ". MY_FTYPE is CYLINDER " + MY_FTYPE
                      END_IF/
                    END_CASE/
                    CASE/7
                      ASSIGN/MY_FTYPE="PLANE"
                      IF/DEBUG
                        FILE/WRITELINE,DEBUGLOG,COUNTER + ". MY_FTYPE is PLANE " + MY_FTYPE
                      END_IF/
                    END_CASE/
                    DEFAULT_CASE/
                      ASSIGN/MY_FTYPE=""
                      IF/DEBUG
                        FILE/WRITELINE,DEBUGLOG,COUNTER + ". MY_FTYPE is null and DEFAULT " + MY_FTYPE
                      END_IF/
                    END_DEFAULTCASE/
                  END_SELECT/
                END_IF/
                IF/FNAME[COUNTER].XYZ==0 AND FNAME[COUNTER].IJK==0
      $$ NO,
                  passing generic var value
                  FILE/WRITELINE,FPTR,"VAR<"+FNAME[COUNTER]+">"
                END_IF/
                ELSE/
                  SELECT/MY_FTYPE
                    CASE/"CIRCLE"
                      FILE/WRITELINE,FPTR,"CIRCLE"+FNAME[COUNTER].XYZ +";"+ FNAME[COUNTER].IJK +";"+ FNAME[COUNTER].D
                      IF/DEBUG
                        FILE/WRITELINE,DEBUGLOG,COUNTER + ". Wrote CIRCLE"
                      END_IF/
                    END_CASE/
                    CASE/"CYLINDER"
                      FILE/WRITELINE,FPTR,"CYLINDER"+FNAME[COUNTER].XYZ +";"+ FNAME[COUNTER].IJK +";"+ FNAME[COUNTER].D +";"+ FNAME[COUNTER].L
                      IF/DEBUG
                        FILE/WRITELINE,DEBUGLOG,COUNTER + ". Wrote CYLINDER"
                      END_IF/
                    END_CASE/
                    CASE/"PLANE"
                      FILE/WRITELINE,FPTR,"PLANE"+FNAME[COUNTER].XYZ +";"+ FNAME[COUNTER].IJK
                      IF/DEBUG
                        FILE/WRITELINE,DEBUGLOG,COUNTER + ". Wrote PLANE"
                      END_IF/
                    END_CASE/
                    CASE/"LINE"
                      FILE/WRITELINE,FPTR,"LINE"+FNAME[COUNTER].XYZ +";"+ FNAME[COUNTER].IJK+";"+FNAME[COUNTER].LENGTH
                      IF/DEBUG
                        FILE/WRITELINE,DEBUGLOG,COUNTER + ". Wrote LINE"
                      END_IF/
                    END_CASE/
                    DEFAULT_CASE/
                      FILE/WRITELINE,FPTR,FNAME[COUNTER].XYZ +";"+ FNAME[COUNTER].IJK
                      IF/DEBUG
                        FILE/WRITELINE,DEBUGLOG,COUNTER + ". Wrote DEFAULT (POINT)"
                      END_IF/
                    END_DEFAULTCASE/
                  END_SELECT/
                END_ELSE/
                IF/!FNAME.LEN==COUNTER
                  ASSIGN/RETURN=RETURN + MY_FTYPE + " "
                END_IF/
                ASSIGN/MY_FTYPE=""
                UNTIL/COUNTER==LEN(FNAME)
    $$ NO,
                 
                 
                FILE/CLOSE,FPTR,KEEP
                IF/DEBUG
                  FILE/WRITELINE,DEBUGLOG,"*********************************************"
                  FILE/CLOSE,DEBUGLOG,KEEP
                END_IF/
                ENDSUB/
    
Reply
  • Cris_C don't say I've never given you anything...

    $$ NO,
                _____________________________________________________________________________________________
                 
                                             Export OP20 data to .txt for OP30.
                _____________________________________________________________________________________________
                 
                Updated By: Kp61dude!
                Updated on: 20190820
                Update Reason: 'GETTEXT()' does not pull any information from Generic Features. I found a solution
                               to get this missing information. 'GETTEXT()' is doing the job of gathering this info
                               but again it doesn't for Generic types, the workaround is '.FTYPE' (returns INTEGER value of
                               feature type from a predefined PcDmis list, see PCD help). 
                               'MY_FTYPE' is loaded with, previously missing, string information (ie. "PLANE", "CIRCLE").
                               Logic 'If/LEN(MY_FTYPE) <= 0' was added and 'FTYPE' was changed to 'MY_FTYPE'.
                 
                Update on: 20200427
                Update Reason: Added "CYLINDER" to CASE
                 
                SUBROUTINE/WRITE_TO_TXT,
                    PART =  : INPUT: ROUTINES PART#,
                    SERIAL =  : INPUT: STRING OF TEXT FLOWED DOWN FROM PLC,
                    FNAME =  : INPUT: ARRAY OF FEATURE OBJECTS EX. ASSIGN TYPE ARRAY({F1},{F2},{F3}),
                    RETURN =  : RETURN: STRING OF FEATURE TYPE (IF NOT NULL),
                    APPEND = 0 : APPEND TO EXISTING FILE,
                     = 
                ASSIGN/DEBUG=0
                ASSIGN/SERNUM=RIGHT(SERIAL,LEN(SERIAL)-INDEX(SERIAL,"-"))
                ASSIGN/TXTFILE1="C:\USERS\PUBLIC\DOCUMENTS\WAI\PC-DMIS\2015.1\PN_"+PART+"_SN_"+SERNUM+".txt"
    $$ NO,
                 
                 
                IF/APPEND
    FPTR         =FILE/OPEN,TXTFILE1,APPEND
                END_IF/
                ELSE/
    FPTR         =FILE/OPEN,TXTFILE1,WRITE
                END_ELSE/
    $$ NO,
                 
                 
                IF/DEBUG
                  ASSIGN/LOG_FILE="c:\users\public\documents\wai\pc-dmis\2015.1\DEBUG_LOG.txt"
    DEBUGLOG     =FILE/OPEN,LOG_FILE,APPEND
                  FILE/WRITELINE,DEBUGLOG,"*********************************************"
                  FILE/WRITELINE,DEBUGLOG,"Started: " + SYSTEMTIME("hh:mm:ss tt") + ", " + SYSTEMDATE("MM'/'dd'/'yyyy")
                END_IF/
    $$ NO,
                 
                 
                DO/
                ASSIGN/COUNTER=COUNTER+1
                ASSIGN/MY_FTYPE=GETTEXT(486,0,FNAME[COUNTER]) + GETTEXT(63,0,FNAME[COUNTER])
                ASSIGN/MY_FTYPE=GETTEXT(486,0,MY_FTYPE) + GETTEXT(63,0,MY_FTYPE)
                IF/LEN(MY_FTYPE) <= 0
                  SELECT/FNAME[COUNTER].FTYPE
                    CASE/1
                      ASSIGN/MY_FTYPE=""
                      IF/DEBUG
                        FILE/WRITELINE,DEBUGLOG,COUNTER + ". MY_FTYPE IS NULL " + MY_FTYPE
                      END_IF/
                    END_CASE/
                    CASE/2
                      ASSIGN/MY_FTYPE="CIRCLE"
                      IF/DEBUG
                        FILE/WRITELINE,DEBUGLOG,COUNTER + ". MY_FTYPE IS CIRCLE " + MY_FTYPE
                      END_IF/
                    END_CASE/
                    CASE/4
                      ASSIGN/MY_FTYPE="LINE"
                      IF/DEBUG
                        FILE/WRITELINE,DEBUGLOG,COUNTER + ". MY_FTYPE IS LINE " + MY_FTYPE
                      END_IF/
                    END_CASE/
                    CASE/6
                      ASSIGN/MY_FTYPE="CYLINDER"
                      IF/DEBUG
                        FILE/WRITELINE,DEBUGLOG,COUNTER + ". MY_FTYPE is CYLINDER " + MY_FTYPE
                      END_IF/
                    END_CASE/
                    CASE/7
                      ASSIGN/MY_FTYPE="PLANE"
                      IF/DEBUG
                        FILE/WRITELINE,DEBUGLOG,COUNTER + ". MY_FTYPE is PLANE " + MY_FTYPE
                      END_IF/
                    END_CASE/
                    DEFAULT_CASE/
                      ASSIGN/MY_FTYPE=""
                      IF/DEBUG
                        FILE/WRITELINE,DEBUGLOG,COUNTER + ". MY_FTYPE is null and DEFAULT " + MY_FTYPE
                      END_IF/
                    END_DEFAULTCASE/
                  END_SELECT/
                END_IF/
                IF/FNAME[COUNTER].XYZ==0 AND FNAME[COUNTER].IJK==0
      $$ NO,
                  passing generic var value
                  FILE/WRITELINE,FPTR,"VAR<"+FNAME[COUNTER]+">"
                END_IF/
                ELSE/
                  SELECT/MY_FTYPE
                    CASE/"CIRCLE"
                      FILE/WRITELINE,FPTR,"CIRCLE"+FNAME[COUNTER].XYZ +";"+ FNAME[COUNTER].IJK +";"+ FNAME[COUNTER].D
                      IF/DEBUG
                        FILE/WRITELINE,DEBUGLOG,COUNTER + ". Wrote CIRCLE"
                      END_IF/
                    END_CASE/
                    CASE/"CYLINDER"
                      FILE/WRITELINE,FPTR,"CYLINDER"+FNAME[COUNTER].XYZ +";"+ FNAME[COUNTER].IJK +";"+ FNAME[COUNTER].D +";"+ FNAME[COUNTER].L
                      IF/DEBUG
                        FILE/WRITELINE,DEBUGLOG,COUNTER + ". Wrote CYLINDER"
                      END_IF/
                    END_CASE/
                    CASE/"PLANE"
                      FILE/WRITELINE,FPTR,"PLANE"+FNAME[COUNTER].XYZ +";"+ FNAME[COUNTER].IJK
                      IF/DEBUG
                        FILE/WRITELINE,DEBUGLOG,COUNTER + ". Wrote PLANE"
                      END_IF/
                    END_CASE/
                    CASE/"LINE"
                      FILE/WRITELINE,FPTR,"LINE"+FNAME[COUNTER].XYZ +";"+ FNAME[COUNTER].IJK+";"+FNAME[COUNTER].LENGTH
                      IF/DEBUG
                        FILE/WRITELINE,DEBUGLOG,COUNTER + ". Wrote LINE"
                      END_IF/
                    END_CASE/
                    DEFAULT_CASE/
                      FILE/WRITELINE,FPTR,FNAME[COUNTER].XYZ +";"+ FNAME[COUNTER].IJK
                      IF/DEBUG
                        FILE/WRITELINE,DEBUGLOG,COUNTER + ". Wrote DEFAULT (POINT)"
                      END_IF/
                    END_DEFAULTCASE/
                  END_SELECT/
                END_ELSE/
                IF/!FNAME.LEN==COUNTER
                  ASSIGN/RETURN=RETURN + MY_FTYPE + " "
                END_IF/
                ASSIGN/MY_FTYPE=""
                UNTIL/COUNTER==LEN(FNAME)
    $$ NO,
                 
                 
                FILE/CLOSE,FPTR,KEEP
                IF/DEBUG
                  FILE/WRITELINE,DEBUGLOG,"*********************************************"
                  FILE/CLOSE,DEBUGLOG,KEEP
                END_IF/
                ENDSUB/
    
Children
No Data