Description
Key Learnings
- Explore ways to manipulate Revit data using Dynamo
- Learn how to use Dynamo to add outside data to your Revit model
- Learn about Dynamo packages that improve Revit data visualization
- Learn how to create a basic dashboard with Dynamo
Speaker
- Carl StormsCarl is a seasoned professional and Head of Community, Advocacy, and Technology at Newforma, with over 25 years of experience in Architecture, Engineering, Construction, and Operations (AECO). Renowned as a BIM Crusader, his expertise in Building Information Modeling (BIM), Virtual Design and Construction (VDC), and Project Information Management (PIM) allows him to seamlessly blend innovation with practicality. Carl has a knack for simplifying complex ideas and loves sharing his knowledge through blogging, speaking, podcasting, and as an Autodesk Expert Elite. Beyond AECO, he gets a thrill out of unraveling tech mysteries and learning new coding, no-code, and AI skills. These new additions to his skill set showcase his flexibility and dedication to keeping up with the latest in technology. Approachable and always up for a chat about the latest technologies, workflows, gadgets, or hacks, Carl is a valuable resource in the AECO industry.
CARL STORMS: Going up at 8:30 in the morning. Love it, everybody's enthusiasm. So today, we are doing a Dynamo lab, not the magician, but the visual programming. My name is Carl Storms. I will be your host for the next 90 minutes.
So we are going to be talking about Revit data visualization. And really, we're talking about data. We're going to save the visualization fun for the very end. So I'm going to make you stick around to see the visualization.
You will also see that there's some maple candies at your desk. I couldn't bring the pancakes this morning. But I brought the syrup all the way from Canada. It'll give you a nice sugar rush. So feel free to enjoy. And with that, let's begin.
If you want to, you can certainly get the data set, the package, all that great stuff off of the Autodesk website. But you can also go to my website and pull it down here or just use the QR code and get it instantaneously, for any of you that are not working on the computer lab. I also have a couple of assistants in the back that have a thumb drive. If anyone has a laptop and they want to partake, they can help you out.
A little rundown of what we're going to be looking at today. So I'll do a quick introduction of myself and my wonderful lab assistants. And then we'll jump right into the exercises. Of course, because Dynamo is a zero-index program, we start with exercise 0. We start a little slow.
We build up to the four exercises where we get into data manipulation and visualization, which used to be a package called Mandrill. But now it's got some company. So we take a look at NodeModelCharts, Data Shapes, and Mandrill, and then questions.
That fine looking fellow is me. It's always awkward to talk about yourself. So I have a slide that does it for me. Thank you. More important are our lab assistants in the back. Now you can see we have Jason, John. They're awesome. They can help you with anything.
Marcello, you know Marcello. He kind of comes in and comes out and bounds all around. But we show him up here because he probably will come in at some point. He's a great guy. And with that, let's begin.
So if you are working on the lab computer, there's a little data set window. So if you double click on the 0 data set window, it will open up a dialog box. And I am-- 1, 2, 3, 4, the fifth one down, you will see the Revit data visualization. You click on that. That's where we're going to find all the goodness for our exercise.
Your handout's going to look something like this. Feel free to pull it up on the second screen and follow along. So was everybody able to find the data set? Good to go? All right. So we're starting with exercise 0. And you can see we have an exercise 0 folder with which we're going to open the sample project. So let's fire that up inside of Revit.
We are working at 2020. So open the 2020 data set. For anybody using a different laptop, we do have other versions there available for you. Then once you get the data set open, we're going to open up Dynamo with the Manage tab. All right.
Once you've got Dynamo open, you can just use the little window to open, navigate to where the package data set is on your computer, Exercise 0 folder. And you'll see that every exercise has a begin and an end. The begin is where we start. The end is if you want to just skip to the end and spoil your fun. I don't recommend it, but you can. Or if perhaps you don't get something quite right and you want to make sure that you have a place to start, there's always a beginning file.
So if we begin with task 1, so T1 opens up the graph. Now, again, first thing in the morning-- but you're also my guinea pigs. I'm trying something a little different with this lab to help people out. Because we don't have two monitors, a lot of times it's hard when we can't see the data set and, oh, sorry, the handout and our screen to sort of go back and forth.
So if you look up in the top corner-- and if I get my clicker, I'll show you-- you'll see there's a little node up here. What that node does is as soon as you hit Run, it's going to open the web browser. And it's going to take you to a Dropbox site. It's going to open the Dropbox site, and it's going to give you an image of the completed Dynamo graph.
So if you ever get lost, you can just navigate back that image, and you can flop back and forth between the two images. The only thing that I don't know is I haven't tested it with 100 people hitting the Dropbox link at the same time.
So just as an example, as soon as I hit Run, nothing's really going to happen with the graphs because none of the graphs are ready to go. But it pops up the Dropbox site. And we have a completed version of the graph. And so now you can navigate, view, and do whatever you need to do to have that as a backup. You can close it behind the graph and go back in the graph and do what you want.
If it's not something that you want to use or if it's slowing you down, when you go back in here, you can simply just delete that. No harm, no foul. If you're not sure if you're going to use it again, you can also just select the node-- and I'll zoom in so that we can see it-- right-click and then freeze.
When the node is frozen, it won't run. So that way the next time you hit Run, you won't pop up the screen if you want. So again, feel free to use that feature or don't. I'll be interested to hear the feedback at the end of whether it was helpful or not or if we blew up Dropbox by having 100 people hitting it at once. All right.
Has everyone got to the data set? Has everyone been able to see what we've got in the screen here? I see some head nodding, so I'm going to say that is an affirmative. And we're going to begin.
So the idea with this first data set-- and we're going to start simple-- is to take a look at a couple of packages out there, namely Rhythm and archi-lab-- and some of the things that come with those packages that allow manipulating, and more importantly, looking at our data inside of a Revit model become easier.
So we're going to start with the first one here where we see we have Rhythm. We've got a couple of nodes already there, so the all elements of [? model ?] category. We have this available inside, right out of the box. This one just does a slightly better job of getting the content for you. And then we also have the Element filter by name.
So what we're going to do to add in here is we're going to add in a couple of out of the box nodes. So we're going to need a code block. Code block, we can simply just double-click on the screen, and it's going to pop up.
Inside this code block, we're going to put two things. So they're both going to be string pieces of information. So we can start with our quotations because we're going to write a string. And the first one is going to be toilet. It helps if you spell it right. And we need a semicolon.
Now we could create another code block, but why bother? We can just hit Enter, which gives us another line. So then we can have two outputs. So now the next line, we're going to use semicolons-- quotations again. And this time, contains. And this one, I spelled wrong on purpose. And I'll tell you why in a second.
So what we're going to do with these few little nodes here is we're going to pull all the rooms from the package. And we're going to use John's Rhythm node here to investigate that information. And what we're going to do is we're going to see of all the rooms that are in our model, how many of them contain the word "toilet" in the title?
So if I pull this over here, the value that we're looking for is "toilet." So I plug that in. That needs to be correct because it's looking for a very specific phrase or keyword inside of the rooms. So that needs to be spelt properly, or at least like it's spelled inside the model.
The next one is our Filter method. This is where things get cool. So if I hover over the Filter method, this tells us what it can filter by. And you can see there's lots of different options in there.
So we can filter by doesn't include, contain, not contain, start with, doesn't start with. You can see there's a lots of ways that we can filter what we're looking for. It's running on something called fuzzy logic. And what this means is that it understands or tries to understand what you're looking for.
So what I want it to do is find all the rooms that contain the word "toilet." But I've spelt it wrong because I want to test how fuzzy the logic can be before it actually works.
So now I've got that put in place. The next thing that I want to do is I want to pop out a few watch nodes so that we can see what's actually coming through in our code here. So a couple watch nodes. So you can just right-click and search, watch, and then Control C, Control V. So we've got our two watch nodes.
But I also want to be able to read the information that I'm pulling out of the room. So I'm going to pull up a couple more out of the box nodes. So room number. And again, I'm a right-clicker when I search. So room number and then room name.
Now, if you were keen there as [? I was ?] typing away, you may have saw that there was two names. So if you get the wrong one that comes up that doesn't look like that one with the string at the end, it's the other one.
So I'm just going to move this over a little bit so that I can grab and pull my information in. So I'm going to take the information that comes out of my Rhythm node and put it into my room number and do the same thing for my room name. And then I'm just going to stick it into the watch nodes so I can easily see.
So if you happen to have your Dynamo as set to automatic, the fun's been spoiled. And you've already seen it. I had mine set to manual. So I'm going to hit Run or F5.
And now we see that we have out of the 100 or so rooms that are in my project, there's only three that contain the name "toilet" in the name. And even though I spelled "contains" horribly wrong, which is pretty much my standard, we do see that it still understood what I was going for. It searched for it, and it brought it in place.
So you can see how this can come in handy when you're very quickly searching for something. You're not exactly sure how it's spelled. You get the Canadian, the American color put into place. You have the ability to find the information and bring it through. So that's pretty cool. So we were able to use those nodes to very quickly search through some stuff, filter it, find what we want.
The next part of this is I want to show what this looks like if we put our information into the archi-lab list selector. So if we take the top one-- in this case, for me, which is the room numbers. I'm just going to zoom in here. And we simply just select our output and bring it into our list, well, that's not very exciting. We just have the room numbers.
But the little bit of nugget of gold-- the little magic comes with this is that I can now select whatever I want. So I don't have to worry about messing around and filtering. And it's Black Friday, in case anybody's wondering.
[LAUGHTER]
Don't have to walk around or mess. We have the ability to get whatever we want from our list. So I'm going to just copy one of these watch nodes. Plug it in. And then I'm just going to pick one of them, let's say, 232, and then run again or hit F5.
And so now you see that with that selector, I'm able to choose what I want from the list in a very user-friendly way. I just pick what I want from the list. I get what I want. I don't have to slice and dice. I don't have to worry about list management. I can just choose what I want from the list by using that.
So now we're starting to see that while these are very simple additions to a package, they can make your workflow much easier. All right. Everyone get that? All good? All right.
So we'll carry on with the next part of this task. You can continue using this same data set. If you wanted to start from scratch, there's another data set. But it's the same model that we're working with. We're just going to move down to the next set.
AUDIENCE: Carl?
CARL STORMS: Yes.
AUDIENCE: Are you going to continue to use rooms because they've been deleted out [INAUDIBLE]?
CARL STORMS: Yes. Yes. We are going to continue use rooms. So for task 2 in this exercise, as you can see, I just navigated down to the next set. We're going to look at some very similar workflows. Except this time, rather than dealing with strings or text, we're going to take a look at using numbers with the same package or a similar package from Rhythm.
So we're going to be using some similar things in here to get it in place. We need another code block. So again, if you just double-click on the screen, and we have a code block. This time, we're going to have three pieces of information that we've put in the code block.
The first piece is going to be a string. So quotations, Area, capital A. The next one is going to be a number, 125. Because it's a number, we want it to be a number. We're not going to put it in quotations. If you put it in quotations, that number becomes a string. So it's not 125. It's character 1, character 2, character 5. So you want to make sure that it's not in quotations, semicolon.
And the last one that we're going to look at here is greater than. Again, we're going to be using fuzzy logic. So I'm going to test the system. And we got [? in ?] place.
So the idea behind this is, what we're doing with these sets of nodes is we're going to query all of the rooms in our project, assuming we still have rooms in our project. And we're going to see which ones have an area of 125 meters. Yes, as a Canadian data set, yes, it's in meters. We're going to find the ones that have 125 meters or greater area.
So now that we've got the code block in place, I'm just going to pull it over, zoom in again. And we're just going to start adding it in. So the parameter name is Area. Because it's a parameter reading directly from Revit, this has to be spelt exactly as it is in Revit, which is the capital A. So we add the Area into here.
The next one is the value, 125. And this is arbitrary. Again, I mentioned I just want to find all the rooms that have an area of 125 meters squared or more. The number can be whatever you want. And then the filter method. If I hover over this, again, you see the way that it filters. You'll see that there's some slightly different versions than we had in the past because we're dealing with numbers this time instead of strings. So I'm going to use my greater than.
So we're going to want some of the same pieces that we had from our last go of it. So I'm going to just copy instead of search for it. So we're going to want our room number and our room name. So I'm just going to select them both, Control C and Control V. And then I can move them down into here. Unplug them first.
And the last one that we will have to search for to add in is room dot area. So if you right-click room dot area, there should only be one. And then we're in place.
Similar to the last exercise-- just give me a little more real estate here in the screen-- we're just going to take all the outputs from our Rhythm node and plug it into each one of these-- so our rooms, our names, and our area. Just going to move the archi-lab out of the place for the moment. And once again, I'm going to copy one of my watch nodes and use three of those. Just easier for me to see the watch nodes. You can use the pin if you want.
And then if we quickly run, you can see that we see the room numbers. We see the name of the rooms. And we see the areas. And you can see, even though I massacred "greater than," the fuzzy logic did me a solid and understood what I meant. And we now have all of the areas that are 125 meters squared or greater, again, a quick way to sort what you want and put them into place.
So the reason that I have the archi-lab node on here, again, is for simplicity of selecting what you want. If you've ever dealt with lists inside of Dynamo, they're a great feature, but they can be a bit tedious to sort through what you want. So if we take-- in this case, I'm going to move this out of the way. And I'm going to just deal with the names.
And so if I plug the names into my dropdown list and hit Run, it appears that nothing has happened. That's not true. It's a dropdown list, which means we have to use the dropdown.
So if I pull in the dropdown, you now see we have access to all the things. Again, doesn't seem that exciting until-- wait for the magic-- I copy the watch node-- let me zoom in here-- plug it into place. And then I'm going to select just the Lobby. And we see how spread out the lobby elements are.
I hit Run. And so now I have access to just the Lobby information that I want to pull through. So again, the idea is that it gives us the ability to have an easy way to select what we want when we're bringing it through.
The one thing that I want to stress is the information in the two examples that we're bringing through is just strings or numbers. We're not actually connected to the element. So keep that in mind. If you're looking to be able to feedback to the element, this may not be the best workflow.
Everyone able to get that work? Some nodding heads. We have a question down here on the front, Marcello, just right at the very front. All right. We're going to move on to the last exercise, not the last exercise, the last task in the first exercise. I don't want to-- don't want to to skip out too early.
All right. So, again, you can open up task 3, Begin. Or you can continue working on the data set that we have. And we're going to take a look at the last two nodes that we have here.
So we've got all elements of Model Category. So this is nice because it basically combines two out of the box nodes into one. We want to verify sometimes when data sets are set, [? these ?] things skip. So you want to verify that it says, in fact, "doors" not "door tags" or "rooms" or anything else. So you want to make sure it says "doors."
And the one other node that we need to bring in here is phase created or Select Phase, my bad. So if you right-click-- so Select Phase. Just moving the archi-lab node over. I'll zoom in here for you.
So Select Phase just says which phase we're dealing with. In this one, we're just going to keep it simple with New Construction. And we follow along. So our elements are our doors. Our Phase is our phase. And if we just copy one of our watch nodes four times--
So what this ingenious little node does that came from the archi-lab package is it allows us to sort our doors by which way they're handed. We don't have to search for it. We don't have to do it. It just pulls them all out.
And you can see it automatically takes all the door information and says, these ones are right-handed. These ones are left-handed. These ones are right reverse. These are left reverse. Super simple.
Now if you hit Run, you get all that information. So that's great, although it takes up a lot of space on my screen. The one other thing that we can do with this that's handy is if we have a node, you can rename any node inside of Dynamo.
So you can see that this particular watch node is coming from right-handed. So if I right-click on the node, I can say rename node. And then I can call it something that makes it more useful to somebody else that didn't create the node.
So I'm going to say RH because I'm lazy, but right-handed. And I tend to-- it may not be your workflow-- but I tend to always keep the original name of the node inside of there. A watch node, it's pretty easy to tell that it's a watch node.
But if you get to something more complicated, sometimes [INAUDIBLE] recreated. And they're like I know this isn't a dog's breakfast node. What is it really called? So I tend to leave the actual name inside there when I keep it in a place. So just hit Accept, and you can see. We can go through, rename all of them. But I think we all get the gist, that we can very quickly right-click and rename the nodes.
So how did that go? Everybody able to get that done? Pretty simple? Good. A nice easy way to break into a Wednesday morning class. So let's go ahead and move on to task 1. So I need to close out of Dynamo and need to open up a different lab or a different Revit set.
So the next exercise, we're going to be dealing with warnings. And in this one, we're going to be using the Bang! package, or as I like to say, bang! To make sure everybody's awake in the morning. There is an exclamation point after it. So you have to say it like that.
So now we want to go to the data set, to exercise folder 1. So exercise folder 1, and then sample project. It seems like the same name. But it's not the same data set. So please navigate to this data set.
And then once the data set gets open, you want to make sure you've got a good view of the 3D model on your screen. So you maybe want to zoom in a little bit. Then we need to fire up Dynamo again, so under the Manage tab.
And then once we get Dynamo open, we can use the Open tab, exercise 1 of the data set. And we'll begin with Warnings, Part 1, Begin. And as you can see, this is a rather simple beginning point. Again, just a reminder that we have the little Dropbox link. If that's to you, use that. If not, you can freeze it, and then won't keep popping up when you're running your scripts.
So this one's very simple on purpose. And the idea here is what we want to do is we want to visually see all the warnings in our model. And I'll put a caveat on that when I say "all the warnings in the model." What it does is it's going to show you all the warnings in the view that you're attached to, which is why I have an overall 3D view because everything is contained in it. So it's going to show me all the warnings.
So now that we've got it up in place, we need to throw a couple more nodes on here. And so what we want is Element Override dot Color View. It's a mouthful. So Element Override. There's only one R. Element.Override. There you go. So overrideinview and override-- sorry-- color. We want to override the color. Element.OverrideColorInView. So this is what we're actually looking for. Element.OverrideColorInView. It's much easier when you can see it.
And the other one that we're going to look for is something from the Bang! package. And I said it quietly this time. So if we right-click Warning Tools, and so if we go over to the Bang! so Bang, Revit, Element, Warning Tools, and Get Warnings.
So we throw that onto the screen. And so now we see why we had the bool there already. We need to toggle it on or off to let it know whether or not we want it to run. So in this case, we want to make sure that we do. So we already have a boolean there that should be set to true. So we can pull that into our toggle.
Now we've got our color. I have it preset to red. Red seems like a good color for warnings. You can make it any color you want. That's the beauty of the new color selector. Feel free to be individual.
And then we're going to take the failing elements, so the things that need to be warnings. That's it. We've created the graph. It's all good. Hit F5 or Run. Tells me it's complete.
I head back inside of Revit. And all the ones, there's not a ton, but they're-- at least there is some. We can see that the warnings show up in red. So we have a visual representation of what are the issues and where are the warnings. So that's pretty cool, right? All right.
What if we don't want to see all of the warnings? What if there's specific warnings that we want to see? Well, we've got you covered. And by "we," I mean John because he made the package. But we've got you covered.
So if we go back into our Dynamo graph, again, you can continue with this exact same graph. And all we're going to do is we're going to copy a couple of the nodes that we already had. So I'm going to copy the color palette and just put it a little further down in the graph. And I'm going to copy the OverrideColorInView and just put it a little further down the graph. I'm going to unplug it here.
So now we're going to bring in a couple more from the Bang! package. So again, underneath, Bang, Revit, Elements. This time we're going to Warning. And we want to bring in m Elements, so this guy right here. And the other one is underneath Selection. So again, Bang, Revit, Selection, Selection, and then All Warnings of Type.
So now we can choose the types of warnings that we want. And again, depending on your projects, there's going to be different warnings that show up inside of here. For this example, I'm going to use the third one down, Highlighted elements are joined but do not in dot dot dot dot. It's a cliffhanger.
So we select that. We tie it into our warnings, our warnings into our element. I'm going to choose a different color because we already used red. So I'm going to use blue. But again, whatever works for you.
Now there's one thing that we need to do before we hit Run. And if you've already done it, we can fix it. Because we have two Element.OverrideColorInView, if we just hit Run, it's going to execute both of them. They're going to kind of keep fighting with each other. And we're never really going to see what we want.
So just like we did with the Dropbox node, if we select the one from our original and we say Freeze, that node won't activate. And so now when you say, Run, F5, and we drop down, so we see the original red, which is part of all the warnings. And now we see blue, which is just the specific warnings that we're looking for.
So again, very quick, easy way to visualize some of your Revit data. We've got warnings. We were able to see it very quick. I've seen some really cool variations of these that people use as Dynamo player graphs where you can just click it and run it through.
One of the ones that I saw-- and the person that did escaped me. Oh. The BIM, the Aussie BIM Guru has an example where on top of this workflow, he also throws in some transparency so it makes everything 50% transparent so you can see through things. So if one of the warnings happens to be in the middle of a building, I can still see it. Very cool. All right. Two down and more to go.
Going to pause for the cause, take a drink. And then we're going to step on to 2. Question.
AUDIENCE: So why are we [INAUDIBLE] connection [INAUDIBLE]?
CARL STORMS: It didn't ask for us to have it toggled. So the difference was with that first one, it gave us the ability to set it so that if we had it as part of a bigger-- a bigger graph, we could say, yes or no to Run. So that first one was specifically set up to say, tell me to run. Whereas the second one just said, I run regardless.
All right. So we're going to close out of this Dynamo graph. We're going to close to out of this data set. And we're going to move on to exercise 2.
So this one, we're looking for the exercise 2 folder and my world-famous LEGO project. So we want to get some fancy LEGO blocks on the screen. This is old school. This isn't Star Wars LEGO. This is, you know, the little blocks that we stepped on as kids.
So now that we've got that placed once again, going to fire up our Manage tab. And oops, I forgot to close Dynamo. So I'm going to close Dynamo. Fire up Dynamo. And we're going to open up exercise 2 and task 1, Begin.
So in this particular example, we've already got lots of goodness set up for us. And what we want to do is we were going to run this. It's going to do an Excel spreadsheet. So I'm going to zoom in here in a second. I'm just going to freeze this.
So before we run it to see it extract the data from Revit and Excel, a couple of things. Verify that your Categories says Generic Models. This is one of the ones that sometimes will change to something else just because it feels like it. So you want to make sure it says Generic Models.
So once you've got that validated, we also want to scroll over to where it says File Path and Browse. What we need to do now is tell it where you on your computer are going to save this. So let's say the desktop.
So you hit Browse. And you actually navigate to the desktop. And this is where we get an opportunity to name that Excel file that it's going to create. So basically, what we're doing is we're going to count how many blocks are inside of our little LEGO masterpiece. So I'm going to just call it count. Again, you can call it whatever you want, but this is so that once you hit the Go button, it's going to extract the information, and it's going to run.
So now it knows what to call it, where to save it. And it knows that we're looking for generic models. So we should be all set to hit Run.
Now the caveat that I didn't mention is you need to have Excel on your machine. Otherwise, you won't see Excel pop up. So now we've got this little graph that tells us the brick size. It tells us how many of each brick, and it tells us the family. So that's pretty handy. It's good to know how much stuff. I know it's a simple model. But the idea is that we were able to do a little QA/QC in our project.
However, wouldn't it be handy to be able to know what size we have, how many of each size, and what color that size was? So not just that we have, I don't know, what is it, eight 2 by 2 blocks, but that we know how many green and red and blue 2 by 2 blocks there are. So that's what we're really going to navigate and try to solve in this particular exercise.
So the first task was just to show you information that we already have, how we pulled it out.
AUDIENCE: So if we got like a warning for Excel to register, [INAUDIBLE]?
CARL STORMS: So if you've got a warning for Excel to register, click OK and rerun it. The class right after this will thank you all for it.
[LAUGHTER]
All right. So that was it. That task was easy. You guys flew through with flying colors. Awesome. Good work.
So for the second task, again, you can start with Task 2, Begin. But we're really going to take this same graph. We're going to remove some of the nodes that we don't need, add in a few more, and get that more in-depth ability to get our brick count and our color at the same time.
So I'm going to just close my Excel. And please close it. Don't hide it. Dynamo really doesn't like it when you try to run Excel. If you already have Excel open, it gets all excited and doesn't do good things.
So you can start with color and count Task 2, Begin. Or we can use the same graph. We just need to delete a few things that we've got in place here. So we're not going to be using this Clockwork node. So you can select it and just hit Delete, and it goes away. We also won't need these two Family nodes. You can select FamilyType.Family and Family.Name, hit Delete. And they go away.
So what we're going to do in this exercise is we're going to do a couple of things. We're doing some sorting with keys. And we're going to deep-- dive deep-- that's a mouthful-- into list at level. Not really deep. I mean, it's early morning. But we're going to look at list at level and see how we can manage data using that.
So to get there, we need to have a List.GroupByKey node. So again, if we right-click, List.Group-- so List.GroupByKey. So we pop that up here. So I'm going to take this archi-lab node and just sort of pull it down to give me a little more space.
Now this next node is an absolute mouthful. But it's an amazing node. So now we need to get from the Rhythm package, and this is going to take a while, wait-- Element.GetParameterValueByName case insensitive. I'm not repeating it.
So if we go to Element dot-- actually, you know what? Shortcuts are much better, case insensitive. And you'll see that they pop up here. We've got the two of them with a nice little Rhythm icon.
And the one we want is Get, not Set. So I select Get. There we go. And the reason it's got such a long name is because it's awesome. I don't have to remember if something is in lower case, upper case, title case if I want to do a little bit of mocking case. I can use whatever I want, and it's still going to work.
We also need a code block. So if we right-click-- and I apologize in advance. Sorry not sorry, I think they say. But it's brick color. But it's colour with a "u." The parameter was created with "u." So we have to spell it with "u." Otherwise it's not going to work. So Brick Colour.
So the Brick Colour is our parameter name. So we can pull that into here. For our list sorting option, we're going to take all of our elements, so generic models. All of the bricks are generic models. We're going to take all the elements and pull it into here.
And then we're going to use the family type, so the family instance. So what is each one called? And if you had a keen eye, you noticed when we pulled the Excel file that each block, the family name, is the size. So we're going to pull that up into here. And then we're going to take the groups. And the groups from our sort list by key-- and I apologize for all the zooming-- gives us our elements.
And the last piece of the puzzle is we want Element name. That way we're reading the name. And it just makes a little more sense to us as humans. So Element name. And that gets me every single time. Element.Name. Notice the different logo.
You want to make sure you have the one that's not Room.Name but Element.Name, Element out to string. All right. So now we plug that value in.
So now, if we quickly hit F5 or Run just to take a look at what we've got so far so that we can validate it. So yes. You're going to get some Run complete with warnings because of the graph. That's fine. What we're really looking for is the information that comes out of here.
So you can see that we have the materials. And they're sorted. So the materials are what we're looking for. The colors are are base material. If I go up here, you can see that we have-- and let me zoom in so you can actually see what we have-- you can see that we got the size. And if I scroll over to the name, you now see that we have the color name, which is much more useful than the material. So we now have the color of each block.
The next step, though, is we want to have the color of each block. But we also want to have the size of each block. So not just each color and not just each size, but we want both. So we need to do a little bit more to make that happen. So I'm going to unpin these.
So now we're going to add a List.GroupByKey. So we've got one here. We can just copy it. And we're going to take our group-- sorry. I just keep running out of space here. We're going to take that same group from the original List.GroupByKey and plug it into our list. And then our element names are going to be the keys.
And if we hit F5 or Run, you'll see we get a bit of a warning. And if we hover over this, it's telling us something's not supported. Something's not quite right. And this is where the list at level comes into play. It's not reading the right information from the right level.
So if we hit list on our little arrow key here, you can see we have the ability to use levels. So if I zoom in and we select Use Levels, and in this case, we want it to be at level 2, which is usually the default. And then we can do the same thing below. And if we hit Run again, you see the error goes away.
And if I quickly sort in here, now you see that we have two lists, actually part of a dictionary. But you could see at the top, it tells me that these are the green elements. We have four green things. If I move back down, you can see I now have red, blue, yellow, white. And then I have each item in that particular size that is red, 2 by 4. And then I have the white.
So you can see that by doing this sorting and grouping, yes, we had to go through the process twice. We are now pulling not only the size of each element but also the color. And now that we've got it sliced and diced the way that we want, we can now feed this information back into our original graph to spit out this into an Excel spreadsheet. So let's carry on.
So we still need to do a little bit of housekeeping on our old element. So we need three more nodes. So we need List.FirstItem times 2, So twice and then we need a List.Count. We also need to slightly tweak our code block here. So whether you choose to tweak the one here, like I'm going to, or start from scratch, either will work. You just need it to be in this particular order.
So the first one is Brick Size. The next one is Brick Colour with a "u." That's not "color." Wow. Now I get it. I'm like, that's how you spell it. And then Brick Count and then 0. All right.
So now we've got that in place. Let's connect these together. So I'm going to take all of these and just move them little bit off to the side. And we need a List.FirstItem. And we want to set this to level 2. So List.FirstItem at level 2.
Below that, the next List.FirstItem. This one, we're going to set at level 1. And we can just use the little arrows to make sure that we have it set to level 1. And then, where's my hiding? My List.Count down at the bottom.
So we've got our three pieces. I'm going to pull this just in the middle to make it a little clearer. We want to take our groups from this guy and tie that into our lists. So List.First and List.Count. So again, our groups goes into our List.First and our List.Count. Our unique keys goes into this List.First, which is at L1. Everyone with me? All right.
So now we're going to plug these into our inserts. And what these inserts do is they tell us to basically put a column header inside of our Excel file. So our first one up here, the level 2 List.First goes to our top insert list. The second one goes into the second. That's our Insert.L1. And the count goes into the third.
So again, our List.First at L2 is the top list insert. List.FirstL1 is our second list insert. And the List.Count is our third.
So now we just need to verify that we've got everything good. We've got a place now. What we might want to do is give it a different name. We don't want to overwrite the original graph. We want to call it something else. So you can call it whatever you want. I'm just going to call it Count 2. So we verify that it's going to our desktop. Give it a different name. Say OK. And if Excel happens to be open, make sure Excel is closed before you hit Run.
So now if we say Run, we now get a slightly different brick size that's missing a few things. What's missing? We got the brick size, and we got the color. The count is not right. [? Out. ?] All right.
So I know exactly what I did or what I didn't do, more importantly. Remember when I was going through, and I said, hey. Let's make sure that this is at level 2 and this is at level 1. In my head, I said, also make sure that List.Count is at level 2 because we want a count at each level. So you want to count every list, not just that we have seven lists.
So list, use levels, level 2. Now, again, make sure that your Excel is closed. Hit Run. There we go. There's the magic. Brick size, brick color, brick count. And so now we have each size of brick that exists in the model. We have what color each size bricks in the model and then the specific count for each size and color. So we got a little deeper into the information, got a little deeper in there and was able to see what we want. Good stuff, right? All right.
All right. We've got one more data-based exercise. We're going to do some work with doors. And then we get into the fun colors. So stick with me. I guarantee it's worth it.
So we can close out of this data set, we can close out of Excel, close out of Dynamo. And we'll open up a different Revit example. I go to Open, exercise 3, sample project 2020, if that's what you're using. Once again, fire up Dynamo. Navigate to the exercise 3 folder. And Doors, Task 1. Begin.
So once again, you can delete this, freeze this, or use it. So this particular graph, again, is another one that's already set up. Everything we need is here. And what we need to do, again, is two things. We're going to pull some stuff from Excel. We need to verify that that first one, the categories, does, in fact, say "Doors." So you want to make sure that the category says "Doors," not "Door Tags" or something that's not Doors.
And then, again, we want to scroll over to File Path, way over on the far side. And we want to navigate to our desktop and give it a name. And we're going to call this Door Export. So this first one, again, we just went through a graph how to export stuff. And the idea here is what we want to do is inside of this particular project, there's a lot of door information that we want to spit into the project.
We don't want to select every door and manually type in six pieces of information to every single door. So what we're going to do is we're going to extract-- extract the information that we want from Revit through basically a door schedule. And then we have an Excel file with all of that information that we can fill in. And then we can use however we want, fill that information, and put it back in.
So this graph is our starting point. What it's doing is it's pulling all of that data out of Revit for us. So simply, we hit Browse, navigate to wherever we want to put it-- desktop. And I'm going to call it Door Export.
And then once we've got that, you can hit F5 and run. And I'm just going to make this a little bit more readable here. And it's hard to see on the screen. But you can see there's a bunch of doors, and there's a lot of missing information.
So in an actual project, you would fill this in with information, or let's be serious. The intern would fill this in with information. And then we would take it and import it into our Revit file. In this case, because we don't want to do that, our interns aren't here, we're going to go to just line number 7, so door 103. And we're going to type in some information just so that we can see that the process works.
So I'm going to change 103. I'm going to put 103DYN. You can put whatever you want, but just so that we can easily tell that the 103 that's in the model has been changed to something else. Then throw in a frame type, say, hollow core, frame material, wood, 'cause I'm old school like that. Finish is going to be cherry because it's sweet. Manufacturer, let's go down to Lowe's. And then we'll give it a one hour firing, not an exclamation firing. Or maybe, maybe. We don't know.
All right. So on this, the seventh line for door 103, we've changed the door number somehow by adding something to it, so 103 something. We've added a frame type, a frame material, a finish, a manufacturer, and a fire rating. Again, we could do more. But at this stage, we just want to do that. Now I'm going to ask you to save it as Door Import. All right. So now we have our Excel data set for the next issue.
So in this example, we actually have to close out of this Dynamo graph. We're not going to reuse this. So we just close out this Dynamo graph. And then we want to open, from our data sets, exercise folder 3, the T2 Begin. I believe Arnold says, (IMITATING SCHWARZENEGGER) I'll be back for T2. Sorry if that was bad. But I had to get it in there.
All right. So now we've got our second set. Before we start working on this, I'm just going to zoom in to this bottom corner inside the Revit file. And you can see, we're at door 103. This is just so that once we import and run the information, we can quickly see where all the changes are going to happen. So you want to get it down to 103, back into the Dynamo graph.
So again, essentially, what we're doing here is we're just going to be pulling in that information. The graph is already made. So if we zoom into our file path, as we've done in the past, we need to make sure that we're pointing to the right location. So in this case, we're going to browse to wherever you just saved that Door Import file. We're going to use the file you just made.
So we say Browse-- I saved mine on my desktop-- and Door Import or whatever you call the one you created. If you didn't create one, there is one in the data set that you can use. So now we've got everything set up as need be. And I'm zooming in and out just to make your eyes get blurry. Now we can just hit Run.
So it pulls up the data set. It's going to pull up the Excel. It always does that. We'll also notice-- if I get out of the Excel-- that we have a bunch of errors. So we need to do a little bit more work into our graph to get into place. And the piece that's missing is we need to connect these two.
So we've got all of our information. And then we've got the parameters that we want to set with it. So we were taking, say, for example, the fire rating, and we want to set that. So we need to simply just take the item and pull it over to the corresponding value. So there should be fire rating, fire rating; manufacturer, manufacturer. And I think there's six or seven of these that we have to do, just walking your way down. Item value, item value, item value.
So once we've connected those, again, verify that your Excel is closed. And then try running again. So now we get even more yellow. Now the thing about yellow inside of Dynamo, it's kind of like the warning you get [? in the ?] bottom corner of Revit. When you're new to it, you say, OK. That's a warning. I should pay attention. But very quickly, you stop paying attention. We shouldn't stop paying attention in Dynamo. But sometimes, yellow is a warning, meaning that it may have worked. But maybe it could have worked better.
So to validate that, if we just close Dynamo, and we look-- and it didn't work. Now I don't know what's not working.
AUDIENCE: [INAUDIBLE] [? second ?] [? sheet ?] [INAUDIBLE].
CARL STORMS: Oh, yes. Thank you. Thank you. Thank you. So we see Door Import. This data set was precisely made to do exactly what it's supposed to do. However, when we created our new data set, I did not specifically say, change that name.
So if I go back into the Excel on my desktop-- where's my desktop? There it is-- and I open up the Door Import, right there, there's the culprit. So it's looking for a sheet name called Door Export. So I'm going to just quickly change this to Door Import, best laid plans.
Of course, the other way that we could fix this is just say instead of Door Import here, we could just change it inside of the Dynamo graph as well. Whichever way works for you, works for me. So now this will be right. Pops up.
Now we just have yellow on the side. I just gave my lovely speech about the warnings. But now we see that we now have our 103 now says 103DYN. And if I select the door, and I scroll down, you can see that in the one that I put the information in, we've got our frame type-- wood, cherry; our name. And if I hit Edit types, we go in here. And we can see that it changed our manufacturer and our firing.
We'll also notice that if I select the door 104 beside it, which is the same type, and I go to Edit type, scroll down. You can see that, in fact, as expected, changed the type parameters for that as well.
So what's happening inside the graph is that all of those empty pieces of information, all that data that has nothing in it, is making it be a null, which means there's no information. And Dynamo doesn't like it when it has to deal with null. It doesn't like it when there's missing information.
So what we can do is we can use a node from the Clockworks package and just feed in other information. So we can tell it that even though there's nothing in here, this is what we're going to place. So let's do that.
So as you see over here, I've even already put it in place. It sort of explains what's going on and what's missing. And in this example, I'm going to use Empty. Now in a lot of cases, you might not actually want to use Empty because that means you now have a field that says Empty.
Maybe it's good for your workflow because as you're working through, you see, oh, this is empty. I need to fill it in. But sometimes it's not. You can just put two quotations, in which case you're putting in a blank. And that will work as well. But [? if ?] you're putting something in there.
So what we can do is just copy these two nodes. And I'm just going to use the finish. I'm not going to do all of them. So you just kind of paste it in the middle here. And this becomes your go-between.
So I take my item, and I plug it into the List.ReplaceNull. And I'm going to just move this. And then I take my sequence. And I plug it into my value. So basically, sitting in-between, I now have this node that's going to say, OK. Rather than being nothing, I'm going to put, in this case, Empty inside of that.
And so, again, making sure Excel is closed, I hit Run. And if I scroll out, you can see that the 1, 2, 3, 4, 5 that I didn't change, I still have the yellow warnings. But for the finish parameter, we're all good. And if I go back in to my model, and I go to the one here, we now see that the finish says Empty. And the finish says Empty.
So this is a way that allows us to go through and get rid of those nulls. There really wasn't an issue. It was just graph-- the Dynamo graph not liking the fact that we put nothing in there. But if you're like me, and you don't like yellow, you don't like to be upset, this is now a way that we can do that.
It also gives you that ability by putting something in there to have that double check when you're going through the model. And rather than seeing an empty space, you see whatever you want to use as the point to tip you off that that information needs to be filled in.
All right. The moment you've all been waiting for. The visualization, the pretty colors, the bar charts, the donut graphs, they're about to happen. All right. Once again, let's close out of this file inside of Revit, close out of Dynamo.
And so now we're going to open our exercise 4 folder. And we're going to start with 4A. This exercise, you're going to feel like you're in Groundhog Day. It's the exact same exercise three times over. What's different is each time we use a different package and a different set of nodes to give us the graphic visualization a little bit different.
And so we start with a node model chart. Then we get into data shapes. And then we end with Mandrill. They all do it a little bit differently. And so we'll walk through that process. But we'll only walk through the main exercise once because it's the same.
So we go into 4A, pick up our lovely LEGO set once again. Fire up Dynamo, go to our data set, to exercise 4A, and T1, Begin.
So this might look kind of familiar. We've done something very similar before. Before we hit Run, we just want to validate that it says Graphic Models here. And then we can just quickly hit Run.
And this is all that I want to show you. So it tells us the color and the count. We know how many different colors we have and how many of each block we have, each brick. But it's not exciting. Just looking at a watch node doesn't do it for me. On a Wednesday morning, I need some color. I need some-- I need some pie. So we're going to create a pie chart.
So you can continue working with this graph, or you can open the T2 if you like. And the idea here is we're going to get rid of some of the stuff that's already on here, which is just these last couple nodes, so the List Create. We can delete List Transpose and the Watch.
And so now we're going to look for the node model chart, Chart. And we're going to look for the pie chart. So we select the pie chart. And we already start to see some lovely colors pop up on our screen.
So now we need to sort of fill in our information. So if I zoom in, the unique elements are going to be my labels. And the count is going to be my values.
Now for the colors, we're going to use the color palette. So if we right-click-- and this one doesn't have a "u"-- there we go. Color, Space, Palette. And we're going to want six of these bad boys because we have six different colors in our LEGO blocks. So once you get one, you're going to copy and paste five more times-- 3, 4, 5, 6, ha, ha, ha, ha. Color palettes.
All right. So now that we've got our six color palettes, we want them to be in this order-- green or some color thereof that's close to it, red, blue, yellow, white, and then black. All right.
So once we've got them all together, we're going to plug our colors in. But as you can see, we have one input, and we have six outputs. So we're going to create a list. So if you right-click List Create, we need to have six inputs. So we hit the little plus sign until we get to item 5. Remember, it's zero index. So we start at 0.
And then, again, in order, green is 0. Red is 1, blue, yellow, white, black. So now we have a list with all of our colors. Now we can input our colors into our chart. And now we see, we've got the nice, little pie chart that's dark gray. That means that it's happy. We're good to go. So now all we need to do is hit Run or F5.
And we now see that we have the visualization of our actual elements. And if we hover over one of the nodes, or one of the pieces of pie, it tells us everything about what we've got there. So green is-- there's eight pieces. That's 3.7%. You can see, we can sort of navigate around.
Sometimes we need this to be a little bit bigger. So there's this tiny, little white square down the bottom. If you select that and pull it, you can make your graph bigger. One of the other cool things about this particular product is that if we right-click, and if you go right down to the bottom, you can see, you can export as an image. So now I have the ability to export this out.
So if I say Export as an Image, I click on it, I navigate to where I want to save it-- I'm going to go to my desktop-- you can give it a name, whatever you want-- morning pie. That's spelling morning, right? And then hit Save. And then if I go to my desktop, we will see that we have a version. There we go. Yeah! We got our image!
So it's cool that we've got the chart. It will update. If you make changes, it'll automatically update every time that you run it. We have the ability to export it out and see what we've got in place.
All right. So there is a second exercise where we take a look at bar charts. But we're getting low on time. So we're going to jump into the data shapes version. So close out of Dynamo. We're going to go into 4B. It's the same Revit data set. So you can just leave the Revit data set open.
And so now we want to go into exercise 4B. And we want to go to the beginning. Actually, you know what? So we go into here, [? pull ?] into place. Actually, you know what? Let's go to the finish because we don't need to recreate the same graph. We're going to skip right to the end 'cause it's fun.
So Task 1, finish. Well, look at that. Great work, guys. You did it so awesome to get there. So before we run it, what we do want to validate is that we say Graphic Models. And the difference when we get into data shapes is you can see, these are the guys that bring you all those awesome pop-up UIs that we use for everything we know and we love.
So we have UI.PieChart. So this is the information for the pie chart. And then we have the UI.MultiInputForm plus plus because it's not just one plus good. It is two pluses good. It's that good.
What this allows us to do is that when we run it, this is that pop-up that comes up that shows us all of the information we get into place. So as you can see, we've got our unique elements and our count. So we've got our series and our values. Our colors, the same as before. The only thing that's different is we pulled our Brick Colour to give it our chart name. So if I scroll across, you can see we've got Chart name.
So once we've got our UI.PieChart satisfied, we then plug it into our inputs. There's a lot of really cool things we could do here. But we only need two pieces of information to make this work. So our input, which is what we just did with our pie chart, and then our toggle. So we want to make sure that we're set to have it run.
So now that we've got this set up, I can say Run, doing some thinking. And there we go. We get our pop-up. So the nice thing about this, again, it's a pop-up. So it's on top of everything. It's not sitting inside of your Dynamo graph. It's popping up.
And if we take a look, you can see that we've got all of our pieces. And we've got our information. I can untake the labels so you don't see the labels. I can get rid of the legend. Give me a little more real estate. And if I hit Set Values, what that's going to do is that's going to say that we're happy with this. And it's going to close the pop-up box. So then it goes away.
Now there's one more thing I want to show you. So I'm going to run it again, ohhhh, except it doesn't like me. So sometimes, it doesn't like running the same information twice. So if you change the Boolean, if you go to Fault, it clears the cache. And then you run it again. And then it pops up.
The reason that I did that is we saw in the last model node chart that we were able to export as an image. And that was pretty cool. But we're working in Revit here. So images in Revit aren't awesome. So let's take it one step further and have it automatically create a drafting view for us and put the image already in the drafting view.
So if we say Push on a Drafting View, we click that. I go back into my model. You'll see there is now a drafting view. If I click on that drafting view, so it now created a drafting view for us with that chart with the legend with the name all in one spot. So that's super-awesome that we're able to do that and put it into place.
So I'm going to close this. And I'm going to quickly run through the bonus part of this. We didn't do it for the node chart. But for each of them, I'd also like to create a-- so if I say Open, and I go to Task 4B Pie Bonus Finish.
And all this does is just show some of the different availability. So this is a bar chart as opposed to a pie chart. You can see we get a little more in-depth with what we're looking for, so the name, the series, the x and y. So then we get the color that we everything to be and the labels on our axis or our x and y-axis.
So now we see what a [INAUDIBLE]. And one of the things that I did and why I wanted to show this one specifically, this is the only one that I found that allows us to have it going this way, to have it be a horizontal instead of a vertical bar chart. And we probably don't need the legend at this point. So we got this nice bar chart. Again, I could hit Save. I could save it out into Revit. And I've got that information. So we have the ability to have this really cool way to visualize our data when we're working our way through.
All right. So the last one-- I appreciate you all sticking around to the bitter end-- is now we're going to look at the Mandrill package. So the Mandrill package was the first one that I worked with to do this visualization. It's a great package, but it does tend to be a little bit heavy on the resources. And sometimes after working with Mandrill, Dynamo likes to have a little bit of a break. So I've made sure I left it right to the end so that it can have that little bit of a break.
So same Revit data set. Now we're looking for exercise 4C. In this case, we're going to skip all the way to exercise T2. So the first exercise, we walk through setting up Mandrill. It's a little more complex than the other ones. And we don't bother putting any fancy colors in it. The second exercise, we add the color, which is exactly what we've done for 4A and 4B. So we're going to select T2, Finish.
So as you can see, a few more nodes come into play here to make the magic happen. And so I'll walk through what we've got. So again, we want to make sure that we say Graphic Models. From the actual archi-lab Mandrill package, so we have donut charts.
And again, there's a bunch of different options inside of Mandrill for different charts. So if I go into Mandrill, and I go to Charts, you can see area charts, bar charts, donut charts. I'm not going to read them all. But you can see a bunch of different options inside of there. And while there is a pie chart, it's morning. I want a donut instead. So we're going to go with a donut chart.
So we have our DonutChart.data, so again, our unique elements and our count. We have our DonutChart.chart. That's the part that creates it and throws it up for us. And then we've got our Donut Style.
So in this case, you could run this with nothing in the style. It would run just without it. That's what the first exercise does. But we want that style. So what we've done is we've added in our colors.
And you'll see there's a seventh color that we didn't have before. This is the hover color. So when you hover over something, it shows a different color than what it is to let you know that it's the thing that you're hovering over. Super-high tech.
And then we come down here. There's also a miscellaneous nodes, which allows us to say how much space-- white space we want around it. So we really can customize our chart much more than the other ones with this particular one that we have into place.
The magic that comes into place is we're able to create a report-- so it's like a Create List. We can create multiple reports. That's the other thing that we could do with Mandrill that we can't do with any of the other packages is that we can have multiple charts run at the same time.
And then we've got our launch window. And, in fact, you don't have to do this. But I'm going to do it because I don't want to run it twice. I'm going to open up the bonus version, which will show you a bar chart and a donut chart because I'm going to go for broke.
So now we've got the information for the bar chart. And we've got everything put into place. What we need to do as we're working our way through-- and this is, again, a little bit different when we're working with Mandrill-- is we've got our charts in place. I'm going to hit Run. And it's going to look like nothing happened.
But it's a necessary evil to do that. So I say Run. It said it started. It's got to do some thinking. It's processing all the information. And it does take a minute to do this. Sometimes it takes a little more than a minute to do this.
OK. I hear some crashes. I was lucky, I got a complete. But the last step, we have to run it. The Run it forces all the information to the Mandrill package. And it pushes it up to where it does the magic. And then we say, Launch Window. So Launch Window is actually where we see the information. And, yes! It happened! Yay!
So now we see our chart. And if I pull this across and I make this really big, you can see that I've got both my bar graph and my donut. And if I hover over my donut, [? you ?] [? know ?] [? what? ?] There's eight black, eight green. So you can see, we've got all that information if I go down to my green, red.
And the really cool thing about the bar chart is that if I click on it, just a single click, it then reorders the bar chart from highest to lowest. And then if I click on it again, it reorders it in alphabetical order. So just by clicking on that, it's going to put you through to that information.
And the last thing that I'll show you is this is a live link. So if I go back into Revit-- I'm just going to minimize these-- and I select a bunch of things, and I delete, and I come back into here, and I say Run, it will update the graph real time. It will update the graph real time. Hey! We got it!
And on that wonderful, [INAUDIBLE] note, I say thank you very much.
[APPLAUSE]
Thank you. So you've got about five minutes left if anybody has any questions. Yes.
AUDIENCE: Will any of these charts run through Dynamo player?
CARL STORMS: Will any of these charts run through Dynamo player? The data shapes one will for sure. Where it goes into being an issue-- so, for example, the Mandrill one is you have to be able to click the Launch Report. You can't do that currently through the player. But the data shapes one will. The data shapes one is perfect for that setup.
Well, if there's no more questions, again, thank you very much. You've been a wonderful audience. Enjoy the rest of your day.
[APPLAUSE]