Milan Kolar

Members
  • Content Count

    79
  • Joined

  • Last visited

  • Days Won

    13

Reputation Activity

  1. Like
    Milan Kolar got a reaction from Remus Avram in daemon for the Ftrack event plugins   
    Hey. 
    This should help you. We've been using it for over a year now.
    https://github.com/tokejepsen/ftrack-event-server
    edit: forgot to attach the link
  2. Like
    Milan Kolar got a reaction from Mattias Lagergren in Lucidity: How to deal with spaces in object types?   
    We just use a simple replace on all the keys to make sure, there are no unwanted characters in anything.
    key = key.replace(" ", '_').replace('\'', '')  
  3. Like
    Milan Kolar got a reaction from Mike in Lucidity: How to deal with spaces in object types?   
    We just use a simple replace on all the keys to make sure, there are no unwanted characters in anything.
    key = key.replace(" ", '_').replace('\'', '')  
  4. Like
    Milan Kolar got a reaction from Mike in Extend default Actions (starting Nuke e.g.)   
    Hey Mattias. 
    Yes that should absolutely do the trick. 
  5. Like
    Milan Kolar got a reaction from Mattias Lagergren in Sequence Review   
    Yes.  So that client can see the shots in context of the 'edit'.
    We're currently having to export videos compiled of multiple shots, which is very easy for the client to comment on, but we then have to transfer the feedback manually to it's respective shots.
    There's another aspect of this, which applies to the internal review tools too and that is handles. It would be amazing to be able to take handles on shots into consideration and cut them of when reviewing multiple shots in sequence., we would be essentially then able to reproduce the edit in the web browser and it would make reviewing infinitely easier. 
  6. Like
    Milan Kolar got a reaction from Fredrik Limsater in Slack User Group   
    Soo. I went ahead and created an Ftrack Slack User Group. However there's this small problem I haven't realized till now. Slack is not very good with public access, so every person needs to get an invite (or be within a specific domain, which is even worse).
    There is this lovely service called slackin, but that of course needs to run on something. 
    Right now I'm ok with just sending out invites like crazy if anyone asks here to get it going. Theoretically as it grows this won't be an issue, because any member can send an invite. It'll just be a bit of a hassle at the beginning.
    Maybe ftrack guys would be interested in hosting this tiny slackin service, to make it easier?
     
    Anyways
    the address is: ftrackusers.slack.com
    Come join the party... (it's very, very lonely right now  )
  7. Like
    Milan Kolar got a reaction from Mattias Lagergren in Simplify plugins in Connect   
    So I had some time to play with this a little bit and came up with compact and quite efficient way of dealing with environments using launching events. Technically all that is needed is one hook that listens to the launching events and appends environments from simple .json config files based on app identifiers.
    The hook looks for .json files in 'FTRACK_APP_ENVIRONMENTS' and tries to find 2 configs. One that is version independent i.e. 'maya.json' and one that is version dependent i.e. 'maya_2016.json', then it adds both into the environment. Config file names mus match the app identifier or the first part of the identifier when split by '_'.
    You can then have a hierarchical environment config files, where maya.json loads regardless of maya version you launch, and maya_2016.json gets added on top of the environment when you launch Maya 2016 from ftrack.
    'FTRACK_APP_ENVIRONMENTS' folder can then look like this for instance:
    maya.json maya_2015.json maya_2016.json maya_2016.5.json nuke.json nuke_9.0v8.json houdini.json houdini_15.json etc....  
    This is the core part of the hook (full hook attached):
    def modify_application_launch(event): '''Modify the application environment and start timer for the task.''' data = event['data'] context = data['context'] app = data['application'] environment = data['options']['env'] env_path = os.environ.get('FTRACK_APP_ENVIRONMENTS') env_files = [] # determine config file for version independent environment app_name = app['identifier'].split('_')[0] app_file_name = '{}.json'.format(app_name) env_files.append(os.path.join(env_path, app_file_name)) # determine config file for version dependent environment variant_file_name = '{}.json'.format(app['identifier']) env_files.append(os.path.join(env_path, variant_file_name)) env_add = [] # loop through config files for env_file in env_files: try: env_add = load_env(env_file) except: env_add = None # Add each path in config file to the environment if env_add: for variable in env_add: for path in env_add[variable]: ftrack_connect.application.appendPath( str(path), str(variable), environment )  
    This is what the config file look like then:
    { "MAYA_PLUG_IN_PATH": [ "K:\\.core\\dev\\maya\\plug-ins" ], "MAYA_AUTOSAVE_FOLDER": [ "C:\\mayatemp\\autosave" ], "MAYA_SCRIPT_PATH": [ "K:\\.core\\dev\\maya\\scripts", "K:\\.core\\dev\\maya\\shelves", "K:\\.core\\repos\\maya\\scripts", "K:\\.core\\repos\\maya\\prefs\\shelves" ] }  
    Now quite frankly, I think that a simple hook like this (probably a bit more robust version) should be a part of the default connect installation. Straight away people would have 3 options of modifying the app launches. 
    Only need to modify environment: Add your json formatted environment file to 'FTRACK_APP_ENVIRONMENTS' and name it 'app_identifier.json' (e.g.: maya_2016.json) Write your own hook that catches launching events and modify the launch that way. Change the launcher hook in connect and modify to your heart's content  
    One way or another, our enviro setups just went from lot's of python file, to a simple json file per app without the need to tinker with default hooks. Thumbs up.
    modify_app_launch.py
  8. Like
    Milan Kolar got a reaction from Mattias Lagergren in What docs to set up a Location?   
    Depends on what API are you using. The first link is for the old API, while the second one applied to the new one. 
    At this point I'd probably just start with the new one and only got to the old if you run into something it can't do.
  9. Like
    Milan Kolar got a reaction from Mattias Lagergren in Create task in multiple asset builds   
    Your best bet is probably task templates. They are additive, so if you make templates with just one task, you can have good control over adding them to multiple entities then.
  10. Like
    Milan Kolar got a reaction from tokejepsen in Simplify plugins in Connect   
    So I had some time to play with this a little bit and came up with compact and quite efficient way of dealing with environments using launching events. Technically all that is needed is one hook that listens to the launching events and appends environments from simple .json config files based on app identifiers.
    The hook looks for .json files in 'FTRACK_APP_ENVIRONMENTS' and tries to find 2 configs. One that is version independent i.e. 'maya.json' and one that is version dependent i.e. 'maya_2016.json', then it adds both into the environment. Config file names mus match the app identifier or the first part of the identifier when split by '_'.
    You can then have a hierarchical environment config files, where maya.json loads regardless of maya version you launch, and maya_2016.json gets added on top of the environment when you launch Maya 2016 from ftrack.
    'FTRACK_APP_ENVIRONMENTS' folder can then look like this for instance:
    maya.json maya_2015.json maya_2016.json maya_2016.5.json nuke.json nuke_9.0v8.json houdini.json houdini_15.json etc....  
    This is the core part of the hook (full hook attached):
    def modify_application_launch(event): '''Modify the application environment and start timer for the task.''' data = event['data'] context = data['context'] app = data['application'] environment = data['options']['env'] env_path = os.environ.get('FTRACK_APP_ENVIRONMENTS') env_files = [] # determine config file for version independent environment app_name = app['identifier'].split('_')[0] app_file_name = '{}.json'.format(app_name) env_files.append(os.path.join(env_path, app_file_name)) # determine config file for version dependent environment variant_file_name = '{}.json'.format(app['identifier']) env_files.append(os.path.join(env_path, variant_file_name)) env_add = [] # loop through config files for env_file in env_files: try: env_add = load_env(env_file) except: env_add = None # Add each path in config file to the environment if env_add: for variable in env_add: for path in env_add[variable]: ftrack_connect.application.appendPath( str(path), str(variable), environment )  
    This is what the config file look like then:
    { "MAYA_PLUG_IN_PATH": [ "K:\\.core\\dev\\maya\\plug-ins" ], "MAYA_AUTOSAVE_FOLDER": [ "C:\\mayatemp\\autosave" ], "MAYA_SCRIPT_PATH": [ "K:\\.core\\dev\\maya\\scripts", "K:\\.core\\dev\\maya\\shelves", "K:\\.core\\repos\\maya\\scripts", "K:\\.core\\repos\\maya\\prefs\\shelves" ] }  
    Now quite frankly, I think that a simple hook like this (probably a bit more robust version) should be a part of the default connect installation. Straight away people would have 3 options of modifying the app launches. 
    Only need to modify environment: Add your json formatted environment file to 'FTRACK_APP_ENVIRONMENTS' and name it 'app_identifier.json' (e.g.: maya_2016.json) Write your own hook that catches launching events and modify the launch that way. Change the launcher hook in connect and modify to your heart's content  
    One way or another, our enviro setups just went from lot's of python file, to a simple json file per app without the need to tinker with default hooks. Thumbs up.
    modify_app_launch.py
  11. Like
    Milan Kolar got a reaction from Mattias Lagergren in Simplify plugins in Connect   
    This is getting very close to a simple a straightforward system. I have however ran into some issues.
    The most prominent right now is the fact that I have no way of finding out what task/entity was the source of this launching event. It's not included in the event data and because it seems that this event precedes the ftrack addition of env variables the environment is missing the 'FTRACK_TASKID' key too.  It's important to be able to tell what originated the launch event because the enviro usually changes based on what project or task we're launching (different plugins for example.
     
    EDIT:
    Ah. One of those where you completely skip on part of docs and then realise it's of course all there. If anyone else enjoys skipping important parts of docs, then here's how you get it.
    event['data']['context']['selection'][0]['entityId'] So considering I found it...Nice work guys.
  12. Like
    Milan Kolar got a reaction from richyfrost in Thumbnail to Parent/Children   
    Maybe these will help someone.
    2 Actions we use regularly. When ran on an entity (single or multiple selection), they push it's thumbnail to it's direct parent or all it's children, depending on which one you run
    Works asynchronously as a job so even running it on big numbers of items shouldn't be a problem.
    Action - thumb to children
    Action - thumb to parent
     
  13. Like
    Milan Kolar got a reaction from TheFridge in Slack User Group   
    Sounds great to me for unofficial "holy crap where's this button I certainly saw yesterday" type problems. I'd certainly be on on it happy to chat about ftrack with other users.
  14. Like
    Milan Kolar got a reaction from Remus Avram in Filter by Type in Asset builds doesn't work   
    That's because it's not task type, but Asset Build type. You need to add it through add filter in the filter pane
     

  15. Like
    Milan Kolar got a reaction from Mattias Lagergren in Thumbnail to Parent/Children   
    Maybe these will help someone.
    2 Actions we use regularly. When ran on an entity (single or multiple selection), they push it's thumbnail to it's direct parent or all it's children, depending on which one you run
    Works asynchronously as a job so even running it on big numbers of items shouldn't be a problem.
    Action - thumb to children
    Action - thumb to parent
     
  16. Like
    Milan Kolar got a reaction from tokejepsen in Thumbnail to Parent/Children   
    Maybe these will help someone.
    2 Actions we use regularly. When ran on an entity (single or multiple selection), they push it's thumbnail to it's direct parent or all it's children, depending on which one you run
    Works asynchronously as a job so even running it on big numbers of items shouldn't be a problem.
    Action - thumb to children
    Action - thumb to parent
     
  17. Like
    Milan Kolar got a reaction from liveforpixel in Open in Explorer/Finder   
    I've been planning on doing something similar for a while now as an action. You just reminded me so I'll have a look if I find time for it anytime soon. If so I'll share it in the Actions part of the forum
  18. Like
    Milan Kolar got a reaction from Robinson in Attribute inheritance   
    Hi guys.
     
    I have an idea that might make navigating and sorting through the ftrack interface a bit easier.
     
    The problem is that when there are too many sequences, shots, tasks in the project it become difficult to micro manage everything. Especially priorities and due dates. We won't have time to be putting dates and priorities on every task, however it's nice to have them as it makes organizing views, tasks and work in general easier. 
     
    So I'm thinking whether it would be possible to implement some kind of top-down inheritance as an override on on certain task attributes. I'll use priority as example, but the same could apply to dates. 
     
    If we had a project like this.
    Seq01 | PR none-shot001 | PR High--animation | PR none --lighting | PR medium--compositing | PR lowSeq02 | PR Urgent-shot003 | PR medium--animation | PR none --lighting | PR medium--compositing | PR none-shot004 | PR low--animation | PR none --lighting | PR medium--compositing | PR low  Then any sorting algorithms could simply go through hierarchy and sort by it. If task doesn't have it's own priority - use it's shot priority, if that doesn't exist, use sequence and only then assume there is no priority set on the task. If 2 tasks have the same priority, but their shots don't, the one with higher priority shot should be higher in sorting. 
     
    I'm going by the fact, that I've very rarely seen tasks needing to be prioritized, however we always get into rush to get shots or sequences out of the door. This way if a situation arrives, I could just set sequence to high, priority and everyones tasks would reorder to keep this sequence tasks on the top (they could keep shot prioritization within that of course)
     
    Yes we are talking about pretty much 3 levels sorting would need to go through, but the result would be much better representation of what needs to be done and when.
     
    Similar situation could be with sorting by date. If task is scheduled to end on 15.march, but it's shot is for 10.march, there's clearly been either human error or something is not right (I know you can't set dates on shots and sequences now, but is would sure be nice)
     
     
  19. Like
    Milan Kolar got a reaction from Mattias Seebergs in View Asset builds per type   
    I have a feeling that I've asked for this before so I'll join this noble cause. Clickable Asset build types would be great.
     
    Meanwhile, workaround is using filters. Unfortunately since v3 they are not saveable any more, so you'll always have to choose asset build -> type and then choose the type from the filter panel on the right.