Re-linking Assets

  • Is there anyway of relinking assets? I have colleague's who use Sketchup with Enscape and I use Rhino. I can open there models directly into Rhino, but the Enscape assets are just the proxies with no link, so at the moment I have to delete and replace them


    thanks for any info on this

    Graham

  • Is there anyway of relinking assets? I have colleague's who use Sketchup with Enscape and I use Rhino. I can open there models directly into Rhino, but the Enscape assets are just the proxies with no link, so at the moment I have to delete and replace them


    thanks for any info on this

    Graham

    I have done it myself, too. Deleting Enscape assets from SK and replaced in Rhino. I had hoped it would transfer since Enscape seemingly uses the same asset file for all supporting programs?


    Not sure if this kind of coding can be done realistically (or Enscape team would rather focus on each program-specific issues), but it will be really great. A bit skeptical, though.

  • Yes, I want this also! Trying to transfer assets between Rhino and Revit. The team has a well developed model with over 2,000 instances of 190 unique assets in Rhino. Recreating all the exact same assets in a different platform is difficult to automate and nearly impossible to do manually. We are trying to recreate the assets as Revit families using RhinoInside and Grasshopper, but Enscape and RhinoInside used together cause Revit to crash frequently. Open to any suggestions or workarounds for this problem!

  • I think in theory this should work, but it's going to be a complicated graph.


    Can you share your setup? Are the two projects modeled in the same coordinate system (is the origin of revit model = origin of the rhino model)?



    There's should be no need to run Enscape while rhinoinside is running. You could run the entire setup before launching Enscape.

  • Hi Pieter- Yes, models have the same coordinates. As far as RhinoInside and Enscape running at the same time, yes, I agree. Even having them both loaded not necessarily running at the same time can cause issues. Ideally, the script would run, then rhinoInside could be closed, and enscape will work fine.
    In generally the idea is this:


    1) Use the rhino block instances (enscape asset) to get the position and rotation of the asset.
    2)Place any enscape asset in the correct location in the Revit model

    3) Change the enscape asset ID to point to the correct asset.

    This may not acquire the correct proxy mesh, but in theory, it would render correctly in enscape.

    The difficulty here is of course that Enscape assets are turned into Revit families only when they are placed into the model. The don't really exist in a location that we can point to before they are placed in the model. Even with the entire asset library downloaded, we still need some sort of enscape family in the model for this to work.

    The thing that I'm trying to figure out at the moment is how to change the assetID parameter in revit. In other words, how to trick enscape into thinking one asset is another. I can't seem to figure out how to access this parameter, or if it is even possible (let alone recommended).

    Open to any suggestions. In general, it seems like this is something that many users would find beneficial, so maybe it becomes a 'standard' enscape functionality at some point.

  • If you open the enscape object (block) with block manager inside Rhino and then inside that "block" insert the same Enscape asset (Tree, Person, Etc.) then ALL instances of that block (IE: Enscape imported assets from SketchUp) will update, then just position the "Rhino" enscape asset the same location and orientation and delete the SketchUp imported proxy. Now when you close the block (asset) all of the similar blocks will now have the Rhino Enscape asset that will render in Enscape.


    So if you have 2000 assets but only 190 unique blocks then in theory you only need to edit 190 blocks to have all 2000 assets render correctly in Rhino (Enscape)


    Still a pain but a smaller pain than redoing 2000 assets.


    essentially you are making a nested block where the original block is the asset imported from Sketchup and you are "nesting" inside that block the Rhino Enscape asset, then deleting the imported geometry (proxy).

  • The thing that I'm trying to figure out at the moment is how to change the assetID parameter in revit. In other words, how to trick enscape into thinking one asset is another. I can't seem to figure out how to access this parameter, or if it is even possible (let alone recommended).

    This part is relatively straightforward with dynamo. I think all you need is add a parameter with the right name and write the GUID of the asset to it. So in short:


    1) extract position, rotation, scale and GUID of each asset and write them to a single csv file

    2) find a way to write the placeholder geometry for each unique asset (GUID) to a geometry file (like .obj)

    3) using dynamo, make a family for each GUID (add correct type parameters + write values to them + load in geometry

    4) using dynamo, place an instance of each family according the locations/rotations saved in the csv


    Step 3 should be relatively straightforward, as there should be many (non enscape related) examples online.


    Step 4 to me seems the trickiest. As you probably want to host the families on the relevant levels. So maybe you would need to iterate a bit over placement and host them to the nearest (lower) level and then update their elevation offset.

  • Hi,
    Everything about this process is working.... execpt for one critical step.

    I need to access the Enscape AssetID in Rhino, and I can't seem to find it anywhere. Please help!

    Once you place an enscape asset in rhino, a block instance gets created. Enscape knows to use this block instance to point at some specific asset in the enscape materials library, but I can't figure out how. In Revit, there is a parameter (Enscape AssetID), where you can easily access this information. Typing "what" in Rhino brings up object info with a few different UIDs, but none of them correspond to anything in the asset library. I've tried looking in Log files to see if anything comes up, but I can't find anything. If I can just get to the asset ID through rhino/Gh- or even a simple python script, this entire process will work. Please help!

  • Presumably Enscape used some type of extensible storage to add information to that block. Maybe post a thread on a rhino/grashopper support forum and ask what types of extensible storage a plugin might be using on a block and how you could access that data?

  • We solved this problem :)


    (at least for moving assets from Rhino to Revit)

    Our source code and all related files can be found here: zgfarchitectsllp/EnscapeAssetTransfer (github.com)

    The most difficult part, like mentioned above, was getting the Enscape Asset ID from Rhino. It seems like that GUID is stored somewhere in Rhino that cannot be accessed by users (we tried everything). It would be great if it were just a User Text Parameter in Rhino, but jonahhawk was able to develop a work around. By parsing the JSON files in the asset library, a .csv gets created that has all the asset names and their associated GUIDs. We then use that data to reference the block name from rhino and associated it with an Enscape Asset ID that can be put into Revit. See our documentation on gitHub for the details. We wanted to put this process out there publicly in the hope that others can use it and improve upon it.

    Ultimately, this is a functionality we hope Enscape can develop natively. We often work between different 3D applications during different phases of architecture projects, and recreating assets in another platform is an all too common practice that should be entirely automated.

    We would love to develop a similar process for moving assets from Revit to Rhino, but without being able to access the data in rhino, we believe this will be impossible. Please let us know if there is another way.

  • Hi Pieter-
    It's probably about the same, using Rhino Inside or Dynamo in terms of what gets put into Revit. Dynamo might even be better at handling the proxy geometry, not sure. In general, I prefer Rhino.Inside for most things; it's just a more stable piece of software and requires a few less components to do the same things, in my opinion. The main reason for choosing Rhino here was that the blocks were in Rhino to start with. I'm not exactly sure how we would have done it with Dynamo, but, like you outlined above, we could write all the block locations to a csv from rhino/gh, then use dynamo to reference that csv- something along those lines. That type of multistep process might be more stable any way. We talked about doing this entire process with a c# script too, which would probably make the whole thing quicker and more reliable, so we may do that at some point too.

    -Andy

  • Thanks!


    I managed to export the Enscape assets in Rhino to SKP format and imported the components in Sketchup and did the replacing in the components. The same works from Sketchup to Rhino i.e, open the SKP file in Rhino and replace the asset IN the block.


    Not 100% ideal but it's better than replacing 1000s of trees in a large model.

  • The most difficult part, like mentioned above, was getting the Enscape Asset ID from Rhino. It seems like that GUID is stored somewhere in Rhino that cannot be accessed by users (we tried everything).

    After some intense scouring, I was able to find where the Enscape Asset ID lives in Rhino. Each Enscape block contains a single mesh object, and the Enscape data is stored as UserStrings in the mesh's Geometry.


    In Python, assuming you have the mesh object, then: enscapeID = meshObj.Geometry.GetUserString("Enscape.Asset.Id"). Or meshObj.Geometry.SetUserString("Enscape.Asset.Id", yourGUID) to write it. The other two Enscape UserString keys are:

    • Enscape.Asset.Source: I have only seem this as REMOTE. (Changing to LOCAL breaks it; not sure if there are other potential settings).
    • Enscape.Asset.UnitScale: Appears to be Rhino model units per meter.

    Enscape must still use the each block instance for the asset's location, orientation, scale, etc. (If you explode an Enscape block but leave the mesh, the asset will still render, but will be located at the origin with default scale and orientation regardless of where the mesh exists).