In my Revit model I have groups of objects that I can select when working in Revit. Now, using this model in Forge viewer, I can only select the single elements (or their parent elements in the browser structure), but I cannot reconstruct my groups from Revit.
Is there a possibility, or some proposed workaround?
Do you see those groups in the viewer model browser? For example you get components grouped by Walls, Floors and so on. If the components are grouped by another way, then there is probably no direct way to select them in the viewer.
You would need to establish the mapping yourself, for example you can access the Revit elementId for a given component dbId using viewer.getProperties(dbid, function(res)) > res.externalId is the revit Id. If you store - eg. in a custom DB - your Revit groups along with the list of Revit Ids in each group, then you can map that to the Viewer components dbIds when you load the model. Using the selection event, when you select a component, check in which group it belongs to and select programmatically other components of that group. You could also create a custom UI to visualize that or derive the model browser to show those groups. It requires programming work obviously.
I agree with Philippe. The Forge translation process does not have the same notion of groups as Revit. Remember that Forge has to implement mechanisms that are valid for all kinds of different types of CAD seed files. You can implement Philippe's suggestion by retrieving all groups in Revit using the Revit API and a FilteredElementCollector, determine their member element and instance ids, and use that information to create the required mapping.
Related
this is a question and possibly an improvement request. When I use the model derivative api to fetch object properties from a converted Revit model, I don't understand why it won't fetch the room data.
In my example we are only processing 2D views, and those 2D views are interactive, similar to BIM 360 I'm able to select a room and query its properties in forge viewer. So I know the properties are there in the conversion, but for some reason, Object Tree doesn't give room objects and thus it doesn't give room parameter data.
What I tried:
Convert a Model Revit Model floor plan using the model derivative API. Viewing the model in Forge Viewer should allow you to select a room element and query its properties, such as the screenshot below.
Image of Room Selected in Forge Viewer Floor Plan View
so we know the data for the Room objects is in the forge conversion.
Using the model derivative api to fetch the object tree and / or metadata, the room objects don't exist. I read something that seemed to indicate to generate master views, but I'm not sure I understand why that is necessary because the 2D conversions I am doing, we aren't generating master views, but still seem to have the room data accessible in Forge Viewer.
What I expected
It seems to me as a developer and user that the model derivative API could fetch the room objects and their data. Please correct me if I'm missing something.
I'm trying to get the Discipline Property of a Revit Model uploaded to BIM 360. I was able to get the list of views by GET
https://developer.api.autodesk.com/modelderivative/v2/designdata/URL_SAFE_URN_OF_SOURCE_FILE/metadata
However there is no data on Discipline. Where and how can I get it?
I'm not familiar with "Discipline Properties" in Revit but I can comment on the Forge side of things:
The GET :urn/metadata endpoint simply returns a list of "viewables" that were extracted from the source design file. In case of Revit, these are typically 3D views or 2D sheets. I'm not aware of any other types of viewables that could be extracted by the Model Derivative service.
If the "discipline property" is a property available on some of the Revit elements, you might want to take a look at the GET :urn/metadata/:guid/properties endpoint. This one returns a JSON with properties of objects in one of the extracted viewables. Note that those properties are also accessible from Forge Viewer using its APIs.
In general, the Model Derivative service is trying to extract the "right" amount of information, making sure that the viewer gets all the important data for visualization and analysis, but also making sure that the size of the converted output stays in bounds. If there is some specific information in Revit designs that you need that is not extracted automatically, you can consider using the Design Automation service to process your Revit models in the cloud and extract all the information with your custom Revit plugin.
I am trying to make a function that click a button in javascript to go to a specific location.
I want to use "viewer.isolate (dbid) or viewer.fitToView (dbid)".
(Is it possible with Autodesk Forge?)
How do I specify "dbid" when creating a dwg file with autodesk cad?
A dbId is defined when Forge translates your design files (whether it's AutoCAD, Inventor, SolidWorks, Revit, etc.) for the viewer, so you cannot really specify dbIds in the CAD application. You can however use the viewer APIs to search for objects with specific properties, for example, with a specific AutoCAD handle or with a specific Revit ID, and obtain the dbId that way.
Once you have a dbId of an object you're interested in, you can use any of the viewer APIs to select it, hide it, navigate to it, etc.
I am use to develop one web app using Forge API. It's working well and good. At the same time am using design automation in forge. I can able to create Package and it's working fine.
I will process the dwg file using forge api preparing to viewer. I can able to view dwg in browser.
My issue is I have viewer click event the event click populate the element id. However, my package I can get only the object id. element id and object id totally different.
What is the conman id each object client and server side.
Summary: when user click the object in viewer I want to capture id and store my local database. and using package I need to process the user clicked object.
Example: when user click the drawing number in viewer. From the next time I want change the drawing number dynamically using call package from C# code.
For an RVT file, one easy way to handle this is to extract the Forge externalId from the Forge object properties. That is equal to the Revit element UniqueId property. The RvtMetaProp Revit add-in makes use of this.
Oh, now I just found a better, more complete and succinct explanation of Unique IDs for Forge Viewer Elements:
The Viewer gives access to three types of IDs when dealing with Revit files:
dbId: this is viewer specific and used to manipulate elements within the viewer, such as for the .getProperties() method.
Revit ElementID: exposed as part of the Name property in the viewer. When you select something, the Property panel title is in the form of 'Name [12345]'. You can parse this name string and extract the element id.
Revit UniqueID: exposed as the externalId property in the .getProperty() response.
We are trying to create a system that can displays BIM Model using Model Derivative and Viewer API, and provide functionality to use updated BIM Model, while preserving the mapping between element (currently we are using dbId) with some metadata.
The problem is that when we post Model Derivative translation process with updated BIM Model(updated meaning that we modified Revit file using Autodesk Revit or equivalent toolkit), the original dbId is lost.
While looking through viewer API, we've found that through model.getProperty with dbId, we can obtain a value called 'external-id', which seem to be preserved even after the update. However, this seems like that this can only be accessed in client side; there is no MD api that provides external-id property(correct me if I am wrong please).
As the last resort, we are trying to map dbId=>metadata mapping from original BIM model to dbId=>metadata mapping in updated BIM Model by creating a dbId=>dbId mapping using name as common feature, but we are worried that adding / removing BIM Model's element while updating would cause name mapping to be invalid.
TL DR; the question is:
Is there a way to obtain unique and preserving id per each ObjectId / dbId in Model Derivative translation process with updated BIMs?
Yes, exactly.
In Revit, the UniqueId is the safest method to persistently identify elements.
This UniqueId is available in the viewer, and unfortunately currently not in the model derivative API.
For an immediate solution, I suggest that you create you own shared parameter in Revit for all elements that are of interest to you and populate it with the UniqueId value. Then, that information will become available to you in the model derivative API as well.