Files posted by DomC
This Marionette Script creates multiple space objects from worksheet data.
A very nice and time saving Marionette script to automate a routine peace of work.
Please consider, that the the script takes the area column and calculate the square with that. If you have a language settings with comma instead of points for decimal seperator, the calculation will fail. Use points as decimal character or eliminate decimal places in your list
Imagine you have client, which delivers you a room list. And a list, which objects have to be in this rooms. You can consider this lists with hundreds of rooms on your left screen and click them one by one in your rooms. You will make errors and your eyes will get squared.
Another real interesting example how you could accelerate a routine job with a marionette script.
This nice script summarize all Space-Areas, which are part of the same Appartement Number and shows the result in a symbol based stamp. Alternatively you can get apartment. Alternatively we can pull out sum of apartment area with a worksheet. But this Marionette is also a nice method to do this.
1. The Marionette Objects access to the field "11_Room ID" of the space object. Every other field can be used if necessary by editing script
2. with the Marionette PIOs field "Raum ID" you can tell the stamp, which apartment should be displayed.
Apartment Area v1.2.1 v2019.vwx
A Marionette PlugIn, that collects a custom drawing (font character, picture whatever) and refer it to a regular font character.
This "Font" is placed into the control geometry container. Also we could just use a blue symbol.
The Heart of the script is a custom node "create font dict" which manage collecting the control geometry. Also it returns a dictionary sequence data type. A dictionary is very useful if you want to have pairs of data. In this case a character and a drawing group with informations forms a pair.
Sure, the script could be improved by several things (multi-line, alignment, page based etc. ) But I think it is very useful to have that plug in. Have fun with it. Maybe you can share your own fonts and your wonderful handwriting here. Thanks.
1. Handwriting Font
2. Vectorfont (ability to use sketch view)
3. For Milling Machines
4. Fast inserting of object sequences
1. Script Crashed if input Geometry was None (Integrated a script blocker and an Alert Dialog )
2. Input Dict was always None, because use of an outdated Script command (vs.GetType() instead vs.GetTypeN()). Issue in many other scripts. One of the very rare incompatibilites of Script commands the past Years.
This Network ist not very flexible (world based values, just one row) but still useful.
You can insert and and ungroup for individual layout etc.
This Examples shows, how to automatically create sheet layers and viewports from objects of the design layers. In this example, a sheet layer will be created for every exhibition place available on the design layer. It creates a 1:20 close-up from the specific exhibitor's place and an overview plan with a marker of the exhibitors place.
This Network-Template could be used whenever you want to create automatically documentations out of your drawing. As Example:
- Put a Viewport of every Space Object in your drawing on SheetLayers
- Put Viewports from Building Elements close-ups (Windows, Doors etc.) on sheet layers
Also this Network contains some very powerful custom nodes:
1. Enhances BBox, Enhanced Rectangle, PutByRefPoint those are just to save time for calculating width, length and ref point of objects
2. Function Two (like standard function node with two inputs), SetParent
(1. and 2. Already available on this forum)
5. VP Layer Visibility
6. Add VP Ann (Annotations in Viewport)
7. Nodes for getting Marionette OIP Data which is not possible with "Get Record Field"
This is one of the files used in the Marionette launch video. It was created by Dominique Corpataux at Computerworks.
A Node which creates Measure Lines in Polygons (Line from every vetex point to every other vertex point).
1. p2p Lines:
2. Perpentidular Lines (Perpentidular Line from every poly vertex on every poly edge):
To sort out needless lines, there are several filters integrated:
1. Double Lines automatically filtered with an epsilon (p2p is not the same as perpenticular if you look all 15 digits)
2. Measure Lines, which are identical with poly edges
3. Measure Lines, which are outside of the polygon
4. Overlapping lines. If two lines are parallel and both points of the smaller lines are on the bigger line, the bigger line is filtered
5. Filter Lines over and lower than min max values
6. An Option, to return a number of length (Return first x values). As example if there are measure lines with the length (1.2, 1.2, 1.25, 1.5,) and the value is 1, two lines with 1.2 will be returned. This value is holding on perpendicular and p2p lines.
Turn off Debug options like "Show Edge", "show Outside Poly", Filter small length (niches) and set "Return first x values" on 1 or 2 to get optimal results. So a normal result will look like this:
Attached there are three examples. An Example with spaces, An examples just with polys and an example as PlugIn. PlugIn is good for playing with the options to see changes prompt.
The heart of this Marionette example is the RectPack node. A node with over 2600 lines of code!
It supports dozens of packing algorithm to pack rectangles on another rectangular area in a space and time-saving way.
The right combination of packing and bin algo gives the ability to pack rectangles in a way you want to have them on your machines (as close as possible, always cut complete board, less cuts etc.)
Actually not even myself know, which packing algo ist right for which use case.
Also for professional use case, usually there is a machine dedicated software, which packs the port in a way which match best for the machine.
So I see the main use case to pack parts on a board for milling them on a cnc-machine as example for model-making. Workflows which uses a guillotine-workflow (always cut the whole board) often have special requirements which maybe could be reached with the choice of packing algorithm or maybe can not.
The Marionette Example based on foundational work:
http://www.secnot.com/ Python code for packing algorithm
Jukka Jylang - A Thousand Ways to Pack the Bin - A Practical Approach to Two-Dimensional Rectangle Bin Packing (2010)
Huang, E. Korf - Optimal Rectangle Packing: An Absolute Placement Approach (2013)
- Input of basic data like length and width
- Input of additional data
- object input (node detects if part input are objects and process them like rectangles)
- sort by material
- use a list of stock materials
Not all input combinations works at the moment. Recommended to use the existing examples to get correct input values.
Example of a 2D/3D Marionette PIO with a Custom Wall hole.
The Geometry of the Window and the embrasure is based on a symbol. Also the 2D Drawing is based on a symbol. The Geometry is reshaped by the 2D and 3D Reshape node. So the Script itself is relatively slim.
Replace the Geometry with everything else you can draw. Generic solids are recommended. Also you could script some additional geometry for window division while frame is parametrized by reshape node.
This will go on. It took about 2 hours to draw the geometry and 2 hours to parametrize it. Impressive, how quick we can produce PIOs with Marionette based on that workflow.
Show Size of the active Document
This Wrapper contains two Marionette Nodes:
1. GetActFile -> Returns the Path of the Active Document
2. OpenDocFolder -> Starts a Subprocess of Finder (Macintosh) or Explorer (Windows) to show a Window from the input Path
Just Test by executing Wrapper. If you like it, add it to your Marionette menu commands.
If you often have objects like imported pictures or imported PDFs with many objects or pages, this Marionette Menu Command can be handy.
It aligns objects to the bounding box buttom and stick it together to the bounding box width.
Attached a vwx with nodes. Some of them already shared as separate files. Also the list is not complete, not perfect and has no warranty of being up to date. Also some nodes may be outdated, obsolet or buggy.
1. I tried to track the nodes with an addition record format
2. Marionette Nodes are linked to a record format, this record format contains descreption and Other infos from to the node.
3. Also this Record contains a rating of the node (internal rating for me) like is this node hard to make, will it be useful for many users or just for one special case etc.
4. The Record can be linked manually to a node and then the node's Data can be written by a script. Ration Infos logically has to be attached manually
5. On the document is a worksheet with all nodes listed
The Info below is originally from the nodes (included original misspelling etc :-)
Symbol3D ObjOnSpace SymbolPopupSymFolder SetWallHole IsMember_already SortNestedList CreateDictsV Sort RotatePtRoundPt FibonacciSphere Wrapper C_Tangent_to_CC PtPerpendicularOnLine CircCircInters CircleLineInters LineLineIntersec Pt to Circle Center 2CircleCenterLine 2Circle_4Pts Apollonius PCC CCC v1 subPoints addPoints PtTangToCircle Wrapper Wrapper Get Z atXY Grow Radial is cw Wrapper Wrapper Wrapper 2D Pt Shaker v01 HexCircleGrid GetPtVectors GetPolar180 DialogFolder ExportPDF ImportSU function4 GetNextObject PageBased_mm VersionInfo Button MeshFromPoints collectObjectOnArea Any SetPage BBox Overlap GetString GetString GetNumber GetInsideChar Print GetMultiRecValue GetActFile GetNumDatabaseRow GetSubCell GetMultiRecField Backward DupInContainer Solid Intersect List DupOnAcLayer DupOnAcLayer ConvertToGroup Reset Obj BasicSolidReshapeScale NumToRow ObjByClassAndLayer Set Class MinItem If_ SpaceWithObj LocusMS GetPointClusters ConcaveHull Create Viewport Add VP Ann VP Layer Set Mrntt OIP Field Get Mrntt OIP Field Insert Symbol in Folder CreateLayer FilterValues PtArrayStartEnd ValuesToSaldo Vector to Angle PointRectangle Wrapper Eval Eval AttachUnit Color Custom Pulldown EnhRectangle RoundedBoard 2D_BBox_Enhanced TypeToString TypePopup TypeCounter GetRes Get Sym Name Name2Index Text in Lines TextBlockInLines SetDimTextSize SetTextSize ListToLabel TextBlockInLines RecToTable OpenDocFolder GetActFile ListDir FileInfo os_stat DateTime GetActFile DialogFolder PlayMP3 Wrapper Linear Array xyz PutByRefPt SymbolinFolder Link Text GetDictValue Repeat_List shuffle shuffle_dup_true looser itemsToList Remove Duplicate Items UnnestL GetFiles Imp ini Imp txt Solid Boolean GetRNames Concat MergeList Flatten List S LinearDimLight Change Sheet Title Get Sheet Title Get Layer Name Get SheetL Size Get Sheet Page N Manipulate File UTF Custom Pulldown
Descreption Insert a Symbol Returns a List of Objects for every Space Creates a popup of all Symbols in a Folder. You have to edit Script to change Folder Set the input Geometry as a Wall hole of an object Returns isM, if the corresponding object is already in the list Example list1 = [5,10,3,5] list2 = [a,b,c,d] notM = [a,b,c] isM = [d] Sorts the elements in a list Creates a Dictionary from an input key and a input value Sorts the elements in a list Rotate a Point around the center point This node creates points on a sphere surface Draws a parallel line through a specific point Finds the intersection of two circles returns the section point from a point perpendicular on a line Finds the intersection of two circles Finds the intersection of a circle and a Line Returns true if two infinite lines intersect, and if so, provides a point where they intersect. The intersection point can be outside of the line segments Finds the two infinite intersections of a line from center to a point Resurns the intersection of the Line trough the middle of the Circles Calculates Two Circles. The First one passes pt0 and pt1 and the pt2,pt2_alt which has the lowes distance to pt3. The second circle pass the remaining point Returns the tangential Circles which touch the 3 input circles Subtract two Points: c = a - b Add two Points: c = a - b Finds the two tangent points from a point to a circle Returns the Z elevation of a point X,Y on the specified object Grow a radius Value of input Points, till they touch others or with a min offset quecks, if point is part of a cw or ccw direction, needs minimum 3 pts
input 2D or 3D Points Deletes Randomly Values of Input List. If density is 100 nothing will be deleted A Hexagonal Circle Stacking lattice Get 2D and 3D Angles of Points related to one center point Return the angle and distance to (0,0) Open a Dialog Box to Choose a Folder Set Origin and height, width of the page File Names or Folder Names of the input Directory Enter your Formula in Input Field Put This in a Wrapper with another Object. This node Returns the next Object (Stacking Ordner) after this node A Real value defined in the OIP in document units An example of how to use the Button widget. When the button is pressed, it will run the script contained in the specified definition. Draws mesh or output polys from a regular rectangular horizontal grid of points collects objects, which middle point is on a circle, poly or recangle Create any value using the python eval function Set Origin and height, width of the page Checks on ever obj1 input, if one or more object from input obj2 overlap bounding box Returns the string between two characters Returns new, string position and length. Prints the incoming items into a text object or the python console. The option 'Run scripts in developer Mode' must be enabled in Vector Works to see the console output. Returns the Data from a Record field. If the Object input is a list values are concat. Path of the Actual Document Gets number of Databese Rows and columns in the referenced Worksheet Gets the numeric or String value of the referenced cell subrow Returns the Data from a Record field. If the Object input is a list values are concat. send to Back Duplicates Objects in a Container or active Layer This node performs a boolean operation between lists of objects. The operation will be performed for each possible combination of objects in the lists supplied. Adds an object to the current layer Adds an object to the current layer Convert Symbol or PIO to group Update the specified object using the current settings and parameter values. This node will Intersect a Solid in 3 Parts. Cap1, Cap2 and Space. Scale middle (space) or scale caps Converts as Example 1 to A and 56 to BD. Creates a Criteria by class and Layer Assigns a class to the referenced object Returns the smallest item in the list If test is true, pass the value to true output otherwise to false output Returns all Spaces which overlap or touch the bounding box of the objs input Creates a 2D or a 3D locus object Detects Clusters of Points Finds the convex hull of points Creates a Viewport Add an Annotation to the Viewport Add an Annotation to the Viewport Sets the value of a OIP Field, It uses a search and replace function for the field Name. If you have more fealds with similar names which match the search name it returns error code. Use Reset node after all changes of the PIOs Get a value from an Marionette Wrapper or PIO Move Symbol in a Symbol Folder. If no symbol name is inputted or the Symbol do not exist, this node just creates the folder Creates a Design or a Sheet Layer (OIP Pupup to change layer type) Extract Values within a specific range Creates Pt array between two points [1,2,3,4,5,6] goes to [1,3,6,10,15,21 Converts a 2D or 3D vector to an angle in degrees Output 4 corner points of a rectangle Enter your Formula in Input Field Enter your Formula in Input Field change input values to right document units gets the Fill Back color of the node and returns it A Dialog with 3 Popups Creates a rectangle with the provided specifications, supports point of reference 3D Quader mit Verrundeten Kanten oder Einfache geometrie Returns the bounding box's coordinates of the projection of an object on the screen plane "Type Counter" collects Objects from an input criteria. It count, how many objects from which type there in this criteria. List of document resources from a specific type Returns the name of the referenced Symbol. Returns "none" if the object has no name assigned. Converts as example a name from a dimension standard or a text style to an index number Creates Text Line by Line, from an Input List Creates Text Line by Line, from an Input List Sets the Text Size of a Text Obj Get Input RowNames and Lines and Attach them to the input text blocks, which have the same name like the row name. Group text objects, which are no fields Creates Text Line by Line, from an Input List Returns the value of a data record field. Open the input Folder in Finder or Windows Explorer. Combine with GetActFile Node to have parent folder of active Document Path of the Actual Document File Names or Folder Names of the input Directory Returns the Value from the Python os stat function OutputActualDateTime Path of the Actual Document Open a Dialog Box to Choose a Folder Creates a duplicate array of objects in x y or z direction Moves a Refered Point from a 2D,3D Object to a specified 3D Point
for planar obj works in 2D view Creates a List of all Symbols in a Folder Link a Text Field in a Symbol to a Record Field Returns the value of the input dict key Repeats the complete input n Times Randomize the input list Randomize the input list Deletes Randomly Values of Input List. If density is 100 nothing will be deleted Input value1,value2 ... output [value1,value2 ....] Removes the duplicate items from the input list. Separates a list into its constituent items File Names or Folder Names of the input Directory Import an ini file with sections, keys and values Import a Tab or character separated Text-File This node performs a boolean operation between lists of objects. The operation will be performed for each possible combination of objects in the lists supplied. Returns the Record Names attached to the Input Object Enter your Formula in Input Field Adds an List to the end of a list Flattens a list, or list of lists Creates a linear dimension with standard specifications Changes the Description value of a Sheet Layer Returns the name of the referenced layer Returns the name of the referenced layer Returns the width and height of the sheet layer Returns the Number of pages Open a file at the specified path A Dialog with 3 Popups
The Example file contains two PlugIns for 2D Light effects.
This Scripts help you exporting your layout structure to get an external list of your drawings if needed.
Exports Sheet Name, Title, Page Size and Page Numbers. Export Folder can be selected. FileName.txt can be set in ObjectInfo of wrapper. Grey and orange nodes (Screenshot) are custom nodes. "Manipulate File" is edited (codex utf_8) to support special characters like äöüé etc.
Note: I think Excel on Mac has issues handle the exported file's special characters (utf_8 encoding), not my fault I guess. The codex can be changed inside "Manipulate File" Node if you are not happy with the exported text encoding or find/replace on the other Software.
This example is based on a custom node. which returns a line pattern. This pattern is based on several while and random loops. I have not found a proper way to run a while loop over a marionette network so this is better to create in a custom node.
It is easier to play with the example, than explaining exactly how it works.
Have fun with it. This is my base study to find a workflow to project any pattern on a NURBS Surface which would be a real scope of usage.
Movie Link (first Part of Movie)
Growing Lines 1.0.0.mp4
A Rectangle Line Pattern with a random option.
Also the files show, hot how to project on a NURBS Surface. This 3D Projection contains two additional custom nodes.
1. GetZatXY (Also used in many other examples on the community board)
2. GetZamong Pt. Not so easy to understand. This nodes calculates the z value of a 2D Point between two 3D Points without trigonometry (faster).
Movie Link (2nd Part of Movie)
https://youtu.be/vuCvK4OwN80 German Movie
https://youtu.be/Nm0te1zmpVY English Movie
Structure of the Input:
1. Group with Geometry group (send to back) and Reshape Zone definition (send to front). Best practice is to use a blue smbol without screen plane objects
2. Reshape Zone group has further groups. Every reshape zones (polygons) is grouped with a dimension object. The dimension is the link to the script. The parameter name is a prefix of the dimension text
3. Use one of the existing examples to understand the system
1. Supportes not 3D, Chain Dimension, path objects, rectangles. Container objects are not reshaped but moved (like the reshape tool)
2. user origin has to be set to vectorworks origin
3. not mix of screen-plane and layer plane. Use all layer-plane
Parametric Symbol v2018.vwx
A nice, small Marionette for creating bar diagrams. This is much more simpler and more flexible than a spread sheet bar diagram.
2. Col Values -> mandatory
3. RefValue -> A bar with this value, has the height of the BArHeigtRefValue field
6. Invert -> A bigvalues results in small bar
There is a 2 minute movie (without audio)
If you need Worksheet-like Numbering like A, B, C .... AA, AB ..... AAA .... This node offers you an easy solution.
There are two nodes for both directions.
1. Input from special characters etc. will result in wrong values or errors.
Some Ressource Types (such as dimension standard or text styles) are handled by an index number. This node helps to find the index of those resources.
This node creates optional a rectangle and returns the corner points of that rectangle.
Often there is a need of a rectangle and the corner points. If the rectangle is rotated, it can be a cramp to calculate the corner points. I hope this node can help to simplify marionette workflows.
This Node creates a new layer and keep the active layer the active one.
It has a popup witch allows to choose sheet or design layer. It returns a handle to the new layer or a handle to an existing layer with the same name.
Like ever .. with not warranty try first in an empty file and be careful creating thousands of layers or layers with the same name as other objects in the drawing.
Insert Symbol in Folder Node:
1. Move the Symbol with the input name in the folder with the input folder name
2. If folder do not exists it will be created. If no symbol name is inputted, the folder created also
3. If the folder name is taken by another object, the folder will not be created