DAY 2 PRE-TRAINING NOTES
TRANSACTION SCRIPTS
- First create point and two lines
 - Save this transaction
 - Right click on last transaction. New script transaction–> insert after
 
Create a Point
transaction script "first try"
{
// first make the point
Point leftVariable = new Point("left");
leftVariable.ByCartesianCoordinates(baseCS, 5.0, 5.0, 0.0);
}
First line of script
- insert a line that says to make a point
 - make me an object that is a point, call that object left variable. Make the object by executing this command. It’s new name is left.
 - Point leftVariable = new Point("left");
 - Point is the type.
 - Name is leftVariable - temporary name
 - = means execute
 - Point("left");: constructor
 - Point explains the type
 - Then (“name”)
 
Second line of script – compute our variable with cartesian coordinates
- define the variable. Use the perios, and pull up cartesian coordinates
 - leftVariable.ByCartesianCoordinates(CoordinateSystem, Xtranslation, Ytranslation, Ztranslation [, Origin] )
 - leftVariable.ByCartesianCoordinates(baseCS, 5.0, 5.0, 0.0);
 
- in [] is optional
 
Run the script to make sure it works
Create a second Point
// first make the point
Point leftVariable = new Point("left");
leftVariable.ByCartesianCoordinates(baseCS, 5.0, 5.0, 0.0);
// then make the right point
Point rightVariable = new Point("right");
rightVariable.ByCartesianCoordinates(baseCS, 10.0, 5.0, 0.0);
Create a Line
// first make the point
Point leftVariable = new Point("left");
leftVariable.ByCartesianCoordinates(baseCS, 5.0, 5.0, 0.0);
// then make the right point
Point rightVariable = new Point("right");
rightVariable.ByCartesianCoordinates(baseCS, 10.0, 5.0, 0.0);
// then draw the line
Line bridgeVariable = new Line("bridge");
bridgeVariable.ByPoints(left, right);
Next free the point manually by editing the point. Right click on the x/y
Then move the point
Check the script to see what was added.
transaction modelBased "Graph changed by user"
{
feature left GC.Point
{
Xtranslation = <free> (5.0);
Ytranslation = <free> (3.41945192602107);
}
}
transaction modelBased "free point/move point"
{
feature left GC.Point
{
Xtranslation = <free> (-6.3264554214921);
}
}
Start a new transaction. Choose the expression builder upper right to left of fx
- This transaction makes a bunch of lines
 
transaction script "script transaction 02"
{
for (int i = 0; i < 5; ++i)
{
// first make the point
Point leftVariable = new Point("left_" + i);
leftVariable.ByCartesianCoordinates(baseCS, 5.0, 5.0 + i, 0.0);
// then make the right point
Point rightVariable = new Point("right_" + i);
rightVariable.ByCartesianCoordinates(baseCS, 10.0, 5.0 + i, 0.0);
// then draw the line
Line bridgeVariable = new Line("bridge_" + i);
bridgeVariable.ByPoints(leftVariable, rightVariable);
}
}
First line
for (value index = 0; index < count; ++index)
for (int i = 0; i < 5; ++i)
- ++i indicates the increment
 
- Key words in blue
 - Light blue highlight variables
 - Statement delinieated by semicolons????
 - Then copy and paste from first try and change to match above
 - Try 15 iterations instead of 5.
 
Debugger
- Reduce iterations to 3
 - Add a breakpoint; before the “for” argument
 - Run the program
 - Then debugger appears
 - Step through the steps and see how the program works
 
Edit the coordinate system
- Make a new coordinate system
 - Then edit script to depend on that cs
 - Resulting script
 
transaction modelBased "Graph changed by user"
{
feature coordinateSpiral GC.CoordinateSystem
{
CoordinateSystem = baseCS;
Xtranslation = <free> (23.2934532741567);
Ytranslation = <free> (-2.56051530619625);
Ztranslation = <free> (0.0);
HandleDisplay = DisplayOption.Display;
}
}
Make a spiral by editing previous script – number 1 (Robert Woodbury)
transaction script "First Spiral"
{
for (int i = 0; i < 20; ++i)
{
double radius = 5.0;
Point spiralVariable = new Point("spiral_" + i);
spiralVariable.ByCartesianCoordinates(baseCS, radius*Cos(30*i), radius*Sin(30*i), i);
}
}
- Try 100
 - Backspace before spiral
 - Intorudce new coordinate stystm, with the icon
 - Then go and rename it csSpiral
 - Change the script to refer to this new sprial
 - Then go and delete this once done
 - Try to change it to a different coordinate system in the script instead of creating your own cs. This one will introduce a cs based on radius, and move the new one away from the baseCS
 
transaction script "First Spiral"
{
double radius = 5.0;
CoordinateSystem csSpiral = new CoordinateSystem("csSpiral");
csSpiral.ByCartesianCoordinates(baseCS, 4*radius, 4*radius, 0.0 );
for (int i = 0; i < 100; ++i)
{
Point spiralVariable = new Point("spiral_" + i);
spiralVariable.ByCartesianCoordinates(csSpiral, radius*Cos(30*i), radius*Sin(30*i), i);
}
}
Now we are going to change the radius
- Create a spiral that can’t be done in model based GC
 
Change the previous script first spiral
transaction script "First Spiral"
{
double radius = 5.0;
//add a variable
double radiusStep = 0.1;
double increments = radius/radiusStep;
CoordinateSystem csSpiral = new CoordinateSystem("csSpiral");
csSpiral.ByCartesianCoordinates(baseCS, 4*radius, 4*radius, 0.0 );
for (int i = 0; i < increments; ++i)
{
radius = radius - radiusStep;
Point spiralVariable = new Point("spiral_" + i);
spiralVariable.ByCartesianCoordinates(csSpiral, radius*Cos(30*i), radius*Sin(30*i), i);
}
}
Make clock
Make two points and a line
Save the image capture two different ways
transaction script "New script transaction"
{
//breakpoint;
for (int j = 0; j < 4; ++j )
for (int i = 0; i <= 360; i=i+10 )
{
right.ByCartesianCoordinates(baseCS, Cos(i)*6.0, Sin(i)*6.0, 0.0, left);
UpdateGraph();
//right refers to something you already created
//SaveViewToImageFile(2, 500, "D:\\RESEARCH\\GC\\images\\clock_image_" + i + ".jpg");
//2 stands for view
//500 stands for pixels
}
}
Two points and line
Draw the clock behavior
Add two points to middle of line
Add two new lines to connect to the points
Create a function for a bspline curve
- Make 4 points, then make a bspline curve by poles, order 3
 - Create a point -> by function
 - Go to text editor and type this
 - This sets up a function with two arguments, shown in parentheses
 
value function (ICurve curve, int num)
{
double spacing = 1.0/(num-1);
//create empty collection
Point childPoint = {};
//breakpoint;
for (int i=0; i < num; ++i)
{
//add to collection
//true indicates visability
childPoint[i] = new Point(true);
double t = spacing*i;
childPoint[i].ByParameterAlongCurve(curve, t);
}
return childPoint;
}
- Then list of values for the argument. These are the arguments for the function above. F(x) = x2
 
{bsplineCurve01,6}
Create a graph variable
- Go to graph -> manage graph variable ->make new and call it num
 - Put in a value from 0-10
 
Create a graph function, a function that works across the board
- Create feature, graph function, define
 
- Open the text editor, and copy the old function into the graph function
 
Then make a new arc and apply the graph function
Create a new feature ->point-> by function
- function… type in graphFunction01
 - Arguments –type {arc01,num}
 
This will make points across the arc
And they can be changed with the num slider too
Some kind of function
- Create two variables
 - inputToFunction
 - outputFromFunction
 - create a new graph function
 
function (value x)
{
return x*x;
}
Open five scripts for curves from dongle
- method 1
 - It’s a script transaction
 - For loop creates 10 points
 - p_0, p_1, etc.
 - they are updated by cartesian coordinates, move along x,y,z
 - z = j2/10 – to make a parabola of points
 - each point is a top level feature
 - they are just points
 - put in a bspline curve
 - method 2
 - define scale variable in order to change the shape of the curve = scale is a global variable
 - internal function has this text
 - Point point = new Point(this);
 - Function point constructs a point
 - Function coordinate system constructs a coordinate system
 - Under Fx/feature types, 3 ways to create a new point
 - New point
 - creates a new top level point
 - creates a new point that is a subpoint of another
 - this refers to what you are trying to make
 
- make 10 points… set update method to what it is before
 - the upper version is one point, and bottom has many separate points
 - then you can bind the one point to curveScale
 - method 3
 - use dpoints.
 - have the essence of a point
 - under geomtry tab under fx
 - only contain x,y,z
 - create a function – this explains what the function does… see file.
 - use for loop
 - not child points, it will be empty list of dpoint3ds
 - keep adding to the list by adding dpoint3ds
 - this.ByPointsOnCurveAsDPoints3ds (cs, dPoint); this makes the curve
 - method 4
 - just using a point
 - define a collection of dpoints
 - make a bspline curve
 - it only exists inside the function
 - and make a child pline?
 - Then return a point by a parameter along a bspline curve
 - It will move through space and is T along the curve
 - Excel/gaming are often end-user systems
 
Create dynamic text to indicate the x coordinate
- Insert Text
 - Placement: coordinateSystem01
 - TextString "X coordinate="+coordinateSystem01.X
 - Make New TextStyle
 - Input in Defined Format
 - Apply TextStyle to Text
 
Roly exercise
- Draw 9 point
 - Draw bspline surface
 - Play around
 - Add point onto surface by using point icon
 
- Change point to series
 - Click on fx, and click on functions, scroll down to series
 - Series(0.3,0.6,0.05) start, final, incremental count . technique is optional, in brackets.
 
- Manage graph variable
 - startU = 0.15, make it a slider
 - replace the first digit of series with the startU
 - fill the whole space
 - change second number of series with 1.0 instead of 0.5
 - change it to 1.01 instead of 1.0 to get the points to go to the edge
 
- Change to
 - U: Series(startU, startU+uSize, 0.05 )
 - V: Series(startV, startV+vSize, 0.05 )
 - Play around with the values
 
- Create a shape grid, features – shape – by point grid
 - Just click on one point and delete all but point name
 - Try facetoption and choose FacetOption.ForcePlanarQuads
 - Small cracks will start opening up
 - FacetOption.TriangulationAlternate, shows triangle,
 - Change u/v to 1
 - Leave it on quads
 
Build a component in a separate file
- Component can be anything
 - They are adaptive
 - Line are components too, feature and components interchangeable
 
Create a component
- Open a new file
 - 4 points
 - Shape – by vertices, select 4 corners
 - Coordinate system – FromShapeVertices
 - Keep everything dependent on the shape
 - Create point
 - By cartesian coordinates
 - Select coordinatesystem01
 - X=0, y=0
 - Z: shape01.Area/4
 - Create new graph variable pHeight
 - Replace 4 with pHeight
 - Create a line feature by points, start point – apex point, and end point shape01.Vertices
 
- Create a cone,
 - by line, and
 - Line: line 01
 - Start/End radii: line01.Length/20
 
- Generate Feature Type, brings up form, icon lots of little squares
 - Give name
 - Define inputs
 - Make the two variables
 - Change name Hfactor
 - Change to logical names, such as HFactor and PlaceHolder
 - Click both replicatable
 - Outputs - Show the other stuff as construction, except the cone.
 - Create it, close the file and open the old file
 - Then insert pyra01 by default, set HFactor to 0.75 and shape01
 
GENERAL NOTES
- Modeling
 - Use construction lines as needed. Click on icon, then use control select to select the item.
 - You can extractRegionUsingStartEndPoint, this is useful for creating equal arcs for a façade
 - With ellipse, either the arcs are equal, or the lines are equal see
 - Basis for T on a ellipse is angle,
 - Create plane, it acts as a 2d coordinate system
 - To change color, select color/thickness, then apply to object
 - ProjectCurveOntoSurface
 - Switch on curve vector
 - C:\Documents and Settings\All Users\Application Data\Bentley\WorkSpace\GenerativeComponents\Transaction Files\nyc_workshop_samples\day 3\project_trim\
 - Trim by Projection
 - C:\Documents and Settings\All Users\Application Data\Bentley\WorkSpace\GenerativeComponents\Transaction Files\nyc_workshop_samples\day 3\cut_protrusion\bsplineSurface_TrimByProjectedCurve.gct
 - Program is in development phase, beta
 - Rhino had extensive beta phase too, benefited much from this
 - Intention - get GC out to people
 - Will add flyovers to rest of software
 - Coordinate systems
 - You always get a baseCS. If you delete it, everything goes
 - Scripting
 - Write for 3 audiences, yourself, the script, and your colleagues
 - Transaction script
 - Must have script in the beginning, so it knows to execute it.
 - Use comments often. They are signified with // before the text. Turns it green
 - Syntax notes
 - Syntax from C sharp… learning curve better if you learn C sharp. Java also, other end user programming systems
 - () for arguments
 - [] for array indexing
 - {} collection
 - Type of properties
 - Double is a real number, remnant from binary code days
 - Quick Help
 - Use quick help. See window. Hover over copy command and it will show you the video of how to work it.
 - Also, if you go to create an item, then you can see an icon called example.
 - Look for quick help exe file in c:\program files\Bentley\documentation and move it to c:\program files\Bentley\generative components\. Then execute it
 - Examples
 - Find examples.zip in c:\program files\Bentley\documentation
 - Unzip to C:\Documents and Settings\All Users\Application Data\Bentley\WorkSpace\GenerativeComponents\Transaction Files\Examples
 - Chm file available - C:\Program Files\Bentley\MicroStation\MicroStationVBA.chm
 - Blue properties are optional, and set to null
 - Right click – will send more documentation on this
 - Add notational property
 - These show up in purple
 - Bspline surface
 - By points – surface passes thru points
 - By poles – poles are the control points
 - Control points means that there is tangency between implied lines
 - Vclosed: bool – forces the surface to be closed
 - UcurveDisplay: int – indicates the divisions on the curve/matrix
 - Uorder: int (and Vorder)– changes order, lower = more faceted
 - Change symbol size
 - Edit -> baseCS
 - Change SymbolSize: double
 - Place point on surface
 - Choose icon
 - Or ByUVParametersOnSurface
 
Update session – day 3
- Offset curve
 - Original curve, offset curve, get nasty result. Approximate a plane and offset within that. See example offset_from_bspline. You may need to set an upvector (blue)
 - Can drive by offset number
 - Or by offset point, more geometric
 - RemoveUnsuccessfulFeatures
 - Can filter out unsuccessful
 - C:\Documents and Settings\All Users\Application Data\Bentley\WorkSpace\GenerativeComponents\Transaction Files\nyc_workshop_samples\day 3 stick 2\GC Examples2\remove_unsuccesful_features\remove_unsuccesful_1.gct
 
- Proptotype design
 - House that can redesign based on parameters
 - Concentrate on climate parameter
 - Database interactivity
 - Check climate conditions/date
 - Model to update based on this info
 - Roof
 - Solar panels to tilt
 - Façade
 - Shading devices
 - Windows
 - Natural ventilation
 - Roof pond
 
Questions
- How to undo if you delete something
 - How to work this into other cad programs, microstation and others?
 - How to deal with license issue in the future
 
Excel
- Use function – excelvalue, write value
 - Write Value
 - Sheet – Sheet1
 - “A1:A11”
 - Point05.X
 - Read Value
 - Filename
 - Sheetname
 - Grids
 - YTranslationjs: excelRange02.Value
 
Script Function
Function (Shape shape, double bulge, double radius, bool bSwitch)
{
For each (Shape nestedShape in shape)
{
Shape nestedResult = new Shape(this);
Foreach (Shape newstedNestedShape in nestedShape)
{
If (bswitch)
{
Cross_bar_1 nestedNestedResult = new cross_bar_1(nestedResult);
nestedNestedResult.ByDefault(nestedNestedShape, radius);
}
Else
{
Panel_2 nestedNestedResult = new panel_2(nestedResult) = new cross
- Make your component type to optional so that you can switch from one to the other
 
Database_Facilities.doc – see this for more information.
