View Single Post
Old 4th January 2015, 04:29   #6  |  Link
StainlessS
HeartlessS Usurer
 
StainlessS's Avatar
 
Join Date: Dec 2009
Location: Over the rainbow
Posts: 10,980
Post #6 of many

Scene Change Utility funcs, Part 1
Code:
##################
# UTILITY
##################

Function DBSC_Override(String ScanDB,String Override_Fn,Bool "DEBUG") {
/*
  DBSC_Override(), Using SCAN DBase and Overrides.txt, allows user to set additional Scene Change or remove erroneous ones
    from the SCAN DBase. 

  ScanDB, INFO DBase created by DBSC_Scan.
  Override_fn filename: If first character == '*' then uses text in the Override_fn string and does not load file.
      When using Override_fn as string, then each override should be on separate line (same format as file).
    FORMAT: One frame numer command on each line. 
      Any +ve frame number sets START Of Scene Change frame.
      Any -ve frame number REMOVES a scene change at that frame (START or END).
*/
    myName="DBSC_Override: "
    START_TIME = RT_TimerHP
    DEBUG=Default(DEBUG,True)
    Assert(Override_Fn!="",RT_String("%sMust provide a Override filename",myName))
    GSCript("""
        Assert(DBSC_ScanValidate(ScanDB,MustExist=True,name=myName),RT_String("%sScanDB Invalid\n'%s'",myName,ScanDB))
        if(RT_Ord(Override_Fn)!=RT_Ord("*")) {
            Assert(Exist(Override_Fn),RT_String("%sOverride_Fn Does NOT exist\n'%s'",myName,Override_Fn))
            (DEBUG) ? RT_DebugF("Reading Override File '%s'",Override_Fn,name=myName) : NOP
            OVS = RT_ReadTxtFromFile(Override_Fn)
        } Else {
            OVS = MidStr(Override_Fn,2) 
        }
        OVS=(RT_Ord(OVS)==0) ? "#" : OVS                    # Avoid error in RT_StrReplaceMulti for Empty string ""
        Fnd_S=RT_String("\t\n  \n")                         # Replace TAB and double SPACE with Single SPACE
        Rep_S=RT_String(" \n \n")
        OVS=RT_StrReplaceMulti(OVS,Fnd_S,Rep_S)
        NLINES = RT_TxtQueryLines(OVS)                      # Lines of text in OVS
        (DEBUG) ? RT_DebugF("Scanning Overrides",name=myName) : NOP
        FC=RT_DBaseRecords(ScanDB)
        INSERTED=0
        DELETED =0
        RT_DBaseSetID(ScanDB,1,-1)                          # Disable ScanDB validity until finished without error
        for(i=0,NLINES-1) {
            STR = RT_TxtGetLine(OVS,i)                      # Without trailing n/l
            While(RT_Ord(STR)==32) { STR=MidStr(STR,2) }    # Eat White
            S=STR
            if(RT_Ord(S)!=RT_Ord("#")&&RT_Ord(S)!=0) {      # Ignore comment ONLY or Empty lines
                Neg=False
                n=-1
                if(RT_Ord(S)==RT_Ord("-")) {
                    Neg=True
                    S=MidStr(S,2)
                    While(RT_Ord(S)==32) { S=MidStr(S,2) }  # Eat White
                } Else if(RT_Ord(S)==RT_Ord("+")) {
                    S=MidStr(S,2)
                    While(RT_Ord(S)==32) { S=MidStr(S,2) }  # Eat White
                }
                if(RT_Ord(S)>=RT_Ord("0") && RT_Ord(S)<=RT_Ord("9")) {
                    n=RT_NumberValue(S)
                    While(RT_Ord(S)>=RT_Ord("0") && RT_Ord(S)<=RT_Ord("9")) { S=MidStr(S,2) }         # Eat Digits
                    While(RT_Ord(S)==32) { S=MidStr(S,2) }                                            # Eat White
                    if(RT_Ord(S)==RT_Ord("#")) {S=""}                                                 # Eat remaining Comment                    
                }
                Assert(S=="",RT_String("%sLINE %d : Non Parse @'%s'\n'%s'",myName,i+1,S,STR))
                Assert(n>=0 && n<FC,RT_String("%sLINE %d : Frame %d Does Not Exist @'%s'\n'%s'",myName,i+1,n,S,STR))
                Assert(n!=0 && n!=FC-1,RT_String("%sLINE %d : Cannot Override First or Last frame %d @'%s'\n'%s'",myName,i+1,n,S,STR))
                # ScanDB Fields: SOSix, EOSix, Type(1=SOS,2=EOS,0=non), SceneNo(Zero Rel), FLGS
                Start=RT_DBaseGetField(ScanDB,n,0)
                End  =RT_DBaseGetField(ScanDB,n,1)
                Type =RT_DBaseGetField(ScanDB,n,2)
                Single=(Start==End && Start == n && Type==3)
                if(Neg) {
                    if(n!=Start && n != End) {
                        (DEBUG||Type!=0) ? RT_DebugF("LINE %d : DEL SC, Frame %d Neither Start nor End Of Scene, Ignoring",i+1,n,name=myName) : NOP
                        Assert(Type==0,RT_String("%sLINE %d : INTERNAL ERROR, Frame %d Type non-zero(%d)",myName,i+1,n,Type))
                    } Else {
                        if(Single) {
                            # Single Frame Scene is melded with previous scene
                            (DEBUG) ? RT_DebugF("LINE %d : DEL SC, Frame %d Removing Single Frame Scene",i+1,n,name=myName) : NOP
                            NewStart = RT_DBaseGetField(ScanDB,n-1,0)               # SOSix from previous scene
                            NewEnd   = End                                          # EOSix from current scene (ie n)
                            NewType=(NewStart==n-1)?1:0                             # Previous is single frame scene 
                            RT_DBaseSetField(ScanDB,n-1,2,NewType)                  # Change n-1 to Type NewType (SOS OR none)
                            FLGS=RT_DBaseGetField(ScanDB,n-1,4)                     # n-1 FLGS
                            RT_DBaseSetField(ScanDB,n-1,4,RT_BitOR(FLGS,$40000000)) # FLGS User Deleted                         
                            FLGS=RT_DBaseGetField(ScanDB,n,4)                       # n FLGS
                            RT_DBaseSetField(ScanDB,n,4,RT_BitOR(FLGS,$40000000))   # FLGS User Deleted                                                 
                        } Else if(Start==n) {
                            (DEBUG||Type!=1) ? RT_DebugF("LINE %d : DEL SC, Frame %d Removing Start Of Scene",i+1,n,name=myName) : NOP
                            Assert(Type==1,RT_String("%sLINE %d : INTERNAL ERROR, Frame %d Type non-1(%d)",myName,i+1,n,Type))
                            NewStart = RT_DBaseGetField(ScanDB,n-1,0)               # SOSix from previous scene
                            NewEnd   = End                                      # EOSix from current scene 
                            RT_DBaseSetField(ScanDB,n-1,2,0)                        # Change n-1 to Type=None
                            FLGS=RT_DBaseGetField(ScanDB,n-1,4)                     # n-1 FLGS
                            RT_DBaseSetField(ScanDB,n-1,4,RT_BitOR(FLGS,$40000000)) # FLGS User Deleted                         
                            FLGS=RT_DBaseGetField(ScanDB,n,4)                       # n FLGS
                            RT_DBaseSetField(ScanDB,n,4,RT_BitOR(FLGS,$40000000))   # FLGS User Deleted                         
                        } Else {
                            (DEBUG||Type!=2) ? RT_DebugF("LINE %d : DEL SC, Frame %d Removing End Of Scene",i+1,n,name=myName) : NOP
                            Assert(Type==2,RT_String("%sLINE %d : INTERNAL ERROR, Frame %d Type non-2(%d)",myName,i+1,n,Type))
                            NewStart = Start                                    # SOSis from current scene
                            NewEnd   = RT_DBaseGetField(ScanDB,n+1,1)               # EOSix from next scene                         
                            RT_DBaseSetField(ScanDB,n+1,2,0)                        # Change n+1 to Type=None
                            FLGS=RT_DBaseGetField(ScanDB,n,4)                       # n FLGS
                            RT_DBaseSetField(ScanDB,n,4,RT_BitOR(FLGS,$40000000))   # FLGS User Deleted                         
                            FLGS=RT_DBaseGetField(ScanDB,n+1,4)                     # n+1 FLGS
                            RT_DBaseSetField(ScanDB,n+1,4,RT_BitOR(FLGS,$40000000)) # FLGS User Deleted                         
                        }
                        for(j=NewStart,NewEnd) {
                            RT_DBaseSetField(ScanDB,j,0,NewStart)                   # Change all of scene SOSix to new Start                            
                            RT_DBaseSetField(ScanDB,j,1,NewEnd)                     # Change all of scene EOSix to new End                            
                        }
                        NewType=(Single)?2:0
                        RT_DBaseSetField(ScanDB,n,2,NewType)                        # Change n to Type=None OR EOS if Single Frame Scene
                        DELETED = DELETED + 1                                       # Removed a scene                                                        
                    }                     
                } Else {
                    If(Single) {
                        (DEBUG) ? RT_DebugF("LINE %d : INS SC, Frame %d already Single Frame Scene, Ignoring",i+1,n,name=myName) : NOP
                    } Else if(Start==n) {
                        (DEBUG||Type!=1) ? RT_DebugF("LINE %d : INS SC, Frame %d already Start Of Scene, Ignoring",i+1,n,name=myName) : NOP
                        Assert(Type==1,RT_String("%sLINE %d : INTERNAL ERROR, Frame %d Type non-1(%d)",myName,i+1,n,Type))
                    } Else {
                        if(End==n) {
                            (DEBUG||Type!=2) ? RT_DebugF("LINE %d : INS SC, Frame %d Changing End Of Scene to Single Frame Scene",i+1,n,name=myName) : NOP
                            Assert(Type==2,RT_String("%sLINE %d : INTERNAL ERROR, Frame %d Type non-2(%d)",myName,i+1,n,Type))
                        } Else {
                            (DEBUG||Type!=0) ? RT_DebugF("LINE %d : INS SC, Frame %d Changing Mid Scene to Start Of Scene",i+1,n,name=myName) : NOP
                            Assert(Type==0,RT_String("%sLINE %d : INTERNAL ERROR, Frame %d Type non-0(%d)",myName,i+1,n,Type))
                        }                    
                        for(j=Start,n-1) {
                            RT_DBaseSetField(ScanDB,j,1,n-1)                    # Change all of scene EOSix to new end                            
                        }
                        NewType=(Start==n-1)?3:2
                        RT_DBaseSetField(ScanDB,n-1,2,NewType)                  # Change n-1 to Type=Single Frame Scene OR End Of Scene
                        for(j=n,End) {
                            RT_DBaseSetField(ScanDB,j,0,n)                      # Change all of scene SOSix to new start                            
                        }
                        NewType=(End==n)?3:1
                        RT_DBaseSetField(ScanDB,n,2,NewType)                    # Change n to Type= Single Frame Scene OR Start Of Scene
                        FLGS=RT_DBaseGetField(ScanDB,n,4)                       # n FLGS
                        RT_DBaseSetField(ScanDB,n,4,RT_BitOR(FLGS,$80000000))   # FLGS User INSERTED START                         
                        FLGS=RT_DBaseGetField(ScanDB,n-1,4)                     # n-1 FLGS
                        RT_DBaseSetField(ScanDB,n-1,4,RT_BitOR(FLGS,$80000000)) # FLGS User INSERTED END (or Single Frame Scene)                         
                        INSERTED = INSERTED + 1                                 # Added new scene                                                        
                    }
                }                              
            }            
        }
        if(INSERTED!=0 || DELETED!=0) {
            (DEBUG) ? RT_DebugF("%d Overrides Processed",INSERTED+DELETED,name=myName) : NOP
            (DEBUG) ? RT_DebugF("ReScan to update SCAN DBase SceneNo",name=myName) : NOP
            SceneNo = -1
            for(n=0,FC-1) {
                S=n
                SceneNo = SceneNo + 1
                Start=RT_DBaseGetField(ScanDB,n,0)
                End  =RT_DBaseGetField(ScanDB,n,1)
                Type =RT_DBaseGetField(ScanDB,n,2)
                Single=(Start==End && Start == n && Type==3)
                Assert(S==Start,RT_String("%s%d ] UPDATE INTERNAL ERROR : Start SOSix Mismatch(%d,%d)",myName,n,S,Start))
                (!Single)?Assert(Type==1 ,RT_String("%s%d ] UPDATE INTERNAL ERROR : Start Type non-1(%d)",myName,n,Type)):NOP
                EStart=RT_DBaseGetField(ScanDB,End,0)
                EEnd  =RT_DBaseGetField(ScanDB,End,1)
                EType =RT_DBaseGetField(ScanDB,End,2)
                Assert(S==EStart,RT_String("%s%d ] UPDATE INTERNAL ERROR : End SOSix Mismatch(%d,%d)",myName,n,S,EStart))
                Assert(End==EEnd,RT_String("%s%d ] UPDATE INTERNAL ERROR : End MisMatch(%d,%d)",myName,n,End,EEnd))
                (!Single)?Assert(EType==2 ,RT_String("%s%d ] UPDATE INTERNAL ERROR : End Type non-2(%d)",myName,n,EType)):NOP
                (Single) ?Assert(EType==3 ,RT_String("%s%d ] UPDATE INTERNAL ERROR : End Type non-3(%d)",myName,n,EType)):NOP                
                RT_DBaseSetField(ScanDB,Start,3,SceneNo)                                    
                RT_DBaseSetField(ScanDB,End  ,3,SceneNo)                                    
                for(i=Start+1,End-1) {
                    SOSix=RT_DBaseGetField(ScanDB,i,0)
                    EOSix=RT_DBaseGetField(ScanDB,i,1)
                    Type =RT_DBaseGetField(ScanDB,i,2)
                    Assert(Start==SOSix,RT_String("%s%d ] UPDATE INTERNAL ERROR : Start SOSix Mismatch(%d,%d)",myName,n,Start,SOSix))
                    Assert(End==EOSix  ,RT_String("%s%d ] UPDATE INTERNAL ERROR : End MisMatch(%d,%d)",myName,n,End,EOSix))
                    Assert(Type==0     ,RT_String("%s%d ] UPDATE INTERNAL ERROR : Start Type non-1(%d)",myName,n,Type))
                    RT_DBaseSetField(ScanDB,i,3,SceneNo)                    
                }
                n = End                                 # Next iteration n = End + 1
            }
            nAttribs=RT_DBaseGetAttrib(ScanDB,-1)
            OVERRIDDEN = RT_DBaseGetAttrib(ScanDB,nAttribs-4)
            TotOVR = OVERRIDDEN+INSERTED+DELETED
            RT_DBaseSetAttrib(ScanDB,nAttribs-4,TotOVR) # Count of Overridden
            (DEBUG) ? RT_DebugF("Total Accumulated Overrides = %d",TotOVR,name=myName) : NOP
        }
        RT_DBaseSetID(ScanDB,1,DBSC_Str2ID("SCAN"))     # Re-enable ScanDB validity
        T = RT_TimerHP - START_TIME
        (DEBUG) ? RT_DebugF("Total Time taken = %.2f Seconds  (%.2f Mins)",T,T/60.0,name=myName) : NOP 
    """)
    Return 0
}
__________________
I sometimes post sober.
StainlessS@MediaFire ::: AND/OR ::: StainlessS@SendSpace

"Some infinities are bigger than other infinities", but how many of them are infinitely bigger ???

Last edited by StainlessS; 4th February 2015 at 07:56. Reason: Update
StainlessS is offline   Reply With Quote