Load Multiple URN in Forge Viewer - autodesk-forge

When I use ver.2.5 viewer.js. I can load three rvt model (a building, split each three floor to a model) in one viewer, and it fits perfectly.
After I switch to the newest viewer.js (v.2.10), three rvt model will overlap each other.
I check the difference between the v2.5 viewer and v2.10 viewer, and V2.5 has following code:
//If there is already a model loaded, we need to use the same globaOffset as the first model,
//with the assumption that multiple models are loaded into the same space (more or less).
if (this.viewer3DImpl.model && !options.globalOffset) {
options.globalOffset = this.viewer3DImpl.model.getData().globalOffset;
}
How can I get the same result as v2.5 viewer without editing the source of 2.10 viewer?

I had exactly the same problem.
Now, since 2.7, you have to get the globalOffset from your first model and create a globalOffset option to insert in your loadModel query.
var globalOffset = viewer.model.getData().globalOffset; //Get it from first model
var options = {globalOffset: globalOffset}
viewer.loadModel(path, options); //Load your second model

Related

Is it possible to implement the highlight function in Forge Viewer by receiving a specific ID from an external web page?

IFC format project is being viewed with Forge Viewer. IFC project elements (top panel, slab, right wall, etc.) are listed on an external web page, and I want to implement a function that highlights in Forge Viewer when one of them is selected.
Should I use 'GLOBALID' to implement the function?
I've been looking for Forge Viewer's API(v7), but I'm curious if it provides the same functionality as above.
Yeah, it's possible. Here is a sample demonstrating this idea:
https://github.com/yiskang/forge-viewer-iframe-interoperability
This sample supports two ways to locate objects:
By passing querying strings to viewer page's URL (See public/extlink.html):
urn: It stands for which model to load by the Forge Viewer.
idType: It stands for the IFC guid type. If the IFC model is translated by the legacy IFC pipeline, then the idType is GLOBALID. On the contrary, if you're using modern pipeline, the idType is IfcGuid.
guid: It stands for the IFC guid of the object you want to locate.
With those parameters, you can locate objects after model is loading completely immediately by passing them to the URL like the below:
http://localhost:3000/viewer/?urn=dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6ZXh0cmFjdC1hdXRvZGVzay1pby0yMDE3bGt3ZWo3eHBiZ3A2M3g0aGwzMzV5Nm0yNm9ha2dnb2YvcmFjX2Jhc2ljX3NhbXBsZV9wcm9qZWN0X2xlZ2FjeS5pZmM&type=GLOBALID&guid=2cgXCjpDT0ZxBvxMSr3pfm
By triggering LOCATE_ELEMENT_EVENT (See public/index.html):
// Trigger event from iframe's parent page
const guid = event.target.getAttribute('data-guid');
const idType = event.target.getAttribute('data-idType');
if (!idType || !guid) return;
const iframeWind = viewerIframe.contentWindow;
iframeWind.NOP_VIEWER.fireEvent({
type: iframeWind.Autodesk.ADN.ElementLocator.Event.LOCATE_ELEMENT_EVENT,
idType,
guid
});

Forge Api - Search

I am showing multiple IFC files in my forge viewer. Till here everything is fine. What I am struggling with is that I want to find values of an attribute say for name from all the ifc files in the viewer with the values I also need to to that this value has come from which ifc file.
Thanks & Regards
Get the model reference and then call getProperties
for (const model of viewer.getVisibleModels()) {
viewer.isolate(null, model);
}
Model.prototype.getProperties = function(dbId, onSuccessCallback, onErrorCallback)
{...}
We have a multimodal refresher blog, please refer here

Missing rooms issue with generatedMasterView and room material replacement using three.js

1st question: Missing room models
I used the model-derivative api from Forge with generatedMasterViews params to extract room nodes from the cloud Revit model (BIM360Team) it work perfectly fine for some model but I had the missing room issues with others.
Successful translated model
Some of the translated model's room nodes was missing and that's weird because their height and phase are the same and the rooms in 2d view were shown.
2D views has no problem at all
3D room nodes in the same floor were missing
So my question is, are their some limitation to extract the room geometry and convert to .svf files? e.g. publish view setting / view range / crop views / crop region ? or something I'm missing in my request ? I tried to align all the parameter or remove some component (e.g. furniture) but the result still the same. If you guys had noticed this issues before please help, your help would be appreciate.
2nd question: Room mesh and materials
I've write the function to highlight the selected elements and its work with almost every nodes except the room elements.
const highLightElement = (dbId, hexColor) => {
const myMaterial = createMaterial(hexColor)
const instanceTree = viewerApp.model.getInstanceTree()
const fragList = viewerApp.model.getFragmentList()
instanceTree.enumNodeFragments(dbId, function(fragId) {
fragList.setMaterial(fragId, myMaterial)
const fragProxy = viewerApp.impl.getFragmentProxy(viewerApp.model, fragId)
fragProxy.scale = new window.THREE.Vector3(scaleRatio, scaleRatio, scaleRatio)
fragProxy.updateAnimTransform()
}, true)
viewerApp.impl.invalidate(true)
}
The material of the room was gloomy white but if use section tool on it the section color already change to the color I choose (0xAB00EE - magenta). I don't know that is the room mesh different from others? or might be need some special procedure to do so?
Successful coloring nodes
Room nodes coloring
Z-section of colored room nodes
Regarding issue #1, it's possible that there are certain limitations preventing the Forge Model Derivative service from extracting room information but that would be more on the Revit side. If you wouldn't mind sharing the Revit model with us (confidentially) via forge (dot) help (at) autodesk (dot) com, we'd be happy to investigate it with the engineering team. In that case, please indicate which rooms are missing, too.
Regarding issue #2, from the Forge Viewer standpoint, rooms are just another geometry in the scene, with the only difference that this geometry is usually transparent and hidden by default. As far as I know, the visibility flag should not interfere with something like setting the material of a fragment but double-check if that really isn't the root cause.

how to get URN of clicked object(mechanical equipment ) in forge?

I have created small web app which can able to render revit model using Forge Viewer, now i want to extend to next level. there is any way to fetch URN of each object on click event. here object refer to mechanical equipment.
i want to open new web page with that particular selected object(single object). single object should be there
Not sure if you wanted the selected nodes (parts) of the model selected or visible/loaded only when the page is opened so I'd cover both options here...
You can either select the components/nodes by their dbids soon as the model's loaded (when the model tree is available so nodes can be associated with their dbids):
const selection = viewer.getSelection()
//persist or pass the dbid array as parameter for the new page
//...
NOP_VIEWER.addEventListener(Autodesk.Viewing.OBJECT_TREE_CREATED_EVENT, e=>{
viewer.select(selection) // or viewer.isolate(selection) depending on your needs
})
Or load the selected components only following here ...

How to show item in revit file using Forge Viewer?

We have a web app connected with Autodesk Forge. We were able to upload and view revit files and get the metadata of the file. Now, we want to view specific item in the file without viewing the whole file. How can we make that using the Forge Viewer??
EDIT
The correct option to pass in should be ids and not dbids, been a while since I used this so had to brush up on it...
Yes simply pass in an array of dbids for Viewer to partially load the model:
const options = {
ids: [233,2333 ...]
//...
}
viewer.start/loadModel(svfUrl, options) // or viewer.loadDocumentNode(doc, geom, options)
Note that with this approach there's no option to load the rest of the nodes back w/o reloading the entire model with their dbids passed in again.
Also note that dbids are inconsistent between conversions (they are subject to change if the model is translated again) so use externalIds of a node to map it to a component in the editor space (Revit).