How to create a node with simple data type? (to create walls with flexscript)

How to create a node with simple data type? (to create walls with flexscript)

cphilpottX22K5
Enthusiast Enthusiast
358 Views
6 Replies
Message 1 of 7

How to create a node with simple data type? (to create walls with flexscript)

cphilpottX22K5
Enthusiast
Enthusiast

[ FlexSim 23.1.0 ]

I am creating a script that draws walls from a list of XYZ coordinates and a list of pairs of indices to connect. I am trying to create a simple data node to get to my ends and I need a method in flexscript.

Context is provided below:

----

I can import my CSV in script, I can create the Pillars in script by leveraging the ability to set "up" on an object like this:

for (int index = 1; index <= coords.numRows; index++)
{
Array pH = [];
for (int coord = 1; coord <= 3; coord++)
{
pH.push(coords[index][coord]);
}
treenode currDiv = Object.create("People::Walls::Pillar").setLocation(pH[1],pH[2],pH[3]);
string pillarName = "Pillar"+index;
Object currPillar = currDiv;
currPillar.setProperty("Name",pillarName);
currDiv.up = Model.find("/Walls>visual/drawsurrogate");
}

Now I need to create a wall from the script. I intend for this to be a simple solution for any future users. I could draw a wall and copy the node, then modify its values - but that's roundabout.

So as far as I can tell I just need to create a simple data node with the correct structure. I can create a subnode using treenode.subnodes.assert(), but when I try to use treenode.dataType(7) (or any other number) on the resulting node, I get an "Unknown command dataType being called" error.

The best solution in my opinion would be if I can directly draw a wall using the indexed name of existing pillars. If that is possible, can someone please tell me how to create that node and where I would be able to look to find information about how to create that node?


Or am I going about this wrong? I understand flexscript at a beginner/intermediate level, but my knowledge of C++ is pretty limited so I am looking for a solution in flexscript.

(Note: I have a similar script working for A* dividers but it simply uses the object create for each one and then resets the X,Y,Z variable values for each end. That's not an option for walls unless I can directly make a wall with script, but I assume that the ability to do that would mean that I initially assign Pillars and wouldn't need to do a "create and move" sort of thing)

0 Likes
Accepted solutions (1)
359 Views
6 Replies
Replies (6)
Message 2 of 7

jason_lightfoot_adsk
Autodesk
Autodesk
Accepted solution

You should instead use the function_s call in flexcript:

Object walls=Model.find("Walls");
Object pillar3=Model.find("Walls").find(">visual/drawsurrogate/Pillar3");
Object pillar4= Model.find("Walls").find(">visual/drawsurrogate/Pillar4");
function_s(walls,"addWall",pillar3,pillar4);
Message 3 of 7

cphilpottX22K5
Enthusiast
Enthusiast
This looks like it would solve my issue. Thanks! I'm going to try to edit the question to clarify what has been answered here.


Is "addWall" a function in the definition of the "Walls" object? Is there somewhere in documentation that I would be able to look up those functions?

0 Likes
Message 4 of 7

jason_lightfoot_adsk
Autodesk
Autodesk

You'll find such functions in the library tree of the relevant object.

The issues are:

1) They're not documented - you either need to find how they work by trial and error or find examples within the FlexSim environment (GUIs, menus etc).

2) They're not supported - FlexSim developers could at any point rename, remove or alter the methods causing user development to fail or require updates (that's why I'd recommend you create your own user commands that call function_s rather than put them throughout your model - then you can edit/repair them in one place.

3) It could make your models behave incorrectly if used without full understanding of their operation and therefore introduce delays for debugging and further support (which may be limited dues to the use of such functions).

So if there's a way to avoid using them that's probably preferred.

Also you might want to question if the Walls object does everything you need and if not create your own. For example I don't think it works with nested /containers /hierachical models so if you think you might want that, you might be better creating something yourself that draws the required meshes for your wall structures.


0 Likes
Message 5 of 7

cphilpottX22K5
Enthusiast
Enthusiast
Also, how would I go about making a simple data node if I needed to? Is that generally not useful? Regardless, shouldn't treenode.dataType(7) work?
0 Likes
Message 6 of 7

jason_lightfoot_adsk
Autodesk
Autodesk

I'm not sure about your syntax but changing the data type to DATATYPE_SIMPLE works in itself:

mynode.dataType=DATATYPE_SIMPLE;

but there's more to getting the set of required values on the node.

0 Likes
Message 7 of 7

cphilpottX22K5
Enthusiast
Enthusiast

This is not an answer to the question asked, but is an answer to the problem that I explain in the post:

If anyone finds this question and is looking for a solution to create walls in such a way, I have a working script that will create walls from 2 separate CSV files (XYZ points and a mesh edge topology in the form of ordered pairs of indices) in the model directory and create walls at those coordinates. Please contact me here and I will try to help. I don't want to provide it outright because I can't guarantee it will work.

If you are working from a Revit model and export a CAD file, the coordinates would be the same ones that are used in the CAD file, so a CAD background will line up perfectly with the walls.


Currently function is limited to destroying the existing walls object and creating a new one in its place. I think this is necessary because the pillars have to be indexed correctly for the whole thing to work. I am using Grasshopper and Rhino.Inside.Revit to process my walls, and will comment here if I have found a better way in the future. (Dynamo was proving clumsy and my coding ability is not quite there yet to write my own component)

0 Likes